DragonNest/Client/EtViewer/ObjectLightFolder.cpp
2024-12-19 09:48:26 +08:00

236 lines
6.9 KiB
C++

#include "Stdafx.h"
#include "ObjectLightFolder.h"
#include "GlobalValue.h"
CObjectLightFolder::CObjectLightFolder()
{
m_Type = CObjectBase::LIGHTFOLDER;
}
CObjectLightFolder::~CObjectLightFolder()
{
}
void CObjectLightFolder::InitPropertyInfo()
{
SAFE_DELETE_PVEC( m_pVecPropertyList );
PropertyGridBaseDefine Default[] = {
{ "Common", "Total", CUnionValueProperty::Integer, "Light Count", FALSE },
{ "Common", "Directional", CUnionValueProperty::Integer, "Directional Light Count", FALSE },
{ "Common", "Point", CUnionValueProperty::Integer, "Point Light Count", FALSE },
{ "Common", "Spot", CUnionValueProperty::Integer, "Spot Light Count", FALSE },
{ "Common", "Ambient", CUnionValueProperty::Vector4Color, "Ambient Light", TRUE },
{ "All", "Disable All Cast Shadow", CUnionValueProperty::Boolean, "모든 라이트의 캐스팅 쉐도우 옵션을 끈다.", TRUE },
NULL,
};
AddPropertyInfo( Default );
}
void CObjectLightFolder::OnSetPropertyValue( DWORD dwIndex, CUnionValueProperty *pVariable )
{
int nDir = 0, nPoint = 0, nSpot = 0;
for( DWORD i=0; i<m_pVecChild.size(); i++ ) {
switch( m_pVecChild[i]->GetType() ) {
case CObjectBase::LIGHTDIR: nDir++; break;
case CObjectBase::LIGHTPOINT: nPoint++; break;
case CObjectBase::LIGHTSPOT: nSpot++; break;
}
}
switch( dwIndex ) {
case 0:
pVariable->SetVariable( nDir + nPoint + nSpot );
break;
case 1:
pVariable->SetVariable( nDir );
break;
case 2:
pVariable->SetVariable( nPoint );
break;
case 3:
pVariable->SetVariable( nSpot );
break;
case 4:
{
EtColor Color = EternityEngine::GetGlobalAmbient();
pVariable->SetVariable( (D3DXVECTOR4)Color );
}
break;
case 5:
{
pVariable->SetVariable( FALSE );
}
break;
};
}
void CObjectLightFolder::OnChangePropertyValue( DWORD dwIndex, CUnionValueProperty *pVariable )
{
switch( dwIndex ) {
case 4:
{
EtVector4 vColor = pVariable->GetVariableVector4();
EternityEngine::SetGlobalAmbient( (EtColor*)&vColor );
}
break;
case 5:
{
for( DWORD i=0; i<m_pVecChild.size(); i++ ) {
switch( m_pVecChild[i]->GetType() ) {
case CObjectBase::LIGHTDIR:
((CObjectLightDir*)m_pVecChild[i])->OnChangePropertyValue( 3, pVariable );
break;
case CObjectBase::LIGHTPOINT:
((CObjectLightPoint*)m_pVecChild[i])->OnChangePropertyValue( 4, pVariable );
break;
case CObjectBase::LIGHTSPOT:
((CObjectLightSpot*)m_pVecChild[i])->OnChangePropertyValue( 8, pVariable );
break;
}
}
}
break;
}
}
void CObjectLightFolder::SaveLightSetting( CString szStr )
{
std::vector<SLightInfo> VecDir;
std::vector<SLightInfo> VecPoint;
std::vector<SLightInfo> VecSpot;
for( DWORD i=0; i<m_pVecChild.size(); i++ ) {
CObjectBase *pChild = m_pVecChild[i];
switch( pChild->GetType() ) {
case LIGHTDIR: VecDir.push_back( ((CObjectLightDir*)pChild)->GetLightInfo() ); break;
case LIGHTPOINT: VecPoint.push_back( ((CObjectLightPoint*)pChild)->GetLightInfo() ); break;
case LIGHTSPOT: VecSpot.push_back( ((CObjectLightSpot*)pChild)->GetLightInfo() ); break;
}
}
if( szStr.IsEmpty() == true ) {
CString szSubKey = REG_SUBKEY;
szSubKey += "\\Light";
// 일단 모든 라이트 정보를 전부 지워주구
RegDeleteKey( HKEY_CURRENT_USER, szSubKey );
// 저장 다시 한다.
EtColor Color = EternityEngine::GetGlobalAmbient();
SetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Ambient", &Color, sizeof(EtColor) );
SetRegistryNumber( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Directional", (DWORD)VecDir.size() );
SetRegistryNumber( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Point", (DWORD)VecPoint.size() );
SetRegistryNumber( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Spot", (DWORD)VecSpot.size() );
CString szStr;
for( DWORD i=0; i<VecDir.size(); i++ ) {
szStr.Format( "Directional-%d", i );
SetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), szStr.GetBuffer(), &VecDir[i], sizeof(SLightInfo) );
}
for( DWORD i=0; i<VecPoint.size(); i++ ) {
szStr.Format( "Point-%d", i );
SetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), szStr.GetBuffer(), &VecPoint[i], sizeof(SLightInfo) );
}
for( DWORD i=0; i<VecSpot.size(); i++ ) {
szStr.Format( "Spot-%d", i );
SetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), szStr.GetBuffer(), &VecSpot[i], sizeof(SLightInfo) );
}
}
else {
}
}
void CObjectLightFolder::LoadLightSetting( CString szStr )
{
// 기존 라이트 다 지우구~
for( DWORD i=0; i<m_pVecChild.size(); i++ ) {
CGlobalValue::GetInstance().RemoveObjectFromTreeID( m_pVecChild[i]->GetTreeItemID() );
i--;
}
std::vector<SLightInfo> VecDir;
std::vector<SLightInfo> VecPoint;
std::vector<SLightInfo> VecSpot;
if( szStr.IsEmpty() == true ) {
CString szSubKey = REG_SUBKEY;
szSubKey += "\\Light";
DWORD dwDir = 0, dwPoint = 0, dwSpot = 0;
EtColor Ambient = 0xFFFFFFFF;
int nSize = sizeof(EtColor);
GetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Ambient", &Ambient, nSize );
EternityEngine::SetGlobalAmbient( &Ambient );
GetRegistryNumber( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Directional", dwDir );
GetRegistryNumber( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Point", dwPoint );
GetRegistryNumber( HKEY_CURRENT_USER, szSubKey.GetBuffer(), "Spot", dwSpot );
CString szStr;
SLightInfo Info;
nSize = sizeof(SLightInfo);
for( DWORD i=0; i<dwDir; i++ ) {
szStr.Format( "Directional-%d", i );
GetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), szStr.GetBuffer(), &Info, nSize );
VecDir.push_back( Info );
}
for( DWORD i=0; i<dwPoint; i++ ) {
szStr.Format( "Point-%d", i );
GetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), szStr.GetBuffer(), &Info, nSize );
VecPoint.push_back( Info );
}
for( DWORD i=0; i<dwSpot; i++ ) {
szStr.Format( "Spot-%d", i );
GetRegistryBinary( HKEY_CURRENT_USER, szSubKey.GetBuffer(), szStr.GetBuffer(), &Info, nSize );
VecSpot.push_back( Info );
}
}
else {
}
CObjectBase *pBase;
for( DWORD i=0; i<VecDir.size(); i++ ) {
pBase = new CObjectLightDir;
CGlobalValue::GetInstance().AddObject( m_ItemID, pBase );
((CObjectLightDir*)pBase)->SetLightInfo( VecDir[i] );
}
for( DWORD i=0; i<VecPoint.size(); i++ ) {
pBase = new CObjectLightPoint;
CGlobalValue::GetInstance().AddObject( m_ItemID, pBase );
((CObjectLightPoint*)pBase)->SetLightInfo( VecPoint[i] );
}
for( DWORD i=0; i<VecSpot.size(); i++ ) {
pBase = new CObjectLightSpot;
CGlobalValue::GetInstance().AddObject( m_ItemID, pBase );
((CObjectLightSpot*)pBase)->SetLightInfo( VecSpot[i] );
}
}
void CObjectLightFolder::ExportObject( FILE *fp, int &nCount )
{
fwrite( &m_Type, sizeof(int), 1, fp );
nCount++;
EtColor Color = EternityEngine::GetGlobalAmbient();
fwrite( &Color, sizeof(EtColor), 1, fp );
CObjectBase::ExportObject( fp, nCount );
}
void CObjectLightFolder::ImportObject( FILE *fp )
{
EtColor Color;
fread( &Color, sizeof(EtColor), 1, fp );
EternityEngine::SetGlobalAmbient( &Color );
}