[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33015] trunk/blender/source/blender: Bug fix: memoryleak when using smoke heat/velocity data as texture

Janne Karhu jhkarh at gmail.com
Thu Nov 11 18:03:10 CET 2010


Revision: 33015
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33015
Author:   jhk
Date:     2010-11-11 18:03:09 +0100 (Thu, 11 Nov 2010)

Log Message:
-----------
Bug fix: memoryleak when using smoke heat/velocity data as texture
* In addition to fixing the memleak it's much better to always copy the voxeldata to the texture. Smoke data can change at any time due to some changes, so we can't depend on that data.
* Thanks to MiikaH for finding this!

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/texture.c
    trunk/blender/source/blender/render/intern/source/voxeldata.c

Modified: trunk/blender/source/blender/blenkernel/intern/texture.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/texture.c	2010-11-11 16:50:04 UTC (rev 33014)
+++ trunk/blender/source/blender/blenkernel/intern/texture.c	2010-11-11 17:03:09 UTC (rev 33015)
@@ -1286,8 +1286,7 @@
 void BKE_free_voxeldatadata(struct VoxelData *vd)
 {
 	if (vd->dataset) {
-		if(vd->file_format != TEX_VD_SMOKE)
-			MEM_freeN(vd->dataset);
+		MEM_freeN(vd->dataset);
 		vd->dataset = NULL;
 	}
 

Modified: trunk/blender/source/blender/render/intern/source/voxeldata.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/voxeldata.c	2010-11-11 16:50:04 UTC (rev 33014)
+++ trunk/blender/source/blender/render/intern/source/voxeldata.c	2010-11-11 17:03:09 UTC (rev 33015)
@@ -238,13 +238,22 @@
 
 			}
 			else {
+				int totRes;
+				float *density;
+
 				if (smd->domain->flags & MOD_SMOKE_HIGHRES) {
 					smoke_turbulence_get_res(smd->domain->wt, vd->resol);
-					vd->dataset = smoke_turbulence_get_density(smd->domain->wt);
+					density = smoke_turbulence_get_density(smd->domain->wt);
 				} else {
 					VECCOPY(vd->resol, smd->domain->res);
-					vd->dataset = smoke_get_density(smd->domain->fluid);
+					density = smoke_get_density(smd->domain->fluid);
 				}
+
+				totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]);
+
+				/* always store copy, as smoke internal data can change */
+				vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data");
+				memcpy(vd->dataset, density, sizeof(float)*totRes);
 			} // end of fluid condition
 		}
 	}
@@ -267,8 +276,7 @@
 	
 	/* clear out old cache, ready for new */
 	if (vd->dataset) {
-		if(vd->file_format != TEX_VD_SMOKE)
-			MEM_freeN(vd->dataset);
+		MEM_freeN(vd->dataset);
 		vd->dataset = NULL;
 	}
 





More information about the Bf-blender-cvs mailing list