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

📄 terrscene.cc

📁 五行MMORPG引擎系统V1.0
💻 CC
字号:
//-----------------------------------------------------------------------------
// 世界场景管理
// 李亦.2006.5.26
//-----------------------------------------------------------------------------

#include "terrain/terrScene.h"
#include "terrain/terrData.h"
//#include "dgl/dgl.h"
//#include "dgl/gBitmap.h"
//#include "dgl/gTexManager.h"
//#include "dgl/materialList.h"
//#include "dgl/materialPropertyMap.h"
//#include "math/mMath.h"			
//#include "math/mathIO.h"
//#include "core/fileStream.h"
//#include "core/bitStream.h"
//#include "console/consoleTypes.h"
//#include "sceneGraph/sceneGraph.h"
//#include "sceneGraph/sceneState.h"
//#include "sim/netConnection.h"


//DEFINE_FIXEDSIZE_ALLOCATOR(SceneGrid,128,128);


//--------------------------------------
TerrainScene::TerrainScene()
{
	m_pGridFlagBase = 0;
	m_pGridFlagRows = 0;
	m_pGridHashTable= 0;
}

TerrainScene::~TerrainScene()
{
	freeData();
}

void TerrainScene::freeData()
{
	if(m_pGridHashTable)
	{
		SceneGrid* it,*pDel;
		U32 nAmount = m_uHashMask+1;
		for(U32 n=0; n< nAmount; n++)
		{
			SceneGrid* pGrid = m_pGridHashTable[n];
			if(pGrid == 0)
				continue;

			for(it = m_pGridHashTable[n]; it != 0; )
			{
				pDel	= it;
				it		= it->pNext;
				delete pDel;
			}
		}
	}

	dFree(m_pGridFlagBase);
	dFree(m_pGridFlagRows);
	dFree(m_pGridHashTable);
}

void TerrainScene::initScene(TerrainBlock* pTerrain)
{
	AssertWarn(pTerrain,"地形指针不能为空...");
	m_nSceneWidth 	= pTerrain->getSquareSize() * TerrainBlock::BlockSize;
	m_nSceneHeight = m_nSceneWidth;
	m_nScenePitch	= (m_nSceneWidth + 3)& ~3; // dword对齐

	U32 nAmount = m_nScenePitch * m_nSceneHeight;
	
	//m_nHashMask = getNextPow2(nAmount >> 2) -1;	//划分4块
	m_uHashMask	= 255;
	m_pGridHashTable = (SceneGrid**)dMalloc(sizeof(SceneGrid*) * (m_uHashMask+1));
	dMemset(m_pGridHashTable, 0,sizeof(SceneGrid*) * (m_uHashMask+1));


	m_pGridFlagBase = (U8*)dMalloc(nAmount);		/// 位数/8 换算为 U8数
	dMemset(m_pGridFlagBase, 0,nAmount * sizeof(U8));
	
	m_pGridFlagRows = (U8**)dMalloc(sizeof(U8*) *m_nSceneHeight);
	for(U32 n=0; n<m_nSceneHeight; n++)
		m_pGridFlagRows[n] = m_pGridFlagBase + n * m_nScenePitch;

	//setGridAt(0,0,1); //测试
}




SceneGrid* TerrainScene::setGridAt(S32 x, S32 y,U8 cFlags)
{
	if(cFlags == 0)
		return 0;
	AssertWarn(m_pGridFlagRows && m_pGridFlagRows[y],"标志列表未分配空间");
	m_pGridFlagRows[y][x] = cFlags;
	
	SceneGrid* it;
	U32 nIndex = hashIndex(x,y);
	for(it = m_pGridHashTable[nIndex]; it != 0; it = it->pNext)
		if(it->x == x && it->y == y)
			return it;
	if(it == 0)
	{	
		it = new SceneGrid;
		it->x = x;
		it->y = y;
		it->pNext = m_pGridHashTable[nIndex];
		m_pGridHashTable[nIndex] = it;
	}
	return it;
}


