OROCHI
 
Loading...
Searching...
No Matches
GxGmlReader.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12#if GX_DEVELOP
13
14GX_UTILITY_NAMESPACE_BEGIN()
15
16// GMLファイル読み込み解析通知基底クラス宣言
17class GxGmlReaderNotifierBase;
18
19//===========================================================================
21//===========================================================================
22class GxGmlReader : public GxXmlReader
23{
24 //-----------------------------------------------------------
26 //-----------------------------------------------------------
28public:
29 // RTTI定義
30 GX_RTTI_CLASS(GxGmlReader, GxXmlReader)
31 // GxClassBase継承クラス用禁止宣言
32 GX_PROHIBIT_CLASS_BASE(GxGmlReader)
33
34
35 enum class DATA_TYPE
36 {
37 BLDG,
38 BRID,
39 DEM,
40 TRAN,
41 VEG,
42 FRN,
43 MAX,
44 };
46 static const GX_CSTR DATA_TYPE_TEXTS[static_cast<u32>(DATA_TYPE::MAX)];
47
48protected:
49 // protected定数定義
50 static GX_CCHAR GML_DATA_DELIMITER = ' ';
51
53 struct MaterialTable
54 {
55 GX_CSTR _pSymbol;
56 u32 _materialId;
57 };
58
59public:
61 struct GxGmlCommonAsset
62 {
63 //-----------------------------------------------------------
65 //-----------------------------------------------------------
67
69 GxGmlCommonAsset(void) {}
70
72 //-----------------------------------------------------------
74 //-----------------------------------------------------------
76
78 GX_FORCE_INLINE GxVector3d getCenter(void) const { return (_lowerCorner + _upperCorner) / 2; }
80 GxVector3d getLowerCornerMeter(void) const;
82 GxVector3d getUpperCornerMeter(void) const;
83
85 //-----------------------------------------------------------
87 //-----------------------------------------------------------
89 public:
90 GxVector3d _lowerCorner;
91 GxVector3d _upperCorner;
92
94 };
95
97 struct GxGmlTexture
98 {
99 //-----------------------------------------------------------
101 //-----------------------------------------------------------
103 public:
104 // new, delete定義
105 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
106
108 //-----------------------------------------------------------
110 //-----------------------------------------------------------
112 public:
114 GxGmlTexture(void) : _pFilePath(nullptr) {}
115
117 //-----------------------------------------------------------
119 //-----------------------------------------------------------
121 public:
122 GX_CSTR _pFilePath;
123
125 };
126
128 struct GxGmlParts
129 {
130 //-----------------------------------------------------------
132 //-----------------------------------------------------------
134 public:
135 // new, delete定義
136 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
137
139 //-----------------------------------------------------------
141 //-----------------------------------------------------------
143 public:
145 GxGmlParts(void)
146 : _pName(nullptr)
147 , _shapeId(GX_INVALID_HANDLE)
148 , _partsId(0xFFFF)
149 , _lodMask(0xFFFF)
150 {}
151
153 //-----------------------------------------------------------
155 //-----------------------------------------------------------
157 public:
158 GX_CSTR _pName;
159 u32 _shapeId;
160 u16 _partsId;
161 u16 _lodMask;
162
164 };
165
167 struct GxGmlTriangleElement
168 {
169 //-----------------------------------------------------------
171 //-----------------------------------------------------------
173 public:
174 // new, delete定義
175 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
176
177 public:
179 enum class VERTICES_ELEMENT
180 {
181 POSITION = 0,
182 NORMAL,
183 COLOR,
184 TEXCOORD,
185 TEXTANGENT,
186 TEXBINORMAL,
187
188 MAX
189 };
190
192 //-----------------------------------------------------------
194 //-----------------------------------------------------------
196 public:
198 GxGmlTriangleElement(void)
199 : _pName(nullptr)
200 , _type(VERTICES_ELEMENT::POSITION)
201 , _offset(0)
202 , _set(0)
203 , _index(0)
204 , _padding(0)
205 {}
206
208 //-----------------------------------------------------------
210 //-----------------------------------------------------------
212 public:
213 GX_CSTR _pName;
214 VERTICES_ELEMENT _type;
215 u8 _offset;
216 u8 _set;
217 u8 _index;
218 u8 _padding;
219
221 };
222
224 struct GxGmlTriangles
225 {
226 //-----------------------------------------------------------
228 //-----------------------------------------------------------
230 public:
231 // new, delete定義
232 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
233
235 //-----------------------------------------------------------
237 //-----------------------------------------------------------
239 public:
241 GxGmlTriangles(void)
242 : _materialId(0)
243 , _triangleCount(0)
244 , _pTriangleElementArray(nullptr)
245 , _triangleElementCount(0)
246 , _pPrimitiveArray(nullptr)
247 , _primitiveCount(0)
248 , _primitiveOneSize(0)
249 , _kind(GxResModelGmlMeta::GxMultiSurface::KIND::INVALID)
250 {
251 }
253 ~GxGmlTriangles(void)
254 {
255 GX_SAFE_DELETE_ARRAY(_pTriangleElementArray);
256 GX_SAFE_FREE_MEMORY(_pPrimitiveArray);
257 }
258
260 //-----------------------------------------------------------
262 //-----------------------------------------------------------
264
266 s32 getTriangleElementIndex(GX_CSTR elementName) const
267 {
268 for( u32 i=0; i < _triangleElementCount; ++i )
269 {
270 if( (_pTriangleElementArray[i]._pName != nullptr) && (GX_STRCMP(_pTriangleElementArray[i]._pName, elementName) == 0) )
271 {
272 return i;
273 }
274 }
275 return -1;
276 }
278 s32 getTriangleElementIndex(GxGmlTriangleElement::VERTICES_ELEMENT elementType) const
279 {
280 for( u32 i=0; i < _triangleElementCount; ++i )
281 {
282 if( _pTriangleElementArray[i]._type == elementType )
283 {
284 return i;
285 }
286 }
287 return -1;
288 }
290 const GxGmlTriangleElement* getTriangleElement(GX_CSTR elementName) const
291 {
292 s32 index = getTriangleElementIndex(elementName);
293 if( index < 0 )
294 {
295 return nullptr;
296 }
297 else
298 {
299 return &_pTriangleElementArray[index];
300 }
301 }
303 const GxGmlTriangleElement* getTriangleElement(GxGmlTriangleElement::VERTICES_ELEMENT elementType) const
304 {
305 s32 index = getTriangleElementIndex(elementType);
306 if( index < 0 )
307 {
308 return nullptr;
309 }
310 else
311 {
312 return &_pTriangleElementArray[index];
313 }
314 }
315
317 //-----------------------------------------------------------
319 //-----------------------------------------------------------
321 public:
322 u32 _materialId;
323 u32 _triangleCount;
324 GxGmlTriangleElement* _pTriangleElementArray;
325 u32 _triangleElementCount;
326 u32* _pPrimitiveArray;
327 u32 _primitiveCount;
328 u32 _primitiveOneSize;
329
331
333 };
334
336 struct GxGmlColor
337 {
338 //-----------------------------------------------------------
340 //-----------------------------------------------------------
342 public:
343 // new, delete定義
344 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
345
347 //-----------------------------------------------------------
349 //-----------------------------------------------------------
351 public:
353 GxGmlColor(void)
354 : _pValueArray(nullptr)
355 , _valueCount(0)
356 {
357 }
359 ~GxGmlColor(void)
360 {
361 GX_SAFE_FREE_MEMORY(_pValueArray);
362 }
363
365 //-----------------------------------------------------------
367 //-----------------------------------------------------------
369 public:
370 GxColorHDR* _pValueArray;
371 u32 _valueCount;
372
374 };
375
377 struct GxGmlTexcoord
378 {
379 //-----------------------------------------------------------
381 //-----------------------------------------------------------
383 public:
384 // new, delete定義
385 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
386
388 //-----------------------------------------------------------
390 //-----------------------------------------------------------
392 public:
394 GxGmlTexcoord(void)
395 : _pValueArray(nullptr)
396 , _valueCount(0)
397 {
398 }
400 ~GxGmlTexcoord(void){ GX_SAFE_FREE_MEMORY(_pValueArray); }
401
403 //-----------------------------------------------------------
405 //-----------------------------------------------------------
407 public:
408 GxVector2* _pValueArray;
409 u32 _valueCount;
410
412 };
413
415 struct GxGmlTexTangent
416 {
417 //-----------------------------------------------------------
419 //-----------------------------------------------------------
421 public:
422 // new, delete定義
423 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
424
426 //-----------------------------------------------------------
428 //-----------------------------------------------------------
430 public:
432 GxGmlTexTangent(void)
433 : _pValueArray(nullptr)
434 , _valueCount(0)
435 {}
436
438 ~GxGmlTexTangent(void){ GX_SAFE_FREE_MEMORY(_pValueArray); }
439
441 //-----------------------------------------------------------
443 //-----------------------------------------------------------
445 public:
446 GxVector3* _pValueArray;
447 u32 _valueCount;
448
450 };
451
453 struct GxGmlTexBinormal
454 {
455 //-----------------------------------------------------------
457 //-----------------------------------------------------------
459 public:
460 // new, delete定義
461 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
462
464 //-----------------------------------------------------------
466 //-----------------------------------------------------------
468 public:
470 GxGmlTexBinormal(void)
471 : _pValueArray(nullptr)
472 , _valueCount(0)
473 {}
475 ~GxGmlTexBinormal(void){ GX_SAFE_FREE_MEMORY(_pValueArray); }
476
478 //-----------------------------------------------------------
480 //-----------------------------------------------------------
482 public:
483 GxVector3* _pValueArray;
484 u32 _valueCount;
485
487 };
488
490 struct GxGmlGeometry
491 {
492 //-----------------------------------------------------------
494 //-----------------------------------------------------------
496 public:
497 // new, delete定義
498 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
499
501 //-----------------------------------------------------------
503 //-----------------------------------------------------------
505 public:
507 GxGmlGeometry(void)
508 : _pTrianglesArray(nullptr)
509 , _trianglesCount(0)
510 , _pPositionArray(nullptr)
511 , _positionCount(0)
512 , _pNormalArray(nullptr)
513 , _normalCount(0)
514 , _pColorArray(nullptr)
515 , _colorCount(0)
516 , _pTexcoordArray(nullptr)
517 , _texcoordCount(0)
518 , _pTexTangentArray(nullptr)
519 , _texTangentCount(0)
520 , _pTexBinormalArray(nullptr)
521 , _texBinormalCount(0)
522 , _kind(GxResModelGmlMeta::GxCityObject::KIND::INVALID)
523 {}
524
526 ~GxGmlGeometry(void)
527 {
528 GX_SAFE_DELETE_ARRAY(_pTrianglesArray);
529 GX_SAFE_FREE_MEMORY(_pPositionArray);
530 GX_SAFE_FREE_MEMORY(_pNormalArray);
531 GX_SAFE_DELETE_ARRAY(_pColorArray);
532 GX_SAFE_DELETE_ARRAY(_pTexcoordArray);
533 GX_SAFE_DELETE_ARRAY(_pTexTangentArray);
534 GX_SAFE_DELETE_ARRAY(_pTexBinormalArray);
535 }
536
538 //-----------------------------------------------------------
540 //-----------------------------------------------------------
542
544 const GxGmlTriangleElement* getTriangleElement(GX_CSTR elementName) const
545 {
546 for( u32 i = 0; i < _trianglesCount; ++i )
547 {
548 const auto* pGmlTriangleElement = _pTrianglesArray[i].getTriangleElement(elementName);
549 if( pGmlTriangleElement )
550 {
551 return pGmlTriangleElement;
552 }
553 }
554 return nullptr;
555 }
556
558 //-----------------------------------------------------------
560 //-----------------------------------------------------------
562 public:
563 GxGmlTriangles* _pTrianglesArray;
564 u32 _trianglesCount;
565 GxVector3* _pPositionArray;
566 u32 _positionCount;
567 GxVector3* _pNormalArray;
568 u32 _normalCount;
569 GxGmlColor* _pColorArray;
570 u8 _colorCount;
571 GxGmlTexcoord* _pTexcoordArray;
572 u8 _texcoordCount;
573 GxGmlTexTangent* _pTexTangentArray;
574 u8 _texTangentCount;
575 GxGmlTexBinormal* _pTexBinormalArray;
576 u8 _texBinormalCount;
577
578 GxString _name;
580
582 };
583
585 struct GxGmlMaterialParameter
586 {
587 //-----------------------------------------------------------
589 //-----------------------------------------------------------
591 public:
592 // new, delete定義
593 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
594
596 enum class PARAMETER_TYPE
597 {
598 UNKNOWN = -1,
599 BOOL = 0,
600 INT,
601 FLOAT,
602 FLOAT2,
603 FLOAT3,
604 FLOAT4,
605 FLOAT4x4,
606 SAMPLER_2D,
607 SAMPLER_CUBE,
608 SURFACE
609 };
610
612 enum class FILTER_TYPE
613 {
614 UNKNOWN = -1,
615 POINT = 0,
616 LINEAR
617 };
618
620 struct Sampler
621 {
622 //-----------------------------------------------------------
624 //-----------------------------------------------------------
626 public:
628 Sampler(void)
629 : _pSurfaceName(nullptr)
630 , _minFilter(FILTER_TYPE::UNKNOWN)
631 , _magFilter(FILTER_TYPE::UNKNOWN)
632 {}
633
635 //-----------------------------------------------------------
637 //-----------------------------------------------------------
639 public:
640 GX_CSTR _pSurfaceName;
641 FILTER_TYPE _minFilter;
642 FILTER_TYPE _magFilter;
643
645 };
646
648 //-----------------------------------------------------------
650 //-----------------------------------------------------------
652 public:
654 GxGmlMaterialParameter(void)
655 : _pRef(nullptr)
656 , _type(PARAMETER_TYPE::UNKNOWN)
657 , _int(0)
658 , _float(0.f)
659 {}
660
662 ~GxGmlMaterialParameter(void){}
663
665 //-----------------------------------------------------------
667 //-----------------------------------------------------------
669 public:
670 GX_CSTR _pRef;
671 PARAMETER_TYPE _type;
672 b32 _bool;
673 u32 _int;
674 f32 _float;
675 GxVector2 _float2;
676 GxVector3 _float3;
677 GxVector4 _float4;
678 GxMatrix44 _float4x4;
679 Sampler _sampler;
680
682 };
683
685 struct GxGmlMaterialExtra
686 {
687 //-----------------------------------------------------------
689 //-----------------------------------------------------------
691 public:
692 // new, delete定義
693 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
694
696 //-----------------------------------------------------------
698 //-----------------------------------------------------------
700 public:
702 GxGmlMaterialExtra(void)
703 : _hitFlag(0)
704 , _hitMaterial(0)
705 {}
707 ~GxGmlMaterialExtra(void){}
708
710 //-----------------------------------------------------------
712 //-----------------------------------------------------------
714 public:
715 u32 _hitFlag;
716 s32 _hitMaterial;
717
719 };
720
722 struct GxGmlMaterial
723 {
724 //-----------------------------------------------------------
726 //-----------------------------------------------------------
728 public:
729 // new, delete定義
730 GX_OPERATOR_NEW_DELETE_USE_ARRAY(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP);
731
733 //-----------------------------------------------------------
735 //-----------------------------------------------------------
737 public:
739 GxGmlMaterial(void)
740 : _pTechniqueHintArray(nullptr)
741 , _techniqueHintCount(0)
742 , _pSetParameterArray(nullptr)
743 , _setParameterCount(0)
744 , _pExtraData(nullptr)
745 {}
746
748 ~GxGmlMaterial(void)
749 {
750 GX_SAFE_FREE_MEMORY(_pTechniqueHintArray);
751 GX_SAFE_DELETE_ARRAY(_pSetParameterArray);
752 GX_SAFE_DELETE(_pExtraData);
753 }
754
756 //-----------------------------------------------------------
758 //-----------------------------------------------------------
760 public:
761 GX_CSTR* _pTechniqueHintArray;
762 u32 _techniqueHintCount;
763 GxGmlMaterialParameter* _pSetParameterArray;
764 u32 _setParameterCount;
765 GxGmlMaterialExtra* _pExtraData;
766
768 };
769
771 //-----------------------------------------------------------
773 //-----------------------------------------------------------
775public:
777 GxGmlReader(void);
779 ~GxGmlReader(void) override;
780
782 b32 initialize(GxStream& stream, GxGmlReaderNotifierBase* pNotifier = nullptr);
784 void terminate(void);
785
787 //-----------------------------------------------------------
789 //-----------------------------------------------------------
791public:
793 b32 read(void);
794
795protected:
797 virtual b32 analyseGml(const GxXmlParser* pXmlParser);
799 virtual b32 analyseCustom(const GxXmlParser* pXmlParser);
800
802 virtual b32 analyseCommonAsset(const GxXmlParser::GxNode* pNode);
804 b32 analyseDataType(const GxXmlParser::GxNode* pNode);
806 virtual b32 analyseLibraryMaterials(const GxXmlParser::GxNode* pNode);
808 virtual b32 analyseLibraryGeometories(const GxXmlParser::GxNode* pNode);
810 virtual b32 analyseLibraryVisualScenesParts(const GxXmlParser::GxNode* pNode);
811
813 virtual b32 analyseLibraryGeometrySubRoutineMesh(GxGmlGeometry* pGmlGeometry, const GxXmlParser::GxNode* pNodeMesh);
814
816 //-----------------------------------------------------------
818 //-----------------------------------------------------------
820public:
822 GX_FORCE_INLINE const GxGmlCommonAsset* getCommonAsset(void) const { return &_commonData; };
823
825 constexpr GxGmlTexture* getTextureArray(void) const { return _pTextureData; }
827 constexpr u32 getTextureCount(void) const { return _textureCount; }
828
830 constexpr GxGmlMaterial* getMaterialArray(void) const { return _pMaterialData; }
832 constexpr u32 getMaterialCount(void) const { return _materialCount; }
834 constexpr GX_CSTR getMaterialName(u32 id) const { return _pMaterialTable ? _pMaterialTable[id] : nullptr; }
836 constexpr GX_CSTR getMaterialName(const GxGmlTriangles& triangles) const { return getMaterialName(triangles._materialId); }
837
839 constexpr GxGmlGeometry* getGeometryArray(void) const { return _pGeometryData; }
841 constexpr u32 getGeometryCount(void) const { return _geometryCount; }
842
844 constexpr GxGmlParts* getPartsArray(void) const { return _pPartsData; }
846 constexpr u32 getPartsCount(void) const { return _partsCount; }
847
848protected:
850 u32 getShapeId(GX_CSTR shapeName) const;
851
853 //-----------------------------------------------------------
855 //-----------------------------------------------------------
857protected:
858 GxXmlParser* _pXmlParser;
859 GxGmlReaderNotifierBase* _pNotifier;
860
861 DATA_TYPE _dataType;
862 GX_CSTR* _pTextureTable;
863 GX_CSTR* _pMaterialTable;
864 GX_CSTR* _pMaterialSymbolTable;
865 GX_CSTR* _pMaterialInsEffectTable;
866 GX_CSTR* _pEffectTable;
867 GX_CSTR* _pShapeTable;
868
869 GxGmlCommonAsset _commonData;
870 GxGmlTexture* _pTextureData;
871 GxGmlMaterial* _pMaterialData;
872 GxGmlGeometry* _pGeometryData;
873 GxGmlParts* _pPartsData;
874
875 u32 _textureCount;
876 u32 _materialCount;
877 u32 _effectCount;
878 u32 _geometryCount;
879 u32 _partsCount;
880
882};
883
884//===========================================================================
886//===========================================================================
887class GxGmlReaderNotifierBase
888{
889 //-----------------------------------------------------------
891 //-----------------------------------------------------------
893public:
894 // new, delete定義
895 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::DEVELOP)
896
897public:
899 struct GxGmlCommonAssetCallback
900 {
901 GxGmlReader::GxGmlCommonAsset _commonAsset;
902 };
903
905 struct GxGmlTextureCallback
906 {
907 GxGmlReader::GxGmlTexture* _pTextureArray;
908 u32 _textureCount;
909 };
910
912 struct GxGmlGeometryCallback
913 {
914 GxGmlReader::GxGmlGeometry* _pGeometryArray;
915 u32 _geometryCount;
916 };
917
919 struct GxGmlPartsCallback
920 {
921 GxGmlReader::GxGmlParts* _pPartsArray;
922 u32 _partsCount;
923 u32 _normalPartsCount;
924 };
925
927 //-----------------------------------------------------------
929 //-----------------------------------------------------------
931
932public:
934 GxGmlReaderNotifierBase(void){}
936 virtual ~GxGmlReaderNotifierBase(void){}
937
939 //-----------------------------------------------------------
941 //-----------------------------------------------------------
943public:
945 virtual void onGmlCommonAsset(const GxGmlCommonAssetCallback& /*value*/){}
947 virtual void onGmlTexture(const GxGmlTextureCallback& /*value*/){}
949 virtual void onGmlGeometry(const GxGmlGeometryCallback& /*value*/){}
951 virtual void onGmlParts(const GxGmlPartsCallback& /*value*/){}
952
953 // GML解析結果TTY出力処理 (デバッグ用)
955 static void printGmlCommonAsset(const GxGmlCommonAssetCallback& value);
957 static void printGmlTexture(const GxGmlTextureCallback& value);
959 static void printGmlGeometry(const GxGmlGeometryCallback& value);
961 static void printGmlParts(const GxGmlPartsCallback& value);
962
964};
965
966GX_UTILITY_NAMESPACE_END()
967
968#endif // GX_DEVELOP
#define GX_SAFE_FREE_MEMORY(pAddress)
Definition GxAllocator.h:594
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
@ MAX
定義数
@ LINEAR
線形補間
@ INVALID
無効なビュー
@ POINT
点で描画する
@ NORMAL
法線(VS入力,VS→PS)
@ POSITION
位置データ(VS入力,VS出力)
@ COLOR
4D パック済み 正規化される u8(GxColor形式)
@ FLOAT3
3D f32 (f, f, f, 1) に展開される
@ FLOAT2
2D f32 (f, f, 0, 1) に展開される
@ FLOAT4
4D f32 (f, f, f, f) に展開される
@ UNKNOWN
未定義
#define GX_STRCMP(__STRING0__, __STRING1__)
文字列比較
Definition GxString.h:616
KIND
種別
Definition GxResModelGmlMeta.h:83
KIND
種別
Definition GxResModelGmlMeta.h:38
モデルGMLメタデータリソース
Definition GxResModelGmlMeta.h:17
ストリーム基礎クラス
Definition GxStream.h:20
色(HDR)
Definition GxColor.h:241
4×4行列(行優先)
Definition GxMatrix.h:607
文字列型クラス
Definition GxString.h:18
2次元ベクトル
Definition GxVector.h:34
3次元ベクトル
Definition GxVector.h:245
3次元ベクトル(倍精度)
Definition GxVectord.h:235
4次元ベクトル
Definition GxVector.h:582
32bitブーリアン
Definition GxDefine.h:173