AnimatLab  2
Test
OsgCalculateBoundingBox.h
1 #include <osg/NodeVisitor>
2 #include <osg/BoundingBox>
3 #include <osg/BoundingSphere>
4 #include <osg/MatrixTransform>
5 #include <osg/Billboard>
6 
7 namespace OsgAnimatSim
8 {
9 
10  class ANIMAT_OSG_PORT OsgCalculateBoundingBox : public osg::NodeVisitor {
11 
12  public:
13 
14  OsgCalculateBoundingBox() : NodeVisitor( NodeVisitor::TRAVERSE_ALL_CHILDREN ) {
15  // ----------------------------------------------------------------------
16  //
17  // Default Public Class Constructor
18  //
19  // ----------------------------------------------------------------------
20 
21  m_transformMatrix.makeIdentity();
22 
23  }
24 
25 
26 
27  virtual ~OsgCalculateBoundingBox() {}
28 
29 
30  virtual
31  void apply( osg::Geode &geode ) {
32  // -------------------------------------------
33  //
34  // Handle nodes of the type osg::Geode
35  //
36  // -------------------------------------------
37 
38  if(geode.getNumDrawables() > 0) {
39  osg::BoundingBox bbox;
40 
41  //
42  // update bounding box for each drawable
43  //
44  for( unsigned int i = 0; i < geode.getNumDrawables(); ++i ){
45 
46  //
47  // expand the overall bounding box
48  //
49 
50  bbox.expandBy( geode.getDrawable( i )->getBound());
51  }
52 
53  //
54  // transform corners by current matrix
55  //
56  osg::BoundingBox bboxTrans;
57 
58  for( unsigned int i = 0; i < 8; ++i ) {
59 
60  osg::Vec3 xvec = bbox.corner( i ) * m_transformMatrix;
61 
62  bboxTrans.expandBy( xvec );
63 
64  }
65 
66  //
67  // update the overall bounding box size
68  //
69  m_boundingBox.expandBy( bboxTrans );
70 
71  //
72  // continue traversing through the graph
73  //
74  traverse( geode );
75  }
76  } // ::apply(osg::Geode &geode)
77 
78 
79  virtual
80  void apply( osg::MatrixTransform &node ) {
81  // ---------------------------------------------------------
82  //
83  // Handle nodes of the type osg::MatrixTransform
84  //
85  // ---------------------------------------------------------
86 
87  m_transformMatrix *= node.getMatrix();
88 
89  //
90  // continue traversing through the graph
91  //
92  traverse( node );
93 
94  } // ::apply(osg::MatrixTransform &node)
95 
96 
97  virtual
98  void apply( osg::Billboard &node ){
99  // -----------------------------------------------
100  //
101  // Handle nodes of the type osg::Billboard
102  //
103  // -----------------------------------------------
104 
105  //
106  // important to handle billboard so that its size will
107  // not affect the geode size continue traversing the graph
108  //
109  traverse( node );
110 
111  } // ::apply(osg::MatrixTransform &node)
112 
113 
114  //
115  // return teh bounding box
116  //
117  osg::BoundingBox &getBoundBox() { return m_boundingBox; }
118 
119  protected :
120 
121  osg::BoundingBox m_boundingBox; // the overall resultant bounding box
122  osg::Matrix m_transformMatrix; // the current transform matrix
123 
124 
125  }; // class OsgCalculateBoundingBox
126 
127 }// end OsgAnimatSim
Classes for implementing the cm-labs vortex physics engine for AnimatLab.