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.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  3. data/CHANGELOG.md +1 -5
  4. data/README.md +23 -12
  5. data/Rakefile +23 -12
  6. data/lib/propane/helpers/version_error.rb +6 -0
  7. data/lib/propane/runner.rb +12 -0
  8. data/lib/propane/version.rb +1 -1
  9. data/library/slider/slider.rb +1 -1
  10. data/mvnw +234 -0
  11. data/mvnw.cmd +145 -0
  12. data/pom.xml +28 -27
  13. data/propane.gemspec +2 -2
  14. data/src/main/java/japplemenubar/JAppleMenuBar.java +41 -47
  15. data/src/main/java/monkstone/ColorUtil.java +1 -1
  16. data/src/main/java/monkstone/MathToolModule.java +12 -11
  17. data/src/main/java/monkstone/PropaneLibrary.java +9 -10
  18. data/src/main/java/monkstone/core/LibraryProxy.java +124 -113
  19. data/src/main/java/monkstone/fastmath/Deglut.java +86 -89
  20. data/src/main/java/monkstone/filechooser/Chooser.java +7 -13
  21. data/src/main/java/monkstone/noise/SimplexNoise.java +0 -1
  22. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +4 -4
  23. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  24. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +9 -9
  25. data/src/main/java/monkstone/slider/SimpleSlider.java +0 -9
  26. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +11 -13
  27. data/src/main/java/monkstone/slider/Slider.java +1 -1
  28. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  29. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  30. data/src/main/java/monkstone/slider/WheelHandler.java +8 -9
  31. data/src/main/java/monkstone/vecmath/AppRender.java +2 -2
  32. data/src/main/java/monkstone/vecmath/ShapeRender.java +2 -2
  33. data/src/main/java/monkstone/vecmath/package-info.java +2 -2
  34. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
  35. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
  36. data/src/main/java/monkstone/videoevent/VideoInterface.java +11 -5
  37. data/src/main/java/monkstone/videoevent/package-info.java +2 -2
  38. data/src/main/java/processing/awt/PGraphicsJava2D.java +1742 -2243
  39. data/src/main/java/processing/awt/PShapeJava2D.java +268 -270
  40. data/src/main/java/processing/awt/PSurfaceAWT.java +821 -920
  41. data/src/main/java/processing/core/DesktopHandler.java +94 -0
  42. data/src/main/java/processing/core/PApplet.java +14170 -14082
  43. data/src/main/java/processing/core/PConstants.java +447 -473
  44. data/src/main/java/processing/core/PFont.java +867 -873
  45. data/src/main/java/processing/core/PGraphics.java +7193 -7428
  46. data/src/main/java/processing/core/PImage.java +3051 -3117
  47. data/src/main/java/processing/core/PMatrix.java +159 -172
  48. data/src/main/java/processing/core/PMatrix2D.java +403 -444
  49. data/src/main/java/processing/core/PMatrix3D.java +735 -749
  50. data/src/main/java/processing/core/PShape.java +2651 -2793
  51. data/src/main/java/processing/core/PShapeOBJ.java +415 -422
  52. data/src/main/java/processing/core/PShapeSVG.java +1466 -1475
  53. data/src/main/java/processing/core/PStyle.java +37 -40
  54. data/src/main/java/processing/core/PSurface.java +98 -103
  55. data/src/main/java/processing/core/PSurfaceNone.java +208 -236
  56. data/src/main/java/processing/core/PVector.java +961 -990
  57. data/src/main/java/processing/data/DoubleDict.java +709 -753
  58. data/src/main/java/processing/data/DoubleList.java +695 -748
  59. data/src/main/java/processing/data/FloatDict.java +702 -746
  60. data/src/main/java/processing/data/FloatList.java +697 -751
  61. data/src/main/java/processing/data/IntDict.java +673 -718
  62. data/src/main/java/processing/data/IntList.java +633 -699
  63. data/src/main/java/processing/data/JSONArray.java +873 -931
  64. data/src/main/java/processing/data/JSONObject.java +1165 -1262
  65. data/src/main/java/processing/data/JSONTokener.java +341 -351
  66. data/src/main/java/processing/data/LongDict.java +662 -707
  67. data/src/main/java/processing/data/LongList.java +634 -700
  68. data/src/main/java/processing/data/Sort.java +41 -37
  69. data/src/main/java/processing/data/StringDict.java +486 -522
  70. data/src/main/java/processing/data/StringList.java +580 -624
  71. data/src/main/java/processing/data/Table.java +3508 -3686
  72. data/src/main/java/processing/data/TableRow.java +183 -182
  73. data/src/main/java/processing/data/XML.java +883 -957
  74. data/src/main/java/processing/event/Event.java +66 -87
  75. data/src/main/java/processing/event/KeyEvent.java +41 -48
  76. data/src/main/java/processing/event/MouseEvent.java +93 -103
  77. data/src/main/java/processing/event/TouchEvent.java +6 -10
  78. data/src/main/java/processing/javafx/PGraphicsFX2D.java +5 -69
  79. data/src/main/java/processing/javafx/PSurfaceFX.java +2 -7
  80. data/src/main/java/processing/opengl/FontTexture.java +270 -290
  81. data/src/main/java/processing/opengl/FrameBuffer.java +363 -375
  82. data/src/main/java/processing/opengl/LinePath.java +500 -543
  83. data/src/main/java/processing/opengl/LineStroker.java +582 -593
  84. data/src/main/java/processing/opengl/PGL.java +2881 -2904
  85. data/src/main/java/processing/opengl/PGraphics2D.java +315 -408
  86. data/src/main/java/processing/opengl/PGraphics3D.java +72 -107
  87. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12043 -12230
  88. data/src/main/java/processing/opengl/PJOGL.java +1681 -1745
  89. data/src/main/java/processing/opengl/PShader.java +1257 -1260
  90. data/src/main/java/processing/opengl/PShapeOpenGL.java +4599 -4662
  91. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1030 -1047
  92. data/src/main/java/processing/opengl/Texture.java +1397 -1462
  93. data/src/main/java/processing/opengl/VertexBuffer.java +55 -57
  94. data/src/main/resources/icon/icon-1024.png +0 -0
  95. data/src/main/resources/icon/icon-128.png +0 -0
  96. data/src/main/resources/icon/icon-16.png +0 -0
  97. data/src/main/resources/icon/icon-256.png +0 -0
  98. data/src/main/resources/icon/icon-32.png +0 -0
  99. data/src/main/resources/icon/icon-48.png +0 -0
  100. data/src/main/resources/icon/icon-512.png +0 -0
  101. data/src/main/resources/icon/icon-64.png +0 -0
  102. data/vendors/Rakefile +1 -1
  103. metadata +12 -8
  104. 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
