From 84a99c350e399d53dd084af8e707beb8d96da558 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Tue, 12 May 2026 20:26:45 +0300 Subject: [PATCH 1/2] Make 2d camera prefab orthographic --- src/render-core/prefabs/camera2d.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/render-core/prefabs/camera2d.js b/src/render-core/prefabs/camera2d.js index d9ad2ffe..2df2b167 100644 --- a/src/render-core/prefabs/camera2d.js +++ b/src/render-core/prefabs/camera2d.js @@ -1,5 +1,6 @@ import { createTransform2D, GlobalTransform2D, Orientation2D, Position2D, Scale2D } from '../../transform/index.js' import { Camera, RenderLists2D } from '../components/index.js' +import { OrthographicProjection } from '../core/index.js' /** * @param {number} x @@ -10,5 +11,9 @@ import { Camera, RenderLists2D } from '../components/index.js' * @returns {[Position2D,Orientation2D,Scale2D,GlobalTransform2D,Camera,RenderLists2D]} */ export function createCamera2D(x = 0, y = 0, a = 0, sx = 1, sy = 1) { - return [...createTransform2D(x, y, a, sx, sy), new Camera(), new RenderLists2D()] + return [ + ...createTransform2D(x, y, a, sx, sy), + new Camera(new OrthographicProjection()), + new RenderLists2D() + ] } From 43681a6517df0434e23f8155aa7c9eb5ce61ca4d Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Tue, 12 May 2026 20:27:49 +0300 Subject: [PATCH 2/2] Correct materials rendering to include camera projection --- src/render-canvas2d/systems/index.js | 34 +++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/render-canvas2d/systems/index.js b/src/render-canvas2d/systems/index.js index fe847c89..da91161b 100644 --- a/src/render-canvas2d/systems/index.js +++ b/src/render-canvas2d/systems/index.js @@ -5,7 +5,7 @@ import { Assets } from '../../asset/index.js' import { Entity, Query } from '../../ecs/index.js' import { warn } from '../../logger/index.js' import { typeidGeneric, typeid } from '../../type/index.js' -import { Material, Mesh, TextureCache, RenderLists2D, Camera } from '../../render-core/index.js' +import { Material, Mesh, TextureCache, RenderLists2D, Camera, OrthographicProjection } from '../../render-core/index.js' import { GlobalTransform2D } from '../../transform/index.js' import { MainWindow, Windows, Window } from '../../window/index.js' @@ -42,19 +42,41 @@ export function genrender(type, renderMaterial) { const ctx = canvas.getContext('2d') - const offsetX = window[1].getWidth() / 2 - const offsetY = window[1].getHeight() / 2 + const width = window[1].getWidth() + const height = window[1].getHeight() + const offsetX = width / 2 + const offsetY = height / 2 if (!ctx) return warn('2d context could not be created on the canvas.') // TODO: Return when this becomes default rendering system // ctx.clearRect(0, 0, canvas.width, canvas.height) - cameras.each(([cameraTransform, renderList]) => { + cameras.each(([cameraTransform, renderList, camera]) => { const view = GlobalTransform2D.invert(cameraTransform) ctx.save() - ctx.translate(offsetX, offsetY) - ctx.scale(offsetX, -offsetY) + + if (camera.projection instanceof OrthographicProjection) { + const { projection } = camera + const projectionWidth = projection.right - projection.left + const projectionHeight = projection.top - projection.bottom + const projectionOffsetX = -(projection.right + projection.left) / projectionWidth + const projectionOffsetY = -(projection.top + projection.bottom) / projectionHeight + + ctx.translate(offsetX, offsetY) + ctx.scale(offsetX, -offsetY) + ctx.transform( + 2 / projectionWidth, + 0, + 0, + 2 / projectionHeight, + projectionOffsetX, + projectionOffsetY + ) + } else { + throw new Error('Unsupported camera projection for 2d camera') + } + ctx.transform( view.a, view.b,