From 1bef47ea3711f1abac20198d2ff6f4fc50f1c452 Mon Sep 17 00:00:00 2001 From: Chance Snow Date: Tue, 9 Apr 2024 09:14:20 -0500 Subject: [PATCH] Implement ECS resource interface for materials --- source/graphics/package.d | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/source/graphics/package.d b/source/graphics/package.d index 2513046..ea72cea 100644 --- a/source/graphics/package.d +++ b/source/graphics/package.d @@ -3,14 +3,18 @@ /// License: 3-Clause BSD License module teraflop.graphics; +import concepts : implements; +import teraflop.ecs : Resource; import teraflop.math; import teraflop.traits : isStruct; public import teraflop.graphics.color; public import teraflop.graphics.primitives; public import wgpu.api : ShaderStage; +import wgpu.api : Adapter, Device; /// A shaded material for geometry encapsulating its `Shader`s, graphics pipeline state, and optionally a `Texture`. /// See_Also: `teraflop.systems.rendering.PipelinePreparer` +@implements!(Material, Resource) struct Material { import std.typecons : Flag, No, Yes; import wgpu.api : CullMode, FrontFace; @@ -19,7 +23,7 @@ struct Material { private FrontFace _frontFace = FrontFace.cw; private CullMode _cullMode = CullMode.back; - package (teraflop) Shader*[] _shaders; + package (teraflop) Shader*[] shaders; // TODO: package (teraflop) Texture _texture; /// Initialize a new Material. @@ -32,10 +36,10 @@ struct Material { FrontFace frontFace = FrontFace.cw, CullMode cullMode = CullMode.back, Flag!"depthTest" depthTest = Yes.depthTest ) { - _shaders = shaders; + shaders = shaders; + _depthTest = depthTest; _frontFace = frontFace; _cullMode = cullMode; - _depthTest = depthTest; } /// Whether to perform the depth test. If `true`, assumes the render target has a depth buffer attachment. @@ -50,6 +54,11 @@ struct Material { CullMode cullMode() @property const { return _cullMode; } + + /// + void initialize(Adapter adapter, Device device) { + foreach (shader; shaders) shader.initialize(adapter, device); + } } /// @@ -69,6 +78,7 @@ enum SourceLanguage { } /// +@implements!(Shader, Resource) struct Shader { import std.conv : to; import std.exception : enforce; @@ -137,7 +147,7 @@ struct Shader { } /// Initialize this Shader. - void initialize(scope Device device) { + void initialize(scope Adapter adapter, scope Device device) { assert(!initialized); this.device = device; this._shaderModule = _language == SourceLanguage.spirv