Project

General

Profile

« Previous | Next » 

Revision cdcb01f0

Added by Leszek Koltunski 4 days ago

first two files converted to Kotlin

View differences:

build.gradle
1
plugins {
2
    alias(libs.plugins.kotlin.android)
3
}
1 4
apply plugin: 'com.android.library'
2 5

  
3 6
android {
......
7 10
            keyAlias = 'distorted'
8 11
        }
9 12
    }
10
    compileSdk 34
13
    compileSdk 35
11 14

  
12 15
    defaultConfig {
13 16
        minSdkVersion 21
14
        targetSdkVersion 34
15
        externalNativeBuild {
16
            cmake {
17
                cppFlags ''
18
            }
19
        }
17
        targetSdk 35
20 18
    }
21 19

  
22 20
    buildTypes {
......
40 38
            version '3.22.1'
41 39
        }
42 40
    }
41
    kotlinOptions {
42
        jvmTarget = '11'
43
    }
44
}
45

  
46
dependencies {
47
    implementation libs.core.ktx
43 48
}
src/main/java/org/distorted/library/helpers/MatrixHelper.kt
17 17
// License along with this library; if not, write to the Free Software                           //
18 18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 19
///////////////////////////////////////////////////////////////////////////////////////////////////
20

  
21
package org.distorted.library.helpers;
20
package org.distorted.library.helpers
22 21

  
23 22
///////////////////////////////////////////////////////////////////////////////////////////////////
24 23

  
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;
24
object MatrixHelper {
25
    fun setIdentity(output: FloatArray) {
26
        output[0] = 1f
27
        output[1] = 0f
28
        output[2] = 0f
29
        output[3] = 0f
30
        output[4] = 0f
31
        output[5] = 1f
32
        output[6] = 0f
33
        output[7] = 0f
34
        output[8] = 0f
35
        output[9] = 0f
36
        output[10] = 1f
37
        output[11] = 0f
38
        output[12] = 0f
39
        output[13] = 0f
40
        output[14] = 0f
41
        output[15] = 1f
45 42
    }
46 43

  
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];
44
    ///////////////////////////////////////////////////////////////////////////////////////////////////
45
    @kotlin.jvm.JvmStatic
46
    fun multiply(output: FloatArray, m1: FloatArray, m2: FloatArray) {
47
        output[0] = m1[0] * m2[0] + m1[4] * m2[1] + m1[8] * m2[2] + m1[12] * m2[3]
48
        output[1] = m1[1] * m2[0] + m1[5] * m2[1] + m1[9] * m2[2] + m1[13] * m2[3]
49
        output[2] = m1[2] * m2[0] + m1[6] * m2[1] + m1[10] * m2[2] + m1[14] * m2[3]
50
        output[3] = m1[3] * m2[0] + m1[7] * m2[1] + m1[11] * m2[2] + m1[15] * m2[3]
51

  
52
        output[4] = m1[0] * m2[4] + m1[4] * m2[5] + m1[8] * m2[6] + m1[12] * m2[7]
53
        output[5] = m1[1] * m2[4] + m1[5] * m2[5] + m1[9] * m2[6] + m1[13] * m2[7]
54
        output[6] = m1[2] * m2[4] + m1[6] * m2[5] + m1[10] * m2[6] + m1[14] * m2[7]
55
        output[7] = m1[3] * m2[4] + m1[7] * m2[5] + m1[11] * m2[6] + m1[15] * m2[7]
56

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

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

  
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;
68
    ///////////////////////////////////////////////////////////////////////////////////////////////////
69
    @kotlin.jvm.JvmStatic
70
    fun frustum(output: FloatArray, l: Float, r: Float, b: Float, t: Float, n: Float, f: Float) {
71
        output[0] = 2 * n / (r - l)
72
        output[1] = 0f
73
        output[2] = 0f
74
        output[3] = 0f
75
        output[4] = 0f
76
        output[5] = 2 * n / (t - b)
77
        output[6] = 0f
78
        output[7] = 0f
79
        output[8] = (r + l) / (r - l)
80
        output[9] = (t + b) / (t - b)
81
        output[10] = -(f + n) / (f - n)
82
        output[11] = -1f
83
        output[12] = 0f
84
        output[13] = 0f
85
        output[14] = -(2 * f * n) / (f - n)
86
        output[15] = 0f
92 87
    }
93 88

  
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;
89
    ///////////////////////////////////////////////////////////////////////////////////////////////////
90
    @kotlin.jvm.JvmStatic
91
    fun ortho(output: FloatArray, l: Float, r: Float, b: Float, t: Float, n: Float, f: Float) {
92
        output[0] = 2 / (r - l)
93
        output[1] = 0f
94
        output[2] = 0f
95
        output[3] = 0f
96
        output[4] = 0f
97
        output[5] = 2 / (t - b)
98
        output[6] = 0f
99
        output[7] = 0f
100
        output[8] = 0f
101
        output[9] = 0f
102
        output[10] = -2 / (f - n)
103
        output[11] = 0f
104
        output[12] = -(r + l) / (r - l)
105
        output[13] = -(t + b) / (t - b)
106
        output[14] = -(f + n) / (f - n)
107
        output[15] = 1f
114 108
    }
115 109

  
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
110
    ///////////////////////////////////////////////////////////////////////////////////////////////////
111
    fun setLookAt(
112
        output: FloatArray?, eyeX: Float, eyeY: Float, eyeZ: Float,
113
        lookX: Float, lookY: Float, lookZ: Float,
114
        upX: Float, upY: Float, upZ: Float
115
    ) {
116
        // TODO
123 117
    }
124 118

  
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);
119
    ///////////////////////////////////////////////////////////////////////////////////////////////////
120
    // this is android.opengl.Matrix.rotateM(), but with pre-computed sin and cos of the angle
121
    // and also we have to pre-allocate and pass here two temp arrays.
122
    @kotlin.jvm.JvmStatic
