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 __X3DINTERPOLATORNODE_H__
00030 #define __X3DINTERPOLATORNODE_H__
00031
00032 #include "X3DChildNode.h"
00033 #include "SFFloat.h"
00034 #include "MFFloat.h"
00035
00036 namespace H3D {
00037
00098 class H3DAPI_API X3DInterpolatorNode : public X3DChildNode {
00099 public:
00100
00102 X3DInterpolatorNode( Inst< SFNode > _metadata = 0,
00103 Inst< SFFloat > _set_fraction = 0,
00104 Inst< MFFloat > _key = 0 );
00105
00109 int lookupKey( H3DFloat f, H3DFloat &w ) {
00110 vector<H3DFloat> keys = key->getValue();
00111 if ( f <= keys[0] ) {
00112 w = 0;
00113 return 0;
00114 }
00115 if ( f >= keys[keys.size()-1] ) {
00116 w = 1;
00117 return keys.size();
00118 }
00119 for( int i = keys.size()-1; i >= 0; i--) {
00120 if ( f > keys[i] ) {
00121 w = (f-keys[i])/(keys[i+1]-keys[i]);
00122 if( w < 0 ) w = 0;
00123 if( w > 1 ) w = 1;
00124 return i;
00125 }
00126 }
00127 return -1;
00128 }
00129
00130 auto_ptr< SFFloat > set_fraction;
00131 auto_ptr< MFFloat > key;
00132
00134 static H3DNodeDatabase database;
00135 };
00136 }
00137
00138 #endif