00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 #ifndef _SO_INTERPOLATE_
00051 #define _SO_INTERPOLATE_
00052
00053 #include <Inventor/SoDB.h>
00054 #include <Inventor/engines/SoSubEngine.h>
00055 #include <Inventor/fields/SoSFFloat.h>
00056 #include <Inventor/fields/SoMFFloat.h>
00057 #include <Inventor/fields/SoMFRotation.h>
00058 #include <Inventor/fields/SoMFVec2f.h>
00059 #include <Inventor/fields/SoMFVec2i32.h>
00060 #include <Inventor/fields/SoMFVec2s.h>
00061 #include <Inventor/fields/SoMFVec3f.h>
00062 #include <Inventor/fields/SoMFVec4f.h>
00063
00065
00066
00067
00068
00069
00070
00071
00073
00100 class SoInterpolate : public SoEngine {
00101
00102 SO_ENGINE_ABSTRACT_HEADER(SoInterpolate);
00103
00104 public:
00108 SoSFFloat alpha;
00113 SoEngineOutput output;
00114
00115 private:
00116 static void initClass();
00117 static void exitClass();
00118 static void initClasses();
00119 static void exitClasses();
00120
00121 private:
00122 SoInterpolate();
00123
00124 static int findMax(int a, int b) { return (a > b) ? a : b; }
00125 static int clamp(int i, int n) { return (i < n) ? i : n-1; }
00126
00127 ~SoInterpolate();
00128 };
00129
00131
00132
00133
00134
00136
00137
00138
00139
00140
00141
00142 #define SO_INTERPOLATE_HEADER(className) \
00143 \
00144 SO_ENGINE_HEADER(className); \
00145 \
00146 private: \
00147 ~className(); \
00148 \
00151 virtual void evaluate(); \
00152 \
00153 private:\
00154 static void initClass(); \
00155 static void exitClass(); \
00156 \
00157 public: \
00158 \
00159 className()
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 #define SO_INTERPOLATE_SOURCE(className, type, \
00170 valType, defaultVal0, defaultVal1, interpVal) \
00171 \
00172 SO_ENGINE_SOURCE(className) \
00173 \
00174 className::className() \
00175 { \
00176 SO_ENGINE_CONSTRUCTOR(className); \
00177 SO_ENGINE_ADD_INPUT(alpha, (0.0)); \
00178 SO_ENGINE_ADD_INPUT(input0, defaultVal0); \
00179 SO_ENGINE_ADD_INPUT(input1, defaultVal1); \
00180 SO_ENGINE_ADD_OUTPUT(output, type); \
00181 isBuiltIn = TRUE; \
00182 } \
00183 \
00184 className::~className() \
00185 { \
00186 } \
00187 \
00188 void \
00189 className::evaluate() \
00190 { \
00191 int n0 = input0.getNum(); \
00192 int n1 = input1.getNum(); \
00193 float a = alpha.getValue(); \
00194 for (int i=findMax(n0,n1)-1; i>=0; i--) { \
00195 valType v0 = input0[clamp(i,n0)]; \
00196 valType v1 = input1[clamp(i,n1)]; \
00197 SO_ENGINE_OUTPUT(output, type, set1Value(i, interpVal)); \
00198 } \
00199 }
00200
00202
00203
00204
00205
00206
00207
00208
00209
00210 #define SO_INTERPOLATE_INITCLASS(className, classPrintName) \
00211 \
00212 void \
00213 className::initClass() \
00214 { \
00215 SO__ENGINE_INIT_CLASS(className, classPrintName, SoInterpolate); \
00216 }
00217
00218 #define SO_INTERPOLATE_EXITCLASS(className) \
00219 \
00220 void \
00221 className::exitClass() \
00222 { \
00223 SO_ENGINE_EXIT_CLASS(className); \
00224 }
00225
00227
00228
00229
00231
00265 class SoInterpolateFloat : public SoInterpolate {
00266 SO_INTERPOLATE_HEADER(SoInterpolateFloat);
00267 public:
00271 SoMFFloat input0;
00272
00276 SoMFFloat input1;
00277
00278
00280
00281
00282
00284 };
00285
00319 class SoInterpolateRotation : public SoInterpolate {
00320 SO_INTERPOLATE_HEADER(SoInterpolateRotation);
00321 public:
00325 SoMFRotation input0;
00326
00330 SoMFRotation input1;
00331
00332
00334
00335
00336
00338 };
00339
00373 class SoInterpolateVec2f : public SoInterpolate {
00374 SO_INTERPOLATE_HEADER(SoInterpolateVec2f);
00375 public:
00379 SoMFVec2f input0;
00380
00384 SoMFVec2f input1;
00385
00386
00388
00389
00390
00392 };
00393
00427 class SoInterpolateVec3f : public SoInterpolate {
00428 SO_INTERPOLATE_HEADER(SoInterpolateVec3f);
00429 public:
00433 SoMFVec3f input0;
00434
00438 SoMFVec3f input1;
00439
00440
00442
00443
00444
00446 };
00447
00481 class SoInterpolateVec4f : public SoInterpolate {
00482 SO_INTERPOLATE_HEADER(SoInterpolateVec4f);
00483 public:
00487 SoMFVec4f input0;
00488
00492 SoMFVec4f input1;
00493
00494
00496
00497
00498
00500 };
00501
00502 #endif
00503
00504
00505
00506
00507
00508
00509