obs-studio/UI/multiview.hpp

71 lines
1.9 KiB
C++

#pragma once
#include <obs.hpp>
#include <vector>
enum class MultiviewLayout : uint8_t {
HORIZONTAL_TOP_8_SCENES = 0,
HORIZONTAL_BOTTOM_8_SCENES = 1,
VERTICAL_LEFT_8_SCENES = 2,
VERTICAL_RIGHT_8_SCENES = 3,
HORIZONTAL_TOP_24_SCENES = 4,
HORIZONTAL_TOP_18_SCENES = 5,
SCENES_ONLY_4_SCENES = 6,
SCENES_ONLY_9_SCENES = 7,
SCENES_ONLY_16_SCENES = 8,
SCENES_ONLY_25_SCENES = 9,
};
class Multiview {
public:
Multiview();
~Multiview();
void Update(MultiviewLayout multiviewLayout, bool drawLabel,
bool drawSafeArea);
void Render(uint32_t cx, uint32_t cy);
OBSSource GetSourceByPosition(int x, int y);
private:
bool drawLabel, drawSafeArea;
MultiviewLayout multiviewLayout;
size_t maxSrcs, numSrcs;
gs_vertbuffer_t *actionSafeMargin = nullptr;
gs_vertbuffer_t *graphicsSafeMargin = nullptr;
gs_vertbuffer_t *fourByThreeSafeMargin = nullptr;
gs_vertbuffer_t *leftLine = nullptr;
gs_vertbuffer_t *topLine = nullptr;
gs_vertbuffer_t *rightLine = nullptr;
std::vector<OBSWeakSource> multiviewScenes;
std::vector<OBSSource> multiviewLabels;
// Multiview position helpers
float thickness = 4;
float offset, thicknessx2 = thickness * 2, pvwprgCX, pvwprgCY, sourceX,
sourceY, labelX, labelY, scenesCX, scenesCY, ppiCX, ppiCY,
siX, siY, siCX, siCY, ppiScaleX, ppiScaleY, siScaleX,
siScaleY, fw, fh, ratio;
// argb colors
static const uint32_t outerColor = 0xFFD0D0D0;
static const uint32_t labelColor = 0xD91F1F1F;
static const uint32_t backgroundColor = 0xFF000000;
static const uint32_t previewColor = 0xFF00D000;
static const uint32_t programColor = 0xFFD00000;
};
static inline void startRegion(int vX, int vY, int vCX, int vCY, float oL,
float oR, float oT, float oB)
{
gs_projection_push();
gs_viewport_push();
gs_set_viewport(vX, vY, vCX, vCY);
gs_ortho(oL, oR, oT, oB, -100.0f, 100.0f);
}
static inline void endRegion()
{
gs_viewport_pop();
gs_projection_pop();
}