25 const auto& filter = context.config().debug.renderFilter;
26 return (filter.primitives ? 0u :
to_base(EntityFilter::PRIMITIVES)) |
27 (filter.meshes ? 0u :
to_base(EntityFilter::MESHES )) |
28 (filter.terrain ? 0u :
to_base(EntityFilter::TERRAIN )) |
29 (filter.vegetation ? 0u :
to_base(EntityFilter::VEGETATION )) |
30 (filter.water ? 0u :
to_base(EntityFilter::WATER )) |
31 (filter.sky ? 0u :
to_base(EntityFilter::SKY )) |
32 (filter.particles ? 0u :
to_base(EntityFilter::PARTICLES ));
42 for (
I32 i = nodeCount - 1; i >= 0; i-- )
57 for (
I32 i = nodeCount - 1; i >= 0; i-- )
89 const U32 iterCount = rootChildren.
_count.load();
91 if ( iterCount > g_nodesPerCullingPartition * 2 )
100 for ( U32 i = start; i < end; ++i )
102 FrustumCullNode( rootChildren._data[i], params, cullFlags, 0u, nodesOut );
108 for (
U32 i = 0u; i < iterCount; ++i )
110 FrustumCullNode( rootChildren._data[i], params, cullFlags, 0u, nodesOut );
115 PostCullNodes( params, cullFlags, FilterMask( context ), nodesOut );
138 F32 distanceSqToCamera = 0.0f;
139 const FrustumCollision collisionResult = Attorney::SceneGraphNodeRenderPassCuller::frustumCullNode( currentNode, params, cullFlags, distanceSqToCamera );
140 if ( collisionResult != FrustumCollision::FRUSTUM_OUT )
142 if ( !currentNode->
hasFlag( SceneGraphNode::Flags::IS_CONTAINER ) )
145 nodes.
append( { currentNode, distanceSqToCamera } );
149 if ( collisionResult == FrustumCollision::FRUSTUM_IN )
153 cullFlags &= ~to_base(CullOptions::CULL_AGAINST_FRUSTUM);
165 if ( descriptor.
_iterCount > g_nodesPerCullingPartition * 2 )
168 descriptor.
_priority = recursionLevel < 2 ? TaskPriority::DONT_CARE : TaskPriority::REALTIME;
172 for ( U32 i = start; i < end; ++i )
174 FrustumCullNode( children._data[i], params, cullFlags, recursionLevel + 1, nodes );
182 FrustumCullNode( children.
_data[i], params, cullFlags, recursionLevel + 1, nodes );
198 if ( Attorney::SceneGraphNodeRenderPassCuller::frustumCullNode( node, params, cullFlags, distanceSqToCamera ) != FrustumCollision::FRUSTUM_OUT )
200 nodesOut.
append( { node, distanceSqToCamera } );
204 PostCullNodes( params, cullFlags, FilterMask( context ), nodesOut );
218 nodesOut.
append( { node, distanceSqToCamera } );
#define PROFILE_SCOPE_AUTO(CATEGORY)
#define PROFILE_SCOPE(NAME, CATEGORY)
static FrustumCollision clippingCullNode(const SceneGraphNode *node, const NodeCullParams ¶ms)
static FrustumCollision stateCullNode(const SceneGraphNode *node, const NodeCullParams ¶ms, const U16 cullFlags, const U32 filterMask, F32 distanceToClosestPointSQ)
const vec3< F32 > & getCenter() const noexcept
const BoundingSphere & getBoundingSphere() const noexcept
const CameraSnapshot & snapshot() const noexcept
Returns the internal camera snapshot data (eye, orientation, etc)
FORCE_INLINE I64 getGUID() const noexcept
PlatformContext & context() noexcept
TaskPool & taskPool(const TaskPoolType type) noexcept
const SceneGraphNode * getRoot() const noexcept
bool hasFlag(const Flags flag) const noexcept
Returns true only if the current node has the specified flag. Does not check children!
ChildContainer & getChildren() noexcept
@ RENDER_WIREFRAME
Render wireframe for all scene geometry.
@ RENDER_GEOMETRY
Show/hide geometry.
bool isEnabledOption(RenderOptions option) const noexcept
SceneRenderState & renderState() noexcept
T distanceSquared(const vec3 &v) const noexcept
compute the vector's squared distance to another specified vector
constexpr Optick::Category::Type Scene
constexpr U32 g_nodesPerCullingPartition
Handle console commands that start with a forward slash.
@ CULL_AGAINST_CLIPPING_PLANES
eastl::vector< Type > vector
std::shared_lock< mutex > SharedLock
void Parallel_For(TaskPool &pool, const ParallelForDescriptor &descriptor, const DELEGATE< void, const Task *, U32, U32 > &cbk)
constexpr I32 to_I32(const T value)
constexpr auto to_base(const Type value) -> Type
const std::array< bool, N > & planeState() const noexcept
FrustumClipPlanes _clippingPlanes
U32 _partitionSize
How many elements should we process per async task.
bool _useCurrentThread
If true, we'll process a for partition on the calling thread.
TaskPriority _priority
Each async task will start with the same priority specified here.
U32 _iterCount
For loop iteration count.
static void FrustumCull(const NodeCullParams ¶ms, U16 cullFlags, const SceneGraph &sceneGraph, const SceneState &sceneState, PlatformContext &context, VisibleNodeList<> &nodesOut)
static void PostCullNodes(const NodeCullParams ¶ms, U16 cullFlags, U32 filterMask, VisibleNodeList<> &nodesInOut)
static U32 FilterMask(const PlatformContext &context) noexcept
static void FrustumCullNode(SceneGraphNode *currentNode, const NodeCullParams ¶ms, U16 cullFlags, U8 recursionLevel, VisibleNodeList<> &nodes)
This method performs the visibility check on the given node and all of its children and adds them to ...
eastl::fixed_vector< SceneGraphNode *, 32, true > _data
void remove(const size_t idx)
void append(const VisibleNodeList &other) noexcept
size_t size() const noexcept
const T & node(const size_t idx) const noexcept