ruby-processing 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/CHANGELOG +12 -0
  2. data/README +3 -0
  3. data/lib/core/core.jar +0 -0
  4. data/lib/core/jruby-complete.jar +0 -0
  5. data/lib/patches/JRubyApplet.diff +24 -0
  6. data/lib/patches/PATCHES.txt +3 -0
  7. data/lib/patches/PApplet.diff +27 -0
  8. data/lib/ruby-processing.rb +4 -1
  9. data/lib/ruby-processing/app.rb +121 -75
  10. data/lib/ruby-processing/exporters/applet_exporter.rb +1 -1
  11. data/lib/ruby-processing/exporters/base_exporter.rb +21 -16
  12. data/lib/ruby-processing/exporters/creator.rb +12 -6
  13. data/lib/ruby-processing/runner.rb +2 -2
  14. data/lib/ruby-processing/runners/base.rb +59 -0
  15. data/lib/ruby-processing/runners/live.rb +2 -2
  16. data/lib/ruby-processing/runners/run.rb +2 -1
  17. data/lib/ruby-processing/runners/watch.rb +47 -11
  18. data/lib/templates/applet/index.html.erb +6 -6
  19. data/lib/templates/create/bare_sketch.rb.erb +7 -0
  20. data/lib/templates/create/blank_sketch.rb.erb +2 -2
  21. data/library/control_panel/control_panel.rb +6 -2
  22. data/library/opengl/library/export.txt +0 -0
  23. data/library/opengl/library/opengl.jar +0 -0
  24. data/library/pdf/library/itext.jar +0 -0
  25. data/library/pdf/library/pdf.jar +0 -0
  26. data/library/pdf/notes.txt +3 -4
  27. data/samples/animator.rb +35 -39
  28. data/samples/bezier_playground.rb +2 -4
  29. data/samples/fern.rb +34 -42
  30. data/samples/flight_patterns.rb +48 -54
  31. data/samples/full_screen.rb +20 -25
  32. data/samples/getting_started.rb +19 -39
  33. data/samples/learning_processing/chapter_01/1_stroke_and_fill.rb +14 -30
  34. data/samples/learning_processing/chapter_01/2_nofill.rb +18 -23
  35. data/samples/learning_processing/chapter_01/3_rgb_color.rb +16 -28
  36. data/samples/learning_processing/chapter_01/4_alpha_transparency.rb +7 -1
  37. data/samples/learning_processing/chapter_01/5_zoog.rb +20 -33
  38. data/samples/learning_processing/chapter_02/1_zoog_again.rb +3 -1
  39. data/samples/learning_processing/chapter_03/6_interactive_zoog.rb +34 -42
  40. data/samples/learning_processing/chapter_16/03_adjust_video_brightness.rb +49 -0
  41. data/samples/learning_processing/chapter_17/01_simple_displaying_text.rb +14 -0
  42. data/samples/learning_processing/chapter_17/02_text_align.rb +21 -0
  43. data/samples/learning_processing/chapter_17/03_scrolling_headlines.rb +35 -0
  44. data/samples/learning_processing/chapter_17/04_text_mirror.rb +68 -0
  45. data/samples/learning_processing/chapter_17/05_rotating_text.rb +22 -0
  46. data/samples/learning_processing/chapter_17/06_text_breaking_up.rb +73 -0
  47. data/samples/learning_processing/chapter_17/07_boxes_along_a_curve.rb +49 -0
  48. data/samples/learning_processing/chapter_17/08_characters_along_a_curve.rb +51 -0
  49. data/samples/learning_processing/chapter_17/data/ArialMT-16.vlw +0 -0
  50. data/samples/learning_processing/chapter_17/data/Courier-Bold-20.vlw +0 -0
  51. data/samples/learning_processing/chapter_18/01_user_input.rb +39 -0
  52. data/samples/learning_processing/chapter_18/02_graphing_comma_separated_numbers_from_a_text_file.rb +28 -0
  53. data/samples/learning_processing/chapter_18/03_creating_object_from_a_text_file.rb +64 -0
  54. data/samples/learning_processing/chapter_18/data/data-1.txt +1 -0
  55. data/samples/learning_processing/chapter_18/data/data-2.txt +10 -0
  56. data/samples/orbit.rb +45 -0
  57. data/samples/processing_app/basics/image/pointillism.rb +1 -1
  58. data/samples/processing_app/topics/effects/lens.rb +1 -0
  59. metadata +30 -13
  60. data/library/opengl/bin/processing/opengl/PGraphicsOpenGL$ImageCache.class +0 -0
  61. data/library/opengl/bin/processing/opengl/PGraphicsOpenGL$TessCallback.class +0 -0
  62. data/library/opengl/bin/processing/opengl/PGraphicsOpenGL.class +0 -0
  63. data/library/pdf/bin/processing/pdf/PGraphicsPDF.class +0 -0
