mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
libobs: Force sceneitem transform update if scene dimensions change
This commit is contained in:
+23
-8
@@ -925,10 +925,9 @@ static void scene_video_tick(void *data, float seconds)
|
||||
}
|
||||
|
||||
/* assumes video lock */
|
||||
static void
|
||||
update_transforms_and_prune_sources(obs_scene_t *scene,
|
||||
obs_scene_item_ptr_array_t *remove_items,
|
||||
obs_sceneitem_t *group_sceneitem)
|
||||
static void update_transforms_and_prune_sources(
|
||||
obs_scene_t *scene, obs_scene_item_ptr_array_t *remove_items,
|
||||
obs_sceneitem_t *group_sceneitem, bool scene_size_changed)
|
||||
{
|
||||
struct obs_scene_item *item = scene->first_item;
|
||||
bool rebuild_group =
|
||||
@@ -951,12 +950,13 @@ update_transforms_and_prune_sources(obs_scene_t *scene,
|
||||
|
||||
video_lock(group_scene);
|
||||
update_transforms_and_prune_sources(group_scene,
|
||||
remove_items, item);
|
||||
remove_items, item,
|
||||
scene_size_changed);
|
||||
video_unlock(group_scene);
|
||||
}
|
||||
|
||||
if (os_atomic_load_bool(&item->update_transform) ||
|
||||
source_size_changed(item)) {
|
||||
source_size_changed(item) || scene_size_changed) {
|
||||
|
||||
update_item_transform(item, true);
|
||||
rebuild_group = true;
|
||||
@@ -969,6 +969,19 @@ update_transforms_and_prune_sources(obs_scene_t *scene,
|
||||
resize_group(group_sceneitem);
|
||||
}
|
||||
|
||||
static inline bool scene_size_changed(obs_scene_t *scene)
|
||||
{
|
||||
uint32_t width = scene_getwidth(scene);
|
||||
uint32_t height = scene_getheight(scene);
|
||||
|
||||
if (width == scene->last_width && height == scene->last_height)
|
||||
return false;
|
||||
|
||||
scene->last_width = width;
|
||||
scene->last_height = height;
|
||||
return true;
|
||||
}
|
||||
|
||||
static void scene_video_render(void *data, gs_effect_t *effect)
|
||||
{
|
||||
obs_scene_item_ptr_array_t remove_items;
|
||||
@@ -980,7 +993,9 @@ static void scene_video_render(void *data, gs_effect_t *effect)
|
||||
video_lock(scene);
|
||||
|
||||
if (!scene->is_group) {
|
||||
update_transforms_and_prune_sources(scene, &remove_items, NULL);
|
||||
bool size_changed = scene_size_changed(scene);
|
||||
update_transforms_and_prune_sources(scene, &remove_items, NULL,
|
||||
size_changed);
|
||||
}
|
||||
|
||||
gs_blend_state_push();
|
||||
@@ -4238,7 +4253,7 @@ void obs_scene_prune_sources(obs_scene_t *scene)
|
||||
da_init(remove_items);
|
||||
|
||||
video_lock(scene);
|
||||
update_transforms_and_prune_sources(scene, &remove_items, NULL);
|
||||
update_transforms_and_prune_sources(scene, &remove_items, NULL, false);
|
||||
video_unlock(scene);
|
||||
|
||||
for (size_t i = 0; i < remove_items.num; i++)
|
||||
|
||||
@@ -110,6 +110,9 @@ struct obs_scene {
|
||||
uint32_t cx;
|
||||
uint32_t cy;
|
||||
|
||||
uint32_t last_width;
|
||||
uint32_t last_height;
|
||||
|
||||
int64_t id_counter;
|
||||
|
||||
pthread_mutex_t video_mutex;
|
||||
|
||||
Reference in New Issue
Block a user