//--------------------------------------
bool TerrainScene::save(const char *filename)
{
   FileStream writeFile;
   if (!ResourceManager->openFileForWrite(writeFile, filename))
      return false;

   // write the VERSION and HeightField
   writeFile.write((U8)FILE_VERSION);
	
	//基本标志信息
	U32 nAmount = m_nScenePitch * m_nSceneHeight;
   writeFile.write(m_nSceneWidth);
   writeFile.write(m_nSceneHeight);
   writeFile.write(nAmount * sizeof(U8), m_pGridFlagBase);
	
	//格子具体信息
	nAmount = m_uHashMask+1;
	writeFile.write(m_uHashMask);

	for(U32 n=0; n< nAmount; n++)
	{
		SceneGrid* pGrid = m_pGridHashTable[n];
		if(pGrid == 0)
		{
			writeFile.write((U32)0);
			continue;
		}

		U32 uGridNum = 0;
		SceneGrid* it;
		for(it = m_pGridHashTable[n]; it != 0; it = it->pNext)
			uGridNum++;

		writeFile.write(uGridNum);

		for(it = m_pGridHashTable[n]; it != 0; it = it->pNext)
		{
			writeFile.write(pGrid->x);
			writeFile.write(pGrid->y);
			writeFile.write(pGrid->uFlags);
			writeFile.write(pGrid->uMouse);

			if(m_pGridFlagRows[pGrid->y][pGrid->x] & GT_TRAP)
				writeFile.writeString(pGrid->unData.pScriptFuncName);

			else if(m_pGridFlagRows[pGrid->y][pGrid->x] & GT_ENTRY)
			{
				writeFile.write(pGrid->unData.sceEntry.nDestX);
				writeFile.write(pGrid->unData.sceEntry.nDestY);
				writeFile.write(pGrid->unData.sceEntry.pSceneName);
			}
		}//for

	}//for

   return (writeFile.getStatus() == FileStream::Ok);
}


bool TerrainScene::read(Stream &stream)
{
   U8 version;
   stream.read(&version);
   if (version > TerrainScene::FILE_VERSION)
      return NULL;

   if (version != TerrainScene::FILE_VERSION) {
      Con::errorf(" ****************************************************");
      Con::errorf(" ****************************************************");
      Con::errorf("           版本不一致,请检验后再行操作...");
      Con::errorf(" ****************************************************");
      Con::errorf(" ****************************************************");
   }

	freeData();


	stream.read(&m_nSceneWidth);
	stream.read(&m_nSceneHeight);
	m_nScenePitch	= (m_nSceneWidth + 3)& ~3; // dword对齐

	U32 nAmount = m_nScenePitch * m_nSceneHeight;
	m_pGridFlagBase = (U8*)dMalloc(nAmount);		/// 位数/8 换算为 U8数
	stream.read(nAmount, m_pGridFlagBase);

	m_pGridFlagRows = (U8**)dMalloc(sizeof(U8*) *m_nSceneHeight);
	for(U32 n=0; n<m_nSceneHeight; n++)
		m_pGridFlagRows[n] = m_pGridFlagBase + n * m_nScenePitch;



	char tempBuf[1024];


	stream.read(&m_uHashMask);
	nAmount = m_uHashMask + 1;
	m_pGridHashTable = (SceneGrid**)dMalloc(sizeof(SceneGrid*) * (nAmount));

	for(U32 n=0; n< nAmount; n++)
	{
		m_pGridHashTable[n] = 0;	//先清0

		U32 uGridNum = 0;
		stream.read(&uGridNum);
		if(uGridNum == 0)
			continue;


		for(U32 m=0; m < uGridNum;m++)
		{
			SceneGrid* pGrid = new SceneGrid;
			pGrid->pNext = m_pGridHashTable[n];
			m_pGridHashTable[n] = pGrid;

			stream.read(&pGrid->x);
			stream.read(&pGrid->y);
			stream.read(&pGrid->uFlags);
			stream.read(&pGrid->uMouse);

			if(m_pGridFlagRows[pGrid->y][pGrid->x] & GT_TRAP)
			{	
				stream.readString(tempBuf);
				pGrid->unData.pScriptFuncName = StringTable->insert(tempBuf);
			}

			else if(m_pGridFlagRows[pGrid->y][pGrid->x] & GT_ENTRY)
			{
				stream.read(&pGrid->unData.sceEntry.nDestX);
				stream.read(&pGrid->unData.sceEntry.nDestY);
				stream.readString(tempBuf);
				pGrid->unData.sceEntry.pSceneName =  StringTable->insert(tempBuf);
			}
		}//for
	}//for
	
   return (stream.getStatus() == FileStream::Ok);
}


//--------------------------------------
ResourceInstance *constructTerrainScene(Stream &stream)
{
   TerrainScene* ret = new TerrainScene;
	if(ret->read(stream))
		return ret;

	delete ret;
	return 0;
}


⌨️ 快捷键说明

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