[Bf-blender-cvs] [eaa87101cd5] master: Metaball: Evaluate metaball objects as mesh components

Hans Goudey noreply at git.blender.org
Wed Aug 17 16:20:43 CEST 2022


Commit: eaa87101cd5a20e577748bfff95b7cb06b04dd4b
Author: Hans Goudey
Date:   Wed Aug 17 10:20:25 2022 -0400
Branches: master
https://developer.blender.org/rBeaa87101cd5a20e577748bfff95b7cb06b04dd4b

Metaball: Evaluate metaball objects as mesh components

With the ultimate goal of simplifying drawing and evaluation,
this patch makes the following changes and removes code:
- Use `Mesh` instead of `DispList` for evaluated basis metaballs.
- Remove all `DispList` drawing code, which is now unused.
- Simplify code that converts evaluated metaballs to meshes.
- Store the evaluated mesh in the evaluated geometry set.

This has the following indirect benefits:
- Evaluated meshes from metaball objects can be used in geometry nodes.
- Renderers can ignore evaluated metaball objects completely
- Cycles rendering no longer has to convert to mesh from `DispList`.
- We get closer to removing `DispList` completely.
- Optimizations to mesh rendering will also apply to metaball objects.

The vertex normals on the evaluated mesh are technically invalid;
the regular calculation wouldn't reproduce them. Metaball objects
don't support modifiers though, so it shouldn't be a problem.
Eventually we can support per-vertex custom normals (T93551).

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

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

M	intern/cycles/blender/object.cpp
M	source/blender/blenkernel/BKE_displist.h
M	source/blender/blenkernel/BKE_lattice.h
M	source/blender/blenkernel/BKE_mball.h
M	source/blender/blenkernel/BKE_mball_tessellate.h
M	source/blender/blenkernel/BKE_mesh.h
M	source/blender/blenkernel/intern/displist.cc
M	source/blender/blenkernel/intern/lattice.c
M	source/blender/blenkernel/intern/mball.cc
M	source/blender/blenkernel/intern/mball_tessellate.c
M	source/blender/blenkernel/intern/mesh_convert.cc
M	source/blender/blenkernel/intern/object_dupli.cc
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/depsgraph/intern/depsgraph_query_iter.cc
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_render.c
M	source/blender/draw/engines/eevee_next/eevee_instance.cc
M	source/blender/draw/engines/overlay/overlay_engine.c
M	source/blender/draw/engines/workbench/workbench_engine.c
M	source/blender/draw/intern/draw_cache.c
M	source/blender/draw/intern/draw_cache.h
M	source/blender/draw/intern/draw_cache_impl.h
D	source/blender/draw/intern/draw_cache_impl_displist.c
D	source/blender/draw/intern/draw_cache_impl_metaball.c
M	source/blender/draw/intern/draw_common.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/object/object_add.cc
M	source/blender/editors/object/object_modifier.cc
M	source/blender/editors/space_info/info_stats.cc
M	source/blender/freestyle/intern/blender_interface/BlenderFileLoader.cpp
M	source/blender/io/wavefront_obj/tests/obj_exporter_tests.cc
M	source/blender/makesdna/DNA_meta_types.h
M	source/blender/makesrna/intern/rna_meta_api.c

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

diff --git a/intern/cycles/blender/object.cpp b/intern/cycles/blender/object.cpp
index ca1aa6329d9..109408c354d 100644
--- a/intern/cycles/blender/object.cpp
+++ b/intern/cycles/blender/object.cpp
@@ -66,12 +66,6 @@ bool BlenderSync::object_is_geometry(BObjectInfo &b_ob_info)
     return true;
   }
 
