OROCHI
 
Loading...
Searching...
No Matches
GxOctree.h
Go to the documentation of this file.
1//===========================================================================
9//===========================================================================
10#pragma once
11
12GX_CORE_NAMESPACE_BEGIN()
13
14#define GX_RIGHT_HAND 1
15
16//---- 空間グラフ(8分木)のタイプ
17// 並列実行で構築。変更前の状態。同期オブジェクト数==ノード数
18#define GX_OCTREE_ASYNC 0
19// 逐次実行で構築。同期オブジェクト数==0。
20#define GX_OCTREE_SEQUENCE 1
21// 並列実行で構築。同期オブジェクト数 == 1
22#define GX_OCTREE_STATIC 2
23// 並列実行で構築。同期オブジェクト数 == 任意
24#define GX_OCTREE_POOL 3
25
26#define GX_OCTREE_TYPE GX_OCTREE_POOL
27
28// 開発用:ノード数をカウントする
29#if GX_DEVELOP
30#define GX_OCTREE_INFO 1
31#else //GX_DEVELOP
32#define GX_OCTREE_INFO 0
33#endif // !GX_DEVELOP
34
35//===========================================================================
37//===========================================================================
38class GxOctree : public GxClassBase
39{
40 //-------------------------------------------------------------
42 //-------------------------------------------------------------
44public:
45 GX_RTTI_CLASS(GxOctree, GxClassBase)
46 // GxClassBase継承クラス用禁止宣言
48 // ノードクラス
49 class GxNode;
50
52 //-------------------------------------------------------------
54 //-------------------------------------------------------------
56
58 GxOctree(void);
61
63 ~GxOctree(void) override;
64
66 //-------------------------------------------------------------
68 //-------------------------------------------------------------
70protected:
72 virtual GxOctree::GxNode* allocateNode(void);
73
75 constexpr u32 part1By2(u32 value) const
76 {
77 value = (value ^ (value << 16) ) & 0xFF0000FF;
78 value = (value ^ (value << 8) ) & 0x0300F00F;
79 value = (value ^ (value << 4) ) & 0x030C30C3;
80 value = (value ^ (value << 2) ) & 0x09249249;
81 return value;
82 }
83
85 void queryHighLevel(s32& levelCount, u32& arExorN, const GxVector3& min, const GxVector3& max ) const;
86
88 void queryLowerLevelSpaces(const GxVector3& leftTopBack, const u32& initialAABB, const u32& aunParentLevelN, const u32& aunParentSpace, b32* pDirtyFlags );
89
90public:
92 b32 findObject( GxClassBaseRoot* pObject ) const;
94 b32 addObject( GxClassBaseRoot* pObject, const GxVector3& min, const GxVector3& max );
96 b32 eraseObject( GxClassBaseRoot* pObject, const GxVector3& min, const GxVector3& max );
98 void eraseAllObject(void);
99
101 virtual b32 windowQueryForBB(GxArray& arvSpaces, const GxVector3& min, const GxVector3& max);
102
103#if (GX_OCTREE_TYPE == GX_OCTREE_POOL)
106 void initialize(u32 level, GxVector3& min, GxVector3& max, u32 levelNonShared = 0, u32 numCsecShared = 10);
107#else //(GX_OCTREE_TYPE == GX_OCTREE_POOL)
109 void initialize(u32 level, GxVector3& min, GxVector3& max);
110#endif //(GX_OCTREE_TYPE != GX_OCTREE_POOL)
111
113 virtual void beginBuildTree( void );
114
116 virtual void finishBuildTree( void );
117
120
122 virtual void eraseTree(void);
123
125 GX_FORCE_INLINE void startCulling(void){ _criticalSectionRegist.lock(); _inCulling = true; _criticalSectionRegist.unlock();}
127 GX_FORCE_INLINE void endCulling(void){ _criticalSectionRegist.lock(); _inCulling = false; _criticalSectionRegist.unlock(); }
128private:
130 void initialize(u32 level);
131#if (GX_OCTREE_TYPE == GX_OCTREE_POOL)
132 // note:必要に応じてpublic化
134 void createCriticalSectionNode(u32 levelNonShare, u32 numCriticalSectionShared);
136 void deleteCriticalSectionNode(void);
137#endif // (GX_OCTREE_TYPE == GX_OCTREE_POOL)
138
140 //-----------------------------------------------------------
142 //-----------------------------------------------------------
144public:
146 u32 getPointMortonCode(const f32& x, const f32& y, const f32& z) const;
147
149 u32 getBBMortonCode(const GxVector3& min, const GxVector3& max) const;
150
152 u32 getMortonCode(const u32& x, const u32& y, const u32& z) const;
153
156 GX_FORCE_INLINE b32 isRegisting(void) const { return _inCulling; }
157
160 virtual b32 isEmpty(void) const { return _pGlobalObjectList == nullptr || _pGlobalObjectList->getCount() == 0; }
161
164 GX_FORCE_INLINE GxArray& getNodeArray(void) { return _nodePointerArray; }
167 GX_FORCE_INLINE const GxArray& getNodeArray(void) const { return _nodePointerArray; }
168
171 GX_FORCE_INLINE GxVector3& getUnitLength(void) { return _unitLength; }
174 GX_FORCE_INLINE const GxVector3& getUnitLength(void) const { return _unitLength; }
175
178 GX_FORCE_INLINE GxVector3& getMin(void) { return _leftTopBack; }
181 GX_FORCE_INLINE const GxVector3& getMin(void) const { return _leftTopBack; }
182
185 GX_FORCE_INLINE GxVector3& getMax(void) { return _rightBottomFront; }
188 GX_FORCE_INLINE const GxVector3& getMax(void) const { return _rightBottomFront; }
189
192 constexpr u32 getTreeLevel(void) const { return _level; }
193
196 constexpr u32 getNodeCount(void) const { return _nodePointerArray.getCount(); }
197
201 GX_FORCE_INLINE const u32 getLeafNodeCount(u32 leaf) const { GX_ASSERT( leaf <= _level,"level over flow"); return getNodeCount() - getElementIndex(leaf, 0); }
202
206 GX_FORCE_INLINE const u32 getUnitNodeCount(const u32& level) const { return _pUnitCount[level]; }
207
210 constexpr GxArray* getGlobalObjectList(void) const { return _pGlobalObjectList; }
211protected:
216 GX_FORCE_INLINE const u32 getElementIndex(const u32& level, const u32& localIndex) const { return (_pStartIndex[level] + localIndex); }
217
219 //-----------------------------------------------------------
221 //-----------------------------------------------------------
223protected:
224 u32 _level; //<! ツリーの深さ
225 u32* _pStartIndex; //<! ツリーノードのオフセットインデックス
226 u32* _pUnitCount; //<! 各軸上の分割数
227
228 GxVector3 _leftTopBack; //<! x,y,z 左上奥Left, Top, Back
229 GxVector3 _rightBottomFront; //<! x,y,z 右下手前Right, Bottom, Front
230 GxVector3 _unitLength; //<! x,y,z 単位長さ
231
232 GxArray _nodePointerArray; //<! 線形8分木ノードリスト
233 b32* _pTemporaryFind; //<! 探索に利用するフラグ、探索するごとにメモリ確保する時間が惜しいので、最初に確保
234 b32* _pDirtyFlags[GxThread::THREAD_MAX]; //<! 探索に利用するフラグ、探索するごとにメモリ確保する時間が惜しいので、最初に確保
235
237 GxCriticalSection _criticalSectionArray; //<! リスト用クリティカルセクション
238 GxCriticalSection _criticalSectionRegist; //<! カリング処理実行中は登録/削除処理をロックする
239 b32 _inCulling;
241
242#if (GX_OCTREE_TYPE == GX_OCTREE_POOL)
243private:
246 u32 _levelNonShare;
248 u32 _numCriticalSectionShared;
250 u32 _numCriticalSectionNonShared;
251
253 GxCriticalSection** _ppCriticalSectionNodeShared;
255 GxCriticalSection** _ppCriticalSectionNodeNonShared;
256#endif // (GX_OCTREE_TYPE == GX_OCTREE_POOL)
257
259};
260
261//===========================================================================
263//===========================================================================
265{
266 //-------------------------------------------------------------
268 //-------------------------------------------------------------
270public:
271 GX_RTTI_CLASS(GxOctree::GxNode, GxClassBase)
272 friend GxOctree;
273
275 //-------------------------------------------------------------
277 //-------------------------------------------------------------
279
281 GxNode(void);
283 ~GxNode(void) override;
284
286 //-----------------------------------------------------------
288 //-----------------------------------------------------------
290
292 b32 addObject( GxClassBaseRoot* pObject );
293
296
298 b32 findObject(GxClassBaseRoot* pObject) const;
299
301 void clearObjects(void);
302
303#if (GX_OCTREE_TYPE != GX_OCTREE_SEQUENCE)
304#if (GX_OCTREE_TYPE == GX_OCTREE_POOL)
305public:
308 constexpr void setCriticalSectionArray(GxCriticalSection* pCriticalSection) { _pCriticalSectionArray = pCriticalSection; }
309#endif // (GX_OCTREE_TYPE == GX_OCTREE_POOL)
310protected:
312 void setLock(void);
314 void setUnlock(void);
315#endif // (GX_OCTREE_TYPE != GX_OCTREE_SEQUENCE)
316
318 //-----------------------------------------------------------
320 //-----------------------------------------------------------
322public:
324 GX_FORCE_INLINE virtual b32 isEmpty(void) const { return _pObjectList->getCount() == 0; }
325
328 constexpr GxArray* getObjectList( void ) const { return _pObjectList; }
329
332 GX_FORCE_INLINE GxShapeAxisAlignedBox& getBoudingBox( void ) { return _aabb; }
335 GX_FORCE_INLINE const GxShapeAxisAlignedBox& getBoudingBox( void ) const { return _aabb; }
336
338 //-----------------------------------------------------------
340 //-----------------------------------------------------------
342private:
343 GxArray* _pObjectList; //<! オブジェクトリスト
344 GxShapeAxisAlignedBox _aabb; //<! オクタントのAABB
345#if (GX_OCTREE_TYPE != GX_OCTREE_SEQUENCE)
346#if (GX_OCTREE_TYPE == GX_OCTREE_ASYNC)
347protected:
348 GxCriticalSection _criticalSectionArray; //<! リスト用クリティカルセクション
349#elif (GX_OCTREE_TYPE == GX_OCTREE_STATIC)
350protected:
351 static GxCriticalSection _criticalSectionArray; //<! リスト用クリティカルセクション
352#endif // (GX_OCTREE_TYPE != GX_OCTREE_STATIC)
353#if (GX_OCTREE_TYPE == GX_OCTREE_POOL)
354private:
355 GxCriticalSection* _pCriticalSectionArray; //<! リスト用クリティカルセクション
356#endif // (GX_OCTREE_TYPE == GX_OCTREE_POOL)
357#endif // (GX_OCTREE_TYPE != GX_OCTREE_SEQUENCE)
358
360};
361
362GX_CORE_NAMESPACE_END()
#define GX_PROHIBIT_CLASS_BASE(__CLASS__)
GxClassBase継承の禁止宣言
Definition GxBase.h:240
ALLOCATOR_TYPE
アロケータ定義
Definition GxAllocator.h:355
配列クラス
Definition GxArray.h:18
constexpr u32 getCount(void) const
配列数を取得
Definition GxArray.h:132
オブジェクト基底クラス
Definition GxBase.h:88
基底クラス
Definition GxBase.h:51
クリティカルセクションクラス
Definition GxThread.h:20
void lock(void)
ロック
Definition GxThread.cpp:139
void unlock(void)
アンロック
Definition GxThread.cpp:154
8分木ノードクラス
Definition GxOctree.h:265
virtual GX_FORCE_INLINE b32 isEmpty(void) const
ノードにオブジェクトが含まれているか
Definition GxOctree.h:324
constexpr void setCriticalSectionArray(GxCriticalSection *pCriticalSection)
Definition GxOctree.h:308
b32 findObject(GxClassBaseRoot *pObject) const
オブジェクトを検索
Definition GxOctree.cpp:772
~GxNode(void) override
デストラクタ
Definition GxOctree.cpp:754
void setLock(void)
リスト用クリティカルセクションでロックする
Definition GxOctree.cpp:871
void setUnlock(void)
リスト用クリティカルセクションのロックを解放
Definition GxOctree.cpp:886
constexpr GxArray * getObjectList(void) const
Definition GxOctree.h:328
GxNode(void)
デフォルトコンストラクタ
Definition GxOctree.cpp:739
GX_FORCE_INLINE const GxShapeAxisAlignedBox & getBoudingBox(void) const
Definition GxOctree.h:335
b32 addObject(GxClassBaseRoot *pObject)
オブジェクトを追加
Definition GxOctree.cpp:794
void clearObjects(void)
全ての登録オブジェクトの削除
Definition GxOctree.cpp:851
GX_FORCE_INLINE GxShapeAxisAlignedBox & getBoudingBox(void)
Definition GxOctree.h:332
b32 deleteObject(GxClassBaseRoot *pObject)
全ての登録オブジェクトの削除
Definition GxOctree.cpp:819
8分木クラス
Definition GxOctree.h:39
void queryHighLevel(s32 &levelCount, u32 &arExorN, const GxVector3 &min, const GxVector3 &max) const
与えれれた座標でAABB、直線などが作られる場合にのオブジェクトが含まれれる最上位空間を取得
Definition GxOctree.cpp:354
virtual void beginBuildTree(void)
ツリーの構築
Definition GxOctree.cpp:284
GX_FORCE_INLINE GxVector3 & getMin(void)
Definition GxOctree.h:178
GxOctree(void)
デフォルトコンストラクタ
Definition GxOctree.cpp:28
GX_FORCE_INLINE void startCulling(void)
カリング開始
Definition GxOctree.h:125
constexpr u32 getTreeLevel(void) const
Definition GxOctree.h:192
GX_FORCE_INLINE GxVector3 & getMax(void)
Definition GxOctree.h:185
GX_FORCE_INLINE GxVector3 & getUnitLength(void)
Definition GxOctree.h:171
virtual b32 isEmpty(void) const
Definition GxOctree.h:160
GX_FORCE_INLINE const u32 getLeafNodeCount(u32 leaf) const
Definition GxOctree.h:201
void initialize(u32 level, GxVector3 &min, GxVector3 &max, u32 levelNonShared=0, u32 numCsecShared=10)
Definition GxOctree.cpp:218
constexpr u32 getNodeCount(void) const
Definition GxOctree.h:196
virtual void finishBuildTree(void)
ツリーの破棄
Definition GxOctree.cpp:301
b32 addObject(GxClassBaseRoot *pObject, const GxVector3 &min, const GxVector3 &max)
オブジェクトをオクツリーに追加
Definition GxOctree.cpp:564
GxAllocatorList::ALLOCATOR_TYPE _allocatorType
アロケータ種別
Definition GxOctree.h:240
virtual void eraseTree(void)
全体を削除
Definition GxOctree.cpp:110
GX_FORCE_INLINE void endCulling(void)
カリング終了
Definition GxOctree.h:127
GxArray * _pGlobalObjectList
インスタンスグローバルリスト
Definition GxOctree.h:236
GX_FORCE_INLINE b32 isRegisting(void) const
Definition GxOctree.h:156
constexpr GxArray * getGlobalObjectList(void) const
Definition GxOctree.h:210
void eraseAllObject(void)
全てのオブジェクトを削除
Definition GxOctree.cpp:651
u32 getBBMortonCode(const GxVector3 &min, const GxVector3 &max) const
二つの空間座標からBBが含まれる、最上位空間のモートンコードを取得
Definition GxOctree.cpp:150
virtual b32 windowQueryForBB(GxArray &arvSpaces, const GxVector3 &min, const GxVector3 &max)
ウインドウクエリを行う
Definition GxOctree.cpp:378
GX_FORCE_INLINE GxArray & getNodeArray(void)
ノード配列を取得
Definition GxOctree.h:164
GX_FORCE_INLINE const u32 getUnitNodeCount(const u32 &level) const
Definition GxOctree.h:206
constexpr u32 part1By2(u32 value) const
3ビットトビに分割
Definition GxOctree.h:75
void queryLowerLevelSpaces(const GxVector3 &leftTopBack, const u32 &initialAABB, const u32 &aunParentLevelN, const u32 &aunParentSpace, b32 *pDirtyFlags)
下層の空間情報を取得
Definition GxOctree.cpp:469
b32 findObject(GxClassBaseRoot *pObject) const
オブジェクトを検索
Definition GxOctree.cpp:540
u32 getPointMortonCode(const f32 &x, const f32 &y, const f32 &z) const
指定ポイントのモートン順序のコードを取得
Definition GxOctree.cpp:175
GX_FORCE_INLINE const GxVector3 & getUnitLength(void) const
Definition GxOctree.h:174
b32 eraseObject(GxClassBaseRoot *pObject, const GxVector3 &min, const GxVector3 &max)
オブジェクトをオクツリーから削除
Definition GxOctree.cpp:606
GX_FORCE_INLINE const u32 getElementIndex(const u32 &level, const u32 &localIndex) const
Definition GxOctree.h:216
~GxOctree(void) override
デストラクタ
Definition GxOctree.cpp:86
virtual GxOctree::GxNode * allocateNode(void)
GxNodeのメモリ確保
Definition GxOctree.cpp:138
u32 getMortonCode(const u32 &x, const u32 &y, const u32 &z) const
モートン順序のコードを取得
Definition GxOctree.cpp:198
b32 updateTreeSize(GxVector3 &min, GxVector3 &max)
ツリーのサイズを更新
Definition GxOctree.cpp:316
GX_FORCE_INLINE const GxVector3 & getMax(void) const
Definition GxOctree.h:188
GX_FORCE_INLINE const GxVector3 & getMin(void) const
Definition GxOctree.h:181
GX_FORCE_INLINE const GxArray & getNodeArray(void) const
ノード配列を取得
Definition GxOctree.h:167
軸方向固定の箱形状クラス
Definition GxShape.h:418
static constexpr u32 THREAD_MAX
スレッドの最大数
Definition GxThread.h:188
3次元ベクトル
Definition GxVector.h:245
32bitブーリアン
Definition GxDefine.h:173