leocad/common/camera.h
2011-09-07 21:06:51 +00:00

195 lines
5.1 KiB
C++

#ifndef _CAMERA_H_
#define _CAMERA_H_
#include "opengl.h"
#include "object.h"
#include "algebra.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
class Camera;
class CameraTarget;
class File;
class TiledRender;
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
{
LC_CK_EYE,
LC_CK_TARGET,
LC_CK_UP,
LC_CK_COUNT
} LC_CK_TYPES;
class CameraTarget : public Object
{
public:
CameraTarget (Camera *pParent);
virtual ~CameraTarget ();
public:
void MinIntersectDist (LC_CLICKLINE* pLine);
bool IntersectsVolume(const Vector4* Planes, int NumPlanes)
{ return false; }
void Select (bool bSelecting, bool bFocus, bool bMultiple);
void Move (unsigned short nTime, bool bAnimation, bool bAddKey, float x, float y, float z)
{
// FIXME: move the position handling to the camera target
}
const char* GetName() const;
Camera* GetParent () const
{ return m_pParent; }
protected:
Camera* m_pParent;
friend class Camera; // FIXME: needed for BoundingBoxCalculate ()
// remove and use UpdatePosition instead
};
class Camera : public Object
{
public:
Camera ();
Camera (unsigned char nType, Camera* pPrev);
Camera (float ex, float ey, float ez, float tx, float ty, float tz, Camera* pCamera);
Camera (const float *eye, const float *target, const float *up, Camera* pCamera);
virtual ~Camera ();
// Query functions.
inline Vector3 GetEyePosition() const
{ return Vector3(m_fEye[0], m_fEye[1], m_fEye[2]); };
inline Vector3 GetTargetPosition() const
{ return Vector3(m_fTarget[0], m_fTarget[1], m_fTarget[2]); };
inline Vector3 GetUpVector() const
{ return Vector3(m_fUp[0], m_fUp[1], m_fUp[2]); };
const char* GetName() const
{ return m_strName; };
CameraTarget* GetTarget () const
{ return m_pTarget; }
// Deprecated functions:
const float* GetEyePos () const
{ return m_fEye; };
void GetEyePos (float* eye) const
{ memcpy(eye, m_fEye, sizeof(m_fEye)); };
const float* GetTargetPos () const
{ return m_fTarget; };
void GetTargetPos (float* target) const
{ memcpy(target, m_fTarget, sizeof(m_fTarget)); };
const float* GetUpVec () const
{ return m_fUp; };
void GetUpVec (float* up) const
{ memcpy(up, m_fUp, sizeof(m_fUp)); };
public:
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; }
bool IsEyeFocused()
{ return (m_nState & LC_CAMERA_FOCUSED) != 0; }
bool IsTargetFocused()
{ return (m_nState & LC_CAMERA_TARGET_FOCUSED) != 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); }
void FocusEye()
{ m_nState |= (LC_CAMERA_FOCUSED|LC_CAMERA_SELECTED); }
void FocusTarget()
{ m_nState |= (LC_CAMERA_TARGET_FOCUSED|LC_CAMERA_TARGET_SELECTED); }
*/
void SelectTarget (bool bSelecting, bool bFocus, bool bMultiple);
public:
bool FileLoad (File& file);
void FileSave (File& file) const;
void MinIntersectDist (LC_CLICKLINE* pLine);
void Select (bool bSelecting, bool bFocus, bool bMultiple);
bool IntersectsVolume(const Vector4* Planes, int NumPlanes)
{ return false; }
void UpdatePosition(unsigned short nTime, bool bAnimation);
void Render(float fLineWidth);
void LoadProjection(float fAspect);
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 Initialize();
void UpdateBoundingBox();
// Camera target
CameraTarget* m_pTarget;
// Attributes
char m_strName[81];
unsigned char m_nState;
unsigned char m_nType;
GLuint m_nList;
static GLuint m_nTargetList;
// Current position and orientation.
float m_fEye[3];
float m_fTarget[3];
float m_fUp[3];
TiledRender* m_pTR;
};
#endif // _CAMERA_H_