From b5b3e4cb1698668ce3fc583d46d0480b79070993 Mon Sep 17 00:00:00 2001 From: a dinosaur Date: Sat, 21 Sep 2024 19:35:01 +1000 Subject: [PATCH] spritebatch viewport changes --- Sources/Voxelotl/Renderer/Renderer.swift | 2 +- Sources/Voxelotl/Renderer/SpriteBatch.swift | 20 +++++++++----------- Sources/Voxelotl/SpriteTestGame.swift | 12 +++++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Sources/Voxelotl/Renderer/Renderer.swift b/Sources/Voxelotl/Renderer/Renderer.swift index 2334d2a..3c5d2ed 100644 --- a/Sources/Voxelotl/Renderer/Renderer.swift +++ b/Sources/Voxelotl/Renderer/Renderer.swift @@ -439,7 +439,7 @@ public class Renderer { } func createSpriteBatch() -> SpriteBatch { - return SpriteBatch(self) + return SpriteBatch(self, Rect(origin: .zero, size: Size(self.backBufferSize))) } internal func setupBatch(environment: Environment, camera: Camera) { diff --git a/Sources/Voxelotl/Renderer/SpriteBatch.swift b/Sources/Voxelotl/Renderer/SpriteBatch.swift index 83dc348..122af9e 100644 --- a/Sources/Voxelotl/Renderer/SpriteBatch.swift +++ b/Sources/Voxelotl/Renderer/SpriteBatch.swift @@ -13,11 +13,12 @@ public struct SpriteBatch { private var _mesh: RendererDynamicMesh private var _instances = [SpriteInstance]() - public var viewport: Rect? = nil + public var viewport: Rect - internal init(_ renderer: Renderer) { + internal init(_ renderer: Renderer, _ viewport: Rect) { self._renderer = renderer self._mesh = renderer.createDynamicMesh(vertexCapacity: 4096, indexCapacity: 4096)! + self.viewport = viewport } //MARK: - Public API @@ -89,14 +90,14 @@ public struct SpriteBatch { public mutating func draw(_ texture: RendererTexture2D, destination: Rect?) { assert(self._active != .inactive, "call to SpriteBatch.draw without calling begin") - self.drawQuad(texture, .positions(destination ?? self.viewport ?? Rect(self._renderer.frame))) + self.drawQuad(texture, .positions(destination ?? self.viewport)) } public mutating func draw(_ texture: RendererTexture2D, destination: Rect?, angle: Float = 0.0, center: Point? = .zero, flip: Sprite.Flip = .none, color: Color = .white ) { assert(self._active != .inactive, "call to SpriteBatch.draw without calling begin") - let dst = destination ?? self.viewport ?? Rect(self._renderer.frame) + let dst = destination ?? self.viewport if dst.size.w.isZero || dst.size.h.isZero { return } let texCoord = Quad.texcoords(flip) let color = color.linear @@ -182,17 +183,14 @@ public struct SpriteBatch { public mutating func draw(_ texture: RendererTexture2D, source: Rect, destination: Rect?) { assert(self._active != .inactive, "call to SpriteBatch.draw without calling begin") - self.drawQuad(texture, - .positions(destination ?? self.viewport ?? Rect(self._renderer.frame)), - .texcoords(texture.size, source)) + self.drawQuad(texture, .positions(destination ?? self.viewport), .texcoords(texture.size, source)) } public mutating func draw(_ texture: RendererTexture2D, source: Rect, destination: Rect?, color: Color = .white ) { assert(self._active != .inactive, "call to SpriteBatch.draw without calling begin") - self.drawQuad(texture, - .positions(destination ?? self.viewport ?? Rect(self._renderer.frame)), + self.drawQuad(texture, .positions(destination ?? self.viewport), .texcoords(texture.size, source), color: color.linear) } @@ -200,7 +198,7 @@ public struct SpriteBatch { angle: Float = 0.0, center: Point? = .zero, flip: Sprite.Flip = .none, color: Color = .white ) { assert(self._active != .inactive, "call to SpriteBatch.draw without calling begin") - let dst = destination ?? self.viewport ?? Rect(self._renderer.frame) + let dst = destination ?? self.viewport if dst.size.w.isZero || dst.size.h.isZero { return } let texCoord = Quad.texcoords(texture.size, source, flip) let color = color.linear @@ -255,7 +253,7 @@ public struct SpriteBatch { assert(self._instances.count > 0) if self._active == .begin { - self._renderer.setupBatch(blendMode: self._blendMode, frame: self.viewport ?? .init(self._renderer.frame)) + self._renderer.setupBatch(blendMode: self._blendMode, frame: self.viewport) self._active = .active } diff --git a/Sources/Voxelotl/SpriteTestGame.swift b/Sources/Voxelotl/SpriteTestGame.swift index bcea8e3..6465488 100644 --- a/Sources/Voxelotl/SpriteTestGame.swift +++ b/Sources/Voxelotl/SpriteTestGame.swift @@ -10,8 +10,6 @@ internal class SpriteTestGame: GameDelegate { func create(_ renderer: Renderer) { self.spriteBatch = renderer.createSpriteBatch() - // Uncomment to squeesh - //self.spriteBatch.viewport = .init(renderer.frame) renderer.clearColor = .init(hue: 301.2, saturation: 0.357, value: 0.488).linear // .magenta.mix(.white, 0.4).mix(.black, 0.8) self.texture = renderer.loadTexture(resourcePath: "test.png") self.wireShark = renderer.loadTexture(resourcePath: "wireshark.png") @@ -59,7 +57,7 @@ internal class SpriteTestGame: GameDelegate { self.spriteBatch.draw(self.texture, source: .init( origin: .init(scalar: fmod(Float(time.total), 32)), - size: (spriteBatch.viewport?.size ?? Size(renderer.frame.size)) * 0.01), + size: spriteBatch.viewport.size * 0.01), destination: nil, color: .init(renderer.clearColor).setAlpha(0.7)) @@ -92,9 +90,9 @@ internal class SpriteTestGame: GameDelegate { // Draw mouse cursor var mpos = Mouse.position - if self.spriteBatch.viewport != nil { + if self.spriteBatch.viewport.size != Size(renderer.frame.size) { mpos /= SIMD2(Size(renderer.frame.size)) - mpos *= SIMD2(self.spriteBatch.viewport!.size) + mpos *= SIMD2(self.spriteBatch.viewport.size) } let inter = 0.5 + sin(Float(time.total) * 10) * 0.5 let color = Color.green.mix(.white, 0.3) @@ -112,6 +110,10 @@ internal class SpriteTestGame: GameDelegate { self.spriteBatch.end() } + + func resize(_ size: Size) { + self.spriteBatch.viewport.size = Size(size) + } } fileprivate struct TestLevel {