00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __GUTZ_CAMERA_DOT_H
00020 #define __GUTZ_CAMERA_DOT_H
00021
00022 #include <mathGutz.h>
00023 #include <list>
00024 #include <vector>
00025 #include "baseManip.h"
00026 #include <iostream>
00027
00028 #ifdef KONG
00029 class KokoBuffer;
00030 #endif
00031
00032 namespace gutz {
00033
00034
00035
00036
00037
00038
00039
00040 enum{
00041 CAM_MODE_NONE,
00042 CAM_ROT,
00043 CAM_ZOOM,
00044 CAM_DOLLY,
00045 CAM_TRANS_XY,
00046 CAM_TRANS_XZ,
00047 CAM_TRANS_ZY,
00048 CAM_TRANS_Z,
00049 CAM_TRANS_Y,
00050 CAM_TRANS_X,
00051 CAM_ROLL,
00052 CAM_PITCH,
00053 CAM_YAW,
00054 CAM_SWIVEL,
00055 CAM_LAST_MODE
00056 };
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 class Camera : public BaseManip {
00069 public:
00070 Camera();
00071 Camera(const Camera &cam);
00072
00073 virtual ~Camera();
00074
00075 bool isCamera() const { return true; }
00076 bool isManip() const { return false; }
00077
00078 Camera* getCamera()const { return 0; }
00079
00080
00081
00082
00083
00084 gutz::mat4f getProjectTransform() const { return _pm * _cm; }
00085
00086 gutz::mat4f getInvProjectTransform() const { return _cinv * _pinv; }
00087
00088
00089
00090 gutz::mat4f getScreenTransform() const { return getViewportMatrix(); }
00091
00092 gutz::mat4f getInvScreenTransform() const { return getInvViewportMatrix(); }
00093
00094 gutz::mat4f getEyeTransform() const { return _cm; }
00095
00096 gutz::mat4f getWorldTransform() const { return mat4f(); }
00097
00098 gutz::mat4f getLocalTransform() const { return _cm; }
00099
00100 gutz::mat4f getInvEyeTransform() const { return _cinv; }
00101
00102 gutz::mat4f getInvWorldTransform() const { return mat4f(); }
00103
00104 gutz::mat4f getInvLocalTransform() const { return _cinv; }
00105
00106 gutz::mat4f getProjection() const { return _pm; }
00107
00108 gutz::mat4f getInvProjection() const { return _pinv; }
00109
00110
00111 gutz::quatf getEyeQuat() const { return quatf( _cm.rot() ); }
00112
00113 gutz::quatf getInvEyeQuat() const { return getEyeQuat().conj(); }
00114
00115 gutz::quatf getWorldQuat() const { return quatf_id; }
00116
00117 gutz::quatf getInvWorldQuat() const { return quatf_id; }
00118
00119 gutz::quatf getLocalQuat() const { return _camquat; }
00120
00121 gutz::quatf getInvLocalQuat() const { return _camquat.inv(); }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 mat4f getViewportMatrix() const;
00133 mat4f getInvViewportMatrix() const;
00134
00135
00136
00137
00138
00139 const mat4f &getProjectMatrix() const { return _pm; }
00140 const mat4f &getInvProjectMatrix() const { return _pinv; }
00141 void setProjectMatrix(const mat4f &m);
00142 const mat4f &getViewMatrix() const { return _cm; }
00143 const mat4f &getInvViewMatrix() const { return _cinv; }
00144 void setViewMatrix(const mat4f &m);
00145 mat4f getInvMatrix() const { return _pinv * _cinv; }
00146 quatf getCamQuat() const { return _camquat; }
00147
00148
00149
00150
00151
00152 gutz::vec3f getLocalPos() const { return _eyePos; }
00153 void setLocalPos(const vec3f &pos)
00154 { _cm[12] = pos.x; _cm[13] = pos.y; _cm[14] = pos.z; }
00155 gutz::mat3f getLocalOrient() const { return _cm.rot(); }
00156
00157 void setLocalQuat(const quatf &lq) {}
00158
00159
00160
00161
00162
00163
00164
00165
00166 virtual bool serialize(std::ostream &os, const std::string indent = std::string(""));
00167
00168 virtual bool unserialize(std::istream &is);
00169
00170
00171
00172 virtual bool serialState(std::ostream &os, const std::string indent = std::string(""));
00173 virtual bool unserialState(std::istream &is);
00174 virtual bool serialEventMap(std::ostream &os, const std::string indent = std::string(""));
00175 virtual bool serialParamMap(std::ostream &os, const std::string indent = std::string(""));
00176 virtual bool unserialEventMap(std::istream &is);
00177 virtual bool unserialParamMap(std::istream &is);
00178 virtual bool serialData(std::ostream &os, const std::string indent = std::string(""));
00179 virtual bool unserialData(std::istream &is);
00180
00181
00182
00183
00184
00185
00186
00187 virtual void setClips(float nearClip, float farClip);
00188 virtual gutz::vec2f getClips() const {return _clips;}
00189 virtual float getNearClip() const ;
00190 virtual float getFarClip() const ;
00191
00192
00193
00194
00195
00196
00197 virtual void setEyePos(vec3f eyePos);
00198 virtual void setLookAt(vec3f lookat);
00199 virtual void setUpVec(vec3f upvec);
00200
00201 virtual const vec3f & getEyePos() const {return _eyePos;};
00202 virtual const vec3f & getLookAt() const {return _lookat;};
00203 virtual const vec3f & getUpVec() const {return _upvec;};
00204 virtual vec3f getXVec() const
00205 {vec3f z = _lookat - _eyePos; z.normalize(); return vec3f(_upvec.cross(z));}
00206 virtual vec3f getViewDir() const
00207 {return getLookAt() - getEyePos(); }
00208 virtual float getFocalLength() const
00209 { return (getEyePos() - getLookAt()).norm(); }
00210
00211
00212
00213
00214
00215
00216
00217 void setScreen(unsigned int x, unsigned int y);
00218 gutz::vec2ui getScreen() const {return _screen;}
00219 unsigned int getScreenX() const {return _screen[0];};
00220 unsigned int getScreenY() const {return _screen[1];};
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 virtual void setPerspective(float fov);
00231
00232 virtual void setFrustum(float left, float right, float bottom, float top);
00233
00234 gutz::vec4f getFrustum() const { return _frustum; }
00235
00236 virtual void setOrtho(float left, float right, float bottom, float top);
00237
00238 bool isOrtho() const { return _ortho; }
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249 gutz::vec3f getLocalPosWorld(const gutz::vec3f &wpos) const
00250 { return wpos; }
00251
00252 gutz::vec3f getLocalDirWorld(const gutz::vec3f &wdir) const
00253 { return wdir; }
00254
00255
00256 gutz::vec3f getWorldPosLocal(const gutz::vec3f &lpos) const
00257 { return lpos; }
00258
00259 gutz::vec3f getWorldDirLocal(const gutz::vec3f &ldir) const
00260 { return ldir; }
00261
00262
00263 gutz::vec3f getLocalPosEye(const gutz::vec3f &epos) const
00264 { return _cinv.tpoint(epos); }
00265
00266
00267 gutz::vec3f getEyePosLocal(const gutz::vec3f &lpos) const
00268 { return _cm.tpoint(lpos); }
00269
00270
00271 gutz::vec3f getLocalPosScreen(const gutz::vec3f &spos) const
00272 { return _cinv.tpoint(getEyePosScreen(spos)); }
00273
00274
00275 gutz::vec3f getScreenPosLocal(const gutz::vec3f &lpos) const
00276 {
00277 gutz::vec4f ppos = _pm * (_cm * vec4f(lpos, 1));
00278 ppos /= ppos.w;
00279 ppos.x = (ppos.x + 1)/2.0f * _screen[0];
00280 ppos.y = (ppos.y + 1)/2.0f * _screen[1];
00281 ppos.z = (ppos.z + 1)/2.0f;
00282 return ppos;
00283 }
00284
00285
00286 inline
00287 gutz::vec3f getEyePosScreen(const gutz::vec3f &scrPos) const
00288 {
00289 vec4f tmp(scrPos.x/float(getScreenX()) *2.0f-1.0f,
00290 (getScreenY() - scrPos.y - 1)/float(getScreenY()) *2.0f-1.0f,
00291 scrPos.z *2.0f-1.0f,
00292 1.0f);
00293 tmp = _pinv * tmp;
00294 return tmp/tmp.w;
00295 }
00296
00297
00298
00299
00300 inline
00301 gutz::vec3f getPickPos(const gutz::vec3f &scrPos) const
00302 {
00303 return getLocalPosScreen(scrPos);
00304 }
00305
00306
00307
00308
00309 template<class T> inline
00310 gutz::vec3f getPickPos(const T x, const T y) const
00311 {
00312 return getPickPos(gutz::vec3f(x,y,0.0f));
00313 }
00314
00315
00316
00317
00318 template<class T> inline
00319 gutz::vec3f getPickPos(const gutz::vec2<T> &p) const
00320 {
00321 return getPickPos(gutz::vec3f(p.x,p.y,0.0f));
00322 }
00323
00324
00325
00326
00327
00328
00329
00330
00331 inline
00332 gutz::ray3f getRay(float x, float y) const
00333 {
00334 if(isOrtho()) return gutz::ray3f(getPickPos<float>(x,y), getViewDir());
00335 gutz::vec3f scrpt = getPickPos<float>(x,y);
00336 gutz::vec3f vdir = scrpt - getEyePos();
00337 vdir.normalize();
00338 return gutz::ray3f(scrpt, vdir);
00339 }
00340
00341
00342 inline
00343 gutz::ray3f getRayWorld(gutz::vec3f pos) const
00344 {
00345 if(isOrtho()) return gutz::ray3f(pos, getViewDir());
00346 gutz::vec3f vdir = pos - getEyePos();
00347 vdir.normalize();
00348 return gutz::ray3f(pos, vdir);
00349 }
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359 gutz::vec3f getLocalEyeRayLocal(const gutz::vec3f &lpos) const
00360 {
00361 if(isOrtho()) return getViewDir();
00362 return lpos - getWorldPos();
00363 }
00364
00365 gutz::vec3f getLocalEyeRayScreen(const gutz::vec3f &spos) const
00366 {
00367 if(isOrtho()) return getViewDir();
00368 return getLocalPosScreen(spos) - getWorldPos();
00369 }
00370
00371 gutz::vec3f getWorldEyeRayScreen(const gutz::vec3f &spos) const
00372 { return getLocalEyeRayScreen(spos); }
00373
00374 gutz::vec3f getWorldEyeRayWorld(const gutz::vec3f &wpos) const
00375 { return getLocalEyeRayLocal(wpos); }
00376
00377 gutz::vec3f getLocalViewDir() const { return getViewDir(); }
00378
00379
00380
00381
00382
00383
00384
00385 virtual void mapEvent(unsigned int event, unsigned int button, float speed = 1.0f)
00386 {_keymap[button] = event; _speedmap[button] = speed;}
00387 unsigned int getEvent(const MouseEvent &me) const;
00388 float getSpeed(const MouseEvent &me) const;
00389
00390
00391 virtual bool mouse(const MouseEvent &me);
00392
00393 virtual bool move(const MouseMoveEvent &mme);
00394
00395
00396
00397
00398
00399
00400
00401
00402 virtual void tumble(float speed = 1);
00403
00404
00405 #ifdef KONG
00406
00407
00408
00409 unsigned int packSize(void); // How big of a buffer do we need?
00410 void pack(KokoBuffer &kbuf, bool reset=true);
00411 void unpack(KokoBuffer &kbuf, bool reset=true);
00412 #endif
00413
00414 protected:
00415
00416 void _setProjectMatrix(const mat4f &m);
00417 void _setViewMatrix(const mat4f &m);
00418
00419
00420
00421
00422 virtual bool handleCamera(const gutz::MouseMoveEvent &mme);
00423
00424 virtual void cameraRot(const gutz::MouseMoveEvent &mme);
00425 virtual void cameraTrans(const gutz::MouseMoveEvent &mme,
00426 vec3f dxAxis, vec3f dyAxis);
00427 virtual void cameraRotAxis(const gutz::MouseMoveEvent &mme,
00428 vec3f dxAxis, vec3f dyAxis);
00429 virtual void cameraSwivel(const gutz::MouseMoveEvent &mme);
00430 virtual void cameraZoom(const gutz::MouseMoveEvent &mme);
00431
00432
00433 gutz::vec2ui _screen;
00434
00435
00436
00437 gutz::vec4ui _viewport;
00438
00439
00440 enum { FRUST_LEFT=0, FRUST_RIGHT=1, FRUST_TOP=2, FRUST_BOTTOM=3 };
00441 gutz::vec4f _frustum;
00442
00443 gutz::vec2f _clips;
00444
00445 mat4f _cm, _pm, _cinv, _pinv;
00446
00447 vec3f _eyePos,_lookat,_upvec;
00448
00449 quatf _camquat;
00450
00451
00452 vec3f _lastEyePos,_lastLookat;
00453
00454 quatf _camtrackquat, _swivtrackquat;
00455
00456 bool _ortho;
00457
00458
00459
00460 EventKeyMap _keymap;
00461 EventParamMap _speedmap;
00462
00463 private:
00464
00465 };
00466
00467
00468
00469
00470
00471 typedef SmartPtr<Camera> CameraSP;
00472
00473 typedef std::list<Camera *> CameraList;
00474 typedef std::list<Camera *>::iterator CameraListIter;
00475
00476 typedef std::vector<Camera *> CameraVec;
00477 typedef std::vector<Camera *>::iterator CameraVecIter;
00478
00479
00480 }
00481
00482 #endif