📄 geneditdoc.cpp
字号:
/****************************************************************************************/
/* GenEditDoc.cpp */
/* */
/* Author: Jim Mischel, Ken Baird, Jeff Lomax, John Moore, Bruce Cooner */
/* Description: A very large file that does too much to describe */
/* */
/* The contents of this file are subject to the Genesis3D Public License */
/* Version 1.01 (the "License"); you may not use this file except in */
/* compliance with the License. You may obtain a copy of the License at */
/* http://www.genesis3d.com */
/* */
/* Software distributed under the License is distributed on an "AS IS" */
/* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See */
/* the License for the specific language governing rights and limitations */
/* under the License. */
/* */
/* The Original Code is Genesis3D, released March 25, 1999. */
/*Genesis3D Version 1.1 released November 15, 1999 */
/* Copyright (C) 1999 WildTangent, Inc. All Rights Reserved */
/* */
/* Modified by Tom Morris for GenEdit-Classic ver. 0.58, April 23, 2001 */
//****************************************************************************************/
#include "stdafx.h"
#include "Globals.h"
#include "GenEditDoc.h"
#include <float.h>
#include "CreateArchDialog.h"
#include "CreateBoxDialog.h"
#include "CreateConeDialog.h"
#include "CreateCylDialog.h"
#include "CreateSpheroidDialog.h"
#include "CreateStaircaseDialog.h"
#include "CompileDialog.h"
#include "gridsizedialog.h"
#include "Entity.h"
#include "entitiesdialog.h"
#include "FaceAttributesDialog.h"
#include "BrushAttributesDialog.h"
#include "KeyEditDlg.h"
#include "EntityVisDlg.h"
#include "LevelOptions.h"
#include "GenEditView.h"
#include "wadfile.h"
#include "XForm3d.h"
#include "gbsplib.h"
#include "render.h"
#include "EntityTable.h"
#include "brush.h"
#include "node.h"
#include "facelist.h"
#include "ModelsDlg.h"
#include <afxole.h>
#pragma warning(disable : 4201 4214 4115)
#include <mmsystem.h>
#pragma warning(default : 4201 4214 4115)
#include <errno.h>
#include <direct.h>
#include <assert.h>
#include "basetype.h"
#include "Vec3d.h"
#include "brush.h"
#include "typeio.h"
#include "units.h"
#include "FilePath.h"
#include <io.h> // for _access
#include "ram.h"
#include "util.h"
#include "BrushTemplate.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// Must be within this distance (in pixels) to select anything.
// (Yes, 10,000 is a big number. Right now we want to select the closest thing,
// no matter how far away it is...)
#define MAX_PIXEL_SELECT_DIST (10000)
#define MIN_ENTITY_SELECT_DIST (8.0f)
// Maximum distance from entity in order for it to be selected.
// This is in world space coordinates and is used in rendered view only.
#define MAX_ENTITY_SELECT_DIST (16.0f)
IMPLEMENT_SERIAL(CGenEditDoc, CDocument, 0);
BEGIN_MESSAGE_MAP(CGenEditDoc, CDocument)
//{{AFX_MSG_MAP(CGenEditDoc)
ON_COMMAND(ID_TOOLS_USEGRID, OnToolsUsegrid)
ON_UPDATE_COMMAND_UI(ID_TOOLS_USEGRID, OnUpdateToolsUsegrid)
// ON_COMMAND(ID_TOOLS_GRIDSETTINGS, OnToolsGridsettings)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
// ON_COMMAND(ID_ENTITIES_EDITOR, OnEntitiesEditor)
ON_COMMAND(ID_ENTITIES_SHOW, OnEntitiesShow)
ON_UPDATE_COMMAND_UI(ID_ENTITIES_SHOW, OnUpdateEntitiesShow)
ON_COMMAND(ID_VIEW_SHOW_ALLGROUPS, OnViewShowAllGroups)
ON_COMMAND(ID_VIEW_SHOW_CURRENTGROUP, OnViewShowCurrentGroup)
ON_COMMAND(ID_VIEW_SHOW_VISIBLEGROUPS, OnViewShowVisibleGroups)
ON_UPDATE_COMMAND_UI(ID_VIEW_SHOW_VISIBLEGROUPS, OnUpdateViewShowVisibleGroups)
ON_UPDATE_COMMAND_UI(ID_VIEW_SHOW_ALLGROUPS, OnUpdateViewShowAllGroups)
ON_UPDATE_COMMAND_UI(ID_VIEW_SHOW_CURRENTGROUP, OnUpdateViewShowCurrentGroup)
ON_UPDATE_COMMAND_UI(ID_TOOLS_BRUSH_ADJUSTMENTMODE, OnUpdateBrushAdjustmentmode)
ON_COMMAND(ID_BRUSH_SELECTED_COPYTOCURRENT, OnBrushSelectedCopytocurrent)
ON_COMMAND(ID_BRUSH_SELECTED_DELETE, OnBrushSelectedDelete)
ON_COMMAND(ID_GBSPNOWATER, OnGbspnowater)
ON_UPDATE_COMMAND_UI(ID_TOOLS_FACE_ADJUSTMENTMODE, OnUpdateFaceAdjustmentmode)
ON_COMMAND(ID_CONSTRAINHOLLOWS, OnConstrainhollows)
ON_UPDATE_COMMAND_UI(ID_CONSTRAINHOLLOWS, OnUpdateConstrainhollows)
ON_COMMAND(ID_GENERALSELECT, OnGeneralselect)
ON_UPDATE_COMMAND_UI(ID_GENERALSELECT, OnUpdateGeneralselect)
ON_COMMAND(ID_THING_ATTRIBUTES, OnThingAttributes)
ON_COMMAND(ID_BRUSH_SUBTRACTFROMWORLD, OnBrushSubtractfromworld)
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
ON_COMMAND(ID_COMPILE, OnCompile)
ON_UPDATE_COMMAND_UI(ID_BRUSH_SUBTRACTFROMWORLD, OnUpdateBrushSubtractfromworld)
ON_UPDATE_COMMAND_UI(ID_THING_ATTRIBUTES, OnUpdateThingAttributes)
ON_UPDATE_COMMAND_UI(ID_TOOLS_BRUSH_SHOWASSOCIATEDENTITY, OnUpdateToolsBrushShowassociatedentity)
ON_UPDATE_COMMAND_UI(ID_ENTITIES_EDITOR, OnUpdateEntitiesEditor)
ON_COMMAND(ID_NEW_LIB_OBJECT, OnNewLibObject)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_TOOLS_BRUSH_ADJUSTMENTMODE, OnToolsBrushAdjustmentmode)
ON_COMMAND(ID_TOOLS_FACE_ADJUSTMENTMODE, OnToolsFaceAdjustmentmode)
ON_UPDATE_COMMAND_UI(ID_BRUSH_PRIMITIVES_CUBE, OnUpdateBrushPrimitives)
ON_COMMAND(ID_BRUSH_PRIMITIVES_CUBE, OnBrushPrimitivesCube)
ON_COMMAND(ID_BRUSH_PRIMITIVES_SPHEROID, OnBrushPrimitivesSpheroid)
ON_COMMAND(ID_BRUSH_PRIMITIVES_CYLINDER, OnBrushPrimitivesCylinder)
ON_COMMAND(ID_BRUSH_PRIMITIVES_STAIRCASE, OnBrushPrimitivesStaircase)
ON_COMMAND(ID_VIEW_SHOW_CLIP, OnViewShowClip)
ON_UPDATE_COMMAND_UI(ID_VIEW_SHOW_CLIP, OnUpdateViewShowClip)
ON_COMMAND(ID_VIEW_SHOW_DETAIL, OnViewShowDetail)
ON_UPDATE_COMMAND_UI(ID_VIEW_SHOW_DETAIL, OnUpdateViewShowDetail)
ON_COMMAND(ID_VIEW_SHOW_HINT, OnViewShowHint)
ON_UPDATE_COMMAND_UI(ID_VIEW_SHOW_HINT, OnUpdateViewShowHint)
ON_COMMAND(ID_EDIT_DELETE, OnEditDelete)
ON_COMMAND(ID_BRUSH_PRIMITIVES_ARCH, OnBrushPrimitivesArch)
ON_COMMAND(ID_BRUSH_PRIMITIVES_CONE, OnBrushPrimitivesCone)
ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
ON_COMMAND(ID_TOOLS_BRUSH_ATTRIBUTES, OnToolsBrushAttributes)
ON_UPDATE_COMMAND_UI(ID_TOOLS_BRUSH_ATTRIBUTES, OnUpdateToolsBrushAttributes)
ON_COMMAND(ID_TOOLS_FACE_ATTRIBUTES, OnToolsFaceAttributes)
ON_UPDATE_COMMAND_UI(ID_TOOLS_FACE_ATTRIBUTES, OnUpdateToolsFaceAttributes)
ON_COMMAND(ID_ENTITYVISIBILITY, OnEntityVisibility)
ON_COMMAND(IDM_REBUILD_BSP, OnRebuildBsp)
ON_UPDATE_COMMAND_UI(IDM_REBUILD_BSP, OnUpdateRebuildBsp)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_TOOLS_TOGGLEADJUSTMODE, OnToolsToggleadjustmode)
ON_UPDATE_COMMAND_UI(ID_TOOLS_TOGGLEADJUSTMODE, OnUpdateToolsToggleadjustmode)
ON_COMMAND(IDM_LEVELOPTIONS, OnLeveloptions)
ON_UPDATE_COMMAND_UI(ID_BRUSH_PRIMITIVES_SPHEROID, OnUpdateBrushPrimitives)
ON_UPDATE_COMMAND_UI(ID_BRUSH_PRIMITIVES_CYLINDER, OnUpdateBrushPrimitives)
ON_UPDATE_COMMAND_UI(ID_BRUSH_PRIMITIVES_STAIRCASE, OnUpdateBrushPrimitives)
ON_UPDATE_COMMAND_UI(ID_BRUSH_PRIMITIVES_ARCH, OnUpdateBrushPrimitives)
ON_UPDATE_COMMAND_UI(ID_BRUSH_PRIMITIVES_CONE, OnUpdateBrushPrimitives)
//}}AFX_MSG_MAP
ON_UPDATE_COMMAND_UI_RANGE( ID_BRUSH_SELECTED_DELETE, ID_BRUSH_SELECTED_COPYTOCURRENT, OnSelectedTypeCmdUI)
END_MESSAGE_MAP()
#pragma warning (disable:4100)
void CGenEditDoc::Serialize(CArchive& ar)
{
_ASSERTE(0);
}
#pragma warning (default:4100)
WadFileEntry* CGenEditDoc::GetDibBitmap(const char *Name)
{
return Level_GetWadBitmap (pLevel, Name);
}
const char *CGenEditDoc::FindTextureLibrary (char const *WadName)
{
static char WorkPath[MAX_PATH];
const Prefs *pPrefs;
::FilePath_AppendName (LastPath, WadName, WorkPath);
if (_access (WorkPath, 0) == 0)
{
return WorkPath;
}
pPrefs = GetPrefs ();
if (FilePath_SearchForFile (WadName, Prefs_GetTxlSearchPath (pPrefs), WorkPath))
{
return WorkPath;
}
// post 0.55 // prompts user to select a valid *.txl file should GenEdit-Classic
// fail to locate the default *.txl
else
{
CString txlPathError = _T("GenEdit-Classic checks for the default *.txl file when opening new levels.\n\n");
txlPathError += _T("GenEdit-Classic now is looking for...\n\n");
txlPathError += _T(WorkPath);
txlPathError += _T("\n\nbut cannot find it.\n\n");
txlPathError += _T("To avoid this message in the future, place or rename a *.txl file as...");
txlPathError += _T(WadName);
txlPathError += _T("\ninto the above path. Or edit the GenEdit.ini file to reflect\n");
txlPathError += _T("the name of your default *.txl file.\n\n");
txlPathError += _T("For now, please select a valid *.txl file or the application will exit.");
MessageBox(NULL, txlPathError, "GenEdit-Classic cannot find default *.txl", MB_OK);
CFileDialog FileDlg (TRUE,
"txl",
WorkPath,
OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR,
"Texture Library Files (*.txl)|*.txl||");
FileDlg.m_ofn.lpstrTitle ="GenEdit-Classic Texture Finder";
if (FileDlg.DoModal () == IDOK)
{
CString wadpath = FileDlg.GetPathName();
CString wadFileName = FileDlg.GetFileName();
strcpy(WorkPath, wadpath.GetBuffer(260));
// set the Prefs wadfile to THIS one -- this session only
Prefs_SetTxlName((Prefs*)pPrefs, wadFileName.GetBuffer(64));
}
return WorkPath;
}
// post 0.55
return NULL;
}
CGenEditDoc::CGenEditDoc() : CDocument (),
SelectLock (FALSE),
TempEnt (FALSE),
SelState (NOSELECTIONS),
mShowSelectedFaces (FALSE),
mShowSelectedBrushes (FALSE),
LeakPoints (NULL),
NumLeakPoints (0),
bLeakLoaded (FALSE),
bShowLeak (TRUE),
IsNewDocument (1),
mShowEntities (GE_TRUE),
mCurTextureSelection (1),
bShowClipBrushes (GE_TRUE),
bShowDetailBrushes (GE_TRUE),
bShowHintBrushes (GE_TRUE),
mpActiveViewFrame (NULL),
mpBrushAttributes (NULL),
mpFaceAttributes (NULL),
/*mpTextureView (NULL), */
mWorldBsp (NULL),
mActiveView (-1),
mCurrentEntity (-1),
mModeTool (ID_TOOLS_TEMPLATE),
mAdjustMode (ADJUST_MODE_BRUSH),
mCurrentTool (ID_TOOLS_BRUSH_SCALEBRUSH),
mShowBrush (TRUE),
mConstrainHollows (GE_TRUE),
mCurrentBitmap (0),
NumSelEntities (0),
//mTextureBrowserOpen (0),
mCurrentGroup (0),
TempShearTemplate (NULL),
PlaceObjectFlag (FALSE),
pSelFaces (NULL),
pSelBrushes (NULL),
pTempSelBrushes (NULL),
m_fWorldScaleFactor(1.0f),
m_fEntityScaleInViewFactor(1.0f)
{
const char *DefaultWadName = "";
const Prefs *pPrefs = GetPrefs ();
DefaultWadName = Prefs_GetTxlName (pPrefs);
strcpy (LastPath, Prefs_GetProjectDir (pPrefs));
const char *WadPath = FindTextureLibrary (DefaultWadName);
// post 0.55 now checks for presence of default *.txl in FindTextureLibrary(
// if (WadPath == NULL)
// {
// AfxMessageBox ("Can't find texture library");
// }
pLevel = Level_Create (WadPath, Prefs_GetHeadersList (pPrefs));
if (!Level_LoadWad (pLevel))
{
CString Msg;
AfxFormatString1 (Msg, IDS_CANTLOADTXL, WadPath);
AfxMessageBox (Msg);
}
mpMainFrame=(CMainFrame*)AfxGetMainWnd();
pSelBrushes = SelBrushList_Create ();
pTempSelBrushes = SelBrushList_Create ();
pSelFaces = SelFaceList_Create ();
SetLockAxis( 0 ) ; // Start with no axis locked
{
// create our default box
BrushTemplate_Box *pBoxTemplate;
pBoxTemplate = Level_GetBoxTemplate (pLevel);
BTemplate = BrushTemplate_CreateBox (pBoxTemplate);
}
Brush_Bound(BTemplate);
CurBrush =BTemplate;
m_recentStairs = NULL;
m_recentCyl = NULL;
m_recentSphere = NULL;
m_recentCube = NULL;
m_recentCone = NULL;
m_recentArch = NULL;
geVec3d_Clear(&SelectedGeoCenter);
AddCameraEntityToLevel ();
// new g3dc
CreateCube(); // added in order to display cube template
// dialog on Perties Panel at startup
pUndoStack = UndoStack_Create ();
}/* CGenEditDoc::CGenEditDoc */
void CGenEditDoc::AddCameraEntityToLevel (void)
{
// Make default camera entity
CEntity CameraEntity ;
CString cstr;
CreateEntityFromName( "Camera", CameraEntity ) ;
cstr.LoadString( IDS_CAMERAENTITYNAME ) ;
CameraEntity.SetKeyValue ("%name%", cstr );
CameraEntity.SetOrigin ( 0.0f, 0.0f, 0.0f, Level_GetEntityDefs (pLevel) );
Level_AddEntity (pLevel, CameraEntity);
}
CGenEditDoc::~CGenEditDoc()
{
if (mWorldBsp != NULL) Node_ClearBsp(mWorldBsp);
if (pLevel != NULL) Level_Destroy (&pLevel);
if (BTemplate != NULL) Brush_Destroy (&BTemplate);
if (pUndoStack != NULL) UndoStack_Destroy (&pUndoStack);
if (pSelBrushes != NULL) SelBrushList_Destroy (&pSelBrushes);
if (pTempSelBrushes != NULL)SelBrushList_Destroy (&pTempSelBrushes);
if (LeakPoints != NULL) geRam_Free(LeakPoints);
if (pSelFaces != NULL) SelFaceList_Destroy (&pSelFaces);
OpenClipboard(mpMainFrame->GetSafeHwnd());
EmptyClipboard();
CloseClipboard();
}
// obsolete old gedit
void CGenEditDoc::DeleteFaceAttributes (void)
{
if (mpFaceAttributes != NULL)
{
delete mpFaceAttributes;
mpFaceAttributes = NULL;
}
}
// obsolete old gedit
void CGenEditDoc::DeleteBrushAttributes (void)
{
if (mpBrushAttributes != NULL)
{
delete mpBrushAttributes;
mpBrushAttributes = NULL;
}
}
bool CGenEditDoc::SetEntityScaleInView(geFloat scale) // post 0.57
{
m_fEntityScaleInViewFactor = scale;
return true;
}
geFloat CGenEditDoc::GetEntityScaleInView() // post 0.57
{
return m_fEntityScaleInViewFactor;
}
static void fdocDrawEntity
(
CEntity const * pEnt,
ViewVars const * v,
CDC * pDC,
EntityTable const *pEntityDefs,
BOOL bShowUI
)
{
#define ENTITY_SIZE (8.0f) // 16" across // old gedit
//#define ENTITY_SIZE (16.0f) // 32" across // new g3dc
geVec3d VecOrigin;
geVec3d EntSizeWorld; // entity size in world space
POINT EntPosView;
POINT EntSizeView;
POINT EntWidthHeight ;
POINT OriginView;
POINT TopLeft, BottomRight;
POINT TopRight, BottomLeft;
static const float COS45 = (float)cos (M_PI/4.0f);
static const float SIN45 = (float)sin (M_PI/4.0f);
static const float MCOS45 = (float)cos (-(M_PI/4.0f));
static const float MSIN45 = (float)sin (-(M_PI/4.0f));
// compute entity size in view coordinates
geVec3d_Set (&EntSizeWorld, ENTITY_SIZE, ENTITY_SIZE, ENTITY_SIZE);
EntSizeView = Render_OrthoWorldToView ( v, &EntSizeWorld);
geVec3d_Clear (&VecOrigin);
OriginView = Render_OrthoWorldToView ( v, &VecOrigin);
// This one is the width and height of the Entity
EntWidthHeight.x = max( OriginView.x, EntSizeView.x ) - min( OriginView.x, EntSizeView.x ) ;
EntWidthHeight.y = max( OriginView.y, EntSizeView.y ) - min( OriginView.y, EntSizeView.y ) ;
// This can have negative numbers
EntSizeView.x -= OriginView.x;
EntSizeView.y -= OriginView.y;
// entity's position in the view
EntPosView = Render_OrthoWorldToView ( v, &(pEnt->mOrigin));
{
// post 0.57 for changing the scale of entities
// as they are drawn in the ortho views
static float entityScaleFactor;
CGenEditDoc *pDoc = CGlobals::GetActiveDocument();
if (pDoc)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -