propane 2.7.2-java → 2.8.0.pre-java

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