void RenderingContext::DrawInternal( const std::shared_ptr<IMesh>& mesh, PrimitiveType primitiveType /*= PrimitiveType::Triangles */ ) { Assert( m_inputAssembler ); Assert( m_vertexShader ); Assert( m_rasterizer ); Assert( m_pixelShader ); Assert( m_outputMerger ); // input assembler stage if ( IsFixedPipelineMode() ) { m_inputAssembler->BindFixedPipelineOutputStreamSource( m_vertexShader->OutputStreamSource() ); } std::shared_ptr<VertexShaderInputStream> vpInput = m_inputAssembler->Process( mesh ); //printf( "\nVertexShaderInputStream Size: %d\n", vpInput->Size() ); // vertex processor stage std::shared_ptr<RasterizerInputStream> raInput = m_vertexShader->Process( vpInput ); //printf( "RasterizerInputStream Size: %d\n", raInput->Size() ); // rasterizer stage raInput->SetPrimitiveType( primitiveType ); m_rasterizer->SetCullMode( GetCullMode() ); std::shared_ptr<PixelShaderInputStream> ppInput = m_rasterizer->Process( raInput ); //printf( "PixelShaderInputStream Size: %d\n", ppInput->Size() ); // pixel processor stage std::shared_ptr<OutputMergerInputStream> omInput = m_pixelShader->Process( ppInput ); //printf( "OutputMergerInputStream Size: %d\n", 0 ); // output merger stage m_outputMerger->Process( omInput ); // Note that the output stream of the output merger is meaningless // because the output merger directly write data on render targets and a depth-stencil buffer, or a unordered resource view. }
void MeshObject::Render() { traceIn(MeshObject::Render); LoadVertexBuffer(mesh->VertBuffer); LoadIndexBuffer(mesh->IdxBuffer); for(DWORD i=0;i<mesh->nSections;i++) { DrawSection §ion = mesh->SectionList[i]; Material *material = MaterialList[i]; if(!material) continue; if(material->GetEffect() == GetActiveEffect()) material->LoadParameters(); if(material->GetFlags() & MATERIAL_TWOSIDED) { GSCullMode cullMode; cullMode = GetCullMode(); SetCullMode(GS_NEITHER); GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); SetCullMode(cullMode); } else GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); } traceOut; }
void MeshEntity::QuickRender() { traceInFast(MeshEntity::QuickRender); if(!mesh) return; if(GetActiveEffect()) LoadEffectData(); else { MatrixPush(); MatrixMultiply(invTransform); if(bHasScale) MatrixScale(scale); } LoadVertexBuffer(VertBuffer); LoadIndexBuffer(mesh->IdxBuffer); for(DWORD i=0;i<mesh->nSections;i++) { DrawSection §ion = mesh->SectionList[i]; Material *material = MaterialList[i]; if(!material) continue; if(material->effect == GetActiveEffect()) material->LoadParameters(); if(material->flags & MATERIAL_TWOSIDED) { GSCullMode cullMode; cullMode = GetCullMode(); SetCullMode(GS_NEITHER); GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); SetCullMode(cullMode); } else GS->Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); } if(GetActiveEffect()) ResetEffectData(); else MatrixPop(); traceOutFast; }
void MeshEntity::RenderInitialPass() { traceInFast(MeshEntity::RenderInitialPass); profileSegment("MeshEntity::RenderInitialPass"); if(!mesh) return; LoadEffectData(); LoadVertexBuffer(VertBuffer); LoadIndexBuffer(mesh->IdxBuffer); for(DWORD i=0;i<mesh->nSections;i++) { DrawSection §ion = mesh->SectionList[i]; Material *material = MaterialList[i]; if(material && section.numFaces) { if(material->effect == GetActiveEffect()) { material->LoadParameters(); if(material->flags & MATERIAL_TWOSIDED) { GSCullMode cullMode; cullMode = GetCullMode(); SetCullMode(GS_NEITHER); Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); SetCullMode(cullMode); } else Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); } } } ResetEffectData(); traceOutFast; }
void MeshEntity::RenderLightmaps() { traceInFast(MeshEntity::RenderLightmaps); if(!mesh || !bLightmapped) return; LoadEffectData(); LoadVertexBuffer(VertBuffer); LoadIndexBuffer(mesh->IdxBuffer); HANDLE param[3]; param[0] = level->GetLightmapU();//GetActiveEffect()->GetParameterByName(TEXT("lightmapU")); param[1] = level->GetLightmapV();//GetActiveEffect()->GetParameterByName(TEXT("lightmapV")); param[2] = level->GetLightmapW();//GetActiveEffect()->GetParameterByName(TEXT("lightmapW")); if(lightmap.X) { GetActiveEffect()->SetTexture(param[0], lightmap.X); GetActiveEffect()->SetTexture(param[1], lightmap.Y); GetActiveEffect()->SetTexture(param[2], lightmap.Z); } else { //actually it should never get here Texture *black = GetTexture(TEXT("Base:Default/black.tga")); GetActiveEffect()->SetTexture(param[0], black); GetActiveEffect()->SetTexture(param[1], black); GetActiveEffect()->SetTexture(param[2], black); } for(DWORD i=0;i<mesh->nSections;i++) { DrawSection §ion = mesh->SectionList[i]; Material *material = MaterialList[i]; if(material && section.numFaces) { if(material->effect == GetActiveEffect()) { material->LoadParameters(); if(material->flags & MATERIAL_TWOSIDED) { GSCullMode cullMode; cullMode = GetCullMode(); SetCullMode(GS_NEITHER); Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); SetCullMode(cullMode); } else Draw(GS_TRIANGLES, 0, section.startFace*3, section.numFaces*3); } } } ResetEffectData(); traceOutFast; }