Revision: 37179
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37179
Author:   jwilkins
Date:     2011-06-04 16:04:31 +0000 (Sat, 04 Jun 2011)
Log Message:
-----------
Revision: 29779
Author: nicholasbishop
Date: 4:12:32 PM, Monday, June 28, 2010
Message:
Multires+mask bugfixes:

* Crash when changing modes from sculptmode
* Crash when adding multires modifier on a mesh that already has paintmask 
layers
* Smooth brush eating holes in a mesh without a paintmask layer

Modified Paths:
--------------
    branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/sculpt.c

Property Changed:
----------------
    branches/soc-2011-onion/


Property changes on: branches/soc-2011-onion
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/soc-2010-jwilkins:28499-37009
/branches/soc-2010-nicolasbishop:28448-29585,29596,29662-29663
/trunk/blender:36833-37054
   + /branches/soc-2010-jwilkins:28499-37009
/branches/soc-2010-nicolasbishop:28448-29585,29596,29662-29663,29779
/trunk/blender:36833-37054

Modified: branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c
===================================================================
--- branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c 
2011-06-04 15:58:25 UTC (rev 37178)
+++ branches/soc-2011-onion/source/blender/blenkernel/intern/multires.c 
2011-06-04 16:04:31 UTC (rev 37179)
@@ -321,7 +321,7 @@
        }
 }
 
-static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, int lvl)
+static void multires_reallocate_mdisps(Mesh *me, MDisps *mdisps, GridKey 
*gridkey, int lvl)
 {
        int i;
 
@@ -334,6 +334,7 @@
        for(i = 0; i < me->totface; ++i) {
                int nvert = (me->mface[i].v4)? 4: 3;
                int totelem = multires_grid_tot[lvl]*nvert;
+               int pmask_totlayer;
                CustomData old, *cd = cd_facegrids + i;
 
                /* Resize all existing layers */
@@ -342,6 +343,16 @@
                CustomData_copy(&old, cd, ~0, CD_CALLOC, totelem);
                CustomData_free(&old, 0);
                CustomData_set_num_grid_elements(cd, totelem);
+
+               /* If multires modifier is added after mask layers were
+                  created, update the grids to have those layers as well */
+               if(gridkey) {
+                       pmask_totlayer = CustomData_number_of_layers(cd, 
CD_PAINTMASK);
+                       while(pmask_totlayer < gridkey->mask) {
+                               CustomData_add_layer(cd, CD_PAINTMASK, 
CD_CALLOC, NULL, totelem);
+                               ++pmask_totlayer;
+                       }
+               }
        }
 
        /* This will be replaced when we do CD_DISPS */
@@ -707,7 +718,7 @@
                ccgSubSurf_updateLevels(ss, lvl, NULL, 0);
 
                /* reallocate displacements */
-               multires_reallocate_mdisps(me, mdisps, totlvl); 
+               multires_reallocate_mdisps(me, mdisps, NULL, totlvl); 
 
                /* compute displacements */
                multiresModifier_disp_run(highdm, me, CALC_DISPS, subGridData, 
totlvl);
@@ -720,7 +731,7 @@
        }
        else {
                /* only reallocate, nothing to upsample */
-               multires_reallocate_mdisps(me, mdisps, totlvl); 
+               multires_reallocate_mdisps(me, mdisps, NULL, totlvl); 
        }
 
        multires_set_tot_level(ob, mmd, totlvl);
@@ -814,16 +825,21 @@
                MDisps *mdisp = &mdisps[i];
                int S, x, y, j, gIndex = gridOffset[i];
 
-               /* when adding new faces in edit mode, need to allocate disps */
-               if(!mdisp->disps)
+               /* when adding new faces in edit mode, need to allocate disps;
+                  may need to allocate paintmask storage after adding multires 
as well */
+               if(!mdisp->disps ||
+                  (gridkey->mask && 
+                   (!stored_grids ||
+                    CustomData_number_of_layers(&stored_grids[i], 
CD_PAINTMASK) != gridkey->mask)))
                #pragma omp critical
                {
-                       multires_reallocate_mdisps(me, mdisps, totlvl);
+                       multires_reallocate_mdisps(me, mdisps, gridkey, totlvl);
                }
 
                /* Check masks */
-               assert(stored_grids);
-               assert(CustomData_number_of_layers(&stored_grids[i], 
CD_PAINTMASK) == gridkey->mask);
+               assert(gridkey->mask == 0 || stored_grids);
+               if(stored_grids)
+                       assert(CustomData_number_of_layers(&stored_grids[i], 
CD_PAINTMASK) == gridkey->mask);
 
                for(S = 0; S < numVerts; ++S, ++gIndex) {
                        DMGridData *grid = gridData[gIndex];

Modified: branches/soc-2011-onion/source/blender/editors/sculpt_paint/sculpt.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/sculpt_paint/sculpt.c        
2011-06-04 15:58:25 UTC (rev 37178)
+++ branches/soc-2011-onion/source/blender/editors/sculpt_paint/sculpt.c        
2011-06-04 16:04:31 UTC (rev 37179)
@@ -1313,7 +1313,9 @@
                                fno= GRIDELEM_NO_AT(data, index, gridkey);
 
                                if(sculpt_brush_test(&test, co)) {
-                                       const float fade = 
bstrength*tex_strength(ss, brush, co, *GRIDELEM_MASK_AT(data, x + y*gridsize, 
gridkey), test.dist)*frontface(brush, ss->cache->frontface_start, 
ss->cache->frontface_range, ss->cache->view_normal, origno[k]);
+                                       float mask = (gridkey->mask ?
+                                                     *GRIDELEM_MASK_AT(data, x 
+ y*gridsize, gridkey) : 0);
+                                       float fade = bstrength*tex_strength(ss, 
brush, co, mask, test.dist)*frontface(brush, ss->cache->frontface_start, 
ss->cache->frontface_range, ss->cache->view_normal, origno[k]);
                                        float *avg, val[3];
                                        float n;
 

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to