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");

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to