86 auto getModel() const -> const assets::Handle<assets::VoxelModel>&;
90 auto getModel() -> assets::Handle<assets::VoxelModel>&;
94 void setModel(assets::Handle<assets::VoxelModel> model);
98 auto getPalette() const -> const assets::Handle<assets::VoxelPalette>&;
102 void setPalette(assets::Handle<assets::VoxelPalette> palette);
109 auto paletteUid() const -> uint64_t;
113 auto resolvedModel() const -> const assets::VoxelModel*;
117 auto resolvedPalette() -> const voxel::Palette*;
121 auto resolvedMaterialLibrary() -> const voxel::MaterialLibrary*;
140 auto getVoxel(glm::vec3 pos) ->
int;
146 auto getSize() -> glm::vec3;
153 auto getBounds() -> std::vector<glm::vec3>;
159 auto getVoxelCount() ->
int;
165 auto worldToVoxel(glm::vec3 pos) -> glm::vec3;
171 auto voxelToWorld(glm::vec3 pos) -> glm::vec3;
184 void setVoxel(glm::vec3 pos,
int id);
188 void removeVoxel(glm::vec3 pos);
196 void fillBox(glm::vec3 min, glm::vec3 max,
int id, voxel::WriteMode mode = voxel::WriteMode::replace,
int match_id = 0);
200 void fillSphere(glm::vec3 center,
float radius,
int id, voxel::WriteMode mode = voxel::WriteMode::replace,
int match_id = 0);
205 glm::vec3 a, glm::vec3 b,
float radius,
int id, voxel::WriteMode mode = voxel::WriteMode::replace,
int match_id = 0
211 glm::vec3 a, glm::vec3 b,
float radius,
int id, voxel::WriteMode mode = voxel::WriteMode::replace,
int match_id = 0
216 void carveBox(glm::vec3 min, glm::vec3 max);
220 void carveSphere(glm::vec3 center,
float radius);
223 void setLayers(
int included_layers,
int excluded_layers);
226 void includeLayer(
int layer,
bool value = true);
229 void excludeLayer(
int layer,
bool value = true);
233 void carveCylinder(glm::vec3 a, glm::vec3 b,
float radius);
237 void carveLine(glm::vec3 a, glm::vec3 b,
float radius);
241 void paintBox(glm::vec3 min, glm::vec3 max,
int id);
245 void paintSphere(glm::vec3 center,
float radius,
int id);
249 void replaceId(
int from,
int to);
256 void slice(glm::vec3 point, glm::vec3 normal,
int side);
263 void extrudeFace(glm::vec3 pos, glm::vec3 normal,
int distance);
272 const assets::Handle<assets::VoxelModel>& asset, glm::vec3 pos, glm::quat rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f),
273 voxel::WriteMode mode = voxel::WriteMode::replace,
int match_id = 0
281 auto copy(glm::vec3 min, glm::vec3 max) ->
int;
288 void paste(
int region, glm::vec3 pos, voxel::WriteMode mode = voxel::WriteMode::replace,
int match_id = 0);
321 [[
Reflect, Button(
"Edit Voxel"), EditorAction(
"voxel_editor.open")]]
330 auto revision() const noexcept -> uint32_t {
335 auto voxelOrigin() const noexcept -> glm::ivec3 {
336 return m_voxel_origin;
340 auto volumeLocalTransform() const -> glm::mat4;
342 [[nodiscard, Reflect]]
343 auto localBoundingSphere() const -> glm::vec4;
346 auto latticePlacement() const -> std::optional<voxel::LatticePlacement>;
349 auto renderOnly() const noexcept ->
bool {
379 virtual void tickAsyncBuild() { }
392 void onReflectedFieldChanged(std::string_view field_name)
override;
393 void onScriptsReloaded()
override;
394 void updateInspectorMessages()
override;
395 void onEditorTransformChanged()
override;
396 virtual void drawDebug();
398 void refreshVolume();
399 void releaseVolume();
401 void recordDamage(uint32_t count, glm::vec3 index_sum);
416 template<
typename Kernel>
417 void edit(
const voxel::EditBounds& local_bounds,
bool grows, std::string_view operation, Kernel&& kernel);
423 auto toIndex(glm::ivec3 local)
const noexcept -> glm::ivec3 {
424 return local - m_voxel_origin;
428 auto toIndex(glm::vec3 local)
const noexcept -> glm::vec3 {
429 return local - glm::vec3(m_voxel_origin);
433 auto toIndex(
const voxel::EditBounds& local)
const noexcept -> voxel::EditBounds {
434 return {local.min - m_voxel_origin, local.max - m_voxel_origin};
440 uint32_t shape_pair_count = 0;
444 auto physicsBound() const noexcept ->
bool {
450 void assignShape(physics::ShapeID shape)
noexcept { m_shape = shape; }
453 auto bodyID() const noexcept -> physics::BodyID {
458 auto shapeID() const noexcept -> physics::ShapeID {
462 void handleContactBegin(
const physics::BroadPhasePair& pair);
463 void handleContactEnd(
const physics::BroadPhasePair& pair);
465 void applyPhysicsTransform(
const glm::vec3& position,
const glm::quat& rotation);
466 void publishPhysicsState(
bool is_awake,
const glm::vec3& current_linear_velocity,
const glm::vec3& current_angular_velocity);
471 assets::Handle<assets::VoxelModel> m_model;
473 [[Reflect, Name(
"Palette Override")]]
474 assets::Handle<assets::VoxelPalette> m_palette;
480 [[Reflect, Name(
"Simulation Type"), Enum(
"Static",
"Kinematic",
"Dynamic")]]
483 [[
Reflect, ReadOnly, Unit(
"kg")]]
490 [[
Reflect, Group(
"Physics"), Layers(
"excluded"), Name(
"Layers")]]
491 uint32_t included = 1;
493 [[
Reflect, Group(
"Physics"), LayersExcluded]]
494 uint32_t excluded = 0;
497 bool allow_sleep =
true;
499 [[
Reflect, Group(
"Physics"), ReadOnly]]
503 float gravity_scale = 1.0f;
509 [[
Reflect, Group(
"Physics"), Unit(
"m"), ReadOnly(
"auto_mass_center")]]
510 glm::vec3 center_of_mass = {};
512 [[
Reflect, Group(
"Physics"), Unit(
"kg•m²"), ReadOnly(
"auto_mass_center")]]
513 glm::vec3 inertia = {};
515 [[Reflect, Group(
"Physics"), Subgroup(
"Drag"), Unit(
"1/s")]]
516 float linear_damping = 0.0f;
517 [[Reflect, Group(
"Physics"), Subgroup(
"Drag"), Unit(
"1/s")]]
518 float angular_damping = 0.0f;
519 [[Reflect, Group(
"Physics"), Subgroup(
"Drag")]]
520 float drag_scale = 1.0f;
522 [[Reflect, Group(
"Physics"), Subgroup(
"Velocities"), Unit(
"m/s"), ReadOnly]]
523 glm::vec3 linear_velocity = {};
524 [[Reflect, Group(
"Physics"), Subgroup(
"Velocities"), Unit(
"rad/s"), ReadOnly]]
525 glm::vec3 angular_velocity = {};
527 [[Reflect, Group(
"Physics"), Subgroup(
"Constant Forces"), Unit(
"N"), ReadOnly]]
528 glm::vec3 constant_force = {};
529 [[Reflect, Group(
"Physics"), Subgroup(
"Constant Forces"), Unit(
"N•m"), ReadOnly]]
530 glm::vec3 constant_torque = {};
532 [[Reflect, Name(
"Lock X"), Group(
"Physics"), Subgroup(
"Position Locks"), ReadOnly]]
533 bool lock_pos_x =
false;
534 [[Reflect, Name(
"Lock Y"), Group(
"Physics"), Subgroup(
"Position Locks"), ReadOnly]]
535 bool lock_pos_y =
false;
536 [[Reflect, Name(
"Lock Z"), Group(
"Physics"), Subgroup(
"Position Locks"), ReadOnly]]
537 bool lock_pos_z =
false;
538 [[Reflect, Name(
"Lock X"), Group(
"Physics"), Subgroup(
"Rotation Locks"), ReadOnly]]
539 bool lock_rot_x =
false;
540 [[Reflect, Name(
"Lock Y"), Group(
"Physics"), Subgroup(
"Rotation Locks"), ReadOnly]]
541 bool lock_rot_y =
false;
542 [[Reflect, Name(
"Lock Z"), Group(
"Physics"), Subgroup(
"Rotation Locks"), ReadOnly]]
543 bool lock_rot_z =
false;
545 [[Reflect, Name(
"Show AABB"), Group(
"AABB")]]
546 bool show_aabb =
false;
548 [[Reflect, Color, Name(
"AABB Color"), Group(
"AABB")]]
549 glm::vec4 aabb_color = glm::vec4(1.0f, 0.75f, 0.15f, 0.6f);
552 [[Reflect, Name(
"Fill Shape"), Group(
"AABB")]]
555 std::unique_ptr<voxel::Volume> m_volume;
556 std::vector<std::unique_ptr<voxel::Volume>> m_retired_volumes;
557 glm::ivec3 m_voxel_origin {0};
558 uint32_t m_revision = 0;
561 std::vector<std::optional<voxel::Region>> m_regions;
563 bool m_volume_stale =
false;
564 bool m_rebuild_requested =
false;
565 bool m_edit_shape_pending =
false;
566 bool m_split_pending =
false;
567 bool m_building_shape =
false;
570 uint32_t damaged_voxels = 0;
571 glm::vec3 damaged_sum {0.0f};
572 std::vector<int> broken_pieces;
573 bool emptied =
false;
580 std::vector<ActiveContact> m_active_contacts;
581 bool m_registration_requested =
false;
583 bool m_registered_proxy =
false;
584 bool m_debug_visible =
false;
585 uint64_t m_shape_key = 0;
587 uint64_t m_reported_wrong_model = 0;
588 uint64_t m_reported_wrong_palette = 0;
Body identifiers, creation data, and copied runtime state.