Vegastrike 0.5.1 rc1  1.0
Original sources for Vegastrike Evolved
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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:
125  udword mCount;
126  udword mNbInvalidSplits;
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__