/// BMP파일을 열어서 높이맵을 생성한다. HRESULT ZTerrain::_BuildHeightMap( LPSTR lpFilename ) { LPBYTE pDIB = DibLoadHandle( lpFilename ); if( !pDIB ) return E_FAIL; m_cxDIB = DIB_CX( pDIB ); m_czDIB = DIB_CY( pDIB ); // 여기서 m_cxDIB나 m_czDIB가 (2^n+1)이 아닌경우 E_FAIL을 반환하도록 수정할 것 m_pvHeightMap = new TERRAINVERTEX[m_cxDIB * m_czDIB]; TERRAINVERTEX v; for( int z = 0 ; z < m_czDIB ; z++ ) { for( int x = 0 ; x < m_cxDIB ; x++ ) { v.p.x = (float)( ( x - m_cxDIB / 2 ) * m_vfScale.x ); v.p.z = -(float)( ( z - m_czDIB / 2 ) * m_vfScale.z ); v.p.y = (float)( *( DIB_DATAXY_INV( pDIB, x, z ) ) ) * m_vfScale.y; D3DXVec3Normalize( &v.n, &v.p ); v.t.x = (float)x / (float)( m_cxDIB - 1 ); v.t.y = (float)z / (float)( m_czDIB - 1 ); m_pvHeightMap[x + z * m_czDIB] = v; } } DibDeleteHandle( pDIB ); return S_OK; }
/// BMP파일을 열어서 높이맵을 생성한다. HRESULT ZTerrain::_BuildHeightMap( const char* lpFilename ) { #ifdef _UNICODE char temp[256]={0,}; WideCharToMultiByte(CP_ACP, 0, lpFilename, -1, temp, 256, NULL, NULL); LPBYTE pDIB = DibLoadHandle( temp ); #else LPBYTE pDIB = DibLoadHandle( lpFilename ); #endif if( !pDIB ) return E_FAIL; char filename[256]; _splitpath_s(lpFilename,NULL,0,NULL,0,filename,256,NULL,0); m_strNodeName = filename; m_cxDIB = DIB_CX( pDIB ); m_czDIB = DIB_CY( pDIB ); // 여기서 m_cxDIB나 m_czDIB가 (2^n+1)이 아닌경우 E_FAIL을 반환하도록 수정할 것 m_pvHeightMap = new TERRAINVERTEX[m_cxDIB * m_czDIB]; TERRAINVERTEX v; for( int z = 0 ; z < m_czDIB ; z++ ) { for( int x = 0 ; x < m_cxDIB ; x++ ) { v.p.x = (float)( ( x - m_cxDIB / 2 ) * m_vfScale.x ); v.p.z = -(float)( ( z - m_czDIB / 2 ) * m_vfScale.z ); v.p.y = (float)( *( DIB_DATAXY_INV( pDIB, x, z ) ) ) * m_vfScale.y; D3DXVec3Normalize( &v.n, &v.p ); v.u = (float)x / (float)( m_cxDIB - 1 ); v.v = (float)z / (float)( m_czDIB - 1 ); m_pvHeightMap[x + z * m_czDIB] = v; } } DibDeleteHandle( pDIB ); return S_OK; }