forked from bartvdbraak/blender
Fix T41109: Reloading image that has been modified outside Blender does not update image in Image Texture nodes
This commit is contained in:
parent
b984489181
commit
9a45c9dadf
@ -572,6 +572,13 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
|
||||
image->animated = b_image_node.image_user().use_auto_refresh();
|
||||
image->use_alpha = b_image.use_alpha();
|
||||
|
||||
/* TODO(sergey): Does not work properly when we change builtin type. */
|
||||
if (b_image.is_updated()) {
|
||||
scene->image_manager->tag_reload_image(image->filename,
|
||||
image->builtin_data,
|
||||
(InterpolationType)b_image_node.interpolation());
|
||||
}
|
||||
}
|
||||
image->color_space = ImageTextureNode::color_space_enum[(int)b_image_node.color_space()];
|
||||
image->projection = ImageTextureNode::projection_enum[(int)b_image_node.projection()];
|
||||
@ -602,6 +609,13 @@ static ShaderNode *add_node(Scene *scene, BL::BlendData b_data, BL::Scene b_scen
|
||||
}
|
||||
|
||||
env->use_alpha = b_image.use_alpha();
|
||||
|
||||
/* TODO(sergey): Does not work properly when we change builtin type. */
|
||||
if (b_image.is_updated()) {
|
||||
scene->image_manager->tag_reload_image(env->filename,
|
||||
env->builtin_data,
|
||||
INTERPOLATION_LINEAR);
|
||||
}
|
||||
}
|
||||
env->color_space = EnvironmentTextureNode::color_space_enum[(int)b_env_node.color_space()];
|
||||
env->projection = EnvironmentTextureNode::projection_enum[(int)b_env_node.projection()];
|
||||
|
@ -313,6 +313,32 @@ void ImageManager::remove_image(const string& filename, void *builtin_data, Inte
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO(sergey): Deduplicate with the iteration above, but make it pretty,
|
||||
* without bunch of arguments passing around making code readability even
|
||||
* more cluttered.
|
||||
*/
|
||||
void ImageManager::tag_reload_image(const string& filename, void *builtin_data, InterpolationType interpolation)
|
||||
{
|
||||
size_t slot;
|
||||
|
||||
for(slot = 0; slot < images.size(); slot++) {
|
||||
if(images[slot] && image_equals(images[slot], filename, builtin_data, interpolation)) {
|
||||
images[slot]->need_load = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(slot == images.size()) {
|
||||
/* see if it's in a float texture slot */
|
||||
for(slot = 0; slot < float_images.size(); slot++) {
|
||||
if(float_images[slot] && image_equals(float_images[slot], filename, builtin_data, interpolation)) {
|
||||
images[slot]->need_load = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img)
|
||||
{
|
||||
if(img->filename == "")
|
||||
|
@ -59,6 +59,7 @@ public:
|
||||
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);
|
||||
void tag_reload_image(const string& filename, void *builtin_data, InterpolationType interpolation);
|
||||
bool is_float_image(const string& filename, void *builtin_data, bool& is_linear);
|
||||
|
||||
void device_update(Device *device, DeviceScene *dscene, Progress& progress);
|
||||
|
@ -2502,6 +2502,23 @@ static void dag_id_flush_update(Main *bmain, Scene *sce, ID *id)
|
||||
}
|
||||
}
|
||||
|
||||
/* Not pretty to iterate all the nodes here, but it's as good as it
|
||||
* could be with the current depsgraph design/
|
||||
*/
|
||||
if (idtype == ID_IM) {
|
||||
FOREACH_NODETREE(bmain, ntree, parent_id) {
|
||||
if (ntree->type == NTREE_SHADER) {
|
||||
bNode *node;
|
||||
for (node = ntree->nodes.first; node; node = node->next) {
|
||||
if (node->id == id) {
|
||||
lib_id_recalc_tag(bmain, &ntree->id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} FOREACH_NODETREE_END
|
||||
}
|
||||
|
||||
if (idtype == ID_MSK) {
|
||||
if (sce->nodetree) {
|
||||
bNode *node;
|
||||
|
@ -48,6 +48,7 @@
|
||||
|
||||
#include "BKE_colortools.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_depsgraph.h"
|
||||
#include "BKE_icons.h"
|
||||
#include "BKE_image.h"
|
||||
#include "BKE_global.h"
|
||||
@ -1866,6 +1867,7 @@ static int image_reload_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
|
||||
// XXX other users?
|
||||
BKE_image_signal(ima, (sima) ? &sima->iuser : NULL, IMA_SIGNAL_RELOAD);
|
||||
DAG_id_tag_update(&ima->id, 0);
|
||||
|
||||
WM_event_add_notifier(C, NC_IMAGE | NA_EDITED, ima);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user