-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAppGLContext.h
More file actions
190 lines (180 loc) · 6.04 KB
/
AppGLContext.h
File metadata and controls
190 lines (180 loc) · 6.04 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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/********************************************************************************
* Copyright (c) 2024 Pleshkov Maksim
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
* which is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
********************************************************************************/
#ifndef AppGLContextH
#define AppGLContextH
//----------------------------------------------------------
#include <Windows.h>
#include "GLtypes.h"
#include <GL/glext.h>
#include <glm/vec4.hpp>
//----------------------------------------------------------
#include <vector>
#include <map>
#include <memory>
//----------------------------------------------------------
class Figure3d_unit;
//Ðåæèìû ðàáîòû ñ âûáðàííîé ôèãóðîé
enum F2Mode {
F2Normal, //Îáû÷íûé (ðåæèì âûáîðà ôèãóðû)
F2CuttingFig //Ð. çàäàíèÿ òî÷åê ïëîñêîñòè ñå÷åíèÿ
};
class AppGLContext final {
private:
//Âðåìåííûå ïàðàìåòðû
static constexpr double yFov = 45.0,
zNear = 0.25, zFar = 50.0;
//Óãîë ïîâîðîòà êàìåðû îòí òî÷êè îáçîðà (ñôåð. êîîðä.)
double Cam_x_ang = 45.0, Cam_y_ang = 45.0;
//Ïîçèöèÿ òî÷êè îáçîðà êàìåðû íà xOy
double Cam_x_vpos = 0.0, Cam_y_vpos = 0.0;
//Ïîçèöèÿ îñíîâàíèÿ êàìåðû â ïðîñòðàíñòâå
double Cam_x_cpos = 0.0, Cam_y_cpos = 0.0,
Cam_z_cpos = 0.0;
//Ðàññòîÿíèå êàìåðû îò òî÷êè îáçîðà
double Cam_distance = 8.0;
//Ãðàíèöû ïîëÿ çðåíèÿ
glm::dvec4 frustum_planes[6];
//Ñïèñîê óê. íà ôèãóðû â ïðîñòðàíñòâå (íå âëàäåþùèé)
std::vector<Figure3d_unit*> Figures;
//Ñïèñîê âñïîì. ôèãóð (äëÿ îïåðàöèé íàä ôèãóðàìè)
//(âëàäåþùèé)
std::vector<Figure3d_unit*> Figure_satellite;
//Óêàçàòåëü íà âûáðàííóþ ôèãóðó
Figure3d_unit* fig_selection = nullptr;
//Êîíòåêñò îòðèñîâêè è îêíà (OpenGL) (âëàäåþùèå)
HWND hwnd;
HGLRC glRC;
HDC glDC;
//Ðàçìåðû îêíà
int wWidth = 0, wHeight = 0;
//Ðåæèì âçàèìîäåéñòâèÿ ñ ôèãóðîé
F2Mode fig_mode = F2Normal;
std::weak_ptr<const AppGLContext> self;
//Ôóíêöèè ðàñøèðåíèÿ ARB_vertex_buffer_object (gl>=1.5)
PFNGLBINDBUFFERPROC glBindBuffer;
PFNGLDELETEQUERIESPROC glDeleteBuffers;
PFNGLGENQUERIESPROC glGenBuffers;
PFNGLBUFFERDATAPROC glBufferData;
bool gl_arb_buffers = false; //Ôëàã ïîääåðæêè
//Ôóíêöèè ðàñøèðåíèÿ GL_vertex/fragment_shader (gl>=2.0)
PFNGLATTACHSHADERPROC glAttachShader;
PFNGLCOMPILESHADERPROC glCompileShader;
PFNGLCREATEPROGRAMPROC glCreateProgram;
PFNGLCREATESHADERPROC glCreateShader;
PFNGLDELETEPROGRAMPROC glDeleteProgram;
PFNGLDELETESHADERPROC glDeleteShader;
PFNGLLINKPROGRAMPROC glLinkProgram;
PFNGLSHADERSOURCEPROC glShaderSource;
PFNGLUSEPROGRAMPROC glUseProgram;
bool gl_shaders = false; //Ôëàã ïîääåðæêè
GLuint phong_shader;
//Âêëþ÷èòü è íàñòðîèòü ïàðàìåòðû îïöèé OpenGL
void Setup_GL_Params();
//Íàñòðîèòü øåéäåðû
void Setup_Shaders();
//Îïðåäåëåíèå ïîääåðæêè è íàñòðîéêà ðàñøèðåíèé OpenGL
//(Íàñòðîéêà óêàçàòåëåé ôóíêöèé è ôëàãîâ ïîääåðæêè)
void Setup_GL_extensions();
//Óäàëèòü âñïîìîãàòåëüíûå ôèãóðû
void ClearSatellite();
AppGLContext(HWND hwnd, int width, int height);
public:
//Íàñòðîéêà ãðàôè÷åñêîãî îêíà è ìàòðèöû ïðîåêöèè
void Setup_viewPort(int width, int height);
//Îáíîâëåíèå ïîçèöèè êàìåðû è ìàòðèöû îáçîðà ôèãóð
void Setup_camera();
//Îòðèñîâêà íîâîãî êàäðà
void DrawFrame() const;
//Íàõîäèòñÿ ëè ôèãóðà â ïîëå çðåíèÿ
bool FrustumCull(Figure3d_unit* fig) const;
//Çàïèñàòü ïîçèöèþ òî÷êè îáçîðà (3), óãîë îáçîðà (2)
//è ïîçèöèþ êàìåðû (3) â ìàññèâ ðàçìåðà 8
void GetCamPos(double*) const;
//Óñòàíîâèòü äèñòàíöèþ îáçîðà êàìåðû
inline double GetCamDst() const {
return Cam_distance;
}
//Óñòàíîâèòü ïîçèöèþ òî÷êè îáçîðà êàìåðû
inline void SetViewPos(double x, double y) {
Cam_x_vpos = x, Cam_y_vpos = y;
}
//Óñòàíîâèòü óãîë îáçîðà êàìåðû
inline void SetCamAng(double x, double y) {
Cam_x_ang = x, Cam_y_ang = y;
}
//Óñòàíîâèòü äèñòàíöèþ îáçîðà êàìåðû
inline void SetCamDst(double d) {
Cam_distance = d;
}
//Äîáàâèòü ôèãóðó â ïðîñòðàíñòâî
void AddFigure(Figure3d_unit*);
//Óäàëèòü ôèãóðó èç ïðîñòðàíñòâà
void RemoveFigure(const Figure3d_unit*);
//Ïîëó÷èòü âûáðàííóþ ôèãóðó
inline Figure3d_unit* GetSelectedFig() const {
return fig_selection;
}
//Óñòàíîâèòü âûáðàííóþ ôèãóðó
inline void SetSelectedFig(Figure3d_unit* fig) {
fig_selection = fig;
}
//Îáðàáîò÷èê ïðîñòîãî íàæàòèÿ
void CtrlSimpleClick(int X, int Y);
//Îáðàáîò÷èê ïîëüçîâàòåëüñêîãî ïîâîðîòà êàìåðû
void CtrlCamRotate(int dX, int dY);
//Îáðàáîò÷èê ïîëüçîâàòåëüñêîãî ìàñøòàáà êàìåðû
void CtrlCamZoom(int dY);
//Îáðàáîò÷èê ïîëüçîâàòåëüñêîãî ïåðåìåùåíèÿ êàìåðû
void CtrlCamMoveXoY(int dX, int dY);
//Óñòàíîâèòü ðåæèì ñå÷åíèÿ
bool SetCuttingMode();
//Îòìåíèòü îïåðàöèþ
bool CancelOperationMode();
//Ïîëó÷èòü òåêóùèé ðåæèì
inline F2Mode GetFigMode() const {
return fig_mode;
}
//Ñîçäàòü è âûáðàòü êîíòåêñòû îêíà è îòðèñîâêè OpenGL
static std::shared_ptr<AppGLContext>
Create(HWND hwnd, int width, int height) {
auto ctx = std::shared_ptr<AppGLContext>(
new AppGLContext(hwnd, width, height));
ctx->self = ctx;
return ctx;
}
~AppGLContext();
//Êîïèðîâàòü êîíòåêñò íåëüçÿ
AppGLContext(AppGLContext&) = delete;
AppGLContext& operator=(AppGLContext&) = delete;
AppGLContext(AppGLContext&&) = delete;
AppGLContext& operator=(AppGLContext&&) = delete;
//Ôóíêöèè ðàñøèðåíèÿ ARB_vertex_buffer_object (gl>=1.5)
inline bool HasVertexBufferObject() const {
return gl_arb_buffers;
}
inline void BindBuffer(GLenum target,
GLuint buffer) const {
glBindBuffer(target, buffer);
}
inline void DeleteBuffers(GLsizei n,
const GLuint *buffers) const {
glDeleteBuffers(n, buffers);
}
inline void GenBuffers(GLsizei n,
GLuint *buffers) const {
glGenBuffers(n, buffers);
}
inline void BufferData(GLenum target, GLsizeiptr size,
const void *data, GLenum usage) const {
glBufferData(target, size, data, usage);
}
};
#endif