123
    fun rotateSinCos(
124
        output: FloatArray,
125
        tmp1: FloatArray,
126
        tmp2: FloatArray,
127
        sin: Float,
128
        cos: Float,
129
        x: Float,
130
        y: Float,
131
        z: Float
132
    ) {
133
        tmp1[0] = (1 - cos) * x * x + cos
134
        tmp1[1] = (1 - cos) * x * y + sin * z
135
        tmp1[2] = (1 - cos) * x * z - sin * y
136
        tmp1[3] = 0f
137
        tmp1[4] = (1 - cos) * x * y - sin * z
138
        tmp1[5] = (1 - cos) * y * y + cos
139
        tmp1[6] = (1 - cos) * y * z + sin * x
140
        tmp1[7] = 0f
141
        tmp1[8] = (1 - cos) * x * z + sin * y
142
        tmp1[9] = (1 - cos) * y * z - sin * x
143
        tmp1[10] = (1 - cos) * z * z + cos
144
        tmp1[11] = 0f
145
        tmp1[12] = 0f
146
        tmp1[13] = 0f
147
        tmp1[14] = 0f
148
        tmp1[15] = 1f
149

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

  
167
        multiply(output, tmp2, tmp1)
166 168
    }
167 169

  
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);
170
    ///////////////////////////////////////////////////////////////////////////////////////////////////
171
    @kotlin.jvm.JvmStatic
172
    fun translate(output: FloatArray, dx: Float, dy: Float, dz: Float) {
173
        output[12] += (output[0] * dx + output[4] * dy + output[8] * dz)
174
        output[13] += (output[1] * dx + output[5] * dy + output[9] * dz)
175
        output[14] += (output[2] * dx + output[6] * dy + output[10] * dz)
176
        output[15] += (output[3] * dx + output[7] * dy + output[11] * dz)
176 177
    }
177 178

  
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;
179
    ///////////////////////////////////////////////////////////////////////////////////////////////////
180
    @kotlin.jvm.JvmStatic
181
    fun scale(output: FloatArray, sx: Float, sy: Float, sz: Float) {
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 196
    }
197
  }
