ruby-processing 1.0.3 → 1.0.4

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.
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)