OROCHI
 
Loading...
Searching...
No Matches
GxUnitBase.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_CORE_NAMESPACE_BEGIN()
13
14class GxToolUnitProperty;
15class GxModUnitBase;
16#if GX_DEVELOP
17class GxToolBase;
18#endif //GX_DEVELOP
19
21enum class UPDATE_TYPE
22{
23 PRE_ASYNC = 0,
24 ASYNC,
28 MAX,
29};
30#if GX_DEVELOP
32GX_FLAG_BEGIN(UPDATE_TYPE)
33 GX_FLAG_VALUE("PreAsync", UPDATE_TYPE::PRE_ASYNC),
34 GX_FLAG_VALUE("Async", UPDATE_TYPE::ASYNC),
35 GX_FLAG_VALUE("PostAsync", UPDATE_TYPE::POST_ASYNC),
36 GX_FLAG_VALUE("Sequential", UPDATE_TYPE::SEQUENTIAL),
37 GX_FLAG_VALUE("ForceAsync", UPDATE_TYPE::FORCE_ASYNC),
38GX_FLAG_END()
39#endif //GX_DEVELOP
40
41//===========================================================================
43//===========================================================================
45{
46 //-----------------------------------------------------------
48 //-----------------------------------------------------------
50public:
51 friend class GxSysUnit;
52 class GxScopeProfiler;
53
54 // RTTI宣言
55 GX_RTTI_CLASS(GxUnitBase, GxClassBaseReference)
56 // new, delete定義
57 GX_OPERATOR_NEW_DELETE(GxAllocatorList::ALLOCATOR_TYPE::UNIT)
58 // GxClassBaseReference継承クラス用禁止宣言
60
61
62 enum class STATE
63 {
64 SETUP,
65 RUNNING,
66 DELETE_,
67 };
68
71 {
72 ATTRIBUTE_UPDATE = (1 << 0),
73 ATTRIBUTE_SELECTED = (1 << 1),
74 ATTRIBUTE_LOCK = (1 << 2),
75 ATTRIBUTE_SLOW = (1 << 3),
77 };
78
80 //-----------------------------------------------------------
82 //-----------------------------------------------------------
84
86 GxUnitBase(void);
88 void cleanup(void) override;
89
91 //-----------------------------------------------------------
93 //-----------------------------------------------------------
95protected:
97 virtual b32 setup(void);
99 virtual void preAsyncUpdate(void);
101 virtual void asyncUpdate(void);
103 virtual void postAsyncUpdate(void);
105 virtual void sequentialUpdate(void);
107 virtual void forceAsyncUpdate(void);
109 virtual void render(void);
111 virtual b32 setRenderMaterial(GxRenderMaterial* pMaterial, const GxResModel::GxMeshGroup* pMeshGroup);
112
114 template<typename T> T* addModule(void)
115 {
116#if GX_DEVELOP
117 for (auto* pModule : _modules)
118 {
119 if (static_cast<GxModUnitBase*>(pModule)->getRtti().isDerived(T::GX_RTTI)
120 || T::GX_RTTI.isDerived(static_cast<GxModUnitBase*>(pModule)->getRtti()))
121 {
122 GX_ERROR(false, "Module(%s) is already craeted", T::GX_RTTI.getName());
123 return nullptr;
124 }
125 }
126#endif //GX_DEVELOP
127 if(getRtti().isDerived(T::getOwnerDerivedRtti()))
128 {
129 auto pModule = static_cast<T*>(T::GX_RTTI.GX_CREATE_INSTANCE());
130 GX_ASSERT(pModule, "Module(%s) create error", T::GX_RTTI.getName());
131 pModule->setOwner(this);
132 _modules.addBottom(pModule);
133 _updateEnable |= pModule->getUpdateEnable();
134 return pModule;
135 }
136 return nullptr;
137 }
138protected:
140 template<typename T> void removeModule(void)
141 {
142 for (u32 i = 0; i < _modules.getCount(); i++)
143 {
144 auto* pModule = static_cast<GxModUnitBase*>(_modules[i]);
145 if (pModule->getRtti() == T::GX_RTTI)
146 {
147 _modules.remove(i);
148 GX_SAFE_DELETE(pModule);
149 break;
150 }
151 }
152 }
153private:
155 void addModuleCallback(GxClassBaseRoot* pValue);
156
157public:
159 void sleep(f32 time);
160
162 template<typename T> T* createAndAddChild(u32 listProcessNumber = U32_MAX, u32 listKindNumber = U32_MAX, b32 isSerialize = false, const GxRtti* pRtti = nullptr)
163 {
164 T* pUnit = static_cast<T*>(createAndAddBottom(listProcessNumber, listKindNumber, pRtti ? *pRtti : T::GX_RTTI));
165 pUnit->setAttribute(ATTRIBUTE_LOCK, true);
166 pUnit->setAttribute(ATTRIBUTE_NOSERIALIZE, !isSerialize);
167 pUnit->setParent(this);
168 return pUnit;
169 }
170private:
172 GxUnitBase* createAndAddBottom(u32 listProcessNumber, u32 listKindNumber, const GxRtti& rtti);
173public:
175 virtual void kill(void);
176
177#if GX_USE_UNIT_PROFILE
178private:
180 void preAsyncUpdateProfile(void);
182 void asyncUpdateProfile(void);
184 void postAsyncUpdateProfile(void);
186 void sequentialUpdateProfile(void);
188 void forceAsyncUpdateProfile(void);
189#endif //GX_USE_UNIT_PROFILE
190
192 //-----------------------------------------------------------
194 //-----------------------------------------------------------
196public:
198 constexpr f32 getDeltaTimeFactor(void) const { return _deltaTimeFactor; }
200 constexpr void setDeltaTimeFactor(f32 deltaTimeFactor){ _deltaTimeFactor = deltaTimeFactor; }
202 constexpr f32 getDeltaTime(void) const { return _deltaTime; }
204 constexpr void setDeltaTime(f32 deltaTime){ _deltaTime = deltaTime; }
206 constexpr f32 getDeltaTimeRatio(void) const { return _deltaTimeRatio; }
208 constexpr void setDeltaTimeRatio(f32 deltaTimeRatio){ _deltaTimeRatio = deltaTimeRatio; }
210 constexpr STATE getState(void) const { return _state; }
212 constexpr void setState(STATE state) { _state = state; }
214 GX_FORCE_INLINE b32 isEnable(void) const { return (_state == STATE::RUNNING) || (_state == STATE::SETUP); }
216 constexpr u32 getAttribute(void) const { return _attribute; }
218 GX_FORCE_INLINE b32 isAttribute(ATTRIBUTE attribute) const { return _attribute & attribute ? true : false; }
220 GX_FORCE_INLINE void setAttribute(ATTRIBUTE attribute, b32 enable){ enable ? _attribute |= attribute : _attribute &= ~attribute; }
222 GX_FORCE_INLINE b32 isRender(void) const { return _isRender; }
224 void setRender(b32 enable, b32 withChildren = false);
226 GX_FORCE_INLINE GxFlag32Index<RENDER_VIEW> getRenderViewFlag(void) const { return _renderView; }
228 GX_FORCE_INLINE b32 isRenderView(RENDER_VIEW view) const { return _renderView.isFlag(view); }
230 GX_FORCE_INLINE void setRenderView(RENDER_VIEW view, b32 enable){ _renderView.setFlag(view, enable); }
232 GX_FORCE_INLINE b32 isRenderSubView(RENDER_SUB_VIEW subView) const { return _renderSubView.isFlag(subView); }
234 GX_FORCE_INLINE void setRenderSubView(RENDER_SUB_VIEW subView, b32 enable){ _renderSubView.setFlag(subView, enable); }
236 GX_FORCE_INLINE b32 isUpdateEnable(UPDATE_TYPE updateType) const { return _updateEnable.isFlag(updateType); }
238 GX_FORCE_INLINE void setUpdateEnable(UPDATE_TYPE updateType, b32 enable){ _updateEnable.setFlag(updateType, enable); }
239
241 GX_FORCE_INLINE void getPropertyAttributeUpdate(void* const pValue) { *static_cast<b32*>(pValue) = isAttribute(ATTRIBUTE_UPDATE); }
243 GX_FORCE_INLINE void setPropertyAttributeUpdate(const void* const pValue) { setAttribute(ATTRIBUTE_UPDATE, *static_cast<b32*>(const_cast<void*>(pValue))); }
244
246 template<typename T> T* getModule(void) const
247 {
248 for (auto* pModule : _modules)
249 {
250 if (static_cast<GxModUnitBase*>(pModule)->getRtti() == T::GX_RTTI)
251 {
252 return static_cast<T*>(pModule);
253 }
254 }
255 return nullptr;
256 }
257
259 constexpr u32 getChildCount(void) const { return _children.getCount(); }
261 constexpr GxUnitBase* getChild(u32 index) const { GX_ASSERT(index < _children.getCount(), "index over access!"); return static_cast<GxUnitBase*>(_children[index]); }
263 constexpr GxUnitBase* getParent(void) const { return _pParent; }
265 void setParent(GxUnitBase* pParent);
266
268 constexpr GxResUnitInstance* getResUnitInstance(void) const { return _pResUnitInstance; }
270 void setResUnitInstance(GxResUnitInstance* pResUnitInstance);
272 constexpr void getPropertyResUnitInstance(void* const pValue) { *static_cast<GxResUnitInstance**>(pValue) = _pResUnitInstance; }
274 void setPropertyResUnitInstance(const void* const pValue);
276 GX_FORCE_INLINE const GxTypedObject* getDefaultObject(void) override { return _pDefaultUnit ? _pDefaultUnit : Super::getDefaultObject(); }
278 constexpr GxUnitBase* getDefaultUnit(void) const { return _pDefaultUnit; }
280 void setDefaultUnit(GxUnitBase* pDefaultUnit);
281
283#if GX_DEVELOP
284 //-----------------------------------------------------------
286 //-----------------------------------------------------------
288
290 virtual void addUnitOwnProperty( GxPropertyTable& table );
292 GX_FORCE_INLINE virtual void setExpandToolUnitProperty( GxToolUnitProperty* /*pTool*/) {}
294 GX_FORCE_INLINE virtual void setFilterProperty(GxPropertyTable* /*pPropertyTable*/) {}
296 GX_FORCE_INLINE virtual void setResource(GxResBase* /*pResource*/){}
298 GX_FORCE_INLINE virtual b32 isUseTexture(GxRenderTexture* /*pTexture*/) { return false; }
300 GX_FORCE_INLINE virtual void reloadBegin(void){}
302 GX_FORCE_INLINE virtual void reloadEnd(void){}
303
305 GX_FORCE_INLINE void getPropertyVirtualName(void* pValue) { *static_cast<GX_CSTR*>(pValue) = getVirtualName(); }
307 constexpr GX_CSTR getVirtualName(void) const { return _virtualName.getLength() > 0 ? _virtualName.getString() : getRtti().getName(); }
309 GX_FORCE_INLINE void setVirtualName(GX_CSTR name){ _virtualName = name; }
311 constexpr GxToolBase* getParentTool(void) const { return _pParentTool; }
313 constexpr void setParentTool(GxToolBase* pParentTool) { _pParentTool = pParentTool; }
315 void setParentToolChildren(GxToolBase* pParentTool);
317 void addPropertyToTable(GxPropertyTable* pPropertyTable, GX_CSTR name, b32 pageExpand = false);
318
319#if GX_USE_UNIT_PROFILE
321 void beginProfile(UPDATE_TYPE updateType);
323 void endProfile(UPDATE_TYPE updateType);
325 void resetProfile(void);
327 void outputProfile(UPDATE_TYPE updateType);
329 constexpr u32 getUpdateTime(UPDATE_TYPE updateType) const { return _updateTime[static_cast<s32>(updateType)]; }
330#endif //GX_USE_UNIT_PROFILE
332 static GxGuiBase* createGui(GxProperty& property, GxTypedObject* pOwner, const GxRtti& rtti, u32 index);
333
335#endif // GX_DEVELOP
336 //-----------------------------------------------------------
338 //-----------------------------------------------------------
340private:
341 f32 _deltaTimeFactor;
342 f32 _deltaTime;
343 f32 _deltaTimeRatio;
344 STATE _state;
345 u32 _attribute;
346 b32 _isRender;
347
348 GxFlag32Index<RENDER_VIEW> _renderView;
349 GxFlag32Index<RENDER_SUB_VIEW> _renderSubView;
350 GxFlag32Index<UPDATE_TYPE> _updateEnable;
351
352 GxArrayClassBase _modules;
353
354 GxUnitBase* _pParent;
355 GxArray _children;
356 static GxCriticalSection _criticalSection;
357 GxResUnitInstance* _pResUnitInstance;
358 GxUnitBase* _pDefaultUnit;
359
360#if GX_USE_UNIT_PROFILE
361 GxTimer _timer[static_cast<s32>(UPDATE_TYPE::MAX)];
362 u32 _updateTime[static_cast<s32>(UPDATE_TYPE::MAX)];
363 u32 _updateTimeWorst[static_cast<s32>(UPDATE_TYPE::MAX)];
364#endif // GX_USE_UNIT_PROFILE
365 GxString _virtualName;
366#if GX_DEVELOP
367 GxToolBase* _pParentTool;
368#endif //GX_DEVELOP
369
371};
372
373// ユニットが無効になった場合、ポインタをnullptrにします
374#define GX_UPDATE_UNIT_POINTER(__POINTER__) if( (__POINTER__) && (!(__POINTER__)->isEnable()) ) { (__POINTER__) = nullptr; }
375
376// 安全なkill
377#define GX_SAFE_KILL(__POINTER__) { if(__POINTER__){ __POINTER__->kill(); __POINTER__ = nullptr; } }
378
379GX_CORE_NAMESPACE_END()
#define GX_PROHIBIT_CLASS_BASE_REFERENCE(__CLASS__)
GxClassBaseReference継承の禁止宣言(new以外の生成禁止 + コピー禁止)
Definition GxBase.h:244
void GxTypedObject
その他
Definition GxDefine.h:213
RENDER_VIEW
描画優先度(ビュー)
Definition GxRender.h:442
RENDER_SUB_VIEW
描画優先度(サブビュー)
Definition GxRender.h:485
UPDATE_TYPE
更新タイプ
Definition GxUnitBase.h:22
@ MAX
定義数
@ SEQUENTIAL
逐次更新
@ FORCE_ASYNC
強制並列更新
@ PRE_ASYNC
並列更新(前)
@ ASYNC
並列更新
@ POST_ASYNC
並列更新(後)
配列クラス
Definition GxArrayClassBase.h:18
constexpr u32 getCount(void) const
配列数を取得
Definition GxArrayClassBase.h:109
void remove(GxClassBaseRoot *pObject)
削除(領域を詰める)
Definition GxArrayClassBase.cpp:130
配列クラス
Definition GxArray.h:18
constexpr u32 getCount(void) const
配列数を取得
Definition GxArray.h:132
参照オブジェクト基底クラス
Definition GxBase.h:122
基底クラス
Definition GxBase.h:51
virtual GxRtti & getRtti(void) const =0
Rttiの取得
クリティカルセクションクラス
Definition GxThread.h:20
ユニットモジュール基礎クラス
Definition GxModUnitBase.h:22
プロパティテーブルクラス
Definition GxProperty.h:1641
マテリアル構造体
Definition GxRenderMaterial.h:18
テクスチャクラス
Definition GxRenderTexture.h:19
リソース基底クラス
Definition GxResBase.h:23
ユニットインスタンスリソース
Definition GxResUnitInstance.h:18
実行時型情報クラス
Definition GxRtti.h:154
ユニットシステムクラス
Definition GxSysUnit.h:64
タイマークラス
Definition GxTimer.h:110
ユニット基礎クラス
Definition GxUnitBase.h:45
constexpr GxUnitBase * getChild(u32 index) const
子ユニットを取得
Definition GxUnitBase.h:261
GX_FORCE_INLINE b32 isRenderView(RENDER_VIEW view) const
描画するビューを判定
Definition GxUnitBase.h:228
constexpr void setDeltaTimeRatio(f32 deltaTimeRatio)
デルタタイムレート(通常のフレームレートの何倍か)を設定
Definition GxUnitBase.h:208
virtual void render(void)
描画
Definition GxUnitBase.cpp:166
void setPropertyResUnitInstance(const void *const pValue)
ユニットインスタンスリソースプロパティの設定
Definition GxUnitBase.cpp:318
GX_FORCE_INLINE b32 isRender(void) const
描画フラグ判定
Definition GxUnitBase.h:222
void cleanup(void) override
解放処理
Definition GxUnitBase.cpp:74
GX_FORCE_INLINE b32 isUpdateEnable(UPDATE_TYPE updateType) const
更新を呼ぶかを判定
Definition GxUnitBase.h:236
virtual void postAsyncUpdate(void)
並列更新(asyncUpdateの後に実行される)
Definition GxUnitBase.cpp:133
GX_FORCE_INLINE b32 isEnable(void) const
有効か判定
Definition GxUnitBase.h:214
GX_FORCE_INLINE GxFlag32Index< RENDER_VIEW > getRenderViewFlag(void) const
描画するビューフラグを取得
Definition GxUnitBase.h:226
constexpr GxUnitBase * getParent(void) const
親ユニットを取得
Definition GxUnitBase.h:263
GX_FORCE_INLINE b32 isRenderSubView(RENDER_SUB_VIEW subView) const
描画するサブビューを判定
Definition GxUnitBase.h:232
void setParent(GxUnitBase *pParent)
親ユニットを設定
Definition GxUnitBase.cpp:274
virtual void preAsyncUpdate(void)
並列更新(asyncUpdateの前に実行される)
Definition GxUnitBase.cpp:111
GX_FORCE_INLINE const GxTypedObject * getDefaultObject(void) override
デフォルトオブジェクトを取得
Definition GxUnitBase.h:276
T * getModule(void) const
モジュールを取得
Definition GxUnitBase.h:246
constexpr GxUnitBase * getDefaultUnit(void) const
デフォルトユニットを取得
Definition GxUnitBase.h:278
virtual b32 setRenderMaterial(GxRenderMaterial *pMaterial, const GxResModel::GxMeshGroup *pMeshGroup)
マテリアルの描画設定
Definition GxUnitBase.cpp:180
GxUnitBase(void)
コンストラクタ
Definition GxUnitBase.cpp:45
constexpr f32 getDeltaTime(void) const
デルタタイムを取得
Definition GxUnitBase.h:202
constexpr f32 getDeltaTimeRatio(void) const
デルタタイムレート(通常のフレームレートの何倍か)を取得
Definition GxUnitBase.h:206
T * addModule(void)
モジュールを作成
Definition GxUnitBase.h:114
ATTRIBUTE
属性
Definition GxUnitBase.h:71
@ ATTRIBUTE_NOSERIALIZE
シリアライズしない
Definition GxUnitBase.h:76
@ ATTRIBUTE_SLOW
スローが適用される
Definition GxUnitBase.h:75
@ ATTRIBUTE_UPDATE
updateを呼ぶか
Definition GxUnitBase.h:72
@ ATTRIBUTE_LOCK
killを無視する
Definition GxUnitBase.h:74
@ ATTRIBUTE_SELECTED
選択されているか
Definition GxUnitBase.h:73
void setRender(b32 enable, b32 withChildren=false)
描画フラグを設定
Definition GxUnitBase.cpp:258
constexpr u32 getAttribute(void) const
属性を取得
Definition GxUnitBase.h:216
void removeModule(void)
モジュールを削除
Definition GxUnitBase.h:140
constexpr void setDeltaTimeFactor(f32 deltaTimeFactor)
デルタタイム係数を設定
Definition GxUnitBase.h:200
constexpr u32 getChildCount(void) const
子ユニット数を取得
Definition GxUnitBase.h:259
virtual b32 setup(void)
セットアップ(初回にasyncUpdate前に一回呼ばれる)
Definition GxUnitBase.cpp:92
virtual void asyncUpdate(void)
並列更新
Definition GxUnitBase.cpp:122
GX_FORCE_INLINE void setPropertyAttributeUpdate(const void *const pValue)
プロパティ用:更新処理の属性を設定
Definition GxUnitBase.h:243
virtual void forceAsyncUpdate(void)
強制並列更新(pause中も実行)
Definition GxUnitBase.cpp:155
GX_FORCE_INLINE b32 isAttribute(ATTRIBUTE attribute) const
属性を判定
Definition GxUnitBase.h:218
constexpr void setDeltaTime(f32 deltaTime)
デルタタイムを設定
Definition GxUnitBase.h:204
constexpr f32 getDeltaTimeFactor(void) const
デルタタイム係数を取得
Definition GxUnitBase.h:198
GX_FORCE_INLINE void setRenderSubView(RENDER_SUB_VIEW subView, b32 enable)
描画するサブビューを設定
Definition GxUnitBase.h:234
virtual void sequentialUpdate(void)
逐次更新
Definition GxUnitBase.cpp:144
GX_FORCE_INLINE void setAttribute(ATTRIBUTE attribute, b32 enable)
属性を設定
Definition GxUnitBase.h:220
constexpr void getPropertyResUnitInstance(void *const pValue)
ユニットインスタンスリソースプロパティの取得
Definition GxUnitBase.h:272
GX_FORCE_INLINE void setUpdateEnable(UPDATE_TYPE updateType, b32 enable)
更新を呼ぶかを設定
Definition GxUnitBase.h:238
virtual void kill(void)
消去リクエスト
Definition GxUnitBase.cpp:234
constexpr GxResUnitInstance * getResUnitInstance(void) const
ユニットインスタンスリソースを取得
Definition GxUnitBase.h:268
void sleep(f32 time)
スリープ(スクリプト用)
Definition GxUnitBase.cpp:196
GX_FORCE_INLINE void getPropertyAttributeUpdate(void *const pValue)
プロパティ用:更新処理の属性を取得
Definition GxUnitBase.h:241
GX_FORCE_INLINE void setRenderView(RENDER_VIEW view, b32 enable)
描画するビューを設定
Definition GxUnitBase.h:230
T * createAndAddChild(u32 listProcessNumber=U32_MAX, u32 listKindNumber=U32_MAX, b32 isSerialize=false, const GxRtti *pRtti=nullptr)
子ユニットを追加作成
Definition GxUnitBase.h:162
void setResUnitInstance(GxResUnitInstance *pResUnitInstance)
ユニットインスタンスリソースを設定
Definition GxUnitBase.cpp:307
STATE
状態
Definition GxUnitBase.h:63
@ RUNNING
更新中
@ DELETE_
消去中
@ SETUP
初期化中
constexpr void setState(STATE state)
状態を設定(ユーザーは使用してはならない内部使用)
Definition GxUnitBase.h:212
void setDefaultUnit(GxUnitBase *pDefaultUnit)
デフォルトユニットを設定
Definition GxUnitBase.cpp:341
constexpr STATE getState(void) const
状態を取得
Definition GxUnitBase.h:210
インデックス指定型フラグ
Definition GxStruct.h:1294
GX_FORCE_INLINE void setFlag(T index, b32 enable)
Definition GxStruct.h:1325
GX_FORCE_INLINE b32 isFlag(T index) const
フラグ直取得
Definition GxStruct.h:1321
モデルリソースメッシュグループ構造体
Definition GxResModel.h:211
文字列型クラス
Definition GxString.h:18
constexpr u32 getLength(void) const
文字列の長さを取得
Definition GxString.h:119
GX_FORCE_INLINE GX_STR getString(void)
文字列取得
Definition GxString.h:165
32bitブーリアン
Definition GxDefine.h:173