OROCHI
 
Loading...
Searching...
No Matches
GxResModelFbx.h
Go to the documentation of this file.
1//===========================================================================
10//===========================================================================
11#pragma once
12
13#if defined(_WINDOWS)
14
15GX_CORE_NAMESPACE_BEGIN()
16
17#if GX_DEVELOP
18
19//===========================================================================
21//===========================================================================
22class GxResModelFbx : public GxResModel
23{
24 //-----------------------------------------------------------
26 //-----------------------------------------------------------
28public:
29 GX_RTTI_RESOURCE(GxResModelFbx, GxResModel)
30 // ClassBaseReference継承クラス用禁止宣言
32
33public:
34 class GxVertexCache;
35 class GxIntermediateNormal;
36 class GxIntermediateSkin;
37 class GxIntermediateSkeleton;
38 class GxIntermediateBindPose;
39 class GxIntermediateWeight;
40 class GxIntermediateMesh;
41
43
44protected:
46 static constexpr u32 DESTRUCTION_PARTS_MAX = GxMath::VALUE_256;
47
48 //-----------------------------------------------------------
50 //-----------------------------------------------------------
52public:
54 GxResModelFbx(void);
55
57 //-----------------------------------------------------------
59 //-----------------------------------------------------------
61public:
63 b32 load(GxStream& stream, u32 dataSize);
64#if GX_DEVELOP
66 GX_FORCE_INLINE b32 save(GxStream& /*stream*/) { return false; }
67#endif // GX_DEVELOP
68
69protected:
71 void analysisMaterialNames(const FbxNode* pNode, GxArray& nameList);
72
74 void analysisNodeTypeCount(const FbxNode* pNode);
76 GxIntermediateMesh* analysisNode(const FbxNode* pNode, GxIntermediateMesh* pIntermediateMesh, FbxNodeAttribute::EType type);
77
79 void loadBindPose(FbxScene* pScene);
81 b32 loadElement(const FbxMesh* pFbxMesh, GxIntermediateMesh* pIntermediateMesh);
83 b32 loadWeight(const FbxMesh* pMesh, GxIntermediateMesh* pIntermediateMesh);
85 b32 loadMesh(const FbxMesh* pMesh, GxIntermediateMesh* pIntermediateMesh);
87 b32 countMeshGroup(void);
89 void loadJoint(void);
91 void loadGeometry(void);
93 const u16 getSkeletonId(const FbxNode* pNode);
95 const u16 getBindPoseSkeltonId(const FbxNode* pNode);
96
98 GX_CSTR getLastWord(GX_CSTR src);
100 s32 checkPartsKeyWord(GX_CSTR src);
102 s32 checkLODKeyWord(GX_CSTR src);
104 s32 checkHavokKeyWord(GX_CSTR src);
105
107 //-----------------------------------------------------------
109 //-----------------------------------------------------------
111protected:
113 const GxColladaReader::GxColladaParts* getColladaPartsByGeometryIndex(const GxColladaReader& reader, u32 geometryIndex);
114
116 //-----------------------------------------------------------
118 //-----------------------------------------------------------
120protected:
121 f32 _modelScale;
122 GxIntermediateMesh* _pIntermediateMesh;
123 GX_CHAR* _pStringTableWritePoint;
124 u32 _skinCount;
125 GxIntermediateSkeleton* _pIntermediateSkeleton;
126 u32 _skeletonCount;
127 GxIntermediateBindPose* _pIntermediateBindPose;
128 u32* _pIntermediateDestructionPartsCount;
129 GxArray _materialNames;
130
132};
133
134//===========================================================================
136//===========================================================================
137class GxResModelFbx::GxVertexCache
138{
139 //-----------------------------------------------------------
141 //-----------------------------------------------------------
143public:
144 class GxVertexTable;
145
147 //-----------------------------------------------------------
149 //-----------------------------------------------------------
151
153 GxVertexCache(void);
155 virtual ~GxVertexCache(void);
156
158 void initialize(u32 vertexSize, u32 maxVertexCount);
159
161 void terminateWriting(void);
162
164 //-----------------------------------------------------------
166 //-----------------------------------------------------------
168public:
170 u32 push(void* pVertex, b32 checkArgument = true);
172 constexpr u32 getSize(void) const { return _writeIndex * _vertexSize; }
174 constexpr u32 getVertexCount(void) const { return _writeIndex; }
176 constexpr u32 getVertexSize(void) const { return _vertexSize; }
178 constexpr void* getBuffer(void) const { return _pBuffer; }
180 constexpr u32 getMaxVertexCount(void) const { return _maxVertexCount; }
181
183 //-----------------------------------------------------------
185 //-----------------------------------------------------------
187private:
188 u32 _vertexSize;
189 u32 _bufferSize;
190 u32 _writeIndex;
191 u32 _maxVertexCount;
192 void* _pBuffer;
193 GxVertexTable* _pVertexTable;
194
196};
197
198//===========================================================================
200//===========================================================================
201class GxResModelFbx::GxVertexCache::GxVertexTable
202{
203 //-----------------------------------------------------------
205 //-----------------------------------------------------------
207
208 // 頂点の追加の際にメモリ確保を行いたくないため、
209 // 要素追加の度にNEW GxPairの走るGxHashMapを使用せず専用のHashTableを構築して使用する。
210public:
212 class GxVertexTableNode : public GxClassBase
213 {
214 //-----------------------------------------------------------
216 //-----------------------------------------------------------
218 public:
219 // RTTI定義
220 GX_RTTI_RESOURCE(GxVertexTableNode, GxClassBase)
221 // ClassBaseReference継承クラス用禁止宣言
222 GX_PROHIBIT_CLASS_BASE_REFERENCE(GxVertexTableNode)
223
224
225 //-----------------------------------------------------------
227 //-----------------------------------------------------------
229
231 GxVertexTableNode(void) : _pVertex(nullptr), _index(0), _pNext(nullptr) {}
232
234 //-----------------------------------------------------------
236 //-----------------------------------------------------------
238
240 void setData(void* pVertex, u32 index, GxVertexTableNode* pNext);
242 void add(GxVertexTableNode* pNode);
244 constexpr void* getVertexPointer(void) { return _pVertex; }
246 constexpr u32 getIndex(void) { return _index; }
248 constexpr GxVertexTableNode* getNextNode(void) { return _pNext; }
249
251 //-----------------------------------------------------------
253 //-----------------------------------------------------------
255 private:
256 void* _pVertex;
257 u32 _index;
258 GxVertexTableNode* _pNext;
259
261 };
262
264 class GxVertexArray : public GxArrayClassBase
265 {
266 //-----------------------------------------------------------
268 //-----------------------------------------------------------
270 protected:
272 GX_FORCE_INLINE GxClassBaseRoot** allocateMemory(u32 size) override { return static_cast<GxClassBaseRoot**>(GX_ALLOCATE_MEMORY(getGxAllocatorList(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP), size)); }
273
275 };
276public:
277 // new, delete定義
278 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
279
280
281 //-----------------------------------------------------------
283 //-----------------------------------------------------------
285public:
287 GxVertexTable(u32 maxVertexCount);
289 ~GxVertexTable(void);
290
292 //-----------------------------------------------------------
294 //-----------------------------------------------------------
296
298 void insert(void* pVertex, u32 byteSize, u32 index);
300 s64 find(void* pVertex, u32 byteSize);
301
303 //-----------------------------------------------------------
305 //-----------------------------------------------------------
307private:
308 u32 _maxVertexCount;
309 GxVertexArray _hashArray;
310 u32 _splitCount;
311 GxVertexTableNode* _pNodeBuffer;
312 GxVertexTableNode* _pFreeNext;
313 GxVertexTableNode* _pEndOfBuffer;
314
316};
317
318//===========================================================================
320//===========================================================================
321class GxResModelFbx::GxIntermediateSkeleton
322{
323 //-----------------------------------------------------------
325 //-----------------------------------------------------------
327public:
328 // new, delete定義
329 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
330
331
332 //-----------------------------------------------------------
334 //-----------------------------------------------------------
336
338 GxIntermediateSkeleton(void);
340 virtual ~GxIntermediateSkeleton(void);
341
343 //-----------------------------------------------------------
345 //-----------------------------------------------------------
347
348 const FbxNode* _pSkeleton;
349 u32 _useJointCount;
350
352};
353
354//===========================================================================
356//===========================================================================
357class GxResModelFbx::GxIntermediateBindPose
358{
359 //-----------------------------------------------------------
361 //-----------------------------------------------------------
363public:
364 // new, delete定義
365 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
366
367
368 //-----------------------------------------------------------
370 //-----------------------------------------------------------
372
374 GxIntermediateBindPose(void);
376 virtual ~GxIntermediateBindPose(void);
377
379 //-----------------------------------------------------------
381 //-----------------------------------------------------------
383
384 const FbxNode* _pNode;
385 GxMatrix44 _matrix;
386
388};
389
390//===========================================================================
392//===========================================================================
393class GxResModelFbx::GxIntermediateWeight
394{
395 //-----------------------------------------------------------
397 //-----------------------------------------------------------
399public:
400 // new, delete定義
401 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
402
403
404 //-----------------------------------------------------------
406 //-----------------------------------------------------------
408
410 GxIntermediateWeight(void);
412 virtual ~GxIntermediateWeight(void);
413
415 //-----------------------------------------------------------
417 //-----------------------------------------------------------
419
420 u16 _jointIndex[GxColladaReader::GxColladaWeight::EFFECT_JOINT_NUM];
421 GxU8Nx4 _blendWeight;
422 u8 _weightCount;
423
425};
426
427//===========================================================================
429//===========================================================================
430class GxResModelFbx::GxIntermediateMesh
431{
432 //-----------------------------------------------------------
434 //-----------------------------------------------------------
436public:
437 // new, delete定義
438 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
439
440
441 //-----------------------------------------------------------
443 //-----------------------------------------------------------
445
447 GxIntermediateMesh(void);
449 virtual ~GxIntermediateMesh(void);
450
452 //-----------------------------------------------------------
454 //-----------------------------------------------------------
456
457 u32 _geometryIndex;
458 u32 _groupIndex;
459 GX_CSTR _materialName;
460 s32 _lodIndex;
461 s32 _partsId;
462 s32 _destructionMeshId;
463 b32 _isSkin;
464 u32 _jointCount;
465 u32 _vertexSize;
466 u32 _indexCount;
467 u32 _triangleCount;
468 u32 _triangleseElmentCount;
469 u32 _jointElementOffset;
470 void* _pIndexBuffer;
471 RENDER_INDEX_TYPE _indexBufferElementType;
472 GxVertexCache _vertexCache;
474 u8 _elementIndex[RENDER_VERTEX_ELEMENT_COUNT + 1];
475 u8 _elementCount;
476 GxVertexCache _jointIndexCache;
477 GxIntermediateWeight* _pIntermediateWeight;
478
480};
481
482#endif // GX_DEVELOP
483
484GX_CORE_NAMESPACE_END()
485#endif //_WINDOWS
#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 GxArray.h:18
オブジェクト基底クラス
Definition GxBase.h:88
基底クラス
Definition GxBase.h:51
static constexpr u32 VALUE_256
256
Definition GxMath.h:127
モデルリソースクラス
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
4×4行列(行優先)
Definition GxMatrix.h:607
頂点宣言に使用する、頂点要素を定義するための構造体
Definition GxRenderVertexDeclaration.h:125
32bit[0, 1]正規化小数4次元ベクトル(8:8:8:8)
Definition GxStruct.h:583
32bitブーリアン
Definition GxDefine.h:173