i32 CreateRect2D(Resources::CMesh* pMesh, const IInputLayout* pIL, const SRect2DOptions& Opts) { Vec3 vecScale( 100 ); Vec2 vecWidth( 0, 100 ); Vec2 vecHeight( 0, 100 ); IndexBufferPtr pIB = pMesh->CreateIndexBuffer(); VertexBufferPtr pVB = pMesh->CreateVertexBuffer(); pVB->SetVertexCount( 4 ); pVB->SetInputLayout( pIL ); pVB->SetTopologyType( TopologyTypes::TRIANGLE_LIST ); pVB->SetUsage( Opts.eUsage ); pIB->SetIndexCount( 6 ); pIB->SetUsage( BufferUsages::STATIC ); pVB->Lock(); CVertexData& VData = pVB->GetVertexData(); if( pIL->IsPosition() ) { VData.SetPosition( 0, Vec3( 0, 0, 0 ) ); VData.SetPosition( 1, Vec3( vecScale.x, 0, 0 ) ); VData.SetPosition( 2, Vec3( vecScale.x, -vecScale.y, 0 ) ); VData.SetPosition( 3, Vec3( 0, -vecScale.y, 0) ); } if( pIL->IsColor() ) { VData.SetColor( 0, Vec4( 1, 1, 1, 1 ) ); VData.SetColor( 1, Vec4( 1, 1, 1, 1 ) ); VData.SetColor( 2, Vec4( 1, 1, 1, 1 ) ); VData.SetColor( 3, Vec4( 1, 1, 1, 1 ) ); } if( pIL->IsTexCoord0() ) { VData.SetTexCoord( 0, 0, Vec2( 0, 1 ) ); VData.SetTexCoord( 1, 0, Vec2( 1, 1 ) ); VData.SetTexCoord( 2, 0, Vec2( 0, 1 ) ); VData.SetTexCoord( 3, 0, Vec2( 0, 0 ) ); } pVB->Unlock(); pVB->Create(); pIB->Lock(); CIndexData& IData = pIB->GetIndexData(); IData.SetTriangle( 0, 0, 2, 3 ); IData.SetTriangle( 1, 1, 2, 0 ); return XST_OK; }
cMap::cMap(const std::string& _rawpath, const std::string& _texturepath) { ZeroMemory(&m_stMtl, sizeof(D3DMATERIAL9)); m_stMtl.Ambient = m_stMtl.Diffuse = m_stMtl.Specular = D3DXCOLOR(0.7f, 0.7f, 0.7f, 1.0f); SAFE_RELEASE(m_pMesh); SAFE_RELEASE(m_pTexture); FILE* fp = NULL; std::string fullpath = MAP_PATH.substr() + _rawpath.substr(); std::string texturepath= MAP_PATH.substr() + _texturepath.substr(); fopen_s(&fp, fullpath.c_str(), "rb"); m_pTexture = g_pTextureManager->GetTexture(texturepath); fseek(fp, 0, SEEK_END); int nFileSize = ftell(fp); fseek(fp, 0, SEEK_SET); int nPixel = nFileSize / m_nBytePerPixel; int nHPixel = (int)sqrt((float)nPixel + EPSILON); //assert(nHPixel * nHPixel == nPixel && "정사각 형태의 raw파일만 사용 가능함"); m_nHPixel = nHPixel; std::vector<BYTE> vecHeight(nPixel*nHPixel); for (int i = 0; i < nPixel; ++i) { vecHeight[i] = (BYTE)fgetc(fp); if (m_nBytePerPixel > 1) { fseek(fp, m_nBytePerPixel - 1, SEEK_CUR); } } int nTileN = nHPixel - 1; m_vecVertex.resize(nPixel); for (int z = 0; z < nHPixel; ++z) { for (int x = 0; x < nHPixel; ++x) { int i = z * nHPixel + x; ST_PNT_VERTEX v; v.p = D3DXVECTOR3((float)x, vecHeight[i], (float)z); v.u = x / (float)nTileN; v.v = z / (float)nTileN; v.n = D3DXVECTOR3(0, 1, 0); m_vecVertex[i] = v; } } for (int z = 1; z < nTileN; ++z) { for (int x = 1; x < nTileN; ++x) { int i = z * nHPixel + x; int l = i - 1; int r = i + 1; int u = i + nHPixel; int d = i - nHPixel; D3DXVECTOR3 lr = m_vecVertex[r].p - m_vecVertex[l].p; D3DXVECTOR3 du = m_vecVertex[u].p - m_vecVertex[d].p; D3DXVECTOR3 n; D3DXVec3Cross(&n, &du, &lr); D3DXVec3Normalize(&n, &n); m_vecVertex[i].n = n; } } // 1--3 // |\ | // | \| // 0--2 std::vector<DWORD> vecIndex; vecIndex.reserve(nTileN * nTileN * 3 * 2); for (int z = 0; z < nTileN; ++z) { for (int x = 0; x < nTileN; ++x) { int _0 = (z + 0) * nHPixel + x; int _1 = (z + 1) * nHPixel + x; int _2 = (z + 0) * nHPixel + x + 1; int _3 = (z + 1) * nHPixel + x + 1; vecIndex.push_back(_0); vecIndex.push_back(_1); vecIndex.push_back(_2); vecIndex.push_back(_3); vecIndex.push_back(_2); vecIndex.push_back(_1); } } D3DXCreateMeshFVF(vecIndex.size() / 3, m_vecVertex.size(), D3DXMESH_MANAGED | D3DXMESH_32BIT, ST_PNT_VERTEX::FVF, g_pD3DDevice, &m_pMesh); ST_PNT_VERTEX* pV = NULL; m_pMesh->LockVertexBuffer(0, (LPVOID*)&pV); memcpy(pV, &m_vecVertex[0], sizeof(ST_PNT_VERTEX) * m_vecVertex.size()); m_pMesh->UnlockVertexBuffer(); DWORD* pI = NULL; m_pMesh->LockIndexBuffer(0, (LPVOID*)&pI); memcpy(pI, &vecIndex[0], sizeof(DWORD) * vecIndex.size()); m_pMesh->UnlockIndexBuffer(); DWORD* pA = NULL; m_pMesh->LockAttributeBuffer(0, &pA); ZeroMemory(pA, sizeof(DWORD) * m_pMesh->GetNumFaces()); m_pMesh->UnlockAttributeBuffer(); std::vector<DWORD> vecAdjBuf(m_pMesh->GetNumFaces() * 3); m_pMesh->GenerateAdjacency(0.0f, &vecAdjBuf[0]); m_pMesh->OptimizeInplace( D3DXMESHOPT_ATTRSORT | D3DXMESHOPT_COMPACT | D3DXMESHOPT_VERTEXCACHE, &vecAdjBuf[0], 0, 0, 0); fclose(fp); }