197
}
src/main/java/org/distorted/library/helpers/QuatHelper.kt
17 17
// License along with this library; if not, write to the Free Software                           //
18 18
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA                //
19 19
///////////////////////////////////////////////////////////////////////////////////////////////////
20
package org.distorted.library.helpers
20 21

  
21
package org.distorted.library.helpers;
22
import org.distorted.library.type.Static4D
23
import kotlin.math.*
22 24

  
23
import org.distorted.library.type.Static4D;
24

  
25
///////////////////////////////////////////////////////////////////////////////////////////////////
26

  
27
public class QuatHelper
28
  {
29 25
///////////////////////////////////////////////////////////////////////////////////////////////////
30
// return quat1*quat2
31 26

  
32
  public static Static4D quatMultiply( Static4D quat1, Static4D quat2 )
27
object QuatHelper
28
{
29
    ///////////////////////////////////////////////////////////////////////////////////////////////////
30
    // return quat1*quat2
31
    @kotlin.jvm.JvmStatic
32
    fun quatMultiply(quat1: Static4D, quat2: Static4D): Static4D
33 33
    {
34
    float qx = quat1.get0();
35
    float qy = quat1.get1();
36
    float qz = quat1.get2();
37
    float qw = quat1.get3();
38

  
39
    float rx = quat2.get0();
40
    float ry = quat2.get1();
41
    float rz = quat2.get2();
42
    float rw = quat2.get3();
43

  
44
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;
45
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;
46
    float tz = rw*qz + rz*qw - ry*qx + rx*qy;
47
    float tw = rw*qw - rz*qz - ry*qy - rx*qx;
48

  
49
    return new Static4D(tx,ty,tz,tw);
34
        val qx = quat1.get0()
35
        val qy = quat1.get1()
36
        val qz = quat1.get2()
37
        val qw = quat1.get3()
38

  
39
        val rx = quat2.get0()
40
        val ry = quat2.get1()
41
        val rz = quat2.get2()
42
        val rw = quat2.get3()
43

  
44
        val tx = rw*qx - rz*qy + ry*qz + rx*qw
45
        val ty = rw*qy + rz*qx + ry*qw - rx*qz
46
        val tz = rw*qz + rz*qw - ry*qx + rx*qy
47
        val tw = rw*qw - rz*qz - ry*qy - rx*qx
48

  
49
        return Static4D(tx,ty,tz,tw)
50 50
    }
51 51

  
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53
// return quat1*quat2
54

  
55
  public static void quatMultiply( float[] ret, Static4D quat1, Static4D quat2 )
52
    ///////////////////////////////////////////////////////////////////////////////////////////////////
53
    // return quat1*quat2
54
    @kotlin.jvm.JvmStatic
55
    fun quatMultiply(ret: FloatArray, quat1: Static4D, quat2: Static4D)
56 56
    {
57
    float qx = quat1.get0();
58
    float qy = quat1.get1();
59
    float qz = quat1.get2();
60
    float qw = quat1.get3();
61

  
62
    float rx = quat2.get0();
63
    float ry = quat2.get1();
64
    float rz = quat2.get2();
65
    float rw = quat2.get3();
66

  
67
    ret[0] = rw*qx - rz*qy + ry*qz + rx*qw;
68
    ret[1] = rw*qy + rz*qx + ry*qw - rx*qz;
69
    ret[2] = rw*qz + rz*qw - ry*qx + rx*qy;
70
    ret[3] = rw*qw - rz*qz - ry*qy - rx*qx;
57
        val qx = quat1.get0()
58
        val qy = quat1.get1()
59
        val qz = quat1.get2()
60
        val qw = quat1.get3()
61

  
62
        val rx = quat2.get0()
63
        val ry = quat2.get1()
64
        val rz = quat2.get2()
65
        val rw = quat2.get3()
66

  
67
        ret[0] = rw*qx - rz*qy + ry*qz + rx*qw
68
        ret[1] = rw*qy + rz*qx + ry*qw - rx*qz
69
        ret[2] = rw*qz + rz*qw - ry*qx + rx*qy
70
        ret[3] = rw*qw - rz*qz - ry*qy - rx*qx
71 71
    }
72 72

  
73
///////////////////////////////////////////////////////////////////////////////////////////////////
74
// return quat1*quat(rx,ry,rz,rw)
75

  
76
    public static void quatMultiply( float[] ret, Static4D quat1, float rx, float ry, float rz, float rw )
77
      {
78
      float qx = quat1.get0();
79
      float qy = quat1.get1();
80
      float qz = quat1.get2();
81
      float qw = quat1.get3();
82

  
83
      ret[0] = rw*qx - rz*qy + ry*qz + rx*qw;
84
      ret[1] = rw*qy + rz*qx + ry*qw - rx*qz;
85
      ret[2] = rw*qz + rz*qw - ry*qx + rx*qy;
86
      ret[3] = rw*qw - rz*qz - ry*qy - rx*qx;
87
      }
88

  
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90
// return quat1*quat2
91

  
92
  public static float[] quatMultiply( float[] quat1, float[] quat2 )
73
    ///////////////////////////////////////////////////////////////////////////////////////////////////
74
    // return quat1*quat(rx,ry,rz,rw)
75
    @kotlin.jvm.JvmStatic
76
    fun quatMultiply(ret: FloatArray, quat1: Static4D, rx: Float, ry: Float, rz: Float, rw: Float)
93 77
    {
94
    float qx = quat1[0];
95
    float qy = quat1[1];
96
    float qz = quat1[2];
97
    float qw = quat1[3];
98

  
99
    float rx = quat2[0];
100
    float ry = quat2[1];
101
    float rz = quat2[2];
102
    float rw = quat2[3];
103

  
104
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;
105
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;
106
    float tz = rw*qz + rz*qw - ry*qx + rx*qy;
107
    float tw = rw*qw - rz*qz - ry*qy - rx*qx;
108

  
109
    return new float[] {tx,ty,tz,tw};
78
        val qx = quat1.get0()
79
        val qy = quat1.get1()
80
        val qz = quat1.get2()
81
        val qw = quat1.get3()
82

  
83
        ret[0] = rw*qx - rz*qy + ry*qz + rx*qw
84
        ret[1] = rw*qy + rz*qx + ry*qw - rx*qz
85
        ret[2] = rw*qz + rz*qw - ry*qx + rx*qy
86
        ret[3] = rw*qw - rz*qz - ry*qy - rx*qx
110 87
    }
111 88

  
112
///////////////////////////////////////////////////////////////////////////////////////////////////
113
// return quat1*(rx,ry,rz,rw)
89
    ///////////////////////////////////////////////////////////////////////////////////////////////////
90
    // return quat1*quat2
91
    @kotlin.jvm.JvmStatic
92
    fun quatMultiply(quat1: FloatArray, quat2: FloatArray): FloatArray
93
    {
94
        val qx = quat1[0]
95
        val qy = quat1[1]
96
        val qz = quat1[2]
97
        val qw = quat1[3]
98

  
99
        val rx = quat2[0]
100
        val ry = quat2[1]
101
        val rz = quat2[2]
102
        val rw = quat2[3]
103

  
104
        val tx = rw*qx - rz*qy + ry*qz + rx*qw
105
        val ty = rw*qy + rz*qx + ry*qw - rx*qz
106
        val tz = rw*qz + rz*qw - ry*qx + rx*qy
107
        val tw = rw*qw - rz*qz - ry*qy - rx*qx
108

  
109
        return floatArrayOf(tx,ty,tz,tw)
110
    }
114 111

  
115
  public static Static4D quatMultiply( Static4D quat, float rx, float ry, float rz, float rw )
112
    ///////////////////////////////////////////////////////////////////////////////////////////////////
113
    // return quat1*(rx,ry,rz,rw)
114
    fun quatMultiply(quat: Static4D, rx: Float, ry: Float, rz: Float, rw: Float): Static4D
116 115
    {
117
    float qx = quat.get0();
118
    float qy = quat.get1();
119
    float qz = quat.get2();
120
    float qw = quat.get3();
116
        val qx = quat.get0()
117
        val qy = quat.get1()
118
        val qz = quat.get2()
119
        val qw = quat.get3()
121 120

  
122
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;
123
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;
124
    float tz = rw*qz + rz*qw - ry*qx + rx*qy;
125
    float tw = rw*qw - rz*qz - ry*qy - rx*qx;
121
        val tx = rw*qx - rz*qy + ry*qz + rx*qw
122
        val ty = rw*qy + rz*qx + ry*qw - rx*qz
123
        val tz = rw*qz + rz*qw - ry*qx + rx*qy
124
        val tw = rw*qw - rz*qz - ry*qy - rx*qx
126 125

  
127
    return new Static4D(tx,ty,tz,tw);
126
        return Static4D(tx,ty,tz,tw)
128 127
    }
129 128

  
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131
// return (qx,qy,qz,qw)*quat
132

  
133
  public static Static4D quatMultiply( float qx, float qy, float qz, float qw, Static4D quat )
129
    ///////////////////////////////////////////////////////////////////////////////////////////////////
130
    // return (qx,qy,qz,qw)*quat
131
    fun quatMultiply(qx: Float, qy: Float, qz: Float, qw: Float, quat: Static4D): Static4D
134 132
    {
135
    float rx = quat.get0();
136
    float ry = quat.get1();
137
    float rz = quat.get2();
138
    float rw = quat.get3();
133
        val rx = quat.get0()
134
        val ry = quat.get1()
135
        val rz = quat.get2()
136
        val rw = quat.get3()
139 137

  
140
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;
141
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;
142
    float tz = rw*qz + rz*qw - ry*qx + rx*qy;
143
    float tw = rw*qw - rz*qz - ry*qy - rx*qx;
138
        val tx = rw*qx - rz*qy + ry*qz + rx*qw
139
        val ty = rw*qy + rz*qx + ry*qw - rx*qz
140
        val tz = rw*qz + rz*qw - ry*qx + rx*qy
141
        val tw = rw*qw - rz*qz - ry*qy - rx*qx
144 142

  
145
    return new Static4D(tx,ty,tz,tw);
143
        return Static4D(tx,ty,tz,tw)
146 144
    }
147 145

  
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149
// return (qx,qy,qz,qw)*(rx,ry,rz,rw)
150

  
151
  public static Static4D quatMultiply( float qx, float qy, float qz, float qw, float rx, float ry, float rz, float rw )
146
    ///////////////////////////////////////////////////////////////////////////////////////////////////
147
    // return (qx,qy,qz,qw)*(rx,ry,rz,rw)
148
    fun quatMultiply( qx: Float, qy: Float, qz: Float, qw: Float, rx: Float, ry: Float, rz: Float, rw: Float): Static4D
152 149
    {
153
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;
154
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;
155
    float tz = rw*qz + rz*qw - ry*qx + rx*qy;
156
    float tw = rw*qw - rz*qz - ry*qy - rx*qx;
150
        val tx = rw*qx - rz*qy + ry*qz + rx*qw
151
        val ty = rw*qy + rz*qx + ry*qw - rx*qz
152
        val tz = rw*qz + rz*qw - ry*qx + rx*qy
153
        val tw = rw*qw - rz*qz - ry*qy - rx*qx
157 154

  
158
    return new Static4D(tx,ty,tz,tw);
155
        return Static4D(tx,ty,tz,tw)
159 156
    }
160 157

  
161
///////////////////////////////////////////////////////////////////////////////////////////////////
162
// ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
163

  
164
  public static void quatMultiply( float[] ret, float[] q, float[] r )
158
    ///////////////////////////////////////////////////////////////////////////////////////////////////
159
    // ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
160
    @kotlin.jvm.JvmStatic
161
    fun quatMultiply(ret: FloatArray, q: FloatArray, r: FloatArray)
165 162
    {
166
    ret[0] = r[3]*q[0] - r[2]*q[1] + r[1]*q[2] + r[0]*q[3];
167
    ret[1] = r[3]*q[1] + r[2]*q[0] + r[1]*q[3] - r[0]*q[2];
168
    ret[2] = r[3]*q[2] + r[2]*q[3] - r[1]*q[0] + r[0]*q[1];
169
    ret[3] = r[3]*q[3] - r[2]*q[2] - r[1]*q[1] - r[0]*q[0];
163
        ret[0] = r[3]*q[0] - r[2]*q[1] + r[1]*q[2] + r[0]*q[3]
164
        ret[1] = r[3]*q[1] + r[2]*q[0] + r[1]*q[3] - r[0]*q[2]
165
        ret[2] = r[3]*q[2] + r[2]*q[3] - r[1]*q[0] + r[0]*q[1]
166
        ret[3] = r[3]*q[3] - r[2]*q[2] - r[1]*q[1] - r[0]*q[0]
170 167
    }
171 168

  
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173
// ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
174

  
175
  public static void quatMultiply( float[] ret, Static4D q, float[] r )
169
    ///////////////////////////////////////////////////////////////////////////////////////////////////
170
    // ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
171
    fun quatMultiply(ret: FloatArray, q: Static4D, r: FloatArray)
176 172
    {
177
    float q0 = q.get0();
178
    float q1 = q.get1();
179
    float q2 = q.get2();
180
    float q3 = q.get3();
181

  
182
    ret[0] = r[3]*q0 - r[2]*q1 + r[1]*q2 + r[0]*q3;
183
    ret[1] = r[3]*q1 + r[2]*q0 + r[1]*q3 - r[0]*q2;
184
    ret[2] = r[3]*q2 + r[2]*q3 - r[1]*q0 + r[0]*q1;
185
    ret[3] = r[3]*q3 - r[2]*q2 - r[1]*q1 - r[0]*q0;
173
        val q0 = q.get0()
174
        val q1 = q.get1()
175
        val q2 = q.get2()
176
        val q3 = q.get3()
177

  
178
        ret[0] = r[3]*q0 - r[2]*q1 + r[1]*q2 + r[0]*q3
179
        ret[1] = r[3]*q1 + r[2]*q0 + r[1]*q3 - r[0]*q2
180
        ret[2] = r[3]*q2 + r[2]*q3 - r[1]*q0 + r[0]*q1
181
        ret[3] = r[3]*q3 - r[2]*q2 - r[1]*q1 - r[0]*q0
186 182
    }
187 183

  
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189
// ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
190

  
191
  public static void quatMultiply( float[] ret, float[] q, Static4D r )
184
    ///////////////////////////////////////////////////////////////////////////////////////////////////
185
    // ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
186
    fun quatMultiply(ret: FloatArray, q: FloatArray, r: Static4D)
192 187
    {
193
    float r0 = r.get0();
194
    float r1 = r.get1();
195
    float r2 = r.get2();
196
    float r3 = r.get3();
197

  
198
    ret[0] = r3*q[0] - r2*q[1] + r1*q[2] + r0*q[3];
199
    ret[1] = r3*q[1] + r2*q[0] + r1*q[3] - r0*q[2];
200
    ret[2] = r3*q[2] + r2*q[3] - r1*q[0] + r0*q[1];
201
    ret[3] = r3*q[3] - r2*q[2] - r1*q[1] - r0*q[0];
188
        val r0 = r.get0()
189
        val r1 = r.get1()
190
        val r2 = r.get2()
191
        val r3 = r.get3()
192

  
193
        ret[0] = r3*q[0] - r2*q[1] + r1*q[2] + r0*q[3]
194
        ret[1] = r3*q[1] + r2*q[0] + r1*q[3] - r0*q[2]
195
        ret[2] = r3*q[2] + r2*q[3] - r1*q[0] + r0*q[1]
196
        ret[3] = r3*q[3] - r2*q[2] - r1*q[1] - r0*q[0]
202 197
    }
203 198

  
204
///////////////////////////////////////////////////////////////////////////////////////////////////
205
// ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
206

  
207
  public static void quatMultiply( float[] ret, float qx, float qy, float qz, float qw, float rx, float ry, float rz, float rw )
199
    ///////////////////////////////////////////////////////////////////////////////////////////////////
200
    // ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
201
    fun quatMultiply(ret: FloatArray, qx: Float, qy: Float, qz: Float, qw: Float, rx: Float, ry: Float, rz: Float, rw: Float)
208 202
    {
209
    ret[0] = rw*qx - rz*qy + ry*qz + rx*qw;
210
    ret[1] = rw*qy + rz*qx + ry*qw - rx*qz;
211
    ret[2] = rw*qz + rz*qw - ry*qx + rx*qy;
212
    ret[3] = rw*qw - rz*qz - ry*qy - rx*qx;
203
        ret[0] = rw*qx - rz*qy + ry*qz + rx*qw
204
        ret[1] = rw*qy + rz*qx + ry*qw - rx*qz
205
        ret[2] = rw*qz + rz*qw - ry*qx + rx*qy
206
        ret[3] = rw*qw - rz*qz - ry*qy - rx*qx
213 207
    }
214 208

  
215
///////////////////////////////////////////////////////////////////////////////////////////////////
216
// ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
217

  
218
  private static void quatMultiply( float[] ret, int index, float qx, float qy, float qz, float qw, float rx, float ry, float rz, float rw )
209
    ///////////////////////////////////////////////////////////////////////////////////////////////////
210
    // ret = (qx,qy,qz,qw)*(rx,ry,rz,rw)
211
    private fun quatMultiply(ret: FloatArray, index: Int, qx: Float, qy: Float, qz: Float, qw: Float, rx: Float, ry: Float, rz: Float, rw: Float)
219 212
    {
220
    ret[index  ] = rw*qx - rz*qy + ry*qz + rx*qw;
221
    ret[index+1] = rw*qy + rz*qx + ry*qw - rx*qz;
222
    ret[index+2] = rw*qz + rz*qw - ry*qx + rx*qy;
223
    ret[index+3] = rw*qw - rz*qz - ry*qy - rx*qx;
213
        ret[index  ] = rw*qx - rz*qy + ry*qz + rx*qw
214
        ret[index+1] = rw*qy + rz*qx + ry*qw - rx*qz
215
        ret[index+2] = rw*qz + rz*qw - ry*qx + rx*qy
216
        ret[index+3] = rw*qw - rz*qz - ry*qy - rx*qx
224 217
    }
225 218

  
226
///////////////////////////////////////////////////////////////////////////////////////////////////
227
// rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
228

  
229
  public static Static4D rotateVectorByQuat(float x, float y, float z, float w, Static4D quat)
219
    ///////////////////////////////////////////////////////////////////////////////////////////////////
220
    // rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
221
    @kotlin.jvm.JvmStatic
222
    fun rotateVectorByQuat(x: Float, y: Float, z: Float, w: Float, quat: Static4D): Static4D
230 223
    {
231
    float qx = quat.get0();
232
    float qy = quat.get1();
233
    float qz = quat.get2();
234
    float qw = quat.get3();
224
        val qx = quat.get0()
225
        val qy = quat.get1()
226
        val qz = quat.get2()
227
        val qw = quat.get3()
235 228

  
236
    Static4D tmp = quatMultiply(qx,qy,qz,qw,x,y,z,w);
229
        val tmp = quatMultiply(qx,qy,qz,qw,x,y,z,w)
237 230

  
238
    return quatMultiply(tmp,-qx,-qy,-qz,qw);
231
        return quatMultiply(tmp,-qx,-qy,-qz,qw)
239 232
    }
240 233

  
241
///////////////////////////////////////////////////////////////////////////////////////////////////
242
// rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
243

  
244
  public static void rotateVectorByQuat(float[] output, float x, float y, float z, float w, Static4D quat)
234
    ///////////////////////////////////////////////////////////////////////////////////////////////////
235
    // rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
236
    @kotlin.jvm.JvmStatic
237
    fun rotateVectorByQuat(output: FloatArray, x: Float, y: Float, z: Float, w: Float, quat: Static4D)
245 238
    {
246
    float[] tmp = new float[4];
239
        val tmp = FloatArray(4)
247 240

  
248
    float qx = quat.get0();
249
    float qy = quat.get1();
250
    float qz = quat.get2();
251
    float qw = quat.get3();
241
        val qx = quat.get0()
242
        val qy = quat.get1()
243
        val qz = quat.get2()
244
        val qw = quat.get3()
252 245

  
253
    quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w);
254
    quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw);
246
        quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w)
