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); }
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; }
/*! * \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); } }