mirror of
https://github.com/thepigeongenerator/mcaselector-lite.git
synced 2025-12-16 23:55:45 +01:00
26 lines
1.3 KiB
GLSL
26 lines
1.3 KiB
GLSL
// Copyright (c) 2025 Quinn
|
|
// Licensed under the MIT Licence. See LICENSE for details
|
|
|
|
#version 330 core
|
|
layout(location = 0) in ivec4 rect; // rectangle data
|
|
uniform ivec2 screen; // current screen dimensions
|
|
|
|
/* this vertex shader takes in unsigned integers formatted as (x,y,w,h), which denote rectangles
|
|
* the shader is responsible to output the data for this rectangle in the same format,
|
|
* but transformed to match the OpenGL coördinate space.
|
|
* I found the formula `(x-0.5*l)/0.5*l` to work well for scaling an axis to fit within the -1—1 coördinate space.
|
|
* And for transforming width/height, you just divide by the length of the corresponding axis.
|
|
* I demonstrate this here: https://www.desmos.com/calculator/ptwuyiv6bh */
|
|
void main() {
|
|
// divide the screen x and y coördinates by 2
|
|
// using bit shift because I don't trust the compiler optimiser since I've got less control.
|
|
int w_2 = screen.x >> 1;
|
|
int h_2 = screen.y >> 1;
|
|
|
|
gl_Position = vec4(
|
|
(rect.x - w_2) / float(w_2), // scale the rect X point
|
|
(screen.y - rect.y - h_2) / float(h_2), // scale the rect Y point and invert the axis for top left alignment
|
|
rect.z / float(w_2), // scale the rect width
|
|
rect.w / float(h_2)); // scale the rect height
|
|
}
|