rubysketch 0.3.5 → 0.3.10

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0df24de4fc3eabd1c7880d51ff34ef8389b44bef43a8159c75e9e6c651953c0d
4
- data.tar.gz: cf03a57e9ecbf8a63f0b089c4588c0cd041ef93e2b92c69a580b8aa1f013659e
3
+ metadata.gz: 756b461427f81652025d1b032458a21e02a0405cbe876f93f42868a2a0d63091
4
+ data.tar.gz: 484f88ebc98855c074c7b2b8a1d11c0384d9acc9267775c9f72b68cd730c3967
5
5
  SHA512:
6
- metadata.gz: 953e09a5b8da7f8798186e3f0a4e4b9ca636a5c7a34cdd1eca26da30f09221ac31fe3c5ed9ebc8e498060f84b88de4bb14738ef8054e30544c38ca664522f050
7
- data.tar.gz: 4c4ae42689cfda821c84617c2925fc48b6af3ad3672d8dd1c603b999427762b5439cbf7c879a06fdf8830f83632d5e01bd9197d1cf528f6ae948a38728063a2a
6
+ metadata.gz: bbfb538eaf51488a522b98f41e6c193d40aabf960421118cfd63d76072bada647ba3dbb993e23bf52d025701b348c2736a893308a9dc220e4347e7caa91bafff
7
+ data.tar.gz: 79871d6ed4f4c2fa0799ccfdeb62062a963c9dce05b7b17feafa5b23dba937d69cb3839efb986ed51f9f334c370accf82aebe0417305a9c186ea3f9b05a04415
@@ -0,0 +1,62 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags: ['v[0-9]*']
6
+
7
+ jobs:
8
+ release:
9
+ runs-on: macos-latest
10
+
11
+ steps:
12
+ - name: checkout
13
+ uses: actions/checkout@v2
14
+
15
+ - name: ruby 2.6
16
+ uses: actions/setup-ruby@v1
17
+ with:
18
+ ruby-version: 2.6.x
19
+
20
+ - name: install gems
21
+ run: |
22
+ gem install bundler
23
+ bundle install --jobs 4 --retry 3
24
+
25
+ - name: version
26
+ id: version
27
+ run: |
28
+ echo ::set-output name=value::$(ruby -e 'print "${{ github.ref }}"[/\/v([\w\.\-]+)/, 1]')
29
+
30
+ - name: create gem
31
+ run: rake clean gem
32
+
33
+ - name: create release
34
+ id: create_release
35
+ uses: actions/create-release@v1
36
+ env:
37
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
38
+ with:
39
+ tag_name: ${{ github.ref }}
40
+ release_name: ${{ github.ref }}
41
+ draft: false
42
+ prerelease: false
43
+
44
+ - name: upload to releases
45
+ uses: actions/upload-release-asset@v1
46
+ env:
47
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
48
+ with:
49
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
50
+ asset_path: ./rubysketch-${{ steps.version.outputs.value }}.gem
51
+ asset_name: rubysketch-${{ steps.version.outputs.value }}.gem
52
+ asset_content_type: application/zip
53
+
54
+ - name: upload to rubygems
55
+ env:
56
+ GEM_HOST_API_KEY: ${{ secrets.RUBYGEMS_AUTH_TOKEN }}
57
+ run: |
58
+ mkdir -p $HOME/.gem
59
+ touch $HOME/.gem/credentials
60
+ chmod 0600 $HOME/.gem/credentials
61
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
62
+ rake upload
@@ -0,0 +1,27 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [master]
6
+ pull_request:
7
+ branches: [master]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: macos-latest
12
+
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+
16
+ - name: ruby 2.6
17
+ uses: actions/setup-ruby@v1
18
+ with:
19
+ ruby-version: 2.6.x
20
+
21
+ - name: install gems
22
+ run: |
23
+ gem install bundler
24
+ bundle install --jobs 4 --retry 3
25
+
26
+ - name: test
27
+ run: rake test
@@ -1,6 +1,39 @@
1
1
  # RubySketch ChangeLog
