OROCHI
 
Loading...
Searching...
No Matches
GxResModelGml.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_UTILITY_NAMESPACE_BEGIN()
13
14#if GX_DEVELOP
15//===========================================================================
17//===========================================================================
18class GxResModelGml : public GxResModel
19{
20 //-----------------------------------------------------------
22 //-----------------------------------------------------------
24public:
25 GX_RTTI_RESOURCE(GxResModelGml, GxResModel)
26 // ClassBaseReference継承クラス用禁止宣言
28
29private:
30 class GmlReaderNotifier;
31 friend class GmlReaderNotifier;
32
33public:
34 class GxVertexCache;
35 class GxIntermediateMesh;
36
38 //-----------------------------------------------------------
40 //-----------------------------------------------------------
42public:
44 GxResModelGml(void);
45
47 //-----------------------------------------------------------
49 //-----------------------------------------------------------
51public:
53 b32 load(GxStream& stream, u32 dataSize);
54#if GX_DEVELOP
56 GX_FORCE_INLINE b32 save(GxStream& /*stream*/) { return false; }
57#endif // GX_DEVELOP
58
59protected:
61 b32 loadMeshAll(const GxGmlReader& reader);
63 b32 loadMesh(GxIntermediateMesh* pIntermediateMesh);
65 b32 countMeshGroup(void);
67 void loadGeometry(const GxGmlReader& reader);
69 void optimizeVertexCache(void);
70
72 //-----------------------------------------------------------
74 //-----------------------------------------------------------
76protected:
78 const GxGmlReader::GxGmlParts* getGmlPartsByGeometryIndex(const GxGmlReader& reader, u32 geometryIndex);
80 b32 isUseHalfTexCoord(void) const;
82 b32 isUseHalfNormal(void) const;
84 b32 isUseHalfBinormal(void) const;
86 b32 isUseHalfTangent(void) const;
87
89 //-----------------------------------------------------------
91 //-----------------------------------------------------------
93protected:
94 f32 _modelScale;
95 GxIntermediateMesh* _pIntermediateMesh;
96 GX_CHAR* _pStringTableWritePoint;
97 GxResModelGmlMeta* _pResModelGmlMeta;
98
100};
101
102//===========================================================================
104//===========================================================================
105class GxResModelGml::GmlReaderNotifier : public GxGmlReaderNotifierBase
106{
107 //-----------------------------------------------------------
109 //-----------------------------------------------------------
111public:
113 GmlReaderNotifier(GxResModelGml* pResModelGml);
115 ~GmlReaderNotifier(void) override {}
116private:
118 GmlReaderNotifier(void) {}
119
121 //-----------------------------------------------------------
123 //-----------------------------------------------------------
125public:
127 void onGmlCommonAsset(const GxGmlCommonAssetCallback& value) override;
129 void onGmlGeometry(const GxGmlGeometryCallback& value) override;
131 void onGmlParts(const GxGmlPartsCallback& value) override;
132
133protected:
135 s32 findGmlElement(GxGmlReader::GxGmlTriangles* pTriangles, GxGmlReader::GxGmlTriangleElement::VERTICES_ELEMENT verticesElement, u32 set);
136
138 //-----------------------------------------------------------
140 //-----------------------------------------------------------
142
143 GxResModelGml* _pResModelGml;
144
146};
147
148//===========================================================================
150//===========================================================================
151class GxResModelGml::GxVertexCache
152{
153 //-----------------------------------------------------------
155 //-----------------------------------------------------------
157public:
158 class GxVertexTable;
159
161 //-----------------------------------------------------------
163 //-----------------------------------------------------------
165
167 GxVertexCache(void);
169 virtual ~GxVertexCache(void);
170
172 void initialize(u32 vertexSize, u32 maxVertexCount);
173
175 void terminateWriting(void);
176
178 //-----------------------------------------------------------
180 //-----------------------------------------------------------
182public:
184 u32 push(void* pVertex, b32 checkArgument = true);
186 constexpr u32 getSize(void) const { return _writeIndex * _vertexSize; }
188 constexpr u32 getVertexCount(void) const { return _writeIndex; }
190 constexpr u32 getVertexSize(void) const { return _vertexSize; }
192 constexpr void* getBuffer(void) const { return _pBuffer; }
194 constexpr u32 getMaxVertexCount(void) const { return _maxVertexCount; }
195
197 //-----------------------------------------------------------
199 //-----------------------------------------------------------
201private:
202 u32 _vertexSize;
203 u32 _bufferSize;
204 u32 _writeIndex;
205 u32 _maxVertexCount;
206 void* _pBuffer;
207 GxVertexTable* _pVertexTable;
208
210};
211
212//===========================================================================
214//===========================================================================
215class GxResModelGml::GxVertexCache::GxVertexTable
216{
217 //-----------------------------------------------------------
219 //-----------------------------------------------------------
221
222 // 頂点の追加の際にメモリ確保を行いたくないため、
223 // 要素追加の度にNEW GxPairの走るGxHashMapを使用せず専用のHashTableを構築して使用する。
224public:
226 class GxVertexTableNode : public GxClassBase
227 {
228 //-----------------------------------------------------------
230 //-----------------------------------------------------------
232 public:
233 // RTTI定義
234 GX_RTTI_RESOURCE(GxVertexTableNode, GxClassBase)
235 // ClassBaseReference継承クラス用禁止宣言
236 GX_PROHIBIT_CLASS_BASE_REFERENCE(GxVertexTableNode)
237
238
239 //-----------------------------------------------------------
241 //-----------------------------------------------------------
243
245 GxVertexTableNode(void) :_pVertex(nullptr), _index(0), _pNext(nullptr) {}
246
248 //-----------------------------------------------------------
250 //-----------------------------------------------------------
252
254 void setData(void* pVertex, u32 index, GxVertexTableNode* pNext);
256 void add(GxVertexTableNode* pNode);
258 constexpr void* getVertexPointer(void) { return _pVertex; }
260 constexpr u32 getIndex(void) { return _index; }
262 constexpr GxVertexTableNode* getNextNode(void) { return _pNext; }
263
265 //-----------------------------------------------------------
267 //-----------------------------------------------------------
269 private:
270 void* _pVertex;
271 u32 _index;
272 GxVertexTableNode* _pNext;
273
275 };
276
278 class GxVertexArray : public GxArrayClassBase
279 {
280 //-----------------------------------------------------------
282 //-----------------------------------------------------------
284 protected:
286 GX_FORCE_INLINE GxClassBaseRoot** allocateMemory(u32 size) override { return static_cast<GxClassBaseRoot**>(GX_ALLOCATE_MEMORY(getGxAllocatorList(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP), size)); }
287
289 };
290public:
291 // new, delete定義
292 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
293
294
295 //-----------------------------------------------------------
297 //-----------------------------------------------------------
299public:
301 GxVertexTable(u32 maxVertexCount);
303 ~GxVertexTable(void);
304
306 //-----------------------------------------------------------
308 //-----------------------------------------------------------
310
312 void insert(void* pVertex, u32 byteSize, u32 index);
314 s64 find(void* pVertex, u32 byteSize);
315
317 //-----------------------------------------------------------
319 //-----------------------------------------------------------
321private:
322 u32 _maxVertexCount;
323 GxVertexArray _hashArray;
324 u32 _splitCount;
325 GxVertexTableNode* _pNodeBuffer;
326 GxVertexTableNode* _pFreeNext;
327 GxVertexTableNode* _pEndOfBuffer;
328
330};
331
332//===========================================================================
334//===========================================================================
335class GxResModelGml::GxIntermediateMesh
336{
337 //-----------------------------------------------------------
339 //-----------------------------------------------------------
341public:
342 // new, delete定義
343 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
344
345
346 //-----------------------------------------------------------
348 //-----------------------------------------------------------
350
352 GxIntermediateMesh(void);
354 virtual ~GxIntermediateMesh(void);
355
357 //-----------------------------------------------------------
359 //-----------------------------------------------------------
361
362 u32 _geometryIndex;
363 u32 _groupIndex;
364 u32 _materialId;
365 u32 _vertexSize;
366 u32 _indexCount;
367 u32 _triangleseElmentCount;
368 void* _pIndexBuffer;
369 RENDER_INDEX_TYPE _indexBufferElementType;
370 const GxGmlReader::GxGmlGeometry* _pGmlGeometry;
371 const GxGmlReader::GxGmlTriangles* _pGmlTriangles;
372 GxVertexCache _vertexCache;
374 u8 _gmlElementIndex[RENDER_VERTEX_ELEMENT_COUNT];
375
377};
378
379#endif // GX_DEVELOP
380
381GX_UTILITY_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
モデルGMLメタデータリソース
Definition GxResModelGmlMeta.h:17
モデルリソースクラス
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