Project

General

Profile

Download (7.64 KB) Statistics
| Branch: | Revision:

library / src / main / java / org / distorted / library / helpers / MatrixHelper.java @ c0255951

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2023 Leszek Koltunski  leszek@koltunski.pl                                          //
3
//                                                                                               //
4
// This file is part of Distorted.                                                               //
5
//                                                                                               //
6
// This library is free software; you can redistribute it and/or                                 //
7
// modify it under the terms of the GNU Lesser General Public                                    //
8
// License as published by the Free Software Foundation; either                                  //
9
// version 2.1 of the License, or (at your option) any later version.                            //
10
//                                                                                               //
11
// This library is distributed in the hope that it will be useful,                               //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU                             //
14
// Lesser General Public License for more details.                                               //
15
//                                                                                               //
16
// You should have received a copy of the GNU Lesser General Public                              //
17
// License along with this library; if not, write to the Free Software                           //
18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

    
21
package org.distorted.library.helpers;
22

    
23
///////////////////////////////////////////////////////////////////////////////////////////////////
24

    
25
public class MatrixHelper
26
  {
27
  public static void setIdentity(float[] output)
28
    {
29
    output[ 0] = 1;
30
    output[ 1] = 0;
31
    output[ 2] = 0;
32
    output[ 3] = 0;
33
    output[ 4] = 0;
34
    output[ 5] = 1;
35
    output[ 6] = 0;
36
    output[ 7] = 0;
37
    output[ 8] = 0;
38
    output[ 9] = 0;
39
    output[10] = 1;
40
    output[11] = 0;
41
    output[12] = 0;
42
    output[13] = 0;
43
    output[14] = 0;
44
    output[15] = 1;
45
    }
46

    
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48

    
49
  public static void multiply(float[] output, float[] m1, float[] m2)
50
    {
51
    output[ 0] = m1[ 0]*m2[ 0] + m1[ 4]*m2[ 1] + m1[ 8]*m2[ 2] + m1[12]*m2[ 3];
52
    output[ 1] = m1[ 1]*m2[ 0] + m1[ 5]*m2[ 1] + m1[ 9]*m2[ 2] + m1[13]*m2[ 3];
53
    output[ 2] = m1[ 2]*m2[ 0] + m1[ 6]*m2[ 1] + m1[10]*m2[ 2] + m1[14]*m2[ 3];
54
    output[ 3] = m1[ 3]*m2[ 0] + m1[ 7]*m2[ 1] + m1[11]*m2[ 2] + m1[15]*m2[ 3];
55

    
56
    output[ 4] = m1[ 0]*m2[ 4] + m1[ 4]*m2[ 5] + m1[ 8]*m2[ 6] + m1[12]*m2[ 7];
57
    output[ 5] = m1[ 1]*m2[ 4] + m1[ 5]*m2[ 5] + m1[ 9]*m2[ 6] + m1[13]*m2[ 7];
58
    output[ 6] = m1[ 2]*m2[ 4] + m1[ 6]*m2[ 5] + m1[10]*m2[ 6] + m1[14]*m2[ 7];
59
    output[ 7] = m1[ 3]*m2[ 4] + m1[ 7]*m2[ 5] + m1[11]*m2[ 6] + m1[15]*m2[ 7];
60

    
61
    output[ 8] = m1[ 0]*m2[ 8] + m1[ 4]*m2[ 9] + m1[ 8]*m2[10] + m1[12]*m2[11];
62
    output[ 9] = m1[ 1]*m2[ 8] + m1[ 5]*m2[ 9] + m1[ 9]*m2[10] + m1[13]*m2[11];
63
    output[10] = m1[ 2]*m2[ 8] + m1[ 6]*m2[ 9] + m1[10]*m2[10] + m1[14]*m2[11];
64
    output[11] = m1[ 3]*m2[ 8] + m1[ 7]*m2[ 9] + m1[11]*m2[10] + m1[15]*m2[11];
65

    
66
    output[12] = m1[ 0]*m2[12] + m1[ 4]*m2[13] + m1[ 8]*m2[14] + m1[12]*m2[15];
67
    output[13] = m1[ 1]*m2[12] + m1[ 5]*m2[13] + m1[ 9]*m2[14] + m1[13]*m2[15];
68
    output[14] = m1[ 2]*m2[12] + m1[ 6]*m2[13] + m1[10]*m2[14] + m1[14]*m2[15];
69
    output[15] = m1[ 3]*m2[12] + m1[ 7]*m2[13] + m1[11]*m2[14] + m1[15]*m2[15];
70
    }
71

    
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73

    
74
  public static void frustum(float[] output, float l, float r, float b, float t, float n, float f)
75
    {
76
    output[0]  =  2 * n / (r - l);
77
    output[1]  =  0;
78
    output[2]  =  0;
79
    output[3]  =  0;
80
    output[4]  =  0;
81
    output[5]  =  2 * n / (t - b);
82
    output[6]  =  0;
83
    output[7]  =  0;
84
    output[8]  =  (r + l) / (r - l);
85
    output[9]  =  (t + b) / (t - b);
86
    output[10] = -(f + n) / (f - n);
87
    output[11] = -1;
88
    output[12] =  0;
89
    output[13] =  0;
90
    output[14] = -(2 * f * n) / (f - n);
91
    output[15] =  0;
92
    }
93

    
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95

    
96
  public static void ortho(float[] output, float l, float r, float b, float t, float n, float f)
97
    {
98
    output[0]  =  2 / (r - l);
99
    output[1]  =  0;
100
    output[2]  =  0;
101
    output[3]  =  0;
102
    output[4]  =  0;
103
    output[5]  =  2 / (t - b);
104
    output[6]  =  0;
105
    output[7]  =  0;
106
    output[8]  =  0;
107
    output[9]  =  0;
108
    output[10] = -2 / (f - n);
109
    output[11] =  0;
110
    output[12] = -(r + l) / (r - l);
111
    output[13] = -(t + b) / (t - b);
112
    output[14] = -(f + n) / (f - n);
113
    output[15] =  1;
114
    }
115

    
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117

    
118
  public static void setLookAt(float[] output, float eyeX , float eyeY , float eyeZ ,
119
                                               float lookX, float lookY, float lookZ,
120
                                               float upX  , float upY  , float upZ  )
121
    {
122
    // TODO
123
    }
124

    
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126
// this is android.opengl.Matrix.rotateM(), but with pre-computed sin and cos of the angle
127
// and also we have to pre-allocate and pass here two temp arrays.
128

    
129
  public static void rotateSinCos(float[] output, float[] tmp1, float[] tmp2, float sin, float cos, float x, float y, float z)
130
    {
131
    tmp1[0]  = (1-cos)*x*x + cos;
132
    tmp1[1]  = (1-cos)*x*y + sin*z;
133
    tmp1[2]  = (1-cos)*x*z - sin*y;
134
    tmp1[3]  = 0;
135
    tmp1[4]  = (1-cos)*x*y - sin*z;
136
    tmp1[5]  = (1-cos)*y*y + cos;
137
    tmp1[6]  = (1-cos)*y*z + sin*x;
138
    tmp1[7]  = 0;
139
    tmp1[8]  = (1-cos)*x*z + sin*y;
140
    tmp1[9]  = (1-cos)*y*z - sin*x;
141
    tmp1[10] = (1-cos)*z*z + cos;
142
    tmp1[11] = 0;
143
    tmp1[12] = 0;
144
    tmp1[13] = 0;
145
    tmp1[14] = 0;
146
    tmp1[15] = 1;
147

    
148
    tmp2[0]  =  output[ 0];
149
    tmp2[1]  =  output[ 1];
150
    tmp2[2]  =  output[ 2];
151
    tmp2[3]  =  output[ 3];
152
    tmp2[4]  =  output[ 4];
153
    tmp2[5]  =  output[ 5];
154
    tmp2[6]  =  output[ 6];
155
    tmp2[7]  =  output[ 7];
156
    tmp2[8]  =  output[ 8];
157
    tmp2[9]  =  output[ 9];
158
    tmp2[10] =  output[10];
159
    tmp2[11] =  output[11];
160
    tmp2[12] =  output[12];
161
    tmp2[13] =  output[13];
162
    tmp2[14] =  output[14];
163
    tmp2[15] =  output[15];
164

    
165
    multiply(output,tmp2,tmp1);
166
    }
167

    
168
///////////////////////////////////////////////////////////////////////////////////////////////////
169

    
170
  public static void translate(float[] output, float dx, float dy, float dz)
171
    {
172
    output[12] += ( output[ 0]*dx + output[ 4]*dy + output[ 8]*dz);
173
    output[13] += ( output[ 1]*dx + output[ 5]*dy + output[ 9]*dz);
174
    output[14] += ( output[ 2]*dx + output[ 6]*dy + output[10]*dz);
175
    output[15] += ( output[ 3]*dx + output[ 7]*dy + output[11]*dz);
176
    }
177

    
178
///////////////////////////////////////////////////////////////////////////////////////////////////
179

    
180
  public static void scale(float[] output, float sx, float sy, float sz)
181
    {
182
    output[ 0] *= sx;
183
    output[ 1] *= sx;
184
    output[ 2] *= sx;
185
    output[ 3] *= sx;
186

    
187
    output[ 4] *= sy;
188
    output[ 5] *= sy;
189
    output[ 6] *= sy;
190
    output[ 7] *= sy;
191

    
192
    output[ 8] *= sz;
193
    output[ 9] *= sz;
194
    output[10] *= sz;
195
    output[11] *= sz;
196
    }
197
  }
(1-1/2)