diff options
Diffstat (limited to 'source/blender/editors/space_image')
-rw-r--r-- | source/blender/editors/space_image/image_edit.c | 40 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_ops.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_image/space_image.c | 10 |
3 files changed, 48 insertions, 8 deletions
diff --git a/source/blender/editors/space_image/image_edit.c b/source/blender/editors/space_image/image_edit.c index 9a6f7431d17..c8edccb0472 100644 --- a/source/blender/editors/space_image/image_edit.c +++ b/source/blender/editors/space_image/image_edit.c @@ -57,9 +57,13 @@ Image *ED_space_image(SpaceImage *sima) return sima->image; } -/* called to assign images to UV faces */ -void ED_space_image_set(Main *bmain, SpaceImage *sima, Object *obedit, Image *ima) +void ED_space_image_set(Main *bmain, SpaceImage *sima, Object *obedit, Image *ima, bool automatic) { + /* Automatically pin image when manually assigned, otherwise it follows object. */ + if (!automatic && sima->image != ima && sima->mode == SI_MODE_UV) { + sima->pin = true; + } + /* change the space ima after because uvedit_face_visible_test uses the space ima * to check if the face is displayed in UV-localview */ sima->image = ima; @@ -81,6 +85,38 @@ void ED_space_image_set(Main *bmain, SpaceImage *sima, Object *obedit, Image *im WM_main_add_notifier(NC_SPACE | ND_SPACE_IMAGE, NULL); } +void ED_space_image_auto_set(const bContext *C, SpaceImage *sima) +{ + if (sima->mode != SI_MODE_UV || sima->pin) { + return; + } + + /* Track image assigned to active face in edit mode. */ + Object *ob = CTX_data_active_object(C); + if (!(ob && (ob->mode & OB_MODE_EDIT) && ED_space_image_show_uvedit(sima, ob))) { + return; + } + + BMEditMesh *em = BKE_editmesh_from_object(ob); + BMesh *bm = em->bm; + BMFace *efa = BM_mesh_active_face_get(bm, true, false); + if (efa == NULL) { + return; + } + + Image *ima = NULL; + ED_object_get_active_image(ob, efa->mat_nr + 1, &ima, NULL, NULL, NULL); + + if (ima != sima->image) { + sima->image = ima; + + if (sima->image) { + Main *bmain = CTX_data_main(C); + BKE_image_signal(bmain, sima->image, &sima->iuser, IMA_SIGNAL_USER_NEW_IMAGE); + } + } +} + Mask *ED_space_image_get_mask(SpaceImage *sima) { return sima->mask_info.mask; diff --git a/source/blender/editors/space_image/image_ops.c b/source/blender/editors/space_image/image_ops.c index 064a4d2ce11..bba336ca2e0 100644 --- a/source/blender/editors/space_image/image_ops.c +++ b/source/blender/editors/space_image/image_ops.c @@ -1300,7 +1300,7 @@ static int image_open_exec(bContext *C, wmOperator *op) } else if (sa && sa->spacetype == SPACE_IMAGE) { SpaceImage *sima = sa->spacedata.first; - ED_space_image_set(bmain, sima, obedit, ima); + ED_space_image_set(bmain, sima, obedit, ima, false); iuser = &sima->iuser; } else { @@ -2461,7 +2461,7 @@ static int image_new_exec(bContext *C, wmOperator *op) RNA_property_update(C, &data->pprop.ptr, data->pprop.prop); } else if (sima) { - ED_space_image_set(bmain, sima, obedit, ima); + ED_space_image_set(bmain, sima, obedit, ima, false); } BKE_image_signal(bmain, ima, (sima) ? &sima->iuser : NULL, IMA_SIGNAL_USER_NEW_IMAGE); @@ -3800,7 +3800,7 @@ static int image_read_viewlayers_exec(bContext *C, wmOperator *UNUSED(op)) ima = BKE_image_verify_viewer(bmain, IMA_TYPE_R_RESULT, "Render Result"); if (sima->image == NULL) { - ED_space_image_set(bmain, sima, NULL, ima); + ED_space_image_set(bmain, sima, NULL, ima, false); } RE_ReadRenderResult(scene, scene); diff --git a/source/blender/editors/space_image/space_image.c b/source/blender/editors/space_image/space_image.c index 6ae4eb9767b..7aa3ea57956 100644 --- a/source/blender/editors/space_image/space_image.c +++ b/source/blender/editors/space_image/space_image.c @@ -100,15 +100,19 @@ static void image_scopes_tag_refresh(ScrArea *sa) static void image_user_refresh_scene(const bContext *C, SpaceImage *sima) { + /* Update scene image user for acquiring render results. */ + sima->iuser.scene = CTX_data_scene(C); + if (sima->image && sima->image->type == IMA_TYPE_R_RESULT) { - /* for render result, try to use the currently rendering scene */ + /* While rendering, prefer scene that is being rendered. */ Scene *render_scene = ED_render_job_get_current_scene(C); if (render_scene) { sima->iuser.scene = render_scene; - return; } } - sima->iuser.scene = CTX_data_scene(C); + + /* Auto switch image to show in UV editor when selection changes. */ + ED_space_image_auto_set(C, sima); } /* ******************** manage regions ********************* */ |