propane 3.10.0-java → 3.11.0-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/wrapper/maven-wrapper.properties +1 -1
  3. data/CHANGELOG.md +2 -0
  4. data/README.md +7 -7
  5. data/lib/propane/app.rb +2 -5
  6. data/lib/propane/helper_methods.rb +6 -6
  7. data/lib/propane/version.rb +1 -1
  8. data/lib/{propane-3.10.0.jar → propane-3.11.0.jar} +0 -0
  9. data/pom.rb +6 -6
  10. data/pom.xml +6 -6
  11. data/propane.gemspec +3 -3
  12. data/src/main/java/monkstone/noise/OpenSimplex2F.java +838 -737
  13. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +8 -13
  14. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +14 -28
  15. data/src/main/java/processing/awt/PImageAWT.java +6 -4
  16. data/src/main/java/processing/core/PApplet.java +71 -59
  17. data/src/main/java/processing/core/PImage.java +14 -14
  18. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +13 -13
  19. data/src/main/java/processing/opengl/PShader.java +1 -6
  20. data/src/main/java/processing/opengl/PSurfaceJOGL.java +6 -6
  21. data/{lib/java/processing/opengl → src/main/resources}/cursors/arrow.png +0 -0
  22. data/{lib/java/processing/opengl → src/main/resources}/cursors/cross.png +0 -0
  23. data/{lib/java/processing/opengl → src/main/resources}/cursors/hand.png +0 -0
  24. data/{lib/java/processing/opengl → src/main/resources}/cursors/license.txt +0 -0
  25. data/{lib/java/processing/opengl → src/main/resources}/cursors/move.png +0 -0
  26. data/{lib/java/processing/opengl → src/main/resources}/cursors/text.png +0 -0
  27. data/{lib/java/processing/opengl → src/main/resources}/cursors/wait.png +0 -0
  28. data/{lib/java/processing/opengl → src/main/resources}/shaders/ColorFrag.glsl +0 -0
  29. data/{lib/java/processing/opengl → src/main/resources}/shaders/ColorVert.glsl +0 -0
  30. data/{lib/java/processing/opengl → src/main/resources}/shaders/LightFrag.glsl +0 -0
  31. data/{lib/java/processing/opengl → src/main/resources}/shaders/LightVert.glsl +0 -0
  32. data/{lib/java/processing/opengl → src/main/resources}/shaders/LineFrag.glsl +0 -0
  33. data/{lib/java/processing/opengl → src/main/resources}/shaders/LineVert.glsl +0 -0
  34. data/{lib/java/processing/opengl → src/main/resources}/shaders/MaskFrag.glsl +0 -0
  35. data/{lib/java/processing/opengl → src/main/resources}/shaders/PointFrag.glsl +0 -0
  36. data/{lib/java/processing/opengl → src/main/resources}/shaders/PointVert.glsl +0 -0
  37. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexFrag.glsl +0 -0
  38. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexLightFrag.glsl +0 -0
  39. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexLightVert.glsl +0 -0
  40. data/{lib/java/processing/opengl → src/main/resources}/shaders/TexVert.glsl +0 -0
  41. data/test/test_helper.rb +1 -0
  42. data/vendors/Rakefile +1 -1
  43. metadata +29 -155
  44. data/lib/java/japplemenubar/JAppleMenuBar.java +0 -88
  45. data/lib/java/japplemenubar/libjAppleMenuBar.jnilib +0 -0
  46. data/lib/java/monkstone/ColorUtil.java +0 -127
  47. data/lib/java/monkstone/MathToolModule.java +0 -287
  48. data/lib/java/monkstone/PropaneLibrary.java +0 -46
  49. data/lib/java/monkstone/core/LibraryProxy.java +0 -136
  50. data/lib/java/monkstone/fastmath/DegLutTables.java +0 -111
  51. data/lib/java/monkstone/fastmath/Deglut.java +0 -71
  52. data/lib/java/monkstone/fastmath/package-info.java +0 -6
  53. data/lib/java/monkstone/filechooser/Chooser.java +0 -39
  54. data/lib/java/monkstone/noise/FastTerrain.java +0 -874
  55. data/lib/java/monkstone/noise/Noise.java +0 -90
  56. data/lib/java/monkstone/noise/NoiseGenerator.java +0 -75
  57. data/lib/java/monkstone/noise/NoiseMode.java +0 -28
  58. data/lib/java/monkstone/noise/OpenSimplex2F.java +0 -881
  59. data/lib/java/monkstone/noise/OpenSimplex2S.java +0 -1106
  60. data/lib/java/monkstone/noise/SmoothTerrain.java +0 -1099
  61. data/lib/java/monkstone/slider/CustomHorizontalSlider.java +0 -164
  62. data/lib/java/monkstone/slider/CustomVerticalSlider.java +0 -178
  63. data/lib/java/monkstone/slider/SimpleHorizontalSlider.java +0 -145
  64. data/lib/java/monkstone/slider/SimpleSlider.java +0 -166
  65. data/lib/java/monkstone/slider/SimpleVerticalSlider.java +0 -157
  66. data/lib/java/monkstone/slider/Slider.java +0 -61
  67. data/lib/java/monkstone/slider/SliderBar.java +0 -245
  68. data/lib/java/monkstone/slider/SliderGroup.java +0 -56
  69. data/lib/java/monkstone/slider/WheelHandler.java +0 -35
  70. data/lib/java/monkstone/vecmath/GfxRender.java +0 -86
  71. data/lib/java/monkstone/vecmath/JRender.java +0 -56
  72. data/lib/java/monkstone/vecmath/ShapeRender.java +0 -87
  73. data/lib/java/monkstone/vecmath/package-info.java +0 -20
  74. data/lib/java/monkstone/vecmath/vec2/Vec2.java +0 -802
  75. data/lib/java/monkstone/vecmath/vec2/package-info.java +0 -6
  76. data/lib/java/monkstone/vecmath/vec3/Vec3.java +0 -727
  77. data/lib/java/monkstone/vecmath/vec3/package-info.java +0 -6
  78. data/lib/java/monkstone/videoevent/CaptureEvent.java +0 -27
  79. data/lib/java/monkstone/videoevent/MovieEvent.java +0 -32
  80. data/lib/java/monkstone/videoevent/package-info.java +0 -20
  81. data/lib/java/processing/awt/PGraphicsJava2D.java +0 -3040
  82. data/lib/java/processing/awt/PImageAWT.java +0 -377
  83. data/lib/java/processing/awt/PShapeJava2D.java +0 -387
  84. data/lib/java/processing/awt/PSurfaceAWT.java +0 -1581
  85. data/lib/java/processing/awt/ShimAWT.java +0 -581
  86. data/lib/java/processing/core/PApplet.java +0 -15156
  87. data/lib/java/processing/core/PConstants.java +0 -523
  88. data/lib/java/processing/core/PFont.java +0 -1126
  89. data/lib/java/processing/core/PGraphics.java +0 -8600
  90. data/lib/java/processing/core/PImage.java +0 -3377
  91. data/lib/java/processing/core/PMatrix.java +0 -208
  92. data/lib/java/processing/core/PMatrix2D.java +0 -562
  93. data/lib/java/processing/core/PMatrix3D.java +0 -890
  94. data/lib/java/processing/core/PShape.java +0 -3561
  95. data/lib/java/processing/core/PShapeOBJ.java +0 -483
  96. data/lib/java/processing/core/PShapeSVG.java +0 -2016
  97. data/lib/java/processing/core/PStyle.java +0 -63
  98. data/lib/java/processing/core/PSurface.java +0 -198
  99. data/lib/java/processing/core/PSurfaceNone.java +0 -431
  100. data/lib/java/processing/core/PVector.java +0 -1066
  101. data/lib/java/processing/core/ThinkDifferent.java +0 -115
  102. data/lib/java/processing/data/DoubleDict.java +0 -850
  103. data/lib/java/processing/data/DoubleList.java +0 -928
  104. data/lib/java/processing/data/FloatDict.java +0 -847
  105. data/lib/java/processing/data/FloatList.java +0 -936
  106. data/lib/java/processing/data/IntDict.java +0 -807
  107. data/lib/java/processing/data/IntList.java +0 -936
  108. data/lib/java/processing/data/JSONArray.java +0 -1260
  109. data/lib/java/processing/data/JSONObject.java +0 -2282
  110. data/lib/java/processing/data/JSONTokener.java +0 -435
  111. data/lib/java/processing/data/LongDict.java +0 -802
  112. data/lib/java/processing/data/LongList.java +0 -937
  113. data/lib/java/processing/data/Sort.java +0 -46
  114. data/lib/java/processing/data/StringDict.java +0 -613
  115. data/lib/java/processing/data/StringList.java +0 -800
  116. data/lib/java/processing/data/Table.java +0 -4936
  117. data/lib/java/processing/data/TableRow.java +0 -198
  118. data/lib/java/processing/data/XML.java +0 -1156
  119. data/lib/java/processing/dxf/RawDXF.java +0 -404
  120. data/lib/java/processing/event/Event.java +0 -125
  121. data/lib/java/processing/event/KeyEvent.java +0 -70
  122. data/lib/java/processing/event/MouseEvent.java +0 -114
  123. data/lib/java/processing/event/TouchEvent.java +0 -57
  124. data/lib/java/processing/javafx/PGraphicsFX2D.java +0 -32
  125. data/lib/java/processing/javafx/PSurfaceFX.java +0 -173
  126. data/lib/java/processing/net/Client.java +0 -744
  127. data/lib/java/processing/net/Server.java +0 -388
  128. data/lib/java/processing/opengl/FontTexture.java +0 -378
  129. data/lib/java/processing/opengl/FrameBuffer.java +0 -513
  130. data/lib/java/processing/opengl/LinePath.java +0 -627
  131. data/lib/java/processing/opengl/LineStroker.java +0 -681
  132. data/lib/java/processing/opengl/PGL.java +0 -3483
  133. data/lib/java/processing/opengl/PGraphics2D.java +0 -615
  134. data/lib/java/processing/opengl/PGraphics3D.java +0 -281
  135. data/lib/java/processing/opengl/PGraphicsOpenGL.java +0 -13753
  136. data/lib/java/processing/opengl/PJOGL.java +0 -2008
  137. data/lib/java/processing/opengl/PShader.java +0 -1484
  138. data/lib/java/processing/opengl/PShapeOpenGL.java +0 -5269
  139. data/lib/java/processing/opengl/PSurfaceJOGL.java +0 -1385
  140. data/lib/java/processing/opengl/Texture.java +0 -1696
  141. data/lib/java/processing/opengl/VertexBuffer.java +0 -88
  142. data/lib/java/processing/pdf/PGraphicsPDF.java +0 -581
  143. data/lib/java/processing/svg/PGraphicsSVG.java +0 -378
  144. data/src/main/java/processing/opengl/cursors/arrow.png +0 -0
  145. data/src/main/java/processing/opengl/cursors/cross.png +0 -0
  146. data/src/main/java/processing/opengl/cursors/hand.png +0 -0
  147. data/src/main/java/processing/opengl/cursors/license.txt +0 -27
  148. data/src/main/java/processing/opengl/cursors/move.png +0 -0
  149. data/src/main/java/processing/opengl/cursors/text.png +0 -0
  150. data/src/main/java/processing/opengl/cursors/wait.png +0 -0
  151. data/src/main/java/processing/opengl/shaders/ColorFrag.glsl +0 -32
  152. data/src/main/java/processing/opengl/shaders/ColorVert.glsl +0 -34
  153. data/src/main/java/processing/opengl/shaders/LightFrag.glsl +0 -33
  154. data/src/main/java/processing/opengl/shaders/LightVert.glsl +0 -151
  155. data/src/main/java/processing/opengl/shaders/LineFrag.glsl +0 -32
  156. data/src/main/java/processing/opengl/shaders/LineVert.glsl +0 -100
  157. data/src/main/java/processing/opengl/shaders/MaskFrag.glsl +0 -40
  158. data/src/main/java/processing/opengl/shaders/PointFrag.glsl +0 -32
  159. data/src/main/java/processing/opengl/shaders/PointVert.glsl +0 -56
  160. data/src/main/java/processing/opengl/shaders/TexFrag.glsl +0 -37
  161. data/src/main/java/processing/opengl/shaders/TexLightFrag.glsl +0 -37
  162. data/src/main/java/processing/opengl/shaders/TexLightVert.glsl +0 -157
  163. data/src/main/java/processing/opengl/shaders/TexVert.glsl +0 -38
