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 LightingApp::UpdateScene(float dt) { float x = mRadius*sinf(mPhi)*cosf(mTheta); float z = mRadius*sinf(mPhi)*sinf(mTheta); float y = mRadius*cosf(mPhi); mEyePosW = XMFLOAT3(x, y, z); XMVECTOR pos = XMVectorSet(x, y, z, 1.0f); XMVECTOR target = XMVectorZero(); XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); XMMATRIX V = XMMatrixLookAtLH(pos, target, up); XMStoreFloat4x4(&mView, V); static float t_base = 0.0f; if ((mTimer.TotalTime() - t_base) >= 0.25f) { t_base += 0.25f; DWORD i = 5 + rand() % (mWaves.RowCount() - 10); DWORD j = 5 + rand() % (mWaves.ColumnCount() - 10); float r = MathHelper::RandF(1.0f, 2.0f); mWaves.Disturb(i, j, r); } mWaves.Update(dt); D3D11_MAPPED_SUBRESOURCE mappedData; HR(md3dImmediateContext->Map(mWavesVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData)); Vertex* v = reinterpret_cast<Vertex *>(mappedData.pData); for (UINT i = 0; i < mWaves.VertexCount(); ++i) { v[i].Pos = mWaves[i]; v[i].Normal = mWaves.Normal(i); } md3dImmediateContext->Unmap(mWavesVB, 0); mPointLight.Position.x = 70.0f*cosf(0.2f*mTimer.TotalTime()); mPointLight.Position.z = 70.0f*sinf(0.2f*mTimer.TotalTime()); mPointLight.Position.y = MathHelper::Max(GetHillHeight(mPointLight.Position.x, mPointLight.Position.z) , -3.0f) + 10.0f; mSpotLight.Position = mEyePosW; XMStoreFloat3(&mSpotLight.Direction, XMVector3Normalize(target - pos)); }
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); }
void D3DLightingBasic::UpdateScene(float dt) { float x = mRadius * sinf(mPhi) * cosf(mTheta); float z = mRadius * sinf(mPhi) * sinf(mTheta); float y = mRadius * cosf(mPhi); mEyePosW = XMFLOAT3(x, y, z); XMVECTOR pos = XMVectorSet(x, y, z, 1.0f); XMVECTOR target = XMVectorZero(); XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); XMMATRIX view = XMMatrixLookAtLH(pos, target, up); XMStoreFloat4x4(&mView, view); static float t_base = 0.0f; if ((m_Timer.TotalTime() - t_base) >= 0.25f) { t_base += 0.25f; DWORD i = 5 + rand() % (mWaves.RowCount() - 10); DWORD j = 5 + rand() % (mWaves.ColumnCount() - 10); float r = MathHelper::RandF(1.0f, 2.0f); mWaves.Disturb(i, j, r); } mWaves.Update(dt); D3D11_MAPPED_SUBRESOURCE mappedData; HR(m_d3dImmediateContext->Map( mWaveVB, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData), L"Context Map"); Vertex* v = reinterpret_cast<Vertex*>(mappedData.pData); for(UINT i = 0; i < mWaves.VertexCount(); ++i) { v[i].Pos = mWaves[i]; v[i].Normal = mWaves.Normal(i); } m_d3dImmediateContext->Unmap(mWaveVB, 0); // // Animate the lights. // // Circle light over the land surface. mPointLight.Position.x = 70.0f*cosf( 0.2f*m_Timer.TotalTime() ); mPointLight.Position.z = 70.0f*sinf( 0.2f*m_Timer.TotalTime() ); mPointLight.Position.y = MathHelper::Max( GetHillHeight(mPointLight.Position.x, mPointLight.Position.z), -3.0f) + 10.0f; // The spotlight takes on the camera position and is aimed in the // same direction the camera is looking. In this way, it looks // like we are holding a flashlight. mSpotLight.Position = mEyePosW; XMStoreFloat3(&mSpotLight.Direction, XMVector3Normalize(target - pos)); }