Commit: 10b0e33de1b9b57693ebcec7d503d3b204043f56
Author: Kévin Dietrich
Date:   Sat Jul 16 18:56:59 2016 +0200
Branches: master
https://developer.blender.org/rB10b0e33de1b9b57693ebcec7d503d3b204043f56

Cycles: add support for motion blurring of fluid meshes.

Reviewed By: brecht

Differential Revision: https://developer.blender.org/D2063

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

M       intern/cycles/blender/blender_mesh.cpp
M       intern/cycles/blender/blender_object.cpp
M       intern/cycles/blender/blender_sync.h
M       intern/cycles/blender/blender_util.h
M       intern/cycles/render/scene.cpp
M       intern/cycles/render/scene.h
M       source/blender/makesrna/intern/rna_fluidsim.c

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

diff --git a/intern/cycles/blender/blender_mesh.cpp 
b/intern/cycles/blender/blender_mesh.cpp
index 4bd385c..ec11a89 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -680,6 +680,43 @@ static void create_subd_mesh(Scene *scene,
 
 /* Sync */
 
+static void sync_mesh_fluid_motion(BL::Object& b_ob, Scene *scene, Mesh *mesh)
+{
+       if(scene->need_motion() == Scene::MOTION_NONE)
+               return;
+
+       BL::DomainFluidSettings b_fluid_domain = object_fluid_domain_find(b_ob);
+
+       if(!b_fluid_domain)
+               return;
+
+       /* If the mesh has modifiers following the fluid domain we can't export 
motion. */
+       if(b_fluid_domain.fluid_mesh_vertices.length() != mesh->verts.size())
+               return;
+
+       /* Find or add attribute */
+       float3 *P = &mesh->verts[0];
+       Attribute *attr_mP = 
mesh->attributes.find(ATTR_STD_MOTION_VERTEX_POSITION);
+
+       if(!attr_mP) {
+               attr_mP = mesh->attributes.add(ATTR_STD_MOTION_VERTEX_POSITION);
+       }
+
+       /* Only export previous and next frame, we don't have any in between 
data. */
+       float motion_times[2] = {-1.0f, 1.0f};
+       for (int step = 0; step < 2; step++) {
+               float relative_time = motion_times[step] * 
scene->motion_shutter_time() * 0.5f;
+               float3 *mP = attr_mP->data_float3() + step*mesh->verts.size();
+
+               BL::DomainFluidSettings::fluid_mesh_vertices_iterator fvi;
+               int i = 0;
+
+               for(b_fluid_domain.fluid_mesh_vertices.begin(fvi); fvi != 
b_fluid_domain.fluid_mesh_vertices.end(); ++fvi, ++i) {
+                       mP[i] = P[i] + get_float3(fvi->velocity()) * 
relative_time;
+               }
+       }
+}
+
 Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
                              bool object_updated,
                              bool hide_tris)
@@ -821,6 +858,9 @@ Mesh *BlenderSync::sync_mesh(BL::Object& b_ob,
                        mesh->displacement_method = Mesh::DISPLACE_BOTH;
        }
 
+       /* fluid motion */
+       sync_mesh_fluid_motion(b_ob, scene, mesh);
+
        /* tag update */
        bool rebuild = false;
 