2
2
 
3
3
 
4
+ ## [0.3.10] - 2020-12-1
5
+
6
+ - invert angle parameter value for arc() to fix compatibility to processing API
7
+
8
+
9
+ ## [0.3.9] - 2020-11-30
10
+
11
+ - Graphics#beginDraw() can take block to call endDraw automatically
12
+ - Capture#start() always returns nil
13
+ - add delay_camera.rb
14
+
15
+
16
+ ## [0.3.8] - 2020-11-27
17
+
18
+ - Capture#initialize() can take requestWidth, requestHeight and cameraName
19
+ - add Capture#width and Capture#height
20
+
21
+
22
+ ## [0.3.7] - 2020-11-18
23
+
24
+ - add Capture class
25
+ - add log(), exp(), sqrt() and PI
26
+ - add examples/camera.rb
27
+ - add examples/breakout.rb
28
+ - fix error on calling image()
29
+
30
+
31
+ ## [0.3.6] - 2020-08-02
32
+
33
+ - random() can take array or nothing
34
+ - use github actions to release gem package
35
+
36
+
4
37
  ## [0.3.5] - 2020-08-02
5
38
 
6
39
  - add random()
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'yard'
4
+ gem 'reflexion'
data/Rakefile CHANGED
@@ -23,3 +23,28 @@ generate_documents
23
23
  build_ruby_gem
24
24
 
25
25
  task :default => :test
