diff --git a/libobs/obs-scene.c b/libobs/obs-scene.c index 8948027fc..3e735883c 100644 --- a/libobs/obs-scene.c +++ b/libobs/obs-scene.c @@ -30,6 +30,8 @@ static void get_ungrouped_transform(obs_sceneitem_t *group, struct vec2 *pos, struct vec2 *scale, float *rot); +static inline bool crop_enabled(const struct obs_sceneitem_crop *crop); +static inline bool item_texture_enabled(const struct obs_scene_item *item); /* NOTE: For proper mutex lock order (preventing mutual cross-locks), never * lock the graphics mutex inside either of the scene mutexes. @@ -404,6 +406,18 @@ static void update_item_transform(struct obs_scene_item *item) calldata_set_ptr(¶ms, "item", item); signal_parent(item->parent, "item_transform", ¶ms); + if (item->item_render && !item_texture_enabled(item)) { + obs_enter_graphics(); + gs_texrender_destroy(item->item_render); + item->item_render = NULL; + obs_leave_graphics(); + + } else if (!item->item_render && item_texture_enabled(item)) { + obs_enter_graphics(); + item->item_render = gs_texrender_create(GS_RGBA, GS_ZS_NONE); + obs_leave_graphics(); + } + os_atomic_set_bool(&item->update_transform, false); } @@ -2135,8 +2149,6 @@ static inline bool crop_equal(const struct obs_sceneitem_crop *crop1, void obs_sceneitem_set_crop(obs_sceneitem_t *item, const struct obs_sceneitem_crop *crop) { - bool item_tex_now_enabled; - if (!obs_ptr_valid(item, "obs_sceneitem_set_crop")) return; if (!obs_ptr_valid(crop, "obs_sceneitem_set_crop")) @@ -2144,26 +2156,12 @@ void obs_sceneitem_set_crop(obs_sceneitem_t *item, if (crop_equal(crop, &item->crop)) return; - item_tex_now_enabled = crop_enabled(crop) || - scale_filter_enabled(item) || item_is_scene(item); - - obs_enter_graphics(); - - if (!item_tex_now_enabled) { - gs_texrender_destroy(item->item_render); - item->item_render = NULL; - - } else if (!item->item_render) { - item->item_render = gs_texrender_create(GS_RGBA, GS_ZS_NONE); - } - memcpy(&item->crop, crop, sizeof(*crop)); if (item->crop.left < 0) item->crop.left = 0; if (item->crop.right < 0) item->crop.right = 0; if (item->crop.top < 0) item->crop.top = 0; if (item->crop.bottom < 0) item->crop.bottom = 0; - obs_leave_graphics(); os_atomic_set_bool(&item->update_transform, true); } @@ -2187,18 +2185,6 @@ void obs_sceneitem_set_scale_filter(obs_sceneitem_t *item, item->scale_filter = filter; - obs_enter_graphics(); - - if (!item_texture_enabled(item)) { - gs_texrender_destroy(item->item_render); - item->item_render = NULL; - - } else if (!item->item_render) { - item->item_render = gs_texrender_create(GS_RGBA, GS_ZS_NONE); - } - - obs_leave_graphics(); - os_atomic_set_bool(&item->update_transform, true); }