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