[Bf-blender-cvs] [4659855b0fa] temp_bmesh_multires: commit multires patch

Joseph Eagar noreply at git.blender.org
Sun Oct 18 00:23:55 CEST 2020


Commit: 4659855b0fa9209d18921c41f4a3826d2d3248e8
Author: Joseph Eagar
Date:   Sat Oct 17 01:24:34 2020 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB4659855b0fa9209d18921c41f4a3826d2d3248e8

commit multires patch

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

M	source/blender/blenkernel/intern/mesh.c
M	source/blender/blenkernel/intern/mesh_mirror.c
M	source/blender/blenkernel/intern/mesh_remesh_voxel.c
M	source/blender/blenkernel/intern/multires.c
M	source/blender/blenkernel/intern/multires_unsubdivide.c
M	source/blender/blenkernel/intern/paint.c
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenkernel/intern/subdiv_ccg.c
M	source/blender/blenkernel/intern/subdiv_displacement_multires.c
M	source/blender/blenkernel/intern/subdiv_eval.c
M	source/blender/bmesh/CMakeLists.txt
M	source/blender/bmesh/bmesh_class.h
M	source/blender/bmesh/intern/bmesh_interp.c
M	source/blender/bmesh/intern/bmesh_mesh.c
M	source/blender/bmesh/intern/bmesh_mesh.h
M	source/blender/bmesh/intern/bmesh_mesh_convert.c
M	source/blender/bmesh/intern/bmesh_mesh_convert.h
M	source/blender/bmesh/intern/bmesh_opdefines.c
M	source/blender/bmesh/operators/bmo_mesh_convert.c
M	source/blender/editors/mesh/editmesh_mask_extract.c
M	source/blender/editors/mesh/editmesh_tools.c
M	source/blender/editors/mesh/editmesh_undo.c
M	source/blender/editors/mesh/editmesh_utils.c
M	source/blender/editors/mesh/mesh_intern.h
M	source/blender/editors/mesh/mesh_ops.c
M	source/blender/editors/sculpt_paint/paint_mask.c
M	source/blender/editors/sculpt_paint/sculpt_dyntopo.c
M	source/blender/editors/sculpt_paint/sculpt_face_set.c
M	source/blender/editors/uvedit/uvedit_unwrap_ops.c
M	source/blender/io/collada/collada_utils.cpp
M	source/blender/modifiers/intern/MOD_bevel.c
M	source/blender/modifiers/intern/MOD_boolean.c
M	source/blender/modifiers/intern/MOD_decimate.c
M	source/blender/modifiers/intern/MOD_edgesplit.c
M	source/blender/modifiers/intern/MOD_particlesystem.c
M	source/blender/modifiers/intern/MOD_triangulate.c
M	source/blender/modifiers/intern/MOD_wireframe.c
M	source/blender/python/bmesh/bmesh_py_types.c

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

diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 9765cd7fa1e..24e800be379 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -1016,6 +1016,7 @@ Mesh *BKE_mesh_copy_for_eval(struct Mesh *source, bool reference)
 }
 
 BMesh *BKE_mesh_to_bmesh_ex(const Mesh *me,
+                            const Object *ob,
                             const struct BMeshCreateParams *create_params,
                             const struct BMeshFromMeshParams *convert_params)
 {
@@ -1023,7 +1024,7 @@ BMesh *BKE_mesh_to_bmesh_ex(const Mesh *me,
   const BMAllocTemplate allocsize = BMALLOC_TEMPLATE_FROM_ME(me);
 
   bm = BM_mesh_create(&allocsize, create_params);
-  BM_mesh_bm_from_me(bm, me, convert_params);
+  BM_mesh_bm_from_me(ob, bm, me, convert_params);
 
   return bm;
 }
@@ -1034,6 +1035,7 @@ BMesh *BKE_mesh_to_bmesh(Mesh *me,
                          const struct BMeshCreateParams *params)
 {
   return BKE_mesh_to_bmesh_ex(me,
+                              ob,
                               params,
                               &(struct BMeshFromMeshParams){
                                   .calc_face_normal = false,
@@ -1049,7 +1051,7 @@ Mesh *BKE_mesh_from_bmesh_nomain(BMesh *bm,
 {
   BLI_assert(params->calc_object_remap == false);
   Mesh *mesh = BKE_id_new_nomain(ID_ME, NULL);
-  BM_mesh_bm_to_me(NULL, bm, mesh, params);
+  BM_mesh_bm_to_me(NULL, NULL, bm, mesh, params);
   BKE_mesh_copy_settings(mesh, me_settings);
   return mesh;
 }
diff --git a/source/blender/blenkernel/intern/mesh_mirror.c b/source/blender/blenkernel/intern/mesh_mirror.c
index 46764a56e60..54b219548f1 100644
--- a/source/blender/blenkernel/intern/mesh_mirror.c
+++ b/source/blender/blenkernel/intern/mesh_mirror.c
@@ -59,6 +59,7 @@ Mesh *BKE_mesh_mirror_bisect_on_mirror_plane(MirrorModifierData *mmd,
   BMVert *v, *v_next;
 
   bm = BKE_mesh_to_bmesh_ex(mesh,
+                            NULL,
                             &(struct BMeshCreateParams){0},
                             &(struct BMeshFromMeshParams){
                                 .calc_face_normal = true,
diff --git a/source/blender/blenkernel/intern/mesh_remesh_voxel.c b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
index e093e3024c3..82f6b1d6c89 100644
--- a/source/blender/blenkernel/intern/mesh_remesh_voxel.c
+++ b/source/blender/blenkernel/intern/mesh_remesh_voxel.c
@@ -443,7 +443,7 @@ struct Mesh *BKE_mesh_remesh_voxel_fix_poles(struct Mesh *mesh)
                           .use_toolflags = true,
                       }));
 
-  BM_mesh_bm_from_me(bm,
+  BM_mesh_bm_from_me(NULL, bm,
                      mesh,
                      (&(struct BMeshFromMeshParams){
                          .calc_face_normal = true,
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index 6e1168d8a16..44a5febd833 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -41,6 +41,7 @@
 #include "BKE_cdderivedmesh.h"
 #include "BKE_editmesh.h"
 #include "BKE_mesh.h"
+#include "BKE_global.h"
 #include "BKE_mesh_mapping.h"
 #include "BKE_mesh_runtime.h"
 #include "BKE_modifier.h"
@@ -49,7 +50,9 @@
 #include "BKE_pbvh.h"
 #include "BKE_scene.h"
 #include "BKE_subdiv_ccg.h"
+#include "BKE_subdiv_eval.h"
 #include "BKE_subsurf.h"
+#include "BKE_subdiv.h"
 
 #include "BKE_object.h"
 
@@ -58,6 +61,8 @@
 #include "DEG_depsgraph_query.h"
 
 #include "multires_reshape.h"
+#include "multires_inline.h"
+#include "bmesh.h"
 
 #include <math.h>
 #include <string.h>
@@ -957,31 +962,16 @@ void multiresModifier_subdivide_legacy(
 static void grid_tangent(const CCGKey *key, int x, int y, int axis, CCGElem *grid, float t[3])
 {
   if (axis == 0) {
-    if (x == key->grid_size - 1) {
-      if (y == key->grid_size - 1) {
-        sub_v3_v3v3(
-            t, CCG_grid_elem_co(key, grid, x, y - 1), CCG_grid_elem_co(key, grid, x - 1, y - 1));
-      }
-      else {
-        sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x - 1, y));
-      }
+    if (x == 0) {
+      sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x+1, y), CCG_grid_elem_co(key, grid, x, y));
+    } else {
+      sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x-1, y));
     }
-    else {
-      sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x + 1, y), CCG_grid_elem_co(key, grid, x, y));
-    }
-  }
-  else if (axis == 1) {
-    if (y == key->grid_size - 1) {
-      if (x == key->grid_size - 1) {
-        sub_v3_v3v3(
-            t, CCG_grid_elem_co(key, grid, x - 1, y), CCG_grid_elem_co(key, grid, x - 1, (y - 1)));
-      }
-      else {
-        sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x, (y - 1)));
-      }
-    }
-    else {
-      sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, (y + 1)), CCG_grid_elem_co(key, grid, x, y));
+  } else if (axis == 1) {
+    if (y == 0) {
+        sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y+1), CCG_grid_elem_co(key, grid, x, y));
+    } else {
+      sub_v3_v3v3(t, CCG_grid_elem_co(key, grid, x, y), CCG_grid_elem_co(key, grid, x, y-1));
     }
   }
 }
