Coin: SoInterpolate.h Source File

| Coin3D is Free Software, published under the BSD 3-clause license. | https://coin3d.github.io https://www.kongsberg.com/en/kogt/

SoInterpolate.h
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
45public:
46 static void initClass(void);
47 static void initClasses(void);
48
49 SoSFFloat alpha;
50 SoEngineOutput output; // type varies for subclasses
51
52protected:
53 SoInterpolate();
54 virtual ~SoInterpolate(void);
55};
56
57
58
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_) \
86void \
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 \
116SO_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 \
124PRIVATE_SO_INTERPOLATE_DESTRUCTOR(_class_) \
125PRIVATE_SO_INTERPOLATE_EVALUATE(_class_, _type_, _valtype_, _interpexp_)
126
127
128#define SO_INTERPOLATE_INITCLASS(_class_, _classname_) \
129 \
130void \
131_class_::initClass(void) \
132{ \
133 SO_ENGINE_INIT_CLASS(_class_, SoInterpolate, "SoInterpolate"); \
134}
135
136
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
SoEngine::initClass
static void initClass(void)
Sets up initialization for data common to all instances of this class, like submitting necessary info...
Definition SoEngine.cpp:162
SoEngine::SoEngine
SoEngine(void)
Definition SoEngine.cpp:101
SoEngine::initClasses
static void initClasses(void)
Definition SoEngine.cpp:175
SoInterpolate::output
SoEngineOutput output
Definition SoInterpolate.h:50
SoInterpolate::alpha
SoSFFloat alpha
Definition SoInterpolate.h:49
SoInterpolate::SoInterpolate
SoInterpolate()
Definition SoInterpolate.cpp:79
SoSFFloat
The SoSFFloat class is a container for a floating point value.
Definition SoSFFloat.h:39