-  /* Other object types that are not meshes but evaluate to meshes are presented to render engines
-   * as separate instance objects. Metaballs have not been affected by that change yet. */
-  if (type == BL::Object::type_META) {
-    return true;
-  }
-
   return b_ob_data.is_a(&RNA_Mesh);
 }
 
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index cdca740555a..6551e732300 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -24,8 +24,6 @@ enum {
   DL_SURF = 2,
   /** Triangles. */
   DL_INDEX3 = 4,
-  /** Quads, with support for triangles (when values of the 3rd and 4th indices match). */
-  DL_INDEX4 = 5,
   // DL_VERTCOL = 6, /* UNUSED */
   /** Isolated points. */
   DL_VERTS = 7,
@@ -62,15 +60,12 @@ typedef struct DispList {
 } DispList;
 
 DispList *BKE_displist_find(struct ListBase *lb, int type);
-void BKE_displist_normals_add(struct ListBase *lb);
-void BKE_displist_count(const struct ListBase *lb, int *totvert, int *totface, int *tottri);
 void BKE_displist_free(struct ListBase *lb);
 
 void BKE_displist_make_curveTypes(struct Depsgraph *depsgraph,
                                   const struct Scene *scene,
                                   struct Object *ob,
                                   bool for_render);
-void BKE_displist_make_mball(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
 
 void BKE_curve_calc_modifiers_pre(struct Depsgraph *depsgraph,
                                   const struct Scene *scene,
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 9fa59c9e81b..aa4b1c69d24 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -27,7 +27,6 @@ void BKE_lattice_resize(struct Lattice *lt, int u, int v, int w, struct Object *
 struct Lattice *BKE_lattice_add(struct Main *bmain, const char *name);
 void calc_lat_fudu(int flag, int res, float *r_fu, float *r_du);
 
-bool object_deform_mball(struct Object *ob, struct ListBase *dispbase);
 void outside_lattice(struct Lattice *lt);
 
 float (*BKE_lattice_vert_coords_alloc(const struct Lattice *lt, int *r_vert_len))[3];
diff --git a/source/blender/blenkernel/BKE_mball.h b/source/blender/blenkernel/BKE_mball.h
index a23d010b51f..667a1044e7b 100644
--- a/source/blender/blenkernel/BKE_mball.h
+++ b/source/blender/blenkernel/BKE_mball.h
@@ -54,14 +54,6 @@ bool BKE_mball_is_basis(const struct Object *ob);
  */
 struct Object *BKE_mball_basis_find(struct Scene *scene, struct Object *ob);
 
-/**
- * Compute bounding box of all meta-elements / meta-ball.
- *
- * Bounding box is computed from polygonized surface. \a ob is
- * basic meta-balls (with name `Meta` for example). All other meta-ball objects
- * (with names `Meta.001`, `Meta.002`, etc) are included in this bounding-box.
- */
-void BKE_mball_texspace_calc(struct Object *ob);
 /**
  * Return or compute bounding-box for given meta-ball object.
  */
@@ -110,18 +102,7 @@ bool BKE_mball_select_swap_multi_ex(struct Base **bases, int bases_len);
 
 /* **** Depsgraph evaluation **** */
 
-struct Depsgraph;
-
-/* Draw Cache */
-
-enum {
-  BKE_MBALL_BATCH_DIRTY_ALL = 0,
-};
-void BKE_mball_batch_cache_dirty_tag(struct MetaBall *mb, int mode);
-void BKE_mball_batch_cache_free(struct MetaBall *mb);
-
-extern void (*BKE_mball_batch_cache_dirty_tag_cb)(struct MetaBall *mb, int mode);
-extern void (*BKE_mball_batch_cache_free_cb)(struct MetaBall *mb);
+void BKE_mball_data_update(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob);
 
 #ifdef __cplusplus
 }
diff --git a/source/blender/blenkernel/BKE_mball_tessellate.h b/source/blender/blenkernel/BKE_mball_tessellate.h
index 2dc16dc64d6..0840c51bb4d 100644
--- a/source/blender/blenkernel/BKE_mball_tessellate.h
+++ b/source/blender/blenkernel/BKE_mball_tessellate.h
@@ -12,11 +12,11 @@ extern "C" {
 struct Depsgraph;
 struct Object;
 struct Scene;
+struct Mesh;
 
-void BKE_mball_polygonize(struct Depsgraph *depsgraph,
-                          struct Scene *scene,
-                          struct Object *ob,
-                          struct ListBase *dispbase);
+struct Mesh *BKE_mball_polygonize(struct Depsgraph *depsgraph,
+                                  struct Scene *scene,
+                                  struct Object *ob);
 
 void BKE_mball_cubeTable_free(void);
 
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index b9f6b4b73f3..8cf973b785c 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -193,7 +193,6 @@ void BKE_mesh_orco_ensure(struct Object *ob, struct Mesh *mesh);
 
 struct Mesh *BKE_mesh_from_object(struct Object *ob);
 void BKE_mesh_assign_object(struct Main *bmain, struct Object *ob, struct Mesh *me);
-void BKE_mesh_from_metaball(struct ListBase *lb, struct Mesh *me);
 void BKE_mesh_to_curve_nurblist(const struct Mesh *me,
                                 struct ListBase *nurblist,
                                 int edge_users_test);
diff --git a/source/blender/blenkernel/intern/displist.cc b/source/blender/blenkernel/intern/displist.cc
index 0b3ed584246..65f6dc174f7 100644
--- a/source/blender/blenkernel/intern/displist.cc
+++ b/source/blender/blenkernel/intern/displist.cc
@@ -34,10 +34,8 @@
 #include "BKE_displist.h"
 #include "BKE_geometry_set.hh"
 #include "BKE_key.h"
-#include "BKE_lattice.h"
 #include "BKE_lib_id.h"
 #include "BKE_mball.h"
-#include "BKE_mball_tessellate.h"
 #include "BKE_mesh.h"
 #include "BKE_modifier.h"
 #include "BKE_object.h"
@@ -86,120 +84,6 @@ DispList *BKE_displist_find(ListBase *lb, int type)
   return nullptr;
 }
 
-void BKE_displist_normals_add(ListBase *lb)
-{
-  float *vdata, *ndata, nor[3];
-  float *v1, *v2, *v3, *v4;
-  float *n1, *n2, *n3, *n4;
-  int a, b, p1, p2, p3, p4;
-
-  LISTBASE_FOREACH (DispList *, dl, lb) {
-    if (dl->type == DL_INDEX3) {
-      if (dl->nors == nullptr) {
-        dl->nors = (float *)MEM_callocN(sizeof(float[3]), __func__);
-
-        if (dl->flag & DL_BACK_CURVE) {
-          dl->nors[2] = -1.0f;
-        }
-        else {
-          dl->nors[2] = 1.0f;
-        }
-      }
-    }
-    else if (dl->type == DL_SURF) {
-      if (dl->nors == nullptr) {
-        dl->nors = (float *)MEM_callocN(sizeof(float[3]) * dl->nr * dl->parts, __func__);
-
-        vdata = dl->verts;
-        ndata = dl->nors;
-
-        for (a = 0; a < dl->parts; a++) {
-
-          if (BKE_displist_surfindex_get(dl, a, &b, &p1, &p2, &p3, &p4) == 0) {
-            break;
-          }
-
-          v1 = vdata + 3 * p1;
-          n1 = ndata + 3 * p1;
-          v2 = vdata + 3 * p2;
-          n2 = ndata + 3 * p2;
-          v3 = vdata + 3 * p3;
-          n3 = ndata + 3 * p3;
-          v4 = vdata + 3 * p4;
-          n4 = ndata + 3 * p4;
-
-          for (; b < dl->nr; b++) {
-            normal_quad_v3(nor, v1, v3, v4, v2);
-
-            add_v3_v3(n1, nor);
-            add_v3_v3(n2, nor);
-            add_v3_v3(n3, nor);
-            add_v3_v3(n4, nor);
-
-            v2 = v1;
-            v1 += 3;
-            v4 = v3;
-            v3 += 3;
-            n2 = n1;
-            n1 += 3;
-            n4 = n3;
-            n3 += 3;
-          }
-        }
-        a = dl->parts * dl->nr;
-        v1 = ndata;
-        while (a--) {
-          normalize_v3(v1);
-          v1 += 3;
-        }
-      }
-    }
-  }
-}
-
-void BKE_displist_count(const ListBase *lb, int *totvert, int *totface, int *tottri)
-{
-  LISTBASE_FOREACH (const DispList *, dl, lb) {
-    int vert_tot = 0;
-    int face_tot = 0;
-    int tri_tot = 0;
-    bool cyclic_u = dl->flag & DL_CYCL_U;
-    bool cyclic_v = dl->flag & DL_CYCL_V;
-
-    switch (dl->type) {
-      case DL_SURF: {
-        int segments_u = dl->nr - (cyclic_u == false);
-        int segments_v = dl->parts - (cyclic_v == false);
-        vert_tot = dl->nr * dl->parts;
-        face_tot = segments_u * segments_v;
-        tri_tot = face_tot * 2;
-        break;
-      }
-      case DL_INDEX3: {
-        vert_tot = dl->nr;
-        face_tot = dl->parts;
-        tri_tot = face_tot;
-        break;
-      }
-      case DL_INDEX4: {
-        vert_tot = dl->nr;
-        face_tot = dl->parts;
-        tri_tot = face_tot * 2;
-        break;
-      }
-      case DL_POLY:
-      case DL_SEGM: {
-        vert_tot = dl->nr * dl->parts;
-        break;
-      }
-    }
-
-    *totvert += vert_tot;
-    *totface += face_tot;
-    *tottri += tri_tot;
-  }
-}
-
 bool BKE_displist_surfindex_get(
     const DispList *dl, int a, int *b, int *p1, int *p2, int *p3, int *p4)
 {
@@ -625,27 +509,6 @@ float BKE_displist_calc_taper(
   return displist_calc_taper(depsgraph, scene, taperobj, fac);
 }
 
-void BKE_displist_make_mball(Depsgraph *depsgraph, Scene *scene, Object *ob)
-{
-  if (!ob || ob->type != OB_MBALL) {
-    return;
-  }
-
-  if (ob == BKE_mball_basis_find(scene, ob)) {
-    if (ob->runtime.curve_cache) {
-      BKE_displist_free(&(ob->runtime.curve_cache->disp));
-    }
-    else {
-      ob->runtime.curve_cache = MEM_cnew<CurveCache>(__func__);
-    }
-
-    BKE_mball_polygonize(depsgraph, scene, ob, &ob->runtime.curve_cache->disp);
-    BKE_mball_texspace_calc(ob);
-
-    object_deform_mball(ob, &ob->runtime.curve_cache->disp);
-  }
-}
-
 static ModifierData *curve_get_tessellate_point(const Scene *scene,
                                                 const Object *ob,
                                                 const bool for_render,
@@ -1504,7 +1367,7 @@ void BKE_displist_minmax(const ListBase *dispbase, float min[3], float max[3])
   bool doit = false;
 
   LISTBASE_FOREACH (const DispList *, dl, dispbase) {
-    const int tot = (ELEM(dl->type, DL_INDEX3, DL_INDEX4)) ? dl->nr : dl->nr * dl->parts;
+    const int tot = dl->type == DL_INDEX3 ? dl->nr : dl->nr * dl->parts;
     for (cons

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list