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.
4 changed files with 52 additions and 5 deletions
Showing only changes of commit 3f1027567d - Show all commits

View File

@ -1577,12 +1577,24 @@ typedef struct NodeGeometryUVUnwrap {
uint8_t method;
} NodeGeometryUVUnwrap;
typedef struct SimulationStateItem {
char *name;
/* TODO: Use a different enum instead to support Byte colors, geometry, etc. */
/* eNodeSocketDatatype */
int8_t data_type;
char _pad[7];
} SimulationStateItem;
typedef struct NodeGeometrySimulationInput {
int32_t output_node_id;
} NodeGeometrySimulationInput;
typedef struct NodeGeometrySimulationOutput {
SimulationStateItem *state_items;
int state_items_num;
int8_t use_persistent_cache;
int _pad[3];
} NodeGeometrySimulationOutput;
typedef struct NodeGeometryDistributePointsInVolume {

View File

@ -9695,8 +9695,18 @@ static void def_geo_set_curve_normal(StructRNA *srna)
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
}
static void def_geo_simulation_input(StructRNA *srna)
static void rna_def_simulation_state_item(BlenderRNA *brna)
{
StructRNA *srna = RNA_def_struct(brna, "SimulationStateItem", NULL);
RNA_def_struct_ui_text(srna, "Simulation Sate Item", "");
RNA_def_struct_sdna(srna, "SimulationStateItem");
PropertyRNA *prop;
// prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
// RNA_def_property_ui_text(prop, "Name", "");
// RNA_def_struct_name_property(srna, prop);
// RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_NodeSocket_update");
}
static void def_geo_simulation_output(StructRNA *srna)
@ -9708,6 +9718,11 @@ static void def_geo_simulation_output(StructRNA *srna)
prop = RNA_def_property(srna, "use_persistent_cache", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_ui_text(prop, "Persistent Cache", "");
RNA_def_property_update(prop, NC_NODE | NA_EDITED, "rna_Node_update");
prop = RNA_def_property(srna, "state_items", PROP_COLLECTION, PROP_NONE);
RNA_def_property_collection_sdna(prop, NULL, "state_items", "state_items_num");
RNA_def_property_struct_type(prop, "SimulationStateItem");
RNA_def_property_ui_text(prop, "Inputs", "");
}
static void def_geo_curve_handle_type_selection(StructRNA *srna)
@ -12983,6 +12998,7 @@ void RNA_def_nodetree(BlenderRNA *brna)
rna_def_shader_node(brna);
rna_def_compositor_node(brna);
rna_def_texture_node(brna);
rna_def_simulation_state_item(brna);
rna_def_geometry_node(brna);
rna_def_function_node(brna);

View File

@ -412,7 +412,7 @@ DefNode(GeometryNode, GEO_NODE_SET_POSITION, 0, "SET_POSITION", SetPosition, "Se
DefNode(GeometryNode, GEO_NODE_SET_SHADE_SMOOTH, 0, "SET_SHADE_SMOOTH", SetShadeSmooth, "Set Shade Smooth", "Control the smoothness of mesh normals around each face by changing the \"shade smooth\" attribute")
DefNode(GeometryNode, GEO_NODE_SET_SPLINE_CYCLIC, 0, "SET_SPLINE_CYCLIC", SetSplineCyclic, "Set Spline Cyclic", "Control whether each spline loops back on itself by changing the \"cyclic\" attribute")
DefNode(GeometryNode, GEO_NODE_SET_SPLINE_RESOLUTION, 0, "SET_SPLINE_RESOLUTION", SetSplineResolution, "Set Spline Resolution", "Control how many evaluated points should be generated on every curve segment")
DefNode(GeometryNode, GEO_NODE_SIMULATION_INPUT, def_geo_simulation_input, "SIMULATION_INPUT", SimulationInput, "Simulation Input", "")
DefNode(GeometryNode, GEO_NODE_SIMULATION_INPUT, 0, "SIMULATION_INPUT", SimulationInput, "Simulation Input", "")
DefNode(GeometryNode, GEO_NODE_SIMULATION_OUTPUT, def_geo_simulation_output, "SIMULATION_OUTPUT", SimulationOutput, "Simulation Output", "")
DefNode(GeometryNode, GEO_NODE_SPLIT_EDGES, 0, "SPLIT_EDGES", SplitEdges, "Split Edges", "Duplicate mesh edges and break connections with the surrounding faces")
DefNode(GeometryNode, GEO_NODE_STORE_NAMED_ATTRIBUTE, def_geo_store_named_attribute, "STORE_NAMED_ATTRIBUTE", StoreNamedAttribute, "Store Named Attribute", "Store the result of a field on a geometry as an attribute with the specified name")

View File

@ -26,10 +26,29 @@ static void node_declare(NodeDeclarationBuilder &b)
static void node_init(bNodeTree * /*tree*/, bNode *node)
{
NodeGeometrySimulationOutput *data = MEM_cnew<NodeGeometrySimulationOutput>(__func__);
data->state_items = MEM_cnew_array<SimulationStateItem>(1, __func__);
data->state_items[0].name = BLI_strdup(DATA_("Geometry"));
data->state_items[0].data_type = SOCK_GEOMETRY;
data->state_items_num = 1;
data->use_persistent_cache = false;
node->storage = data;
}
static void node_free_storage(bNode *node)
{
NodeGeometrySimulationOutput &storage = node_storage(*node);
MEM_SAFE_FREE(storage.state_items);
}
void node_copy_storage(bNodeTree * /*dest_ntree*/, bNode *dst_node, const bNode *src_node)
{
const NodeGeometrySimulationOutput &src = node_storage(*src_node);
NodeGeometrySimulationOutput &dst = node_storage(*dst_node);
MEM_SAFE_FREE(dst.state_items);
dst.state_items = MEM_cnew_array<SimulationStateItem>(src.state_items_num, __func__);
dst.state_items_num = src.state_items_num;
}
static void node_geo_exec(GeoNodeExecParams params)
{
const bNode &node = params.node();
@ -90,9 +109,9 @@ void register_node_type_geo_simulation_output()
ntype.declare = file_ns::node_declare;
node_type_storage(&ntype,
"NodeGeometrySimulationOutput",
node_free_standard_storage,
node_copy_standard_storage);
file_ns::node_free_storage,
file_ns::node_copy_storage);
ntype.geometry_node_execute_supports_laziness = true;
// ntype.declaration_is_dynamic = true;
ntype.declaration_is_dynamic = true;
nodeRegisterType(&ntype);
}