processing 0.5.30 → 0.5.31
Sign up to get free protection for your applications and to get access to all the features.
- 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)/}
|