- * 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()}.
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
- * (x', y', z', w') is returned. The values in the matrix determine the
37
- * transformation. They are modified by the various transformation functions.
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
- * setting the bottom row of the matrix to <code>[0 0 0 1]</code>. The
41
- * resulting point is then (x', y', z').
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
- 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;
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
- public PMatrix3D() {
56
- reset();
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
- 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
-
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
- 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);
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
- } else if (source.length == 16) {
158
- m00 = source[0];
159
- m01 = source[1];
160
- m02 = source[2];
161
- m03 = source[3];
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
- m10 = source[4];
164
- m11 = source[5];
165
- m12 = source[6];
166
- m13 = source[7];
70
+ public PMatrix3D(PMatrix matrix) {
71
+ set(matrix);
72
+ }
167
73
 
168
- m20 = source[8];
169
- m21 = source[9];
170
- m22 = source[10];
171
- m23 = source[11];
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
- m30 = source[12];
174
- m31 = source[13];
175
- m32 = source[14];
176
- m33 = source[15];
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
- public void set(float m00, float m01, float m02,
182
- float m10, float m11, float m12) {
183
- set(m00, m01, 0, m02,
184
- m10, m11, 0, m12,
185
- 0, 0, 1, 0,
186
- 0, 0, 0, 1);
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
- public void set(float m00, float m01, float m02, float m03,
191
- float m10, float m11, float m12, float m13,
192
- float m20, float m21, float m22, float m23,
193
- float m30, float m31, float m32, float m33) {
194
- this.m00 = m00; this.m01 = m01; this.m02 = m02; this.m03 = m03;
195
- this.m10 = m10; this.m11 = m11; this.m12 = m12; this.m13 = m13;
196
- this.m20 = m20; this.m21 = m21; this.m22 = m22; this.m23 = m23;
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
- public void translate(float tx, float ty) {
202
- translate(tx, ty, 0);
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
- public void translate(float tx, float ty, float tz) {
211
- m03 += tx*m00 + ty*m01 + tz*m02;
212
- m13 += tx*m10 + ty*m11 + tz*m12;
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
- if (Math.abs(norm2 - 1) > PConstants.EPSILON) {
252
- // The rotation vector is not normalized.
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
- float c = cos(angle);
260
- float s = sin(angle);
261
- float t = 1.0f - c;
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
- public void apply(float n00, float n01, float n02, float n03,
344
- float n10, float n11, float n12, float n13,
345
- float n20, float n21, float n22, float n23,
346
- float n30, float n31, float n32, float n33) {
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 r30 = m30*n00 + m31*n10 + m32*n20 + m33*n30;
364
- float r31 = m30*n01 + m31*n11 + m32*n21 + m33*n31;
365
- float r32 = m30*n02 + m31*n12 + m32*n22 + m33*n32;
366
- float r33 = m30*n03 + m31*n13 + m32*n23 + m33*n33;
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
- m00 = r00; m01 = r01; m02 = r02; m03 = r03;
369
- m10 = r10; m11 = r11; m12 = r12; m13 = r13;
370
- m20 = r20; m21 = r21; m22 = r22; m23 = r23;
371
- m30 = r30; m31 = r31; m32 = r32; m33 = r33;
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
- * Apply the 3D equivalent of the 2D matrix supplied to the left of this one.
377
- */
378
- public void preApply(PMatrix2D left) {
379
- preApply(left.m00, left.m01, 0, left.m02,
380
- left.m10, left.m11, 0, left.m12,
381
- 0, 0, 1, 0,
382
- 0, 0, 0, 1);
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
- * Apply another matrix to the left of this one.
388
- */
389
- public void preApply(PMatrix source) {
390
- if (source instanceof PMatrix2D) {
391
- preApply((PMatrix2D) source);
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
- * Apply another matrix to the left of this one.
400
- */
401
- public void preApply(PMatrix3D left) {
402
- preApply(left.m00, left.m01, left.m02, left.m03,
403
- left.m10, left.m11, left.m12, left.m13,
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
- * Apply the 3D equivalent of the 2D matrix supplied to the left of this one.
411
- */
412
- public void preApply(float n00, float n01, float n02,
413
- float n10, float n11, float n12) {
414
- preApply(n00, n01, 0, n02,
415
- n10, n11, 0, n12,
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
- * Apply another matrix to the left of this one.
423
- */
424
- public void preApply(float n00, float n01, float n02, float n03,
425
- float n10, float n11, float n12, float n13,
426
- float n20, float n21, float n22, float n23,
427
- float n30, float n31, float n32, float n33) {
428
-
429
- float r00 = n00*m00 + n01*m10 + n02*m20 + n03*m30;
430
- float r01 = n00*m01 + n01*m11 + n02*m21 + n03*m31;
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
- * Multiply source by this matrix, and return the result.
461
- * The result will be stored in target if target is non-null, and target
462
- * will then be the matrix returned. This improves performance if you reuse
463
- * target, so it's recommended if you call this many times in draw().
464
- */
465
- public PVector mult(PVector source, PVector target) {
466
- if (target == null) {
467
- target = new PVector();
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
- target.set(m00*source.x + m01*source.y + m02*source.z + m03,
470
- m10*source.x + m11*source.y + m12*source.z + m13,
471
- m20*source.x + m21*source.y + m22*source.z + m23);
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
- return target;
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
- * Multiply a three or four element vector against this matrix. If out is
499
- * null or not length 3 or 4, a new float array (length 3) will be returned.
500
- * Supplying and recycling a target array improves performance, so it's
501
- * recommended if you call this many times in draw.
502
- */
503
- public float[] mult(float[] source, float[] target) {
504
- if (target == null || target.length < 3) {
505
- target = new float[3];
506
- }
507
- if (source == target) {
508
- throw new RuntimeException("The source and target vectors used in " +
509
- "PMatrix3D.mult() cannot be identical.");
510
- }
511
- if (target.length == 3) {
512
- target[0] = m00*source[0] + m01*source[1] + m02*source[2] + m03;
513
- target[1] = m10*source[0] + m11*source[1] + m12*source[2] + m13;
514
- target[2] = m20*source[0] + m21*source[1] + m22*source[2] + m23;
515
- //float w = m30*source[0] + m31*source[1] + m32*source[2] + m33;
516
- //if (w != 0 && w != 1) {
517
- // target[0] /= w; target[1] /= w; target[2] /= w;
518
- //}
519
- } else if (target.length > 3) {
520
- target[0] = m00*source[0] + m01*source[1] + m02*source[2] + m03*source[3];
521
- target[1] = m10*source[0] + m11*source[1] + m12*source[2] + m13*source[3];
522
- target[2] = m20*source[0] + m21*source[1] + m22*source[2] + m23*source[3];
523
- target[3] = m30*source[0] + m31*source[1] + m32*source[2] + m33*source[3];
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
- * Returns the x-coordinate of the result of multiplying the point (x, y, z)
549
- * by this matrix.
550
- */
551
- public float multX(float x, float y, float z) {
552
- return m00*x + m01*y + m02*z + m03;
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
- // REVERSE VERSIONS OF MATRIX OPERATIONS
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
- // These functions should not be used, as they will be removed in the future.
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
- protected void invTranslate(float tx, float ty, float tz) {
743
- preApply(1, 0, 0, -tx,
744
- 0, 1, 0, -ty,
745
- 0, 0, 1, -tz,
746
- 0, 0, 0, 1);
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
- protected void invRotateX(float angle) {
751
- float c = cos(-angle);
752
- float s = sin(-angle);
753
- preApply(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
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
- protected void invRotateY(float angle) {
758
- float c = cos(-angle);
759
- float s = sin(-angle);
760
- preApply(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
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
- protected void invRotateZ(float angle) {
765
- float c = cos(-angle);
766
- float s = sin(-angle);
767
- preApply(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
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
- protected void invRotate(float angle, float v0, float v1, float v2) {
772
- //TODO should make sure this vector is normalized
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
- float c = cos(-angle);
775
- float s = sin(-angle);
776
- float t = 1.0f - c;
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
- preApply((t*v0*v0) + c, (t*v0*v1) - (s*v2), (t*v0*v2) + (s*v1), 0,
779
- (t*v0*v1) + (s*v2), (t*v1*v1) + c, (t*v1*v2) - (s*v0), 0,
780
- (t*v0*v2) - (s*v1), (t*v1*v2) + (s*v0), (t*v2*v2) + c, 0,
781
- 0, 0, 0, 1);
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
- protected void invScale(float x, float y, float z) {
786
- preApply(1/x, 0, 0, 0, 0, 1/y, 0, 0, 0, 0, 1/z, 0, 0, 0, 0, 1);
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
- protected boolean invApply(float n00, float n01, float n02, float n03,
791
- float n10, float n11, float n12, float n13,
792
- float n20, float n21, float n22, float n23,
793
- float n30, float n31, float n32, float n33) {
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
- public void print() {
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
- int big = (int) Math.abs(max(max(max(max(abs(m00), abs(m01)),
820
- max(abs(m02), abs(m03))),
821
- max(max(abs(m10), abs(m11)),
822
- max(abs(m12), abs(m13)))),
823
- max(max(max(abs(m20), abs(m21)),
824
- max(abs(m22), abs(m23))),
825
- max(max(abs(m30), abs(m31)),
826
- max(abs(m32), abs(m33))))));
827
-
828
- int digits = 1;
829
- if (Float.isNaN(big) || Float.isInfinite(big)) { // avoid infinite loop
830
- digits = 5;
831
- } else {
832
- while ((big /= 10) != 0) digits++; // cheap log()
833
- }
834
-
835
- System.out.println(PApplet.nfs(m00, digits, 4) + " " +
836
- PApplet.nfs(m01, digits, 4) + " " +
837
- PApplet.nfs(m02, digits, 4) + " " +
838
- PApplet.nfs(m03, digits, 4));
839
-
840
- System.out.println(PApplet.nfs(m10, digits, 4) + " " +
841
- PApplet.nfs(m11, digits, 4) + " " +
842
- PApplet.nfs(m12, digits, 4) + " " +
843
- PApplet.nfs(m13, digits, 4));
844
-
845
- System.out.println(PApplet.nfs(m20, digits, 4) + " " +
846
- PApplet.nfs(m21, digits, 4) + " " +
847
- PApplet.nfs(m22, digits, 4) + " " +
848
- PApplet.nfs(m23, digits, 4));
849
-
850
- System.out.println(PApplet.nfs(m30, digits, 4) + " " +
851
- PApplet.nfs(m31, digits, 4) + " " +
852
- PApplet.nfs(m32, digits, 4) + " " +
853
- PApplet.nfs(m33, digits, 4));
854
-
855
- System.out.println();
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
- static private final float max(float a, float b) {
863
- return (a > b) ? a : b;
864
- }
847
+ //////////////////////////////////////////////////////////////
848
+ static private final float max(float a, float b) {
849
+ return (a > b) ? a : b;
850
+ }
865
851
 
866
- static private final float abs(float a) {
867
- return (a < 0) ? -a : a;
868
- }
852
+ static private final float abs(float a) {
853
+ return (a < 0) ? -a : a;
854
+ }
869
855
 
870
- static private final float sin(float angle) {
871
- return (float) Math.sin(angle);
872
- }
856
+ static private final float sin(float angle) {
857
+ return (float) Math.sin(angle);
858
+ }
873
859
 
874
- static private final float cos(float angle) {
875
- return (float) Math.cos(angle);
876
- }
860
+ static private final float cos(float angle) {
861
+ return (float) Math.cos(angle);
862
+ }
877
863
  }