Skip to content

Conversation

@DragonMoffon
Copy link
Collaborator

@DragonMoffon DragonMoffon commented Jun 10, 2023

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 that 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 the
#Cameras
topics in the arcade-dev forum on the Python Arcade discord server for more info.

There are also likely issues that are relevant such as #1651.

DragonMoffon and others added 6 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.
@DragonMoffon DragonMoffon changed the title Scene refactor experiment. Camera Refactor Experiment Jun 17, 2023
Cleaning up PR to only include camera refactor
@DragonMoffon
Copy link
Collaborator Author

Adding to my TODO list.

Splitting the code into multiple files
Unit tests for every core piece of the code.
Examples for every camera type and a few examples of controllers.

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"
@DragonMoffon DragonMoffon changed the title Camera Refactor Experiment Camera Refactor Jun 19, 2023
DragonMoffon and others added 13 commits July 21, 2023 00:24
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.
@DragonMoffon DragonMoffon mentioned this pull request Aug 6, 2023
27 tasks
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
setup lerp, quadratic, cubic, b-spline

Contemplating how to do spline controller
Removed Splines
Made Isometric Controller
Fixed small issue with facing direction
doing temp rendering test so don't mind `log.png`
@cspotcode cspotcode added this to the 3.0 milestone Aug 10, 2023
@DragonMoffon DragonMoffon deleted the scene-refactor-experiment branch August 15, 2023 10:25
@DragonMoffon
Copy link
Collaborator Author

Moving branch to better reflect the goals of this PR

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.

3 participants