83#define AABNODE_ATTRIBUTE_FRONT_CHILD 0x00000001
84#define AABNODE_ATTRIBUTE_BACK_CHILD 0x00000002
128 for (nidx = 0; nidx <
NodeCount; nidx++) {
148 "AABTreeCullSystemClass::Add -- Object is already in another culling system!\n"
154 if (node_index == -1) {
238 int get_max_depth = 0;
240 return get_max_depth;
263 if (cur_depth > max_depth) {
264 max_depth = cur_depth;
282 big_child = small_child;
311 "AABTreeCullSystemClass::Add_Loaded_Object -- Object is already in another culling system!\n"
328 RootNode->Transfer_Objects(dummy_node);
359 RootNode->Transfer_Objects(dummy_node);
387 while (obj !=
NULL) {
389 obj = get_first_object(dummy_node);
397 RootNode->Box.Extent.Set(FLT_MAX,FLT_MAX,FLT_MAX);
413 if ((node_id >= 0) && (node_id <
NodeCount)) {
423 Stats.NodesAccepted = 0;
424 Stats.NodesTriviallyAccepted = 0;
425 Stats.NodesRejected = 0;
442 obj = get_next_object(obj);
484 obj = get_next_object(obj);
527 obj = get_next_object(obj);
571 obj = get_next_object(obj);
617 obj = get_next_object(obj);
653 obj = get_next_object(obj);
691 obj = get_next_object(obj);
709 WWDEBUG_SAY((
"Attempting to read an obsolete AAB-Tree!"));
716 cload.
Read(&version,
sizeof(version));
718 WWDEBUG_SAY((
"Attempting to read an obsolete AAB-Tree!"));
752 cload.
Read(&node_desc,
sizeof(node_desc));
819 memset(&node_desc,0,
sizeof(node_desc));
861 cload.
Read(&index,
sizeof(index));
880 csave.
Write(&index,
sizeof(index));
955 Front->Compute_Bounding_Box();
959 Back->Compute_Bounding_Box();
1007 if (update_bounds) {
1030 if (curobj == obj) {
1061 Front->Transfer_Objects(dummy_node);
1065 Back->Transfer_Objects(dummy_node);
1088 while (obj && (count != index)) {
1110 if (obj_count <= 2)
return;
1117 while (obj !=
NULL) {
1119 obj = get_next_object(obj);
1134 if (sc.
Cost == FLT_MAX) {
1150 Front->Parent =
this;
1162 Back->Parent =
this;
1232 if (boxes.
Count() <= 1)
return;
1244 if (sc.
Cost == FLT_MAX) {
1260 if (frontboxes.
Count() > 0) {
1262 Front->Parent =
this;
1271 if (backboxes.
Count() > 0) {
1273 Back->Parent =
this;
1291 for (
int i=0; i<boxes.
Count(); i++) {
1297 frontboxes.
Add(box);
1327 const int NUM_TRYS = 300;
1332 int objcount = boxes.
Count();
1334 for (trys = 0; trys <
MIN(NUM_TRYS,objcount); trys++) {
1342 obj_index = rand() % objcount;
1349 switch(rand() % 6) {
1371 if ((trys >=
MIN(NUM_TRYS,objcount)) && (sc->
Cost == FLT_MAX)) {
1386 int objcount = boxes.
Count();
1387 for (
int obj_index = 0; obj_index < objcount; obj_index++) {
1395 for (
int plane_index = 0; plane_index < 6; plane_index++) {
1397 switch(plane_index % 6) {
1406 test.FrontBox.Init_Empty();
1407 test.BackBox.Init_Empty();
1423 if (sc->
Cost == FLT_MAX) {
1424 WWDEBUG_SAY((
"Unable to split node! objcount = %d. (%.2f,%.2f,%.2f)\r\n",objcount,
Box.Center.X,
Box.Center.Y,
Box.Center.Z));
1440 for (
int i=0; i<boxes.
Count(); i++) {
1463 sc->
Cost = front_cost + back_cost;
1494 if (CurNodeIndex != 0) {
1495 CurNodeIndex = Tree->IndexedNodes[CurNodeIndex]->Parent->Index;
1505 if (CurNodeIndex != 0) {
1517 if ((parent_front ==
NULL) || (parent_back ==
NULL)) {
1524 if ((
int)parent_front->
Index == CurNodeIndex) {
1525 CurNodeIndex = parent_back->
Index;
1532 if ((
int)parent_back->
Index == (
int)CurNodeIndex) {
1533 CurNodeIndex = parent_front->
Index;
1543 return (Tree->IndexedNodes[CurNodeIndex]->Front !=
NULL);
1550 CurNodeIndex = Tree->IndexedNodes[CurNodeIndex]->Front->Index;
1559 return (Tree->IndexedNodes[CurNodeIndex]->Back !=
NULL);
1565 CurNodeIndex = Tree->IndexedNodes[CurNodeIndex]->Back->Index;
1573 return CurNodeIndex;
1578 Tree->Get_Node_Bounds(CurNodeIndex,set_box);
1581void AABTreeIterator::validate(
void)
1583 if ((CurNodeIndex < 0) || (CurNodeIndex >= Tree->
NodeCount)) {
#define WRITE_MICRO_CHUNK(csave, id, var)
#define READ_MICRO_CHUNK(cload, id, var)
const uint32 AABTREE_CURRENT_VERSION
@ AABTREE_CHUNK_AABNODE_VARIABLES
@ AABTREE_VARIABLE_USERDATA
@ AABTREE_VARIABLE_NODESTRUCT
@ AABTREE_CHUNK_AABNODE_INFO
@ AABTREE_CHUNK_NODE_INDEX
@ AABTREE_CHUNK_AABNODE_CONTENTS
#define AABNODE_ATTRIBUTE_FRONT_CHILD
#define AABNODE_ATTRIBUTE_BACK_CHILD
int Partition_Tree_Depth(void) const
void Update_Bounding_Boxes_Recursive(AABTreeNodeClass *node)
void Update_Bounding_Boxes(void)
void Partition_Tree_Depth_Recursive(AABTreeNodeClass *node, int cur_depth, int &max_depth) const
virtual void Load_Node_Contents(AABTreeNodeClass *, ChunkLoadClass &)
void Load_Object_Linkage(ChunkLoadClass &cload, CullableClass *obj)
void Add_Object_Internal(CullableClass *obj, int node_index=-1)
void Remove_Object_Internal(CullableClass *obj)
const AABoxClass & Get_Bounding_Box(void)
void Re_Index_Nodes_Recursive(AABTreeNodeClass *node, int &counter)
AABTreeNodeClass ** IndexedNodes
void Save_Object_Linkage(ChunkSaveClass &csave, CullableClass *obj)
void Add_Loaded_Object(AABTreeNodeClass *node, CullableClass *obj)
virtual void Update_Culling(CullableClass *obj)
int Object_Count(void) const
virtual ~AABTreeCullSystemClass(void)
int Partition_Node_Count_Recursive(AABTreeNodeClass *node) const
void Collect_Objects_Recursive(AABTreeNodeClass *node)
const StatsStruct & Get_Statistics(void)
virtual void Save_Node_Contents(AABTreeNodeClass *, ChunkSaveClass &)
int Partition_Node_Count(void) const
void NODE_TRIVIALLY_ACCEPTED(void)
void Get_Node_Bounds(int node_id, AABoxClass *set_bounds)
virtual void Collect_Objects(const Vector3 &point)
virtual void Load(ChunkLoadClass &cload)
void Re_Index_Nodes(void)
void Add_Object_Recursive(AABTreeNodeClass *node, CullableClass *obj)
void Save_Nodes(AABTreeNodeClass *node, ChunkSaveClass &csave)
AABTreeNodeClass * RootNode
virtual void Save(ChunkSaveClass &csave)
void Reset_Statistics(void)
AABTreeCullSystemClass(void)
void Load_Nodes(AABTreeNodeClass *node, ChunkLoadClass &cload)
bool Enter_Back_Child(void)
void Get_Current_Box(AABoxClass *set_box)
bool Has_Front_Child(void)
bool Has_Back_Child(void)
AABTreeIterator(AABTreeCullSystemClass *tree)
bool Enter_Front_Child(void)
int Get_Current_Node_Index(void)
CullableClass * NextObject
void Add_Object(CullableClass *obj, bool update_bounds=true)
void Transfer_Objects(AABTreeNodeClass *dummy_node)
void Compute_Score(SplitChoiceStruct *sc, SimpleDynVecClass< AABoxClass > &boxes)
AABTreeNodeClass * Parent
void Split_Boxes(const SplitChoiceStruct &sc, SimpleDynVecClass< AABoxClass > &boxes, SimpleDynVecClass< AABoxClass > &frontboxes, SimpleDynVecClass< AABoxClass > &backboxes)
CullableClass * Peek_Object(int index)
float Compute_Volume(void)
void Select_Splitting_Plane_Brute_Force(SplitChoiceStruct *sc, SimpleDynVecClass< AABoxClass > &boxes)
void Select_Splitting_Plane(SplitChoiceStruct *sc, SimpleDynVecClass< AABoxClass > &boxes)
void Split_Objects(const SplitChoiceStruct &sc, AABTreeNodeClass *front, AABTreeNodeClass *back)
void Remove_Object(CullableClass *obj)
void Compute_Bounding_Box(void)
void Compute_Local_Bounding_Box(void)
void Init_Min_Max(const Vector3 &min, const Vector3 &max)
WWINLINE bool Contains(const Vector3 &point) const
uint32 Cur_Micro_Chunk_ID()
uint32 Read(void *buf, uint32 nbytes)
uint32 Write(const void *buf, uint32 nbytes)
bool Begin_Chunk(uint32 id)
static OverlapType Overlap_Test(const AAPlaneClass &plane, const Vector3 &point)
WWINLINE void Set_Culling_System(CullSystemClass *sys)
friend class CullableClass
void Add_To_Collection(CullableClass *obj)
WWINLINE CullLinkClass * Get_Cull_Link(void) const
WWINLINE const AABoxClass & Get_Cull_Box(void) const
WWINLINE void Set_Cull_Link(CullLinkClass *c)
CullSystemClass * Get_Culling_System(void) const
WWINLINE float Volume(void) const
void Add_Box(const MinMaxAABoxClass &box)
WWINLINE void Release_Ref(void) const
void Delete_All(bool allow_shrink=true)
bool Add(T const &object, int new_size_hint=0)
virtual bool Resize(int newsize)
WWINLINE void Set(float x, float y, float z)
#define DEFINE_AUTO_POOL(T, BLOCKSIZE)
MinMaxAABoxClass FrontBox
#define WWASSERT_PRINT(expr, string)