26
+
27
+
28
+ namespace :version do
29
+
30
+ namespace :bump do
31
+
32
+ task :major do
33
+ update_and_tag_version 0
34
+ end
35
+
36
+ task :minor do
37
+ update_and_tag_version 1
38
+ end
39
+
40
+ task :patch do
41
+ update_and_tag_version 2
42
+ end
43
+
44
+ task :build do
45
+ update_and_tag_version 3
46
+ end
47
+
48
+ end# bump
49
+
50
+ end# version
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.3.5
1
+ 0.3.10
@@ -0,0 +1,212 @@
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
+ PADDING = 50
9
+ BRICK_COUNT = 10
10
+
11
+ $objs = []
12
+ $bar = nil
13
+ $gameover = false
14
+
15
+ setup do
16
+ addWalls
17
+ addBricks
18
+
19
+ colorMode HSB, 360, 100, 100
20
+ ellipseMode CORNER
21
+ background 0
22
+ noStroke
23
+ fill 0, 0, 100
24
+ end
25
+
26
+ draw do
27
+ background 0
28
+ $objs.each do |o|
29
+ o.update
30
+ o.draw
31
+ end
32
+ drawTexts
33
+ end
34
+
35
+ mousePressed do
36
+ start unless started?
37
+ end
38
+
39
+ mouseDragged do
40
+ $bar.pos.x = mouseX - $bar.w / 2 if $bar
41
+ end
42
+
43
+ def start()
44
+ $bar = Bar.new
45
+ $objs += [$bar, Ball.new($bar)]
46
+ end
47
+
48
+ def started?()
49
+ $bar
50
+ end
51
+
52
+ def gameover?()
53
+ started? &&
54
+ $objs.count {|o| o.kind_of? Ball} == 0
55
+ end
56
+
57
+ def cleared?()
58
+ started? && !gameover? &&
59
+ $objs.count {|o| o.kind_of? Brick} == 0
60
+ end
61
+
62
+ def addWalls()
63
+ left = Obj.new 0, 0, 10, height
64
+ top = Obj.new 0, 0, width, 10
65
+ right = Obj.new width - 10, 0, 10, height
66
+ bottom = Bottom.new 0, height - 10, width, 10
67
+ $objs += [top, bottom, left, right]
68
+ end
69
+
70
+ def addBricks()
71
+ brickW = (width - PADDING * 2) / BRICK_COUNT
72
+ 5.times do |y|
73
+ BRICK_COUNT.times do |x|
74
+ xx = PADDING + brickW * x
75
+ yy = PADDING + 30 * y
76
+ $objs.push Brick.new(xx, yy, brickW - 5, 20, y * 60)
77
+ end
78
+ end
79
+ end
80
+
81
+ def drawTexts()
82
+ push do
83
+ textAlign CENTER, CENTER
84
+
85
+ if !started?
86
+ fill 50, 100, 100
87
+ textSize 50
88
+ text "BREAKOUT", 0, 0, width, height
89
+ textSize 20
90
+ translate 0, 100
91
+ text "Tap to start!", 0, 0, width, height
92
+ elsif cleared?
93
+ fill 100, 80, 100
94
+ textSize 50
95
+ text "CLEAR!", 0, 0, width, height
96
+ elsif gameover?
97
+ fill 0, 20, 100
98
+ textSize 50
99
+ text "GAMEOVER", 0, 0, width, height
100
+ end
101
+ end
102
+ end
103
+
104
+ class Obj
105
+ attr_reader :pos, :w, :h, :vel
106
+
107
+ def initialize(x, y, w, h, vx = 0, vy = 0)
108
+ @pos = createVector x, y
109
+ @w, @h = w, h
110
+ @vel = createVector vx, vy
111
+ end
112
+
113
+ def update()
114
+ @pos.add @vel
115
+ end
116
+
117
+ def draw()
118
+ rect @pos.x, @pos.y, @w, @h
119
+ end
120
+
121
+ def bounds()
122
+ x, y = @pos.x, @pos.y
123
+ return x, y, x + @w, y + @h
124
+ end
125
+
126
+ def center()
127
+ createVector @pos.x + @w / 2, @pos.y + @h / 2
128
+ end
129
+ end
130
+
131
+ class Ball < Obj
132
+ def initialize(bar)
133
+ super bar.pos.x, bar.pos.y - bar.h, 20, 20
134
+ self.vel = createVector random(-1, 1), -1
135
+ end
136
+
137
+ def vel=(v)
138
+ @vel = v.dup.normalize.mult 8
139
+ end
140
+
141
+ def update()
142
+ b = bounds.dup
143
+ super
144
+ checkHit b
145
+ end
146
+
147
+ def checkHit(prevBounds)
148
+ x1, y1, x2, y2 = prevBounds
149
+ hitH = hitV = false
150
+ hits = []
151
+ $objs.each do |o|
152
+ next if o == self
153
+ next unless intersect? o
154
+ hits.push o
155
+ ox1, oy1, ox2, oy2 = o.bounds
156
+ hitH ||= !overlap?(x1, x2, ox1, ox2)
157
+ hitV ||= !overlap?(y1, y2, oy1, oy2)
158
+ end
159
+ vel.x *= -1 if hitH
160
+ vel.y *= -1 if hitV
161
+
162
+ hits.each {|o| hit o}
163
+ end
164
+
165
+ def intersect?(o)
166
+ x1, y1, x2, y2 = bounds
167
+ ox1, oy1, ox2, oy2 = o.bounds
168
+ overlap?(x1, x2, ox1, ox2) && overlap?(y1, y2, oy1, oy2)
169
+ end
170
+
171
+ def overlap?(a1, a2, b1, b2)
172
+ a1 <= b2 && b1 <= a2
173
+ end
174
+
175
+ def hit(o)
176
+ case o
177
+ when Bar then self.vel = center.sub o.center
178
+ when Brick then $objs.delete o
179
+ when Bottom then $objs.delete self unless cleared?
180
+ end
181
+ end
182
+ end
183
+
184
+ class Bar < Obj
185
+ def initialize()
186
+ w = 100
187
+ super (width - w) / 2, height - 50, w, 20
188
+ end
189
+ end
190
+
191
+ class Brick < Obj
192
+ def initialize(x, y, w, h, hue)
193
+ super x, y, w, h
194
+ @hue = hue
195
+ end
196
+
197
+ def draw()
198
+ push do
199
+ fill @hue, 50, 100
200
+ super
201
+ end
202
+ end
203
+ end
204
+
205
+ class Bottom < Obj
206
+ def draw()
207
+ push do
208
+ fill 0, 0, 50
209
+ super
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,14 @@
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
+ cam = Capture.new 300, 300
9
+ cam.start
10
+
11
+ draw do
12
+ background 0
13
+ image cam, 0, 0
14
+ end
@@ -0,0 +1,33 @@
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
+ w, h = width, height
9
+
10
+ cam = Capture.new w, h, Capture.list.last
11
+ cam.start
12
+
13
+ images = 60.times.map {
14
+ Graphics.new w, h
15
+ }
16
+
17
+ draw do
18
+ if frameCount % 2 == 0
19
+ images.unshift images.pop
20
+ images.first.tap do |image|
21
+ image.beginDraw {
22
+ image.image cam, 0, 0
23
+ }
24
+ end
25
+ end
26
+
27
+ background 0
28
+ segment_h= h / images.size
29
+ images.each.with_index do |image, i|
30
+ y = i * segment_h
31
+ copy image, 0, y, w, segment_h, 0, y, w, segment_h
32
+ end
33
+ end
@@ -2,10 +2,18 @@ require 'rubysketch'
2
2
 
