Added graphics vulkan demo.
[panamaz] / src / notzed.vulkan.test / classes / vulkan / test / GLMaths.java
1
2 package vulkan.test;
3
4 import static java.lang.Math.*;
5 import java.util.Arrays;
6
7 public class GLMaths {
8         public static void identity4f(float []matrix) {
9                 Arrays.fill(matrix, 0.0f);
10                 for (int i = 0; i < 4; i++)
11                         matrix[i * 4 + i] = 1.0f;
12         }
13
14         public static float length3f(float [] a) {
15                 float sum = 0;
16                 for (int i = 0; i < 3; i++)
17                         sum += a[i] * a[i];
18                 return (float)sqrt(sum);
19         }
20
21         public static void sub3f(float [] c, float [] a, float [] b) {
22                 for (int i = 0; i < 3; i++)
23                         c[i] = a[i] - b[i];
24         }
25
26         public static void norm3f(float [] vec) {
27                 float fix = 1.0f / length3f(vec);
28                 for (int i = 0; i < 3; i++)
29                         vec[i] *= fix;
30         }
31
32         public static void cross3f(float [] c, float [] a, float [] b) {
33                 c[0] = a[1] * b[2] - a[2] * b[1];
34                 c[1] = a[2] * b[0] - a[0] * b[2];
35                 c[2] = a[0] * b[1] - a[1] * b[0];
36         }
37
38         public static float dot3f(float [] a, float [] b) {
39                 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
40         }
41
42         public static float [] mult4x4f(float [] c, float [] b, float [] a) {
43                 c[0] = a[0] * b[0] + a[1] * b[4] + a[2] * b[8] + a[3] * b[12];
44                 c[1] = a[0] * b[1] + a[1] * b[5] + a[2] * b[9] + a[3] * b[13];
45                 c[2] = a[0] * b[2] + a[1] * b[6] + a[2] * b[10] + a[3] * b[14];
46                 c[3] = a[0] * b[3] + a[1] * b[7] + a[2] * b[11] + a[3] * b[15];
47
48                 c[4] = a[4] * b[0] + a[5] * b[4] + a[6] * b[8] + a[7] * b[12];
49                 c[5] = a[4] * b[1] + a[5] * b[5] + a[6] * b[9] + a[7] * b[13];
50                 c[6] = a[4] * b[2] + a[5] * b[6] + a[6] * b[10] + a[7] * b[14];
51                 c[7] = a[4] * b[3] + a[5] * b[7] + a[6] * b[11] + a[7] * b[15];
52
53                 c[8] = a[8] * b[0] + a[9] * b[4] + a[10] * b[8] + a[11] * b[12];
54                 c[9] = a[8] * b[1] + a[9] * b[5] + a[10] * b[9] + a[11] * b[13];
55                 c[10] = a[8] * b[2] + a[9] * b[6] + a[10] * b[10] + a[11] * b[14];
56                 c[11] = a[8] * b[3] + a[9] * b[7] + a[10] * b[11] + a[11] * b[15];
57
58                 c[12] = a[12] * b[0] + a[13] * b[4] + a[14] * b[8] + a[15] * b[12];
59                 c[13] = a[12] * b[1] + a[13] * b[5] + a[14] * b[9] + a[15] * b[13];
60                 c[14] = a[12] * b[2] + a[13] * b[6] + a[14] * b[10] + a[15] * b[14];
61                 c[15] = a[12] * b[3] + a[13] * b[7] + a[14] * b[11] + a[15] * b[15];
62
63                 return c;
64         }
65
66         public static void lookAt(float []mat, float []eye, float []centre, float []up) {
67                 float forward[] = new float[3], side[] = new float[3], u[] = new float[3];
68
69                 sub3f(forward, centre, eye);
70                 norm3f(forward);
71                 cross3f(side, forward, up);
72                 norm3f(side);
73                 cross3f(u, side, forward);
74
75                 mat[0] = side[0];
76                 mat[4] = side[1];
77                 mat[8] = side[2];
78
79                 mat[1] = u[0];
80                 mat[5] = u[1];
81                 mat[9] = u[2];
82
83                 mat[2] = -forward[0];
84                 mat[6] = -forward[1];
85                 mat[10] = -forward[2];
86
87                 mat[12] = -dot3f(side, eye);
88                 mat[13] = -dot3f(u, eye);
89                 mat[14] = dot3f(forward, eye);
90
91                 mat[3] = 0.0f;
92                 mat[7] = 0.0f;
93                 mat[11] = 0.0f;
94
95                 mat[15] = 1.0f;
96         }
97
98         public static void frustum(float []mat, float left, float right, float bottom, float top, float znear, float zfar) {
99                 float temp, temp2, temp3, temp4;
100
101                 temp = 2.0f * znear;
102                 temp2 = right - left;
103                 temp3 = top - bottom;
104                 temp4 = zfar - znear;
105                 mat[0] = temp / temp2;
106                 mat[1] = 0.0f;
107                 mat[2] = 0.0f;
108                 mat[3] = 0.0f;
109                 mat[4] = 0.0f;
110                 mat[5] = temp / temp3;
111                 mat[6] = 0.0f;
112                 mat[7] = 0.0f;
113                 mat[8] = (right + left) / temp2;
114                 mat[9] = (top + bottom) / temp3;
115                 mat[10] = (-zfar - znear) / temp4;
116                 mat[11] = -1.0f;
117                 mat[12] = 0.0f;
118                 mat[13] = 0.0f;
119                 mat[14] = (-temp * zfar) / temp4;
120                 mat[15] = 0.0f;
121         }
122
123         public static void perspective(float []mat, float fovy, float aspect, float znear, float zfar) {
124                 float ymax, xmax;
125
126                 ymax = znear * (float)tan(fovy * 0.5f);
127                 xmax = ymax * aspect;
128
129                 frustum(mat, -xmax, xmax, -ymax, ymax, znear, zfar);
130         }
131 }