#include "stdafx.h" #include "TerrainNode.h" #include "Terrain.h" #include "RenderSystem.h" bool cTerrainBranchNode::Load( cFileLoader& loader ) { /// °æ°è »óÀÚ¸¦ ·Îµù if( loader.Read( &mBoundBox, sizeof(cBox) ) != sizeof(cBox) ) return false; mCenter = (mBoundBox.GetMin() + mBoundBox.GetMax()) * 0.5f; mRadius = (mBoundBox.GetMax() - mBoundBox.GetMin()).Length() * 0.5f; /// ÀÚ½Ä ³ëµåµéÀ» ·Îµù if( mChild[0]->Load( loader ) == false ) return false; if( mChild[1]->Load( loader ) == false ) return false; if( mChild[2]->Load( loader ) == false ) return false; if( mChild[3]->Load( loader ) == false ) return false; return true; } bool cTerrainLeafNode::Load( cFileLoader& loader ) { Clear(); /// °æ°è »óÀÚ¸¦ ·Îµù if( loader.Read( &mBoundBox, sizeof(cBox) ) != sizeof(cBox) ) return false; mCenter = (mBoundBox.GetMin() + mBoundBox.GetMax()) * 0.5f; mRadius = (mBoundBox.GetMax() - mBoundBox.GetMin()).Length() * 0.5f; /// µðÅ×ÀÏ ÅØ½ºÃ³ À妽º¸¦ ·Îµù unsigned int ti0 = 0; unsigned int ti1 = 0; unsigned int ti2 = 0; loader.ReadUnsignedInt( &ti0 ); loader.ReadUnsignedInt( &ti1 ); loader.ReadUnsignedInt( &ti2 ); if( ti0 >= TERRAIN_TEXTURE_COUNT || ti1 >= TERRAIN_TEXTURE_COUNT || ti2 >= TERRAIN_TEXTURE_COUNT ) { assert( 0 ); return false; } SetTextures( TERRAIN->GetTexture( ti0 ), TERRAIN->GetTexture( ti1 ), TERRAIN->GetTexture( ti2 ) ); /// ¹öÀüº° ·Îµù switch( mVersion ) { case 2: case 3: case 4: { /// ³ôÀÌ ¹è¿­À» ·Îµù float h; for( unsigned int yi = mYIndex, yend = mYIndex + mLineCount[0]; yi < yend; ++yi ) { for( unsigned int xi = mXIndex, xend = mXIndex + mLineCount[0]; xi < xend; ++xi ) { loader.ReadFloat( &h ); TERRAIN->SetHeight( xi, yi, h ); } } /// ¾ËÆÄ ¹è¿­À» ·Îµù NiPoint3 a; for( unsigned int yi = mYIndex, yend = mYIndex + mLineCount[0]; yi < yend; ++yi ) { for( unsigned int xi = mXIndex, xend = mXIndex + mLineCount[0]; xi < xend; ++xi ) { loader.Read( &a, sizeof(NiPoint3) ); TERRAIN->SetAlpha( xi, yi, a ); } } /// »ö»ó ¹è¿­À» »ý¼º ¹× ·Îµù NiColorA c; for( unsigned int yi = mYIndex, yend = mYIndex + mLineCount[0]; yi < yend; ++yi ) { for( unsigned int xi = mXIndex, xend = mXIndex + mLineCount[0]; xi < xend; ++xi ) { loader.Read( &c, sizeof(NiColorA) ); TERRAIN->SetColor( xi, yi, NiColor(c.r, c.g, c.b) ); } } /// ¹öÆÛ¸¦ °»½Å mBuffer->UpdatePosCoord( TERRAIN, mXIndex, mYIndex, mLineCount[0] ); mBuffer->UpdateAlpha( TERRAIN, mXIndex, mYIndex, mLineCount[0] ); mBuffer->UpdateColor( TERRAIN, mXIndex, mYIndex, mLineCount[0] ); break; } case 5: case 6: { /// °¡½Ã ¿©ºÎ¸¦ ·Îµù unsigned int visible = 0; loader.ReadUnsignedInt( &visible ); mVisible = visible != 0; break; } } /// /*for( unsigned int i = 1, step = 2; i < TERRAIN_LOD_COUNT; ++i, step *= 2 ) { unsigned short numVerts = mNumVerts[i]; unsigned int gridSize = mLineCount[i]; NiPoint3* posCoords = mPosCoords[i] = NiNew NiPoint3[numVerts]; NiPoint3* alphas = mAlphas[i] = NiNew NiPoint3[numVerts]; NiColor* colors = mColors[i] = NiNew NiColor[numVerts]; for( unsigned int j = 0, y = 0; y < gridSize; ++y ) { for( unsigned int x = 0; x < gridSize; ++x, ++j ) { posCoords[j] = mPosCoords[0][y * step * mLineCount[0] + x * step]; alphas[j] = mAlphas[0][y * step * mLineCount[0] + x * step]; colors[j] = mColors[0][y * step * mLineCount[0] + x * step]; } } } */ /*// »ï°¢Çü ½ºÆ®¸³À» »ý¼º for( unsigned int i = 0, step = 1; i < TERRAIN_LOD_COUNT; ++i, step *= 2 ) { unsigned short numVerts = mNumVerts[i]; NiPoint3* posCoords = mPosCoords[i]; NiPoint3* alphas = mAlphas[i]; NiColor* colors = mColors[i]; /// ½ºÆ®¸³ »ý¼º cTerrainStrip* tris = mTriStrips[i] = NiNew cTerrainStrip( numVerts, posCoords, alphas, colors, TERRAIN->GetTexCoords( i ), mNumTris[i], mNumStrips[i], TERRAIN->GetStripLength( i ), TERRAIN->GetStripIndex( i ), mCenter, mRadius ); /// ·»´õ·¯¿¡ ¹Ì¸® µî·Ï RENDERSYS->GetRenderer()->AddTerrainGeomToGroup( tris ); } */ /*// »ï°¢Çü ¸®½ºÆ®¸¦ »ý¼º for( unsigned int i = 0; i < TERRAIN_LOD_COUNT; ++i ) { unsigned int gridSize = mLineCount[i]; unsigned short numTris = unsigned short(gridSize / 2); /// À§Ä¡ ¹è¿­À» »ý¼º ¹× ¼³Á¤ mCrackPosCoords[i][0] = NiNew NiPoint3[gridSize]; mCrackPosCoords[i][1] = NiNew NiPoint3[gridSize]; mCrackPosCoords[i][2] = NiNew NiPoint3[gridSize]; mCrackPosCoords[i][3] = NiNew NiPoint3[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { mCrackPosCoords[i][0][j] = mPosCoords[i][0 + j]; mCrackPosCoords[i][1][j] = mPosCoords[i][(gridSize - 1) * gridSize + j]; mCrackPosCoords[i][2][j] = mPosCoords[i][j * gridSize + 0]; mCrackPosCoords[i][3][j] = mPosCoords[i][j * gridSize + gridSize - 1]; } /// ¾ËÆÄ ¹è¿­À» »ý¼º ¹× ¼³Á¤ mCrackAlphas[i][0] = NiNew NiPoint3[gridSize]; mCrackAlphas[i][1] = NiNew NiPoint3[gridSize]; mCrackAlphas[i][2] = NiNew NiPoint3[gridSize]; mCrackAlphas[i][3] = NiNew NiPoint3[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { mCrackAlphas[i][0][j] = mAlphas[i][0 + j]; mCrackAlphas[i][1][j] = mAlphas[i][(gridSize - 1) * gridSize + j]; mCrackAlphas[i][2][j] = mAlphas[i][j * gridSize + 0]; mCrackAlphas[i][3][j] = mAlphas[i][j * gridSize + gridSize - 1]; } /// »ö»ó ¹è¿­À» »ý¼º ¹× ¼³Á¤ mCrackColors[i][0] = NiNew NiColorA[gridSize]; mCrackColors[i][1] = NiNew NiColorA[gridSize]; mCrackColors[i][2] = NiNew NiColorA[gridSize]; mCrackColors[i][3] = NiNew NiColorA[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { mCrackColors[i][0][j] = mColors[i][0 + j]; mCrackColors[i][1][j] = mColors[i][(gridSize - 1) * gridSize + j]; mCrackColors[i][2][j] = mColors[i][j * gridSize + 0]; mCrackColors[i][3][j] = mColors[i][j * gridSize + gridSize - 1]; } /// ÅØ½ºÃ³ ¹è¿­À» »ý¼º ¹× ¼³Á¤ NiPoint2* texArray = TERRAIN->GetTexCoords( i ); /// ÇÏ NiPoint2* texCoords = mCrackTexCoords[i][0] = NiNew NiPoint2[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { texCoords[j] = texArray[0 + j]; } /// »ó texCoords = mCrackTexCoords[i][1] = NiNew NiPoint2[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { texCoords[j] = texArray[(gridSize-1) * gridSize + j]; } /// Á texCoords = mCrackTexCoords[i][2] = NiNew NiPoint2[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { texCoords[j] = texArray[j * gridSize + 0]; } /// ¿ì texCoords = mCrackTexCoords[i][3] = NiNew NiPoint2[gridSize]; for( unsigned int j = 0; j < gridSize; ++j ) { texCoords[j] = texArray[j * gridSize + gridSize - 1]; } for( unsigned int j = 0; j < 4; ++j ) { /// ¸®½ºÆ® ¹è¿­À» »ý¼º ¹× ¼³Á¤ unsigned short* crackList = mCrackList[i][j] = NiAlloc( unsigned short, numTris * 3 ); for( unsigned short k = 0, k2 = 0, kend = numTris * 3; k < kend; k += 3, k2 += 2 ) { crackList[k + 0] = k2 + 0; crackList[k + 1] = k2 + 1; crackList[k + 2] = k2 + 2; } /// ¸®½ºÆ® »ý¼º NiTriShape* tris = mTriCracks[i][j] = NiNew NiTriShape( unsigned short(gridSize), mCrackPosCoords[i][j], mCrackAlphas[i][j], mCrackColors[i][j], mCrackTexCoords[i][j], 1, NiGeometryData::NBT_METHOD_NONE, numTris, crackList ); } } */ return true; }