3
3
 
4
4
  begin
5
- include RubySketch::Processing::Context
5
+ window = RubySketch::Window.new {start}
6
+ context = RubySketch::Processing::Context.new window
6
7
 
7
- window = RubySketch::Window.new {start}
8
- setup__ window
8
+ (context.methods - Object.instance_methods).each do |method|
9
+ define_method method do |*args, &block|
10
+ context.__send__ method, *args, &block
11
+ end
12
+ end
13
+
14
+ context.class.constants.each do |const|
15
+ self.class.const_set const, context.class.const_get(const)
16
+ end
9
17
 
10
18
  window.__send__ :begin_draw
11
19
  at_exit do
@@ -141,9 +141,9 @@ module RubySketch
141
141
  #
142
142
  def lerp (*args, amount)
143
143
  v = toVector__ *args
144
- self.x = Context.lerp x, v.x, amount
145
- self.y = Context.lerp y, v.y, amount
146
- self.z = Context.lerp z, v.z, amount
144
+ self.x = x + (v.x - x) * amount
145
+ self.y = y + (v.y - y) * amount
146
+ self.z = z + (v.z - z) * amount
147
147
  self
148
148
  end
149
149
 
@@ -728,27 +728,127 @@ module RubySketch
728
728
  end# Touch
729
729
 
730
730
 
