⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geneditdoc.cpp

📁 3D游戏场景编辑器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/****************************************************************************************/
/*  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 + -