Files
2025-09-18 17:55:52 -04:00

70 lines
1.8 KiB
C++

#include "stdafx.h"
#include "CullableSceneNode.h"
#include "SceneManager.h"
#include "Util.h"
#include "SpatialHashedScene.h"
#include "VisualEngine.h"
#include "GfxBase/FrameRateManager.h"
namespace RBX
{
namespace Graphics
{
CullableSceneNode::CullableSceneNode(VisualEngine* visualEngine, CullMode cullMode, unsigned int flags)
: visualEngine(visualEngine)
, cullMode(cullMode)
, flags(flags)
, blockCount(1)
, sqDistanceToFocus(0)
{
}
CullableSceneNode::~CullableSceneNode()
{
visualEngine->getSceneManager()->getSpatialHashedScene()->internalRemoveChild(this);
}
bool CullableSceneNode::updateIsCulledByFRM()
{
if (worldBounds.isNull())
return true;
const Vector3& focusPosition = visualEngine->getSceneManager()->getPointOfInterest();
sqDistanceToFocus = G3D::ClosestSqDistanceToAABB(focusPosition, worldBounds.center(), worldBounds.size() * 0.5f);
// count blocks and update farplane regardless of cullability.
if (sqDistanceToFocus > 1e-3f)
visualEngine->getSceneManager()->processSqPartDistance(sqDistanceToFocus);
RBX::FrameRateManager* frm = visualEngine->getFrameRateManager();
frm->AddBlockQuota(blockCount, sqDistanceToFocus, IsInSpatialHash());
// We don't do distance-cull on huge objects
if (cullMode == CullMode_SpatialHash && !IsInSpatialHash())
return false;
else
return sqDistanceToFocus > frm->GetRenderCullSqDistance();
}
void CullableSceneNode::updateRenderQueue(RenderQueue& queue, const RenderCamera& camera, RenderQueue::Pass pass)
{
}
void CullableSceneNode::updateWorldBounds(const Extents& aabb)
{
worldBounds = aabb;
if (aabb.isNull())
visualEngine->getSceneManager()->getSpatialHashedScene()->internalRemoveChild(this);
else
visualEngine->getSceneManager()->getSpatialHashedScene()->internalUpdateChild(this);
}
}
}