@@ -1000,21 +990,336 @@ static void grid_tangent_matrix(float mat[3][3], const CCGKey *key, int x, int y
 
 typedef struct MultiresThreadedData {
   DispOp op;
+  MultiResSpace bmop;
+  BMesh *bm;
+  int lvl;
   CCGElem **gridData, **subGridData;
   CCGKey *key;
   CCGKey *sub_key;
+  Subdiv *sd;
   MPoly *mpoly;
   MDisps *mdisps;
   GridPaintMask *grid_paint_mask;
   int *gridOffset;
+  int cd_mdisps_off;
   int gridSize, dGridSize, dSkip;
   float (*smat)[3];
 } MultiresThreadedData;
 
+static void multires_bmesh_space_set_cb(void *__restrict userdata,
+  const int pidx,
+  const TaskParallelTLS *__restrict UNUSED(tls))
+{
+  MultiresThreadedData *tdata = userdata;
+
+  int cd_mdisps_off = tdata->cd_mdisps_off;
+  BMesh *bm = tdata->bm;
+  MultiResSpace op = tdata->bmop;
+  CCGElem **gridData = tdata->gridData;
+  CCGElem **subGridData = tdata->subGridData;
+  CCGKey *key = tdata->key;
+  BMFace *f = bm->ftable[pidx];
+  MDisps *mdisps = tdata->mdisps;
+  GridPaintMask *grid_paint_mask = tdata->grid_paint_mask;
+  int *gridOffset = tdata->gridOffset;
+  int gridSize = tdata->gridSize;
+  int dGridSize = tdata->dGridSize;
+  int dSkip = tdata->dSkip;
+
+  int S, x, y, gIndex = gridOffset[pidx];
+
+  BMLoop *l = f->l_first;
+  float cent[3];
+  int tot = 0;
+
+  zero_v3(cent);
+
+  do {
+    add_v3_v3(cent, l->v->co);
+    tot++;
+    l = l->next;
+  } while (l != f->l_first);
+
+  mul_v3_fl(cent, 1.0f / (float)tot);
+
+  float simplemat[3][3];
+
+  l = f->l_first;
+  S = 0;
+  do {
+  //for (S = 0; S < numVerts; S++, gIndex++) {
+    
+    GridPaintMask *gpm = grid_paint_mask ? &grid_paint_mask[gIndex] : NULL;
+    MDisps *mdisp = BM_ELEM_CD_GET_VOID_P(l, cd_mdisps_off); //&mdisps[mpoly[pidx].loopstart + S];
+    CCGElem *grid = gridData[gIndex];
+    CCGElem *subgrid = subGridData[gIndex];
+    float(*dispgrid)[3] = NULL;
+
+    dispgrid = mdisp->disps;
+
+    float quad[4][3];
+
+    //copy_v3_v3(quad[0], cent);
+    //interp_v3_v3v3(quad[1], l->v->co, l->next->v->co, 0.5);
+    //copy_v3_v3(quad[2], l->v->co);
+    //interp_v3_v3v3(quad[3], l->v->co, l->prev->v->co, 0.5);
+    float maxlen = len_v3v3(l->v->co, cent)*15.0f;
+    maxlen = MAX2(maxlen, 0.00001f);
+
+    for (y = 0; y < gridSize; y++) {
+      for (x = 0; x < gridSize; x++) {
+        //float *sco = CCG_grid_elem_co(key, grid, x, y);
+        //float *sco = CCG_grid_elem_co(key, subgrid, x, y);
+        float sco[8], udv[3], vdv[3];
+        float *data = dispgrid[dGridSize * y * dSkip + x * dSkip];
+        float mat[3][3], disp[3], d[3], mask;
+        //float baseco[3];
+
+        float grid_u = (float)x / (float)(dGridSize-1);
+        float grid_v = (float)y / (float)(dGridSize-1);
+        float u, v;
+
+        int corner = l->head.index - f->head.index;
+        if (f->len == 4) {
+          BKE_subdiv_rotate_grid_to_quad(corner, grid_u, grid_v, &u, &v);
+          //continue;
+        } else {
+          u = 1.0 - grid_v;
+          v = 1.0 - grid_u;
+        }
+
+        BKE_subdiv_eval_limit_point_and_derivatives(tdata->sd, l->head.index, u, v, sco, udv, vdv);
+        //float tan[3];
+        //grid_tangent(key, x, y, 1, grid, tan);
+
+        //negate_v3(udv);
+
+        //normalize_v3(tan);
+        //normalize_v3(vdv);
+        //printf("%.4f\n", len_v3v3(tan, vdv));
+        //printf("  %.3f %.3f %.3f\n", tan[0], tan[1], tan[2]);
+        //printf("  %.3f %.3f %.3f\n", vdv[0], vdv[1], vdv[2]);
+
+        //negate_v3(udv);
+        //negate_v3(vdv);
+        BKE_multires_construct_tangent_matrix(mat, udv, vdv, corner);
+
+        //BKE_subdiv_eval_limit_point_and_derivatives(subdiv, ptex_face_index, u, v, dummy_P, dPdu, dPdv);
+
+        //interp_bilinear_quad_v3(quad, (float)x/(float)gridSize, (float)y/(float)gridSize, baseco);
+
+        /* construct tangent space matrix */
+        //grid_tangent_matrix(mat, key, x, y, grid);
+
+        //copy_v3_v3(sco, CCG_grid_elem_co(key, grid, x, y));
+
+        //sub_v3_v3(sco, CCG_grid_elem_co(key, grid, x, y));
+        //oprintf("%.3f   %.3f   %.3f\n", sco[0], sco[1], sco[2]);
+        //copy_v3_v3(sco, CCG_grid_elem_co(key, grid, x, y));
+
+        copy_v3_v3(disp, data);
+        
+        switch (op) {
+        case MULTIRES_SPACE_ABSOLUTE:
+          /* Convert displacement to object space
+          * and add to grid points */
+          mul_v3_m3v3(disp, mat, data);
+          add_v3_v3v3(data, disp, sco);
+          break;
+        case MULTIRES_SPACE_TANGENT:
+          /* Calculate displacement between new and old
+          * grid points and convert to tangent space */
+          invert_m3(mat);
+
+          sub_v3_v3v3(disp, data, sco);
+          mul_v3_m3v3(data, mat, disp);
+
+          //float len = len_v3(data);
+          //if (len > maxlen) {
+           // mul_v3_fl(data, maxlen/len);
+          //}
+          break;
+        }
+      }
+    }
+
+    S++;
+    gIndex++;
+    l = l->next;
+  } while (l != f->l_first);
+}
+
+/* XXX WARNING: subsurf elements fro

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list