[Bf-blender-cvs] [23509c6ca5b] temp-modifier-rm-cddm: Mesh deformation seems to be working
Sybren A. Stüvel
noreply at git.blender.org
Thu Apr 19 17:23:57 CEST 2018
Commit: 23509c6ca5b77164c1b466f8841d85c954a20f92
Author: Sybren A. Stüvel
Date: Thu Apr 19 17:20:25 2018 +0200
Branches: temp-modifier-rm-cddm
https://developer.blender.org/rB23509c6ca5b77164c1b466f8841d85c954a20f92
Mesh deformation seems to be working
===================================================================
M source/blender/blenkernel/BKE_mesh.h
M source/blender/blenkernel/intern/DerivedMesh.c
M source/blender/blenkernel/intern/mesh.c
M source/blender/blenkernel/intern/modifier.c
M source/blender/draw/intern/draw_cache_impl_mesh.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_mesh.h b/source/blender/blenkernel/BKE_mesh.h
index e2265ae855e..9f92248ec16 100644
--- a/source/blender/blenkernel/BKE_mesh.h
+++ b/source/blender/blenkernel/BKE_mesh.h
@@ -93,6 +93,9 @@ struct Mesh *BKE_mesh_copy(struct Main *bmain, const struct Mesh *me);
void BKE_mesh_update_customdata_pointers(struct Mesh *me, const bool do_ensure_tess_cd);
void BKE_mesh_ensure_skin_customdata(struct Mesh *me);
+bool BKE_mesh_ensure_edit_data(struct Mesh *me);
+bool BKE_mesh_clear_edit_data(struct Mesh *me);
+
bool BKE_mesh_ensure_facemap_customdata(struct Mesh *me);
bool BKE_mesh_clear_facemap_customdata(struct Mesh *me);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index a9def663940..c86950d82cb 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -2470,6 +2470,12 @@ static void editbmesh_calc_modifiers(
*r_cage = dm;
}
else {
+ struct Mesh *mesh = ob->data;
+ if (mesh->id.tag & LIB_TAG_COPY_ON_WRITE) {
+ BKE_mesh_ensure_edit_data(mesh);
+ printf("Saving cage deformed verts in CoW mesh %p\n", mesh);
+ mesh->emd->vertexCos = MEM_dupallocN(deformedVerts);
+ }
*r_cage = getEditDerivedBMesh(
em, ob, mask,
deformedVerts ? MEM_dupallocN(deformedVerts) : NULL);
@@ -2507,6 +2513,12 @@ static void editbmesh_calc_modifiers(
}
else {
/* this is just a copy of the editmesh, no need to calc normals */
+ struct Mesh *mesh = ob->data;
+ if (mesh->id.tag & LIB_TAG_COPY_ON_WRITE) {
+ BKE_mesh_ensure_edit_data(mesh);
+ mesh->emd->vertexCos = MEM_dupallocN(deformedVerts);
+ printf("Saving final deformed verts in CoW mesh %p\n", mesh);
+ }
*r_final = getEditDerivedBMesh(em, ob, dataMask, deformedVerts);
deformedVerts = NULL;
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index bb3720341dc..5e58d69703c 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -388,6 +388,32 @@ void BKE_mesh_ensure_skin_customdata(Mesh *me)
}
}
+bool BKE_mesh_ensure_edit_data(struct Mesh *me)
+{
+ if (me->emd != NULL) {
+ return false;
+ }
+
+ me->emd = MEM_callocN(sizeof(EditMeshData), "EditMeshData");
+ return true;
+}
+
+bool BKE_mesh_clear_edit_data(struct Mesh *me)
+{
+ if (me->emd == NULL) {
+ return false;
+ }
+
+ MEM_SAFE_FREE(me->emd->polyCos);
+ MEM_SAFE_FREE(me->emd->polyNos);
+ MEM_SAFE_FREE(me->emd->vertexCos);
+ MEM_SAFE_FREE(me->emd->vertexNos);
+ MEM_SAFE_FREE(me->emd);
+ BLI_assert(me->emd == NULL);
+ return true;
+}
+
+
bool BKE_mesh_ensure_facemap_customdata(struct Mesh *me)
{
BMesh *bm = me->edit_btmesh ? me->edit_btmesh->bm : NULL;
@@ -481,6 +507,7 @@ void BKE_mesh_free(Mesh *me)
BKE_animdata_free(&me->id, false);
BKE_mesh_batch_cache_free(me);
+ BKE_mesh_clear_edit_data(me);
CustomData_free(&me->vdata, me->totvert);
CustomData_free(&me->edata, me->totedge);
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 02a0c27da3c..bab9a6d5e70 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -986,15 +986,18 @@ void modifier_deformVerts_DM_deprecated(struct ModifierData *md, struct Depsgrap
}
else {
struct Mesh *mesh = ob->data;
- BLI_assert(BLI_findindex(&G.main->mesh, mesh) == -1); /* This should be a CoW mesh */
-
+ BLI_assert(DEG_depsgraph_use_copy_on_write());
+// BLI_assert(mesh->id.tag & LIB_TAG_COPY_ON_WRITE); /* This should be a CoW mesh */
+ printf("modifier_deformVerts_DM_deprecated(%s)\n", md->name);
+ if ((mesh->id.tag & LIB_TAG_COPY_ON_WRITE) == 0) {
+ printf(" WARNING, operating on real Mesh %s = %p\n", mesh->id.name, mesh);
+ }
if (dm != NULL) {
+ BKE_mesh_free(mesh);
DM_to_mesh(dm, mesh, ob, CD_MASK_EVERYTHING, false);
}
- BLI_assert(mesh->emd == NULL);
mti->deformVerts(md, depsgraph, ob, mesh, vertexCos, numVerts, flag);
-// BLI_assert(mesh->emd == NULL);
}
}
@@ -1031,13 +1034,18 @@ void modifier_deformVertsEM_DM_deprecated(struct ModifierData *md, struct Depsgr
}
else {
struct Mesh *mesh = ob->data;
- BLI_assert(BLI_findindex(&G.main->mesh, mesh) == -1); /* This should be a CoW mesh */
+ printf("modifier_deformVertsEM_DM_deprecated(%s)\n", md->name);
+ BLI_assert(DEG_depsgraph_use_copy_on_write());
+// BLI_assert(mesh->id.tag & LIB_TAG_COPY_ON_WRITE); /* This should be a CoW mesh */
+ if ((mesh->id.tag & LIB_TAG_COPY_ON_WRITE) == 0) {
+ printf(" WARNING, operating on real Mesh %s = %p\n", mesh->id.name, mesh);
+ }
if (dm != NULL) {
+ BKE_mesh_free(mesh);
DM_to_mesh(dm, mesh, ob, CD_MASK_EVERYTHING, false);
}
- BLI_assert(mesh->emd == NULL);
mti->deformVertsEM(md, depsgraph, ob, editData, mesh, vertexCos, numVerts);
}
}
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c
index bad860967ef..6f44e7afc83 100644
--- a/source/blender/draw/intern/draw_cache_impl_mesh.c
+++ b/source/blender/draw/intern/draw_cache_impl_mesh.c
@@ -128,6 +128,8 @@ typedef struct MeshRenderData {
int loose_edge_len;
BMEditMesh *edit_bmesh;
+ struct EditMeshData *edit_data;
+
MVert *mvert;
MEdge *medge;
MLoop *mloop;
@@ -389,6 +391,7 @@ static MeshRenderData *mesh_render_data_create_ex(
BMesh *bm = embm->bm;
rdata->edit_bmesh = embm;
+ rdata->edit_data = me->emd;
int bm_ensure_types = 0;
if (types & (MR_DATATYPE_VERT)) {
@@ -426,6 +429,9 @@ static MeshRenderData *mesh_render_data_create_ex(
if (types & (MR_DATATYPE_DVERT)) {
bm_ensure_types |= BM_VERT;
}
+ if (rdata->edit_data != NULL) {
+ bm_ensure_types |= BM_VERT;
+ }
BM_mesh_elem_index_ensure(bm, bm_ensure_types);
BM_mesh_elem_table_ensure(bm, bm_ensure_types & ~BM_LOOP);
@@ -1359,9 +1365,19 @@ static void add_overlay_tri(
unsigned char vflag;
if (vbo_pos) {
- for (uint i = 0; i < 3; i++) {
- const float *pos = bm_looptri[i]->v->co;
- GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ for (uint i = 0; i < 3; i++) {
+ int vidx = BM_elem_index_get(bm_looptri[i]->v);
+ const float *pos = rdata->edit_data->vertexCos[vidx];
+ GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+ else {
+ for (uint i = 0; i < 3; i++) {
+ const float *pos = bm_looptri[i]->v->co;
+ GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
}
}
@@ -1399,9 +1415,19 @@ static void add_overlay_loose_edge(
const BMEdge *eed, const int base_vert_idx)
{
if (vbo_pos) {
- for (int i = 0; i < 2; ++i) {
- const float *pos = (&eed->v1)[i]->co;
- GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ for (uint i = 0; i < 2; i++) {
+ int vidx = BM_elem_index_get((&eed->v1)[i]);
+ const float *pos = rdata->edit_data->vertexCos[vidx];
+ GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
+ }
+ else {
+ for (int i = 0; i < 2; ++i) {
+ const float *pos = (&eed->v1)[i]->co;
+ GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx + i, pos);
+ }
}
}
@@ -1428,8 +1454,16 @@ static void add_overlay_loose_vert(
const BMVert *eve, const int base_vert_idx)
{
if (vbo_pos) {
- const float *pos = eve->co;
- GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ int vidx = BM_elem_index_get(eve);
+ const float *pos = rdata->edit_data->vertexCos[vidx];
+ GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+ }
+ else {
+ const float *pos = eve->co;
+ GWN_vertbuf_attr_set(vbo_pos, pos_id, base_vert_idx, pos);
+ }
}
if (vbo_nor) {
@@ -2095,8 +2129,18 @@ static Gwn_VertBuf *mesh_batch_cache_get_tri_pos_and_normals_ex(
}
}
- for (uint t = 0; t < 3; t++) {
- copy_v3_v3(GWN_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+ /* TODO(sybren): deduplicate this and all the other places it's pasted to in this file. */
+ if (rdata->edit_data && rdata->edit_data->vertexCos) {
+ for (uint t = 0; t < 3; t++) {
+ int vidx = BM_elem_index_get(bm_looptri[t]->v);
+ const float *pos = rdata->edit_data->vertexCos[vidx];
+ copy_v3_v3(GWN_vertbuf_raw_step(&pos_step), pos);
+ }
+ }
+ else {
+ for (uint t = 0; t < 3; t++) {
+ copy_v3_v3(GWN_vertbuf_raw_step(&pos_step), bm_looptri[t]->v->co);
+ }
}
}
}
More information about the Bf-blender-cvs
mailing list