247
        quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw)
255 248
    }
256 249

  
257
///////////////////////////////////////////////////////////////////////////////////////////////////
258
// rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
259

  
260
  public static void rotateVectorByQuat(float[] output, int index, float x, float y, float z, float w, Static4D quat)
250
    ///////////////////////////////////////////////////////////////////////////////////////////////////
251
    // rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
252
    @kotlin.jvm.JvmStatic
253
    fun rotateVectorByQuat(output: FloatArray, index: Int, x: Float, y: Float, z: Float, w: Float, quat: Static4D)
261 254
    {
262
    float[] tmp = new float[4];
255
        val tmp = FloatArray(4)
263 256

  
264
    float qx = quat.get0();
265
    float qy = quat.get1();
266
    float qz = quat.get2();
267
    float qw = quat.get3();
257
        val qx = quat.get0()
258
        val qy = quat.get1()
259
        val qz = quat.get2()
260
        val qw = quat.get3()
268 261

  
269
    quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w);
270
    quatMultiply(output,index,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw);
262
        quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w)
263
        quatMultiply(output,index,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw)
271 264
    }
272 265

  
273
///////////////////////////////////////////////////////////////////////////////////////////////////
274
// rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
275

  
276
  public static void rotateVectorByQuat(float[] output, float x, float y, float z, float w, float[] quat)
