[Bf-blender-cvs] [abe38ee033b] geometry-nodes: Geometry Nodes: fix when vertex group exists but there are no MDeformVerts yet

Jacques Lucke noreply at git.blender.org
Thu Nov 26 22:52:29 CET 2020


Commit: abe38ee033b4fe51756f4dded075fa473e47ff16
Author: Jacques Lucke
Date:   Thu Nov 26 22:52:16 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rBabe38ee033b4fe51756f4dded075fa473e47ff16

Geometry Nodes: fix when vertex group exists but there are no MDeformVerts yet

The `mesh->dvert` array is only allocated when needed. Just creating a new vertex
group without any vertices in it, does not trigger the allocation.

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

M	source/blender/blenkernel/intern/attribute_access.cc

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

diff --git a/source/blender/blenkernel/intern/attribute_access.cc b/source/blender/blenkernel/intern/attribute_access.cc
index ff159db2ec9..2345c834be4 100644
--- a/source/blender/blenkernel/intern/attribute_access.cc
+++ b/source/blender/blenkernel/intern/attribute_access.cc
@@ -43,6 +43,9 @@ using blender::StringRef;
 using blender::bke::ReadAttributePtr;
 using blender::bke::WriteAttributePtr;
 
+/* Can't include BKE_object_deform.h right now, due to an enum forward declaration.  */
+extern "C" MDeformVert *BKE_object_defgroup_data_create(ID *id);
+
 namespace blender::bke {
 
 /* -------------------------------------------------------------------- */
@@ -135,13 +138,13 @@ void WriteAttribute::apply_span_if_necessary()
 
 class VertexWeightWriteAttribute final : public WriteAttribute {
  private:
-  MutableSpan<MDeformVert> dverts_;
+  MDeformVert *dverts_;
   const int dvert_index_;
 
  public:
   VertexWeightWriteAttribute(MDeformVert *dverts, const int totvert, const int dvert_index)
       : WriteAttribute(ATTR_DOMAIN_POINT, CPPType::get<float>(), totvert),
-        dverts_(dverts, totvert),
+        dverts_(dverts),
         dvert_index_(dvert_index)
   {
   }
@@ -157,11 +160,15 @@ class VertexWeightWriteAttribute final : public WriteAttribute {
     weight->weight = *reinterpret_cast<const float *>(value);
   }
 
-  static void get_internal(const Span<MDeformVert> dverts,
+  static void get_internal(const MDeformVert *dverts,
                            const int dvert_index,
                            const int64_t index,
                            void *r_value)
   {
+    if (dverts == nullptr) {
+      *(float *)r_value = 0.0f;
+      return;
+    }
     const MDeformVert &dvert = dverts[index];
     for (const MDeformWeight &weight : Span(dvert.dw, dvert.totweight)) {
       if (weight.def_nr == dvert_index) {
@@ -175,13 +182,13 @@ class VertexWeightWriteAttribute final : public WriteAttribute {
 
 class VertexWeightReadAttribute final : public ReadAttribute {
  private:
-  const Span<MDeformVert> dverts_;
+  const MDeformVert *dverts_;
   const int dvert_index_;
 
  public:
   VertexWeightReadAttribute(const MDeformVert *dverts, const int totvert, const int dvert_index)
       : ReadAttribute(ATTR_DOMAIN_POINT, CPPType::get<float>(), totvert),
-        dverts_(dverts, totvert),
+        dverts_(dverts),
         dvert_index_(dvert_index)
   {
   }
@@ -938,6 +945,9 @@ WriteAttributePtr MeshComponent::attribute_try_get_for_write(const StringRef att
 
   const int vertex_group_index = vertex_group_names_.lookup_default_as(attribute_name, -1);
   if (vertex_group_index >= 0) {
+    if (mesh_->dvert == nullptr) {
+      BKE_object_defgroup_data_create(&mesh_->id);
+    }
     return std::make_unique<blender::bke::VertexWeightWriteAttribute>(
         mesh_->dvert, mesh_->totvert, vertex_group_index);
   }



More information about the Bf-blender-cvs mailing list