diff options
author | Daniel Genrich <daniel.genrich@gmx.net> | 2010-01-25 18:10:14 +0300 |
---|---|---|
committer | Daniel Genrich <daniel.genrich@gmx.net> | 2010-01-25 18:10:14 +0300 |
commit | 83dfade37a746043dfc8d38f57514706d8505352 (patch) | |
tree | 71d291a00799e67ecc6d39a5c5fc2117037a1328 /source/blender/render | |
parent | 4b71eaa4d14af6f43c15f97d8bf70506afad724b (diff) |
Smoke: The well known Miika Hämäläinen (aka MiikaH) patch (http://blenderartists.org/forum/showthread.php?t=158317&page=42)
* 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. ;-)
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/source/voxeldata.c | 55 |
1 files changed, 50 insertions, 5 deletions
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; i<totRes; i++) + { + vd->dataset[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; i<totRes; i++) + { + vd->dataset[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 } } } |