leocad/common/camera.h

191 lines
4.8 KiB
C
Raw Normal View History

2011-09-07 23:06:51 +02:00
#ifndef _CAMERA_H_
#define _CAMERA_H_
#include "object.h"
2012-05-29 01:33:22 +02:00
#include "lc_math.h"
2013-08-16 01:43:18 +02:00
#include "lc_array.h"
2013-12-17 03:43:16 +01:00
#include "lc_projection.h"
2011-09-07 23:06:51 +02:00
#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
2012-08-20 06:05:56 +02:00
#define LC_CAMERA_SIMPLE 0x20
2011-09-07 23:06:51 +02:00
class Camera;
class CameraTarget;
class TiledRender;
2012-08-20 06:05:56 +02:00
class View;
enum LC_VIEWPOINT
{
LC_VIEWPOINT_FRONT,
LC_VIEWPOINT_BACK,
LC_VIEWPOINT_TOP,
2012-08-22 03:13:32 +02:00
LC_VIEWPOINT_BOTTOM,
2012-08-20 06:05:56 +02:00
LC_VIEWPOINT_LEFT,
LC_VIEWPOINT_RIGHT,
LC_VIEWPOINT_HOME
};
2011-09-07 23:06:51 +02:00
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;
2012-08-20 06:05:56 +02:00
enum LC_CK_TYPES
2011-09-07 23:06:51 +02:00
{
LC_CK_EYE,
LC_CK_TARGET,
LC_CK_UP,
LC_CK_COUNT
2012-08-20 06:05:56 +02:00
};
2011-09-07 23:06:51 +02:00
class CameraTarget : public Object
{
public:
2012-08-23 20:47:37 +02:00
CameraTarget(Camera *pParent);
virtual ~CameraTarget();
2011-09-07 23:06:51 +02:00
public:
2012-08-17 01:50:40 +02:00
virtual void MinIntersectDist(lcClickLine* ClickLine);
2012-08-23 20:47:37 +02:00
virtual bool IntersectsVolume(const lcVector4 Planes[6]) const;
void Select(bool bSelecting, bool bFocus, bool bMultiple);
2014-01-30 04:13:34 +01:00
void Move(unsigned short nTime, bool bAddKey, float x, float y, float z)
2011-09-07 23:06:51 +02:00
{
// FIXME: move the position handling to the camera target
}
const char* GetName() const;
2012-08-23 20:47:37 +02:00
Camera* GetParent() const
2011-09-07 23:06:51 +02:00
{ return m_pParent; }
protected:
Camera* m_pParent;
};
class Camera : public Object
{
public:
2012-08-20 06:05:56 +02:00
Camera(bool Simple);
2012-08-22 03:13:32 +02:00
Camera(float ex, float ey, float ez, float tx, float ty, float tz);
2012-08-20 06:05:56 +02:00
virtual ~Camera();
2011-09-07 23:06:51 +02:00
const char* GetName() const
2012-08-20 06:05:56 +02:00
{
return m_strName;
}
2011-09-07 23:06:51 +02:00
2013-08-16 01:43:18 +02:00
void CreateName(const lcArray<Camera*>& Cameras);
2012-08-22 03:13:32 +02:00
2012-08-20 06:05:56 +02:00
CameraTarget* GetTarget() const
{
return m_pTarget;
}
2011-09-07 23:06:51 +02:00
2012-08-20 06:05:56 +02:00
bool IsSimple() const
{
return (m_nState & LC_CAMERA_SIMPLE) != 0;
}
2011-09-07 23:06:51 +02:00
public:
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 IsVisible()
{ return (m_nState & LC_CAMERA_HIDDEN) == 0; }
bool IsSelected()
2012-08-23 20:47:37 +02:00
{ return (m_nState & (LC_CAMERA_SELECTED|LC_CAMERA_TARGET_SELECTED)) != 0; }
2011-09-07 23:06:51 +02:00
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()
2012-08-23 20:47:37 +02:00
{ m_nState &= ~(LC_CAMERA_SELECTED|LC_CAMERA_FOCUSED|LC_CAMERA_TARGET_SELECTED|LC_CAMERA_TARGET_FOCUSED); }
2011-09-07 23:06:51 +02:00
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); }
*/
2012-08-23 20:47:37 +02:00
void SelectTarget(bool bSelecting, bool bFocus, bool bMultiple);
2011-09-07 23:06:51 +02:00
public:
2012-03-23 00:44:56 +01:00
bool FileLoad(lcFile& file);
void FileSave(lcFile& file) const;
2012-08-17 01:50:40 +02:00
virtual void MinIntersectDist(lcClickLine* ClickLine);
2012-08-23 20:47:37 +02:00
virtual bool IntersectsVolume(const lcVector4 Planes[6]) const;
void Select(bool bSelecting, bool bFocus, bool bMultiple);
2011-09-07 23:06:51 +02:00
2014-01-30 04:13:34 +01:00
void UpdatePosition(unsigned short nTime);
2012-08-20 06:05:56 +02:00
void CopyPosition(const Camera* camera);
2014-04-14 05:20:16 +02:00
void Render(View* View);
2013-12-17 03:43:16 +01:00
void LoadProjection(const lcProjection& projection);
2011-09-07 23:06:51 +02:00
2014-01-30 04:13:34 +01:00
void ZoomExtents(View* view, const lcVector3& Center, const lcVector3* Points, int NumPoints, unsigned short nTime, bool bAddKey);
void ZoomRegion(View* view, float Left, float Right, float Bottom, float Top, unsigned short nTime, bool bAddKey);
void DoZoom(int dy, int mouse, unsigned short nTime, bool bAddKey);
void DoPan(int dx, int dy, int mouse, unsigned short nTime, bool bAddKey);
void DoRotate(int dx, int dy, int mouse, unsigned short nTime, bool bAddKey, float* center);
void DoRoll(int dx, int mouse, unsigned short nTime, bool bAddKey);
void DoCenter(lcVector3& point, unsigned short nTime, bool bAddKey);
void Move(unsigned short nTime, bool bAddKey, float x, float y, float z);
void SetViewpoint(LC_VIEWPOINT Viewpoint, unsigned short nTime, bool bAddKey);
void SetFocalPoint(const lcVector3& focus, unsigned short nTime, bool bAddKey);
2011-09-07 23:06:51 +02:00
void StartTiledRendering(int tw, int th, int iw, int ih, float fAspect);
void GetTileInfo(int* row, int* col, int* width, int* height);
bool EndTile();
2013-08-09 06:57:18 +02:00
char m_strName[81];
2011-09-07 23:06:51 +02:00
float m_fovy;
float m_zNear;
float m_zFar;
2012-05-29 01:33:22 +02:00
lcMatrix44 mWorldView;
lcVector3 mPosition;
lcVector3 mTargetPosition;
lcVector3 mUpVector;
2013-12-17 03:43:16 +01:00
lcVector3 mOrthoTarget;
lcProjection mProjection;
2012-05-29 01:33:22 +02:00
2011-09-07 23:06:51 +02:00
protected:
void Initialize();
// Camera target
CameraTarget* m_pTarget;
// Attributes
unsigned char m_nState;
unsigned char m_nType;
TiledRender* m_pTR;
};
#endif // _CAMERA_H_