[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