00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00027
00029 #ifndef __MATRIXTRANSFORM_H__
00030 #define __MATRIXTRANSFORM_H__
00031
00032 #include "X3DGroupingNode.h"
00033
00034 namespace H3D {
00035
00059 class H3DAPI_API MatrixTransform : public X3DGroupingNode {
00060 public:
00061 typedef H3D::SFMatrix4f SFMatrix4f;
00062
00073 class H3DAPI_API SFTransformedBound:
00074 public TypedField< SFBound, Types< SFMatrix4f, SFBound > > {
00075 public:
00076
00080 ~SFTransformedBound() {
00081 value = NULL;
00082 }
00083
00084 protected:
00086 virtual void update();
00087
00091 virtual void onAdd( Bound *b ) {
00092 SFBound::onAdd( b );
00093 TransformedBoxBound *tbb = dynamic_cast< TransformedBoxBound * >( b );
00094 if( b && tbb ) {
00095 MatrixTransform *mt = static_cast< MatrixTransform * >(owner);
00096 mt->bound->route( tbb->boxBound );
00097 mt->matrix->route( tbb->matrix );
00098 }
00099 }
00100
00102 virtual void onRemove( Bound *b ) {
00103 TransformedBoxBound *tbb = dynamic_cast< TransformedBoxBound * >( b );
00104 if( b && tbb ) {
00105 MatrixTransform *mt = static_cast< MatrixTransform * >(owner);
00106 mt->bound->unroute( tbb->boxBound );
00107 mt->matrix->unroute( tbb->matrix );
00108 }
00109 SFBound::onRemove( b );
00110 }
00111
00112 friend class MatrixTransform;
00113 };
00114
00116 MatrixTransform( Inst< MFChild > _addChildren = 0,
00117 Inst< MFChild > _removeChildren = 0,
00118 Inst< MFChild > _children = 0,
00119 Inst< SFNode > _metadata = 0,
00120 Inst< SFBound > _bound = 0,
00121 Inst< SFVec3f > _bboxCenter = 0,
00122 Inst< SFVec3f > _bboxSize = 0,
00123 Inst< SFTransformedBound > _transformedBound = 0,
00124 Inst< SFMatrix4f > _matrix = 0,
00125 Inst< SFMatrix4f > _accumulatedForward = 0,
00126 Inst< SFMatrix4f > _accumulatedInverse = 0 );
00127
00128 virtual void render();
00129
00130 #ifdef USE_HAPTICS
00131
00132 virtual void traverseSG( TraverseInfo &ti );
00133 #endif
00134
00141
00142 auto_ptr< SFMatrix4f > matrix;
00143
00148
00149 auto_ptr< SFMatrix4f > accumulatedForward;
00150
00155
00156 auto_ptr< SFMatrix4f > accumulatedInverse;
00157
00164 auto_ptr< SFTransformedBound > transformedBound;
00165
00167 static H3DNodeDatabase database;
00168 };
00169 }
00170
00171 #endif