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

📄 enginemap.cpp

📁 墨香完整原代码 C++ 值得研究 可以编译
💻 CPP
字号:
// EngineMap.cpp: implementation of the EngineMap class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "EngineMap.h"
//#include "../MainGame.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CEngineMap::CEngineMap()
{
	m_bMapBuild = FALSE;
}

CEngineMap::~CEngineMap()
{
	//Release();
}

BOOL CEngineMap::Init(char* szMapFile)
{
	//return g_pExecutive->LoadMapScript(szMapFile,MapLoadCallback,0);
	return g_pExecutive->LoadMapScript(szMapFile,NULL,0);
	m_pExecutive = g_pExecutive;
	
	BOOL	bBuildTree	=	FALSE;	

	char	buf[128];

	FILE*	fp;
	fp = fopen(szMapFile,"rt");

	while (fscanf(fp,"%s",buf)!=EOF)
	{
		if( !lstrcmp( buf, PID_GX_METADATA))
		{
			while( lstrcmp( buf, "}"))
			{
				fscanf( fp, "%s", buf);
				if( !lstrcmp( buf, PID_BOUNDINGBOX_MAX))
				{
					fscanf( fp, "%f %f %f", &m_WorldBox.Max.x, &m_WorldBox.Max.y, &m_WorldBox.Max.z);
					
				}
				else if( !lstrcmp( buf, PID_BOUNDINGBOX_MIN))
				{
					fscanf( fp, "%f %f %f", &m_WorldBox.Min.x, &m_WorldBox.Min.y, &m_WorldBox.Min.z);
				}

			}
		}
		if (!lstrcmp(buf,PID_GX_MAP))
		{
			while (lstrcmp(buf,"}"))
			{
				fscanf(fp,"%s",buf);
				if (!lstrcmp(buf,PID_STATIC_MODEL))
				{
					fscanf(fp,"%s",buf);
					ImportStaticModel(buf);
					bBuildTree	=	TRUE;
				}
				if (!lstrcmp(buf,PID_HEIGHT_FIELD))
				{
					fscanf(fp,"%s",buf);
					ImportHeightField(buf,0);
					bBuildTree	=	TRUE;
				}


			}
			if (bBuildTree)
				BuildMap(&m_WorldBox);

			
		}

		if (!lstrcmp(buf,PID_GX_OBJECT))
		{
			DWORD	dwGXObjectsNum;
			fscanf(fp,"%u",&dwGXObjectsNum);

			fscanf(fp,"%s",buf);		// {
			for (DWORD i=0; i<dwGXObjectsNum; i++)
			{
				DWORD		dwFlag;
				DWORD		dwID;
				VECTOR3		v3Scale,v3Pos,v3Axis;
				float		fRad;

				// | 颇老疙 | 绊蜡ID | 胶纳老 | 困摹 | 绵氦磐 | 规氢阿 | 敲贰弊 
				fscanf(fp,"%s",buf);		// 颇老疙
				fscanf(fp,"%u",&dwID);		// 绊蜡ID
				fscanf(fp,"%f %f %f",&v3Scale.x,&v3Scale.y,&v3Scale.z);
				fscanf(fp,"%f %f %f",&v3Pos.x,&v3Pos.y,&v3Pos.z);
				fscanf(fp,"%f %f %f %f",&v3Axis.x,&v3Axis.y,&v3Axis.z,&fRad);
				fscanf(fp,"%x",&dwFlag);
				
				GXOBJECT_HANDLE gxo = m_pExecutive->CreateGXObject(buf,NULL,NULL,dwFlag);

				//////////////////////////////////////////////////////////////////////////
				// yh edit
				DWORD motionNum = m_pExecutive->GXOGetMotionNum(gxo,0);
				if(motionNum > 0)
				{
					m_pExecutive->DeleteGXObject(gxo);
					gxo = m_pExecutive->CreateGXObject(buf,NULL,NULL,dwFlag|GXOBJECT_CREATE_TYPE_DEFAULT_PROC);
				}
				//////////////////////////////////////////////////////////////////////////

				if (gxo)
				{
					m_pExecutive->SetID(gxo,dwID);
									
					m_pExecutive->GXOSetScale(gxo,&v3Scale);
					m_pExecutive->GXOSetPosition(gxo,&v3Pos, FALSE);
					m_pExecutive->GXOSetDirection(gxo,&v3Axis,fRad);

					/*
					char*	pFileName;
					pFileName = (char*)m_pExecutive->GetData(gxo);
					pFileName = new char[lstrlen(buf)+1];
					lstrcpy(pFileName,buf);
					m_pExecutive->SetData(gxo,pFileName);
					*/


					m_GXObjectList.AddTail(gxo);
				}
			}
			fscanf(fp,"%s",buf);		// }
		}
		if (!lstrcmp(buf,PID_GX_LIGHT))
		{
			DWORD	dwGXLightsNum;
			fscanf(fp,"%u",&dwGXLightsNum);

		
			fscanf(fp,"%s",buf);		// {
			for (DWORD i=0; i<dwGXLightsNum; i++)
			{
				
				LIGHT_DESC	lightDesc;
				memset(&lightDesc,0,sizeof(LIGHT_DESC));
				DWORD		dwFlag;

				// | RGBA | 困摹 |裹困(CM) | 敲贰弊 
				fscanf(fp,"%x",&lightDesc.dwDiffuse);
				fscanf(fp,"%f %f %f %f",&lightDesc.v3Point.x,&lightDesc.v3Point.y,&lightDesc.v3Point.z,&lightDesc.fRs);
				fscanf(fp,"%x",&dwFlag);
				dwFlag |= GXLIGHT_TYPE_STATIC;

				GXLIGHT_HANDLE	gxl = m_pExecutive->CreateGXLight(&lightDesc,NULL,NULL,0xffffffff,NULL,dwFlag);


				if(gxl)
				{
					m_GXLightList.AddTail(gxl);
				}
			}
			fscanf(fp,"%s",buf);		// }
		}
		if (!lstrcmp(buf,PID_GX_TRIGGER))
		{
			DWORD	dwGXTriggerNum;
			fscanf(fp,"%u",&dwGXTriggerNum);

		
			fscanf(fp,"%s",buf);		// {
			for (DWORD i=0; i<dwGXTriggerNum; i++)
			{
				EVENT_TRIGGER_DESC	triggerDesc;
				memset(&triggerDesc,0,sizeof(triggerDesc));
				DWORD		dwFlag;
				DWORD		dwID;

					
				// 绊蜡酒捞叼 | RGBA | 困摹 | 胶纳老 | 雀傈 | 敲贰弊 
				fscanf(fp,"%u",&dwID);
				fscanf(fp,"%x",&triggerDesc.dwColor);
				fscanf(fp,"%f %f %f",&triggerDesc.v3Pos.x,&triggerDesc.v3Pos.y,&triggerDesc.v3Pos.z);
				fscanf(fp,"%f %f %f",&triggerDesc.v3Scale.x,&triggerDesc.v3Scale.y,&triggerDesc.v3Scale.z);
				fscanf(fp,"%f %f %f",&triggerDesc.v3Rot.x,&triggerDesc.v3Rot.y,&triggerDesc.v3Rot.z);
				fscanf(fp,"%x",&dwFlag);

				GXTRIGGER_HANDLE	gxt = m_pExecutive->CreateGXEventTrigger(NULL,NULL,dwFlag);
				m_pExecutive->SetID(gxt,dwID);
				m_pExecutive->GXTSetPosition(gxt,&triggerDesc.v3Pos);
				m_pExecutive->GXTSetScale(gxt,&triggerDesc.v3Scale);
				m_pExecutive->GXTSetRotation(gxt,&triggerDesc.v3Rot);
			}
			fscanf(fp,"%s",buf);		// }
				
		}
		
	} 


	fclose(fp);

	return m_bMapBuild;
}

