#ifndef _LC_MODEL_H_ #define _LC_MODEL_H_ #include "lc_file.h" #include "lc_math.h" #include "str.h" #include "object.h" #define LC_SEL_NO_PIECES 0x01 // No pieces in model #define LC_SEL_PIECE 0x02 // At last 1 piece selected #define LC_SEL_SELECTED 0x04 // At last 1 object selected #define LC_SEL_UNSELECTED 0x08 // At least 1 piece unselected #define LC_SEL_HIDDEN 0x10 // At least one piece hidden #define LC_SEL_GROUPED 0x20 // At least one piece selected is grouped #define LC_SEL_FOCUS_GROUPED 0x40 // Focused piece is grouped #define LC_SEL_CAN_GROUP 0x80 // Can make a new group enum lcTransformType { LC_TRANSFORM_ABSOLUTE_TRANSLATION, LC_TRANSFORM_RELATIVE_TRANSLATION, LC_TRANSFORM_ABSOLUTE_ROTATION, LC_TRANSFORM_RELATIVE_ROTATION }; enum lcBackgroundType { LC_BACKGROUND_SOLID, LC_BACKGROUND_GRADIENT, LC_BACKGROUND_IMAGE, LC_NUM_BACKGROUND_TYPES }; class lcModelProperties { public: void LoadDefaults(); void SaveDefaults(); bool operator==(const lcModelProperties& Properties) { if (mName != Properties.mName || mAuthor != Properties.mAuthor || mDescription != Properties.mDescription || mComments != Properties.mComments) return false; if (mBackgroundType != Properties.mBackgroundType || mBackgroundSolidColor != Properties.mBackgroundSolidColor || mBackgroundGradientColor1 != Properties.mBackgroundGradientColor1 || mBackgroundGradientColor2 != Properties.mBackgroundGradientColor2 || mBackgroundImage != Properties.mBackgroundImage || mBackgroundImageTile != Properties.mBackgroundImageTile) return false; if (mFogEnabled != Properties.mFogEnabled || mFogDensity != Properties.mFogDensity || mFogColor != Properties.mFogColor || mAmbientColor != Properties.mAmbientColor) return false; return true; } void SaveLDraw(QTextStream& Stream) const; void ParseLDrawLine(QTextStream& Stream); QString mName; QString mAuthor; QString mDescription; QString mComments; lcBackgroundType mBackgroundType; lcVector3 mBackgroundSolidColor; lcVector3 mBackgroundGradientColor1; lcVector3 mBackgroundGradientColor2; QString mBackgroundImage; bool mBackgroundImageTile; bool mFogEnabled; float mFogDensity; lcVector3 mFogColor; lcVector3 mAmbientColor; }; enum lcTool { LC_TOOL_INSERT, LC_TOOL_LIGHT, LC_TOOL_SPOTLIGHT, LC_TOOL_CAMERA, LC_TOOL_SELECT, LC_TOOL_MOVE, LC_TOOL_ROTATE, LC_TOOL_ERASER, LC_TOOL_PAINT, LC_TOOL_ZOOM, LC_TOOL_PAN, LC_TOOL_ROTATE_VIEW, LC_TOOL_ROLL, LC_TOOL_ZOOM_REGION }; struct lcModelHistoryEntry { QByteArray File; QString Description; }; class lcModel { public: lcModel(); ~lcModel(); bool IsModified() const { return mSavedHistory != mUndoHistory[0]; } const lcArray& GetPieces() const { return mPieces; } const lcArray& GetCameras() const { return mCameras; } const lcArray& GetLights() const { return mLights; } const lcArray& GetGroups() const { return mGroups; } lcStep GetLastStep() const; lcStep GetCurrentStep() const { return mCurrentStep; } lcGroup* GetGroup(const char* Name, bool CreateIfMissing); void SaveLDraw(QTextStream& Stream) const; void LoadLDraw(QTextStream& Stream); void RayTest(lcObjectRayTest& ObjectRayTest) const; void BoxTest(lcObjectBoxTest& ObjectBoxTest) const; lcObject* GetFocusObject() const; void FocusOrDeselectObject(const lcObjectSection& ObjectSection); void ClearSelectionAndSetFocus(lcObject* Object, lcuint32 Section); void ClearSelectionAndSetFocus(const lcObjectSection& ObjectSection); void SetSelection(const lcArray& ObjectSections); void AddToSelection(const lcArray& ObjectSections); protected: void SaveCheckpoint(const QString& Description); void CalculateStep(); void UpdateSelection() const; void SelectGroup(lcGroup* TopGroup, bool Select); void ClearSelection(bool UpdateInterface); lcModelProperties mProperties; lcStep mCurrentStep; lcVector3 mMouseToolDistance; lcArray mPieces; lcArray mCameras; lcArray mLights; lcArray mGroups; lcModelHistoryEntry* mSavedHistory; lcArray mUndoHistory; lcArray mRedoHistory; }; #endif // _LC_MODEL_H_