rubysketch 0.3.20 → 0.3.21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d0836f855d3ae54ed3cdeaec0d4d479da386cb0a09684fce54d5b2b17cc4c72
4
- data.tar.gz: 72af8263d9531136860ce15145b59011c838743f64659362bd66e4ae6c717d1c
3
+ metadata.gz: acfaff485263c8e6557c8610df2a4643e53d1046e55cf813c79b648492e84d52
4
+ data.tar.gz: d7beb5170988d554771d50d5a726b1f51c961cded8a3cf3370dc55ccc91059fb
5
5
  SHA512:
6
- metadata.gz: 5dc6de1cba1571960c9cd9a621b568ee7257b11c537ac74a827cdf3d95fadbb33a0c25258177b0fec299e766c7f78c0e82a308319a38fdd004fe340a7be4ebe4
7
- data.tar.gz: 9cac5e78ddb2a9c7bf4e5e53c294321155bc4276cefed59ba115e44e1370fe9ca15c2ebd404615bceb72305f022a329be915d1d197df587770fe42376df87f88
6
+ metadata.gz: 95ce0e61b8db2f0046bfd43070dd9d10f24b48f7838b267509b98e9a4b6930aa8958c065ae7af253c3877c754a5187ce970b80722421c32e6fbb9de4d1ebc05a
7
+ data.tar.gz: a810edf5f210a8a505fc3830697a46a76a743860a90118d1de38e99192d0cf43639dd5410409baf040c4b6feb0275a90d2cb330230b7457890d8555b9f257d5e
@@ -12,10 +12,10 @@ jobs:
12
12
  - name: checkout
13
13
  uses: actions/checkout@v2
14
14
 
15
- - name: ruby 2.7
15
+ - name: ruby 3.0
16
16
  uses: actions/setup-ruby@v1
17
17
  with:
18
- ruby-version: 2.7.x
18
+ ruby-version: 3.0.x
19
19
 
20
20
  - name: install gems
21
21
  run: |
data/ChangeLog.md CHANGED
@@ -1,6 +1,16 @@
1
1
  # RubySketch ChangeLog
2
2
 
3
3
 
4
+ ## [0.3.21] - 2022-x-x
5
+
6
+ - add rubysketch-glsl.rb
7
+ - add blend(), createImage(), setTitle(), tint() and noTint()
8
+ - add save() that saves screen image to file
9
+ - circle() function is affected by ellipseMode()
10
+ - point() draws by line(x, y, x, y)
11
+ - change initial values for strokeCap and strokeJoin to ROUND and MITER
12
+
13
+
4
14
  ## [0.3.20] - 2022-07-24
5
15
 
6
16
  - add mouseClicked()
data/Gemfile CHANGED
@@ -1,4 +1,3 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'yard'
4
- gem 'reflexion'
3
+ gemspec
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ test_ruby_extension
22
22
  generate_documents
23
23
  build_ruby_gem
24
24
 
25
- task :default => :test
25
+ task :default
26
26
 
27
27
 
28
28
  namespace :version do
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.20
1
+ 0.3.21
data/examples/glsl.rb CHANGED
@@ -2,16 +2,13 @@
2
2
  .map {|s| File.expand_path "../../#{s}/lib", __dir__}
3
3
  .each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
4
4
 
5
- require 'rubysketch'
5
+ require 'rubysketch-glsl'
6
6
 
7
-
8
- RubySketch::GLSL.start <<END
9
- varying vec4 v_TexCoord;
7
+ RubySketch::GLSL.run <<END
10
8
  uniform vec2 resolution;
11
9
  uniform float time;
12
- void main ()
13
- {
14
- vec2 pos = v_TexCoord.xy / resolution;
15
- gl_FragColor = vec4(pos, float(mod(time, 1.0)), 1);
10
+ void main() {
11
+ vec2 pos = gl_FragCoord.xy / resolution;
12
+ gl_FragColor = vec4(pos * abs(sin(time)), 0, 1);
16
13
  }
17
14
  END
@@ -1,29 +1,36 @@
1
1
  module RubySketch
2
2
 
3
3
 
4
- # @private
5
- class GLSL
4
+ # OpenGL Shader Language
5
+ #
6
+ module GLSL
6
7
 
7
- def initialize(glsl)
8
- @shader = Reflex::Shader.new glsl
9
- end
10
8
 
11
9
  # @private
12
- def on_start__(window)
13
- start = Time.now.to_f
14
-
15
- window.draw = proc do |e, painter|
16
- painter.paint do |p|
17
- c = window.canvas
18
- w = c.width
19
- h = c.height
20
- t = Time.now.to_f - start
21
- p.shader @shader, resolution: [w, h], time: t if @shader
10
+ class Context
11
+
12
+ # @private
13
+ def initialize(window, shader_source)
14
+ shader = Rays::Shader.new shader_source
15
+ start = now__
16
+ window.draw = proc do |e|
17
+ i, p = window.canvas_image, window.canvas_painter
18
+ w, h = i.width, i.height
19
+ p.shader shader, resolution: [w, h], time: now__ - start
22
20
  p.fill 1
23
21
  p.rect 0, 0, w, h
24
22
  end
25
23
  end
26
- end
24
+
25
+ private
26
+
27
+ # @private
28
+ def now__()
29
+ Time.now.to_f
30
+ end
31
+
32
+ end# Context
33
+
27
34
 
28
35
  end# GLSL
29
36
 
@@ -624,9 +624,34 @@ module RubySketch
624
624
  # @return [nil] nil
625
625
  #
626
626
  def copy(img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
627
+ blend img, sx, sy, sw, sh, dx, dy, dw, dh, :normal
628
+ end
629
+
630
+ # Blends image.
631
+ #
632
+ # @overload blend(sx, sy, sw, sh, dx, dy, dw, dh, mode)
633
+ # @overload blend(img, sx, sy, sw, sh, dx, dy, dw, dh, mode)
634
+ #
635
+ # @param img [Image] image for blend source
636
+ # @param sx [Numrtic] x position of source region
637
+ # @param sy [Numrtic] y position of source region
638
+ # @param sw [Numrtic] width of source region
639
+ # @param sh [Numrtic] height of source region
640
+ # @param dx [Numrtic] x position of destination region
641
+ # @param dy [Numrtic] y position of destination region
642
+ # @param dw [Numrtic] width of destination region
643
+ # @param dh [Numrtic] height of destination region
644
+ # @param mode [BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, EXCLUSION, MULTIPLY, SCREEN, REPLACE] blend mode
645
+ #
646
+ # @return [nil] nil
647
+ #
648
+ def blend(img = nil, sx, sy, sw, sh, dx, dy, dw, dh, mode)
627
649
  img ||= self
628
650
  @image.paint do |painter|
651
+ current = painter.blend_mode
652
+ painter.blend_mode = mode
629
653
  painter.image img.getInternal__, sx, sy, sw, sh, dx, dy, dw, dh
654
+ painter.blend_mode = current
630
655
  end
631
656
  end
632
657
 
@@ -850,13 +875,17 @@ module RubySketch
850
875
  #
851
876
  TAU = PI * 2
852
877
 
853
- # RGB mode for colorMode().
878
+ # RGBA format for createImage().
879
+ #
880
+ RGBA = :rgba
881
+
882
+ # RGB format for createImage, or RGB mode for colorMode().
854
883
  #
855
- RGB = :rgb
884
+ RGB = :rgb
856
885
 
857
886
  # HSB mode for colorMode().
858
887
  #
859
- HSB = :hsb
888
+ HSB = :hsb
860
889
 
861
890
  # Radian mode for angleMode().
862
891
  #
@@ -1007,6 +1036,7 @@ module RubySketch
1007
1036
  @rectMode__ = nil
1008
1037
  @ellipseMode__ = nil
1009
1038
  @imageMode__ = nil
1039
+ @tint__ = nil
1010
1040
  @textAlignH__ = nil
1011
1041
  @textAlignV__ = nil
1012
1042
  @matrixStack__ = []
@@ -1021,11 +1051,14 @@ module RubySketch
1021
1051
  ellipseMode CENTER
1022
1052
  imageMode CORNER
1023
1053
  blendMode BLEND
1054
+ strokeCap ROUND
1055
+ strokeJoin MITER
1024
1056
  textAlign LEFT
1025
1057
 
1026
1058
  fill 255
1027
1059
  stroke 0
1028
1060
  strokeWeight 1
1061
+ noTint
1029
1062
  end
1030
1063
 
1031
1064
  # @private
@@ -1186,6 +1219,17 @@ module RubySketch
1186
1219
  end
1187
1220
  end
1188
1221
 
1222
+ # Sets blend mode. Default is BLEND.
1223
+ #
1224
+ # @param mode [BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, EXCLUSION, MULTIPLY, SCREEN, REPLACE]
1225
+ #
1226
+ # @return [nil] nil
1227
+ #
1228
+ def blendMode(mode)
1229
+ @painter__.blend_mode = mode
1230
+ nil
1231
+ end
1232
+
1189
1233
  # Sets fill color.
1190
1234
  #
1191
1235
  # @overload fill(rgb)
@@ -1283,6 +1327,37 @@ module RubySketch
1283
1327
  nil
1284
1328
  end
1285
1329
 
1330
+ # Sets fill color for drawing images.
1331
+ #
1332
+ # @overload tint(rgb)
1333
+ # @overload tint(rgb, alpha)
1334
+ # @overload tint(gray)
1335
+ # @overload tint(gray, alpha)
1336
+ # @overload tint(r, g, b)
1337
+ # @overload tint(r, g, b, alpha)
1338
+ #
1339
+ # @param rgb [String] color code like '#00AAFF'
1340
+ # @param gray [Integer] gray value (0..255)
1341
+ # @param r [Integer] red value (0..255)
1342
+ # @param g [Integer] green value (0..255)
1343
+ # @param b [Integer] blue value (0..255)
1344
+ # @param alpha [Integer] alpha value (0..255)
1345
+ #
1346
+ # @return [nil] nil
1347
+ #
1348
+ def tint(*args)
1349
+ @tint__ = args
1350
+ nil
1351
+ end
1352
+
1353
+ # Resets tint color.
1354
+ #
1355
+ # @return [nil] nil
1356
+ #
1357
+ def noTint()
1358
+ @tint__ = nil
1359
+ end
1360
+
1286
1361
  # Limits the drawable rectangle.
1287
1362
  #
1288
1363
  # The parameters a, b, c, and d are determined by rectMode().
@@ -1309,17 +1384,6 @@ module RubySketch
1309
1384
  nil
1310
1385
  end
1311
1386
 
1312
- # Sets blend mode. Default is BLEND.
1313
- #
1314
- # @param mode [BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, EXCLUSION, MULTIPLY, SCREEN, REPLACE]
1315
- #
1316
- # @return [nil] nil
1317
- #
1318
- def blendMode(mode)
1319
- @painter__.blend_mode = mode
1320
- nil
1321
- end
1322
-
1323
1387
  # Sets font.
1324
1388
  #
1325
1389
  # @overload textFont(font)
@@ -1402,7 +1466,7 @@ module RubySketch
1402
1466
  if rgba[3] == 1
1403
1467
  @painter__.background(*rgba)
1404
1468
  else
1405
- @painter__.push fill: rgba, stroke: nil do |_|
1469
+ @painter__.push fill: rgba, stroke: :none do |_|
1406
1470
  @painter__.rect 0, 0, width, height
1407
1471
  end
1408
1472
  end
@@ -1418,9 +1482,7 @@ module RubySketch
1418
1482
  #
1419
1483
  def point(x, y)
1420
1484
  assertDrawing__
1421
- w = @painter__.stroke_width
1422
- w = 1 if w == 0
1423
- @painter__.ellipse x - (w / 2.0), y - (w / 2.0), w, w
1485
+ @painter__.line x, y, x, y
1424
1486
  nil
1425
1487
  end
1426
1488
 
@@ -1498,9 +1560,7 @@ module RubySketch
1498
1560
  # @return [nil] nil
1499
1561
  #
1500
1562
  def circle(x, y, extent)
1501
- assertDrawing__
1502
- @painter__.ellipse x, y, extent, extent
1503
- nil
1563
+ ellipse x, y, extent, extent
1504
1564
  end
1505
1565
 
1506
1566
  # Draws an arc.
@@ -1667,9 +1727,12 @@ module RubySketch
1667
1727
  #
1668
1728
  def image(img, a, b, c = nil, d = nil)
1669
1729
  assertDrawing__
1670
- i = img.getInternal__
1730
+ i = img.getInternal__
1671
1731
  x, y, w, h = toXYWH__ @imageMode__, a, b, c || i.width, d || i.height
1672
- @painter__.image i, x, y, w, h
1732
+ tint = @tint__ ? toRGBA__(*@tint__) : 1
1733
+ @painter__.push fill: tint, stroke: :none do |_|
1734
+ @painter__.image i, x, y, w, h
1735
+ end
1673
1736
  nil
1674
1737
  end
1675
1738
 
@@ -1691,9 +1754,43 @@ module RubySketch
1691
1754
  # @return [nil] nil
1692
1755
  #
1693
1756
  def copy(img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
1757
+ blend img, sx, sy, sw, sh, dx, dy, dw, dh, BLEND
1758
+ end
1759
+
1760
+ # Blends image.
1761
+ #
1762
+ # @overload blend(sx, sy, sw, sh, dx, dy, dw, dh, mode)
1763
+ # @overload blend(img, sx, sy, sw, sh, dx, dy, dw, dh, mode)
1764
+ #
1765
+ # @param img [Image] image for blend source
1766
+ # @param sx [Numrtic] x position of source region
1767
+ # @param sy [Numrtic] y position of source region
1768
+ # @param sw [Numrtic] width of source region
1769
+ # @param sh [Numrtic] height of source region
1770
+ # @param dx [Numrtic] x position of destination region
1771
+ # @param dy [Numrtic] y position of destination region
1772
+ # @param dw [Numrtic] width of destination region
1773
+ # @param dh [Numrtic] height of destination region
1774
+ # @param mode [BLEND, ADD, SUBTRACT, LIGHTEST, DARKEST, EXCLUSION, MULTIPLY, SCREEN, REPLACE] blend mode
1775
+ #
1776
+ # @return [nil] nil
1777
+ #
1778
+ def blend(img = nil, sx, sy, sw, sh, dx, dy, dw, dh, mode)
1694
1779
  assertDrawing__
1695
- src = img&.getInternal__ || @window__.canvas_image
1780
+ src = img&.getInternal__ || @window__.canvas_image
1781
+ current = @painter__.blend_mode
1782
+
1783
+ @painter__.blend_mode = mode
1696
1784
  @painter__.image src, sx, sy, sw, sh, dx, dy, dw, dh
1785
+ @painter__.blend_mode = current
1786
+ end
1787
+
1788
+ # Saves screen image to file.
1789
+ #
1790
+ # @param filename [String] file name to save image
1791
+ #
1792
+ def save(filename)
1793
+ @window__.canvas_image.save filename
1697
1794
  end
1698
1795
 
1699
1796
  # Applies translation matrix to current transformation matrix.
@@ -2185,6 +2282,17 @@ module RubySketch
2185
2282
  nil
2186
2283
  end
2187
2284
 
2285
+ # Changes title of window.
2286
+ #
2287
+ # @param title [String] new title
2288
+ #
2289
+ # @return [nil] nil
2290
+ #
2291
+ def setTitle(title)
2292
+ @window__.title = title
2293
+ nil
2294
+ end
2295
+
2188
2296
  # Changes and returns canvas pixel density.
2189
2297
  #
2190
2298
  # @param density [Numeric] new pixel density
@@ -2716,6 +2824,23 @@ module RubySketch
2716
2824
  Vector.new(*args, context: self)
2717
2825
  end
2718
2826
 
2827
+ # Creates a new image.
2828
+ #
2829
+ # @overload createImage(w, h)
2830
+ # @overload createImage(w, h, format)
2831
+ #
2832
+ # @param w [Numeric] width of new image
2833
+ # @param h [Numeric] height of new image
2834
+ # @param format [RGB, RGBA] image format
2835
+ #
2836
+ # @return [Image] new image
2837
+ #
2838
+ def createImage(w, h, format = RGBA)
2839
+ colorspace = {RGB => Rays::RGB, RGBA => Rays::RGBA}[format]
2840
+ raise ArgumentError, "Unknown image format" unless colorspace
2841
+ Image.new Rays::Image.new(w, h, colorspace).paint {background 0, 0}
2842
+ end
2843
+
2719
2844
  # Creates a camera object as a video input device.
2720
2845
  #
2721
2846
  # @return [Capture] camera object
@@ -0,0 +1,11 @@
1
+ require 'rubysketch'
2
+
3
+
4
+ def (RubySketch::GLSL).run(
5
+ shader_source,
6
+ title: 'RubySketch',
7
+ width: 500, height: 500)
8
+ w = RubySketch::Window.new(title: title, w: width, h: height) {start}
9
+ RubySketch::GLSL::Context.new w, shader_source
10
+ at_exit {RubySketch::App.new {w.show}.start unless $!}
11
+ end
data/rubysketch.gemspec CHANGED
@@ -28,7 +28,9 @@ Gem::Specification.new do |s|
28
28
  s.platform = Gem::Platform::RUBY
29
29
  s.required_ruby_version = '>= 2.6.0'
30
30
 
31
- s.add_runtime_dependency 'reflexion', '~> 0.1.26'
31
+ s.add_runtime_dependency 'reflexion', '~> 0.1.28'
32
+
33
+ s.add_development_dependency 'yard'
32
34
 
33
35
  s.files = `git ls-files`.split $/
34
36
  s.test_files = s.files.grep %r{^(test|spec|features)/}
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.3.20
4
+ version: 0.3.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-23 00:00:00.000000000 Z
11
+ date: 2022-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: reflexion
@@ -16,14 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 0.1.26
19
+ version: 0.1.28
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 0.1.26
26
+ version: 0.1.28
27
+ - !ruby/object:Gem::Dependency
28
+ name: yard
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  description: Creative Coding Framework have API compatible to Processing API or p5.js.
28
42
  email: xordog@gmail.com
29
43
  executables: []
@@ -49,6 +63,7 @@ files:
49
63
  - examples/hello.rb
50
64
  - examples/image.rb
51
65
  - examples/shapes.rb
66
+ - lib/rubysketch-glsl.rb
52
67
  - lib/rubysketch-processing.rb
53
68
  - lib/rubysketch.rb
54
69
  - lib/rubysketch/app.rb
@@ -80,7 +95,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
95
  - !ruby/object:Gem::Version
81
96
  version: '0'
82
97
  requirements: []
83
- rubygems_version: 3.1.6
98
+ rubygems_version: 3.2.33
84
99
  signing_key:
85
100
  specification_version: 4
86
101
  summary: Processing like Creative Coding Framework.