Skip to content

Documentation / scene / Octree

Class: Octree

Defined in: libs/scene/src/scene/octree.ts:646

Spatial acceleration structure for scene graph nodes using an octree hierarchy.

Remarks

  • Organizes GraphNode instances into a multi-level grid of OctreeNodeChunks.
  • Supports dynamic resizing to accommodate large scenes while maintaining a minimum leaf size.
  • Placement is driven by world-space AABBs; nodes are mapped to an appropriate level by size.
  • Maintains a weak map from GraphNode to the current OctreeNode for efficient updates.

Performance:

  • Nodes and chunks are created lazily.
  • Resizing re-inserts existing nodes; use sparingly and prefer reasonable initial sizes.

Invariants:

  • rootSize and leafSize are powers of two; rootSize >= leafSize.
  • Level 0 chunk exists after initialization.

Constructors

Constructor

new Octree(scene, rootSize?, leafSize?, maxRootSize?): Octree

Defined in: libs/scene/src/scene/octree.ts:674

Create an octree.

Parameters

scene

Scene

Owning scene instance.

rootSize?

number = 8

Initial root world size (edge length), power of two. Defaults to 8.

leafSize?

number = 8

Minimum leaf cell size (edge length), power of two. Defaults to 8.

maxRootSize?

number = 65536

Hard cap for dynamic growth. Defaults to 65536.

Returns

Octree

Remarks

The octree is initialized on construction; use finalize() to clear all data.

Methods

initialize()

initialize(rootSize, leafSize): void

Defined in: libs/scene/src/scene/octree.ts:695

Initialize the octree with specified root and leaf sizes.

Parameters

rootSize

number

Root world size (edge length).

leafSize

number

Leaf cell size (edge length).

Returns

void

Remarks

  • Clears any existing data.
  • Builds chunk hierarchy from coarse to fine granularity.

finalize()

finalize(): void

Defined in: libs/scene/src/scene/octree.ts:721

Free all nodes and chunks owned by this octree.

Returns

void

Remarks

Resets sizes, root node, and placement maps.


getScene()

getScene(): Scene

Defined in: libs/scene/src/scene/octree.ts:734

Owning scene.

Returns

Scene

The Scene that owns this octree.


getRootSize()

getRootSize(): number

Defined in: libs/scene/src/scene/octree.ts:742

Root world size (edge length).

Returns

number

The current root world size.


getLeafSize()

getLeafSize(): number

Defined in: libs/scene/src/scene/octree.ts:750

Minimum leaf cell size (edge length).

Returns

number

The current leaf cell size.


locateNodeChain()

locateNodeChain(candidate, center, radius): OctreeNode

Defined in: libs/scene/src/scene/octree.ts:767

Locate the best-fit node chain for a sphere.

Parameters

candidate

OctreeNode

Optional current node containing the object (hint for reuse).

center

Vector3

Sphere center in world coordinates.

radius

number

Sphere radius in world units.

Returns

OctreeNode

The head OctreeNode of the located chain, or null if out of bounds.

Remarks

  • Chooses the finest level where node size is at least (4 \times) radius.
  • Returns null if the sphere lies outside the current octree bounds.
  • If candidate already matches, it is returned directly.

getRootNode()

getRootNode(): OctreeNode

Defined in: libs/scene/src/scene/octree.ts:794

Get the root node (level 0, index 0), creating it if necessary.

Returns

OctreeNode

The root OctreeNode.


getNumChunks()

getNumChunks(): number

Defined in: libs/scene/src/scene/octree.ts:805

Number of chunks (levels) in the octree hierarchy.

Returns

number

The total number of chunk levels.


getChunk()

getChunk(level): OctreeNodeChunk

Defined in: libs/scene/src/scene/octree.ts:815

Get a chunk by level index.

Parameters

level

number

Chunk level (0 is root).

Returns

OctreeNodeChunk

The OctreeNodeChunk at the given level.


placeNode()

placeNode(node): void

Defined in: libs/scene/src/scene/octree.ts:829

Place or update a scene node in the octree.

Parameters

node

GraphNode

Scene graph node to place.

Returns

void

Remarks

  • Uses the node's world-space AABB to determine size and best-fit level.
  • If the node does not fit within current bounds and growth is allowed, the octree resizes (up to maxRootSize) and reinserts nodes.
  • Nodes without valid bounds or with clip tests disabled fall back to the root.

removeNode()

removeNode(node): void

Defined in: libs/scene/src/scene/octree.ts:873

Remove a scene node from the octree.

Parameters

node

GraphNode

Scene graph node to remove.

Returns

void


prune()

prune(): void

Defined in: libs/scene/src/scene/octree.ts:889

Shrink the octree to the minimum size if the first finer level is empty.

Returns

void

Remarks

Useful after many removals; preserves leafSize.


resize()

resize(size): void

Defined in: libs/scene/src/scene/octree.ts:909

Resize the octree root size and rebuild chunks.

Parameters

size

number

New root world size (edge length). Rounded up to the next power of two and clamped to leafSize.

Returns

void

Remarks

  • Reinitializes chunks and reinserts previously placed nodes.
  • No-op if the size does not change.

Released under the MIT License.