leocad/common/project.h

337 lines
8.7 KiB
C
Raw Normal View History

2011-09-07 23:06:51 +02:00
#ifndef _PROJECT_H_
#define _PROJECT_H_
#include "object.h"
#include "typedefs.h"
#include "opengl.h"
#include "array.h"
2012-05-29 01:33:22 +02:00
#include "lc_math.h"
2011-09-07 23:06:51 +02:00
2012-10-18 20:57:21 +02:00
enum LC_MOUSE_TRACK
2011-09-07 23:06:51 +02:00
{
LC_TRACK_NONE,
LC_TRACK_START_LEFT,
LC_TRACK_LEFT,
LC_TRACK_START_RIGHT,
LC_TRACK_RIGHT
2012-10-18 20:57:21 +02:00
};
2011-09-07 23:06:51 +02:00
// Mouse control overlays.
enum LC_OVERLAY_MODES
2011-09-07 23:06:51 +02:00
{
LC_OVERLAY_NONE,
LC_OVERLAY_MOVE_X,
LC_OVERLAY_MOVE_Y,
LC_OVERLAY_MOVE_Z,
LC_OVERLAY_MOVE_XY,
LC_OVERLAY_MOVE_XZ,
LC_OVERLAY_MOVE_YZ,
LC_OVERLAY_MOVE_XYZ,
LC_OVERLAY_ROTATE_X,
LC_OVERLAY_ROTATE_Y,
LC_OVERLAY_ROTATE_Z,
LC_OVERLAY_ROTATE_XY,
LC_OVERLAY_ROTATE_XZ,
LC_OVERLAY_ROTATE_YZ,
LC_OVERLAY_ROTATE_XYZ,
LC_OVERLAY_ZOOM,
LC_OVERLAY_PAN,
LC_OVERLAY_ROTATE_VIEW_X,
LC_OVERLAY_ROTATE_VIEW_Y,
LC_OVERLAY_ROTATE_VIEW_Z,
LC_OVERLAY_ROTATE_VIEW_XYZ,
};
2011-09-07 23:06:51 +02:00
class Piece;
class Camera;
class Light;
class Group;
class Terrain;
class PieceInfo;
class View;
class Image;
class TexFont;
// Undo support
#include "lc_file.h"
2011-09-07 23:06:51 +02:00
struct LC_UNDOINFO
2011-09-07 23:06:51 +02:00
{
2012-03-23 00:44:56 +01:00
lcMemFile file;
2011-09-07 23:06:51 +02:00
char strText[21];
LC_UNDOINFO* pNext;
LC_UNDOINFO() { pNext = NULL; };
};
2011-09-07 23:06:51 +02:00
2012-03-23 00:44:56 +01:00
struct LC_FILEENTRY
{
lcMemFile File;
char FileName[LC_MAXPATH];
};
2013-01-24 00:56:34 +01:00
struct lcPiecesUsedEntry
{
PieceInfo* Info;
int ColorIndex;
int Count;
};
2011-09-07 23:06:51 +02:00
class Project
{
public:
// Constructors
Project();
~Project();
// Attributes
public:
bool IsModified()
{ return m_bModified; }
void SetModifiedFlag(bool bModified)
{ m_bModified = bModified; }
// Access to protected members
unsigned char GetLastStep();
bool IsAnimation()
{ return m_bAnimation; }
void SetAnimation(bool Anim)
{ m_bAnimation = Anim; } // only to be called from lcApplication::Initialize()
unsigned short GetCurrentTime ()
{ return m_bAnimation ? m_nCurFrame : m_nCurStep; }
void SetCurrentPiece(PieceInfo* pInfo)
{ m_pCurPiece = pInfo; }
int GetCurrentColor () const
{ return m_nCurColor; }
float* GetBackgroundColor()
{ return m_fBackground; }
unsigned long GetSnap() const
{ return m_nSnap; }
2011-09-07 23:06:51 +02:00
int GetOverlayMode() const
{ return m_OverlayMode; }
void GetSnapIndex(int* SnapXY, int* SnapZ, int* SnapAngle) const;
2011-09-07 23:06:51 +02:00
void GetSnapDistance(float* SnapXY, float* SnapZ) const;
void GetSnapDistanceText(char* SnapXY, char* SnapZ) const;
void GetTimeRange(int* from, int* to)
{
*from = m_bAnimation ? m_nCurFrame : m_nCurStep;
*to = m_bAnimation ? m_nTotalFrames : 255;
}
unsigned short GetTotalFrames () const
{ return m_nTotalFrames; }
2012-05-29 01:33:22 +02:00
void ConvertToUserUnits(lcVector3& Value) const;
void ConvertFromUserUnits(lcVector3& Value) const;
2011-09-07 23:06:51 +02:00
void UpdateInterface();
void SetPathName (const char* lpszPathName, bool bAddToMRU);
void SetTitle (const char* lpszTitle);
public:
// Special notifications
void DeleteContents(bool bUndo); // delete doc items etc
void LoadDefaults(bool cameras);
void BeginPieceDrop(PieceInfo* Info);
void BeginColorDrop();
2011-09-07 23:06:51 +02:00
2013-01-24 00:56:34 +01:00
void GetPiecesUsed(ObjArray<lcPiecesUsedEntry>& PiecesUsed) const;
2011-09-07 23:06:51 +02:00
void CreateImages(Image* images, int width, int height, unsigned short from, unsigned short to, bool hilite);
void Render(View* view, bool bToMemory);
2011-09-07 23:06:51 +02:00
void CheckAutoSave();
2012-05-29 01:33:22 +02:00
bool GetSelectionCenter(lcVector3& Center) const;
bool GetFocusPosition(lcVector3& Position) const;
2011-09-07 23:06:51 +02:00
Object* GetFocusObject() const;
Group* AddGroup (const char* name, Group* pParent, float x, float y, float z);
void TransformSelectedObjects(LC_TRANSFORM_TYPE Type, const lcVector3& Transform);
2011-09-07 23:06:51 +02:00
2011-09-17 01:59:55 +02:00
void AddView(View* view);
void RemoveView(View* view);
void UpdateAllViews();
bool SetActiveView(View* view);
View* GetActiveView() const
{
return m_ActiveView;
}
2011-09-07 23:06:51 +02:00
2012-08-22 03:13:32 +02:00
// Objects
Piece* m_pPieces;
PtrArray<Camera> mCameras;
Light* m_pLights;
Group* m_pGroups;
Terrain* m_pTerrain;
2011-09-07 23:06:51 +02:00
// Implementation
protected:
// default implementation
char m_strTitle[LC_MAXPATH];
char m_strPathName[LC_MAXPATH];
bool m_bModified; // changed since last saved
2011-09-17 01:59:55 +02:00
View* m_ActiveView;
2011-09-07 23:06:51 +02:00
PtrArray<View> m_ViewList;
char m_strAuthor[101];
char m_strDescription[101];
char m_strComments[256];
// Piece library
TexFont* m_pScreenFont;
// Undo support
LC_UNDOINFO* m_pUndoList;
LC_UNDOINFO* m_pRedoList;
bool m_bUndoOriginal;
void CheckPoint (const char* text);
2012-03-23 00:44:56 +01:00
lcFile* m_pClipboard[10];
2011-09-07 23:06:51 +02:00
unsigned char m_nCurClipboard;
void AddPiece(Piece* pPiece);
void RemovePiece(Piece* pPiece);
bool RemoveSelectedObjects();
2012-06-16 02:17:52 +02:00
void GetPieceInsertPosition(Piece* OffsetPiece, lcVector3& Position, lcVector4& Rotation);
void GetPieceInsertPosition(View* view, int MouseX, int MouseY, lcVector3& Position, lcVector4& Orientation);
2012-01-30 08:31:29 +01:00
Object* FindObjectFromPoint(View* view, int x, int y, bool PiecesOnly = false);
2011-09-07 23:06:51 +02:00
void FindObjectsInBox(float x1, float y1, float x2, float y2, PtrArray<Object>& Objects);
void SelectAndFocusNone(bool bFocusOnly);
void CalculateStep();
// Movement.
bool MoveSelectedObjects(lcVector3& Move, lcVector3& Remainder, bool Snap, bool Lock);
bool RotateSelectedObjects(lcVector3& Delta, lcVector3& Remainder, bool Snap, bool Lock);
2012-06-16 02:17:52 +02:00
void SnapVector(lcVector3& Delta) const
2011-09-07 23:06:51 +02:00
{
2012-06-16 02:17:52 +02:00
lcVector3 Dummy;
2011-09-07 23:06:51 +02:00
SnapVector(Delta, Dummy);
}
2012-06-16 02:17:52 +02:00
void SnapVector(lcVector3& Delta, lcVector3& Leftover) const;
void SnapRotationVector(lcVector3& Delta, lcVector3& Leftover) const;
2011-09-07 23:06:51 +02:00
2012-01-30 08:31:29 +01:00
// Rendering functions.
void RenderBackground(View* view);
2012-01-28 02:05:23 +01:00
void RenderScenePieces(View* view);
void RenderSceneBoxes(View* view);
void RenderSceneObjects(View* view);
void RenderViewports(View* view);
void RenderOverlays(View* view);
2011-09-07 23:06:51 +02:00
void RenderInitialize();
void CreateHTMLPieceList(FILE* f, int nStep, bool bImages, bool ShowID, const char* ext);
2012-12-13 01:20:40 +01:00
void ZoomExtents(int FirstView, int LastView);
2011-09-07 23:06:51 +02:00
bool m_bStopRender;
2012-03-23 00:44:56 +01:00
lcFile* m_pTrackFile;
2011-09-07 23:06:51 +02:00
bool m_bTrackCancel;
int m_nTracking;
int m_nDownX;
int m_nDownY;
float m_fTrack[3];
int m_nMouse;
2012-06-16 02:17:52 +02:00
lcVector3 m_MouseSnapLeftover;
lcVector3 m_MouseTotalDelta;
2011-09-07 23:06:51 +02:00
int m_OverlayMode;
bool m_OverlayActive;
2012-05-29 01:33:22 +02:00
lcVector3 m_OverlayCenter;
lcVector3 m_OverlayTrackStart;
lcVector3 m_OverlayDelta;
2012-02-01 03:08:30 +01:00
void MouseUpdateOverlays(View* view, int x, int y);
void ActivateOverlay(View* view, int Action, int OverlayMode);
2011-09-07 23:06:51 +02:00
void UpdateOverlayScale();
bool StopTracking(bool bAccept);
void StartTracking(int mode);
void UpdateSelection();
void RemoveEmptyGroups();
public:
// Call these functions from each OS
2013-01-28 20:57:33 +01:00
void OnLeftButtonDown(View* view, int x, int y, bool Control, bool Shift);
void OnLeftButtonUp(View* view, int x, int y, bool Control, bool Shift);
void OnLeftButtonDoubleClick(View* view, int x, int y, bool Control, bool Shift);
void OnMiddleButtonDown(View* view, int x, int y, bool Control, bool Shift);
void OnMiddleButtonUp(View* view, int x, int y, bool Control, bool Shift);
void OnRightButtonDown(View* view, int x, int y, bool Control, bool Shift);
void OnRightButtonUp(View* view, int x, int y, bool Control, bool Shift);
void OnMouseMove(View* view, int x, int y, bool Control, bool Shift);
void OnMouseWheel(View* view, int x, int y, float Direction, bool Control, bool Shift);
bool OnKeyDown(char nKey, bool Control, bool Shift);
2011-09-07 23:06:51 +02:00
void SetAction(int Action);
int GetCurAction() const
{
return m_nCurAction;
}
int GetAction() const;
2011-09-07 23:06:51 +02:00
void HandleNotify(LC_NOTIFY id, unsigned long param);
void HandleCommand(LC_COMMANDS id, unsigned long nParam);
void HandleMessage(int Message, void* Data);
protected:
// State variables
int m_nCurAction;
int m_PreviousAction;
bool m_RestoreAction;
2011-09-07 23:06:51 +02:00
PieceInfo* m_pCurPiece;
PieceInfo* m_PreviousPiece;
unsigned char m_nCurColor;
bool m_bAnimation;
bool m_bAddKeys;
unsigned char m_nFPS;
unsigned char m_nCurStep;
2012-03-23 00:44:56 +01:00
lcuint16 m_nCurFrame;
lcuint16 m_nTotalFrames;
lcuint32 m_nScene;
lcuint32 m_nDetail;
lcuint32 m_nSnap;
lcuint16 m_nMoveSnap;
lcuint16 m_nAngleSnap;
lcuint16 m_nGridSize;
2011-09-07 23:06:51 +02:00
float m_fLineWidth;
float m_fFogDensity;
float m_fFogColor[4];
float m_fAmbient[4];
float m_fBackground[4];
float m_fGradient1[3];
float m_fGradient2[3];
char m_strFooter[256];
char m_strHeader[256];
GLuint m_nGridList;
unsigned long m_nAutosave;
unsigned long m_nSaveTimer;
char m_strModelsPath[LC_MAXPATH];
char m_strBackground[LC_MAXPATH];
2012-10-12 20:21:45 +02:00
lcTexture* m_pBackground;
2011-09-07 23:06:51 +02:00
protected:
// File load/save implementation.
bool DoSave(char* PathName, bool bReplace);
2011-09-07 23:06:51 +02:00
bool DoFileSave();
2012-03-23 00:44:56 +01:00
bool FileLoad(lcFile* file, bool bUndo, bool bMerge);
void FileSave(lcFile* file, bool bUndo);
2012-10-18 20:57:21 +02:00
void FileReadLDraw(lcFile* file, const lcMatrix44& CurrentTransform, int* nOk, int DefColor, int* nStep, PtrArray<LC_FILEENTRY>& FileArray);
2012-03-23 00:44:56 +01:00
void FileReadMPD(lcFile& MPD, PtrArray<LC_FILEENTRY>& FileArray) const;
2011-09-07 23:06:51 +02:00
public:
// File helpers
bool OnNewDocument();
bool OnOpenDocument(const char* FileName);
bool OpenProject(const char* FileName);
bool SaveModified();
protected:
// mail enabling
// void OnFileSendMail();
// void OnUpdateFileSendMail(CCmdUI* pCmdUI);
// TODO: Fix ! This is a hack to make things work now
friend class CCADView;
friend void PrintPiecesThread(void* pv);
friend void Export3DStudio();
};
#endif // _PROJECT_H_