void CSimpleSceneObject::Load(CRenderPass * RenderPass) { if (! IndexBuffer || ! VertexBuffers.size() || ! Shader) { return; } SharedPointer<Graphics::IPipelineState> PipelineState; if (! TryMapAccess(PipelineStates, RenderPass, PipelineState)) { PipelineStates[RenderPass] = PipelineState = RenderPass->GetGraphicsContext()->CreatePipelineState(); } PipelineState->SetIndexBuffer(IndexBuffer); for (uint i = 0; i < VertexBuffers.size(); ++ i) { PipelineState->SetVertexBuffer(i, VertexBuffers[i]); } Material.LoadTextures(); PipelineState->SetShader(Shader); std::for_each(Textures.begin(), Textures.end(), [this, PipelineState](pair<string, SharedPointer<Graphics::ITexture>> const & Iterator) { PipelineState->SetTexture(Iterator.first, Iterator.second); }); std::for_each(Uniforms.begin(), Uniforms.end(), [this, PipelineState](pair<string, SharedPointer<Graphics::IUniform>> const & Iterator) { PipelineState->SetUniform(Iterator.first, Iterator.second); }); Material.LoadTextures(); PipelineState->OfferUniform("uMaterial.AmbientColor", Material.Ambient); PipelineState->OfferUniform("uMaterial.DiffuseColor", Material.Diffuse); PipelineState->OfferUniform("uMaterial.SpecularColor", Material.Specular); PipelineState->OfferUniform("uMaterial.Shininess", Material.Shininess); if (Material.DiffuseTexture) { PipelineState->OfferTexture("uMaterial.DiffuseTexture", Material.DiffuseTexture); } for (auto Pair : DrawFeatures) { PipelineState->SetFeatureEnabled(Pair.first, Pair.second); } PipelineState->SetPolygonOffsetAmount(PolygonOffsetAmount); PipelineState->SetBlendMode(BlendMode); PipelineState->SetPrimitiveType(PrimitiveType); RenderPass->PreparePipelineStateForRendering(PipelineState, this); Loaded[RenderPass] = true; }
void CRenderPass::PreparePipelineStateForRendering(SharedPointer<Graphics::IPipelineState> PipelineState, ISceneObject * SceneObject) { if (! PipelineState) { return; } set<string> const UnboundUniforms = PipelineState->GetUnboundUniforms(); std::for_each(UnboundUniforms.begin(), UnboundUniforms.end(), [&](string const & Name) { int Index = -1; string LHS, Remaining; if (Name == "uModelMatrix") { PipelineState->SetUniform(Name, uModelMatrix); } else if (Name == "uNormalMatrix") { PipelineState->SetUniform(Name, uNormalMatrix); } else if (Name == "uViewMatrix") { PipelineState->SetUniform(Name, uViewMatrix); } else if (Name == "uProjectionMatrix") { PipelineState->SetUniform(Name, uProjectionMatrix); } else if (Name == "uCameraMatrix") { PipelineState->SetUniform(Name, uCameraMatrix); } else if (Name == "uInvCameraMatrix") { PipelineState->SetUniform(Name, uInvCameraMatrix); } else if (Name == "uCameraPosition") { PipelineState->SetUniform(Name, uCameraPosition); } else if (IsUniformNameArrayElement(Name, Index, LHS, Remaining)) { if (Remaining.size() && Remaining[0] == '.') { auto const it = Lights.find(LHS); if (it != Lights.end()) { if (Index < it->second.size()) { ILight * const Light = it->second[Index]; PipelineState->SetUniform(Name, Light->GetAttributeByName(Remaining.substr(1))); } else { PipelineState->IgnoreUniform(Name); } } } } else { for (auto const & it : Lights) { string const CountName = it.first + "Count"; if (Name == CountName) { PipelineState->SetUniform(Name, SharedFromNew(new Graphics::CUniformValue<int>((int) it.second.size()))); } } for (auto const & it : Uniforms) { if (Name == it.first) { PipelineState->SetUniform(Name, it.second); } } for (auto const & it : Textures) { if (Name == it.first) { PipelineState->SetTexture(Name, it.second); } } } }); PipelineState->Load(); }