Exemple #1
0
static void *cb_func(const char* value, void *user_data)
{
  SVector* result = reinterpret_cast<SVector*>(user_data);
  result->push_back(value);
  return NULL;
}
bool sqr::CSceneAmpCoder::DeCode_Ver_H( const CDataChunk& inData,OBJ_HANDLE handle )
{
	CSceneManagerClient* pScene = (CSceneManagerClient*)handle;
	CPkgFile& File = *((CPkgFile*)inData.GetBuffer());

	DeCoder_Com_B_D(File,handle);

	//////////////////////////////////////////////////////////////////////////
	//read specular parameter 无效数据
	uint32 uColor = 0; 
	float  fPower = 0.0f;

	File.Read(&uColor, sizeof(uColor));
	File.Read(&uColor, sizeof(uColor));
	File.Read(&fPower, sizeof(fPower));
	File.Read(&fPower, sizeof(fPower));
	//////////////////////////////////////////////////////////////////////////

	locale loc = locale::global(locale(""));
	uint32 dwNameLen = 0;
	char szBuf[256];
	//////////////////////////////////////////////////////////////////////////
	//region ambient fx name
	SVector<SString>  ambientFxNameList;
	size_t size = 0;
	File.read(&size, sizeof(size_t));
	for ( size_t i = 0; i < size; ++i )
	{
		SString strEffectName = "";

		// 		File.Read(&dwNameLen,sizeof(dwNameLen));
		// 		File.Read(szBuf, sizeof(char)*dwNameLen);
		// 		szBuf[dwNameLen] = 0;
		// 		strEffectFileName = szBuf;

		File.Read(&dwNameLen,sizeof(dwNameLen));
		File.Read(szBuf, sizeof(char)*dwNameLen);
		szBuf[dwNameLen] = 0;
		strEffectName = szBuf;

		//		strEffectFileName = "fx\\setting\\mapfx_ambient_yb\\" + strEffectName + ".efx";

		ambientFxNameList.push_back(strEffectName);
	}
	//////////////////////////////////////////////////////////////////////////

	size = 0;
	File.read(&size, sizeof(size_t));
	if( size == 0 )
		return true;
	else
	{
		for( size_t i = 0; i < size; ++i )
		{
			RegionsInfo *pRgnInfo = new RegionsInfo;

			if( !pRgnInfo )
				return false;
			///scene
			File.read(&pRgnInfo->lightParam.globalAmbient.R,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalAmbient.G,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalAmbient.B,  sizeof(uint8));

			File.read(&pRgnInfo->lightParam.globalDiffuse.R,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalDiffuse.G,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalDiffuse.B,  sizeof(uint8));

			File.read(&pRgnInfo->lightParam.globalSpecular.R, sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalSpecular.G, sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalSpecular.B, sizeof(uint8));

#ifndef AMBIENT_SHADOW_COLOR
			File.read(&pRgnInfo->lightParam.globalShadow.R,   sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalShadow.G,   sizeof(uint8));
			File.read(&pRgnInfo->lightParam.globalShadow.B,   sizeof(uint8));
#else
			uint8 dummy;
			File.read(&dummy,   sizeof(uint8));
			File.read(&dummy,   sizeof(uint8));
			File.read(&dummy,   sizeof(uint8));
#endif

			File.read(&pRgnInfo->lightParam.fogColor.R,		  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.fogColor.G,		  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.fogColor.B,		  sizeof(uint8));

			///player
			File.read(&pRgnInfo->lightParam.playerAmbient.R,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.playerAmbient.G,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.playerAmbient.B,  sizeof(uint8));

			File.read(&pRgnInfo->lightParam.playerDiffuse.R,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.playerDiffuse.G,  sizeof(uint8));
			File.read(&pRgnInfo->lightParam.playerDiffuse.B,  sizeof(uint8));

			File.read(&pRgnInfo->lightParam.playerSpecular.R, sizeof(uint8));
			File.read(&pRgnInfo->lightParam.playerSpecular.G, sizeof(uint8));
			File.read(&pRgnInfo->lightParam.playerSpecular.B, sizeof(uint8));

			File.read(&pRgnInfo->uFogMode,					  sizeof(pRgnInfo->uFogMode));
			File.read(&pRgnInfo->lightParam.fogStart,		  sizeof(float));
			File.read(&pRgnInfo->lightParam.fogEnd,			  sizeof(float));
			File.read(&pRgnInfo->lightParam.fogDensity,       sizeof(float));

			///music name
			File.Read(&dwNameLen,sizeof(dwNameLen));
			File.Read(szBuf, sizeof(char)*dwNameLen);
			pRgnInfo->strMusicName = szBuf;

			///ambient effect
			size_t ambientFxSize = 0;
			File.read(&ambientFxSize, sizeof(ambientFxSize));
			for ( size_t m = 0; m < ambientFxSize; ++m )
			{
				int nIndex = 0;
				File.read(&nIndex, sizeof(nIndex));

				DWORD dwPlayMin = 0;
				File.read(&dwPlayMin, sizeof(dwPlayMin));

				DWORD dwPlayMax = 0;
				File.read(&dwPlayMax, sizeof(dwPlayMax));

				DWORD dwIntervalMin = 0;
				File.read(&dwIntervalMin, sizeof(dwIntervalMin));

				DWORD dwIntervalMax = 0;
				File.read(&dwIntervalMax, sizeof(dwIntervalMax));

				SString strEffectName	 = ambientFxNameList[nIndex];

				//SVector<CRgnAmbientFxInfo*> rgnAmbientFxList;
				CRgnAmbientFxInfo *pTemp = new CRgnAmbientFxInfo;
				pTemp->szFxName		= strEffectName;
				pTemp->nPlayMax		= dwPlayMax;
				pTemp->nPlayMin		= dwPlayMin;
				pTemp->nIntervalMax = dwIntervalMax;
				pTemp->nIntervalMin = dwIntervalMin;

				pRgnInfo->rgnAmbientFxList.push_back(pTemp);
			}

			pScene->m_RgnsList.push_back(pRgnInfo);
		}

		// ----------------------------------------------------------------------------
		// 读取摄像机轨迹动画信息

		uint32 uAnimCount = 0;
		File.read( &uAnimCount, sizeof(uint32) );	
		pScene->m_vecCamPath.resize(uAnimCount, NULL);

		for ( uint i=0; i<uAnimCount; ++i )
		{
			int		pc		= 0;
			File.read( &pc, sizeof(int) );
			if ( pc != NULL )
			{
				CCameraPath	*pNewPath	= new CCameraPath;
				pScene->m_vecCamPath[i] = pNewPath; 

				uint32 uKeyCount = 0;
				File.read( &uKeyCount, sizeof(uint32) );	

				CVector3f	data;
				float		time;
				for ( uint32 i=0; i<uKeyCount; ++i )
				{
					// 读取 摄像机位置帧
					File.read( &data, sizeof(CVector3f) );
					File.read( &time, sizeof(float) );
					pNewPath->AddPositionKey( data, time );

					// 读取 摄像机观察点帧
					File.read( &data, sizeof(CVector3f) );
					File.read( &time, sizeof(float) );
					pNewPath->AddTargetkey( data, time );

					// 读取 摄像机视角帧
					File.read( &data, sizeof(CVector3f) );
					File.read( &time, sizeof(float) );
					pNewPath->AddFovKey( data, time );
				}
			}
		}

		//////////////////////////////////////////////////////////////////////////
		// IsTileVisiable
		CMetaGridMgr& GridMgr = *pScene->m_pGridMgr;
		UINT Size = pScene->m_uWidth*pScene->m_uHeight;
		bool tileVisible = true;
		URegionID ID;
		for(size_t i = 0; i<Size; ++i)
		{
			ID.X = i % pScene->m_uWidth;
			ID.Z = i / pScene->m_uWidth;
			File.read( &tileVisible, sizeof(tileVisible) );

			GridMgr.SetRenderTileVisibleMark(ID, tileVisible);
		}

		//////////////////////////////////////////////////////////////////////////
	}

	locale::global(loc);//恢复全局locale	

	return true;
}