[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32835] trunk/blender/source/blender/ blenkernel/intern/multires.c: Fix #24485: Applying scale to multires object end up in a blender crash

Sergey Sharybin g.ulairi at gmail.com
Tue Nov 2 11:55:50 CET 2010


Revision: 32835
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32835
Author:   nazgul
Date:     2010-11-02 11:55:49 +0100 (Tue, 02 Nov 2010)

Log Message:
-----------
Fix #24485: Applying scale to multires object end up in a blender crash

Fixed multires_apply_smat to work properly with different current and
total subdivision levels.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/multires.c

Modified: trunk/blender/source/blender/blenkernel/intern/multires.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/multires.c	2010-11-02 09:34:32 UTC (rev 32834)
+++ trunk/blender/source/blender/blenkernel/intern/multires.c	2010-11-02 10:55:49 UTC (rev 32835)
@@ -1471,15 +1471,19 @@
 	int i, numGrids, gridSize, dGridSize, dSkip, totvert;
 	float (*vertCos)[3] = NULL;
 	MultiresModifierData *mmd= get_multires_modifier(scene, ob);
+	MultiresModifierData high_mmd;
 
 	CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
 	mdisps= CustomData_get_layer(&me->fdata, CD_MDISPS);
 
 	if(!mdisps || !mmd) return;
 
+	/* we need derived mesh created from highest resolution */
+	high_mmd= *mmd;
+	high_mmd.lvl= high_mmd.totlvl;
 
 	/* unscaled multires with applied displacement */
-	subdm= get_multires_dm(scene, mmd, ob);
+	subdm= get_multires_dm(scene, &high_mmd, ob);
 
 	/* prepare scaled CDDM to create ccgDN */
 	cddm= mesh_get_derived_deform(scene, ob, CD_MASK_BAREMESH);
@@ -1495,7 +1499,7 @@
 	mvert= cddm->getVertArray(cddm);
 
 	/* scaled ccgDM for tangent space of object with applied scale */
-	dm= subsurf_dm_create_local(ob, cddm, mmd->totlvl, mmd->simple, 0);
+	dm= subsurf_dm_create_local(ob, cddm, high_mmd.totlvl, high_mmd.simple, 0);
 	cddm->release(cddm);
 
 	numGrids= dm->getNumGrids(dm);
@@ -1504,7 +1508,7 @@
 	gridOffset= dm->getGridOffset(dm);
 	subGridData= subdm->getGridData(subdm);
 
-	dGridSize= multires_side_tot[mmd->totlvl];
+	dGridSize= multires_side_tot[high_mmd.totlvl];
 	dSkip= (dGridSize-1)/(gridSize-1);
 
 	#pragma omp parallel for private(i) if(me->totface*gridSize*gridSize*4 >= CCG_OMP_LIMIT)





More information about the Bf-blender-cvs mailing list