@@ -1,3561 +0,0 @@
1
- /* -*- mode: java; c-basic-offset: 2; indent-tabs-mode: nil -*- */
2
-
3
- /*
4
- Part of the Processing project - http://processing.org
5
-
6
- Copyright (c) 2006-10 Ben Fry and Casey Reas
7
-
8
- This library is free software; you can redistribute it and/or
9
- modify it under the terms of the GNU Lesser General Public
10
- License version 2.1 as published by the Free Software Foundation.
11
-
12
- This library is distributed in the hope that it will be useful,
13
- but WITHOUT ANY WARRANTY; without even the implied warranty of
14
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
- Lesser General Public License for more details.
16
-
17
- You should have received a copy of the GNU Lesser General
18
- Public License along with this library; if not, write to the
19
- Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20
- Boston, MA 02111-1307 USA
21
- */
22
-
23
- package processing.core;
24
-
25
- import java.awt.Image;
26
- import java.awt.color.ColorSpace;
27
- import java.awt.image.BufferedImage;
28
- import java.util.HashMap;
29
- import java.util.Map;
30
-
31
- import javax.swing.ImageIcon;
32
-
33
- import processing.awt.PImageAWT;
34
-
35
- import java.util.Base64;
36
-
37
-
38
- /**
39
- * ( begin auto-generated from PShape.xml )
40
- *
41
- * Datatype for storing shapes. Processing can currently load and display
42
- * SVG (Scalable Vector Graphics) shapes. Before a shape is used, it must
43
- * be loaded with the <b>loadShape()</b> function. The <b>shape()</b>
44
- * function is used to draw the shape to the display window. The
45
- * <b>PShape</b> object contain a group of methods, linked below, that can
46
- * operate on the shape data.
47
- *
48
- * The <b>loadShape()</b> function supports SVG files created with Inkscape
49
- * and Adobe Illustrator. It is not a full SVG implementation, but offers
50
- * some straightforward support for handling vector data.
51
- *
52
- * ( end auto-generated )
53
- * <h3>Advanced</h3>
54
- *
55
- * In-progress class to handle shape data, currently to be considered of
56
- * alpha or beta quality. Major structural work may be performed on this class
57
- * after the release of Processing 1.0. Such changes may include:
58
- *
59
- * <ul>
60
- * <li> addition of proper accessors to read shape vertex and coloring data
61
- * (this is the second most important part of having a PShape class after all).
62
- * <li> a means of creating PShape objects ala beginShape() and endShape().
63
- * <li> load(), update(), and cache methods ala PImage, so that shapes can
64
- * have renderer-specific optimizations, such as vertex arrays in OpenGL.
65
- * <li> splitting this class into multiple classes to handle different
66
- * varieties of shape data (primitives vs collections of vertices vs paths)
67
- * <li> change of package declaration, for instance moving the code into
68
- * package processing.shape (if the code grows too much).
69
- * </ul>
70
- *
71
- * <p>For the time being, this class and its shape() and loadShape() friends in
72
- * PApplet exist as placeholders for more exciting things to come. If you'd
73
- * like to work with this class, make a subclass (see how PShapeSVG works)
74
- * and you can play with its internal methods all you like.</p>
75
- *
76
- * <p>Library developers are encouraged to create PShape objects when loading
77
- * shape data, so that they can eventually hook into the bounty that will be
78
- * the PShape interface, and the ease of loadShape() and shape().</p>
79
- *
80
- * @webref shape
81
- * @usage Web &amp; Application
82
- * @see PApplet#loadShape(String)
83
- * @see PApplet#createShape()
84
- * @see PApplet#shapeMode(int)
85
- * @instanceName sh any variable of type PShape
86
- */
87
- public class PShape implements PConstants {
88
- protected String name;
89
- protected Map<String,PShape> nameTable;
90
-
91
- // /** Generic, only draws its child objects. */
92
- // static public final int GROUP = 0;
93
- // GROUP now inherited from PConstants, and is still zero
94
-
95
- // These constants were updated in 3.0b6 so that they could be distinguished
96
- // from others in PConstants and improve how some typos were handled.
97
- // https://github.com/processing/processing/issues/3776
98
- /** A line, ellipse, arc, image, etc. */
99
- static public final int PRIMITIVE = 101;
100
- /** A series of vertex, curveVertex, and bezierVertex calls. */
101
- static public final int PATH = 102;
102
- /** Collections of vertices created with beginShape(). */
103
- static public final int GEOMETRY = 103;
104
- /** The shape type, one of GROUP, PRIMITIVE, PATH, or GEOMETRY. */
105
- protected int family;
106
-
107
- /** ELLIPSE, LINE, QUAD; TRIANGLE_FAN, QUAD_STRIP; etc. */
108
- protected int kind;
109
-
110
- protected PMatrix matrix;
111
-
112
- protected int textureMode;
113
-
114
- /** Texture or image data associated with this shape. */
115
- protected PImage image;
116
- protected String imagePath = null;
117
-
118
- public static final String OUTSIDE_BEGIN_END_ERROR =
119
- "%1$s can only be called between beginShape() and endShape()";
120
-
121
- public static final String INSIDE_BEGIN_END_ERROR =
122
- "%1$s can only be called outside beginShape() and endShape()";
123
-
124
- public static final String NO_SUCH_VERTEX_ERROR =
125
- "%1$s vertex index does not exist";
126
-
127
- static public final String NO_VERTICES_ERROR =
128
- "getVertexCount() only works with PATH or GEOMETRY shapes";
129
-
130
- public static final String NOT_A_SIMPLE_VERTEX =
131
- "%1$s can not be called on quadratic or bezier vertices";
132
-
133
- static public final String PER_VERTEX_UNSUPPORTED =
134
- "This renderer does not support %1$s for individual vertices";
135
-
136
- /**
137
- * ( begin auto-generated from PShape_width.xml )
138
- *
139
- * The width of the PShape document.
140
- *
141
- * ( end auto-generated )
142
- * @webref pshape:field
143
- * @usage web_application
144
- * @brief Shape document width
145
- * @see PShape#height
146
- */
147
- public float width;
148
- /**
149
- * ( begin auto-generated from PShape_height.xml )
150
- *
151
- * The height of the PShape document.
152
- *
153
- * ( end auto-generated )
154
- * @webref pshape:field
155
- * @usage web_application
156
- * @brief Shape document height
157
- * @see PShape#width
158
- */
159
- public float height;
160
-
161
- public float depth;
162
-
163
- PGraphics g;
164
-
165
- // set to false if the object is hidden in the layers palette
166
- protected boolean visible = true;
167
-
168
- /** Retained shape being created with beginShape/endShape */
169
- protected boolean openShape = false;
170
-
171
- protected boolean openContour = false;
172
-
173
- protected boolean stroke;
174
- protected int strokeColor;
175
- protected float strokeWeight; // default is 1
176
- protected int strokeCap;
177
- protected int strokeJoin;
178
-
179
- protected boolean fill;
180
- protected int fillColor;
181
-
182
- protected boolean tint;
183
- protected int tintColor;
184
-
185
- protected int ambientColor;
186
- protected boolean setAmbient;
187
- protected int specularColor;
188
- protected int emissiveColor;
189
- protected float shininess;
190
-
191
- protected int sphereDetailU, sphereDetailV;
192
- protected int rectMode;
193
- protected int ellipseMode;
194
-
195
- /** Temporary toggle for whether styles should be honored. */
196
- protected boolean style = true;
197
-
198
- /** For primitive shapes in particular, params like x/y/w/h or x1/y1/x2/y2. */
199
- protected float[] params;
200
-
201
- protected int vertexCount;
202
- /**
203
- * When drawing POLYGON shapes, the second param is an array of length
204
- * VERTEX_FIELD_COUNT. When drawing PATH shapes, the second param has only
205
- * two variables.
206
- */
207
- protected float[][] vertices;
208
-
209
- protected PShape parent;
210
- protected int childCount;
211
- protected PShape[] children;
212
-
213
-
214
- /** Array of VERTEX, BEZIER_VERTEX, and CURVE_VERTEX calls. */
215
- protected int vertexCodeCount;
216
- protected int[] vertexCodes;
217
- /** True if this is a closed path. */
218
- protected boolean close;
219
-
220
- // ........................................................
221
-
222
- // internal color for setting/calculating
223
- protected float calcR, calcG, calcB, calcA;
224
- protected int calcRi, calcGi, calcBi, calcAi;
225
- protected int calcColor;
226
- protected boolean calcAlpha;
227
-
228
- /** The current colorMode */
229
- public int colorMode; // = RGB;
230
-
231
- /** Max value for red (or hue) set by colorMode */
232
- public float colorModeX; // = 255;
233
-
234
- /** Max value for green (or saturation) set by colorMode */
235
- public float colorModeY; // = 255;
236
-
237
- /** Max value for blue (or value) set by colorMode */
238
- public float colorModeZ; // = 255;
239
-
240
- /** Max value for alpha set by colorMode */
241
- public float colorModeA; // = 255;
242
-
243
- /** True if colors are not in the range 0..1 */
244
- boolean colorModeScale; // = true;
245
-
246
- /** True if colorMode(RGB, 255) */
247
- boolean colorModeDefault; // = true;
248
-
249
- /** True if contains 3D data */
250
- protected boolean is3D = false;
251
-
252
- protected boolean perVertexStyles = false;
253
-
254
- // should this be called vertices (consistent with PGraphics internals)
255
- // or does that hurt flexibility?
256
-
257
-
258
- // POINTS, LINES, xLINE_STRIP, xLINE_LOOP
259
- // TRIANGLES, TRIANGLE_STRIP, TRIANGLE_FAN
260
- // QUADS, QUAD_STRIP
261
- // xPOLYGON
262
- // static final int PATH = 1; // POLYGON, LINE_LOOP, LINE_STRIP
263
- // static final int GROUP = 2;
264
-
265
- // how to handle rectmode/ellipsemode?
266
- // are they bitshifted into the constant?
267
- // CORNER, CORNERS, CENTER, (CENTER_RADIUS?)
268
- // static final int RECT = 3; // could just be QUAD, but would be x1/y1/x2/y2
269
- // static final int ELLIPSE = 4;
270
- //
271
- // static final int VERTEX = 7;
272
- // static final int CURVE = 5;
273
- // static final int BEZIER = 6;
274
-
275
-
276
- // fill and stroke functions will need a pointer to the parent
277
- // PGraphics object.. may need some kind of createShape() fxn
278
- // or maybe the values are stored until draw() is called?
279
-
280
- // attaching images is very tricky.. it's a different type of data
281
-
282
- // material parameters will be thrown out,
283
- // except those currently supported (kinds of lights)
284
-
285
- // pivot point for transformations
286
- // public float px;
287
- // public float py;
288
-
289
-
290
- /**
291
- * @nowebref
292
- */
293
- public PShape() {
294
- this.family = GROUP;
295
- }
296
-
297
-
298
- /**
299
- * @nowebref
300
- */
301
- public PShape(int family) {
302
- this.family = family;
303
- }
304
-
305
-
306
- /**
307
- * @nowebref
308
- */
309
- public PShape(PGraphics g, int family) {
310
- this.g = g;
311
- this.family = family;
312
-
313
- // Style parameters are retrieved from the current values in the renderer.
314
- textureMode = g.textureMode;
315
-
316
- colorMode(g.colorMode,
317
- g.colorModeX, g.colorModeY, g.colorModeZ, g.colorModeA);
318
-
319
- // Initial values for fill, stroke and tint colors are also imported from
320
- // the renderer. This is particular relevant for primitive shapes, since is
321
- // not possible to set their color separately when creating them, and their
322
- // input vertices are actually generated at rendering time, by which the
323
- // color configuration of the renderer might have changed.
324
- fill = g.fill;
325
- fillColor = g.fillColor;
326
-
327
- stroke = g.stroke;
328
- strokeColor = g.strokeColor;
329
- strokeWeight = g.strokeWeight;
330
- strokeCap = g.strokeCap;
331
- strokeJoin = g.strokeJoin;
332
-
333
- tint = g.tint;
334
- tintColor = g.tintColor;
335
-
336
- setAmbient = g.setAmbient;
337
- ambientColor = g.ambientColor;
338
- specularColor = g.specularColor;
339
- emissiveColor = g.emissiveColor;
340
- shininess = g.shininess;
341
-
342
- sphereDetailU = g.sphereDetailU;
343
- sphereDetailV = g.sphereDetailV;
344
-
345
- // bezierDetail = pg.bezierDetail;
346
- // curveDetail = pg.curveDetail;
347
- // curveTightness = pg.curveTightness;
348
-
349
- rectMode = g.rectMode;
350
- ellipseMode = g.ellipseMode;
351
-
352
- // normalX = normalY = 0;
353
- // normalZ = 1;
354
- //
355
- // normalMode = NORMAL_MODE_AUTO;
356
-
357
- // To make sure that the first vertex is marked as a break.
358
- // Same behavior as in the immediate mode.
359
- // breakShape = false;
360
-
361
- if (family == GROUP) {
362
- // GROUP shapes are always marked as ended.
363
- // shapeCreated = true;
364
- // TODO why was this commented out?
365
- }
366
- }
367
-
368
-
369
- public PShape(PGraphics g, int kind, float... params) {
370
- this(g, PRIMITIVE);
371
- setKind(kind);
372
- setParams(params);
373
- }
374
-
375
-
376
- public void setFamily(int family) {
377
- this.family = family;
378
- }
379
-
380
-
381
- public void setKind(int kind) {
382
- this.kind = kind;
383
- }
384
-
385
-
386
- public void setName(String name) {
387
- this.name = name;
388
- }
389
-
390
-
391
- public String getName() {
392
- return name;
393
- }
394
-
395
- /**
396
- * ( begin auto-generated from PShape_isVisible.xml )
397
- *
398
- * Returns a boolean value "true" if the image is set to be visible,
399
- * "false" if not. This is modified with the <b>setVisible()</b> parameter.
400
- *
401
- * The visibility of a shape is usually controlled by whatever program
402
- * created the SVG file. For instance, this parameter is controlled by
403
- * showing or hiding the shape in the layers palette in Adobe Illustrator.
404
- *
405
- * ( end auto-generated )
406
- * @webref pshape:method
407
- * @usage web_application
408
- * @brief Returns a boolean value "true" if the image is set to be visible, "false" if not
409
- * @see PShape#setVisible(boolean)
410
- */
411
- public boolean isVisible() {
412
- return visible;
413
- }
414
-
415
-
416
- /**
417
- * ( begin auto-generated from PShape_setVisible.xml )
418
- *
419
- * Sets the shape to be visible or invisible. This is determined by the
420
- * value of the <b>visible</b> parameter.
421
- *
422
- * The visibility of a shape is usually controlled by whatever program
423
- * created the SVG file. For instance, this parameter is controlled by
424
- * showing or hiding the shape in the layers palette in Adobe Illustrator.
425
- *
426
- * ( end auto-generated )
427
- * @webref pshape:mathod
428
- * @usage web_application
429
- * @brief Sets the shape to be visible or invisible
430
- * @param visible "false" makes the shape invisible and "true" makes it visible
431
- * @see PShape#isVisible()
432
- */
433
- public void setVisible(boolean visible) {
434
- this.visible = visible;
435
- }
436
-
437
-
438
- /**
439
- * ( begin auto-generated from PShape_disableStyle.xml )
440
- *
441
- * Disables the shape's style data and uses Processing's current styles.
442
- * Styles include attributes such as colors, stroke weight, and stroke
443
- * joints.
444
- *
445
- * ( end auto-generated )
446
- * <h3>Advanced</h3>
447
- * Overrides this shape's style information and uses PGraphics styles and
448
- * colors. Identical to ignoreStyles(true). Also disables styles for all
449
- * child shapes.
450
- * @webref pshape:method
451
- * @usage web_application
452
- * @brief Disables the shape's style data and uses Processing styles
453
- * @see PShape#enableStyle()
454
- */
455
- public void disableStyle() {
456
- style = false;
457
-
458
- for (int i = 0; i < childCount; i++) {
459
- children[i].disableStyle();
460
- }
461
- }
462
-
463
-
464
- /**
465
- * ( begin auto-generated from PShape_enableStyle.xml )
466
- *
467
- * Enables the shape's style data and ignores Processing's current styles.
468
- * Styles include attributes such as colors, stroke weight, and stroke
469
- * joints.
470
- *
471
- * ( end auto-generated )
472
- *
473
- * @webref pshape:method
474
- * @usage web_application
475
- * @brief Enables the shape's style data and ignores the Processing styles
476
- * @see PShape#disableStyle()
477
- */
478
- public void enableStyle() {
479
- style = true;
480
-
481
- for (int i = 0; i < childCount; i++) {
482
- children[i].enableStyle();
483
- }
484
- }
485
-
486
-
487
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
488
-
489
-
490
- // protected void checkBounds() {
491
- // if (width == 0 || height == 0) {
492
- // // calculate bounds here (also take kids into account)
493
- // width = 1;
494
- // height = 1;
495
- // }
496
- // }
497
-
498
-
499
- /**
500
- * Get the width of the drawing area (not necessarily the shape boundary).
501
- */
502
- public float getWidth() {
503
- //checkBounds();
504
- return width;
505
- }
506
-
507
-
508
- /**
509
- * Get the height of the drawing area (not necessarily the shape boundary).
510
- */
511
- public float getHeight() {
512
- //checkBounds();
513
- return height;
514
- }
515
-
516
-
517
- /**
518
- * Get the depth of the shape area (not necessarily the shape boundary). Only makes sense for 3D PShape subclasses,
519
- * such as PShape3D.
520
- */
521
- public float getDepth() {
522
- //checkBounds();
523
- return depth;
524
- }
525
-
526
-
527
-
528
- /*
529
- // TODO unapproved
530
- protected PVector getTop() {
531
- return getTop(null);
532
- }
533
-
534
-
535
- protected PVector getTop(PVector top) {
536
- if (top == null) {
537
- top = new PVector();
538
- }
539
- return top;
540
- }
541
-
542
-
543
- protected PVector getBottom() {
544
- return getBottom(null);
545
- }
546
-
547
-
548
- protected PVector getBottom(PVector bottom) {
549
- if (bottom == null) {
550
- bottom = new PVector();
551
- }
552
- return bottom;
553
- }
554
- */
555
-
556
-
557
- /**
558
- * Return true if this shape is 2D. Defaults to true.
559
- */
560
- public boolean is2D() {
561
- return !is3D;
562
- }
563
-
564
-
565
- /**
566
- * Return true if this shape is 3D. Defaults to false.
567
- */
568
- public boolean is3D() {
569
- return is3D;
570
- }
571
-
572
-
573
- public void set3D(boolean val) {
574
- is3D = val;
575
- }
576
-
577
-
578
- // /**
579
- // * Return true if this shape requires rendering through OpenGL. Defaults to false.
580
- // */
581
- // // TODO unapproved
582
- // public boolean isGL() {
583
- // return false;
584
- // }
585
-
586
-
587
- ///////////////////////////////////////////////////////////
588
-
589
- //
590
-
591
- // Drawing methods
592
-
593
- public void textureMode(int mode) {
594
- if (!openShape) {
595
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "textureMode()");
596
- return;
597
- }
598
-
599
- textureMode = mode;
600
- }
601
-
602
- public void texture(PImage tex) {
603
- if (!openShape) {
604
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "texture()");
605
- return;
606
- }
607
-
608
- image = tex;
609
- }
610
-
611
- public void noTexture() {
612
- if (!openShape) {
613
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "noTexture()");
614
- return;
615
- }
616
-
617
- image = null;
618
- }
619
-
620
-
621
- // TODO unapproved
622
- protected void solid(boolean solid) {
623
- }
624
-
625
-
626
- /**
627
- * @webref shape:vertex
628
- * @brief Starts a new contour
629
- * @see PShape#endContour()
630
- */
631
- public void beginContour() {
632
- if (!openShape) {
633
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "beginContour()");
634
- return;
635
- }
636
-
637
- if (family == GROUP) {
638
- PGraphics.showWarning("Cannot begin contour in GROUP shapes");
639
- return;
640
- }
641
-
642
- if (openContour) {
643
- PGraphics.showWarning("Already called beginContour().");
644
- return;
645
- }
646
- openContour = true;
647
- beginContourImpl();
648
- }
649
-
650
-
651
- protected void beginContourImpl() {
652
- if (vertexCodes == null) {
653
- vertexCodes = new int[10];
654
- } else if (vertexCodes.length == vertexCodeCount) {
655
- vertexCodes = PApplet.expand(vertexCodes);
656
- }
657
- vertexCodes[vertexCodeCount++] = BREAK;
658
- }
659
-
660
-
661
- /**
662
- * @webref shape:vertex
663
- * @brief Ends a contour
664
- * @see PShape#beginContour()
665
- */
666
- public void endContour() {
667
- if (!openShape) {
668
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "endContour()");
669
- return;
670
- }
671
-
672
- if (family == GROUP) {
673
- PGraphics.showWarning("Cannot end contour in GROUP shapes");
674
- return;
675
- }
676
-
677
- if (!openContour) {
678
- PGraphics.showWarning("Need to call beginContour() first.");
679
- return;
680
- }
681
- endContourImpl();
682
- openContour = false;
683
- }
684
-
685
-
686
- protected void endContourImpl() {
687
- }
688
-
689
-
690
- public void vertex(float x, float y) {
691
- if (vertices == null) {
692
- vertices = new float[10][2];
693
- } else if (vertices.length == vertexCount) {
694
- vertices = (float[][]) PApplet.expand(vertices);
695
- }
696
- vertices[vertexCount++] = new float[] { x, y };
697
-
698
- if (vertexCodes == null) {
699
- vertexCodes = new int[10];
700
- } else if (vertexCodes.length == vertexCodeCount) {
701
- vertexCodes = PApplet.expand(vertexCodes);
702
- }
703
- vertexCodes[vertexCodeCount++] = VERTEX;
704
-
705
- if (x > width) {
706
- width = x;
707
- }
708
- if (y > height) {
709
- height = y;
710
- }
711
- }
712
-
713
-
714
- public void vertex(float x, float y, float u, float v) {
715
- }
716
-
717
-
718
- public void vertex(float x, float y, float z) {
719
- vertex(x, y); // maybe? maybe not?
720
- }
721
-
722
-
723
- public void vertex(float x, float y, float z, float u, float v) {
724
- }
725
-
726
-
727
- public void normal(float nx, float ny, float nz) {
728
- }
729
-
730
-
731
- public void attribPosition(String name, float x, float y, float z) {
732
- }
733
-
734
- public void attribNormal(String name, float nx, float ny, float nz) {
735
- }
736
-
737
-
738
- public void attribColor(String name, int color) {
739
- }
740
-
741
-
742
- public void attrib(String name, float... values) {
743
- }
744
-
745
-
746
- public void attrib(String name, int... values) {
747
- }
748
-
749
-
750
- public void attrib(String name, boolean... values) {
751
- }
752
-
753
-
754
- /**
755
- * @webref pshape:method
756
- * @brief Starts the creation of a new PShape
757
- * @see PApplet#endShape()
758
- */
759
- public void beginShape() {
760
- beginShape(POLYGON);
761
- }
762
-
763
-
764
- public void beginShape(int kind) {
765
- this.kind = kind;
766
- openShape = true;
767
- }
768
-
769
- /**
770
- * @webref pshape:method
771
- * @brief Finishes the creation of a new PShape
772
- * @see PApplet#beginShape()
773
- */
774
- public void endShape() {
775
- endShape(OPEN);
776
- }
777
-
778
-
779
- public void endShape(int mode) {
780
- if (family == GROUP) {
781
- PGraphics.showWarning("Cannot end GROUP shape");
782
- return;
783
- }
784
-
785
- if (!openShape) {
786
- PGraphics.showWarning("Need to call beginShape() first");
787
- return;
788
- }
789
-
790
- close = (mode==CLOSE);
791
-
792
- // this is the state of the shape
793
- openShape = false;
794
- }
795
-
796
-
797
- //////////////////////////////////////////////////////////////
798
-
799
- // STROKE CAP/JOIN/WEIGHT
800
-
801
-
802
- public void strokeWeight(float weight) {
803
- if (!openShape) {
804
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "strokeWeight()");
805
- return;
806
- }
807
-
808
- strokeWeight = weight;
809
- }
810
-
811
- public void strokeJoin(int join) {
812
- if (!openShape) {
813
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "strokeJoin()");
814
- return;
815
- }
816
-
817
- strokeJoin = join;
818
- }
819
-
820
- public void strokeCap(int cap) {
821
- if (!openShape) {
822
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "strokeCap()");
823
- return;
824
- }
825
-
826
- strokeCap = cap;
827
- }
828
-
829
-
830
- //////////////////////////////////////////////////////////////
831
-
832
- // FILL COLOR
833
-
834
-
835
- public void noFill() {
836
- if (!openShape) {
837
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "noFill()");
838
- return;
839
- }
840
-
841
- fill = false;
842
- fillColor = 0x0;
843
-
844
- if (!setAmbient) {
845
- ambientColor = fillColor;
846
- }
847
- }
848
-
849
-
850
- public void fill(int rgb) {
851
- if (!openShape) {
852
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "fill()");
853
- return;
854
- }
855
-
856
- fill = true;
857
- colorCalc(rgb);
858
- fillColor = calcColor;
859
-
860
- if (!setAmbient) {
861
- ambientColor = fillColor;
862
- }
863
- }
864
-
865
-
866
- public void fill(int rgb, float alpha) {
867
- if (!openShape) {
868
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "fill()");
869
- return;
870
- }
871
-
872
- fill = true;
873
- colorCalc(rgb, alpha);
874
- fillColor = calcColor;
875
-
876
- if (!setAmbient) {
877
- ambientColor = fillColor;
878
- }
879
- }
880
-
881
-
882
- public void fill(float gray) {
883
- if (!openShape) {
884
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "fill()");
885
- return;
886
- }
887
-
888
- fill = true;
889
- colorCalc(gray);
890
- fillColor = calcColor;
891
-
892
- if (!setAmbient) {
893
- ambientColor = fillColor;
894
- }
895
- }
896
-
897
-
898
- public void fill(float gray, float alpha) {
899
- if (!openShape) {
900
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "fill()");
901
- return;
902
- }
903
-
904
- fill = true;
905
- colorCalc(gray, alpha);
906
- fillColor = calcColor;
907
-
908
- if (!setAmbient) {
909
- ambient(fillColor);
910
- setAmbient = false;
911
- }
912
-
913
- if (!setAmbient) {
914
- ambientColor = fillColor;
915
- }
916
- }
917
-
918
-
919
- public void fill(float x, float y, float z) {
920
- if (!openShape) {
921
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "fill()");
922
- return;
923
- }
924
-
925
- fill = true;
926
- colorCalc(x, y, z);
927
- fillColor = calcColor;
928
-
929
- if (!setAmbient) {
930
- ambientColor = fillColor;
931
- }
932
- }
933
-
934
-
935
- public void fill(float x, float y, float z, float a) {
936
- if (!openShape) {
937
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "fill()");
938
- return;
939
- }
940
-
941
- fill = true;
942
- colorCalc(x, y, z, a);
943
- fillColor = calcColor;
944
-
945
- if (!setAmbient) {
946
- ambientColor = fillColor;
947
- }
948
- }
949
-
950
-
951
- //////////////////////////////////////////////////////////////
952
-
953
- // STROKE COLOR
954
-
955
-
956
- public void noStroke() {
957
- if (!openShape) {
958
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "noStroke()");
959
- return;
960
- }
961
-
962
- stroke = false;
963
- }
964
-
965
-
966
- public void stroke(int rgb) {
967
- if (!openShape) {
968
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "stroke()");
969
- return;
970
- }
971
-
972
- stroke = true;
973
- colorCalc(rgb);
974
- strokeColor = calcColor;
975
- }
976
-
977
-
978
- public void stroke(int rgb, float alpha) {
979
- if (!openShape) {
980
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "stroke()");
981
- return;
982
- }
983
-
984
- stroke = true;
985
- colorCalc(rgb, alpha);
986
- strokeColor = calcColor;
987
- }
988
-
989
-
990
- public void stroke(float gray) {
991
- if (!openShape) {
992
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "stroke()");
993
- return;
994
- }
995
-
996
- stroke = true;
997
- colorCalc(gray);
998
- strokeColor = calcColor;
999
- }
1000
-
1001
-
1002
- public void stroke(float gray, float alpha) {
1003
- if (!openShape) {
1004
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "stroke()");
1005
- return;
1006
- }
1007
-
1008
- stroke = true;
1009
- colorCalc(gray, alpha);
1010
- strokeColor = calcColor;
1011
- }
1012
-
1013
-
1014
- public void stroke(float x, float y, float z) {
1015
- if (!openShape) {
1016
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "stroke()");
1017
- return;
1018
- }
1019
-
1020
- stroke = true;
1021
- colorCalc(x, y, z);
1022
- strokeColor = calcColor;
1023
- }
1024
-
1025
-
1026
- public void stroke(float x, float y, float z, float alpha) {
1027
- if (!openShape) {
1028
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "stroke()");
1029
- return;
1030
- }
1031
-
1032
- stroke = true;
1033
- colorCalc(x, y, z, alpha);
1034
- strokeColor = calcColor;
1035
- }
1036
-
1037
-
1038
- //////////////////////////////////////////////////////////////
1039
-
1040
- // TINT COLOR
1041
-
1042
-
1043
- public void noTint() {
1044
- if (!openShape) {
1045
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "noTint()");
1046
- return;
1047
- }
1048
-
1049
- tint = false;
1050
- }
1051
-
1052
-
1053
- public void tint(int rgb) {
1054
- if (!openShape) {
1055
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "tint()");
1056
- return;
1057
- }
1058
-
1059
- tint = true;
1060
- colorCalc(rgb);
1061
- tintColor = calcColor;
1062
- }
1063
-
1064
-
1065
- public void tint(int rgb, float alpha) {
1066
- if (!openShape) {
1067
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "tint()");
1068
- return;
1069
- }
1070
-
1071
- tint = true;
1072
- colorCalc(rgb, alpha);
1073
- tintColor = calcColor;
1074
- }
1075
-
1076
-
1077
- public void tint(float gray) {
1078
- if (!openShape) {
1079
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "tint()");
1080
- return;
1081
- }
1082
-
1083
- tint = true;
1084
- colorCalc(gray);
1085
- tintColor = calcColor;
1086
- }
1087
-
1088
-
1089
- public void tint(float gray, float alpha) {
1090
- if (!openShape) {
1091
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "tint()");
1092
- return;
1093
- }
1094
-
1095
- tint = true;
1096
- colorCalc(gray, alpha);
1097
- tintColor = calcColor;
1098
- }
1099
-
1100
-
1101
- public void tint(float x, float y, float z) {
1102
- if (!openShape) {
1103
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "tint()");
1104
- return;
1105
- }
1106
-
1107
- tint = true;
1108
- colorCalc(x, y, z);
1109
- tintColor = calcColor;
1110
- }
1111
-
1112
-
1113
- public void tint(float x, float y, float z, float alpha) {
1114
- if (!openShape) {
1115
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "tint()");
1116
- return;
1117
- }
1118
-
1119
- tint = true;
1120
- colorCalc(x, y, z, alpha);
1121
- tintColor = calcColor;
1122
- }
1123
-
1124
-
1125
- //////////////////////////////////////////////////////////////
1126
-
1127
- // Ambient set/update
1128
-
1129
- public void ambient(int rgb) {
1130
- if (!openShape) {
1131
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "ambient()");
1132
- return;
1133
- }
1134
-
1135
- setAmbient = true;
1136
- colorCalc(rgb);
1137
- ambientColor = calcColor;
1138
- }
1139
-
1140
-
1141
- public void ambient(float gray) {
1142
- if (!openShape) {
1143
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "ambient()");
1144
- return;
1145
- }
1146
-
1147
- setAmbient = true;
1148
- colorCalc(gray);
1149
- ambientColor = calcColor;
1150
- }
1151
-
1152
-
1153
- public void ambient(float x, float y, float z) {
1154
- if (!openShape) {
1155
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "ambient()");
1156
- return;
1157
- }
1158
-
1159
- setAmbient = true;
1160
- colorCalc(x, y, z);
1161
- ambientColor = calcColor;
1162
- }
1163
-
1164
-
1165
- //////////////////////////////////////////////////////////////
1166
-
1167
- // Specular set/update
1168
-
1169
- public void specular(int rgb) {
1170
- if (!openShape) {
1171
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "specular()");
1172
- return;
1173
- }
1174
-
1175
- colorCalc(rgb);
1176
- specularColor = calcColor;
1177
- }
1178
-
1179
-
1180
- public void specular(float gray) {
1181
- if (!openShape) {
1182
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "specular()");
1183
- return;
1184
- }
1185
-
1186
- colorCalc(gray);
1187
- specularColor = calcColor;
1188
- }
1189
-
1190
-
1191
- public void specular(float x, float y, float z) {
1192
- if (!openShape) {
1193
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "specular()");
1194
- return;
1195
- }
1196
-
1197
- colorCalc(x, y, z);
1198
- specularColor = calcColor;
1199
- }
1200
-
1201
-
1202
- //////////////////////////////////////////////////////////////
1203
-
1204
- // Emissive set/update
1205
-
1206
- public void emissive(int rgb) {
1207
- if (!openShape) {
1208
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "emissive()");
1209
- return;
1210
- }
1211
-
1212
- colorCalc(rgb);
1213
- emissiveColor = calcColor;
1214
- }
1215
-
1216
-
1217
- public void emissive(float gray) {
1218
- if (!openShape) {
1219
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "emissive()");
1220
- return;
1221
- }
1222
-
1223
- colorCalc(gray);
1224
- emissiveColor = calcColor;
1225
- }
1226
-
1227
-
1228
- public void emissive(float x, float y, float z) {
1229
- if (!openShape) {
1230
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "emissive()");
1231
- return;
1232
- }
1233
-
1234
- colorCalc(x, y, z);
1235
- emissiveColor = calcColor;
1236
- }
1237
-
1238
-
1239
- //////////////////////////////////////////////////////////////
1240
-
1241
- // Shininess set/update
1242
-
1243
- public void shininess(float shine) {
1244
- if (!openShape) {
1245
- PGraphics.showWarning(OUTSIDE_BEGIN_END_ERROR, "shininess()");
1246
- return;
1247
- }
1248
-
1249
- shininess = shine;
1250
- }
1251
-
1252
- ///////////////////////////////////////////////////////////
1253
-
1254
- //
1255
-
1256
- // Bezier curves
1257
-
1258
-
1259
- public void bezierDetail(int detail) {
1260
- }
1261
-
1262
-
1263
- public void bezierVertex(float x2, float y2,
1264
- float x3, float y3,
1265
- float x4, float y4) {
1266
- if (vertices == null) {
1267
- vertices = new float[10][];
1268
- } else if (vertexCount + 2 >= vertices.length) {
1269
- vertices = (float[][]) PApplet.expand(vertices);
1270
- }
1271
- vertices[vertexCount++] = new float[] { x2, y2 };
1272
- vertices[vertexCount++] = new float[] { x3, y3 };
1273
- vertices[vertexCount++] = new float[] { x4, y4 };
1274
-
1275
- // vertexCodes must be allocated because a vertex() call is required
1276
- if (vertexCodes.length == vertexCodeCount) {
1277
- vertexCodes = PApplet.expand(vertexCodes);
1278
- }
1279
- vertexCodes[vertexCodeCount++] = BEZIER_VERTEX;
1280
-
1281
- if (x4 > width) {
1282
- width = x4;
1283
- }
1284
- if (y4 > height) {
1285
- height = y4;
1286
- }
1287
- }
1288
-
1289
-
1290
- public void bezierVertex(float x2, float y2, float z2,
1291
- float x3, float y3, float z3,
1292
- float x4, float y4, float z4) {
1293
- }
1294
-
1295
-
1296
- public void quadraticVertex(float cx, float cy,
1297
- float x3, float y3) {
1298
- if (vertices == null) {
1299
- vertices = new float[10][];
1300
- } else if (vertexCount + 1 >= vertices.length) {
1301
- vertices = (float[][]) PApplet.expand(vertices);
1302
- }
1303
- vertices[vertexCount++] = new float[] { cx, cy };
1304
- vertices[vertexCount++] = new float[] { x3, y3 };
1305
-
1306
- // vertexCodes must be allocated because a vertex() call is required
1307
- if (vertexCodes.length == vertexCodeCount) {
1308
- vertexCodes = PApplet.expand(vertexCodes);
1309
- }
1310
- vertexCodes[vertexCodeCount++] = QUADRATIC_VERTEX;
1311
-
1312
- if (x3 > width) {
1313
- width = x3;
1314
- }
1315
- if (y3 > height) {
1316
- height = y3;
1317
- }
1318
- }
1319
-
1320
-
1321
- public void quadraticVertex(float cx, float cy, float cz,
1322
- float x3, float y3, float z3) {
1323
- }
1324
-
1325
-
1326
- ///////////////////////////////////////////////////////////
1327
-
1328
- //
1329
-
1330
- // Catmull-Rom curves
1331
-
1332
- public void curveDetail(int detail) {
1333
- }
1334
-
1335
- public void curveTightness(float tightness) {
1336
- }
1337
-
1338
- public void curveVertex(float x, float y) {
1339
- }
1340
-
1341
- public void curveVertex(float x, float y, float z) {
1342
- }
1343
-
1344
-
1345
-
1346
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1347
-
1348
-
1349
- /*
1350
- boolean strokeSaved;
1351
- int strokeColorSaved;
1352
- float strokeWeightSaved;
1353
- int strokeCapSaved;
1354
- int strokeJoinSaved;
1355
-
1356
- boolean fillSaved;
1357
- int fillColorSaved;
1358
-
1359
- int rectModeSaved;
1360
- int ellipseModeSaved;
1361
- int shapeModeSaved;
1362
- */
1363
-
1364
-
1365
- protected void pre(PGraphics g) {
1366
- if (matrix != null) {
1367
- g.pushMatrix();
1368
- g.applyMatrix(matrix);
1369
- }
1370
-
1371
- /*
1372
- strokeSaved = g.stroke;
1373
- strokeColorSaved = g.strokeColor;
1374
- strokeWeightSaved = g.strokeWeight;
1375
- strokeCapSaved = g.strokeCap;
1376
- strokeJoinSaved = g.strokeJoin;
1377
-
1378
- fillSaved = g.fill;
1379
- fillColorSaved = g.fillColor;
1380
-
1381
- rectModeSaved = g.rectMode;
1382
- ellipseModeSaved = g.ellipseMode;
1383
- shapeModeSaved = g.shapeMode;
1384
- */
1385
- if (style) {
1386
- g.pushStyle();
1387
- styles(g);
1388
- }
1389
- }
1390
-
1391
-
1392
- protected void styles(PGraphics g) {
1393
- // should not be necessary because using only the int version of color
1394
- //parent.colorMode(PConstants.RGB, 255);
1395
-
1396
- if (stroke) {
1397
- g.stroke(strokeColor);
1398
- g.strokeWeight(strokeWeight);
1399
- g.strokeCap(strokeCap);
1400
- g.strokeJoin(strokeJoin);
1401
- } else {
1402
- g.noStroke();
1403
- }
1404
-
1405
- if (fill) {
1406
- //System.out.println("filling " + PApplet.hex(fillColor));
1407
- g.fill(fillColor);
1408
- } else {
1409
- g.noFill();
1410
- }
1411
- }
1412
-
1413
-
1414
- protected void post(PGraphics g) {
1415
- // for (int i = 0; i < childCount; i++) {
1416
- // children[i].draw(g);
1417
- // }
1418
-
1419
- /*
1420
- // TODO this is not sufficient, since not saving fillR et al.
1421
- g.stroke = strokeSaved;
1422
- g.strokeColor = strokeColorSaved;
1423
- g.strokeWeight = strokeWeightSaved;
1424
- g.strokeCap = strokeCapSaved;
1425
- g.strokeJoin = strokeJoinSaved;
1426
-
1427
- g.fill = fillSaved;
1428
- g.fillColor = fillColorSaved;
1429
-
1430
- g.ellipseMode = ellipseModeSaved;
1431
- */
1432
-
1433
- if (matrix != null) {
1434
- g.popMatrix();
1435
- }
1436
-
1437
- if (style) {
1438
- g.popStyle();
1439
- }
1440
- }
1441
-
1442
-
1443
- ////////////////////////////////////////////////////////////////////////
1444
- //
1445
- // Shape copy
1446
-
1447
-
1448
- // TODO unapproved
1449
- static protected PShape createShape(PApplet parent, PShape src) {
1450
- PShape dest = null;
1451
- if (src.family == GROUP) {
1452
- dest = parent.createShape(GROUP);
1453
- PShape.copyGroup(parent, src, dest);
1454
- } else if (src.family == PRIMITIVE) {
1455
- dest = parent.createShape(src.kind, src.params);
1456
- PShape.copyPrimitive(src, dest);
1457
- } else if (src.family == GEOMETRY) {
1458
- dest = parent.createShape(src.kind);
1459
- PShape.copyGeometry(src, dest);
1460
- } else if (src.family == PATH) {
1461
- dest = parent.createShape(PATH);
1462
- PShape.copyPath(src, dest);
1463
- }
1464
- dest.setName(src.name);
1465
- return dest;
1466
- }
1467
-
1468
-
1469
- // TODO unapproved
1470
- static protected void copyGroup(PApplet parent, PShape src, PShape dest) {
1471
- copyMatrix(src, dest);
1472
- copyStyles(src, dest);
1473
- copyImage(src, dest);
1474
- for (int i = 0; i < src.childCount; i++) {
1475
- PShape c = PShape.createShape(parent, src.children[i]);
1476
- dest.addChild(c);
1477
- }
1478
- }
1479
-
1480
-
1481
- // TODO unapproved
1482
- static protected void copyPrimitive(PShape src, PShape dest) {
1483
- copyMatrix(src, dest);
1484
- copyStyles(src, dest);
1485
- copyImage(src, dest);
1486
- }
1487
-
1488
-
1489
- // TODO unapproved
1490
- static protected void copyGeometry(PShape src, PShape dest) {
1491
- dest.beginShape(src.getKind());
1492
-
1493
- copyMatrix(src, dest);
1494
- copyStyles(src, dest);
1495
- copyImage(src, dest);
1496
-
1497
- if (src.style) {
1498
- for (int i = 0; i < src.vertexCount; i++) {
1499
- float[] vert = src.vertices[i];
1500
-
1501
- dest.fill((int)(vert[PGraphics.A] * 255) << 24 |
1502
- (int)(vert[PGraphics.R] * 255) << 16 |
1503
- (int)(vert[PGraphics.G] * 255) << 8 |
1504
- (int)(vert[PGraphics.B] * 255));
1505
-
1506
- // Do we need to copy these as well?
1507
- // dest.ambient(vert[PGraphics.AR] * 255, vert[PGraphics.AG] * 255, vert[PGraphics.AB] * 255);
1508
- // dest.specular(vert[PGraphics.SPR] * 255, vert[PGraphics.SPG] * 255, vert[PGraphics.SPB] * 255);
1509
- // dest.emissive(vert[PGraphics.ER] * 255, vert[PGraphics.EG] * 255, vert[PGraphics.EB] * 255);
1510
- // dest.shininess(vert[PGraphics.SHINE]);
1511
-
1512
- if (0 < PApplet.dist(vert[PGraphics.NX],
1513
- vert[PGraphics.NY],
1514
- vert[PGraphics.NZ], 0, 0, 0)) {
1515
- dest.normal(vert[PGraphics.NX],
1516
- vert[PGraphics.NY],
1517
- vert[PGraphics.NZ]);
1518
- }
1519
- dest.vertex(vert[X], vert[Y], vert[Z],
1520
- vert[PGraphics.U],
1521
- vert[PGraphics.V]);
1522
- }
1523
- } else {
1524
- for (int i = 0; i < src.vertexCount; i++) {
1525
- float[] vert = src.vertices[i];
1526
- if (vert[Z] == 0) {
1527
- dest.vertex(vert[X], vert[Y]);
1528
- } else {
1529
- dest.vertex(vert[X], vert[Y], vert[Z]);
1530
- }
1531
- }
1532
- }
1533
-
1534
- dest.endShape();
1535
- }
1536
-
1537
-
1538
- // TODO unapproved
1539
- static protected void copyPath(PShape src, PShape dest) {
1540
- copyMatrix(src, dest);
1541
- copyStyles(src, dest);
1542
- copyImage(src, dest);
1543
- dest.close = src.close;
1544
- dest.setPath(src.vertexCount, src.vertices, src.vertexCodeCount, src.vertexCodes);
1545
- }
1546
-
1547
-
1548
- // TODO unapproved
1549
- static protected void copyMatrix(PShape src, PShape dest) {
1550
- if (src.matrix != null) {
1551
- dest.applyMatrix(src.matrix);
1552
- }
1553
- }
1554
-
1555
-
1556
- // TODO unapproved
1557
- static protected void copyStyles(PShape src, PShape dest) {
1558
- dest.ellipseMode = src.ellipseMode;
1559
- dest.rectMode = src.rectMode;
1560
-
1561
- if (src.stroke) {
1562
- dest.stroke = true;
1563
- dest.strokeColor = src.strokeColor;
1564
- dest.strokeWeight = src.strokeWeight;
1565
- dest.strokeCap = src.strokeCap;
1566
- dest.strokeJoin = src.strokeJoin;
1567
- } else {
1568
- dest.stroke = false;
1569
- }
1570
-
1571
- if (src.fill) {
1572
- dest.fill = true;
1573
- dest.fillColor = src.fillColor;
1574
- } else {
1575
- dest.fill = false;
1576
- }
1577
- }
1578
-
1579
-
1580
- // TODO unapproved
1581
- static protected void copyImage(PShape src, PShape dest) {
1582
- if (src.image != null) {
1583
- dest.texture(src.image);
1584
- }
1585
- }
1586
-
1587
-
1588
-
1589
- ////////////////////////////////////////////////////////////////////////
1590
-
1591
-
1592
- /**
1593
- * Called by the following (the shape() command adds the g)
1594
- * PShape s = loadShape("blah.svg");
1595
- * shape(s);
1596
- */
1597
- public void draw(PGraphics g) {
1598
- if (visible) {
1599
- pre(g);
1600
- drawImpl(g);
1601
- post(g);
1602
- }
1603
- }
1604
-
1605
-
1606
- /**
1607
- * Draws the SVG document.
1608
- */
1609
- protected void drawImpl(PGraphics g) {
1610
- if (family == GROUP) {
1611
- drawGroup(g);
1612
- } else if (family == PRIMITIVE) {
1613
- drawPrimitive(g);
1614
- } else if (family == GEOMETRY) {
1615
- // Not same as path: `kind` matters.
1616
- // drawPath(g);
1617
- drawGeometry(g);
1618
- } else if (family == PATH) {
1619
- drawPath(g);
1620
- }
1621
- }
1622
-
1623
-
1624
- protected void drawGroup(PGraphics g) {
1625
- for (int i = 0; i < childCount; i++) {
1626
- children[i].draw(g);
1627
- }
1628
- }
1629
-
1630
-
1631
- protected void drawPrimitive(PGraphics g) {
1632
- if (kind == POINT) {
1633
- g.point(params[0], params[1]);
1634
-
1635
- } else if (kind == LINE) {
1636
- if (params.length == 4) { // 2D
1637
- g.line(params[0], params[1],
1638
- params[2], params[3]);
1639
- } else { // 3D
1640
- g.line(params[0], params[1], params[2],
1641
- params[3], params[4], params[5]);
1642
- }
1643
-
1644
- } else if (kind == TRIANGLE) {
1645
- g.triangle(params[0], params[1],
1646
- params[2], params[3],
1647
- params[4], params[5]);
1648
-
1649
- } else if (kind == QUAD) {
1650
- g.quad(params[0], params[1],
1651
- params[2], params[3],
1652
- params[4], params[5],
1653
- params[6], params[7]);
1654
-
1655
- } else if (kind == RECT) {
1656
-
1657
- if (imagePath != null){
1658
- loadImage(g);
1659
- }
1660
- if (image != null) {
1661
- int oldMode = g.imageMode;
1662
- g.imageMode(CORNER);
1663
- g.image(image, params[0], params[1], params[2], params[3]);
1664
- g.imageMode(oldMode);
1665
- } else {
1666
- int oldMode = g.rectMode;
1667
- g.rectMode(rectMode);
1668
- if (params.length == 4) {
1669
- g.rect(params[0], params[1],
1670
- params[2], params[3]);
1671
- } else if (params.length == 5) {
1672
- g.rect(params[0], params[1],
1673
- params[2], params[3],
1674
- params[4]);
1675
- } else if (params.length == 8) {
1676
- g.rect(params[0], params[1],
1677
- params[2], params[3],
1678
- params[4], params[5],
1679
- params[6], params[7]);
1680
- }
1681
- g.rectMode(oldMode);
1682
- }
1683
- } else if (kind == ELLIPSE) {
1684
- int oldMode = g.ellipseMode;
1685
- g.ellipseMode(ellipseMode);
1686
- g.ellipse(params[0], params[1],
1687
- params[2], params[3]);
1688
- g.ellipseMode(oldMode);
1689
-
1690
- } else if (kind == ARC) {
1691
- int oldMode = g.ellipseMode;
1692
- g.ellipseMode(ellipseMode);
1693
- if (params.length == 6) {
1694
- g.arc(params[0], params[1],
1695
- params[2], params[3],
1696
- params[4], params[5]);
1697
- } else if (params.length == 7) {
1698
- g.arc(params[0], params[1],
1699
- params[2], params[3],
1700
- params[4], params[5],
1701
- (int) params[6]);
1702
- }
1703
- g.ellipseMode(oldMode);
1704
-
1705
- } else if (kind == BOX) {
1706
- if (params.length == 1) {
1707
- g.box(params[0]);
1708
- } else {
1709
- g.box(params[0], params[1], params[2]);
1710
- }
1711
-
1712
- } else if (kind == SPHERE) {
1713
- g.sphere(params[0]);
1714
- }
1715
- }
1716
-
1717
-
1718
- protected void drawGeometry(PGraphics g) {
1719
- // get cache object using g.
1720
- g.beginShape(kind);
1721
- if (style) {
1722
- for (int i = 0; i < vertexCount; i++) {
1723
- g.vertex(vertices[i]);
1724
- }
1725
- } else {
1726
- for (int i = 0; i < vertexCount; i++) {
1727
- float[] vert = vertices[i];
1728
- if (vert[Z] == 0) {
1729
- g.vertex(vert[X], vert[Y]);
1730
- } else {
1731
- g.vertex(vert[X], vert[Y], vert[Z]);
1732
- }
1733
- }
1734
- }
1735
- g.endShape(close ? CLOSE : OPEN);
1736
- }
1737
-
1738
-
1739
- /*
1740
- protected void drawPath(PGraphics g) {
1741
- g.beginShape();
1742
- for (int j = 0; j < childCount; j++) {
1743
- if (j > 0) g.breakShape();
1744
- int count = children[j].vertexCount;
1745
- float[][] vert = children[j].vertices;
1746
- int[] code = children[j].vertexCodes;
1747
-
1748
- for (int i = 0; i < count; i++) {
1749
- if (style) {
1750
- if (children[j].fill) {
1751
- g.fill(vert[i][R], vert[i][G], vert[i][B]);
1752
- } else {
1753
- g.noFill();
1754
- }
1755
- if (children[j].stroke) {
1756
- g.stroke(vert[i][R], vert[i][G], vert[i][B]);
1757
- } else {
1758
- g.noStroke();
1759
- }
1760
- }
1761
- g.edge(vert[i][EDGE] == 1);
1762
-
1763
- if (code[i] == VERTEX) {
1764
- g.vertex(vert[i]);
1765
-
1766
- } else if (code[i] == BEZIER_VERTEX) {
1767
- float z0 = vert[i+0][Z];
1768
- float z1 = vert[i+1][Z];
1769
- float z2 = vert[i+2][Z];
1770
- if (z0 == 0 && z1 == 0 && z2 == 0) {
1771
- g.bezierVertex(vert[i+0][X], vert[i+0][Y], z0,
1772
- vert[i+1][X], vert[i+1][Y], z1,
1773
- vert[i+2][X], vert[i+2][Y], z2);
1774
- } else {
1775
- g.bezierVertex(vert[i+0][X], vert[i+0][Y],
1776
- vert[i+1][X], vert[i+1][Y],
1777
- vert[i+2][X], vert[i+2][Y]);
1778
- }
1779
- } else if (code[i] == CURVE_VERTEX) {
1780
- float z = vert[i][Z];
1781
- if (z == 0) {
1782
- g.curveVertex(vert[i][X], vert[i][Y]);
1783
- } else {
1784
- g.curveVertex(vert[i][X], vert[i][Y], z);
1785
- }
1786
- }
1787
- }
1788
- }
1789
- g.endShape();
1790
- }
1791
- */
1792
-
1793
- protected void drawPath(PGraphics g) {
1794
- // Paths might be empty (go figure)
1795
- // http://dev.processing.org/bugs/show_bug.cgi?id=982
1796
- if (vertices == null) return;
1797
-
1798
- boolean insideContour = false;
1799
- g.beginShape();
1800
-
1801
- if (vertexCodeCount == 0) { // each point is a simple vertex
1802
- if (vertices[0].length == 2) { // drawing 2D vertices
1803
- for (int i = 0; i < vertexCount; i++) {
1804
- g.vertex(vertices[i][X], vertices[i][Y]);
1805
- }
1806
- } else { // drawing 3D vertices
1807
- for (int i = 0; i < vertexCount; i++) {
1808
- g.vertex(vertices[i][X], vertices[i][Y], vertices[i][Z]);
1809
- }
1810
- }
1811
-
1812
- } else { // coded set of vertices
1813
- int index = 0;
1814
-
1815
- if (vertices[0].length == 2) { // drawing a 2D path
1816
- for (int j = 0; j < vertexCodeCount; j++) {
1817
- switch (vertexCodes[j]) {
1818
-
1819
- case VERTEX:
1820
- g.vertex(vertices[index][X], vertices[index][Y]);
1821
- index++;
1822
- break;
1823
-
1824
- case QUADRATIC_VERTEX:
1825
- g.quadraticVertex(vertices[index+0][X], vertices[index+0][Y],
1826
- vertices[index+1][X], vertices[index+1][Y]);
1827
- index += 2;
1828
- break;
1829
-
1830
- case BEZIER_VERTEX:
1831
- g.bezierVertex(vertices[index+0][X], vertices[index+0][Y],
1832
- vertices[index+1][X], vertices[index+1][Y],
1833
- vertices[index+2][X], vertices[index+2][Y]);
1834
- index += 3;
1835
- break;
1836
-
1837
- case CURVE_VERTEX:
1838
- g.curveVertex(vertices[index][X], vertices[index][Y]);
1839
- index++;
1840
- break;
1841
-
1842
- case BREAK:
1843
- if (insideContour) {
1844
- g.endContour();
1845
- }
1846
- g.beginContour();
1847
- insideContour = true;
1848
- }
1849
- }
1850
- } else { // drawing a 3D path
1851
- for (int j = 0; j < vertexCodeCount; j++) {
1852
- switch (vertexCodes[j]) {
1853
-
1854
- case VERTEX:
1855
- g.vertex(vertices[index][X], vertices[index][Y], vertices[index][Z]);
1856
- index++;
1857
- break;
1858
-
1859
- case QUADRATIC_VERTEX:
1860
- g.quadraticVertex(vertices[index+0][X], vertices[index+0][Y], vertices[index+0][Z],
1861
- vertices[index+1][X], vertices[index+1][Y], vertices[index+0][Z]);
1862
- index += 2;
1863
- break;
1864
-
1865
-
1866
- case BEZIER_VERTEX:
1867
- g.bezierVertex(vertices[index+0][X], vertices[index+0][Y], vertices[index+0][Z],
1868
- vertices[index+1][X], vertices[index+1][Y], vertices[index+1][Z],
1869
- vertices[index+2][X], vertices[index+2][Y], vertices[index+2][Z]);
1870
- index += 3;
1871
- break;
1872
-
1873
- case CURVE_VERTEX:
1874
- g.curveVertex(vertices[index][X], vertices[index][Y], vertices[index][Z]);
1875
- index++;
1876
- break;
1877
-
1878
- case BREAK:
1879
- if (insideContour) {
1880
- g.endContour();
1881
- }
1882
- g.beginContour();
1883
- insideContour = true;
1884
- }
1885
- }
1886
- }
1887
- }
1888
- if (insideContour) {
1889
- g.endContour();
1890
- }
1891
- g.endShape(close ? CLOSE : OPEN);
1892
- }
1893
-
1894
- private void loadImage(PGraphics g){
1895
-
1896
- if(this.imagePath.startsWith("data:image")){
1897
- loadBase64Image();
1898
- }
1899
-
1900
- if(this.imagePath.startsWith("file://")){
1901
- loadFileSystemImage(g);
1902
- }
1903
- this.imagePath = null;
1904
- }
1905
-
1906
- private void loadFileSystemImage(PGraphics g){
1907
- imagePath = imagePath.substring(7);
1908
- PImage loadedImage = g.parent.loadImage(imagePath);
1909
- if(loadedImage == null){
1910
- System.err.println("Error loading image file: " + imagePath);
1911
- }else{
1912
- setTexture(loadedImage);
1913
- }
1914
- }
1915
-
1916
- private void loadBase64Image() {
1917
- PImage loadedImage = parseBase64Image(this.imagePath);
1918
- if (loadedImage != null) {
1919
- setTexture(loadedImage);
1920
- }
1921
- }
1922
-
1923
- /**
1924
- * Parse a base 64 encoded image within an image path.
1925
- *
1926
- * @param imagePath The image path containing the base 64 image data.
1927
- * @return Newly loaded PImage.
1928
- */
1929
- protected static PImage parseBase64Image(String imagePath) {
1930
- String[] parts = imagePath.split(";base64,");
1931
- String extension = parts[0].substring(11);
1932
- String encodedData = parts[1];
1933
-
1934
- byte[] decodedBytes = Base64.getDecoder().decode(encodedData);
1935
-
1936
- if(decodedBytes == null){
1937
- System.err.println("Decode Error on image: " + imagePath.substring(0, 20));
1938
- return null;
1939
- }
1940
-
1941
- Image awtImage = new ImageIcon(decodedBytes).getImage();
1942
-
1943
- if (awtImage instanceof BufferedImage) {
1944
- BufferedImage buffImage = (BufferedImage) awtImage;
1945
- int space = buffImage.getColorModel().getColorSpace().getType();
1946
- if (space == ColorSpace.TYPE_CMYK) {
1947
- System.err.println("Could not load CMYK color space on image: " + imagePath.substring(0, 20));
1948
- return null;
1949
- }
1950
- }
1951
-
1952
- // if it's a .gif image, test to see if it has transparency
1953
- boolean requiresCheckAlpha = extension.equals("gif") || extension.equals("png") ||
1954
- extension.equals("unknown");
1955
-
1956
- PImage loadedImage = new PImageAWT(awtImage);
1957
-
1958
- if (requiresCheckAlpha) {
1959
- loadedImage.checkAlpha();
1960
- }
1961
-
1962
- if (loadedImage.width == -1) {
1963
- // error...
1964
- }
1965
-
1966
- return loadedImage;
1967
- }
1968
-
1969
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1970
-
1971
-
1972
- public PShape getParent() {
1973
- return parent;
1974
- }
1975
-
1976
- /**
1977
- * @webref
1978
- * @brief Returns the number of children
1979
- */
1980
- public int getChildCount() {
1981
- return childCount;
1982
- }
1983
-
1984
-
1985
- /** Resize the children[] array to be in line with childCount */
1986
- protected void crop() {
1987
- // https://github.com/processing/processing/issues/3347
1988
- if (children.length != childCount) {
1989
- children = (PShape[]) PApplet.subset(children, 0, childCount);
1990
- }
1991
- }
1992
-
1993
-
1994
- public PShape[] getChildren() {
1995
- crop();
1996
- return children;
1997
- }
1998
-
1999
- /**
2000
- * ( begin auto-generated from PShape_getChild.xml )
2001
- *
2002
- * Extracts a child shape from a parent shape. Specify the name of the
2003
- * shape with the <b>target</b> parameter. The shape is returned as a
2004
- * <b>PShape</b> object, or <b>null</b> is returned if there is an error.
2005
- *
2006
- * ( end auto-generated )
2007
- * @webref pshape:method
2008
- * @usage web_application
2009
- * @brief Returns a child element of a shape as a PShape object
2010
- * @param index the layer position of the shape to get
2011
- * @see PShape#addChild(PShape)
2012
- */
2013
- public PShape getChild(int index) {
2014
- crop();
2015
- return children[index];
2016
- }
2017
-
2018
- /**
2019
- * @param target the name of the shape to get
2020
- */
2021
- public PShape getChild(String target) {
2022
- if (name != null && name.equals(target)) {
2023
- return this;
2024
- }
2025
- if (nameTable != null) {
2026
- PShape found = nameTable.get(target);
2027
- if (found != null) return found;
2028
- }
2029
- for (int i = 0; i < childCount; i++) {
2030
- PShape found = children[i].getChild(target);
2031
- if (found != null) return found;
2032
- }
2033
- return null;
2034
- }
2035
-
2036
-
2037
- /**
2038
- * Same as getChild(name), except that it first walks all the way up the
2039
- * hierarchy to the eldest grandparent, so that children can be found anywhere.
2040
- * @param target
2041
- * @return
2042
- */
2043
- public PShape findChild(String target) {
2044
- if (parent == null) {
2045
- return getChild(target);
2046
-
2047
- } else {
2048
- return parent.findChild(target);
2049
- }
2050
- }
2051
-
2052
-
2053
- // can't be just 'add' because that suggests additive geometry
2054
- /**
2055
- * @webref pshape:method
2056
- * @brief Adds a new child
2057
- * @param who any variable of type PShape
2058
- * @see PShape#getChild(int)
2059
- */
2060
- public void addChild(PShape who) {
2061
- if (children == null) {
2062
- children = new PShape[1];
2063
- }
2064
- if (childCount == children.length) {
2065
- children = (PShape[]) PApplet.expand(children);
2066
- }
2067
- children[childCount++] = who;
2068
- who.parent = this;
2069
-
2070
- if (who.getName() != null) {
2071
- addName(who.getName(), who);
2072
- }
2073
- }
2074
-
2075
-
2076
- // adds child who exactly at position idx in the array of children.
2077
- /**
2078
- * @param idx the layer position in which to insert the new child
2079
- */
2080
- public void addChild(PShape who, int idx) {
2081
- if (idx < childCount) {
2082
- if (childCount == children.length) {
2083
- children = (PShape[]) PApplet.expand(children);
2084
- }
2085
-
2086
- // Copy [idx, childCount - 1] to [idx + 1, childCount]
2087
- for (int i = childCount - 1; i >= idx; i--) {
2088
- children[i + 1] = children[i];
2089
- }
2090
- childCount++;
2091
-
2092
- children[idx] = who;
2093
-
2094
- who.parent = this;
2095
-
2096
- if (who.getName() != null) {
2097
- addName(who.getName(), who);
2098
- }
2099
- }
2100
- }
2101
-
2102
-
2103
- /**
2104
- * Remove the child shape with index idx.
2105
- * @param idx
2106
- */
2107
- public void removeChild(int idx) {
2108
- if (idx < childCount) {
2109
- PShape child = children[idx];
2110
-
2111
- // Copy [idx + 1, childCount - 1] to [idx, childCount - 2]
2112
- for (int i = idx; i < childCount - 1; i++) {
2113
- children[i] = children[i + 1];
2114
- }
2115
- childCount--;
2116
-
2117
- if (child.getName() != null && nameTable != null) {
2118
- nameTable.remove(child.getName());
2119
- }
2120
- }
2121
- }
2122
-
2123
-
2124
- /**
2125
- * Add a shape to the name lookup table.
2126
- */
2127
- public void addName(String nom, PShape shape) {
2128
- if (parent != null) {
2129
- parent.addName(nom, shape);
2130
- } else {
2131
- if (nameTable == null) {
2132
- nameTable = new HashMap<>();
2133
- }
2134
- nameTable.put(nom, shape);
2135
- }
2136
- }
2137
-
2138
-
2139
- /**
2140
- * Returns the index of child who.
2141
- */
2142
- public int getChildIndex(PShape who) {
2143
- for (int i = 0; i < childCount; i++) {
2144
- if (children[i] == who) {
2145
- return i;
2146
- }
2147
- }
2148
- return -1;
2149
- }
2150
-
2151
-
2152
- public PShape getTessellation() {
2153
- return null;
2154
- }
2155
-
2156
-
2157
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2158
-
2159
-
2160
- /** The shape type, one of GROUP, PRIMITIVE, PATH, or GEOMETRY.
2161
- * @return */
2162
- public int getFamily() {
2163
- return family;
2164
- }
2165
-
2166
-
2167
- public int getKind() {
2168
- return kind;
2169
- }
2170
-
2171
-
2172
- public float[] getParams() {
2173
- return getParams(null);
2174
- }
2175
-
2176
-
2177
- public float[] getParams(float[] target) {
2178
- if (target == null || target.length != params.length) {
2179
- target = new float[params.length];
2180
- }
2181
- PApplet.arrayCopy(params, target);
2182
- return target;
2183
- }
2184
-
2185
-
2186
- public float getParam(int index) {
2187
- return params[index];
2188
- }
2189
-
2190
-
2191
- protected void setParams(float[] source) {
2192
- if (params == null) {
2193
- params = new float[source.length];
2194
- }
2195
- if (source.length != params.length) {
2196
- PGraphics.showWarning("Wrong number of parameters");
2197
- return;
2198
- }
2199
- PApplet.arrayCopy(source, params);
2200
- }
2201
-
2202
-
2203
- public void setPath(int vcount, float[][] verts) {
2204
- setPath(vcount, verts, 0, null);
2205
- }
2206
-
2207
-
2208
- protected void setPath(int vcount, float[][] verts, int ccount, int[] codes) {
2209
- if (verts == null || verts.length < vcount) return;
2210
- if (0 < ccount && (codes == null || codes.length < ccount)) return;
2211
-
2212
- int ndim = verts[0].length;
2213
- vertexCount = vcount;
2214
- vertices = new float[vertexCount][ndim];
2215
- for (int i = 0; i < vertexCount; i++) {
2216
- PApplet.arrayCopy(verts[i], vertices[i]);
2217
- }
2218
-
2219
- vertexCodeCount = ccount;
2220
- if (0 < vertexCodeCount) {
2221
- vertexCodes = new int[vertexCodeCount];
2222
- PApplet.arrayCopy(codes, vertexCodes, vertexCodeCount);
2223
- }
2224
- }
2225
-
2226
- /**
2227
- * @webref pshape:method
2228
- * @brief Returns the total number of vertices as an int
2229
- * @see PShape#getVertex(int)
2230
- * @see PShape#setVertex(int, float, float)
2231
- */
2232
- public int getVertexCount() {
2233
- if (family == GROUP || family == PRIMITIVE) {
2234
- PGraphics.showWarning(NO_VERTICES_ERROR);
2235
- }
2236
- return vertexCount;
2237
- }
2238
-
2239
-
2240
- /**
2241
- * @webref pshape:method
2242
- * @brief Returns the vertex at the index position
2243
- * @param index the location of the vertex
2244
- * @see PShape#setVertex(int, float, float)
2245
- * @see PShape#getVertexCount()
2246
- */
2247
- public PVector getVertex(int index) {
2248
- return getVertex(index, null);
2249
- }
2250
-
2251
-
2252
- /**
2253
- * @param vec PVector to assign the data to
2254
- */
2255
- public PVector getVertex(int index, PVector vec) {
2256
- if (vec == null) {
2257
- vec = new PVector();
2258
- }
2259
- float[] vert = vertices[index];
2260
- vec.x = vert[X];
2261
- vec.y = vert[Y];
2262
- if (vert.length > 2) {
2263
- vec.z = vert[Z];
2264
- } else {
2265
- vec.z = 0; // in case this isn't a new vector
2266
- }
2267
- return vec;
2268
- }
2269
-
2270
-
2271
- public float getVertexX(int index) {
2272
- return vertices[index][X];
2273
- }
2274
-
2275
-
2276
- public float getVertexY(int index) {
2277
- return vertices[index][Y];
2278
- }
2279
-
2280
-
2281
- public float getVertexZ(int index) {
2282
- return vertices[index][Z];
2283
- }
2284
-
2285
-
2286
- /**
2287
- * @webref pshape:method
2288
- * @brief Sets the vertex at the index position
2289
- * @param index the location of the vertex
2290
- * @param x the x value for the vertex
2291
- * @param y the y value for the vertex
2292
- * @see PShape#getVertex(int)
2293
- * @see PShape#getVertexCount()
2294
- */
2295
- public void setVertex(int index, float x, float y) {
2296
- if (openShape) {
2297
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setVertex()");
2298
- return;
2299
- }
2300
-
2301
- vertices[index][X] = x;
2302
- vertices[index][Y] = y;
2303
- }
2304
-
2305
-
2306
- /**
2307
- * @param z the z value for the vertex
2308
- */
2309
- public void setVertex(int index, float x, float y, float z) {
2310
- if (openShape) {
2311
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setVertex()");
2312
- return;
2313
- }
2314
-
2315
- vertices[index][X] = x;
2316
- vertices[index][Y] = y;
2317
- vertices[index][Z] = z;
2318
- }
2319
-
2320
-
2321
- /**
2322
- * @param vec the PVector to define the x, y, z coordinates
2323
- */
2324
- public void setVertex(int index, PVector vec) {
2325
- if (openShape) {
2326
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setVertex()");
2327
- return;
2328
- }
2329
-
2330
- vertices[index][X] = vec.x;
2331
- vertices[index][Y] = vec.y;
2332
-
2333
- if (vertices[index].length > 2) {
2334
- vertices[index][Z] = vec.z;
2335
- } else if (vec.z != 0 && vec.z == vec.z) {
2336
- throw new IllegalArgumentException("Cannot set a z-coordinate on a 2D shape");
2337
- }
2338
- }
2339
-
2340
-
2341
- public PVector getNormal(int index) {
2342
- return getNormal(index, null);
2343
- }
2344
-
2345
-
2346
- public PVector getNormal(int index, PVector vec) {
2347
- if (vec == null) {
2348
- vec = new PVector();
2349
- }
2350
- vec.x = vertices[index][PGraphics.NX];
2351
- vec.y = vertices[index][PGraphics.NY];
2352
- vec.z = vertices[index][PGraphics.NZ];
2353
- return vec;
2354
- }
2355
-
2356
-
2357
- public float getNormalX(int index) {
2358
- return vertices[index][PGraphics.NX];
2359
- }
2360
-
2361
-
2362
- public float getNormalY(int index) {
2363
- return vertices[index][PGraphics.NY];
2364
- }
2365
-
2366
-
2367
- public float getNormalZ(int index) {
2368
- return vertices[index][PGraphics.NZ];
2369
- }
2370
-
2371
-
2372
- public void setNormal(int index, float nx, float ny, float nz) {
2373
- if (openShape) {
2374
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setNormal()");
2375
- return;
2376
- }
2377
-
2378
- vertices[index][PGraphics.NX] = nx;
2379
- vertices[index][PGraphics.NY] = ny;
2380
- vertices[index][PGraphics.NZ] = nz;
2381
- }
2382
-
2383
-
2384
-
2385
- public void setAttrib(String name, int index, float... values) {
2386
- }
2387
-
2388
-
2389
- public void setAttrib(String name, int index, int... values) {
2390
- }
2391
-
2392
-
2393
- public void setAttrib(String name, int index, boolean... values) {
2394
- }
2395
-
2396
-
2397
- public float getTextureU(int index) {
2398
- return vertices[index][PGraphics.U];
2399
- }
2400
-
2401
-
2402
- public float getTextureV(int index) {
2403
- return vertices[index][PGraphics.V];
2404
- }
2405
-
2406
-
2407
- public void setTextureUV(int index, float u, float v) {
2408
- if (openShape) {
2409
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setTextureUV()");
2410
- return;
2411
- }
2412
-
2413
- // make sure we allocated the vertices array and that vertex exists
2414
- if (vertices == null ||
2415
- index >= vertices.length) {
2416
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setTextureUV()");
2417
- return;
2418
- }
2419
-
2420
-
2421
- vertices[index][PGraphics.U] = u;
2422
- vertices[index][PGraphics.V] = v;
2423
- }
2424
-
2425
-
2426
- public void setTextureMode(int mode) {
2427
- if (openShape) {
2428
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setTextureMode()");
2429
- return;
2430
- }
2431
-
2432
- textureMode = mode;
2433
- }
2434
-
2435
-
2436
- public void setTexture(PImage tex) {
2437
- if (openShape) {
2438
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setTexture()");
2439
- return;
2440
- }
2441
-
2442
- image = tex;
2443
- }
2444
-
2445
-
2446
- public int getFill(int index) {
2447
- // make sure we allocated the vertices array and that vertex exists
2448
- if (vertices == null ||
2449
- index >= vertices.length) {
2450
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getFill()");
2451
- return fillColor;
2452
- }
2453
-
2454
- if (image == null) {
2455
- int a = (int) (vertices[index][PGraphics.A] * 255);
2456
- int r = (int) (vertices[index][PGraphics.R] * 255);
2457
- int g = (int) (vertices[index][PGraphics.G] * 255);
2458
- int b = (int) (vertices[index][PGraphics.B] * 255);
2459
- return (a << 24) | (r << 16) | (g << 8) | b;
2460
- } else {
2461
- return 0;
2462
- }
2463
- }
2464
-
2465
- /**
2466
- * @nowebref
2467
- */
2468
- public void setFill(boolean fill) {
2469
- if (openShape) {
2470
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setFill()");
2471
- return;
2472
- }
2473
-
2474
- this.fill = fill;
2475
- }
2476
-
2477
- /**
2478
- * ( begin auto-generated from PShape_setFill.xml )
2479
- *
2480
- * The <b>setFill()</b> method defines the fill color of a <b>PShape</b>.
2481
- * This method is used after shapes are created or when a shape is defined explicitly
2482
- * (e.g. <b>createShape(RECT, 20, 20, 80, 80)</b>) as shown in the above example.
2483
- * When a shape is created with <b>beginShape()</b> and <b>endShape()</b>, its
2484
- * attributes may be changed with <b>fill()</b> and <b>stroke()</b> within
2485
- * <b>beginShape()</b> and <b>endShape()</b>. However, after the shape is
2486
- * created, only the <b>setFill()</b> method can define a new fill value for
2487
- * the <b>PShape</b>.
2488
- *
2489
- * ( end auto-generated )
2490
- *
2491
- * @webref
2492
- * @param fill
2493
- * @brief Set the fill value
2494
- */
2495
- public void setFill(int fill) {
2496
- if (openShape) {
2497
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setFill()");
2498
- return;
2499
- }
2500
-
2501
- this.fillColor = fill;
2502
-
2503
- if (vertices != null && perVertexStyles) {
2504
- for (int i = 0; i < vertexCount; i++) {
2505
- setFill(i, fill);
2506
- }
2507
- }
2508
- }
2509
-
2510
- /**
2511
- * @nowebref
2512
- */
2513
- public void setFill(int index, int fill) {
2514
- if (openShape) {
2515
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setFill()");
2516
- return;
2517
- }
2518
-
2519
- if (!perVertexStyles) {
2520
- PGraphics.showWarning(PER_VERTEX_UNSUPPORTED, "setFill()");
2521
- return;
2522
- }
2523
-
2524
- // make sure we allocated the vertices array and that vertex exists
2525
- if (vertices == null || index >= vertices.length) {
2526
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getFill()");
2527
- return;
2528
- }
2529
-
2530
- if (image == null) {
2531
- vertices[index][PGraphics.A] = ((fill >> 24) & 0xFF) / 255.0f;
2532
- vertices[index][PGraphics.R] = ((fill >> 16) & 0xFF) / 255.0f;
2533
- vertices[index][PGraphics.G] = ((fill >> 8) & 0xFF) / 255.0f;
2534
- vertices[index][PGraphics.B] = ((fill) & 0xFF) / 255.0f;
2535
- }
2536
- }
2537
-
2538
-
2539
- public int getTint(int index) {
2540
- // make sure we allocated the vertices array and that vertex exists
2541
- if (vertices == null || index >= vertices.length) {
2542
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getTint()");
2543
- return this.tintColor;
2544
- }
2545
-
2546
- if (image != null) {
2547
- int a = (int) (vertices[index][PGraphics.A] * 255);
2548
- int r = (int) (vertices[index][PGraphics.R] * 255);
2549
- int g = (int) (vertices[index][PGraphics.G] * 255);
2550
- int b = (int) (vertices[index][PGraphics.B] * 255);
2551
- return (a << 24) | (r << 16) | (g << 8) | b;
2552
- } else {
2553
- return 0;
2554
- }
2555
- }
2556
-
2557
-
2558
- public void setTint(boolean tint) {
2559
- if (openShape) {
2560
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setTint()");
2561
- return;
2562
- }
2563
-
2564
- this.tint = tint;
2565
- }
2566
-
2567
-
2568
- public void setTint(int fill) {
2569
- if (openShape) {
2570
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setTint()");
2571
- return;
2572
- }
2573
-
2574
- tintColor = fill;
2575
-
2576
- if (vertices != null) {
2577
- for (int i = 0; i < vertices.length; i++) {
2578
- setFill(i, fill);
2579
- }
2580
- }
2581
- }
2582
-
2583
-
2584
- public void setTint(int index, int tint) {
2585
- if (openShape) {
2586
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setTint()");
2587
- return;
2588
- }
2589
-
2590
- // make sure we allocated the vertices array and that vertex exists
2591
- if (vertices == null ||
2592
- index >= vertices.length) {
2593
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setTint()");
2594
- return;
2595
- }
2596
-
2597
- if (image != null) {
2598
- vertices[index][PGraphics.A] = ((tint >> 24) & 0xFF) / 255.0f;
2599
- vertices[index][PGraphics.R] = ((tint >> 16) & 0xFF) / 255.0f;
2600
- vertices[index][PGraphics.G] = ((tint >> 8) & 0xFF) / 255.0f;
2601
- vertices[index][PGraphics.B] = ((tint) & 0xFF) / 255.0f;
2602
- }
2603
- }
2604
-
2605
-
2606
- public int getStroke(int index) {
2607
- // make sure we allocated the vertices array and that vertex exists
2608
- if (vertices == null ||
2609
- index >= vertices.length) {
2610
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getStroke()");
2611
- return strokeColor;
2612
- }
2613
-
2614
- int a = (int) (vertices[index][PGraphics.SA] * 255);
2615
- int r = (int) (vertices[index][PGraphics.SR] * 255);
2616
- int g = (int) (vertices[index][PGraphics.SG] * 255);
2617
- int b = (int) (vertices[index][PGraphics.SB] * 255);
2618
- return (a << 24) | (r << 16) | (g << 8) | b;
2619
- }
2620
-
2621
- /**
2622
- * @nowebref
2623
- */
2624
- public void setStroke(boolean stroke) {
2625
- if (openShape) {
2626
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStroke()");
2627
- return;
2628
- }
2629
-
2630
- this.stroke = stroke;
2631
- }
2632
-
2633
- /**
2634
- * ( begin auto-generated from PShape_setStroke.xml )
2635
- *
2636
- * The <b>setStroke()</b> method defines the outline color of a <b>PShape</b>.
2637
- * This method is used after shapes are created or when a shape is defined
2638
- * explicitly (e.g. <b>createShape(RECT, 20, 20, 80, 80)</b>) as shown in
2639
- * the above example. When a shape is created with <b>beginShape()</b> and
2640
- * <b>endShape()</b>, its attributes may be changed with <b>fill()</b> and
2641
- * <b>stroke()</b> within <b>beginShape()</b> and <b>endShape()</b>.
2642
- * However, after the shape is created, only the <b>setStroke()</b> method
2643
- * can define a new stroke value for the <b>PShape</b>.
2644
- *
2645
- * ( end auto-generated )
2646
- *
2647
- * @webref
2648
- * @param stroke
2649
- * @brief Set the stroke value
2650
- */
2651
- public void setStroke(int stroke) {
2652
- if (openShape) {
2653
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStroke()");
2654
- return;
2655
- }
2656
-
2657
- strokeColor = stroke;
2658
-
2659
- if (vertices != null && perVertexStyles) {
2660
- for (int i = 0; i < vertices.length; i++) {
2661
- setStroke(i, stroke);
2662
- }
2663
- }
2664
- }
2665
-
2666
- /**
2667
- * @nowebref
2668
- */
2669
- public void setStroke(int index, int stroke) {
2670
- if (openShape) {
2671
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStroke()");
2672
- return;
2673
- }
2674
-
2675
- if (!perVertexStyles) {
2676
- PGraphics.showWarning(PER_VERTEX_UNSUPPORTED, "setStroke()");
2677
- return;
2678
- }
2679
-
2680
- // make sure we allocated the vertices array and that vertex exists
2681
- if (vertices == null || index >= vertices.length) {
2682
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setStroke()");
2683
- return;
2684
- }
2685
-
2686
- vertices[index][PGraphics.SA] = ((stroke >> 24) & 0xFF) / 255.0f;
2687
- vertices[index][PGraphics.SR] = ((stroke >> 16) & 0xFF) / 255.0f;
2688
- vertices[index][PGraphics.SG] = ((stroke >> 8) & 0xFF) / 255.0f;
2689
- vertices[index][PGraphics.SB] = ((stroke >> 0) & 0xFF) / 255.0f;
2690
- }
2691
-
2692
-
2693
- public float getStrokeWeight(int index) {
2694
- // make sure we allocated the vertices array and that vertex exists
2695
- if (vertices == null || index >= vertices.length) {
2696
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getStrokeWeight()");
2697
- return strokeWeight;
2698
- }
2699
-
2700
- return vertices[index][PGraphics.SW];
2701
- }
2702
-
2703
-
2704
- public void setStrokeWeight(float weight) {
2705
- if (openShape) {
2706
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStrokeWeight()");
2707
- return;
2708
- }
2709
-
2710
- strokeWeight = weight;
2711
-
2712
- if (vertices != null && perVertexStyles) {
2713
- for (int i = 0; i < vertexCount; i++) {
2714
- setStrokeWeight(i, weight);
2715
- }
2716
- }
2717
- }
2718
-
2719
-
2720
- public void setStrokeWeight(int index, float weight) {
2721
- if (openShape) {
2722
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStrokeWeight()");
2723
- return;
2724
- }
2725
-
2726
- if (!perVertexStyles) {
2727
- PGraphics.showWarning(PER_VERTEX_UNSUPPORTED, "setStrokeWeight()");
2728
- return;
2729
- }
2730
-
2731
- // make sure we allocated the vertices array and that vertex exists
2732
- if (vertices == null || index >= vertices.length) {
2733
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setStrokeWeight()");
2734
- return;
2735
- }
2736
-
2737
- vertices[index][PGraphics.SW] = weight;
2738
- }
2739
-
2740
-
2741
- public void setStrokeJoin(int join) {
2742
- if (openShape) {
2743
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStrokeJoin()");
2744
- return;
2745
- }
2746
-
2747
- strokeJoin = join;
2748
- }
2749
-
2750
-
2751
- public void setStrokeCap(int cap) {
2752
- if (openShape) {
2753
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setStrokeCap()");
2754
- return;
2755
- }
2756
-
2757
- strokeCap = cap;
2758
- }
2759
-
2760
-
2761
- public int getAmbient(int index) {
2762
- // make sure we allocated the vertices array and that vertex exists
2763
- if (vertices == null || index >= vertices.length) {
2764
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getAmbient()");
2765
- return ambientColor;
2766
- }
2767
-
2768
- int r = (int) (vertices[index][PGraphics.AR] * 255);
2769
- int g = (int) (vertices[index][PGraphics.AG] * 255);
2770
- int b = (int) (vertices[index][PGraphics.AB] * 255);
2771
- return 0xff000000 | (r << 16) | (g << 8) | b;
2772
- }
2773
-
2774
-
2775
- public void setAmbient(int ambient) {
2776
- if (openShape) {
2777
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setAmbient()");
2778
- return;
2779
- }
2780
-
2781
- ambientColor = ambient;
2782
-
2783
- if (vertices != null) {
2784
- for (int i = 0; i < vertices.length; i++) {
2785
- setAmbient(i, ambient);
2786
- }
2787
- }
2788
- }
2789
-
2790
-
2791
- public void setAmbient(int index, int ambient) {
2792
- if (openShape) {
2793
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setAmbient()");
2794
- return;
2795
- }
2796
-
2797
- // make sure we allocated the vertices array and that vertex exists
2798
- if (vertices == null || index >= vertices.length) {
2799
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setAmbient()");
2800
- return;
2801
- }
2802
-
2803
- vertices[index][PGraphics.AR] = ((ambient >> 16) & 0xFF) / 255.0f;
2804
- vertices[index][PGraphics.AG] = ((ambient >> 8) & 0xFF) / 255.0f;
2805
- vertices[index][PGraphics.AB] = ((ambient >> 0) & 0xFF) / 255.0f;
2806
- }
2807
-
2808
-
2809
- public int getSpecular(int index) {
2810
- // make sure we allocated the vertices array and that vertex exists
2811
- if (vertices == null || index >= vertices.length) {
2812
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getSpecular()");
2813
- return specularColor;
2814
- }
2815
-
2816
- int r = (int) (vertices[index][PGraphics.SPR] * 255);
2817
- int g = (int) (vertices[index][PGraphics.SPG] * 255);
2818
- int b = (int) (vertices[index][PGraphics.SPB] * 255);
2819
- return 0xff000000 | (r << 16) | (g << 8) | b;
2820
- }
2821
-
2822
-
2823
- public void setSpecular(int specular) {
2824
- if (openShape) {
2825
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setSpecular()");
2826
- return;
2827
- }
2828
-
2829
- specularColor = specular;
2830
-
2831
- if (vertices != null) {
2832
- for (int i = 0; i < vertices.length; i++) {
2833
- setSpecular(i, specular);
2834
- }
2835
- }
2836
- }
2837
-
2838
-
2839
- public void setSpecular(int index, int specular) {
2840
- if (openShape) {
2841
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setSpecular()");
2842
- return;
2843
- }
2844
-
2845
- // make sure we allocated the vertices array and that vertex exists
2846
- if (vertices == null || index >= vertices.length) {
2847
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setSpecular()");
2848
- return;
2849
- }
2850
-
2851
- vertices[index][PGraphics.SPR] = ((specular >> 16) & 0xFF) / 255.0f;
2852
- vertices[index][PGraphics.SPG] = ((specular >> 8) & 0xFF) / 255.0f;
2853
- vertices[index][PGraphics.SPB] = ((specular >> 0) & 0xFF) / 255.0f;
2854
- }
2855
-
2856
-
2857
- public int getEmissive(int index) {
2858
- // make sure we allocated the vertices array and that vertex exists
2859
- if (vertices == null || index >= vertices.length) {
2860
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getEmissive()");
2861
- return emissiveColor;
2862
- }
2863
-
2864
- int r = (int) (vertices[index][PGraphics.ER] * 255);
2865
- int g = (int) (vertices[index][PGraphics.EG] * 255);
2866
- int b = (int) (vertices[index][PGraphics.EB] * 255);
2867
- return 0xff000000 | (r << 16) | (g << 8) | b;
2868
- }
2869
-
2870
-
2871
- public void setEmissive(int emissive) {
2872
- if (openShape) {
2873
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setEmissive()");
2874
- return;
2875
- }
2876
-
2877
- emissiveColor = emissive;
2878
-
2879
- if (vertices != null) {
2880
- for (int i = 0; i < vertices.length; i++) {
2881
- setEmissive(i, emissive);
2882
- }
2883
- }
2884
- }
2885
-
2886
-
2887
- public void setEmissive(int index, int emissive) {
2888
- if (openShape) {
2889
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setEmissive()");
2890
- return;
2891
- }
2892
-
2893
- // make sure we allocated the vertices array and that vertex exists
2894
- if (vertices == null ||
2895
- index >= vertices.length) {
2896
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setEmissive()");
2897
- return;
2898
- }
2899
-
2900
- vertices[index][PGraphics.ER] = ((emissive >> 16) & 0xFF) / 255.0f;
2901
- vertices[index][PGraphics.EG] = ((emissive >> 8) & 0xFF) / 255.0f;
2902
- vertices[index][PGraphics.EB] = ((emissive >> 0) & 0xFF) / 255.0f;
2903
- }
2904
-
2905
-
2906
- public float getShininess(int index) {
2907
- // make sure we allocated the vertices array and that vertex exists
2908
- if (vertices == null ||
2909
- index >= vertices.length) {
2910
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "getShininess()");
2911
- return shininess;
2912
- }
2913
-
2914
- return vertices[index][PGraphics.SHINE];
2915
- }
2916
-
2917
-
2918
- public void setShininess(float shine) {
2919
- if (openShape) {
2920
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setShininess()");
2921
- return;
2922
- }
2923
-
2924
- shininess = shine;
2925
-
2926
- if (vertices != null) {
2927
- for (int i = 0; i < vertices.length; i++) {
2928
- setShininess(i, shine);
2929
- }
2930
- }
2931
- }
2932
-
2933
-
2934
- public void setShininess(int index, float shine) {
2935
- if (openShape) {
2936
- PGraphics.showWarning(INSIDE_BEGIN_END_ERROR, "setShininess()");
2937
- return;
2938
- }
2939
-
2940
- // make sure we allocated the vertices array and that vertex exists
2941
- if (vertices == null ||
2942
- index >= vertices.length) {
2943
- PGraphics.showWarning(NO_SUCH_VERTEX_ERROR + " (" + index + ")", "setShininess()");
2944
- return;
2945
- }
2946
-
2947
-
2948
- vertices[index][PGraphics.SHINE] = shine;
2949
- }
2950
-
2951
-
2952
- public int[] getVertexCodes() {
2953
- if (vertexCodes == null) {
2954
- return null;
2955
- }
2956
- if (vertexCodes.length != vertexCodeCount) {
2957
- vertexCodes = PApplet.subset(vertexCodes, 0, vertexCodeCount);
2958
- }
2959
- return vertexCodes;
2960
- }
2961
-
2962
-
2963
- public int getVertexCodeCount() {
2964
- return vertexCodeCount;
2965
- }
2966
-
2967
-
2968
- /**
2969
- * One of VERTEX, BEZIER_VERTEX, CURVE_VERTEX, or BREAK.
2970
- */
2971
- public int getVertexCode(int index) {
2972
- return vertexCodes[index];
2973
- }
2974
-
2975
-
2976
- public boolean isClosed() {
2977
- return close;
2978
- }
2979
-
2980
-
2981
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2982
-
2983
-
2984
- /**
2985
- * Return true if this x, y coordinate is part of this shape. Only works
2986
- * with PATH shapes or GROUP shapes that contain other GROUPs or PATHs.
2987
- */
2988
- public boolean contains(float x, float y) {
2989
- if (family == PATH) {
2990
- PVector p = new PVector(x, y);
2991
- if (matrix != null) {
2992
- // apply the inverse transformation matrix to the point coordinates
2993
- PMatrix inverseCoords = matrix.get();
2994
- // TODO why is this called twice? [fry 190724]
2995
- // commit was https://github.com/processing/processing/commit/027fc7a4f8e8d0a435366eae754304eea282512a
2996
- inverseCoords.invert(); // maybe cache this?
2997
- inverseCoords.invert(); // maybe cache this?
2998
- inverseCoords.mult(new PVector(x, y), p);
2999
- }
3000
-
3001
- // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
3002
- boolean c = false;
3003
- for (int i = 0, j = vertexCount-1; i < vertexCount; j = i++) {
3004
- if (((vertices[i][Y] > p.y) != (vertices[j][Y] > p.y)) &&
3005
- (p.x <
3006
- (vertices[j][X]-vertices[i][X]) *
3007
- (y-vertices[i][Y]) /
3008
- (vertices[j][1]-vertices[i][Y]) +
3009
- vertices[i][X])) {
3010
- c = !c;
3011
- }
3012
- }
3013
- return c;
3014
-
3015
- } else if (family == GROUP) {
3016
- // If this is a group, loop through children until we find one that
3017
- // contains the supplied coordinates. If a child does not support
3018
- // contains() throw a warning and continue.
3019
- for (int i = 0; i < childCount; i++) {
3020
- if (children[i].contains(x, y)) return true;
3021
- }
3022
- return false;
3023
-
3024
- } else {
3025
- // https://github.com/processing/processing/issues/1280
3026
- throw new IllegalArgumentException("The contains() method is only implemented for paths.");
3027
- }
3028
- }
3029
-
3030
-
3031
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3032
-
3033
-
3034
- // translate, rotate, scale, apply (no push/pop)
3035
- // these each call matrix.translate, etc
3036
- // if matrix is null when one is called,
3037
- // it is created and set to identity
3038
-
3039
-
3040
- /**
3041
- * ( begin auto-generated from PShape_translate.xml )
3042
- *
3043
- * Specifies an amount to displace the shape. The <b>x</b> parameter
3044
- * specifies left/right translation, the <b>y</b> parameter specifies
3045
- * up/down translation, and the <b>z</b> parameter specifies translations
3046
- * toward/away from the screen. Subsequent calls to the method accumulates
3047
- * the effect. For example, calling <b>translate(50, 0)</b> and then
3048
- * <b>translate(20, 0)</b> is the same as <b>translate(70, 0)</b>. This
3049
- * transformation is applied directly to the shape, it's not refreshed each
3050
- * time <b>draw()</b> is run.
3051
- *
3052
- * Using this method with the <b>z</b> parameter requires using the P3D
3053
- * parameter in combination with size.
3054
- *
3055
- * ( end auto-generated )
3056
- * @webref pshape:method
3057
- * @usage web_application
3058
- * @brief Displaces the shape
3059
- * @param x left/right translation
3060
- * @param y up/down translation
3061
- * @see PShape#rotate(float)
3062
- * @see PShape#scale(float)
3063
- * @see PShape#resetMatrix()
3064
- */
3065
- public void translate(float x, float y) {
3066
- checkMatrix(2);
3067
- matrix.translate(x, y);
3068
- }
3069
-
3070
- /**
3071
- * @param z forward/back translation
3072
- */
3073
- public void translate(float x, float y, float z) {
3074
- checkMatrix(3);
3075
- matrix.translate(x, y, z);
3076
- }
3077
-
3078
- /**
3079
- * ( begin auto-generated from PShape_rotateX.xml )
3080
- *
3081
- * Rotates a shape around the x-axis the amount specified by the
3082
- * <b>angle</b> parameter. Angles should be specified in radians (values
3083
- * from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
3084
- *
3085
- * Shapes are always rotated around the upper-left corner of their bounding
3086
- * box. Positive numbers rotate objects in a clockwise direction.
3087
- * Subsequent calls to the method accumulates the effect. For example,
3088
- * calling <b>rotateX(HALF_PI)</b> and then <b>rotateX(HALF_PI)</b> is the
3089
- * same as <b>rotateX(PI)</b>. This transformation is applied directly to
3090
- * the shape, it's not refreshed each time <b>draw()</b> is run.
3091
- *
3092
- * This method requires a 3D renderer. You need to use P3D as a third
3093
- * parameter for the <b>size()</b> function as shown in the example above.
3094
- *
3095
- * ( end auto-generated )
3096
- * @webref pshape:method
3097
- * @usage web_application
3098
- * @brief Rotates the shape around the x-axis
3099
- * @param angle angle of rotation specified in radians
3100
- * @see PShape#rotate(float)
3101
- * @see PShape#rotateY(float)
3102
- * @see PShape#rotateZ(float)
3103
- * @see PShape#scale(float)
3104
- * @see PShape#translate(float, float)
3105
- * @see PShape#resetMatrix()
3106
- */
3107
- public void rotateX(float angle) {
3108
- rotate(angle, 1, 0, 0);
3109
- }
3110
-
3111
- /**
3112
- * ( begin auto-generated from PShape_rotateY.xml )
3113
- *
3114
- * Rotates a shape around the y-axis the amount specified by the
3115
- * <b>angle</b> parameter. Angles should be specified in radians (values
3116
- * from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
3117
- *
3118
- * Shapes are always rotated around the upper-left corner of their bounding
3119
- * box. Positive numbers rotate objects in a clockwise direction.
3120
- * Subsequent calls to the method accumulates the effect. For example,
3121
- * calling <b>rotateY(HALF_PI)</b> and then <b>rotateY(HALF_PI)</b> is the
3122
- * same as <b>rotateY(PI)</b>. This transformation is applied directly to
3123
- * the shape, it's not refreshed each time <b>draw()</b> is run.
3124
- *
3125
- * This method requires a 3D renderer. You need to use P3D as a third
3126
- * parameter for the <b>size()</b> function as shown in the example above.
3127
- *
3128
- * ( end auto-generated )
3129
- *
3130
- * @webref pshape:method
3131
- * @usage web_application
3132
- * @brief Rotates the shape around the y-axis
3133
- * @param angle angle of rotation specified in radians
3134
- * @see PShape#rotate(float)
3135
- * @see PShape#rotateX(float)
3136
- * @see PShape#rotateZ(float)
3137
- * @see PShape#scale(float)
3138
- * @see PShape#translate(float, float)
3139
- * @see PShape#resetMatrix()
3140
- */
3141
- public void rotateY(float angle) {
3142
- rotate(angle, 0, 1, 0);
3143
- }
3144
-
3145
-
3146
- /**
3147
- * ( begin auto-generated from PShape_rotateZ.xml )
3148
- *
3149
- * Rotates a shape around the z-axis the amount specified by the
3150
- * <b>angle</b> parameter. Angles should be specified in radians (values
3151
- * from 0 to TWO_PI) or converted to radians with the <b>radians()</b> method.
3152
- *
3153
- * Shapes are always rotated around the upper-left corner of their bounding
3154
- * box. Positive numbers rotate objects in a clockwise direction.
3155
- * Subsequent calls to the method accumulates the effect. For example,
3156
- * calling <b>rotateZ(HALF_PI)</b> and then <b>rotateZ(HALF_PI)</b> is the
3157
- * same as <b>rotateZ(PI)</b>. This transformation is applied directly to
3158
- * the shape, it's not refreshed each time <b>draw()</b> is run.
3159
- *
3160
- * This method requires a 3D renderer. You need to use P3D as a third
3161
- * parameter for the <b>size()</b> function as shown in the example above.
3162
- *
3163
- * ( end auto-generated )
3164
- * @webref pshape:method
3165
- * @usage web_application
3166
- * @brief Rotates the shape around the z-axis
3167
- * @param angle angle of rotation specified in radians
3168
- * @see PShape#rotate(float)
3169
- * @see PShape#rotateX(float)
3170
- * @see PShape#rotateY(float)
3171
- * @see PShape#scale(float)
3172
- * @see PShape#translate(float, float)
3173
- * @see PShape#resetMatrix()
3174
- */
3175
- public void rotateZ(float angle) {
3176
- rotate(angle, 0, 0, 1);
3177
- }
3178
-
3179
- /**
3180
- * ( begin auto-generated from PShape_rotate.xml )
3181
- *
3182
- * Rotates a shape the amount specified by the <b>angle</b> parameter.
3183
- * Angles should be specified in radians (values from 0 to TWO_PI) or
3184
- * converted to radians with the <b>radians()</b> method.
3185
- *
3186
- * Shapes are always rotated around the upper-left corner of their bounding
3187
- * box. Positive numbers rotate objects in a clockwise direction.
3188
- * Transformations apply to everything that happens after and subsequent
3189
- * calls to the method accumulates the effect. For example, calling
3190
- * <b>rotate(HALF_PI)</b> and then <b>rotate(HALF_PI)</b> is the same as
3191
- * <b>rotate(PI)</b>. This transformation is applied directly to the shape,
3192
- * it's not refreshed each time <b>draw()</b> is run.
3193
- *
3194
- * ( end auto-generated )
3195
- * @webref pshape:method
3196
- * @usage web_application
3197
- * @brief Rotates the shape
3198
- * @param angle angle of rotation specified in radians
3199
- * @see PShape#rotateX(float)
3200
- * @see PShape#rotateY(float)
3201
- * @see PShape#rotateZ(float)
3202
- * @see PShape#scale(float)
3203
- * @see PShape#translate(float, float)
3204
- * @see PShape#resetMatrix()
3205
- */
3206
- public void rotate(float angle) {
3207
- checkMatrix(2); // at least 2...
3208
- matrix.rotate(angle);
3209
- }
3210
-
3211
- /**
3212
- * @nowebref
3213
- */
3214
- public void rotate(float angle, float v0, float v1, float v2) {
3215
- checkMatrix(3);
3216
- float norm2 = v0 * v0 + v1 * v1 + v2 * v2;
3217
- if (Math.abs(norm2 - 1) > EPSILON) {
3218
- // The rotation vector is not normalized.
3219
- float norm = PApplet.sqrt(norm2);
3220
- v0 /= norm;
3221
- v1 /= norm;
3222
- v2 /= norm;
3223
- }
3224
- matrix.rotate(angle, v0, v1, v2);
3225
- }
3226
-
3227
-
3228
- //
3229
-
3230
- /**
3231
- * ( begin auto-generated from PShape_scale.xml )
3232
- *
3233
- * Increases or decreases the size of a shape by expanding and contracting
3234
- * vertices. Shapes always scale from the relative origin of their bounding
3235
- * box. Scale values are specified as decimal percentages. For example, the
3236
- * method call <b>scale(2.0)</b> increases the dimension of a shape by
3237
- * 200%. Subsequent calls to the method multiply the effect. For example,
3238
- * calling <b>scale(2.0)</b> and then <b>scale(1.5)</b> is the same as
3239
- * <b>scale(3.0)</b>. This transformation is applied directly to the shape,
3240
- * it's not refreshed each time <b>draw()</b> is run.
3241
- *
3242
- * Using this method with the <b>z</b> parameter requires using the P3D
3243
- * parameter in combination with size.
3244
- *
3245
- * ( end auto-generated )
3246
- * @webref pshape:method
3247
- * @usage web_application
3248
- * @brief Increases and decreases the size of a shape
3249
- * @param s percentate to scale the object
3250
- * @see PShape#rotate(float)
3251
- * @see PShape#translate(float, float)
3252
- * @see PShape#resetMatrix()
3253
- */
3254
- public void scale(float s) {
3255
- checkMatrix(2); // at least 2...
3256
- matrix.scale(s);
3257
- }
3258
-
3259
-
3260
- public void scale(float x, float y) {
3261
- checkMatrix(2);
3262
- matrix.scale(x, y);
3263
- }
3264
-
3265
- /**
3266
- * @param x percentage to scale the object in the x-axis
3267
- * @param y percentage to scale the object in the y-axis
3268
- * @param z percentage to scale the object in the z-axis
3269
- */
3270
- public void scale(float x, float y, float z) {
3271
- checkMatrix(3);
3272
- matrix.scale(x, y, z);
3273
- }
3274
-
3275
-
3276
- //
3277
-
3278
- /**
3279
- * ( begin auto-generated from PShape_resetMatrix.xml )
3280
- *
3281
- * Replaces the current matrix of a shape with the identity matrix. The
3282
- * equivalent function in OpenGL is glLoadIdentity().
3283
- *
3284
- * ( end auto-generated )
3285
- * @webref pshape:method
3286
- * @brief Replaces the current matrix of a shape with the identity matrix
3287
- * @usage web_application
3288
- * @see PShape#rotate(float)
3289
- * @see PShape#scale(float)
3290
- * @see PShape#translate(float, float)
3291
- */
3292
- public void resetMatrix() {
3293
- checkMatrix(2);
3294
- matrix.reset();
3295
- }
3296
-
3297
-
3298
- public void applyMatrix(PMatrix source) {
3299
- if (source instanceof PMatrix2D) {
3300
- applyMatrix((PMatrix2D) source);
3301
- } else if (source instanceof PMatrix3D) {
3302
- applyMatrix((PMatrix3D) source);
3303
- }
3304
- }
3305
-
3306
-
3307
- public void applyMatrix(PMatrix2D source) {
3308
- applyMatrix(source.m00, source.m01, 0, source.m02,
3309
- source.m10, source.m11, 0, source.m12,
3310
- 0, 0, 1, 0,
3311
- 0, 0, 0, 1);
3312
- }
3313
-
3314
-
3315
- public void applyMatrix(float n00, float n01, float n02,
3316
- float n10, float n11, float n12) {
3317
- checkMatrix(2);
3318
- matrix.apply(n00, n01, n02,
3319
- n10, n11, n12);
3320
- }
3321
-
3322
-
3323
- public void applyMatrix(PMatrix3D source) {
3324
- applyMatrix(source.m00, source.m01, source.m02, source.m03,
3325
- source.m10, source.m11, source.m12, source.m13,
3326
- source.m20, source.m21, source.m22, source.m23,
3327
- source.m30, source.m31, source.m32, source.m33);
3328
- }
3329
-
3330
-
3331
- public void applyMatrix(float n00, float n01, float n02, float n03,
3332
- float n10, float n11, float n12, float n13,
3333
- float n20, float n21, float n22, float n23,
3334
- float n30, float n31, float n32, float n33) {
3335
- checkMatrix(3);
3336
- matrix.apply(n00, n01, n02, n03,
3337
- n10, n11, n12, n13,
3338
- n20, n21, n22, n23,
3339
- n30, n31, n32, n33);
3340
- }
3341
-
3342
-
3343
- //
3344
-
3345
-
3346
- /**
3347
- * Make sure that the shape's matrix is 1) not null, and 2) has a matrix
3348
- * that can handle <em>at least</em> the specified number of dimensions.
3349
- */
3350
- protected void checkMatrix(int dimensions) {
3351
- if (matrix == null) {
3352
- if (dimensions == 2) {
3353
- matrix = new PMatrix2D();
3354
- } else {
3355
- matrix = new PMatrix3D();
3356
- }
3357
- } else if (dimensions == 3 && (matrix instanceof PMatrix2D)) {
3358
- // time for an upgrayedd for a double dose of my pimpin'
3359
- matrix = new PMatrix3D(matrix);
3360
- }
3361
- }
3362
-
3363
-
3364
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3365
-
3366
-
3367
- /**
3368
- * Center the shape based on its bounding box. Can't assume
3369
- * that the bounding box is 0, 0, width, height. Common case will be
3370
- * opening a letter size document in Illustrator, and drawing something
3371
- * in the middle, then reading it in as an svg file.
3372
- * This will also need to flip the y axis (scale(1, -1)) in cases
3373
- * like Adobe Illustrator where the coordinates start at the bottom.
3374
- */
3375
- // public void center() {
3376
- // }
3377
-
3378
-
3379
- /**
3380
- * Set the pivot point for all transformations.
3381
- */
3382
- // public void pivot(float x, float y) {
3383
- // px = x;
3384
- // py = y;
3385
- // }
3386
-
3387
-
3388
- // . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3389
-
3390
-
3391
- public void colorMode(int mode) {
3392
- colorMode(mode, colorModeX, colorModeY, colorModeZ, colorModeA);
3393
- }
3394
-
3395
- /**
3396
- * @param max range for all color elements
3397
- */
3398
- public void colorMode(int mode, float max) {
3399
- colorMode(mode, max, max, max, max);
3400
- }
3401
-
3402
-
3403
- /**
3404
- * @param maxX range for the red or hue depending on the current color mode
3405
- * @param maxY range for the green or saturation depending on the current color mode
3406
- * @param maxZ range for the blue or brightness depending on the current color mode
3407
- */
3408
- public void colorMode(int mode, float maxX, float maxY, float maxZ) {
3409
- colorMode(mode, maxX, maxY, maxZ, colorModeA);
3410
- }
3411
-
3412
- /**
3413
- * @param maxA range for the alpha
3414
- */
3415
- public void colorMode(int mode,
3416
- float maxX, float maxY, float maxZ, float maxA) {
3417
- colorMode = mode;
3418
-
3419
- colorModeX = maxX; // still needs to be set for hsb
3420
- colorModeY = maxY;
3421
- colorModeZ = maxZ;
3422
- colorModeA = maxA;
3423
-
3424
- // if color max values are all 1, then no need to scale
3425
- colorModeScale =
3426
- ((maxA != 1) || (maxX != maxY) || (maxY != maxZ) || (maxZ != maxA));
3427
-
3428
- // if color is rgb/0..255 this will make it easier for the
3429
- // red() green() etc functions
3430
- colorModeDefault = (colorMode == RGB) &&
3431
- (colorModeA == 255) && (colorModeX == 255) &&
3432
- (colorModeY == 255) && (colorModeZ == 255);
3433
- }
3434
-
3435
-
3436
- protected void colorCalc(int rgb) {
3437
- if (((rgb & 0xff000000) == 0) && (rgb <= colorModeX)) {
3438
- colorCalc((float) rgb);
3439
-
3440
- } else {
3441
- colorCalcARGB(rgb, colorModeA);
3442
- }
3443
- }
3444
-
3445
-
3446
- protected void colorCalc(int rgb, float alpha) {
3447
- if (((rgb & 0xff000000) == 0) && (rgb <= colorModeX)) { // see above
3448
- colorCalc((float) rgb, alpha);
3449
-
3450
- } else {
3451
- colorCalcARGB(rgb, alpha);
3452
- }
3453
- }
3454
-
3455
-
3456
- protected void colorCalc(float gray) {
3457
- colorCalc(gray, colorModeA);
3458
- }
3459
-
3460
-
3461
- protected void colorCalc(float gray, float alpha) {
3462
- if (gray > colorModeX) gray = colorModeX;
3463
- if (alpha > colorModeA) alpha = colorModeA;
3464
-
3465
- if (gray < 0) gray = 0;
3466
- if (alpha < 0) alpha = 0;
3467
-
3468
- calcR = colorModeScale ? (gray / colorModeX) : gray;
3469
- calcG = calcR;
3470
- calcB = calcR;
3471
- calcA = colorModeScale ? (alpha / colorModeA) : alpha;
3472
-
3473
- calcRi = (int)(calcR*255); calcGi = (int)(calcG*255);
3474
- calcBi = (int)(calcB*255); calcAi = (int)(calcA*255);
3475
- calcColor = (calcAi << 24) | (calcRi << 16) | (calcGi << 8) | calcBi;
3476
- calcAlpha = (calcAi != 255);
3477
- }
3478
-
3479
-
3480
- protected void colorCalc(float x, float y, float z) {
3481
- colorCalc(x, y, z, colorModeA);
3482
- }
3483
-
3484
-
3485
- protected void colorCalc(float x, float y, float z, float a) {
3486
- if (x > colorModeX) x = colorModeX;
3487
- if (y > colorModeY) y = colorModeY;
3488
- if (z > colorModeZ) z = colorModeZ;
3489
- if (a > colorModeA) a = colorModeA;
3490
-
3491
- if (x < 0) x = 0;
3492
- if (y < 0) y = 0;
3493
- if (z < 0) z = 0;
3494
- if (a < 0) a = 0;
3495
-
3496
- switch (colorMode) {
3497
- case RGB:
3498
- if (colorModeScale) {
3499
- calcR = x / colorModeX;
3500
- calcG = y / colorModeY;
3501
- calcB = z / colorModeZ;
3502
- calcA = a / colorModeA;
3503
- } else {
3504
- calcR = x; calcG = y; calcB = z; calcA = a;
3505
- }
3506
- break;
3507
-
3508
- case HSB:
3509
- x /= colorModeX; // h
3510
- y /= colorModeY; // s
3511
- z /= colorModeZ; // b
3512
-
3513
- calcA = colorModeScale ? (a/colorModeA) : a;
3514
-
3515
- if (y == 0) { // saturation == 0
3516
- calcR = calcG = calcB = z;
3517
-
3518
- } else {
3519
- float which = (x - (int)x) * 6.0f;
3520
- float f = which - (int)which;
3521
- float p = z * (1.0f - y);
3522
- float q = z * (1.0f - y * f);
3523
- float t = z * (1.0f - (y * (1.0f - f)));
3524
-
3525
- switch ((int)which) {
3526
- case 0: calcR = z; calcG = t; calcB = p; break;
3527
- case 1: calcR = q; calcG = z; calcB = p; break;
3528
- case 2: calcR = p; calcG = z; calcB = t; break;
3529
- case 3: calcR = p; calcG = q; calcB = z; break;
3530
- case 4: calcR = t; calcG = p; calcB = z; break;
3531
- case 5: calcR = z; calcG = p; calcB = q; break;
3532
- }
3533
- }
3534
- break;
3535
- }
3536
- calcRi = (int)(255*calcR); calcGi = (int)(255*calcG);
3537
- calcBi = (int)(255*calcB); calcAi = (int)(255*calcA);
3538
- calcColor = (calcAi << 24) | (calcRi << 16) | (calcGi << 8) | calcBi;
3539
- calcAlpha = (calcAi != 255);
3540
- }
3541
-
3542
-
3543
- protected void colorCalcARGB(int argb, float alpha) {
3544
- if (alpha == colorModeA) {
3545
- calcAi = (argb >> 24) & 0xff;
3546
- calcColor = argb;
3547
- } else {
3548
- calcAi = (int) (((argb >> 24) & 0xff) * (alpha / colorModeA));
3549
- calcColor = (calcAi << 24) | (argb & 0xFFFFFF);
3550
- }
3551
- calcRi = (argb >> 16) & 0xff;
3552
- calcGi = (argb >> 8) & 0xff;
3553
- calcBi = argb & 0xff;
3554
- calcA = calcAi / 255.0f;
3555
- calcR = calcRi / 255.0f;
3556
- calcG = calcGi / 255.0f;
3557
- calcB = calcBi / 255.0f;
3558
- calcAlpha = (calcAi != 255);
3559
- }
3560
-
3561
- }