Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2021-04-22 13:48:59 +0300
committerJacques Lucke <jacques@blender.org>2021-04-22 13:48:59 +0300
commit71db02ed887d8b9db958b482aa42cc27f0e57ed2 (patch)
tree7f3b552cd40f585accede4fce726719ce8e34842
parent00ec99050ea435cb255bb81437b381e5a42660af (diff)
Fix: geometry nodes logs incorrect preview data
Under some circumstances, modifiers are evaluated more than once. One time to compute the actual output geometry and another time with `MOD_APPLY_ORCO`. This design probably has to be revisited at some point in the context of geometry nodes. However, that would be much more involved than a bug fix. The issue was that during the second evaluation, the node tree is evaluated based on a slightly different input geometry. The data generated during the second evaluation overwrote the cached data from the first evaluation, resulting in incorrect data that is shown in the spreadsheet. The fix for now is to simply not log any data in the second evaluation.
-rw-r--r--source/blender/modifiers/intern/MOD_nodes.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc
index 53b79d0b2a5..57de629fc18 100644
--- a/source/blender/modifiers/intern/MOD_nodes.cc
+++ b/source/blender/modifiers/intern/MOD_nodes.cc
@@ -271,6 +271,17 @@ static bool isDisabled(const struct Scene *UNUSED(scene),
return false;
}
+static bool logging_enabled(const ModifierEvalContext *ctx)
+{
+ if (!DEG_is_active(ctx->depsgraph)) {
+ return false;
+ }
+ if ((ctx->flag & MOD_APPLY_ORCO) != 0) {
+ return false;
+ }
+ return true;
+}
+
class GeometryNodesEvaluator {
public:
using LogSocketValueFn = std::function<void(DSocket, Span<GPointer>)>;
@@ -1290,7 +1301,7 @@ static GeometrySet compute_geometry(const DerivedNodeTree &tree,
find_sockets_to_preview(nmd, ctx, tree, preview_sockets);
auto log_socket_value = [&](const DSocket socket, const Span<GPointer> values) {
- if (!DEG_is_active(ctx->depsgraph)) {
+ if (!logging_enabled(ctx)) {
return;
}
Span<uint64_t> keys = preview_sockets.lookup(socket);
@@ -1401,7 +1412,7 @@ static void modifyGeometry(ModifierData *md,
return;
}
- if (DEG_is_active(ctx->depsgraph)) {
+ if (logging_enabled(ctx)) {
reset_tree_ui_storage(tree.used_node_tree_refs(), *ctx->object, *md);
}