|
Toast Engine
|
#include <voxel_node.hpp>


Classes | |
| struct | ActiveContact |
| struct | PendingEvents |
Public Member Functions | |
| 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 |
Public Attributes | |
| 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 |
Protected Member Functions | |
| virtual void | buildShape () |
| virtual auto | shapeKey () -> uint64_t |
| void | requestRebuild () noexcept |
| virtual auto | buildsAsync () -> bool |
| virtual void | tickAsyncBuild () |
| 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 |
| virtual void | drawDebug () |
| 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 ¤t_linear_velocity, const glm::vec3 ¤t_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) |
Protected Attributes | |
| 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 |
Friends | |
| class | physics::Simulator |
Additional Inherited Members | |
| 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. | |
A shape made of voxels that renders and collides
It can start from a voxel model or from nothing
editShape runs every time the shape is rebuilt and can change it however it wants so it is the perfect function for modifying or creating voxels from code
Positions are in voxels relative to the node and each voxel is 10 cm
Ids are palette colors with 0 meaning the voxel is empty
|
default |
Makes an empty shape
|
inline |
Makes a shape from a voxel model
|
inlinenodiscardprotectedvirtual |
True when the subclass builds its shape on other threads and applies it itself
Reimplemented in toast::ProceduralVoxel.

|
inlineprotectedvirtual |
Runs right before editShape on every rebuild, subclasses build their shape here
Reimplemented in toast::ProceduralVoxel.
| void toast::VoxelNode::carveBox | ( | glm::vec3 | min, |
| glm::vec3 | max ) |
Empties the box from min to max
| void toast::VoxelNode::carveCylinder | ( | glm::vec3 | a, |
| glm::vec3 | b, | ||
| float | radius ) |
Empties a flat ended cylinder from a to b
| void toast::VoxelNode::carveLine | ( | glm::vec3 | a, |
| glm::vec3 | b, | ||
| float | radius ) |
Empties a round ended tube from a to b
| void toast::VoxelNode::carveSphere | ( | glm::vec3 | center, |
| float | radius ) |
Empties a ball around center
| void toast::VoxelNode::clearRegions | ( | ) |
Forgets every copied region
|
protected |
Tells physics and the renderer the shape changed

| auto toast::VoxelNode::copy | ( | glm::vec3 | min, |
| glm::vec3 | max ) -> int |
Copies the voxels from min to max
|
protectedvirtual |
Reimplemented in toast::ProceduralVoxel.
|
protected |
Grows for local_bounds when asked and then runs kernel on the volume

|
inline |
Opens the VoxelEditor

|
protected |
Grows the volume until bounds fit

| void toast::VoxelNode::extrudeFace | ( | glm::vec3 | pos, |
| glm::vec3 | normal, | ||
| int | distance ) |
Pulls the flat face at pos out along normal
| distance | how many voxels to move it and negative pushes it in |
| void toast::VoxelNode::fillBox | ( | glm::vec3 | min, |
| glm::vec3 | max, | ||
| int | id, | ||
| voxel::WriteMode | mode = voxel::WriteMode::replace, | ||
| int | match_id = 0 ) |
Fills the box from min to max with id
| mode | what it is allowed to overwrite |
| match_id | the only id that Match overwrites |

| void toast::VoxelNode::fillCylinder | ( | glm::vec3 | a, |
| glm::vec3 | b, | ||
| float | radius, | ||
| int | id, | ||
| voxel::WriteMode | mode = voxel::WriteMode::replace, | ||
| int | match_id = 0 ) |
Fills a flat ended cylinder from a to b with id

| void toast::VoxelNode::fillLine | ( | glm::vec3 | a, |
| glm::vec3 | b, | ||
| float | radius, | ||
| int | id, | ||
| voxel::WriteMode | mode = voxel::WriteMode::replace, | ||
| int | match_id = 0 ) |
Fills a round ended tube from a to b with id

