add popups to certain user actions
This commit is contained in:
@ -32,8 +32,9 @@ auto octree::create_empty_leaf(const Vector3& box_min, const Vector3& box_max) -
|
||||
auto octree::get_octant(const int node_idx, const Vector3& pos) const -> int
|
||||
{
|
||||
const node& n = nodes[node_idx];
|
||||
auto [cx, cy, cz] = Vector3((n.box_min.x + n.box_max.x) / 2.0f, (n.box_min.y + n.box_max.y) / 2.0f,
|
||||
(n.box_min.z + n.box_max.z) / 2.0f);
|
||||
auto [cx, cy, cz] =
|
||||
Vector3((n.box_min.x + n.box_max.x) / 2.0f, (n.box_min.y + n.box_max.y) / 2.0f,
|
||||
(n.box_min.z + n.box_max.z) / 2.0f);
|
||||
|
||||
// The octant is encoded as a 3-bit integer "zyx". The node area is split
|
||||
// along all 3 axes, if a position is right of an axis, this bit is set to 1.
|
||||
@ -53,11 +54,13 @@ auto octree::get_octant(const int node_idx, const Vector3& pos) const -> int
|
||||
return octant;
|
||||
}
|
||||
|
||||
auto octree::get_child_bounds(const int node_idx, const int octant) const -> std::pair<Vector3, Vector3>
|
||||
auto octree::get_child_bounds(const int node_idx, const int octant) const
|
||||
-> std::pair<Vector3, Vector3>
|
||||
{
|
||||
const node& n = nodes[node_idx];
|
||||
auto [cx, cy, cz] = Vector3((n.box_min.x + n.box_max.x) / 2.0f, (n.box_min.y + n.box_max.y) / 2.0f,
|
||||
(n.box_min.z + n.box_max.z) / 2.0f);
|
||||
auto [cx, cy, cz] =
|
||||
Vector3((n.box_min.x + n.box_max.x) / 2.0f, (n.box_min.y + n.box_max.y) / 2.0f,
|
||||
(n.box_min.z + n.box_max.z) / 2.0f);
|
||||
|
||||
Vector3 min = Vector3Zero();
|
||||
Vector3 max = Vector3Zero();
|
||||
@ -75,21 +78,23 @@ auto octree::get_child_bounds(const int node_idx, const int octant) const -> std
|
||||
return std::make_pair(min, max);
|
||||
}
|
||||
|
||||
auto octree::insert(const int node_idx, const int mass_id, const Vector3& pos, const float mass, const int depth)
|
||||
-> void
|
||||
auto octree::insert(const int node_idx, const int mass_id, const Vector3& pos, const float mass,
|
||||
const int depth) -> void
|
||||
{
|
||||
// infoln("Inserting position ({}, {}, {}) into octree at node {} (depth {})", pos.x, pos.y, pos.z, node_idx,
|
||||
// depth);
|
||||
// infoln("Inserting position ({}, {}, {}) into octree at node {} (depth {})", pos.x, pos.y,
|
||||
// pos.z, node_idx, depth);
|
||||
if (depth > MAX_DEPTH) {
|
||||
errln("MAX_DEPTH! node={} box_min=({},{},{}) box_max=({},{},{}) pos=({},{},{})", node_idx,
|
||||
nodes[node_idx].box_min.x, nodes[node_idx].box_min.y, nodes[node_idx].box_min.z,
|
||||
nodes[node_idx].box_max.x, nodes[node_idx].box_max.y, nodes[node_idx].box_max.z, pos.x, pos.y, pos.z);
|
||||
nodes[node_idx].box_max.x, nodes[node_idx].box_max.y, nodes[node_idx].box_max.z,
|
||||
pos.x, pos.y, pos.z);
|
||||
|
||||
// This runs from inside the physics thread so it won't exit cleanly
|
||||
exit(1);
|
||||
}
|
||||
|
||||
// NOTE: Do not store a nodes[node_idx] reference as the nodes vector might reallocate during this function
|
||||
// NOTE: Do not store a nodes[node_idx] reference as the nodes vector might reallocate during
|
||||
// this function
|
||||
|
||||
// We can place the particle in the empty leaf
|
||||
if (nodes[node_idx].leaf && nodes[node_idx].mass_id == -1) {
|
||||
@ -116,9 +121,8 @@ auto octree::insert(const int node_idx, const int mass_id, const Vector3& pos, c
|
||||
insert(node_idx, mass_id, jittered, mass, depth);
|
||||
return;
|
||||
|
||||
// Could also merge them, but that leads to the octree having less leafs than we have masses
|
||||
// nodes[node_idx].mass_total += mass;
|
||||
// return;
|
||||
// Could also merge them, but that leads to the octree having less leafs than we have
|
||||
// masses nodes[node_idx].mass_total += mass; return;
|
||||
}
|
||||
|
||||
// Convert the leaf to an internal node
|
||||
@ -148,9 +152,12 @@ auto octree::insert(const int node_idx, const int mass_id, const Vector3& pos, c
|
||||
|
||||
// Update the center of mass
|
||||
const float new_mass = nodes[node_idx].mass_total + mass;
|
||||
nodes[node_idx].mass_center.x = (nodes[node_idx].mass_center.x * nodes[node_idx].mass_total + pos.x) / new_mass;
|
||||
nodes[node_idx].mass_center.y = (nodes[node_idx].mass_center.y * nodes[node_idx].mass_total + pos.y) / new_mass;
|
||||
nodes[node_idx].mass_center.z = (nodes[node_idx].mass_center.z * nodes[node_idx].mass_total + pos.z) / new_mass;
|
||||
nodes[node_idx].mass_center.x =
|
||||
(nodes[node_idx].mass_center.x * nodes[node_idx].mass_total + pos.x) / new_mass;
|
||||
nodes[node_idx].mass_center.y =
|
||||
(nodes[node_idx].mass_center.y * nodes[node_idx].mass_total + pos.y) / new_mass;
|
||||
nodes[node_idx].mass_center.z =
|
||||
(nodes[node_idx].mass_center.z * nodes[node_idx].mass_total + pos.z) / new_mass;
|
||||
nodes[node_idx].mass_total = new_mass;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user