void CEngineMap::Release()
{
	if(g_pExecutive)
	{
		//g_pExecutive->DeleteAllGXMapObjectsWitLoadMapScript();
		GXOBJECT_HANDLE gxo;
		GXLIGHT_HANDLE gxl;
		while(gxo = m_GXObjectList.RemoveTail())
		{
			g_pExecutive->DeleteGXObject(gxo);
		}
		while(gxl = m_GXLightList.RemoveTail())
		{
			g_pExecutive->DeleteGXLight(gxl);
		}

		CleanHeightField();
		CleanStaticModel();
		g_pExecutive->DeleteGXMap(m_ghMap);		
	}
}

void CEngineMap::SetAmbientColor(DWORD Color)
{
	g_pExecutive->GetGeometry()->SetAmbientColor(0,Color);
}



BOOL CEngineMap::ImportHeightField(char* szFileName,DWORD dwIndexBufferNum)
{
	
	TEXTURE_TABLE*	pTexTable = NULL;
	BOOL			bResult = FALSE;
	
	CleanHeightField();

	bResult = m_pExecutive->GetGeometry()->CreateHeightField(&m_pHField,0);

	if (!m_pHField->ReadFile(szFileName,dwIndexBufferNum,NULL,0))
	{
		m_pHField->Release();
		m_pHField = NULL;
		memset(m_szHFieldName,0,sizeof(m_szHFieldName));
		return FALSE;
	}
	lstrcpy(m_szHFieldName,szFileName);


	m_pHField->GetHFieldDesc(&m_hfDesc);
	
//	for (DWORD i=0; i<4; i++)
//		ResetDefaultCamera(i);

	m_pExecutive->GetRenderer()->SetLightMapFlag(0);

	return bResult;

}

