[Bf-blender-cvs] [a3080c2bc36] functions: don't crash when connecting certain sockets
Jacques Lucke
noreply at git.blender.org
Mon Sep 16 16:01:06 CEST 2019
Commit: a3080c2bc360e8e774b9ef11aadb0cca47c75234
Author: Jacques Lucke
Date: Mon Sep 16 11:15:23 2019 +0200
Branches: functions
https://developer.blender.org/rBa3080c2bc360e8e774b9ef11aadb0cca47c75234
don't crash when connecting certain sockets
===================================================================
M source/blender/simulations/bparticles/node_frontend.cpp
===================================================================
diff --git a/source/blender/simulations/bparticles/node_frontend.cpp b/source/blender/simulations/bparticles/node_frontend.cpp
index 1f12ce93651..7f3f0ff8d7a 100644
--- a/source/blender/simulations/bparticles/node_frontend.cpp
+++ b/source/blender/simulations/bparticles/node_frontend.cpp
@@ -85,39 +85,34 @@ class VTreeData {
return fn_ptr;
}
- TupleCallBody &function_body_for_inputs(VirtualNode *vnode, ArrayRef<uint> input_indices)
+ TupleCallBody *function_body_for_inputs(VirtualNode *vnode, ArrayRef<uint> input_indices)
{
VectorSet<DataSocket> sockets_to_compute;
for (uint index : input_indices) {
sockets_to_compute.add_new(m_vtree_data_graph.lookup_socket(vnode->input(index)));
}
- FunctionGraph fgraph(m_vtree_data_graph.graph(), {}, sockets_to_compute);
- auto fn = fgraph.new_function(vnode->name());
- FN::fgraph_add_TupleCallBody(fn, fgraph);
- m_functions.append(fn);
- return fn->body<TupleCallBody>();
- }
-
- TupleCallBody &function_body_for_all_inputs(VirtualNode *vnode)
- {
- VectorSet<DataSocket> sockets_to_compute;
- for (VirtualSocket *vsocket : vnode->inputs()) {
- if (m_vtree_data_graph.uses_socket(vsocket)) {
- sockets_to_compute.add_new(m_vtree_data_graph.lookup_socket(vsocket));
- }
+ Vector<VirtualSocket *> dependencies = m_vtree_data_graph.find_placeholder_dependencies(
+ sockets_to_compute);
+ if (dependencies.size() > 0) {
+ return nullptr;
}
FunctionGraph fgraph(m_vtree_data_graph.graph(), {}, sockets_to_compute);
auto fn = fgraph.new_function(vnode->name());
FN::fgraph_add_TupleCallBody(fn, fgraph);
m_functions.append(fn);
- return fn->body<TupleCallBody>();
+ return &fn->body<TupleCallBody>();
}
Optional<NamedTupleRef> compute_inputs(VirtualNode *vnode, ArrayRef<uint> input_indices)
{
- TupleCallBody &body = this->function_body_for_inputs(vnode, input_indices);
+ TupleCallBody *body_ptr = this->function_body_for_inputs(vnode, input_indices);
+ if (body_ptr == nullptr) {
+ return {};
+ }
+ TupleCallBody &body = *body_ptr;
+
FN_TUPLE_STACK_ALLOC(fn_in, body.meta_in().ref());
FN::Tuple *fn_out = new FN::Tuple(body.meta_out());
@@ -130,19 +125,16 @@ class VTreeData {
return NamedTupleRef(fn_out, name_provider);
}
- Optional<NamedTupleRef> compute_all_inputs(VirtualNode *vnode)
+ Optional<NamedTupleRef> compute_all_data_inputs(VirtualNode *vnode)
{
- TupleCallBody &body = this->function_body_for_all_inputs(vnode);
- FN_TUPLE_STACK_ALLOC(fn_in, body.meta_in().ref());
- FN::Tuple *fn_out = new FN::Tuple(body.meta_out());
-
- body.call__setup_execution_context(fn_in, *fn_out);
- auto *name_provider = new FN::FunctionOutputNamesProvider(body.owner());
-
- m_tuples.append(std::unique_ptr<FN::Tuple>(fn_out));
- m_name_providers.append(std::unique_ptr<FN::FunctionOutputNamesProvider>(name_provider));
+ Vector<uint> data_input_indices;
+ for (uint i = 0; i < vnode->inputs().size(); i++) {
+ if (m_vtree_data_graph.uses_socket(vnode->input(i))) {
+ data_input_indices.append(i);
+ }
+ }
- return NamedTupleRef(fn_out, name_provider);
+ return this->compute_inputs(vnode, data_input_indices);
}
ArrayRef<std::string> find_target_system_names(VirtualSocket *output_vsocket)
@@ -371,7 +363,7 @@ static void PARSE_point_emitter(InfluencesCollector &collector,
WorldTransition &world_transition,
VirtualNode *vnode)
{
- Optional<NamedTupleRef> inputs = vtree_data.compute_all_inputs(vnode);
+ Optional<NamedTupleRef> inputs = vtree_data.compute_all_data_inputs(vnode);
if (!inputs.has_value()) {
return;
}
@@ -446,7 +438,7 @@ static void PARSE_mesh_emitter(InfluencesCollector &collector,
WorldTransition &world_transition,
VirtualNode *vnode)
{
- Optional<NamedTupleRef> inputs = vtree_data.compute_all_inputs(vnode);
+ Optional<NamedTupleRef> inputs = vtree_data.compute_all_data_inputs(vnode);
if (!inputs.has_value()) {
return;
}
@@ -548,7 +540,7 @@ static void PARSE_initial_grid_emitter(InfluencesCollector &collector,
WorldTransition &UNUSED(world_transition),
VirtualNode *vnode)
{
- Optional<NamedTupleRef> inputs = vtree_data.compute_all_inputs(vnode);
+ Optional<NamedTupleRef> inputs = vtree_data.compute_all_data_inputs(vnode);
if (!inputs.has_value()) {
return;
}
More information about the Bf-blender-cvs
mailing list