@@ -910,6 +950,11 @@ void BlenderSync::sync_mesh_motion(BL::Object& b_ob,
         * would need a more extensive check to see which objects are animated 
*/
        BL::Mesh b_mesh(PointerRNA_NULL);
 
+       /* fluid motion is exported immediate with mesh, skip here */
+       BL::DomainFluidSettings b_fluid_domain = object_fluid_domain_find(b_ob);
+       if (b_fluid_domain)
+               return;
+
        if(ccl::BKE_object_is_deform_modified(b_ob, b_scene, preview)) {
                /* get derived mesh */
                b_mesh = object_to_mesh(b_data, b_ob, b_scene, true, !preview, 
false);
diff --git a/intern/cycles/blender/blender_object.cpp 
b/intern/cycles/blender/blender_object.cpp
index ede8c47..22a0b39 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -719,12 +719,7 @@ void BlenderSync::sync_motion(BL::RenderSettings& b_render,
                        << relative_time << ".";
 
                /* fixed shutter time to get previous and next frame for motion 
pass */
-               float shuttertime;
-
-               if(scene->need_motion() == Scene::MOTION_PASS)
-                       shuttertime = 2.0f;
-               else
-                       shuttertime = scene->camera->shuttertime;
+               float shuttertime = scene->motion_shutter_time();
 
                /* compute frame and subframe time */
                float time = frame_center + frame_center_delta + relative_time 
* shuttertime * 0.5f;
diff --git a/intern/cycles/blender/blender_sync.h 
b/intern/cycles/blender/blender_sync.h
index d690adb..b8b9597 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -131,7 +131,9 @@ private:
                        Transform& tfm,
                        bool *use_portal);
        void sync_background_light(bool use_portal);
-       void sync_mesh_motion(BL::Object& b_ob, Object *object, float 
motion_time);
+       void sync_mesh_motion(BL::Object& b_ob,
+                             Object *object,
+                             float motion_time);
        void sync_camera_motion(BL::RenderSettings& b_render,
                                BL::Object& b_ob,
                                int width, int height,
diff --git a/intern/cycles/blender/blender_util.h 
b/intern/cycles/blender/blender_util.h
index 2510ceb..188d23d 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -519,6 +519,23 @@ static inline BL::SmokeDomainSettings 
object_smoke_domain_find(BL::Object& b_ob)
        return BL::SmokeDomainSettings(PointerRNA_NULL);
 }
 
+static inline BL::DomainFluidSettings object_fluid_domain_find(BL::Object b_ob)
+{
+       BL::Object::modifiers_iterator b_mod;
+
+       for(b_ob.modifiers.begin(b_mod); b_mod != b_ob.modifiers.end(); 
++b_mod) {
+               if(b_mod->is_a(&RNA_FluidSimulationModifier)) {
+                       BL::FluidSimulationModifier b_fmd(*b_mod);
+                       BL::FluidSettings fss = b_fmd.settings();
+
+                       if(fss.type() == BL::FluidSettings::type_DOMAIN)
+                               return 
(BL::DomainFluidSettings)b_fmd.settings();
+               }
+       }
+
+       return BL::DomainFluidSettings(PointerRNA_NULL);
+}
+
 /* ID Map
  *
  * Utility class to keep in sync with blender data.
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index e8367e1..b341837 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -263,6 +263,14 @@ Scene::MotionType Scene::need_motion(bool advanced_shading)
                return MOTION_NONE;
 }
 
+float Scene::motion_shutter_time()
+{
+       if(need_motion() == Scene::MOTION_PASS)
+               return 2.0f;
+       else
+               return camera->shuttertime;
+}
+
 bool Scene::need_global_attribute(AttributeStandard std)
 {
        if(std == ATTR_STD_UV)
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 5abcbfc..05e807f 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -213,6 +213,7 @@ public:
 
        enum MotionType { MOTION_NONE = 0, MOTION_PASS, MOTION_BLUR };
        MotionType need_motion(bool advanced_shading = true);
+       float motion_shutter_time();
 
        bool need_update();
        bool need_reset();
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c 
b/source/blender/makesrna/intern/rna_fluidsim.c
index 16e0f17..091950a 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -204,18 +204,6 @@ static char *rna_FluidSettings_path(PointerRNA *ptr)
        return BLI_sprintfN("modifiers[\"%s\"].settings", name_esc);
 }
 
-static void rna_FluidMeshVertex_data_begin(CollectionPropertyIterator *iter, 
PointerRNA *ptr)
-{
-       FluidsimSettings *fss = (FluidsimSettings *)ptr->data;
-       rna_iterator_array_begin(iter, fss->meshVelocities, sizeof(float) * 3, 
fss->totvert, 0, NULL);
-}
-
-static int rna_FluidMeshVertex_data_length(PointerRNA *ptr)
-{
-       FluidsimSettings *fss = (FluidsimSettings *)ptr->data;
-       return fss->totvert;
-}
-
 #else
 
 static void rna_def_fluidsim_slip(StructRNA *srna)
@@ -251,9 +239,8 @@ static void rna_def_fluid_mesh_vertices(BlenderRNA *brna)
        StructRNA *srna;
        PropertyRNA *prop;
        
-       srna = RNA_def_struct(brna, "FluidMeshVertex", NULL);
-       RNA_def_struct_sdna(srna, "FluidVertexVelocity");
-       RNA_def_struct_ui_text(srna, "Fluid Mesh Vertex", "Vertex of a 
simulated fluid mesh");
+       srna = RNA_def_struct(brna, "FluidVertexVelocity", NULL);
+       RNA_def_struct_ui_text(srna, "Fluid Mesh Velocity", "Velocity of a 
simulated fluid mesh");
        RNA_def_struct_ui_icon(srna, ICON_VERTEXSEL);
 
        prop = RNA_def_property(srna, "velocity", PROP_FLOAT, PROP_VELOCITY);
@@ -442,11 +429,10 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
        
        /* simulated fluid mesh data */
        prop = RNA_def_property(srna, "fluid_mesh_vertices", PROP_COLLECTION, 
PROP_NONE);
-       RNA_def_property_struct_type(prop, "FluidMeshVertex");
+       RNA_def_property_collection_sdna(prop, NULL, "meshVelocities", 
"totvert");
+       RNA_def_property_struct_type(prop, "FluidVertexVelocity");
        RNA_def_property_ui_text(prop, "Fluid Mesh Vertices", "Vertices of the 
fluid mesh generated by simulation");
-       RNA_def_property_collection_funcs(prop, 
"rna_FluidMeshVertex_data_begin", "rna_iterator_array_next",
-                                         "rna_iterator_array_end", 
"rna_iterator_array_get",
-                                         "rna_FluidMeshVertex_data_length", 
NULL, NULL, NULL);
+
        rna_def_fluid_mesh_vertices(brna);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to