diff options
-rw-r--r-- | source/blender/blenkernel/BKE_subsurf.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 38 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_multires.c | 27 |
3 files changed, 69 insertions, 2 deletions
diff --git a/source/blender/blenkernel/BKE_subsurf.h b/source/blender/blenkernel/BKE_subsurf.h index 9c0160025a3..10254545d3e 100644 --- a/source/blender/blenkernel/BKE_subsurf.h +++ b/source/blender/blenkernel/BKE_subsurf.h @@ -41,6 +41,7 @@ struct DerivedMesh; struct IndexNode; struct ListBase; struct Mesh; +struct MPoly; struct MultiresSubsurf; struct Object; struct PBVH; @@ -71,6 +72,11 @@ int ccg_gridsize(int level); of this function to convert to grid coordinates at 'high_level' */ int ccg_factor(int low_level, int high_level); +void subsurf_copy_grid_hidden(struct DerivedMesh *dm, + const struct MPoly *mpoly, + struct MVert *mvert, + const struct MDisps *mdisps); + typedef enum MultiresModifiedFlags { /* indicates the grids have been sculpted on, so MDisps have to be updated */ diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index d8fabcbea7a..46c52b76c9e 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -951,6 +951,44 @@ static void ccgDM_getFinalFace(DerivedMesh *dm, int faceNum, MFace *mf) else mf->flag = ME_SMOOTH; } +/* Translate GridHidden into the ME_HIDE flag for MVerts. Assumes + vertices are in the order output by ccgDM_copyFinalVertArray. */ +void subsurf_copy_grid_hidden(DerivedMesh *dm, const MPoly *mpoly, + MVert *mvert, const MDisps *mdisps) +{ + CCGDerivedMesh *ccgdm = (CCGDerivedMesh*)dm; + CCGSubSurf *ss = ccgdm->ss; + int level = ccgSubSurf_getSubdivisionLevels(ss); + int gridSize = ccgSubSurf_getGridSize(ss); + int edgeSize = ccgSubSurf_getEdgeSize(ss); + int totface = ccgSubSurf_getNumFaces(ss); + int i, j, x, y; + + for(i = 0; i < totface; i++) { + CCGFace *f = ccgdm->faceMap[i].face; + + for(j = 0; j < mpoly[i].totloop; j++) { + const MDisps *md = &mdisps[mpoly[i].loopstart + j]; + int hidden_gridsize = ccg_gridsize(md->level); + int factor = ccg_factor(level, md->level); + + if(!md->hidden) + continue; + + for(y = 0; y < gridSize; y++) { + for(x = 0; x < gridSize; x++) { + int vndx, offset; + + vndx = getFaceIndex(ss, f, j, x, y, edgeSize, gridSize); + offset = (y*factor) * hidden_gridsize + (x*factor); + if(BLI_BITMAP_GET(md->hidden, offset)) + mvert[vndx].flag |= ME_HIDE; + } + } + } + } +} + static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm; diff --git a/source/blender/modifiers/intern/MOD_multires.c b/source/blender/modifiers/intern/MOD_multires.c index f983204945a..9a799c6974a 100644 --- a/source/blender/modifiers/intern/MOD_multires.c +++ b/source/blender/modifiers/intern/MOD_multires.c @@ -36,12 +36,14 @@ #include <stddef.h> #include "DNA_mesh_types.h" +#include "DNA_object_types.h" #include "BKE_cdderivedmesh.h" +#include "BKE_mesh.h" #include "BKE_multires.h" #include "BKE_modifier.h" #include "BKE_paint.h" -#include "BKE_particle.h" +#include "BKE_subsurf.h" #include "MOD_util.h" @@ -88,7 +90,28 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *ob, DerivedMesh *dm, return dm; if(useRenderParams || !isFinalCalc) { - DerivedMesh *cddm= CDDM_copy(result); + DerivedMesh *cddm; + + cddm= CDDM_copy(result); + + /* copy hidden flag to vertices */ + if(!useRenderParams) { + struct MDisps *mdisps; + mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS); + if(mdisps) { + subsurf_copy_grid_hidden(result, me->mpoly, + cddm->getVertArray(cddm), + mdisps); + + mesh_flush_hidden_from_verts(cddm->getVertArray(cddm), + cddm->getLoopArray(cddm), + cddm->getEdgeArray(cddm), + cddm->getNumEdges(cddm), + cddm->getPolyArray(cddm), + cddm->getNumPolys(cddm)); + } + } + result->release(result); result= cddm; } |