From 83dfade37a746043dfc8d38f57514706d8505352 Mon Sep 17 00:00:00 2001 From: Daniel Genrich Date: Mon, 25 Jan 2010 15:10:14 +0000 Subject: =?UTF-8?q?Smoke:=20The=20well=20known=20Miika=20H=C3=A4m=C3=A4l?= =?UTF-8?q?=C3=A4inen=20(aka=20MiikaH)=20patch=20(http://blenderartists.or?= =?UTF-8?q?g/forum/showthread.php=3Ft=3D158317&page=3D42)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Better (and windows enabled) OpenMP handling (> 2x-5x speed) * More Volumetric Texture mapping options (heat, etc) <-- Matt if that's not to your liking, just revert that part, it's separate anyway * Initial velocity taken from particle settings (no more slow starting) * Option to select compression method (there seem to be a bug in my high compression usage, at least it's been reported to result in exploding smoke - better use low compression for the time being) It's been tested since a while but as usual please report any (new!) bugs. ;-) --- source/blender/render/intern/source/voxeldata.c | 55 ++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 5 deletions(-) (limited to 'source/blender/render') diff --git a/source/blender/render/intern/source/voxeldata.c b/source/blender/render/intern/source/voxeldata.c index 381e6322254..1a220f6e9b1 100644 --- a/source/blender/render/intern/source/voxeldata.c +++ b/source/blender/render/intern/source/voxeldata.c @@ -165,16 +165,61 @@ void init_frame_smoke(Render *re, VoxelData *vd, Tex *tex) if( (md = (ModifierData *)modifiers_findByType(ob, eModifierType_Smoke)) ) { SmokeModifierData *smd = (SmokeModifierData *)md; + if(smd->domain && smd->domain->fluid) { - 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); - } else { + if (vd->smoked_type == TEX_VD_SMOKEHEAT) { + int totRes; + float *heat; + int i; + + VECCOPY(vd->resol, smd->domain->res); + totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + + // scaling heat values from -2.0-2.0 to 0.0-1.0 + vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data"); + + + heat = smoke_get_heat(smd->domain->fluid); + + for (i=0; idataset[i] = (heat[i]+2.0f)/4.0f; + } + + //vd->dataset = smoke_get_heat(smd->domain->fluid); + } + else if (vd->smoked_type == TEX_VD_SMOKEVEL) { + int totRes; + float *xvel, *yvel, *zvel; + int i; + VECCOPY(vd->resol, smd->domain->res); - vd->dataset = smoke_get_density(smd->domain->fluid); + totRes = (vd->resol[0])*(vd->resol[1])*(vd->resol[2]); + + // scaling heat values from -2.0-2.0 to 0.0-1.0 + vd->dataset = MEM_mapallocN(sizeof(float)*(totRes), "smoke data"); + + xvel = smoke_get_velocity_x(smd->domain->fluid); + yvel = smoke_get_velocity_y(smd->domain->fluid); + zvel = smoke_get_velocity_z(smd->domain->fluid); + + for (i=0; idataset[i] = sqrt(xvel[i]*xvel[i] + yvel[i]*yvel[i] + zvel[i]*zvel[i])*3.0f; + } + } + else { + 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); + } else { + VECCOPY(vd->resol, smd->domain->res); + vd->dataset = smoke_get_density(smd->domain->fluid); + } + } // end of fluid condition } } } -- cgit v1.2.3