Skip to content

Commit

Permalink
Merge branch 'main' into luan.fix-script-for-linux
Browse files Browse the repository at this point in the history
  • Loading branch information
luanpotter authored Dec 14, 2024
2 parents 5c48d8b + ae73181 commit 766276e
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 44 deletions.
2 changes: 1 addition & 1 deletion doc/flame/flame.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
- [Platforms](platforms.md)
- [Collision Detection](collision_detection.md)
- [Effects](effects.md)
- [Camera Component](camera)
- [Camera](camera.md)
- [Inputs](inputs/inputs.md)
- [Rendering](rendering/rendering.md)
- [Layout](layout/layout.md)
Expand Down
6 changes: 6 additions & 0 deletions packages/flame_3d/lib/src/extensions/vector4.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:ui';

import 'package:flame_3d/game.dart';

/// Represents an immutable [Vector3].
Expand All @@ -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 {
Expand Down
30 changes: 14 additions & 16 deletions packages/flame_3d/lib/src/graphics/graphics_device.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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(
Expand All @@ -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,
},
);
Expand All @@ -106,9 +111,7 @@ class GraphicsDevice {

/// Bind a [mesh].
void bindMesh(Mesh mesh) {
_renderPass.clearBindings();
mesh.bind(this);
_renderPass.draw();
}

/// Bind a [surface].
Expand Down Expand Up @@ -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!,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@ class SpatialMaterial extends Material {
this.roughness = 0.6,
}) : albedoTexture = albedoTexture ?? Texture.standard,
super(
vertexShader: Shader(
name: 'TextureVertex',
vertexShader: Shader.vertex(
asset:
'packages/flame_3d/assets/shaders/spatial_material.shaderbundle',
slots: [
UniformSlot.value('VertexInfo', {
'model',
Expand All @@ -26,8 +27,9 @@ class SpatialMaterial extends Material {
),
],
),
fragmentShader: Shader(
name: 'TextureFragment',
fragmentShader: Shader.fragment(
asset:
'packages/flame_3d/assets/shaders/spatial_material.shaderbundle',
slots: [
UniformSlot.sampler('albedoTexture'),
UniformSlot.value('Material', {
Expand Down
2 changes: 1 addition & 1 deletion packages/flame_3d/lib/src/resources/mesh/vertex.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
52 changes: 30 additions & 22 deletions packages/flame_3d/lib/src/resources/shader/shader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,49 +6,53 @@ import 'package:flame_3d/graphics.dart';
import 'package:flame_3d/resources.dart';
import 'package:flutter_gpu/gpu.dart' as gpu;

/// {@template shader}
/// {@template shader_resource}
///
/// {@endtemplate}
class ShaderResource extends Resource<gpu.Shader> {
final Shader shader;
/// {@macro shader_resource}
factory ShaderResource.createFromAsset({
required String asset,
required String shaderName,
required List<UniformSlot> slots,
}) {
final library = gpu.ShaderLibrary.fromAsset(asset)!;

/// {@macro shader}
ShaderResource(
super.resource, {
required String name,
List<UniformSlot> slots = const [],
}) : shader = Shader(name: name, slots: slots) {
for (final slot in slots) {
slot.resource = resource.getUniformSlot(slot.name);
final shader = library[shaderName];
if (shader == null) {
throw StateError('Shader "$shaderName" not found in library "$asset"');
}
return ShaderResource._(shader, slots: slots);
}

factory ShaderResource.create({
required String name,
required List<UniformSlot> slots,
ShaderResource._(
super.resource, {
List<UniformSlot> slots = const [],
}) {
final shader = _library[name];
if (shader == null) {
throw StateError('Shader "$name" not found in library');
for (final slot in slots) {
slot.resource = resource.getUniformSlot(slot.name);
}
return ShaderResource(shader, name: name, slots: slots);
}

static final _library = gpu.ShaderLibrary.fromAsset(
'packages/flame_3d/assets/shaders/spatial_material.shaderbundle',
)!;
}

class Shader {
final String asset;
final String name;
final List<UniformSlot> slots;
final Map<String, UniformInstance> instances = {};

Shader({
required this.asset,
required this.name,
required this.slots,
});

Shader.vertex({required String asset, required List<UniformSlot> slots})
: this(asset: asset, name: 'TextureVertex', slots: slots);

Shader.fragment({required String asset, required List<UniformSlot> slots})
: this(asset: asset, name: 'TextureFragment', slots: slots);

/// Set a [Texture] at the given [key] on the buffer.
void setTexture(String key, Texture texture) => _setTypedValue(key, texture);

Expand Down Expand Up @@ -140,6 +144,10 @@ class Shader {
}

ShaderResource compile() {
return ShaderResource.create(name: name, slots: slots);
return ShaderResource.createFromAsset(
asset: asset,
shaderName: name,
slots: slots,
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ void main() {

Shader _createShader(List<UniformSlot> slots) {
return Shader(
asset: 'none',
name: '-test-',
slots: slots,
);
Expand Down

0 comments on commit 766276e

Please sign in to comment.