Dynamic Camera System
The bittyBIG Dynamic Camera System gives Stencyl projects a more flexible camera and output pipeline. It supports zoom, tweening, split-screen, picture-in-picture, viewport transforms, camera rotation, screenshake, and pixel-perfect display behavior.
Project Setup in Stencyl
1. Install and enable the extension
- Open Settings → Extensions.
- Install the bittyBIG Dynamic Camera System.
- Enable it for your project.
2. Set your normal Stencyl Screen Size
Game Settings → Settings → Display
Set Screen Size to the base game/output size you want to work with.
Quick Start Guide
Create a camera, then choose how you want it positioned.
Moving Camera
Static Camera
Choose a common layout or adjust the values yourself, preview the result, then generate setup code for your project. Viewports are placed inside the Game Area, not directly on the Screen.
This glossary mirrors the current Stencyl palette in the extension. Blocks are shown in palette order with their current tooltip description and Haxe call.
Key Terms
Screen - The full output area of the device or game window. The Game Area is positioned and sized within the Screen.
Game Area - The rectangular area where bittyBIG renders the game. It can be resized and positioned anywhere on the Screen and contains the Viewports.
Viewport - The output area for a single Camera. A Viewport can be positioned and sized anywhere within the Game Area.
Camera - Captures a rectangular area of the Scene and renders that view to a Viewport.
Scene - The Stencyl game world being viewed by the Cameras. Actors, tiles, backgrounds, and scene boundaries exist in Scene coordinates.
Camera Size - The base width and height of the Scene captured by a Camera before zoom is applied.
Camera Center - The Scene position at the center of the Camera's view.
Camera Target - The Scene position the Camera is moving toward. This may come from an Actor, a manually specified position, or another camera-follow operation.
Zoom - Changes how much of the Scene is visible through a Camera without changing its base Camera Size. Higher zoom shows a smaller area of the Scene; lower zoom shows a larger area.
Scene Lock - Restricts a Camera so its visible area does not move beyond the Scene boundaries.
Follow - Continuously updates a Camera's target based on an Actor.
Viewport Position - The position of a Viewport within the Game Area.
Viewport Size - The width and height of the Camera's output area within the Game Area. This does not change the Camera's Scene capture size.
Viewport Scale Mode - Controls how the Camera image is fitted into its Viewport when their dimensions or aspect ratios differ.
Game Area Coordinates - Coordinates relative to the Game Area. Viewports are positioned using Game Area coordinates.
Screen Coordinates - Coordinates relative to the full Screen. The Game Area is positioned using Screen coordinates.
Background Layer - A Stencyl Scene background layer rendered as part of the Camera view.
Scroll Factor / Parallax - Controls how quickly a Background Layer moves relative to Camera movement.
Background Repeat - Controls whether a Background Layer repeats horizontally, vertically, both, or not at all.
Image Anchor - The point on a background image used when positioning that image. 0,0 is top-left, 0.5,0.5 is center, and 1,1 is bottom-right.
Scene Anchor - The point in the Scene that the Background Layer's Image Anchor is aligned to.
Background Offset - An additional Scene-space X/Y offset applied after the Background Layer's Image Anchor and Scene Anchor are aligned.
Rendering Flow - Scene → Camera → Viewport → Game Area → Screen.
Setup
Quick Start
Create Camera
scripts.api.stencyl.BittyCameraBlocks.createCamera(~);
Follow Actor
scripts.api.stencyl.BittyCameraBlocks.followActor(~,~);
Set Camera Center
scripts.api.stencyl.BittyCameraBlocks.setCameraCenter(~, ~, ~);
Apply Camera Preset
scripts.api.stencyl.BittyCameraBlocks.applyCameraPreset(~,~);
Set Camera Size
scripts.api.stencyl.BittyCameraBlocks.setCameraSize(~,~,~);
Scene
Set Camera Scene Lock
scripts.api.stencyl.BittyCameraBlocks.setCameraSceneLock(~,~);
Set Background Layer Repeat
scripts.api.stencyl.BittyCameraBlocks.setBackgroundLayerRepeatMode(~,~,~);
Set Background Layer Anchors
scripts.api.stencyl.BittyCameraBlocks.setBackgroundLayerAnchors(~,~,~,~,~,~);
Set Background Layer Alignments
scripts.api.stencyl.BittyCameraBlocks.setBackgroundLayerAlignments(~,~,~,~);
Set Background Layer Offset
scripts.api.stencyl.BittyCameraBlocks.setBackgroundLayerOffset(~,~,~,~);
Debug
Debug Camera
scripts.api.stencyl.BittyCameraBlocks.debugCamera(~);
Debug Viewport
scripts.api.stencyl.BittyCameraBlocks.debugViewport(~);
Debug Game Area
scripts.api.stencyl.BittyCameraBlocks.debugGameArea();
Debug Camera System
scripts.api.stencyl.BittyCameraBlocks.debugCameraSystem();
Cameras
Camera
Create Camera
scripts.api.stencyl.BittyCameraBlocks.createCamera(~);
Remove Camera
scripts.api.stencyl.BittyCameraBlocks.removeCamera(~);
Camera Exists
scripts.api.stencyl.BittyCameraBlocks.cameraExists(~)
Camera Is Transitioning
scripts.api.stencyl.BittyCameraBlocks.isCameraTransitioning(~)
Position
Set Camera Center
scripts.api.stencyl.BittyCameraBlocks.setCameraCenter(~, ~, ~);
Set Camera Center To Actor
scripts.api.stencyl.BittyCameraBlocks.setCameraCenterToActor(~,~);
Get Camera X
scripts.api.stencyl.BittyCameraBlocks.getCameraX(~)
Get Camera Y
scripts.api.stencyl.BittyCameraBlocks.getCameraY(~)
Get Camera Center X
scripts.api.stencyl.BittyCameraBlocks.getCameraCenterX(~)
Get Camera Center Y
scripts.api.stencyl.BittyCameraBlocks.getCameraCenterY(~)
Size
Set Camera Size
scripts.api.stencyl.BittyCameraBlocks.setCameraSize(~,~,~);
Get Camera Width
scripts.api.stencyl.BittyCameraBlocks.getCameraWidth(~)
Get Camera Height
scripts.api.stencyl.BittyCameraBlocks.getCameraHeight(~)
Follow
Follow Actor
scripts.api.stencyl.BittyCameraBlocks.followActor(~,~);
Stop Following Actor
scripts.api.stencyl.BittyCameraBlocks.stopFollowingActor(~);
Set Camera Target Center
scripts.api.stencyl.BittyCameraBlocks.setCameraTargetCenter(~,~,~);
Set Camera Target Center To Actor
scripts.api.stencyl.BittyCameraBlocks.setCameraTargetCenterToActor(~,~);
Set Camera Follow Style
scripts.api.stencyl.BittyCameraBlocks.setCameraFollowStyle(~,~);
Follow Tuning
Set Camera Offsets
scripts.api.stencyl.BittyCameraBlocks.setCameraOffsets(~,~,~);
Get Camera Offset X
scripts.api.stencyl.BittyCameraBlocks.getCameraOffsetX(~)
Get Camera Offset Y
scripts.api.stencyl.BittyCameraBlocks.getCameraOffsetY(~)
Set Camera Follow Speeds
scripts.api.stencyl.BittyCameraBlocks.setCameraFollowSpeeds(~,~,~);
Set Camera Lerp Speed
scripts.api.stencyl.BittyCameraBlocks.setCameraLerpSpeed(~,~);
Set Camera Zero Radius
scripts.api.stencyl.BittyCameraBlocks.setCameraZeroRadius(~,~);
Presets
Apply Camera Preset
scripts.api.stencyl.BittyCameraBlocks.applyCameraPreset(~,~);
Apply Camera Preset By Name
scripts.api.stencyl.BittyCameraBlocks.applyCameraPreset(~,~);
Grid
Set Camera Grid Size
scripts.api.stencyl.BittyCameraBlocks.setCameraGridSize(~,~,~);
Reset Camera Grid Size
scripts.api.stencyl.BittyCameraBlocks.resetCameraGridSize(~);
Get Camera Grid Width
scripts.api.stencyl.BittyCameraBlocks.getCameraGridWidth(~)
Get Camera Grid Height
scripts.api.stencyl.BittyCameraBlocks.getCameraGridHeight(~)
Get Camera Grid X
scripts.api.stencyl.BittyCameraBlocks.getCameraGridX(~)
Get Camera Grid Y
scripts.api.stencyl.BittyCameraBlocks.getCameraGridY(~)
Get Camera Target Grid X
scripts.api.stencyl.BittyCameraBlocks.getCameraTargetGridX(~)
Get Camera Target Grid Y
scripts.api.stencyl.BittyCameraBlocks.getCameraTargetGridY(~)
Viewports
Setup
Create Viewport
scripts.api.stencyl.BittyCameraBlocks.createViewport(~,~,~,~,~);
Render Camera To Viewport
scripts.api.stencyl.BittyCameraBlocks.renderCameraToViewport(~,~);
Remove Viewport
scripts.api.stencyl.BittyCameraBlocks.removeViewport(~);
Viewport Exists
scripts.api.stencyl.BittyCameraBlocks.viewportExists(~)
Set Viewport Scale Mode
scripts.api.stencyl.BittyCameraBlocks.setViewportScaleMode(~,~);
Layout
Set Viewport Rect
scripts.api.stencyl.BittyCameraBlocks.setViewportRect(~,~,~,~,~);
Set Viewport Position
scripts.api.stencyl.BittyCameraBlocks.setViewportPosition(~,~,~);
Set Viewport Size
scripts.api.stencyl.BittyCameraBlocks.setViewportSize(~,~,~);
Get Viewport X
scripts.api.stencyl.BittyCameraBlocks.getViewportX(~)
Get Viewport Y
scripts.api.stencyl.BittyCameraBlocks.getViewportY(~)
Get Viewport Width
scripts.api.stencyl.BittyCameraBlocks.getViewportWidth(~)
Get Viewport Height
scripts.api.stencyl.BittyCameraBlocks.getViewportHeight(~)
Background
Set Viewport Background Color
scripts.api.stencyl.BittyCameraBlocks.setViewportBackgroundColor(~,~,~);
Clear Viewport Background
scripts.api.stencyl.BittyCameraBlocks.clearViewportBackground(~);
Set Viewport Background Enabled
scripts.api.stencyl.BittyCameraBlocks.setViewportBackgroundEnabled(~,~);
Set Viewport Background Image
scripts.api.stencyl.BittyCameraBlocks.setViewportBackgroundImage(~,~,~);
Set Viewport Background Image Scale Mode
scripts.api.stencyl.BittyCameraBlocks.setViewportBackgroundImageScaleMode(~,~);
Clear Viewport Background Image
scripts.api.stencyl.BittyCameraBlocks.clearViewportBackgroundImage(~);
Has Viewport Background Image
scripts.api.stencyl.BittyCameraBlocks.hasViewportBackgroundImage(~)
Viewport Overlay
Set Viewport Overlay Color
scripts.api.stencyl.BittyCameraBlocks.setViewportOverlayColor(~,~,~);
Clear Viewport Overlay Color
scripts.api.stencyl.BittyCameraBlocks.clearViewportOverlayColor(~);
Set Viewport Overlay Color Enabled
scripts.api.stencyl.BittyCameraBlocks.setViewportOverlayColorEnabled(~,~);
Set Viewport Overlay Image
scripts.api.stencyl.BittyCameraBlocks.setViewportOverlayImage(~,~,~);
Set Viewport Overlay Image Scale Mode
scripts.api.stencyl.BittyCameraBlocks.setViewportOverlayImageScaleMode(~,~);
Clear Viewport Overlay Image
scripts.api.stencyl.BittyCameraBlocks.clearViewportOverlayImage(~);
Has Viewport Overlay Image
scripts.api.stencyl.BittyCameraBlocks.hasViewportOverlayImage(~)
Border
Set Viewport Border
scripts.api.stencyl.BittyCameraBlocks.setViewportBorder(~,~,~,~);
Set Viewport Border Sides
scripts.api.stencyl.BittyCameraBlocks.setViewportBorderSides(~,~,~,~,~,~,~);
Game Area
Game Area
Set Game Area Rect
scripts.api.stencyl.BittyCameraBlocks.setGameAreaRect(~,~,~,~);
Set Game Area Position
scripts.api.stencyl.BittyCameraBlocks.setGameAreaPosition(~,~);
Set Game Area Size
scripts.api.stencyl.BittyCameraBlocks.setGameAreaSize(~,~);
Get Game Area X
scripts.api.stencyl.BittyCameraBlocks.getGameAreaX()
Get Game Area Y
scripts.api.stencyl.BittyCameraBlocks.getGameAreaY()
Get Game Area Width
scripts.api.stencyl.BittyCameraBlocks.getGameAreaWidth()
Get Game Area Height
scripts.api.stencyl.BittyCameraBlocks.getGameAreaHeight()
Overlay
Set Game Area Overlay Color
scripts.api.stencyl.BittyCameraBlocks.setGameOverlayColor(~,~);
Clear Game Area Overlay Color
scripts.api.stencyl.BittyCameraBlocks.clearGameOverlayColor();
Set Game Area Overlay Color Enabled
scripts.api.stencyl.BittyCameraBlocks.setGameOverlayColorEnabled(~);
Set Game Area Overlay Image
scripts.api.stencyl.BittyCameraBlocks.setGameOverlayImage(~,~);
Set Game Area Overlay Image Scale Mode
scripts.api.stencyl.BittyCameraBlocks.setGameOverlayImageScaleMode(~);
Clear Game Area Overlay Image
scripts.api.stencyl.BittyCameraBlocks.clearGameOverlayImage();
Has Game Area Overlay Image
scripts.api.stencyl.BittyCameraBlocks.hasGameOverlayImage()
Border
Set Game Area Border
scripts.api.stencyl.BittyCameraBlocks.setGameAreaBorder(~,~,~);
Set Game Area Border Sides
scripts.api.stencyl.BittyCameraBlocks.setGameAreaBorderSides(~,~,~,~,~,~);
Screen
Screen Background
Set Screen Background Color
scripts.api.stencyl.BittyCameraBlocks.setBackgroundColorInt(~,~);
Set Screen Background Image
scripts.api.stencyl.BittyCameraBlocks.setBackgroundImage(~);
Set Screen Background Image Alpha
scripts.api.stencyl.BittyCameraBlocks.setBackgroundImageAlpha(~);
Set Screen Background Image Scale Mode
scripts.api.stencyl.BittyCameraBlocks.setBackgroundImageScaleMode(~);
Clear Screen Background Image
scripts.api.stencyl.BittyCameraBlocks.clearBackgroundImage();
Has Screen Background Image
scripts.api.stencyl.BittyCameraBlocks.hasBackgroundImage()
Screen Overlay
Set Screen Overlay Color
scripts.api.stencyl.BittyCameraBlocks.setScreenOverlayColor(~,~);
Clear Screen Overlay Color
scripts.api.stencyl.BittyCameraBlocks.clearScreenOverlayColor();
Set Screen Overlay Color Enabled
scripts.api.stencyl.BittyCameraBlocks.setScreenOverlayColorEnabled(~);
Set Screen Overlay Image
scripts.api.stencyl.BittyCameraBlocks.setScreenOverlayImage(~,~);
Set Screen Overlay Image Scale Mode
scripts.api.stencyl.BittyCameraBlocks.setScreenOverlayImageScaleMode(~);
Clear Screen Overlay Image
scripts.api.stencyl.BittyCameraBlocks.clearScreenOverlayImage();
Has Screen Overlay Image
scripts.api.stencyl.BittyCameraBlocks.hasScreenOverlayImage()
Effects
Zoom
Set Camera Zoom
scripts.api.stencyl.BittyCameraBlocks.setCameraZoom(~,~);
Set Camera Zoom Advanced
scripts.api.stencyl.BittyCameraBlocks.setCameraZoomAdvanced(~,~,~,~);
Get Camera Zoom
scripts.api.stencyl.BittyCameraBlocks.getCameraZoom(~)
Reset Camera Zoom
scripts.api.stencyl.BittyCameraBlocks.resetCameraZoom(~);
Rotation
Set Viewport Rotation
scripts.api.stencyl.BittyCameraBlocks.setViewportRotation(~,~);
Set Viewport Rotation Over Time
scripts.api.stencyl.BittyCameraBlocks.setViewportRotationOverTime(~,~,~,~);
Flip
Set Viewport Flip Horizontal
scripts.api.stencyl.BittyCameraBlocks.setViewportFlipHorizontal(~,~);
Set Viewport Flip Vertical
scripts.api.stencyl.BittyCameraBlocks.setViewportFlipVertical(~,~);
Reset Viewport Transform
scripts.api.stencyl.BittyCameraBlocks.resetViewportTransform(~);
Screenshake
Shake Camera
scripts.api.stencyl.BittyCameraBlocks.shakeCamera(~,~,~);
Shake Camera XY
scripts.api.stencyl.BittyCameraBlocks.shakeCameraXY(~,~,~,~);
Stop Camera Shake
scripts.api.stencyl.BittyCameraBlocks.stopCameraShake(~);
Camera Size vs. Viewport Size vs. Game Area
Camera Size controls how much of the Scene the Camera captures before zoom. Viewport Size controls how large that Camera output is drawn inside the Game Area. Game Area is the rectangle on the Screen that contains the Viewports. Changing one does not automatically change the other two.
Follow Actor
Follow Actor is a convenience block for continuous camera tracking. You call it once, and bittyBIG keeps updating that Camera's target to the Actor every frame. Functionally, it saves you from putting Set Camera Target Center in an Update event and feeding it the Actor's position yourself.
Split-Screen Layout
Each Camera starts with a matching default Viewport, so custom split-screen comes down to arranging those Viewports inside the Game Area. Resize and reposition each Viewport to the region it should occupy. Camera ID 0 starts routed to Viewport ID 0, Camera ID 1 to Viewport ID 1, and so on unless you deliberately change the routing.
Final Output Scaling / Fullscreen
There are two separate scaling stages to check. Viewport Scale Mode controls how a Camera image is drawn inside its Viewport. Stencyl's own Fullscreen / Scale to Fit / Letterbox behavior can still scale the final game output after bittyBIG has composed it. If the Viewport itself looks correct but the whole game changes when entering fullscreen, check Stencyl's display/fullscreen settings rather than the Viewport Scale Mode.
Background Image Scaling
Background images have their own scale-mode controls. Set the appropriate Background Image Scale Mode for the Viewport or whole Display instead of changing Camera Size to compensate for an image-layout problem.
Scene Background Layer Anchoring
Use Set Background Layer Alignments for named image-to-scene alignment, or Set Background Layer Anchors for custom normalized anchors. Image and scene anchors are independent: X and Y use values from 0 to 1, where 0 is left/top, 0.5 is center, and 1 is right/bottom. Use Set Background Layer Offset for an additional scene-unit adjustment after alignment.
Debugging Camera State
Use the Debug tab. Debug Camera, Debug Viewport, Debug Display, and Debug Camera System print readable multi-line reports showing the current state instead of making you inspect a pile of individual getters.
Version 1.0 is the first release-ready version of the bittyBIG Dynamic Camera System. It includes:
- custom cameras
- camera sizing
- actor centering
- target movement
- smoothing
- camera offsets
- grid-based movement
- camera presets
- zoom
- tweened zoom
- camera rotation
- screenshake
- camera transition checks
- viewport layout
- split-screen support
- picture-in-picture support
- viewport backgrounds
- viewport borders
- viewport transforms
- game area control
- background color support
- background image support
- unlocked cameras
- pixel-perfect display behavior
Development Trail
The Dynamic Camera System started with a simple practical problem: remove camera jitter from Stencyl projects while keeping the normal Stencyl workflow intact. My larger goal is to help put Stencyl on the map by proving it can power a polished, modern-feeling hit game when paired with the right tools.
Over time, that small fix grew into a full rendering and camera control pipeline.
The project still keeps Stencyl as the editor with the familiar block system, actor workflow, scene setup tool, and asset pipeline.
Version 1.0 is the first release-ready baseline: a flexible camera suite built from the original jitter-removal goal, now ready for real projects.
Version 2.0 Development Trail In Progress
Version 2.0 pushes the Dynamic Camera System further away from depending on Stencyl's built-in camera render path. The major focus is smoother camera movement, stronger multi-viewport rendering, and reducing repeated CPU/GPU work while keeping Stencyl as the editor and gameplay workflow.
Cached Background Renderer - Implemented
- bittyBIG now renders Stencyl background source frames through its own camera and floating-point parallax math instead of relying on Stencyl's pixel-snapped background position.
- Background presentation data is reused per viewport while Stencyl continues to own source assets, animation timing, and scrolling state.
- Result: smoother background movement and parallax that stays aligned with the bittyBIG camera.
Cached Tile / World Renderer - Implemented
- Static tile rendering now uses the shared BittyTileCache instead of asking Stencyl's tile layer to redraw separately for each camera.
- Cached tile chunks are reused across camera captures while dynamic actors and drawing continue through the normal Stencyl world-layer display tree.
- Result: less dependency on Stencyl's built-in camera and substantially less repeated static rendering work.
Automatic Cache Refresh - Superseded Manual Rebuild Blocks
- The originally planned manual rebuild blocks were not needed after the cache gained automatic change detection.
- Tile changes, visual variants, source changes, and animated tile state are detected during cache synchronization and the affected cached content is refreshed automatically.
- Result: users do not need to manually tell the camera system when normal tile content changes.
Dirty-Region / Changed-Chunk Updates - Implemented
- Changed tile cells update only their affected cached chunk instead of forcing the entire tile world to be rebuilt.
- On the Windows GPU-first path, dirty chunks are refreshed and reusable GPU-side chunk images are retained.
- Result: larger scenes and runtime tile edits require much less redundant work.
Animated / Dynamic Background Support - Implemented
- bittyBIG reads the current Stencyl background animation frame while preserving Stencyl's scrolling-background timing and independent scroll phase.
- Repeating backgrounds, custom scroll factors, and parallax continue to work through the bittyBIG-controlled presentation path.
- Result: animated and moving backgrounds retain smooth camera-controlled positioning instead of being limited to a static cache.
HTML5 Tile Seam Improvements - Implemented
- The shared tile-cache path avoids repeatedly rebuilding Stencyl's tile layer at different camera origins during the same frame.
- The renderer uses expanded capture coverage / safety pixels where needed so smooth subpixel camera movement does not have to be snapped to hide seams.
- Result: the previous one-pixel tile-phase seam path is avoided while keeping smooth camera movement.
Renderer Independence - Major V2.0 Step Implemented
- Static tiles and Stencyl backgrounds are now presented through bittyBIG-controlled camera/render paths instead of depending on Stencyl's camera transform for each viewport.
- Stencyl remains responsible for the editor, actors, behaviors, scene setup, assets, animation state, and normal gameplay workflow.
- Result: bittyBIG owns substantially more of the runtime camera/output behavior without requiring users to abandon Stencyl's creation pipeline.
Scene-Centered Camera / Zoom-Aware Parallax - Implemented
- Scene limiting now clamps the resolved camera center itself, so the camera's actual center stays authoritative at scene edges.
- Background movement is calculated from the resolved camera center relative to the scene center, and Stencyl's stored scroll factor is converted to a zoom-aware effective factor so the same logical travel span is preserved as the visible camera size changes.
- Smooth clamp-center presentation compensates for the parity-matched raster source sizes used during zoom.
- Result: backgrounds stay aligned with the camera and scene edges through movement and smooth zoom without edge drift or clamp jitter.
Background Repeat / Anchor Controls - Implemented
- Background repeat can be overridden per layer as None, Horizontal, Vertical, or Both while leaving Stencyl's own Repeat setting untouched when no override is used.
- Repeating backgrounds prepare only the minimum number of source copies needed for coverage; the previous extra safety copy is not added.
- Background positional anchoring is stored per layer with normalized X/Y values from 0 to 1. Layers without an override default to 0,0.
- Result: background preparation and registration are explicit per-layer controls without introducing another rendering path.
Unified Rotation / Flip Presentation Path - Implemented
- Rotation no longer switches to a separate capture bitmap, separate world renderer, or separate transformed-camera presentation path.
- Ordered layers, backgrounds, zoom, scene clamping, parallax, and smoothing now run through the same normal rendering path first.
- Rotation and flipping are applied only at the final presentation stage.
- Result: rotation inherits the same rendering behavior and fixes as ordinary rendering and zoom instead of maintaining parallel special cases.
Pixel-Aligned World Raster + Fractional Presentation Residual - Implemented
- The rasterized world / tile camera origin is split into a pixel-aligned raster position and a fractional remainder.
- The world is rendered at the stable pixel-aligned origin, while the fractional remainder is preserved and applied at final presentation.
- Rasterized world layers with non-1.0 scroll factors are compensated so their parallax rate remains correct when the shared final residual is applied.
- Result: the subtle main tile-layer shimmer is removed during ordinary camera movement and at the ends of zoom transitions while smooth fractional movement is preserved.
Remaining V2.0 Work
Per-Viewport Debug Drawing - Planned
- Add optional visual debug drawing for each viewport and camera.
- Goal: make it easy to see camera bounds, viewport rectangles, centers, targets, offsets, and split-screen behavior directly on screen while testing.
The Debug blocks already provide text-based camera, viewport, display, and camera-system state. This remaining item is specifically the on-screen visual debug overlay.