Toast Engine
Loading...
Searching...
No Matches
toast::ProceduralVoxel Class Reference

#include <procedural_voxel.hpp>

Inheritance diagram for toast::ProceduralVoxel:
Collaboration diagram for toast::ProceduralVoxel:

Classes

struct  PieceLayout
struct  Composed
struct  ComposeInput
struct  ComposeOutput

Public Member Functions

auto layout () const noexcept -> const std::vector< PieceLayout > &
void rebuild ()
void bakeVoxel ()
void sendLayout ()
auto getPieceAt (glm::vec3 pos) -> Box< Node >
auto getPieceCount () const noexcept -> int
auto pickPiece (glm::vec3 origin, glm::vec3 direction) -> VoxelPiece *
auto pieceAt (glm::ivec3 voxel) -> VoxelPiece *
void keepGrids (bool keep) noexcept
auto composePieces (std::span< VoxelPiece *const > only) -> std::optional< Composed >
Public Member Functions inherited from toast::VoxelNode
 VoxelNode ()=default
 VoxelNode (assets::Handle< assets::VoxelModel > model)
auto getModel () const -> const assets::Handle< assets::VoxelModel > &
auto getModel () -> assets::Handle< assets::VoxelModel > &
void setModel (assets::Handle< assets::VoxelModel > model)
auto getPalette () const -> const assets::Handle< assets::VoxelPalette > &
void setPalette (assets::Handle< assets::VoxelPalette > palette)
auto paletteUid () const -> uint64_t
auto resolvedModel () const -> const assets::VoxelModel *
auto resolvedPalette () -> const voxel::Palette *
auto resolvedMaterialLibrary () -> const voxel::MaterialLibrary *
auto getVoxel (glm::vec3 pos) -> int
auto getSize () -> glm::vec3
auto getBounds () -> std::vector< glm::vec3 >
auto getVoxelCount () -> int
auto worldToVoxel (glm::vec3 pos) -> glm::vec3
auto voxelToWorld (glm::vec3 pos) -> glm::vec3
void setVoxel (glm::vec3 pos, int id)
void removeVoxel (glm::vec3 pos)
void fillBox (glm::vec3 min, glm::vec3 max, int id, voxel::WriteMode mode=voxel::WriteMode::replace, int match_id=0)
void fillSphere (glm::vec3 center, float radius, int id, voxel::WriteMode mode=voxel::WriteMode::replace, int match_id=0)
void fillCylinder (glm::vec3 a, glm::vec3 b, float radius, int id, voxel::WriteMode mode=voxel::WriteMode::replace, int match_id=0)
void fillLine (glm::vec3 a, glm::vec3 b, float radius, int id, voxel::WriteMode mode=voxel::WriteMode::replace, int match_id=0)
void carveBox (glm::vec3 min, glm::vec3 max)
void carveSphere (glm::vec3 center, float radius)
void setLayers (int included_layers, int excluded_layers)
void includeLayer (int layer, bool value=true)
void excludeLayer (int layer, bool value=true)
void carveCylinder (glm::vec3 a, glm::vec3 b, float radius)
void carveLine (glm::vec3 a, glm::vec3 b, float radius)
void paintBox (glm::vec3 min, glm::vec3 max, int id)
void paintSphere (glm::vec3 center, float radius, int id)
void replaceId (int from, int to)
void slice (glm::vec3 point, glm::vec3 normal, int side)
void extrudeFace (glm::vec3 pos, glm::vec3 normal, int distance)
void stamp (const assets::Handle< assets::VoxelModel > &asset, glm::vec3 pos, glm::quat rotation=glm::quat(1.0f, 0.0f, 0.0f, 0.0f), voxel::WriteMode mode=voxel::WriteMode::replace, int match_id=0)
auto copy (glm::vec3 min, glm::vec3 max) -> int
void paste (int region, glm::vec3 pos, voxel::WriteMode mode=voxel::WriteMode::replace, int match_id=0)
void clearRegions ()
void sleep ()
void wake ()
void editVoxel ()
auto volume () -> voxel::Volume *
auto revision () const noexcept -> uint32_t
auto voxelOrigin () const noexcept -> glm::ivec3
auto volumeLocalTransform () const -> glm::mat4
auto localBoundingSphere () const -> glm::vec4
auto latticePlacement () const -> std::optional< voxel::LatticePlacement >
auto renderOnly () const noexcept -> bool
Public Member Functions inherited from toast::Node3D
auto raycast (glm::vec3 dir, glm::vec3 offset=glm::vec3(0.0f), float max_distance=-1.0f, bool ignore_self=true, const std::vector< int > &layers=std::vector< int > {}) const -> std::optional< physics::RayHit >
 The nearest thing a ray from this node hits.
