Browse Source

UI: Add padding to scene edges for editing

Add a 10 pixel padding to the sides and remove viewport cutting to
ensure that the editing rectangles are visible even when in the upper
corners.

Also, add a black background for the actual 'scene' in the preview
window so that the scene boundries are actually visible in relation to
the rest of the preview space.
jp9000 11 năm trước cách đây
mục cha
commit
98ddb846dc
2 tập tin đã thay đổi với 55 bổ sung3 xóa
  1. 53 3
      obs/window-basic-main.cpp
  2. 2 0
      obs/window-basic-main.hpp

+ 53 - 3
obs/window-basic-main.cpp

@@ -48,6 +48,8 @@
 #include <QScreen>
 #include <QWindow>
 
+#define PREVIEW_EDGE_SIZE 10
+
 using namespace std;
 
 Q_DECLARE_METATYPE(OBSScene);
@@ -816,6 +818,35 @@ void OBSBasic::ChannelChanged(void *data, calldata_t params)
 				Q_ARG(OBSSource, OBSSource(source)));
 }
 
+void OBSBasic::DrawBackdrop(float cx, float cy)
+{
+	if (!box)
+		return;
+
+	effect_t    solid = obs_get_solid_effect();
+	eparam_t    color = effect_getparambyname(solid, "color");
+	technique_t tech  = effect_gettechnique(solid, "Solid");
+
+	vec4 colorVal;
+	vec4_set(&colorVal, 0.0f, 0.0f, 0.0f, 1.0f);
+	effect_setvec4(solid, color, &colorVal);
+
+	technique_begin(tech);
+	technique_beginpass(tech, 0);
+	gs_matrix_push();
+	gs_matrix_identity();
+	gs_matrix_scale3f(float(cx), float(cy), 1.0f);
+
+	gs_load_vertexbuffer(box);
+	gs_draw(GS_TRISTRIP, 0, 0);
+
+	gs_matrix_pop();
+	technique_endpass(tech);
+	technique_end(tech);
+
+	gs_load_vertexbuffer(nullptr);
+}
+
 void OBSBasic::RenderMain(void *data, uint32_t cx, uint32_t cy)
 {
 	OBSBasic *window = static_cast<OBSBasic*>(data);
@@ -828,18 +859,33 @@ void OBSBasic::RenderMain(void *data, uint32_t cx, uint32_t cy)
 
 	gs_viewport_push();
 	gs_projection_push();
+
+	/* --------------------------------------- */
+
 	gs_ortho(0.0f, float(ovi.base_width), 0.0f, float(ovi.base_height),
 			-100.0f, 100.0f);
 	gs_setviewport(window->previewX, window->previewY,
 			window->previewCX, window->previewCY);
 
+	window->DrawBackdrop(float(ovi.base_width), float(ovi.base_height));
+
 	obs_render_main_view();
+	gs_load_vertexbuffer(nullptr);
 
-	gs_ortho(0.0f, float(window->previewCX), 0.0f, float(window->previewCY),
-			-100.0f, 100.0f);
+	/* --------------------------------------- */
+
+	float right  = float(window->ui->preview->width())  - window->previewX;
+	float bottom = float(window->ui->preview->height()) - window->previewY;
+
+	gs_ortho(-window->previewX, right,
+	         -window->previewY, bottom,
+	         -100.0f, 100.0f);
+	gs_resetviewport();
 
 	window->ui->preview->DrawSceneEditing();
 
+	/* --------------------------------------- */
+
 	gs_projection_pop();
 	gs_viewport_pop();
 
@@ -1014,9 +1060,13 @@ void OBSBasic::ResizePreview(uint32_t cx, uint32_t cy)
 	/* resize preview panel to fix to the top section of the window */
 	targetSize = GetPixelSize(ui->preview);
 	GetScaleAndCenterPos(int(cx), int(cy),
-			targetSize.width(), targetSize.height(),
+			targetSize.width()  - PREVIEW_EDGE_SIZE * 2,
+			targetSize.height() - PREVIEW_EDGE_SIZE * 2,
 			previewX, previewY, previewScale);
 
+	previewX += float(PREVIEW_EDGE_SIZE);
+	previewY += float(PREVIEW_EDGE_SIZE);
+
 	if (isVisible()) {
 		if (resizeTimer)
 			killTimer(resizeTimer);

+ 2 - 0
obs/window-basic-main.hpp

@@ -82,6 +82,8 @@ private:
 
 	int           activeRefs = 0;
 
+	void          DrawBackdrop(float cx, float cy);
+
 	void          SetupEncoders();
 
 	void          CreateDefaultScene();