-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathV3dModelManager.h
More file actions
128 lines (89 loc) · 3.67 KB
/
V3dModelManager.h
File metadata and controls
128 lines (89 loc) · 3.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#pragma once
#include <memory>
#include <QtGui/QMouseEvent>
#include <QAbstractScrollArea>
#include <document.h>
#include <page.h>
#include "Rendering/renderheadless.h"
#include "V3dModel.h"
// #define MOUSE_BOUNDARIES
class EventFilter;
class ApplicationEventFilter;
class V3dModelManager {
public:
friend class EventFilter;
friend class ApplicationEventFilter;
V3dModelManager(const Okular::Document* document);
void AddModel(V3dModel model, size_t pageNumber);
QImage RenderModel(size_t pageNumber, size_t modelIndex, int width, int height);
V3dModel& Model(size_t pageNumber, size_t modelIndex);
std::vector<V3dModel>& Models(size_t pageNumber);
bool Empty();
glm::vec2 GetCanvasSize(size_t pageNumber);
void SetDocument(const Okular::Document* document);
bool mouseMoveEvent(QMouseEvent* event);
bool mouseButtonPressEvent(QMouseEvent* event);
bool mouseButtonReleaseEvent(QMouseEvent* event);
bool wheelEvent(QWheelEvent* event);
bool keyPressEvent(QKeyEvent* event);
void DrawMouseBoundaries(QImage* img, size_t pageNumber);
void CacheRequest(Okular::PixmapRequest* request);
private:
void CacheRequestSize(size_t pageNumber, int width, int height, int priority);
void CachePage(size_t pageNumber, Okular::Page* page);
float GetDevicePixelRatio();
#ifdef MOUSE_BOUNDARIES
struct Line {
glm::vec2 start;
glm::vec2 end;
QColor color{ Qt::red };
};
struct Point {
glm::vec2 pos;
QColor color{ Qt::red };
};
std::vector<std::vector<Line>> m_MouseBoundaryLines;
std::vector<std::vector<Point>> m_MouseBoundaryPoints;
#endif
/*
hi: the distance between the top of the viewport and the top of the page
lo: the distance between the bottom of the viewport and the bottom of the page
le: the distance between the left side of the viewport and the left side of the page
ri: the distance between the right side of the viewport and the right side of the page
*/
struct PageBorders {
float hi, lo, le, ri;
int pageNumber{ 0 };
};
// Returns the page borders for all currently visible pages
std::vector<PageBorders> GetPageBordersForVisiblePages();
// Returns the index of the page the mouse is over, or -1 if the mouse is not over a page
int GetPageMouseIsOver();
// Returns the given position relative to the given page in normalized coordinates
glm::vec2 GetNormalizedPositionRelativeToPage(const glm::vec2& pos, int pageNumber);
const Okular::Document* m_Document;
QAbstractScrollArea* GetPageViewWidget();
std::chrono::duration<double> m_MinTimeBetweenRefreshes{ 1.0 / 60.0 }; // In Seconds
std::chrono::time_point<std::chrono::system_clock> m_LastPixmapRefreshTime;
void requestPixmapRefresh(size_t pageNumber);
void refreshPixmap(size_t pageNumber);
std::vector<std::vector<V3dModel>> m_Models;
std::vector<std::vector<QImage>> m_ModelImages;
std::unique_ptr<HeadlessRenderer> m_HeadlessRenderer;
bool m_Dragging{ false };
glm::ivec2 m_MousePosition;
glm::ivec2 m_LastMousePosition;
QAbstractScrollArea* m_PageView{ nullptr };
EventFilter* m_EventFilter{ nullptr };
ApplicationEventFilter* m_ApplicationEventFilter{ nullptr };
std::chrono::time_point<std::chrono::system_clock> m_StartTime{ };
struct RequestCache {
glm::ivec2 size{ 0, 0 };
int priority{ std::numeric_limits<int>::max() };
std::chrono::duration<double> requestTime{ };
};
std::vector<RequestCache> m_CachedRequestSizes;
std::vector<Okular::Page*> m_Pages;
V3dModel* m_ActiveModel{ nullptr };
int m_ActiveModelPage{ -1};
};