266
    ///////////////////////////////////////////////////////////////////////////////////////////////////
267
    // rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
268
    @kotlin.jvm.JvmStatic
269
    fun rotateVectorByQuat(output: FloatArray, x: Float, y: Float, z: Float, w: Float, quat: FloatArray)
277 270
    {
278
    float[] tmp = new float[4];
271
        val tmp = FloatArray(4)
279 272

  
280
    float qx = quat[0];
281
    float qy = quat[1];
282
    float qz = quat[2];
283
    float qw = quat[3];
273
        val qx = quat[0]
274
        val qy = quat[1]
275
        val qz = quat[2]
276
        val qw = quat[3]
284 277

  
285
    quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w);
286
    quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw);
278
        quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w)
279
        quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw)
287 280
    }
288 281

  
289
///////////////////////////////////////////////////////////////////////////////////////////////////
290
// rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
291

  
292
  public static void rotateVectorByQuat(float[] output, int index, float x, float y, float z, float w, float[] quat)
282
    ///////////////////////////////////////////////////////////////////////////////////////////////////
283
    // rotate (x1,x2,x3,x4) by quat  ( i.e. return quat*vector*(quat^-1) )
284
    fun rotateVectorByQuat(output: FloatArray, index: Int, x: Float, y: Float, z: Float, w: Float, quat: FloatArray)