731
+ # Camera object.
732
+ #
733
+ class Capture
734
+
735
+ # Returns a list of available camera device names
736
+ #
737
+ # @return [Array] device name list
738
+ #
739
+ def self.list ()
740
+ Rays::Camera.device_names
741
+ end
742
+
743
+ # Initialize camera object.
744
+ #
745
+ # @overload Capture.new()
746
+ # @overload Capture.new(cameraName)
747
+ # @overload Capture.new(requestWidth, requestHeight)
748
+ # @overload Capture.new(requestWidth, requestHeight, cameraName)
749
+ #
750
+ # @param requestWidth [Integer] captured image width
751
+ # @param requestHeight [Integer] captured image height
752
+ # @param cameraName [String] camera device name
753
+ #
754
+ def initialize (*args)
755
+ width, height, name =
756
+ if args.empty?
757
+ [-1, -1, nil]
758
+ elsif args[0].kind_of?(String)
759
+ [-1, -1, args[0]]
760
+ elsif args[0].kind_of?(Numeric) && args[1].kind_of?(Numeric)
761
+ [args[0], args[1], args[2]]
762
+ else
763
+ raise ArgumentError
764
+ end
765
+ @camera = Rays::Camera.new width, height, device_name: name
766
+ end
767
+
768
+ # Start capturing.
769
+ #
770
+ # @return [nil] nil
771
+ #
772
+ def start ()
773
+ raise "Failed to start capture" unless @camera.start
774
+ nil
775
+ end
776
+
777
+ # Stop capturing.
778
+ #
779
+ # @return [nil] nil
780
+ #
781
+ def stop ()
782
+ @camera.stop
783
+ nil
784
+ end
785
+
786
+ # Returns is the next captured image available?
787
+ #
788
+ # @return [Boolean] true means object has next frame
789
+ #
790
+ def available ()
791
+ @camera.active?
792
+ end
793
+
794
+ # Reads next frame image
795
+ #
796
+ def read ()
797
+ @camera.image
798
+ end
799
+
800
+ # Returns the width of captured image
801
+ #
802
+ # @return [Numeric] the width of captured image
803
+ #
804
+ def width ()
805
+ @camera.image&.width || 0
806
+ end
807
+
808
+ # Returns the height of captured image
809
+ #
810
+ # @return [Numeric] the height of captured image
811
+ #
812
+ def height ()
813
+ @camera.image&.height || 0
814
+ end
815
+
816
+ # @private
817
+ def getInternal__ ()
818
+ @camera.image || dummyImage__
819
+ end
820
+
821
+ # @private
822
+ private def dummyImage__ ()
823
+ @dummy ||= Rays::Image.new 1, 1
824
+ end
825
+
826
+ end# Capture
827
+
828
+
731
829
  # Drawing context
732
830
  #
733
831
  module GraphicsContext
734
832
 
735
- Vector = Processing::Vector
833
+ # PI
834
+ #
835
+ PI = Math::PI
736
836
 
737
837
  # PI / 2
738
838
  #
739
- HALF_PI = Math::PI / 2
839
+ HALF_PI = PI / 2
740
840
 
741
841
  # PI / 4
742
842
  #
743
- QUARTER_PI = Math::PI / 4
843
+ QUARTER_PI = PI / 4
744
844
 
745
845
  # PI * 2
746
846
  #
747
- TWO_PI = Math::PI * 2
847
+ TWO_PI = PI * 2
748
848
 
749
849
  # PI * 2
750
850
  #
751
- TAU = Math::PI * 2
851
+ TAU = PI * 2
752
852
 
753
853
  # RGB mode for colorMode().
754
854
  #
@@ -817,7 +917,7 @@ module RubySketch
817
917
  @painter__ = painter
818
918
  @painter__.miter_limit = 10
819
919
 
820
- @drawing = false
920
+ @drawing__ = false
821
921
  @hsbColor__ = false
822
922
  @colorMaxes__ = [1.0] * 4
823
923
  @angleScale__ = 1.0
@@ -840,14 +940,16 @@ module RubySketch
840
940
  stroke 0
841
941
  end
842
942
 
843
- def beginDraw ()
943
+ # @private
944
+ def beginDraw__ ()
844
945
  @matrixStack__.clear
845
946
  @styleStack__.clear
846
- @drawing = true
947
+ @drawing__ = true
847
948
  end
848
949
 
849
- def endDraw ()
850
- @drawing = false
950
+ # @private
951
+ def endDraw__ ()
952
+ @drawing__ = false
851
953
  end
852
954
 
853
955
  def width ()
@@ -1267,8 +1369,8 @@ module RubySketch
1267
1369
  def arc (a, b, c, d, start, stop)
1268
1370
  assertDrawing__
1269
1371
  x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
1270
- start = toAngle__ start
1271
- stop = toAngle__ stop
1372
+ start = toAngle__ -start
1373
+ stop = toAngle__ -stop
1272
1374
  @painter__.ellipse x, y, w, h, from: start, to: stop
1273
1375
  nil
1274
1376
  end
@@ -1411,8 +1513,9 @@ module RubySketch
1411
1513
  #
1412
1514
  def image (img, a, b, c = nil, d = nil)
1413
1515
  assertDrawing__
