[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22788] branches/blender2.5/blender/source /blender: Smoke:

Daniel Genrich daniel.genrich at gmx.net
Wed Aug 26 01:39:49 CEST 2009


Revision: 22788
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22788
Author:   genscher
Date:     2009-08-26 01:39:49 +0200 (Wed, 26 Aug 2009)

Log Message:
-----------
Smoke:
*Bugfix for crash on using a plane as smoke domain (reported by DingTo)
* Bringing slowly high res back, not yet working

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/smoke.c
    branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
    branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_smoke_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_smoke.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c	2009-08-25 22:56:08 UTC (rev 22787)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/pointcache.c	2009-08-25 23:39:49 UTC (rev 22788)
@@ -703,11 +703,11 @@
 	pid->calldata= smd;
 	
 	pid->type= PTCACHE_TYPE_SMOKE_DOMAIN;
-	pid->stack_index= sds->point_cache->index;
+	pid->stack_index= sds->point_cache[0]->index;
 
-	pid->cache= sds->point_cache;
-	pid->cache_ptr= &sds->point_cache;
-	pid->ptcaches= &sds->ptcaches;
+	pid->cache= sds->point_cache[0];
+	pid->cache_ptr= &(sds->point_cache[0]);
+	pid->ptcaches= &(sds->ptcaches[0]);
 
 	pid->totpoint= pid->totwrite= ptcache_totpoint_smoke;
 
@@ -726,6 +726,39 @@
 	pid->info_types= 0;
 }
 
+void BKE_ptcache_id_from_smoke_turbulence(PTCacheID *pid, struct Object *ob, struct SmokeModifierData *smd)
+{
+	SmokeDomainSettings *sds = smd->domain;
+
+	memset(pid, 0, sizeof(PTCacheID));
+
+	pid->ob= ob;
+	pid->calldata= smd;
+	
+	pid->type= PTCACHE_TYPE_SMOKE_HIGHRES;
+	pid->stack_index= sds->point_cache[1]->index;
+
+	pid->cache= sds->point_cache[1];
+	pid->cache_ptr= &sds->point_cache[1];
+	pid->ptcaches= &sds->ptcaches[1];
+
+	pid->totpoint= pid->totwrite= ptcache_totpoint_smoke;
+
+	pid->write_elem= NULL;
+	pid->read_elem= NULL;
+
+	pid->read_stream = ptcache_read_smoke;
+	pid->write_stream = ptcache_write_smoke;
+	
+	pid->interpolate_elem= NULL;
+
+	pid->write_header= ptcache_write_basic_header;
+	pid->read_header= ptcache_read_basic_header;
+
+	pid->data_types= (1<<BPHYS_DATA_LOCATION); // bogus values tot make pointcache happy
+	pid->info_types= 0;
+}
+
 void BKE_ptcache_id_from_cloth(PTCacheID *pid, Object *ob, ClothModifierData *clmd)
 {
 	memset(pid, 0, sizeof(PTCacheID));
@@ -1792,10 +1825,7 @@
 		else if(pid->type == PTCACHE_TYPE_PARTICLES)
 			psys_reset(pid->calldata, PSYS_RESET_DEPSGRAPH);
 		else if(pid->type == PTCACHE_TYPE_SMOKE_DOMAIN)
-		{
 			smokeModifier_reset(pid->calldata);
-			printf("reset PTCACHE_TYPE_SMOKE_DOMAIN\n");
-		}
 	}
 	if(clear)
 		BKE_ptcache_id_clear(pid, PTCACHE_CLEAR_ALL, 0);

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/smoke.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/smoke.c	2009-08-25 22:56:08 UTC (rev 22787)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/smoke.c	2009-08-25 23:39:49 UTC (rev 22788)
@@ -166,6 +166,10 @@
 
 		// 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 @@
 		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 @@
 		{
 			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 @@
 		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,11 +607,16 @@
 				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");
 		}
 		else if(smd->flow)
@@ -666,10 +675,14 @@
 
 			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;
 			smd->domain->eff_group = NULL;
@@ -775,8 +788,9 @@
 	}
 	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 @@
 
 		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 @@
 			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,8 +869,12 @@
 			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);
 		// printf("cache_result: %d\n", cache_result);
@@ -904,8 +925,10 @@
 
 		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) 

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-08-25 22:56:08 UTC (rev 22787)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/readfile.c	2009-08-25 23:39:49 UTC (rev 22788)
@@ -3695,7 +3695,8 @@
 				smd->domain->view3d = NULL;
 				smd->domain->tex = NULL;
 
-				direct_link_pointcache_list(fd, &smd->domain->ptcaches, &smd->domain->point_cache);
+				direct_link_pointcache_list(fd, &(smd->domain->ptcaches[0]), &(smd->domain->point_cache[0]));
+				direct_link_pointcache_list(fd, &(smd->domain->ptcaches[1]), &(smd->domain->point_cache[1]));
 			}
 			else if(smd->type==MOD_SMOKE_TYPE_FLOW)
 			{

Modified: branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c	2009-08-25 22:56:08 UTC (rev 22787)
+++ branches/blender2.5/blender/source/blender/blenloader/intern/writefile.c	2009-08-25 23:39:49 UTC (rev 22788)
@@ -1136,7 +1136,10 @@
 			*/
 
 			if((smd->type & MOD_SMOKE_TYPE_DOMAIN) && smd->domain)
-				write_pointcaches(wd, &smd->domain->ptcaches);
+			{
+				write_pointcaches(wd, &(smd->domain->ptcaches[0]));
+				write_pointcaches(wd, &(smd->domain->ptcaches[1]));
+			}
 		} 
 		else if(md->type==eModifierType_Fluidsim) {
 			FluidsimModifierData *fluidmd = (FluidsimModifierData*) md;

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c	2009-08-25 22:56:08 UTC (rev 22787)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/drawobject.c	2009-08-25 23:39:49 UTC (rev 22788)
@@ -5316,7 +5316,7 @@
 		md = modifiers_findByType(ob, eModifierType_Smoke);
 		if (md) {
 			SmokeModifierData *smd = (SmokeModifierData *)md;
-			if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain) {
+			if(smd->type & MOD_SMOKE_TYPE_DOMAIN && smd->domain && smd->domain->fluid) {
 				GPU_create_smoke(smd);
 				draw_volume(scene, ar, v3d, base, smd->domain->tex, smd->domain->res);
 				GPU_free_smoke(smd);

Modified: branches/blender2.5/blender/source/blender/makesdna/DNA_smoke_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_smoke_types.h	2009-08-25 22:56:08 UTC (rev 22787)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_smoke_types.h	2009-08-25 23:39:49 UTC (rev 22788)
@@ -67,8 +67,8 @@
 	short diss_percent; 
 	short pad;
 	int diss_speed;/* in frames */
-	struct PointCache *point_cache;	/* definition is in DNA_object_force.h */
-	struct ListBase ptcaches;
+	struct PointCache *point_cache[2];	/* definition is in DNA_object_force.h */
+	struct ListBase ptcaches[2];
 	struct WTURBULENCE *wt; // WTURBULENCE object, if active
 	int pad3;
 	float strength;

Modified: branches/blender2.5/blender/source/blender/makesrna/intern/rna_smoke.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list