ruby-processing 1.0.8 → 1.0.9
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.
- 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
@@ -9,7 +9,8 @@ module ControlPanel
|
|
9
9
|
|
10
10
|
class Slider < javax.swing.JSlider
|
11
11
|
def initialize(control_panel, name, range, initial_value, proc=nil)
|
12
|
-
min
|
12
|
+
min = range.begin * 100
|
13
|
+
max = ((range.exclude_end? && range.begin.respond_to?(:succ)) ? range.max : range.end) * 100
|
13
14
|
super(min, max)
|
14
15
|
set_minor_tick_spacing((max - min).abs / 10)
|
15
16
|
set_paint_ticks true
|
@@ -24,20 +25,20 @@ module ControlPanel
|
|
24
25
|
set_value(initial_value ? initial_value*100 : min)
|
25
26
|
fire_state_changed
|
26
27
|
end
|
27
|
-
|
28
|
+
|
28
29
|
def value
|
29
30
|
get_value / 100.0
|
30
31
|
end
|
31
|
-
|
32
|
+
|
32
33
|
def update_label(label, name, value)
|
33
34
|
value = value.to_s
|
34
35
|
value << "0" if value.length < 4
|
35
36
|
label.set_text "<html><br>#{name.to_s}: #{value}</html>"
|
36
37
|
end
|
37
38
|
end
|
38
|
-
|
39
|
-
|
40
|
-
class Menu < javax.swing.JComboBox
|
39
|
+
|
40
|
+
|
41
|
+
class Menu < javax.swing.JComboBox
|
41
42
|
def initialize(control_panel, name, elements, initial_value, proc=nil)
|
42
43
|
super(elements.to_java(:String))
|
43
44
|
set_preferred_size(java.awt.Dimension.new(190, 30))
|
@@ -48,13 +49,13 @@ module ControlPanel
|
|
48
49
|
end
|
49
50
|
set_selected_index(initial_value ? elements.index(initial_value) : 0)
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
def value
|
53
54
|
get_selected_item
|
54
55
|
end
|
55
56
|
end
|
56
|
-
|
57
|
-
|
57
|
+
|
58
|
+
|
58
59
|
class Checkbox < javax.swing.JCheckBox
|
59
60
|
def initialize(control_panel, name, proc=nil)
|
60
61
|
@control_panel = control_panel
|
@@ -62,18 +63,18 @@ module ControlPanel
|
|
62
63
|
set_preferred_size(java.awt.Dimension.new(190, 64))
|
63
64
|
set_horizontal_alignment javax.swing.SwingConstants::CENTER
|
64
65
|
control_panel.add_element(self, name, false)
|
65
|
-
add_action_listener do
|
66
|
+
add_action_listener do
|
66
67
|
$app.instance_variable_set("@#{name}", value) unless value.nil?
|
67
68
|
proc.call(value) if proc
|
68
69
|
end
|
69
70
|
end
|
70
|
-
|
71
|
+
|
71
72
|
def value
|
72
73
|
is_selected
|
73
74
|
end
|
74
75
|
end
|
75
|
-
|
76
|
-
|
76
|
+
|
77
|
+
|
77
78
|
class Button < javax.swing.JButton
|
78
79
|
def initialize(control_panel, name, proc=nil)
|
79
80
|
super(name.to_s)
|
@@ -85,17 +86,17 @@ module ControlPanel
|
|
85
86
|
end
|
86
87
|
end
|
87
88
|
end
|
88
|
-
|
89
|
-
|
89
|
+
|
90
|
+
|
90
91
|
class Panel < javax.swing.JFrame
|
91
92
|
attr_accessor :elements
|
92
|
-
|
93
|
+
|
93
94
|
def initialize
|
94
95
|
super()
|
95
96
|
@elements = []
|
96
97
|
@panel = javax.swing.JPanel.new(java.awt.FlowLayout.new(1, 0, 0))
|
97
98
|
end
|
98
|
-
|
99
|
+
|
99
100
|
def display
|
100
101
|
add @panel
|
101
102
|
set_size 200, 30 + (64 * @elements.size)
|
@@ -108,7 +109,7 @@ module ControlPanel
|
|
108
109
|
show
|
109
110
|
end
|
110
111
|
end
|
111
|
-
|
112
|
+
|
112
113
|
def add_element(element, name, has_label=true, button=false)
|
113
114
|
if has_label
|
114
115
|
label = javax.swing.JLabel.new("<html><br>#{name}</html>")
|
@@ -118,12 +119,12 @@ module ControlPanel
|
|
118
119
|
@panel.add element
|
119
120
|
return has_label ? label : nil
|
120
121
|
end
|
121
|
-
|
122
|
+
|
122
123
|
def remove
|
123
124
|
remove_all
|
124
125
|
dispose
|
125
126
|
end
|
126
|
-
|
127
|
+
|
127
128
|
def slider(name, range=0..100, initial_value = nil, &block)
|
128
129
|
slider = Slider.new(self, name, range, initial_value, block || nil)
|
129
130
|
end
|
@@ -131,17 +132,17 @@ module ControlPanel
|
|
131
132
|
def menu(name, elements, initial_value = nil, &block)
|
132
133
|
menu = Menu.new(self, name, elements, initial_value, block || nil)
|
133
134
|
end
|
134
|
-
|
135
|
+
|
135
136
|
def checkbox(name, initial_value = nil, &block)
|
136
137
|
checkbox = Checkbox.new(self, name, block || nil)
|
137
138
|
checkbox.do_click if initial_value == true
|
138
139
|
end
|
139
|
-
|
140
|
+
|
140
141
|
def button(name, &block)
|
141
142
|
button = Button.new(self, name, block || nil)
|
142
143
|
end
|
143
144
|
end
|
144
|
-
|
145
|
+
|
145
146
|
|
146
147
|
module InstanceMethods
|
147
148
|
def control_panel
|
@@ -0,0 +1 @@
|
|
1
|
+
-Xms256m -Xmx256m
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# extrude.rb is a processing sketch that shows
|
2
|
+
# how you can use the Anar library in Ruby-Processing.
|
3
|
+
|
4
|
+
load_libraries 'anar', 'opengl'
|
5
|
+
import "anar"
|
6
|
+
import "processing.opengl"
|
7
|
+
full_screen
|
8
|
+
|
9
|
+
def setup
|
10
|
+
configure_opengl
|
11
|
+
configure_anar
|
12
|
+
@points = [
|
13
|
+
[100, 110, 20],
|
14
|
+
[110, 100, 40],
|
15
|
+
[110, 90, 60],
|
16
|
+
[90, 90, 90]
|
17
|
+
]
|
18
|
+
create_extrusion
|
19
|
+
end
|
20
|
+
|
21
|
+
def configure_opengl
|
22
|
+
render_mode OPENGL
|
23
|
+
hint ENABLE_OPENGL_4X_SMOOTH # optional
|
24
|
+
hint DISABLE_OPENGL_ERROR_REPORT # optional
|
25
|
+
end
|
26
|
+
|
27
|
+
def configure_anar
|
28
|
+
Anar.init self
|
29
|
+
Anar.draw_axis true
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_extrusion
|
33
|
+
pts = Pts.new
|
34
|
+
@points.each {|xyz| pts.add(Anar.Pt(*xyz)) } # make a line out of points
|
35
|
+
face = Star.new(50,100,5) # make a face
|
36
|
+
@extrusion = Extrude.new(face, pts) # extrude the face along the line
|
37
|
+
Anar.cam_target(@extrusion)
|
38
|
+
Anar.sliders(@extrusion)
|
39
|
+
end
|
40
|
+
|
41
|
+
def draw
|
42
|
+
background 155
|
43
|
+
@extrusion.draw
|
44
|
+
end
|
45
|
+
|
46
|
+
# show or hide the sliders
|
47
|
+
def key_pressed
|
48
|
+
Anar.sliders_toggle
|
49
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# Demonstrates how you can use the Lindenmeyer System (lsys)
|
2
|
+
# features of the Anar library in Ruby-Processing.
|
3
|
+
# Press space to draw further iterations of the system.
|
4
|
+
|
5
|
+
load_libraries 'anar', 'opengl'
|
6
|
+
import "anar"
|
7
|
+
import "lsys.Grammar"
|
8
|
+
import "processing.opengl"
|
9
|
+
full_screen
|
10
|
+
|
11
|
+
def setup
|
12
|
+
setup_opengl
|
13
|
+
Anar.init self
|
14
|
+
Anar.draw_axis true
|
15
|
+
create_grammar
|
16
|
+
create_scene
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_grammar
|
20
|
+
@grammar = Grammar.new("bt")
|
21
|
+
# Here we define the rules.
|
22
|
+
# "*" means any kind of symbol.
|
23
|
+
# The example rules below are non-contextual.
|
24
|
+
@grammar.add_rule("*b*", "brb")
|
25
|
+
@grammar.add_rule("*t*", "rssb")
|
26
|
+
@grammar.add_rule("*r*", "rs")
|
27
|
+
@grammar.add_rule("*s*", "s")
|
28
|
+
# The following rule makes it context-sensitive.
|
29
|
+
# grammar.add_rule("sss", "ss")
|
30
|
+
puts @grammar
|
31
|
+
end
|
32
|
+
|
33
|
+
def create_scene
|
34
|
+
@box = Box.new(10, 10, 50) # the base element
|
35
|
+
@pos = Translate.new(0, 50, 0) # with position
|
36
|
+
@trans = Translate.new(Anar.Pt(0, 10, -0.001)) # and transformations...
|
37
|
+
@rot = RotateZ.new(0.5)
|
38
|
+
@scale = Scale.new(Anar.Pt(0.99, 0.99, 0.99))
|
39
|
+
interpret_grammar
|
40
|
+
end
|
41
|
+
|
42
|
+
def interpret_grammar
|
43
|
+
@scene = Obj.new
|
44
|
+
@root = Transform.new(@pos)
|
45
|
+
@grammar.num_of_symbols.times do |i|
|
46
|
+
rule = @grammar.symbol(i)[0].chr
|
47
|
+
case rule # todo this is bit of hack, I need understand grammar better
|
48
|
+
when 'b'
|
49
|
+
@scene.add(Obj.new(@box, @root))
|
50
|
+
@root = Transform.new(@root)
|
51
|
+
when 't' then @root.apply(@trans)
|
52
|
+
when 'r' then @root.apply(@rot)
|
53
|
+
when 's' then @root.apply(@scale)
|
54
|
+
else
|
55
|
+
puts "rule: '#{rule}' is not in grammar"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
Anar.cam_target @scene
|
59
|
+
end
|
60
|
+
|
61
|
+
def draw
|
62
|
+
background 153
|
63
|
+
@scene.draw
|
64
|
+
end
|
65
|
+
|
66
|
+
def key_pressed
|
67
|
+
case key
|
68
|
+
when ' '
|
69
|
+
@grammar.step
|
70
|
+
interpret_grammar
|
71
|
+
puts @grammar
|
72
|
+
when 'r'
|
73
|
+
@grammar.reset
|
74
|
+
create_grammar
|
75
|
+
interpret_grammar
|
76
|
+
puts @grammar
|
77
|
+
when 'p'
|
78
|
+
save_frame "block.png"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def setup_opengl
|
83
|
+
render_mode OPENGL
|
84
|
+
hint ENABLE_OPENGL_4X_SMOOTH # optional
|
85
|
+
hint DISABLE_OPENGL_ERROR_REPORT # optional
|
86
|
+
end
|
Binary file
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# Demonstrates custom shapes with the Anar library.
|
2
|
+
# Hold down middle button to control orientation
|
3
|
+
# of the working surface (prepare to be amazed)!
|
4
|
+
|
5
|
+
load_libraries 'anar', 'opengl'
|
6
|
+
import "anar"
|
7
|
+
import "processing.opengl"
|
8
|
+
full_screen
|
9
|
+
|
10
|
+
def setup
|
11
|
+
setup_opengl
|
12
|
+
Anar.init self
|
13
|
+
Anar.draw_axis
|
14
|
+
Face.globalRender = RenderFaceNormal.new(OogColor.new(255, 100), OogColor.new(100))
|
15
|
+
create_shapes
|
16
|
+
end
|
17
|
+
|
18
|
+
def create_shapes
|
19
|
+
@scene = Obj.new
|
20
|
+
@group = Group.new
|
21
|
+
shapes = []
|
22
|
+
|
23
|
+
# A Cone.
|
24
|
+
cone = Cone.new(50,100,20)
|
25
|
+
cone.set("cone")
|
26
|
+
cone.translate(100,100,0)
|
27
|
+
@group.add(cone)
|
28
|
+
shapes << cone
|
29
|
+
# puts(cone.to_obj_exporter)
|
30
|
+
|
31
|
+
# A Box.
|
32
|
+
box = Box.new(10,20,30)
|
33
|
+
box.set("box")
|
34
|
+
box.rotate_z(0)
|
35
|
+
box.rotate_x(0)
|
36
|
+
box.translate(100, 0, 0)
|
37
|
+
@group.add(box)
|
38
|
+
shapes << box
|
39
|
+
# puts(box.to_obj_exporter("box"))
|
40
|
+
# puts(box.parent_list(-1))
|
41
|
+
|
42
|
+
# A Cylinder
|
43
|
+
cylinder = Cylinder.new(50, 24, 50)
|
44
|
+
cylinder.set("cylinder")
|
45
|
+
cylinder.translate(-100, 0, 0)
|
46
|
+
@group.add(cylinder)
|
47
|
+
shapes << cylinder
|
48
|
+
# puts(cylinder.to_obj_exporter("cylinder"))
|
49
|
+
|
50
|
+
# An ellipse.
|
51
|
+
ellipse = Ellipse.new(40, 20)
|
52
|
+
ellipse.set("ellipse")
|
53
|
+
@group.add(ellipse)
|
54
|
+
shapes << ellipse
|
55
|
+
# puts(ellipse.to_obj_exporter("ellipse"))
|
56
|
+
|
57
|
+
# A 3D Swiss Cross.
|
58
|
+
swiss_cross = SwissCross3D.new(10, 10)
|
59
|
+
swiss_cross.set("swiss_cross")
|
60
|
+
#swiss_cross.fill(255,0,0,200)
|
61
|
+
#swiss_cross.translate(-100,0,0)
|
62
|
+
@group.add(swiss_cross)
|
63
|
+
shapes << swiss_cross
|
64
|
+
# puts(swiss_cross.to_obj_exporter("swiss_cross"))
|
65
|
+
|
66
|
+
# A Revolver
|
67
|
+
control_line = Pts.new()
|
68
|
+
control_line.add(Anar.Pt(30,0,30))
|
69
|
+
control_line.add(Anar.Pt(10,0,40))
|
70
|
+
control_line.add(Anar.Pt(20,0,60))
|
71
|
+
control_line.add(Anar.Pt(20,0,70))
|
72
|
+
revolver = Revolve.new(control_line, Anar.Pt(0,0,20), 12)
|
73
|
+
revolver.set("revolver")
|
74
|
+
@group.add(revolver)
|
75
|
+
shapes << revolver
|
76
|
+
# puts(revolver.to_obj_exporter("revolver"))
|
77
|
+
|
78
|
+
# Add all the shapes to the scene.
|
79
|
+
shapes.each {|shape| @scene.add(shape) }
|
80
|
+
Anar.sliders(swiss_cross)
|
81
|
+
Anar.sliders(revolver)
|
82
|
+
Anar.cam_target(revolver)
|
83
|
+
end
|
84
|
+
|
85
|
+
def setup_opengl
|
86
|
+
render_mode OPENGL
|
87
|
+
hint ENABLE_OPENGL_4X_SMOOTH # optional
|
88
|
+
hint DISABLE_OPENGL_ERROR_REPORT # optional
|
89
|
+
end
|
90
|
+
|
91
|
+
def draw
|
92
|
+
background 155
|
93
|
+
@group.draw
|
94
|
+
end
|
95
|
+
|
96
|
+
def key_pressed
|
97
|
+
create_shapes if key == ' '
|
98
|
+
end
|
data/samples/empathy.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# Empathy
|
2
|
+
# original by Kyle McDonald
|
3
|
+
# http://www.openprocessing.org/visuals/?visualID=1182
|
4
|
+
|
5
|
+
# This sketch takes advantage of multiple processors by running calculations
|
6
|
+
# in a separate thread.
|
7
|
+
|
8
|
+
CELL_COUNT = 5000
|
9
|
+
SLOW_DOWN = 0.97
|
10
|
+
ROTATION = 0.004
|
11
|
+
LINE_LENGTH = 37
|
12
|
+
MULTI_THREADED = true
|
13
|
+
|
14
|
+
def setup
|
15
|
+
size(500, 500, P3D)
|
16
|
+
stroke(0, 0, 0, 25)
|
17
|
+
initialize_cells
|
18
|
+
start_cell_updates if MULTI_THREADED
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize_cells
|
22
|
+
@cells = []
|
23
|
+
n = CELL_COUNT
|
24
|
+
n.times do |i|
|
25
|
+
a = i + rand * (Math::PI / 9.0)
|
26
|
+
r = ((i / n.to_f) * (width / 2) * (((n - i) / n.to_f) * 3.3)) + (rand * 6)
|
27
|
+
@cells[i] = Cell.new((r * Math.cos(a) + width/2).to_i, (r * Math.sin(a) + height/2).to_i)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def start_cell_updates
|
32
|
+
Thread.new { Kernel.loop { @cells.each {|cell| cell.update } } }
|
33
|
+
end
|
34
|
+
|
35
|
+
def draw
|
36
|
+
background 255
|
37
|
+
@cells.each {|cell| cell.sense } if started?
|
38
|
+
end
|
39
|
+
|
40
|
+
def started?
|
41
|
+
pmouse_x != 0 || pmouse_y != 0
|
42
|
+
end
|
43
|
+
|
44
|
+
def mouse_pressed
|
45
|
+
@cells.each {|cell| cell.reset }
|
46
|
+
end
|
47
|
+
|
48
|
+
class Cell
|
49
|
+
|
50
|
+
def initialize(x, y)
|
51
|
+
@x, @y = x, y
|
52
|
+
@spin = 0
|
53
|
+
@angle = 0
|
54
|
+
end
|
55
|
+
|
56
|
+
def reset
|
57
|
+
@spin, @angle = 0, 0
|
58
|
+
end
|
59
|
+
|
60
|
+
def update
|
61
|
+
det = ((pmouse_x-@x) * (mouse_y-@y) - (mouse_x-@x) * (pmouse_y-@y)).to_f
|
62
|
+
@spin += ROTATION * det / dist(@x, @y, mouse_x, mouse_y).to_f
|
63
|
+
@spin *= SLOW_DOWN
|
64
|
+
@angle += @spin
|
65
|
+
end
|
66
|
+
|
67
|
+
def sense
|
68
|
+
update unless MULTI_THREADED
|
69
|
+
d = LINE_LENGTH * @spin + 0.001
|
70
|
+
line(@x, @y, @x + d * Math.cos(@angle), @y + d * Math.sin(@angle))
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|