static void rna_MovieClipUser_proxy_render_settings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
{
	ID *id = (ID *) ptr->id.data;
	MovieClipUser *user = (MovieClipUser *) ptr->data;

	/* when changing render settings of space clip user
	 * clear cache for clip, so all the memory is available
	 * for new render settings
	 */
	if (GS(id->name) == ID_SCR) {
		bScreen *screen = (bScreen *) id;
		ScrArea *area;
		SpaceLink *sl;

		for (area = screen->areabase.first; area; area = area->next) {
			for (sl = area->spacedata.first; sl; sl = sl->next) {
				if (sl->spacetype == SPACE_CLIP) {
					SpaceClip *sc = (SpaceClip *) sl;

					if (&sc->user == user) {
						MovieClip *clip = ED_space_clip_get_clip(sc);

						if (clip && (clip->flag & MCLIP_USE_PROXY))
							BKE_movieclip_clear_cache(clip);

						break;
					}
				}
			}
		}
	}
}
Beispiel #2
0
void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip)
{
	MovieClip *old_clip;
	bool old_clip_visible = false;

	if (!screen && C)
		screen = CTX_wm_screen(C);

	old_clip = sc->clip;
	sc->clip = clip;

	id_us_ensure_real((ID *)sc->clip);

	if (screen && sc->view == SC_VIEW_CLIP) {
		ScrArea *area;
		SpaceLink *sl;

		for (area = screen->areabase.first; area; area = area->next) {
			for (sl = area->spacedata.first; sl; sl = sl->next) {
				if (sl->spacetype == SPACE_CLIP) {
					SpaceClip *cur_sc = (SpaceClip *) sl;

					if (cur_sc != sc) {
						if (cur_sc->view == SC_VIEW_CLIP) {
							if (cur_sc->clip == old_clip)
								old_clip_visible = true;
						}
						else {
							if (cur_sc->clip == old_clip || cur_sc->clip == NULL) {
								cur_sc->clip = clip;
							}
						}
					}
				}
			}
		}
	}

	/* If clip is no longer visible on screen, free memory used by it's cache */
	if (old_clip && old_clip != clip && !old_clip_visible) {
		BKE_movieclip_clear_cache(old_clip);
	}

	if (C)
		WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip);
}