mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-12-26 15:44:51 +01:00
369 lines
12 KiB
C++
369 lines
12 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
|
|
|
// WorldEditorDoc.h : interface of the CWorldEditorDoc class
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#ifndef WORLDEDITORDOC_H
|
|
#define WORLDEDITORDOC_H 1
|
|
|
|
#define SNAP_DOUBLE_CM 0.015625
|
|
#define SNAP_FLOAT_CM 0.015625f
|
|
#define SNAP_FLOAT_12 0.125f
|
|
#define SNAP_FLOAT_25 0.25f
|
|
#define SNAP_ANGLE_GRID (AngleDeg(2.5f))
|
|
|
|
#define POLYGON_MODE 1
|
|
#define SECTOR_MODE 2
|
|
#define ENTITY_MODE 3
|
|
#define VERTEX_MODE 4
|
|
#define TERRAIN_MODE 5
|
|
#define CSG_MODE 6
|
|
|
|
enum ESelectionType
|
|
{
|
|
ST_NONE = 0,
|
|
ST_VERTEX,
|
|
ST_ENTITY,
|
|
ST_VOLUME,
|
|
ST_SECTOR,
|
|
ST_POLYGON,
|
|
};
|
|
|
|
enum CSGType
|
|
{
|
|
CSG_ILLEGAL = 0,
|
|
CSG_ADD,
|
|
CSG_ADD_REVERSE,
|
|
CSG_REMOVE,
|
|
CSG_REMOVE_REVERSE,
|
|
CSG_SPLIT_SECTORS,
|
|
CSG_JOIN_SECTORS,
|
|
CSG_SPLIT_POLYGONS,
|
|
CSG_JOIN_POLYGONS,
|
|
CSG_JOIN_POLYGONS_KEEP_TEXTURES,
|
|
CSG_JOIN_ALL_POLYGONS,
|
|
CSG_JOIN_ALL_POLYGONS_KEEP_TEXTURES,
|
|
CSG_JOIN_LAYERS,
|
|
CSG_ADD_ENTITIES,
|
|
};
|
|
|
|
class CUndo
|
|
{
|
|
public:
|
|
CListNode m_lnListNode;
|
|
CTFileName m_fnmUndoFile; // name of temporary file used for undo/redo
|
|
/* Constructor. */
|
|
CUndo(void); // throw char *
|
|
/* Destructor. */
|
|
~CUndo(void);
|
|
};
|
|
|
|
class CWorldEditorDoc : public CDocument
|
|
{
|
|
protected: // create from serialization only
|
|
CWorldEditorDoc();
|
|
DECLARE_DYNCREATE(CWorldEditorDoc)
|
|
|
|
// Attributes
|
|
public:
|
|
CDynamicContainer<CTerrainUndo> m_dcTerrainUndo;
|
|
INDEX m_iCurrentTerrainUndo;
|
|
BOOL m_bAskedToCheckOut;
|
|
SLONG m_slDisplaceTexTime;
|
|
INDEX m_iMirror;
|
|
INDEX m_iTexture;
|
|
CTerrain *m_ptrSelectedTerrain;
|
|
CTextureObject m_toBackdropUp;
|
|
CTextureObject m_toBackdropFt;
|
|
CTextureObject m_toBackdropRt;
|
|
CObject3D m_o3dBackdropObject;
|
|
FLOAT3D m_vCreateBoxVertice0; // vertices that were last used in box creation
|
|
FLOAT3D m_vCreateBoxVertice1;
|
|
FLOAT3D m_avVolumeBoxVertice[ 8]; // volume box vertices
|
|
// number of vertices used for creating last primitive base polygon (-1 for recreate base)
|
|
BOOL m_bPrimitiveCreatedFirstTime;
|
|
INDEX m_ctLastPrimitiveVertices;
|
|
DOUBLE m_fLastPrimitiveWidth;
|
|
DOUBLE m_fLastPrimitiveLenght;
|
|
BOOL m_bLastIfOuter;
|
|
TriangularisationType m_ttLastTriangularisationType;
|
|
// index of vertice on volume box that user is currently dragging
|
|
INDEX m_iVolumeBoxDragVertice;
|
|
// starting position of volume box vertice before drag started
|
|
FLOAT3D m_vVolumeBoxStartDragVertice;
|
|
|
|
BOOL m_bPreLastUsedPrimitiveMode;
|
|
BOOL m_bLastUsedPrimitiveMode;
|
|
CTFileName m_fnLastDroppedTemplate;
|
|
enum CSGType m_csgtPreLastUsedCSGOperation;
|
|
enum CSGType m_csgtLastUsedCSGOperation;
|
|
// list head for undo
|
|
CListHead m_lhUndo;
|
|
// list head for redo
|
|
CListHead m_lhRedo;
|
|
BOOL m_bAutoSnap;
|
|
BOOL m_bOrientationIcons;
|
|
BOOL m_bPrimitiveMode;
|
|
BOOL m_bBrowseEntitiesMode;
|
|
CPlacement3D m_plGrid;
|
|
CPlacement3D m_plSecondLayer;
|
|
CPlacement3D m_plDeltaPlacement;
|
|
CPlacement3D m_plLastPlacement;
|
|
CWorld m_woWorld;
|
|
CWorld *m_pwoSecondLayer; // world for holding second layer
|
|
CEntity *m_penPrimitive;
|
|
// index for holding pre CSG mode
|
|
INDEX m_iPreCSGMode;
|
|
INDEX m_iMode;
|
|
|
|
// volume selection
|
|
CDynamicContainer<CEntity> m_cenEntitiesSelectedByVolume;
|
|
INDEX m_iSelectedEntityInVolume;
|
|
// selections
|
|
CEntitySelection m_selEntitySelection;
|
|
CBrushSectorSelection m_selSectorSelection;
|
|
CBrushVertexSelection m_selVertexSelection;
|
|
CStaticArray<DOUBLE3D> m_avStartDragVertices;
|
|
CBrushPolygonSelection m_selPolygonSelection;
|
|
CStaticArray<CPlacement3D> m_aSelectedEntityPlacements;
|
|
CBrushPolygon *m_pbpoLastCentered;
|
|
|
|
CChangeableRT m_chSelections;
|
|
CChangeableRT m_chDocument;
|
|
|
|
BOOL m_bWasEverSaved; // set if saved at least once (if not - play from testgame.wld)
|
|
BOOL m_bReadOnly; // opened file was read-only
|
|
CWorldEditorView *m_pCutLineView;
|
|
FLOAT3D m_vCutLineStart;
|
|
FLOAT3D m_vCutLineEnd;
|
|
FLOAT3D m_vControlLineDragStart;
|
|
|
|
// Operations
|
|
public:
|
|
// Function corects coordinates of vertices that represent box because given vertice is
|
|
// moved and box has invalid geometry
|
|
void CorrectBox(INDEX iMovedVtx, FLOAT3D vNewPosition);
|
|
// Selects entity with given index inside volume
|
|
void SelectGivenEntity( INDEX iEntityToSelect);
|
|
// adds all world's entities that fall inside volume into volume selection
|
|
void SelectEntitiesByVolumeBox(void);
|
|
void ConvertObject3DToBrush(CObject3D &ob, BOOL bApplyProjectedMapping=FALSE,
|
|
INDEX iMipBrush=0, FLOAT fMipFactor=1E6f, BOOL bApplyDefaultPolygonProperties=TRUE);
|
|
// calculate base of primitive (discard vertex draging)
|
|
void CreateConusPrimitive(void);
|
|
void CreateTorusPrimitive(void);
|
|
void CreateStaircasesPrimitive(void);
|
|
void CreateSpherePrimitive(void);
|
|
void CreateTerrainPrimitive(void);
|
|
void CreateTerrainObject3D( CImageInfo *piiDisplace, INDEX iSlicesX, INDEX iSlicesZ, INDEX iMip);
|
|
void CreatePrimitive(void);
|
|
// apply auto colorize function
|
|
void ApplyAutoColorize(void);
|
|
// refresh primitive page
|
|
void RefreshPrimitivePage(void);
|
|
// refresh primitive page
|
|
void RefreshCurrentInfoPage(void);
|
|
// apply now current primitive settings (used in load primitive settings and history)
|
|
void ApplyCurrentPrimitiveSettings(void);
|
|
BOOL IsEntityCSGEnabled(void);
|
|
// start creating primitive
|
|
void StartPrimitiveCSG( CPlacement3D plPrimitive, BOOL bResetAngles = TRUE);
|
|
// start CSG with world template
|
|
void StartTemplateCSG( CPlacement3D plPrimitive, const CTFileName &fnWorld,
|
|
BOOL bResetAngles = TRUE);
|
|
// inform all views that CSG is started
|
|
void AtStartCSG(void);
|
|
// inform all views that CSG is finished
|
|
void AtStopCSG(void);
|
|
// apply current CSG operation
|
|
void PreApplyCSG(enum CSGType CSGType);
|
|
void ApplyCSG(enum CSGType CSGType);
|
|
// cancel current CSG operation
|
|
void CancelCSG(void);
|
|
// clean up after doing a CSG
|
|
void StopCSG(void);
|
|
// does "snap to grid" for given float
|
|
void SnapFloat( FLOAT &fDest, FLOAT fStep = SNAP_FLOAT_GRID);
|
|
// does "snap to grid" for given angle
|
|
void SnapAngle( ANGLE &angDest, ANGLE fStep = SNAP_ANGLE_GRID);
|
|
// does "snap to grid" for given placement
|
|
void SnapToGrid( CPlacement3D &plPlacement, FLOAT fSnapValue);
|
|
// does "snap to grid" for primitive values
|
|
void SnapPrimitiveValuesToGrid(void);
|
|
// saves curent state of the world as tail of give undo/redo list
|
|
void SaveWorldIntoUndoRedoList( CListHead &lhList);
|
|
// restores last operation from given undo/redo object
|
|
void LoadWorldFromUndoRedoList( CUndo *pUndoRedo);
|
|
// remembers last operation into undo buffer
|
|
void RememberUndo(void);
|
|
// undoes last operation
|
|
void Undo(void);
|
|
// redoes last undoed operation
|
|
void Redo(void);
|
|
// retrieves editing mode
|
|
inline INDEX GetEditingMode() { return m_iMode;};
|
|
// selects all entities in volume
|
|
void OnSelectAllInVolume(void);
|
|
// sets editing mode
|
|
void SetEditingMode( INDEX iNewMode);
|
|
// paste given texture over polygon selection
|
|
void PasteTextureOverSelection_t( CTFileName fnFileName);
|
|
// deselect all selected members in current selection mode
|
|
void DeselectAll(void);
|
|
// Sets message about current mode and selected members
|
|
void SetStatusLineModeInfoMessage( void);
|
|
// creates texture from picture and initializes texture object
|
|
void SetupBackdropTextureObject( CTFileName fnPicture, CTextureObject &to);
|
|
// saves thumbnail
|
|
void SaveThumbnail(void);
|
|
// reset primitive settings
|
|
void ResetPrimitive(void);
|
|
void InsertPrimitiveVertex(INDEX iEdge, FLOAT3D vVertexToInsert);
|
|
void DeletePrimitiveVertex(INDEX iVtxToDelete);
|
|
void ApplyMirrorAndStretch(INDEX iMirror, FLOAT fStretch);
|
|
void SetActiveTextureLayer(INDEX iLayer);
|
|
|
|
void ClearSelections(ESelectionType stExcept=ST_NONE);
|
|
BOOL IsCloneUpdatingAllowed(void);
|
|
|
|
void SetCutMode( CWorldEditorView *pwedView);
|
|
void ApplyCut( void);
|
|
|
|
// show/hide functoins
|
|
void OnHideSelectedEntities(void);
|
|
void OnHideUnselectedEntities(void);
|
|
void OnShowAllEntities(void);
|
|
void OnHideSelectedSectors(void);
|
|
void OnHideUnselectedSectors(void);
|
|
void OnShowAllSectors(void);
|
|
void SetModifiedFlag( BOOL bModified = TRUE);
|
|
|
|
void ReloadWorld(void);
|
|
BOOL IsReadOnly(void);
|
|
BOOL IsBrushUpdatingAllowed(void);
|
|
|
|
void OnIdle(void);
|
|
// Overrides
|
|
// ClassWizard generated virtual function overrides
|
|
//{{AFX_VIRTUAL(CWorldEditorDoc)
|
|
public:
|
|
virtual BOOL OnNewDocument();
|
|
virtual void Serialize(CArchive& ar);
|
|
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
|
|
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
|
|
//}}AFX_VIRTUAL
|
|
|
|
// Implementation
|
|
public:
|
|
virtual ~CWorldEditorDoc();
|
|
#ifdef _DEBUG
|
|
virtual void AssertValid() const;
|
|
virtual void Dump(CDumpContext& dc) const;
|
|
#endif
|
|
|
|
protected:
|
|
|
|
// Generated message map functions
|
|
public:
|
|
//{{AFX_MSG(CWorldEditorDoc)
|
|
afx_msg void OnCsgSplitSectors();
|
|
afx_msg void OnUpdateCsgSplitSectors(CCmdUI* pCmdUI);
|
|
afx_msg void OnCsgCancel();
|
|
afx_msg void OnShowOrientation();
|
|
afx_msg void OnUpdateShowOrientation(CCmdUI* pCmdUI);
|
|
afx_msg void OnEditUndo();
|
|
afx_msg void OnEditRedo();
|
|
afx_msg void OnUpdateEditUndo(CCmdUI* pCmdUI);
|
|
afx_msg void OnUpdateEditRedo(CCmdUI* pCmdUI);
|
|
afx_msg void OnWorldSettings();
|
|
afx_msg void OnCsgJoinSectors();
|
|
afx_msg void OnUpdateCsgJoinSectors(CCmdUI* pCmdUI);
|
|
afx_msg void OnAutoSnap();
|
|
afx_msg void OnCsgAdd();
|
|
afx_msg void OnUpdateCsgAdd(CCmdUI* pCmdUI);
|
|
afx_msg void OnCsgRemove();
|
|
afx_msg void OnUpdateCsgRemove(CCmdUI* pCmdUI);
|
|
afx_msg void OnCsgSplitPolygons();
|
|
afx_msg void OnUpdateCsgSplitPolygons(CCmdUI* pCmdUI);
|
|
afx_msg void OnCsgJoinPolygons();
|
|
afx_msg void OnUpdateCsgJoinPolygons(CCmdUI* pCmdUI);
|
|
afx_msg void OnCalculateShadows();
|
|
afx_msg void OnBrowseEntitiesMode();
|
|
afx_msg void OnUpdateBrowseEntitiesMode(CCmdUI* pCmdUI);
|
|
afx_msg void OnPreviousSelectedEntity();
|
|
afx_msg void OnUpdatePreviousSelectedEntity(CCmdUI* pCmdUI);
|
|
afx_msg void OnNextSelectedEntity();
|
|
afx_msg void OnUpdateNextSelectedEntity(CCmdUI* pCmdUI);
|
|
afx_msg void OnJoinLayers();
|
|
afx_msg void OnUpdateAutoSnap(CCmdUI* pCmdUI);
|
|
afx_msg void OnSelectByClass();
|
|
afx_msg void OnUpdateSelectByClass(CCmdUI* pCmdUI);
|
|
afx_msg void OnCsgJoinAllPolygons();
|
|
afx_msg void OnUpdateCsgJoinAllPolygons(CCmdUI* pCmdUI);
|
|
afx_msg void OnTexture1();
|
|
afx_msg void OnUpdateTexture1(CCmdUI* pCmdUI);
|
|
afx_msg void OnTexture2();
|
|
afx_msg void OnUpdateTexture2(CCmdUI* pCmdUI);
|
|
afx_msg void OnTexture3();
|
|
afx_msg void OnUpdateTexture3(CCmdUI* pCmdUI);
|
|
afx_msg void OnTextureMode1();
|
|
afx_msg void OnTextureMode2();
|
|
afx_msg void OnTextureMode3();
|
|
afx_msg void OnSaveThumbnail();
|
|
afx_msg void OnUpdateLinks();
|
|
afx_msg void OnSnapshot();
|
|
afx_msg void OnMirrorAndStretch();
|
|
afx_msg void OnFlipLayer();
|
|
afx_msg void OnUpdateFlipLayer(CCmdUI* pCmdUI);
|
|
afx_msg void OnFilterSelection();
|
|
afx_msg void OnUpdateClones();
|
|
afx_msg void OnUpdateUpdateClones(CCmdUI* pCmdUI);
|
|
afx_msg void OnSelectByClassAll();
|
|
afx_msg void OnHideSelected();
|
|
afx_msg void OnUpdateHideSelected(CCmdUI* pCmdUI);
|
|
afx_msg void OnHideUnselected();
|
|
afx_msg void OnShowAll();
|
|
afx_msg void OnCheckEdit();
|
|
afx_msg void OnCheckAdd();
|
|
afx_msg void OnCheckDelete();
|
|
afx_msg void OnUpdateCheckEdit(CCmdUI* pCmdUI);
|
|
afx_msg void OnUpdateCheckAdd(CCmdUI* pCmdUI);
|
|
afx_msg void OnUpdateCheckDelete(CCmdUI* pCmdUI);
|
|
afx_msg void OnUpdateBrushes();
|
|
afx_msg void OnSelectByClassImportant();
|
|
afx_msg void OnInsert3dObject();
|
|
afx_msg void OnExport3dObject();
|
|
afx_msg void OnUpdateExport3dObject(CCmdUI* pCmdUI);
|
|
afx_msg void OnCrossroadForN();
|
|
afx_msg void OnPopupVtxAllign();
|
|
afx_msg void OnPopupVtxFilter();
|
|
afx_msg void OnPopupVtxNumeric();
|
|
afx_msg void OnTextureMode4();
|
|
afx_msg void OnTextureMode5();
|
|
afx_msg void OnTextureMode6();
|
|
afx_msg void OnTextureMode7();
|
|
afx_msg void OnTextureMode8();
|
|
afx_msg void OnTextureMode9();
|
|
afx_msg void OnTextureMode10();
|
|
//}}AFX_MSG
|
|
DECLARE_MESSAGE_MAP()
|
|
afx_msg void OnExportPlacements();
|
|
afx_msg void OnExportEntities();
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
#endif // WORLDEDITORDOC_H
|