data/CHANGELOG CHANGED
@@ -1,3 +1,15 @@
1
+ v1.0.4 Bare is Beautiful...
2
+ * Ruby-Processing now supports "bare" sketches, which are sketches that
3
+ consist of only setup and draw methods, or sketches that contain no method
4
+ definitions at all (implicitly wrapping them in a 'setup'). This works
5
+ by pre-processing the code.
6
+ * Initialization heavily tweaked so that size() works as in Processing,
7
+ from within setup(), and so that you can call full_screen as a class method,
8
+ in your class definition, to avoid the need for explicit sketch instantiation.
9
+ * "rp5 create" has a "--bare" option.
10
+ * Many samples now use the bare style, and more "Learning Processing" examples
11
+ were contributed by Juris Galang.
12
+
1
13
  v1.0.3 Tweaks and Tuneups...
2
14
  * "rp5 watch" is now a bit more robust, and tries to reload every
3
15
  * file, global, and constant that it thinks it needs to.
data/README CHANGED
@@ -17,6 +17,9 @@
17
17
  * Live Coding via JRuby's IRB. Loads in your sketch so you can futz with
18
18
  variables and remake methods on the fly.
19
19
 
20
+ * Bare sketches. Write your Ruby-Processing sketches without having to define
21
+ a class. Without defining methods, even.
22
+
20
23
  * A "Control Panel" library, so that you can easily create sliders, buttons,
21
24
  checkboxes and drop-down menus, and hook them into your sketch's instance
22
25
  variables.
