File: cornerpin.vert

package info (click to toggle)
olive-editor 20181223-2
  • links: PTS
  • area: main
  • in suites: buster
  • size: 2,844 kB
  • sloc: cpp: 20,147; xml: 315; ansic: 16; makefile: 11
file content (67 lines) | stat: -rw-r--r-- 1,750 bytes parent folder | download
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
#version 110
#extension GL_EXT_gpu_shader4 : enable

uniform bool perspective;
uniform vec2 p0;
uniform vec2 p1;
uniform vec2 p2;
uniform vec2 p3;

varying vec2 q;
varying vec2 b1;
varying vec2 b2;
varying vec2 b3;
varying vec2 vTexCoord;

void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;

    if (perspective) {
        float m1 = (p3.y - p0.y)/(p3.x - p0.x);
        float c1 = p0.y - m1 * p0.x;
        float m2 = (p1.y - p2.y)/(p1.x - p2.x);
        float c2 = p2.y - m2 * p2.x;
        float mid_x = (c2 - c1) / (m1 - m2);
        float mid_y = m1 * mid_x + c1;

        float d0 = length(vec2(mid_x - p0.x, mid_y - p0.y));
        float d1 = length(vec2(p1.x - mid_x, mid_y - p1.y));
        float d2 = length(vec2(p3.x - mid_x, p3.y - mid_y));
        float d3 = length(vec2(mid_x - p2.x, p2.y - mid_y));

        float q;

        if (gl_VertexID == 0) {
            q = (d1+d3)/d3;
        } else if (gl_VertexID == 1) {
            q = (d0+d2)/d2;
        } else if (gl_VertexID == 2) {
            q = (d3+d1)/d1;
        } else {
            q = (d2+d0)/d0;
        }

        gl_Position[0] *= q;
        gl_Position[1] *= q;
        gl_Position[3] = q;

        vTexCoord = gl_MultiTexCoord0.xy;
    } else {
        vec2 pos;
        
        if (gl_VertexID == 0) { // top left
            pos = p2;
        } else if (gl_VertexID == 1) { // top right
            pos = p3;
        } else if (gl_VertexID == 2) { // bottom right
            pos = p1;
        } else if (gl_VertexID == 3) { // bottom left
            pos = p0;
        }

        q = pos - p0;
        b1 = p1 - p0;
        b2 = p2 - p0;
        b3 = p0 - p1 - p2 + p3;
    }
}