From e5ca7ae421c0ee22a128e56905900d02757b69a8 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Mon, 20 Jan 2025 02:38:55 +0100 Subject: [PATCH] Fix #108215: Cycles: Point Cloud uses wrong position with Persistent Data The problem here was that the sync code overwrites the point data, but didn't reset the transform_applied flag, so the rest of the code assumed that the points are already in world space and didn't apply the transform again. --- intern/cycles/blender/pointcloud.cpp | 2 ++ intern/cycles/scene/pointcloud.cpp | 5 +++++ intern/cycles/scene/pointcloud.h | 1 + 3 files changed, 8 insertions(+) diff --git a/intern/cycles/blender/pointcloud.cpp b/intern/cycles/blender/pointcloud.cpp index 0af298097a3..7a4403f4885 100644 --- a/intern/cycles/blender/pointcloud.cpp +++ b/intern/cycles/blender/pointcloud.cpp @@ -207,6 +207,8 @@ void BlenderSync::sync_pointcloud(PointCloud *pointcloud, BObjectInfo &b_ob_info need_motion, motion_scale); + pointcloud->clear_non_sockets(); + /* Update original sockets. */ for (const SocketType &socket : new_pointcloud.type->inputs) { /* Those sockets are updated in sync_object, so do not modify them. */ diff --git a/intern/cycles/scene/pointcloud.cpp b/intern/cycles/scene/pointcloud.cpp index 2eab02541fa..eeea83d55f6 100644 --- a/intern/cycles/scene/pointcloud.cpp +++ b/intern/cycles/scene/pointcloud.cpp @@ -113,6 +113,11 @@ void PointCloud::reserve(const int numpoints) attributes.resize(true); } +void PointCloud::clear_non_sockets() +{ + Geometry::clear(true); +} + void PointCloud::clear(const bool preserve_shaders) { Geometry::clear(preserve_shaders); diff --git a/intern/cycles/scene/pointcloud.h b/intern/cycles/scene/pointcloud.h index f50c33b83f6..f18ce986a34 100644 --- a/intern/cycles/scene/pointcloud.h +++ b/intern/cycles/scene/pointcloud.h @@ -48,6 +48,7 @@ class PointCloud : public Geometry { ~PointCloud() override; /* Geometry */ + void clear_non_sockets(); void clear(const bool preserve_shaders = false) override; void resize(const int numpoints);