1414
- x, y, w, h = toXYWH__ @imageMode__, a, b, c || img.width, d || img.height
1415
- @painter__.image img.getInternal__, x, y, w, h
1516
+ i = img.getInternal__
1517
+ x, y, w, h = toXYWH__ @imageMode__, a, b, c || i.width, d || i.height
1518
+ @painter__.image i, x, y, w, h
1416
1519
  nil
1417
1520
  end
1418
1521
 
@@ -1588,13 +1691,13 @@ module RubySketch
1588
1691
  end
1589
1692
 
1590
1693
  # @private
1591
- private def getInternal__ ()
1694
+ def getInternal__ ()
1592
1695
  @image__
1593
1696
  end
1594
1697
 
1595
1698
  # @private
1596
1699
  private def assertDrawing__ ()
1597
- raise "call beginDraw() before drawing" unless @drawing
1700
+ raise "call beginDraw() before drawing" unless @drawing__
1598
1701
  end
1599
1702
 
1600
1703
  end# GraphicsContext
@@ -1606,20 +1709,30 @@ module RubySketch
1606
1709
 
1607
1710
  include GraphicsContext
1608
1711
 
1712
+ # Initialize graphics object.
1713
+ #
1609
1714
  def initialize (width, height)
1610
1715
  @image__ = Rays::Image.new width, height
1611
1716
  setup__ @image__.painter
1612
1717
  end
1613
1718
 
1614
- def beginDraw ()
1719
+ # Start drawing.
1720
+ #
1721
+ def beginDraw (&block)
1615
1722
  @painter__.__send__ :begin_paint
1616
- super
1723
+ beginDraw__
1617
1724
  push
1725
+ if block
1726
+ block.call
1727
+ endDraw
1728
+ end
1618
1729
  end
1619
1730
 
1731
+ # End drawing.
1732
+ #
1620
1733
  def endDraw ()
1621
1734
  pop
1622
- super
1735
+ endDraw__
1623
1736
  @painter__.__send__ :end_paint
1624
1737
  end
1625
1738
 
@@ -1628,23 +1741,29 @@ module RubySketch
1628
1741
 
1629
1742
  # Processing context
1630
1743
  #
1631
- module Context
1744
+ class Context
1745
+
1746
+ include GraphicsContext
1632
1747
 
1633
- include GraphicsContext, Math
1748
+ Vector = Processing::Vector
1749
+ Capture = Processing::Capture
1750
+ Graphics = Processing::Graphics
1634
1751
 
1752
+ # @private
1635
1753
  @@context__ = nil
1636
1754
 
1755
+ # @private
1637
1756
  def self.context__ ()
1638
1757
  @@context__
1639
1758
  end
1640
1759
 
1641
1760
  # @private
1642
- def setup__ (window)
1761
+ def initialize (window)
1643
1762
  @@context__ = self
1644
1763
 
1645
1764
  @window__ = window
1646
1765
  @image__ = @window__.canvas
1647
- super @window__.canvas_painter.paint {background 0.8}
1766
+ setup__ @window__.canvas_painter.paint {background 0.8}
1648
1767
 
1649
1768
  @loop__ = true
1650
1769
  @redraw__ = false
@@ -1654,8 +1773,8 @@ module RubySketch
1654
1773
  @mousePressed__ = false
1655
1774
  @touches__ = []
1656
1775
 
1657
- @window__.before_draw = proc {beginDraw}
1658
- @window__.after_draw = proc {endDraw}
1776
+ @window__.before_draw = proc {beginDraw__}
1777
+ @window__.after_draw = proc {endDraw__}
1659
1778
 
