[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