293 285
    {
294
    float[] tmp = new float[4];
286
        val tmp = FloatArray(4)
295 287

  
296
    float qx = quat[0];
297
    float qy = quat[1];
298
    float qz = quat[2];
299
    float qw = quat[3];
288
        val qx = quat[0]
289
        val qy = quat[1]
290
        val qz = quat[2]
291
        val qw = quat[3]
300 292

  
301
    quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w);
302
    quatMultiply(output,index,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw);
293
        quatMultiply(tmp,qx,qy,qz,qw,x,y,z,w)
294
        quatMultiply(output,index,tmp[0],tmp[1],tmp[2],tmp[3],-qx,-qy,-qz,qw)
303 295
    }
304 296

  
305
///////////////////////////////////////////////////////////////////////////////////////////////////
306
// rotate vec by quat ( i.e. return quat*vector*(quat^-1) )
307

  
308
  public static void rotateVectorByQuat(float[] output, float[] vec, float[] quat)
297
    ///////////////////////////////////////////////////////////////////////////////////////////////////
298
    // rotate vec by quat ( i.e. return quat*vector*(quat^-1) )
299
    @kotlin.jvm.JvmStatic
300
    fun rotateVectorByQuat(output: FloatArray, vec: FloatArray, quat: FloatArray)
309 301
    {
310
    float[] tmp = new float[4];
302
        val tmp = FloatArray(4)
311 303

  
312
    quatMultiply(tmp,quat,vec);
304
        quatMultiply(tmp, quat, vec)
313 305

  
314
    quat[0] = -quat[0];
315
    quat[1] = -quat[1];
316
    quat[2] = -quat[2];
306
        quat[0] = -quat[0]
307
        quat[1] = -quat[1]
308
        quat[2] = -quat[2]
317 309

  
318
    quatMultiply(output,tmp,quat);
310
        quatMultiply(output, tmp, quat)
319 311

  
320
    quat[0] = -quat[0];
321
    quat[1] = -quat[1];
322
    quat[2] = -quat[2];
312
        quat[0] = -quat[0]
313
        quat[1] = -quat[1]
314
        quat[2] = -quat[2]
323 315
    }
324 316

  
325
///////////////////////////////////////////////////////////////////////////////////////////////////
326
// rotate vec by quat ( i.e. return quat*vector*(quat^-1) )
327

  
328
  public static void rotateVectorByQuat(float[] output, float[] vec, Static4D quat)
317
    ///////////////////////////////////////////////////////////////////////////////////////////////////
318
    // rotate vec by quat ( i.e. return quat*vector*(quat^-1) )
319
    fun rotateVectorByQuat(output: FloatArray, vec: FloatArray, quat: Static4D)
329 320
    {
330
    float[] tmp = new float[4];
321
        val tmp = FloatArray(4)
331 322

  
332
    quatMultiply(tmp,quat,vec);
323
        quatMultiply(tmp, quat, vec)
333 324

  
334
    float x1 = quat.get0();
335
    float y1 = quat.get1();
336
    float z1 = quat.get2();
337
    float w1 = quat.get3();
338
    quat.set(-x1,-y1,-z1,w1);
325
        val x1 = quat.get0()
326
        val y1 = quat.get1()
327
        val z1 = quat.get2()
328
        val w1 = quat.get3()
329
        quat.set(-x1,-y1,-z1,w1)
339 330

  
340
    quatMultiply(output,tmp,quat);
331
        quatMultiply(output, tmp, quat)
341 332

  
342
    float x2 = quat.get0();
343
    float y2 = quat.get1();
344
    float z2 = quat.get2();
345
    float w2 = quat.get3();
346
    quat.set(-x2,-y2,-z2,w2);
333
        val x2 = quat.get0()
334
        val y2 = quat.get1()
335
        val z2 = quat.get2()
336
        val w2 = quat.get3()
337
        quat.set(-x2,-y2,-z2,w2)
347 338
    }
348 339

  
349
///////////////////////////////////////////////////////////////////////////////////////////////////
350
// rotate 'vector' by quat  ( i.e. return quat*vector*(quat^-1) )
351

  
352
  public static Static4D rotateVectorByQuat(Static4D vector, Static4D quat)
