processing 0.5.30 → 0.5.31
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/.github/workflows/test-draw.yml +0 -1
- data/.github/workflows/test.yml +0 -1
- data/ChangeLog.md +11 -0
- data/Rakefile +14 -6
- data/VERSION +1 -1
- data/lib/processing/all.rb +1 -0
- data/lib/processing/graphics_context.rb +240 -16
- data/lib/processing/shape.rb +183 -0
- data/lib/processing/vector.rb +3 -3
- data/processing.gemspec +4 -4
- data/test/helper.rb +86 -3
- data/test/{draw/p5.rb → p5.rb} +17 -4
- data/test/test_graphics.rb +1 -7
- data/test/test_graphics_context.rb +451 -5
- data/test/test_shape.rb +387 -0
- data/test/test_vector.rb +1 -1
- metadata +15 -16
- data/test/draw/helper.rb +0 -31
- data/test/draw/test_draw.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f74daae97a7e307834facbc6eb147a08dbdc731afdb738674161db47eccd04ef
|
4
|
+
data.tar.gz: 41324b1b967f4e3e5c11392ecf1a36beb82f9bbd4a2bb97dbc6d297b572bbe16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dace99fcdae4a94a38942d40327fe0e27251e4ea0cb5ba1c1b19683c45a92690124449b61fd47980389730350e8ccda180076e29cf99678a03a2a8408d0be03e
|
7
|
+
data.tar.gz: a60cd201501e210f71ef6c163e0493877e6aed90ecae82c344d6f3e62238fa6091e3d1a17755098a3b7722b56f812fa6aa4ca1aa78de02560264f2fa30c41003
|
data/.github/workflows/test.yml
CHANGED
data/ChangeLog.md
CHANGED
@@ -1,6 +1,17 @@
|
|
1
1
|
# processing ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [v0.5.31] - 2023-12-09
|
5
|
+
|
6
|
+
- Add Shape class
|
7
|
+
- Add createShape(), shape(), shapeMode()
|
8
|
+
- Add beginShape(), endShape(), and vertex(x, y)
|
9
|
+
- Test with p5.rb
|
10
|
+
- GraphicsContext#rotate() can take z parameter
|
11
|
+
- Set default miter_limit to 10
|
12
|
+
- Trigger github actions on all pull_request
|
13
|
+
|
14
|
+
|
4
15
|
## [v0.5.30] - 2023-11-09
|
5
16
|
|
6
17
|
- Test drawing methods with p5.rb
|
data/Rakefile
CHANGED
@@ -14,12 +14,16 @@ require 'reflex/extension'
|
|
14
14
|
require 'processing/extension'
|
15
15
|
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
def test_with_p5()
|
18
|
+
ENV['TEST_WITH_P5'] = '1'
|
19
|
+
end
|
20
|
+
|
21
|
+
EXTENSIONS = [Xot, Rucy, Rays, Reflex, Processing]
|
20
22
|
|
21
23
|
ENV['RDOC'] = 'yardoc --no-private'
|
22
24
|
|
25
|
+
#test_with_p5 if ci?
|
26
|
+
|
23
27
|
default_tasks
|
24
28
|
use_bundler
|
25
29
|
test_ruby_extension
|
@@ -30,10 +34,14 @@ task :clean => 'test:clean'
|
|
30
34
|
|
31
35
|
namespace :test do
|
32
36
|
task :clean do
|
33
|
-
sh %( rm -rf test
|
37
|
+
sh %( rm -rf test/.png/*.png )
|
38
|
+
end
|
39
|
+
|
40
|
+
task :with_p5 do
|
41
|
+
test_with_p5
|
34
42
|
end
|
35
43
|
|
36
|
-
|
37
|
-
|
44
|
+
::Rake::TestTask.new :draw do |t|
|
45
|
+
t.test_files = FileList['test/test_*.rb']
|
38
46
|
end
|
39
47
|
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.31
|
data/lib/processing/all.rb
CHANGED
@@ -45,15 +45,16 @@ module Processing
|
|
45
45
|
#
|
46
46
|
DEGREES = :degrees
|
47
47
|
|
48
|
-
# Mode for rectMode(), ellipseMode() and
|
48
|
+
# Mode for rectMode(), ellipseMode(), imageMode(), and shapeMode().
|
49
49
|
#
|
50
50
|
CORNER = :corner
|
51
51
|
|
52
|
-
# Mode for rectMode(), ellipseMode() and
|
52
|
+
# Mode for rectMode(), ellipseMode(), imageMode(), and shapeMode().
|
53
53
|
#
|
54
54
|
CORNERS = :corners
|
55
55
|
|
56
|
-
# Mode for rectMode(), ellipseMode(), imageMode()
|
56
|
+
# Mode for rectMode(), ellipseMode(), imageMode(), shapeMode(),
|
57
|
+
# and textAlign().
|
57
58
|
#
|
58
59
|
CENTER = :center
|
59
60
|
|
@@ -140,6 +141,57 @@ module Processing
|
|
140
141
|
# Filter type for filter()
|
141
142
|
BLUR = :blur
|
142
143
|
|
144
|
+
# Shape mode for createShape()
|
145
|
+
LINE = :line
|
146
|
+
|
147
|
+
# Shape mode for createShape()
|
148
|
+
RECT = :rect
|
149
|
+
|
150
|
+
# Shape mode for createShape()
|
151
|
+
ELLIPSE = :ellipse
|
152
|
+
|
153
|
+
# Shape mode for createShape()
|
154
|
+
ARC = :arc
|
155
|
+
|
156
|
+
# Shape mode for createShape()
|
157
|
+
TRIANGLE = :triangle
|
158
|
+
|
159
|
+
# Shape mode for createShape()
|
160
|
+
QUAD = :quad
|
161
|
+
|
162
|
+
# Shape mode for createShape()
|
163
|
+
GROUP = :group
|
164
|
+
|
165
|
+
# Shape mode for beginShape()
|
166
|
+
POINTS = :points
|
167
|
+
|
168
|
+
# Shape mode for beginShape()
|
169
|
+
LINES = :lines
|
170
|
+
|
171
|
+
# Shape mode for beginShape()
|
172
|
+
TRIANGLES = :triangles
|
173
|
+
|
174
|
+
# Shape mode for beginShape()
|
175
|
+
TRIANGLE_FAN = :triangle_fan
|
176
|
+
|
177
|
+
# Shape mode for beginShape()
|
178
|
+
TRIANGLE_STRIP = :triangle_strip
|
179
|
+
|
180
|
+
# Shape mode for beginShape()
|
181
|
+
QUADS = :quads
|
182
|
+
|
183
|
+
# Shape mode for beginShape()
|
184
|
+
QUAD_STRIP = :quad_strip
|
185
|
+
|
186
|
+
# Shape mode for beginShape()
|
187
|
+
TESS = :tess
|
188
|
+
|
189
|
+
# OPEN flag for endShape()
|
190
|
+
OPEN = :open
|
191
|
+
|
192
|
+
# CLOSE flag for endShape()
|
193
|
+
CLOSE = :close
|
194
|
+
|
143
195
|
# Key codes.
|
144
196
|
ENTER = :enter
|
145
197
|
SPACE = :space
|
@@ -206,6 +258,7 @@ module Processing
|
|
206
258
|
@rectMode__ = nil
|
207
259
|
@ellipseMode__ = nil
|
208
260
|
@imageMode__ = nil
|
261
|
+
@shapeMode__ = nil
|
209
262
|
@blendMode__ = nil
|
210
263
|
@textAlignH__ = nil
|
211
264
|
@textAlignV__ = nil
|
@@ -222,6 +275,7 @@ module Processing
|
|
222
275
|
rectMode CORNER
|
223
276
|
ellipseMode CENTER
|
224
277
|
imageMode CORNER
|
278
|
+
shapeMode CORNER
|
225
279
|
blendMode BLEND
|
226
280
|
strokeCap ROUND
|
227
281
|
strokeJoin MITER
|
@@ -235,7 +289,9 @@ module Processing
|
|
235
289
|
|
236
290
|
# @private
|
237
291
|
def updateCanvas__(image, painter)
|
238
|
-
@image__, @painter__
|
292
|
+
@image__, @painter__ = image, painter
|
293
|
+
@painter__.miter_limit = 10
|
294
|
+
@painter__.stroke_outset = 0.5
|
239
295
|
end
|
240
296
|
|
241
297
|
# @private
|
@@ -434,7 +490,7 @@ module Processing
|
|
434
490
|
end
|
435
491
|
|
436
492
|
# @private
|
437
|
-
def
|
493
|
+
def toDegrees__(angle)
|
438
494
|
angle * @angleScale__
|
439
495
|
end
|
440
496
|
|
@@ -460,8 +516,8 @@ module Processing
|
|
460
516
|
#
|
461
517
|
# CORNER -> rect(left, top, width, height)
|
462
518
|
# CORNERS -> rect(left, top, right, bottom)
|
463
|
-
# CENTER -> rect(
|
464
|
-
# RADIUS -> rect(
|
519
|
+
# CENTER -> rect(centerX, centerY, width, height)
|
520
|
+
# RADIUS -> rect(centerX, centerY, radiusH, radiusV)
|
465
521
|
#
|
466
522
|
# @param mode [CORNER, CORNERS, CENTER, RADIUS]
|
467
523
|
#
|
@@ -475,8 +531,8 @@ module Processing
|
|
475
531
|
#
|
476
532
|
# CORNER -> ellipse(left, top, width, height)
|
477
533
|
# CORNERS -> ellipse(left, top, right, bottom)
|
478
|
-
# CENTER -> ellipse(
|
479
|
-
# RADIUS -> ellipse(
|
534
|
+
# CENTER -> ellipse(centerX, centerY, width, height)
|
535
|
+
# RADIUS -> ellipse(centerX, centerY, radiusH, radiusV)
|
480
536
|
#
|
481
537
|
# @param mode [CORNER, CORNERS, CENTER, RADIUS]
|
482
538
|
#
|
@@ -490,7 +546,7 @@ module Processing
|
|
490
546
|
#
|
491
547
|
# CORNER -> image(img, left, top, width, height)
|
492
548
|
# CORNERS -> image(img, left, top, right, bottom)
|
493
|
-
# CENTER -> image(img,
|
549
|
+
# CENTER -> image(img, centerX, centerY, width, height)
|
494
550
|
#
|
495
551
|
# @param mode [CORNER, CORNERS, CENTER]
|
496
552
|
#
|
@@ -500,6 +556,20 @@ module Processing
|
|
500
556
|
@imageMode__ = mode
|
501
557
|
end
|
502
558
|
|
559
|
+
# Sets shape mode. Default is CORNER.
|
560
|
+
#
|
561
|
+
# CORNER -> shape(shp, left, top, width, height)
|
562
|
+
# CORNERS -> shape(shp, left, top, right, bottom)
|
563
|
+
# CENTER -> shape(shp, centerX, centerY, width, height)
|
564
|
+
#
|
565
|
+
# @param mode [CORNER, CORNERS, CENTER]
|
566
|
+
#
|
567
|
+
# @return [nil] nil
|
568
|
+
#
|
569
|
+
def shapeMode(mode)
|
570
|
+
@shapeMode__ = mode
|
571
|
+
end
|
572
|
+
|
503
573
|
# @private
|
504
574
|
private def toXYWH__(mode, a, b, c, d)
|
505
575
|
case mode
|
@@ -924,9 +994,8 @@ module Processing
|
|
924
994
|
def arc(a, b, c, d, start, stop)
|
925
995
|
assertDrawing__
|
926
996
|
x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
|
927
|
-
|
928
|
-
|
929
|
-
@painter__.ellipse x, y, w, h, from: start, to: stop
|
997
|
+
from, to = toDegrees__(-start), toDegrees__(-stop)
|
998
|
+
@painter__.ellipse x, y, w, h, from: from, to: to
|
930
999
|
nil
|
931
1000
|
end
|
932
1001
|
|
@@ -1094,6 +1163,98 @@ module Processing
|
|
1094
1163
|
|
1095
1164
|
alias drawImage image
|
1096
1165
|
|
1166
|
+
# Draws a shape.
|
1167
|
+
#
|
1168
|
+
# The parameters a, b, c, and d are determined by shapeMode().
|
1169
|
+
#
|
1170
|
+
# @overload shape(img, a, b)
|
1171
|
+
# @overload shape(img, a, b, c, d)
|
1172
|
+
#
|
1173
|
+
# @param shp [Shape] shape to draw
|
1174
|
+
# @param a [Numeric] horizontal position of the shape, by default
|
1175
|
+
# @param b [Numeric] vertical position of the shape, by default
|
1176
|
+
# @param c [Numeric] width of the shape, by default
|
1177
|
+
# @param d [Numeric] height of the shape, by default
|
1178
|
+
#
|
1179
|
+
# @return [nil] nil
|
1180
|
+
#
|
1181
|
+
def shape(shp, a = 0, b = 0, c = nil, d = nil)
|
1182
|
+
assertDrawing__
|
1183
|
+
return nil unless shp.isVisible
|
1184
|
+
|
1185
|
+
if c || d || @shapeMode__ != CORNER
|
1186
|
+
x, y, w, h = toXYWH__ @shapeMode__, a, b, c || shp.width, d || shp.height
|
1187
|
+
shp.draw__ @painter__, x, y, w, h
|
1188
|
+
else
|
1189
|
+
shp.draw__ @painter__, a, b
|
1190
|
+
end
|
1191
|
+
nil
|
1192
|
+
end
|
1193
|
+
|
1194
|
+
alias drawShape shape
|
1195
|
+
|
1196
|
+
# Begins drawing complex shapes.
|
1197
|
+
#
|
1198
|
+
# @param mode [POINTS, LINES, TRIANGLES, TRIANGLE_FAN, TRIANGLE_STRIP, QUADS, QUAD_STRIP, TESS]
|
1199
|
+
#
|
1200
|
+
# @return [nil] nil
|
1201
|
+
#
|
1202
|
+
# @example
|
1203
|
+
# # Draws polygon
|
1204
|
+
# beginShape
|
1205
|
+
# vertex 10, 10
|
1206
|
+
# vertex 10, 50
|
1207
|
+
# vertex 50, 50
|
1208
|
+
# vertex 90, 10
|
1209
|
+
# endShape CLOSE
|
1210
|
+
#
|
1211
|
+
# # Draws triangles
|
1212
|
+
# beginShape TRIANGLES
|
1213
|
+
# vertex 10, 10
|
1214
|
+
# vertex 10, 50
|
1215
|
+
# vertex 50, 50
|
1216
|
+
# endShape
|
1217
|
+
#
|
1218
|
+
# @see https://processing.org/reference/beginShape_.html
|
1219
|
+
#
|
1220
|
+
def beginShape(mode = nil)
|
1221
|
+
@shapeMode__, @shapePoints__ = mode, []
|
1222
|
+
nil
|
1223
|
+
end
|
1224
|
+
|
1225
|
+
# Ends drawing complex shapes.
|
1226
|
+
#
|
1227
|
+
# @overload endShape()
|
1228
|
+
# @overload endShape(CLOSE)
|
1229
|
+
#
|
1230
|
+
# @param mode [CLOSE] Use CLOSE to create looped polygon
|
1231
|
+
#
|
1232
|
+
# @return [nil] nil
|
1233
|
+
#
|
1234
|
+
# @see https://processing.org/reference/endShape_.html
|
1235
|
+
#
|
1236
|
+
def endShape(mode = nil)
|
1237
|
+
raise "endShape() must be called after beginShape()" unless @shapePoints__
|
1238
|
+
polygon = Shape.createPolygon__ @shapeMode__, @shapePoints__, mode == CLOSE
|
1239
|
+
@painter__.polygon polygon if polygon
|
1240
|
+
@shapeMode__ = @shapePoints__ = nil
|
1241
|
+
nil
|
1242
|
+
end
|
1243
|
+
|
1244
|
+
# Append vertex for shape polygon.
|
1245
|
+
#
|
1246
|
+
# @param x [Numeric] x position of vertex
|
1247
|
+
# @param y [Numeric] y position of vertex
|
1248
|
+
#
|
1249
|
+
# @return [nil] nil
|
1250
|
+
#
|
1251
|
+
# @see https://processing.org/reference/vertex_.html
|
1252
|
+
#
|
1253
|
+
def vertex(x, y)
|
1254
|
+
raise "vertex() must be called after beginShape()" unless @shapePoints__
|
1255
|
+
@shapePoints__ << x << y
|
1256
|
+
end
|
1257
|
+
|
1097
1258
|
# Copies image.
|
1098
1259
|
#
|
1099
1260
|
# @overload copy(sx, sy, sw, sh, dx, dy, dw, dh)
|
@@ -1181,9 +1342,9 @@ module Processing
|
|
1181
1342
|
#
|
1182
1343
|
# @return [nil] nil
|
1183
1344
|
#
|
1184
|
-
def scale(x, y)
|
1345
|
+
def scale(x, y = nil, z = 1)
|
1185
1346
|
assertDrawing__
|
1186
|
-
@painter__.scale x, y
|
1347
|
+
@painter__.scale x, (y || x), z
|
1187
1348
|
nil
|
1188
1349
|
end
|
1189
1350
|
|
@@ -1195,7 +1356,7 @@ module Processing
|
|
1195
1356
|
#
|
1196
1357
|
def rotate(angle)
|
1197
1358
|
assertDrawing__
|
1198
|
-
@painter__.rotate
|
1359
|
+
@painter__.rotate toDegrees__ angle
|
1199
1360
|
nil
|
1200
1361
|
end
|
1201
1362
|
|
@@ -1254,6 +1415,7 @@ module Processing
|
|
1254
1415
|
@rectMode__,
|
1255
1416
|
@ellipseMode__,
|
1256
1417
|
@imageMode__,
|
1418
|
+
@shapeMode__,
|
1257
1419
|
@textAlignH__,
|
1258
1420
|
@textAlignV__,
|
1259
1421
|
@tint__,
|
@@ -1285,6 +1447,7 @@ module Processing
|
|
1285
1447
|
@rectMode__,
|
1286
1448
|
@ellipseMode__,
|
1287
1449
|
@imageMode__,
|
1450
|
+
@shapeMode__,
|
1288
1451
|
@textAlignH__,
|
1289
1452
|
@textAlignV__,
|
1290
1453
|
@tint__ = @styleStack__.pop
|
@@ -1732,6 +1895,67 @@ module Processing
|
|
1732
1895
|
Image.new Rays::Image.new(w, h, colorspace).paint {background 0, 0}
|
1733
1896
|
end
|
1734
1897
|
|
1898
|
+
# Creates a new shape.
|
1899
|
+
#
|
1900
|
+
# @overload createShape()
|
1901
|
+
# @overload createShape(LINE, x1, y1, x2, y2)
|
1902
|
+
# @overload createShape(RECT, a, b, c, d)
|
1903
|
+
# @overload createShape(ELLIPSE, a, b, c, d)
|
1904
|
+
# @overload createShape(ARC, a, b, c, d, start, stop)
|
1905
|
+
# @overload createShape(TRIANGLE, x1, y1, x2, y2, x3, y3)
|
1906
|
+
# @overload createShape(QUAD, x1, y1, x2, y2, x3, y3, x4, y4)
|
1907
|
+
# @overload createShape(GROUP)
|
1908
|
+
#
|
1909
|
+
# @param kind [LINE, RECT, ELLIPSE, ARC, TRIANGLE, QUAD, GROUP]
|
1910
|
+
#
|
1911
|
+
def createShape(kind = nil, *args)
|
1912
|
+
case kind
|
1913
|
+
when LINE then createLineShape__( *args)
|
1914
|
+
when RECT then createRectShape__( *args)
|
1915
|
+
when ELLIPSE then createEllipseShape__( *args)
|
1916
|
+
when ARC then createArcShape__( *args)
|
1917
|
+
when TRIANGLE then createTriangleShape__(*args)
|
1918
|
+
when QUAD then createQuadShape__( *args)
|
1919
|
+
when GROUP then Shape.new nil, [], context: self
|
1920
|
+
when nil then Shape.new context: self
|
1921
|
+
else raise ArgumentError, "Unknown shape kind '#{kind}'"
|
1922
|
+
end
|
1923
|
+
end
|
1924
|
+
|
1925
|
+
# @private
|
1926
|
+
private def createLineShape__(x1, y1, x2, y2)
|
1927
|
+
Shape.new Rays::Polygon.lines(x1, y1, x2, y2), context: self
|
1928
|
+
end
|
1929
|
+
|
1930
|
+
# @private
|
1931
|
+
private def createRectShape__(a, b, c, d)
|
1932
|
+
x, y, w, h = toXYWH__ @rectMode__, a, b, c, d
|
1933
|
+
Shape.new Rays::Polygon.rect(x, y, w, h), context: self
|
1934
|
+
end
|
1935
|
+
|
1936
|
+
# @private
|
1937
|
+
private def createEllipseShape__(a, b, c, d)
|
1938
|
+
x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
|
1939
|
+
Shape.new Rays::Polygon.ellipse(x, y, w, h), context: self
|
1940
|
+
end
|
1941
|
+
|
1942
|
+
# @private
|
1943
|
+
private def createArcShape__(a, b, c, d, start, stop)
|
1944
|
+
x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
|
1945
|
+
from, to = toDegrees__(-start), toDegrees__(-stop)
|
1946
|
+
Shape.new Rays::Polygon.ellipse(x, y, w, h, from: from, to: to), context: self
|
1947
|
+
end
|
1948
|
+
|
1949
|
+
# @private
|
1950
|
+
private def createTriangleShape__(x1, y1, x2, y2, x3, y3)
|
1951
|
+
Shape.new Rays::Polygon.new(x1, y1, x2, y2, x3, y3, loop: true), context: self
|
1952
|
+
end
|
1953
|
+
|
1954
|
+
# @private
|
1955
|
+
private def createQuadShape__(x1, y1, x2, y2, x3, y3, x4, y4)
|
1956
|
+
Shape.new Rays::Polygon.quads(x1, y1, x2, y2, x3, y3, x4, y4), context: self
|
1957
|
+
end
|
1958
|
+
|
1735
1959
|
# Creates a new off-screen graphics context object.
|
1736
1960
|
#
|
1737
1961
|
# @param width [Numeric] width of graphics image
|
@@ -0,0 +1,183 @@
|
|
1
|
+
module Processing
|
2
|
+
|
3
|
+
|
4
|
+
# Shape object.
|
5
|
+
#
|
6
|
+
class Shape
|
7
|
+
|
8
|
+
# @private
|
9
|
+
def initialize(polygon = nil, children = nil, context: nil)
|
10
|
+
@polygon, @children = polygon, children
|
11
|
+
@context = context || Context.context__
|
12
|
+
@visible, @matrix = true, nil
|
13
|
+
@mode = @points = @closed = nil
|
14
|
+
end
|
15
|
+
|
16
|
+
# Gets width of shape.
|
17
|
+
#
|
18
|
+
# @return [Numeric] width of shape
|
19
|
+
#
|
20
|
+
def width()
|
21
|
+
polygon = getInternal__ or return 0
|
22
|
+
(@bounds ||= polygon.bounds).width
|
23
|
+
end
|
24
|
+
|
25
|
+
# Gets height of shape.
|
26
|
+
#
|
27
|
+
# @return [Numeric] height of shape
|
28
|
+
#
|
29
|
+
def height()
|
30
|
+
polygon = getInternal__ or return 0
|
31
|
+
(@bounds ||= polygon.bounds).height
|
32
|
+
end
|
33
|
+
|
34
|
+
alias w width
|
35
|
+
alias h height
|
36
|
+
|
37
|
+
# Returns whether the shape is visible or not.
|
38
|
+
#
|
39
|
+
# @return [Boolean] visible or not
|
40
|
+
#
|
41
|
+
def isVisible()
|
42
|
+
@visible
|
43
|
+
end
|
44
|
+
|
45
|
+
alias visible? isVisible
|
46
|
+
|
47
|
+
# Sets whether to display the shape or not.
|
48
|
+
#
|
49
|
+
# @return [nil] nil
|
50
|
+
#
|
51
|
+
def setVisible(visible)
|
52
|
+
@visible = !!visible
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
|
56
|
+
def beginShape(mode = nil)
|
57
|
+
@mode = mode
|
58
|
+
@points ||= []
|
59
|
+
@polygon = nil# clear cache
|
60
|
+
nil
|
61
|
+
end
|
62
|
+
|
63
|
+
def endShape(close = nil)
|
64
|
+
raise "endShape() must be called after beginShape()" unless @points
|
65
|
+
@closed = close == GraphicsContext::CLOSE
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
|
69
|
+
def vertex(x, y)
|
70
|
+
raise "vertex() must be called after beginShape()" unless @points
|
71
|
+
@points << x << y
|
72
|
+
end
|
73
|
+
|
74
|
+
def setVertex(index, point)
|
75
|
+
return nil unless @points && @points[index * 2, 2]&.size == 2
|
76
|
+
@points[index * 2, 2] = [point.x, point.y]
|
77
|
+
end
|
78
|
+
|
79
|
+
def getVertex(index)
|
80
|
+
return nil unless @points
|
81
|
+
point = @points[index * 2, 2]
|
82
|
+
return nil unless point&.size == 2
|
83
|
+
@context.createVector(*point)
|
84
|
+
end
|
85
|
+
|
86
|
+
def getVertexCount()
|
87
|
+
return 0 unless @points
|
88
|
+
@points.size / 2
|
89
|
+
end
|
90
|
+
|
91
|
+
def addChild(child)
|
92
|
+
return unless @children
|
93
|
+
@children.push child
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
|
97
|
+
def getChild(index)
|
98
|
+
@children&.[](index)
|
99
|
+
end
|
100
|
+
|
101
|
+
def getChildCount()
|
102
|
+
@children&.size || 0
|
103
|
+
end
|
104
|
+
|
105
|
+
def translate(x, y, z = 0)
|
106
|
+
matrix__.translate x, y, z
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
110
|
+
def rotate(angle)
|
111
|
+
matrix__.rotate @context.toDegrees__(angle)
|
112
|
+
nil
|
113
|
+
end
|
114
|
+
|
115
|
+
def scale(x, y, z = 1)
|
116
|
+
matrix__.scale x, y, z
|
117
|
+
nil
|
118
|
+
end
|
119
|
+
|
120
|
+
def resetMatrix()
|
121
|
+
@matrix = nil
|
122
|
+
end
|
123
|
+
|
124
|
+
def rotateX = nil
|
125
|
+
def rotateY = nil
|
126
|
+
def rotateZ = nil
|
127
|
+
|
128
|
+
# @private
|
129
|
+
def matrix__()
|
130
|
+
@matrix ||= Rays::Matrix.new
|
131
|
+
end
|
132
|
+
|
133
|
+
# @private
|
134
|
+
def getInternal__()
|
135
|
+
unless @polygon
|
136
|
+
return nil unless @points && @closed != nil
|
137
|
+
@polygon = self.class.createPolygon__ @mode, @points, @closed
|
138
|
+
end
|
139
|
+
@polygon
|
140
|
+
end
|
141
|
+
|
142
|
+
# @private
|
143
|
+
def draw__(painter, x, y, w = nil, h = nil)
|
144
|
+
poly = getInternal__
|
145
|
+
|
146
|
+
backup = nil
|
147
|
+
if @matrix && (poly || @children)
|
148
|
+
backup = painter.matrix
|
149
|
+
painter.matrix = backup * @matrix
|
150
|
+
end
|
151
|
+
|
152
|
+
if poly
|
153
|
+
if w || h
|
154
|
+
painter.polygon poly, x, y, w,h
|
155
|
+
else
|
156
|
+
painter.polygon poly, x, y
|
157
|
+
end
|
158
|
+
end
|
159
|
+
@children&.each {|o| o.draw__ painter, x, y, w, h}
|
160
|
+
|
161
|
+
painter.matrix = backup if backup
|
162
|
+
end
|
163
|
+
|
164
|
+
# @private
|
165
|
+
def self.createPolygon__(mode, points, close = false)
|
166
|
+
g = GraphicsContext
|
167
|
+
case mode
|
168
|
+
when g::POINTS then Rays::Polygon.points( *points)
|
169
|
+
when g::LINES then Rays::Polygon.lines( *points)
|
170
|
+
when g::TRIANGLES then Rays::Polygon.triangles( *points)
|
171
|
+
when g::TRIANGLE_FAN then Rays::Polygon.triangle_fan( *points)
|
172
|
+
when g::TRIANGLE_STRIP then Rays::Polygon.triangle_strip(*points)
|
173
|
+
when g::QUADS then Rays::Polygon.quads( *points)
|
174
|
+
when g::QUAD_STRIP then Rays::Polygon.quad_strip( *points)
|
175
|
+
when g::TESS, nil then Rays::Polygon.new(*points, loop: close)
|
176
|
+
else raise ArgumentError, "invalid polygon mode '#{mode}'"
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
end# Shape
|
181
|
+
|
182
|
+
|
183
|
+
end# Processing
|
data/lib/processing/vector.rb
CHANGED
@@ -463,9 +463,9 @@ module Processing
|
|
463
463
|
# @return [Vector] rotated this object
|
464
464
|
#
|
465
465
|
def rotate(angle)
|
466
|
-
|
467
|
-
@context.
|
468
|
-
@point.rotate!
|
466
|
+
deg = @context ?
|
467
|
+
@context.toDegrees__(angle) : angle * GraphicsContext::RAD2DEG__
|
468
|
+
@point.rotate! deg
|
469
469
|
self
|
470
470
|
end
|
471
471
|
|
data/processing.gemspec
CHANGED
@@ -25,10 +25,10 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.platform = Gem::Platform::RUBY
|
26
26
|
s.required_ruby_version = '>= 3.0.0'
|
27
27
|
|
28
|
-
s.add_runtime_dependency 'xot', '~> 0.1.
|
29
|
-
s.add_runtime_dependency 'rucy', '~> 0.1.
|
30
|
-
s.add_runtime_dependency 'rays', '~> 0.1.
|
31
|
-
s.add_runtime_dependency 'reflexion', '~> 0.1.
|
28
|
+
s.add_runtime_dependency 'xot', '~> 0.1.41'
|
29
|
+
s.add_runtime_dependency 'rucy', '~> 0.1.42'
|
30
|
+
s.add_runtime_dependency 'rays', '~> 0.1.47'
|
31
|
+
s.add_runtime_dependency 'reflexion', '~> 0.1.55'
|
32
32
|
|
33
33
|
s.files = `git ls-files`.split $/
|
34
34
|
s.test_files = s.files.grep %r{^(test|spec|features)/}
|