From f940d3f9420d3ce001f47a9155c582b8b4cd1dcb Mon Sep 17 00:00:00 2001 From: Jochum van der Ploeg Date: Sat, 14 Dec 2024 13:14:24 +0100 Subject: [PATCH] fix: Make `flame_3d` work with latest stable (#3387) Fixes up the changes needed in flame_3d to work with the latest version of Flutter stable. --- .../flame_3d/lib/src/extensions/vector4.dart | 6 ++++ .../lib/src/graphics/graphics_device.dart | 30 +++++++++---------- .../lib/src/resources/mesh/vertex.dart | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/packages/flame_3d/lib/src/extensions/vector4.dart b/packages/flame_3d/lib/src/extensions/vector4.dart index 4eecda45160..92aeb46d6ed 100644 --- a/packages/flame_3d/lib/src/extensions/vector4.dart +++ b/packages/flame_3d/lib/src/extensions/vector4.dart @@ -1,3 +1,5 @@ +import 'dart:ui'; + import 'package:flame_3d/game.dart'; /// Represents an immutable [Vector3]. @@ -18,6 +20,10 @@ class Vector4Utils { static Vector4 lerp(Vector4 a, Vector4 b, double t) { return a + (b - a).scaled(t); } + + static Vector4 fromColor(Color color) { + return Vector4(color.r, color.g, color.b, color.a); + } } extension Vector4Math on ImmutableVector4 { diff --git a/packages/flame_3d/lib/src/graphics/graphics_device.dart b/packages/flame_3d/lib/src/graphics/graphics_device.dart index cbaac3e7e65..b9971f31f86 100644 --- a/packages/flame_3d/lib/src/graphics/graphics_device.dart +++ b/packages/flame_3d/lib/src/graphics/graphics_device.dart @@ -28,7 +28,12 @@ enum DepthStencilState { /// {@endtemplate} class GraphicsDevice { /// {@macro graphics_device} - GraphicsDevice({this.clearValue = const Color(0x00000000)}); + GraphicsDevice({ + this.clearValue = const Color(0x00000000), + gpu.GpuContext? gpuContext, + }) : _gpuContext = gpuContext ?? gpu.gpuContext; + + final gpu.GpuContext _gpuContext; /// The clear value, used to clear out the screen. final Color clearValue; @@ -71,8 +76,9 @@ class GraphicsDevice { // TODO(wolfenrain): used incorrectly DepthStencilState depthStencilState = DepthStencilState.depthRead, }) { - _commandBuffer = gpu.gpuContext.createCommandBuffer(); - _hostBuffer = gpu.gpuContext.createHostBuffer(); + _commandBuffer = _gpuContext.createCommandBuffer(); + _hostBuffer = _gpuContext.createHostBuffer(); + _renderPass = _commandBuffer.createRenderPass(_getRenderTarget(size)) ..setColorBlendEnable(true) ..setColorBlendEquation( @@ -84,10 +90,9 @@ class GraphicsDevice { ) ..setDepthWriteEnable(depthStencilState == DepthStencilState.depthRead) ..setDepthCompareOperation( - // TODO(wolfenrain): this is not correctly implemented AT all. switch (depthStencilState) { DepthStencilState.none => gpu.CompareFunction.never, - DepthStencilState.standard => gpu.CompareFunction.always, + DepthStencilState.standard => gpu.CompareFunction.lessEqual, DepthStencilState.depthRead => gpu.CompareFunction.less, }, ); @@ -106,9 +111,7 @@ class GraphicsDevice { /// Bind a [mesh]. void bindMesh(Mesh mesh) { - _renderPass.clearBindings(); mesh.bind(this); - _renderPass.draw(); } /// Bind a [surface]. @@ -163,28 +166,23 @@ class GraphicsDevice { if (_previousSize != size) { _previousSize = size; - final colorTexture = gpu.gpuContext.createTexture( + final colorTexture = _gpuContext.createTexture( gpu.StorageMode.devicePrivate, size.width.toInt(), size.height.toInt(), ); - final depthTexture = gpu.gpuContext.createTexture( + final depthTexture = _gpuContext.createTexture( gpu.StorageMode.deviceTransient, size.width.toInt(), size.height.toInt(), - format: gpu.gpuContext.defaultDepthStencilFormat, + format: _gpuContext.defaultDepthStencilFormat, ); _renderTarget = gpu.RenderTarget.singleColor( gpu.ColorAttachment( texture: colorTexture!, - clearValue: Vector4( - clearValue.r, - clearValue.g, - clearValue.b, - clearValue.a, - ), + clearValue: Vector4Utils.fromColor(clearValue), ), depthStencilAttachment: gpu.DepthStencilAttachment( texture: depthTexture!, diff --git a/packages/flame_3d/lib/src/resources/mesh/vertex.dart b/packages/flame_3d/lib/src/resources/mesh/vertex.dart index a11e8801fda..06efc48fc28 100644 --- a/packages/flame_3d/lib/src/resources/mesh/vertex.dart +++ b/packages/flame_3d/lib/src/resources/mesh/vertex.dart @@ -28,7 +28,7 @@ class Vertex { _storage = Float32List.fromList([ ...position.storage, // 1, 2, 3 ...texCoord.storage, // 4, 5 - ...color.storage, // 6, 7, 8, 9 + ...[color.r, color.g, color.b, color.a], // 6, 7, 8, 9 ...(normal ?? Vector3.zero()).storage, // 10, 11, 12 ...(joints ?? Vector4.zero()).storage, // 13, 14, 15, 16 ...(weights ?? Vector4.zero()).storage, // 17, 18, 19, 20