Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Genrich <daniel.genrich@gmx.net>2009-08-26 03:39:49 +0400
committerDaniel Genrich <daniel.genrich@gmx.net>2009-08-26 03:39:49 +0400
commit3f5a2a11944a2e983d62babe8bb02b03e14c805d (patch)
treeb39ac059564ec9ff9514d08190faa137335845f4 /source/blender/blenkernel/intern/smoke.c
parentc4a1c8fbeb86396788866d6dc3eb1b5b5dc3f67d (diff)
Smoke:
*Bugfix for crash on using a plane as smoke domain (reported by DingTo) * Bringing slowly high res back, not yet working
Diffstat (limited to 'source/blender/blenkernel/intern/smoke.c')
-rw-r--r--source/blender/blenkernel/intern/smoke.c65
1 files changed, 44 insertions, 21 deletions
diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c
index 28d1c264376..cd9679be486 100644
--- a/source/blender/blenkernel/intern/smoke.c
+++ b/source/blender/blenkernel/intern/smoke.c
@@ -166,6 +166,10 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
// calc other res with max_res provided
VECSUB(size, max, min);
+
+ if((size[0] < FLT_EPSILON) || (size[1] < FLT_EPSILON) || (size[2] < FLT_EPSILON))
+ return 0;
+
if(size[0] > size[1])
{
if(size[0] > size[1])
@@ -213,13 +217,11 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
smd->time = scene->r.cfra;
smd->domain->firstframe = smd->time;
- /*
- if(!smd->domain->wt)
+ if(!smd->domain->wt && (smd->domain->flags & MOD_SMOKE_HIGHRES))
{
- smd->domain->wt = smoke_turbulence_init(sds->res, smd->domain->amplify + 1, smd->domain->noise);
+ smd->domain->wt = smoke_turbulence_init(smd->domain->res, smd->domain->amplify + 1, smd->domain->noise);
smoke_turbulence_initBlenderRNA(smd->domain->wt, &smd->domain->strength);
}
- */
if(!smd->domain->view3d)
{
@@ -409,10 +411,10 @@ int smokeModifier_init (SmokeModifierData *smd, Object *ob, Scene *scene, Derive
{
smd->coll->bvhtree = NULL; // bvhtree_build_from_smoke ( ob->obmat, dm->getFaceArray(dm), dm->getNumFaces(dm), dm->getVertArray(dm), dm->getNumVerts(dm), 0.0 );
}
-
+ return 1;
}
- return 0;
+ return 1;
}
/*! init triangle divisions */
@@ -529,8 +531,10 @@ void smokeModifier_freeDomain(SmokeModifierData *smd)
if(smd->domain->wt)
smoke_turbulence_free(smd->domain->wt);
- BKE_ptcache_free_list(&smd->domain->ptcaches);
- smd->domain->point_cache = NULL;
+ BKE_ptcache_free_list(&(smd->domain->ptcaches[0]));
+ smd->domain->point_cache[0] = NULL;
+ BKE_ptcache_free_list(&(smd->domain->ptcaches[1]));
+ smd->domain->point_cache[1] = NULL;
MEM_freeN(smd->domain);
smd->domain = NULL;
@@ -603,10 +607,15 @@ void smokeModifier_reset(struct SmokeModifierData *smd)
smd->domain->wt = NULL;
}
- smd->domain->point_cache->flag &= ~PTCACHE_SIMULATION_VALID;
- smd->domain->point_cache->flag |= PTCACHE_OUTDATED;
- smd->domain->point_cache->simframe= 0;
- smd->domain->point_cache->last_exact= 0;
+ smd->domain->point_cache[0]->flag &= ~PTCACHE_SIMULATION_VALID;
+ smd->domain->point_cache[0]->flag |= PTCACHE_OUTDATED;
+ smd->domain->point_cache[0]->simframe= 0;
+ smd->domain->point_cache[0]->last_exact= 0;
+
+ smd->domain->point_cache[1]->flag &= ~PTCACHE_SIMULATION_VALID;
+ smd->domain->point_cache[1]->flag |= PTCACHE_OUTDATED;
+ smd->domain->point_cache[1]->simframe= 0;
+ smd->domain->point_cache[1]->last_exact= 0;
// printf("reset_domain\n");
}
@@ -666,9 +675,13 @@ void smokeModifier_createType(struct SmokeModifierData *smd)
smd->domain->smd = smd;
- smd->domain->point_cache = BKE_ptcache_add(&smd->domain->ptcaches);
- smd->domain->point_cache->flag |= PTCACHE_DISK_CACHE;
- smd->domain->point_cache->step = 1;
+ smd->domain->point_cache[0] = BKE_ptcache_add(&(smd->domain->ptcaches[0]));
+ smd->domain->point_cache[0]->flag |= PTCACHE_DISK_CACHE;
+ smd->domain->point_cache[0]->step = 1;
+
+ smd->domain->point_cache[1] = BKE_ptcache_add(&(smd->domain->ptcaches[1]));
+ smd->domain->point_cache[1]->flag |= PTCACHE_DISK_CACHE;
+ smd->domain->point_cache[1]->step = 1;
/* set some standard values */
smd->domain->fluid = NULL;
@@ -775,8 +788,9 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
}
else if(smd->type & MOD_SMOKE_TYPE_DOMAIN)
{
- PointCache *cache;
+ PointCache *cache, *cache_wt;
PTCacheID pid;
+ PTCacheID pid_wt;
float timescale;
int cache_result = 0;
int startframe, endframe, framenr;
@@ -788,7 +802,7 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
framenr = scene->r.cfra;
- cache = sds->point_cache;
+ cache = sds->point_cache[0];
BKE_ptcache_id_from_smoke(&pid, ob, smd);
BKE_ptcache_id_time(&pid, scene, framenr, &startframe, &endframe, &timescale);
@@ -800,12 +814,15 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
cache->simframe= 0;
cache->last_exact= 0;
- smokeModifier_init(smd, ob, scene, dm);
+ if(!smokeModifier_init(smd, ob, scene, dm))
+ return;
+
+ if(!smd->domain->fluid)
+ return;
smoke_simulate_domain(smd, scene, ob, dm);
{
- // float light[3] = {0.0,0.0,0.0}; // TODO: take real LAMP coordinates - dg
Base *base_tmp = NULL;
for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next)
@@ -852,7 +869,11 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
BKE_ptcache_id_reset(scene, &pid, PTCACHE_RESET_OUTDATED);
}
- smokeModifier_init(smd, ob, scene, dm);
+ if(!smokeModifier_init(smd, ob, scene, dm))
+ return;
+
+ if(!smd->domain->fluid)
+ return;
/* try to read from cache */
cache_result = BKE_ptcache_read_cache(&pid, (float)framenr, scene->r.frs_sec);
@@ -904,8 +925,10 @@ void smokeModifier_do(SmokeModifierData *smd, Scene *scene, Object *ob, DerivedM
smoke_simulate_domain(smd, scene, ob, dm);
+ if(sds->wt)
+ smoke_turbulence_step(sds->wt, sds->fluid);
+
{
- // float light[3] = {0.0,0.0,0.0}; // TODO: take real LAMP coordinates - dg
Base *base_tmp = NULL;
for(base_tmp = scene->base.first; base_tmp; base_tmp= base_tmp->next)