Skip to main content

RayTraceScene

Struct RayTraceScene 

Source
pub struct RayTraceScene { /* private fields */ }
Expand description

An owned ray-tracing scene with a precomputed bounding volume hierarchy and shadow data.

RayTraceScene bundles the occluder list, the flat BVH over their bounds, and the (center, radius) shadow bounding spheres consumed by soft_shadow_factor, computing both exactly once at construction. Tracing through RayTraceScene::trace and querying through RayTraceScene::closest_hit perform no heap allocation per ray or per bounce, making the scene the single canonical entry point for tracing many rays against a static scene.

Implementations§

Source§

impl RayTraceScene

Implements the GPU packing entry point for RayTraceScene.

Source

pub fn encode_gpu(&self) -> Result<Vec<f32>, String>

Packs the scene into the vec4 array both shader backends read.

The layout is frozen by the shader contract:

vec4[0]: node_count, primitive_count, primitive_offset, 0
vec4[1 + 3 * n]: node lower.xyz, start
vec4[2 + 3 * n]: node upper.xyz, count
vec4[3 + 3 * n]: node escape, 0, 0, 0
vec4[primitive_offset + 8 * p]: primitive records

Primitives are stored in indices order so a leaf’s start field reads directly into the packed primitive array while each record still carries the original primitive index the closest-hit tie breaker compares. The source occluder ordering is never altered.

An empty scene packs a two-slot header with node_count == 0, which both shaders detect and treat as “every ray misses”.

Non-finite geometry components, components whose magnitude exceeds the finite f32 range, and indices above 2^24 (the exact-integer limit of f32) are rejected rather than truncated, because a truncated node bound would round inward and lose real geometry.

§Returns
  • Result<Vec<f32>, String> - The packed vec4 array, or the reason the scene cannot be represented on a GPU.
Source§

impl RayTraceScene

Implements the constructor and zero-allocation tracing entry points for RayTraceScene.

Source

pub fn new(occluders: Vec<Occluder>) -> RayTraceScene

Creates a new scene taking ownership of occluders and precomputing both the bounding volume hierarchy and the (center, radius) shadow bounding spheres used by soft_shadow_factor.

The hierarchy is built once here; every later query reuses it, so the cost of the BVH never appears in a per-ray measurement. The public surface is unchanged from the pre-BVH constructor, which takes the occluder list by value.

§Arguments
  • Vec<Occluder> - All occluding surfaces in the scene.
§Returns
  • RayTraceScene - The new scene with precomputed shadow data.
Source

pub fn trace(&self, ray: Ray, lights: &LightingUniforms) -> Vector3D

Iteratively traces a ray through the scene and returns the final shaded color, using the [RAYTRACE_DEFAULT_MAX_BOUNCES] constant as the bounce limit.

Performs no heap allocation per ray or per bounce: the shadow bounding spheres precomputed at construction are reused, and no Material is cloned. Use RayTraceScene::trace_with_bounces to override the bounce limit.

§Arguments
  • Ray - The ray to trace.
  • &LightingUniforms - Lighting parameters used during shading.
§Returns
  • Vector3D - The final traced color.
Source

pub fn trace_with_bounces( &self, ray: Ray, lights: &LightingUniforms, max_bounces: u32, ) -> Vector3D

Iteratively traces a ray through the scene with an explicit bounce limit and returns the final shaded color.

On a miss the ambient color scaled by the accumulated specular throughput is added. On a hit the surface material is evaluated with LightingUniforms::shade and, when the hit material has a non-zero specular component, the trace continues with a reflected ray up to max_bounces times (incrementing the ray’s depth field per bounce).

§Arguments
  • Ray - The ray to trace.
  • &LightingUniforms - Lighting parameters used during shading.
  • u32 - The maximum number of bounces allowed for this ray.
§Returns
  • Vector3D - The final traced color.
Source

pub fn closest_hit(&self, ray: &Ray) -> Option<Hit>

Finds the closest intersection between a ray and the scene occluders.

The winning occluder’s Material is cloned exactly once, when the returned Hit is constructed; losing candidates are never cloned. Traversal itself resolves every candidate through the scene’s bounding volume hierarchy, so the cost scales with the parts of the hierarchy the ray actually crosses rather than with the occluder count.

§Arguments
  • &Ray - The ray to test.
§Returns
  • Option<Hit> - The closest hit, or None if the ray misses.
Source

pub fn occluded(&self, ray: &Ray) -> bool

Reports whether anything in the scene blocks the ray’s parameter range.

This is the any-hit counterpart to RayTraceScene::closest_hit, built for shadow segments: it stops at the first blocker instead of resolving the whole hierarchy, so a fully occluded light costs less than a fully visible one. An empty scene reports false, and a ray with an inverted or non-finite range reports false rather than inventing a hit.

§Arguments
  • &Ray - The ray to test.
§Returns
  • bool - true when at least one occluder intersects the range.

Trait Implementations§

Source§

impl Clone for RayTraceScene

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for RayTraceScene

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for RayTraceScene

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for RayTraceScene

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<S, T> Upcast<T> for S
where T: UpcastFrom<S> + ?Sized, S: ?Sized,

Source§

fn upcast(&self) -> &T
where Self: ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider ref type within the Wasm bindgen generics type system. Read more
Source§

fn upcast_into(self) -> T
where Self: Sized + ErasableGeneric, T: Sized + ErasableGeneric<Repr = Self::Repr>,

Perform a zero-cost type-safe upcast to a wider type within the Wasm bindgen generics type system. Read more