OgreVolumeOctreeNode.h
Go to the documentation of this file.
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of OGRE
4 (Object-oriented Graphics Rendering Engine)
5 For the latest info, see http://www.ogre3d.org/
6 
7 Copyright (c) 2000-2013 Torus Knot Software Ltd
8 
9 Permission is hereby granted, free of charge, to any person obtaining a copy
10 of this software and associated documentation files (the "Software"), to deal
11 in the Software without restriction, including without limitation the rights
12 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13 copies of the Software, and to permit persons to whom the Software is
14 furnished to do so, subject to the following conditions:
15 
16 The above copyright notice and this permission notice shall be included in
17 all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 THE SOFTWARE.
26 -----------------------------------------------------------------------------
27 */
28 #ifndef __Ogre_Volume_OctreeNode_H__
29 #define __Ogre_Volume_OctreeNode_H__
30 
31 #include "OgreMatrix3.h"
32 #include "OgreEntity.h"
33 #include "OgreSceneManager.h"
34 #include "OgreManualObject.h"
37 
38 namespace Ogre {
39 namespace Volume {
40 
41  class OctreeNodeSplitPolicy;
42 
46  {
47  protected:
48 
50  static const Real NEAR_FACTOR;
51 
54 
56  static size_t mNodeI;
57 
60 
63 
66 
69 
72 
78  void buildOctreeGridLines(ManualObject *manual) const;
79  public:
80 
82  static const size_t OCTREE_CHILDREN_COUNT;
83 
98  static inline void getChildrenDimensions(const Vector3 &from, const Vector3 &to, Vector3 &center, Vector3 &width, Vector3 &height, Vector3 &depth)
99  {
100  center = (to - from) / (Real)2.0;
101  width.x = center.x;
102  width.y = (Real)0.0;
103  width.z = (Real)0.0;
104  height.x = (Real)0.0;
105  height.y = center.y;
106  height.z = (Real)0.0;
107  depth.x = (Real)0.0;
108  depth.y = (Real)0.0;
109  depth.z = center.z;
110  center += from;
111  }
112 
119  OctreeNode(const Vector3 &from = Vector3::ZERO, const Vector3 &to = Vector3::ZERO);
120 
123  virtual ~OctreeNode(void);
124 
133  virtual OctreeNode* createInstance(const Vector3& from, const Vector3& to);
134 
143  void split(const OctreeNodeSplitPolicy *splitPolicy, const Source *src, const Real geometricError);
144 
152  Entity* getOctreeGrid(SceneManager *sceneManager);
153 
158  inline void setFrom(Vector3 from)
159  {
160  mFrom = from;
161  }
162 
167  inline void setTo(Vector3 to)
168  {
169  mTo = to;
170  }
171 
176  inline bool isSubdivided(void) const
177  {
178  return mChildren != 0;
179  }
180 
191  inline const OctreeNode* getChild(const size_t i) const
192  {
193  return mChildren[i];
194  }
195 
200  inline const Vector3 getCenter(void) const
201  {
202  return (mFrom + mTo) / (Real)2.0;
203  }
204 
209  inline const Vector3& getFrom(void) const
210  {
211  return mFrom;
212  }
213 
218  inline const Vector3& getTo(void) const
219  {
220  return mTo;
221  }
222 
229  inline bool isBorderLeft(const OctreeNode &root) const
230  {
231  return mFrom.x == root.mFrom.x;
232  }
233 
240  inline bool isBorderRight(const OctreeNode &root) const
241  {
242  return mTo.x == root.mTo.x;
243  }
244 
251  inline bool isBorderBottom(const OctreeNode &root) const
252  {
253  return mFrom.y == root.mFrom.y;
254  }
255 
262  inline bool isBorderTop(const OctreeNode &root) const
263  {
264  return mTo.y == root.mTo.y;
265  }
266 
273  inline bool isBorderBack(const OctreeNode &root) const
274  {
275  return mFrom.z == root.mFrom.z;
276  }
277 
284  inline bool isBorderFront(const OctreeNode &root) const
285  {
286  return mTo.z == root.mTo.z;
287  }
288 
293  inline const Vector3 getCenterBack(void) const
294  {
295  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mFrom.z);
296  }
297 
302  inline const Vector3 getCenterFront(void) const
303  {
304  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mTo.z);
305  }
306 
311  inline const Vector3 getCenterLeft(void) const
312  {
313  return Vector3(mFrom.x, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
314  }
315 
320  inline const Vector3 getCenterRight(void) const
321  {
322  return Vector3(mTo.x, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
323  }
324 
329  inline const Vector3 getCenterTop(void) const
330  {
331  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mTo.y, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
332  }
333 
338  inline const Vector3 getCenterBottom(void) const
339  {
340  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mFrom.y, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
341  }
342 
347  inline const Vector3 getCenterBackTop(void) const
348  {
349  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mTo.y, mFrom.z);
350  }
351 
356  inline const Vector3 getCenterBackBottom(void) const
357  {
358  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mFrom.y, mFrom.z);
359  }
360 
365  inline const Vector3 getCenterFrontTop(void) const
366  {
367  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mTo.y, mTo.z);
368  }
369 
374  inline const Vector3 getCenterFrontBottom(void) const
375  {
376  return Vector3(mFrom.x + (mTo.x - mFrom.x) / (Real)2.0, mFrom.y, mTo.z);
377  }
378 
383  inline const Vector3 getCenterLeftTop(void) const
384  {
385  return Vector3(mFrom.x, mTo.y, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
386  }
387 
392  inline const Vector3 getCenterLeftBottom(void) const
393  {
394  return Vector3(mFrom.x, mFrom.y, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
395  }
396 
401  inline const Vector3 getCenterRightTop(void) const
402  {
403  return Vector3(mTo.x, mTo.y, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
404  }
405 
410  inline const Vector3 getCenterRightBottom(void) const
411  {
412  return Vector3(mTo.x, mFrom.y, mFrom.z + (mTo.z - mFrom.z) / (Real)2.0);
413  }
414 
419  inline const Vector3 getCenterBackLeft(void) const
420  {
421  return Vector3(mFrom.x, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mFrom.z);
422  }
423 
428  inline const Vector3 getCenterFrontLeft(void) const
429  {
430  return Vector3(mFrom.x, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mTo.z);
431  }
432 
437  inline const Vector3 getCenterBackRight(void) const
438  {
439  return Vector3(mTo.x, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mFrom.z);
440  }
441 
446  inline const Vector3 getCenterFrontRight(void) const
447  {
448  return Vector3(mTo.x, mFrom.y + (mTo.y - mFrom.y) / (Real)2.0, mTo.z);
449  }
450 
455  inline const Vector3 getCorner1(void) const
456  {
457  return Vector3(mTo.x, mFrom.y, mFrom.z);
458  }
459 
464  inline const Vector3 getCorner2(void) const
465  {
466  return Vector3(mTo.x, mFrom.y, mTo.z);
467  }
468 
473  inline const Vector3 getCorner3(void) const
474  {
475  return Vector3(mFrom.x, mFrom.y, mTo.z);
476  }
477 
482  inline const Vector3 getCorner4(void) const
483  {
484  return Vector3(mFrom.x, mTo.y, mFrom.z);
485  }
486 
491  inline const Vector3 getCorner5(void) const
492  {
493  return Vector3(mTo.x, mTo.y, mFrom.z);
494  }
495 
500  inline const Vector3 getCorner7(void) const
501  {
502  return Vector3(mFrom.x, mTo.y, mTo.z);
503  }
504 
509  inline void setCenterValue(Vector4 value)
510  {
511  mCenterValue = value;
512  }
513 
518  inline const Vector4 getCenterValue(void) const
519  {
520  return mCenterValue;
521  }
522 
527  inline bool isIsoSurfaceNear(void) const
528  {
529  if (mCenterValue.w == (Real)0.0)
530  {
531  return true;
532  }
533  return Math::Abs(mCenterValue.w) < (mFrom - mTo).length() * NEAR_FACTOR;
534  }
535  };
536 }
537 }
538 
539 #endif
const Vector3 getCenterBack(void) const
Gets the center of the corners 0, 1, 4, 5.
const Vector3 & getFrom(void) const
Gets the back lower left corner of the cell.
const Vector3 getCenterRight(void) const
Gets the center of the corners 1, 2, 5, 6.
const Vector3 getCenterFrontBottom(void) const
Gets the center of the corners 2, 3.
bool isIsoSurfaceNear(void) const
Gets whether the isosurface is somewhat near to this node.
const Vector3 getCenterBackLeft(void) const
Gets the center of the corners 0, 4.
const Vector4 getCenterValue(void) const
Gets the center value.
const Vector3 getCenterFrontTop(void) const
Gets the center of the corners 6, 7.
const Vector3 getCenterBackTop(void) const
Gets the center of the corners 4, 5.
const Vector3 getCenterRightBottom(void) const
Gets the center of the corners 1, 2.
4-dimensional homogeneous vector.
Definition: OgreVector4.h:45
const Vector3 getCorner3(void) const
Gets the coordinate of corner 3.
float Real
Software floating point type.
Entity * mOctreeGrid
Holds the debug visualization of the octree. Just set in the root.
Vector3 mFrom
The back lower left corner of the cell.
void setCenterValue(Vector4 value)
Raw setter for the center value.
const Vector3 getCenterBottom(void) const
Gets the center of the corners 0, 1, 2, 3.
const Vector3 getCenterBackBottom(void) const
Gets the center of the corners 0, 1.
const Vector3 getCenterLeft(void) const
Gets the center of the corners 0, 3, 4, 6.
Class providing a much simplified interface to generating manual objects with custom geometry...
static Real Abs(Real fValue)
Absolute value function.
Definition: OgreMath.h:258
static const Real NEAR_FACTOR
Factor to the diagonal of the cell to decide whether this cell is near the isosurface or not...
const Vector3 getCenterFrontLeft(void) const
Gets the center of the corners 3, 7.
bool isBorderBottom(const OctreeNode &root) const
Gets whether this cell is at the bottom of the given root cell.
const Vector3 getCenterBackRight(void) const
Gets the center of the corners 1, 5.
Standard 3-dimensional vector.
Definition: OgreVector3.h:51
bool isBorderLeft(const OctreeNode &root) const
Gets whether this cell is at the left of the given root cell.
bool isSubdivided(void) const
Gets whether this cell has any children.
const Vector3 getCenterTop(void) const
Gets the center of the corners 4, 5, 6, 7.
static void getChildrenDimensions(const Vector3 &from, const Vector3 &to, Vector3 &center, Vector3 &width, Vector3 &height, Vector3 &depth)
Gets the center and width / height / depth vector of the children of a node.
void setFrom(Vector3 from)
Setter for the from-part of this cell.
bool isBorderBack(const OctreeNode &root) const
Gets whether this cell is at the back of the given root cell.
static const size_t OCTREE_CHILDREN_COUNT
Even in an OCtree, the amount of children should not be hardcoded.
const Vector3 & getTo(void) const
Gets the front upper right corner of the cell.
Vector3 mTo
The front upper right corner of the cell.
const Vector3 getCorner1(void) const
Gets the coordinate of corner 1.
const Vector3 getCenterFront(void) const
Gets the center of the corners 2, 3, 6, 7.
const Vector3 getCorner7(void) const
Gets the coordinate of corner 7.
A node in the volume octree.
unsigned int uint32
Definition: OgrePlatform.h:359
OctreeNode ** mChildren
The children of this node.
Vector4 mCenterValue
Density and gradient of the center.
const Vector3 getCenter(void) const
Gets the center of this cell.
const Vector3 getCorner5(void) const
Gets the coordinate of corner 5.
bool isBorderFront(const OctreeNode &root) const
Gets whether this cell is at the front of the given root cell.
const Vector3 getCorner4(void) const
Gets the coordinate of corner 4.
Defines an instance of a discrete, movable object based on a Mesh.
Definition: OgreEntity.h:82
bool isBorderTop(const OctreeNode &root) const
Gets whether this cell is at the top of the given root cell.
const Vector3 getCenterRightTop(void) const
Gets the center of the corners 5, 6.
The class deciding on whether to split an octree node or not when building the octree.
const Vector3 getCenterLeftTop(void) const
Gets the center of the corners 4, 7.
Abstract class defining the density function.
Manages the organisation and rendering of a &#39;scene&#39; i.e.
static uint32 mGridPositionCount
To count some indices while creating the debug view and recursing through the instances.
const Vector3 getCenterFrontRight(void) const
Gets the center of the corners 2, 6.
const Vector3 getCorner2(void) const
Gets the coordinate of corner 2.
const OctreeNode * getChild(const size_t i) const
Gets an octree child.
#define _OgreVolumeExport
static size_t mNodeI
To give the debug manual object an unique name.
Superclass for all objects that wish to use custom memory allocators when their new / delete operator...
void setTo(Vector3 to)
Setter for the to-part of this cell.
bool isBorderRight(const OctreeNode &root) const
Gets whether this cell is at the right of the given root cell.
const Vector3 getCenterLeftBottom(void) const
Gets the center of the corners 0, 3.
static const Vector3 ZERO
Definition: OgreVector3.h:800

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Mon Jan 2 2017 11:59:31