1660
1779
  drawFrame = -> {
1661
1780
  @image__ = @window__.canvas
@@ -1865,7 +1984,9 @@ module RubySketch
1865
1984
  @redraw__ = true
1866
1985
  end
1867
1986
 
1868
- module_function
1987
+ #
1988
+ # Utilities
1989
+ #
1869
1990
 
1870
1991
  # Returns the absolute number of the value.
1871
1992
  #
@@ -1907,6 +2028,26 @@ module RubySketch
1907
2028
  value.round
1908
2029
  end
1909
2030
 
2031
+ # Returns the natural logarithm (the base-e logarithm) of a number.
2032
+ #
2033
+ # @param value [Numeric] number (> 0.0)
2034
+ #
2035
+ # @return [Numeric] result number
2036
+ #
2037
+ def log (n)
2038
+ Math.log n
2039
+ end
2040
+
2041
+ # Returns Euler's number e raised to the power of value.
2042
+ #
2043
+ # @param value [Numeric] number
2044
+ #
2045
+ # @return [Numeric] result number
2046
+ #
2047
+ def exp (n)
2048
+ Math.exp n
2049
+ end
2050
+
1910
2051
  # Returns value raised to the power of exponent.
1911
2052
  #
1912
2053
  # @param value [Numeric] base number
@@ -1928,6 +2069,16 @@ module RubySketch
1928
2069
  value * value
1929
2070
  end
1930
2071
 
2072
+ # Returns squared value.
2073
+ #
2074
+ # @param value [Numeric] number
2075
+ #
2076
+ # @return [Numeric] squared value
2077
+ #
2078
+ def sqrt (value)
2079
+ Math.sqrt value
2080
+ end
2081
+
1931
2082
  # Returns the magnitude (or length) of a vector.
1932
2083
  #
1933
2084
  # @overload mag(x, y)
@@ -2169,16 +2320,21 @@ module RubySketch
2169
2320
 
2170
2321
  # Returns a random number in range low...high
2171
2322
  #
2323
+ # @overload random()
2172
2324
  # @overload random(high)
2173
2325
  # @overload random(low, high)
2326
+ # @overload random(choices)
2174
2327
  #
2175
- # @param low [Numeric] lower limit
2176
- # @param high [Numeric] upper limit
2328
+ # @param low [Numeric] lower limit
2329
+ # @param high [Numeric] upper limit
2330
+ # @param choices [Array] array to choose from
2177
2331
  #
2178
2332
  # @return [Float] random number
2179
2333
  #
2180
- def random (low = nil, high)
2181
- rand (low || 0).to_f...high.to_f
2334
+ def random (*args)
2335
+ return args.first.sample if args.first.kind_of? Array
2336
+ high, low = args.reverse
2337
+ rand (low || 0).to_f...(high || 1).to_f
2182
2338
  end
2183
2339
 
2184
2340
  # Creates a new vector.
@@ -2197,6 +2353,14 @@ module RubySketch
2197
2353
  Vector.new *args
2198
2354
  end
2199
2355
 
2356
+ # Creates a camera object as a video input device.
2357
+ #
2358
+ # @return [Capture] camera object
2359
+ #
2360
+ def createCapture (*args)
2361
+ Capture.new *args
2362
+ end
2363
+
2200
2364
  # Creates a new off-screen graphics context object.
2201
2365
  #
2202
2366
  # @param width [Numeric] width of graphics image
@@ -28,17 +28,9 @@ Gem::Specification.new do |s|
28
28
  s.platform = Gem::Platform::RUBY
29
29
  s.required_ruby_version = '~> 2'
30
30
 
31
- s.add_runtime_dependency 'yard'
32
- s.add_runtime_dependency 'xot', '~> 0.1'
33
- s.add_runtime_dependency 'beeps', '~> 0.1'
34
- s.add_runtime_dependency 'rucy', '~> 0.1'
35
- s.add_runtime_dependency 'rays', '~> 0.1'
36
31
  s.add_runtime_dependency 'reflexion', '~> 0.1'
37
32
 
38
33
  s.files = `git ls-files`.split $/
39
34
  s.test_files = s.files.grep %r{^(test|spec|features)/}
40
35
  s.extra_rdoc_files = rdocs.to_a
41
- s.has_rdoc = true
42
-
43
- s.extensions << 'Rakefile'
44
36
  end
@@ -12,11 +12,6 @@ require 'rubysketch'
12
12
  include Xot::Test
13
13
 
14
14
 
15
- unless $RAYS_NOAUTOINIT
16
- #def Rays.fin! () end
17
- end
18
-
19
-
20
15
  def assert_equal_vector (v1, v2, delta = 0.000001)
21
16
  assert_in_delta v1.x, v2.x, delta
22
17
  assert_in_delta v1.y, v2.y, delta
@@ -6,22 +6,31 @@ require_relative '../helper'
6
6
 
7
7
  class TestProcessingUtility < Test::Unit::TestCase
8
8
 
9
- C = RubySketch::Processing::Context
9
+ class Context
10
+ include RubySketch::Processing::Context
11
+ end
10
12
 
11
- def setup ()
12
-
13
+ def context
14
+ Context.new
13
15
  end
14
16
 
15
17
  def test_random ()
16
- assert_equal Float, C.random(1).class
17
- assert_equal Float, C.random(1.0).class
18
- assert_not_equal C.random(1), C.random(1)
18
+ c = context
19
+
20
+ assert_equal Float, c.random(1).class
21
+ assert_equal Float, c.random(1.0).class
22
+ assert_equal Symbol, c.random((:a..:z).to_a).class
23
+
24
+ assert_not_equal c.random, c.random
19
25
 
20
26
  10000.times do
21
- n = C.random 1
27
+ n = c.random
28
+ assert 0 <= n && n < 1
29
+
30
+ n = c.random 1
22
31
  assert 0 <= n && n < 1
23
32
 
24
- n = C.random 1, 2
33
+ n = c.random 1, 2
25
34
  assert 1.0 <= n && n < 2.0
26
35
  end
27
36
  end
metadata CHANGED
@@ -1,85 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysketch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - xordog
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-02 00:00:00.000000000 Z
11
+ date: 2020-11-30 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: yard
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: xot
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.1'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '0.1'
41
- - !ruby/object:Gem::Dependency
42
- name: beeps
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '0.1'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '0.1'
55
- - !ruby/object:Gem::Dependency
56
- name: rucy
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.1'
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.1'
69
- - !ruby/object:Gem::Dependency
70
- name: rays
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '0.1'
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '0.1'
83
13
  - !ruby/object:Gem::Dependency
84
14
  name: reflexion
85
15
  requirement: !ruby/object:Gem::Requirement
@@ -97,18 +27,23 @@ dependencies:
97
27
  description: Creative Coding Framework have API compatible to Processing API or p5.js.
98
28
  email: xordog@gmail.com
99
29
  executables: []
100
- extensions:
101
- - Rakefile
30
+ extensions: []
102
31
  extra_rdoc_files: []
103
32
  files:
33
+ - ".github/workflows/release.yml"
34
+ - ".github/workflows/test.yml"
104
35
  - ".gitignore"
105
36
  - ".yardopts"
106
37
  - ChangeLog.md
38
+ - Gemfile
107
39
  - LICENSE
108
40
  - README.md
109
41
  - Rakefile
110
42
  - VERSION
43
+ - examples/breakout.rb
44
+ - examples/camera.rb
111
45
  - examples/clock.rb
46
+ - examples/delay_camera.rb
112
47
  - examples/glsl.rb
113
48
  - examples/hello.rb
114
49
  - examples/image.rb
@@ -126,7 +61,7 @@ files:
126
61
  homepage: https://github.com/xord/rubysketch
127
62
  licenses: []
128
63
  metadata: {}
129
- post_install_message:
64
+ post_install_message:
130
65
  rdoc_options: []
131
66
  require_paths:
132
67
  - lib
@@ -142,7 +77,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
77
  version: '0'
143
78
  requirements: []
144
79
  rubygems_version: 3.0.3
145
- signing_key:
80
+ signing_key:
146
81
  specification_version: 4
147
82
  summary: Processing like Creative Coding Framework.
148
83
  test_files: