OROCHI
 
Loading...
Searching...
No Matches
GxRtti.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_CORE_NAMESPACE_BEGIN()
13class GxProperty;
14class GxPropertyTable;
15class GxFunction;
16
17#if GX_DEVELOP
18class GxGuiBase;
19//===========================================================================
21//===========================================================================
22class GxIdCheckTree
23{
24 //---------------------------------------------------------------------------
26 //---------------------------------------------------------------------------
28public:
29 //===========================================================================
31 //===========================================================================
32 class GxNode
33 {
34 //---------------------------------------------------------------------------
36 //---------------------------------------------------------------------------
38 public:
40 GxNode(void) : _className(nullptr), _virtualName(nullptr), _pSmall(nullptr), _pLarge(nullptr){}
42 virtual ~GxNode(void){}
44 void initialize(void);
45
46 private:
48 GxNode(const GxNode&);
50 GX_FORCE_INLINE const GxNode& operator = (const GxNode&);
51
53 //---------------------------------------------------------------------------
55 //---------------------------------------------------------------------------
57 public:
59 constexpr u32 getId(void) const { return _id; }
61 constexpr void setId(u32 id){ _id = id; }
63 constexpr GX_CSTR getClassName(void) const { return _className; }
65 constexpr void setClassName(GX_CSTR name){ _className = name; }
67 constexpr GX_CSTR getVirtualName(void) const { return _virtualName; }
69 constexpr void setVirtualName(GX_CSTR name){ _virtualName = name; }
71 constexpr GxNode* getSmall(void) const { return _pSmall; }
73 constexpr void setSmall(GxNode* pSmall){ _pSmall = pSmall; }
75 constexpr GxNode* getLarge(void) const { return _pLarge; }
77 constexpr void setLarge(GxNode* pLarge){ _pLarge = pLarge; }
78
80 //---------------------------------------------------------------------------
82 //---------------------------------------------------------------------------
84 private:
85 u32 _id;
86 GX_CSTR _className;
87 GX_CSTR _virtualName;
88 GxNode* _pSmall;
89 GxNode* _pLarge;
90
92 };
93
95 static constexpr u32 NODE_MAX = 8192;
96
98 //---------------------------------------------------------------------------
100 //---------------------------------------------------------------------------
102
104 GxIdCheckTree(void) : _count(0){}
106 ~GxIdCheckTree(void){}
108 void initialize(void);
109
110private:
111 // コピーコンストラクタ
112 GxIdCheckTree(const GxIdCheckTree&);
113 // 代入演算子
114 GX_FORCE_INLINE const GxIdCheckTree& operator = (const GxIdCheckTree&);
115
117 //---------------------------------------------------------------------------
119 //---------------------------------------------------------------------------
121public:
123 constexpr u32 getCount(void) const { return _count; }
125 GX_FORCE_INLINE GxNode* getNode(u32 index) { return index < _count ? &_node[index] : nullptr; }
126
128 //---------------------------------------------------------------------------
130 //---------------------------------------------------------------------------
132
134 void add(u32 id, GX_CSTR className, GX_CSTR virtualName);
135
137 //---------------------------------------------------------------------------
139 //---------------------------------------------------------------------------
141private:
142 GxNode _node[NODE_MAX];
143 u32 _count;
144
146};
147#endif
148
149class GxArray;
150//===========================================================================
152//===========================================================================
154{
155 //---------------------------------------------------------------------------
157 //---------------------------------------------------------------------------
159public:
161 static constexpr u32 DEFAULT_ID = 0xffffffffL;
162 // インスタンスを生成する関数の定義
163#if GX_DEBUG_NEW
164 typedef void* (*CREATE_INSTANCE_FUNCTION)(GX_CSTR filename, u32 line);
165#else
166 typedef void* (*CREATE_INSTANCE_FUNCTION)(void);
167#endif
168 // GUIを作成する関数の定義
169#if GX_DEVELOP
170 typedef GxGuiBase* (*CREATE_GUI_FUNCTION)(GxProperty& property, GxTypedObject* pObject, const GxRtti& rtti, u32 index);
171#else
172 typedef void (*CREATE_GUI_FUNCTION)(void);
173#endif //GX_DEVELOP
174 // プロパティを取得する関数の定義
175 typedef GxProperty* (*GET_PROPERTIES_FUNCTION)(void);
176 // プロパティ数を取得する関数の定義
177 typedef u32 (*GET_PROPERTY_NUM_FUNCTION)(void);
178 // 関数型を取得する関数の定義
179 typedef GxFunction* (*GET_FUNCTIONS_FUNCTION)(void);
180 // 関数型の数を取得する関数の定義
181 typedef u32(*GET_FUNCTION_NUM_FUNCTION)(void);
182
185 {
188 ATTRIBUTE_HIDE = (1 << 1),
189 ATTRIBUTE_STRUCT = (1 << 2),
190 ATTRIBUTE_ALL = 0xFFFFFFFF,
191 };
192
194 enum class TYPE
195 {
196 NORMAL,
197 RESOURCE,
198 };
199
201 enum class ICON_TYPE
202 {
203 INVALID = -1,
204 CORE = 0,
205 SHADER,
206 FILTER,
207 EFFECT,
208 MOTION,
209 PHYSICS,
210 HUD,
211 DUMMY_1,
212 CHARACTER,
213 UTILITY,
214 P2P,
215 NETWORK,
216 MOVIE,
217 SOUND,
219 UNIT_ENEMY,
220 UNIT_NPC,
221 UNIT_LIGHT,
223 UNIT_SOUND,
224 UNIT_MOVIE,
227 WINDOW,
228 OROCHI,
231 WARNING,
232 ERROR_,
238 FOLDER,
240 FOLDER_ADD,
244 VISIBLE_ON,
246 SEARCH,
247 SEARCH_WEB,
250 SAVE,
251 SETTINGS,
252 REVERT,
253 RELOAD,
254 PLAY,
255 PAUSE,
256 STOP,
257 RECORD,
258 PLUG_IN,
260 IMAGE,
261 MESH,
262 MATERIAL,
263 LEVEL,
264 SHAPE,
265 TEXT,
266 DUMMY_2,
268 MAX,
269 };
270
272 enum class ICON_TYPE_64
273 {
274 INVALID = -1,
275 UNIT_EFFECT = 0,
276 UNIT_SOUND,
277 UNIT_MOVIE,
279 MOTION,
280 MOVIE,
281 FOLDER,
282 DYMMY_1,
283 IMAGE,
284 MESH,
285 MATERIAL,
286 LEVEL,
287 SHAPE,
288 TEXT,
289 OROCHI,
290 DUMMY_3,
291 MAX,
292 };
293
295 //---------------------------------------------------------------------------
297 //---------------------------------------------------------------------------
299public:
301 GxRtti(void) :
302#if GX_DEVELOP
303 _iconType(ICON_TYPE::INVALID), _name(nullptr),
304#endif //GX_DEVELOP
305 _pParent(nullptr), _pChild(nullptr), _pNext(nullptr), _pCreateInstanceFunction(nullptr),
306#if GX_DEVELOP
307 _pCreateGuiFunction(nullptr),
308#endif //GX_DEVELOP
309 _pGetPropertiesFunction(nullptr), _pGetPropertyNumFunction(nullptr), _pGetFunctionNumFunction(nullptr){}
310
313#if GX_DEVELOP
314 GX_CSTR className, GX_CSTR name, ICON_TYPE iconType,
315#endif //GX_DEVELOP
316 TYPE type, u32 size, u32 id, u32 attribute, GxRtti* pBaseRtti,
317 CREATE_INSTANCE_FUNCTION pCreateInstanceFunction,
318#if GX_DEVELOP
319 CREATE_GUI_FUNCTION pCreateGuiFunction,
320#endif //GX_DEVELOP
321 GET_PROPERTIES_FUNCTION pGetPropertiesFunction,
322 GET_PROPERTY_NUM_FUNCTION pGetPropertyNumFunction,
323 GET_FUNCTIONS_FUNCTION pGetFunctionsFunction,
324 GET_FUNCTION_NUM_FUNCTION pGetFunctionNumFunction);
325
327 GX_FORCE_INLINE b32 operator == (const GxRtti& rtti) const { return _id == rtti._id; }
329 GX_FORCE_INLINE b32 operator != (const GxRtti& rtti) const { return _id != rtti._id; }
330private:
332 GxRtti(const GxRtti&);
334 GX_FORCE_INLINE const GxRtti& operator = (const GxRtti&);
335
337 //---------------------------------------------------------------------------
339 //---------------------------------------------------------------------------
341public:
342#if GX_DEVELOP
344 GX_INLINE GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index = 0) const { return _pCreateGuiFunction(property, pOwner, rtti, index); }
345#endif //GX_DEVELOP
347 u32 createPropertyTable(GxPropertyTable& propertyTable, b32 searchParentFlag = true) const;
349 u32 createDifferencePropertyTable(GxPropertyTable& propertyTable, GxTypedObject* pTargetObject, b32 searchParentFlag = true, const GxTypedObject* pDefaultObject = nullptr);
351 static void copyObject(GxTypedObject* pObjectDst, const GxTypedObject* pObjectSrc, const GxRtti& rtti);
353 const GxRtti* enumerate(const GxRtti* pRootRtti) const;
355#if GX_DEBUG_NEW
356 GX_FORCE_INLINE void* createInstance(GX_CSTR filename, u32 line) const { return _pCreateInstanceFunction(filename, line); }
357#else //GX_DEBUG_NEW
358 GX_FORCE_INLINE void* createInstance(void) const { return _pCreateInstanceFunction(); }
359#endif // !GX_DEBUG_NEW
361 void trace(GxTypedObject* pObject);
363 static void forceUsage(GxRtti& rtti);
364
366 //---------------------------------------------------------------------------
368 //---------------------------------------------------------------------------
370
372 GX_FORCE_INLINE b32 isDerived(const GxRtti& rtti) const { return isDerived(rtti.getId()); }
374 b32 isDerived(u32 id) const;
376 constexpr u32 getId(void) const { return _id; }
378 GX_FORCE_INLINE b32 isId(u32 id) const { return _id == id; }
380 constexpr u32 getAttribute(void) const { return _attribute; }
382 GX_FORCE_INLINE b32 isAttribute(ATTRIBUTE attribute) const { return (_attribute & attribute) != 0; }
384 constexpr GxRtti::TYPE getType(void) const { return _type; }
386 constexpr GxRtti* getParent(void) const { return _pParent; }
388 constexpr GxRtti* getChild(void) const { return _pChild; }
390 constexpr GxRtti* getNext(void) const { return _pNext; }
391#if GX_DEVELOP
393 constexpr GX_CSTR getName(void) const { return _name; }
395 constexpr GX_CSTR getClassName(void) const { return _className; }
397 GX_CSTR getFormalName(void) const;
399 GX_CSTR getFormalClassName(void) const;
401 constexpr ICON_TYPE getIconType(void) const { return _iconType; }
403 ICON_TYPE getIconTypeParentsFollow(void) const;
405 static ICON_TYPE_64 getIconType64(ICON_TYPE type);
406#endif //GX_DEVELOP
407
409 u32 getPropertyCount(void) const;
411 GxProperty* getProperty(u32 id, b32 searchParentFlag = false) const;
413 void getReferenceRttiList(GxArray& list, b32 searchParentFlag = false) const;
415 void getReferencePropertyList(GxArray& list, b32 searchParentFlag = false) const;
417 u32 getFunctionCount(void) const;
419 GxFunction* getFunction(u32 index) const;
421 static const GxRtti* getRtti(u32 id, const GxRtti& root = getRttiRoot());
423 static void getRttiList(GxArray& list, const GxRtti& root = getRttiRoot(), ATTRIBUTE attributeOn = ATTRIBUTE_ALL, ATTRIBUTE attributeOff = ATTRIBUTE_NONE);
425 static GxRtti* getNextRtti(const GxRtti& rttiRoot, const GxRtti& rttiTarget);
427 static GxRtti& getRttiRoot(void);
428#if GX_DEVELOP
430 GxProperty* getProperty(GX_CSTR name, b32 searchParentFlag = false) const;
432 static const GxRtti* getRtti(GX_CSTR name, const GxRtti& root = getRttiRoot());
434 GxFunction* getFunction(GX_CSTR name) const;
435#endif //GX_DEVELOP
437 const GxTypedObject* getDefaultObject(GxTypedObject* pCustomObject = nullptr);
439 constexpr GxTypedObject* getSingletonInstance(void) const { return _pSingletonInstance; }
441 constexpr void setSingletonInstance(GxTypedObject* pSingletonInstance) { _pSingletonInstance = pSingletonInstance; }
443 static void deleteDefaultObjectAll(void);
445 void deleteDefaultObjectSub(void);
446
447private:
449 GxRtti* getRttiSub(u32 id) const;
450#if GX_DEVELOP
452 GxRtti* getRttiSub(GX_CSTR name) const;
454 GX_CSTR getFormalNameSub(GX_CSTR name) const;
455#endif //GX_DEVELOP
456
458 //-------------------------------------------------------------
460 //-------------------------------------------------------------
462public:
463 volatile static GxRtti* _pUsageCall;
464 static GX_CHAR _usageDummy[8];
465
466private:
467 GxRtti::TYPE _type;
468 u32 _size;
469 u32 _id;
470 u32 _attribute;
471#if GX_DEVELOP
472 ICON_TYPE _iconType;
473 static constexpr u32 CLASS_NAME_MAX = 127;
474 GX_CHAR _className[CLASS_NAME_MAX + 1];
475 GX_CSTR _name;
476#endif //GX_DEVELOP
477 GxTypedObject* _pDefaultObject;
478 GxTypedObject* _pSingletonInstance;
479 GxRtti* _pParent;
480 GxRtti* _pChild;
481 GxRtti* _pNext;
482
483 CREATE_INSTANCE_FUNCTION _pCreateInstanceFunction;
484#if GX_DEVELOP
485 CREATE_GUI_FUNCTION _pCreateGuiFunction;
486#endif //GX_DEVELOP
487 GET_PROPERTIES_FUNCTION _pGetPropertiesFunction;
488 GET_PROPERTY_NUM_FUNCTION _pGetPropertyNumFunction;
489 GET_FUNCTIONS_FUNCTION _pGetFunctionsFunction;
490 GET_FUNCTION_NUM_FUNCTION _pGetFunctionNumFunction;
491
493};
494
495// クラスRTTI宣言マクロ
496#if GX_DEVELOP
497#define GX_RTTI_CLASS(__THIS__, __BASE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, #__THIS__, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
498#define GX_RTTI_CLASS_ICON(__THIS__, __BASE__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, #__THIS__, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
499#define GX_RTTI_CLASS_ICON_ATTRIBUTE(__THIS__, __BASE__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, #__THIS__, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE | __ATTRIBUTE__, GX_NEW __THIS__, GX_DELETE this)
500#define GX_RTTI_CLASS_NAME(__THIS__, __BASE__, __NAME__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
501#define GX_RTTI_CLASS_NAME_ICON(__THIS__, __BASE__, __NAME__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
502#define GX_RTTI_CLASS_NAME_ICON_ATTRIBUTE(__THIS__, __BASE__, __NAME__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE | __ATTRIBUTE__, GX_NEW __THIS__, GX_DELETE this)
503#else //GX_DEVELOP
504#define GX_RTTI_CLASS(__THIS__, __BASE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
505#define GX_RTTI_CLASS_ICON(__THIS__, __BASE__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
506#define GX_RTTI_CLASS_ICON_ATTRIBUTE(__THIS__, __BASE__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE | __ATTRIBUTE__, GX_NEW __THIS__, GX_DELETE this)
507#define GX_RTTI_CLASS_NAME(__THIS__, __BASE__, __NAME__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
508#define GX_RTTI_CLASS_NAME_ICON(__THIS__, __BASE__, __NAME__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE, GX_NEW __THIS__, GX_DELETE this)
509#define GX_RTTI_CLASS_NAME_ICON_ATTRIBUTE(__THIS__, __BASE__, __NAME__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, GxRtti::ATTRIBUTE_CREATABLE | __ATTRIBUTE__, GX_NEW __THIS__, GX_DELETE this)
510#endif // !GX_DEVELOP
511
512// 抽象クラスRTTI宣言マクロ
513#if GX_DEVELOP
514#define GX_RTTI_ABSTRACT_CLASS(__THIS__, __BASE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, #__THIS__, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, 0, nullptr, return)
515#define GX_RTTI_ABSTRACT_CLASS_ICON(__THIS__, __BASE__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, #__THIS__, GxRtti::DEFAULT_ID, __ICON_TYPE__, 0, nullptr, return)
516#define GX_RTTI_ABSTRACT_CLASS_ICON_ATTRIBUTE(__THIS__, __BASE__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, #__THIS__, GxRtti::DEFAULT_ID, __ICON_TYPE__, __ATTRIBUTE__, nullptr, return)
517#define GX_RTTI_ABSTRACT_CLASS_NAME(__THIS__, __BASE__, __NAME__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, 0, nullptr, return)
518#define GX_RTTI_ABSTRACT_CLASS_NAME_ICON(__THIS__, __BASE__, __NAME__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, GxRtti::DEFAULT_ID, __ICON_TYPE__, 0, nullptr, return)
519#define GX_RTTI_ABSTRACT_CLASS_NAME_ICON_ATTRIBUTE(__THIS__, __BASE__, __NAME__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, GxRtti::DEFAULT_ID, __ICON_TYPE__, __ATTRIBUTE__, nullptr, return)
520#else //GX_DEVELOP
521#define GX_RTTI_ABSTRACT_CLASS(__THIS__, __BASE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, 0, nullptr, return)
522#define GX_RTTI_ABSTRACT_CLASS_ICON(__THIS__, __BASE__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, 0, nullptr, return)
523#define GX_RTTI_ABSTRACT_CLASS_ICON_ATTRIBUTE(__THIS__, __BASE__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, __ATTRIBUTE__, nullptr, return)
524#define GX_RTTI_ABSTRACT_CLASS_NAME(__THIS__, __BASE__, __NAME__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ICON_TYPE::INVALID, 0, nullptr, return)
525#define GX_RTTI_ABSTRACT_CLASS_NAME_ICON(__THIS__, __BASE__, __NAME__, __ICON_TYPE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, 0, nullptr, return)
526#define GX_RTTI_ABSTRACT_CLASS_NAME_ICON_ATTRIBUTE(__THIS__, __BASE__, __NAME__, __ICON_TYPE__, __ATTRIBUTE__) GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, nullptr, GxRtti::DEFAULT_ID, __ICON_TYPE__, __ATTRIBUTE__, nullptr, return)
527#endif // !GX_DEVELOP
528
529// 言語切り替え用マクロ
530#define GX_RTTI_GET_NAME(__CLASS_NAME__, __VIRTUAL_NAME__) static GX_CSTR __getName(void){ return __VIRTUAL_NAME__; }
531
532#if defined(__clang__) // PS4, NX (see GxRttiResource.h)
533#define GX_RTTI_CPP_PRAGMA_BEGIN() \
534 _Pragma("clang diagnostic push") \
535 _Pragma("clang diagnostic ignored \"-Winconsistent-missing-override\"")
536#define GX_RTTI_CPP_PRAGMA_END() \
537 _Pragma("clang diagnostic pop")
538#else //__clang__
539#define GX_RTTI_CPP_PRAGMA_BEGIN()
540#define GX_RTTI_CPP_PRAGMA_END()
541#endif // !__clang__
542
543// クラスRTTI定義マクロ
544#if GX_DEVELOP
545#define GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, __ID__, __ICON_TYPE__, __ATTRIBUTE__, __CREATE_INSTANCE__, __DESTROY_INSTANCE__) \
546 GX_RTTI_CPP_PRAGMA_BEGIN() \
547 using MyClass = __THIS__; \
548 using Super = __BASE__; \
549 static GxRtti __rtti; \
550 static GxProperty __properties[]; \
551 static GxFunction __functions[]; \
552 static const u32 __defaultId = __ID__; \
553 static const u32 __defaultAttr = __ATTRIBUTE__; \
554 static void usage(void){ GxRtti& rtti = __THIS__::__rtti; GxRtti::forceUsage(rtti); } \
555 GxRtti& getRtti(void) const override { return __THIS__::__rtti; } \
556 void* cast(const GxRtti& rtti){ if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
557 const void* cast(const GxRtti& rtti) const { if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
558 static GxProperty* __getProperties(void){ return __properties; } \
559 static GxFunction* __getFunctions(void){ return __functions; } \
560 static u32 __getPropertyCount(void); \
561 static u32 __getFunctionCount(void); \
562 GX_RTTI_GET_NAME(#__THIS__, __NAME__) \
563 static GxRtti& __getStaticRtti(void){ return __rtti; } \
564 static __THIS__* __createInstance(void){ return __CREATE_INSTANCE__; } \
565 void __destroyInstance(void){ __DESTROY_INSTANCE__; } \
566 virtual void trace(void){ __THIS__::__getStaticRtti().trace(this); } \
567 static GxGuiBase* __createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index = 0){ return MyClass::createGui(property, pOwner, rtti, index); } \
568 static const GxRtti::ICON_TYPE __iconType = __ICON_TYPE__; \
569 GX_RTTI_CPP_PRAGMA_END()
570#else //GX_DEVELOP
571#define GX_RTTI_CLASS_DEFINE(__THIS__, __BASE__, __NAME__, __ID__, __ICON_TYPE__, __ATTRIBUTE__, __CREATE_INSTANCE__, __DESTROY_INSTANCE__) \
572 GX_RTTI_CPP_PRAGMA_BEGIN() \
573 using MyClass = __THIS__; \
574 using Super = __BASE__; \
575 static GxRtti __rtti; \
576 static GxProperty __properties[]; \
577 static GxFunction __functions[]; \
578 static const u32 __defaultId = __ID__; \
579 static const u32 __defaultAttr = __ATTRIBUTE__; \
580 static void usage(void){ GxRtti& rtti = __THIS__::__rtti; GxRtti::forceUsage(rtti); } \
581 GxRtti& getRtti(void) const override { return __THIS__::__rtti; } \
582 void* cast(const GxRtti& rtti){ if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
583 const void* cast(const GxRtti& rtti) const { if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
584 static GxProperty* __getProperties(void){ return __properties; } \
585 static GxFunction* __getFunctions(void){ return __functions; } \
586 static u32 __getPropertyCount(void); \
587 static u32 __getFunctionCount(void); \
588 GX_RTTI_GET_NAME(#__THIS__, __NAME__) \
589 static GxRtti& __getStaticRtti(void){ return __rtti; } \
590 static __THIS__* __createInstance(void){ return __CREATE_INSTANCE__; } \
591 void __destroyInstance(void){ __DESTROY_INSTANCE__; } \
592 virtual void trace(void){ __THIS__::__getStaticRtti().trace(this); } \
593 GX_RTTI_CPP_PRAGMA_END()
594#endif // !GX_DEVELOP
595
596// 構造体RTTI宣言マクロ
597#if GX_DEVELOP
598#define GX_RTTI_STRUCT(__THIS__) GX_RTTI_STRUCT_DEFINE(__THIS__, #__THIS__, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT)
599#define GX_RTTI_STRUCT_ATTRIBUTE(__THIS__, __ATTRIBUTE__) GX_RTTI_STRUCT_DEFINE(__THIS__, #__THIS__, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT | __ATTRIBUTE__)
600#define GX_RTTI_STRUCT_NAME(__THIS__, __NAME__) GX_RTTI_STRUCT_DEFINE(__THIS__, __NAME__, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT)
601#define GX_RTTI_STRUCT_NAME_ATTRIBUTE(__THIS__, __NAME__, __ATTRIBUTE__) GX_RTTI_STRUCT_DEFINE(__THIS__, __NAME__, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT | __ATTRIBUTE__)
602#else //GX_DEVELOP
603#define GX_RTTI_STRUCT(__THIS__) GX_RTTI_STRUCT_DEFINE(__THIS__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT)
604#define GX_RTTI_STRUCT_ATTRIBUTE(__THIS__, __ATTRIBUTE__) GX_RTTI_STRUCT_DEFINE(__THIS__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT | __ATTRIBUTE__)
605#define GX_RTTI_STRUCT_NAME(__THIS__, __NAME__) GX_RTTI_STRUCT_DEFINE(__THIS__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT)
606#define GX_RTTI_STRUCT_NAME_ATTRIBUTE(__THIS__, __NAME__, __ATTRIBUTE__) GX_RTTI_STRUCT_DEFINE(__THIS__, nullptr, GxRtti::DEFAULT_ID, GxRtti::ATTRIBUTE_CREATABLE | GxRtti::ATTRIBUTE_STRUCT | __ATTRIBUTE__)
607#endif // !GX_DEVELOP
608
609// 構造体RTTI定義マクロ
610#if GX_DEVELOP
611#define GX_RTTI_STRUCT_DEFINE(__THIS__, __NAME__, __ID__, __ATTRIBUTE__) \
612 using MyClass = __THIS__; \
613 using Super = GxStructBase; \
614 static GxRtti __rtti; \
615 static GxProperty __properties[]; \
616 static GxFunction __functions[]; \
617 static const u32 __defaultId = __ID__; \
618 static const u32 __defaultAttr = __ATTRIBUTE__; \
619 static void usage(void){ GxRtti& rtti = __THIS__::__rtti; GxRtti::forceUsage(rtti); } \
620 GxRtti& getRtti(void) const { return __THIS__::__rtti; } \
621 void* cast(const GxRtti& rtti){ if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
622 const void* cast(const GxRtti& rtti) const { if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
623 static GxProperty* __getProperties (void){ return __properties; } \
624 static GxFunction* __getFunctions(void){ return __functions; } \
625 static u32 __getPropertyCount(void); \
626 static u32 __getFunctionCount(void); \
627 GX_RTTI_GET_NAME(#__THIS__, __NAME__) \
628 static GxRtti& __getStaticRtti(void){ return __rtti; } \
629 static __THIS__* __createInstance(void){ return GX_NEW (__THIS__); } \
630 void __destroyInstance(void){ GX_DELETE this; } \
631 void trace(void){ __THIS__::__getStaticRtti().trace(this); } \
632 static GxGuiBase* __createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index = 0){ return MyClass::createGui(property, pOwner, rtti, index); } \
633 static const GxRtti::ICON_TYPE __iconType = GxRtti::ICON_TYPE::INVALID;
634#else //GX_DEVELOP
635#define GX_RTTI_STRUCT_DEFINE(__THIS__, __NAME__, __ID__, __ATTRIBUTE__) \
636 using MyClass = __THIS__; \
637 using Super = GxStructBase; \
638 static GxRtti __rtti; \
639 static GxProperty __properties[]; \
640 static GxFunction __functions[]; \
641 static const u32 __defaultId = __ID__; \
642 static const u32 __defaultAttr = __ATTRIBUTE__; \
643 static void usage(void){ GxRtti& rtti = __THIS__::__rtti; GxRtti::forceUsage(rtti); } \
644 GxRtti& getRtti(void) const { return __THIS__::__rtti; } \
645 void* cast(const GxRtti& rtti){ if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
646 const void* cast(const GxRtti& rtti) const { if(getRtti().isDerived(rtti)){ return this; } return nullptr; } \
647 static GxProperty* __getProperties (void){ return __properties; } \
648 static GxFunction* __getFunctions(void){ return __functions; } \
649 static u32 __getPropertyCount(void); \
650 static u32 __getFunctionCount(void); \
651 GX_RTTI_GET_NAME(#__THIS__, __NAME__) \
652 static GxRtti& __getStaticRtti(void){ return __rtti; } \
653 static __THIS__* __createInstance(void){ return GX_NEW (__THIS__); } \
654 void __destroyInstance(void){ GX_DELETE this; } \
655 void trace(void){ __THIS__::__getStaticRtti().trace(this); }
656#endif // !GX_DEVELOP
657
658// プロパティ定義開始マクロ
659#define GX_PROPERTY_BEGIN(__THIS__) GX_PROPERTY_BEGIN_EX(__THIS__, 0, nullptr, nullptr)
660#define GX_PROPERTY_ATTRIBUTE_BEGIN(__THIS__, __ATTRIBUTE__) GX_PROPERTY_BEGIN_EX(__THIS__, __ATTRIBUTE__, nullptr, nullptr)
661#define GX_PROPERTY_FUNCTION_BEGIN(__THIS__) GX_PROPERTY_BEGIN_EX(__THIS__, 0, (GxRtti::GET_FUNCTIONS_FUNCTION )&__THIS__::__getFunctions, (GxRtti::GET_FUNCTION_NUM_FUNCTION)&__THIS__::__getFunctionCount)
662#define GX_PROPERTY_ATTRIBUTE_FUNCTION_BEGIN(__THIS__, __ATTRIBUTE__) GX_PROPERTY_BEGIN_EX(__THIS__, __ATTRIBUTE__, (GxRtti::GET_FUNCTIONS_FUNCTION )&__THIS__::__getFunctions, (GxRtti::GET_FUNCTION_NUM_FUNCTION)&__THIS__::__getFunctionCount)
663#if GX_DEVELOP
664#define GX_PROPERTY_BEGIN_EX(__THIS__, __ATTRIBUTE__, __GET_FUNCTION__, __GET_FUNCTION_COUNT__) GxRtti __THIS__::__rtti( #__THIS__, __THIS__::__getName(), __iconType, \
665 GxRtti::TYPE::NORMAL, sizeof(__THIS__), (__defaultId == GxRtti::DEFAULT_ID) ? GxMath::getHash32(#__THIS__) : __defaultId, __THIS__::__defaultAttr | __ATTRIBUTE__, \
666 &Super::__getStaticRtti(), (GxRtti::CREATE_INSTANCE_FUNCTION)&__THIS__::__createInstance, (GxRtti::CREATE_GUI_FUNCTION)&__THIS__::__createGui, \
667 (GxRtti::GET_PROPERTIES_FUNCTION )&__THIS__::__getProperties, (GxRtti::GET_PROPERTY_NUM_FUNCTION)&__THIS__::__getPropertyCount, \
668 __GET_FUNCTION__, __GET_FUNCTION_COUNT__); \
669 u32 __THIS__::__getPropertyCount(void){ \
670 static b32 initialFlag = false; static u32 count = 0; \
671 if( !initialFlag ){ \
672 for( GxProperty* pProperty = __properties; pProperty->getType() != GxProperty::TYPE::COUNT_MAX; pProperty++ ){ count++; } \
673 initialFlag = true; \
674 } \
675 return count; \
676 } \
677 GxProperty __THIS__::__properties[] = {
678#else //GX_DEVELOP
679#define GX_PROPERTY_BEGIN_EX(__THIS__, __ATTRIBUTE__, __GET_FUNCTION__, __GET_FUNCTION_COUNT__) GxRtti __THIS__::__rtti( \
680 GxRtti::TYPE::NORMAL, sizeof(__THIS__), (__defaultId == GxRtti::DEFAULT_ID) ? GxMath::getHash32(#__THIS__) : __defaultId, __THIS__::__defaultAttr | __ATTRIBUTE__, \
681 &Super::__getStaticRtti(), (GxRtti::CREATE_INSTANCE_FUNCTION)&__THIS__::__createInstance, \
682 (GxRtti::GET_PROPERTIES_FUNCTION )&__THIS__::__getProperties, (GxRtti::GET_PROPERTY_NUM_FUNCTION)&__THIS__::__getPropertyCount, \
683 __GET_FUNCTION__, __GET_FUNCTION_COUNT__); \
684 u32 __THIS__::__getPropertyCount(void){ \
685 static b32 initialFlag = false; static u32 count = 0; \
686 if( !initialFlag ){ \
687 for( GxProperty* pProperty = __properties; pProperty->getType() != GxProperty::TYPE::COUNT_MAX; pProperty++ ){ count++; } \
688 initialFlag = true; \
689 } \
690 return count; \
691 } \
692 GxProperty __THIS__::__properties[] = {
693#endif //GX_DEVELOP
694
695// プロパティ定義終了マクロ
696#if GX_DEVELOP
697#define GX_PROPERTY_END() \
698 GxProperty( GxProperty::TYPE::COUNT_MAX, GxProperty::GxFunction(), GxProperty::ATTRIBUTE_NONE, nullptr, &MyClass::__getStaticRtti(), GxProperty::DEFAULT_ID, nullptr, nullptr) \
699};
700#else //GX_DEVELOP
701#define GX_PROPERTY_END() \
702 GxProperty( GxProperty::TYPE::COUNT_MAX, GxProperty::GxFunction(), GxProperty::ATTRIBUTE_NONE, nullptr, &MyClass::__getStaticRtti(), GxProperty::DEFAULT_ID) \
703};
704#endif // !GX_DEVELOP
705
706// 関数型定義開始マクロ
707#define GX_FUNCTION_BEGIN(__THIS__) u32 __THIS__::__getFunctionCount(void){ \
708 static b32 initialFlag = false; static u32 count = 0; \
709 if( !initialFlag ){ \
710 for( GxFunction* pFunction = __functions; pFunction->getReturnType()._type != GxFunction::TYPE::MAX; pFunction++ ){ count++; } \
711 initialFlag = true; \
712 } \
713 return count; \
714 } \
715 GxFunction __THIS__::__functions[] = {
716
717// 関数型定義終了マクロ
718#define GX_FUNCTION_END() \
719 GxFunction(nullptr, 0, nullptr, "", GxFunction::TYPE::MAX) \
720};
721
722// RTTI参照用マクロ
723#define GX_RTTI __getStaticRtti()
724
725// インスタンス生成用マクロ
726#if GX_DEBUG_NEW
727#define GX_CREATE_INSTANCE() createInstance(__FILE__, __LINE__)
728#else //GX_DEBUG_NEW
729#define GX_CREATE_INSTANCE() createInstance()
730#endif // !GX_DEBUG_NEW
731
732// インスタンス破棄用マクロ
733#define GX_DESTROY_INSTANCE() __destroyInstance()
734
735GX_CORE_NAMESPACE_END()
void GxTypedObject
その他
Definition GxDefine.h:213
配列クラス
Definition GxArray.h:18
関数型情報
Definition GxFunction.h:18
プロパティクラス
Definition GxProperty.h:48
プロパティテーブルクラス
Definition GxProperty.h:1641
実行時型情報クラス
Definition GxRtti.h:154
constexpr u32 getAttribute(void) const
属性を取得
Definition GxRtti.h:380
u32 createDifferencePropertyTable(GxPropertyTable &propertyTable, GxTypedObject *pTargetObject, b32 searchParentFlag=true, const GxTypedObject *pDefaultObject=nullptr)
差分のプロパティ配列を作成
Definition GxRtti.cpp:300
GxRtti(TYPE type, u32 size, u32 id, u32 attribute, GxRtti *pBaseRtti, CREATE_INSTANCE_FUNCTION pCreateInstanceFunction, GET_PROPERTIES_FUNCTION pGetPropertiesFunction, GET_PROPERTY_NUM_FUNCTION pGetPropertyNumFunction, GET_FUNCTIONS_FUNCTION pGetFunctionsFunction, GET_FUNCTION_NUM_FUNCTION pGetFunctionNumFunction)
コンストラクタ
ICON_TYPE
アイコンタイプ定義
Definition GxRtti.h:202
@ RELOAD
再読み込み
@ LOCATE_POSITION
移動操作
@ ERROR_
エラー
@ SCREEN_SHOT
スクリーンショット
@ CHECK_BOX_ON
チェックボックスON
@ PAUSE
一時停止
@ FOLDER_OPEN
開いたフォルダ
@ UNIT_SOUND
サウンドユニット
@ LOCATE_SCALE
拡縮操作
@ UNIT_ENEMY
敵ユニット
@ CHARACTER
CHARACTER.
@ SINGLE_STEP
コマ送り
@ MESH
メッシュ
@ TEXT
テキスト
@ UNIT_MOVIE
ムービーユニット
@ WINDOW
ウィンドウ
@ UNIT_CAMERA
カメラユニット
@ CHECK_BOX_OFF
チェックボックスOFF
@ FOLDER
フォルダ
@ SEARCH_WEB
Web検索
@ LOCATE_ROTATE
回転操作
@ FOLDER_ADD
フォルダ追加
@ REVERT
元に戻す
@ UNIT_PLAYER
プレイヤーユニット
@ UNIT_GIMMICK
ギミックユニット
@ UNIT_EFFECT
エフェクトユニット
@ VISIBLE_ON
描画ON
@ UNIT_NPC
NPCユニット
@ TOOL_EDITOR
エディター
@ MATERIAL
マテリアル
@ INVALID
未定義
@ UNIT_LIGHT
ライトユニット
@ LAYOUT_SINGLE
レイアウト(単体)
@ LAYOUT_CUSTOM
レイアウト(カスタマイズ)
@ CHECK_BOX_DIFFERENT
予備3
@ TOOL_VIEWER
ビューワー
@ LEVEL
レベル
@ LAYOUT_MULTI
レイアウト(複数)
@ PLUG_IN
プラグイン
@ VISIBLE_OFF
描画OFF
static void copyObject(GxTypedObject *pObjectDst, const GxTypedObject *pObjectSrc, const GxRtti &rtti)
指定オブジェクトをコピー
Definition GxRtti.cpp:406
void deleteDefaultObjectSub(void)
デフォルトオブジェクトを削除するサブ関数
Definition GxRtti.cpp:986
const GxRtti * enumerate(const GxRtti *pRootRtti) const
指定以下のRTTIを列挙
Definition GxRtti.cpp:487
constexpr GxRtti::TYPE getType(void) const
種類を取得
Definition GxRtti.h:384
u32 getPropertyCount(void) const
プロパティ数を取得
Definition GxRtti.cpp:636
static volatile GxRtti * _pUsageCall
最適化回避呼び出し
Definition GxRtti.h:463
ATTRIBUTE
属性
Definition GxRtti.h:185
@ ATTRIBUTE_ALL
全フラグON
Definition GxRtti.h:190
@ ATTRIBUTE_CREATABLE
createInstance()を実行できる
Definition GxRtti.h:187
@ ATTRIBUTE_STRUCT
構造体
Definition GxRtti.h:189
@ ATTRIBUTE_NONE
全フラグOFF
Definition GxRtti.h:186
@ ATTRIBUTE_HIDE
GUIを表示しない
Definition GxRtti.h:188
GxRtti(void)
デフォルトコンストラクタ
Definition GxRtti.h:301
GX_FORCE_INLINE b32 isDerived(const GxRtti &rtti) const
継承されている型か判定
Definition GxRtti.h:372
GX_FORCE_INLINE b32 isAttribute(ATTRIBUTE attribute) const
属性を判定
Definition GxRtti.h:382
static void getRttiList(GxArray &list, const GxRtti &root=getRttiRoot(), ATTRIBUTE attributeOn=ATTRIBUTE_ALL, ATTRIBUTE attributeOff=ATTRIBUTE_NONE)
RTTIリストを取得
Definition GxRtti.cpp:816
TYPE
種類
Definition GxRtti.h:195
@ NORMAL
通常
@ RESOURCE
リソース用
static const GxRtti * getRtti(u32 id, const GxRtti &root=getRttiRoot())
RTTIを取得
Definition GxRtti.cpp:796
static constexpr u32 DEFAULT_ID
GxRttiのIDを定義しなかったときのデフォルト値
Definition GxRtti.h:161
static void deleteDefaultObjectAll(void)
全てのデフォルトオブジェクトを削除
Definition GxRtti.cpp:977
constexpr u32 getId(void) const
IDを取得
Definition GxRtti.h:376
constexpr GxRtti * getChild(void) const
子を取得
Definition GxRtti.h:388
constexpr GxRtti * getParent(void) const
親を取得
Definition GxRtti.h:386
GxFunction * getFunction(u32 index) const
関数型を取得
Definition GxRtti.cpp:780
void getReferencePropertyList(GxArray &list, b32 searchParentFlag=false) const
参照リソースプロパティリストを取得
Definition GxRtti.cpp:726
u32 getFunctionCount(void) const
関数型の数を取得
Definition GxRtti.cpp:766
static GX_CHAR _usageDummy[8]
最適化回避用バッファ
Definition GxRtti.h:464
ICON_TYPE_64
アイコンタイプ定義(サイズ64)
Definition GxRtti.h:273
static GxRtti & getRttiRoot(void)
RTTIルートを取得
Definition GxRtti.cpp:870
GX_FORCE_INLINE b32 operator==(const GxRtti &rtti) const
一致演算子
Definition GxRtti.h:327
constexpr void setSingletonInstance(GxTypedObject *pSingletonInstance)
シングルトンインスタンスを設定
Definition GxRtti.h:441
GX_FORCE_INLINE void * createInstance(void) const
インスタンスを生成
Definition GxRtti.h:358
static GxRtti * getNextRtti(const GxRtti &rttiRoot, const GxRtti &rttiTarget)
次のRTTIを取得
Definition GxRtti.cpp:842
constexpr GxRtti * getNext(void) const
次の兄弟を取得
Definition GxRtti.h:390
void getReferenceRttiList(GxArray &list, b32 searchParentFlag=false) const
参照リソースRTTIリストを取得
Definition GxRtti.cpp:682
constexpr GxTypedObject * getSingletonInstance(void) const
シングルトンインスタンスを取得
Definition GxRtti.h:439
GX_FORCE_INLINE b32 isId(u32 id) const
IDを判定
Definition GxRtti.h:378
GX_FORCE_INLINE b32 operator!=(const GxRtti &rtti) const
不一致演算子
Definition GxRtti.h:329
static void forceUsage(GxRtti &rtti)
最適化回避呼び出し
Definition GxRtti.cpp:143
GxProperty * getProperty(u32 id, b32 searchParentFlag=false) const
プロパティを取得
Definition GxRtti.cpp:651
32bitブーリアン
Definition GxDefine.h:173