1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
#ifndef __AE_MATERIAL_H__
#define __AE_MATERIAL_H__
#include "Containers/Vector.hpp"
#include "Containers/String.h"
#include "Math/Vector2.h"
#include "Math/Vector3.h"
#include "Math/Vector4.h"
#include "Math/Matrix44.h"
#include "Scripting/Luax.hpp"
#include "Shader.h"
#include "Texture.h"
#include "Manager.hpp"
namespace AsuraEngine
{
namespace Graphics
{
class MaterialFactory;
///
/// ͨʵShaderеuniformsShaderĵı¶materialÿʿԲ컯ͬɫ
/// ͬͨļ(.mat)ʵ֣ڴáAsuraУShaderֱӦõȾ̶һ
/// ʹɲshaderuniformsmaterial䵱shaderĴ
///
class Material final : public Filesystem::Asset
{
public:
enum class UniformsType
{
None = 0,
Float,
Int,
Vector2,
Vector3,
Vector4,
Matrix44,
Texture,
Color,
};
struct UniformsInfo
{
uint ID; // uniformID
UniformsType type; // uniform
union
{
float f;
int i;
Math::Vector2 v2;
Math::Vector3 v3;
Math::Vector4 v4;
Math::Matrix44 m44;
Texture* tex;
Color col;
}value; // uniformֵ
};
void SetShader(Shader* shader);
// UniformڲУȾʱϴGPU
///
/// uniformIDIDnamemapshader乲uniformֵʱͨIDѯuniform
/// shaderҵuniform locationlocationֵ
///
static int GetUniformID(const Containers::String& name);
void SetTexture(uint ID, Texture* texture);
void SetVector2(uint ID, Math::Vector2* vector2);
void SetVector3(uint ID, Math::Vector3* vector3);
void SetVector4(uint ID, Math::Vector4* vector4);
void SetMatrix44(uint ID, Math::Matrix44* matrix44);
void SetFloat(uint ID, float value);
void SetInteger(uint ID, int value);
void SetColor(uint ID, Color color);
UniformsInfo GetUniformInfo(uint ID);
float GetUniformInfof(uint ID);
int GetUniformInfoi(uint ID);
Math::Vector2 GetUniformInfov2(uint ID);
Math::Vector3 GetUniformInfov3(uint ID);
Math::Vector4 GetUniformInfov4(uint ID);
Math::Matrix44 GetUniformInfom44(uint ID);
Texture* GetUniformInfotex(uint ID);
Color GetUniformInfocol(uint ID);
// ϴ
void SetVertexAttributes();
private:
friend class MaterialFactory;
Material();
Material(const Material& src);
~Material();
///
///
///
uint mID;
///
///
///
Shader* mShader;
///
/// UniformsֵӳIDֵ
///
Containers::Map<int, UniformsInfo> mUniforms;
///
/// ǷǹIJ
///
bool mIsShared;
//----------------------------------------------------------------------------------------------------
LUAX_DECL_FACTORY(Material);
LUAX_DECL_METHOD(l_Clone);
LUAX_DECL_METHOD(l_SetShader);
LUAX_DECL_METHOD(l_SetTexture);
LUAX_DECL_METHOD(l_SetVector2);
LUAX_DECL_METHOD(l_SetVector3);
LUAX_DECL_METHOD(l_SetVector4);
LUAX_DECL_METHOD(l_SetMatrix44);
LUAX_DECL_METHOD(l_SetFloat);
LUAX_DECL_METHOD(l_SetInteger);
LUAX_DECL_METHOD(l_SetColor);
LUAX_DECL_METHOD(l_GetUniformInfo);
LUAX_DECL_METHOD(l_GetUniformInfof);
LUAX_DECL_METHOD(l_GetUniformInfoi);
LUAX_DECL_METHOD(l_GetUniformInfov2);
LUAX_DECL_METHOD(l_GetUniformInfov3);
LUAX_DECL_METHOD(l_GetUniformInfov4);
LUAX_DECL_METHOD(l_GetUniformInfom44);
LUAX_DECL_METHOD(l_GetUniformInfotex);
LUAX_DECL_METHOD(l_GetUniformInfocol);
LUAX_DECL_METHOD(l_SetVertexAttributes);
};
class MaterialManager : public Manager
{
public:
private:
///
/// еimage
///
Containers::Map<uint, Material*> mMaterials;
///
/// image·IDӳ䡣Դ.asrimageͨ·õimageԲеimageڴmapС
/// ɳimageֻͨIDȡԳҪID
///
Containers::StringMap<uint> mMaterialIDs;
};
class MaterialFactory : public Factory
{
public:
///
/// һmaterial
///
Material* Clone(Material* src);
Material* Create();
};
}
}
#endif
|