ruby-processing 1.0.8 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/lib/core/core.jar +0 -0
- data/lib/core/jruby-complete.jar +0 -0
- data/lib/ruby-processing.rb +5 -10
- data/lib/ruby-processing/app.rb +139 -98
- data/lib/ruby-processing/exporters/applet_exporter.rb +4 -1
- data/lib/ruby-processing/exporters/application_exporter.rb +5 -1
- data/lib/ruby-processing/exporters/base_exporter.rb +3 -2
- data/lib/ruby-processing/runner.rb +54 -46
- data/lib/ruby-processing/runners/base.rb +6 -7
- data/lib/ruby-processing/runners/live.rb +4 -3
- data/lib/ruby-processing/runners/watch.rb +33 -27
- data/library/control_panel/control_panel.rb +24 -23
- data/samples/anar/data/java_args.txt +1 -0
- data/samples/anar/extrusion.rb +49 -0
- data/samples/anar/l_system.rb +86 -0
- data/samples/anar/library/anar/anar.jar +0 -0
- data/samples/anar/many_shapes.rb +98 -0
- data/samples/empathy.rb +73 -0
- data/samples/gravity.rb +113 -0
- data/samples/peasy_cam/data/java_args.txt +1 -0
- data/samples/peasy_cam/hello_peasy.rb +29 -0
- data/samples/peasy_cam/hilbert_fractal.rb +40 -0
- data/samples/peasy_cam/library/PeasyCam/PeasyCam.jar +0 -0
- data/samples/peasy_cam/library/hilbert/hilbert.rb +99 -0
- data/samples/processing_app/3D/form/brick_tower.rb +3 -3
- data/samples/processing_app/basics/data/characters_strings/characters_strings.rb +5 -7
- data/samples/processing_app/basics/form/triangle_strip.rb +11 -11
- data/samples/processing_app/basics/input/keyboard.rb +2 -8
- data/samples/processing_app/basics/input/keyboard_2.rb +4 -4
- data/samples/processing_app/basics/input/keyboard_functions.rb +12 -21
- metadata +41 -64
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
v1.0.9 The Yearly Update...
|
2
|
+
* JRuby upgraded to 1.4.0 final.
|
3
|
+
* Fix to allow arguments to be passed to sketches.
|
4
|
+
* Allow "shape" to be called with a block.
|
5
|
+
* Added new examples, including Monkstone's 3D Anar library and Hilbert curve.
|
6
|
+
|
1
7
|
v1.0.8 Polishing the Windows...
|
2
8
|
* Windows Application exporting works again, merely by virtue of
|
3
9
|
not cluttering up the classpath.
|
data/lib/core/core.jar
CHANGED
Binary file
|
data/lib/core/jruby-complete.jar
CHANGED
Binary file
|
data/lib/ruby-processing.rb
CHANGED
@@ -14,23 +14,18 @@ require 'ruby-processing/helpers/numeric'
|
|
14
14
|
|
15
15
|
# The top-level namespace, a home for all Ruby-Processing classes.
|
16
16
|
module Processing
|
17
|
-
VERSION =
|
18
|
-
|
19
|
-
# Returns the current version of Ruby-Processing.
|
20
|
-
def self.version
|
21
|
-
VERSION.join('.')
|
22
|
-
end
|
23
|
-
|
17
|
+
VERSION = "1.0.9" unless defined? Processing::VERSION
|
18
|
+
|
24
19
|
# Are we online -- inside an applet?
|
25
20
|
def self.online?
|
26
21
|
@online ||= defined?(JRUBY_APPLET)
|
27
22
|
end
|
28
|
-
|
23
|
+
|
29
24
|
# Are we embedded -- inside the Processing IDE?
|
30
25
|
def self.embedded?
|
31
26
|
@embedded ||= defined?(RP5_EMBEDDED)
|
32
|
-
end
|
33
|
-
|
27
|
+
end
|
28
|
+
|
34
29
|
# Autoload a number of constants that we may end up using.
|
35
30
|
autoload :App, 'ruby-processing/app'
|
36
31
|
autoload :Runner, 'ruby-processing/runner'
|
data/lib/ruby-processing/app.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# This class is a thin wrapper around Processing's PApplet.
|
2
|
-
# Most of the code here is for interfacing with Swing,
|
2
|
+
# Most of the code here is for interfacing with Swing,
|
3
3
|
# web applets, going fullscreen and so on.
|
4
4
|
|
5
5
|
require 'java'
|
@@ -7,24 +7,24 @@ require 'java'
|
|
7
7
|
module Processing
|
8
8
|
|
9
9
|
# Conditionally load core.jar
|
10
|
-
require "#{RP5_ROOT}/lib/core/core.jar" unless Processing.online? || Processing.embedded?
|
10
|
+
require "#{RP5_ROOT}/lib/core/core.jar" unless Processing.online? || Processing.embedded?
|
11
11
|
import "processing.core"
|
12
12
|
|
13
13
|
# This is the main Ruby-Processing class, and is what you'll
|
14
14
|
# inherit from when you create a sketch. This class can call
|
15
|
-
# all of the methods available in Processing, and has two
|
15
|
+
# all of the methods available in Processing, and has two
|
16
16
|
# mandatory methods, 'setup' and 'draw', both of which you
|
17
17
|
# should define in your sketch. 'setup' will be called one
|
18
|
-
# time when the sketch is first loaded, and 'draw' will be
|
18
|
+
# time when the sketch is first loaded, and 'draw' will be
|
19
19
|
# called constantly, for every frame.
|
20
20
|
class App < PApplet
|
21
21
|
include Math
|
22
|
-
|
22
|
+
|
23
23
|
# Include some processing classes that we'd like to use:
|
24
24
|
%w(PShape PImage PGraphics PFont PVector).each do |klass|
|
25
25
|
import "processing.core.#{klass}"
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# Alias some methods for familiarity for Shoes coders.
|
29
29
|
attr_accessor :frame, :title
|
30
30
|
alias_method :oval, :ellipse
|
@@ -32,19 +32,19 @@ module Processing
|
|
32
32
|
alias_method :rgb, :color
|
33
33
|
alias_method :gray, :color
|
34
34
|
|
35
|
-
# Watch the definition of these methods, to make sure
|
35
|
+
# Watch the definition of these methods, to make sure
|
36
36
|
# that Processing is able to call them during events.
|
37
|
-
METHODS_TO_WATCH_FOR = {
|
37
|
+
METHODS_TO_WATCH_FOR = {
|
38
38
|
:mouse_pressed => :mousePressed,
|
39
39
|
:mouse_dragged => :mouseDragged,
|
40
40
|
:mouse_clicked => :mouseClicked,
|
41
|
-
:mouse_moved => :mouseMoved,
|
41
|
+
:mouse_moved => :mouseMoved,
|
42
42
|
:mouse_released => :mouseReleased,
|
43
43
|
:key_pressed => :keyPressed,
|
44
44
|
:key_released => :keyReleased,
|
45
45
|
:key_typed => :keyTyped
|
46
46
|
}
|
47
|
-
|
47
|
+
|
48
48
|
|
49
49
|
# When certain special methods get added to the sketch, we need to let
|
50
50
|
# Processing call them by their expected Java names.
|
@@ -56,7 +56,7 @@ module Processing
|
|
56
56
|
|
57
57
|
|
58
58
|
# Class methods that we should make available in the instance.
|
59
|
-
[:map, :pow, :norm, :lerp, :second, :minute, :hour, :day, :month, :year,
|
59
|
+
[:map, :pow, :norm, :lerp, :second, :minute, :hour, :day, :month, :year,
|
60
60
|
:sq, :constrain, :dist, :blend_color, :degrees, :radians, :mag].each do |meth|
|
61
61
|
method = <<-EOS
|
62
62
|
def #{meth}(*args)
|
@@ -65,14 +65,14 @@ module Processing
|
|
65
65
|
EOS
|
66
66
|
eval method
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
|
70
70
|
# Handy getters and setters on the class go here:
|
71
|
-
def self.sketch_class; @sketch_class; end
|
71
|
+
def self.sketch_class; @sketch_class; end
|
72
72
|
def self.full_screen; @@full_screen = true; end
|
73
73
|
def full_screen?; @@full_screen; end
|
74
|
-
|
75
|
-
|
74
|
+
|
75
|
+
|
76
76
|
# Keep track of what inherits from the Processing::App, because we're going
|
77
77
|
# to want to instantiate one.
|
78
78
|
def self.inherited(subclass)
|
@@ -87,21 +87,24 @@ module Processing
|
|
87
87
|
@@loaded_libraries[folder.to_sym]
|
88
88
|
end
|
89
89
|
def library_loaded?(folder); self.class.library_loaded?(folder); end
|
90
|
-
|
91
|
-
|
90
|
+
|
91
|
+
|
92
92
|
# Load a list of Ruby or Java libraries (in that order)
|
93
93
|
# Usage: load_libraries :opengl, :boids
|
94
94
|
#
|
95
95
|
# If a library is put into a 'library' folder next to the sketch it will
|
96
96
|
# be used instead of the library that ships with Ruby-Processing.
|
97
97
|
def self.load_libraries(*args)
|
98
|
-
args.each
|
98
|
+
args.each do |lib|
|
99
|
+
loaded = load_ruby_library(lib) || load_java_library(lib)
|
100
|
+
raise LoadError.new "no such file to load -- #{lib}" if !loaded
|
101
|
+
end
|
99
102
|
end
|
100
103
|
def self.load_library(*args); self.load_libraries(*args); end
|
101
104
|
|
102
105
|
|
103
106
|
# For pure ruby libraries.
|
104
|
-
# The library should have an initialization ruby file
|
107
|
+
# The library should have an initialization ruby file
|
105
108
|
# of the same name as the library folder.
|
106
109
|
def self.load_ruby_library(dir)
|
107
110
|
dir = dir.to_sym
|
@@ -124,8 +127,8 @@ module Processing
|
|
124
127
|
# For pure java libraries, such as the ones that are available
|
125
128
|
# on this page: http://processing.org/reference/libraries/index.html
|
126
129
|
#
|
127
|
-
# P.S. -- Loading libraries which include native code needs to
|
128
|
-
# hack the Java ClassLoader, so that you don't have to
|
130
|
+
# P.S. -- Loading libraries which include native code needs to
|
131
|
+
# hack the Java ClassLoader, so that you don't have to
|
129
132
|
# futz with your PATH. But it's probably bad juju.
|
130
133
|
def self.load_java_library(dir)
|
131
134
|
dir = dir.to_sym
|
@@ -148,16 +151,16 @@ module Processing
|
|
148
151
|
end
|
149
152
|
return @@loaded_libraries[dir] = true
|
150
153
|
end
|
151
|
-
|
154
|
+
|
152
155
|
|
153
156
|
def self.has_slider(*args) #:nodoc:
|
154
157
|
raise "has_slider has been replaced with a nicer control_panel library. Check it out."
|
155
158
|
end
|
156
|
-
|
157
159
|
|
158
|
-
|
159
|
-
#
|
160
|
-
#
|
160
|
+
|
161
|
+
# When you make a new sketch, you pass in (optionally),
|
162
|
+
# a width, height, x, y, title, and whether or not you want to
|
163
|
+
# run in full-screen.
|
161
164
|
#
|
162
165
|
# This is a little different than Processing where height
|
163
166
|
# and width are declared inside the setup method instead.
|
@@ -167,20 +170,22 @@ module Processing
|
|
167
170
|
proxy_java_fields
|
168
171
|
set_sketch_path unless Processing.online?
|
169
172
|
# make_accessible_to_the_browser if Processing.online?
|
170
|
-
default_title = File.basename(
|
171
|
-
@width
|
172
|
-
@height
|
173
|
-
@
|
174
|
-
@
|
175
|
-
|
173
|
+
default_title = File.basename(SKETCH_PATH).sub(/(\.rb|\.pde)$/, '').titleize
|
174
|
+
@width = options[:width]
|
175
|
+
@height = options[:height]
|
176
|
+
@frame_x = options[:x] || 0
|
177
|
+
@frame_y = options[:y] || 0
|
178
|
+
@title = options[:title] || default_title
|
179
|
+
@render_mode ||= JAVA2D
|
180
|
+
@@full_screen ||= options[:full_screen]
|
176
181
|
self.init
|
177
182
|
determine_how_to_display
|
178
183
|
end
|
179
|
-
|
180
|
-
|
184
|
+
|
185
|
+
|
181
186
|
# Make sure we set the size if we set it before we start the animation thread.
|
182
187
|
def start
|
183
|
-
self.size(@width, @height)
|
188
|
+
self.size(@width, @height) if @width && @height
|
184
189
|
mix_proxy_into_inner_classes
|
185
190
|
super()
|
186
191
|
end
|
@@ -190,16 +195,28 @@ module Processing
|
|
190
195
|
def inspect
|
191
196
|
"#<Processing::App:#{self.class}:#{@title}>"
|
192
197
|
end
|
193
|
-
|
194
|
-
|
198
|
+
|
199
|
+
|
195
200
|
# By default, your sketch path is the folder that your sketch is in.
|
196
201
|
# If you'd like to do something fancy, feel free.
|
197
202
|
def set_sketch_path(path=nil)
|
198
203
|
field = @declared_fields['sketchPath']
|
199
204
|
field.set_value(java_self, path || SKETCH_ROOT)
|
200
205
|
end
|
201
|
-
|
202
|
-
|
206
|
+
|
207
|
+
|
208
|
+
# We override size to support setting full_screen and to keep our
|
209
|
+
# internal @width and @height in line.
|
210
|
+
def size(*args)
|
211
|
+
args[0], args[1] = *full_screen_dimensions if @@full_screen && !args.empty?
|
212
|
+
w, h, mode = *args
|
213
|
+
@width = w || @width
|
214
|
+
@height = h || @height
|
215
|
+
@render_mode = mode || @render_mode
|
216
|
+
super(*args)
|
217
|
+
end
|
218
|
+
|
219
|
+
|
203
220
|
# Specify what rendering Processing should use, without needing to pass size.
|
204
221
|
def render_mode(mode_const)
|
205
222
|
@render_mode = mode_const
|
@@ -230,14 +247,20 @@ module Processing
|
|
230
247
|
# A nice method to run a given block for a grid.
|
231
248
|
# Lifted from action_coding/Nodebox.
|
232
249
|
def grid(cols, rows, col_size=1, row_size=1)
|
233
|
-
(0
|
250
|
+
(0...cols*rows).map do |i|
|
234
251
|
x = col_size * (i % cols)
|
235
252
|
y = row_size * i.div(cols)
|
236
253
|
yield x, y
|
237
254
|
end
|
238
255
|
end
|
239
|
-
|
240
|
-
|
256
|
+
|
257
|
+
# Shortcut for begin_shape/end_shape pair
|
258
|
+
def shape(*mode)
|
259
|
+
begin_shape *mode
|
260
|
+
yield
|
261
|
+
end_shape
|
262
|
+
end
|
263
|
+
|
241
264
|
# Provide a convenient handle for the Java-space version of self.
|
242
265
|
def java_self
|
243
266
|
@java_self ||= Java.ruby_to_java self
|
@@ -250,8 +273,8 @@ module Processing
|
|
250
273
|
int = @declared_fields['key'].value(java_self)
|
251
274
|
int < 256 ? int.chr : int
|
252
275
|
end
|
253
|
-
|
254
|
-
|
276
|
+
|
277
|
+
|
255
278
|
# Get the sketch path
|
256
279
|
def sketch_path
|
257
280
|
@declared_fields['sketchPath'].value(java_self)
|
@@ -263,7 +286,7 @@ module Processing
|
|
263
286
|
value[1..-1].hex + 0xff000000
|
264
287
|
end
|
265
288
|
|
266
|
-
|
289
|
+
|
267
290
|
# Fields that should be made accessible as under_scored.
|
268
291
|
def mouse_x; mouseX; end
|
269
292
|
def mouse_y; mouseY; end
|
@@ -272,15 +295,15 @@ module Processing
|
|
272
295
|
def frame_count; frameCount; end
|
273
296
|
def mouse_button; mouseButton; end
|
274
297
|
def key_code; keyCode; end
|
275
|
-
|
276
|
-
|
298
|
+
|
299
|
+
|
277
300
|
# Ensure that load_strings returns a real Ruby array
|
278
301
|
def load_strings(file_or_url)
|
279
302
|
loadStrings(file_or_url).to_a
|
280
303
|
end
|
281
|
-
|
282
|
-
|
283
|
-
# Writes an array of strings to a file, one line per string.
|
304
|
+
|
305
|
+
|
306
|
+
# Writes an array of strings to a file, one line per string.
|
284
307
|
# This file is saved to the sketch's data folder
|
285
308
|
def save_strings(filename, strings)
|
286
309
|
saveStrings(filename, [strings].flatten.to_java(:String))
|
@@ -292,19 +315,19 @@ module Processing
|
|
292
315
|
return @declared_fields['frameRate'].value(java_self) unless fps
|
293
316
|
super(fps)
|
294
317
|
end
|
295
|
-
|
296
|
-
|
318
|
+
|
319
|
+
|
297
320
|
# Is the sketch still displaying with the default size?
|
298
321
|
def default_size?
|
299
322
|
@declared_fields['defaultSize'].value(java_self)
|
300
323
|
end
|
301
|
-
|
302
|
-
|
324
|
+
|
325
|
+
|
303
326
|
# Is the sketch finished?
|
304
327
|
def finished?
|
305
328
|
@declared_fields['finished'].value(java_self)
|
306
329
|
end
|
307
|
-
|
330
|
+
|
308
331
|
|
309
332
|
# Is the mouse pressed for this frame?
|
310
333
|
def mouse_pressed?
|
@@ -316,37 +339,41 @@ module Processing
|
|
316
339
|
def key_pressed?
|
317
340
|
Java.java_to_primitive(java_class.field("keyPressed").value(java_object))
|
318
341
|
end
|
319
|
-
|
320
|
-
|
342
|
+
|
343
|
+
|
321
344
|
# lerp_color takes three or four arguments, in Java that's two
|
322
345
|
# different methods, one regular and one static, so:
|
323
346
|
def lerp_color(*args)
|
324
|
-
args.length > 3 ? self.class.lerp_color(*args) : super(*args)
|
347
|
+
args.length > 3 ? self.class.lerp_color(*args) : super(*args)
|
325
348
|
end
|
326
349
|
|
327
350
|
|
328
351
|
# Cleanly close and shutter a running sketch.
|
329
352
|
def close
|
330
353
|
$app = nil
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
354
|
+
if Processing.online?
|
355
|
+
JRUBY_APPLET.remove(self)
|
356
|
+
self.destroy
|
357
|
+
else
|
358
|
+
control_panel.remove if respond_to?(:control_panel)
|
359
|
+
@frame.remove(self) if @frame
|
360
|
+
self.destroy
|
361
|
+
@frame.dispose if @frame
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
|
339
366
|
private
|
340
|
-
|
341
|
-
# Proxy over a list of Java declared fields that have the same name as
|
367
|
+
|
368
|
+
# Proxy over a list of Java declared fields that have the same name as
|
342
369
|
# some methods. Add to this list as needed.
|
343
370
|
def proxy_java_fields
|
344
371
|
@declared_fields = {}
|
345
372
|
fields = %w(sketchPath key frameRate defaultSize finished)
|
346
373
|
fields.each {|f| @declared_fields[f] = java_class.declared_field(f) }
|
347
374
|
end
|
348
|
-
|
349
|
-
|
375
|
+
|
376
|
+
|
350
377
|
# Mix the Processing::Proxy into any inner classes defined for the
|
351
378
|
# sketch, attempting to mimic the behavior of Java's inner classes.
|
352
379
|
def mix_proxy_into_inner_classes
|
@@ -358,13 +385,13 @@ module Processing
|
|
358
385
|
const.class_eval 'include Processing::Proxy'
|
359
386
|
end
|
360
387
|
end
|
361
|
-
|
362
|
-
|
388
|
+
|
389
|
+
|
363
390
|
# Tests to see which display method should run.
|
364
391
|
def determine_how_to_display
|
365
392
|
# Wait for init to get its grey tracksuit on and run a few laps.
|
366
393
|
sleep 0.02 while default_size? && !finished? && !@@full_screen
|
367
|
-
|
394
|
+
|
368
395
|
if Processing.online?
|
369
396
|
display_in_an_applet
|
370
397
|
elsif full_screen?
|
@@ -377,12 +404,12 @@ module Processing
|
|
377
404
|
end
|
378
405
|
@done_displaying = true
|
379
406
|
end
|
380
|
-
|
381
|
-
|
407
|
+
|
408
|
+
|
382
409
|
def display_full_screen(display)
|
383
410
|
@frame = java.awt.Frame.new(display.default_configuration)
|
384
|
-
|
385
|
-
@width, @height =
|
411
|
+
mode = display.display_mode
|
412
|
+
@width, @height = *full_screen_dimensions
|
386
413
|
@frame.set_undecorated true
|
387
414
|
@frame.set_ignore_repaint true
|
388
415
|
@frame.set_background java.awt.Color.black
|
@@ -402,7 +429,7 @@ module Processing
|
|
402
429
|
@frame.add self
|
403
430
|
@frame.pack
|
404
431
|
@frame.set_resizable false
|
405
|
-
@frame.set_default_close_operation Processing.embedded? ?
|
432
|
+
@frame.set_default_close_operation Processing.embedded? ?
|
406
433
|
javax.swing.JFrame::DISPOSE_ON_CLOSE : javax.swing.JFrame::EXIT_ON_CLOSE
|
407
434
|
ins = @frame.get_insets
|
408
435
|
hpad, vpad = ins.left + ins.right, ins.top + ins.bottom
|
@@ -410,6 +437,7 @@ module Processing
|
|
410
437
|
frame_height = [height, MIN_WINDOW_HEIGHT].max + vpad
|
411
438
|
@frame.set_size(frame_width, frame_height)
|
412
439
|
set_bounds((frame_width - hpad - width) / 2.0, (frame_height - vpad - height) / 2.0, width, height)
|
440
|
+
@frame.set_location(@frame_x, @frame_y)
|
413
441
|
@frame.show
|
414
442
|
end
|
415
443
|
|
@@ -423,8 +451,17 @@ module Processing
|
|
423
451
|
JRUBY_APPLET.on_stop { self.stop }
|
424
452
|
JRUBY_APPLET.on_destroy { self.destroy }
|
425
453
|
end
|
426
|
-
|
427
|
-
|
454
|
+
|
455
|
+
|
456
|
+
# Grab the dimensions of the main display.
|
457
|
+
# Some Linux variants don't have the 'display_mode'.
|
458
|
+
def full_screen_dimensions
|
459
|
+
screen = java.awt.GraphicsEnvironment.local_graphics_environment.default_screen_device.display_mode
|
460
|
+
screen = java.awt.Toolkit.default_toolkit.screen_size if !display
|
461
|
+
return screen.width, screen.height
|
462
|
+
end
|
463
|
+
|
464
|
+
|
428
465
|
# When the net library is included, we make the Ruby interpreter
|
429
466
|
# accessible to javascript as the 'ruby' variable. From javascript,
|
430
467
|
# you can call evalScriptlet() to run code against the sketch.
|
@@ -439,45 +476,49 @@ module Processing
|
|
439
476
|
# end
|
440
477
|
|
441
478
|
end # Processing::App
|
442
|
-
|
443
|
-
|
444
|
-
# This module will get automatically mixed in to any inner class of
|
479
|
+
|
480
|
+
|
481
|
+
# This module will get automatically mixed in to any inner class of
|
445
482
|
# a Processing::App, in order to mimic Java's inner classes, which have
|
446
483
|
# unfettered access to the methods defined in the surrounding class.
|
447
484
|
module Proxy
|
448
|
-
|
449
|
-
# Generate the list of method names that we'd like to proxy for inner classes.
|
485
|
+
|
486
|
+
# Generate the list of method names that we'd like to proxy for inner classes.
|
450
487
|
# Nothing camelCased, nothing __internal__, just the Processing API.
|
451
488
|
def self.desired_method_names
|
452
489
|
bad_method = /__/ # Internal JRuby methods.
|
453
490
|
unwanted = PApplet.superclass.instance_methods + Object.instance_methods
|
454
|
-
unwanted -= ['width', 'height']
|
491
|
+
unwanted -= ['width', 'height', 'cursor']
|
455
492
|
methods = Processing::App.public_instance_methods
|
456
493
|
methods.reject {|m| unwanted.include?(m) || bad_method.match(m) }
|
457
494
|
end
|
458
|
-
|
459
|
-
|
460
|
-
# Proxy methods through to the sketch.
|
495
|
+
|
496
|
+
|
497
|
+
# Proxy methods through to the sketch.
|
461
498
|
def self.proxy_methods
|
462
499
|
code = desired_method_names.inject('') do |code, method|
|
463
500
|
code << <<-EOS
|
464
|
-
def #{method}(*args) # def rect(*args)
|
465
|
-
|
466
|
-
|
501
|
+
def #{method}(*args, &block) # def rect(*args, &block)
|
502
|
+
if block_given? # if block_given?
|
503
|
+
$app.send :'#{method}', *args, &block # $app.send(:rect, *args, &block)
|
504
|
+
else # else
|
505
|
+
$app.#{method} *args # $app.rect *args
|
506
|
+
end # end
|
507
|
+
end # end
|
467
508
|
EOS
|
468
509
|
end
|
469
510
|
module_eval(code, "Processing::Proxy", 1)
|
470
511
|
end
|
471
|
-
|
472
|
-
|
512
|
+
|
513
|
+
|
473
514
|
# Proxy the sketch's constants on to the inner classes.
|
474
515
|
def self.proxy_constants
|
475
516
|
Processing::App.constants.each do |name|
|
476
517
|
Processing::Proxy.const_set(name, Processing::App.const_get(name))
|
477
518
|
end
|
478
519
|
end
|
479
|
-
|
480
|
-
|
520
|
+
|
521
|
+
|
481
522
|
# Don't do all of the work unless we have an inner class that needs it.
|
482
523
|
def self.included(inner_class)
|
483
524
|
return if @already_defined
|
@@ -485,7 +526,7 @@ module Processing
|
|
485
526
|
proxy_constants
|
486
527
|
@already_defined = true
|
487
528
|
end
|
488
|
-
|
529
|
+
|
489
530
|
end # Processing::Proxy
|
490
|
-
|
531
|
+
|
491
532
|
end # Processing
|