diff --git a/obs/window-basic-preview.cpp b/obs/window-basic-preview.cpp index 201b147ab..429c6d77a 100644 --- a/obs/window-basic-preview.cpp +++ b/obs/window-basic-preview.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -706,10 +707,31 @@ bool OBSBasicPreview::DrawSelectedItem(obs_scene_t *scene, OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); - gs_load_vertexbuffer(main->circle); - matrix4 boxTransform; + matrix4 invBoxTransform; obs_sceneitem_get_box_transform(item, &boxTransform); + matrix4_inv(&invBoxTransform, &boxTransform); + + vec3 bounds[] = { + {{{0.f, 0.f, 0.f}}}, + {{{1.f, 0.f, 0.f}}}, + {{{0.f, 1.f, 0.f}}}, + {{{1.f, 1.f, 0.f}}}, + }; + + bool visible = std::all_of(std::begin(bounds), std::end(bounds), + [&](const vec3 &b) + { + vec3 pos; + vec3_transform(&pos, &b, &boxTransform); + vec3_transform(&pos, &pos, &invBoxTransform); + return CloseFloat(pos.x, b.x) && CloseFloat(pos.y, b.y); + }); + + if (!visible) + return true; + + gs_load_vertexbuffer(main->circle); DrawCircleAtPos(0.0f, 0.0f, boxTransform, main->previewScale); DrawCircleAtPos(0.0f, 1.0f, boxTransform, main->previewScale);