示例#1
0
		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;
		}
示例#2
0
		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();
		}