| void toast::VoxelNode::fillSphere | ( | glm::vec3 | center, |
| float | radius, | ||
| int | id, | ||
| voxel::WriteMode | mode = voxel::WriteMode::replace, | ||
| int | match_id = 0 ) |
Fills a ball around center with id

| auto toast::VoxelNode::getBounds | ( | ) | -> std::vector< glm::vec3 > |
The lowest and highest solid voxel
|
nodiscard |
|
nodiscard |
|
nodiscard |
The palette that replaces the model colors
| auto toast::VoxelNode::getSize | ( | ) | -> glm::vec3 |
| auto toast::VoxelNode::getVoxel | ( | glm::vec3 | pos | ) | -> int |
@function editShape() Runs every time the shape is rebuilt so build it here
| auto toast::VoxelNode::getVoxelCount | ( | ) | -> int |
|
overrideprotectedvirtual |
Reimplemented from toast::Node3D.
|
overrideprotectedvirtual |
Reimplemented from toast::Node.
|
overrideprotectedvirtual |
Reimplemented from toast::Node.
| void toast::VoxelNode::paintBox | ( | glm::vec3 | min, |
| glm::vec3 | max, | ||
| int | id ) |
Recolors the solid voxels from min to max
| void toast::VoxelNode::paintSphere | ( | glm::vec3 | center, |
| float | radius, | ||
| int | id ) |
Recolors the solid voxels in a ball
|
nodiscard |
The palette in use as a uid

| void toast::VoxelNode::paste | ( | int | region, |
| glm::vec3 | pos, | ||
| voxel::WriteMode | mode = voxel::WriteMode::replace, | ||
| int | match_id = 0 ) |
Pastes a copied region with its corner at pos
| void toast::VoxelNode::removeVoxel | ( | glm::vec3 | pos | ) |
Empties the voxel at pos
| void toast::VoxelNode::replaceId | ( | int | from, |
| int | to ) |
Turns every voxel of one id into another
|
protected |
Swaps the volume for an empty one that covers exactly bounds, rounded out to bricks
|
inlineprotectednoexcept |
Rebuilds the shape the next time it refreshes

|
nodiscard |
The raw physical materials of the palette in use
|
nodiscard |
The raw loaded model

|
nodiscard |
The raw loaded palette in use

| void toast::VoxelNode::setModel | ( | assets::Handle< assets::VoxelModel > | model | ) |
Swaps the model and rebuilds the shape
| void toast::VoxelNode::setPalette | ( | assets::Handle< assets::VoxelPalette > | palette | ) |
Replaces the colors the model came with
| void toast::VoxelNode::setVoxel | ( | glm::vec3 | pos, |
| int | id ) |
Sets the voxel at pos to id

|
inlinenodiscardprotectedvirtual |
A hash of everything the shape is built from besides the model
Reimplemented in toast::ProceduralVoxel.
| void toast::VoxelNode::sleep | ( | ) |
Puts the physics body to sleep
| void toast::VoxelNode::slice | ( | glm::vec3 | point, |
| glm::vec3 | normal, | ||
| int | side ) |
Cuts off everything on one side of a plane
| side | 1 cuts where normal points and minus 1 cuts the other side |
| void toast::VoxelNode::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 ) |
Drops a voxel model into the shape at pos
| rotation | snaps to the closest right angle |
|
overrideprotectedvirtual |
Reimplemented from toast::Node.
| auto toast::VoxelNode::voxelToWorld | ( | glm::vec3 | pos | ) | -> glm::vec3 |
Turns a voxel position into a world position
| void toast::VoxelNode::wake | ( | ) |
Wakes the physics body up
| auto toast::VoxelNode::worldToVoxel | ( | glm::vec3 | pos | ) | -> glm::vec3 |
Turns a world position into a voxel position
|
protected |
Draws the box filled instead of as lines
|
protected |
Works out the center of mass and inertia from the voxels
|
protected |
How the body is simulated