Blender V5.0
compute_contexts.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include <ostream>
6
8#include "DNA_node_types.h"
9
12#include "BKE_lib_id.hh"
13#include "BKE_node.hh"
14#include "BKE_node_runtime.hh"
15
16namespace blender::bke {
17
24
30
31ComputeContextHash ModifierComputeContext::compute_hash() const
32{
33 return ComputeContextHash::from(parent_, "MODIFIER", modifier_uid_);
34}
35
36void ModifierComputeContext::print_current_in_line(std::ostream &stream) const
37{
38 if (nmd_) {
39 stream << "Modifier: " << nmd_->modifier.name;
40 }
41}
42
49
50ComputeContextHash NodeComputeContext::compute_hash() const
51{
52 return ComputeContextHash::from(parent_, "NODE", node_id_);
53}
54
56{
57 if (tree_) {
58 return tree_->node_by_id(node_id_);
59 }
60 return nullptr;
61}
62
63void NodeComputeContext::print_current_in_line(std::ostream &stream) const
64{
65 if (tree_) {
66 if (const bNode *node = tree_->node_by_id(node_id_)) {
67 stream << "Node: " << node_label(*tree_, *node);
68 return;
69 }
70 }
71 stream << "Node ID: " << node_id_;
72}
73
79
85
86ComputeContextHash SimulationZoneComputeContext::compute_hash() const
87{
88 return ComputeContextHash::from(parent_, "SIM_ZONE", output_node_id_);
89}
90
91void SimulationZoneComputeContext::print_current_in_line(std::ostream &stream) const
92{
93 stream << "Simulation Zone ID: " << output_node_id_;
94}
95
102
109
110ComputeContextHash RepeatZoneComputeContext::compute_hash() const
111{
112 return ComputeContextHash::from(parent_, "REPEAT_ZONE", output_node_id_, iteration_);
113}
114
115void RepeatZoneComputeContext::print_current_in_line(std::ostream &stream) const
116{
117 stream << "Repeat Zone ID: " << output_node_id_;
118}
119
125
131
132ComputeContextHash ForeachGeometryElementZoneComputeContext::compute_hash() const
133{
134 return ComputeContextHash::from(parent_, "FOREACH_GEOMETRY_ELEMENT", output_node_id_, index_);
135}
136
137void ForeachGeometryElementZoneComputeContext::print_current_in_line(std::ostream &stream) const
138{
139 stream << "Foreach Geometry Element Zone ID: " << output_node_id_;
140}
141
143 const ComputeContext *parent,
145 const bNodeTree *tree,
146 const std::optional<nodes::ClosureSourceLocation> &closure_source_location)
147 : NodeComputeContext(parent, node_id, tree), closure_source_location_(closure_source_location)
148{
149}
150
152{
153 if (!closure_source_location_) {
154 /* Can't determine recursiveness in this case. */
155 return false;
156 }
157 for (const ComputeContext *parent = parent_; parent; parent = parent->parent()) {
158 if (const auto *evaluate_closure_compute_context =
159 dynamic_cast<const EvaluateClosureComputeContext *>(parent))
160 {
161 if (!evaluate_closure_compute_context->closure_source_location_) {
162 continue;
163 }
164 if (evaluate_closure_compute_context->closure_source_location_->tree ==
165 closure_source_location_->tree &&
166 evaluate_closure_compute_context->closure_source_location_->closure_output_node_id ==
167 closure_source_location_->closure_output_node_id)
168 {
169 return true;
170 }
171 }
172 }
173 return false;
174}
175
177
182
188
189ComputeContextHash OperatorComputeContext::compute_hash() const
190{
191 return ComputeContextHash::from(parent_, "OPERATOR");
192}
193
194void OperatorComputeContext::print_current_in_line(std::ostream &stream) const
195{
196 stream << "Operator";
197}
198
203
204ComputeContextHash ShaderComputeContext::compute_hash() const
205{
206 return ComputeContextHash::from(parent_, "SHADER");
207}
208
209void ShaderComputeContext::print_current_in_line(std::ostream &stream) const
210{
211 stream << "Shader ";
212 if (tree_) {
213 stream << BKE_id_name(tree_->id);
214 }
215}
216
218 const NodesModifierData &nmd)
219{
220 return *modifier_contexts_cache_.lookup_or_add_cb(
221 std::pair{parent, nmd.modifier.persistent_uid},
222 [&]() { return &this->for_any_uncached<ModifierComputeContext>(parent, nmd); });
223}
224
226 const int modifier_uid)
227{
228 return *modifier_contexts_cache_.lookup_or_add_cb(std::pair{parent, modifier_uid}, [&]() {
229 return &this->for_any_uncached<ModifierComputeContext>(parent, modifier_uid);
230 });
231}
232
234{
235 return *operator_contexts_cache_.lookup_or_add_cb(
236 parent, [&]() { return &this->for_any_uncached<OperatorComputeContext>(parent); });
237}
238
240 const bNodeTree &tree)
241{
242 return *operator_contexts_cache_.lookup_or_add_cb(
243 parent, [&]() { return &this->for_any_uncached<OperatorComputeContext>(parent, tree); });
244}
245
247 const bNodeTree *tree)
248{
249 return *shader_contexts_cache_.lookup_or_add_cb(
250 parent, [&]() { return &this->for_any_uncached<ShaderComputeContext>(parent, tree); });
251}
252
254 const int32_t node_id,
255 const bNodeTree *tree)
256{
257 return *group_node_contexts_cache_.lookup_or_add_cb(std::pair{parent, node_id}, [&]() {
258 return &this->for_any_uncached<GroupNodeComputeContext>(parent, node_id, tree);
259 });
260}
261
263 const ComputeContext *parent, int output_node_id)
264{
265 return *simulation_zone_contexts_cache_.lookup_or_add_cb(
266 std::pair{parent, output_node_id}, [&]() {
267 return &this->for_any_uncached<SimulationZoneComputeContext>(parent, output_node_id);
268 });
269}
270
272 const ComputeContext *parent, const bNode &output_node)
273{
274 return *simulation_zone_contexts_cache_.lookup_or_add_cb(
275 std::pair{parent, output_node.identifier}, [&]() {
276 return &this->for_any_uncached<SimulationZoneComputeContext>(parent, output_node);
277 });
278}
279
281 int32_t output_node_id,
282 int iteration)
283{
284 return *repeat_zone_contexts_cache_.lookup_or_add_cb(
285 std::pair{parent, std::pair{output_node_id, iteration}}, [&]() {
287 parent, output_node_id, iteration);
288 });
289}
290
292 const bNode &output_node,
293 int iteration)
294{
295 return *repeat_zone_contexts_cache_.lookup_or_add_cb(
296 std::pair{parent, std::pair{output_node.identifier, iteration}}, [&]() {
297 return &this->for_any_uncached<RepeatZoneComputeContext>(parent, output_node, iteration);
298 });
299}
300
303 int32_t output_node_id,
304 int index)
305{
306 return *foreach_geometry_element_zone_contexts_cache_.lookup_or_add_cb(
307 std::pair{parent, std::pair{output_node_id, index}}, [&]() {
309 parent, output_node_id, index);
310 });
311}
312
315 const bNode &output_node,
316 int index)
317{
318 return *foreach_geometry_element_zone_contexts_cache_.lookup_or_add_cb(
319 std::pair{parent, std::pair{output_node.identifier, index}}, [&]() {
321 parent, output_node, index);
322 });
323}
324
326 const ComputeContext *parent,
327 const int32_t node_id,
328 const bNodeTree *tree,
329 const std::optional<nodes::ClosureSourceLocation> &closure_source_location)
330{
331 return *evaluate_closure_contexts_cache_.lookup_or_add_cb(std::pair{parent, node_id}, [&]() {
333 parent, node_id, tree, closure_source_location);
334 });
335}
336
337} // namespace blender::bke
const char * BKE_id_name(const ID &id)
ComputeContext(const ComputeContext *parent)
const ComputeContext * parent() const
const ComputeContext * parent_
const EvaluateClosureComputeContext & for_evaluate_closure(const ComputeContext *parent, int32_t node_id, const bNodeTree *tree=nullptr, const std::optional< nodes::ClosureSourceLocation > &closure_source_location=std::nullopt)
const ModifierComputeContext & for_modifier(const ComputeContext *parent, const NodesModifierData &nmd)
const GroupNodeComputeContext & for_group_node(const ComputeContext *parent, int32_t node_id, const bNodeTree *tree=nullptr)
const ForeachGeometryElementZoneComputeContext & for_foreach_geometry_element_zone(const ComputeContext *parent, int32_t output_node_id, int index)
const RepeatZoneComputeContext & for_repeat_zone(const ComputeContext *parent, int32_t output_node_id, int iteration)
const ShaderComputeContext & for_shader(const ComputeContext *parent, const bNodeTree *tree)
const OperatorComputeContext & for_operator(const ComputeContext *parent)
const SimulationZoneComputeContext & for_simulation_zone(const ComputeContext *parent, int output_node_id)
EvaluateClosureComputeContext(const ComputeContext *parent, int32_t node_id, const bNodeTree *tree=nullptr, const std::optional< nodes::ClosureSourceLocation > &closure_source_location=std::nullopt)
std::optional< nodes::ClosureSourceLocation > closure_source_location() const
ForeachGeometryElementZoneComputeContext(const ComputeContext *parent, int32_t output_node_id, int index)
const NodesModifierData * nmd() const
ModifierComputeContext(const ComputeContext *parent, const NodesModifierData &nmd)
NodeComputeContext(const ComputeContext *parent, int32_t node_id, const bNodeTree *tree=nullptr)
RepeatZoneComputeContext(const ComputeContext *parent, int32_t output_node_id, int iteration)
ShaderComputeContext(const ComputeContext *parent=nullptr, const bNodeTree *tree=nullptr)
SimulationZoneComputeContext(const ComputeContext *parent, int output_node_id)
KDTree_3d * tree
std::string node_label(const bNodeTree &ntree, const bNode &node)
Definition node.cc:4970
int32_t identifier
static ComputeContextHash from(const ComputeContext *parent, const char(&type_str)[N], Args &&...args)