Skip to content

Conversation

@DragonMoffon
Copy link
Collaborator

This PR includes the core functionality in a stable (without unit tests or docs) state. This includes a stripping out of all references to the old system.

Removed:

  • the set_viewport method. Has been replaced by a variety of options. Either directly setting matrices, using the default camera, or using a Camera2D
  • The old Camera class. This will not be replaced in a backward-compatible manner as it is deeply flawed and has been replaced by Camera2D

Removed but coming in the future:

  • Screen shake.

There are a few issues with the current camera system in arcade. Mainly it only supports a 2D orthographic camera with limited zoom and rotation functionality. This refactor aims to create a new system that allows users to easily make fully 3D orthographic or perspective cameras which are easy to use and create custom functionality for.

The refactor aims to be mostly backwards-compatible with the previously implemented SImpleCamera and Camera.

The refactor includes:
A ViewData PoD that holds all of the information needed to make a view matrix and set the viewport.
Two ProjectionData PoDs hold the data for making either an orthographic or projection matrix.

The Projection Protocol to link the ProjectionData PoDs together (may be removed as it is unnecessary)
The Projector Protocol defines any object that provides the Use, Activate, and get_map_coordinates (may be renamed) methods.
The Camera Protocol defines an object which holds both a ViewData PoD and a ProjectionProtocol Object.

The OrthographicCamera class uses the ViewData and OrthographicProjectionData PoDs to provide an easy way to create and use an orthographic projection matrix, but it alone does not provide ways of controlling the camera.
The PersepctiveCamera class is the same as the OrthographicCamera class, except it uses the PerspectiveProjectionData PoD.

It provides a backwards-compatible SimpleCamera class implementation with the same methods.
The Camera2D class provides a simple interface to control nearly every camera aspect and will be what 99% of arcade users will need. It does not provide animations or any other similar logic but provides easy properties and methods for setting the different variables that are used by the camera. The only clamps on control are lack of access to the forward vector and only accepting 2D vectors.

The DefaultProjector class is provided to have a base camera only to be used internally by Arcade. This class is designed to be used as the default "current_camera". This is because of a significant bug currently plaguing Arcade. If the user has never used a Camera and they try to use a camera as a context manager, the current camera will be equal to None and cause a crash.

See Issue #1853 for more details

DragonMoffon and others added 30 commits June 10, 2023 12:45
…nds, and Scenes.

See the
#Possible Scene Improvements
#Cameras
topics in the arcade-dev forum on the Python Arcade discord server.
…s, and started the Camera2DController, and SimpleCamera classes.

See the
#Possible Scene Improvements
#Cameras
topics in the arcade-dev forum on the Python Arcade discord server for more info.
…. Created basic Perspective and Orthographic Cameras.

See the
#Possible Scene Improvements
#Cameras
topics in the arcade-dev forum on the Python Arcade discord server for more info.
…This has been fixed and applied to both of the base cameras. Added a new get map coordinates function (open to change). Placed framework for backwards compatible simple camera.

See the
#Possible Scene Improvements
#Cameras
topics in the arcade-dev forum on the Python Arcade discord server for more info.
Finished Simple Camera. Is backwards compatible with current Simple Camera implementation.
Cleaning up PR to only include camera refactor
Moved experimental code into new "cinematic" folder within arcade.

Also made the default camera in arcade the "DefaultCamera" class. and made it's type be "Projector"
Created files for unit tests, and wrote a few.

Started work on Camera2D (replacement for simple camera)
The basics for Camera2D have been provided with full doc strings. Other helper methods may be added in the future.
Fixed `mypy`, `pyright`, `ruff` errors.

Also added __all__ property to every file
for a better importing experience.

NOTE arcade/camera.py is still there, and it does not match the current system so the code-inspection still complains. Will resolve later.
This included deleting `arcade/camera.py`, and fixing the ui and sections to use either the Default Ortho Projector.

NOTE I removed a quick index to the `camera.rst`. That will need to be fixed.

Hey look I linted before pushing for once!
Made a few function controllers which are mega simple.

Also changed name from arcade.cinematic to arcade.camera.

Also moved the controllers to arcade.camera.controllers.
when I changed the file name it didn't update any imports tsk tsk.
Have not setup camera documentation so removing old ref.

DO NOT PULL PR UNTIL FIXED.
NOTE this is a quick fix. It removed shaking from two examples. CANNOT BE PULLED IN WHILE THIS IS UNRESOLVED.

Weirdly the linters didn't pick up on these errors
@DragonMoffon DragonMoffon marked this pull request as draft October 16, 2023 20:51
thanks MiCurry for the editing on that!

Also did linting. Currently fails on the camera_perspective_demo.py because of how I threw it together. Will fix in next commit
Changed the screen shake to store the
shake dir but not vector so it should work with rotating the camera now.

Added a `readjust_camera` method to the SceenShakeController.

Also finished it´s unit tests.
Currently only picks between 'orthographic' and 'disabled'
@DragonMoffon
Copy link
Collaborator Author

Closed as a new PR was made to replace it. Third times a charm :)

@DragonMoffon DragonMoffon deleted the Camera-Overhaul-Core branch April 10, 2024 05:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants