graphics 1.0.0b6 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/History.rdoc +88 -0
  5. data/Manifest.txt +2 -0
  6. data/Rakefile +7 -8
  7. data/examples/boid.rb +44 -63
  8. data/examples/bounce.rb +4 -4
  9. data/examples/canvas.rb +17 -16
  10. data/examples/collision.rb +1 -1
  11. data/examples/demo.rb +1 -1
  12. data/examples/editor.rb +1 -1
  13. data/examples/fluid.rb +6 -6
  14. data/examples/fluid2.rb +22 -9
  15. data/examples/gol.rb +1 -1
  16. data/examples/gol2.rb +14 -22
  17. data/examples/math.rb +1 -1
  18. data/examples/pi_polygon.rb +8 -3
  19. data/examples/radar.rb +3 -3
  20. data/examples/rainbow_fluid.rb +4 -3
  21. data/examples/tank.rb +7 -3
  22. data/examples/tank2.rb +3 -3
  23. data/examples/targeting.rb +3 -3
  24. data/examples/vants.rb +13 -4
  25. data/examples/walker.rb +1 -1
  26. data/examples/walker2.rb +1 -1
  27. data/examples/zombies.rb +13 -7
  28. data/ext/sdl/extconf.rb +12 -20
  29. data/ext/sdl/sdl.c +619 -360
  30. data/ext/sdl/sge/Makefile +36 -11
  31. data/ext/sdl/sge/Makefile.conf +15 -9
  32. data/ext/sdl/sge/sge_bm_text.cpp +7 -6
  33. data/ext/sdl/sge/sge_collision.cpp +3 -1
  34. data/ext/sdl/sge/sge_config.h +0 -2
  35. data/ext/sdl/sge/sge_internal.h +0 -8
  36. data/ext/sdl/sge/sge_primitives.cpp +0 -11
  37. data/ext/sdl/sge/sge_primitives.h +0 -3
  38. data/ext/sdl/sge/sge_rotation.cpp +1 -1
  39. data/ext/sdl/sge/sge_shape.cpp +18 -9
  40. data/ext/sdl/sge/sge_surface.cpp +10 -4
  41. data/ext/sdl/sge/sge_textpp.cpp +17 -13
  42. data/graphics_setup.sh +43 -13
  43. data/lib/graphics.rb +1 -1
  44. data/lib/graphics/body.rb +8 -0
  45. data/lib/graphics/decorators.rb +15 -3
  46. data/lib/graphics/extensions.rb +1 -1
  47. data/lib/graphics/rainbows.rb +17 -25
  48. data/lib/graphics/simulation.rb +265 -106
  49. data/lib/graphics/v.rb +8 -1
  50. data/resources/sounds/attribution.txt +2 -0
  51. data/resources/sounds/bullet.wav +0 -0
  52. data/test/test_graphics.rb +232 -107
  53. metadata +37 -43
  54. metadata.gz.sig +1 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 37f59baac9923c3919719668065ee0c6371ea524
4
- data.tar.gz: bd576413810e63a2e8e51f12669c42f5d8ba0dbb
2
+ SHA256:
3
+ metadata.gz: 1d70424b07430bd3cf210e11d8bf76ec15b41231d5e1e46e8de07eaebd686e6b
4
+ data.tar.gz: 79b1367d8689c604560bdd1089f6a8ac98291bb7ee5240b3b2c10d48076e8d27
5
5
  SHA512:
6
- metadata.gz: 4519bbe92fc69ab4c4024cd3251afb68e87aa6f6100103d4b052c2d536b662b79448f392ff57a97e8a2f889aef5da414feb8196f65624195e28437d5ff52c476
7
- data.tar.gz: 1a921bf4a04063aef66d0f8eb829405a61659df355dbc6c1f2258558541dd779eabfcc39760ee10524846cf65e6793b6098f54f58975d04e7e7676e0cba33b6e
6
+ metadata.gz: a8ffd685c237b1b7481f984359193c744949f6a9f30b6c57495a8fbfd5a06ef10310a607112f48ce0ad5ee83d860489cd0582c213468d67c5e7b41af85324074
7
+ data.tar.gz: 26f3cbc67a707e7ac646e1f43066806ccf8915e7313ca7d0d2bcdfd40697b4a356796bc988ca67c5100f153ac38cac7ec7b75413c605eb3f8826c27a10305d98
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,3 +1,91 @@
1
+ === 1.0.0 / 2018-11-13
2
+
3
+ * 4 major enhancements:
4
+
5
+ * Everything is passing around Renderer instances now.
6
+ * Moved all drawing primitives to Renderer.
7
+ * Removed rsdl dependency. Plain ruby seems to work fine now.
8
+ * Updated to work with SDL2. This will break some things, but mostly works.
9
+
10
+ * 58 minor enhancements:
11
+
12
+ * #bezier now takes an array of any number (> 4) of points.
13
+ * #blit and #put now do everything in one call. Should be more performant.
14
+ * #blit and #put now use the clear color of their class for the background.
15
+ * #clear will now warn and skip if color isn't known.
16
+ * #fps now takes an optional color
17
+ * #transform/put now explicitly rotate on their bottom-left corner. Shifting x is no longer necessary.
18
+ * AbstractRenderer#initialize clears and presents so frame 0 is correct color.
19
+ * Added DEBUG_COLOR and use it in #debug. Reversed in WhiteBackground.
20
+ * Added Graphics::Drawing#draw_on(texture).
21
+ * Added Renderer#copy_texture.
22
+ * Added Renderer#h and #w to return the output size.
23
+ * Added Renderer#new_texture
24
+ * Added Renderer#target and Renderer#target=
25
+ * Added Renderer_index to read pixels. Painfully slow in comparison.
26
+ * Added SDL::Screen::H & SDL::Screen::W and made available to your #initialize.
27
+ * Added Screen#title=.
28
+ * Added Surface#blit.
29
+ * Added Surface#clear.
30
+ * Added Surface.color_key.
31
+ * Added Window#title and Renderer#title.
32
+ * Added Window#update ? Do I need this?
33
+ * Added caching to texture in Renderer#blit. Massively speeds up boids & walker.
34
+ * Added default (empty) Body#update.
35
+ * Added unary negation to V.
36
+ * Alpha blending is massively improved. Black on white is black.
37
+ * Blit now ensures blending is on.
38
+ * Check for done before paused so `esc` can quit while paused.
39
+ * Extended Renderer#point to optionally read or write a pixel.
40
+ * Improved default window naming to add spaces to the classname.
41
+ * Moved Screen#flip to Renderer#present.
42
+ * Moved Screen#set_title to Window#set_title.
43
+ * Moving everything out of Screen class. Will remove or leave just for constants.
44
+ * Removed KeyEvent#unicode.
45
+ * Removed PixelFormat#colorkey and #alpha.
46
+ * Removed SDL::WM and set_caption. Set titles via screen.title=
47
+ * Removed Screen#update.
48
+ * Removed Simulation#alpha, now built into pixels directly.
49
+ * Removed Surface#color_key and Surface#set_color_key.
50
+ * Removed Surface#flags and Surface#set_alpha.
51
+ * Removed Surface.blit class method.
52
+ * Removed Surface.new. You only create surfaces via Font.render_text and #sprite.
53
+ * Removed bpp argument to AbstractSimulation#initialize.
54
+ * Removed/changed a lot of constants, mostly around KeyEvent handling.
55
+ * Renamed AbstractSimulation#rgb to #rgba. I think this should probably just go?
56
+ * Renamed PixelFormat.get_rgb to get_rgba.
57
+ * Renderer#fast_rect now just calls Renderer#draw_rect w/ true for filled.
58
+ * SDL2 properly supports RGBA. Switched to it entirely.
59
+ * Screen#open now stores off a renderer, window, and texture in the Surface.
60
+ * Screen.open no longer creates or stores a surface. Saves off its own PixelFormat.
61
+ * Search Ubuntu font directories in #find_font. (phiggins)
62
+ * Simulation now defaults to half-width and half-height. No more required args to super.
63
+ * Surface#save now saves off PNG.
64
+ * Switched Renderer and Window to subclass Data, not Surface.
65
+ * Switching to SDL2_gfx for primitive drawing and rotozoom.
66
+ * Transforms now default to anti-aliased rotations.
67
+ * Updated graphics_setup.sh to remove SDL1 and install SDL2 (on OSX).
68
+ * V#magnitude is now cached.
69
+ * graphics_setup.sh will install hoe if necessary.
70
+
71
+ * 15 bug fixes:
72
+
73
+ * Cleaned some off-by-one drawing bugs. I think it is more pixel perfect now?
74
+ * Cleaned up Numeric#degrees.
75
+ * Finished getting to 100% rdoc coverage.
76
+ * Fixed a memory leak in PixelFormat. Might remove it entirely.
77
+ * Fixed a memory leak in collision maps.
78
+ * Fixed an off-by-one in blitting.
79
+ * Fixed bugs in hline and vline not using correct defaults. (joshcheek)
80
+ * Fixed circle and ellipse. Filled + anti-aliased wasn't actually anti-aliased.
81
+ * Fixed examples/boid.rb to rotate bodies again.
82
+ * Fixed examples/canvas.rb to draw in black again.
83
+ * Fixed fps drawing bug in rainbow_fluid.rb
84
+ * Fixed graphics_setup.sh and Rakefile for linux.
85
+ * Functional GoL: use Set vs. Array for faster search. (sotoseattle)
86
+ * Minor fix to examples/bounce.rb for older ruby versions.
87
+ * Removed Graphics::Surface::VideoMemoryLost.
88
+
1
89
  === 1.0.0b6 / 2016-11-17
