// 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::iterator iter; vector::iterator iter2; vector::iterator iter3; vector::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::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::iterator iter_SecAmb; vector::iterator iter_AmbInfo; vector::iterator iter_AmbSchle; vector::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::iterator iter_sec; vector::iterator iter_amb; vector::iterator iter_sche; vector::iterator iter_vec; vector::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(); }