Fix T40703: cycles viewport smoke not updating when changing frame.

This commit is contained in:
Brecht Van Lommel 2014-06-21 22:18:48 +02:00
parent 177e1ec9b2
commit 88d8358f91
4 changed files with 39 additions and 19 deletions

@ -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)

@ -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;

@ -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;

@ -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;
}