1
0
Fork 0
mirror of https://github.com/leozide/leocad synced 2025-02-15 20:47:55 +01:00
leocad/common/camera.h

295 lines
6.8 KiB
C
Raw Normal View History

2011-09-07 21:06:51 +00:00
#ifndef _CAMERA_H_
#define _CAMERA_H_
#include "object.h"
2012-05-28 23:33:22 +00:00
#include "lc_math.h"
2013-08-15 23:43:18 +00:00
#include "lc_array.h"
2011-09-07 21:06:51 +00:00
class TiledRender;
2012-08-20 04:05:56 +00:00
class View;
#define LC_CAMERA_HIDDEN 0x0001
#define LC_CAMERA_SIMPLE 0x0002
2014-05-03 01:22:24 +00:00
#define LC_CAMERA_ORTHO 0x0004
#define LC_CAMERA_POSITION_SELECTED 0x0010
#define LC_CAMERA_POSITION_FOCUSED 0x0020
#define LC_CAMERA_TARGET_SELECTED 0x0040
#define LC_CAMERA_TARGET_FOCUSED 0x0080
#define LC_CAMERA_UPVECTOR_SELECTED 0x0100
#define LC_CAMERA_UPVECTOR_FOCUSED 0x0200
#define LC_CAMERA_SELECTION_MASK (LC_CAMERA_POSITION_SELECTED | LC_CAMERA_TARGET_SELECTED | LC_CAMERA_UPVECTOR_SELECTED)
#define LC_CAMERA_FOCUS_MASK (LC_CAMERA_POSITION_FOCUSED | LC_CAMERA_TARGET_FOCUSED | LC_CAMERA_UPVECTOR_FOCUSED)
2012-08-20 04:05:56 +00:00
enum LC_VIEWPOINT
{
LC_VIEWPOINT_FRONT,
LC_VIEWPOINT_BACK,
LC_VIEWPOINT_TOP,
2012-08-22 01:13:32 +00:00
LC_VIEWPOINT_BOTTOM,
2012-08-20 04:05:56 +00:00
LC_VIEWPOINT_LEFT,
LC_VIEWPOINT_RIGHT,
LC_VIEWPOINT_HOME
};
2011-09-07 21:06:51 +00:00
enum lcCameraSection
{
LC_CAMERA_SECTION_POSITION,
LC_CAMERA_SECTION_TARGET,
LC_CAMERA_SECTION_UPVECTOR
};
2011-09-07 21:06:51 +00: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 04:05:56 +00:00
enum LC_CK_TYPES
2011-09-07 21:06:51 +00:00
{
LC_CK_EYE,
LC_CK_TARGET,
LC_CK_UP,
LC_CK_COUNT
2012-08-20 04:05:56 +00:00
};
2011-09-07 21:06:51 +00:00
2014-05-01 18:42:11 +00:00
class lcCamera : public lcObject
2011-09-07 21:06:51 +00:00
{
public:
2014-05-01 18:42:11 +00:00
lcCamera(bool Simple);
lcCamera(float ex, float ey, float ez, float tx, float ty, float tz);
virtual ~lcCamera();
2011-09-07 21:06:51 +00:00
const char* GetName() const
2012-08-20 04:05:56 +00:00
{
return m_strName;
}
2011-09-07 21:06:51 +00:00
2013-08-15 23:43:18 +00:00
void CreateName(const lcArray<Camera*>& Cameras);
2012-08-22 01:13:32 +00:00
bool IsSimple() const
2012-08-20 04:05:56 +00:00
{
return (mState & LC_CAMERA_SIMPLE) != 0;
2012-08-20 04:05:56 +00:00
}
2011-09-07 21:06:51 +00:00
2014-05-03 01:22:24 +00:00
bool IsOrtho() const
{
return (mState & LC_CAMERA_ORTHO) != 0;
}
void SetOrtho(bool Ortho)
{
if (Ortho)
mState |= LC_CAMERA_ORTHO;
else
mState &= ~LC_CAMERA_ORTHO;
}
virtual bool IsSelected() const
2012-08-20 04:05:56 +00:00
{
return (mState & LC_CAMERA_SELECTION_MASK) != 0;
}
virtual bool IsSelected(lcuint32 Section) const
{
switch (Section)
{
case LC_CAMERA_SECTION_POSITION:
return (mState & LC_CAMERA_POSITION_SELECTED) != 0;
break;
case LC_CAMERA_SECTION_TARGET:
return (mState & LC_CAMERA_TARGET_SELECTED) != 0;
break;
case LC_CAMERA_SECTION_UPVECTOR:
return (mState & LC_CAMERA_UPVECTOR_SELECTED) != 0;
break;
}
return false;
}
virtual void SetSelected(bool Selected)
{
if (Selected)
mState |= LC_CAMERA_SELECTION_MASK;
else
mState &= ~(LC_CAMERA_SELECTION_MASK | LC_CAMERA_FOCUS_MASK);
}
virtual void SetSelected(lcuint32 Section, bool Selected)
{
switch (Section)
{
case LC_CAMERA_SECTION_POSITION:
if (Selected)
mState |= LC_CAMERA_POSITION_SELECTED;
else
mState &= ~(LC_CAMERA_POSITION_SELECTED | LC_CAMERA_POSITION_FOCUSED);
break;
case LC_CAMERA_SECTION_TARGET:
if (Selected)
mState |= LC_CAMERA_TARGET_SELECTED;
else
mState &= ~(LC_CAMERA_TARGET_SELECTED | LC_CAMERA_TARGET_FOCUSED);
break;
case LC_CAMERA_SECTION_UPVECTOR:
if (Selected)
mState |= LC_CAMERA_UPVECTOR_SELECTED;
else
mState &= ~(LC_CAMERA_UPVECTOR_SELECTED | LC_CAMERA_UPVECTOR_FOCUSED);
break;
}
}
virtual bool IsFocused() const
{
return (mState & LC_CAMERA_FOCUS_MASK) != 0;
}
virtual bool IsFocused(lcuint32 Section) const
{
switch (Section)
{
case LC_CAMERA_SECTION_POSITION:
return (mState & LC_CAMERA_POSITION_FOCUSED) != 0;
break;
case LC_CAMERA_SECTION_TARGET:
return (mState & LC_CAMERA_TARGET_FOCUSED) != 0;
break;
case LC_CAMERA_SECTION_UPVECTOR:
return (mState & LC_CAMERA_UPVECTOR_FOCUSED) != 0;
break;
}
return false;
}
virtual void SetFocused(lcuint32 Section, bool Focus)
{
switch (Section)
{
case LC_CAMERA_SECTION_POSITION:
if (Focus)
mState |= LC_CAMERA_POSITION_SELECTED | LC_CAMERA_POSITION_FOCUSED;
else
mState &= ~(LC_CAMERA_POSITION_SELECTED | LC_CAMERA_POSITION_FOCUSED);
break;
case LC_CAMERA_SECTION_TARGET:
if (Focus)
mState |= LC_CAMERA_TARGET_SELECTED | LC_CAMERA_TARGET_FOCUSED;
else
mState &= ~(LC_CAMERA_TARGET_SELECTED | LC_CAMERA_TARGET_FOCUSED);
break;
case LC_CAMERA_SECTION_UPVECTOR:
if (Focus)
mState |= LC_CAMERA_UPVECTOR_SELECTED | LC_CAMERA_UPVECTOR_FOCUSED;
else
mState &= ~(LC_CAMERA_UPVECTOR_SELECTED | LC_CAMERA_UPVECTOR_FOCUSED);
break;
}
}
virtual lcuint32 GetFocusSection() const
{
if (mState & LC_CAMERA_POSITION_FOCUSED)
return LC_CAMERA_SECTION_POSITION;
if (mState & LC_CAMERA_TARGET_FOCUSED)
return LC_CAMERA_SECTION_TARGET;
if (mState & LC_CAMERA_UPVECTOR_FOCUSED)
return LC_CAMERA_SECTION_UPVECTOR;
return ~0;
}
virtual lcVector3 GetSectionPosition(lcuint32 Section) const
{
switch (Section)
{
case LC_CAMERA_SECTION_POSITION:
return mPosition;
case LC_CAMERA_SECTION_TARGET:
return mTargetPosition;
case LC_CAMERA_SECTION_UPVECTOR:
return lcMul31(lcVector3(0, 1, 0), lcMatrix44AffineInverse(mWorldView));
}
return lcVector3(0.0f, 0.0f, 0.0f);
2012-08-20 04:05:56 +00:00
}
2011-09-07 21:06:51 +00:00
public:
// void Hide()
// { mState = LC_CAMERA_HIDDEN; }
// void UnHide()
// { mState &= ~LC_CAMERA_HIDDEN; }
2011-09-07 21:06:51 +00:00
char* GetName()
{ return m_strName; }
bool IsSide()
{ return m_nType < LC_CAMERA_MAIN; }
bool IsVisible() const
{ return (mState & LC_CAMERA_HIDDEN) == 0; }
2011-09-07 21:06:51 +00:00
public:
virtual void RayTest(lcObjectRayTest& ObjectRayTest) const;
virtual void BoxTest(lcObjectBoxTest& ObjectBoxTest) const;
2012-03-22 23:44:56 +00:00
bool FileLoad(lcFile& file);
void FileSave(lcFile& file) const;
2012-08-23 18:47:37 +00:00
void Select(bool bSelecting, bool bFocus, bool bMultiple);
2011-09-07 21:06:51 +00:00
2014-01-30 03:13:34 +00:00
void UpdatePosition(unsigned short nTime);
2012-08-20 04:05:56 +00:00
void CopyPosition(const Camera* camera);
2014-04-14 03:20:16 +00:00
void Render(View* View);
2011-09-07 21:06:51 +00:00
2014-01-30 03:13:34 +00:00
void ZoomExtents(View* view, const lcVector3& Center, const lcVector3* Points, int NumPoints, unsigned short nTime, bool bAddKey);
void ZoomRegion(const lcVector3* Points, float RatioX, float RatioY, unsigned short nTime, bool bAddKey);
void Zoom(float Distance, unsigned short nTime, bool bAddKey);
void Pan(float DistanceX, float DistanceY, unsigned short nTime, bool bAddKey);
void Orbit(float DistanceX, float DistanceY, const lcVector3& CenterPosition, unsigned short nTime, bool bAddKey);
void Roll(float Distance, unsigned short nTime, bool bAddKey);
void Center(lcVector3& point, unsigned short nTime, bool bAddKey);
2014-01-30 03:13:34 +00:00
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 21:06:51 +00: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 04:57:18 +00:00
char m_strName[81];
2011-09-07 21:06:51 +00:00
float m_fovy;
float m_zNear;
float m_zFar;
2012-05-28 23:33:22 +00:00
lcMatrix44 mWorldView;
lcVector3 mPosition;
lcVector3 mTargetPosition;
lcVector3 mUpVector;
2013-12-17 02:43:16 +00:00
lcVector3 mOrthoTarget;
2014-05-03 06:08:52 +00:00
TiledRender* m_pTR;
2012-05-28 23:33:22 +00:00
2011-09-07 21:06:51 +00:00
protected:
void Initialize();
lcuint32 mState;
2011-09-07 21:06:51 +00:00
unsigned char m_nType;
};
#endif // _CAMERA_H_