data/lib/core/core.jar CHANGED
Binary file
Binary file
@@ -0,0 +1,24 @@
1
+ Index: src/org/jruby/JRubyApplet.java
2
+ ===================================================================
3
+ --- src/org/jruby/JRubyApplet.java (revision 9392)
4
+ +++ src/org/jruby/JRubyApplet.java (working copy)
5
+ @@ -257,6 +257,10 @@
6
+ }
7
+ }
8
+
9
+ + public synchronized void eval(String code) {
10
+ + this.runtime.evalScriptlet(code);
11
+ + }
12
+ +
13
+ public synchronized void setBackgroundColor(Color color) {
14
+ backgroundColor = color;
15
+ repaint();
16
+ @@ -381,7 +385,7 @@
17
+
18
+ public ConsoleFacade(String bannerText) {
19
+ textPane = new JTextPane();
20
+ - textPane.setMargin(new Insets(4, 4, 0, 4));
21
+ + textPane.setMargin(new Insets(4, 4, 0, 4));
22
+ textPane.setCaretColor(new Color(0xa4, 0x00, 0x00));
23
+ textPane.setBackground(new Color(0xf2, 0xf2, 0xf2));
24
+ textPane.setForeground(new Color(0xa4, 0x00, 0x00));
@@ -0,0 +1,3 @@
1
+ These patches should be applied to the JRuby and Processing sources, respectively
2
+ before vendoring them into Ruby-Processing. It is my fervent wish that one day
3
+ we'll be rid of both.
@@ -0,0 +1,27 @@
1
+ Index: core/src/processing/core/PApplet.java
2
+ ===================================================================
3
+ --- core/src/processing/core/PApplet.java (revision 5371)
4
+ +++ core/src/processing/core/PApplet.java (working copy)
5
+ @@ -1386,7 +1386,22 @@
6
+ } catch (RendererChangeException e) {
7
+ // Give up, instead set the new renderer and re-attempt setup()
8
+ return;
9
+ +
10
+ + // Catch a JRuby exception so that the RendererChangeExceptions
11
+ + // that we're looking for don't get stuck in Ruby-space.
12
+ + } catch (RuntimeException e) {
13
+ + String message = e.getMessage();
14
+ + String name = RendererChangeException.class.getName();
15
+ + String regex = "(?s).*" + name + ".*";
16
+ + regex = regex.replace("$", "\\$");
17
+ + if (message != null && message.matches(regex)) {
18
+ + // Give up, instead set the new renderer and re-attempt setup()
19
+ + return;
20
+ + } else {
21
+ + throw e;
22
+ + }
23
+ }
24
+ +
25
+ this.defaultSize = false;
26
+
27
+ } else { // frameCount > 0, meaning an actual draw()
@@ -7,12 +7,14 @@ unless defined? RP5_ROOT
7
7
  RP5_ROOT = File.expand_path(File.dirname(__FILE__) + "/../")
8
8
  end
9
9
 
10
+ SKETCH_ROOT = Dir.pwd unless defined? SKETCH_ROOT
11
+
10
12
  require 'ruby-processing/helpers/string'
11
13
  require 'ruby-processing/helpers/numeric'
12
14
 
13
15
  # The top-level namespace, a home for all Ruby-Processing classes.
14
16
  module Processing
15
- VERSION = [1,0,3] unless defined? Processing::VERSION
17
+ VERSION = [1,0,4] unless defined? Processing::VERSION
16
18
 
17
19
  # Returns the current version of Ruby-Processing.
18
20
  def self.version
@@ -21,6 +23,7 @@ module Processing
21
23
 
22
24
  autoload :App, 'ruby-processing/app'
23
25
  autoload :Runner, 'ruby-processing/runner'
26
+ autoload :Watcher, 'ruby-processing/runners/watch'
24
27
  autoload :Creator, 'ruby-processing/exporters/creator'
25
28
  autoload :BaseExporter, 'ruby-processing/exporters/base_exporter'
26
29
  autoload :AppletExporter, 'ruby-processing/exporters/applet_exporter'
@@ -4,7 +4,7 @@
4
4
 
5
5
  require 'java'
6
6
 
7
- module Processing
7
+ module Processing
8
8
 
9
9
  # Conditionally load core.jar
10
10
  require "#{RP5_ROOT}/lib/core/core.jar" unless Object.const_defined?(:JRUBY_APPLET)
@@ -19,8 +19,6 @@ module Processing
19
19
  # called constantly, for every frame.
20
20
  class App < PApplet
21
21
  include Math
22
-
23
- import "javax.swing.JFrame"
24
22
 
25
23
  # Include some processing classes that we'd like to use:
26
24
  %w(PShape PImage PGraphics PFont PVector).each do |klass|
@@ -46,6 +44,10 @@ module Processing
46
44
  :key_released => :keyReleased,
47
45
  :key_typed => :keyTyped
48
46
  }
47
+
48
+ # Override the default width and height to make them a little larger.
49
+ DEFAULT_WIDTH = 200
50
+ DEFAULT_HEIGHT = 200
49
51
 
50
52
 
51
53
  def self.method_added(method_name) #:nodoc:
@@ -67,8 +69,18 @@ module Processing
67
69
  end
68
70
 
69
71
 
70
- def self.current=(app); @current_app = app; end
71
- def self.current; @current_app; end
72
+ # Handy getters and setters on the class go here:
73
+ def self.sketch_class; @sketch_class; end
74
+ def self.full_screen; @@full_screen = true; end
75
+ def full_screen?; @@full_screen; end
76
+
77
+
78
+ # Keep track of what inherits from the Processing::App, because we're going
79
+ # to want to instantiate one.
80
+ def self.inherited(subclass)
81
+ super(subclass)
82
+ @sketch_class = subclass
83
+ end
72
84
 
73
85
 
74
86
  # Are we running inside an applet?
