Fix T40703: cycles viewport smoke not updating when changing frame.
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 21 Jun 2014 20:18:48 +0000 (22:18 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Sat, 21 Jun 2014 20:21:04 +0000 (22:21 +0200)
intern/cycles/blender/blender_mesh.cpp
intern/cycles/render/image.cpp
intern/cycles/render/image.h
intern/cycles/render/nodes.cpp

index 07375484a737f921a29e3b0394f8807c1a00acbb..e7c18c9706b3c2cbfe081914ee22be67165ec2cb 100644 (file)
@@ -208,7 +208,7 @@ static void mikk_compute_tangents(BL::Mesh b_mesh, BL::MeshTextureFaceLayer b_la
 
 /* Create Volume Attribute */
 
-static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManager *image_manager, AttributeStandard std)
+static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManager *image_manager, AttributeStandard std, float frame)
 {
        BL::SmokeDomainSettings b_domain = object_smoke_domain_find(b_ob);
 
@@ -222,22 +222,22 @@ static void create_mesh_volume_attribute(BL::Object b_ob, Mesh *mesh, ImageManag
 
        volume_data->manager = image_manager;
        volume_data->slot = image_manager->add_image(Attribute::standard_name(std),
-               b_ob.ptr.data, animated, is_float, is_linear, INTERPOLATION_LINEAR, true);
+               b_ob.ptr.data, animated, frame, is_float, is_linear, INTERPOLATION_LINEAR, true);
 }
 
-static void create_mesh_volume_attributes(Scene *scene, BL::Object b_ob, Mesh *mesh)
+static void create_mesh_volume_attributes(Scene *scene, BL::Object b_ob, Mesh *mesh, float frame)
 {
        /* for smoke volume rendering */
        if(mesh->need_attribute(scene, ATTR_STD_VOLUME_DENSITY))
-               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_DENSITY);
+               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_DENSITY, frame);
        if(mesh->need_attribute(scene, ATTR_STD_VOLUME_COLOR))
-               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_COLOR);
+               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_COLOR, frame);
        if(mesh->need_attribute(scene, ATTR_STD_VOLUME_FLAME))
-               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_FLAME);
+               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_FLAME, frame);
        if(mesh->need_attribute(scene, ATTR_STD_VOLUME_HEAT))
-               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_HEAT);
+               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_HEAT, frame);
        if(mesh->need_attribute(scene, ATTR_STD_VOLUME_VELOCITY))
-               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_VELOCITY);
+               create_mesh_volume_attribute(b_ob, mesh, scene->image_manager, ATTR_STD_VOLUME_VELOCITY, frame);
 }
 
 /* Create Mesh */
@@ -561,7 +561,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
                                else
                                        create_mesh(scene, mesh, b_mesh, used_shaders);
 
-                               create_mesh_volume_attributes(scene, b_ob, mesh);
+                               create_mesh_volume_attributes(scene, b_ob, mesh, b_scene.frame_current());
                        }
 
                        if(render_layer.use_hair)
index 30d07fe0a7fa7c7051dca60e018599e032755230..8369df5e137f6a1ab4ea951ec2b60c78ef048cfe 100644 (file)
@@ -157,7 +157,8 @@ static bool image_equals(ImageManager::Image *image, const string& filename, voi
               image->interpolation == interpolation;
 }
 
