DragonNest/Common/EternityEngine/EnvInfo.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

508 lines
16 KiB
C++

#include "StdAfx.h"
#include "EnvInfo.h"
enum MinorVersion
{
MiniorVersion_Default = 0, //2011-04-12 환경 설정 파일 변경
MiniorVersion_SnowSize = 1, //2011-05-06 스노우 크기/텍스쳐 애니 설정 기능 추가
MiniorVersion_EnviEffect = 2, //2012-10-04 로컬카메라에 붙는 이펙트파일
MiniorVersion_Max
};
enum MajorVersion
{
MajorVersion_Default = 1, //2011-04-12 환경 설정 파일 변경
MajorVersion_Max
};
const DWORD CEnvInfo::ms_VersionMajor = MajorVersion_Max - 1;
const DWORD CEnvInfo::ms_VersionMinor = MiniorVersion_Max - 1;
const std::string CEnvInfo::ms_FileHeaderInfo = "EnvInfo File Header";
CEnvInfo::CEnvInfo(void)
{
Reset();
}
CEnvInfo::~CEnvInfo(void)
{
Reset();
}
void CEnvInfo::Reset()
{
m_szSkyBox = "";
m_vColorAdjShadow = EtVector4( 0.f, 0.f, 0.f, 0.f );
m_vColorAdjMidtones = EtVector4( 0.f, 0.f, 0.f, 0.f );
m_vColorAdjHighlights = EtVector4( 0.f, 0.f, 0.f, 0.f );
m_dwAmbient = RGB(255,255,255);
m_dwFogColor = RGB(255,255,255);
m_fFogNear = 1000000.f;
m_fFogFar = 1000000.f;
m_fSaturation = 1.f;
m_bEnableColorFilter = false;
m_bEnableBloomFilter = false;
m_fBloomScale = 1.f;
m_fBloomSensitivity = 6.f;
m_szEnviBGM = "";
m_fEnviBGMRatio = 0.f;
m_nLightmapBlurSize = 1;
m_bEnableWeather = false;
m_fWeatherSpeed = 1.f;
m_fWeatherStretch = 1.f;
m_nWeatherLayerCount = 1;
m_fWeatherLayerDecreaseRate = 0.9f;
m_vWeatherLayerDir = EtVector3( 0.f, -1.f, 0.f );
m_bEnableSplashDrop = false;
m_fSplashDropSize = 5.f;
m_fSplashDropLifeTime = 0.2f;
m_nSplashDropRadius = 1000;
m_nSplashDropCount = 1500;
m_bEnableHeatHaze = false;
m_fHeatHazeDistortionPower = 1.f;
m_fHeatHazeWaveSpeed = 5.f;
m_bEnableDOF = false;
m_fDOFFocusDistance = 1000.f;
m_fDOFNearStart = 800.f;
m_fDOFNearEnd = 1000.;
m_fDOFFarStart = 500.f;
m_fDOFFarEnd = 1000.f;
m_fNearBlur = 8.f;
m_fFarBlur = 8.f;
m_bEnableSnowEffect = false;
m_nSnowCount = 1500;
m_nSnowTimeOut = 7000;
m_fSnowHeight = 1500.f;
m_isUp = false;
m_fSnowSize = 0.0f;
m_fSnowAniSpeed = 1.0f;
m_szEnvironmentEffect = "";
std::vector<LightInfoStruct *>::iterator iter = m_pVecLightList.begin();
std::vector<LightInfoStruct *>::iterator endIter = m_pVecLightList.end();
for (; iter != endIter; ++iter)
{
LightInfoStruct* pLightInfo = (*iter);
if (pLightInfo)
{
if (pLightInfo->pInfo)
delete pLightInfo->pInfo;
delete pLightInfo;
}
}
m_pVecLightList.clear();
}
void CEnvInfo::AddLight( SLightInfo &Info )
{
LightInfoStruct *pStruct = new LightInfoStruct;
pStruct->pInfo = new SLightInfo;
*pStruct->pInfo = Info;
m_pVecLightList.push_back( pStruct );
}
void CEnvInfo::RemoveLight(int nIndex)
{
if( nIndex < 0 || nIndex >= (int)m_pVecLightList.size() ) return;
SAFE_DELETE( m_pVecLightList[nIndex]->pInfo );
SAFE_DELETE( m_pVecLightList[nIndex] );
m_pVecLightList.erase( m_pVecLightList.begin() + nIndex );
}
DWORD CEnvInfo::GetLightCount()
{
return (DWORD)m_pVecLightList.size();
}
CEnvInfo::LightInfoStruct * CEnvInfo::GetLight( DWORD dwIndex )
{
if( dwIndex < 0 || dwIndex >= (DWORD)m_pVecLightList.size() ) return NULL;
return m_pVecLightList[dwIndex];
}
bool CEnvInfo::IsOldVersion(int nMajorVersion, int nMinorVersion)
{
bool missMatchMajorVersion = (nMajorVersion != MajorVersion_Default);
bool missMatchMinorVersion = (nMinorVersion != MiniorVersion_Default ||
nMinorVersion != MiniorVersion_SnowSize ||
nMinorVersion != MiniorVersion_EnviEffect);
//Major/Minor 둘다 버전이 맞지 않다면..
return (missMatchMajorVersion && missMatchMinorVersion);
}
bool CEnvInfo::Load(const char* szFileName)
{
// CString szFullName;
// szFullName.Format( "%s\\Resource\\Envi\\%s.env", CFileServer::GetInstance().GetLocalWorkingFolder(), m_szName );
//CFileStream Stream( szFileName, CFileStream::OPEN_READ );
CResMngStream Stream( szFileName );
if( !Stream.IsValid() ) return false;
//헤더 정보
//파일 헤더 정보
EnvHeader envHeader;
memset(&envHeader, 0, sizeof(EnvHeader)); //초기화.
Stream.Read(&envHeader, sizeof(EnvHeader));
//파일 헤더 문자가 다르다...
if( strcmp( envHeader.szHeaderString, ms_FileHeaderInfo.c_str() ) != 0 )
{
//파일 헤더 없는 버전으로..
return LoadNonFileHeader(szFileName);
}
//기본 정보 읽고..
LoadVersion1_0(&Stream);
//추가 버전 정보에 맞게..
if (envHeader.nVersionMinor >= MiniorVersion_SnowSize)
LoadVersion1_1(&Stream);
if (envHeader.nVersionMinor >= MiniorVersion_EnviEffect)
LoadVersion1_2(&Stream);
return true;
}
bool CEnvInfo::LoadNonFileHeader(const char* szFileName)
{
CResMngStream Stream( szFileName );
if( !Stream.IsValid() ) return false;
//파일 버전 정보..
DWORD nVersionMajor = 0;
DWORD nVersionMinor = 0;
Stream.Read( &nVersionMajor, sizeof(nVersionMajor));
Stream.Read( &nVersionMinor, sizeof(nVersionMinor));
//버전 정보가 없는 예전 파일인지 확인
bool isOldVersion = IsOldVersion(nVersionMajor, nVersionMinor);
if (isOldVersion)
{
std::string msg = szFileName;
msg += "환경 파일 예전 버전!!!!!!";
ASSERT( 0 && msg.c_str());
return LoadOldVersion(szFileName);
}
//기본 정보 읽고..
LoadVersion1_0(&Stream);
//추가 버전 정보에 맞게..
if (nVersionMinor >= MiniorVersion_SnowSize)
LoadVersion1_1(&Stream);
if (nVersionMinor >= MiniorVersion_EnviEffect)
LoadVersion1_2(&Stream);
return true;
}
bool CEnvInfo::LoadOldVersion(const char* szFileName)
{
// CString szFullName;
// szFullName.Format( "%s\\Resource\\Envi\\%s.env", CFileServer::GetInstance().GetLocalWorkingFolder(), m_szName );
//CFileStream Stream( szFileName, CFileStream::OPEN_READ );
CResMngStream Stream( szFileName );
if( !Stream.IsValid() ) return false;
ReadStdString( m_szSkyBox, &Stream );
Stream.Read( &m_dwAmbient, sizeof(DWORD) );
Stream.Read( &m_dwFogColor, sizeof(DWORD) );
Stream.Read( &m_fFogNear, sizeof(float) );
Stream.Read( &m_fFogFar, sizeof(float) );
ReadStdString( m_szEnvironmentTexture, &Stream );
Stream.Read( &m_bEnableColorFilter, sizeof(bool) );
Stream.Read( &m_vColorAdjShadow, sizeof(EtVector4) );
Stream.Read( &m_vColorAdjMidtones, sizeof(EtVector4) );
Stream.Read( &m_vColorAdjHighlights, sizeof(EtVector4) );
Stream.Read( &m_fSaturation, sizeof(float) );
Stream.Read( &m_bEnableBloomFilter, sizeof(bool) );
Stream.Read( &m_fBloomScale, sizeof(float) );
Stream.Read( &m_fBloomSensitivity, sizeof(float) );
Stream.Read( &m_nLightmapBlurSize, sizeof(int) );
ReadStdString( m_szEnviBGM, &Stream );
Stream.Read( &m_fEnviBGMRatio, sizeof(float) );
//////////////////////
Stream.Read( &m_bEnableWeather, sizeof(bool) );
ReadStdString( m_szWeatherTexture, &Stream );
Stream.Read( &m_fWeatherSpeed, sizeof(float) );
Stream.Read( &m_fWeatherStretch, sizeof(float) );
Stream.Read( &m_nWeatherLayerCount, sizeof(int) );
Stream.Read( &m_fWeatherLayerDecreaseRate, sizeof(float) );
Stream.Read( &m_vWeatherLayerDir, sizeof(EtVector3) );
Stream.Read( &m_bEnableSplashDrop, sizeof(bool) );
ReadStdString( m_szSplashDropTexture, &Stream );
Stream.Read( &m_fSplashDropSize, sizeof(float) );
Stream.Read( &m_fSplashDropLifeTime, sizeof(float) );
Stream.Read( &m_nSplashDropRadius, sizeof(int) );
Stream.Read( &m_nSplashDropCount, sizeof(int) );
//////////////////////
Stream.Read( &m_bEnableHeatHaze, sizeof(bool) );
Stream.Read( &m_fHeatHazeDistortionPower, sizeof(float) );
Stream.Read( &m_fHeatHazeWaveSpeed, sizeof(float) );
Stream.Read( &m_bEnableDOF, sizeof(bool) );
Stream.Read( &m_fDOFFocusDistance, sizeof(float) );
Stream.Read( &m_fDOFNearStart, sizeof(float) );
Stream.Read( &m_fDOFNearEnd, sizeof(float) );
Stream.Read( &m_fDOFFarStart, sizeof(float) );
Stream.Read( &m_fDOFFarEnd, sizeof(float) );
Stream.Read( &m_fNearBlur, sizeof(float) );
Stream.Read( &m_fFarBlur, sizeof(float) );
Stream.Read( &m_bEnableSnowEffect, sizeof(bool) );
ReadStdString( m_szSnowEffectTexture, &Stream );
Stream.Read( &m_nSnowCount, sizeof(int) );
Stream.Read( &m_nSnowTimeOut, sizeof(int) );
Stream.Read( &m_fSnowHeight, sizeof(float) );
// 라이트 읽어
SLightInfo Info;
int nCount;
Stream.Read( &nCount, sizeof(int) );
for( int i=0; i<nCount; i++ ) {
Stream.Read( &Info, sizeof(SLightInfo) );
AddLight( Info );
Stream.Read( &m_pVecLightList[m_pVecLightList.size() - 1]->bEnable, sizeof(bool) );
ReadStdString( m_pVecLightList[m_pVecLightList.size() - 1]->szSunTexture, &Stream );
ReadStdString( m_pVecLightList[m_pVecLightList.size() - 1]->szLensFlareTexture, &Stream );
Stream.Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fSunScale, sizeof(float) );
Stream.Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fLensScale, sizeof(float) );
Stream.Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fRevisionXAxisAngle, sizeof(float) );
Stream.Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fRevisionYAxisAngle, sizeof(float) );
}
return true;
}
void CEnvInfo::Save(const char* szFileName)
{
CFileStream Stream( szFileName, CFileStream::OPEN_WRITE );
if( !Stream.IsValid() ) return;
//파일 헤더 정보
EnvHeader envHeader;
memset(&envHeader, 0, sizeof(EnvHeader)); //초기화.
//Header문자 설정.
sprintf(envHeader.szHeaderString, "%s", ms_FileHeaderInfo.c_str());
//버전 정보 설정.
envHeader.nVersionMajor = ms_VersionMajor;
envHeader.nVersionMinor = ms_VersionMinor;
//헤더 정보 저장
Stream.Write(&envHeader, sizeof(EnvHeader));
// 버전에 따른 추가 정보를 이전 파일의 마지막에 추가 하는 방식으로 저장하도록 한다.
// 기능별로 묶어서 저장하게 되면 이전 파일 호환성에 문제가 있을 수 있음.
// | 이전 버전 정보... | 추가된 정보 | 추가된 정보 | ...
// | <--- Ver1.0 ----> | <-Ver1.1--> | <--Ver1.2-->| ..
// 예전 버전에서도 최신 버전 파일을 읽을때 문제를 해결 할 수 있을 듯..
SaveVersion1_0(Stream);
SaveVersion1_1(Stream);
SaveVersion1_2(Stream);
}
void CEnvInfo::SaveVersion1_2(CFileStream &Stream)
{
WriteStdString( m_szEnvironmentEffect, &Stream );
}
void CEnvInfo::SaveVersion1_1(CFileStream &Stream)
{
Stream.Write(&m_fSnowSize, sizeof(m_fSnowSize)); //Snow Size
Stream.Write(&m_fSnowAniSpeed, sizeof(m_fSnowAniSpeed)); //Snow Ani Speed
}
void CEnvInfo::SaveVersion1_0( CFileStream &Stream )
{
WriteStdString( m_szSkyBox, &Stream );
Stream.Write( &m_dwAmbient, sizeof(DWORD) );
Stream.Write( &m_dwFogColor, sizeof(DWORD) );
Stream.Write( &m_fFogNear, sizeof(float) );
Stream.Write( &m_fFogFar, sizeof(float) );
WriteStdString( m_szEnvironmentTexture, &Stream );
Stream.Write( &m_bEnableColorFilter, sizeof(bool) );
Stream.Write( &m_vColorAdjShadow, sizeof(EtVector4) );
Stream.Write( &m_vColorAdjMidtones, sizeof(EtVector4) );
Stream.Write( &m_vColorAdjHighlights, sizeof(EtVector4) );
Stream.Write( &m_fSaturation, sizeof(float) );
Stream.Write( &m_bEnableBloomFilter, sizeof(bool) );
Stream.Write( &m_fBloomScale, sizeof(float) );
Stream.Write( &m_fBloomSensitivity, sizeof(float) );
Stream.Write( &m_nLightmapBlurSize, sizeof(int) );
WriteStdString( m_szEnviBGM, &Stream );
Stream.Write( &m_fEnviBGMRatio, sizeof(float) );
//////////////////////
Stream.Write( &m_bEnableWeather, sizeof(bool) );
WriteStdString( m_szWeatherTexture, &Stream );
Stream.Write( &m_fWeatherSpeed, sizeof(float) );
Stream.Write( &m_fWeatherStretch, sizeof(float) );
Stream.Write( &m_nWeatherLayerCount, sizeof(int) );
Stream.Write( &m_fWeatherLayerDecreaseRate, sizeof(float) );
Stream.Write( &m_vWeatherLayerDir, sizeof(EtVector3) );
Stream.Write( &m_bEnableSplashDrop, sizeof(bool) );
WriteStdString( m_szSplashDropTexture, &Stream );
Stream.Write( &m_fSplashDropSize, sizeof(float) );
Stream.Write( &m_fSplashDropLifeTime, sizeof(float) );
Stream.Write( &m_nSplashDropRadius, sizeof(int) );
Stream.Write( &m_nSplashDropCount, sizeof(int) );
//////////////////////
Stream.Write( &m_bEnableHeatHaze, sizeof(bool) );
Stream.Write( &m_fHeatHazeDistortionPower, sizeof(float) );
Stream.Write( &m_fHeatHazeWaveSpeed, sizeof(float) );
Stream.Write( &m_bEnableDOF, sizeof(bool) );
Stream.Write( &m_fDOFFocusDistance, sizeof(float) );
Stream.Write( &m_fDOFNearStart, sizeof(float) );
Stream.Write( &m_fDOFNearEnd, sizeof(float) );
Stream.Write( &m_fDOFFarStart, sizeof(float) );
Stream.Write( &m_fDOFFarEnd, sizeof(float) );
Stream.Write( &m_fNearBlur, sizeof(float) );
Stream.Write( &m_fFarBlur, sizeof(float) );
Stream.Write( &m_bEnableSnowEffect, sizeof(bool) );
WriteStdString( m_szSnowEffectTexture, &Stream );
Stream.Write( &m_nSnowCount, sizeof(int) );
Stream.Write( &m_nSnowTimeOut, sizeof(int) );
Stream.Write( &m_fSnowHeight, sizeof(float) );
Stream.Write( &m_isUp, sizeof(m_isUp));
// 라이트 저장
int nCount = (int)m_pVecLightList.size();
Stream.Write( &nCount, sizeof(int) );
for( int i=0; i<nCount; i++ ) {
Stream.Write( m_pVecLightList[i]->pInfo, sizeof(SLightInfo) );
Stream.Write( &m_pVecLightList[i]->bEnable, sizeof(bool) );
WriteStdString( m_pVecLightList[i]->szSunTexture, &Stream );
WriteStdString( m_pVecLightList[i]->szLensFlareTexture, &Stream );
Stream.Write( &m_pVecLightList[i]->fSunScale, sizeof(float) );
Stream.Write( &m_pVecLightList[i]->fLensScale, sizeof(float) );
Stream.Write( &m_pVecLightList[i]->fRevisionXAxisAngle, sizeof(float) );
Stream.Write( &m_pVecLightList[i]->fRevisionYAxisAngle, sizeof(float) );
}
}
void CEnvInfo::LoadVersion1_2( CResMngStream *Stream )
{
ReadStdString( m_szEnvironmentEffect, Stream );
}
void CEnvInfo::LoadVersion1_1( CResMngStream *Stream)
{
Stream->Read(&m_fSnowSize, sizeof(m_fSnowSize));
Stream->Read(&m_fSnowAniSpeed, sizeof(m_fSnowAniSpeed));
}
void CEnvInfo::LoadVersion1_0( CResMngStream *Stream )
{
ReadStdString( m_szSkyBox, Stream );
Stream->Read( &m_dwAmbient, sizeof(DWORD) );
Stream->Read( &m_dwFogColor, sizeof(DWORD) );
Stream->Read( &m_fFogNear, sizeof(float) );
Stream->Read( &m_fFogFar, sizeof(float) );
ReadStdString( m_szEnvironmentTexture, Stream );
Stream->Read( &m_bEnableColorFilter, sizeof(bool) );
Stream->Read( &m_vColorAdjShadow, sizeof(EtVector4) );
Stream->Read( &m_vColorAdjMidtones, sizeof(EtVector4) );
Stream->Read( &m_vColorAdjHighlights, sizeof(EtVector4) );
Stream->Read( &m_fSaturation, sizeof(float) );
Stream->Read( &m_bEnableBloomFilter, sizeof(bool) );
Stream->Read( &m_fBloomScale, sizeof(float) );
Stream->Read( &m_fBloomSensitivity, sizeof(float) );
Stream->Read( &m_nLightmapBlurSize, sizeof(int) );
ReadStdString( m_szEnviBGM, Stream );
Stream->Read( &m_fEnviBGMRatio, sizeof(float) );
//////////////////////
Stream->Read( &m_bEnableWeather, sizeof(bool) );
ReadStdString( m_szWeatherTexture, Stream );
Stream->Read( &m_fWeatherSpeed, sizeof(float) );
Stream->Read( &m_fWeatherStretch, sizeof(float) );
Stream->Read( &m_nWeatherLayerCount, sizeof(int) );
Stream->Read( &m_fWeatherLayerDecreaseRate, sizeof(float) );
Stream->Read( &m_vWeatherLayerDir, sizeof(EtVector3) );
Stream->Read( &m_bEnableSplashDrop, sizeof(bool) );
ReadStdString( m_szSplashDropTexture, Stream );
Stream->Read( &m_fSplashDropSize, sizeof(float) );
Stream->Read( &m_fSplashDropLifeTime, sizeof(float) );
Stream->Read( &m_nSplashDropRadius, sizeof(int) );
Stream->Read( &m_nSplashDropCount, sizeof(int) );
//////////////////////
Stream->Read( &m_bEnableHeatHaze, sizeof(bool) );
Stream->Read( &m_fHeatHazeDistortionPower, sizeof(float) );
Stream->Read( &m_fHeatHazeWaveSpeed, sizeof(float) );
Stream->Read( &m_bEnableDOF, sizeof(bool) );
Stream->Read( &m_fDOFFocusDistance, sizeof(float) );
Stream->Read( &m_fDOFNearStart, sizeof(float) );
Stream->Read( &m_fDOFNearEnd, sizeof(float) );
Stream->Read( &m_fDOFFarStart, sizeof(float) );
Stream->Read( &m_fDOFFarEnd, sizeof(float) );
Stream->Read( &m_fNearBlur, sizeof(float) );
Stream->Read( &m_fFarBlur, sizeof(float) );
Stream->Read( &m_bEnableSnowEffect, sizeof(bool) );
ReadStdString( m_szSnowEffectTexture, Stream );
Stream->Read( &m_nSnowCount, sizeof(int) );
Stream->Read( &m_nSnowTimeOut, sizeof(int) );
Stream->Read( &m_fSnowHeight, sizeof(float) );
Stream->Read( &m_isUp, sizeof(m_isUp));
// 라이트 읽어
SLightInfo Info;
int nCount;
Stream->Read( &nCount, sizeof(int) );
for( int i=0; i<nCount; i++ ) {
Stream->Read( &Info, sizeof(SLightInfo) );
AddLight( Info );
Stream->Read( &m_pVecLightList[m_pVecLightList.size() - 1]->bEnable, sizeof(bool) );
ReadStdString( m_pVecLightList[m_pVecLightList.size() - 1]->szSunTexture, Stream );
ReadStdString( m_pVecLightList[m_pVecLightList.size() - 1]->szLensFlareTexture, Stream );
Stream->Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fSunScale, sizeof(float) );
Stream->Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fLensScale, sizeof(float) );
Stream->Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fRevisionXAxisAngle, sizeof(float) );
Stream->Read( &m_pVecLightList[m_pVecLightList.size() - 1]->fRevisionYAxisAngle, sizeof(float) );
}
}