예제 #1
0
	void GraphicsComponent::UpdateBoundingVolume() const
	{
		EnsureTransformMatrixUpdate();

		m_boundingVolume.MakeNull();
		for (const Renderable& r : m_renderables)
		{
			Nz::BoundingVolumef boundingVolume = r.renderable->GetBoundingVolume();

			// Adjust renderable bounding volume by local matrix
			if (boundingVolume.IsFinite())
			{
				Nz::Boxf localBox = boundingVolume.obb.localBox;
				Nz::Vector3f newPos = r.data.localMatrix * localBox.GetPosition();
				Nz::Vector3f newLengths = r.data.localMatrix * localBox.GetLengths();

				boundingVolume.Set(Nz::Boxf(newPos.x, newPos.y, newPos.z, newLengths.x, newLengths.y, newLengths.z));
			}

			m_boundingVolume.ExtendTo(r.renderable->GetBoundingVolume());
		}

		RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem<RenderSystem>();

		m_boundingVolume.Update(Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), m_transformMatrix));
		m_boundingVolumeUpdated = true;

		for (VolumeCullingEntry& entry : m_volumeCullingEntries)
			entry.listEntry.UpdateVolume(m_boundingVolume);
	}
예제 #2
0
	void GraphicsComponent::UpdateBoundingVolume() const
	{
		EnsureTransformMatrixUpdate();

		m_boundingVolume.MakeNull();
		for (const Renderable& r : m_renderables)
			m_boundingVolume.ExtendTo(r.renderable->GetBoundingVolume());

		m_boundingVolume.Update(m_transformMatrix);
		m_boundingVolumeUpdated = true;
	}
예제 #3
0
	/*!
	* \brief Adds the renderable elements to the render queue
	*
	* \param renderQueue Queue to be added
	*/
	void GraphicsComponent::AddToRenderQueue(Nz::AbstractRenderQueue* renderQueue) const
	{
		EnsureTransformMatrixUpdate();

		RenderSystem& renderSystem = m_entity->GetWorld()->GetSystem<RenderSystem>();

		for (const Renderable& object : m_renderables)
		{
			if (!object.dataUpdated)
			{
				object.data.transformMatrix = Nz::Matrix4f::ConcatenateAffine(renderSystem.GetCoordinateSystemMatrix(), Nz::Matrix4f::ConcatenateAffine(object.data.localMatrix, m_transformMatrix));
				object.renderable->UpdateData(&object.data);
				object.dataUpdated = true;
			}

			object.renderable->AddToRenderQueue(renderQueue, object.data);
		}
	}