jruby_art 2.2.0 → 2.4.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.
- checksums.yaml +4 -4
- data/bin/k9 +4 -3
- data/lib/gluegen-rt-natives-linux-amd64.jar +0 -0
- data/lib/gluegen-rt-natives-macosx-universal.jar +0 -0
- data/lib/gluegen-rt-natives-windows-amd64.jar +0 -0
- data/lib/gluegen-rt.jar +0 -0
- data/lib/jogl-all-natives-linux-amd64.jar +0 -0
- data/lib/jogl-all-natives-macosx-universal.jar +0 -0
- data/lib/jogl-all-natives-windows-amd64.jar +0 -0
- data/lib/jogl-all.jar +0 -0
- data/lib/jruby_art-2.4.1.jar +0 -0
- data/lib/jruby_art/app.rb +8 -7
- data/lib/jruby_art/config.rb +2 -0
- data/lib/jruby_art/creators/sketch_writer.rb +31 -13
- data/lib/jruby_art/default_config.rb +2 -0
- data/lib/jruby_art/helper_methods.rb +23 -23
- data/lib/jruby_art/helpers/aabb.rb +3 -0
- data/lib/jruby_art/helpers/numeric.rb +1 -0
- data/lib/jruby_art/installer.rb +10 -7
- data/lib/jruby_art/java_opts.rb +2 -0
- data/lib/jruby_art/jruby_complete.rb +2 -0
- data/lib/jruby_art/launcher.rb +8 -3
- data/lib/jruby_art/library.rb +14 -5
- data/lib/jruby_art/library_loader.rb +4 -1
- data/lib/jruby_art/native_folder.rb +16 -14
- data/lib/jruby_art/native_loader.rb +3 -0
- data/lib/jruby_art/processing_ide.rb +5 -1
- data/lib/jruby_art/runner.rb +65 -44
- data/lib/jruby_art/runners/base.rb +5 -4
- data/lib/jruby_art/runners/live.rb +10 -7
- data/lib/jruby_art/runners/run.rb +1 -0
- data/lib/jruby_art/runners/watch.rb +6 -4
- data/lib/jruby_art/version.rb +2 -1
- data/library/boids/boids.rb +19 -10
- data/library/chooser/chooser.rb +10 -9
- data/library/color_group/color_group.rb +2 -0
- data/library/control_panel/control_panel.rb +8 -5
- data/library/dxf/dxf.rb +2 -0
- data/library/library_proxy/library_proxy.rb +2 -0
- data/library/net/net.rb +2 -0
- data/library/slider/slider.rb +24 -23
- data/library/vector_utils/vector_utils.rb +5 -1
- data/library/video_event/video_event.rb +5 -1
- data/vendors/Rakefile +90 -37
- metadata +12 -12
- data/lib/jruby_art-2.2.0.jar +0 -0
data/lib/jruby_art/version.rb
CHANGED
data/library/boids/boids.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# Boids -- after Tom de Smedt.
|
3
4
|
# See his Python version: http://nodebox.net/code/index.php/Boids
|
4
5
|
# This is an example of how a pure-Ruby library can work. Original for
|
@@ -8,7 +9,8 @@ class Boid
|
|
8
9
|
attr_reader :boids
|
9
10
|
attr_accessor :vel, :pos, :is_perching, :perch_time
|
10
11
|
def initialize(boids, pos)
|
11
|
-
@boids
|
12
|
+
@boids = boids
|
13
|
+
@flock = boids
|
12
14
|
@pos = pos
|
13
15
|
@vel = Vec3D.new
|
14
16
|
@is_perching = false
|
@@ -54,6 +56,7 @@ class Boid
|
|
54
56
|
# Tweet, Tweet! The boid police will bust you for breaking the speed limit.
|
55
57
|
most = [vel.x.abs, vel.y.abs, vel.z.abs].max
|
56
58
|
return if most < max
|
59
|
+
|
57
60
|
scale = max / most.to_f
|
58
61
|
@vel *= scale
|
59
62
|
end
|
@@ -70,13 +73,13 @@ end
|
|
70
73
|
|
71
74
|
require 'forwardable'
|
72
75
|
|
73
|
-
# The Boids class
|
76
|
+
# The Boids class NB: perchance => perch chance
|
74
77
|
class Boids
|
75
78
|
include Enumerable
|
76
79
|
extend Forwardable
|
77
80
|
def_delegators(:@boids, :reject, :<<, :each, :shuffle!, :length, :next)
|
78
81
|
|
79
|
-
attr_reader :has_goal, :
|
82
|
+
attr_reader :has_goal, :perchance, :perch_tm, :perch_y
|
80
83
|
|
81
84
|
def initialize
|
82
85
|
@boids = []
|
@@ -89,16 +92,20 @@ class Boids
|
|
89
92
|
|
90
93
|
def setup(n, x, y, w, h)
|
91
94
|
n.times do
|
92
|
-
dx
|
95
|
+
dx = rand(w)
|
96
|
+
dy = rand(h)
|
93
97
|
z = rand(200.0)
|
94
98
|
self << Boid.new(self, Vec3D.new(x + dx, y + dy, z))
|
95
99
|
end
|
96
|
-
@x
|
100
|
+
@x = x
|
101
|
+
@y = y
|
102
|
+
@w = w
|
103
|
+
@h = h
|
97
104
|
@scattered = false
|
98
105
|
@scatter = 0.005
|
99
106
|
@scatter_time = 50.0
|
100
107
|
@scatter_i = 0.0
|
101
|
-
@
|
108
|
+
@perchance = 1.0 # Lower this number to divebomb.
|
102
109
|
@perch_y = h
|
103
110
|
@perch_tm = -> { 25.0 + rand(50.0) }
|
104
111
|
@has_goal = false
|
@@ -119,11 +126,11 @@ class Boids
|
|
119
126
|
def perch(ground = nil, chance = 1.0, frames = nil)
|
120
127
|
@perch_tm = frames.nil? ? -> { 25.0 + rand(50.0) } : frames
|
121
128
|
@perch_y = ground.nil? ? @h : ground
|
122
|
-
@
|
129
|
+
@perchance = chance
|
123
130
|
end
|
124
131
|
|
125
132
|
def no_perch
|
126
|
-
@
|
133
|
+
@perchance = 0.0
|
127
134
|
end
|
128
135
|
|
129
136
|
def reset_goal(target)
|
@@ -146,7 +153,8 @@ class Boids
|
|
146
153
|
|
147
154
|
def constrain
|
148
155
|
# Put them boids in a cage.
|
149
|
-
dx
|
156
|
+
dx = @w * 0.1
|
157
|
+
dy = @h * 0.1
|
150
158
|
each do |b|
|
151
159
|
b.vel.x += rand(dx) if b.pos.x < @x - dx
|
152
160
|
b.vel.y += rand(dy) if b.pos.y < @y - dy
|
@@ -154,7 +162,8 @@ class Boids
|
|
154
162
|
b.vel.y -= rand(dy) if b.pos.y > @y + @h + dy
|
155
163
|
b.vel.z += 10.0 if b.pos.z < 0.0
|
156
164
|
b.vel.z -= 10.0 if b.pos.z > 100.0
|
157
|
-
next unless b.pos.y > perch_y && rand <
|
165
|
+
next unless b.pos.y > perch_y && rand < perchance
|
166
|
+
|
158
167
|
b.pos.y = perch_y
|
159
168
|
b.vel.y = b.vel.y.abs * -0.2
|
160
169
|
b.is_perching = true
|
data/library/chooser/chooser.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# Usage:
|
3
4
|
# load_library :chooser
|
4
|
-
#
|
5
|
+
#
|
5
6
|
# def setup
|
6
|
-
|
7
|
-
|
7
|
+
# java_signature 'void selectInput(String, String)'
|
8
|
+
# selectInput('Select a file to process:', 'fileSelected')
|
8
9
|
# end
|
9
|
-
#
|
10
|
+
#
|
10
11
|
# def fileSelected(selection)
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
12
|
+
# if selection.nil?
|
13
|
+
# puts 'Window was closed or the user hit cancel.'
|
14
|
+
# else
|
15
|
+
# puts format('User selected %s', selection.get_absolute_path)
|
16
|
+
# end
|
16
17
|
# end
|
17
18
|
class Processing::App
|
18
19
|
include Java::MonkstoneFilechooser::Chooser
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Here's a little library for quickly hooking up controls to sketches.
|
2
4
|
# For messing with the parameters and such.
|
3
5
|
# These controls will set instance variables on the sketches.
|
@@ -25,7 +27,7 @@ module ControlPanel
|
|
25
27
|
add_change_listener do
|
26
28
|
update_label(label, name, value)
|
27
29
|
ControlPanel.app_value(name, value)
|
28
|
-
proc
|
30
|
+
proc&.call(value)
|
29
31
|
end
|
30
32
|
ControlPanel.app_value(name, val)
|
31
33
|
end
|
@@ -49,7 +51,7 @@ module ControlPanel
|
|
49
51
|
control_panel.add_element(self, name)
|
50
52
|
add_action_listener do
|
51
53
|
ControlPanel.app_value(name, value) unless value.nil?
|
52
|
-
proc
|
54
|
+
proc&.call(value)
|
53
55
|
end
|
54
56
|
set_selected_index(initial_value ? elements.index(initial_value) : 0)
|
55
57
|
end
|
@@ -69,7 +71,7 @@ module ControlPanel
|
|
69
71
|
control_panel.add_element(self, name, false)
|
70
72
|
add_action_listener do
|
71
73
|
ControlPanel.app_value(name, value)
|
72
|
-
proc
|
74
|
+
proc&.call(value)
|
73
75
|
end
|
74
76
|
end
|
75
77
|
|
@@ -87,7 +89,7 @@ module ControlPanel
|
|
87
89
|
control_panel.add_element(self, name, false, true)
|
88
90
|
add_action_listener do
|
89
91
|
Processing.app.send(name)
|
90
|
-
proc
|
92
|
+
proc&.call(value)
|
91
93
|
end
|
92
94
|
end
|
93
95
|
end
|
@@ -160,7 +162,7 @@ module ControlPanel
|
|
160
162
|
def feel(lf = 'metal')
|
161
163
|
lafinfo = javax.swing.UIManager.getInstalledLookAndFeels
|
162
164
|
laf = lafinfo.to_ary.find do |info|
|
163
|
-
info.name
|
165
|
+
info.name.match?(Regexp.new(Regexp.escape(lf), Regexp::IGNORECASE))
|
164
166
|
end
|
165
167
|
javax.swing.UIManager.setLookAndFeel(laf.class_name)
|
166
168
|
end
|
@@ -171,6 +173,7 @@ module ControlPanel
|
|
171
173
|
def control_panel
|
172
174
|
@control_panel ||= ControlPanel::Panel.new
|
173
175
|
return @control_panel unless block_given?
|
176
|
+
|
174
177
|
yield(@control_panel)
|
175
178
|
@control_panel.display
|
176
179
|
@control_panel.set_visible true
|
data/library/dxf/dxf.rb
CHANGED
data/library/net/net.rb
CHANGED
data/library/slider/slider.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
# Here's a little library for quickly hooking up in sketch sliders.
|
3
|
-
# Copyright (c)
|
4
|
+
# Copyright (c) 2015-20 Martin Prout.
|
4
5
|
|
5
6
|
java_import 'monkstone.slider.CustomHorizontalSlider'
|
6
7
|
java_import 'monkstone.slider.CustomVerticalSlider'
|
@@ -8,34 +9,34 @@ java_import 'monkstone.slider.CustomVerticalSlider'
|
|
8
9
|
module Slider
|
9
10
|
def self.slider(app:, x:, y:, name:, **opts)
|
10
11
|
options = default.merge opts
|
11
|
-
if options[:vertical]
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
12
|
+
slider = if options[:vertical]
|
13
|
+
CustomVerticalSlider.new(
|
14
|
+
app,
|
15
|
+
x,
|
16
|
+
y,
|
17
|
+
options[:length],
|
18
|
+
options[:range].first,
|
19
|
+
options[:range].last,
|
20
|
+
name
|
21
|
+
)
|
22
|
+
else
|
23
|
+
CustomHorizontalSlider.new(
|
24
|
+
app,
|
25
|
+
x,
|
26
|
+
y,
|
27
|
+
options[:length],
|
28
|
+
options[:range].first,
|
29
|
+
options[:range].last,
|
30
|
+
name
|
31
|
+
)
|
32
|
+
end
|
32
33
|
unless opts.empty?
|
33
34
|
slider.bar_width(opts.fetch(:bar_width, 10))
|
34
35
|
slider.set_value(opts.fetch(:initial_value, 0))
|
35
36
|
end
|
36
37
|
slider
|
37
38
|
end
|
38
|
-
|
39
|
+
|
39
40
|
def self.default
|
40
41
|
{ length: 100, range: (0..100) }
|
41
42
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
PHI ||= (1 + Math.sqrt(5)) / 2 # golden ratio
|
2
4
|
GA = PHI * 2 * Math::PI # golden angle
|
3
5
|
|
@@ -47,7 +49,8 @@ module VectorUtil
|
|
47
49
|
|
48
50
|
def self.cartesian_to_polar(vec:)
|
49
51
|
res = Vec3D.new(vec.mag, 0, 0)
|
50
|
-
return Vec3D.new unless res.x
|
52
|
+
return Vec3D.new unless res.x.positive?
|
53
|
+
|
51
54
|
res.y = -Math.atan2(vec.z, vec.x)
|
52
55
|
res.z = Math.asin(vec.y / res.x)
|
53
56
|
res
|
@@ -64,6 +67,7 @@ module VectorUtil
|
|
64
67
|
|
65
68
|
def self.polar_to_cartesian(vec:)
|
66
69
|
return Vec3D.new if vec.mag <= 0
|
70
|
+
|
67
71
|
Vec3D.new(Math.asin(vec.y / vec.mag), vec.mag, -Math.atan2(vec.z, vec.x))
|
68
72
|
end
|
69
73
|
end
|
data/vendors/Rakefile
CHANGED
@@ -1,50 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'fileutils'
|
2
4
|
require 'rake/clean'
|
3
5
|
|
4
|
-
WARNING =
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
6
|
+
WARNING = <<~WARN
|
7
|
+
WARNING: you may not have wget installed, you could just download
|
8
|
+
the correct version of jruby-complete to the vendors folder, and
|
9
|
+
re-run k9 setup install instead of installing wget. Some systems
|
10
|
+
may also require 'sudo' access to install, NB: this is untested....
|
9
11
|
|
10
12
|
WARN
|
11
|
-
|
12
|
-
JRUBYC_VERSION
|
13
|
-
|
14
|
-
|
13
|
+
# https://github.com/processing/processing-video/releases/download/r6-v2.0-beta4/video-2.0-beta4.zip
|
14
|
+
JRUBYC_VERSION = '9.2.12.0'
|
15
|
+
SOUND = 'sound.zip'
|
16
|
+
SOUND_VERSION = 'v2.2.2'
|
17
|
+
VIDEO = 'video-2.0-beta4.zip'
|
18
|
+
VIDEO_VERSION = 'r6-v2.0-beta4'
|
19
|
+
EXAMPLES = '3.7'
|
15
20
|
HOME_DIR = ENV['HOME']
|
16
|
-
MAC_OR_LINUX = /linux|mac|darwin
|
21
|
+
MAC_OR_LINUX = /linux|mac|darwin/.match?(RbConfig::CONFIG['host_os'])
|
17
22
|
|
18
23
|
CLOBBER << "jruby-complete-#{JRUBYC_VERSION}.jar"
|
19
24
|
CLOBBER << "jruby-complete-#{JRUBYC_VERSION}.jar.sha256"
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
warn(WARNING)
|
26
|
-
end
|
26
|
+
desc 'dependency check'
|
27
|
+
task :wget_check do
|
28
|
+
WGET ||= `which wget`.freeze
|
29
|
+
warn WARNING unless WGET
|
27
30
|
end
|
28
31
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
desc 'download, and copy to jruby_art'
|
33
|
-
task default: %i[get_sha256 download copy_ruby]
|
34
|
-
|
35
|
-
desc 'download JRuby upstream sources'
|
36
|
-
task download: ["jruby-complete-#{JRUBYC_VERSION}.jar"]
|
32
|
+
file "jruby-complete-#{JRUBYC_VERSION}.jar.sha256" do
|
33
|
+
system "wget https://repo1.maven.org/maven2/org/jruby/jruby-complete/#{JRUBYC_VERSION}/jruby-complete-#{JRUBYC_VERSION}.jar.sha256"
|
34
|
+
end
|
37
35
|
|
38
36
|
file "jruby-complete-#{JRUBYC_VERSION}.jar" do
|
39
37
|
begin
|
40
38
|
system "wget https://repo1.maven.org/maven2/org/jruby/jruby-complete/#{JRUBYC_VERSION}/jruby-complete-#{JRUBYC_VERSION}.jar"
|
41
|
-
rescue
|
39
|
+
rescue NameError
|
42
40
|
warn(WARNING)
|
43
41
|
end
|
44
42
|
value = File.read("jruby-complete-#{JRUBYC_VERSION}.jar.sha256")
|
45
43
|
check_sha256("jruby-complete-#{JRUBYC_VERSION}.jar", value)
|
46
44
|
end
|
47
45
|
|
46
|
+
desc 'get sha256'
|
47
|
+
task get_sha256: ['wget_check', "jruby-complete-#{JRUBYC_VERSION}.jar.sha256"]
|
48
|
+
|
49
|
+
desc 'download, and copy to jruby_art'
|
50
|
+
task default: %i[wget_check download copy_ruby install_samples]
|
51
|
+
|
52
|
+
desc 'download JRuby upstream sources'
|
53
|
+
task download: ['get_sha256', "jruby-complete-#{JRUBYC_VERSION}.jar"]
|
54
|
+
|
48
55
|
directory '../lib/ruby'
|
49
56
|
|
50
57
|
desc 'copy jruby-complete'
|
@@ -67,32 +74,78 @@ def check_sha256(filename, expected_hash)
|
|
67
74
|
raise "bad sha256 checksum for #{filename} (expected #{expected_hash} got #{sha256.hexdigest})"
|
68
75
|
end
|
69
76
|
|
77
|
+
desc 'initialize ~/.jruby_art directories'
|
78
|
+
task :init_dir do
|
79
|
+
unless File.exist? "#{HOME_DIR}/.jruby_art/libraries"
|
80
|
+
FileUtils.mkdir_p "#{HOME_DIR}/.jruby_art/libraries"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
desc 'download and copy sound library to ~/.jruby_art'
|
85
|
+
task download_and_copy_sound: %i[wget_check init_dir download_sound copy_sound clobber]
|
86
|
+
|
87
|
+
desc 'download and copy video library to ~/.jruby_art'
|
88
|
+
task download_and_copy_video: %i[wget_check init_dir download_video copy_video clobber]
|
89
|
+
|
90
|
+
desc 'download sound library'
|
91
|
+
task :download_sound do
|
92
|
+
wget_base = 'wget https://github.com/processing/processing-sound'
|
93
|
+
wget_string = [wget_base, 'releases/download/latest', SOUND].join('/')
|
94
|
+
puts wget_string
|
95
|
+
system wget_string
|
96
|
+
end
|
97
|
+
|
98
|
+
desc 'download video library'
|
99
|
+
task :download_video do
|
100
|
+
wget_base = 'wget https://github.com/processing/processing-video'
|
101
|
+
wget_string = [wget_base, 'releases/download', VIDEO_VERSION, VIDEO].join('/')
|
102
|
+
system wget_string
|
103
|
+
end
|
104
|
+
|
105
|
+
desc 'copy sound library'
|
106
|
+
task copy_sound: SOUND do
|
107
|
+
system "unzip #{SOUND}"
|
108
|
+
if File.exist? "#{HOME_DIR}/.jruby_art/libraries/sound"
|
109
|
+
FileUtils.rm_r "#{HOME_DIR}/.picrate/libraries/sound"
|
110
|
+
end
|
111
|
+
FileUtils.cp_r 'sound', "#{HOME_DIR}/.jruby_art/libraries"
|
112
|
+
FileUtils.rm_r 'sound'
|
113
|
+
end
|
114
|
+
|
115
|
+
desc 'copy video library'
|
116
|
+
task copy_video: VIDEO do
|
117
|
+
system "unzip #{VIDEO}"
|
118
|
+
if File.exist? "#{HOME_DIR}/.jruby_art/libraries/video"
|
119
|
+
FileUtils.rm_r "#{HOME_DIR}/.picrate/libraries/video"
|
120
|
+
end
|
121
|
+
FileUtils.cp_r 'video', "#{HOME_DIR}/.jruby_art/libraries/video"
|
122
|
+
FileUtils.rm_r 'video'
|
123
|
+
end
|
124
|
+
|
70
125
|
desc 'download, and copy to jruby_art'
|
71
|
-
task
|
126
|
+
task install_samples: %i[download_examples copy_examples]
|
72
127
|
|
73
128
|
desc 'download and copy examples to user home'
|
74
129
|
task :download_examples
|
75
130
|
file_name = MAC_OR_LINUX.nil? ? "#{EXAMPLES}.zip" : "#{EXAMPLES}.tar.gz"
|
76
131
|
file file_name do
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
system "wget https://github.com/ruby-processing/JRubyArt-examples/archive/#{EXAMPLES}.tar.gz"
|
82
|
-
end
|
83
|
-
rescue
|
84
|
-
warn(WARNING)
|
132
|
+
if MAC_OR_LINUX.nil?
|
133
|
+
system "wget https://github.com/ruby-processing/JRubyArt-examples/archive/#{EXAMPLES}.zip"
|
134
|
+
else
|
135
|
+
system "wget https://github.com/ruby-processing/JRubyArt-examples/archive/#{EXAMPLES}.tar.gz"
|
85
136
|
end
|
86
137
|
end
|
87
138
|
|
88
139
|
desc 'copy examples'
|
89
140
|
task copy_examples: file_name do
|
90
141
|
if MAC_OR_LINUX.nil?
|
91
|
-
|
142
|
+
system "unzip #{EXAMPLES}.zip"
|
92
143
|
else
|
93
|
-
|
144
|
+
system "tar xzvf #{EXAMPLES}.tar.gz"
|
145
|
+
end
|
146
|
+
if File.exist? "#{HOME_DIR}/k9_samples"
|
147
|
+
FileUtils.rm_r("#{HOME_DIR}/k9_samples")
|
94
148
|
end
|
95
|
-
FileUtils.rm_r("#{HOME_DIR}/k9_samples") if File.exist? "#{HOME_DIR}/k9_samples"
|
96
149
|
FileUtils.cp_r("JRubyArt-examples-#{EXAMPLES}", "#{HOME_DIR}/k9_samples")
|
97
150
|
FileUtils.rm_r("JRubyArt-examples-#{EXAMPLES}")
|
98
151
|
end
|