1 /**************************************************************************\ 2 * Copyright (c) Kongsberg Oil & Gas Technologies AS 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * Redistributions of source code must retain the above copyright notice, 10 * this list of conditions and the following disclaimer. 11 * 12 * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * Neither the name of the copyright holder nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 \**************************************************************************/ 32 33 #ifndef COIN_SOINTERPOLATE_H 34 #define COIN_SOINTERPOLATE_H 35 36 37 #include <Inventor/engines/SoSubEngine.h> 38 #include <Inventor/engines/SoEngineOutput.h> 39 #include <Inventor/fields/SoSFFloat.h> 40 41 class COIN_DLL_API SoInterpolate : public SoEngine { 42 typedef SoEngine inherited; 43 SO_ENGINE_ABSTRACT_HEADER(SoInterpolate); 44 45 public: 46 static void initClass(void); 47 static void initClasses(void); 48 49 SoSFFloat alpha; 50 SoEngineOutput output; // type varies for subclasses 51 52 protected: 53 SoInterpolate(); 54 virtual ~SoInterpolate(void); 55 }; 56 57 58 59 //// Start macros //////////////////////////////////////////////////////// 60 61 62 #define SO_INTERPOLATE_HEADER(_class_) \ 63 SO_ENGINE_HEADER(_class_); \ 64 public: \ 65 _class_(); \ 66 static void initClass(); \ 67 protected: \ 68 virtual ~_class_(); \ 69 private: \ 70 virtual void evaluate() 71 72 73 #define PRIVATE_SO_INTERPOLATE_CONSTRUCTOR(_class_, _type_, _valtype_, _default0_, _default1_) \ 74 SO_ENGINE_CONSTRUCTOR(_class_); \ 75 SO_ENGINE_ADD_INPUT(alpha, (0.0f)); \ 76 SO_ENGINE_ADD_INPUT(input0, _default0_); \ 77 SO_ENGINE_ADD_INPUT(input1, _default1_); \ 78 SO_ENGINE_ADD_OUTPUT(output, _type_) 79 80 #define PRIVATE_SO_INTERPOLATE_DESTRUCTOR(_class_) \ 81 _class_::~_class_() \ 82 { \ 83 } 84 85 #define PRIVATE_SO_INTERPOLATE_EVALUATE(_class_, _type_, _valtype_, _interpexp_) \ 86 void \ 87 _class_::evaluate(void) \ 88 { \ 89 int n0 = this->input0.getNum(); \ 90 int n1 = this->input1.getNum(); \ 91 float a = this->alpha.getValue(); \ 92 for (int i = SbMax(n0, n1) - 1; i >= 0; i--) { \ 93 _valtype_ v0 = this->input0[SbMin(i, n0-1)]; \ 94 _valtype_ v1 = this->input1[SbMin(i, n1-1)]; \ 95 SO_ENGINE_OUTPUT(output, _type_, set1Value(i, _interpexp_)); \ 96 } \ 97 } 98 99 100 // Considering the number of lines of code needed to implement 101 // the evaluate() method in each class, I'm amazed it is defined in 102 // a macro and not simply implemented for each class. But, I guess 103 // we'll have to supply this macro to keep the OIV compatibility, 104 // so here it is. Check the interpolator classes for examples on 105 // how to use it. 106 // pederb, 20000309 107 // 108 // There's another version of this macro for internal use in the 109 // SoSubEngineP.h file, so match any changes you do here with that 110 // macro also -- if applicable. 111 // 112 // mortene, 20000505 113 114 #define SO_INTERPOLATE_SOURCE(_class_, _type_, _valtype_, _default0_, _default1_, _interpexp_) \ 115 \ 116 SO_ENGINE_SOURCE(_class_); \ 117 \ 118 _class_::_class_(void) \ 119 { \ 120 PRIVATE_SO_INTERPOLATE_CONSTRUCTOR(_class_, _type_, _valtype_, _default0_, _default1_); \ 121 this->isBuiltIn = FALSE; \ 122 } \ 123 \ 124 PRIVATE_SO_INTERPOLATE_DESTRUCTOR(_class_) \ 125 PRIVATE_SO_INTERPOLATE_EVALUATE(_class_, _type_, _valtype_, _interpexp_) 126 127 128 #define SO_INTERPOLATE_INITCLASS(_class_, _classname_) \ 129 \ 130 void \ 131 _class_::initClass(void) \ 132 { \ 133 SO_ENGINE_INIT_CLASS(_class_, SoInterpolate, "SoInterpolate"); \ 134 } 135 136 137 //// End macros ////////////////////////////////////////////////////////// 138 139 140 #ifndef COIN_INTERNAL 141 // Include these header files for better Open Inventor compatibility. 142 #include <Inventor/engines/SoInterpolateFloat.h> 143 #include <Inventor/engines/SoInterpolateVec2f.h> 144 #include <Inventor/engines/SoInterpolateVec3f.h> 145 #include <Inventor/engines/SoInterpolateVec4f.h> 146 #include <Inventor/engines/SoInterpolateRotation.h> 147 #endif // !COIN_INTERNAL 148 149 150 #endif // !COIN_SOINTERPOLATE_H 151