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 #ifndef __SGL_SPHERICAL_TRANSFORM_HPP
00026 #define __SGL_SPHERICAL_TRANSFORM_HPP
00027
00028 #include <sgl.h>
00029 #include <sglTransform.hpp>
00030
00070 template <class T>
00071 class SGL_DLL_API sglSphericalTransform : public sglTransform<T>
00072 {
00073 public:
00075 enum ModeEnum { eX_UP, eY_UP, eZ_UP };
00076
00077 public:
00079 sglSphericalTransform();
00081 virtual ~sglSphericalTransform() {}
00082
00087 void setMode(ModeEnum mode) { m_mode = mode; }
00088
00092 ModeEnum getMode() const { return m_mode; }
00093
00095 virtual void reset();
00096
00100 void updateAzimuth(T delta_azimuth)
00101 {
00102 setAzimuth(m_azimuth + delta_azimuth);
00103 }
00104
00109 void updateElevation(T delta_elevation)
00110 {
00111 setElevation(m_elevation + delta_elevation);
00112 }
00113
00117 void updateRadius(T delta_radius)
00118 {
00119 setRadius(m_radius + delta_radius);
00120 }
00121
00125 void updateCOI(const sglVec3<T> &delta_coi)
00126 {
00127 m_pos_coi += delta_coi;
00128 }
00129
00135 void updateCOI(T delta_x, T delta_y, T delta_z)
00136 {
00137 m_pos_coi += sglVec3<T>(delta_x, delta_y, delta_z);
00138 }
00139
00143 T getAzimuth() const { return m_azimuth; }
00144
00149 void setAzimuth(T new_azimuth);
00150
00154 T getElevation() const { return m_elevation; }
00155
00160 void setElevation(T new_elevation);
00161
00165 T getRadius() const { return m_radius; }
00166
00171 void setRadius(T new_radius);
00172
00176 const sglVec3<T> &getCOI() const { return m_pos_coi; }
00177
00181 void setCOI(const sglVec3<T> &pos_coi) { m_pos_coi = pos_coi; }
00182
00188 void setCOI(T x, T y, T z) { m_pos_coi.set(x, y, z); }
00189
00193 void computeMatrix();
00194
00195
00196 virtual sglNode *clone(unsigned int mode) const;
00197
00198
00199 virtual void printInfo(ostream &ostrm, const char *indent_spaces) const;
00200
00201 private:
00202 sglSphericalTransform(const sglSphericalTransform&);
00203 sglSphericalTransform &operator=(const sglSphericalTransform&);
00204
00205 void copyTo(sglSphericalTransform *dst, unsigned int mode) const;
00206
00207 protected:
00208 ModeEnum m_mode;
00209
00210 sglVec3<T> m_pos_coi;
00211
00212 T m_radius;
00213 T m_elevation, m_sin_el, m_cos_el;
00214 T m_azimuth, m_sin_az, m_cos_az;
00215
00216 sglVec2<T> m_delta_pos;
00217 };
00218
00219
00220
00221
00222
00224 typedef sglSphericalTransform<float> sglSphericalTransformf;
00226 typedef sglSphericalTransform<double> sglSphericalTransformd;
00227
00228 #endif