Blender V4.5
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_node.hh"
13#include "BKE_node_runtime.hh"
14
15namespace blender::bke {
16
23
29
30ComputeContextHash ModifierComputeContext::compute_hash() const
31{
32 return ComputeContextHash::from(parent_, "MODIFIER", modifier_uid_);
33}
34
35void ModifierComputeContext::print_current_in_line(std::ostream &stream) const
36{
37 if (nmd_) {
38 stream << "Modifier: " << nmd_->modifier.name;
39 }
40}
41
48
49ComputeContextHash NodeComputeContext::compute_hash() const
50{
51 return ComputeContextHash::from(parent_, "NODE", node_id_);
52}
53
55{
56 if (tree_) {
57 return tree_->node_by_id(node_id_);
58 }
59 return nullptr;
60}
61
62void NodeComputeContext::print_current_in_line(std::ostream &stream) const
63{
64 if (tree_) {
65 if (const bNode *node = tree_->node_by_id(node_id_)) {
66 stream << "Node: " << node_label(*tree_, *node);
67 return;
68 }
69 }
70 stream << "Node ID: " << node_id_;
71}
72
78
84
85ComputeContextHash SimulationZoneComputeContext::compute_hash() const
86{
87 return ComputeContextHash::from(parent_, "SIM_ZONE", output_node_id_);
88}
89
90void SimulationZoneComputeContext::print_current_in_line(std::ostream &stream) const
91{
92 stream << "Simulation Zone ID: " << output_node_id_;
93}
94
101
108
109ComputeContextHash RepeatZoneComputeContext::compute_hash() const
110{
111 return ComputeContextHash::from(parent_, "REPEAT_ZONE", output_node_id_, iteration_);
112}
113
114void RepeatZoneComputeContext::print_current_in_line(std::ostream &stream) const
115{
116 stream << "Repeat Zone ID: " << output_node_id_;
117}
118
124
130
131ComputeContextHash ForeachGeometryElementZoneComputeContext::compute_hash() const
132{
133 return ComputeContextHash::from(parent_, "FOREACH_GEOMETRY_ELEMENT", output_node_id_, index_);
134}
135
136void ForeachGeometryElementZoneComputeContext::print_current_in_line(std::ostream &stream) const
137{
138 stream << "Foreach Geometry Element Zone ID: " << output_node_id_;
139}
140
142 const ComputeContext *parent,
144 const bNodeTree *tree,
145 const std::optional<nodes::ClosureSourceLocation> &closure_source_location)
146 : NodeComputeContext(parent, node_id, tree), closure_source_location_(closure_source_location)
147{
148}
149
151
156
162
163ComputeContextHash OperatorComputeContext::compute_hash() const
164{
165 return ComputeContextHash::from(parent_, "OPERATOR");
166}
167
168void OperatorComputeContext::print_current_in_line(std::ostream &stream) const
169{
170 stream << "Operator";
171}
172
174 const NodesModifierData &nmd)
175{
176 return *modifier_contexts_cache_.lookup_or_add_cb(
177 std::pair{parent, nmd.modifier.persistent_uid},
178 [&]() { return &this->for_any_uncached<ModifierComputeContext>(parent, nmd); });
179}
180
182 const int modifier_uid)
183{
184 return *modifier_contexts_cache_.lookup_or_add_cb(std::pair{parent, modifier_uid}, [&]() {
185 return &this->for_any_uncached<ModifierComputeContext>(parent, modifier_uid);
186 });
187}
188
190{
191 return *operator_contexts_cache_.lookup_or_add_cb(
192 parent, [&]() { return &this->for_any_uncached<OperatorComputeContext>(parent); });
193}
194
196 const bNodeTree &tree)
197{
198 return *operator_contexts_cache_.lookup_or_add_cb(
199 parent, [&]() { return &this->for_any_uncached<OperatorComputeContext>(parent, tree); });
200}
201
203 const int32_t node_id,
204 const bNodeTree *tree)
205{
206 return *group_node_contexts_cache_.lookup_or_add_cb(std::pair{parent, node_id}, [&]() {
207 return &this->for_any_uncached<GroupNodeComputeContext>(parent, node_id, tree);
208 });
209}
210
212 const ComputeContext *parent, int output_node_id)
213{
214 return *simulation_zone_contexts_cache_.lookup_or_add_cb(
215 std::pair{parent, output_node_id}, [&]() {
216 return &this->for_any_uncached<SimulationZoneComputeContext>(parent, output_node_id);
217 });
218}
219
221 const ComputeContext *parent, const bNode &output_node)
222{
223 return *simulation_zone_contexts_cache_.lookup_or_add_cb(
224 std::pair{parent, output_node.identifier}, [&]() {
225 return &this->for_any_uncached<SimulationZoneComputeContext>(parent, output_node);
226 });
227}
228
230 int32_t output_node_id,
231 int iteration)
232{
233 return *repeat_zone_contexts_cache_.lookup_or_add_cb(
234 std::pair{parent, std::pair{output_node_id, iteration}}, [&]() {
236 parent, output_node_id, iteration);
237 });
238}
239
241 const bNode &output_node,
242 int iteration)
243{
244 return *repeat_zone_contexts_cache_.lookup_or_add_cb(
245 std::pair{parent, std::pair{output_node.identifier, iteration}}, [&]() {
246 return &this->for_any_uncached<RepeatZoneComputeContext>(parent, output_node, iteration);
247 });
248}
249
252 int32_t output_node_id,
253 int index)
254{
255 return *foreach_geometry_element_zone_contexts_cache_.lookup_or_add_cb(
256 std::pair{parent, std::pair{output_node_id, index}}, [&]() {
258 parent, output_node_id, index);
259 });
260}
261
264 const bNode &output_node,
265 int index)
266{
267 return *foreach_geometry_element_zone_contexts_cache_.lookup_or_add_cb(
268 std::pair{parent, std::pair{output_node.identifier, index}}, [&]() {
270 parent, output_node, index);
271 });
272}
273
275 const ComputeContext *parent,
276 const int32_t node_id,
277 const bNodeTree *tree,
278 const std::optional<nodes::ClosureSourceLocation> &closure_source_location)
279{
280 return *evaluate_closure_contexts_cache_.lookup_or_add_cb(std::pair{parent, node_id}, [&]() {
282 parent, node_id, tree, closure_source_location);
283 });
284}
285
286} // namespace blender::bke
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 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)
SimulationZoneComputeContext(const ComputeContext *parent, int output_node_id)
KDTree_3d * tree
std::string node_label(const bNodeTree &ntree, const bNode &node)
Definition node.cc:5242
int32_t identifier
static ComputeContextHash from(const ComputeContext *parent, const char(&type_str)[N], Args &&...args)