@@ -103,8 +115,14 @@ module Processing
103
115
  def self.load_ruby_library(dir)
104
116
  dir = dir.to_sym
105
117
  return true if @@loaded_libraries[dir]
106
- return @@loaded_libraries[dir] = (require "library/#{dir}/#{dir}") if online?
107
- local_path = "#{Dir.pwd}/library/#{dir}"
118
+ if online?
119
+ begin
120
+ return @@loaded_libraries[dir] = (require "library/#{dir}/#{dir}")
121
+ rescue LoadError => e
122
+ return false
123
+ end
124
+ end
125
+ local_path = "#{SKETCH_ROOT}/library/#{dir}"
108
126
  gem_path = "#{RP5_ROOT}/library/#{dir}"
109
127
  path = File.exists?(local_path) ? local_path : gem_path
110
128
  return false unless (File.exists?("#{path}/#{dir}.rb"))
@@ -122,10 +140,10 @@ module Processing
122
140
  dir = dir.to_sym
123
141
  return true if @@loaded_libraries[dir]
124
142
  return @@loaded_libraries[dir] = !!(JRUBY_APPLET.get_parameter("archive").match(%r(#{dir}))) if online?
125
- local_path = "#{Dir.pwd}/library/#{dir}"
143
+ local_path = "#{SKETCH_ROOT}/library/#{dir}"
126
144
  gem_path = "#{RP5_ROOT}/library/#{dir}"
127
145
  path = File.exists?(local_path) ? local_path : gem_path
128
- jars = Dir.glob("#{path}/**/*.jar")
146
+ jars = Dir["#{path}/**/*.jar"]
129
147
  return false if jars.empty?
130
148
  jars.each {|jar| require jar }
131
149
  # Here goes...
@@ -139,23 +157,12 @@ module Processing
139
157
  end
140
158
  return @@loaded_libraries[dir] = true
141
159
  end
142
-
160
+
143
161
 
144
162
  def self.has_slider(*args) #:nodoc:
145
163
  raise "has_slider has been replaced with a nicer control_panel library. Check it out."
146
164
  end
147
-
148
-
149
- # Used by the Processing::Watcher to completely remove all
150
- # traces of the current sketch, so that it can be loaded afresh.
151
- def self.wipe_out_current_app!
152
- app = Processing::App.current
153
- return unless app
154
- app_class_name = app.class.to_s.to_sym
155
- app.close
156
- Object.send(:remove_const, app_class_name)
157
- end
158
-
165
+
159
166
 
160
167
  # When you make a new sketch, you pass in (optionally),
161
168
  # a width, height, title, and whether or not you want to
@@ -163,20 +170,26 @@ module Processing
163
170
  #
164
171
  # This is a little different than Processing where height
165
172
  # and width are declared inside the setup method instead.
166
- def initialize(options = {})
173
+ def initialize(options={})
167
174
  super()
168
- $app = App.current = self
175
+ $app = self
176
+ proxy_java_fields
169
177
  set_sketch_path unless online?
170
- make_accessible_to_the_browser
171
- options = {
172
- :width => 400,
173
- :height => 400,
174
- :title => "",
175
- :full_screen => false
176
- }.merge(options)
177
- @width, @height, @title = options[:width], options[:height], options[:title]
178
- @render_mode = JAVA2D
179
- determine_how_to_display options
178
+ make_accessible_to_the_browser if online?
179
+ @width = options[:width] || DEFAULT_WIDTH
180
+ @height = options[:height] || DEFAULT_HEIGHT
181
+ @title = options[:title] || File.basename(Processing::SKETCH_PATH, '.rb').titleize
182
+ @render_mode ||= JAVA2D
183
+ @@full_screen ||= options[:full_screen]
184
+ self.init
185
+ determine_how_to_display
186
+ end
187
+
188
+
189
+ # Make sure we set the size if we set it before we start the animation thread.
190
+ def start
191
+ self.size(@width, @height)
192
+ super()
180
193
  end
181
194
 
182
195
 
@@ -189,10 +202,17 @@ module Processing
189
202
  # By default, your sketch path is the folder that your sketch is in.
190
203
  # If you'd like to do something fancy, feel free.
191
204
  def set_sketch_path(path=nil)
192
- field = self.java_class.declared_field('sketchPath')
193
- local = File.dirname(SKETCH_PATH)
205
+ field = @declared_fields['sketchPath']
206
+ local = SKETCH_ROOT
194
207
  default = $__windows_app_mode__ ? "#{local}/lib" : local
195
- field.set_value(Java.ruby_to_java(self), path || default)
208
+ field.set_value(java_self, path || default)
209
+ end
210
+
211
+
212
+ # Specify what rendering Processing should use, without needing to pass size.
213
+ def render_mode(mode_const)
214
+ @render_mode = mode_const
215
+ size(@width, @height, @render_mode)
196
216
  end
197
217
 
198
218
 
@@ -204,13 +224,6 @@ module Processing
204
224
  end
205
225
 
206
226
 
207
- # Specify what rendering Processing should use.
208
- def render_mode(mode_const)
209
- @render_mode = mode_const
210
- size(@width, @height, @render_mode)
211
- end
212
-
213
-
214
227
  # Nice block method to draw to a buffer.
215
228
  # You can optionally pass it a width, a height, and a renderer.
216
229
  # Takes care of starting and ending the draw for you.
@@ -232,14 +245,18 @@ module Processing
232
245
  yield x, y
233
246
  end
234
247
  end
248
+
249
+
250
+ # Provide a convenient handle for the Java-space version of self.
251
+ def java_self
252
+ @java_self ||= Java.ruby_to_java self
253
+ end
235
254
 
236
255
 
237
256
  # Fix java conversion problems getting the last key
238
257
  # If it's ASCII, return the character, otherwise the integer
239
258
  def key
240
- field = java_class.declared_field 'key'
241
- app = Java.ruby_to_java self
242
- int = field.value(app)
259
+ int = @declared_fields['key'].value(java_self)
243
260
  int < 256 ? int.chr : int
244
261
  end
245
262
 
@@ -260,6 +277,25 @@ module Processing
260
277
  def key_code; keyCode; end
261
278
 
262
279
 
280
+ # frame_rate needs to support reading and writing
281
+ def frame_rate(fps = nil)
282
+ return @declared_fields['frameRate'].value(java_self) unless fps
283
+ super(fps)
284
+ end
285
+
286
+
287
+ # Is the sketch still displaying with the default size?
288
+ def default_size?
289
+ @declared_fields['defaultSize'].value(java_self)
290
+ end
291
+
292
+
293
+ # Is the sketch done displaying itself?
294
+ def done_displaying?
295
+ @done_displaying
296
+ end
297
+
298
+
263
299
  # Is the mouse pressed for this frame?
264
300
  def mouse_pressed?
265
301
  Java.java_to_primitive(java_class.field("mousePressed").value(java_object))
@@ -277,70 +313,81 @@ module Processing
277
313
  def lerp_color(*args)
278
314
  args.length > 3 ? self.class.lerp_color(*args) : super(*args)
279
315
  end
280
-
316
+
281
317
 
282
318
  # Cleanly close and shutter a running sketch.
283
319
  def close
284
- Processing::App.current = nil
320
+ $app = nil
285
321
  control_panel.remove if respond_to?(:control_panel) && !online?
286
- container = (@frame || JRUBY_APPLET)
322
+ container = online? ? JRUBY_APPLET : @frame
287
323
  container.remove(self)
288
324
  self.destroy
289
325
  container.dispose
290
326
  end
291
-
292
-
293
- def quit
294
- exit
295
- end
296
327
 
297
328
 
298
329
  private
299
330
 
331
+ # Proxy over a list of Java declared fields that have the same name as
332
+ # some methods. Add to this list as needed.
333
+ def proxy_java_fields
334
+ @declared_fields = {}
335
+ fields = %w(sketchPath key frameRate defaultSize)
336
+ fields.each {|f| @declared_fields[f] = java_class.declared_field(f) }
337
+ end
338
+
339
+
300
340
  # Tests to see which display method should run.
301
- def determine_how_to_display(options)
302
- if online? # Then display it in an applet.
341
+ def determine_how_to_display
342
+ # Wait for init to get its grey tracksuit on and run a few laps.
343
+ sleep 0.02 while default_size? && !@@full_screen
344
+
345
+ if online?
303
346
  display_in_an_applet
304
- elsif options[:full_screen] # Then display it fullscreen.
305
- graphics_env = java.awt.GraphicsEnvironment.get_local_graphics_environment.get_default_screen_device
306
- graphics_env.is_full_screen_supported ? display_full_screen(graphics_env) : display_in_a_window
307
- else # Then display it in a window.
347
+ elsif full_screen?
348
+ # linux doesn't support full screen exclusive mode, but don't worry, it works very well
349
+ display = java.awt.GraphicsEnvironment.get_local_graphics_environment.get_default_screen_device
350
+ linux = java.lang.System.get_property("os.name") == "Linux"
351
+ supported = display.full_screen_supported?
352
+ supported || linux ? display_full_screen(display) : display_in_a_window
353
+ else
308
354
  display_in_a_window
309
355
  end
356
+ @done_displaying = true
310
357
  end
311
358
 
312
359
 
313
- def display_full_screen(graphics_env)
314
- @frame = java.awt.Frame.new
315
- mode = graphics_env.display_mode
360
+ # Go full screen, if possible
361
+ def display_full_screen(display)
362
+ @frame = java.awt.Frame.new(display.default_configuration)
363
+ mode = display.display_mode
316
364
  @width, @height = mode.get_width, mode.get_height
317
- gc = graphics_env.get_default_configuration
318
365
  @frame.set_undecorated true
366
+ @frame.set_ignore_repaint true
319
367
  @frame.set_background java.awt.Color.black
320
368
  @frame.set_layout java.awt.BorderLayout.new
321
369
  @frame.add(self, java.awt.BorderLayout::CENTER)
322
370
  @frame.pack
323
- graphics_env.set_full_screen_window @frame
371
+ display.set_full_screen_window @frame
324
372
  @frame.set_location(0, 0)
325
373
  @frame.show
326
- self.init
327
374
  self.request_focus
328
375
  end
329
376
 
330
377
 
331
378
  def display_in_a_window
332
- @frame = JFrame.new(@title)
379
+ @frame = javax.swing.JFrame.new(@title)
333
380
  @frame.add(self)
334
- @frame.setSize(@width, @height + 22)
335
- @frame.setDefaultCloseOperation(JFrame::EXIT_ON_CLOSE)
336
- @frame.setResizable(false)
381
+ @frame.pack
382
+ @frame.set_default_close_operation(javax.swing.JFrame::EXIT_ON_CLOSE)
383
+ @frame.set_resizable(false)
384
+ # Plus 22 for the height of the window's title bar
385
+ @frame.set_size(width, height + 22)
337
386
  @frame.show
338
- self.init
339
387
  end
340
388
 
341
389
 
342
390
  def display_in_an_applet
343
- JRUBY_APPLET.set_size(@width, @height)
344
391
  JRUBY_APPLET.background_color = nil
345
392
  JRUBY_APPLET.double_buffered = false
346
393
  JRUBY_APPLET.add self
@@ -348,7 +395,6 @@ module Processing
348
395
  # Add the callbacks to peacefully expire.
349
396
  JRUBY_APPLET.on_stop { self.stop }
350
397
  JRUBY_APPLET.on_destroy { self.destroy }
351
- self.init
352
398
  end
353
399
 
354
400
 
@@ -356,7 +402,7 @@ module Processing
356
402
  # accessible to javascript as the 'ruby' variable. From javascript,
357
403
  # you can call evalScriptlet() to run code against the sketch.
358
404
  def make_accessible_to_the_browser
359
- return unless library_loaded?('net') && online?
405
+ return unless library_loaded?('net')
360
406
  field = java.lang.Class.for_name("org.jruby.JRubyApplet").get_declared_field("runtime")
361
407
  field.set_accessible true
362
408
  ruby = field.get(JRUBY_APPLET)