propane 3.1.0.pre-java → 3.2.0-java
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.mvn/wrapper/maven-wrapper.properties +1 -0
- data/CHANGELOG.md +1 -5
- data/README.md +23 -12
- data/Rakefile +23 -12
- data/lib/propane/helpers/version_error.rb +6 -0
- data/lib/propane/runner.rb +12 -0
- data/lib/propane/version.rb +1 -1
- data/library/slider/slider.rb +1 -1
- data/mvnw +234 -0
- data/mvnw.cmd +145 -0
- data/pom.xml +28 -27
- data/propane.gemspec +2 -2
- data/src/main/java/japplemenubar/JAppleMenuBar.java +41 -47
- data/src/main/java/monkstone/ColorUtil.java +1 -1
- data/src/main/java/monkstone/MathToolModule.java +12 -11
- data/src/main/java/monkstone/PropaneLibrary.java +9 -10
- data/src/main/java/monkstone/core/LibraryProxy.java +124 -113
- data/src/main/java/monkstone/fastmath/Deglut.java +86 -89
- data/src/main/java/monkstone/filechooser/Chooser.java +7 -13
- data/src/main/java/monkstone/noise/SimplexNoise.java +0 -1
- data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +4 -4
- data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +9 -9
- data/src/main/java/monkstone/slider/SimpleSlider.java +0 -9
- data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +11 -13
- data/src/main/java/monkstone/slider/Slider.java +1 -1
- data/src/main/java/monkstone/slider/SliderBar.java +1 -1
- data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
- data/src/main/java/monkstone/slider/WheelHandler.java +8 -9
- data/src/main/java/monkstone/vecmath/AppRender.java +2 -2
- data/src/main/java/monkstone/vecmath/ShapeRender.java +2 -2
- data/src/main/java/monkstone/vecmath/package-info.java +2 -2
- data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
- data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
- data/src/main/java/monkstone/videoevent/VideoInterface.java +11 -5
- data/src/main/java/monkstone/videoevent/package-info.java +2 -2
- data/src/main/java/processing/awt/PGraphicsJava2D.java +1742 -2243
- data/src/main/java/processing/awt/PShapeJava2D.java +268 -270
- data/src/main/java/processing/awt/PSurfaceAWT.java +821 -920
- data/src/main/java/processing/core/DesktopHandler.java +94 -0
- data/src/main/java/processing/core/PApplet.java +14170 -14082
- data/src/main/java/processing/core/PConstants.java +447 -473
- data/src/main/java/processing/core/PFont.java +867 -873
- data/src/main/java/processing/core/PGraphics.java +7193 -7428
- data/src/main/java/processing/core/PImage.java +3051 -3117
- data/src/main/java/processing/core/PMatrix.java +159 -172
- data/src/main/java/processing/core/PMatrix2D.java +403 -444
- data/src/main/java/processing/core/PMatrix3D.java +735 -749
- data/src/main/java/processing/core/PShape.java +2651 -2793
- data/src/main/java/processing/core/PShapeOBJ.java +415 -422
- data/src/main/java/processing/core/PShapeSVG.java +1466 -1475
- data/src/main/java/processing/core/PStyle.java +37 -40
- data/src/main/java/processing/core/PSurface.java +98 -103
- data/src/main/java/processing/core/PSurfaceNone.java +208 -236
- data/src/main/java/processing/core/PVector.java +961 -990
- data/src/main/java/processing/data/DoubleDict.java +709 -753
- data/src/main/java/processing/data/DoubleList.java +695 -748
- data/src/main/java/processing/data/FloatDict.java +702 -746
- data/src/main/java/processing/data/FloatList.java +697 -751
- data/src/main/java/processing/data/IntDict.java +673 -718
- data/src/main/java/processing/data/IntList.java +633 -699
- data/src/main/java/processing/data/JSONArray.java +873 -931
- data/src/main/java/processing/data/JSONObject.java +1165 -1262
- data/src/main/java/processing/data/JSONTokener.java +341 -351
- data/src/main/java/processing/data/LongDict.java +662 -707
- data/src/main/java/processing/data/LongList.java +634 -700
- data/src/main/java/processing/data/Sort.java +41 -37
- data/src/main/java/processing/data/StringDict.java +486 -522
- data/src/main/java/processing/data/StringList.java +580 -624
- data/src/main/java/processing/data/Table.java +3508 -3686
- data/src/main/java/processing/data/TableRow.java +183 -182
- data/src/main/java/processing/data/XML.java +883 -957
- data/src/main/java/processing/event/Event.java +66 -87
- data/src/main/java/processing/event/KeyEvent.java +41 -48
- data/src/main/java/processing/event/MouseEvent.java +93 -103
- data/src/main/java/processing/event/TouchEvent.java +6 -10
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +5 -69
- data/src/main/java/processing/javafx/PSurfaceFX.java +2 -7
- data/src/main/java/processing/opengl/FontTexture.java +270 -290
- data/src/main/java/processing/opengl/FrameBuffer.java +363 -375
- data/src/main/java/processing/opengl/LinePath.java +500 -543
- data/src/main/java/processing/opengl/LineStroker.java +582 -593
- data/src/main/java/processing/opengl/PGL.java +2881 -2904
- data/src/main/java/processing/opengl/PGraphics2D.java +315 -408
- data/src/main/java/processing/opengl/PGraphics3D.java +72 -107
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12043 -12230
- data/src/main/java/processing/opengl/PJOGL.java +1681 -1745
- data/src/main/java/processing/opengl/PShader.java +1257 -1260
- data/src/main/java/processing/opengl/PShapeOpenGL.java +4599 -4662
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +1030 -1047
- data/src/main/java/processing/opengl/Texture.java +1397 -1462
- data/src/main/java/processing/opengl/VertexBuffer.java +55 -57
- data/src/main/resources/icon/icon-1024.png +0 -0
- data/src/main/resources/icon/icon-128.png +0 -0
- data/src/main/resources/icon/icon-16.png +0 -0
- data/src/main/resources/icon/icon-256.png +0 -0
- data/src/main/resources/icon/icon-32.png +0 -0
- data/src/main/resources/icon/icon-48.png +0 -0
- data/src/main/resources/icon/icon-512.png +0 -0
- data/src/main/resources/icon/icon-64.png +0 -0
- data/vendors/Rakefile +1 -1
- metadata +12 -8
- data/src/main/java/processing/core/ThinkDifferent.java +0 -70
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
|
|
2
|
-
|
|
3
1
|
/*
|
|
4
2
|
Part of the Processing project - http://processing.org
|
|
5
3
|
|
|
@@ -18,466 +16,471 @@
|
|
|
18
16
|
Public License along with this library; if not, write to the
|
|
19
17
|
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
|
|
20
18
|
Boston, MA 02111-1307 USA
|
|
21
|
-
*/
|
|
22
|
-
|
|
19
|
+
*/
|
|
23
20
|
package processing.core;
|
|
24
21
|
|
|
25
|
-
|
|
26
22
|
/**
|
|
27
|
-
* 4x4 matrix implementation.
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
* a vector (x, y, z, w) in {@code mult()}.
|
|
23
|
+
* 4x4 matrix implementation. Matrices are used to describe a transformation;
|
|
24
|
+
* see {@link PMatrix} for a general description. This matrix looks like the
|
|
25
|
+
* following when multiplying a vector (x, y, z, w) in {@code mult()}.
|
|
31
26
|
* <pre>
|
|
32
27
|
* [m00 m01 m02 m03][x] [m00*x + m01*y + m02*z + m03*w] [x']
|
|
33
28
|
* [m10 m11 m12 m13][y] = [m10*x + m11*y + m12*z + m13*w] = [y']
|
|
34
29
|
* [m20 m21 m22 m23][z] [m20*x + m21*y + m22*z + m23*w] [z']
|
|
35
|
-
* [m30 m31 m32 m33][w] [m30*x + m31*y + m32*z + m33*w] [w']</pre>
|
|
36
|
-
*
|
|
37
|
-
*
|
|
30
|
+
* [m30 m31 m32 m33][w] [m30*x + m31*y + m32*z + m33*w] [w']</pre> (x', y', z',
|
|
31
|
+
* w') is returned. The values in the matrix determine the transformation. They
|
|
32
|
+
* are modified by the various transformation functions.
|
|
38
33
|
*
|
|
39
|
-
* To transform 3D coordinates, w is set to 1, amd w' is made to be 1 by
|
|
40
|
-
*
|
|
41
|
-
*
|
|
34
|
+
* To transform 3D coordinates, w is set to 1, amd w' is made to be 1 by setting
|
|
35
|
+
* the bottom row of the matrix to <code>[0 0 0 1]</code>. The resulting point
|
|
36
|
+
* is then (x', y', z').
|
|
42
37
|
*/
|
|
43
38
|
public final class PMatrix3D implements PMatrix /*, PConstants*/ {
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
// locally allocated version to avoid creating new memory
|
|
52
|
-
protected PMatrix3D inverseCopy;
|
|
53
|
-
|
|
40
|
+
public float m00, m01, m02, m03;
|
|
41
|
+
public float m10, m11, m12, m13;
|
|
42
|
+
public float m20, m21, m22, m23;
|
|
43
|
+
public float m30, m31, m32, m33;
|
|
54
44
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
public PMatrix3D(float m00, float m01, float m02,
|
|
61
|
-
float m10, float m11, float m12) {
|
|
62
|
-
set(m00, m01, m02, 0,
|
|
63
|
-
m10, m11, m12, 0,
|
|
64
|
-
0, 0, 1, 0,
|
|
65
|
-
0, 0, 0, 1);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
public PMatrix3D(float m00, float m01, float m02, float m03,
|
|
70
|
-
float m10, float m11, float m12, float m13,
|
|
71
|
-
float m20, float m21, float m22, float m23,
|
|
72
|
-
float m30, float m31, float m32, float m33) {
|
|
73
|
-
set(m00, m01, m02, m03,
|
|
74
|
-
m10, m11, m12, m13,
|
|
75
|
-
m20, m21, m22, m23,
|
|
76
|
-
m30, m31, m32, m33);
|
|
77
|
-
}
|
|
45
|
+
// locally allocated version to avoid creating new memory
|
|
46
|
+
protected PMatrix3D inverseCopy;
|
|
78
47
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
set(matrix);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
public void reset() {
|
|
86
|
-
set(1, 0, 0, 0,
|
|
87
|
-
0, 1, 0, 0,
|
|
88
|
-
0, 0, 1, 0,
|
|
89
|
-
0, 0, 0, 1);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Returns a copy of this PMatrix.
|
|
95
|
-
*/
|
|
96
|
-
public PMatrix3D get() {
|
|
97
|
-
PMatrix3D outgoing = new PMatrix3D();
|
|
98
|
-
outgoing.set(this);
|
|
99
|
-
return outgoing;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Copies the matrix contents into a 16 entry float array.
|
|
105
|
-
* If target is null (or not the correct size), a new array will be created.
|
|
106
|
-
*/
|
|
107
|
-
public float[] get(float[] target) {
|
|
108
|
-
if ((target == null) || (target.length != 16)) {
|
|
109
|
-
target = new float[16];
|
|
48
|
+
public PMatrix3D() {
|
|
49
|
+
reset();
|
|
110
50
|
}
|
|
111
|
-
target[0] = m00;
|
|
112
|
-
target[1] = m01;
|
|
113
|
-
target[2] = m02;
|
|
114
|
-
target[3] = m03;
|
|
115
|
-
|
|
116
|
-
target[4] = m10;
|
|
117
|
-
target[5] = m11;
|
|
118
|
-
target[6] = m12;
|
|
119
|
-
target[7] = m13;
|
|
120
|
-
|
|
121
|
-
target[8] = m20;
|
|
122
|
-
target[9] = m21;
|
|
123
|
-
target[10] = m22;
|
|
124
|
-
target[11] = m23;
|
|
125
|
-
|
|
126
|
-
target[12] = m30;
|
|
127
|
-
target[13] = m31;
|
|
128
|
-
target[14] = m32;
|
|
129
|
-
target[15] = m33;
|
|
130
51
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
PMatrix3D src = (PMatrix3D) matrix;
|
|
138
|
-
set(src.m00, src.m01, src.m02, src.m03,
|
|
139
|
-
src.m10, src.m11, src.m12, src.m13,
|
|
140
|
-
src.m20, src.m21, src.m22, src.m23,
|
|
141
|
-
src.m30, src.m31, src.m32, src.m33);
|
|
142
|
-
} else {
|
|
143
|
-
PMatrix2D src = (PMatrix2D) matrix;
|
|
144
|
-
set(src.m00, src.m01, 0, src.m02,
|
|
145
|
-
src.m10, src.m11, 0, src.m12,
|
|
146
|
-
0, 0, 1, 0,
|
|
147
|
-
0, 0, 0, 1);
|
|
52
|
+
public PMatrix3D(float m00, float m01, float m02,
|
|
53
|
+
float m10, float m11, float m12) {
|
|
54
|
+
set(m00, m01, m02, 0,
|
|
55
|
+
m10, m11, m12, 0,
|
|
56
|
+
0, 0, 1, 0,
|
|
57
|
+
0, 0, 0, 1);
|
|
148
58
|
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
public void set(float[] source) {
|
|
153
|
-
if (source.length == 6) {
|
|
154
|
-
set(source[0], source[1], source[2],
|
|
155
|
-
source[3], source[4], source[5]);
|
|
156
59
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
60
|
+
public PMatrix3D(float m00, float m01, float m02, float m03,
|
|
61
|
+
float m10, float m11, float m12, float m13,
|
|
62
|
+
float m20, float m21, float m22, float m23,
|
|
63
|
+
float m30, float m31, float m32, float m33) {
|
|
64
|
+
set(m00, m01, m02, m03,
|
|
65
|
+
m10, m11, m12, m13,
|
|
66
|
+
m20, m21, m22, m23,
|
|
67
|
+
m30, m31, m32, m33);
|
|
68
|
+
}
|
|
162
69
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
m13 = source[7];
|
|
70
|
+
public PMatrix3D(PMatrix matrix) {
|
|
71
|
+
set(matrix);
|
|
72
|
+
}
|
|
167
73
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
74
|
+
public void reset() {
|
|
75
|
+
set(1, 0, 0, 0,
|
|
76
|
+
0, 1, 0, 0,
|
|
77
|
+
0, 0, 1, 0,
|
|
78
|
+
0, 0, 0, 1);
|
|
79
|
+
}
|
|
172
80
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Returns a copy of this PMatrix.
|
|
83
|
+
*/
|
|
84
|
+
public PMatrix3D get() {
|
|
85
|
+
PMatrix3D outgoing = new PMatrix3D();
|
|
86
|
+
outgoing.set(this);
|
|
87
|
+
return outgoing;
|
|
177
88
|
}
|
|
178
|
-
}
|
|
179
89
|
|
|
90
|
+
/**
|
|
91
|
+
* Copies the matrix contents into a 16 entry float array. If target is null
|
|
92
|
+
* (or not the correct size), a new array will be created.
|
|
93
|
+
*/
|
|
94
|
+
public float[] get(float[] target) {
|
|
95
|
+
if ((target == null) || (target.length != 16)) {
|
|
96
|
+
target = new float[16];
|
|
97
|
+
}
|
|
98
|
+
target[0] = m00;
|
|
99
|
+
target[1] = m01;
|
|
100
|
+
target[2] = m02;
|
|
101
|
+
target[3] = m03;
|
|
102
|
+
|
|
103
|
+
target[4] = m10;
|
|
104
|
+
target[5] = m11;
|
|
105
|
+
target[6] = m12;
|
|
106
|
+
target[7] = m13;
|
|
107
|
+
|
|
108
|
+
target[8] = m20;
|
|
109
|
+
target[9] = m21;
|
|
110
|
+
target[10] = m22;
|
|
111
|
+
target[11] = m23;
|
|
112
|
+
|
|
113
|
+
target[12] = m30;
|
|
114
|
+
target[13] = m31;
|
|
115
|
+
target[14] = m32;
|
|
116
|
+
target[15] = m33;
|
|
117
|
+
|
|
118
|
+
return target;
|
|
119
|
+
}
|
|
180
120
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
121
|
+
public void set(PMatrix matrix) {
|
|
122
|
+
if (matrix instanceof PMatrix3D) {
|
|
123
|
+
PMatrix3D src = (PMatrix3D) matrix;
|
|
124
|
+
set(src.m00, src.m01, src.m02, src.m03,
|
|
125
|
+
src.m10, src.m11, src.m12, src.m13,
|
|
126
|
+
src.m20, src.m21, src.m22, src.m23,
|
|
127
|
+
src.m30, src.m31, src.m32, src.m33);
|
|
128
|
+
} else {
|
|
129
|
+
PMatrix2D src = (PMatrix2D) matrix;
|
|
130
|
+
set(src.m00, src.m01, 0, src.m02,
|
|
131
|
+
src.m10, src.m11, 0, src.m12,
|
|
132
|
+
0, 0, 1, 0,
|
|
133
|
+
0, 0, 0, 1);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
188
136
|
|
|
137
|
+
public void set(float[] source) {
|
|
138
|
+
if (source.length == 6) {
|
|
139
|
+
set(source[0], source[1], source[2],
|
|
140
|
+
source[3], source[4], source[5]);
|
|
141
|
+
|
|
142
|
+
} else if (source.length == 16) {
|
|
143
|
+
m00 = source[0];
|
|
144
|
+
m01 = source[1];
|
|
145
|
+
m02 = source[2];
|
|
146
|
+
m03 = source[3];
|
|
147
|
+
|
|
148
|
+
m10 = source[4];
|
|
149
|
+
m11 = source[5];
|
|
150
|
+
m12 = source[6];
|
|
151
|
+
m13 = source[7];
|
|
152
|
+
|
|
153
|
+
m20 = source[8];
|
|
154
|
+
m21 = source[9];
|
|
155
|
+
m22 = source[10];
|
|
156
|
+
m23 = source[11];
|
|
157
|
+
|
|
158
|
+
m30 = source[12];
|
|
159
|
+
m31 = source[13];
|
|
160
|
+
m32 = source[14];
|
|
161
|
+
m33 = source[15];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
189
164
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
this.m30 = m30; this.m31 = m31; this.m32 = m32; this.m33 = m33;
|
|
198
|
-
}
|
|
165
|
+
public void set(float m00, float m01, float m02,
|
|
166
|
+
float m10, float m11, float m12) {
|
|
167
|
+
set(m00, m01, 0, m02,
|
|
168
|
+
m10, m11, 0, m12,
|
|
169
|
+
0, 0, 1, 0,
|
|
170
|
+
0, 0, 0, 1);
|
|
171
|
+
}
|
|
199
172
|
|
|
173
|
+
public void set(float m00, float m01, float m02, float m03,
|
|
174
|
+
float m10, float m11, float m12, float m13,
|
|
175
|
+
float m20, float m21, float m22, float m23,
|
|
176
|
+
float m30, float m31, float m32, float m33) {
|
|
177
|
+
this.m00 = m00;
|
|
178
|
+
this.m01 = m01;
|
|
179
|
+
this.m02 = m02;
|
|
180
|
+
this.m03 = m03;
|
|
181
|
+
this.m10 = m10;
|
|
182
|
+
this.m11 = m11;
|
|
183
|
+
this.m12 = m12;
|
|
184
|
+
this.m13 = m13;
|
|
185
|
+
this.m20 = m20;
|
|
186
|
+
this.m21 = m21;
|
|
187
|
+
this.m22 = m22;
|
|
188
|
+
this.m23 = m23;
|
|
189
|
+
this.m30 = m30;
|
|
190
|
+
this.m31 = m31;
|
|
191
|
+
this.m32 = m32;
|
|
192
|
+
this.m33 = m33;
|
|
193
|
+
}
|
|
200
194
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
195
|
+
public void translate(float tx, float ty) {
|
|
196
|
+
translate(tx, ty, 0);
|
|
197
|
+
}
|
|
204
198
|
|
|
205
199
|
// public void invTranslate(float tx, float ty) {
|
|
206
200
|
// invTranslate(tx, ty, 0);
|
|
207
201
|
// }
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
m23 += tx*m20 + ty*m21 + tz*m22;
|
|
214
|
-
m33 += tx*m30 + ty*m31 + tz*m32;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
public void rotate(float angle) {
|
|
219
|
-
rotateZ(angle);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
public void rotateX(float angle) {
|
|
224
|
-
float c = cos(angle);
|
|
225
|
-
float s = sin(angle);
|
|
226
|
-
apply(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
public void rotateY(float angle) {
|
|
231
|
-
float c = cos(angle);
|
|
232
|
-
float s = sin(angle);
|
|
233
|
-
apply(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
public void rotateZ(float angle) {
|
|
238
|
-
float c = cos(angle);
|
|
239
|
-
float s = sin(angle);
|
|
240
|
-
apply(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
public void rotate(float angle, float v0, float v1, float v2) {
|
|
245
|
-
float norm2 = v0 * v0 + v1 * v1 + v2 * v2;
|
|
246
|
-
if (norm2 < PConstants.EPSILON) {
|
|
247
|
-
// The vector is zero, cannot apply rotation.
|
|
248
|
-
return;
|
|
202
|
+
public void translate(float tx, float ty, float tz) {
|
|
203
|
+
m03 += tx * m00 + ty * m01 + tz * m02;
|
|
204
|
+
m13 += tx * m10 + ty * m11 + tz * m12;
|
|
205
|
+
m23 += tx * m20 + ty * m21 + tz * m22;
|
|
206
|
+
m33 += tx * m30 + ty * m31 + tz * m32;
|
|
249
207
|
}
|
|
250
208
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
float norm = PApplet.sqrt(norm2);
|
|
254
|
-
v0 /= norm;
|
|
255
|
-
v1 /= norm;
|
|
256
|
-
v2 /= norm;
|
|
209
|
+
public void rotate(float angle) {
|
|
210
|
+
rotateZ(angle);
|
|
257
211
|
}
|
|
258
212
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
apply((t*v0*v0) + c, (t*v0*v1) - (s*v2), (t*v0*v2) + (s*v1), 0,
|
|
264
|
-
(t*v0*v1) + (s*v2), (t*v1*v1) + c, (t*v1*v2) - (s*v0), 0,
|
|
265
|
-
(t*v0*v2) - (s*v1), (t*v1*v2) + (s*v0), (t*v2*v2) + c, 0,
|
|
266
|
-
0, 0, 0, 1);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
public void scale(float s) {
|
|
271
|
-
//apply(s, 0, 0, 0, 0, s, 0, 0, 0, 0, s, 0, 0, 0, 0, 1);
|
|
272
|
-
scale(s, s, s);
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
public void scale(float sx, float sy) {
|
|
277
|
-
//apply(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
|
278
|
-
scale(sx, sy, 1);
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
public void scale(float x, float y, float z) {
|
|
283
|
-
//apply(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
|
|
284
|
-
m00 *= x; m01 *= y; m02 *= z;
|
|
285
|
-
m10 *= x; m11 *= y; m12 *= z;
|
|
286
|
-
m20 *= x; m21 *= y; m22 *= z;
|
|
287
|
-
m30 *= x; m31 *= y; m32 *= z;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
public void shearX(float angle) {
|
|
292
|
-
float t = (float) Math.tan(angle);
|
|
293
|
-
apply(1, t, 0, 0,
|
|
294
|
-
0, 1, 0, 0,
|
|
295
|
-
0, 0, 1, 0,
|
|
296
|
-
0, 0, 0, 1);
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
public void shearY(float angle) {
|
|
301
|
-
float t = (float) Math.tan(angle);
|
|
302
|
-
apply(1, 0, 0, 0,
|
|
303
|
-
t, 1, 0, 0,
|
|
304
|
-
0, 0, 1, 0,
|
|
305
|
-
0, 0, 0, 1);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
public void apply(PMatrix source) {
|
|
310
|
-
if (source instanceof PMatrix2D) {
|
|
311
|
-
apply((PMatrix2D) source);
|
|
312
|
-
} else if (source instanceof PMatrix3D) {
|
|
313
|
-
apply((PMatrix3D) source);
|
|
213
|
+
public void rotateX(float angle) {
|
|
214
|
+
float c = cos(angle);
|
|
215
|
+
float s = sin(angle);
|
|
216
|
+
apply(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
|
|
314
217
|
}
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
public void apply(PMatrix2D source) {
|
|
319
|
-
apply(source.m00, source.m01, 0, source.m02,
|
|
320
|
-
source.m10, source.m11, 0, source.m12,
|
|
321
|
-
0, 0, 1, 0,
|
|
322
|
-
0, 0, 0, 1);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
public void apply(PMatrix3D source) {
|
|
327
|
-
apply(source.m00, source.m01, source.m02, source.m03,
|
|
328
|
-
source.m10, source.m11, source.m12, source.m13,
|
|
329
|
-
source.m20, source.m21, source.m22, source.m23,
|
|
330
|
-
source.m30, source.m31, source.m32, source.m33);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
public void apply(float n00, float n01, float n02,
|
|
335
|
-
float n10, float n11, float n12) {
|
|
336
|
-
apply(n00, n01, 0, n02,
|
|
337
|
-
n10, n11, 0, n12,
|
|
338
|
-
0, 0, 1, 0,
|
|
339
|
-
0, 0, 0, 1);
|
|
340
|
-
}
|
|
341
218
|
|
|
219
|
+
public void rotateY(float angle) {
|
|
220
|
+
float c = cos(angle);
|
|
221
|
+
float s = sin(angle);
|
|
222
|
+
apply(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
|
|
223
|
+
}
|
|
342
224
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
float r00 = m00*n00 + m01*n10 + m02*n20 + m03*n30;
|
|
349
|
-
float r01 = m00*n01 + m01*n11 + m02*n21 + m03*n31;
|
|
350
|
-
float r02 = m00*n02 + m01*n12 + m02*n22 + m03*n32;
|
|
351
|
-
float r03 = m00*n03 + m01*n13 + m02*n23 + m03*n33;
|
|
352
|
-
|
|
353
|
-
float r10 = m10*n00 + m11*n10 + m12*n20 + m13*n30;
|
|
354
|
-
float r11 = m10*n01 + m11*n11 + m12*n21 + m13*n31;
|
|
355
|
-
float r12 = m10*n02 + m11*n12 + m12*n22 + m13*n32;
|
|
356
|
-
float r13 = m10*n03 + m11*n13 + m12*n23 + m13*n33;
|
|
357
|
-
|
|
358
|
-
float r20 = m20*n00 + m21*n10 + m22*n20 + m23*n30;
|
|
359
|
-
float r21 = m20*n01 + m21*n11 + m22*n21 + m23*n31;
|
|
360
|
-
float r22 = m20*n02 + m21*n12 + m22*n22 + m23*n32;
|
|
361
|
-
float r23 = m20*n03 + m21*n13 + m22*n23 + m23*n33;
|
|
225
|
+
public void rotateZ(float angle) {
|
|
226
|
+
float c = cos(angle);
|
|
227
|
+
float s = sin(angle);
|
|
228
|
+
apply(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
|
229
|
+
}
|
|
362
230
|
|
|
363
|
-
float
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
231
|
+
public void rotate(float angle, float v0, float v1, float v2) {
|
|
232
|
+
float norm2 = v0 * v0 + v1 * v1 + v2 * v2;
|
|
233
|
+
if (norm2 < PConstants.EPSILON) {
|
|
234
|
+
// The vector is zero, cannot apply rotation.
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (Math.abs(norm2 - 1) > PConstants.EPSILON) {
|
|
239
|
+
// The rotation vector is not normalized.
|
|
240
|
+
float norm = PApplet.sqrt(norm2);
|
|
241
|
+
v0 /= norm;
|
|
242
|
+
v1 /= norm;
|
|
243
|
+
v2 /= norm;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
float c = cos(angle);
|
|
247
|
+
float s = sin(angle);
|
|
248
|
+
float t = 1.0f - c;
|
|
249
|
+
|
|
250
|
+
apply((t * v0 * v0) + c, (t * v0 * v1) - (s * v2), (t * v0 * v2) + (s * v1), 0,
|
|
251
|
+
(t * v0 * v1) + (s * v2), (t * v1 * v1) + c, (t * v1 * v2) - (s * v0), 0,
|
|
252
|
+
(t * v0 * v2) - (s * v1), (t * v1 * v2) + (s * v0), (t * v2 * v2) + c, 0,
|
|
253
|
+
0, 0, 0, 1);
|
|
254
|
+
}
|
|
367
255
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
}
|
|
256
|
+
public void scale(float s) {
|
|
257
|
+
//apply(s, 0, 0, 0, 0, s, 0, 0, 0, 0, s, 0, 0, 0, 0, 1);
|
|
258
|
+
scale(s, s, s);
|
|
259
|
+
}
|
|
373
260
|
|
|
261
|
+
public void scale(float sx, float sy) {
|
|
262
|
+
//apply(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
|
263
|
+
scale(sx, sy, 1);
|
|
264
|
+
}
|
|
374
265
|
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
266
|
+
public void scale(float x, float y, float z) {
|
|
267
|
+
//apply(x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1);
|
|
268
|
+
m00 *= x;
|
|
269
|
+
m01 *= y;
|
|
270
|
+
m02 *= z;
|
|
271
|
+
m10 *= x;
|
|
272
|
+
m11 *= y;
|
|
273
|
+
m12 *= z;
|
|
274
|
+
m20 *= x;
|
|
275
|
+
m21 *= y;
|
|
276
|
+
m22 *= z;
|
|
277
|
+
m30 *= x;
|
|
278
|
+
m31 *= y;
|
|
279
|
+
m32 *= z;
|
|
280
|
+
}
|
|
384
281
|
|
|
282
|
+
public void shearX(float angle) {
|
|
283
|
+
float t = (float) Math.tan(angle);
|
|
284
|
+
apply(1, t, 0, 0,
|
|
285
|
+
0, 1, 0, 0,
|
|
286
|
+
0, 0, 1, 0,
|
|
287
|
+
0, 0, 0, 1);
|
|
288
|
+
}
|
|
385
289
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
} else if (source instanceof PMatrix3D) {
|
|
393
|
-
preApply((PMatrix3D) source);
|
|
290
|
+
public void shearY(float angle) {
|
|
291
|
+
float t = (float) Math.tan(angle);
|
|
292
|
+
apply(1, 0, 0, 0,
|
|
293
|
+
t, 1, 0, 0,
|
|
294
|
+
0, 0, 1, 0,
|
|
295
|
+
0, 0, 0, 1);
|
|
394
296
|
}
|
|
395
|
-
}
|
|
396
297
|
|
|
298
|
+
public void apply(PMatrix source) {
|
|
299
|
+
if (source instanceof PMatrix2D) {
|
|
300
|
+
apply((PMatrix2D) source);
|
|
301
|
+
} else if (source instanceof PMatrix3D) {
|
|
302
|
+
apply((PMatrix3D) source);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
397
305
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
left.m20, left.m21, left.m22, left.m23,
|
|
405
|
-
left.m30, left.m31, left.m32, left.m33);
|
|
406
|
-
}
|
|
306
|
+
public void apply(PMatrix2D source) {
|
|
307
|
+
apply(source.m00, source.m01, 0, source.m02,
|
|
308
|
+
source.m10, source.m11, 0, source.m12,
|
|
309
|
+
0, 0, 1, 0,
|
|
310
|
+
0, 0, 0, 1);
|
|
311
|
+
}
|
|
407
312
|
|
|
313
|
+
public void apply(PMatrix3D source) {
|
|
314
|
+
apply(source.m00, source.m01, source.m02, source.m03,
|
|
315
|
+
source.m10, source.m11, source.m12, source.m13,
|
|
316
|
+
source.m20, source.m21, source.m22, source.m23,
|
|
317
|
+
source.m30, source.m31, source.m32, source.m33);
|
|
318
|
+
}
|
|
408
319
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
0, 0, 1, 0,
|
|
417
|
-
0, 0, 0, 1);
|
|
418
|
-
}
|
|
320
|
+
public void apply(float n00, float n01, float n02,
|
|
321
|
+
float n10, float n11, float n12) {
|
|
322
|
+
apply(n00, n01, 0, n02,
|
|
323
|
+
n10, n11, 0, n12,
|
|
324
|
+
0, 0, 1, 0,
|
|
325
|
+
0, 0, 0, 1);
|
|
326
|
+
}
|
|
419
327
|
|
|
328
|
+
public void apply(float n00, float n01, float n02, float n03,
|
|
329
|
+
float n10, float n11, float n12, float n13,
|
|
330
|
+
float n20, float n21, float n22, float n23,
|
|
331
|
+
float n30, float n31, float n32, float n33) {
|
|
332
|
+
|
|
333
|
+
float r00 = m00 * n00 + m01 * n10 + m02 * n20 + m03 * n30;
|
|
334
|
+
float r01 = m00 * n01 + m01 * n11 + m02 * n21 + m03 * n31;
|
|
335
|
+
float r02 = m00 * n02 + m01 * n12 + m02 * n22 + m03 * n32;
|
|
336
|
+
float r03 = m00 * n03 + m01 * n13 + m02 * n23 + m03 * n33;
|
|
337
|
+
|
|
338
|
+
float r10 = m10 * n00 + m11 * n10 + m12 * n20 + m13 * n30;
|
|
339
|
+
float r11 = m10 * n01 + m11 * n11 + m12 * n21 + m13 * n31;
|
|
340
|
+
float r12 = m10 * n02 + m11 * n12 + m12 * n22 + m13 * n32;
|
|
341
|
+
float r13 = m10 * n03 + m11 * n13 + m12 * n23 + m13 * n33;
|
|
342
|
+
|
|
343
|
+
float r20 = m20 * n00 + m21 * n10 + m22 * n20 + m23 * n30;
|
|
344
|
+
float r21 = m20 * n01 + m21 * n11 + m22 * n21 + m23 * n31;
|
|
345
|
+
float r22 = m20 * n02 + m21 * n12 + m22 * n22 + m23 * n32;
|
|
346
|
+
float r23 = m20 * n03 + m21 * n13 + m22 * n23 + m23 * n33;
|
|
347
|
+
|
|
348
|
+
float r30 = m30 * n00 + m31 * n10 + m32 * n20 + m33 * n30;
|
|
349
|
+
float r31 = m30 * n01 + m31 * n11 + m32 * n21 + m33 * n31;
|
|
350
|
+
float r32 = m30 * n02 + m31 * n12 + m32 * n22 + m33 * n32;
|
|
351
|
+
float r33 = m30 * n03 + m31 * n13 + m32 * n23 + m33 * n33;
|
|
352
|
+
|
|
353
|
+
m00 = r00;
|
|
354
|
+
m01 = r01;
|
|
355
|
+
m02 = r02;
|
|
356
|
+
m03 = r03;
|
|
357
|
+
m10 = r10;
|
|
358
|
+
m11 = r11;
|
|
359
|
+
m12 = r12;
|
|
360
|
+
m13 = r13;
|
|
361
|
+
m20 = r20;
|
|
362
|
+
m21 = r21;
|
|
363
|
+
m22 = r22;
|
|
364
|
+
m23 = r23;
|
|
365
|
+
m30 = r30;
|
|
366
|
+
m31 = r31;
|
|
367
|
+
m32 = r32;
|
|
368
|
+
m33 = r33;
|
|
369
|
+
}
|
|
420
370
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
float r02 = n00*m02 + n01*m12 + n02*m22 + n03*m32;
|
|
432
|
-
float r03 = n00*m03 + n01*m13 + n02*m23 + n03*m33;
|
|
433
|
-
|
|
434
|
-
float r10 = n10*m00 + n11*m10 + n12*m20 + n13*m30;
|
|
435
|
-
float r11 = n10*m01 + n11*m11 + n12*m21 + n13*m31;
|
|
436
|
-
float r12 = n10*m02 + n11*m12 + n12*m22 + n13*m32;
|
|
437
|
-
float r13 = n10*m03 + n11*m13 + n12*m23 + n13*m33;
|
|
438
|
-
|
|
439
|
-
float r20 = n20*m00 + n21*m10 + n22*m20 + n23*m30;
|
|
440
|
-
float r21 = n20*m01 + n21*m11 + n22*m21 + n23*m31;
|
|
441
|
-
float r22 = n20*m02 + n21*m12 + n22*m22 + n23*m32;
|
|
442
|
-
float r23 = n20*m03 + n21*m13 + n22*m23 + n23*m33;
|
|
443
|
-
|
|
444
|
-
float r30 = n30*m00 + n31*m10 + n32*m20 + n33*m30;
|
|
445
|
-
float r31 = n30*m01 + n31*m11 + n32*m21 + n33*m31;
|
|
446
|
-
float r32 = n30*m02 + n31*m12 + n32*m22 + n33*m32;
|
|
447
|
-
float r33 = n30*m03 + n31*m13 + n32*m23 + n33*m33;
|
|
448
|
-
|
|
449
|
-
m00 = r00; m01 = r01; m02 = r02; m03 = r03;
|
|
450
|
-
m10 = r10; m11 = r11; m12 = r12; m13 = r13;
|
|
451
|
-
m20 = r20; m21 = r21; m22 = r22; m23 = r23;
|
|
452
|
-
m30 = r30; m31 = r31; m32 = r32; m33 = r33;
|
|
453
|
-
}
|
|
371
|
+
/**
|
|
372
|
+
* Apply the 3D equivalent of the 2D matrix supplied to the left of this
|
|
373
|
+
* one.
|
|
374
|
+
*/
|
|
375
|
+
public void preApply(PMatrix2D left) {
|
|
376
|
+
preApply(left.m00, left.m01, 0, left.m02,
|
|
377
|
+
left.m10, left.m11, 0, left.m12,
|
|
378
|
+
0, 0, 1, 0,
|
|
379
|
+
0, 0, 0, 1);
|
|
380
|
+
}
|
|
454
381
|
|
|
382
|
+
/**
|
|
383
|
+
* Apply another matrix to the left of this one.
|
|
384
|
+
*/
|
|
385
|
+
public void preApply(PMatrix source) {
|
|
386
|
+
if (source instanceof PMatrix2D) {
|
|
387
|
+
preApply((PMatrix2D) source);
|
|
388
|
+
} else if (source instanceof PMatrix3D) {
|
|
389
|
+
preApply((PMatrix3D) source);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
455
392
|
|
|
456
|
-
|
|
393
|
+
/**
|
|
394
|
+
* Apply another matrix to the left of this one.
|
|
395
|
+
*/
|
|
396
|
+
public void preApply(PMatrix3D left) {
|
|
397
|
+
preApply(left.m00, left.m01, left.m02, left.m03,
|
|
398
|
+
left.m10, left.m11, left.m12, left.m13,
|
|
399
|
+
left.m20, left.m21, left.m22, left.m23,
|
|
400
|
+
left.m30, left.m31, left.m32, left.m33);
|
|
401
|
+
}
|
|
457
402
|
|
|
403
|
+
/**
|
|
404
|
+
* Apply the 3D equivalent of the 2D matrix supplied to the left of this
|
|
405
|
+
* one.
|
|
406
|
+
*/
|
|
407
|
+
public void preApply(float n00, float n01, float n02,
|
|
408
|
+
float n10, float n11, float n12) {
|
|
409
|
+
preApply(n00, n01, 0, n02,
|
|
410
|
+
n10, n11, 0, n12,
|
|
411
|
+
0, 0, 1, 0,
|
|
412
|
+
0, 0, 0, 1);
|
|
413
|
+
}
|
|
458
414
|
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
415
|
+
/**
|
|
416
|
+
* Apply another matrix to the left of this one.
|
|
417
|
+
*/
|
|
418
|
+
public void preApply(float n00, float n01, float n02, float n03,
|
|
419
|
+
float n10, float n11, float n12, float n13,
|
|
420
|
+
float n20, float n21, float n22, float n23,
|
|
421
|
+
float n30, float n31, float n32, float n33) {
|
|
422
|
+
|
|
423
|
+
float r00 = n00 * m00 + n01 * m10 + n02 * m20 + n03 * m30;
|
|
424
|
+
float r01 = n00 * m01 + n01 * m11 + n02 * m21 + n03 * m31;
|
|
425
|
+
float r02 = n00 * m02 + n01 * m12 + n02 * m22 + n03 * m32;
|
|
426
|
+
float r03 = n00 * m03 + n01 * m13 + n02 * m23 + n03 * m33;
|
|
427
|
+
|
|
428
|
+
float r10 = n10 * m00 + n11 * m10 + n12 * m20 + n13 * m30;
|
|
429
|
+
float r11 = n10 * m01 + n11 * m11 + n12 * m21 + n13 * m31;
|
|
430
|
+
float r12 = n10 * m02 + n11 * m12 + n12 * m22 + n13 * m32;
|
|
431
|
+
float r13 = n10 * m03 + n11 * m13 + n12 * m23 + n13 * m33;
|
|
432
|
+
|
|
433
|
+
float r20 = n20 * m00 + n21 * m10 + n22 * m20 + n23 * m30;
|
|
434
|
+
float r21 = n20 * m01 + n21 * m11 + n22 * m21 + n23 * m31;
|
|
435
|
+
float r22 = n20 * m02 + n21 * m12 + n22 * m22 + n23 * m32;
|
|
436
|
+
float r23 = n20 * m03 + n21 * m13 + n22 * m23 + n23 * m33;
|
|
437
|
+
|
|
438
|
+
float r30 = n30 * m00 + n31 * m10 + n32 * m20 + n33 * m30;
|
|
439
|
+
float r31 = n30 * m01 + n31 * m11 + n32 * m21 + n33 * m31;
|
|
440
|
+
float r32 = n30 * m02 + n31 * m12 + n32 * m22 + n33 * m32;
|
|
441
|
+
float r33 = n30 * m03 + n31 * m13 + n32 * m23 + n33 * m33;
|
|
442
|
+
|
|
443
|
+
m00 = r00;
|
|
444
|
+
m01 = r01;
|
|
445
|
+
m02 = r02;
|
|
446
|
+
m03 = r03;
|
|
447
|
+
m10 = r10;
|
|
448
|
+
m11 = r11;
|
|
449
|
+
m12 = r12;
|
|
450
|
+
m13 = r13;
|
|
451
|
+
m20 = r20;
|
|
452
|
+
m21 = r21;
|
|
453
|
+
m22 = r22;
|
|
454
|
+
m23 = r23;
|
|
455
|
+
m30 = r30;
|
|
456
|
+
m31 = r31;
|
|
457
|
+
m32 = r32;
|
|
458
|
+
m33 = r33;
|
|
468
459
|
}
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
460
|
+
|
|
461
|
+
//////////////////////////////////////////////////////////////
|
|
462
|
+
/**
|
|
463
|
+
* Multiply source by this matrix, and return the result. The result will be
|
|
464
|
+
* stored in target if target is non-null, and target will then be the
|
|
465
|
+
* matrix returned. This improves performance if you reuse target, so it's
|
|
466
|
+
* recommended if you call this many times in draw().
|
|
467
|
+
*/
|
|
468
|
+
public PVector mult(PVector source, PVector target) {
|
|
469
|
+
if (target == null) {
|
|
470
|
+
target = new PVector();
|
|
471
|
+
}
|
|
472
|
+
target.set(m00 * source.x + m01 * source.y + m02 * source.z + m03,
|
|
473
|
+
m10 * source.x + m11 * source.y + m12 * source.z + m13,
|
|
474
|
+
m20 * source.x + m21 * source.y + m22 * source.z + m23);
|
|
472
475
|
// float tw = m30*source.x + m31*source.y + m32*source.z + m33;
|
|
473
476
|
// if (tw != 0 && tw != 1) {
|
|
474
477
|
// target.div(tw);
|
|
475
478
|
// }
|
|
476
|
-
|
|
477
|
-
|
|
479
|
+
return target;
|
|
480
|
+
}
|
|
478
481
|
|
|
479
482
|
|
|
480
|
-
|
|
483
|
+
/*
|
|
481
484
|
public PVector cmult(PVector source, PVector target) {
|
|
482
485
|
if (target == null) {
|
|
483
486
|
target = new PVector();
|
|
@@ -491,387 +494,370 @@ public final class PMatrix3D implements PMatrix /*, PConstants*/ {
|
|
|
491
494
|
}
|
|
492
495
|
return target;
|
|
493
496
|
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
497
|
+
*/
|
|
498
|
+
/**
|
|
499
|
+
* Multiply a three or four element vector against this matrix. If out is
|
|
500
|
+
* null or not length 3 or 4, a new float array (length 3) will be returned.
|
|
501
|
+
* Supplying and recycling a target array improves performance, so it's
|
|
502
|
+
* recommended if you call this many times in draw.
|
|
503
|
+
*/
|
|
504
|
+
public float[] mult(float[] source, float[] target) {
|
|
505
|
+
if (target == null || target.length < 3) {
|
|
506
|
+
target = new float[3];
|
|
507
|
+
}
|
|
508
|
+
if (source == target) {
|
|
509
|
+
throw new RuntimeException("The source and target vectors used in "
|
|
510
|
+
+ "PMatrix3D.mult() cannot be identical.");
|
|
511
|
+
}
|
|
512
|
+
if (target.length == 3) {
|
|
513
|
+
target[0] = m00 * source[0] + m01 * source[1] + m02 * source[2] + m03;
|
|
514
|
+
target[1] = m10 * source[0] + m11 * source[1] + m12 * source[2] + m13;
|
|
515
|
+
target[2] = m20 * source[0] + m21 * source[1] + m22 * source[2] + m23;
|
|
516
|
+
//float w = m30*source[0] + m31*source[1] + m32*source[2] + m33;
|
|
517
|
+
//if (w != 0 && w != 1) {
|
|
518
|
+
// target[0] /= w; target[1] /= w; target[2] /= w;
|
|
519
|
+
//}
|
|
520
|
+
} else if (target.length > 3) {
|
|
521
|
+
target[0] = m00 * source[0] + m01 * source[1] + m02 * source[2] + m03 * source[3];
|
|
522
|
+
target[1] = m10 * source[0] + m11 * source[1] + m12 * source[2] + m13 * source[3];
|
|
523
|
+
target[2] = m20 * source[0] + m21 * source[1] + m22 * source[2] + m23 * source[3];
|
|
524
|
+
target[3] = m30 * source[0] + m31 * source[1] + m32 * source[2] + m33 * source[3];
|
|
525
|
+
}
|
|
526
|
+
return target;
|
|
524
527
|
}
|
|
525
|
-
return target;
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
/**
|
|
530
|
-
* Returns the x-coordinate of the result of multiplying the point (x, y)
|
|
531
|
-
* by this matrix.
|
|
532
|
-
*/
|
|
533
|
-
public float multX(float x, float y) {
|
|
534
|
-
return m00*x + m01*y + m03;
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
/**
|
|
539
|
-
* Returns the y-coordinate of the result of multiplying the point (x, y)
|
|
540
|
-
* by this matrix.
|
|
541
|
-
*/
|
|
542
|
-
public float multY(float x, float y) {
|
|
543
|
-
return m10*x + m11*y + m13;
|
|
544
|
-
}
|
|
545
528
|
|
|
529
|
+
/**
|
|
530
|
+
* Returns the x-coordinate of the result of multiplying the point (x, y) by
|
|
531
|
+
* this matrix.
|
|
532
|
+
*/
|
|
533
|
+
public float multX(float x, float y) {
|
|
534
|
+
return m00 * x + m01 * y + m03;
|
|
535
|
+
}
|
|
546
536
|
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
/**
|
|
557
|
-
* Returns the y-coordinate of the result of multiplying the point (x, y, z)
|
|
558
|
-
* by this matrix.
|
|
559
|
-
*/
|
|
560
|
-
public float multY(float x, float y, float z) {
|
|
561
|
-
return m10*x + m11*y + m12*z + m13;
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
/**
|
|
566
|
-
* Returns the z-coordinate of the result of multiplying the point (x, y, z)
|
|
567
|
-
* by this matrix.
|
|
568
|
-
*/
|
|
569
|
-
public float multZ(float x, float y, float z) {
|
|
570
|
-
return m20*x + m21*y + m22*z + m23;
|
|
571
|
-
}
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
/**
|
|
575
|
-
* Returns the fourth element of the result of multiplying the vector
|
|
576
|
-
* (x, y, z) by this matrix. (Acts as if w = 1 was supplied.)
|
|
577
|
-
*/
|
|
578
|
-
public float multW(float x, float y, float z) {
|
|
579
|
-
return m30*x + m31*y + m32*z + m33;
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
/**
|
|
584
|
-
* Returns the x-coordinate of the result of multiplying the vector
|
|
585
|
-
* (x, y, z, w) by this matrix.
|
|
586
|
-
*/
|
|
587
|
-
public float multX(float x, float y, float z, float w) {
|
|
588
|
-
return m00*x + m01*y + m02*z + m03*w;
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
/**
|
|
593
|
-
* Returns the y-coordinate of the result of multiplying the vector
|
|
594
|
-
* (x, y, z, w) by this matrix.
|
|
595
|
-
*/
|
|
596
|
-
public float multY(float x, float y, float z, float w) {
|
|
597
|
-
return m10*x + m11*y + m12*z + m13*w;
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
/**
|
|
602
|
-
* Returns the z-coordinate of the result of multiplying the vector
|
|
603
|
-
* (x, y, z, w) by this matrix.
|
|
604
|
-
*/
|
|
605
|
-
public float multZ(float x, float y, float z, float w) {
|
|
606
|
-
return m20*x + m21*y + m22*z + m23*w;
|
|
607
|
-
}
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
/**
|
|
611
|
-
* Returns the w-coordinate of the result of multiplying the vector
|
|
612
|
-
* (x, y, z, w) by this matrix.
|
|
613
|
-
*/
|
|
614
|
-
public float multW(float x, float y, float z, float w) {
|
|
615
|
-
return m30*x + m31*y + m32*z + m33*w;
|
|
616
|
-
}
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
/**
|
|
620
|
-
* Transpose this matrix; rows become columns and columns rows.
|
|
621
|
-
*/
|
|
622
|
-
public void transpose() {
|
|
623
|
-
float temp;
|
|
624
|
-
temp = m01; m01 = m10; m10 = temp;
|
|
625
|
-
temp = m02; m02 = m20; m20 = temp;
|
|
626
|
-
temp = m03; m03 = m30; m30 = temp;
|
|
627
|
-
temp = m12; m12 = m21; m21 = temp;
|
|
628
|
-
temp = m13; m13 = m31; m31 = temp;
|
|
629
|
-
temp = m23; m23 = m32; m32 = temp;
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
/**
|
|
634
|
-
* Invert this matrix. Will not necessarily succeed, because some matrices
|
|
635
|
-
* map more than one point to the same image point, and so are irreversible.
|
|
636
|
-
* @return true if successful
|
|
637
|
-
*/
|
|
638
|
-
public boolean invert() {
|
|
639
|
-
float determinant = determinant();
|
|
640
|
-
if (determinant == 0) {
|
|
641
|
-
return false;
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
// first row
|
|
645
|
-
float t00 = determinant3x3(m11, m12, m13, m21, m22, m23, m31, m32, m33);
|
|
646
|
-
float t01 = -determinant3x3(m10, m12, m13, m20, m22, m23, m30, m32, m33);
|
|
647
|
-
float t02 = determinant3x3(m10, m11, m13, m20, m21, m23, m30, m31, m33);
|
|
648
|
-
float t03 = -determinant3x3(m10, m11, m12, m20, m21, m22, m30, m31, m32);
|
|
649
|
-
|
|
650
|
-
// second row
|
|
651
|
-
float t10 = -determinant3x3(m01, m02, m03, m21, m22, m23, m31, m32, m33);
|
|
652
|
-
float t11 = determinant3x3(m00, m02, m03, m20, m22, m23, m30, m32, m33);
|
|
653
|
-
float t12 = -determinant3x3(m00, m01, m03, m20, m21, m23, m30, m31, m33);
|
|
654
|
-
float t13 = determinant3x3(m00, m01, m02, m20, m21, m22, m30, m31, m32);
|
|
655
|
-
|
|
656
|
-
// third row
|
|
657
|
-
float t20 = determinant3x3(m01, m02, m03, m11, m12, m13, m31, m32, m33);
|
|
658
|
-
float t21 = -determinant3x3(m00, m02, m03, m10, m12, m13, m30, m32, m33);
|
|
659
|
-
float t22 = determinant3x3(m00, m01, m03, m10, m11, m13, m30, m31, m33);
|
|
660
|
-
float t23 = -determinant3x3(m00, m01, m02, m10, m11, m12, m30, m31, m32);
|
|
661
|
-
|
|
662
|
-
// fourth row
|
|
663
|
-
float t30 = -determinant3x3(m01, m02, m03, m11, m12, m13, m21, m22, m23);
|
|
664
|
-
float t31 = determinant3x3(m00, m02, m03, m10, m12, m13, m20, m22, m23);
|
|
665
|
-
float t32 = -determinant3x3(m00, m01, m03, m10, m11, m13, m20, m21, m23);
|
|
666
|
-
float t33 = determinant3x3(m00, m01, m02, m10, m11, m12, m20, m21, m22);
|
|
667
|
-
|
|
668
|
-
// transpose and divide by the determinant
|
|
669
|
-
m00 = t00 / determinant;
|
|
670
|
-
m01 = t10 / determinant;
|
|
671
|
-
m02 = t20 / determinant;
|
|
672
|
-
m03 = t30 / determinant;
|
|
673
|
-
|
|
674
|
-
m10 = t01 / determinant;
|
|
675
|
-
m11 = t11 / determinant;
|
|
676
|
-
m12 = t21 / determinant;
|
|
677
|
-
m13 = t31 / determinant;
|
|
678
|
-
|
|
679
|
-
m20 = t02 / determinant;
|
|
680
|
-
m21 = t12 / determinant;
|
|
681
|
-
m22 = t22 / determinant;
|
|
682
|
-
m23 = t32 / determinant;
|
|
683
|
-
|
|
684
|
-
m30 = t03 / determinant;
|
|
685
|
-
m31 = t13 / determinant;
|
|
686
|
-
m32 = t23 / determinant;
|
|
687
|
-
m33 = t33 / determinant;
|
|
688
|
-
|
|
689
|
-
return true;
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
/**
|
|
694
|
-
* Calculate the determinant of a 3x3 matrix.
|
|
695
|
-
* @return result
|
|
696
|
-
*/
|
|
697
|
-
private float determinant3x3(float t00, float t01, float t02,
|
|
698
|
-
float t10, float t11, float t12,
|
|
699
|
-
float t20, float t21, float t22) {
|
|
700
|
-
return (t00 * (t11 * t22 - t12 * t21) +
|
|
701
|
-
t01 * (t12 * t20 - t10 * t22) +
|
|
702
|
-
t02 * (t10 * t21 - t11 * t20));
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
/**
|
|
707
|
-
* @return the determinant of the matrix
|
|
708
|
-
*/
|
|
709
|
-
public float determinant() {
|
|
710
|
-
float f =
|
|
711
|
-
m00
|
|
712
|
-
* ((m11 * m22 * m33 + m12 * m23 * m31 + m13 * m21 * m32)
|
|
713
|
-
- m13 * m22 * m31
|
|
714
|
-
- m11 * m23 * m32
|
|
715
|
-
- m12 * m21 * m33);
|
|
716
|
-
f -= m01
|
|
717
|
-
* ((m10 * m22 * m33 + m12 * m23 * m30 + m13 * m20 * m32)
|
|
718
|
-
- m13 * m22 * m30
|
|
719
|
-
- m10 * m23 * m32
|
|
720
|
-
- m12 * m20 * m33);
|
|
721
|
-
f += m02
|
|
722
|
-
* ((m10 * m21 * m33 + m11 * m23 * m30 + m13 * m20 * m31)
|
|
723
|
-
- m13 * m21 * m30
|
|
724
|
-
- m10 * m23 * m31
|
|
725
|
-
- m11 * m20 * m33);
|
|
726
|
-
f -= m03
|
|
727
|
-
* ((m10 * m21 * m32 + m11 * m22 * m30 + m12 * m20 * m31)
|
|
728
|
-
- m12 * m21 * m30
|
|
729
|
-
- m10 * m22 * m31
|
|
730
|
-
- m11 * m20 * m32);
|
|
731
|
-
return f;
|
|
732
|
-
}
|
|
733
|
-
|
|
537
|
+
/**
|
|
538
|
+
* Returns the y-coordinate of the result of multiplying the point (x, y) by
|
|
539
|
+
* this matrix.
|
|
540
|
+
*/
|
|
541
|
+
public float multY(float x, float y) {
|
|
542
|
+
return m10 * x + m11 * y + m13;
|
|
543
|
+
}
|
|
734
544
|
|
|
735
|
-
|
|
545
|
+
/**
|
|
546
|
+
* Returns the x-coordinate of the result of multiplying the point (x, y, z)
|
|
547
|
+
* by this matrix.
|
|
548
|
+
*/
|
|
549
|
+
public float multX(float x, float y, float z) {
|
|
550
|
+
return m00 * x + m01 * y + m02 * z + m03;
|
|
551
|
+
}
|
|
736
552
|
|
|
737
|
-
|
|
553
|
+
/**
|
|
554
|
+
* Returns the y-coordinate of the result of multiplying the point (x, y, z)
|
|
555
|
+
* by this matrix.
|
|
556
|
+
*/
|
|
557
|
+
public float multY(float x, float y, float z) {
|
|
558
|
+
return m10 * x + m11 * y + m12 * z + m13;
|
|
559
|
+
}
|
|
738
560
|
|
|
739
|
-
|
|
561
|
+
/**
|
|
562
|
+
* Returns the z-coordinate of the result of multiplying the point (x, y, z)
|
|
563
|
+
* by this matrix.
|
|
564
|
+
*/
|
|
565
|
+
public float multZ(float x, float y, float z) {
|
|
566
|
+
return m20 * x + m21 * y + m22 * z + m23;
|
|
567
|
+
}
|
|
740
568
|
|
|
569
|
+
/**
|
|
570
|
+
* Returns the fourth element of the result of multiplying the vector (x, y,
|
|
571
|
+
* z) by this matrix. (Acts as if w = 1 was supplied.)
|
|
572
|
+
*/
|
|
573
|
+
public float multW(float x, float y, float z) {
|
|
574
|
+
return m30 * x + m31 * y + m32 * z + m33;
|
|
575
|
+
}
|
|
741
576
|
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
577
|
+
/**
|
|
578
|
+
* Returns the x-coordinate of the result of multiplying the vector (x, y,
|
|
579
|
+
* z, w) by this matrix.
|
|
580
|
+
*/
|
|
581
|
+
public float multX(float x, float y, float z, float w) {
|
|
582
|
+
return m00 * x + m01 * y + m02 * z + m03 * w;
|
|
583
|
+
}
|
|
748
584
|
|
|
585
|
+
/**
|
|
586
|
+
* Returns the y-coordinate of the result of multiplying the vector (x, y,
|
|
587
|
+
* z, w) by this matrix.
|
|
588
|
+
*/
|
|
589
|
+
public float multY(float x, float y, float z, float w) {
|
|
590
|
+
return m10 * x + m11 * y + m12 * z + m13 * w;
|
|
591
|
+
}
|
|
749
592
|
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
593
|
+
/**
|
|
594
|
+
* Returns the z-coordinate of the result of multiplying the vector (x, y,
|
|
595
|
+
* z, w) by this matrix.
|
|
596
|
+
*/
|
|
597
|
+
public float multZ(float x, float y, float z, float w) {
|
|
598
|
+
return m20 * x + m21 * y + m22 * z + m23 * w;
|
|
599
|
+
}
|
|
755
600
|
|
|
601
|
+
/**
|
|
602
|
+
* Returns the w-coordinate of the result of multiplying the vector (x, y,
|
|
603
|
+
* z, w) by this matrix.
|
|
604
|
+
*/
|
|
605
|
+
public float multW(float x, float y, float z, float w) {
|
|
606
|
+
return m30 * x + m31 * y + m32 * z + m33 * w;
|
|
607
|
+
}
|
|
756
608
|
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
609
|
+
/**
|
|
610
|
+
* Transpose this matrix; rows become columns and columns rows.
|
|
611
|
+
*/
|
|
612
|
+
public void transpose() {
|
|
613
|
+
float temp;
|
|
614
|
+
temp = m01;
|
|
615
|
+
m01 = m10;
|
|
616
|
+
m10 = temp;
|
|
617
|
+
temp = m02;
|
|
618
|
+
m02 = m20;
|
|
619
|
+
m20 = temp;
|
|
620
|
+
temp = m03;
|
|
621
|
+
m03 = m30;
|
|
622
|
+
m30 = temp;
|
|
623
|
+
temp = m12;
|
|
624
|
+
m12 = m21;
|
|
625
|
+
m21 = temp;
|
|
626
|
+
temp = m13;
|
|
627
|
+
m13 = m31;
|
|
628
|
+
m31 = temp;
|
|
629
|
+
temp = m23;
|
|
630
|
+
m23 = m32;
|
|
631
|
+
m32 = temp;
|
|
632
|
+
}
|
|
762
633
|
|
|
634
|
+
/**
|
|
635
|
+
* Invert this matrix. Will not necessarily succeed, because some matrices
|
|
636
|
+
* map more than one point to the same image point, and so are irreversible.
|
|
637
|
+
*
|
|
638
|
+
* @return true if successful
|
|
639
|
+
*/
|
|
640
|
+
public boolean invert() {
|
|
641
|
+
float determinant = determinant();
|
|
642
|
+
if (determinant == 0) {
|
|
643
|
+
return false;
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
// first row
|
|
647
|
+
float t00 = determinant3x3(m11, m12, m13, m21, m22, m23, m31, m32, m33);
|
|
648
|
+
float t01 = -determinant3x3(m10, m12, m13, m20, m22, m23, m30, m32, m33);
|
|
649
|
+
float t02 = determinant3x3(m10, m11, m13, m20, m21, m23, m30, m31, m33);
|
|
650
|
+
float t03 = -determinant3x3(m10, m11, m12, m20, m21, m22, m30, m31, m32);
|
|
651
|
+
|
|
652
|
+
// second row
|
|
653
|
+
float t10 = -determinant3x3(m01, m02, m03, m21, m22, m23, m31, m32, m33);
|
|
654
|
+
float t11 = determinant3x3(m00, m02, m03, m20, m22, m23, m30, m32, m33);
|
|
655
|
+
float t12 = -determinant3x3(m00, m01, m03, m20, m21, m23, m30, m31, m33);
|
|
656
|
+
float t13 = determinant3x3(m00, m01, m02, m20, m21, m22, m30, m31, m32);
|
|
657
|
+
|
|
658
|
+
// third row
|
|
659
|
+
float t20 = determinant3x3(m01, m02, m03, m11, m12, m13, m31, m32, m33);
|
|
660
|
+
float t21 = -determinant3x3(m00, m02, m03, m10, m12, m13, m30, m32, m33);
|
|
661
|
+
float t22 = determinant3x3(m00, m01, m03, m10, m11, m13, m30, m31, m33);
|
|
662
|
+
float t23 = -determinant3x3(m00, m01, m02, m10, m11, m12, m30, m31, m32);
|
|
663
|
+
|
|
664
|
+
// fourth row
|
|
665
|
+
float t30 = -determinant3x3(m01, m02, m03, m11, m12, m13, m21, m22, m23);
|
|
666
|
+
float t31 = determinant3x3(m00, m02, m03, m10, m12, m13, m20, m22, m23);
|
|
667
|
+
float t32 = -determinant3x3(m00, m01, m03, m10, m11, m13, m20, m21, m23);
|
|
668
|
+
float t33 = determinant3x3(m00, m01, m02, m10, m11, m12, m20, m21, m22);
|
|
669
|
+
|
|
670
|
+
// transpose and divide by the determinant
|
|
671
|
+
m00 = t00 / determinant;
|
|
672
|
+
m01 = t10 / determinant;
|
|
673
|
+
m02 = t20 / determinant;
|
|
674
|
+
m03 = t30 / determinant;
|
|
675
|
+
|
|
676
|
+
m10 = t01 / determinant;
|
|
677
|
+
m11 = t11 / determinant;
|
|
678
|
+
m12 = t21 / determinant;
|
|
679
|
+
m13 = t31 / determinant;
|
|
680
|
+
|
|
681
|
+
m20 = t02 / determinant;
|
|
682
|
+
m21 = t12 / determinant;
|
|
683
|
+
m22 = t22 / determinant;
|
|
684
|
+
m23 = t32 / determinant;
|
|
685
|
+
|
|
686
|
+
m30 = t03 / determinant;
|
|
687
|
+
m31 = t13 / determinant;
|
|
688
|
+
m32 = t23 / determinant;
|
|
689
|
+
m33 = t33 / determinant;
|
|
690
|
+
|
|
691
|
+
return true;
|
|
692
|
+
}
|
|
763
693
|
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
694
|
+
/**
|
|
695
|
+
* Calculate the determinant of a 3x3 matrix.
|
|
696
|
+
*
|
|
697
|
+
* @return result
|
|
698
|
+
*/
|
|
699
|
+
private float determinant3x3(float t00, float t01, float t02,
|
|
700
|
+
float t10, float t11, float t12,
|
|
701
|
+
float t20, float t21, float t22) {
|
|
702
|
+
return (t00 * (t11 * t22 - t12 * t21)
|
|
703
|
+
+ t01 * (t12 * t20 - t10 * t22)
|
|
704
|
+
+ t02 * (t10 * t21 - t11 * t20));
|
|
705
|
+
}
|
|
769
706
|
|
|
707
|
+
/**
|
|
708
|
+
* @return the determinant of the matrix
|
|
709
|
+
*/
|
|
710
|
+
public float determinant() {
|
|
711
|
+
float f
|
|
712
|
+
= m00
|
|
713
|
+
* ((m11 * m22 * m33 + m12 * m23 * m31 + m13 * m21 * m32)
|
|
714
|
+
- m13 * m22 * m31
|
|
715
|
+
- m11 * m23 * m32
|
|
716
|
+
- m12 * m21 * m33);
|
|
717
|
+
f -= m01
|
|
718
|
+
* ((m10 * m22 * m33 + m12 * m23 * m30 + m13 * m20 * m32)
|
|
719
|
+
- m13 * m22 * m30
|
|
720
|
+
- m10 * m23 * m32
|
|
721
|
+
- m12 * m20 * m33);
|
|
722
|
+
f += m02
|
|
723
|
+
* ((m10 * m21 * m33 + m11 * m23 * m30 + m13 * m20 * m31)
|
|
724
|
+
- m13 * m21 * m30
|
|
725
|
+
- m10 * m23 * m31
|
|
726
|
+
- m11 * m20 * m33);
|
|
727
|
+
f -= m03
|
|
728
|
+
* ((m10 * m21 * m32 + m11 * m22 * m30 + m12 * m20 * m31)
|
|
729
|
+
- m12 * m21 * m30
|
|
730
|
+
- m10 * m22 * m31
|
|
731
|
+
- m11 * m20 * m32);
|
|
732
|
+
return f;
|
|
733
|
+
}
|
|
770
734
|
|
|
771
|
-
|
|
772
|
-
//
|
|
735
|
+
//////////////////////////////////////////////////////////////
|
|
736
|
+
// REVERSE VERSIONS OF MATRIX OPERATIONS
|
|
737
|
+
// These functions should not be used, as they will be removed in the future.
|
|
738
|
+
protected void invTranslate(float tx, float ty, float tz) {
|
|
739
|
+
preApply(1, 0, 0, -tx,
|
|
740
|
+
0, 1, 0, -ty,
|
|
741
|
+
0, 0, 1, -tz,
|
|
742
|
+
0, 0, 0, 1);
|
|
743
|
+
}
|
|
773
744
|
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
745
|
+
protected void invRotateX(float angle) {
|
|
746
|
+
float c = cos(-angle);
|
|
747
|
+
float s = sin(-angle);
|
|
748
|
+
preApply(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
|
|
749
|
+
}
|
|
777
750
|
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
751
|
+
protected void invRotateY(float angle) {
|
|
752
|
+
float c = cos(-angle);
|
|
753
|
+
float s = sin(-angle);
|
|
754
|
+
preApply(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
|
|
755
|
+
}
|
|
783
756
|
|
|
757
|
+
protected void invRotateZ(float angle) {
|
|
758
|
+
float c = cos(-angle);
|
|
759
|
+
float s = sin(-angle);
|
|
760
|
+
preApply(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
|
|
761
|
+
}
|
|
784
762
|
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
}
|
|
763
|
+
protected void invRotate(float angle, float v0, float v1, float v2) {
|
|
764
|
+
//TODO should make sure this vector is normalized
|
|
788
765
|
|
|
766
|
+
float c = cos(-angle);
|
|
767
|
+
float s = sin(-angle);
|
|
768
|
+
float t = 1.0f - c;
|
|
789
769
|
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
if (inverseCopy == null) {
|
|
795
|
-
inverseCopy = new PMatrix3D();
|
|
770
|
+
preApply((t * v0 * v0) + c, (t * v0 * v1) - (s * v2), (t * v0 * v2) + (s * v1), 0,
|
|
771
|
+
(t * v0 * v1) + (s * v2), (t * v1 * v1) + c, (t * v1 * v2) - (s * v0), 0,
|
|
772
|
+
(t * v0 * v2) - (s * v1), (t * v1 * v2) + (s * v0), (t * v2 * v2) + c, 0,
|
|
773
|
+
0, 0, 0, 1);
|
|
796
774
|
}
|
|
797
|
-
inverseCopy.set(n00, n01, n02, n03,
|
|
798
|
-
n10, n11, n12, n13,
|
|
799
|
-
n20, n21, n22, n23,
|
|
800
|
-
n30, n31, n32, n33);
|
|
801
|
-
if (!inverseCopy.invert()) {
|
|
802
|
-
return false;
|
|
803
|
-
}
|
|
804
|
-
preApply(inverseCopy);
|
|
805
|
-
return true;
|
|
806
|
-
}
|
|
807
|
-
|
|
808
775
|
|
|
809
|
-
|
|
776
|
+
protected void invScale(float x, float y, float z) {
|
|
777
|
+
preApply(1 / x, 0, 0, 0, 0, 1 / y, 0, 0, 0, 0, 1 / z, 0, 0, 0, 0, 1);
|
|
778
|
+
}
|
|
810
779
|
|
|
780
|
+
protected boolean invApply(float n00, float n01, float n02, float n03,
|
|
781
|
+
float n10, float n11, float n12, float n13,
|
|
782
|
+
float n20, float n21, float n22, float n23,
|
|
783
|
+
float n30, float n31, float n32, float n33) {
|
|
784
|
+
if (inverseCopy == null) {
|
|
785
|
+
inverseCopy = new PMatrix3D();
|
|
786
|
+
}
|
|
787
|
+
inverseCopy.set(n00, n01, n02, n03,
|
|
788
|
+
n10, n11, n12, n13,
|
|
789
|
+
n20, n21, n22, n23,
|
|
790
|
+
n30, n31, n32, n33);
|
|
791
|
+
if (!inverseCopy.invert()) {
|
|
792
|
+
return false;
|
|
793
|
+
}
|
|
794
|
+
preApply(inverseCopy);
|
|
795
|
+
return true;
|
|
796
|
+
}
|
|
811
797
|
|
|
812
|
-
|
|
813
|
-
|
|
798
|
+
//////////////////////////////////////////////////////////////
|
|
799
|
+
public void print() {
|
|
800
|
+
/*
|
|
814
801
|
System.out.println(m00 + " " + m01 + " " + m02 + " " + m03 + "\n" +
|
|
815
802
|
m10 + " " + m11 + " " + m12 + " " + m13 + "\n" +
|
|
816
803
|
m20 + " " + m21 + " " + m22 + " " + m23 + "\n" +
|
|
817
804
|
m30 + " " + m31 + " " + m32 + " " + m33 + "\n");
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
//////////////////////////////////////////////////////////////
|
|
860
|
-
|
|
805
|
+
*/
|
|
806
|
+
int big = (int) Math.abs(max(max(max(max(abs(m00), abs(m01)),
|
|
807
|
+
max(abs(m02), abs(m03))),
|
|
808
|
+
max(max(abs(m10), abs(m11)),
|
|
809
|
+
max(abs(m12), abs(m13)))),
|
|
810
|
+
max(max(max(abs(m20), abs(m21)),
|
|
811
|
+
max(abs(m22), abs(m23))),
|
|
812
|
+
max(max(abs(m30), abs(m31)),
|
|
813
|
+
max(abs(m32), abs(m33))))));
|
|
814
|
+
|
|
815
|
+
int digits = 1;
|
|
816
|
+
if (Float.isNaN(big) || Float.isInfinite(big)) { // avoid infinite loop
|
|
817
|
+
digits = 5;
|
|
818
|
+
} else {
|
|
819
|
+
while ((big /= 10) != 0) {
|
|
820
|
+
digits++; // cheap log()
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
System.out.println(PApplet.nfs(m00, digits, 4) + " "
|
|
825
|
+
+ PApplet.nfs(m01, digits, 4) + " "
|
|
826
|
+
+ PApplet.nfs(m02, digits, 4) + " "
|
|
827
|
+
+ PApplet.nfs(m03, digits, 4));
|
|
828
|
+
|
|
829
|
+
System.out.println(PApplet.nfs(m10, digits, 4) + " "
|
|
830
|
+
+ PApplet.nfs(m11, digits, 4) + " "
|
|
831
|
+
+ PApplet.nfs(m12, digits, 4) + " "
|
|
832
|
+
+ PApplet.nfs(m13, digits, 4));
|
|
833
|
+
|
|
834
|
+
System.out.println(PApplet.nfs(m20, digits, 4) + " "
|
|
835
|
+
+ PApplet.nfs(m21, digits, 4) + " "
|
|
836
|
+
+ PApplet.nfs(m22, digits, 4) + " "
|
|
837
|
+
+ PApplet.nfs(m23, digits, 4));
|
|
838
|
+
|
|
839
|
+
System.out.println(PApplet.nfs(m30, digits, 4) + " "
|
|
840
|
+
+ PApplet.nfs(m31, digits, 4) + " "
|
|
841
|
+
+ PApplet.nfs(m32, digits, 4) + " "
|
|
842
|
+
+ PApplet.nfs(m33, digits, 4));
|
|
843
|
+
|
|
844
|
+
System.out.println();
|
|
845
|
+
}
|
|
861
846
|
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
847
|
+
//////////////////////////////////////////////////////////////
|
|
848
|
+
static private final float max(float a, float b) {
|
|
849
|
+
return (a > b) ? a : b;
|
|
850
|
+
}
|
|
865
851
|
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
852
|
+
static private final float abs(float a) {
|
|
853
|
+
return (a < 0) ? -a : a;
|
|
854
|
+
}
|
|
869
855
|
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
856
|
+
static private final float sin(float angle) {
|
|
857
|
+
return (float) Math.sin(angle);
|
|
858
|
+
}
|
|
873
859
|
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
860
|
+
static private final float cos(float angle) {
|
|
861
|
+
return (float) Math.cos(angle);
|
|
862
|
+
}
|
|
877
863
|
}
|