[Bf-blender-cvs] [1bc655c5aa6] blender-v3.0-release: Fix T92815: Incorrect handling of evaluated meshes from curves

Hans Goudey noreply at git.blender.org
Fri Nov 5 17:51:41 CET 2021


Commit: 1bc655c5aa644c1b3b933f9e372ec5b5b504c0d5
Author: Hans Goudey
Date:   Fri Nov 5 11:51:34 2021 -0500
Branches: blender-v3.0-release
https://developer.blender.org/rB1bc655c5aa644c1b3b933f9e372ec5b5b504c0d5

Fix T92815: Incorrect handling of evaluated meshes from curves

Evaluated meshes from curves are presented to render engines as
separate instance objects now, just like evaluated meshes from other
object types like point clouds and volumes. For that reason, cycles
should not consider curve objects as geometry (previously it did,
meaning it retrieved a second mesh from the curve object as well
as the temporary evaluated mesh geometry).

Further, avoid adding a curve object's evaluated mesh as data_eval,
since that is special behavior for meshes that is arbitrary. Adding an
evaluated mesh there but not an evalauted pointcloud is arbitrary,
for example. Retrieve the evaluated mesh in from the geometry set
in BKE_object_get_evaluated_mesh now, to support that change.

This gets us closer to a place where all of an object's evaluated data
is stored in geometry_set_eval, and we just have helper functions
to access specific geometry components.

Differential Revision: https://developer.blender.org/D13118

===================================================================

M	intern/cycles/blender/object.cpp
M	source/blender/blenkernel/intern/DerivedMesh.cc
M	source/blender/blenkernel/intern/displist.cc
M	source/blender/blenkernel/intern/object.cc

===================================================================

diff --git a/intern/cycles/blender/object.cpp b/intern/cycles/blender/object.cpp
index 3800ea0ecd2..698800f9957 100644
--- a/intern/cycles/blender/object.cpp
+++ b/intern/cycles/blender/object.cpp
@@ -76,18 +76,15 @@ bool BlenderSync::object_is_geometry(BL::Object &b_ob)
     /* Will be exported attached to mesh. */
     return true;
   }
-  else if (type == BL::Object::type_CURVE) {
-    /* Skip exporting curves without faces, overhead can be
-     * significant if there are many for path animation. */
-    BL::Curve b_curve(b_ob_data);
 
-    return (b_curve.bevel_object() || b_curve.extrude() != 0.0f || b_curve.bevel_depth() != 0.0f ||
-            b_curve.dimensions() == BL::Curve::dimensions_2D || b_ob.modifiers.length());
-  }
-  else {
-    return (b_ob_data.is_a(&RNA_Mesh) || b_ob_data.is_a(&RNA_Curve) ||
-            b_ob_data.is_a(&RNA_MetaBall));
+  /* Other object types that are not meshes but evaluate to meshes are presented to render engines
+   * as separate instance objects. Metaballs and surface objects have not been affected by that
+   * change yet. */
+  if (type == BL::Object::type_SURFACE || type == BL::Object::type_META) {
+    return true;
   }
+
+  return b_ob_data.is_a(&RNA_Mesh);
 }
 
 bool BlenderSync::object_is_light(BL::Object &b_ob)
diff --git a/source/blender/blenkernel/intern/DerivedMesh.cc b/source/blender/blenkernel/intern/DerivedMesh.cc
index 4b1332d5b84..ced9076bbfd 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.cc
+++ b/source/blender/blenkernel/intern/DerivedMesh.cc
@@ -1896,9 +1896,9 @@ static void mesh_build_data(struct Depsgraph *depsgraph,
   const bool is_mesh_eval_owned = (mesh_eval != mesh->runtime.mesh_eval);
   BKE_object_eval_assign_data(ob, &mesh_eval->id, is_mesh_eval_owned);
 
-  /* Add the final mesh as read-only non-owning component to the geometry set. */
+  /* Add the final mesh as a non-owning component to the geometry set. */
   MeshComponent &mesh_component = geometry_set_eval->get_component_for_write<MeshComponent>();
-  mesh_component.replace(mesh_eval, GeometryOwnershipType::ReadOnly);
+  mesh_component.replace(mesh_eval, GeometryOwnershipType::Editable);
   ob->runtime.geometry_set_eval = geometry_set_eval;
 
   ob->runtime.mesh_deform_eval = mesh_deform_eval;
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index ebe00531e65..0bf436aa8b2 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -1524,15 +1524,6 @@ void BKE_displist_make_curveTypes(Depsgraph *depsgraph,
       cow_curve.curve_eval = curve_component.get_for_write();
       BKE_object_eval_assign_data(ob, &cow_curve.id, false);
     }
-    else if (geometry.has_mesh()) {
-      /* Most areas of Blender don't yet know how to look in #geometry_set_eval for evaluated mesh
-       * data, and look in #data_eval instead. When the object evaluates to a curve, that field
-       * must be used for the evaluated curve data, but otherwise we can use the field to store a
-       * pointer to the mesh, so more areas can retrieve the mesh. */
-      MeshComponent &mesh_component = geometry.get_component_for_write<MeshComponent>();
-      Mesh *mesh_eval = mesh_component.get_for_write();
-      BKE_object_eval_assign_data(ob, &mesh_eval->id, false);
-    }
 
     ob->runtime.geometry_set_eval = new GeometrySet(std::move(geometry));
   }
diff --git a/source/blender/blenkernel/intern/object.cc b/source/blender/blenkernel/intern/object.cc
index fc25153b3ff..9073fd6adbb 100644
--- a/source/blender/blenkernel/intern/object.cc
+++ b/source/blender/blenkernel/intern/object.cc
@@ -96,6 +96,7 @@
 #include "BKE_fcurve.h"
 #include "BKE_fcurve_driver.h"
 #include "BKE_geometry_set.h"
+#include "BKE_geometry_set.hh"
 #include "BKE_global.h"
 #include "BKE_gpencil.h"
 #include "BKE_gpencil_geom.h"
@@ -4559,8 +4560,28 @@ bool BKE_object_obdata_texspace_get(Object *ob, short **r_texflag, float **r_loc
 /** Get evaluated mesh for given object. */
 Mesh *BKE_object_get_evaluated_mesh(const Object *object)
 {
+  /* First attempt to retrieve the evaluated mesh from the evaluated geometry set. Most
+   * object types either store it there or add a reference to it if it's owned elsewhere. */
+  GeometrySet *geometry_set_eval = object->runtime.geometry_set_eval;
+  if (geometry_set_eval) {
+    /* Some areas expect to be able to modify the evaluated mesh. Theoretically this should be
+     * avoided, or at least protected with a lock, so a const mesh could be returned from this
+     * function. */
+    Mesh *mesh = geometry_set_eval->get_mesh_for_write();
+    if (mesh) {
+      return mesh;
+    }
+  }
+
+  /* Some object types do not yet add the evaluated mesh to an evaluated geometry set, if they do
+   * not support evaluating to multiple data types. Eventually this should be removed, when all
+   * object types use #geometry_set_eval. */
   ID *data_eval = object->runtime.data_eval;
-  return (data_eval && GS(data_eval->name) == ID_ME) ? (Mesh *)data_eval : nullptr;
+  if (data_eval && GS(data_eval->name) == ID_ME) {
+    return reinterpret_cast<Mesh *>(data_eval);
+  }
+
+  return nullptr;
 }
 
 /**



More information about the Bf-blender-cvs mailing list