//--------------------------------------------------------------------------- void ShadowMapGen::DrawRenderable(const RenderableNode& r) { if (!r.GetFlag( RenderableNode::kShadowCaster ) ) return; ID3D11DeviceContext* dc = m_rc->Context(); ConstantBufferShadowMapGenPerDraw constBuffer; Matrix::Transpose(r.WorldXform, constBuffer.world ); UpdateConstantBuffer(dc,m_pConstantBufferPerDraw,&constBuffer,sizeof(constBuffer)); uint32_t stride = r.mesh->vertexBuffer->GetStride(); uint32_t offset = 0; uint32_t startIndex = 0; uint32_t startVertex = 0; uint32_t indexCount = r.mesh->indexBuffer->GetCount(); ID3D11Buffer* d3dvb = r.mesh->vertexBuffer->GetBuffer(); ID3D11Buffer* d3dib = r.mesh->indexBuffer->GetBuffer(); dc->IASetPrimitiveTopology( (D3D11_PRIMITIVE_TOPOLOGY)r.mesh->primitiveType ); dc->IASetVertexBuffers( 0, 1, &d3dvb, &stride, &offset ); dc->IASetIndexBuffer(d3dib, DXGI_FORMAT_R32_UINT, 0); dc->DrawIndexed(indexCount, startIndex, startVertex); }
//--------------------------------------------------------------------------- void RenderableNodeSorter::Add(RenderableNode& r, RenderFlagsEnum rf, ShadersEnum shaderId) { assert(shaderId != Shaders::NONE); RenderContext* context = RenderContext::Inst(); bool selected = ( context->selection.find( r.objectId ) != context->selection.end() ); PrimitiveTypeEnum primtype = r.mesh->primitiveType; GlobalRenderFlagsEnum gflags = this->GetFlags(); bool triPrim = primtype == PrimitiveType::TriangleList || primtype == PrimitiveType::TriangleStrip; uint32_t mask =(uint32_t) ~(RenderFlags::Textured | RenderFlags::Lit); uint32_t flags = rf & (mask | gflags); flags |= (gflags & GlobalRenderFlags::RenderBackFace); bool wireflagset = (gflags & GlobalRenderFlags::WireFrame) != 0; if(triPrim) { if(gflags & GlobalRenderFlags::Solid) { Bucket& bucket = GetOrMakeBucket(flags, shaderId); bucket.renderables.push_back( r ); if(r.GetFlag(RenderableNode::kShadowCaster)) m_bounds.Extend(r.bounds); } if(selected || wireflagset) { RenderableNode node = r; node.diffuse = selected ? context->State()->GetSelectionColor() : context->State()->GetWireframeColor(); flags &= ~RenderFlags::AlphaBlend; Bucket& bucket = GetOrMakeBucket(flags, Shaders::WireFrameShader ); bucket.renderables.push_back( node ); } } else { flags &= ~RenderFlags::AlphaBlend; Bucket& bucket = GetOrMakeBucket(flags, shaderId); if(selected) { RenderableNode node = r; node.diffuse = context->State()->GetSelectionColor(); bucket.renderables.push_back( node); } else { bucket.renderables.push_back( r ); } } }
//--------------------------------------------------------------------------- void ShadowMapGen::DrawRenderable(const RenderableNode& r) { if (!r.GetFlag( RenderableNode::kShadowCaster ) ) return; ID3D11DeviceContext* dc = m_rc->Context(); Matrix::Transpose(r.WorldXform, m_cbPerDraw.Data); m_cbPerDraw.Update(dc); uint32_t stride = r.mesh->vertexBuffer->GetStride(); uint32_t offset = 0; uint32_t startIndex = 0; uint32_t startVertex = 0; uint32_t indexCount = r.mesh->indexBuffer->GetCount(); ID3D11Buffer* d3dvb = r.mesh->vertexBuffer->GetBuffer(); ID3D11Buffer* d3dib = r.mesh->indexBuffer->GetBuffer(); dc->IASetPrimitiveTopology( (D3D11_PRIMITIVE_TOPOLOGY)r.mesh->primitiveType ); dc->IASetVertexBuffers( 0, 1, &d3dvb, &stride, &offset ); dc->IASetIndexBuffer(d3dib, (DXGI_FORMAT) r.mesh->indexBuffer->GetFormat(), 0); dc->DrawIndexed(indexCount, startIndex, startVertex); }