ruby-processing 1.0.9 → 1.0.10.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +13 -1
- data/bin/rp5 +8 -2
- data/lib/core/core.jar +0 -0
- data/lib/core/jruby-complete.jar +0 -0
- data/lib/ruby-processing.rb +2 -2
- data/lib/ruby-processing/app.rb +108 -338
- data/lib/ruby-processing/config.rb +6 -0
- data/lib/ruby-processing/helper_methods.rb +120 -0
- data/lib/ruby-processing/library_loader.rb +140 -0
- data/lib/ruby-processing/runner.rb +34 -4
- data/lib/ruby-processing/runners/base.rb +10 -11
- data/lib/ruby-processing/runners/live.rb +1 -1
- data/lib/ruby-processing/runners/run.rb +1 -1
- data/lib/ruby-processing/runners/watch.rb +18 -76
- data/lib/templates/applet/index.html.erb +8 -9
- data/library/control_panel/control_panel.rb +1 -1
- data/library/dxf/library/dxf.jar +0 -0
- data/library/dxf/library/export.txt +1 -0
- data/library/javascript/library/export.txt +3 -1
- data/library/minim/library/export.txt +1 -0
- data/library/minim/library/jl1.0.jar +0 -0
- data/library/minim/library/jsminim.jar +0 -0
- data/library/minim/library/minim-spi.jar +0 -0
- data/library/minim/library/minim.jar +0 -0
- data/library/minim/library/mp3spi1.9.4.jar +0 -0
- data/library/minim/library/tritonus_aos.jar +0 -0
- data/library/minim/library/tritonus_share.jar +0 -0
- data/library/net/library/export.txt +1 -0
- data/library/net/library/net.jar +0 -0
- data/library/opengl/library/export.txt +7 -10
- data/library/opengl/library/gluegen-rt.jar +0 -0
- data/library/opengl/library/jogl.jar +0 -0
- data/library/opengl/library/{libgluegen-rt.so → linux32/libgluegen-rt.so} +0 -0
- data/library/opengl/library/{libjogl.so → linux32/libjogl.so} +0 -0
- data/library/opengl/library/{libjogl_awt.so → linux32/libjogl_awt.so} +0 -0
- data/library/opengl/library/{libjogl_cg.so → linux32/libjogl_cg.so} +0 -0
- data/library/opengl/library/linux64/libgluegen-rt.so +0 -0
- data/library/opengl/library/linux64/libjogl.so +0 -0
- data/library/opengl/library/linux64/libjogl_awt.so +0 -0
- data/library/opengl/library/linux64/libjogl_cg.so +0 -0
- data/library/opengl/library/{libgluegen-rt.jnilib → macosx/libgluegen-rt.jnilib} +0 -0
- data/library/opengl/library/{libjogl.jnilib → macosx/libjogl.jnilib} +0 -0
- data/library/opengl/library/{libjogl_awt.jnilib → macosx/libjogl_awt.jnilib} +0 -0
- data/library/opengl/library/{libjogl_cg.jnilib → macosx/libjogl_cg.jnilib} +0 -0
- data/library/opengl/library/opengl.jar +0 -0
- data/library/opengl/library/{gluegen-rt.dll → windows32/gluegen-rt.dll} +0 -0
- data/library/opengl/library/{jogl.dll → windows32/jogl.dll} +0 -0
- data/library/opengl/library/{jogl_awt.dll → windows32/jogl_awt.dll} +0 -0
- data/library/opengl/library/{jogl_cg.dll → windows32/jogl_cg.dll} +0 -0
- data/library/opengl/library/windows64/gluegen-rt.dll +0 -0
- data/library/opengl/library/windows64/jogl.dll +0 -0
- data/library/opengl/library/windows64/jogl_awt.dll +0 -0
- data/library/opengl/library/windows64/jogl_cg.dll +0 -0
- data/library/pdf/library/export.txt +1 -0
- data/library/pdf/library/itext.jar +0 -0
- data/library/pdf/library/pdf.jar +0 -0
- data/library/serial/library/RXTXcomm.jar +0 -0
- data/library/serial/library/export.txt +1 -3
- data/library/serial/library/linux32/librxtxSerial.so +0 -0
- data/library/serial/library/linux64/librxtxSerial.so +0 -0
- data/library/serial/library/macosx/librxtxSerial.jnilib +0 -0
- data/library/serial/library/serial.jar +0 -0
- data/library/serial/library/windows32/rxtxSerial.dll +0 -0
- data/library/serial/library/windows64/rxtxSerial.dll +0 -0
- data/library/video/library/export.txt +1 -0
- data/library/video/library/video.jar +0 -0
- data/samples/{animator.rb → contributed/animator.rb} +0 -0
- data/samples/{bezier_playground.rb → contributed/bezier_playground.rb} +0 -0
- data/samples/{circle_collision.rb → contributed/circle_collision.rb} +0 -0
- data/samples/contributed/drawolver.rb +182 -0
- data/samples/{empathy.rb → contributed/empathy.rb} +7 -7
- data/samples/{fern.rb → contributed/fern.rb} +0 -0
- data/samples/{flight_patterns.rb → contributed/flight_patterns.rb} +0 -0
- data/samples/{full_screen.rb → contributed/full_screen.rb} +0 -0
- data/samples/{getting_started.rb → contributed/getting_started.rb} +0 -0
- data/samples/{gravity.rb → contributed/gravity.rb} +0 -0
- data/samples/{jwishy.rb → contributed/jwishy.rb} +0 -0
- data/samples/{orbit.rb → contributed/orbit.rb} +0 -0
- data/samples/{pong.rb → contributed/pong.rb} +0 -0
- data/samples/{reflection.rb → contributed/reflection.rb} +0 -0
- data/samples/{simple_buffer.rb → contributed/simple_buffer.rb} +0 -0
- data/samples/{tree.rb → contributed/tree.rb} +0 -0
- data/samples/peasy_cam/library/hilbert/hilbert.rb +11 -10
- data/samples/processing_app/3D/camera/move_eye.rb +29 -0
- data/samples/processing_app/3D/form/brick_tower.rb +11 -11
- data/samples/processing_app/3D/form/cubic_grid.rb +51 -0
- data/samples/processing_app/3D/form/icosahedra/icosahedra.rb +76 -0
- data/samples/processing_app/3D/form/icosahedra/icosahedron.rb +116 -0
- data/samples/processing_app/3D/form/icosahedra/shape_3D.rb +25 -0
- data/samples/processing_app/3D/form/primitives.rb +42 -0
- data/samples/processing_app/3D/form/rgb_cube.rb +88 -0
- data/samples/processing_app/3D/form/shape_transform.rb +94 -0
- data/samples/processing_app/3D/form/toroid.rb +130 -0
- data/samples/processing_app/3D/form/vertices.rb +81 -0
- data/samples/processing_app/3D/image/data/eames.jpg +0 -0
- data/samples/processing_app/3D/image/data/ystone08.jpg +0 -0
- data/samples/processing_app/3D/image/explode.rb +56 -0
- data/samples/processing_app/3D/image/extrusion.rb +49 -0
- data/samples/processing_app/3D/image/zoom.rb +83 -0
- data/samples/processing_app/3D/lights/directional.rb +41 -0
- data/samples/processing_app/3D/lights/lights1.rb +39 -0
- data/samples/processing_app/3D/lights/lights2.rb +42 -0
- data/samples/processing_app/3D/lights/reflection.rb +38 -0
- data/samples/processing_app/3D/lights/spot.rb +39 -0
- data/samples/processing_app/3D/textures/data/berlin-1.jpg +0 -0
- data/samples/processing_app/3D/textures/texture1.rb +41 -0
- data/samples/processing_app/3D/textures/texture2.rb +38 -0
- data/samples/processing_app/3D/textures/texture3.rb +68 -0
- data/samples/processing_app/3D/textures/texture_cube.rb +106 -0
- data/samples/processing_app/3D/transform/bird.rb +61 -0
- data/samples/processing_app/3D/transform/birds/bird.rb +87 -0
- data/samples/processing_app/3D/transform/birds/birds.rb +48 -0
- data/samples/processing_app/3D/transform/cubes_in_cube/cube.rb +57 -0
- data/samples/processing_app/3D/transform/cubes_in_cube/cubes_in_cube.rb +102 -0
- data/samples/processing_app/3D/transform/push_pop_cubes.rb +152 -0
- data/samples/processing_app/3D/transform/rotate1.rb +43 -0
- data/samples/processing_app/3D/transform/rotate2.rb +45 -0
- data/samples/processing_app/3D/typography/data/Univers45.vlw +0 -0
- data/samples/processing_app/3D/typography/letter_k.rb +136 -0
- data/samples/processing_app/3D/typography/typing.rb +77 -0
- data/samples/processing_app/basics/form/triangle_strip.rb +19 -19
- data/samples/processing_app/basics/math/distance1.rb +59 -0
- data/samples/processing_app/basics/math/distance2.rb +38 -0
- data/samples/processing_app/basics/math/double_random.rb +38 -0
- data/samples/processing_app/basics/math/graphing_2_d_equation.rb +53 -0
- data/samples/processing_app/basics/math/increment_decrement.rb +59 -0
- data/samples/processing_app/basics/math/modulo.rb +43 -0
- data/samples/processing_app/basics/math/noise_1_d.rb +37 -0
- data/samples/processing_app/basics/math/noise_2_d.rb +47 -0
- data/samples/processing_app/basics/math/noise_3_d.rb +50 -0
- data/samples/processing_app/basics/math/noise_wave.rb +61 -0
- data/samples/processing_app/basics/math/operator_precedence.rb +70 -0
- data/samples/processing_app/basics/math/polar_to_cartesian.rb +44 -0
- data/samples/processing_app/basics/math/random.rb +35 -0
- data/samples/processing_app/basics/math/sine.rb +49 -0
- data/samples/processing_app/basics/math/sine_cosine.rb +60 -0
- data/samples/processing_app/basics/math/sine_wave.rb +62 -0
- data/samples/processing_app/basics/objects/composite_objects.rb +139 -0
- data/samples/processing_app/basics/objects/inheritance.rb +104 -0
- data/samples/processing_app/basics/objects/multiple_constructors.rb +66 -0
- data/samples/processing_app/basics/objects/objects.rb +72 -0
- data/samples/processing_app/basics/shape/data/bot1.svg +160 -0
- data/samples/processing_app/basics/shape/data/usa-wikipedia.svg +452 -0
- data/samples/processing_app/basics/shape/disable_style.rb +36 -0
- data/samples/processing_app/basics/shape/get_child.rb +43 -0
- data/samples/processing_app/basics/shape/load_display_shape.rb +33 -0
- data/samples/processing_app/basics/shape/scale_shape.rb +33 -0
- data/samples/processing_app/basics/structure/coordinates.rb +55 -0
- data/samples/processing_app/basics/structure/create_graphics.rb +39 -0
- data/samples/processing_app/basics/structure/functions.rb +41 -0
- data/samples/processing_app/basics/structure/loop.rb +39 -0
- data/samples/processing_app/basics/structure/noloop.rb +33 -0
- data/samples/processing_app/basics/structure/recursion1.rb +42 -0
- data/samples/processing_app/basics/structure/recursion2.rb +39 -0
- data/samples/processing_app/basics/structure/redraw.rb +36 -0
- data/samples/processing_app/basics/structure/setup_draw.rb +30 -0
- data/samples/processing_app/basics/structure/statements_comments.rb +32 -0
- data/samples/processing_app/basics/structure/width_height.rb +29 -0
- data/samples/processing_app/basics/transform/arm.rb +47 -0
- data/samples/processing_app/basics/transform/rotate.rb +43 -0
- data/samples/processing_app/basics/transform/scale.rb +45 -0
- data/samples/processing_app/basics/transform/translate.rb +41 -0
- data/samples/processing_app/basics/transform/triangle_flower.rb +69 -0
- data/samples/processing_app/basics/typography/data/CourierNew36.vlw +0 -0
- data/samples/processing_app/basics/typography/data/Ziggurat-HTF-Black-32.vlw +0 -0
- data/samples/processing_app/basics/typography/letters.rb +52 -0
- data/samples/processing_app/basics/typography/words.rb +37 -0
- data/samples/processing_app/basics/web/embedded_links.rb +58 -0
- data/samples/processing_app/basics/web/loading_images.rb +25 -0
- metadata +181 -86
- data/lib/patches/JRubyApplet.diff +0 -24
- data/lib/patches/PATCHES.txt +0 -3
- data/lib/patches/PApplet.diff +0 -27
- data/library/minim/license.txt +0 -339
- data/library/minim/version.txt +0 -1
- data/library/opengl/library/gluegen-rt-natives-linux-amd64.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-linux-i586.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-macosx-ppc.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-macosx-universal.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-windows-amd64.jar +0 -0
- data/library/opengl/library/gluegen-rt-natives-windows-i586.jar +0 -0
- data/library/opengl/library/gluegen-rt.jar.pack.gz +0 -0
- data/library/opengl/library/jogl-natives-linux-amd64.jar +0 -0
- data/library/opengl/library/jogl-natives-linux-i586.jar +0 -0
- data/library/opengl/library/jogl-natives-macosx-ppc.jar +0 -0
- data/library/opengl/library/jogl-natives-macosx-universal.jar +0 -0
- data/library/opengl/library/jogl-natives-windows-amd64.jar +0 -0
- data/library/opengl/library/jogl-natives-windows-i586.jar +0 -0
- data/library/opengl/library/jogl.jar.pack.gz +0 -0
- data/library/pdf/notes.txt +0 -8
- data/library/serial/library/librxtxSerial.jnilib +0 -0
- data/library/serial/library/librxtxSerial.so +0 -0
- data/library/serial/library/rxtxSerial.dll +0 -0
data/CHANGELOG
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
v1.0.10 Solidifying before Processing 2.0 ...
|
2
|
+
* JRuby upgraded to 1.6.4
|
3
|
+
* Processing upgraded to 1.5.1
|
4
|
+
* load_library now works for Ruby and Java libraries present in the libraries Processing sketchbook
|
5
|
+
* test suite created
|
6
|
+
* removed ruby-processing specific hex() and shape() methods in favor of Processing ones
|
7
|
+
* added some missing methods from Processing: println(), min(), max(), abs(), binary(), nf*(), etc...
|
8
|
+
* watcher: watch for *.rb files inside sketch directory
|
9
|
+
* linux opengl bugs fixed
|
10
|
+
* samples/peasy_cam/hilbert_fractal example now allow the possibility of changing the fractal depth and to more correctly centre the fractal
|
11
|
+
* added configuration file in $HOME/.rp5rc to configure java_args and sketchbook_path
|
12
|
+
|
1
13
|
v1.0.9 The Yearly Update...
|
2
14
|
* JRuby upgraded to 1.4.0 final.
|
3
15
|
* Fix to allow arguments to be passed to sketches.
|
@@ -203,4 +215,4 @@ v0.3. First Real Release
|
|
203
215
|
* Processing::App.current will give you a handle on the app. (Useful
|
204
216
|
in jirb).
|
205
217
|
* samples/jwishy.rb has some new hooks for live coding.
|
206
|
-
* circle_collision and tree samples added (Joe Holt)
|
218
|
+
* circle_collision and tree samples added (Joe Holt)
|
data/bin/rp5
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
file = __FILE__
|
4
|
+
if test(?l, file)
|
5
|
+
require "pathname"
|
6
|
+
file = Pathname.new(file).realpath
|
7
|
+
end
|
8
|
+
|
9
|
+
require File.expand_path(File.dirname(file) + "/../lib/ruby-processing")
|
10
|
+
Processing::Runner.execute
|
data/lib/core/core.jar
CHANGED
Binary file
|
data/lib/core/jruby-complete.jar
CHANGED
Binary file
|
data/lib/ruby-processing.rb
CHANGED
@@ -14,7 +14,7 @@ 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 = "1.0.
|
17
|
+
VERSION = "1.0.10" unless defined? Processing::VERSION
|
18
18
|
|
19
19
|
# Are we online -- inside an applet?
|
20
20
|
def self.online?
|
@@ -34,4 +34,4 @@ module Processing
|
|
34
34
|
autoload :BaseExporter, 'ruby-processing/exporters/base_exporter'
|
35
35
|
autoload :AppletExporter, 'ruby-processing/exporters/applet_exporter'
|
36
36
|
autoload :ApplicationExporter, 'ruby-processing/exporters/application_exporter'
|
37
|
-
end
|
37
|
+
end
|
data/lib/ruby-processing/app.rb
CHANGED
@@ -3,11 +3,19 @@
|
|
3
3
|
# web applets, going fullscreen and so on.
|
4
4
|
|
5
5
|
require 'java'
|
6
|
+
require 'ruby-processing/config'
|
7
|
+
require 'ruby-processing/helper_methods'
|
8
|
+
require 'ruby-processing/library_loader'
|
6
9
|
|
7
|
-
|
10
|
+
# Conditionally load core.jar
|
11
|
+
require "#{RP5_ROOT}/lib/core/core.jar" unless Processing.online? || Processing.embedded?
|
12
|
+
|
13
|
+
# Include some processing classes that we'd like to use:
|
14
|
+
%w(PShape PImage PGraphics PFont PVector).each do |klass|
|
15
|
+
import "processing.core.#{klass}"
|
16
|
+
end
|
8
17
|
|
9
|
-
|
10
|
-
require "#{RP5_ROOT}/lib/core/core.jar" unless Processing.online? || Processing.embedded?
|
18
|
+
module Processing
|
11
19
|
import "processing.core"
|
12
20
|
|
13
21
|
# This is the main Ruby-Processing class, and is what you'll
|
@@ -19,45 +27,42 @@ module Processing
|
|
19
27
|
# called constantly, for every frame.
|
20
28
|
class App < PApplet
|
21
29
|
include Math
|
22
|
-
|
23
|
-
# Include some processing classes that we'd like to use:
|
24
|
-
%w(PShape PImage PGraphics PFont PVector).each do |klass|
|
25
|
-
import "processing.core.#{klass}"
|
26
|
-
end
|
30
|
+
include HelperMethods
|
27
31
|
|
28
32
|
# Alias some methods for familiarity for Shoes coders.
|
29
|
-
attr_accessor :frame, :title
|
33
|
+
#attr_accessor :frame, :title
|
30
34
|
alias_method :oval, :ellipse
|
31
35
|
alias_method :stroke_width, :stroke_weight
|
32
36
|
alias_method :rgb, :color
|
33
37
|
alias_method :gray, :color
|
34
38
|
|
35
|
-
# Watch the definition of these methods, to make sure
|
36
|
-
# that Processing is able to call them during events.
|
37
|
-
METHODS_TO_WATCH_FOR = {
|
38
|
-
:mouse_pressed => :mousePressed,
|
39
|
-
:mouse_dragged => :mouseDragged,
|
40
|
-
:mouse_clicked => :mouseClicked,
|
41
|
-
:mouse_moved => :mouseMoved,
|
42
|
-
:mouse_released => :mouseReleased,
|
43
|
-
:key_pressed => :keyPressed,
|
44
|
-
:key_released => :keyReleased,
|
45
|
-
:key_typed => :keyTyped
|
46
|
-
}
|
47
|
-
|
48
39
|
|
49
40
|
# When certain special methods get added to the sketch, we need to let
|
50
41
|
# Processing call them by their expected Java names.
|
51
42
|
def self.method_added(method_name) #:nodoc:
|
52
|
-
|
53
|
-
|
43
|
+
# Watch the definition of these methods, to make sure
|
44
|
+
# that Processing is able to call them during events.
|
45
|
+
methods_to_alias = {
|
46
|
+
:mouse_pressed => :mousePressed,
|
47
|
+
:mouse_dragged => :mouseDragged,
|
48
|
+
:mouse_clicked => :mouseClicked,
|
49
|
+
:mouse_moved => :mouseMoved,
|
50
|
+
:mouse_released => :mouseReleased,
|
51
|
+
:key_pressed => :keyPressed,
|
52
|
+
:key_released => :keyReleased,
|
53
|
+
:key_typed => :keyTyped
|
54
|
+
}
|
55
|
+
if methods_to_alias.keys.include?(method_name)
|
56
|
+
alias_method methods_to_alias[method_name], method_name
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
60
|
|
58
61
|
# Class methods that we should make available in the instance.
|
59
62
|
[:map, :pow, :norm, :lerp, :second, :minute, :hour, :day, :month, :year,
|
60
|
-
:sq, :constrain, :dist, :blend_color, :degrees, :radians, :mag
|
63
|
+
:sq, :constrain, :dist, :blend_color, :degrees, :radians, :mag, :println,
|
64
|
+
:hex, :min, :max, :abs, :binary, :ceil, :nf, :nfc, :nfp, :nfs,
|
65
|
+
:norm, :round, :trim, :unbinary, :unhex ].each do |meth|
|
61
66
|
method = <<-EOS
|
62
67
|
def #{meth}(*args)
|
63
68
|
self.class.#{meth}(*args)
|
@@ -66,9 +71,9 @@ module Processing
|
|
66
71
|
eval method
|
67
72
|
end
|
68
73
|
|
69
|
-
|
70
74
|
# Handy getters and setters on the class go here:
|
71
75
|
def self.sketch_class; @sketch_class; end
|
76
|
+
@@full_screen = false
|
72
77
|
def self.full_screen; @@full_screen = true; end
|
73
78
|
def full_screen?; @@full_screen; end
|
74
79
|
|
@@ -80,84 +85,34 @@ module Processing
|
|
80
85
|
@sketch_class = subclass
|
81
86
|
end
|
82
87
|
|
83
|
-
|
84
|
-
|
85
|
-
@@loaded_libraries = Hash.new(false)
|
86
|
-
def self.library_loaded?(folder)
|
87
|
-
@@loaded_libraries[folder.to_sym]
|
88
|
+
def self.has_slider(*args) #:nodoc:
|
89
|
+
raise "has_slider has been replaced with a nicer control_panel library. Check it out."
|
88
90
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
#
|
95
|
-
# If a library is put into a 'library' folder next to the sketch it will
|
96
|
-
# be used instead of the library that ships with Ruby-Processing.
|
97
|
-
def self.load_libraries(*args)
|
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
|
91
|
+
|
92
|
+
@@library_loader = LibraryLoader.new
|
93
|
+
class << self
|
94
|
+
def load_libraries(*args)
|
95
|
+
@@library_loader.load_library(*args)
|
101
96
|
end
|
102
|
-
|
103
|
-
def self.load_library(*args); self.load_libraries(*args); end
|
104
|
-
|
97
|
+
alias :load_library :load_libraries
|
105
98
|
|
106
|
-
|
107
|
-
|
108
|
-
# of the same name as the library folder.
|
109
|
-
def self.load_ruby_library(dir)
|
110
|
-
dir = dir.to_sym
|
111
|
-
return true if @@loaded_libraries[dir]
|
112
|
-
if Processing.online?
|
113
|
-
begin
|
114
|
-
return @@loaded_libraries[dir] = (require "library/#{dir}/#{dir}")
|
115
|
-
rescue LoadError => e
|
116
|
-
return false
|
117
|
-
end
|
99
|
+
def library_loaded?(library_name)
|
100
|
+
@@library_loader.library_loaded?(library_name)
|
118
101
|
end
|
119
|
-
local_path = "#{SKETCH_ROOT}/library/#{dir}"
|
120
|
-
gem_path = "#{RP5_ROOT}/library/#{dir}"
|
121
|
-
path = File.exists?(local_path) ? local_path : gem_path
|
122
|
-
return false unless (File.exists?("#{path}/#{dir}.rb"))
|
123
|
-
return @@loaded_libraries[dir] = (require "#{path}/#{dir}")
|
124
|
-
end
|
125
102
|
|
103
|
+
def load_ruby_library(*args)
|
104
|
+
@@library_loader.load_ruby_library(*args)
|
105
|
+
end
|
126
106
|
|
127
|
-
|
128
|
-
|
129
|
-
#
|
130
|
-
# P.S. -- Loading libraries which include native code needs to
|
131
|
-
# hack the Java ClassLoader, so that you don't have to
|
132
|
-
# futz with your PATH. But it's probably bad juju.
|
133
|
-
def self.load_java_library(dir)
|
134
|
-
dir = dir.to_sym
|
135
|
-
return true if @@loaded_libraries[dir]
|
136
|
-
return @@loaded_libraries[dir] = !!(JRUBY_APPLET.get_parameter("archive").match(%r(#{dir}))) if Processing.online?
|
137
|
-
local_path = "#{SKETCH_ROOT}/library/#{dir}"
|
138
|
-
gem_path = "#{RP5_ROOT}/library/#{dir}"
|
139
|
-
path = File.exists?(local_path) ? local_path : gem_path
|
140
|
-
jars = Dir["#{path}/**/*.jar"]
|
141
|
-
return false if jars.empty?
|
142
|
-
jars.each {|jar| require jar }
|
143
|
-
# Here goes...
|
144
|
-
library_path = java.lang.System.getProperty("java.library.path")
|
145
|
-
new_library_path = [path, "#{path}/library", library_path].join(java.io.File.pathSeparator)
|
146
|
-
java.lang.System.setProperty("java.library.path", new_library_path)
|
147
|
-
field = java.lang.Class.for_name("java.lang.ClassLoader").get_declared_field("sys_paths")
|
148
|
-
if field
|
149
|
-
field.accessible = true
|
150
|
-
field.set(java.lang.Class.for_name("java.lang.System").get_class_loader, nil)
|
107
|
+
def load_java_library(*args)
|
108
|
+
@@library_loader.load_java_library(*args)
|
151
109
|
end
|
152
|
-
return @@loaded_libraries[dir] = true
|
153
110
|
end
|
154
111
|
|
155
|
-
|
156
|
-
|
157
|
-
raise "has_slider has been replaced with a nicer control_panel library. Check it out."
|
112
|
+
def library_loaded?(library_name)
|
113
|
+
self.class.library_loaded?(library_name)
|
158
114
|
end
|
159
115
|
|
160
|
-
|
161
116
|
# When you make a new sketch, you pass in (optionally),
|
162
117
|
# a width, height, x, y, title, and whether or not you want to
|
163
118
|
# run in full-screen.
|
@@ -169,53 +124,83 @@ module Processing
|
|
169
124
|
$app = self
|
170
125
|
proxy_java_fields
|
171
126
|
set_sketch_path unless Processing.online?
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
127
|
+
mix_proxy_into_inner_classes
|
128
|
+
@started = false
|
129
|
+
|
130
|
+
java.lang.Thread.default_uncaught_exception_handler = proc do |thread, exception|
|
131
|
+
puts(exception.class.to_s)
|
132
|
+
puts(exception.message)
|
133
|
+
puts(exception.backtrace.collect { |trace| "\t" + trace })
|
134
|
+
close
|
135
|
+
end
|
136
|
+
|
137
|
+
# for the list of all available args, see
|
138
|
+
# http://processing.googlecode.com/svn/trunk/processing/build/javadoc/core/processing/core/PApplet.html#runSketch%28java.lang.String[],%20processing.core.PApplet%29
|
139
|
+
args = []
|
140
|
+
|
141
|
+
@width, @height = options[:width], options[:height]
|
142
|
+
|
143
|
+
if @@full_screen || options[:full_screen]
|
144
|
+
@@full_screen = true
|
145
|
+
args << "--present"
|
146
|
+
end
|
147
|
+
|
148
|
+
@render_mode ||= JAVA2D
|
149
|
+
|
150
|
+
x = options[:x] || 0
|
151
|
+
y = options[:y] || 0
|
152
|
+
args << "--location=#{x},#{y}"
|
153
|
+
|
154
|
+
title = options[:title] || File.basename(SKETCH_PATH).sub(/(\.rb|\.pde)$/, '').titleize
|
155
|
+
args << title
|
156
|
+
PApplet.run_sketch(args, self)
|
183
157
|
end
|
184
158
|
|
159
|
+
def started?
|
160
|
+
@started
|
161
|
+
end
|
162
|
+
|
163
|
+
def hint(*args)
|
164
|
+
begin
|
165
|
+
super(*args)
|
166
|
+
rescue Exception => e
|
167
|
+
raise e.cause
|
168
|
+
end
|
169
|
+
end
|
185
170
|
|
186
171
|
# Make sure we set the size if we set it before we start the animation thread.
|
187
172
|
def start
|
188
173
|
self.size(@width, @height) if @width && @height
|
189
|
-
mix_proxy_into_inner_classes
|
190
174
|
super()
|
191
175
|
end
|
192
176
|
|
193
|
-
|
194
177
|
# Provide a loggable string to represent this sketch.
|
195
178
|
def inspect
|
196
179
|
"#<Processing::App:#{self.class}:#{@title}>"
|
197
180
|
end
|
198
181
|
|
199
182
|
|
200
|
-
# By default, your sketch path is the folder that your sketch is in.
|
201
|
-
# If you'd like to do something fancy, feel free.
|
202
|
-
def set_sketch_path(path=nil)
|
203
|
-
field = @declared_fields['sketchPath']
|
204
|
-
field.set_value(java_self, path || SKETCH_ROOT)
|
205
|
-
end
|
206
|
-
|
207
|
-
|
208
183
|
# We override size to support setting full_screen and to keep our
|
209
184
|
# internal @width and @height in line.
|
210
185
|
def size(*args)
|
211
|
-
args[0], args[1] =
|
186
|
+
args[0], args[1] = screenWidth, screenHeight if @@full_screen && !args.empty?
|
212
187
|
w, h, mode = *args
|
213
188
|
@width = w || @width
|
214
189
|
@height = h || @height
|
215
190
|
@render_mode = mode || @render_mode
|
191
|
+
@started = true
|
216
192
|
super(*args)
|
193
|
+
rescue Exception => e
|
194
|
+
raise e.cause
|
217
195
|
end
|
218
196
|
|
197
|
+
def handleDraw()
|
198
|
+
super
|
199
|
+
rescue Exception => exception
|
200
|
+
puts(exception.message)
|
201
|
+
puts(exception.backtrace.collect { |trace| "\t" + trace })
|
202
|
+
close
|
203
|
+
end
|
219
204
|
|
220
205
|
# Specify what rendering Processing should use, without needing to pass size.
|
221
206
|
def render_mode(mode_const)
|
@@ -223,225 +208,33 @@ module Processing
|
|
223
208
|
size(@width, @height, @render_mode)
|
224
209
|
end
|
225
210
|
|
226
|
-
|
227
|
-
# There's just so many functions in Processing,
|
228
|
-
# Here's a convenient way to look for them.
|
229
|
-
def find_method(method_name)
|
230
|
-
reg = Regexp.new("#{method_name}", true)
|
231
|
-
self.methods.sort.select {|meth| reg.match(meth)}
|
232
|
-
end
|
233
|
-
|
234
|
-
|
235
|
-
# Nice block method to draw to a buffer.
|
236
|
-
# You can optionally pass it a width, a height, and a renderer.
|
237
|
-
# Takes care of starting and ending the draw for you.
|
238
|
-
def buffer(buf_width=width, buf_height=height, renderer=@render_mode)
|
239
|
-
buf = create_graphics(buf_width, buf_height, renderer)
|
240
|
-
buf.begin_draw
|
241
|
-
yield buf
|
242
|
-
buf.end_draw
|
243
|
-
buf
|
244
|
-
end
|
245
|
-
|
246
|
-
|
247
|
-
# A nice method to run a given block for a grid.
|
248
|
-
# Lifted from action_coding/Nodebox.
|
249
|
-
def grid(cols, rows, col_size=1, row_size=1)
|
250
|
-
(0...cols*rows).map do |i|
|
251
|
-
x = col_size * (i % cols)
|
252
|
-
y = row_size * i.div(cols)
|
253
|
-
yield x, y
|
254
|
-
end
|
255
|
-
end
|
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
|
-
|
264
|
-
# Provide a convenient handle for the Java-space version of self.
|
265
|
-
def java_self
|
266
|
-
@java_self ||= Java.ruby_to_java self
|
267
|
-
end
|
268
|
-
|
269
|
-
|
270
|
-
# Fix java conversion problems getting the last key
|
271
|
-
# If it's ASCII, return the character, otherwise the integer
|
272
|
-
def key
|
273
|
-
int = @declared_fields['key'].value(java_self)
|
274
|
-
int < 256 ? int.chr : int
|
275
|
-
end
|
276
|
-
|
277
|
-
|
278
|
-
# Get the sketch path
|
279
|
-
def sketch_path
|
280
|
-
@declared_fields['sketchPath'].value(java_self)
|
281
|
-
end
|
282
|
-
|
283
|
-
|
284
|
-
# From ROP. Turns a color hash-string into hexadecimal, for Processing.
|
285
|
-
def hex(value)
|
286
|
-
value[1..-1].hex + 0xff000000
|
287
|
-
end
|
288
|
-
|
289
|
-
|
290
|
-
# Fields that should be made accessible as under_scored.
|
291
|
-
def mouse_x; mouseX; end
|
292
|
-
def mouse_y; mouseY; end
|
293
|
-
def pmouse_x; pmouseX; end
|
294
|
-
def pmouse_y; pmouseY; end
|
295
|
-
def frame_count; frameCount; end
|
296
|
-
def mouse_button; mouseButton; end
|
297
|
-
def key_code; keyCode; end
|
298
|
-
|
299
|
-
|
300
|
-
# Ensure that load_strings returns a real Ruby array
|
301
|
-
def load_strings(file_or_url)
|
302
|
-
loadStrings(file_or_url).to_a
|
303
|
-
end
|
304
|
-
|
305
|
-
|
306
|
-
# Writes an array of strings to a file, one line per string.
|
307
|
-
# This file is saved to the sketch's data folder
|
308
|
-
def save_strings(filename, strings)
|
309
|
-
saveStrings(filename, [strings].flatten.to_java(:String))
|
310
|
-
end
|
311
|
-
|
312
|
-
|
313
|
-
# frame_rate needs to support reading and writing
|
314
|
-
def frame_rate(fps = nil)
|
315
|
-
return @declared_fields['frameRate'].value(java_self) unless fps
|
316
|
-
super(fps)
|
317
|
-
end
|
318
|
-
|
319
|
-
|
320
|
-
# Is the sketch still displaying with the default size?
|
321
|
-
def default_size?
|
322
|
-
@declared_fields['defaultSize'].value(java_self)
|
323
|
-
end
|
324
|
-
|
325
|
-
|
326
|
-
# Is the sketch finished?
|
327
|
-
def finished?
|
328
|
-
@declared_fields['finished'].value(java_self)
|
329
|
-
end
|
330
|
-
|
331
|
-
|
332
|
-
# Is the mouse pressed for this frame?
|
333
|
-
def mouse_pressed?
|
334
|
-
Java.java_to_primitive(java_class.field("mousePressed").value(java_object))
|
335
|
-
end
|
336
|
-
|
337
|
-
|
338
|
-
# Is a key pressed for this frame?
|
339
|
-
def key_pressed?
|
340
|
-
Java.java_to_primitive(java_class.field("keyPressed").value(java_object))
|
341
|
-
end
|
342
|
-
|
343
|
-
|
344
|
-
# lerp_color takes three or four arguments, in Java that's two
|
345
|
-
# different methods, one regular and one static, so:
|
346
|
-
def lerp_color(*args)
|
347
|
-
args.length > 3 ? self.class.lerp_color(*args) : super(*args)
|
348
|
-
end
|
349
|
-
|
350
|
-
|
351
211
|
# Cleanly close and shutter a running sketch.
|
352
212
|
def close
|
353
|
-
|
213
|
+
#$app = nil
|
354
214
|
if Processing.online?
|
355
215
|
JRUBY_APPLET.remove(self)
|
356
|
-
self.destroy
|
357
216
|
else
|
358
217
|
control_panel.remove if respond_to?(:control_panel)
|
359
|
-
|
360
|
-
self.
|
361
|
-
@frame.dispose if @frame
|
218
|
+
self.dispose
|
219
|
+
self.frame.dispose
|
362
220
|
end
|
363
221
|
end
|
364
222
|
|
365
223
|
|
366
|
-
private
|
367
|
-
|
368
|
-
# Proxy over a list of Java declared fields that have the same name as
|
369
|
-
# some methods. Add to this list as needed.
|
370
|
-
def proxy_java_fields
|
371
|
-
@declared_fields = {}
|
372
|
-
fields = %w(sketchPath key frameRate defaultSize finished)
|
373
|
-
fields.each {|f| @declared_fields[f] = java_class.declared_field(f) }
|
374
|
-
end
|
375
|
-
|
224
|
+
private
|
376
225
|
|
377
226
|
# Mix the Processing::Proxy into any inner classes defined for the
|
378
227
|
# sketch, attempting to mimic the behavior of Java's inner classes.
|
379
228
|
def mix_proxy_into_inner_classes
|
380
|
-
|
229
|
+
|
381
230
|
klass = Processing::App.sketch_class
|
382
231
|
klass.constants.each do |name|
|
383
232
|
const = klass.const_get name
|
384
|
-
next if const.class != Class || const.to_s.match(
|
233
|
+
next if const.class != Class || const.to_s.match(/^Java::/)
|
385
234
|
const.class_eval 'include Processing::Proxy'
|
386
235
|
end
|
387
236
|
end
|
388
237
|
|
389
|
-
|
390
|
-
# Tests to see which display method should run.
|
391
|
-
def determine_how_to_display
|
392
|
-
# Wait for init to get its grey tracksuit on and run a few laps.
|
393
|
-
sleep 0.02 while default_size? && !finished? && !@@full_screen
|
394
|
-
|
395
|
-
if Processing.online?
|
396
|
-
display_in_an_applet
|
397
|
-
elsif full_screen?
|
398
|
-
display = java.awt.GraphicsEnvironment.local_graphics_environment.default_screen_device
|
399
|
-
linux = java.lang.System.get_property("os.name") == "Linux"
|
400
|
-
supported = display.full_screen_supported? || linux
|
401
|
-
supported ? display_full_screen(display) : display_in_a_window
|
402
|
-
else
|
403
|
-
display_in_a_window
|
404
|
-
end
|
405
|
-
@done_displaying = true
|
406
|
-
end
|
407
|
-
|
408
|
-
|
409
|
-
def display_full_screen(display)
|
410
|
-
@frame = java.awt.Frame.new(display.default_configuration)
|
411
|
-
mode = display.display_mode
|
412
|
-
@width, @height = *full_screen_dimensions
|
413
|
-
@frame.set_undecorated true
|
414
|
-
@frame.set_ignore_repaint true
|
415
|
-
@frame.set_background java.awt.Color.black
|
416
|
-
@frame.set_layout java.awt.BorderLayout.new
|
417
|
-
@frame.add(self, java.awt.BorderLayout::CENTER)
|
418
|
-
@frame.pack
|
419
|
-
display.set_full_screen_window @frame
|
420
|
-
@frame.set_location(0, 0)
|
421
|
-
@frame.show
|
422
|
-
self.request_focus
|
423
|
-
end
|
424
|
-
|
425
|
-
|
426
|
-
def display_in_a_window
|
427
|
-
@frame = javax.swing.JFrame.new(@title)
|
428
|
-
@frame.set_layout nil
|
429
|
-
@frame.add self
|
430
|
-
@frame.pack
|
431
|
-
@frame.set_resizable false
|
432
|
-
@frame.set_default_close_operation Processing.embedded? ?
|
433
|
-
javax.swing.JFrame::DISPOSE_ON_CLOSE : javax.swing.JFrame::EXIT_ON_CLOSE
|
434
|
-
ins = @frame.get_insets
|
435
|
-
hpad, vpad = ins.left + ins.right, ins.top + ins.bottom
|
436
|
-
frame_width = [width, MIN_WINDOW_WIDTH].max + hpad
|
437
|
-
frame_height = [height, MIN_WINDOW_HEIGHT].max + vpad
|
438
|
-
@frame.set_size(frame_width, frame_height)
|
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)
|
441
|
-
@frame.show
|
442
|
-
end
|
443
|
-
|
444
|
-
|
445
238
|
def display_in_an_applet
|
446
239
|
JRUBY_APPLET.background_color = nil
|
447
240
|
JRUBY_APPLET.double_buffered = false
|
@@ -451,30 +244,6 @@ module Processing
|
|
451
244
|
JRUBY_APPLET.on_stop { self.stop }
|
452
245
|
JRUBY_APPLET.on_destroy { self.destroy }
|
453
246
|
end
|
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
|
-
|
465
|
-
# When the net library is included, we make the Ruby interpreter
|
466
|
-
# accessible to javascript as the 'ruby' variable. From javascript,
|
467
|
-
# you can call evalScriptlet() to run code against the sketch.
|
468
|
-
#
|
469
|
-
# def make_accessible_to_the_browser
|
470
|
-
# return unless library_loaded?('net')
|
471
|
-
# field = java.lang.Class.for_name("org.jruby.JRubyApplet").get_declared_field("runtime")
|
472
|
-
# field.set_accessible true
|
473
|
-
# ruby = field.get(JRUBY_APPLET)
|
474
|
-
# window = Java::netscape.javascript.JSObject.get_window(JRUBY_APPLET)
|
475
|
-
# window.set_member('ruby', ruby)
|
476
|
-
# end
|
477
|
-
|
478
247
|
end # Processing::App
|
479
248
|
|
480
249
|
|
@@ -482,13 +251,14 @@ module Processing
|
|
482
251
|
# a Processing::App, in order to mimic Java's inner classes, which have
|
483
252
|
# unfettered access to the methods defined in the surrounding class.
|
484
253
|
module Proxy
|
254
|
+
include Math
|
485
255
|
|
486
256
|
# Generate the list of method names that we'd like to proxy for inner classes.
|
487
257
|
# Nothing camelCased, nothing __internal__, just the Processing API.
|
488
258
|
def self.desired_method_names
|
489
259
|
bad_method = /__/ # Internal JRuby methods.
|
490
260
|
unwanted = PApplet.superclass.instance_methods + Object.instance_methods
|
491
|
-
unwanted -= ['width', 'height', 'cursor']
|
261
|
+
unwanted -= ['width', 'height', 'cursor', 'create_image', 'background', 'size', 'resize']
|
492
262
|
methods = Processing::App.public_instance_methods
|
493
263
|
methods.reject {|m| unwanted.include?(m) || bad_method.match(m) }
|
494
264
|
end
|