| 1 | |
|---|
| 2 | |
|---|
| 3 | #ifndef _GEO_ACTIONS_H_ |
|---|
| 4 | #define _GEO_ACTIONS_H_ |
|---|
| 5 | |
|---|
| 6 | using namespace osg; |
|---|
| 7 | |
|---|
| 8 | class georecord; |
|---|
| 9 | |
|---|
| 10 | |
|---|
| 11 | |
|---|
| 12 | class geoBehaviour { |
|---|
| 13 | public: |
|---|
| 14 | geoBehaviour() { } |
|---|
| 15 | virtual ~geoBehaviour() { } |
|---|
| 16 | virtual void doaction(osg::Node *)=0; |
|---|
| 17 | |
|---|
| 18 | virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader)=0; |
|---|
| 19 | protected: |
|---|
| 20 | }; |
|---|
| 21 | |
|---|
| 22 | class geoBehaviourDrawableCB: public osg::Drawable::UpdateCallback { |
|---|
| 23 | public: |
|---|
| 24 | geoBehaviourDrawableCB() { } |
|---|
| 25 | ~geoBehaviourDrawableCB() { } |
|---|
| 26 | void addBehaviour(geoBehaviour *gb) {gblist.push_back(gb);} |
|---|
| 27 | void update(osg::NodeVisitor *,osg::Drawable *dr); |
|---|
| 28 | private: |
|---|
| 29 | std::vector<geoBehaviour *> gblist; |
|---|
| 30 | }; |
|---|
| 31 | |
|---|
| 32 | class geoMathBehaviour : public geoBehaviour { |
|---|
| 33 | public: |
|---|
| 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; |
|---|
| 39 | virtual bool makeBehave(const georecord* , const geoHeaderGeo* ) { return true;}; |
|---|
| 40 | protected: |
|---|
| 41 | const double *in; |
|---|
| 42 | double *out; |
|---|
| 43 | }; |
|---|
| 44 | |
|---|
| 45 | |
|---|
| 46 | inline double DEG2RAD(const double var) { return var*0.0174532925199432957692369076848861; } |
|---|
| 47 | inline double addv(const double var1,const double var2) { return var1+var2; } |
|---|
| 48 | inline double subv(const double var1,const double var2) { return var1-var2; } |
|---|
| 49 | inline double mulv(const double var1,const double var2) { return var1*var2; } |
|---|
| 50 | inline double divv(const double var1,const double var2) { return var1/var2; } |
|---|
| 51 | inline double equa(const double var1,const double var2) { return var1==var2; } |
|---|
| 52 | inline double linear(const double var1,const double var2,const double var3) { return var2*var1+var3; } |
|---|
| 53 | inline double lininv(const double var1,const double var2,const double var3) { return var2/var1+var3; } |
|---|
| 54 | inline double linmod(const double var1,const double var2,const double var3) { return var2*fmod(var1,var3); } |
|---|
| 55 | inline double linsqr(const double var1,const double var2,const double var3) { return var2*sqrt(var1)+var3; } |
|---|
| 56 | inline double linabs(const double var1,const double var2,const double var3) { return var1*fmod(var2,var3); } |
|---|
| 57 | inline double trunc(const double var1,const double var2,const double var3) { return ((int)(var1/var2)+var3); } |
|---|
| 58 | inline double trigsin(const double var1,const double var2,const double var3) { return var2*sin(DEG2RAD(var1*var3)); } |
|---|
| 59 | inline double trigcos(const double var1,const double var2,const double var3) { return var2*cos(DEG2RAD(var1*var3)); } |
|---|
| 60 | inline double trigtan(const double var1,const double var2,const double var3) { return var2*tan(DEG2RAD(var1*var3)); } |
|---|
| 61 | inline double trigasin(const double var1,const double var2,const double var3) { return var2*asin(var1*var3); } |
|---|
| 62 | inline double trigacos(const double var1,const double var2,const double var3) { return var2*acos(var1*var3); } |
|---|
| 63 | inline double trigatan(const double var1,const double var2,const double var3) { return var2*atan(var1*var3); } |
|---|
| 64 | inline double trigatan2(const double var1,const double var2,const double var3) { return var2*atan2(var1,var3); } |
|---|
| 65 | inline double trighypot(const double var1,const double var2,const double var3) { return var2*hypot(var1,var3); } |
|---|
| 66 | inline double period_1(const double var1,const double var2,const double var3) { return var2*fmod(var1,var3); } |
|---|
| 67 | inline double period_2(const double var1,const double var2,const double var3) { return fmod(var1*var2,var3); } |
|---|
| 68 | inline double ifelse(const double var1,const double var2,const double var3) { return ((var1<1.0 && var1>-1.0) ? var2:var3); } |
|---|
| 69 | |
|---|
| 70 | class geoArithConstant { |
|---|
| 71 | public: |
|---|
| 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;} |
|---|
| 77 | private: |
|---|
| 78 | float constant; |
|---|
| 79 | const double *varop; |
|---|
| 80 | }; |
|---|
| 81 | |
|---|
| 82 | class geoArithBehaviour : public geoMathBehaviour { |
|---|
| 83 | public: |
|---|
| 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 *); |
|---|
| 91 | virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader); |
|---|
| 92 | private: |
|---|
| 93 | double (* op)(const double d1, const double v2); |
|---|
| 94 | geoArithConstant acon; |
|---|
| 95 | }; |
|---|
| 96 | |
|---|
| 97 | class geoAr3Behaviour : public geoArithBehaviour { |
|---|
| 98 | public: |
|---|
| 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 *); |
|---|
| 107 | virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader); |
|---|
| 108 | private: |
|---|
| 109 | geoArithConstant bcon; |
|---|
| 110 | double (* op)(const double d1, const double v2, const double v3); |
|---|
| 111 | }; |
|---|
| 112 | class geoCompareBehaviour : public geoMathBehaviour { |
|---|
| 113 | public: |
|---|
| 114 | geoCompareBehaviour() { constant=0; oper=UNKNOWN; varop=NULL;} |
|---|
| 115 | virtual ~geoCompareBehaviour() { } |
|---|
| 116 | enum optype{UNKNOWN, GREATER, GREATOREQ, LESS, LESSOREQ, EQUALTO}; |
|---|
| 117 | |
|---|
| 118 | void setType(uint iop); |
|---|
| 119 | void setVariable(const double *varvar) { varop=varvar;} |
|---|
| 120 | |
|---|
| 121 | virtual void doaction(osg::Node *); |
|---|
| 122 | virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader); |
|---|
| 123 | private: |
|---|
| 124 | float constant; |
|---|
| 125 | optype oper; |
|---|
| 126 | const double *varop; |
|---|
| 127 | }; |
|---|
| 128 | |
|---|
| 129 | class geoRangeBehaviour :public geoMathBehaviour { |
|---|
| 130 | |
|---|
| 131 | public: |
|---|
| 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 *); |
|---|
| 139 | virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader); |
|---|
| 140 | private: |
|---|
| 141 | float inmin,inmax; |
|---|
| 142 | float outmin,outmax; |
|---|
| 143 | }; |
|---|
| 144 | class geoClampBehaviour :public geoMathBehaviour { |
|---|
| 145 | public: |
|---|
| 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 *); |
|---|
| 151 | virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader); |
|---|
| 152 | private: |
|---|
| 153 | float min,max; |
|---|
| 154 | }; |
|---|
| 155 | class geoRange { |
|---|
| 156 | public: |
|---|
| 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();} |
|---|
| 165 | private: |
|---|
| 166 | geoArithConstant min,max,val; |
|---|
| 167 | }; |
|---|
| 168 | class geoDiscreteBehaviour : public geoMathBehaviour { |
|---|
| 169 | public: |
|---|
| 170 | geoDiscreteBehaviour() {nrange=1; } |
|---|
| 171 | virtual ~geoDiscreteBehaviour() {} |
|---|
| 172 | virtual void doaction(osg::Node *); |
|---|
| 173 | virtual bool makeBehave(const georecord *grec, geoHeaderGeo *theHeader); |
|---|
| 174 | |
|---|
| 175 | private: |
|---|
| 176 | int nrange; |
|---|
| 177 | std::vector<geoRange> rangelist; |
|---|
| 178 | }; |
|---|
| 179 | |
|---|
| 180 | |
|---|
| 181 | class geoActionBehaviour : public geoBehaviour { |
|---|
| 182 | public: |
|---|
| 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 | |
|---|
| 196 | |
|---|
| 197 | private: |
|---|
| 198 | |
|---|
| 199 | unsigned int type; |
|---|
| 200 | const double *var; |
|---|
| 201 | }; |
|---|
| 202 | class geoMoveBehaviour : public geoActionBehaviour { |
|---|
| 203 | public: |
|---|
| 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); |
|---|
| 213 | private: |
|---|
| 214 | |
|---|
| 215 | osg::Vec3 axis; |
|---|
| 216 | osg::Vec3 centre; |
|---|
| 217 | }; |
|---|
| 218 | class geoMoveVertexBehaviour : public geoMoveBehaviour { |
|---|
| 219 | public: |
|---|
| 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 *); |
|---|
| 227 | |
|---|
| 228 | virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader); |
|---|
| 229 | private: |
|---|
| 230 | |
|---|
| 231 | int index; |
|---|
| 232 | Vec3 pos; |
|---|
| 233 | }; |
|---|
| 234 | |
|---|
| 235 | class geoVisibBehaviour : public geoActionBehaviour { |
|---|
| 236 | public: |
|---|
| 237 | geoVisibBehaviour() { } |
|---|
| 238 | virtual ~geoVisibBehaviour() { } |
|---|
| 239 | |
|---|
| 240 | virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader); |
|---|
| 241 | virtual void doaction(osg::Node *node); |
|---|
| 242 | private: |
|---|
| 243 | }; |
|---|
| 244 | class geoColourBehaviour : public geoActionBehaviour { |
|---|
| 245 | |
|---|
| 246 | public: |
|---|
| 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 * ); |
|---|
| 254 | private: |
|---|
| 255 | uint numramps; |
|---|
| 256 | uint topcindx,botcindx; |
|---|
| 257 | cacts type; |
|---|
| 258 | uint nstart,nend; |
|---|
| 259 | const colourPalette *colours; |
|---|
| 260 | }; |
|---|
| 261 | |
|---|
| 262 | class geoStrContentBehaviour : public geoActionBehaviour { |
|---|
| 263 | |
|---|
| 264 | public: |
|---|
| 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); |
|---|
| 269 | virtual bool makeBehave(const georecord *grec, const geoHeaderGeo *theHeader); |
|---|
| 270 | enum valuetype {UNKNOWN, INT, FLOAT, DOUBLE, CHAR}; |
|---|
| 271 | private: |
|---|
| 272 | char *format; |
|---|
| 273 | uint PADDING_TYPE; |
|---|
| 274 | uint PAD_FOR_SIGN; |
|---|
| 275 | valuetype vt; |
|---|
| 276 | }; |
|---|
| 277 | |
|---|
| 278 | class geoBehaviourCB: public osg::NodeCallback { |
|---|
| 279 | public: |
|---|
| 280 | geoBehaviourCB() { } |
|---|
| 281 | ~geoBehaviourCB() { } |
|---|
| 282 | void addBehaviour(geoBehaviour *gb) {gblist.push_back(gb);} |
|---|
| 283 | virtual void operator() (osg::Node *node, osg::NodeVisitor* nv); |
|---|
| 284 | private: |
|---|
| 285 | std::vector<geoBehaviour *> gblist; |
|---|
| 286 | }; |
|---|
| 287 | |
|---|
| 288 | |
|---|
| 289 | #endif |
|---|