root/OpenSceneGraph/trunk/src/osgPlugins/geo/osgGeoAction.h @ 13041

Revision 13041, 12.0 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// geo actions header
2
3#ifndef _GEO_ACTIONS_H_
4#define _GEO_ACTIONS_H_
5
6using namespace osg;
7
8class georecord; // You don't need to know how I read a geo record,
9//      but objects of this class are passed to some of the parsing routines.
10// The values are defined in osgGeoStructs.h which is distributed with OSG.
11
12class geoBehaviour { // base class for action & math functions where var out = f(var in)
13public:
14    geoBehaviour() { }
15    virtual ~geoBehaviour() { }
16    virtual void doaction(osg::Node *)=0;// {} // do math or action operation
17
18    virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader)=0; // pure virtual
19protected:
20};
21
22class geoBehaviourDrawableCB: public osg::Drawable::UpdateCallback {
23public:
24    geoBehaviourDrawableCB() { }
25    ~geoBehaviourDrawableCB() { }
26    void addBehaviour(geoBehaviour *gb) {gblist.push_back(gb);}
27    void update(osg::NodeVisitor *,osg::Drawable *dr);
28private:
29    std::vector<geoBehaviour *> gblist;
30};
31
32class geoMathBehaviour : public geoBehaviour { // base class for math functions where var out = f(var in)
33public:
34    geoMathBehaviour() { in=out=NULL; }
35    virtual ~geoMathBehaviour() { }
36    virtual void setInVar(const double *indvar) {in=indvar;}
37    virtual void setOutVar(double *outdvar) {out=outdvar;}
38    virtual void doaction(osg::Node *)=0; // do math operation eg *out=*in or =f(*in).
39    virtual bool makeBehave(const georecord* , const geoHeaderGeo* ) { return true;}; // pure virtual
40protected:
41    const double *in; // address of input variable
42    double *out; // address of output
43};
44
45// in these functions, var1 is the input value x, var2 (& 3) are constants.
46inline double DEG2RAD(const double var) { return var*0.0174532925199432957692369076848861; }
47inline double addv(const double var1,const double var2) { return var1+var2; }
48inline double subv(const double var1,const double var2) { return var1-var2; }
49inline double mulv(const double var1,const double var2) { return var1*var2; }
50inline double divv(const double var1,const double var2) { return var1/var2; }
51inline double equa(const double var1,const double var2) { return var1==var2; }
52inline double linear(const double var1,const double var2,const double var3) { return var2*var1+var3; }
53inline double lininv(const double var1,const double var2,const double var3) { return var2/var1+var3; }
54inline double linmod(const double var1,const double var2,const double var3) { return var2*fmod(var1,var3); }
55inline double linsqr(const double var1,const double var2,const double var3) { return var2*sqrt(var1)+var3; }
56inline double linabs(const double var1,const double var2,const double var3) { return var1*fmod(var2,var3); }
57inline double trunc(const double var1,const double var2,const double var3) { return ((int)(var1/var2)+var3); }
58inline double trigsin(const double var1,const double var2,const double var3) { return var2*sin(DEG2RAD(var1*var3)); }
59inline double trigcos(const double var1,const double var2,const double var3) { return var2*cos(DEG2RAD(var1*var3)); }
60inline double trigtan(const double var1,const double var2,const double var3) { return var2*tan(DEG2RAD(var1*var3)); }
61inline double trigasin(const double var1,const double var2,const double var3) { return var2*asin(var1*var3); }
62inline double trigacos(const double var1,const double var2,const double var3) { return var2*acos(var1*var3); }
63inline double trigatan(const double var1,const double var2,const double var3) { return var2*atan(var1*var3); }
64inline double trigatan2(const double var1,const double var2,const double var3) { return var2*atan2(var1,var3); }
65inline double trighypot(const double var1,const double var2,const double var3) { return var2*hypot(var1,var3); }
66inline double period_1(const double var1,const double var2,const double var3) { return var2*fmod(var1,var3); }
67inline double period_2(const double var1,const double var2,const double var3) { return fmod(var1*var2,var3); }
68inline double ifelse(const double var1,const double var2,const double var3) { return ((var1<1.0 && var1>-1.0) ? var2:var3); }
69
70class geoArithConstant { // a constant can be a fixed double OR address of variable
71public:
72        geoArithConstant(const float v=0) { constant=v; varop=NULL; }
73        virtual ~geoArithConstant() {}
74        void set(const float v) { constant=v; varop=NULL; }
75        bool set(const double *v) { varop=v; return (v!=NULL);}
76        inline double get(void) const { return varop? *varop : constant;}
77private:
78    float constant;
79    const double *varop; // if null use constant value in maths; else
80};
81
82class geoArithBehaviour : public geoMathBehaviour {
83public:
84    geoArithBehaviour() { op=NULL; }
85    virtual ~geoArithBehaviour() { }
86    void setType(uint iop);
87    bool setVariable(const double *varvar) { return acon.set(varvar);}
88        void setConstant(float v) {acon.set(v); }
89        inline double getconstant(void) { return acon.get();}
90    virtual void doaction(osg::Node *); // do math operation
91    virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader);
92private:
93        double (* op)(const double d1, const double v2);
94        geoArithConstant acon;
95};
96
97class geoAr3Behaviour : public geoArithBehaviour { // extended to 3 constants, out=f(a,b,c)
98public:
99    geoAr3Behaviour() { op=NULL; }
100    virtual ~geoAr3Behaviour() { }
101
102    void setType(uint iact);
103    void setTrigType(int iop);
104    void setPeriodicType(int iop);
105
106    virtual void doaction(osg::Node *); // do math operation
107    virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader);
108private:
109    geoArithConstant bcon;
110        double (* op)(const double d1, const double v2, const double v3);
111};
112class geoCompareBehaviour : public geoMathBehaviour {
113public:
114    geoCompareBehaviour() { constant=0; oper=UNKNOWN; varop=NULL;}
115    virtual ~geoCompareBehaviour() { }
116    enum optype{UNKNOWN, GREATER, GREATOREQ, LESS, LESSOREQ, EQUALTO};
117//    void setConstant(const float v) { constant=v;}
118    void setType(uint iop);
119    void setVariable(const double *varvar) { varop=varvar;}
120
121    virtual void doaction(osg::Node *); // do compare operation
122    virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader);
123private:
124    float constant;
125    optype oper;
126    const double *varop; // if null use constant value in maths; else
127};
128
129class geoRangeBehaviour :public geoMathBehaviour {
130    // output = outmin + frac*(outmax-min) where frac = (in-min)/(max-min)
131public:
132    geoRangeBehaviour() { inmin=outmin=(float)-1.e32; inmax=outmax=(float)1.e32; in=out=NULL;}
133    ~geoRangeBehaviour() { }
134    void setInMax(const double v) { inmax=v;}
135    void setInMin(const double v) { inmin=v;}
136    void setOutMax(const double v) { outmax=v;}
137    void setOutMin(const double v) { outmin=v;}
138    virtual void doaction(osg::Node *); // do math operation
139    virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader);
140private:
141    float inmin,inmax;
142    float outmin,outmax;
143};
144class geoClampBehaviour :public geoMathBehaviour {
145public:
146    geoClampBehaviour() { min=(float)-1.e32; max=(float)1.e32; in=out=NULL;}
147    ~geoClampBehaviour() { }
148    void setMax(const double v) { max=v;}
149    void setMin(const double v) { min=v;}
150    virtual void doaction(osg::Node *); // do math operation
151    virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader);
152private:
153    float min,max;
154};
155class geoRange { // discrete range -- min,max,output
156public:
157        geoRange() { min.set(0.0); max.set(0.0); val.set(0.0);}
158        virtual ~geoRange() {}
159        inline void setMin(const float v) { min.set(v);}
160        inline void setMax(const float v) { max.set(v);}
161        inline void setVal(const float v) { val.set(v);}
162        const double getMin(void) const { return min.get();}
163        const double getMax(void) const { return max.get();}
164        const double getVal(void) const { return val.get();}
165private:
166        geoArithConstant min,max,val;
167};
168class geoDiscreteBehaviour : public geoMathBehaviour { // discrete action -- output= 1 of several
169public:
170        geoDiscreteBehaviour() {nrange=1;       }
171        virtual ~geoDiscreteBehaviour() {}
172    virtual void doaction(osg::Node *); // do math operation
173    virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader);
174
175private:
176        int nrange;
177        std::vector<geoRange> rangelist;
178};
179
180
181class geoActionBehaviour : public geoBehaviour { // base class for any scenegraph changes
182public:
183    geoActionBehaviour() { var=NULL; type=0;}
184    virtual ~geoActionBehaviour() {
185        var=NULL;}
186    void setType(const unsigned int t) { type=t; }
187    void setVar(const double *v) { var=v;}
188    inline unsigned int getType(void) const { return type;}
189    inline const double *getVar(void) const { return var;}
190    inline double getValue(void) const { return *var;}
191    virtual void doaction(osg::Node *) {
192    }
193
194    virtual bool makeBehave(const georecord *, const geoHeaderGeo * )=0;// {
195        //      return true;
196    //}
197private:
198    // for fast transform behaviours
199    unsigned int type; // eg GEO_DB_ROTATE_ACTION_INPUT_VAR, translate etc
200    const double *var; // variable controls this behaviour
201};
202class geoMoveBehaviour : public geoActionBehaviour { // class of rotate & translate actions
203public:
204    geoMoveBehaviour() { axis.set(0,0,1); centre.set(0,0,0);}
205    virtual ~geoMoveBehaviour() { }
206    void setCentre(const Vec3 v) { centre=v;}
207    void setAxis(const Vec3 v) { axis=v;}
208        inline Vec3 getAxis() { return axis;}
209        inline Vec3 getCentre() { return centre;}
210    virtual void doaction(osg::Node *node);
211
212    virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader);
213private:
214    // for fast transform behaviours
215    osg::Vec3 axis; // axis of rotation or translate or scale
216    osg::Vec3 centre; // centre of rotation or scale
217};
218class geoMoveVertexBehaviour : public geoMoveBehaviour { // class of rotate & translate vertex actions
219public:
220    geoMoveVertexBehaviour() { index=0; pos.set(0,0,0);}
221    virtual ~geoMoveVertexBehaviour() { }
222        inline Vec3 getpos() { return pos;}
223        void setpos(const osg::Vec3 p) { pos=p;}
224        void setindx(const int idx) { index=idx;}
225        inline int getindex(void) const { return index;}
226    virtual void doaction(osg::Matrix *); // Matrix &mtr);
227
228    virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader);
229private:
230    // for fast transform behaviours
231        int index; // which index in the geometry
232        Vec3 pos; // raw position of the vertex
233};
234
235class geoVisibBehaviour : public geoActionBehaviour { // visibility action -- sets node mask
236public:
237    geoVisibBehaviour() { }
238    virtual ~geoVisibBehaviour() { }
239
240    virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader);
241    virtual void doaction(osg::Node *node);
242private:
243};
244class geoColourBehaviour : public geoActionBehaviour { // colour action
245    // sets content of case DB_DSK_COLOR_RAMP_ACTION
246public:
247    geoColourBehaviour() { topcindx=4096; botcindx=0; numramps=1; type=UNKNOWN; colours=NULL;}
248    virtual ~geoColourBehaviour() { }
249        enum cacts {UNKNOWN, PALETTE, RAMP};
250    virtual void doaction(osg::Drawable *dr);
251        void setVertIndices(const uint ns, const uint n) { nstart=ns; nend=ns+n;}
252        void setColorPalette(const colourPalette *color_palette) {colours=color_palette;}
253    virtual bool makeBehave(const georecord *, const geoHeaderGeo * );
254private:
255        uint numramps;
256        uint topcindx,botcindx; // top & bottom colour indices
257        cacts type; //
258        uint nstart,nend; // start index in the colours array, and number of indices
259        const colourPalette *colours; // where the colours come from - actually held in the geoHeader structure
260};
261
262class geoStrContentBehaviour : public geoActionBehaviour { // string content actions
263    // sets content of a string...
264public:
265    geoStrContentBehaviour() {format=NULL;PADDING_TYPE=0;
266        PAD_FOR_SIGN=0; vt=UNKNOWN; }
267    virtual ~geoStrContentBehaviour() { delete [] format;}
268    virtual void doaction(osg::Drawable *node); // do new text
269    virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader);
270    enum valuetype {UNKNOWN, INT, FLOAT, DOUBLE, CHAR};
271private:
272    char *format;
273    uint PADDING_TYPE;
274    uint PAD_FOR_SIGN;
275    valuetype vt;
276};
277
278class geoBehaviourCB: public osg::NodeCallback {
279public:
280    geoBehaviourCB() { }
281    ~geoBehaviourCB() { }
282    void addBehaviour(geoBehaviour *gb) {gblist.push_back(gb);}
283    virtual void operator() (osg::Node *node, osg::NodeVisitor* nv);
284private:
285    std::vector<geoBehaviour *> gblist;
286};
287
288
289#endif
Note: See TracBrowser for help on using the browser.