-int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float, bool& is_linear, InterpolationType interpolation, bool use_alpha)
+int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, float frame,
+       bool& is_float, bool& is_linear, InterpolationType interpolation, bool use_alpha)
 {
        Image *img;
        size_t slot;
@@ -168,8 +169,13 @@ int ImageManager::add_image(const string& filename, void *builtin_data, bool ani
        if(is_float) {
                /* find existing image */
                for(slot = 0; slot < float_images.size(); slot++) {
-                       if(float_images[slot] && image_equals(float_images[slot], filename, builtin_data, interpolation)) {
-                               float_images[slot]->users++;
+                       img = float_images[slot];
+                       if(img && image_equals(img, filename, builtin_data, interpolation)) {
+                               if(img->frame != frame) {
+                                       img->frame = frame;
+                                       img->need_load = true;
+                               }
+                               img->users++;
                                return slot;
                        }
                }
@@ -197,6 +203,7 @@ int ImageManager::add_image(const string& filename, void *builtin_data, bool ani
                img->builtin_data = builtin_data;
                img->need_load = true;
                img->animated = animated;
+               img->frame = frame;
                img->interpolation = interpolation;
                img->users = 1;
                img->use_alpha = use_alpha;
@@ -205,8 +212,13 @@ int ImageManager::add_image(const string& filename, void *builtin_data, bool ani
        }
        else {
                for(slot = 0; slot < images.size(); slot++) {
-                       if(images[slot] && image_equals(images[slot], filename, builtin_data, interpolation)) {
-                               images[slot]->users++;
+                       img = images[slot];
+                       if(img && image_equals(img, filename, builtin_data, interpolation)) {
+                               if(img->frame != frame) {
+                                       img->frame = frame;
+                                       img->need_load = true;
+                               }
+                               img->users++;
                                return slot+tex_image_byte_start;
                        }
                }
@@ -234,6 +246,7 @@ int ImageManager::add_image(const string& filename, void *builtin_data, bool ani
                img->builtin_data = builtin_data;
                img->need_load = true;
                img->animated = animated;
+               img->frame = frame;
                img->interpolation = interpolation;
                img->users = 1;
                img->use_alpha = use_alpha;
@@ -242,6 +255,7 @@ int ImageManager::add_image(const string& filename, void *builtin_data, bool ani
 
                slot += tex_image_byte_start;
        }
+
        need_update = true;
 
        return slot;
index 3eacfa7beedbc5ddd303fea1e940c691eb1658a4..50ea346c03493c95a0fa1eab248a9bb07fe39af3 100644 (file)
@@ -55,7 +55,8 @@ public:
        ImageManager();
        ~ImageManager();
 
-       int add_image(const string& filename, void *builtin_data, bool animated, bool& is_float, bool& is_linear, InterpolationType interpolation, bool use_alpha);
+       int add_image(const string& filename, void *builtin_data, bool animated, float frame,
+               bool& is_float, bool& is_linear, InterpolationType interpolation, bool use_alpha);
        void remove_image(int slot);
        void remove_image(const string& filename, void *builtin_data, InterpolationType interpolation);
        bool is_float_image(const string& filename, void *builtin_data, bool& is_linear);
@@ -82,6 +83,7 @@ public:
                bool use_alpha;
                bool need_load;
                bool animated;
+               float frame;
                InterpolationType interpolation;
 
                int users;
index 6401d6d8e36cd2e3e4e32b18a01bbeb31eea73e8..251afe9a0a2f571ddd617c62ccdca4314fc2dc2f 100644 (file)
@@ -243,7 +243,9 @@ void ImageTextureNode::compile(SVMCompiler& compiler)
        image_manager = compiler.image_manager;
        if(is_float == -1) {
                bool is_float_bool;
-               slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool, is_linear, interpolation, use_alpha);
+               slot = image_manager->add_image(filename, builtin_data,
+                                               animated, 0, is_float_bool, is_linear,
+                                               interpolation, use_alpha);
                is_float = (int)is_float_bool;
        }
 
@@ -313,7 +315,7 @@ void ImageTextureNode::compile(OSLCompiler& compiler)
                else {
                        bool is_float_bool;
                        slot = image_manager->add_image(filename, builtin_data,
-                                                       animated, is_float_bool, is_linear,
+                                                       animated, 0, is_float_bool, is_linear,
                                                        interpolation, use_alpha);
                        is_float = (int)is_float_bool;
                }
@@ -430,7 +432,9 @@ void EnvironmentTextureNode::compile(SVMCompiler& compiler)
        image_manager = compiler.image_manager;
        if(slot == -1) {
                bool is_float_bool;
-               slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool, is_linear, INTERPOLATION_LINEAR, use_alpha);
+               slot = image_manager->add_image(filename, builtin_data,
+                                               animated, 0, is_float_bool, is_linear,
+                                               INTERPOLATION_LINEAR, use_alpha);
                is_float = (int)is_float_bool;
        }
 
@@ -491,7 +495,7 @@ void EnvironmentTextureNode::compile(OSLCompiler& compiler)
                else {
                        bool is_float_bool;
                        slot = image_manager->add_image(filename, builtin_data,
-                                                       animated, is_float_bool, is_linear,
+                                                       animated, 0, is_float_bool, is_linear,
                                                        INTERPOLATION_LINEAR, use_alpha);
                        is_float = (int)is_float_bool;
                }