ruby-processing 1.0.9 → 1.0.10.1

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 (193) hide show
  1. data/CHANGELOG +13 -1
  2. data/bin/rp5 +8 -2
  3. data/lib/core/core.jar +0 -0
  4. data/lib/core/jruby-complete.jar +0 -0
  5. data/lib/ruby-processing.rb +2 -2
  6. data/lib/ruby-processing/app.rb +108 -338
  7. data/lib/ruby-processing/config.rb +6 -0
  8. data/lib/ruby-processing/helper_methods.rb +120 -0
  9. data/lib/ruby-processing/library_loader.rb +140 -0
  10. data/lib/ruby-processing/runner.rb +34 -4
  11. data/lib/ruby-processing/runners/base.rb +10 -11
  12. data/lib/ruby-processing/runners/live.rb +1 -1
  13. data/lib/ruby-processing/runners/run.rb +1 -1
  14. data/lib/ruby-processing/runners/watch.rb +18 -76
  15. data/lib/templates/applet/index.html.erb +8 -9
  16. data/library/control_panel/control_panel.rb +1 -1
  17. data/library/dxf/library/dxf.jar +0 -0
  18. data/library/dxf/library/export.txt +1 -0
  19. data/library/javascript/library/export.txt +3 -1
  20. data/library/minim/library/export.txt +1 -0
  21. data/library/minim/library/jl1.0.jar +0 -0
  22. data/library/minim/library/jsminim.jar +0 -0
  23. data/library/minim/library/minim-spi.jar +0 -0
  24. data/library/minim/library/minim.jar +0 -0
  25. data/library/minim/library/mp3spi1.9.4.jar +0 -0
  26. data/library/minim/library/tritonus_aos.jar +0 -0
  27. data/library/minim/library/tritonus_share.jar +0 -0
  28. data/library/net/library/export.txt +1 -0
  29. data/library/net/library/net.jar +0 -0
  30. data/library/opengl/library/export.txt +7 -10
  31. data/library/opengl/library/gluegen-rt.jar +0 -0
  32. data/library/opengl/library/jogl.jar +0 -0
  33. data/library/opengl/library/{libgluegen-rt.so → linux32/libgluegen-rt.so} +0 -0
  34. data/library/opengl/library/{libjogl.so → linux32/libjogl.so} +0 -0
  35. data/library/opengl/library/{libjogl_awt.so → linux32/libjogl_awt.so} +0 -0
  36. data/library/opengl/library/{libjogl_cg.so → linux32/libjogl_cg.so} +0 -0
  37. data/library/opengl/library/linux64/libgluegen-rt.so +0 -0
  38. data/library/opengl/library/linux64/libjogl.so +0 -0
  39. data/library/opengl/library/linux64/libjogl_awt.so +0 -0
  40. data/library/opengl/library/linux64/libjogl_cg.so +0 -0
  41. data/library/opengl/library/{libgluegen-rt.jnilib → macosx/libgluegen-rt.jnilib} +0 -0
  42. data/library/opengl/library/{libjogl.jnilib → macosx/libjogl.jnilib} +0 -0
  43. data/library/opengl/library/{libjogl_awt.jnilib → macosx/libjogl_awt.jnilib} +0 -0
  44. data/library/opengl/library/{libjogl_cg.jnilib → macosx/libjogl_cg.jnilib} +0 -0
  45. data/library/opengl/library/opengl.jar +0 -0
  46. data/library/opengl/library/{gluegen-rt.dll → windows32/gluegen-rt.dll} +0 -0
  47. data/library/opengl/library/{jogl.dll → windows32/jogl.dll} +0 -0
  48. data/library/opengl/library/{jogl_awt.dll → windows32/jogl_awt.dll} +0 -0
  49. data/library/opengl/library/{jogl_cg.dll → windows32/jogl_cg.dll} +0 -0
  50. data/library/opengl/library/windows64/gluegen-rt.dll +0 -0
  51. data/library/opengl/library/windows64/jogl.dll +0 -0
  52. data/library/opengl/library/windows64/jogl_awt.dll +0 -0
  53. data/library/opengl/library/windows64/jogl_cg.dll +0 -0
  54. data/library/pdf/library/export.txt +1 -0
  55. data/library/pdf/library/itext.jar +0 -0
  56. data/library/pdf/library/pdf.jar +0 -0
  57. data/library/serial/library/RXTXcomm.jar +0 -0
  58. data/library/serial/library/export.txt +1 -3
  59. data/library/serial/library/linux32/librxtxSerial.so +0 -0
  60. data/library/serial/library/linux64/librxtxSerial.so +0 -0
  61. data/library/serial/library/macosx/librxtxSerial.jnilib +0 -0
  62. data/library/serial/library/serial.jar +0 -0
  63. data/library/serial/library/windows32/rxtxSerial.dll +0 -0
  64. data/library/serial/library/windows64/rxtxSerial.dll +0 -0
  65. data/library/video/library/export.txt +1 -0
  66. data/library/video/library/video.jar +0 -0
  67. data/samples/{animator.rb → contributed/animator.rb} +0 -0
  68. data/samples/{bezier_playground.rb → contributed/bezier_playground.rb} +0 -0
  69. data/samples/{circle_collision.rb → contributed/circle_collision.rb} +0 -0
  70. data/samples/contributed/drawolver.rb +182 -0
  71. data/samples/{empathy.rb → contributed/empathy.rb} +7 -7
  72. data/samples/{fern.rb → contributed/fern.rb} +0 -0
  73. data/samples/{flight_patterns.rb → contributed/flight_patterns.rb} +0 -0
  74. data/samples/{full_screen.rb → contributed/full_screen.rb} +0 -0
  75. data/samples/{getting_started.rb → contributed/getting_started.rb} +0 -0
  76. data/samples/{gravity.rb → contributed/gravity.rb} +0 -0
  77. data/samples/{jwishy.rb → contributed/jwishy.rb} +0 -0
  78. data/samples/{orbit.rb → contributed/orbit.rb} +0 -0
  79. data/samples/{pong.rb → contributed/pong.rb} +0 -0
  80. data/samples/{reflection.rb → contributed/reflection.rb} +0 -0
  81. data/samples/{simple_buffer.rb → contributed/simple_buffer.rb} +0 -0
  82. data/samples/{tree.rb → contributed/tree.rb} +0 -0
  83. data/samples/peasy_cam/library/hilbert/hilbert.rb +11 -10
  84. data/samples/processing_app/3D/camera/move_eye.rb +29 -0
  85. data/samples/processing_app/3D/form/brick_tower.rb +11 -11
  86. data/samples/processing_app/3D/form/cubic_grid.rb +51 -0
  87. data/samples/processing_app/3D/form/icosahedra/icosahedra.rb +76 -0
  88. data/samples/processing_app/3D/form/icosahedra/icosahedron.rb +116 -0
  89. data/samples/processing_app/3D/form/icosahedra/shape_3D.rb +25 -0
  90. data/samples/processing_app/3D/form/primitives.rb +42 -0
  91. data/samples/processing_app/3D/form/rgb_cube.rb +88 -0
  92. data/samples/processing_app/3D/form/shape_transform.rb +94 -0
  93. data/samples/processing_app/3D/form/toroid.rb +130 -0
  94. data/samples/processing_app/3D/form/vertices.rb +81 -0
  95. data/samples/processing_app/3D/image/data/eames.jpg +0 -0
  96. data/samples/processing_app/3D/image/data/ystone08.jpg +0 -0
  97. data/samples/processing_app/3D/image/explode.rb +56 -0
  98. data/samples/processing_app/3D/image/extrusion.rb +49 -0
  99. data/samples/processing_app/3D/image/zoom.rb +83 -0
  100. data/samples/processing_app/3D/lights/directional.rb +41 -0
  101. data/samples/processing_app/3D/lights/lights1.rb +39 -0
  102. data/samples/processing_app/3D/lights/lights2.rb +42 -0
  103. data/samples/processing_app/3D/lights/reflection.rb +38 -0
  104. data/samples/processing_app/3D/lights/spot.rb +39 -0
  105. data/samples/processing_app/3D/textures/data/berlin-1.jpg +0 -0
  106. data/samples/processing_app/3D/textures/texture1.rb +41 -0
  107. data/samples/processing_app/3D/textures/texture2.rb +38 -0
  108. data/samples/processing_app/3D/textures/texture3.rb +68 -0
  109. data/samples/processing_app/3D/textures/texture_cube.rb +106 -0
  110. data/samples/processing_app/3D/transform/bird.rb +61 -0
  111. data/samples/processing_app/3D/transform/birds/bird.rb +87 -0
  112. data/samples/processing_app/3D/transform/birds/birds.rb +48 -0
  113. data/samples/processing_app/3D/transform/cubes_in_cube/cube.rb +57 -0
  114. data/samples/processing_app/3D/transform/cubes_in_cube/cubes_in_cube.rb +102 -0
  115. data/samples/processing_app/3D/transform/push_pop_cubes.rb +152 -0
  116. data/samples/processing_app/3D/transform/rotate1.rb +43 -0
  117. data/samples/processing_app/3D/transform/rotate2.rb +45 -0
  118. data/samples/processing_app/3D/typography/data/Univers45.vlw +0 -0
  119. data/samples/processing_app/3D/typography/letter_k.rb +136 -0
  120. data/samples/processing_app/3D/typography/typing.rb +77 -0
  121. data/samples/processing_app/basics/form/triangle_strip.rb +19 -19
  122. data/samples/processing_app/basics/math/distance1.rb +59 -0
  123. data/samples/processing_app/basics/math/distance2.rb +38 -0
  124. data/samples/processing_app/basics/math/double_random.rb +38 -0
  125. data/samples/processing_app/basics/math/graphing_2_d_equation.rb +53 -0
  126. data/samples/processing_app/basics/math/increment_decrement.rb +59 -0
  127. data/samples/processing_app/basics/math/modulo.rb +43 -0
  128. data/samples/processing_app/basics/math/noise_1_d.rb +37 -0
  129. data/samples/processing_app/basics/math/noise_2_d.rb +47 -0
  130. data/samples/processing_app/basics/math/noise_3_d.rb +50 -0
  131. data/samples/processing_app/basics/math/noise_wave.rb +61 -0
  132. data/samples/processing_app/basics/math/operator_precedence.rb +70 -0
  133. data/samples/processing_app/basics/math/polar_to_cartesian.rb +44 -0
  134. data/samples/processing_app/basics/math/random.rb +35 -0
  135. data/samples/processing_app/basics/math/sine.rb +49 -0
  136. data/samples/processing_app/basics/math/sine_cosine.rb +60 -0
  137. data/samples/processing_app/basics/math/sine_wave.rb +62 -0
  138. data/samples/processing_app/basics/objects/composite_objects.rb +139 -0
  139. data/samples/processing_app/basics/objects/inheritance.rb +104 -0
  140. data/samples/processing_app/basics/objects/multiple_constructors.rb +66 -0
  141. data/samples/processing_app/basics/objects/objects.rb +72 -0
  142. data/samples/processing_app/basics/shape/data/bot1.svg +160 -0
  143. data/samples/processing_app/basics/shape/data/usa-wikipedia.svg +452 -0
  144. data/samples/processing_app/basics/shape/disable_style.rb +36 -0
  145. data/samples/processing_app/basics/shape/get_child.rb +43 -0
  146. data/samples/processing_app/basics/shape/load_display_shape.rb +33 -0
  147. data/samples/processing_app/basics/shape/scale_shape.rb +33 -0
  148. data/samples/processing_app/basics/structure/coordinates.rb +55 -0
  149. data/samples/processing_app/basics/structure/create_graphics.rb +39 -0
  150. data/samples/processing_app/basics/structure/functions.rb +41 -0
  151. data/samples/processing_app/basics/structure/loop.rb +39 -0
  152. data/samples/processing_app/basics/structure/noloop.rb +33 -0
  153. data/samples/processing_app/basics/structure/recursion1.rb +42 -0
  154. data/samples/processing_app/basics/structure/recursion2.rb +39 -0
  155. data/samples/processing_app/basics/structure/redraw.rb +36 -0
  156. data/samples/processing_app/basics/structure/setup_draw.rb +30 -0
  157. data/samples/processing_app/basics/structure/statements_comments.rb +32 -0
  158. data/samples/processing_app/basics/structure/width_height.rb +29 -0
  159. data/samples/processing_app/basics/transform/arm.rb +47 -0
  160. data/samples/processing_app/basics/transform/rotate.rb +43 -0
  161. data/samples/processing_app/basics/transform/scale.rb +45 -0
  162. data/samples/processing_app/basics/transform/translate.rb +41 -0
  163. data/samples/processing_app/basics/transform/triangle_flower.rb +69 -0
  164. data/samples/processing_app/basics/typography/data/CourierNew36.vlw +0 -0
  165. data/samples/processing_app/basics/typography/data/Ziggurat-HTF-Black-32.vlw +0 -0
  166. data/samples/processing_app/basics/typography/letters.rb +52 -0
  167. data/samples/processing_app/basics/typography/words.rb +37 -0
  168. data/samples/processing_app/basics/web/embedded_links.rb +58 -0
  169. data/samples/processing_app/basics/web/loading_images.rb +25 -0
  170. metadata +181 -86
  171. data/lib/patches/JRubyApplet.diff +0 -24
  172. data/lib/patches/PATCHES.txt +0 -3
  173. data/lib/patches/PApplet.diff +0 -27
  174. data/library/minim/license.txt +0 -339
  175. data/library/minim/version.txt +0 -1
  176. data/library/opengl/library/gluegen-rt-natives-linux-amd64.jar +0 -0
  177. data/library/opengl/library/gluegen-rt-natives-linux-i586.jar +0 -0
  178. data/library/opengl/library/gluegen-rt-natives-macosx-ppc.jar +0 -0
  179. data/library/opengl/library/gluegen-rt-natives-macosx-universal.jar +0 -0
  180. data/library/opengl/library/gluegen-rt-natives-windows-amd64.jar +0 -0
  181. data/library/opengl/library/gluegen-rt-natives-windows-i586.jar +0 -0
  182. data/library/opengl/library/gluegen-rt.jar.pack.gz +0 -0
  183. data/library/opengl/library/jogl-natives-linux-amd64.jar +0 -0
  184. data/library/opengl/library/jogl-natives-linux-i586.jar +0 -0
  185. data/library/opengl/library/jogl-natives-macosx-ppc.jar +0 -0
  186. data/library/opengl/library/jogl-natives-macosx-universal.jar +0 -0
  187. data/library/opengl/library/jogl-natives-windows-amd64.jar +0 -0
  188. data/library/opengl/library/jogl-natives-windows-i586.jar +0 -0
  189. data/library/opengl/library/jogl.jar.pack.gz +0 -0
  190. data/library/pdf/notes.txt +0 -8
  191. data/library/serial/library/librxtxSerial.jnilib +0 -0
  192. data/library/serial/library/librxtxSerial.so +0 -0
  193. data/library/serial/library/rxtxSerial.dll +0 -0
