Files
Client/Engine/Zalla3D Scene Class/SectorAmbienceMap.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

806 lines
24 KiB
C++

// SectorAmbienceMap.cpp: implementation of the CSectorAmbienceMap class.
//
//////////////////////////////////////////////////////////////////////
#include "SoundMgr.h"
#include "BaseGraphicsLayer.h"
#include "SceneManager.h"
#include "SectorAmbienceMap.h"
#include "GMMemory.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
struct TESTSCREEN_VERTEX
{
float x, y, z, rhw;
DWORD color;
float u, v;
};
CSectorAmbienceMap::CSectorAmbienceMap() : m_pAmbTexture(NULL)
{
m_ResizeTexture.Create( AMB_TEXTURESIZE, AMB_TEXTURESIZE );
}
CSectorAmbienceMap::~CSectorAmbienceMap()
{
SAFE_RELEASE( m_pAmbTexture );
DeleteScriptData();
DeleteAmbData();
}
void CSectorAmbienceMap::WriteScriptData( const char* strFilename )
{
char strSectorAmb[MAX_PATH];
char strMsg[MAX_PATH];
ZeroMemory( strMsg, sizeof(strMsg) );
ZeroMemory( strSectorAmb, sizeof(strSectorAmb) );
strcpy( strSectorAmb, APP_SECTOR_AMBIENCE );
FILE* fp = fopen(strFilename, "wt");
int iZoneID = 1;
int iSID = 1;
fprintf(fp, "[SET]\r\n");
int iSetCount = m_SectorAmbList.size();
fprintf(fp, "AMBIENCE = %d\r\n", iSetCount);
fprintf(fp, "\r\n");
for( int count = 0; count < iSetCount; count++ )
{
// [SECTOR_AMBIENCE1]
fprintf(fp, "[%s%d]\r\n", APP_SECTOR_AMBIENCE, iSID++ );
// ZONE
fprintf(fp, "ZONE = %d\r\n", iZoneID);
// SECTORX = 8
fprintf(fp, "SECTORX = %d\r\n", m_SectorAmbList[count]->iSectorX);
// SECTORY = 1
fprintf(fp, "SECTORY = %d\r\n", m_SectorAmbList[count]->iSectorY);
// TEXTURE = "C:\\WorkTest\\WorldCreator\\AmbienceTest.bmp"
fprintf(fp, "TEXTURE = %s\r\n", m_SectorAmbList[count]->strTexFilename);
// 파일에 저장된 텍스쳐 컨버팅
sprintf(strMsg, "C:\\z%d_%d_%d.bmp", iZoneID, m_SectorAmbList[count]->iSectorX, m_SectorAmbList[count]->iSectorY);
SaveColorTable(m_SectorAmbList[count]->ColorTable[0], strMsg);
//NUM_AMBIENCE = 2
int inum = m_SectorAmbList[count]->AmbInfoList.size();
fprintf(fp, "NUM_AMBIENCE = %d\r\n", inum);
fprintf(fp, "\r\n");
for(int i = 0; i < inum; i++)
{
AmbienceInfo* pAmbInfo = m_SectorAmbList[count]->AmbInfoList[i];
fprintf(fp, "AMB%d_COLOR = 0x%06x\r\n", i+1, pAmbInfo->dwColor);
// fprintf(fp, "AMB%d_POINTCOLOR = 0x%x\r\n", i+1, pAmbInfo->dwPointColor);
int iSchedule = pAmbInfo->ScheduleList.size();
fprintf(fp, "AMB%d_SCHEDULE = %d\r\n", i+1, iSchedule );
fprintf(fp, "\r\n");
//AMB1_SCHEDULE = 2
for( int j = 0; j < iSchedule; j++ )
{
//Create AmbiencePoint Schedule
AmbSchedule* pSchedule = pAmbInfo->ScheduleList[j];
fprintf(fp, "AMB%d_START_SCHEDULE%d = %d\r\n", i+1, j+1, (int)pSchedule->fStartTime );
fprintf(fp, "AMB%d_END_SCHEDULE%d = %d\r\n", i+1, j+1, (int)pSchedule->fEndTime );
int iLe = strlen(AMBIENCEPATH);
sprintf( strMsg, "%s", &pSchedule->strFilename[iLe] );
fprintf(fp, "AMB%d_SOUND%d = %s\r\n", i+1, j+1, strMsg );
fprintf(fp, "\r\n");
int irn = (int)pSchedule->RandomSndList.size();
int x = 0;
for( ; x < irn; x++)
{
fprintf(fp, "AMB%d_SCHEDULE%d_RANDOM%d = %s\r\n", i+1, j+1, x+1, pSchedule->RandomSndList[x]);
}
fprintf(fp, "AMB%d_SCHEDULE%d_RANDOM_CYCLE = %d\r\n", i+1, j+1, x+1, pSchedule->iRandSndCycle);
fprintf(fp, "\r\n");
}
}
}
fclose(fp);
}
void CSectorAmbienceMap::GetScriptData( const char* strFilename )
{
int SecAmbNum, Zone;
char strSectorAmb[MAX_PATH];
char strMsg[MAX_PATH];
ZeroMemory( strMsg, sizeof(strMsg) );
ZeroMemory( strSectorAmb, sizeof(strSectorAmb) );
strcpy( strSectorAmb, APP_SECTOR_AMBIENCE );
DeleteScriptData();
SecAmbNum = GetPrivateProfileInt( APP_SET, KEY_AMBIENCE, 0, strFilename );
for( int count = 1; count < SecAmbNum+1; count++ )
{
/*** Script Interface (ex) ***
[SET]
AMBIENCE = 2
[SECTOR_AMBIENCE1]
ZONE = 1
SECTORX = 8
SECTORY = 1
TEXTURE = "C:\\WorkTest\\WorldCreator\\AmbienceTest.bmp"
NUM_AMBIENCE = 2
AMB1_COLOR = 0xff
AMB1_SCHEDULE = 2
AMB1_POINTCOLOR = 0xffff;
AMB1_START_SCHEDULE1 = 5
AMB1_END_SCHEDULE1 = 6
AMB1_SOUND1 = "C:\\WorkTest\\WorldCreator\\AmbSound1.wav"
AMB1_START_SCHEDULE2 = 6
AMB1_END_SCHEDULE2 = 7
AMB1_SOUND2 = "C:\\WorkTest\\WorldCreator\\AmbSound2.wav"
AMB2_COLOR = 0xffff
AMB2_SCHEDULE = 1
AMB2_POINTCOLOR = 0xffffff;
AMB2_START_SCHEDULE1 = 1
AMB2_END_SCHEDULE1 = 2
AMB2_SOUND1 = "C:\\WorkTest\\WorldCreator\\AmbSound2.wav"
[SECTOR_AMBIENCE2]
.........
*/
SectorAmbience* pSecAmb = new SectorAmbience;
sprintf( strSectorAmb, "%s%d", APP_SECTOR_AMBIENCE, count );
//--------------
// ZONE
//--------------
sprintf( strMsg, "%s, %s", strSectorAmb, KEY_ZONE );
Zone = GetPrivateProfileInt( strSectorAmb, KEY_ZONE, -1, strFilename );
if( Zone == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
//--------------
// SECTORX
//--------------
sprintf( strMsg, "%s, %s", strSectorAmb, KEY_SECTORX );
pSecAmb->iSectorX = GetPrivateProfileInt( strSectorAmb, KEY_SECTORX, -1, strFilename );
if( pSecAmb->iSectorX == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
//--------------
// SECTORY
//--------------
sprintf( strMsg, "%s, %s", strSectorAmb, KEY_SECTORY );
pSecAmb->iSectorY = GetPrivateProfileInt( strSectorAmb, KEY_SECTORY, -1, strFilename );
if( pSecAmb->iSectorY == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
//--------------
// NUM_AMBIENCE
//--------------
int AmbNum;
sprintf( strMsg, "%s, %s", strSectorAmb, KEY_NUM_AMBIENCE );
AmbNum = GetPrivateProfileInt( strSectorAmb, KEY_NUM_AMBIENCE, -1, strFilename );
if( AmbNum == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
//--------------
// TEXTURE
//--------------
char buf[MAX_PATH];
ZeroMemory( buf, sizeof(buf) );
sprintf( strMsg, "%s, %s", strSectorAmb, KEY_TEXTURE );
GetPrivateProfileString( strSectorAmb, KEY_TEXTURE, "x", buf, sizeof(buf), strFilename );
if( !strcmp(buf, "x") ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
else strcpy( pSecAmb->strTexFilename, buf );
LoadAmbTexture( buf );
for( int i = 0; i < AmbNum; i++ )
{
int iSchedule;
//Create AmbienceInfo
AmbienceInfo* pAmbInfo = new AmbienceInfo;
//------------------
// AMB()_COLOR
//------------------
sprintf( buf, "%s%d_%s", KEY_AMB, i+1, KEY_COLOR );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
int temp = (DWORD)GetPrivateProfileInt( strSectorAmb, buf, -1, strFilename );
if( temp == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
else pAmbInfo->dwColor = (DWORD)temp;
//------------------
// AMB()_POINTCOLOR
//------------------
sprintf( buf, "%s%d_%s", KEY_AMB, i+1, KEY_POINTCOLOR );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
temp = (DWORD)GetPrivateProfileInt( strSectorAmb, buf, -1, strFilename );
if( temp == -1 ) { }//MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK ); }
/* 일단은 쓰이지 않음
else
{
pAmbInfo->dwPointColor = (DWORD)temp;
//Push AmbiencePoint Position
RECT rct;
D3DLOCKED_RECT PixelData;
SetRect( &rct, 0, 0, AMB_TEXTURESIZE, AMB_TEXTURESIZE );
m_ResizeTexture.GetTexture()->LockRect( 0, &PixelData, &rct, 0 );
for( int y = 0; y < AMB_TEXTURESIZE; y++ )
{
for( int x = 0; x < AMB_TEXTURESIZE; x++ )
{
DWORD* color = (DWORD*)PixelData.pBits;
color += x + y*PixelData.Pitch/4;
DWORD dwtemp = *color & 0x00ffffff;
if( dwtemp == pAmbInfo->dwPointColor )
{
D3DXVECTOR3* pPos = new D3DXVECTOR3;
GetPosFromLockPos( pPos, x, y, pSecAmb->iSectorX, pSecAmb->iSectorY );
pAmbInfo->AmbPointList.push_back( pPos );
}
}
}
m_ResizeTexture.GetTexture()->UnlockRect(0);
}*/
//----------------
// AMB()_SCHEDULE
//----------------
sprintf( buf, "%s%d_%s", KEY_AMB, i+1, KEY_SCHEDULE );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
iSchedule = GetPrivateProfileInt( strSectorAmb, buf, -1, strFilename );
if( iSchedule == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
for( int j = 0; j < iSchedule; j++ )
{
//Create AmbiencePoint Schedule
AmbSchedule* pSchedule = new AmbSchedule;
//-------------------------
// AMB()_START_SCHEDULE()
//-------------------------
sprintf( buf, "%s%d_%s_%s%d", KEY_AMB, i+1, KEY_START, KEY_SCHEDULE, j+1 );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
temp = GetPrivateProfileInt( strSectorAmb, buf, -1, strFilename );
if( temp == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
else pSchedule->fStartTime = (float)temp;
//-------------------------
// AMB()_END_SCHEDULE()
//-------------------------
sprintf( buf, "%s%d_%s_%s%d", KEY_AMB, i+1, KEY_END, KEY_SCHEDULE, j+1 );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
temp = GetPrivateProfileInt( strSectorAmb, buf, -1, strFilename );
if( temp == -1 ) MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
else pSchedule->fEndTime = (float)temp;
//-------------------------
// AMB()_SOUND()
//-------------------------
sprintf( buf, "%s%d_%s%d", KEY_AMB, i+1, KEY_SOUND, j+1 );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
GetPrivateProfileString( strSectorAmb, buf, "x", pSchedule->strFilename,
sizeof(pSchedule->strFilename), strFilename );
if( !strcmp(pSchedule->strFilename, "x") )
MessageBox( NULL, strMsg, "파싱실패:AMB스크립트", MB_OK );
//-----------------------------
// AMB()_SCHEDULE()_RANDOM()
//-----------------------------
char TempSndName[MAX_PATH];
for( int rn = 1;;rn++ )
{
sprintf( buf, "AMB%d_SCHEDULE%d_RANDOM%d", i+1, j+1, rn );
GetPrivateProfileString( strSectorAmb, buf, "x", TempSndName, MAX_PATH, strFilename );
if( !strcmp(TempSndName, "x") )
{
break;
}
else
{
char* pRandSndName;
pRandSndName = new char[strlen(TempSndName)+1];
strcpy( pRandSndName, TempSndName );
pSchedule->RandomSndList.push_back(pRandSndName);
}
}
//----------------------------------
// AMB()_SCHEDULE()_RANDOM_CYCLE
//----------------------------------
sprintf( buf, "AMB%d_SCHEDULE%d_RANDOM_CYCLE", i+1, j+1 );
sprintf( strMsg, "%s, %s", strSectorAmb, buf );
pSchedule->iRandSndCycle = GetPrivateProfileInt( strSectorAmb, buf, -1, strFilename );
//Push Schedule
pAmbInfo->ScheduleList.push_back( pSchedule );
}
//Push AmbienceInfo
pSecAmb->AmbInfoList.push_back( pAmbInfo );
}
//=====================
// Add List
//=====================
MakeColorTable( pSecAmb->ColorTable[0], pSecAmb->strTexFilename );
m_ScriptDataList[Zone].push_back( pSecAmb );
}
}
void CSectorAmbienceMap::DeleteScriptData()
{
vector<SectorAmbience*>::iterator iter;
vector<AmbienceInfo*>::iterator iter2;
vector<AmbSchedule*>::iterator iter3;
vector<char*>::iterator iter4;
for( int Zone = 0; Zone < ZONE_NUM; Zone++ )
{
for( iter = m_ScriptDataList[Zone].begin();
iter != m_ScriptDataList[Zone].end(); iter++ )
{
for( iter2 = (*iter)->AmbInfoList.begin();
iter2 != (*iter)->AmbInfoList.end(); iter2++ )
{
for( iter3 = (*iter2)->ScheduleList.begin();
iter3 != (*iter2)->ScheduleList.end(); iter3++ )
{
for( iter4 = (*iter3)->RandomSndList.begin();
iter4 != (*iter3)->RandomSndList.end(); iter4++ )
{
delete [] (*iter4);
}
delete (*iter3);
}
delete (*iter2);
}
delete (*iter);
}
}
}
void CSectorAmbienceMap::LoadAmbTexture( char* strFile )
{
SAFE_RELEASE(m_pAmbTexture);
D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), strFile,
D3DX_DEFAULT,
D3DX_DEFAULT, 1, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
D3DX_FILTER_NONE, 0x00000000, NULL, NULL,
&m_pAmbTexture );
TESTSCREEN_VERTEX pVertex[4];
pVertex[0].x = 0;
pVertex[0].y = 0;
pVertex[0].z = 0.0f;
pVertex[0].rhw = 1.0f;
pVertex[0].u = 0.0f;
pVertex[0].v = 0.0f;
pVertex[0].color = 0x55ffffff;
pVertex[1].x = AMB_TEXTURESIZE;
pVertex[1].y = 0;
pVertex[1].z = 0.0f;
pVertex[1].rhw = 1.0f;
pVertex[1].u = 1.0f;
pVertex[1].v = 0.0f;
pVertex[1].color = 0x55ffffff;
pVertex[2].x = 0;
pVertex[2].y = AMB_TEXTURESIZE;
pVertex[2].z = 0.0f;
pVertex[2].rhw = 1.0f;
pVertex[2].u = 0.0f;
pVertex[2].v = 1.0f;
pVertex[2].color = 0x55ffffff;
pVertex[3].x = AMB_TEXTURESIZE;
pVertex[3].y = AMB_TEXTURESIZE;
pVertex[3].z = 0.0f;
pVertex[3].rhw = 1.0f;
pVertex[3].u = 1.0f;
pVertex[3].v = 1.0f;
pVertex[3].color = 0x55ffffff;
LPDIRECT3DDEVICE8 pd3dDevice = BaseGraphicsLayer::GetDevice();
pd3dDevice->SetTexture( 0, m_pAmbTexture );
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
pd3dDevice->SetVertexShader( D3DFVF_XYZRHW | D3DFVF_TEX1 | D3DFVF_DIFFUSE );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_FOGENABLE, FALSE );
pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
pd3dDevice->SetTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
m_ResizeTexture.Begin( pd3dDevice );
D3DVIEWPORT8 temp;
BaseGraphicsLayer::GetDevice()->GetViewport( &temp );
temp.Height = AMB_TEXTURESIZE;
temp.Width = AMB_TEXTURESIZE;
BaseGraphicsLayer::GetDevice()->SetViewport( &temp );
pd3dDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER|D3DCLEAR_TARGET,0xffffffff, 1.0f, 0);
pd3dDevice->BeginScene();
pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLESTRIP, 2, pVertex, sizeof(TESTSCREEN_VERTEX) );
pd3dDevice->EndScene();
m_ResizeTexture.End( pd3dDevice );
//Set things back to normal
pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );
pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
pd3dDevice->SetRenderState( D3DRS_FOGENABLE, TRUE );
}
void CSectorAmbienceMap::GetPosFromLockPos( D3DXVECTOR3* outPos, int inPosX, int inPosY, int SectorX, int SectorY )
{
float Magnification = (float)SECTORSIZE / (float)AMB_TEXTURESIZE;
outPos->x = (float)SECTORSIZE*SectorX + (float)inPosX * Magnification;
outPos->z = (float)SECTORSIZE*SectorY + (float)(AMB_TEXTURESIZE - inPosY) * Magnification;
//일단 임시값 설정
outPos->y = 0.0f;
}
SectorAmbience* CSectorAmbienceMap::GetSectorAmbience( int SectorX, int SectorY )
{
vector<SectorAmbience*>::iterator iter;
for( iter = m_SectorAmbList.begin();
iter != m_SectorAmbList.end(); iter++ )
{
if( (*iter)->iSectorX == SectorX && (*iter)->iSectorY == SectorY )
{
return (*iter);
}
}
return NULL;
}
void CSectorAmbienceMap::SaveColorTable( DWORD* pSrce, char* strDestFile )
{
DWORD ColorTable[AMB_TEXTURESIZE][AMB_TEXTURESIZE];
memcpy( ColorTable[0], pSrce, sizeof(DWORD)*AMB_TEXTURESIZE*AMB_TEXTURESIZE );
LPDIRECT3DSURFACE8 lpSrcSurface = NULL;
LPDIRECT3DSURFACE8 lpDestSurface = NULL;
LPDIRECT3DTEXTURE8 lpLockTexture = NULL;
D3DXCreateTextureFromFileEx(BaseGraphicsLayer::GetDevice(), "C:\\Test.bmp",
D3DX_DEFAULT,
D3DX_DEFAULT, 1, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
D3DX_FILTER_NONE, 0x00000000, NULL, NULL,
&lpLockTexture );
m_ResizeTexture.GetTexture()->GetSurfaceLevel(0,&lpSrcSurface);
lpLockTexture->GetSurfaceLevel(0,&lpDestSurface);
D3DXLoadSurfaceFromSurface( lpDestSurface,NULL,NULL,
lpSrcSurface,NULL,NULL,
D3DX_FILTER_NONE,0);
RECT rct;
D3DLOCKED_RECT PixelData;
SetRect( &rct, 0, 0, AMB_TEXTURESIZE, AMB_TEXTURESIZE );
lpLockTexture->LockRect( 0, &PixelData, &rct, 0 );
for( int y = 0; y < AMB_TEXTURESIZE; y++ )
{
for( int x = 0; x < AMB_TEXTURESIZE; x++ )
{
DWORD* color = (DWORD*)PixelData.pBits;
color += x + y*PixelData.Pitch/4;
*color = ColorTable[y][x];
}
}
lpLockTexture->UnlockRect(0);
D3DXSaveTextureToFile(strDestFile,
D3DXIFF_BMP,
lpLockTexture,
NULL);
SAFE_RELEASE(lpLockTexture);
}
void CSectorAmbienceMap::MakeColorTable( DWORD* pDest, char* strSrcFile )
{
DWORD ColorTable[AMB_TEXTURESIZE][AMB_TEXTURESIZE];
LoadAmbTexture( strSrcFile );
LPDIRECT3DSURFACE8 lpSrcSurface = NULL;
LPDIRECT3DSURFACE8 lpDestSurface = NULL;
LPDIRECT3DTEXTURE8 lpLockTexture = NULL;
D3DXCreateTextureFromFileEx( BaseGraphicsLayer::GetDevice(), strSrcFile,
D3DX_DEFAULT,
D3DX_DEFAULT, 1, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_FILTER_NONE,
D3DX_FILTER_NONE, 0x00000000, NULL, NULL,
&lpLockTexture );
m_ResizeTexture.GetTexture()->GetSurfaceLevel(0,&lpSrcSurface);
lpLockTexture->GetSurfaceLevel(0,&lpDestSurface);
D3DXLoadSurfaceFromSurface( lpDestSurface,NULL,NULL,
lpSrcSurface,NULL,NULL,
D3DX_FILTER_NONE,0);
RECT rct;
D3DLOCKED_RECT PixelData;
SetRect( &rct, 0, 0, AMB_TEXTURESIZE, AMB_TEXTURESIZE );
lpLockTexture->LockRect( 0, &PixelData, &rct, 0 );
for( int y = 0; y < AMB_TEXTURESIZE; y++ )
{
for( int x = 0; x < AMB_TEXTURESIZE; x++ )
{
DWORD* color = (DWORD*)PixelData.pBits;
color += x + y*PixelData.Pitch/4;
ColorTable[y][x] = *color;
}
}
lpLockTexture->UnlockRect(0);
memcpy( pDest, ColorTable[0], sizeof(DWORD)*AMB_TEXTURESIZE*AMB_TEXTURESIZE );
SAFE_RELEASE(lpLockTexture);
}
void CSectorAmbienceMap::WriteBinData( const char* strFilePath )
{
vector<SectorAmbience*>::iterator iter_SecAmb;
vector<AmbienceInfo*>::iterator iter_AmbInfo;
vector<AmbSchedule*>::iterator iter_AmbSchle;
vector<D3DXVECTOR3*>::iterator iter_Point;
FILE* fp;
char strFile[MAX_PATH];
ZeroMemory( strFile, sizeof(strFile) );
for( int Zone = 0; Zone < ZONE_NUM; Zone++ )
{
if( m_ScriptDataList[Zone].size() == 0 ) continue;
sprintf( strFile, "%s\\Zone%d.amb", strFilePath, Zone );
fp = fopen( strFile, "wb" );
if( fp == NULL )
{
MessageBox( NULL, "Ambience파일을 쓰는데 실패!!", "파일에러", MB_OK );
}
int SecAmbNum = m_ScriptDataList[Zone].size();
fwrite( &SecAmbNum, sizeof(int), 1, fp );
for( iter_SecAmb = m_ScriptDataList[Zone].begin();
iter_SecAmb != m_ScriptDataList[Zone].end(); iter_SecAmb++ )
{
fwrite( &((*iter_SecAmb)->iSectorX), sizeof(int), 1, fp );
fwrite( &((*iter_SecAmb)->iSectorY), sizeof(int), 1, fp );
(*iter_SecAmb)->strTexFilename[MAX_PATH-1] = NULL;
fwrite( (*iter_SecAmb)->strTexFilename, sizeof(char), MAX_PATH, fp );
fwrite( (*iter_SecAmb)->ColorTable[0], sizeof(DWORD), AMB_TEXTURESIZE*AMB_TEXTURESIZE, fp );
int AmbInfoNum = (*iter_SecAmb)->AmbInfoList.size();
fwrite( &AmbInfoNum, sizeof(int), 1, fp );
for( iter_AmbInfo = (*iter_SecAmb)->AmbInfoList.begin();
iter_AmbInfo != (*iter_SecAmb)->AmbInfoList.end(); iter_AmbInfo++ )
{
fwrite( &((*iter_AmbInfo)->dwColor), sizeof(DWORD), 1, fp );
fwrite( &((*iter_AmbInfo)->dwPointColor), sizeof(DWORD), 1, fp );
int AmbPointNum = (*iter_AmbInfo)->AmbPointList.size();
fwrite( &AmbPointNum, sizeof(int), 1, fp );
for( iter_Point = (*iter_AmbInfo)->AmbPointList.begin();
iter_Point != (*iter_AmbInfo)->AmbPointList.end(); iter_Point++ )
{
fwrite( *iter_Point, sizeof(D3DXVECTOR3), 1, fp );
}
int SchleNum = (*iter_AmbInfo)->ScheduleList.size();
fwrite( &SchleNum, sizeof(int), 1, fp );
for( iter_AmbSchle = (*iter_AmbInfo)->ScheduleList.begin();
iter_AmbSchle != (*iter_AmbInfo)->ScheduleList.end(); iter_AmbSchle++ )
{
fwrite( &(*iter_AmbSchle)->fStartTime, sizeof(float), 1, fp );
fwrite( &(*iter_AmbSchle)->fEndTime, sizeof(float), 1, fp );
fwrite( (*iter_AmbSchle)->strFilename, sizeof(char), MAX_PATH, fp );
//렌덤사운드기록추가
int nRandSndNum = (*iter_AmbSchle)->RandomSndList.size();
fwrite( &nRandSndNum, sizeof(int), 1, fp );
for( int rn = 0; rn < nRandSndNum; rn++ )
{
char* strRndSnd = (*iter_AmbSchle)->RandomSndList[rn];
int nNameLen = strlen( strRndSnd );
fwrite( &nNameLen, 1, sizeof(int), fp );
fwrite( strRndSnd, 1, nNameLen, fp );
}
//렌덤사운드 주기추가
fwrite( &(*iter_AmbSchle)->iRandSndCycle, sizeof(int), 1, fp );
}
}
}
fclose( fp );
}
}
void CSectorAmbienceMap::LoadData( char* strFile )
{
// GetScriptData("C:\\릴사운드스크립트\\Test.txt");
// WriteBinData("C:\릴사운드스크립트");
FILE* fp;
fp = fopen( strFile, "rb" );
if( fp == NULL )
{
MessageBox( NULL, "Ambience파일을 여는데 실패!!", "파일에러", MB_OK );
return;
}
DeleteAmbData();
int SecAmbNum;
fread( &SecAmbNum, sizeof(int), 1, fp );
for( int j = 0; j < SecAmbNum; j++ )
{
SectorAmbience* pSecAmb = new SectorAmbience;
fread( &(pSecAmb->iSectorX), sizeof(int), 1, fp );
fread( &(pSecAmb->iSectorY), sizeof(int), 1, fp );
fread( pSecAmb->strTexFilename, sizeof(char), MAX_PATH, fp );
fread( pSecAmb->ColorTable[0], sizeof(DWORD), AMB_TEXTURESIZE*AMB_TEXTURESIZE, fp );
int AmbInfoNum;
fread( &AmbInfoNum, sizeof(int), 1, fp );
for( int q = 0; q < AmbInfoNum; q++ )
{
AmbienceInfo* pAmbInfo = new AmbienceInfo;
fread( &(pAmbInfo->dwColor), sizeof(DWORD), 1, fp );
fread( &(pAmbInfo->dwPointColor), sizeof(DWORD), 1, fp );
int AmbPointNum;
fread( &AmbPointNum, sizeof(int), 1, fp );
for( int w = 0; w < AmbPointNum; w++ )
{
D3DXVECTOR3* pPoint = new D3DXVECTOR3;
fread( pPoint, sizeof(D3DXVECTOR3), 1, fp );
pAmbInfo->AmbPointList.push_back( pPoint );
}
int SchleNum;
fread( &SchleNum, sizeof(int), 1, fp );
for( int p = 0; p < SchleNum; p++ )
{
AmbSchedule* pSchedule = new AmbSchedule;
fread( &pSchedule->fStartTime, sizeof(float), 1, fp );
fread( &pSchedule->fEndTime, sizeof(float), 1, fp );
char name[MAX_PATH];
fread( name, sizeof(char), MAX_PATH, fp );
sprintf( pSchedule->strFilename, "%s%s", AMBIENCEPATH, name );
//렌덤사운드 로드추가
int nRandSndNum = 0;
fread( &nRandSndNum, sizeof(int), 1, fp );
for( int rn = 0; rn < nRandSndNum; rn++ )
{
int nNameLen;
fread( &nNameLen, 1, sizeof(int), fp );
char* strRndSnd = new char[nNameLen+1];
memset( strRndSnd, 0, nNameLen+1 );
fread( strRndSnd, 1, nNameLen, fp );
pSchedule->RandomSndList.push_back( strRndSnd );
}
//렌덤사운드 주기 로드추가
fread( &pSchedule->iRandSndCycle, sizeof(int), 1, fp );
pAmbInfo->ScheduleList.push_back( pSchedule );
}
pSecAmb->AmbInfoList.push_back( pAmbInfo );
}
m_SectorAmbList.push_back( pSecAmb );
}
fclose( fp );
// WriteScriptData("C:\\Test.txt");
}
void CSectorAmbienceMap::DeleteAmbData()
{
vector<SectorAmbience*>::iterator iter_sec;
vector<AmbienceInfo*>::iterator iter_amb;
vector<AmbSchedule*>::iterator iter_sche;
vector<D3DXVECTOR3*>::iterator iter_vec;
vector<char*>::iterator iter_str;
for( iter_sec = m_SectorAmbList.begin();
iter_sec != m_SectorAmbList.end(); iter_sec++ )
{
for( iter_amb = (*iter_sec)->AmbInfoList.begin();
iter_amb != (*iter_sec)->AmbInfoList.end(); iter_amb++ )
{
for( iter_sche = (*iter_amb)->ScheduleList.begin();
iter_sche != (*iter_amb)->ScheduleList.end(); iter_sche++ )
{
for( iter_str = (*iter_sche)->RandomSndList.begin();
iter_str != (*iter_sche)->RandomSndList.end(); iter_str++ )
{
delete [] (*iter_str);
}
delete (*iter_sche);
}
for( iter_vec = (*iter_amb)->AmbPointList.begin();
iter_vec != (*iter_amb)->AmbPointList.end(); iter_vec++ )
{
delete (*iter_vec);
}
delete (*iter_amb);
}
delete (*iter_sec);
}
m_SectorAmbList.clear();
}