NW4F G3d
Loading...
Searching...
No Matches
g3d_MaterialObj.h
Go to the documentation of this file.
1#ifndef NW_G3D_MATERIALOBJ_H_
2#define NW_G3D_MATERIALOBJ_H_
3
4#include <nw/g3d/g3d_config.h>
5#include <nw/g3d/res/g3d_ResMaterial.h>
6#include <nw/g3d/g3d_Sizer.h>
7
8namespace nw { namespace g3d {
9
11{
12public:
13 enum
14 {
16 };
17
18 class InitArg;
19
26
28
29 static size_t CalcBufferSize(const InitArg& arg);
30
31 bool Init(const InitArg& arg, void* pBuffer, size_t bufferSize);
32
33 size_t CalcBlockBufferSize() const { return m_pRes->GetRawParamSize(); }
34
35 bool SetupBlockBuffer(void* pBuffer, size_t bufferSize);
36
38
39 void CalcMatBlock();
40
42
43 const ResMaterial* GetResource() const { return m_pRes; }
44
45 void* GetBufferPtr() { return m_pBufferPtr; }
46
48
49 bool IsBlockBufferValid() const { return (m_Flag & BLOCK_BUFFER_VALID) != 0; }
50
51 GfxBuffer& GetMatBlock() { return m_MatBlock; }
52
53 const GfxBuffer& GetMatBlock() const { return m_MatBlock; }
54
56
58
59 bool IsBlockSwapEnabled() const { return (m_Flag & BLOCK_BUFFER_SWAP) != 0; }
60
61 void SetUserPtr(void* pUserPtr) { m_pUserPtr = pUserPtr; }
62
63 void* GetUserPtr() { return m_pUserPtr; }
64
65 const void* GetUserPtr() const { return m_pUserPtr; }
66
67 template <typename T>
68 T* GetUserPtr() { return static_cast<T*>(m_pUserPtr); }
69
70 template <typename T>
71 const T* GetUserPtr() const { return static_cast<const T*>(m_pUserPtr); }
72
73 int GetShaderParamCount() const { return m_pRes->GetShaderParamCount(); }
74
75 const char* GetShaderParamName(int paramIndex) const
76 {
77 return m_pRes->GetShaderParamName(paramIndex);
78 }
79
80 int GetShaderParamIndex(const char* name) const { return m_pRes->GetShaderParamIndex(name); }
81
83 {
84 return m_pRes->GetShaderParam(paramIndex);
85 }
86
87 const ResShaderParam* GetResShaderParam(int paramIndex) const
88 {
89 return m_pRes->GetShaderParam(paramIndex);
90 }
91
93 {
94 return m_pRes->GetShaderParam(name);
95 }
96
97 const ResShaderParam* GetResShaderParam(const char* name) const
98 {
99 return m_pRes->GetShaderParam(name);
100 }
101
102 void* EditShaderParam(int paramIndex)
103 {
104 ResShaderParam* pParam = GetResShaderParam(paramIndex);
105 if (pParam->GetOffset() >= 0 && pParam->GetType() != ResShaderParam::TYPE_TEXSRTEX)
106 {
107 SetDirtyFlag(paramIndex);
108 }
109 return AddOffset(m_pSrcParam, pParam->GetSrcOffset());
110 }
111
112 const void* GetShaderParam(int paramIndex) const
113 {
114 return AddOffset(m_pSrcParam, GetResShaderParam(paramIndex)->GetSrcOffset());
115 }
116
117 template <typename T>
118 T* EditShaderParam(int paramIndex)
119 {
120 ResShaderParam* pParam = GetResShaderParam(paramIndex);
121 NW_G3D_ASSERTMSG(sizeof(T) <= pParam->GetSrcSize(), "Oversized T. %u <= %u",
122 sizeof(T), pParam->GetSrcSize());
123 if (pParam->GetOffset() >= 0 && pParam->GetType() != ResShaderParam::TYPE_TEXSRTEX)
124 {
125 SetDirtyFlag(paramIndex);
126 }
127 return AddOffset<T>(m_pSrcParam, pParam->GetSrcOffset());
128 }
129
130 template <typename T>
131 const T* GetShaderParam(int paramIndex) const
132 {
133 const ResShaderParam* pParam = GetResShaderParam(paramIndex);
134 NW_G3D_ASSERTMSG(sizeof(T) <= pParam->GetSrcSize(), "Oversized T. %u <= %u",
135 sizeof(T), pParam->GetSrcSize());
136 return AddOffset<T>(m_pSrcParam, pParam->GetSrcOffset());
137 }
138
140 {
142 memcpy(m_pSrcParam, m_pRes->ref().ofsSrcParam.to_ptr(), m_pRes->GetSrcParamSize());
144 }
145
146 void* GetSrcParam() { return m_pSrcParam; }
147
148 const void* GetSrcParam() const { return m_pSrcParam; }
149
150 void ResetDirtyFlags();
151
152 bool IsMatBlockDirty() const
153 {
154 return (m_Flag & PARAM_DIRTY) || (m_pRes->ref().numShaderParamVolatile > 0);
155 }
156
158
160 {
161 NW_G3D_ASSERT_INDEX_BOUNDS(texIndex, GetTextureCount());
162 return m_ppTextureArray[texIndex];
163 }
164
165 const ResTexture* GetResTexture(int texIndex) const
166 {
167 NW_G3D_ASSERT_INDEX_BOUNDS(texIndex, GetTextureCount());
168 return m_ppTextureArray[texIndex];
169 }
170
171 void SetResTexture(int texIndex, ResTexture* texture)
172 {
173 NW_G3D_ASSERT_INDEX_BOUNDS(texIndex, GetTextureCount());
174 m_ppTextureArray[texIndex] = texture;
175 }
176
178 {
179 for (int idxTex = 0, numTex = GetTextureCount(); idxTex < numTex; ++idxTex)
180 {
181 m_ppTextureArray[idxTex] = m_pRes->GetTextureRef(idxTex)->Get();
182 }
183 }
184
185 ResRenderState* GetResRenderState() { return m_pRes->GetRenderState(); }
186
187 const ResRenderState* GetResRenderState() const { return m_pRes->GetRenderState(); }
188
189 int GetSamplerCount() const { return m_pRes->GetSamplerCount(); }
190
191 const char* GetSamplerName(int samplerIndex) const
192 {
193 return m_pRes->GetSamplerName(samplerIndex);
194 }
195
196 int GetSamplerIndex(const char* name) const { return m_pRes->GetSamplerIndex(name); }
197
198 ResSampler* GetResSampler(int samplerIndex)
199 {
200 return m_pRes->GetSampler(samplerIndex);
201 }
202
203 const ResSampler* GetResSampler(int samplerIndex) const
204 {
205 return m_pRes->GetSampler(samplerIndex);
206 }
207
208 ResSampler* GetResSampler(const char* name) { return m_pRes->GetSampler(name); }
209
210 const ResSampler* GetResSampler(const char* name) const { return m_pRes->GetSampler(name); }
211
212protected:
213 enum Flag
214 {
217 PARAM_DIRTY = 0x1 << 2
218 };
219
220 void SetDirtyFlag(int paramIndex)
221 {
222 NW_G3D_ASSERT_INDEX_BOUNDS(paramIndex, GetShaderParamCount());
224 m_pDirtyFlagArray[paramIndex >> 5] |= 0x1 << (paramIndex & 0x1F);
225 }
226
227 template <bool swap>
228 void ConvertParams(void* pBuffer);
229
230 template <bool swap>
231 bool ConvertDirtyParams(void* pBuffer);
232
234
235private:
236 class Sizer;
238
240
242
246
250
252};
253
254template <>
255bool* MaterialObj::EditShaderParam<bool>(int);
256template <>
257const bool* MaterialObj::GetShaderParam<bool>(int) const;
258
259class MaterialObj::Sizer : public nw::g3d::Sizer
260{
261public:
263
264 void Calc(const InitArg& arg);
265
266 enum
267 {
269
273 };
274
276};
277
279{
280public:
281 explicit InitArg(ResMaterial* resource)
282 : m_pRes(resource)
283
284 {
285 NW_G3D_ASSERT_NOT_NULL(resource);
286 }
287
288 ResMaterial* GetResource() const { return m_pRes; }
289
290 Sizer& GetSizer() const { return m_Sizer; }
291
292private:
294
295 mutable Sizer m_Sizer;
296};
297
298} } // namespace nw::g3d
299
300#endif // NW_G3D_MATERIALOBJ_H_
Definition g3d_MaterialObj.h:279
ResMaterial * GetResource() const
Definition g3d_MaterialObj.h:288
InitArg(ResMaterial *resource)
Definition g3d_MaterialObj.h:281
Sizer m_Sizer
Definition g3d_MaterialObj.h:295
ResMaterial * m_pRes
Definition g3d_MaterialObj.h:293
Sizer & GetSizer() const
Definition g3d_MaterialObj.h:290
Definition g3d_MaterialObj.h:260
Chunk chunk[NUM_CHUNK]
Definition g3d_MaterialObj.h:275
@ SRC_PARAM_ARRAY
Definition g3d_MaterialObj.h:270
@ DIRTY_FLAG_ARRAY
Definition g3d_MaterialObj.h:268
@ NUM_CHUNK
Definition g3d_MaterialObj.h:272
@ TEXTURE_ARRAY
Definition g3d_MaterialObj.h:271
void Calc(const InitArg &arg)
Definition g3d_MaterialObj.cpp:6
Sizer()
Definition g3d_MaterialObj.h:262
Definition g3d_MaterialObj.h:11
T * GetUserPtr()
Definition g3d_MaterialObj.h:68
bool Init(const InitArg &arg, void *pBuffer, size_t bufferSize)
Definition g3d_MaterialObj.cpp:29
ResShaderParam * GetResShaderParam(int paramIndex)
Definition g3d_MaterialObj.h:82
bool IsBlockBufferValid() const
Definition g3d_MaterialObj.h:49
const ResShaderParam * GetResShaderParam(int paramIndex) const
Definition g3d_MaterialObj.h:87
int GetTextureCount() const
Definition g3d_MaterialObj.h:157
void ResetDirtyFlags()
Definition g3d_MaterialObj.cpp:158
GfxBuffer & GetMatBlock()
Definition g3d_MaterialObj.h:51
ResSampler * GetResSampler(const char *name)
Definition g3d_MaterialObj.h:208
const T * GetShaderParam(int paramIndex) const
Definition g3d_MaterialObj.h:131
const ResTexture * GetResTexture(int texIndex) const
Definition g3d_MaterialObj.h:165
void * EditShaderParam(int paramIndex)
Definition g3d_MaterialObj.h:102
const void * GetUserPtr() const
Definition g3d_MaterialObj.h:65
void ConvertParams(void *pBuffer)
void SetResTexture(int texIndex, ResTexture *texture)
Definition g3d_MaterialObj.h:171
T * EditShaderParam(int paramIndex)
Definition g3d_MaterialObj.h:118
bool IsMatBlockDirty() const
Definition g3d_MaterialObj.h:152
const ResSampler * GetResSampler(int samplerIndex) const
Definition g3d_MaterialObj.h:203
void * m_pSrcParam
Definition g3d_MaterialObj.h:244
ResMaterial * m_pRes
Definition g3d_MaterialObj.h:237
const void * GetSrcParam() const
Definition g3d_MaterialObj.h:148
void * m_pBufferPtr
Definition g3d_MaterialObj.h:248
ResShaderParam * GetResShaderParam(const char *name)
Definition g3d_MaterialObj.h:92
MaterialObj()
Definition g3d_MaterialObj.h:27
const ResSampler * GetResSampler(const char *name) const
Definition g3d_MaterialObj.h:210
const void * GetShaderParam(int paramIndex) const
Definition g3d_MaterialObj.h:112
ResTexture ** m_ppTextureArray
Definition g3d_MaterialObj.h:245
const char * GetSamplerName(int samplerIndex) const
Definition g3d_MaterialObj.h:191
ResTexture * GetResTexture(int texIndex)
Definition g3d_MaterialObj.h:159
int GetSamplerCount() const
Definition g3d_MaterialObj.h:189
ResMaterial * GetResource()
Definition g3d_MaterialObj.h:41
void * GetBlockBufferPtr()
Definition g3d_MaterialObj.h:47
const char * GetShaderParamName(int paramIndex) const
Definition g3d_MaterialObj.h:75
const ResMaterial * GetResource() const
Definition g3d_MaterialObj.h:43
void EnableBlockSwap()
Definition g3d_MaterialObj.h:55
ResSampler * GetResSampler(int samplerIndex)
Definition g3d_MaterialObj.h:198
int GetSamplerIndex(const char *name) const
Definition g3d_MaterialObj.h:196
const GfxBuffer & GetMatBlock() const
Definition g3d_MaterialObj.h:53
void * m_pUserPtr
Definition g3d_MaterialObj.h:247
void * GetSrcParam()
Definition g3d_MaterialObj.h:146
bool IsBlockSwapEnabled() const
Definition g3d_MaterialObj.h:59
Flag
Definition g3d_MaterialObj.h:214
@ BLOCK_BUFFER_SWAP
Definition g3d_MaterialObj.h:216
@ PARAM_DIRTY
Definition g3d_MaterialObj.h:217
@ BLOCK_BUFFER_VALID
Definition g3d_MaterialObj.h:215
@ MAX_TEXTURE
Definition g3d_MaterialObj.h:15
bool SetupBlockBuffer(void *pBuffer, size_t bufferSize)
Definition g3d_MaterialObj.cpp:69
int GetShaderParamCount() const
Definition g3d_MaterialObj.h:73
bit32 m_Flag
Definition g3d_MaterialObj.h:239
GfxBuffer m_MatBlock
Definition g3d_MaterialObj.h:243
void ClearTexture()
Definition g3d_MaterialObj.h:177
void * GetBufferPtr()
Definition g3d_MaterialObj.h:45
const ResRenderState * GetResRenderState() const
Definition g3d_MaterialObj.h:187
Alignment
Definition g3d_MaterialObj.h:21
@ BUFFER_ALIGNMENT
Definition g3d_MaterialObj.h:22
@ BLOCK_BUFFER_ALIGNMENT
Definition g3d_MaterialObj.h:24
void SetDirtyFlag(int paramIndex)
Definition g3d_MaterialObj.h:220
bool ConvertDirtyParams(void *pBuffer)
Definition g3d_MaterialObj.cpp:111
void CalcMatBlock()
Definition g3d_MaterialObj.cpp:93
void ClearShaderParam()
Definition g3d_MaterialObj.h:139
size_t CalcBlockBufferSize() const
Definition g3d_MaterialObj.h:33
const T * GetUserPtr() const
Definition g3d_MaterialObj.h:71
void DisableBlockSwap()
Definition g3d_MaterialObj.h:57
void * GetUserPtr()
Definition g3d_MaterialObj.h:63
ResRenderState * GetResRenderState()
Definition g3d_MaterialObj.h:185
static size_t CalcBufferSize(const InitArg &arg)
Definition g3d_MaterialObj.cpp:22
void SetUserPtr(void *pUserPtr)
Definition g3d_MaterialObj.h:61
int GetShaderParamIndex(const char *name) const
Definition g3d_MaterialObj.h:80
void * m_pBlockBuffer
Definition g3d_MaterialObj.h:249
const ResShaderParam * GetResShaderParam(const char *name) const
Definition g3d_MaterialObj.h:97
bit32 * m_pDirtyFlagArray
Definition g3d_MaterialObj.h:241
Definition g3d_Sizer.h:10
Sizer()
Definition g3d_Sizer.h:18
Definition g3d_GfxObject.h:48
Definition g3d_ResMaterial.h:375
ResTextureRef * GetTextureRef(int texIndex)
Definition g3d_ResMaterial.h:428
int GetTextureCount() const
Definition g3d_ResMaterial.h:426
Definition g3d_ResMaterial.h:125
Definition g3d_ResMaterial.h:274
Definition g3d_ResMaterial.h:301
@ TYPE_TEXSRTEX
Definition g3d_ResMaterial.h:314
Type GetType() const
Definition g3d_ResMaterial.h:325
Definition g3d_ResTexture.h:32
#define NW_G3D_ASSERT_NOT_NULL(exp)
Definition g3d_assert.h:20
#define NW_G3D_ASSERTMSG(exp,...)
Definition g3d_assert.h:13
#define NW_G3D_ASSERT_INDEX_BOUNDS(index, size)
Definition g3d_assert.h:23
#define NW_G3D_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition g3d_defs.h:81
u32 bit32
Definition g3d_defs.h:131
Definition g3d_GfxManage.cpp:10
Definition g3d_Sizer.h:13