@@ -0,0 +1,6 @@
1
+ require "yaml"
2
+
3
+ module Processing
4
+ CONFIG_FILE_PATH = File.expand_path("~/.rp5rc")
5
+ CONFIG = (YAML::load_file(CONFIG_FILE_PATH) rescue {}).freeze
6
+ end
@@ -0,0 +1,120 @@
1
+ module Processing
2
+ module HelperMethods
3
+
4
+ # Nice block method to draw to a buffer.
5
+ # You can optionally pass it a width, a height, and a renderer.
6
+ # Takes care of starting and ending the draw for you.
7
+ def buffer(buf_width=width, buf_height=height, renderer=@render_mode)
8
+ buf = create_graphics(buf_width, buf_height, renderer)
9
+ buf.begin_draw
10
+ yield buf
11
+ buf.end_draw
12
+ buf
13
+ end
14
+
15
+ # A nice method to run a given block for a grid.
16
+ # Lifted from action_coding/Nodebox.
17
+ def grid(cols, rows, col_size=1, row_size=1)
18
+ (0...cols*rows).map do |i|
19
+ x = col_size * (i % cols)
20
+ y = row_size * i.div(cols)
21
+ yield x, y
22
+ end
23
+ end
24
+
25
+ # lerp_color takes three or four arguments, in Java that's two
26
+ # different methods, one regular and one static, so:
27
+ def lerp_color(*args)
28
+ args.length > 3 ? self.class.lerp_color(*args) : super(*args)
29
+ end
30
+
31
+ def color(*args)
32
+ a = args[0]
33
+ # convert to signed int
34
+ if args.length == 1 && a.is_a?(Fixnum) && a >= 2**31
35
+ args = [ a - 2**32 ]
36
+ end
37
+ super(*args)
38
+ end
39
+
40
+ # There's just so many functions in Processing,
41
+ # Here's a convenient way to look for them.
42
+ def find_method(method_name)
43
+ reg = Regexp.new("#{method_name}", true)
44
+ self.methods.sort.select {|meth| reg.match(meth)}
45
+ end
46
+
47
+ # Proxy over a list of Java declared fields that have the same name as
48
+ # some methods. Add to this list as needed.
49
+ def proxy_java_fields
50
+ @declared_fields = {}
51
+ fields = %w(sketchPath key frameRate frame)
52
+ fields.each {|f| @declared_fields[f] = java_class.declared_field(f) }
53
+ end
54
+
55
+ # By default, your sketch path is the folder that your sketch is in.
56
+ # If you'd like to do something fancy, feel free.
57
+ def set_sketch_path(path=nil)
58
+ field = @declared_fields['sketchPath']
59
+ field.set_value(java_self, path || SKETCH_ROOT)
60
+ end
61
+
62
+
63
+
64
+ # Fix java conversion problems getting the last key
65
+ # If it's ASCII, return the character, otherwise the integer
66
+ def key
67
+ int = @declared_fields['key'].value(java_self)
68
+ int < 256 ? int.chr : int
69
+ end
70
+
71
+ # Provide a convenient handle for the Java-space version of self.
72
+ def java_self
73
+ @java_self ||= Java.ruby_to_java self
74
+ end
75
+
76
+
77
+ # Get the sketch path
78
+ def sketch_path
79
+ @declared_fields['sketchPath'].value(java_self)
80
+ end
81
+
82
+ # Fields that should be made accessible as under_scored.
83
+ def mouse_x; mouseX; end
84
+ def mouse_y; mouseY; end
85
+ def pmouse_x; pmouseX; end
86
+ def pmouse_y; pmouseY; end
87
+ def frame_count; frameCount; end
88
+ def mouse_button; mouseButton; end
89
+ def key_code; keyCode; end
90
+
91
+
92
+ # Ensure that load_strings returns a real Ruby array
93
+ def load_strings(file_or_url)
94
+ loadStrings(file_or_url).to_a
95
+ end
96
+
97
+ # Writes an array of strings to a file, one line per string.
98
+ # This file is saved to the sketch's data folder
99
+ def save_strings(filename, strings)
100
+ saveStrings(filename, [strings].flatten.to_java(:String))
101
+ end
102
+
103
+ # frame_rate needs to support reading and writing
104
+ def frame_rate(fps = nil)
105
+ return @declared_fields['frameRate'].value(java_self) unless fps
106
+ super(fps)
107
+ end
108
+
109
+ # Is the mouse pressed for this frame?
110
+ def mouse_pressed?
111
+ Java.java_to_primitive(java_class.field("mousePressed").value(java_object))
112
+ end
113
+
114
+ # Is a key pressed for this frame?
115
+ def key_pressed?
116
+ Java.java_to_primitive(java_class.field("keyPressed").value(java_object))
117
+ end
118
+
119
+ end
120
+ end
@@ -0,0 +1,140 @@
1
+ module Processing
2
+ class LibraryLoader
3
+ attr_reader :sketchbook_library_path
4
+
5
+ def initialize
6
+ @sketchbook_library_path = File.join(find_sketchbook_path || "", "libraries")
7
+ @loaded_libraries = Hash.new(false)
8
+ end
9
+
10
+ # Detect if a library has been loaded (for conditional loading)
11
+ def library_loaded?(library_name)
12
+ @loaded_libraries[library_name.to_sym]
13
+ end
14
+
15
+ # Load a list of Ruby or Java libraries (in that order)
16
+ # Usage: load_libraries :opengl, :boids
17
+ #
18
+ # If a library is put into a 'library' folder next to the sketch it will
19
+ # be used instead of the library that ships with Ruby-Processing.
20
+ def load_libraries(*args)
21
+ args.each do |lib|
22
+ loaded = load_ruby_library(lib) || load_java_library(lib)
23
+ raise LoadError.new "no such file to load -- #{lib}" if !loaded
24
+ end
25
+ end
26
+ alias :load_library :load_libraries
27
+
28
+ # For pure ruby libraries.
29
+ # The library should have an initialization ruby file
30
+ # of the same name as the library folder.
31
+ def load_ruby_library(library_name)
32
+ library_name = library_name.to_sym
33
+ return true if @loaded_libraries[library_name]
34
+ if Processing.online?
35
+ begin
36
+ return @loaded_libraries[library_name] = (require "library/#{library_name}/#{library_name}")
37
+ rescue LoadError => e
38
+ return false
39
+ end
40
+ else
41
+ path = get_library_path(library_name, "rb")
42
+ return false unless path
43
+ return @loaded_libraries[library_name] = (require "#{path}/#{library_name}")
44
+ end
45
+ end
46
+
47
+
48
+ # For pure java libraries, such as the ones that are available
49
+ # on this page: http://processing.org/reference/libraries/index.html
50
+ #
51
+ # P.S. -- Loading libraries which include native code needs to
52
+ # hack the Java ClassLoader, so that you don't have to
53
+ # futz with your PATH. But it's probably bad juju.
54
+ def load_java_library(library_name)
55
+ library_name = library_name.to_sym
56
+ return true if @loaded_libraries[library_name]
57
+ if Processing.online?
58
+ return @loaded_libraries[library_name] = !!(JRUBY_APPLET.get_parameter("archive").match(%r(#{library_name})))
59
+ end
60
+ path = get_library_path(library_name, "jar")
61
+ jars = Dir["#{path}/*.jar"]
62
+ return false if jars.empty?
63
+ jars.each {|jar| require jar }
64
+
65
+ platform_specific_library_paths = get_platform_specific_library_paths(path)
66
+ platform_specific_library_paths = platform_specific_library_paths.select do |path|
67
+ test(?d, path) && !Dir.glob(File.join(path, "*.{so,dll,jnilib}")).empty?
68
+ end
69
+
70
+ if !platform_specific_library_paths.empty?
71
+ platform_specific_library_paths << java.lang.System.getProperty("java.library.path")
72
+ new_library_path = platform_specific_library_paths.join(java.io.File.pathSeparator)
73
+
74
+ java.lang.System.setProperty("java.library.path", new_library_path)
75
+
76
+ field = java.lang.Class.for_name("java.lang.ClassLoader").get_declared_field("sys_paths")
77
+ if field
78
+ field.accessible = true
79
+ field.set(java.lang.Class.for_name("java.lang.System").get_class_loader, nil)
80
+ end
81
+ end
82
+ return @loaded_libraries[library_name] = true
83
+ end
84
+
85
+ def get_platform_specific_library_paths(basename)
86
+ bits = "32"
87
+ if java.lang.System.getProperty("sun.arch.data.model") == "64" ||
88
+ java.lang.System.getProperty("java.vm.name").index("64")
89
+ bits = "64"
90
+ end
91
+
92
+ match_string, platform = {"Mac" => "macosx", "Linux" => "linux", "Windows" => "windows" }.detect do |string, platform_|
93
+ java.lang.System.getProperty("os.name").index(string)
94
+ end
95
+ platform ||= "other"
96
+ [ platform, platform+bits ].collect { |p| File.join(basename, p) }
97
+ end
98
+
99
+ protected
100
+
101
+ def find_sketchbook_path
102
+ preferences_paths = []
103
+ sketchbook_paths = []
104
+ if sketchbook_path = CONFIG["sketchbook_path"]
105
+ return File.expand_path(sketchbook_path)
106
+ else
107
+ ["Application Data/Processing", "AppData/Roaming/Processing",
108
+ "Library/Processing", "Documents/Processing",
109
+ ".processing", "sketchbook"].each do |prefix|
110
+ path = "#{ENV["HOME"]}/#{prefix}"
111
+ pref_path = path+"/preferences.txt"
112
+ if test(?f, pref_path)
113
+ preferences_paths << pref_path
114
+ end
115
+ if test(?d, path)
116
+ sketchbook_paths << path
117
+ end
118
+ end
119
+ if !preferences_paths.empty?
120
+ matched_lines = File.readlines(preferences_paths.first).grep(/^sketchbook\.path=(.+)/) { $1 }
121
+ sketchbook_path = matched_lines.first
122
+ else
123
+ sketchbook_path = sketchbook_paths.first
124
+ end
125
+ return sketchbook_path
126
+ end
127
+ end
128
+
129
+ def get_library_path(library_name, extension)
130
+ [ "#{SKETCH_ROOT}/library/#{library_name}",
131
+ "#{RP5_ROOT}/library/#{library_name}/library",
132
+ "#{RP5_ROOT}/library/#{library_name}",
133
+ "#{@sketchbook_library_path}/#{library_name}/library",
134
+ "#{@sketchbook_library_path}/#{library_name}"
135
+ ].detect do |path|
136
+ File.exists?("#{path}/#{library_name}.#{extension}")
137
+ end
138
+ end
139
+ end
140
+ end
@@ -1,5 +1,6 @@
1
1
  require 'ostruct'
2
2
  require 'fileutils'
3
+ require 'ruby-processing/config'
3
4
 
4
5
  module Processing
5
6
 
@@ -8,16 +9,40 @@ module Processing
8
9
  class Runner
9
10
 
10
11
  HELP_MESSAGE = <<-EOS
12
+ Version: #{Processing::VERSION}
11
13
 
12
14
  Ruby-Processing is a little shim between Processing and JRuby that helps
13
15
  you create sketches of code art.
14
16
 
15
17
  Usage:
16
- rp5 [run | watch | live | create | app | applet | unpack] path/to/sketch
18
+ rp5 [run | watch | live | create [width height] | app | applet | unpack] path/to/sketch
19
+
20
+ run: run sketch once
21
+ watch: watch for changes on the file and relaunch it on the fly
22
+ live: launch sketch and give an interactive IRB shell
23
+ create: create new sketch. Use --bare to generate simpler sketches without a class
24
+ app: create an application version of the sketch
25
+ applet: create an applet version of the sketch
26
+ unpack: unpack samples or library
27
+
28
+ Common options:
29
+ --jruby: passed, use the installed version of jruby, instead of
30
+ our vendored jarred one (useful for gems).
31
+
32
+ Configuration file:
33
+ A YAML configuration file is located at #{Processing::CONFIG_FILE_PATH}
34
+
35
+ Possible options are:
36
+
37
+ java_args: pass additionnals arguments to Java VM upon launching.
38
+ Useful for increasing available memory (for example:
39
+ -Xms256m -Xmx256m) or force 32 bits mode (-d32).
40
+ sketchbook_path: specify Processing sketchbook path to load additionnal
41
+ libraries
17
42
 
18
43
  Examples:
19
44
  rp5 unpack samples
20
- rp5 run samples/jwishy.rb
45
+ rp5 run samples/contributed/jwishy.rb
21
46
  rp5 create some_new_sketch --bare 640 480
22
47
  rp5 watch some_new_sketch.rb
23
48
  rp5 applet some_new_sketch.rb
@@ -137,8 +162,13 @@ module Processing
137
162
  # then type them into a java_args.txt in your data directory next to your sketch.
138
163
  def discover_java_args(sketch)
139
164
  arg_file = "#{File.dirname(sketch)}/data/java_args.txt"
140
- args = dock_icon
141
- args += File.read(arg_file).split(/\s+/) if File.exists?(arg_file)
165
+ args = []
166
+ args += dock_icon
167
+ if File.exists?(arg_file)
168
+ args += File.read(arg_file).split(/\s+/)
169
+ elsif CONFIG["java_args"]
170
+ args += CONFIG["java_args"].split(/\s+/)
171
+ end
142
172
  args.map! {|arg| "-J#{arg}" } if @options.jruby
143
173
  args
144
174
  end
@@ -1,5 +1,5 @@
1
1
  $LOAD_PATH << File.expand_path(File.dirname(__FILE__) + "/../../")
2
- SKETCH_PATH = ARGV.shift
2
+ SKETCH_PATH = ARGV.shift unless defined? SKETCH_PATH
3
3
  SKETCH_ROOT = File.dirname(SKETCH_PATH) unless defined? SKETCH_ROOT
4
4
 
5
5
  require 'ruby-processing'
@@ -7,7 +7,7 @@ require 'ruby-processing/app'
7
7
 
8
8
 
9
9
  module Processing
10
-
10
+
11
11
  # For use with "bare" sketches that don't want to define a class or methods
12
12
  SKETCH_TEMPLATE = <<-EOS
13
13
  class Sketch < Processing::App
@@ -22,26 +22,25 @@ module Processing
22
22
  <% end %>
23
23
  end
24
24
  EOS
25
-
25
+
26
26
  # This method is the common entry point to run a sketch, bare or complete.
27
27
  def self.load_and_run_sketch
28
28
  source = self.read_sketch_source
29
29
  has_sketch = !!source.match(/^[^#]*< Processing::App/)
30
30
  has_methods = !!source.match(/^[^#]*(def\s+setup|def\s+draw)/)
31
-
31
+
32
32
  if has_sketch
33
33
  load SKETCH_PATH
34
34
  Processing::App.sketch_class.new if !$app
35
- return
36
35
  else
37
36
  require 'erb'
38
37
  code = ERB.new(SKETCH_TEMPLATE).result(binding)
39
- Object.class_eval code, SKETCH_PATH, 0
40
- Processing::App.sketch_class.new if !$app
38
+ Object.class_eval code, SKETCH_PATH, -1
39
+ Processing::App.sketch_class.new
41
40
  end
42
41
  end
43
-
44
-
42
+
43
+
45
44
  # Read in the sketch source code. Needs to work both online and offline.
46
45
  def self.read_sketch_source
47
46
  if Processing.online?
@@ -59,5 +58,5 @@ module Processing
59
58
  end
60
59
  source
61
60
  end
62
-
63
- end
61
+
62
+ end
@@ -9,4 +9,4 @@ ARGV.clear # So that IRB doesn't try to load them as files.
9
9
 
10
10
  require 'irb'
11
11
  IRB.setup(__FILE__)
12
- IRB.start
12
+ IRB.start
@@ -4,4 +4,4 @@
4
4
  root = defined?(JRUBY_APPLET) ? 'ruby-processing/runners' : File.dirname(__FILE__)
5
5
  require "#{root}/base.rb"
6
6
 
7
- Processing.load_and_run_sketch
7
+ Processing.load_and_run_sketch
@@ -8,10 +8,8 @@ module Processing
8
8
 
9
9
  # Sic a new Processing::Watcher on the sketch
10
10
  def initialize
11
- @file = SKETCH_PATH
11
+ reload_files_to_watch
12
12
  @time = Time.now
13
- # Doesn't work well enough for now.
14
- # record_state_of_ruby
15
13
  start_watching
16
14
  end
17
15
 
@@ -19,22 +17,18 @@ module Processing
19
17
  # Kicks off a thread to watch the sketch, reloading Ruby-Processing
20
18
  # and restarting the sketch whenever it changes.
21
19
  def start_watching
22
- @runner = Thread.start { report_errors { Processing.load_and_run_sketch } } unless $app
23
- thread = Thread.start do
24
- loop do
25
- file_mtime = File.stat(@file).mtime
26
- if file_mtime > @time
27
- @time = file_mtime
28
- wipe_out_current_app!
29
- # Taking it out the reset until it can be made to work more reliably
30
- # rewind_to_recorded_state
31
- GC.start
32
- @runner = Thread.start { report_errors { Processing.load_and_run_sketch } }
33
- end
34
- sleep 0.33
20
+ start_runner
21
+ loop do
22
+ if @files.detect { |file| File.exists?(file) && File.stat(file).mtime > @time }
23
+ puts "reloading sketch..."
24
+ $app && $app.close
25
+ @time = Time.now
26
+ GC.start
27
+ start_runner
28
+ reload_files_to_watch
35
29
  end
30
+ sleep 0.33
36
31
  end
37
- thread.join
38
32
  end
39
33
 
40
34
  # Convenience function to report errors when loading and running a sketch,
@@ -47,70 +41,18 @@ module Processing
47
41
  puts e.backtrace.join("\n")
48
42
  end
49
43
 
50
- # Used to completely remove all traces of the current sketch,
51
- # so that it can be loaded afresh. Go down into modules to find it, even.
52
- def wipe_out_current_app!
53
- @runner.kill if @runner.alive?
54
- app = $app
55
- return unless app
56
- app.no_loop
57
- # Wait for the animation thread to finish rendering
58
- sleep 0.075
59
- app.close
60
- constant_names = app.class.to_s.split(/::/)
61
- app_class_name = constant_names.pop
62
- obj = constant_names.inject(Object) {|o, name| o.send(:const_get, name) }
63
- obj.send(:remove_const, app_class_name)
64
- end
65
-
66
- # The following methods were intended to make the watcher clean up all code
67
- # loaded in from the sketch, gems, etc, and have them be reloaded properly
68
- # when the sketch is.... but it seems that this is neither a very good idea
69
- # or a very possible one. If you can make the scheme work, please do,
70
- # otherwise the following methods will probably be removed soonish.
71
-
72
- # Do the best we can to take a picture of the current Ruby interpreter.
73
- # For now, this means top-level constants and loaded .rb files.
74
- def record_state_of_ruby
75
- @saved_constants = Object.send(:constants).dup
76
- @saved_load_paths = $LOAD_PATH.dup
77
- @saved_features = $LOADED_FEATURES.dup
78
- @saved_globals = Kernel.global_variables.dup
79
- end
80
-
81
-
82
- # Try to go back to the recorded Ruby state.
83
- def rewind_to_recorded_state
84
- new_constants = Object.send(:constants).reject {|c| @saved_constants.include?(c) }
85
- new_load_paths = $LOAD_PATH.reject {|p| @saved_load_paths.include?(p) }
86
- new_features = $LOADED_FEATURES.reject {|f| @saved_features.include?(f) }
87
- new_globals = Kernel.global_variables.reject {|g| @saved_globals.include?(g) }
88
-
89
- Processing::App.recursively_remove_constants(Object, new_constants)
90
- new_load_paths.each {|p| $LOAD_PATH.delete(p) }
91
- new_features.each {|f| $LOADED_FEATURES.delete(f) }
92
- new_globals.each do |g|
93
- begin
94
- eval("#{g} = nil") # There's no way to undef a global variable in Ruby
95
- rescue NameError => e
96
- # Some globals are read-only, and we can't set them to nil.
44
+ def start_runner
45
+ @runner.kill if @runner && @runner.alive?
46
+ @runner = Thread.start do
47
+ report_errors do
48
+ Processing.load_and_run_sketch
97
49
  end
98
50
  end
99
51
  end
100
52
 
101
-
102
- # Used to clean up declared constants in code that needs to be reloaded.
103
- def recursively_remove_constants(base, constant_names)
104
- constants = constant_names.map {|name| base.const_get(name) }
105
- constants.each_with_index do |c, i|
106
- java_obj = Java::JavaLang::Object
107
- constants[i] = constant_names[i] = nil if c.respond_to?(:ancestors) && c.ancestors.include?(java_obj)
108
- constants[i] = nil if !c.is_a?(Class) && !c.is_a?(Module)
109
- end
110
- constants.each {|c| recursively_remove_constants(c, c.constants) if c }
111
- constant_names.each {|name| base.send(:remove_const, name.to_sym) if name }
53
+ def reload_files_to_watch
54
+ @files = ([SKETCH_PATH] + Dir.glob(File.dirname(SKETCH_PATH) + "/*.rb")).uniq
112
55
  end
113
-
114
56
  end
115
57
  end
116
58