summaryrefslogtreecommitdiff
path: root/common/camera.h
diff options
context:
space:
mode:
Diffstat (limited to 'common/camera.h')
-rw-r--r--common/camera.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/common/camera.h b/common/camera.h
new file mode 100644
index 0000000..cb5a5cb
--- /dev/null
+++ b/common/camera.h
@@ -0,0 +1,135 @@
+//
+// camera.h
+////////////////////////////////////////////////////
+
+#ifndef _CAMERA_H_
+#define _CAMERA_H_
+
+#ifndef GLuint
+#include "GL/gl.h"
+#endif
+#include "boundbox.h"
+
+#define LC_CAMERA_HIDDEN 0x01
+#define LC_CAMERA_SELECTED 0x02
+#define LC_CAMERA_FOCUSED 0x04
+#define LC_CAMERA_TARGET_SELECTED 0x08
+#define LC_CAMERA_TARGET_FOCUSED 0x10
+
+typedef enum { LC_CAMERA_FRONT,LC_CAMERA_BACK,
+ LC_CAMERA_TOP, LC_CAMERA_UNDER,
+ LC_CAMERA_LEFT, LC_CAMERA_RIGHT,
+ LC_CAMERA_MAIN, LC_CAMERA_USER } LC_CAMERA_TYPES;
+
+typedef enum { CK_EYE, CK_TARGET, CK_UP } CK_TYPES;
+
+typedef struct CAMERA_KEY {
+ unsigned short time;
+ float param[3];
+ unsigned char type;
+ CAMERA_KEY* next;
+} CAMERA_KEY;
+
+class File;
+class TiledRender;
+
+class Camera
+{
+public:
+ Camera();
+ Camera(int nType, Camera* pPrev);
+ Camera(float ex, float ey, float ez, float tx, float ty, float tz, Camera* pCamera);
+ Camera(float eye[3], float target[3], float up[3], Camera* pCamera);
+ ~Camera();
+
+ Camera* m_pNext;
+ void Hide()
+ { m_nState = LC_CAMERA_HIDDEN; }
+ void UnHide()
+ { m_nState &= ~LC_CAMERA_HIDDEN; }
+ char* GetName()
+ { return m_strName; }
+ bool IsSide()
+ { return m_nType < LC_CAMERA_MAIN; }
+ bool IsUser()
+ { return m_nType == LC_CAMERA_USER; }
+ bool IsVisible()
+ { return (m_nState & LC_CAMERA_HIDDEN) == 0; }
+ bool IsSelected()
+ { return (m_nState & (LC_CAMERA_SELECTED|LC_CAMERA_TARGET_SELECTED)) != 0; }
+ bool IsEyeSelected()
+ { return (m_nState & LC_CAMERA_SELECTED) != 0; }
+ bool IsTargetSelected()
+ { return (m_nState & LC_CAMERA_TARGET_SELECTED) != 0; }
+ void Select()
+ { m_nState |= (LC_CAMERA_SELECTED|LC_CAMERA_TARGET_SELECTED); }
+ void UnSelect()
+ { m_nState &= ~(LC_CAMERA_SELECTED|LC_CAMERA_FOCUSED|LC_CAMERA_TARGET_SELECTED|LC_CAMERA_TARGET_FOCUSED); }
+ void UnFocus()
+ { m_nState &= ~(LC_CAMERA_FOCUSED|LC_CAMERA_TARGET_FOCUSED); }
+ bool IsEyeFocused()
+ { return (m_nState & LC_CAMERA_FOCUSED) != 0; }
+ void FocusEye()
+ { m_nState |= (LC_CAMERA_FOCUSED|LC_CAMERA_SELECTED); }
+ bool IsTargetFocused()
+ { return (m_nState & LC_CAMERA_TARGET_FOCUSED) != 0; }
+ void FocusTarget()
+ { m_nState |= (LC_CAMERA_TARGET_FOCUSED|LC_CAMERA_TARGET_SELECTED); }
+
+ void GetEye(float* eye)
+ { memcpy(eye, m_fEye, sizeof(m_fEye)); };
+ void GetTarget(float* target)
+ { memcpy(target, m_fTarget, sizeof(m_fTarget)); };
+ void GetUp(float* up)
+ { memcpy(up, m_fUp, sizeof(m_fUp)); };
+
+public:
+ void MinIntersectDist(CLICKLINE* Line);
+ void ChangeKey(unsigned short nTime, bool bAnimation, bool bAddKey, float param[3], unsigned char nKeyType);
+ void UpdatePosition(unsigned short nTime, bool bAnimation);
+ void Render(float fLineWidth);
+ void LoadProjection(float fAspect);
+ void FileLoad(File* file);
+ void FileSave(File* file);
+
+ void DoZoom(int dy, int mouse, unsigned short nTime, bool bAnimation, bool bAddKey);
+ void DoPan(int dx, int dy, int mouse, unsigned short nTime, bool bAnimation, bool bAddKey);
+ void DoRotate(int dx, int dy, int mouse, unsigned short nTime, bool bAnimation, bool bAddKey, float* center);
+ void DoRoll(int dx, int mouse, unsigned short nTime, bool bAnimation, bool bAddKey);
+ void Move(unsigned short nTime, bool bAnimation, bool bAddKey, float x, float y, float z);
+
+ void StartTiledRendering(int tw, int th, int iw, int ih, float fAspect);
+ void GetTileInfo(int* row, int* col, int* width, int* height);
+ bool EndTile();
+
+ float m_fovy;
+ float m_zNear;
+ float m_zFar;
+
+protected:
+ void CalculatePosition(unsigned short nTime, bool bAnimation, float eye[3], float target[3], float up[3]);
+ void RemoveKeys();
+ void Initialize();
+
+ // For using the mouse
+ BoundingBox m_BoundingBox;
+ BoundingBox m_TargetBoundingBox;
+
+ // Position
+ CAMERA_KEY* m_pAnimationKeys;
+ CAMERA_KEY* m_pInstructionKeys;
+
+ // Attributes
+ char m_strName[81];
+ unsigned char m_nState;
+ unsigned char m_nType;
+ GLuint m_nList;
+
+ // Temporary position
+ float m_fEye[3];
+ float m_fTarget[3];
+ float m_fUp[3];
+ TiledRender* m_pTR;
+};
+
+#endif // _CAMERA_H_