BOOL CEngineMap::ImportStaticModel(char* szFileName)
{
	I3DStaticModel*	pStaticModel = NULL;
	
	if (0xffffffff == m_pExecutive->GetGeometry()->CreateStaticModel(&pStaticModel,4000,500,0))
		return FALSE;


	if (!pStaticModel->ReadFile(szFileName,NULL,STATIC_MODEL_LOAD_ENABLE_SHADE))
	{
		pStaticModel->Release();
		return FALSE;
	}

	if (m_ghMap)
	{
		m_pExecutive->DeleteGXMap(m_ghMap);
		m_ghMap = NULL;
	}

	CleanStaticModel();

	m_pStaticModel = pStaticModel;
	m_pStaticModel->BeginCreateMesh(0);

	return TRUE;
}

void CEngineMap::CleanHeightField()
{	
	if (m_pHField)
	{
		m_pHField->Release();
		m_pHField = NULL;
	}

	memset(&m_hfDesc,0,sizeof(m_hfDesc));
	
	m_bMapBuild = FALSE;
}
void CEngineMap::CleanStaticModel()
{
	if (m_pStaticModel)
	{
		m_pStaticModel->Release();
		m_pStaticModel = NULL;
	}
	m_bMapBuild = FALSE;
}

BOOL CEngineMap::BuildMap(MAABB* pWorldBox)
{
	if (m_bMapBuild)
	{
		m_pExecutive->RebuildMap(pWorldBox->Max.y, pWorldBox->Min.y);
		m_WorldBox	=	*pWorldBox;
		return TRUE;

	}
	if( (pWorldBox->Max.y - pWorldBox->Min.y) <= 0.0f)
	{
		pWorldBox->Max.y	=	pWorldBox->Min.y	+	100.0f;
	}
	m_WorldBox.Max.y	=	pWorldBox->Max.y;
	m_WorldBox.Min.y	=	pWorldBox->Min.y;

	m_ghMap = m_pExecutive->CreateGXMap(NULL,0,NULL);

	m_pExecutive->BeginBuildMap(0);

	if (m_pStaticModel)
		m_pExecutive->InsertStaticModelTOGXMap(m_pStaticModel);
	
	if (m_pHField)
		m_pExecutive->InsertHFieldToGXMap(m_pHField);

	m_pExecutive->EndBuildMap(pWorldBox->Max.y,pWorldBox->Min.z);

	m_pExecutive->GetWorldBoundingBox( &m_WorldBox);

	m_bMapBuild = TRUE;
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -