OROCHI
 
Loading...
Searching...
No Matches
GxResModelDae.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13GX_CORE_NAMESPACE_BEGIN()
14
15#if GX_DEVELOP
16//===========================================================================
18//===========================================================================
19class GxResModelDae : public GxResModel
20{
21 //-----------------------------------------------------------
23 //-----------------------------------------------------------
25public:
26 GX_RTTI_RESOURCE(GxResModelDae, GxResModel)
27 // ClassBaseReference継承クラス用禁止宣言
29
30private:
31 class ColladaReaderNotifier;
32 friend class ColladaReaderNotifier;
33
34public:
35 class GxVertexCache;
36 class GxIntermediateSkin;
37 class GxIntermediateMesh;
38
40 //-----------------------------------------------------------
42 //-----------------------------------------------------------
44public:
46 GxResModelDae(void);
47
49 //-----------------------------------------------------------
51 //-----------------------------------------------------------
53public:
55 b32 load(GxStream& stream, u32 dataSize);
56#if GX_DEVELOP
58 GX_FORCE_INLINE b32 save(GxStream& /*stream*/) { return false; }
59#endif // GX_DEVELOP
60
61protected:
63 b32 loadMeshAll(const GxColladaReader& reader);
65 b32 loadMesh(GxIntermediateMesh* pIntermediateMesh);
67 b32 countMeshGroup(void);
69 void loadJoint(const GxColladaReader& reader);
71 void loadGeometry(const GxColladaReader& reader);
73 void optimizeVertexCache(void);
74
76 //-----------------------------------------------------------
78 //-----------------------------------------------------------
80protected:
82 const GxColladaReader::GxColladaParts* getColladaPartsByGeometryIndex(const GxColladaReader& reader, u32 geometryIndex);
84 const GxIntermediateSkin* getSkinDada(u32 shapeId);
86 b32 isUseHalfTexCoord(void) const;
88 b32 isUseHalfNormal(void) const;
90 b32 isUseHalfBinormal(void) const;
92 b32 isUseHalfTangent(void) const;
93
95 //-----------------------------------------------------------
97 //-----------------------------------------------------------
99protected:
100 f32 _modelScale;
101 GxIntermediateMesh* _pIntermediateMesh;
102 GX_CHAR* _pStringTableWritePoint;
103 GxIntermediateSkin* _pIntermediateSkin;
104 u32 _skinCount;
105
107};
108
109//===========================================================================
111//===========================================================================
112class GxResModelDae::ColladaReaderNotifier : public GxColladaReaderNotifierBase
113{
114 //-----------------------------------------------------------
116 //-----------------------------------------------------------
118public:
120 ColladaReaderNotifier(GxResModelDae* pResModelDae);
122 ~ColladaReaderNotifier(void) override;
123private:
125 ColladaReaderNotifier(void) {}
126
128 //-----------------------------------------------------------
130 //-----------------------------------------------------------
132public:
134 void onColladaCommonAsset(const GxColladaCommonAssetCallback& value) override;
136 void onColladaJoint(const GxColladaReaderNotifierBase::GxColladaJointCallback& value) override;
138 void onColladaGeometry(const GxColladaGeometryCallback& value) override;
140 void onColladaSkin(const GxColladaSkinCallback& value) override;
142 void onColladaParts(const GxColladaPartsCallback& value) override;
143
144protected:
146 s32 findColladaElement(GxColladaReader::GxColladaTriangles* pTriangles, GxColladaReader::GxColladaTriangleElement::VERTICES_ELEMENT verticesElement, u32 set);
148 u32 countBindJoint(GxColladaReader::GxColladaSkin* pSkin);
149
151 //-----------------------------------------------------------
153 //-----------------------------------------------------------
155
156 GxResModelDae* _pResModelDae;
157
159};
160
161//===========================================================================
163//===========================================================================
164class GxResModelDae::GxVertexCache
165{
166 //-----------------------------------------------------------
168 //-----------------------------------------------------------
170public:
171 class GxVertexTable;
172
174 //-----------------------------------------------------------
176 //-----------------------------------------------------------
178
180 GxVertexCache(void);
182 virtual ~GxVertexCache(void);
183
185 void initialize(u32 vertexSize, u32 maxVertexCount);
186
188 void terminateWriting(void);
189
191 //-----------------------------------------------------------
193 //-----------------------------------------------------------
195public:
197 u32 push(void* pVertex, b32 checkArgument = true);
199 constexpr u32 getSize(void) const { return _writeIndex * _vertexSize; }
201 constexpr u32 getVertexCount(void) const { return _writeIndex; }
203 constexpr u32 getVertexSize(void) const { return _vertexSize; }
205 constexpr void* getBuffer(void) const { return _pBuffer; }
207 constexpr u32 getMaxVertexCount(void) const { return _maxVertexCount; }
208
210 //-----------------------------------------------------------
212 //-----------------------------------------------------------
214private:
215 u32 _vertexSize;
216 u32 _bufferSize;
217 u32 _writeIndex;
218 u32 _maxVertexCount;
219 void* _pBuffer;
220 GxVertexTable* _pVertexTable;
221
223};
224
225//===========================================================================
227//===========================================================================
228class GxResModelDae::GxVertexCache::GxVertexTable
229{
230 //-----------------------------------------------------------
232 //-----------------------------------------------------------
234
235 // 頂点の追加の際にメモリ確保を行いたくないため、
236 // 要素追加の度にNEW GxPairの走るGxHashMapを使用せず専用のHashTableを構築して使用する。
237public:
239 class GxVertexTableNode : public GxClassBase
240 {
241 //-----------------------------------------------------------
243 //-----------------------------------------------------------
245 public:
246 // RTTI定義
247 GX_RTTI_RESOURCE(GxVertexTableNode, GxClassBase)
248 // ClassBaseReference継承クラス用禁止宣言
249 GX_PROHIBIT_CLASS_BASE_REFERENCE(GxVertexTableNode)
250
251
252 //-----------------------------------------------------------
254 //-----------------------------------------------------------
256
258 GxVertexTableNode(void) :_pVertex(nullptr), _index(0), _pNext(nullptr) {}
259
261 //-----------------------------------------------------------
263 //-----------------------------------------------------------
265
267 void setData(void* pVertex, u32 index, GxVertexTableNode* pNext);
269 void add(GxVertexTableNode* pNode);
271 constexpr void* getVertexPointer(void) { return _pVertex; }
273 constexpr u32 getIndex(void) { return _index; }
275 constexpr GxVertexTableNode* getNextNode(void) { return _pNext; }
276
278 //-----------------------------------------------------------
280 //-----------------------------------------------------------
282 private:
283 void* _pVertex;
284 u32 _index;
285 GxVertexTableNode* _pNext;
286
288 };
289
291 class GxVertexArray : public GxArrayClassBase
292 {
293 //-----------------------------------------------------------
295 //-----------------------------------------------------------
297 protected:
299 GX_FORCE_INLINE GxClassBaseRoot** allocateMemory(u32 size) override { return static_cast<GxClassBaseRoot**>(GX_ALLOCATE_MEMORY(getGxAllocatorList(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP), size)); }
300
302 };
303public:
304 // new, delete定義
305 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
306
307
308 //-----------------------------------------------------------
310 //-----------------------------------------------------------
312public:
314 GxVertexTable(u32 maxVertexCount);
316 ~GxVertexTable(void);
317
319 //-----------------------------------------------------------
321 //-----------------------------------------------------------
323
325 void insert(void* pVertex, u32 byteSize, u32 index);
327 s64 find(void* pVertex, u32 byteSize);
328
330 //-----------------------------------------------------------
332 //-----------------------------------------------------------
334private:
335 u32 _maxVertexCount;
336 GxVertexArray _hashArray;
337 u32 _splitCount;
338 GxVertexTableNode* _pNodeBuffer;
339 GxVertexTableNode* _pFreeNext;
340 GxVertexTableNode* _pEndOfBuffer;
341
343};
344
345//===========================================================================
347//===========================================================================
348class GxResModelDae::GxIntermediateSkin
349{
350 //-----------------------------------------------------------
352 //-----------------------------------------------------------
354public:
355 // new, delete定義
356 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
357
358
359 //-----------------------------------------------------------
361 //-----------------------------------------------------------
363
365 GxIntermediateSkin(void);
367 virtual ~GxIntermediateSkin(void);
368
370 //-----------------------------------------------------------
372 //-----------------------------------------------------------
374
375 const GxColladaReader::GxColladaSkin* _pColladaSkin;
376 u32 _useJointCount;
377
379};
380
381//===========================================================================
383//===========================================================================
384class GxResModelDae::GxIntermediateMesh
385{
386 //-----------------------------------------------------------
388 //-----------------------------------------------------------
390public:
391 // new, delete定義
392 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
393
394
395 //-----------------------------------------------------------
397 //-----------------------------------------------------------
399
401 GxIntermediateMesh(void);
403 virtual ~GxIntermediateMesh(void);
404
406 //-----------------------------------------------------------
408 //-----------------------------------------------------------
410
411 u32 _geometryIndex;
412 u32 _groupIndex;
413 u32 _materialId;
414 b32 _isSkin;
415 u32 _jointCount;
416 u32 _vertexSize;
417 u32 _indexCount;
418 u32 _triangleseElmentCount;
419 u32 _jointElementOffset;
420 void* _pIndexBuffer;
421 RENDER_INDEX_TYPE _indexBufferElementType;
422 const GxColladaReader::GxColladaGeometry* _pColladaGeometry;
423 const GxColladaReader::GxColladaTriangles* _pColladaTriangles;
424 GxVertexCache _vertexCache;
426 u8 _colladaElementIndex[RENDER_VERTEX_ELEMENT_COUNT];
427 GxVertexCache _jointIndexCache;
428
430};
431
432#endif // GX_DEVELOP
433
434GX_CORE_NAMESPACE_END()
#define GX_ALLOCATE_MEMORY(pAllocatorList, size)
Definition GxAllocator.h:536
#define GX_PROHIBIT_CLASS_BASE_REFERENCE(__CLASS__)
GxClassBaseReference継承の禁止宣言(new以外の生成禁止 + コピー禁止)
Definition GxBase.h:244
RENDER_INDEX_TYPE
インデックスバッファ形式
Definition GxRender.h:147
@ RENDER_VERTEX_ELEMENT_COUNT
同時サポートする頂点要素数
Definition GxRender.h:45
#define GX_RTTI_RESOURCE(__THIS__, __BASE__)
リソースクラス型情報宣言
Definition GxRttiResource.h:102
配列クラス
Definition GxArrayClassBase.h:18
オブジェクト基底クラス
Definition GxBase.h:88
基底クラス
Definition GxBase.h:51
モデルリソースクラス
Definition GxResModel.h:20
b32 loadMesh(const GxMeshFile *pMeshFile)
メッシュを読み込む
Definition GxResModel.cpp:820
b32 load(GxStream &stream, u32 dataSize)
リソース読み込み
Definition GxResModel.cpp:94
ストリーム基礎クラス
Definition GxStream.h:20
頂点宣言に使用する、頂点要素を定義するための構造体
Definition GxRenderVertexDeclaration.h:125
32bitブーリアン
Definition GxDefine.h:173