processing 0.5.32 → 0.5.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog.md +49 -1
- data/VERSION +1 -1
- data/lib/processing/all.rb +3 -1
- data/lib/processing/context.rb +232 -16
- data/lib/processing/events.rb +22 -0
- data/lib/processing/font.rb +5 -0
- data/lib/processing/graphics.rb +11 -2
- data/lib/processing/graphics_context.rb +968 -74
- data/lib/processing/image.rb +92 -1
- data/lib/processing/shader.rb +29 -16
- data/lib/processing/shape.rb +268 -12
- data/lib/processing/vector.rb +126 -0
- data/lib/processing/window.rb +98 -58
- data/processing.gemspec +4 -4
- data/test/helper.rb +5 -2
- data/test/p5.rb +1 -1
- data/test/test_font.rb +1 -1
- data/test/test_graphics_context.rb +442 -8
- data/test/test_utility.rb +0 -19
- metadata +12 -11
data/lib/processing/shape.rb
CHANGED
@@ -3,6 +3,8 @@ module Processing
|
|
3
3
|
|
4
4
|
# Shape object.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PShape.html
|
7
|
+
#
|
6
8
|
class Shape
|
7
9
|
|
8
10
|
# @private
|
@@ -18,6 +20,8 @@ module Processing
|
|
18
20
|
#
|
19
21
|
# @return [Numeric] width of shape
|
20
22
|
#
|
23
|
+
# @see https://processing.org/reference/PShape_width.html
|
24
|
+
#
|
21
25
|
def width()
|
22
26
|
polygon = getInternal__ or return 0
|
23
27
|
(@bounds ||= polygon.bounds).width
|
@@ -27,6 +31,8 @@ module Processing
|
|
27
31
|
#
|
28
32
|
# @return [Numeric] height of shape
|
29
33
|
#
|
34
|
+
# @see https://processing.org/reference/PShape_height.html
|
35
|
+
#
|
30
36
|
def height()
|
31
37
|
polygon = getInternal__ or return 0
|
32
38
|
(@bounds ||= polygon.bounds).height
|
@@ -39,6 +45,8 @@ module Processing
|
|
39
45
|
#
|
40
46
|
# @return [Boolean] visible or not
|
41
47
|
#
|
48
|
+
# @see https://processing.org/reference/PShape_isVisible_.html
|
49
|
+
#
|
42
50
|
def isVisible()
|
43
51
|
@visible
|
44
52
|
end
|
@@ -49,11 +57,19 @@ module Processing
|
|
49
57
|
#
|
50
58
|
# @return [nil] nil
|
51
59
|
#
|
60
|
+
# @see https://processing.org/reference/PShape_setVisible_.html
|
61
|
+
#
|
52
62
|
def setVisible(visible)
|
53
63
|
@visible = !!visible
|
54
64
|
nil
|
55
65
|
end
|
56
66
|
|
67
|
+
# Starts shape data definition.
|
68
|
+
#
|
69
|
+
# @return [nil] nil
|
70
|
+
#
|
71
|
+
# @see https://processing.org/reference/PShape_beginShape_.html
|
72
|
+
#
|
57
73
|
def beginShape(type = nil)
|
58
74
|
raise "beginShape() cannot be called twice" if drawingShape__
|
59
75
|
@type = type
|
@@ -67,6 +83,12 @@ module Processing
|
|
67
83
|
nil
|
68
84
|
end
|
69
85
|
|
86
|
+
# Ends shape data definition.
|
87
|
+
#
|
88
|
+
# @return [nil] nil
|
89
|
+
#
|
90
|
+
# @see https://processing.org/reference/PShape_endShape_.html
|
91
|
+
#
|
70
92
|
def endShape(close = nil)
|
71
93
|
raise "endShape() must be called after beginShape()" unless drawingShape__
|
72
94
|
@close = close == GraphicsContext::CLOSE || @contours.size > 0
|
@@ -78,12 +100,24 @@ module Processing
|
|
78
100
|
nil
|
79
101
|
end
|
80
102
|
|
103
|
+
# Starts a new contour definition.
|
104
|
+
#
|
105
|
+
# @return [nil] nil
|
106
|
+
#
|
107
|
+
# @see https://processing.org/reference/PShape_beginContour_.html
|
108
|
+
#
|
81
109
|
def beginContour()
|
82
110
|
raise "beginContour() must be called after beginShape()" unless drawingShape__
|
83
111
|
@contourPoints, @contourColors, @contourTexCoords = [], [], []
|
84
112
|
nil
|
85
113
|
end
|
86
114
|
|
115
|
+
# Ends contour definition.
|
116
|
+
#
|
117
|
+
# @return [nil] nil
|
118
|
+
#
|
119
|
+
# @see https://processing.org/reference/PShape_endContour_.html
|
120
|
+
#
|
87
121
|
def endContour()
|
88
122
|
raise "endContour() must be called after beginContour()" unless drawingContour__
|
89
123
|
@contours << Rays::Polyline.new(
|
@@ -93,6 +127,21 @@ module Processing
|
|
93
127
|
nil
|
94
128
|
end
|
95
129
|
|
130
|
+
# Append vertex for shape polygon.
|
131
|
+
#
|
132
|
+
# @overload vertex(x, y)
|
133
|
+
# @overload vertex(x, y, u, v)
|
134
|
+
#
|
135
|
+
# @param x [Numeric] x position of vertex
|
136
|
+
# @param y [Numeric] y position of vertex
|
137
|
+
# @param u [Numeric] u texture coordinate of vertex
|
138
|
+
# @param v [Numeric] v texture coordinate of vertex
|
139
|
+
#
|
140
|
+
# @return [nil] nil
|
141
|
+
#
|
142
|
+
# @see https://processing.org/reference/vertex_.html
|
143
|
+
# @see https://p5js.org/reference/#/p5/vertex
|
144
|
+
#
|
96
145
|
def vertex(x, y, u = nil, v = nil)
|
97
146
|
raise "vertex() must be called after beginShape()" unless drawingShape__
|
98
147
|
raise "Either 'u' or 'v' is missing" if (u == nil) != (v == nil)
|
@@ -108,8 +157,19 @@ module Processing
|
|
108
157
|
@colors << color
|
109
158
|
@texcoords << u << v
|
110
159
|
end
|
160
|
+
nil
|
111
161
|
end
|
112
162
|
|
163
|
+
# Append curve vertex for shape polygon.
|
164
|
+
#
|
165
|
+
# @param x [Numeric] x position of vertex
|
166
|
+
# @param y [Numeric] y position of vertex
|
167
|
+
#
|
168
|
+
# @return [nil] nil
|
169
|
+
#
|
170
|
+
# @see https://processing.org/reference/curveVertex_.html
|
171
|
+
# @see https://p5js.org/reference/#/p5/curveVertex
|
172
|
+
#
|
113
173
|
def curveVertex(x, y)
|
114
174
|
raise "curveVertex() must be called after beginShape()" unless drawingShape__
|
115
175
|
@curvePoints << x << y
|
@@ -121,6 +181,16 @@ module Processing
|
|
121
181
|
nil
|
122
182
|
end
|
123
183
|
|
184
|
+
# Append bezier vertex for shape polygon.
|
185
|
+
#
|
186
|
+
# @param x [Numeric] x position of vertex
|
187
|
+
# @param y [Numeric] y position of vertex
|
188
|
+
#
|
189
|
+
# @return [nil] nil
|
190
|
+
#
|
191
|
+
# @see https://processing.org/reference/bezierVertex_.html
|
192
|
+
# @see https://p5js.org/reference/#/p5/bezierVertex
|
193
|
+
#
|
124
194
|
def bezierVertex(x2, y2, x3, y3, x4, y4)
|
125
195
|
raise "bezierVertex() must be called after beginShape()" unless drawingShape__
|
126
196
|
x1, y1 = @points[-2, 2]
|
@@ -131,6 +201,16 @@ module Processing
|
|
131
201
|
nil
|
132
202
|
end
|
133
203
|
|
204
|
+
# Append quadratic vertex for shape polygon.
|
205
|
+
#
|
206
|
+
# @param x [Numeric] x position of vertex
|
207
|
+
# @param y [Numeric] y position of vertex
|
208
|
+
#
|
209
|
+
# @return [nil] nil
|
210
|
+
#
|
211
|
+
# @see https://processing.org/reference/quadraticVertex_.html
|
212
|
+
# @see https://p5js.org/reference/#/p5/quadraticVertex
|
213
|
+
#
|
134
214
|
def quadraticVertex(cx, cy, x3, y3)
|
135
215
|
x1, y1 = @points[-2, 2]
|
136
216
|
raise "vertex() is required before calling quadraticVertex()" unless x1 && y1
|
@@ -151,15 +231,57 @@ module Processing
|
|
151
231
|
@contourPoints
|
152
232
|
end
|
153
233
|
|
234
|
+
# Sets fill color.
|
235
|
+
#
|
236
|
+
# @overload fill(gray)
|
237
|
+
# @overload fill(gray, alpha)
|
238
|
+
# @overload fill(r, g, b)
|
239
|
+
# @overload fill(r, g, b, alpha)
|
240
|
+
#
|
241
|
+
# @param gray [Integer] gray value (0..255)
|
242
|
+
# @param r [Integer] red value (0..255)
|
243
|
+
# @param g [Integer] green value (0..255)
|
244
|
+
# @param b [Integer] blue value (0..255)
|
245
|
+
# @param alpha [Integer] alpha value (0..255)
|
246
|
+
#
|
247
|
+
# @return [nil] nil
|
248
|
+
#
|
249
|
+
# @see https://processing.org/reference/fill_.html
|
250
|
+
# @see https://p5js.org/reference/#/p5/fill
|
251
|
+
#
|
154
252
|
def fill(*args)
|
155
|
-
@fill = @context.
|
253
|
+
@fill = @context.rawColor__(*args)
|
254
|
+
nil
|
156
255
|
end
|
157
256
|
|
257
|
+
# Sets the vertex at the index position.
|
258
|
+
#
|
259
|
+
# @overload setVertex(index, x, y)
|
260
|
+
# @overload setVertex(index, vec)
|
261
|
+
#
|
262
|
+
# @param index [Integer] the index fo the vertex
|
263
|
+
# @param x [Numeric] x position of the vertex
|
264
|
+
# @param y [Numeric] y position of the vertex
|
265
|
+
# @param vec [Vector] position for the vertex
|
266
|
+
#
|
267
|
+
# @return [nil] nil
|
268
|
+
#
|
269
|
+
# @see https://processing.org/reference/PShape_setVertex_.html
|
270
|
+
#
|
158
271
|
def setVertex(index, point)
|
159
272
|
return nil unless @points && @points[index * 2, 2]&.size == 2
|
160
273
|
@points[index * 2, 2] = [point.x, point.y]
|
274
|
+
nil
|
161
275
|
end
|
162
276
|
|
277
|
+
# Returns the vertex at the index position.
|
278
|
+
#
|
279
|
+
# @param index [Integer] the index fo the vertex
|
280
|
+
#
|
281
|
+
# @return [Vector] the vertex position
|
282
|
+
#
|
283
|
+
# @see https://processing.org/reference/PShape_getVertex_.html
|
284
|
+
#
|
163
285
|
def getVertex(index)
|
164
286
|
return nil unless @points
|
165
287
|
point = @points[index * 2, 2]
|
@@ -167,13 +289,36 @@ module Processing
|
|
167
289
|
@context.createVector(*point)
|
168
290
|
end
|
169
291
|
|
292
|
+
# Returns the total number of vertices.
|
293
|
+
#
|
294
|
+
# @return [Integer] vertex count
|
295
|
+
#
|
296
|
+
# @see https://processing.org/reference/PShape_getVertexCount_.html
|
297
|
+
#
|
170
298
|
def getVertexCount()
|
171
299
|
return 0 unless @points
|
172
300
|
@points.size / 2
|
173
301
|
end
|
174
302
|
|
303
|
+
# Sets the fill color.
|
304
|
+
#
|
305
|
+
# @overload fill(gray)
|
306
|
+
# @overload fill(gray, alpha)
|
307
|
+
# @overload fill(r, g, b)
|
308
|
+
# @overload fill(r, g, b, alpha)
|
309
|
+
#
|
310
|
+
# @param gray [Integer] gray value (0..255)
|
311
|
+
# @param r [Integer] red value (0..255)
|
312
|
+
# @param g [Integer] green value (0..255)
|
313
|
+
# @param b [Integer] blue value (0..255)
|
314
|
+
# @param alpha [Integer] alpha value (0..255)
|
315
|
+
#
|
316
|
+
# @return [nil] nil
|
317
|
+
#
|
318
|
+
# @see https://processing.org/reference/PShape_setFill_.html
|
319
|
+
#
|
175
320
|
def setFill(*args)
|
176
|
-
color = @context.
|
321
|
+
color = @context.rawColor__(*args)
|
177
322
|
count = getVertexCount
|
178
323
|
if count > 0
|
179
324
|
if @colors
|
@@ -187,45 +332,156 @@ module Processing
|
|
187
332
|
polylines.map {|pl| pl.with colors: pl.points.map {color}}
|
188
333
|
end
|
189
334
|
end
|
335
|
+
nil
|
190
336
|
end
|
191
337
|
|
192
|
-
|
338
|
+
# @private
|
339
|
+
def setStroke__()
|
340
|
+
raise NotImplementedError
|
341
|
+
end
|
342
|
+
|
343
|
+
# Adds a new child shape.
|
344
|
+
#
|
345
|
+
# @param child [Shape] child shape
|
346
|
+
# @param index [Integer] insert position
|
347
|
+
#
|
348
|
+
# @return [nil] nil
|
349
|
+
#
|
350
|
+
# @see https://processing.org/reference/PShape_addChild_.html
|
351
|
+
#
|
352
|
+
def addChild(child, index = -1)
|
193
353
|
return unless @children
|
194
|
-
|
354
|
+
if index < 0
|
355
|
+
@children.push child
|
356
|
+
else
|
357
|
+
@children.insert index, child
|
358
|
+
end
|
195
359
|
nil
|
196
360
|
end
|
197
361
|
|
362
|
+
# Returns a child shape at the index position.
|
363
|
+
#
|
364
|
+
# @param index [Integer] child index
|
365
|
+
#
|
366
|
+
# @return [nil] nil
|
367
|
+
#
|
368
|
+
# @see https://processing.org/reference/PShape_getChild_.html
|
369
|
+
#
|
198
370
|
def getChild(index)
|
199
371
|
@children&.[](index)
|
200
372
|
end
|
201
373
|
|
374
|
+
# Returns the number of children.
|
375
|
+
#
|
376
|
+
# @return [Integer] child count
|
377
|
+
#
|
378
|
+
# @see https://processing.org/reference/PShape_getChildCount_.html
|
379
|
+
#
|
202
380
|
def getChildCount()
|
203
381
|
@children&.size || 0
|
204
382
|
end
|
205
383
|
|
384
|
+
# Applies translation matrix to the shape.
|
385
|
+
#
|
386
|
+
# @overload translate(x, y)
|
387
|
+
# @overload translate(x, y, z)
|
388
|
+
#
|
389
|
+
# @param x [Numeric] left/right translation
|
390
|
+
# @param y [Numeric] up/down translation
|
391
|
+
# @param z [Numeric] forward/backward translation
|
392
|
+
#
|
393
|
+
# @return [nil] nil
|
394
|
+
#
|
395
|
+
# @see https://processing.org/reference/PShape_translate_.html
|
396
|
+
#
|
206
397
|
def translate(x, y, z = 0)
|
207
|
-
matrix__.translate x, y, z
|
398
|
+
matrix__.translate! x, y, z
|
399
|
+
nil
|
400
|
+
end
|
401
|
+
|
402
|
+
# Applies scale matrix to the shape.
|
403
|
+
#
|
404
|
+
# @overload scale(s)
|
405
|
+
# @overload scale(x, y)
|
406
|
+
# @overload scale(x, y, z)
|
407
|
+
#
|
408
|
+
# @param s [Numeric] horizontal and vertical scale
|
409
|
+
# @param x [Numeric] horizontal scale
|
410
|
+
# @param y [Numeric] vertical scale
|
411
|
+
# @param z [Numeric] depth scale
|
412
|
+
#
|
413
|
+
# @return [nil] nil
|
414
|
+
#
|
415
|
+
# @see https://processing.org/reference/PShape_scale_.html
|
416
|
+
#
|
417
|
+
def scale(x, y = nil, z = 1)
|
418
|
+
matrix__.scale! x, (y || x), z
|
208
419
|
nil
|
209
420
|
end
|
210
421
|
|
422
|
+
# Applies rotation matrix to the shape.
|
423
|
+
#
|
424
|
+
# @param angle [Numeric] angle for rotation
|
425
|
+
#
|
426
|
+
# @return [nil] nil
|
427
|
+
#
|
428
|
+
# @see https://processing.org/reference/PShape_rotate_.html
|
429
|
+
#
|
211
430
|
def rotate(angle)
|
212
|
-
matrix__.rotate @context.toDegrees__(angle)
|
431
|
+
matrix__.rotate! @context.toDegrees__(angle)
|
432
|
+
nil
|
433
|
+
end
|
434
|
+
|
435
|
+
# Applies rotation around the x-axis to the shape.
|
436
|
+
#
|
437
|
+
# @param angle [Numeric] angle for rotation
|
438
|
+
#
|
439
|
+
# @return [nil] nil
|
440
|
+
#
|
441
|
+
# @see https://processing.org/reference/PShape_rotateX_.html
|
442
|
+
#
|
443
|
+
def rotateX(angle)
|
444
|
+
matrix__.rotate! @context.toDegrees__(angle), 1, 0, 0
|
445
|
+
nil
|
446
|
+
end
|
447
|
+
|
448
|
+
# Applies rotation around the y-axis to the shape.
|
449
|
+
#
|
450
|
+
# @param angle [Numeric] angle for rotation
|
451
|
+
#
|
452
|
+
# @return [nil] nil
|
453
|
+
#
|
454
|
+
# @see https://processing.org/reference/PShape_rotateY_.html
|
455
|
+
#
|
456
|
+
def rotateY(angle)
|
457
|
+
matrix__.rotate! @context.toDegrees__(angle), 0, 1, 0
|
213
458
|
nil
|
214
459
|
end
|
215
460
|
|
216
|
-
|
217
|
-
|
461
|
+
# Applies rotation around the z-axis to the shape.
|
462
|
+
#
|
463
|
+
# @param angle [Numeric] angle for rotation
|
464
|
+
#
|
465
|
+
# @return [nil] nil
|
466
|
+
#
|
467
|
+
# @see https://processing.org/reference/PShape_rotateZ_.html
|
468
|
+
#
|
469
|
+
def rotateZ(angle)
|
470
|
+
matrix__.rotate! @context.toDegrees__(angle), 0, 0, 1
|
218
471
|
nil
|
219
472
|
end
|
220
473
|
|
474
|
+
# Reset the transformation matrix.
|
475
|
+
#
|
476
|
+
# @return [nil] nil
|
477
|
+
#
|
478
|
+
# @see https://processing.org/reference/PShape_resetMatrix_.html
|
479
|
+
#
|
221
480
|
def resetMatrix()
|
222
481
|
@matrix = nil
|
482
|
+
nil
|
223
483
|
end
|
224
484
|
|
225
|
-
def rotateX = nil
|
226
|
-
def rotateY = nil
|
227
|
-
def rotateZ = nil
|
228
|
-
|
229
485
|
# @private
|
230
486
|
def clearCache__()
|
231
487
|
@polygon = nil# clear cache
|