[Bf-blender-cvs] [8a79adcaf7b] fluid-mantaflow: implemented viewport display switcher for liquids

Sebastián Barschkis noreply at git.blender.org
Tue Jun 13 15:22:22 CEST 2017


Commit: 8a79adcaf7b4b9586a066570585b4785565753f9
Author: Sebastián Barschkis
Date:   Tue Jun 13 14:47:31 2017 +0200
Branches: fluid-mantaflow
https://developer.blender.org/rB8a79adcaf7b4b9586a066570585b4785565753f9

implemented viewport display switcher for liquids

previously the viewport switcher only worked for smoke. only drawback is now that toggling the viewport switcher resets the cache(probably because of recalculating liquid mesh). baked caches however stay. issue remains a todo.

===================================================================

M	source/blender/blenkernel/intern/pointcache.c
M	source/blender/makesrna/intern/rna_smoke.c

===================================================================

diff --git a/source/blender/blenkernel/intern/pointcache.c b/source/blender/blenkernel/intern/pointcache.c
index 581fbfd6ee4..c00734a8131 100644
--- a/source/blender/blenkernel/intern/pointcache.c
+++ b/source/blender/blenkernel/intern/pointcache.c
@@ -1230,21 +1230,34 @@ static int ptcache_smoke_openvdb_read(struct OpenVDBReader *reader, void *smoke_
 static int ptcache_liquid_read(void *smoke_v, char *filename, char *pathname, bool load_liquid_data)
 {
 	SmokeModifierData *smd = (SmokeModifierData *) smoke_v;
+	int i;
 	
 	if (!smd) {
 		return 0;
 	}
 
 	SmokeDomainSettings *sds = smd->domain;
-	
+	bool high_res      = sds->flags & MOD_SMOKE_HIGHRES;
+	bool high_res_view = sds->viewport_display_mode == SM_VIEWPORT_FINAL;
+
 	if (sds->fluid) {
+		/* Mantaflow internal data loading */
 		if (load_liquid_data) {
 			liquid_load_data(sds->fluid, pathname);
 		}
-		if (sds->flags & MOD_SMOKE_HIGHRES) {
+		if (load_liquid_data && high_res && high_res_view) {
 			liquid_load_data_high(sds->fluid, pathname);
 		}
+
+		/* Actual mesh loading */
 		liquid_update_mesh_data(sds->fluid, filename);
+		if (high_res && high_res_view) {
+			i = strlen(filename);
+			if (i > 8) filename[i-8] = '\0';   // strip low-res extension
+			strcat(filename, "_HIGH.bobj.gz"); // add high-res extension
+
+			liquid_update_mesh_data(sds->fluid, filename);
+		}
 		return 1;
 	}
 	return 0;
@@ -1261,12 +1274,12 @@ static int ptcache_flip_read(void *smoke_v, char *filename, char *pathname, bool
 	SmokeDomainSettings *sds = smd->domain;
 
 	if (sds->fluid) {
+		/* Mantaflow internal data loading */
 		if (load_liquid_data) {
 			liquid_load_data(sds->fluid, pathname);
 		}
-		if (load_liquid_data && sds->flags & MOD_SMOKE_HIGHRES) {
-			liquid_load_data_high(sds->fluid, pathname);
-		}
+
+		/* Actual particle loading */
 		liquid_update_particle_data(sds->fluid, filename);
 		return 1;
 	}
@@ -1277,34 +1290,43 @@ static int ptcache_liquid_write(void *smoke_v, char *filename, char* pathname, b
 {
 	SmokeModifierData *smd = (SmokeModifierData *) smoke_v;
 	int i;
+	char filenameHigh[256];
 
 	if (!smd) {
 		return 0;
 	}
 
 	SmokeDomainSettings *sds = smd->domain;
-	
+	bool high_res      = sds->flags & MOD_SMOKE_HIGHRES;
+	bool high_res_view = sds->viewport_display_mode == SM_VIEWPORT_FINAL;
+
 	if (sds->fluid) {
-		liquid_save_mesh(sds->fluid, filename);
+		/* Mantaflow internal data saving */
 		if (save_liquid_data) {
 			liquid_save_data(sds->fluid, pathname);
 		}
-		if (sds->flags & MOD_SMOKE_HIGHRES) {
-			i = strlen(filename);
-			/* remove .bobj.gz ...*/
-			if (i > 8)
-				filename[i-8] = '\0';
-			/* ... and add _HIGH.bobj.gz ending */
-			strcat(filename, "_HIGH.bobj.gz");
-			
-			liquid_save_mesh_high(sds->fluid, filename);
-			if (save_liquid_data) {
-				liquid_save_data_high(sds->fluid, pathname);
-			}
+		if (save_liquid_data && high_res) {
+			liquid_save_data_high(sds->fluid, pathname);
+		}
+
+		/* Actual mesh saving */
+		liquid_save_mesh(sds->fluid, filename);
+		if (high_res) {
+			strcpy(filenameHigh, filename); // copy name, original file name is needed later
+			i = strlen(filenameHigh);
+			if (i > 8) filenameHigh[i-8] = '\0';   // strip low-res extension
+			strcat(filenameHigh, "_HIGH.bobj.gz"); // add high-res extension
+
+			liquid_save_mesh_high(sds->fluid, filenameHigh);
+		}
+
+		/* Update mesh for instant replay functionality */
+		if (high_res && high_res_view) {
+			liquid_update_mesh_data(sds->fluid, filenameHigh);
+		}
+		else {
+			liquid_update_mesh_data(sds->fluid, filename);
 		}
-		/* After writing mesh data make sure that fields in fluid object
-		 * are up-to-date (necessary for instant replay functionality) */
-		liquid_update_mesh_data(sds->fluid, filename);
 		return 1;
 	}
 	return 0;
@@ -1321,15 +1343,15 @@ static int ptcache_flip_write(void *smoke_v, char *filename, char* pathname, boo
 	SmokeDomainSettings *sds = smd->domain;
 
 	if (sds->fluid) {
-		liquid_save_particles(sds->fluid, filename);
+		/* Mantaflow internal data saving */
 		if (save_liquid_data) {
 			liquid_save_data(sds->fluid, pathname);
 		}
-		if (save_liquid_data && sds->flags & MOD_SMOKE_HIGHRES) {
-			liquid_save_data_high(sds->fluid, pathname);
-		}
-		/* After writing particle data make sure that fields in fluid object
-		 * are up-to-date (necessary for instant replay functionality) */
+
+		/* Actual particle saving */
+		liquid_save_particles(sds->fluid, filename);
+
+		/* Update particles for instant replay functionality */
 		liquid_update_particle_data(sds->fluid, filename);
 		return 1;
 	}
diff --git a/source/blender/makesrna/intern/rna_smoke.c b/source/blender/makesrna/intern/rna_smoke.c
index c6f873d8f0c..ecec95135eb 100644
--- a/source/blender/makesrna/intern/rna_smoke.c
+++ b/source/blender/makesrna/intern/rna_smoke.c
@@ -48,7 +48,7 @@
 #include "DNA_smoke_types.h"
 
 #include "WM_types.h"
-
+#include "WM_api.h"
 
 #ifdef RNA_RUNTIME
 
@@ -66,6 +66,11 @@
 static void rna_Smoke_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
 	DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+
+	// Needed for liquid domain objects
+	Object *ob = ptr->id.data;
+	DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
+	WM_main_add_notifier(NC_OBJECT | ND_DRAW, ob);
 }
 
 static void rna_Smoke_dependency_update(Main *bmain, Scene *scene, PointerRNA *ptr)
@@ -82,6 +87,28 @@ static void rna_Smoke_resetCache(Main *UNUSED(bmain), Scene *UNUSED(scene), Poin
 	DAG_id_tag_update(ptr->id.data, OB_RECALC_DATA);
 }
 
+static void rna_Smoke_viewport_set(struct PointerRNA *ptr, int value)
+{
+	SmokeDomainSettings *settings = (SmokeDomainSettings *)ptr->data;
+	Object *ob = (Object *)ptr->id.data;
+	ModifierData *md;
+	float framenr;
+	bool can_simulate;
+	PTCacheID pid;
+
+	/* Reload cache if viewport type changed */
+	if (value != settings->viewport_display_mode) {
+		md = ((ModifierData*) settings->smd);
+		framenr = md->scene->r.cfra;
+		can_simulate = (framenr == (int)settings->smd->time + 1) && (framenr == md->scene->r.cfra);
+
+		BKE_ptcache_id_from_smoke(&pid, ob, settings->smd);
+		BKE_ptcache_read(&pid, framenr, can_simulate);
+
+		settings->viewport_display_mode = value;
+	}
+}
+
 static void rna_Smoke_update_file_format(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
 	Object *ob = (Object *)ptr->id.data;
@@ -844,8 +871,9 @@ static void rna_def_smoke_domain_settings(BlenderRNA *brna)
 	prop = RNA_def_property(srna, "viewport_display_mode", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "viewport_display_mode");
 	RNA_def_property_enum_items(prop, smoke_quality_items);
+	RNA_def_property_enum_funcs(prop, NULL, "rna_Smoke_viewport_set", NULL);
 	RNA_def_property_ui_text(prop, "Viewport Display Mode", "How to display the mesh in the viewport");
-	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, NULL);
+	RNA_def_property_update(prop, NC_OBJECT | ND_DRAW, "rna_Smoke_update");
 
 	prop = RNA_def_property(srna, "render_display_mode", PROP_ENUM, PROP_NONE);
 	RNA_def_property_enum_sdna(prop, NULL, "render_display_mode");




More information about the Bf-blender-cvs mailing list