auto raymulticast (glm::vec3 dir, glm::vec3 offset=glm::vec3(0.0f), float max_distance=-1.0f, int max_hits=-1, bool ignore_self=true, const std::vector< int > &layers=std::vector< int > {}) const -> std::vector< physics::RayHit >
 Up to max_hits things collisions.
auto linecast (glm::vec3 from, glm::vec3 to, int max_hits=-1, bool ignore_self=true, const std::vector< int > &layers=std::vector< int > {}) const -> std::vector< physics::RayHit >
 Everything on the line between two points, nearest to from first.
void lookAt (glm::vec3 target, glm::vec3 up={0.0f, 0.0f, 1.0f})
 Orients the node so its forward axis points at a world-space target.
void lookAtZ (glm::vec3 target)
 lookAt() constrained to the XY plane; the node faces the target with no roll
auto up () const -> glm::vec3
auto forward () const -> glm::vec3
void syncTransform () const
void syncWorldTransform () const
void refreshTransformParent ()
auto getTransform () const noexcept -> const glm::mat4 &
auto getWorldTransform () const noexcept -> const glm::mat4 &
Public Member Functions inherited from toast::Node
auto uid () const noexcept -> const UID &
 Stable unique identifier, assigned at construction or deserialization. Never changes.
auto rid () const noexcept -> std::uintptr_t
 Runtime identifier for this node, guaranteed to be unique but changes every time.
auto name () const noexcept -> std::string_view
 Display name. Siblings may share one - this is not an identifier.
void name (std::string_view name) noexcept
 Sets the display name.
auto enabled () const noexcept -> bool
 Whether this node is currently active.
auto participatesIn (NodeOwnerParticipation use) const noexcept -> bool
auto owner () const noexcept -> INodeOwner *
 The World or Workspace this node belongs to.
void enabled (bool value) noexcept
 Sets the local enabled flag and propagates the change to all children.
auto box () const noexcept -> Box< Node >
 Returns an owning handle to this node.
auto info () const -> const NodeInfo *
 Reflection metadata registered by the code generator.
auto sourcePrefab () const noexcept -> const assets::Handle< assets::Prefab > &
 The prefab this node was instantiated from.
auto isInstanceRoot () const noexcept -> bool
 Whether this node is the root of a prefab instance.
auto root () const noexcept -> Box< Node >
 The topmost ancestor that is not the world root.
auto state () const noexcept -> NodeState
auto type () const noexcept -> NodeType
auto listener () noexcept -> event::Listener &
 The event Listener owned by this node. Lazy-allocated, freed only with the node.
auto parent () noexcept -> Box< Node >
 The immediate parent of this node.
auto children () const noexcept -> const std::vector< Box< Node > > &
 The ordered list of direct children.
auto childrenSnapshot () const -> std::vector< Box< Node > >
auto create (std::string_view type="toast::Node") noexcept -> Box< Node >
 Creates a new child node of the given type and attaches it to this node.
auto spawn (UID uid) noexcept -> Box< Node >
 Asynchronously instantiates a prefab as a child of this node.
auto spawn (std::string_view uri) noexcept -> Box< Node >
 Asynchronously instantiates a prefab as a child of this node.
auto find (std::string_view query) -> Box< Node >
 Depth-first search for a single descendant.
