Panels scrolling, scissors test fix
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user