Panels scrolling, scissors test fix

This commit is contained in:
MihailRis
2023-11-23 13:36:24 +03:00
parent e6c9a38f0c
commit be807535f5
10 changed files with 97 additions and 15 deletions
+2
View File
@@ -10,6 +10,7 @@ float Events::deltaX = 0.0f;
float Events::deltaY = 0.0f;
float Events::x = 0.0f;
float Events::y = 0.0f;
int Events::scroll = 0;
bool Events::_cursor_locked = false;
bool Events::_cursor_started = false;
std::vector<uint> Events::codepoints;
@@ -62,6 +63,7 @@ void Events::pullEvents(){
_current++;
deltaX = 0.0f;
deltaY = 0.0f;
scroll = 0;
codepoints.clear();
pressedKeys.clear();
glfwPollEvents();
+1
View File
@@ -19,6 +19,7 @@ public:
static float deltaY;
static float x;
static float y;
static int scroll;
static bool _cursor_locked;
static bool _cursor_started;
static std::vector<uint> codepoints;
+18 -2
View File
@@ -53,6 +53,10 @@ void key_callback(GLFWwindow*, int key, int scancode, int action, int /*mode*/)
}
}
void scroll_callback(GLFWwindow*, double xoffset, double yoffset) {
Events::scroll += yoffset;
}
void window_size_callback(GLFWwindow*, int width, int height) {
glViewport(0, 0, width, height);
Window::width = width;
@@ -105,6 +109,7 @@ int Window::initialize(DisplaySettings& settings){
glfwSetCursorPosCallback(window, cursor_position_callback);
glfwSetWindowSizeCallback(window, window_size_callback);
glfwSetCharCallback(window, character_callback);
glfwSetScrollCallback(window, scroll_callback);
glfwSwapInterval(settings.swapInterval);
return 0;
@@ -139,13 +144,20 @@ void Window::pushScissor(vec4 area) {
}
scissorStack.push(scissorArea);
area.z += area.x;
area.w += area.y;
area.x = fmax(area.x, scissorArea.x);
area.y = fmax(area.y, scissorArea.y);
area.z = fmin(area.z, scissorArea.z);
area.w = fmin(area.w, scissorArea.w);
glScissor(area.x, Window::height-area.y-area.w, area.z, area.w);
if (area.z < 0.0f || area.w < 0.0f) {
glScissor(0, 0, 0, 0);
} else {
glScissor(area.x, Window::height-area.w, area.z-area.x, area.w-area.y);
}
scissorArea = area;
}
@@ -156,7 +168,11 @@ void Window::popScissor() {
}
vec4 area = scissorStack.top();
scissorStack.pop();
glScissor(area.x, Window::height-area.y-area.w, area.z, area.w);
if (area.z < 0.0f || area.w < 0.0f) {
glScissor(0, 0, 0, 0);
} else {
glScissor(area.x, Window::height-area.w, area.z-area.x, area.w-area.y);
}
if (scissorStack.empty()) {
glDisable(GL_SCISSOR_TEST);
}