void BlendApp::BuildLandGeometryBuffers() { GeometryGenerator::MeshData grid; GeometryGenerator geoGen; geoGen.CreateGrid(160.0f, 160.0f, 50, 50, grid); mLandIndexCount = grid.Indices.size(); // // Extract the vertex elements we are interested and apply the height function to // each vertex. // std::vector<Vertex> vertices(grid.Vertices.size()); for(UINT i = 0; i < grid.Vertices.size(); ++i) { XMFLOAT3 p = grid.Vertices[i].Position; p.y = GetHillHeight(p.x, p.z); vertices[i].Pos = p; vertices[i].Normal = GetHillNormal(p.x, p.z); vertices[i].Tex = grid.Vertices[i].TexC; } D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = sizeof(Vertex) * grid.Vertices.size(); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = &vertices[0]; HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mLandVB)); // // Pack the indices of all the meshes into one index buffer. // D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * mLandIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &grid.Indices[0]; HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mLandIB)); }
void D3DTextureDemo::BuildLandGemetryBuffers() { GeometryGenerator::MeshData grid; GeometryGenerator landGenerator; landGenerator.createGrid(160.0f, 160.0f, 50, 50, grid); mLandIndexCount = grid.Indices.size(); std::vector<Vertex> vertices(grid.Vertices.size()); for(size_t i = 0; i < grid.Vertices.size(); ++i) { XMFLOAT3 p = grid.Vertices[i].Position; p.y = GetHillHeight(p.x, p.z); vertices[i].Pos = p; vertices[i].Normal = GetHillNormal(p.x, p.z); vertices[i].Tex = grid.Vertices[i].TexC; } D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = sizeof(Vertex) * grid.Vertices.size(); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; vbd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = &vertices[0]; HR(m_d3dDevice->CreateBuffer( &vbd, &vinitData, &mLandVB), L"Create Vertex Buffer"); D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * mLandIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; ibd.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &grid.Indices[0]; HR(m_d3dDevice->CreateBuffer( &ibd, &iinitData, &mLandIB), L"Create Index Buffer"); }
void LightDemo::BuildLandBuffers() { GeometryGenerator::MeshData land; GeometryGenerator geoGen; geoGen.CreateGrid(160.0f, 160.0f, 50, 50, land); m_landIndexCount = land.indices.size(); // Extract the vertex elements we are interested and apply the height function to // each vertex. In addition, color the vertices based on their height so we have // sandy looking beaches, grassy low hills, and snow mountain peaks. std::vector<Vertex> vertices(land.vertices.size()); for(size_t i = 0; i < land.vertices.size(); ++i) { XMFLOAT3 p = land.vertices[i].position; p.y = GetHeight(p.x, p.z); vertices[i].pos = p; vertices[i].normal = GetHillNormal(p.x, p.z); } D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = sizeof(Vertex) * land.vertices.size(); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = &vertices[0]; HR(m_dxDevice->CreateBuffer(&vbd, &vinitData, m_landVB.GetAddressOf())); // Pack the indices of all the meshes into one index buffer. D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(uint32) * m_landIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &land.indices[0]; HR(m_dxDevice->CreateBuffer(&ibd, &iinitData, m_landIB.GetAddressOf())); }
void Hill::init_buffer(ID3D11Device *pD3D11Device, ID3D11DeviceContext *pD3D11DeviceContext) { HRESULT hr; d3d::Geometry::MeshData gridMesh; m_Geometry.CreateGrid(160.0f, 160.0f, 50, 50, gridMesh); /////////////////////////////Vertex Buffer////////////////////////////// m_VertexCount = gridMesh.VertexData.size(); m_VertexData.resize(m_VertexCount); for(size_t i = 0; i < m_VertexCount; ++i) { XMFLOAT3 p = gridMesh.VertexData[i].Pos; p.y = GetHeight(p.x, p.z); m_VertexData[i].Pos = p; m_VertexData[i].Normal = GetHillNormal(p.x, p.z); m_VertexData[i].TexCoord = gridMesh.VertexData[i].Tex; } D3D11_BUFFER_DESC landVBDesc; landVBDesc.Usage = D3D11_USAGE_IMMUTABLE; landVBDesc.ByteWidth = sizeof(Vertex) * m_VertexCount; landVBDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER; landVBDesc.CPUAccessFlags = 0; landVBDesc.MiscFlags = 0; landVBDesc.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA landVBO; landVBO.pSysMem = &m_VertexData[0]; hr = pD3D11Device->CreateBuffer(&landVBDesc, &landVBO, &m_pLandVB); //DebugHR(hr); /////////////////////////////Index Buffer////////////////////////////// m_IndexCount = gridMesh.IndexData.size(); D3D11_BUFFER_DESC landIBDesc; landIBDesc.Usage = D3D11_USAGE_IMMUTABLE; landIBDesc.ByteWidth = sizeof(UINT) * m_IndexCount; landIBDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; landIBDesc.CPUAccessFlags = 0; landIBDesc.MiscFlags = 0; landIBDesc.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA landIBO; landIBO.pSysMem = &gridMesh.IndexData[0]; hr = pD3D11Device->CreateBuffer(&landIBDesc, &landIBO, &m_pLandIB); //DebugHR(hr); ////////////////////////////////Const Buffer////////////////////////////////////// m_Wave.Init(200, 200, 0.8f, 0.03f, 3.25f, 0.4f); D3D11_BUFFER_DESC waveVBDesce; waveVBDesce.Usage = D3D11_USAGE_DYNAMIC; waveVBDesce.ByteWidth = sizeof(Vertex) * m_Wave.VertexCount(); waveVBDesce.BindFlags = D3D11_BIND_VERTEX_BUFFER; waveVBDesce.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; waveVBDesce.MiscFlags = 0; waveVBDesce.StructureByteStride = 0; hr = pD3D11Device->CreateBuffer(&waveVBDesce, NULL, &m_pWaveVB); //DebugHR(hr); /////////////////////////////Index Buffer////////////////////////////// std::vector<UINT> indices(3 * m_Wave.TriangleCount() ); // 3 indices per face // Iterate over each quad. UINT m = m_Wave.RowCount(); UINT n = m_Wave.ColumnCount(); int k = 0; for(UINT i = 0; i < m-1; ++i) { for(DWORD j = 0; j < n-1; ++j) { indices[k] = i*n+j; indices[k+1] = i*n+j+1; indices[k+2] = (i+1)*n+j; indices[k+3] = (i+1)*n+j; indices[k+4] = i*n+j+1; indices[k+5] = (i+1)*n+j+1; k += 6; // next quad } } D3D11_BUFFER_DESC waveIBDesc; waveIBDesc.Usage = D3D11_USAGE_IMMUTABLE; waveIBDesc.ByteWidth = sizeof(UINT) * indices.size(); waveIBDesc.BindFlags = D3D11_BIND_INDEX_BUFFER; waveIBDesc.CPUAccessFlags = 0; waveIBDesc.MiscFlags = 0; waveIBDesc.StructureByteStride = 0; D3D11_SUBRESOURCE_DATA waveIBO; waveIBO.pSysMem = &indices[0]; hr = pD3D11Device->CreateBuffer(&waveIBDesc, &waveIBO, &m_pWaveIB); //DebugHR(hr); // Directional light. m_DirLight.Ambient = XMFLOAT4(0.2f, 0.2f, 0.2f, 1.0f); m_DirLight.Diffuse = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f); m_DirLight.Specular = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f); m_DirLight.Direction = XMFLOAT3(0.57735f, -0.57735f, 0.57735f); //Point light--position is changed every frame to animate in UpdateScene function. m_PointLight.Ambient = XMFLOAT4(0.3f, 0.3f, 0.3f, 1.0f); m_PointLight.Diffuse = XMFLOAT4(0.7f, 0.7f, 0.7f, 1.0f); m_PointLight.Specular = XMFLOAT4(0.7f, 0.7f, 0.7f, 1.0f); m_PointLight.Att = XMFLOAT3(0.0f, 0.1f, 0.0f); m_PointLight.Range = 25.0f; //Spot light--position and direction changed every frame to animate in UpdateScene function. m_SpotLight.Ambient = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f); m_SpotLight.Diffuse = XMFLOAT4(1.0f, 1.0f, 0.0f, 1.0f); m_SpotLight.Specular = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); m_SpotLight.Att = XMFLOAT3(1.0f, 0.0f, 0.0f); m_SpotLight.Spot = 96.0f; m_SpotLight.Range = 10000.0f; m_LandMat.Ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f); m_LandMat.Diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); m_LandMat.Specular = XMFLOAT4(0.2f, 0.2f, 0.2f, 16.0f); m_WavesMat.Ambient = XMFLOAT4(0.5f, 0.5f, 0.5f, 1.0f); m_WavesMat.Diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f); m_WavesMat.Specular = XMFLOAT4(0.8f, 0.8f, 0.8f, 32.0f); }
void TextureWave::BuildGeometries() { GeometryGenerator::MeshData meshData; GeometryGenerator generator; generator.CreateGrid(160.0f, 160.0f, 50, 50, meshData); m_wave.Init(160, 160, 1.0f, 0.03f, 5.0f, 0.3f); m_landIndexCount = static_cast<UINT>(meshData.Indices.size()); std::vector<D3DHelper::CustomVertexWithTexture> tempVerties(meshData.Vertices.size()); UINT vertexCount = static_cast<UINT>(meshData.Vertices.size()); for (UINT i = 0; i < vertexCount; ++i) { XMFLOAT3 pos = meshData.Vertices[i].Position; pos.y = GetHillHeight(pos.x, pos.z); tempVerties[i].Position = pos; tempVerties[i].Normal = GetHillNormal(pos.x, pos.z);; tempVerties[i].TexCoord = meshData.Vertices[i].TexC; } D3D11_BUFFER_DESC vbd; vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = static_cast<UINT>(sizeof(D3DHelper::CustomVertexWithTexture) * tempVerties.size()); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA vinitData; vinitData.pSysMem = &tempVerties[0]; auto hr = m_d3dDevice->CreateBuffer(&vbd, &vinitData, &m_landVB); D3DHelper::ThrowIfFailed(hr); D3D11_BUFFER_DESC ibd; ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * m_landIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; D3D11_SUBRESOURCE_DATA iinitData; iinitData.pSysMem = &meshData.Indices[0]; hr = m_d3dDevice->CreateBuffer(&ibd, &iinitData, &m_landIB); D3DHelper::ThrowIfFailed(hr); meshData.Clear(); // *** start create wave m_waveIndexCount = m_wave.IndexCount(); vbd.Usage = D3D11_USAGE_DYNAMIC; vbd.ByteWidth = static_cast<UINT>(sizeof(D3DHelper::CustomVertexWithTexture) * m_wave.VertexCount()); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; vbd.MiscFlags = 0; hr = m_d3dDevice->CreateBuffer(&vbd, nullptr, &m_waveVB); D3DHelper::ThrowIfFailed(hr); std::vector<UINT> indices(3 * m_wave.TriangleCount()); // 3 indices per face UINT m = m_wave.RowCount(); UINT n = m_wave.ColumnCount(); int k = 0; for (UINT i = 0; i < m - 1; ++i) { for (DWORD j = 0; j < n - 1; ++j) { indices[k] = i*n + j; indices[k + 1] = i*n + j + 1; indices[k + 2] = (i + 1)*n + j; indices[k + 3] = (i + 1)*n + j; indices[k + 4] = i*n + j + 1; indices[k + 5] = (i + 1)*n + j + 1; k += 6; // next quad } } ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * m_waveIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; iinitData; iinitData.pSysMem = &indices[0]; hr = m_d3dDevice->CreateBuffer(&ibd, &iinitData, &m_waveIB); D3DHelper::ThrowIfFailed(hr); // *** end of create wave meshData.Clear(); generator.CreateBox(4, 4, 4, meshData); tempVerties.clear(); tempVerties.resize(meshData.Vertices.size()); vertexCount = static_cast<UINT>(meshData.Vertices.size()); for (UINT i = 0; i < vertexCount; ++i) { tempVerties[i].Position = meshData.Vertices[i].Position; tempVerties[i].Normal = meshData.Vertices[i].Normal; tempVerties[i].TexCoord = meshData.Vertices[i].TexC; } vbd.Usage = D3D11_USAGE_IMMUTABLE; vbd.ByteWidth = static_cast<UINT>(sizeof(D3DHelper::CustomVertexWithTexture) * tempVerties.size()); vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; vbd.CPUAccessFlags = 0; vbd.MiscFlags = 0; vinitData.pSysMem = &tempVerties[0]; hr = m_d3dDevice->CreateBuffer(&vbd, &vinitData, &m_boxVB); D3DHelper::ThrowIfFailed(hr); m_boxIndexCount = static_cast<UINT>(meshData.Indices.size()); ibd.Usage = D3D11_USAGE_IMMUTABLE; ibd.ByteWidth = sizeof(UINT) * m_boxIndexCount; ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; ibd.CPUAccessFlags = 0; ibd.MiscFlags = 0; iinitData.pSysMem = &meshData.Indices[0]; hr = m_d3dDevice->CreateBuffer(&ibd, &iinitData, &m_boxIB); D3DHelper::ThrowIfFailed(hr); }