340
    ///////////////////////////////////////////////////////////////////////////////////////////////////
341
    // rotate 'vector' by quat  ( i.e. return quat*vector*(quat^-1) )
342
    @kotlin.jvm.JvmStatic
343
    fun rotateVectorByQuat(vector: Static4D, quat: Static4D): Static4D
353 344
    {
354
    float qx = quat.get0();
355
    float qy = quat.get1();
356
    float qz = quat.get2();
357
    float qw = quat.get3();
345
        val qx = quat.get0()
346
        val qy = quat.get1()
347
        val qz = quat.get2()
348
        val qw = quat.get3()
358 349

  
359
    Static4D tmp = quatMultiply(qx,qy,qz,qw,vector);
350
        val tmp = quatMultiply(qx,qy,qz,qw,vector)
360 351

  
361
    return quatMultiply(tmp,-qx,-qy,-qz,qw);
352
        return quatMultiply(tmp,-qx,-qy,-qz,qw)
362 353
    }
363 354

  
364
///////////////////////////////////////////////////////////////////////////////////////////////////
365
// rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
366

  
367
  public static Static4D rotateVectorByInvertedQuat(Static4D vector, Static4D quat)
355
    ///////////////////////////////////////////////////////////////////////////////////////////////////
356
    // rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
357
    @kotlin.jvm.JvmStatic
358
    fun rotateVectorByInvertedQuat(vector: Static4D, quat: Static4D): Static4D
368 359
    {
369
    float qx = quat.get0();
370
    float qy = quat.get1();
371
    float qz = quat.get2();
372
    float qw = quat.get3();
360
        val qx = quat.get0()
361
        val qy = quat.get1()
362
        val qz = quat.get2()
363
        val qw = quat.get3()
373 364

  
374
    Static4D tmp = quatMultiply(-qx,-qy,-qz,qw,vector);
365
        val tmp = quatMultiply(-qx,-qy,-qz,qw,vector)
375 366

  
376
    return quatMultiply(tmp,qx,qy,qz,qw);
367
        return quatMultiply(tmp,qx,qy,qz,qw)
377 368
    }
378 369

  
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380
// rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
381

  
382
    public static void rotateVectorByInvertedQuat(float[] output, float x, float y, float z, float w, float[] quat)
383
      {
384
      float[] tmp = new float[4];
385

  
386
      float qx = quat[0];
387
      float qy = quat[1];
388
      float qz = quat[2];
389
      float qw = quat[3];
370
    ///////////////////////////////////////////////////////////////////////////////////////////////////
371
    // rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
372
    @kotlin.jvm.JvmStatic
373
    fun rotateVectorByInvertedQuat(output: FloatArray, x: Float, y: Float, z: Float, w: Float, quat: FloatArray)
374
    {
375
        val tmp = FloatArray(4)
390 376

  
391
      quatMultiply(tmp,-qx,-qy,-qz,qw,x,y,z,w);
392
      quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],qx,qy,qz,qw);
393
      }
377
        val qx = quat[0]
378
        val qy = quat[1]
379
        val qz = quat[2]
380
        val qw = quat[3]
394 381

  
395
///////////////////////////////////////////////////////////////////////////////////////////////////
396
// rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
382
        quatMultiply(tmp,-qx,-qy,-qz,qw,x,y,z,w)
383
        quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],qx,qy,qz,qw)
384
    }
397 385

  
398
  public static void rotateVectorByInvertedQuat(float[] output, float x, float y, float z, float w, Static4D quat)
386
    ///////////////////////////////////////////////////////////////////////////////////////////////////
387
    // rotate 'vector' by quat^(-1)  ( i.e. return (quat^-1)*vector*quat )
388
    @kotlin.jvm.JvmStatic
389
    fun rotateVectorByInvertedQuat(output: FloatArray, x: Float, y: Float, z: Float, w: Float, quat: Static4D)
399 390
    {
400
    float[] tmp = new float[4];
391
        val tmp = FloatArray(4)
401 392

  
402
    float qx = quat.get0();
403
    float qy = quat.get1();
404
    float qz = quat.get2();
405
    float qw = quat.get3();
393
        val qx = quat.get0()
394
        val qy = quat.get1()
395
        val qz = quat.get2()
396
        val qw = quat.get3()
406 397

  
407
    quatMultiply(tmp,-qx,-qy,-qz,qw,x,y,z,w);
408
    quatMultiply(output,tmp[0],tmp[1],tmp[2],tmp[3],qx,qy,qz,qw);
398
        quatMultiply(tmp, -qx, -qy, -qz, qw, x, y, z, w)
399
        quatMultiply(output, tmp[0], tmp[1], tmp[2], tmp[3], qx, qy, qz, qw)
409 400
    }
410 401

  
411
///////////////////////////////////////////////////////////////////////////////////////////////////
412

  
413
  public static Static4D quatFromDrag(float dragX, float dragY)
402
    ///////////////////////////////////////////////////////////////////////////////////////////////////
403
    @kotlin.jvm.JvmStatic
404
    fun quatFromDrag(dragX: Float, dragY: Float): Static4D
414 405
    {
415
    float axisX = dragY;  // inverted X and Y - rotation axis is perpendicular to (dragX,dragY)
416
    float axisY = dragX;  // Why not (-dragY, dragX) ? because Y axis is also inverted!
417
    float axisZ = 0;
418
    float axisL = (float)Math.sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);
406
        var axisX = dragY // inverted X and Y - rotation axis is perpendicular to (dragX,dragY)
407
        var axisY = dragX // Why not (-dragY, dragX) ? because Y axis is also inverted!
408
        var axisZ = 0f
409
        val axisL = sqrt(axisX * axisX + axisY * axisY + axisZ * axisZ)
419 410

  
420
    if( axisL>0 )
