[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44870] trunk/blender/source/blender: Copy hidden flag to vertices when applying multires modifier.
Nicholas Bishop
nicholasbishop at gmail.com
Wed Mar 14 07:32:14 CET 2012
Revision: 44870
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44870
Author: nicholasbishop
Date: 2012-03-14 06:32:13 +0000 (Wed, 14 Mar 2012)
Log Message:
-----------
Copy hidden flag to vertices when applying multires modifier.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_subsurf.h
trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
trunk/blender/source/blender/modifiers/intern/MOD_multires.c
Modified: trunk/blender/source/blender/blenkernel/BKE_subsurf.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_subsurf.h 2012-03-14 06:32:03 UTC (rev 44869)
+++ trunk/blender/source/blender/blenkernel/BKE_subsurf.h 2012-03-14 06:32:13 UTC (rev 44870)
@@ -41,6 +41,7 @@
struct IndexNode;
struct ListBase;
struct Mesh;
+struct MPoly;
struct MultiresSubsurf;
struct Object;
struct PBVH;
@@ -71,6 +72,11 @@
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 */
Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c 2012-03-14 06:32:03 UTC (rev 44869)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c 2012-03-14 06:32:13 UTC (rev 44870)
@@ -951,6 +951,44 @@
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;
Modified: trunk/blender/source/blender/modifiers/intern/MOD_multires.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_multires.c 2012-03-14 06:32:03 UTC (rev 44869)
+++ trunk/blender/source/blender/modifiers/intern/MOD_multires.c 2012-03-14 06:32:13 UTC (rev 44870)
@@ -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 @@
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;
}
More information about the Bf-blender-cvs
mailing list