Geometry Nodes: add simulation support #104924

Closed
Hans Goudey wants to merge 211 commits from geometry-nodes-simulation into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 26 additions and 32 deletions
Showing only changes of commit 6c9cd34719 - Show all commits

View File

@ -35,7 +35,7 @@ struct TreeZone {
class TreeZones {
public:
Vector<std::unique_ptr<TreeZone>> zones;
Vector<int> parent_zone_by_node;
Map<int, int> parent_zone_by_node_id;
};
const TreeZones *get_tree_zones(const bNodeTree &tree);

View File

@ -107,30 +107,25 @@ static Vector<ZoneRelation> get_direct_zone_relations(
static void update_parent_zone_per_node(const Span<const bNode *> all_nodes,
const Span<std::unique_ptr<TreeZone>> all_zones,
const BitArrayVector<> &depend_on_input_flag_array,
MutableSpan<int> r_parent_zone_by_node)
Map<int, int> &r_parent_zone_by_node_id)
{
threading::parallel_for(all_nodes.index_range(), 512, [&](const IndexRange range) {
for (const int node_i : range) {
const bNode &node = *all_nodes[node_i];
const BoundedBitSpan depend_on_input_flags = depend_on_input_flag_array[node_i];
TreeZone *parent_zone = nullptr;
bits::foreach_1_index(depend_on_input_flags, [&](const int parent_zone_i) {
TreeZone *zone = all_zones[parent_zone_i].get();
if (ELEM(&node, zone->input_node, zone->output_node)) {
return;
}
if (parent_zone == nullptr || zone->depth > parent_zone->depth) {
parent_zone = zone;
}
});
if (parent_zone == nullptr) {
r_parent_zone_by_node[node_i] = -1;
for (const int node_i : all_nodes.index_range()) {
const bNode &node = *all_nodes[node_i];
const BoundedBitSpan depend_on_input_flags = depend_on_input_flag_array[node_i];
TreeZone *parent_zone = nullptr;
bits::foreach_1_index(depend_on_input_flags, [&](const int parent_zone_i) {
TreeZone *zone = all_zones[parent_zone_i].get();
if (ELEM(&node, zone->input_node, zone->output_node)) {
return;
}
else {
r_parent_zone_by_node[node_i] = parent_zone->index;
if (parent_zone == nullptr || zone->depth > parent_zone->depth) {
parent_zone = zone;
}
});
if (parent_zone != nullptr) {
r_parent_zone_by_node_id.add(node.identifier, parent_zone->index);
}
});
}
}
static std::unique_ptr<TreeZones> discover_tree_zones(const bNodeTree &tree)
@ -214,14 +209,16 @@ static std::unique_ptr<TreeZones> discover_tree_zones(const bNodeTree &tree)
update_zone_depths(*zone);
}
tree_zones->parent_zone_by_node.resize(nodes_num);
update_parent_zone_per_node(
all_nodes, tree_zones->zones, depend_on_input_flag_array, tree_zones->parent_zone_by_node);
update_parent_zone_per_node(all_nodes,
tree_zones->zones,
depend_on_input_flag_array,
tree_zones->parent_zone_by_node_id);
for (const int node_i : all_nodes.index_range()) {
const int parent_zone_i = tree_zones->parent_zone_by_node[node_i];
const bNode *node = all_nodes[node_i];
const int parent_zone_i = tree_zones->parent_zone_by_node_id.lookup_default(node->identifier,
-1);
if (parent_zone_i != -1) {
const bNode *node = all_nodes[node_i];
tree_zones->zones[parent_zone_i]->child_nodes.append(node);
}
}
@ -239,7 +236,7 @@ const TreeZones *get_tree_zones(const bNodeTree &tree)
bool TreeZone::contains_node_recursively(const bNode &node) const
{
const TreeZones *zones = this->owner;
const int parent_zone_i = zones->parent_zone_by_node[node.index()];
const int parent_zone_i = zones->parent_zone_by_node_id.lookup_default(node.identifier, -1);
if (parent_zone_i == -1) {
return false;
}

View File

@ -3050,7 +3050,6 @@ static void add_rect_corner_positions(Vector<float2> &positions, const rctf &rec
static void find_bounds_by_zone_recursive(const SpaceNode &snode,
const TreeZone &zone,
const Span<int> parent_zone_by_node,
const Span<std::unique_ptr<TreeZone>> all_zones,
MutableSpan<Vector<float2>> r_bounds_by_zone)
{
@ -3064,8 +3063,7 @@ static void find_bounds_by_zone_recursive(const SpaceNode &snode,
Vector<float2> possible_bounds;
for (const TreeZone *child_zone : zone.child_zones) {
find_bounds_by_zone_recursive(
snode, *child_zone, parent_zone_by_node, all_zones, r_bounds_by_zone);
find_bounds_by_zone_recursive(snode, *child_zone, all_zones, r_bounds_by_zone);
const Span<float2> child_bounds = r_bounds_by_zone[child_zone->index];
for (const float2 &pos : child_bounds) {
rctf rect;
@ -3135,8 +3133,7 @@ static void node_draw_zones(TreeDrawContext & /*tree_draw_ctx*/,
for (const int zone_i : zones->zones.index_range()) {
const TreeZone &zone = *zones->zones[zone_i];
find_bounds_by_zone_recursive(
snode, zone, zones->parent_zone_by_node, zones->zones, bounds_by_zone);
find_bounds_by_zone_recursive(snode, zone, zones->zones, bounds_by_zone);
const Span<float2> boundary_positions = bounds_by_zone[zone_i];
const int boundary_positions_num = boundary_positions.size();