auto find (const UID &uid) -> Box< Node >
 Looks up a node by UID within this node's local root.
auto search (std::string_view query) -> std::vector< Box< Node > >
 Depth-first search for all matching descendants.
auto childrenOfType (const NodeInfo *type) const -> std::vector< Box< Node > >
auto searchType (const NodeInfo *type) const -> std::vector< Box< Node > >
void addDependsOn (Node &other)
void removeDependsOn (Node &other)
void interactsWith (Node &other)
 Declares that the scripts of this node and of other call each other.
auto scriptRuntime () noexcept -> scripting::ScriptRuntime *
auto hasTickFunction (TickFunctionList mask) const noexcept -> bool
auto scriptVm (TickFunctionList func) const noexcept -> std::optional< size_t >
 The interpreter this node runs Lua on while it executes func, empty when it runs none.
auto scriptVmAny () const noexcept -> std::optional< size_t >
 The interpreter the scripts of this node live on whatever phase they define.
auto hasCallable (std::string_view name) const noexcept -> bool
void reloadScripts () noexcept
 Rebuilds the script runtime after a script asset changed (hot reload or attach).
auto scripts () const noexcept -> const std::vector< assets::Handle< assets::Script > > &
void setScripts (std::vector< assets::Handle< assets::Script > > scripts) noexcept
void addScript (const assets::Handle< assets::Script > &script) noexcept
template<typename R = void, typename... Args>
auto call (std::string_view name, Args &&... args) -> R
 Invokes all C++ reflected implementations of name (base→derived) and all same-named Lua functions across every attached script, forwarding args.
template<typename T>
auto get (std::string_view name) const -> T
 Reads a named value: reflected C++ field first, then the first matching Lua instance variable.
template<typename T>
void set (std::string_view name, const T &value)
 Writes a named value: reflected C++ field if present and every Lua instance variable of that name that already exists.
auto isRecursivePrefab () const noexcept -> bool

Protected Member Functions

void buildShape () override
auto shapeKey () -> uint64_t override
auto buildsAsync () -> bool override
void tickAsyncBuild () override
void drawDebug () override
void end ()
void destroy ()
Protected Member Functions inherited from toast::VoxelNode
void requestRebuild () noexcept
void finishShape ()
void init ()
void begin ()
void end ()
void destroy ()
void onEnable ()
void onDisable ()
void editorTick ()
void earlyTick ()
void postPhysics ()
void onReflectedFieldChanged (std::string_view field_name) override
void onScriptsReloaded () override
void updateInspectorMessages () override
void onEditorTransformChanged () override
void refreshVolume ()
void releaseVolume ()
void retireVolume ()
void recordDamage (uint32_t count, glm::vec3 index_sum)
auto ensureContains (const voxel::EditBounds &bounds) -> voxel::Volume *
auto replaceVolume (const voxel::EditBounds &bounds) -> voxel::Volume *
template<typename Kernel>
void edit (const voxel::EditBounds &local_bounds, bool grows, std::string_view operation, Kernel &&kernel)
void commitEdit (const voxel::EditResult &result, std::string_view operation)
auto toIndex (glm::ivec3 local) const noexcept -> glm::ivec3
auto toIndex (glm::vec3 local) const noexcept -> glm::vec3
auto toIndex (const voxel::EditBounds &local) const noexcept -> voxel::EditBounds
auto physicsBound () const noexcept -> bool
void assignBody (physics::BodyID body) noexcept
void assignShape (physics::ShapeID shape) noexcept
auto bodyID () const noexcept -> physics::BodyID
auto shapeID () const noexcept -> physics::ShapeID
void handleContactBegin (const physics::BroadPhasePair &pair)
void handleContactEnd (const physics::BroadPhasePair &pair)
void applyPhysicsTransform (const glm::vec3 &position, const glm::quat &rotation)
void publishPhysicsState (bool is_awake, const glm::vec3 &current_linear_velocity, const glm::vec3 &current_angular_velocity)
Protected Member Functions inherited from toast::Node3D
void init ()
 X axis.