2
90
 
3
91
  I'm still not happy with the color system. I'd love some help to make it more usable.
@@ -69,6 +69,8 @@ lib/graphics/trail.rb
69
69
  lib/graphics/v.rb
70
70
  resources/images/body.png
71
71
  resources/images/turret.png
72
+ resources/sounds/attribution.txt
73
+ resources/sounds/bullet.wav
72
74
  test/test_graphics.rb
73
75
  test/test_rainbows.rb
74
76
  test/test_sdl.rb
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "rubygems"
4
4
  require "hoe"
5
5
 
6
6
  Hoe.plugin :isolate
7
- Hoe.plugin :minitest, :history, :email # Hoe.plugin :seattlerb - :perforce
7
+ Hoe.plugin :seattlerb
8
8
  Hoe.plugin :rdoc
9
9
  Hoe.plugin :git
10
10
  Hoe.plugin :compiler
@@ -17,18 +17,17 @@ Hoe.spec "graphics" do
17
17
  extension :sdl
18
18
 
19
19
  license "MIT"
20
-
21
- dependency "rsdl", "~> 0.1"
22
-
23
- base = "/data/www/docs.seattlerb.org"
24
- rdoc_locations << "docs-push.seattlerb.org:#{base}/#{remote_rdoc_dir}"
25
20
  end
26
21
 
27
22
  task :demos => :compile do
28
- Dir["examples/*.rb"].each do |script|
23
+ Dir["examples/*.rb"].sort.each do |script|
29
24
  puts script
30
- system "rsdl -Ilib #{script}"
25
+ system "ruby -Ilib #{script}"
31
26
  end
32
27
  end
33
28
 
29
+ task :sanity => :compile do
30
+ sh %[ruby -Ilib -rgraphics -e 'Class.new(Graphics::Simulation) { def draw n; clear :white; text "hit escape to quit", 100, 100, :black; end; }.new(500, 250, "Working!").run']
31
+ end
32
+
34
33
  # vim: syntax=ruby
@@ -39,18 +39,16 @@ class Boid < Graphics::Body
39
39
 
40
40
  self.velocity += v1 + v2 + v3
41
41
  limit_velocity
42
- self.position += self.velocity
43
42
 
43
+ move
44
44
  wrap
45
-
46
- @nearby = nil
47
45
  end
48
46
 
49
47
  def nearby
50
- @nearby ||= begin
51
- p = self.position
52
- w.boids.find_all { |b| (b.position - p).magnitude.abs < @@max_distance }
53
- end
48
+ p = self.position
49
+ w.boids.find_all { |b|
50
+ b != self && (b.position - p).magnitude < Boid.max_distance
51
+ }
54
52
  end
55
53
 
56
54
  def limit_velocity
@@ -60,20 +58,11 @@ class Boid < Graphics::Body
60
58
  end
61
59
 
62
60
  def center_mass
63
- pos = V::ZERO
64
- nearby.each do |b|
65
- next if self == b
66
-
67
- pos += b.position
68
- end
69
-
70
- size = nearby.size - 1
71
-
72
- return self.position if size == 0
61
+ nearby = self.nearby
73
62
 
74
- pos /= size
63
+ return position if nearby.empty?
75
64
 
76
- pos
65
+ nearby.avg(V::ZERO, &:position)
77
66
  end
78
67
 
79
68
  ##
@@ -180,21 +169,17 @@ class Boid < Graphics::Body
180
169
  # enough apart for our liking.
181
170
 
182
171
  def rule2
183
- c = V::ZERO
184
-
185
- hits = 0
186
-
187
- nearby.each do |b|
188
- next if self == b
172
+ too_close = nearby.filter_map { |b|
189
173
  diff = b.position - self.position
190
- next unless diff.magnitude.abs < TOO_CLOSE
191
- hits += 1
192
- c -= diff if diff.magnitude.abs < TOO_CLOSE
174
+ next unless diff.magnitude < TOO_CLOSE
175
+ diff
176
+ }
177
+
178
+ if too_close.empty? then
179
+ V::ZERO
180
+ else
181
+ -too_close.avg(V::ZERO) / 8
193
182
  end
