void Terrain::Draw(ID3D11DeviceContext* dc, const Camera& cam, DirectionalLight lights[3]) { dc->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_4_CONTROL_POINT_PATCHLIST); dc->IASetInputLayout(InputLayouts::Terrain); UINT stride = sizeof(Vertex::Terrain); UINT offset = 0; dc->IASetVertexBuffers(0, 1, &mQuadPatchVB, &stride, &offset); dc->IASetIndexBuffer(mQuadPatchIB, DXGI_FORMAT_R16_UINT, 0); XMMATRIX viewProj = cam.ViewProj(); XMMATRIX world = XMLoadFloat4x4(&mWorld); XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world); XMMATRIX worldViewProj = world*viewProj; XMMATRIX ShadowTransform = world * XMLoadFloat4x4(&d3d->m_ShadowTransform); XMFLOAT4 worldPlanes[6]; ExtractFrustumPlanes(worldPlanes, viewProj); // Set per frame constants. Effects::TerrainFX->SetViewProj(viewProj); Effects::TerrainFX->SetEyePosW(cam.GetPosition()); Effects::TerrainFX->SetDirLights(lights); Effects::TerrainFX->SetFogColor(Colors::Silver); Effects::TerrainFX->SetFogStart(15.0f); Effects::TerrainFX->SetFogRange(175.0f); Effects::TerrainFX->SetMinDist(20.0f); Effects::TerrainFX->SetMaxDist(400.0f); Effects::TerrainFX->SetMinTess(0.0f); Effects::TerrainFX->SetMaxTess(6.0f); Effects::TerrainFX->SetTexelCellSpaceU(1.0f / mInfo.HeightmapWidth); Effects::TerrainFX->SetTexelCellSpaceV(1.0f / mInfo.HeightmapHeight); Effects::TerrainFX->SetWorldCellSpace(mInfo.CellSpacing); Effects::TerrainFX->SetWorldFrustumPlanes(worldPlanes); Effects::TerrainFX->SetLayerMapArray(mLayerMapArraySRV); Effects::TerrainFX->SetBlendMap(mBlendMapSRV); Effects::TerrainFX->SetHeightMap(mHeightMapSRV); Effects::TerrainFX->SetShadowMap(d3d->GetShadowMap()); Effects::TerrainFX->SetShadowTransform(ShadowTransform); Effects::TerrainFX->SetMaterial(mMat); ID3DX11EffectTechnique* tech = Effects::TerrainFX->Light1Tech; D3DX11_TECHNIQUE_DESC techDesc; tech->GetDesc( &techDesc ); for(UINT i = 0; i < techDesc.Passes; ++i) { ID3DX11EffectPass* pass = tech->GetPassByIndex(i); pass->Apply(0, dc); dc->DrawIndexed(mNumPatchQuadFaces*4, 0, 0); } dc->HSSetShader(0, 0, 0); dc->DSSetShader(0, 0, 0); }
void CRender::ViewSetup3D( const CViewSetup *pView, Frustum frustumPlanes ) { VPROF("CRender::ViewSetup3D"); m_view = *pView; m_yFOV = CalcFov( m_view.fov, ( float )m_view.width, ( float )m_view.height ); if( g_nFrameBuffersToClear > 0 ) { SetViewport( m_view.x, m_view.y, m_view.width, m_view.height ); materialSystemInterface->ClearBuffers( true, m_view.clearDepth ); g_nFrameBuffersToClear--; } SetViewport( m_view.x, m_view.y + m_view.height * ( 1.0f - g_ViewportScale ), m_view.width * g_ViewportScale, m_view.height * g_ViewportScale ); if( m_view.clearColor || m_view.clearDepth ) { materialSystemInterface->ClearBuffers( m_view.clearColor, m_view.clearDepth ); } materialSystemInterface->DepthRange( 0, 1 ); // build the transformation matrix for the given view angles VectorCopy( m_view.origin, r_origin ); AngleVectors( m_view.angles, &vpn, &vright, &vup ); // vup = -vup; // Copy for VectorTransform VectorCopy( &vpn.x, asmvpn ); VectorCopy( &vright.x, asmvright ); VectorCopy( &vup.x, asmvup ); if ( pView->m_bOrtho ) { SetProjectionMatrixOrtho(pView->m_OrthoLeft, pView->m_OrthoTop, pView->m_OrthoRight, pView->m_OrthoBottom, pView->zNear, pView->zFar); } else { SetProjectionMatrix( m_view.fov, m_view.zNear, m_view.zFar, m_view.m_bForceAspectRatio1To1 ); } SetViewMatrix( m_view.origin, m_view.angles ); ExtractMatrices(); if ( pView->m_bOrtho ) { OrthoExtractFrustumPlanes( frustumPlanes ); } else { ExtractFrustumPlanes(frustumPlanes); } OcclusionSystem()->SetView( m_view.origin, m_view.fov, m_matrixView, m_matrixProjection, frustumPlanes[ FRUSTUM_NEARZ ] ); R_SceneBegin(); // debug, build leaf volume LeafVisBuild( Vector(r_origin) ); }