window-basic-preview.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #pragma once
  2. #include <obs.hpp>
  3. #include <graphics/vec2.h>
  4. #include <graphics/matrix4.h>
  5. #include "qt-display.hpp"
  6. #include "obs-app.hpp"
  7. class OBSBasic;
  8. class QMouseEvent;
  9. #define ITEM_LEFT (1<<0)
  10. #define ITEM_RIGHT (1<<1)
  11. #define ITEM_TOP (1<<2)
  12. #define ITEM_BOTTOM (1<<3)
  13. enum class ItemHandle : uint32_t {
  14. None = 0,
  15. TopLeft = ITEM_TOP | ITEM_LEFT,
  16. TopCenter = ITEM_TOP,
  17. TopRight = ITEM_TOP | ITEM_RIGHT,
  18. CenterLeft = ITEM_LEFT,
  19. CenterRight = ITEM_RIGHT,
  20. BottomLeft = ITEM_BOTTOM | ITEM_LEFT,
  21. BottomCenter = ITEM_BOTTOM,
  22. BottomRight = ITEM_BOTTOM | ITEM_RIGHT
  23. };
  24. enum class ScalingMode : uint32_t {
  25. Window = 0,
  26. Canvas = 1,
  27. Output = 2
  28. };
  29. class OBSBasicPreview : public OBSQTDisplay {
  30. Q_OBJECT
  31. private:
  32. obs_sceneitem_crop startCrop;
  33. vec2 startItemPos;
  34. vec2 cropSize;
  35. OBSSceneItem stretchItem;
  36. ItemHandle stretchHandle = ItemHandle::None;
  37. ScalingMode scale = ScalingMode::Window;
  38. vec2 stretchItemSize;
  39. matrix4 screenToItem;
  40. matrix4 itemToScreen;
  41. vec2 startPos;
  42. vec2 lastMoveOffset;
  43. vec2 scrollingFrom;
  44. vec2 scrollingOffset;
  45. bool mouseDown = false;
  46. bool mouseMoved = false;
  47. bool mouseOverItems = false;
  48. bool cropping = false;
  49. bool locked = false;
  50. bool scrollMode = false;
  51. static vec2 GetMouseEventPos(QMouseEvent *event);
  52. static bool DrawSelectedItem(obs_scene_t *scene, obs_sceneitem_t *item,
  53. void *param);
  54. static OBSSceneItem GetItemAtPos(const vec2 &pos, bool selectBelow);
  55. static bool SelectedAtPos(const vec2 &pos);
  56. static void DoSelect(const vec2 &pos);
  57. static void DoCtrlSelect(const vec2 &pos);
  58. static vec3 GetSnapOffset(const vec3 &tl, const vec3 &br);
  59. void GetStretchHandleData(const vec2 &pos);
  60. void SnapStretchingToScreen(vec3 &tl, vec3 &br);
  61. void ClampAspect(vec3 &tl, vec3 &br, vec2 &size, const vec2 &baseSize);
  62. vec3 CalculateStretchPos(const vec3 &tl, const vec3 &br);
  63. void CropItem(const vec2 &pos);
  64. void StretchItem(const vec2 &pos);
  65. static void SnapItemMovement(vec2 &offset);
  66. void MoveItems(const vec2 &pos);
  67. void ProcessClick(const vec2 &pos);
  68. public:
  69. OBSBasicPreview(QWidget *parent, Qt::WindowFlags flags = 0);
  70. virtual void keyPressEvent(QKeyEvent *event) override;
  71. virtual void keyReleaseEvent(QKeyEvent *event) override;
  72. virtual void mousePressEvent(QMouseEvent *event) override;
  73. virtual void mouseReleaseEvent(QMouseEvent *event) override;
  74. virtual void mouseMoveEvent(QMouseEvent *event) override;
  75. void DrawSceneEditing();
  76. void ResetScrollingOffset();
  77. inline void SetLocked(bool newLockedVal) {locked = newLockedVal;}
  78. inline void ToggleLocked() {locked = !locked;}
  79. inline bool Locked() const {return locked;}
  80. inline void SetScaling(ScalingMode newScaledVal) {scale = newScaledVal;}
  81. inline ScalingMode GetScalingMode() const {return scale;}
  82. inline float ScrollX() const {return scrollingOffset.x;}
  83. inline float ScrollY() const {return scrollingOffset.y;}
  84. /* use libobs allocator for alignment because the matrices itemToScreen
  85. * and screenToItem may contain SSE data, which will cause SSE
  86. * instructions to crash if the data is not aligned to at least a 16
  87. * byte boundary. */
  88. static inline void* operator new(size_t size) {return bmalloc(size);}
  89. static inline void operator delete(void* ptr) {bfree(ptr);}
  90. };