1
+ using Engine . Assets ;
1
2
using Engine . ECS ;
2
3
using Veldrid ;
4
+ using Veldrid . SPIRV ;
3
5
4
6
namespace Engine . Components
5
7
{
6
- public class Material : Component , IResource
8
+ public class Material : Component , IResource , IAsset
7
9
{
8
- private readonly byte [ ] _shaderSource ;
9
- private Shader _vertexShader ;
10
- private Shader _fragmentShader ;
10
+ private ResourceFactory _factory ;
11
11
12
12
public Material (
13
13
string name ,
14
- byte [ ] shaderSource ,
15
14
string shaderFilename ,
16
15
BlendStateDescription blendState ,
17
16
DepthStencilStateDescription depthStencilState ,
18
17
PolygonFillMode fillMode = PolygonFillMode . Solid ,
19
18
bool depthClipEnabled = true )
20
19
: base ( name )
21
20
{
22
- _shaderSource = shaderSource ;
23
21
ShaderFilename = shaderFilename ;
24
22
DepthStencilState = depthStencilState ;
25
23
FillMode = fillMode ;
@@ -31,28 +29,32 @@ public Material(
31
29
depthTestEnabled : true , depthWriteEnabled : true , comparisonKind : ComparisonKind . LessEqual ) ;
32
30
33
31
public string ShaderFilename { get ; }
34
- public Shader [ ] Shaders => new Shader [ ] { _vertexShader , _fragmentShader } ;
32
+ public Shader [ ] Shaders { get ; private set ; }
35
33
public DepthStencilStateDescription DepthStencilState { get ; }
36
34
public PolygonFillMode FillMode { get ; }
37
35
public bool DepthClipEnabled { get ; }
38
36
public BlendStateDescription BlendState { get ; }
39
37
40
38
public void Initialize ( ResourceFactory factory , GraphicsDevice device )
41
39
{
42
- // Compile shaders
43
- _vertexShader = CompileShader ( factory , ShaderStages . Vertex ) ;
44
- _fragmentShader = CompileShader ( factory , ShaderStages . Fragment ) ;
40
+ _factory = factory ;
45
41
}
46
42
47
- public void Dispose ( )
43
+ public void LoadAssets ( AssetDataLoader assetDataLoader )
48
44
{
49
- throw new System . NotImplementedException ( ) ;
45
+ var shaderSource = ShaderImporter . Instance . Import ( assetDataLoader . Load ( AssetType . Shader , ShaderFilename ) ) ;
46
+ // Compile shaders
47
+ Shaders = _factory . CreateFromSpirv (
48
+ new ShaderDescription ( ShaderStages . Vertex , shaderSource , "VS" ) ,
49
+ new ShaderDescription ( ShaderStages . Fragment , shaderSource , "FS" ) ) ;
50
50
}
51
51
52
- private Shader CompileShader ( ResourceFactory factory , ShaderStages stage )
52
+ public void Dispose ( )
53
53
{
54
- var entryPoint = stage == ShaderStages . Vertex ? "VS" : "FS" ;
55
- return factory . CreateShader ( new ShaderDescription ( stage , _shaderSource , entryPoint ) ) ;
54
+ foreach ( var shader in Shaders )
55
+ {
56
+ shader . Dispose ( ) ;
57
+ }
56
58
}
57
59
}
58
60
}
0 commit comments