rubysketch 0.1.3 → 0.2.2
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/VERSION +1 -1
- data/examples/clock.rb +66 -0
- data/examples/hello.rb +2 -1
- data/examples/image.rb +13 -0
- data/examples/shapes.rb +121 -0
- data/lib/rubysketch.rb +5 -0
- data/lib/rubysketch/glsl.rb +2 -5
- data/lib/rubysketch/processing.rb +387 -120
- data/lib/rubysketch/window.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb7fa5f9cc69b67a9339f9f7170c8901999d0007e6b6e74de7d7b55b36bc09d3
|
4
|
+
data.tar.gz: c5158bda3a8ac90ec2255c3bfda5f8c3dbb8e9815bd74b9d5df0f8bfa601024e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b691e41b1e7ba08ad1a732f81333febe97cc68e30244ad7f8aea76b7660b7af5b47ae60542610f797340cc25bf9bc6f673dc893a19dd27e0b83583a19a8c99d8
|
7
|
+
data.tar.gz: 969de4e7e4f840c590c0758af55a53bb28838b05cf63a84d9c389bd99b5493df23cb06a5020f25c8531a906d67be4da014b5e888929e4734c83f18d6f47a87e0
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.2
|
data/examples/clock.rb
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
%w[xot rays reflex rubysketch]
|
2
|
+
.map {|s| File.expand_path "../../#{s}/lib", __dir__}
|
3
|
+
.each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
|
4
|
+
|
5
|
+
require 'rubysketch-processing'
|
6
|
+
|
7
|
+
COLORS = %w[ #F99292 #FFBC61 #FFC679 #FFF4E0 ]
|
8
|
+
|
9
|
+
def now ()
|
10
|
+
Time.now.to_f
|
11
|
+
end
|
12
|
+
|
13
|
+
start = now
|
14
|
+
|
15
|
+
setup do
|
16
|
+
colorMode RGB, 1
|
17
|
+
angleMode DEGREES
|
18
|
+
end
|
19
|
+
|
20
|
+
draw do
|
21
|
+
background 0
|
22
|
+
|
23
|
+
begin
|
24
|
+
pushMatrix
|
25
|
+
translate width / 2, height / 2
|
26
|
+
|
27
|
+
begin
|
28
|
+
pushMatrix
|
29
|
+
fill COLORS[0]
|
30
|
+
ellipse 0, 0, 20, 20
|
31
|
+
rotate (now - start) / 60.0 * 360
|
32
|
+
stroke COLORS[0]
|
33
|
+
strokeWeight 5
|
34
|
+
line 0, 0, 200, 0
|
35
|
+
fill 1
|
36
|
+
popMatrix
|
37
|
+
end
|
38
|
+
|
39
|
+
begin
|
40
|
+
pushMatrix
|
41
|
+
strokeWeight 3
|
42
|
+
60.times do
|
43
|
+
rotate 6
|
44
|
+
stroke COLORS[1]
|
45
|
+
line 200, 0, 210, 0
|
46
|
+
end
|
47
|
+
popMatrix
|
48
|
+
end
|
49
|
+
|
50
|
+
begin
|
51
|
+
pushMatrix
|
52
|
+
strokeWeight 5
|
53
|
+
12.times do
|
54
|
+
rotate 30
|
55
|
+
stroke COLORS[3]
|
56
|
+
line 190, 0, 210, 0
|
57
|
+
end
|
58
|
+
popMatrix
|
59
|
+
end
|
60
|
+
|
61
|
+
popMatrix
|
62
|
+
end
|
63
|
+
|
64
|
+
textSize 20
|
65
|
+
text "#{frameRate.to_i} FPS", 10, 10
|
66
|
+
end
|
data/examples/hello.rb
CHANGED
data/examples/image.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
%w[xot rays reflex rubysketch]
|
2
|
+
.map {|s| File.expand_path "../../#{s}/lib", __dir__}
|
3
|
+
.each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
|
4
|
+
|
5
|
+
require 'rubysketch-processing'
|
6
|
+
|
7
|
+
|
8
|
+
icon = loadImage 'https://xord.org/rubysketch/rubysketch.png'
|
9
|
+
|
10
|
+
draw do
|
11
|
+
background 0, 10
|
12
|
+
image icon, mouseX, mouseY, icon.width / 10, icon.height / 10
|
13
|
+
end
|
data/examples/shapes.rb
ADDED
@@ -0,0 +1,121 @@
|
|
1
|
+
%w[xot rays reflex rubysketch]
|
2
|
+
.map {|s| File.expand_path "../../#{s}/lib", __dir__}
|
3
|
+
.each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
|
4
|
+
|
5
|
+
require 'rubysketch-processing'
|
6
|
+
|
7
|
+
|
8
|
+
setup do
|
9
|
+
colorMode RGB, 1
|
10
|
+
angleMode DEGREES
|
11
|
+
end
|
12
|
+
|
13
|
+
draw do
|
14
|
+
background 0
|
15
|
+
|
16
|
+
fill 1
|
17
|
+
stroke 1, 0.5, 0.2
|
18
|
+
|
19
|
+
translate 10, 10
|
20
|
+
|
21
|
+
push
|
22
|
+
|
23
|
+
text 'point', 0, 0
|
24
|
+
point 0, 30
|
25
|
+
|
26
|
+
translate 0, 100
|
27
|
+
|
28
|
+
text 'point with strokeWeight', 0, 0
|
29
|
+
strokeWeight 10
|
30
|
+
point 0, 30
|
31
|
+
strokeWeight 0
|
32
|
+
|
33
|
+
translate 0, 100
|
34
|
+
|
35
|
+
text 'line', 0, 0
|
36
|
+
line 0, 30, 100, 50
|
37
|
+
|
38
|
+
translate 0, 100
|
39
|
+
|
40
|
+
text 'line with strokeWeight (very slow)', 0, 0
|
41
|
+
strokeWeight 10
|
42
|
+
line 0, 30, 100, 50
|
43
|
+
strokeWeight 1
|
44
|
+
|
45
|
+
translate 0, 100
|
46
|
+
|
47
|
+
text 'rect with rectMode(CORNER)', 0, 0
|
48
|
+
rectMode CORNER
|
49
|
+
rect 20, 30, 100, 50
|
50
|
+
|
51
|
+
translate 0, 100
|
52
|
+
|
53
|
+
text 'rect with rectMode(CORNERS)', 0, 0
|
54
|
+
rectMode CORNERS
|
55
|
+
rect 20, 30, 120, 80
|
56
|
+
|
57
|
+
translate 0, 100
|
58
|
+
|
59
|
+
text 'rect with rectMode(CENTER)', 0, 0
|
60
|
+
rectMode CENTER
|
61
|
+
rect 70, 55, 100, 50
|
62
|
+
|
63
|
+
translate 0, 100
|
64
|
+
|
65
|
+
text 'rect with rectMode(RADIUS)', 0, 0
|
66
|
+
rectMode RADIUS
|
67
|
+
rect 70, 55, 50, 25
|
68
|
+
|
69
|
+
pop
|
70
|
+
translate 200, 0
|
71
|
+
push
|
72
|
+
|
73
|
+
text 'circle', 0, 0
|
74
|
+
circle 70, 55, 25
|
75
|
+
|
76
|
+
translate 0, 100
|
77
|
+
|
78
|
+
text 'arc', 0, 0
|
79
|
+
arc 70, 55, 100, 50, 45, 270
|
80
|
+
|
81
|
+
translate 0, 100
|
82
|
+
|
83
|
+
text 'square', 0, 0
|
84
|
+
square 20, 30, 50
|
85
|
+
|
86
|
+
translate 0, 100
|
87
|
+
|
88
|
+
text 'triangle', 0, 0
|
89
|
+
triangle 70, 30, 120, 80, 20, 80
|
90
|
+
|
91
|
+
translate 0, 100
|
92
|
+
|
93
|
+
text 'quad', 0, 0
|
94
|
+
quad 20, 30, 120, 30, 150, 80, 50, 80
|
95
|
+
|
96
|
+
translate 0, 100
|
97
|
+
|
98
|
+
text 'ellipse with ellipseMode(CORNER)', 0, 0
|
99
|
+
ellipseMode CORNER
|
100
|
+
ellipse 20, 30, 100, 50
|
101
|
+
|
102
|
+
translate 0, 100
|
103
|
+
|
104
|
+
text 'ellipse with ellipseMode(CORNERS)', 0, 0
|
105
|
+
ellipseMode CORNERS
|
106
|
+
ellipse 20, 30, 120, 80
|
107
|
+
|
108
|
+
translate 0, 100
|
109
|
+
|
110
|
+
text 'ellipse with ellipseMode(CENTER)', 0, 0
|
111
|
+
ellipseMode CENTER
|
112
|
+
ellipse 70, 55, 100, 50
|
113
|
+
|
114
|
+
translate 0, 100
|
115
|
+
|
116
|
+
text 'ellipse with ellipseMode(RADIUS)', 0, 0
|
117
|
+
ellipseMode RADIUS
|
118
|
+
ellipse 70, 55, 50, 25
|
119
|
+
|
120
|
+
pop
|
121
|
+
end
|
data/lib/rubysketch.rb
CHANGED
data/lib/rubysketch/glsl.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module RubySketch
|
2
2
|
|
3
3
|
|
4
|
-
# Processing compatible API
|
4
|
+
# Processing compatible API
|
5
5
|
#
|
6
|
-
class
|
6
|
+
class Processing
|
7
7
|
|
8
8
|
include Math
|
9
9
|
|
@@ -30,6 +30,11 @@ module RubySketch
|
|
30
30
|
#
|
31
31
|
DEGREES = :DEGREES
|
32
32
|
|
33
|
+
CORNER = :CORNER
|
34
|
+
CORNERS = :CORNERS
|
35
|
+
CENTER = :CENTER
|
36
|
+
RADIUS = :RADIUS
|
37
|
+
|
33
38
|
# @private
|
34
39
|
DEG2RAD__ = PI / 180.0
|
35
40
|
|
@@ -38,6 +43,8 @@ module RubySketch
|
|
38
43
|
|
39
44
|
# @private
|
40
45
|
def initialize ()
|
46
|
+
@matrixStack__ = []
|
47
|
+
@styleStack__ = []
|
41
48
|
@frameCount__ = 0
|
42
49
|
@hsbColor__ = false
|
43
50
|
@colorMaxes__ = [1.0] * 4
|
@@ -48,8 +55,10 @@ module RubySketch
|
|
48
55
|
@mousePrevY__ = 0
|
49
56
|
@mousePressed__ = false
|
50
57
|
|
51
|
-
colorMode
|
52
|
-
angleMode
|
58
|
+
colorMode RGB, 255
|
59
|
+
angleMode RADIANS
|
60
|
+
rectMode CORNER
|
61
|
+
ellipseMode CENTER
|
53
62
|
end
|
54
63
|
|
55
64
|
# @private
|
@@ -277,21 +286,32 @@ module RubySketch
|
|
277
286
|
radian * RAD2DEG__
|
278
287
|
end
|
279
288
|
|
289
|
+
# Define setup block.
|
290
|
+
#
|
280
291
|
def setup (&block)
|
281
292
|
@window__.setup = block
|
282
293
|
nil
|
283
294
|
end
|
284
295
|
|
285
296
|
# @private
|
286
|
-
def setupDrawBlock__ ()
|
297
|
+
private def setupDrawBlock__ ()
|
287
298
|
@window__.draw = proc do |e, painter|
|
288
299
|
@painter__ = painter
|
289
|
-
@
|
300
|
+
@matrixStack__.clear
|
301
|
+
@styleStack__.clear
|
302
|
+
begin
|
303
|
+
push
|
304
|
+
@drawBlock__.call e if @drawBlock__
|
305
|
+
ensure
|
306
|
+
pop
|
307
|
+
end
|
290
308
|
@frameCount__ += 1
|
291
309
|
updateMousePrevPos__
|
292
310
|
end
|
293
311
|
end
|
294
312
|
|
313
|
+
# Define draw block.
|
314
|
+
#
|
295
315
|
def draw (&block)
|
296
316
|
@drawBlock__ = block if block
|
297
317
|
nil
|
@@ -303,7 +323,7 @@ module RubySketch
|
|
303
323
|
end
|
304
324
|
|
305
325
|
# @private
|
306
|
-
def setupMousePressedBlock__ ()
|
326
|
+
private def setupMousePressedBlock__ ()
|
307
327
|
@window__.pointer_down = proc do |e|
|
308
328
|
updateMouseState__ e.x, e.y, true
|
309
329
|
@mousePressedBlock__.call e if @mousePressedBlock__
|
@@ -316,7 +336,7 @@ module RubySketch
|
|
316
336
|
end
|
317
337
|
|
318
338
|
# @private
|
319
|
-
def setupMouseReleasedBlock__ ()
|
339
|
+
private def setupMouseReleasedBlock__ ()
|
320
340
|
@window__.pointer_up = proc do |e|
|
321
341
|
updateMouseState__ e.x, e.y, false
|
322
342
|
@mouseReleasedBlock__.call e if @mouseReleasedBlock__
|
@@ -329,7 +349,7 @@ module RubySketch
|
|
329
349
|
end
|
330
350
|
|
331
351
|
# @private
|
332
|
-
def setupMouseMovedBlock__ ()
|
352
|
+
private def setupMouseMovedBlock__ ()
|
333
353
|
@window__.pointer_move = proc do |e|
|
334
354
|
updateMouseState__ e.x, e.y
|
335
355
|
@mouseMovedBlock__.call e if @mouseMovedBlock__
|
@@ -342,7 +362,7 @@ module RubySketch
|
|
342
362
|
end
|
343
363
|
|
344
364
|
# @private
|
345
|
-
def setupMouseDraggedBlock__ ()
|
365
|
+
private def setupMouseDraggedBlock__ ()
|
346
366
|
@window__.pointer_drag = proc do |e|
|
347
367
|
updateMouseState__ e.x, e.y
|
348
368
|
@mouseDraggedBlock__.call e if @mouseDraggedBlock__
|
@@ -355,20 +375,20 @@ module RubySketch
|
|
355
375
|
end
|
356
376
|
|
357
377
|
# @private
|
358
|
-
def updateMouseState__ (x, y, pressed = nil)
|
378
|
+
private def updateMouseState__ (x, y, pressed = nil)
|
359
379
|
@mouseX__ = x
|
360
380
|
@mouseY__ = y
|
361
381
|
@mousePressed__ = pressed if pressed != nil
|
362
382
|
end
|
363
383
|
|
364
384
|
# @private
|
365
|
-
def updateMousePrevPos__ ()
|
385
|
+
private def updateMousePrevPos__ ()
|
366
386
|
@mousePrevX__ = @mouseX__
|
367
387
|
@mousePrevY__ = @mouseY__
|
368
388
|
end
|
369
389
|
|
370
390
|
# @private
|
371
|
-
def size__ (width, height)
|
391
|
+
private def size__ (width, height)
|
372
392
|
raise 'size() must be called on startup or setup block' if @started__
|
373
393
|
|
374
394
|
@painter__.send :end_paint
|
@@ -467,7 +487,7 @@ module RubySketch
|
|
467
487
|
# @return [nil] nil
|
468
488
|
#
|
469
489
|
def colorMode (mode, *maxes)
|
470
|
-
raise ArgumentError, "
|
490
|
+
raise ArgumentError, "invalid color mode: #{mode}" unless [RGB, HSB].include?(mode)
|
471
491
|
raise ArgumentError unless [0, 1, 3, 4].include?(maxes.size)
|
472
492
|
|
473
493
|
@hsbColor__ = mode.upcase == HSB
|
@@ -479,11 +499,11 @@ module RubySketch
|
|
479
499
|
end
|
480
500
|
|
481
501
|
# @private
|
482
|
-
def
|
502
|
+
private def toRGBA__ (*args)
|
483
503
|
a, b, c, d = args
|
484
|
-
return
|
504
|
+
return parseColor__(a, b || alphaMax__) if a.kind_of?(String)
|
485
505
|
|
486
|
-
rgba
|
506
|
+
rgba = case args.size
|
487
507
|
when 1, 2 then [a, a, a, b || alphaMax__]
|
488
508
|
when 3, 4 then [a, b, c, d || alphaMax__]
|
489
509
|
else raise ArgumentError
|
@@ -494,16 +514,16 @@ module RubySketch
|
|
494
514
|
end
|
495
515
|
|
496
516
|
# @private
|
497
|
-
def
|
517
|
+
private def parseColor__ (str, alpha)
|
498
518
|
result = str.match /^\s*##{'([0-9a-f]{2})' * 3}\s*$/i
|
499
|
-
raise ArgumentError, "
|
519
|
+
raise ArgumentError, "invalid color code: '#{str}'" unless result
|
500
520
|
|
501
521
|
rgb = result[1..3].map.with_index {|hex, i| hex.to_i(16) / 255.0}
|
502
522
|
return *rgb, (alpha / alphaMax__)
|
503
523
|
end
|
504
524
|
|
505
525
|
# @private
|
506
|
-
def alphaMax__ ()
|
526
|
+
private def alphaMax__ ()
|
507
527
|
@colorMaxes__[3]
|
508
528
|
end
|
509
529
|
|
@@ -517,15 +537,57 @@ module RubySketch
|
|
517
537
|
@angleScale__ = case mode
|
518
538
|
when RADIANS then RAD2DEG__
|
519
539
|
when DEGREES then 1.0
|
520
|
-
else raise ArgumentError, "
|
540
|
+
else raise ArgumentError, "invalid angle mode: #{mode}"
|
521
541
|
end
|
542
|
+
nil
|
522
543
|
end
|
523
544
|
|
524
545
|
# @private
|
525
|
-
def
|
546
|
+
private def toAngle__ (angle)
|
526
547
|
angle * @angleScale__
|
527
548
|
end
|
528
549
|
|
550
|
+
# Sets rect mode. Default is CORNER.
|
551
|
+
#
|
552
|
+
# CORNER -> rect(left, top, width, height)
|
553
|
+
# CORNERS -> rect(left, top, right, bottom)
|
554
|
+
# CENTER -> rect(center_x, center_y, width, height)
|
555
|
+
# RADIUS -> rect(center_x, center_y, radius_h, radius_v)
|
556
|
+
#
|
557
|
+
# @param mode [CORNER, CORNERS, CENTER, RADIUS]
|
558
|
+
#
|
559
|
+
# @return [nil] nil
|
560
|
+
#
|
561
|
+
def rectMode (mode)
|
562
|
+
@rectMode__ = mode
|
563
|
+
end
|
564
|
+
|
565
|
+
# Sets ellipse mode. Default is CENTER.
|
566
|
+
#
|
567
|
+
# CORNER -> ellipse(left, top, width, height)
|
568
|
+
# CORNERS -> ellipse(left, top, right, bottom)
|
569
|
+
# CENTER -> ellipse(center_x, center_y, width, height)
|
570
|
+
# RADIUS -> ellipse(center_x, center_y, radius_h, radius_v)
|
571
|
+
#
|
572
|
+
# @param mode [CORNER, CORNERS, CENTER, RADIUS]
|
573
|
+
#
|
574
|
+
# @return [nil] nil
|
575
|
+
#
|
576
|
+
def ellipseMode (mode)
|
577
|
+
@ellipseMode__ = mode
|
578
|
+
end
|
579
|
+
|
580
|
+
# @private
|
581
|
+
private def toXYWH__ (mode, a, b, c, d)
|
582
|
+
case mode
|
583
|
+
when CORNER then [a, b, c, d]
|
584
|
+
when CORNERS then [a, b, c - a, d - b]
|
585
|
+
when CENTER then [a - c / 2.0, b - d / 2.0, c, d]
|
586
|
+
when RADIUS then [a - c, b - d, c * 2, d * 2]
|
587
|
+
else raise ArgumentError # ToDo: refine error message
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
529
591
|
# Clears screen.
|
530
592
|
#
|
531
593
|
# @overload background(str)
|
@@ -545,7 +607,14 @@ module RubySketch
|
|
545
607
|
# @return [nil] nil
|
546
608
|
#
|
547
609
|
def background (*args)
|
548
|
-
|
610
|
+
rgba = toRGBA__ *args
|
611
|
+
if rgba[3] == 1
|
612
|
+
@painter__.background *rgba
|
613
|
+
else
|
614
|
+
@painter__.push fill: rgba, stroke: nil do |_|
|
615
|
+
@painter__.rect 0, 0, width, height
|
616
|
+
end
|
617
|
+
end
|
549
618
|
nil
|
550
619
|
end
|
551
620
|
|
@@ -568,7 +637,7 @@ module RubySketch
|
|
568
637
|
# @return [nil] nil
|
569
638
|
#
|
570
639
|
def fill (*args)
|
571
|
-
@painter__.fill(*
|
640
|
+
@painter__.fill(*toRGBA__(*args))
|
572
641
|
nil
|
573
642
|
end
|
574
643
|
|
@@ -591,7 +660,7 @@ module RubySketch
|
|
591
660
|
# @return [nil] nil
|
592
661
|
#
|
593
662
|
def stroke (*args)
|
594
|
-
@painter__.stroke(*
|
663
|
+
@painter__.stroke(*toRGBA__(*args))
|
595
664
|
nil
|
596
665
|
end
|
597
666
|
|
@@ -647,6 +716,20 @@ module RubySketch
|
|
647
716
|
nil
|
648
717
|
end
|
649
718
|
|
719
|
+
# Draws a point.
|
720
|
+
#
|
721
|
+
# @param x [Numeric] horizontal position
|
722
|
+
# @param y [Numeric] vertical position
|
723
|
+
#
|
724
|
+
# @return [nil] nil
|
725
|
+
#
|
726
|
+
def point (x, y)
|
727
|
+
w = @painter__.stroke_width
|
728
|
+
w = 1 if w == 0
|
729
|
+
@painter__.ellipse x - (w / 2.0), y - (w / 2.0), w, w
|
730
|
+
nil
|
731
|
+
end
|
732
|
+
|
650
733
|
# Draws a line.
|
651
734
|
#
|
652
735
|
# @param x1 [Numeric] horizontal position for first point
|
@@ -663,14 +746,14 @@ module RubySketch
|
|
663
746
|
|
664
747
|
# Draws a rectangle.
|
665
748
|
#
|
666
|
-
# @overload rect(
|
667
|
-
# @overload rect(
|
668
|
-
# @overload rect(
|
749
|
+
# @overload rect(a, b, c, d)
|
750
|
+
# @overload rect(a, b, c, d, r)
|
751
|
+
# @overload rect(a, b, c, d, tl, tr, br, bl)
|
669
752
|
#
|
670
|
-
# @param
|
671
|
-
# @param
|
672
|
-
# @param
|
673
|
-
# @param
|
753
|
+
# @param a [Numeric] horizontal position of the shape by default
|
754
|
+
# @param b [Numeric] vertical position of the shape by default
|
755
|
+
# @param c [Numeric] width of the shape by default
|
756
|
+
# @param d [Numeric] height of the shape by default
|
674
757
|
# @param r [Numeric] radius for all corners
|
675
758
|
# @param tl [Numeric] radius for top-left corner
|
676
759
|
# @param tr [Numeric] radius for top-right corner
|
@@ -679,7 +762,8 @@ module RubySketch
|
|
679
762
|
#
|
680
763
|
# @return [nil] nil
|
681
764
|
#
|
682
|
-
def rect (
|
765
|
+
def rect (a, b, c, d, *args)
|
766
|
+
x, y, w, h = toXYWH__ @rectMode__, a, b, c, d
|
683
767
|
case args.size
|
684
768
|
when 0 then @painter__.rect x, y, w, h
|
685
769
|
when 1 then @painter__.rect x, y, w, h, round: args[0]
|
@@ -689,24 +773,25 @@ module RubySketch
|
|
689
773
|
nil
|
690
774
|
end
|
691
775
|
|
692
|
-
# Draws
|
776
|
+
# Draws an ellipse.
|
693
777
|
#
|
694
|
-
# @param
|
695
|
-
# @param
|
696
|
-
# @param
|
697
|
-
# @param
|
778
|
+
# @param a [Numeric] horizontal position of the shape
|
779
|
+
# @param b [Numeric] vertical position of the shape
|
780
|
+
# @param c [Numeric] width of the shape
|
781
|
+
# @param d [Numeric] height of the shape
|
698
782
|
#
|
699
783
|
# @return [nil] nil
|
700
784
|
#
|
701
|
-
def ellipse (
|
702
|
-
|
785
|
+
def ellipse (a, b, c, d)
|
786
|
+
x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
|
787
|
+
@painter__.ellipse x, y, w, h
|
703
788
|
nil
|
704
789
|
end
|
705
790
|
|
706
791
|
# Draws a circle.
|
707
792
|
#
|
708
|
-
# @param x [Numeric] horizontal position
|
709
|
-
# @param y [Numeric] vertical position
|
793
|
+
# @param x [Numeric] horizontal position of the shape
|
794
|
+
# @param y [Numeric] vertical position of the shape
|
710
795
|
# @param extent [Numeric] width and height of the shape
|
711
796
|
#
|
712
797
|
# @return [nil] nil
|
@@ -717,31 +802,66 @@ module RubySketch
|
|
717
802
|
|
718
803
|
# Draws an arc.
|
719
804
|
#
|
720
|
-
# @param
|
721
|
-
# @param
|
722
|
-
# @param
|
723
|
-
# @param
|
805
|
+
# @param a [Numeric] horizontal position of the shape
|
806
|
+
# @param b [Numeric] vertical position of the shape
|
807
|
+
# @param c [Numeric] width of the shape
|
808
|
+
# @param d [Numeric] height of the shape
|
724
809
|
# @param start [Numeric] angle to start the arc
|
725
810
|
# @param stop [Numeric] angle to stop the arc
|
726
811
|
#
|
727
812
|
# @return [nil] nil
|
728
813
|
#
|
729
|
-
def arc (
|
730
|
-
|
731
|
-
|
732
|
-
|
814
|
+
def arc (a, b, c, d, start, stop)
|
815
|
+
x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
|
816
|
+
start = toAngle__ start
|
817
|
+
stop = toAngle__ stop
|
818
|
+
@painter__.ellipse x, y, w, h, from: start, to: stop
|
733
819
|
nil
|
734
820
|
end
|
735
821
|
|
736
|
-
# Draws a
|
822
|
+
# Draws a square.
|
737
823
|
#
|
738
|
-
# @param x
|
739
|
-
# @param y
|
824
|
+
# @param x [Numeric] horizontal position of the shape
|
825
|
+
# @param y [Numeric] vertical position of the shape
|
826
|
+
# @param extent [Numeric] width and height of the shape
|
740
827
|
#
|
741
828
|
# @return [nil] nil
|
742
829
|
#
|
743
|
-
def
|
744
|
-
|
830
|
+
def square (x, y, extent)
|
831
|
+
rect x, y, extent, extent
|
832
|
+
end
|
833
|
+
|
834
|
+
# Draws a triangle.
|
835
|
+
#
|
836
|
+
# @param x1 [Numeric] horizontal position of first point
|
837
|
+
# @param y1 [Numeric] vertical position of first point
|
838
|
+
# @param x2 [Numeric] horizontal position of second point
|
839
|
+
# @param y2 [Numeric] vertical position of second point
|
840
|
+
# @param x3 [Numeric] horizontal position of third point
|
841
|
+
# @param y3 [Numeric] vertical position of third point
|
842
|
+
#
|
843
|
+
# @return [nil] nil
|
844
|
+
#
|
845
|
+
def triangle (x1, y1, x2, y2, x3, y3)
|
846
|
+
@painter__.line x1, y1, x2, y2, x3, y3, loop: true
|
847
|
+
nil
|
848
|
+
end
|
849
|
+
|
850
|
+
# Draws a quad.
|
851
|
+
#
|
852
|
+
# @param x1 [Numeric] horizontal position of first point
|
853
|
+
# @param y1 [Numeric] vertical position of first point
|
854
|
+
# @param x2 [Numeric] horizontal position of second point
|
855
|
+
# @param y2 [Numeric] vertical position of second point
|
856
|
+
# @param x3 [Numeric] horizontal position of third point
|
857
|
+
# @param y3 [Numeric] vertical position of third point
|
858
|
+
# @param x4 [Numeric] horizontal position of fourth point
|
859
|
+
# @param y4 [Numeric] vertical position of fourth point
|
860
|
+
#
|
861
|
+
# @return [nil] nil
|
862
|
+
#
|
863
|
+
def quad (x1, y1, x2, y2, x3, y3, x4, y4)
|
864
|
+
@painter__.line x1, y1, x2, y2, x3, y3, x4, y4, loop: true
|
745
865
|
nil
|
746
866
|
end
|
747
867
|
|
@@ -751,16 +871,36 @@ module RubySketch
|
|
751
871
|
# @overload text(str, x, y)
|
752
872
|
#
|
753
873
|
# @param str [String] text to draw
|
754
|
-
# @param x [Numeric] horizontal position
|
755
|
-
# @param y [Numeric] vertical position
|
874
|
+
# @param x [Numeric] horizontal position of the text
|
875
|
+
# @param y [Numeric] vertical position of the text
|
756
876
|
#
|
757
877
|
# @return [nil] nil
|
758
878
|
#
|
759
|
-
def text (str, x
|
879
|
+
def text (str, x, y)
|
760
880
|
@painter__.text str, x, y
|
761
881
|
nil
|
762
882
|
end
|
763
883
|
|
884
|
+
# Draws an image.
|
885
|
+
#
|
886
|
+
# @overload image(img, x, y)
|
887
|
+
# @overload image(img, x, y, w, h)
|
888
|
+
#
|
889
|
+
# @param img [Image] image to draw
|
890
|
+
# @param x [Numeric] horizontal position of the image
|
891
|
+
# @param y [Numeric] vertical position of the image
|
892
|
+
# @param w [Numeric] width of the image
|
893
|
+
# @param h [Numeric] height of the image
|
894
|
+
#
|
895
|
+
# @return [nil] nil
|
896
|
+
#
|
897
|
+
def image (img, x, y, w = nil, h = nil)
|
898
|
+
w ||= img.width
|
899
|
+
h ||= img.height
|
900
|
+
@painter__.image img.internal, x, y, w, h
|
901
|
+
nil
|
902
|
+
end
|
903
|
+
|
764
904
|
# Applies translation matrix to current transformation matrix.
|
765
905
|
#
|
766
906
|
# @param x [Numeric] horizontal transformation
|
@@ -796,7 +936,7 @@ module RubySketch
|
|
796
936
|
# @return [nil] nil
|
797
937
|
#
|
798
938
|
def rotate (angle)
|
799
|
-
@painter__.rotate
|
939
|
+
@painter__.rotate toAngle__ angle
|
800
940
|
nil
|
801
941
|
end
|
802
942
|
|
@@ -805,7 +945,7 @@ module RubySketch
|
|
805
945
|
# @return [nil] nil
|
806
946
|
#
|
807
947
|
def pushMatrix ()
|
808
|
-
@painter__.
|
948
|
+
@matrixStack__.push @painter__.matrix
|
809
949
|
nil
|
810
950
|
end
|
811
951
|
|
@@ -814,7 +954,8 @@ module RubySketch
|
|
814
954
|
# @return [nil] nil
|
815
955
|
#
|
816
956
|
def popMatrix ()
|
817
|
-
@
|
957
|
+
raise "matrix stack underflow" if @matrixStack__.empty?
|
958
|
+
@painter__.matrix = @matrixStack__.pop
|
818
959
|
nil
|
819
960
|
end
|
820
961
|
|
@@ -827,6 +968,61 @@ module RubySketch
|
|
827
968
|
nil
|
828
969
|
end
|
829
970
|
|
971
|
+
# Save current style values to the style stack.
|
972
|
+
#
|
973
|
+
# @return [nil] nil
|
974
|
+
#
|
975
|
+
def pushStyle ()
|
976
|
+
@styleStack__.push [
|
977
|
+
@painter__.fill,
|
978
|
+
@painter__.stroke,
|
979
|
+
@painter__.stroke_width,
|
980
|
+
@painter__.font,
|
981
|
+
@hsbColor__,
|
982
|
+
@colorMaxes__,
|
983
|
+
@angleScale__,
|
984
|
+
@rectMode__,
|
985
|
+
@ellipseMode__
|
986
|
+
]
|
987
|
+
nil
|
988
|
+
end
|
989
|
+
|
990
|
+
# Restore style values from the style stack.
|
991
|
+
#
|
992
|
+
# @return [nil] nil
|
993
|
+
#
|
994
|
+
def popStyle ()
|
995
|
+
raise "style stack underflow" if @styleStack__.empty?
|
996
|
+
@painter__.fill,
|
997
|
+
@painter__.stroke,
|
998
|
+
@painter__.stroke_width,
|
999
|
+
@painter__.font,
|
1000
|
+
@hsbColor__,
|
1001
|
+
@colorMaxes__,
|
1002
|
+
@angleScale__,
|
1003
|
+
@rectMode__,
|
1004
|
+
@ellipseMode__ = @styleStack__.pop
|
1005
|
+
nil
|
1006
|
+
end
|
1007
|
+
|
1008
|
+
# Save current styles and transformations to stack.
|
1009
|
+
#
|
1010
|
+
# @return [nil] nil
|
1011
|
+
#
|
1012
|
+
def push ()
|
1013
|
+
pushMatrix
|
1014
|
+
pushStyle
|
1015
|
+
end
|
1016
|
+
|
1017
|
+
# Restore styles and transformations from stack.
|
1018
|
+
#
|
1019
|
+
# @return [nil] nil
|
1020
|
+
#
|
1021
|
+
def pop ()
|
1022
|
+
popMatrix
|
1023
|
+
popStyle
|
1024
|
+
end
|
1025
|
+
|
830
1026
|
# Returns the perlin noise value.
|
831
1027
|
#
|
832
1028
|
# @overload noise(x)
|
@@ -841,75 +1037,146 @@ module RubySketch
|
|
841
1037
|
Rays.perlin(x, y) / 2.0 + 1.0
|
842
1038
|
end
|
843
1039
|
|
844
|
-
#
|
1040
|
+
# Loads image.
|
845
1041
|
#
|
846
|
-
|
1042
|
+
# @param filename [String] file name to load image
|
1043
|
+
# @param extension [String] type of image to load (ex. 'png')
|
1044
|
+
#
|
1045
|
+
def loadImage (filename, extension = nil)
|
1046
|
+
filename = getImage__ filename, extension if filename =~ %r|^https?://|
|
1047
|
+
Image.new Rays::Image.load filename
|
1048
|
+
end
|
847
1049
|
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
1050
|
+
# @private
|
1051
|
+
private def getImage__ (uri, ext)
|
1052
|
+
ext ||= File.extname uri
|
1053
|
+
raise "unsupported image type" unless ext =~ /^\.?(png)$/i
|
1054
|
+
|
1055
|
+
tmpdir = Pathname(Dir.tmpdir) + Digest::SHA1.hexdigest(self.class.name)
|
1056
|
+
path = tmpdir + Digest::SHA1.hexdigest(uri)
|
1057
|
+
path = path.sub_ext ext
|
1058
|
+
|
1059
|
+
URI.open uri do |input|
|
1060
|
+
tmpdir.mkdir unless tmpdir.directory?
|
1061
|
+
path.open('w') do |output|
|
1062
|
+
while buf = input.read(2 ** 16)
|
1063
|
+
output.write buf
|
1064
|
+
end
|
1065
|
+
end
|
854
1066
|
end
|
1067
|
+
path.to_s
|
1068
|
+
end
|
855
1069
|
|
856
|
-
|
857
|
-
#
|
858
|
-
# @overload textBounds(str)
|
859
|
-
# @overload textBounds(str, x, y)
|
860
|
-
# @overload textBounds(str, x, y, fontSize)
|
861
|
-
#
|
862
|
-
# @param str [String] text to calculate bounding box
|
863
|
-
# @param x [Numeric] horizontal position of bounding box
|
864
|
-
# @param y [Numeric] vertical position of bounding box
|
865
|
-
# @param fontSize [Numeric] font size
|
866
|
-
#
|
867
|
-
# @return [TextBounds] bounding box for text
|
868
|
-
#
|
869
|
-
def textBounds (str, x = 0, y = 0, fontSize = nil)
|
870
|
-
f = fontSize ? Rays::Font.new(@font.name, fontSize) : @font
|
871
|
-
TextBounds.new x, y, x + f.width(str), y + f.height
|
872
|
-
end
|
1070
|
+
end# Processing
|
873
1071
|
|
874
|
-
# Bounding box for text.
|
875
|
-
#
|
876
|
-
class TextBounds
|
877
|
-
|
878
|
-
# Horizontal position
|
879
|
-
#
|
880
|
-
attr_reader :x
|
881
|
-
|
882
|
-
# Vertical position
|
883
|
-
#
|
884
|
-
attr_reader :y
|
885
|
-
|
886
|
-
# Width of bounding box
|
887
|
-
#
|
888
|
-
attr_reader :w
|
889
|
-
|
890
|
-
# Height of bounding box
|
891
|
-
#
|
892
|
-
attr_reader :h
|
893
|
-
|
894
|
-
# Initialize bouding box.
|
895
|
-
#
|
896
|
-
# @param x [Numeric] horizontal position
|
897
|
-
# @param y [Numeric] vertical position
|
898
|
-
# @param w [Numeric] width of bounding box
|
899
|
-
# @param h [Numeric] height of bounding box
|
900
|
-
#
|
901
|
-
def initialize (x, y, w, h)
|
902
|
-
@x, @y, @w, @h = x, y, w, h
|
903
|
-
end
|
904
1072
|
|
905
|
-
|
1073
|
+
# Image object.
|
1074
|
+
#
|
1075
|
+
class Processing::Image
|
1076
|
+
|
1077
|
+
# Initialize image.
|
1078
|
+
#
|
1079
|
+
def initialize (image)
|
1080
|
+
@image = image
|
1081
|
+
end
|
1082
|
+
|
1083
|
+
# Gets width of image.
|
1084
|
+
#
|
1085
|
+
# @return [Numeric] width of image
|
1086
|
+
#
|
1087
|
+
def width ()
|
1088
|
+
@image.width
|
1089
|
+
end
|
1090
|
+
|
1091
|
+
# Gets height of image.
|
1092
|
+
#
|
1093
|
+
# @return [Numeric] height of image
|
1094
|
+
#
|
1095
|
+
def height ()
|
1096
|
+
@image.height
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
# Saves image to file.
|
1100
|
+
#
|
1101
|
+
# @param filename [String] file name to save image
|
1102
|
+
#
|
1103
|
+
def save (filename)
|
1104
|
+
@image.save filename
|
1105
|
+
end
|
1106
|
+
|
1107
|
+
# @private
|
1108
|
+
def internal ()
|
1109
|
+
@image
|
1110
|
+
end
|
1111
|
+
|
1112
|
+
end# Processing::Image
|
1113
|
+
|
1114
|
+
|
1115
|
+
# Font object.
|
1116
|
+
#
|
1117
|
+
class Processing::Font
|
1118
|
+
|
1119
|
+
# Initialize font.
|
1120
|
+
#
|
1121
|
+
# @private
|
1122
|
+
#
|
1123
|
+
def initialize (font)
|
1124
|
+
@font = font
|
1125
|
+
end
|
1126
|
+
|
1127
|
+
# Returns bounding box.
|
1128
|
+
#
|
1129
|
+
# @overload textBounds(str)
|
1130
|
+
# @overload textBounds(str, x, y)
|
1131
|
+
# @overload textBounds(str, x, y, fontSize)
|
1132
|
+
#
|
1133
|
+
# @param str [String] text to calculate bounding box
|
1134
|
+
# @param x [Numeric] horizontal position of bounding box
|
1135
|
+
# @param y [Numeric] vertical position of bounding box
|
1136
|
+
# @param fontSize [Numeric] font size
|
1137
|
+
#
|
1138
|
+
# @return [TextBounds] bounding box for text
|
1139
|
+
#
|
1140
|
+
def textBounds (str, x = 0, y = 0, fontSize = nil)
|
1141
|
+
f = fontSize ? Rays::Font.new(@font.name, fontSize) : @font
|
1142
|
+
TextBounds.new x, y, x + f.width(str), y + f.height
|
1143
|
+
end
|
1144
|
+
|
1145
|
+
end# Processing::Font
|
1146
|
+
|
1147
|
+
|
1148
|
+
# Bounding box for text.
|
1149
|
+
#
|
1150
|
+
class Processing::TextBounds
|
1151
|
+
|
1152
|
+
# Horizontal position
|
1153
|
+
#
|
1154
|
+
attr_reader :x
|
906
1155
|
|
907
|
-
|
1156
|
+
# Vertical position
|
1157
|
+
#
|
1158
|
+
attr_reader :y
|
908
1159
|
|
909
|
-
|
1160
|
+
# Width of bounding box
|
1161
|
+
#
|
1162
|
+
attr_reader :w
|
910
1163
|
|
1164
|
+
# Height of bounding box
|
1165
|
+
#
|
1166
|
+
attr_reader :h
|
1167
|
+
|
1168
|
+
# Initialize bouding box.
|
1169
|
+
#
|
1170
|
+
# @param x [Numeric] horizontal position
|
1171
|
+
# @param y [Numeric] vertical position
|
1172
|
+
# @param w [Numeric] width of bounding box
|
1173
|
+
# @param h [Numeric] height of bounding box
|
1174
|
+
#
|
1175
|
+
def initialize (x, y, w, h)
|
1176
|
+
@x, @y, @w, @h = x, y, w, h
|
1177
|
+
end
|
911
1178
|
|
912
|
-
Processing
|
1179
|
+
end# Processing::TextBounds
|
913
1180
|
|
914
1181
|
|
915
1182
|
end# RubySketch
|
data/lib/rubysketch/window.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubysketch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: yard
|
@@ -107,8 +107,11 @@ files:
|
|
107
107
|
- README.md
|
108
108
|
- Rakefile
|
109
109
|
- VERSION
|
110
|
+
- examples/clock.rb
|
110
111
|
- examples/glsl.rb
|
111
112
|
- examples/hello.rb
|
113
|
+
- examples/image.rb
|
114
|
+
- examples/shapes.rb
|
112
115
|
- lib/rubysketch-processing.rb
|
113
116
|
- lib/rubysketch.rb
|
114
117
|
- lib/rubysketch/glsl.rb
|