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
00101 class SoInterpolate : public SoEngine {
00102
00103 SO_ENGINE_ABSTRACT_HEADER(SoInterpolate);
00104
00105 public:
00109 SoSFFloat alpha;
00114 SoEngineOutput output;
00115
00116 private:
00117 static void initClass();
00118 static void exitClass();
00119 static void initClasses();
00120 static void exitClasses();
00121
00122 private:
00123 SoInterpolate();
00124
00125 static int findMax(int a, int b) { return (a > b) ? a : b; }
00126 static int clamp(int i, int n) { return (i < n) ? i : n-1; }
00127
00128 ~SoInterpolate();
00129 };
00130
00132
00133
00134
00135
00137
00138
00139
00140
00141
00142
00143 #define SO_INTERPOLATE_HEADER(className) \
00144 \
00145 SO_ENGINE_HEADER(className); \
00146 \
00147 private: \
00148 ~className(); \
00149 \
00152 virtual void evaluate(); \
00153 \
00154 private:\
00155 static void initClass(); \
00156 static void exitClass(); \
00157 \
00158 public: \
00159 \
00160 className()
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 #define SO_INTERPOLATE_SOURCE(className, type, \
00171 valType, defaultVal0, defaultVal1, interpVal) \
00172 \
00173 SO_ENGINE_SOURCE(className) \
00174 \
00175 className::className() \
00176 { \
00177 SO_ENGINE_CONSTRUCTOR(className); \
00178 SO_ENGINE_ADD_INPUT(alpha, (0.0)); \
00179 SO_ENGINE_ADD_INPUT(input0, defaultVal0); \
00180 SO_ENGINE_ADD_INPUT(input1, defaultVal1); \
00181 SO_ENGINE_ADD_OUTPUT(output, type); \
00182 isBuiltIn = TRUE; \
00183 } \
00184 \
00185 className::~className() \
00186 { \
00187 } \
00188 \
00189 void \
00190 className::evaluate() \
00191 { \
00192 int n0 = input0.getNum(); \
00193 int n1 = input1.getNum(); \
00194 float a = alpha.getValue(); \
00195 for (int i=findMax(n0,n1)-1; i>=0; i--) { \
00196 valType v0 = input0[clamp(i,n0)]; \
00197 valType v1 = input1[clamp(i,n1)]; \
00198 SO_ENGINE_OUTPUT(output, type, set1Value(i, interpVal)); \
00199 } \
00200 }
00201
00203
00204
00205
00206
00207
00208
00209
00210
00211 #define SO_INTERPOLATE_INITCLASS(className, classPrintName) \
00212 \
00213 void \
00214 className::initClass() \
00215 { \
00216 SO__ENGINE_INIT_CLASS(className, classPrintName, SoInterpolate); \
00217 }
00218
00219 #define SO_INTERPOLATE_EXITCLASS(className) \
00220 \
00221 void \
00222 className::exitClass() \
00223 { \
00224 SO_ENGINE_EXIT_CLASS(className); \
00225 }
00226
00228
00229
00230
00232
00267 class SoInterpolateFloat : public SoInterpolate {
00268 SO_INTERPOLATE_HEADER(SoInterpolateFloat);
00269 public:
00273 SoMFFloat input0;
00274
00278 SoMFFloat input1;
00279
00280
00282
00283
00284
00286 };
00287
00322 class SoInterpolateRotation : public SoInterpolate {
00323 SO_INTERPOLATE_HEADER(SoInterpolateRotation);
00324 public:
00328 SoMFRotation input0;
00329
00333 SoMFRotation input1;
00334
00335
00337
00338
00339
00341 };
00342
00377 class SoInterpolateVec2f : public SoInterpolate {
00378 SO_INTERPOLATE_HEADER(SoInterpolateVec2f);
00379 public:
00383 SoMFVec2f input0;
00384
00388 SoMFVec2f input1;
00389
00390
00392
00393
00394
00396 };
00397
00432 class SoInterpolateVec3f : public SoInterpolate {
00433 SO_INTERPOLATE_HEADER(SoInterpolateVec3f);
00434 public:
00438 SoMFVec3f input0;
00439
00443 SoMFVec3f input1;
00444
00445
00447
00448
00449
00451 };
00452
00487 class SoInterpolateVec4f : public SoInterpolate {
00488 SO_INTERPOLATE_HEADER(SoInterpolateVec4f);
00489 public:
00493 SoMFVec4f input0;
00494
00498 SoMFVec4f input1;
00499
00500
00502
00503
00504
00506 };
00507
00508 #endif
00509
00510
00511
00512
00513
00514
00515