194
-
195
- c /= hits unless hits == 0 # average it out so they don't overdo it
196
-
197
- c / 8
198
183
  end
199
184
 
200
185
  ##
@@ -221,21 +206,14 @@ class Boid < Graphics::Body
221
206
  #
222
207
  # END PROCEDURE
223
208
 
224
- def rule3
225
- v = V::ZERO
209
+ def rule3 # alignment
210
+ nearby = self.nearby
226
211
 
227
- nearby.each do |b|
228
- next if self == b
229
- v += b.velocity
230
- end
231
-
232
- size = nearby.size - 1
233
-
234
- return self.velocity if size == 0
212
+ return velocity if nearby.empty?
235
213
 
236
- v /= size unless size == 0
214
+ v = nearby.avg(V::ZERO, &:velocity)
237
215
 
238
- (v - self.velocity) / 4
216
+ (v - velocity) / 4
239
217
  end
240
218
 
241
219
  class View
@@ -243,8 +221,8 @@ class Boid < Graphics::Body
243
221
  x, y, a, m = b.x, b.y, b.a, b.m
244
222
 
245
223
  w.circle x, y, Boid.max_distance, :gray if w.visual_debug?
246
- w.blit w.body_img, x, y # the blit looks HORRIBLE when rotated... dunno why
247
224
  w.angle x, y, a, 3 * m, :red
225
+ w.blit w.body_img, x, y, a
248
226
  end
249
227
  end
250
228
  end
@@ -255,7 +233,7 @@ class Boids < Graphics::Simulation
255
233
  alias :visual_debug? :visual_debug
256
234
 
257
235
  def initialize
258
- super 850, 850, 16, "Boid"
236
+ super 850, 850
259
237
 
260
238
  self.visual_debug = false
261
239
 
@@ -263,7 +241,7 @@ class Boids < Graphics::Simulation
263
241
  register_bodies boids
264
242
 
265
243
  self.body_img = sprite 20, 20 do
266
- circle 10, 10, 5, :white, :filled
244
+ circle 10, 10, 5, :white, :filled, :aa
267
245
  end
268
246
  end
269
247
 
@@ -283,14 +261,18 @@ class Boids < Graphics::Simulation
283
261
  end
284
262
  end
285
263
 
286
- if $0 == __FILE__
287
- if ARGV.first == "test"
288
- require "minitest/autorun"
289
- else
290
- Boids.new.run
264
+ module Enumerable
265
+ def filter_map &block
266
+ map(&block).select(&:itself)
267
+ end
268
+
269
+ def avg init=0, &block
270
+ sum(init, &block) / length
291
271
  end
292
272
  end
293
273
 
274
+ Boids.new.run
275
+
294
276
  # Further tweaks
295
277
  #
296
278
  # The three boids rules sufficiently demonstrate a complex emergent
@@ -310,8 +292,8 @@ end
310
292
  # v1 = rule1(b)
311
293
  # v2 = rule2(b)
312
294
  # v3 = rule3(b)
313
- # v4 = rule4(b)
314
- # .
295
+ # v4 = rule4(b)
296
+ # .
315
297
  # .
316
298
  # .
317
299
  #
@@ -473,19 +455,18 @@ end
473
455
  # PROCEDURE move_all_boids_to_new_positions()
474
456
  #
475
457
  # Vector v1, v2, v3, ...
476
- # Boid b
458
+ # Boid b
477
459
  #
478
460
  # FOR EACH BOID b
479
461
  #
480
462
  # IF b.perching THEN
481
- # IF b.perch_timer > 0 THEN
482
- # b.perch_timer = b.perch_timer - 1
483
- # NEXT
484
- # ELSE
485
- # b.perching = FALSE
486
- # END IF
487
- # END IF
488
- #
463
+ # IF b.perch_timer > 0 THEN
464
+ # b.perch_timer = b.perch_timer - 1
465
+ # NEXT
466
+ # ELSE
467
+ # b.perching = FALSE
468
+ # END IF
469
+ # END IF
489
470
  #
490
471
  # v1 = rule1(b)
491
472
  # v2 = rule2(b)
@@ -29,8 +29,8 @@ class Ball < Graphics::Body
29
29
 
30
30
  class View
31
31
  def self.draw w, b
32
- w.angle b.x, b.y, b.a, 10+3*b.m, :red
33
- w.circle b.x, b.y, 5, :white, :filled
32
+ w.angle b.x, b.y, b.a, 10+3*b.m, :red
33
+ w.circle b.x, b.y, 5, :white, :filled
34
34
  end
35
35
  end
36
36
  end
@@ -39,7 +39,7 @@ class BounceSimulation < Graphics::Simulation
39
39
  attr_accessor :bs
40
40
 
41
41
  def initialize
42
- super 640, 640, 16, "Bounce"
42
+ super
43
43
 
44
44
  self.bs = populate Ball
45
45
  register_bodies bs
@@ -72,7 +72,7 @@ class BounceSimulation < Graphics::Simulation
72
72
  LOG_INTERVAL = 120
73
73
 
74
74
  def log
75
- puts bs.map(&:m).inject(&:+)
75
+ puts "%.1f" % bs.inject(0) { |ms, o| ms + o.m }
76
76
  end
77
77
  end
78
78
 
@@ -6,19 +6,19 @@ require "graphics"
6
6
  class Demo < Graphics::Simulation
7
7
  CLEAR_COLOR = :white
8
8
 
9
- attr_accessor :woot, :menlo32
9
+ attr_accessor :woot, :big_font
10
10
  attr_accessor :rct
11
11
 
12
12
  def initialize
13
13
  super 801, 801
14
14
 
15
- self.font = find_font("Menlo", 16)
16
- self.menlo32 = find_font("Menlo", 32)
15
+ self.font = find_font(DEFAULT_FONT, 16)
16
+ self.big_font = find_font(DEFAULT_FONT, 32)
17
17
 
18
- self.woot = render_text "woot", :black, menlo32
18
+ self.woot = render_text "woot", :black, big_font
19
19
 
20
20
  self.rct = sprite 50, 25 do
21
- rect 0, 0, 49, 24, :blue # TODO: can't be black?!?
21
+ rect 0, 0, 49, 24, :black
22
22
  end
23
23
  end
24
24
 
@@ -32,18 +32,17 @@ class Demo < Graphics::Simulation
32
32
  clear
33
33
 
34
34
  (0..90).step(30) do |deg|
35
- shift = (woot.h*Math.sin(D2R*deg))
36
- put woot, 400-shift, 300, deg
35
+ put woot, 400, 300, deg
37
36
  end
38
- text "woot", 400, 300, :red, menlo32
37
+ text "woot", 400, 300, :red, big_font
39
38
 
40
- rect 550, 100, 50, 50, :blue, :filled
41
- rect 575, 125, 50, 50, :blue
39
+ rect 550, 100, 50, 50, :black, :filled
40
+ rect 575, 125, 50, 50, :black
42
41
 
43
42
  ellipse 550, 200, 50, 25, :red
44
43
  ellipse 550, 250, 50, 25, :red, :filled
45
44
 
46
- angle 50, 50, 90, 25, :blue
45
+ angle 50, 50, 90, 25, :black
47
46
 
48
47
  (0..w).step(100) do |x|
49
48
  vline x, :red
@@ -55,22 +54,24 @@ class Demo < Graphics::Simulation
55
54
  text y.to_s, 5, y+5, :black
56
55
  end
57
56
 
58
- circle 200, 200, 100, :blue
59
- text "circle 200, 200, 100, :blue", 100, 200, :black
57
+ circle 200, 200, 100, :black
58
+ text "circle 200, 200, 100, :black", 100, 200, :black
60
59
 
61
- bezier 400, 400, 450, 700, 550, 300, 600, 600, :blue
62
- text "bezier 400, 400, 450, 700, 550, 300, 600, 600, :blue", 200, 400, :black
60
+ bezier 400, 400, 450, 700, 550, 300, 600, 600, :black
61
+ text "bezier 400, 400, 450, 700, 550, 300, 600, 600, :black", 200, 400, :black
63
62
 
64
63
  angle 200, 500, A, L, :black
65
64
  text "angle 200, 500, %.2f, %.2f, :black" % [A, L], 100, 500, :black
66
65
 
67
66
  (0..90).step(30).each do |deg|
68
- put rct, 500-(rct.h*Math.sin(D2R*deg)), 600, deg
67
+ put rct, 500, 600, deg
69
68
  angle 500, 600, deg, 50, :red
70
69
 
71
70
  blit rct, 600, 600, deg
72
71
  angle 600, 600, deg, 50, :red
73
72
  end
73
+ text "put rct, 500, 600, deg", 500, 600-30, :black
74
+ text "blit rct, 600, 600, deg", 600, 600-60, :black
74
75
  end
75
76
  end
76
77