Protected Member Functions inherited from toast::Node
virtual void onScriptsReloading ()
virtual auto luaAffinity () const noexcept -> std::optional< size_t >
virtual void onScriptVarChanged (std::string_view path)
void addInspectorMessage (const NodeMessage &message)
void removeInspectorMessage (const NodeMessage &message)

Additional Inherited Members

Public Attributes inherited from toast::VoxelNode
signals::Signal rebuilt_shape
 Sent after a rebuild once editShape is done.
signals::Signal< int, glm::vec3 > damaged
 Sent when hits remove voxels with how many and where in the world.
signals::Signal< int > broke_apart
 Sent when a piece breaks off with how many voxels it took.
signals::Signal emptied
 Sent when the last voxel is gone.
signals::Signal< toast::Box< toast::Node > > contact_begin
 Sent when it starts touching another body.
signals::Signal< toast::Box< toast::Node > > contact_end
 Sent when it stops touching another body.
signals::Signal went_to_sleep
 Sent when the body falls asleep.
signals::Signal woke_up
 Sent when the body wakes up.
Public Attributes inherited from toast::Node3D
glm::vec3 position = glm::vec3(0.0f)
glm::quat rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f)
glm::vec3 scale = glm::vec3(1.0f)
glm::vec3 world_position = glm::vec3(0.0f)
glm::quat world_rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f)
glm::vec3 world_scale = glm::vec3(1.0f)
Public Attributes inherited from toast::Node
signals::Signal< Box< Node > > on_enable
signals::Signal< Box< Node > > on_disable
signals::Signal< Box< Node > > on_begin
signals::Signal< Box< Node > > on_end
Static Public Attributes inherited from toast::Node3D
static const glm::vec3 world_up = {0.0f, 0.0f, 1.0f}
static const glm::vec3 world_forward = {0.0f, 1.0f, 0.0f}
 Z axis.
static const glm::vec3 world_right = {1.0f, 0.0f, 0.0f}
 Y axis.
Protected Attributes inherited from toast::VoxelNode
assets::Handle< assets::VoxelModel > m_model
assets::Handle< assets::VoxelPalette > m_palette
SimulationType simulation_type = SimulationType::dynamic
float mass = 0.0f
bool render_only = false
 Read when the game starts.
uint32_t included = 1
uint32_t excluded = 0
bool allow_sleep = true
bool awake = true
float gravity_scale = 1.0f
bool auto_mass_center = true
glm::vec3 center_of_mass = {}
glm::vec3 inertia = {}
float linear_damping = 0.0f
float angular_damping = 0.0f
float drag_scale = 1.0f
glm::vec3 linear_velocity = {}
glm::vec3 angular_velocity = {}
glm::vec3 constant_force = {}
glm::vec3 constant_torque = {}
bool lock_pos_x = false
bool lock_pos_y = false
bool lock_pos_z = false
bool lock_rot_x = false
bool lock_rot_y = false
bool lock_rot_z = false
bool show_aabb = false
glm::vec4 aabb_color = glm::vec4(1.0f, 0.75f, 0.15f, 0.6f)
bool aabb_fill = false
std::unique_ptr< voxel::Volume > m_volume
std::vector< std::unique_ptr< voxel::Volume > > m_retired_volumes
glm::ivec3 m_voxel_origin {0}
uint32_t m_revision = 0
const assets::VoxelModel * m_instanced_from = nullptr
assets::Handle< assets::VoxelPalette > m_model_palette
std::vector< std::optional< voxel::Region > > m_regions
bool m_volume_stale = false
bool m_rebuild_requested = false
bool m_edit_shape_pending = false
bool m_split_pending = false
bool m_building_shape = false
PendingEvents m_pending_events
physics::BodyID m_body
physics::ShapeID m_shape
std::vector< ActiveContact > m_active_contacts
bool m_registration_requested = false
bool m_registered_proxy = false
bool m_debug_visible = false
uint64_t m_shape_key = 0
uint64_t m_reported_wrong_model = 0
uint64_t m_reported_wrong_palette = 0
Protected Attributes inherited from toast::Node
INodeOwner * m_owner = nullptr

Detailed Description

A voxel shape built from its FillVolume, CarveVolume, PaintVolume, VoxelMesh and VoxelGroup children It still renders, collides and breaks like any VoxelNode

Member Function Documentation

◆ bakeVoxel()

void toast::ProceduralVoxel::bakeVoxel ( )
inline

Bakes the whole shape to a .tvox and replaces this node with a VoxelNode

◆ buildsAsync()

auto toast::ProceduralVoxel::buildsAsync ( ) -> bool
overrideprotectedvirtual

True when the subclass builds its shape on other threads and applies it itself

Note
Then the editor tick hands over to tickAsyncBuild and a rebuild only asks for one

Reimplemented from toast::VoxelNode.

Here is the caller graph for this function:

◆ buildShape()

void toast::ProceduralVoxel::buildShape ( )
overrideprotectedvirtual

Runs right before editShape on every rebuild, subclasses build their shape here

Reimplemented from toast::VoxelNode.

◆ composePieces()

auto toast::ProceduralVoxel::composePieces ( std::span< VoxelPiece *const > only) -> std::optional< Composed >
nodiscard

Builds only these pieces, in shape order, into a fresh volume

Note
Collapse bakes it into a model, the shape itself is untouched

◆ drawDebug()

void toast::ProceduralVoxel::drawDebug ( )
overrideprotectedvirtual

Piece outlines and the Split and Slice preview for the VoxelEditor

Reimplemented from toast::VoxelNode.

◆ getPieceAt()

auto toast::ProceduralVoxel::getPieceAt ( glm::vec3 pos) -> Box< Node >
nodiscard

The piece whose colour shows at a voxel of the shape

Returns
nothing when no piece draws there
Note
In game the pieces redraw their grid the first time this reads them

◆ getPieceCount()

auto toast::ProceduralVoxel::getPieceCount ( ) const -> int
inlinenodiscardnoexcept
Returns
how many pieces the last rebuild used

◆ keepGrids()

void toast::ProceduralVoxel::keepGrids ( bool keep)
inlinenoexcept

Keeps the piece grids after a build even in game

Note
Off by default since in game the shape is built once and destruction owns it after that

◆ layout()

auto toast::ProceduralVoxel::layout ( ) const -> const std::vector< PieceLayout > &
inlinenodiscardnoexcept

Every piece the last rebuild used in order

Here is the caller graph for this function:

◆ pickPiece()

auto toast::ProceduralVoxel::pickPiece ( glm::vec3 origin,
glm::vec3 direction ) -> VoxelPiece *
nodiscard

The piece a ray in shape voxels clicks on

Returns
null when it hits nothing

◆ pieceAt()

auto toast::ProceduralVoxel::pieceAt ( glm::ivec3 voxel) -> VoxelPiece *
nodiscard

The piece that draws the voxel at shape voxel, null when none does

Here is the caller graph for this function:

◆ rebuild()

void toast::ProceduralVoxel::rebuild ( )

Rebuilds the shape from its pieces now

◆ sendLayout()

void toast::ProceduralVoxel::sendLayout ( )

Tells the VoxelEditor where every piece is, it is also sent after every editor rebuild

◆ shapeKey()

auto toast::ProceduralVoxel::shapeKey ( ) -> uint64_t
overrideprotectedvirtual

A hash of everything the shape is built from besides the model

Reimplemented from toast::VoxelNode.

◆ tickAsyncBuild()

void toast::ProceduralVoxel::tickAsyncBuild ( )
overrideprotectedvirtual

Reimplemented from toast::VoxelNode.


The documentation for this class was generated from the following files:
  • engine/src/toast/voxel/nodes/procedural_voxel.hpp
  • engine/src/toast/voxel/nodes/procedural_voxel.cpp