Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-04-16 15:03:42 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-04-16 15:03:42 +0400
commit34814e47558febd42f56b2ec38c4cb8954eb5dad (patch)
tree442bdf47dffecda7cfc145a8b734ca564103d349 /source
parent5c646e7e3a48c7fea0bfea407d3d27df0b1aa02b (diff)
Port multires_topology_changed to new bmesh api
This call is still needed when loading editmesh because some operations are not creating CD layer for new loops (like crating new face) and to prevent loosing all sculpted data when running disps correct displacement maps should be allocated on loading edit mesh.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_multires.h2
-rw-r--r--source/blender/blenkernel/intern/multires.c48
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.c4
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c1
4 files changed, 19 insertions, 36 deletions
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 69482706da6..bc34b0131bf 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -99,7 +99,7 @@ void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struc
int multires_mdisp_corners(struct MDisps *s);
/* update multires data after topology changing */
-void multires_topology_changed(struct Scene *scene, struct Object *ob);
+void multires_topology_changed(struct Mesh *me);
/**** interpolation stuff ****/
void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index d8117aa1344..2167495ef08 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -2166,58 +2166,38 @@ void multiresModifier_prepare_join(Scene *scene, Object *ob, Object *to_ob)
}
/* update multires data after topology changing */
-#if 0 // BMESH_TODO
-void multires_topology_changed(Scene *scene, Object *ob)
+void multires_topology_changed(Mesh *me)
{
- Mesh *me= (Mesh*)ob->data;
- MDisps *mdisp= NULL, *cur= NULL;
- int i, grid= 0, corners;
- MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
-
- if (mmd)
- multires_set_tot_mdisps(me, mmd->totlvl);
+ MDisps *mdisp = NULL, *cur = NULL;
+ int i, grid = 0;
- CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
- mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
+ CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
- if (!mdisp) return;
+ if (!mdisp)
+ return;
- cur= mdisp;
- for (i = 0; i < me->totface; i++, cur++) {
- if (mdisp->totdisp) {
- corners= multires_mdisp_corners(mdisp);
- grid= mdisp->totdisp / corners;
+ cur = mdisp;
+ for (i = 0; i < me->totloop; i++, cur++) {
+ if (cur->totdisp) {
+ grid = mdisp->totdisp;
break;
}
}
- for (i = 0; i < me->totface; i++, mdisp++) {
- int nvert= me->mface[i].v4 ? 4 : 3;
-
+ for (i = 0; i < me->totloop; i++, mdisp++) {
/* allocate memory for mdisp, the whole disp layer would be erased otherwise */
if (!mdisp->totdisp || !mdisp->disps) {
if (grid) {
- mdisp->totdisp= nvert*grid;
- mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+ mdisp->totdisp = grid;
+ mdisp->disps = MEM_callocN(3 * mdisp->totdisp * sizeof(float), "mdisp topology");
}
continue;
}
-
- corners= multires_mdisp_corners(mdisp);
-
- if (corners!=nvert) {
- mdisp->totdisp= (mdisp->totdisp/corners)*nvert;
-
- if (mdisp->disps)
- MEM_freeN(mdisp->disps);
-
- mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
- }
}
}
-#endif // BMESH_TODO
/***************** Multires interpolation stuff *****************/
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index 2be9d4c7490..c8876e55431 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -89,6 +89,7 @@
#include "BKE_mesh.h"
#include "BKE_customdata.h"
+#include "BKE_multires.h"
#include "BKE_global.h" /* ugh - for looping over all objects */
#include "BKE_main.h"
@@ -854,4 +855,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
}
if (oldverts) MEM_freeN(oldverts);
+
+ /* topology could be changed, ensure mdisps are ok */
+ multires_topology_changed(me);
}
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index 12601d51b01..6511cc713e3 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -313,7 +313,6 @@ void EDBM_mesh_load(Object *ob)
#ifdef USE_TESSFACE_DEFAULT
BKE_mesh_tessface_calc(me);
#endif
-
}
void EDBM_mesh_free(BMEditMesh *tm)