OPC_TreeBuilders.h
Go to the documentation of this file.
1 /*
3  * OPCODE - Optimized Collision Detection
4  * Copyright (C) 2001 Pierre Terdiman
5  * Homepage: http://www.codercorner.com/Opcode.htm
6  */
8 
10 
16 
19 // Include Guard
20 #ifndef __OPC_TREEBUILDERS_H__
21 #define __OPC_TREEBUILDERS_H__
22 
25  {
26  // Primitive split
27  SPLIT_LARGEST_AXIS = (1<<0),
29  SPLIT_BEST_AXIS = (1<<2),
30  SPLIT_BALANCED = (1<<3),
31  SPLIT_FIFTY = (1<<4),
32  // Node split
33  SPLIT_GEOM_CENTER = (1<<5),
34  //
35  SPLIT_FORCE_DWORD = 0x7fffffff
36  };
37 
40  {
41  inline_ BuildSettings() : mLimit(1), mRules(SPLIT_FORCE_DWORD) {}
42 
45  };
46 
48  {
49  public:
52  mNbPrimitives(0),
53  mNodeBase(null),
54  mCount(0),
55  mNbInvalidSplits(0) {}
57  virtual ~AABBTreeBuilder() {}
58 
60 
67  virtual bool ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const = 0;
69 
71 
77  virtual float GetSplittingValue(udword index, udword axis) const = 0;
79 
81 
89  virtual float GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const
91  {
92  // Default split value = middle of the axis (using only the box)
93  return global_box.GetCenter(axis);
94  }
95 
97 
104  virtual BOOL ValidateSubdivision(const udword* primitives, udword nb_prims, const AABB& global_box)
106  {
107  // Check the user-defined limit
108  if(nb_prims<=mSettings.mLimit) return FALSE;
109 
110  return TRUE;
111  }
112 
115  void* mNodeBase;
116  // Stats
117  inline_ void SetCount(udword nb) { mCount=nb; }
118  inline_ void IncreaseCount(udword nb) { mCount+=nb; }
119  inline_ udword GetCount() const { return mCount; }
120  inline_ void SetNbInvalidSplits(udword nb) { mNbInvalidSplits=nb; }
121  inline_ void IncreaseNbInvalidSplits() { mNbInvalidSplits++; }
122  inline_ udword GetNbInvalidSplits() const { return mNbInvalidSplits; }
123 
124  private:
127  };
128 
130  {
131  public:
133  AABBTreeOfVerticesBuilder() : mVertexArray(null) {}
136 
137  override(AABBTreeBuilder) bool ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const;
138  override(AABBTreeBuilder) float GetSplittingValue(udword index, udword axis) const;
139  override(AABBTreeBuilder) float GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const;
140 
142  };
143 
145  {
146  public:
148  AABBTreeOfAABBsBuilder() : mAABBArray(null) {}
151 
152  override(AABBTreeBuilder) bool ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const;
153  override(AABBTreeBuilder) float GetSplittingValue(udword index, udword axis) const;
154 
155  const AABB* mAABBArray;
156  };
157 
159  {
160  public:
165 
166  override(AABBTreeBuilder) bool ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const;
167  override(AABBTreeBuilder) float GetSplittingValue(udword index, udword axis) const;
168  override(AABBTreeBuilder) float GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const;
169 
171  };
172 
173 #endif // __OPC_TREEBUILDERS_H__
AABBTreeBuilder::SetNbInvalidSplits
inline_ void SetNbInvalidSplits(udword nb)
Definition: OPC_TreeBuilders.h:120
AABBTreeOfAABBsBuilder
Definition: OPC_TreeBuilders.h:144
AABBTreeOfTrianglesBuilder::AABBTreeOfTrianglesBuilder
AABBTreeOfTrianglesBuilder()
Constructor.
Definition: OPC_TreeBuilders.h:162
AABBTreeOfAABBsBuilder::AABBTreeOfAABBsBuilder
AABBTreeOfAABBsBuilder()
Constructor.
Definition: OPC_TreeBuilders.h:148
AABBTreeBuilder::mNbPrimitives
udword mNbPrimitives
Total number of primitives.
Definition: OPC_TreeBuilders.h:114
SPLIT_BALANCED
@ SPLIT_BALANCED
Try to keep a well-balanced tree.
Definition: OPC_TreeBuilders.h:30
udword
unsigned int udword
sizeof(udword) must be 4
Definition: IceTypes.h:65
AABBTreeOfAABBsBuilder::mAABBArray
const AABB * mAABBArray
Shortcut to an app-controlled array of AABBs.
Definition: OPC_TreeBuilders.h:155
SPLIT_FIFTY
@ SPLIT_FIFTY
Arbitrary 50-50 split.
Definition: OPC_TreeBuilders.h:31
BOOL
int BOOL
Another boolean type.
Definition: IceTypes.h:102
AABBTreeBuilder::mNodeBase
void * mNodeBase
Address of node pool [Opcode 1.3].
Definition: OPC_TreeBuilders.h:115
AABBTreeOfVerticesBuilder::~AABBTreeOfVerticesBuilder
virtual ~AABBTreeOfVerticesBuilder()
Destructor.
Definition: OPC_TreeBuilders.h:135
SPLIT_GEOM_CENTER
@ SPLIT_GEOM_CENTER
Split at geometric center (else split in the middle)
Definition: OPC_TreeBuilders.h:33
AABB::GetCenter
inline_ void GetCenter(Point &center) const
Get box center.
Definition: IceAABB.h:353
AABBTreeBuilder::GetNbInvalidSplits
inline_ udword GetNbInvalidSplits() const
Definition: OPC_TreeBuilders.h:122
AABBTreeBuilder::GetCount
inline_ udword GetCount() const
Definition: OPC_TreeBuilders.h:119
AABBTreeBuilder::GetSplittingValue
virtual float GetSplittingValue(udword index, udword axis) const =0
AABBTreeBuilder::IncreaseCount
inline_ void IncreaseCount(udword nb)
Definition: OPC_TreeBuilders.h:118
AABBTreeOfAABBsBuilder::~AABBTreeOfAABBsBuilder
virtual ~AABBTreeOfAABBsBuilder()
Destructor.
Definition: OPC_TreeBuilders.h:150
SPLIT_LARGEST_AXIS
@ SPLIT_LARGEST_AXIS
Split along the largest axis.
Definition: OPC_TreeBuilders.h:27
AABBTreeOfTrianglesBuilder
Definition: OPC_TreeBuilders.h:158
AABBTreeBuilder::ComputeGlobalBox
virtual bool ComputeGlobalBox(const udword *primitives, udword nb_prims, AABB &global_box) const =0
AABBTreeBuilder::mSettings
BuildSettings mSettings
Splitting rules & split limit [Opcode 1.3].
Definition: OPC_TreeBuilders.h:113
SPLIT_SPLATTER_POINTS
@ SPLIT_SPLATTER_POINTS
Splatter primitive centers (QuickCD-style)
Definition: OPC_TreeBuilders.h:28
AABBTreeOfVerticesBuilder
Definition: OPC_TreeBuilders.h:129
AABBTreeOfVerticesBuilder::mVertexArray
const Point * mVertexArray
Shortcut to an app-controlled array of vertices.
Definition: OPC_TreeBuilders.h:141
AABBTreeBuilder::AABBTreeBuilder
AABBTreeBuilder()
Constructor.
Definition: OPC_TreeBuilders.h:51
AABBTreeBuilder::IncreaseNbInvalidSplits
inline_ void IncreaseNbInvalidSplits()
Definition: OPC_TreeBuilders.h:121
BuildSettings::mRules
udword mRules
Building/Splitting rules (a combination of SplittingRules flags)
Definition: OPC_TreeBuilders.h:44
TRUE
#define TRUE
Definition: OPC_IceHook.h:13
AABBTreeBuilder::mCount
udword mCount
Stats: number of nodes created.
Definition: OPC_TreeBuilders.h:125
AABBTreeBuilder
Definition: OPC_TreeBuilders.h:47
AABBTreeBuilder::mNbInvalidSplits
udword mNbInvalidSplits
Stats: number of invalid splits.
Definition: OPC_TreeBuilders.h:126
AABBTreeOfVerticesBuilder::AABBTreeOfVerticesBuilder
AABBTreeOfVerticesBuilder()
Constructor.
Definition: OPC_TreeBuilders.h:133
FALSE
#define FALSE
Definition: OPC_IceHook.h:9
SPLIT_FORCE_DWORD
@ SPLIT_FORCE_DWORD
Definition: OPC_TreeBuilders.h:35
AABBTreeBuilder::~AABBTreeBuilder
virtual ~AABBTreeBuilder()
Destructor.
Definition: OPC_TreeBuilders.h:57
OPCODE_API
#define OPCODE_API
Definition: Opcode.h:68
BuildSettings::BuildSettings
inline_ BuildSettings()
Definition: OPC_TreeBuilders.h:41
Point
Definition: IcePoint.h:25
SplittingRules
SplittingRules
Tree splitting rules.
Definition: OPC_TreeBuilders.h:24
MeshInterface
Definition: OPC_MeshInterface.h:53
SPLIT_BEST_AXIS
@ SPLIT_BEST_AXIS
Try largest axis, then second, then last.
Definition: OPC_TreeBuilders.h:29
inline_
#define inline_
Definition: IcePreprocessor.h:103
AABB
Definition: IceAABB.h:267
AABBTreeOfTrianglesBuilder::~AABBTreeOfTrianglesBuilder
virtual ~AABBTreeOfTrianglesBuilder()
Destructor.
Definition: OPC_TreeBuilders.h:164
BuildSettings
Simple wrapper around build-related settings [Opcode 1.3].
Definition: OPC_TreeBuilders.h:39
AABBTreeOfTrianglesBuilder::mIMesh
const MeshInterface * mIMesh
Shortcut to an app-controlled mesh interface.
Definition: OPC_TreeBuilders.h:170
null
#define null
our own NULL pointer
Definition: IceTypes.h:57
AABBTreeBuilder::SetCount
inline_ void SetCount(udword nb)
Definition: OPC_TreeBuilders.h:117
BuildSettings::mLimit
udword mLimit
Limit number of primitives / node. If limit is 1, build a complete tree (2*N-1 nodes)
Definition: OPC_TreeBuilders.h:43


openhrp3
Author(s): AIST, General Robotix Inc., Nakamura Lab of Dept. of Mechano Informatics at University of Tokyo
autogenerated on Wed Sep 7 2022 02:51:04