diff options
author | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-05-11 00:34:23 +0400 |
---|---|---|
committer | Nicholas Bishop <nicholasbishop@gmail.com> | 2012-05-11 00:34:23 +0400 |
commit | 0f57b0f1e514c8f13f2fcfeb71c6291640f88794 (patch) | |
tree | 9a8538f463a31b82a1b3639f74bb526645390d6c /source/blender/blenkernel/intern/subsurf_ccg.c | |
parent | f4929ad609727354bb6356aef788e8f2fa92d341 (diff) |
Copy GridPaintMask to vertex paint mask when applying multires.
Adds new subsurf_copy_grid_paint_mask() function similar to
subsurf_copy_grid_hidden().
Diffstat (limited to 'source/blender/blenkernel/intern/subsurf_ccg.c')
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index c6b3a8d3aba..3d5bc6051c5 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -1047,6 +1047,45 @@ void subsurf_copy_grid_hidden(DerivedMesh *dm, const MPoly *mpoly, } } +/* Translate GridPaintMask into vertex paint masks. Assumes vertices + are in the order output by ccgDM_copyFinalVertArray. */ +void subsurf_copy_grid_paint_mask(DerivedMesh *dm, const MPoly *mpoly, + float *paint_mask, + const GridPaintMask *grid_paint_mask) +{ + 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, factor, gpm_gridsize; + + for(i = 0; i < totface; i++) { + CCGFace *f = ccgdm->faceMap[i].face; + const MPoly *p = &mpoly[i]; + + for(j = 0; j < p->totloop; j++) { + const GridPaintMask *gpm = &grid_paint_mask[p->loopstart + j]; + if(!gpm->data) + continue; + + factor = ccg_factor(level, gpm->level); + gpm_gridsize = ccg_gridsize(gpm->level); + + 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 * gpm_gridsize + x*factor; + paint_mask[vndx] = gpm->data[offset]; + } + } + } + } +} + static void ccgDM_copyFinalVertArray(DerivedMesh *dm, MVert *mvert) { CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm; |