421
      {
422
      axisX /= axisL;
423
      axisY /= axisL;
424
      axisZ /= axisL;
411
        if (axisL > 0)
412
        {
413
            axisX /= axisL
414
            axisY /= axisL
415
            axisZ /= axisL
425 416

  
426
      float ratio = axisL;
427
      ratio = ratio - (int)ratio;     // the cos() is only valid in (0,Pi)
417
            var ratio = axisL
418
            ratio -= ratio.toInt() // the cos() is only valid in (0,Pi)
428 419

  
429
      float cosA = (float)Math.cos(Math.PI*ratio);
430
      float sinA = (float)Math.sqrt(1-cosA*cosA);
420
            val cosA = cos(Math.PI * ratio).toFloat()
421
            val sinA = sqrt(1 - cosA * cosA)
431 422

  
432
      return new Static4D(axisX*sinA, axisY*sinA, axisZ*sinA, cosA);
433
      }
423
            return Static4D(axisX * sinA, axisY * sinA, axisZ * sinA, cosA)
424
        }
434 425

  
435
    return new Static4D(0f, 0f, 0f, 1f);
426
        return Static4D(0f, 0f, 0f, 1f)
436 427
    }
437 428

  
438
///////////////////////////////////////////////////////////////////////////////////////////////////
439

  
440
  public static double computeCos(double oldX, double oldY, double newX, double newY, double len1, double len2)
429
    ///////////////////////////////////////////////////////////////////////////////////////////////////
430
    @kotlin.jvm.JvmStatic
431
    fun computeCos(oldX: Double, oldY: Double, newX: Double, newY: Double, len1: Double, len2: Double): Double
441 432
    {
442
    double ret= (oldX*newX+oldY*newY) / (len1*len2);
443
    if( ret<-1.0 ) return -1.0;
444
    if( ret> 1.0 ) return  1.0;
433
        val ret = (oldX*newX + oldY*newY) / (len1*len2)
434
        if (ret < -1.0) return -1.0
435
        if (ret >  1.0) return  1.0
445 436

  
446
    return ret;
437
        return ret
447 438
    }
448 439

  
449
///////////////////////////////////////////////////////////////////////////////////////////////////
450
// sin of (signed!) angle between vectors 'old' and 'new', counterclockwise!
451

  
452
  public static double computeSin(double oldX, double oldY, double newX, double newY, double len1, double len2)
440
    ///////////////////////////////////////////////////////////////////////////////////////////////////
441
    // sin of (signed!) angle between vectors 'old' and 'new', counterclockwise!
442
    @kotlin.jvm.JvmStatic
443
    fun computeSin(oldX: Double, oldY: Double, newX: Double, newY: Double, len1: Double, len2: Double): Double
453 444
    {
454
    double ret= (newX*oldY-oldX*newY) / (len1*len2);
455
    if( ret<-1.0 ) return -1.0;
456
    if( ret> 1.0 ) return  1.0;
445
        val ret = (newX*oldY - oldX*newY) / (len1*len2)
446
        if (ret < -1.0) return -1.0
447
        if (ret >  1.0) return  1.0
457 448

  
458
    return ret;
449
        return ret
459 450
    }
460 451

  
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462
// return quat Q that turns 3D vector A=(ax,ay,az) to another 3D vector B=(bx,by,bz)
463
// take care of double-cover by ensuring that always Q.get3() >=0
464

  
465
  public static Static4D retRotationQuat(float ax, float ay, float az, float bx, float by, float bz)
452
    ///////////////////////////////////////////////////////////////////////////////////////////////////
453
    // return quat Q that turns 3D vector A=(ax,ay,az) to another 3D vector B=(bx,by,bz)
454
    // take care of double-cover by ensuring that always Q.get3() >=0
455
    fun retRotationQuat(ax: Float, ay: Float, az: Float, bx: Float, by: Float, bz: Float): Static4D
466 456
    {
467
    float nx = ay*bz - az*by;
468
    float ny = az*bx - ax*bz;
469
    float nz = ax*by - ay*bx;
470

  
471
    float sin = (float)Math.sqrt(nx*nx + ny*ny + nz*nz);
472
    float cos = ax*bx + ay*by + az*bz;
473

  
474
    if( sin!=0 )
475
      {
476
      nx /= sin;
477
      ny /= sin;
478
      nz /= sin;
479
      }
480

  
481
    // Why sin<=0 and cos>=0 ?
482
    // 0<angle<180 -> 0<halfAngle<90 -> both sin and cos are positive.
483
    // But1: quats work counterclockwise -> negate cos.
484
    // But2: double-cover, we prefer to have the cos positive (so that unit=(0,0,0,1))
485
    // so negate again both cos and sin.
486
    float sinHalf =-(float)Math.sqrt((1-cos)/2);
487
    float cosHalf = (float)Math.sqrt((1+cos)/2);
488

  
489
    return new Static4D(nx*sinHalf,ny*sinHalf,nz*sinHalf,cosHalf);
457
        var nx = ay*bz - az*by
458
        var ny = az*bx - ax*bz
459
        var nz = ax*by - ay*bx
460

  
461
        val sin = sqrt(nx*nx + ny*ny + nz*nz)
462
        val cos = ax*bx + ay*by + az*bz
463

  
464
        if (sin != 0f)
465
        {
466
            nx /= sin
467
            ny /= sin
468
            nz /= sin
469
        }
470

  
471
        // Why sin<=0 and cos>=0 ?
472
        // 0<angle<180 -> 0<halfAngle<90 -> both sin and cos are positive.
473
        // But1: quats work counterclockwise -> negate cos.
474
        // But2: double-cover, we prefer to have the cos positive (so that unit=(0,0,0,1))
475
        // so negate again both cos and sin.
476
        val sinHalf = -sqrt((1-cos) / 2)
477
        val cosHalf =  sqrt((1+cos) / 2)
478

  
479
        return Static4D(nx*sinHalf, ny*sinHalf, nz*sinHalf, cosHalf)
490 480
    }
491
  }
481
}

Also available in: Unified diff