propane 3.3.1-java → 3.6.0-java
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/.mvn/extensions.xml +1 -2
- data/.mvn/wrapper/MavenWrapperDownloader.java +117 -0
- data/.mvn/wrapper/maven-wrapper.properties +2 -3
- data/.travis.yml +9 -0
- data/CHANGELOG.md +17 -5
- data/Gemfile +2 -0
- data/README.md +17 -8
- data/Rakefile +16 -30
- data/bin/propane +3 -1
- data/lib/propane.rb +6 -4
- data/lib/propane/app.rb +20 -10
- data/lib/propane/creators/sketch_class.rb +7 -1
- data/lib/propane/creators/sketch_factory.rb +4 -2
- data/lib/propane/creators/sketch_writer.rb +1 -0
- data/lib/propane/helper_methods.rb +23 -24
- data/lib/propane/helpers/numeric.rb +2 -0
- data/lib/propane/helpers/version_error.rb +1 -0
- data/lib/propane/library.rb +5 -1
- data/lib/propane/library_loader.rb +2 -0
- data/lib/propane/native_folder.rb +21 -15
- data/lib/propane/native_loader.rb +3 -0
- data/lib/propane/runner.rb +14 -6
- data/lib/propane/version.rb +2 -1
- data/library/boids/boids.rb +21 -11
- data/library/color_group/color_group.rb +28 -0
- data/library/control_panel/control_panel.rb +8 -5
- data/library/dxf/dxf.rb +6 -0
- data/library/file_chooser/chooser.rb +10 -9
- data/library/file_chooser/file_chooser.rb +10 -9
- data/library/library_proxy/library_proxy.rb +2 -0
- data/library/net/net.rb +7 -0
- data/library/simplex_noise/simplex_noise.rb +2 -0
- data/library/slider/slider.rb +23 -22
- data/library/vector_utils/vector_utils.rb +4 -0
- data/library/video_event/video_event.rb +4 -1
- data/mvnw +127 -51
- data/mvnw.cmd +182 -145
- data/pom.rb +53 -50
- data/pom.xml +17 -8
- data/propane.gemspec +13 -11
- data/src/main/java/monkstone/ColorUtil.java +13 -1
- data/src/main/java/monkstone/MathToolModule.java +253 -203
- data/src/main/java/monkstone/PropaneLibrary.java +2 -2
- data/src/main/java/monkstone/fastmath/Deglut.java +1 -1
- data/src/main/java/monkstone/filechooser/Chooser.java +2 -1
- data/src/main/java/monkstone/noise/SimplexNoise.java +2 -2
- data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
- data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
- data/src/main/java/monkstone/slider/SliderBar.java +1 -1
- data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
- data/src/main/java/monkstone/slider/WheelHandler.java +7 -6
- data/src/main/java/monkstone/vecmath/package-info.java +1 -1
- data/src/main/java/monkstone/vecmath/vec2/Vec2.java +2 -2
- data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
- data/src/main/java/monkstone/videoevent/CaptureEvent.java +27 -0
- data/src/main/java/monkstone/videoevent/{VideoInterface.java → MovieEvent.java} +11 -27
- data/src/main/java/monkstone/videoevent/package-info.java +1 -1
- data/src/main/java/processing/awt/PGraphicsJava2D.java +2164 -1661
- data/src/main/java/processing/awt/PImageAWT.java +377 -0
- data/src/main/java/processing/awt/PShapeJava2D.java +280 -268
- data/src/main/java/processing/awt/PSurfaceAWT.java +942 -829
- data/src/main/java/processing/awt/ShimAWT.java +581 -0
- data/src/main/java/processing/core/PApplet.java +831 -824
- data/src/main/java/processing/core/PConstants.java +477 -447
- data/src/main/java/processing/core/PFont.java +914 -880
- data/src/main/java/processing/core/PGraphics.java +229 -213
- data/src/main/java/processing/core/PImage.java +620 -318
- data/src/main/java/processing/core/PMatrix.java +172 -159
- data/src/main/java/processing/core/PMatrix2D.java +478 -409
- data/src/main/java/processing/core/PMatrix3D.java +762 -735
- data/src/main/java/processing/core/PShape.java +2888 -2652
- data/src/main/java/processing/core/PShapeOBJ.java +436 -415
- data/src/main/java/processing/core/PShapeSVG.java +1702 -1479
- data/src/main/java/processing/core/PStyle.java +40 -37
- data/src/main/java/processing/core/PSurface.java +139 -97
- data/src/main/java/processing/core/PSurfaceNone.java +296 -208
- data/src/main/java/processing/core/PVector.java +997 -965
- data/src/main/java/processing/core/ThinkDifferent.java +12 -17
- data/src/main/java/processing/data/DoubleDict.java +756 -710
- data/src/main/java/processing/data/DoubleList.java +749 -696
- data/src/main/java/processing/data/FloatDict.java +748 -702
- data/src/main/java/processing/data/FloatList.java +751 -697
- data/src/main/java/processing/data/IntDict.java +720 -673
- data/src/main/java/processing/data/IntList.java +699 -633
- data/src/main/java/processing/data/JSONArray.java +931 -873
- data/src/main/java/processing/data/JSONObject.java +1262 -1165
- data/src/main/java/processing/data/JSONTokener.java +351 -341
- data/src/main/java/processing/data/LongDict.java +710 -663
- data/src/main/java/processing/data/LongList.java +701 -635
- data/src/main/java/processing/data/Sort.java +37 -41
- data/src/main/java/processing/data/StringDict.java +525 -486
- data/src/main/java/processing/data/StringList.java +626 -580
- data/src/main/java/processing/data/Table.java +3690 -3510
- data/src/main/java/processing/data/TableRow.java +182 -183
- data/src/main/java/processing/data/XML.java +957 -883
- data/src/main/java/processing/dxf/RawDXF.java +404 -0
- data/src/main/java/processing/event/Event.java +87 -66
- data/src/main/java/processing/event/KeyEvent.java +48 -41
- data/src/main/java/processing/event/MouseEvent.java +88 -113
- data/src/main/java/processing/event/TouchEvent.java +10 -6
- data/src/main/java/processing/javafx/PGraphicsFX2D.java +20 -345
- data/src/main/java/processing/javafx/PSurfaceFX.java +149 -121
- data/src/main/java/processing/net/Client.java +744 -0
- data/src/main/java/processing/net/Server.java +388 -0
- data/src/main/java/processing/opengl/FontTexture.java +289 -270
- data/src/main/java/processing/opengl/FrameBuffer.java +386 -364
- data/src/main/java/processing/opengl/LinePath.java +547 -500
- data/src/main/java/processing/opengl/LineStroker.java +588 -581
- data/src/main/java/processing/opengl/PGL.java +3047 -2914
- data/src/main/java/processing/opengl/PGraphics2D.java +408 -315
- data/src/main/java/processing/opengl/PGraphics3D.java +107 -72
- data/src/main/java/processing/opengl/PGraphicsOpenGL.java +12378 -12075
- data/src/main/java/processing/opengl/PJOGL.java +1753 -1670
- data/src/main/java/processing/opengl/PShader.java +1266 -1257
- data/src/main/java/processing/opengl/PShapeOpenGL.java +4678 -4580
- data/src/main/java/processing/opengl/PSurfaceJOGL.java +1114 -1027
- data/src/main/java/processing/opengl/Texture.java +1492 -1401
- data/src/main/java/processing/opengl/VertexBuffer.java +57 -55
- data/test/create_test.rb +21 -20
- data/test/deglut_spec_test.rb +4 -2
- data/test/helper_methods_test.rb +49 -20
- data/test/math_tool_test.rb +39 -32
- data/test/native_folder.rb +47 -0
- data/test/respond_to_test.rb +3 -2
- data/test/sketches/key_event.rb +2 -2
- data/test/sketches/library/my_library/my_library.rb +3 -0
- data/test/test_helper.rb +2 -0
- data/test/vecmath_spec_test.rb +35 -22
- data/vendors/Rakefile +33 -62
- metadata +54 -45
- data/src/main/java/processing/core/util/image/ImageLoadFacade.java +0 -161
- data/src/main/java/processing/core/util/image/ImageSaveFacade.java +0 -169
- data/src/main/java/processing/core/util/image/constants/TifConstants.java +0 -45
- data/src/main/java/processing/core/util/image/load/AwtImageLoadStrategy.java +0 -80
- data/src/main/java/processing/core/util/image/load/Base64StringImageLoadStrategy.java +0 -73
- data/src/main/java/processing/core/util/image/load/FallbackImageLoadStrategy.java +0 -70
- data/src/main/java/processing/core/util/image/load/ImageIoImageLoadStrategy.java +0 -132
- data/src/main/java/processing/core/util/image/load/ImageLoadStrategy.java +0 -48
- data/src/main/java/processing/core/util/image/load/ImageLoadUtil.java +0 -45
- data/src/main/java/processing/core/util/image/load/TgaImageLoadStrategy.java +0 -255
- data/src/main/java/processing/core/util/image/load/TiffImageLoadStrategy.java +0 -98
- data/src/main/java/processing/core/util/image/save/ImageSaveStrategy.java +0 -49
- data/src/main/java/processing/core/util/image/save/ImageSaveUtil.java +0 -48
- data/src/main/java/processing/core/util/image/save/ImageWriterImageSaveStrategy.java +0 -179
- data/src/main/java/processing/core/util/image/save/SaveImageException.java +0 -41
- data/src/main/java/processing/core/util/image/save/TgaImageSaveStrategy.java +0 -198
- data/src/main/java/processing/core/util/image/save/TiffImageSaveStrategy.java +0 -91
- data/src/main/java/processing/core/util/image/save/TiffNakedFilenameImageSaveStrategy.java +0 -57
- data/src/main/java/processing/core/util/io/InputFactory.java +0 -285
- data/src/main/java/processing/core/util/io/PathUtil.java +0 -109
- data/src/main/java/processing/opengl/shaders/LightVert-brcm.glsl +0 -154
- data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +0 -154
- data/src/main/java/processing/opengl/shaders/TexLightVert-brcm.glsl +0 -160
- data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +0 -160
|
@@ -5,7 +5,10 @@ class SketchClass
|
|
|
5
5
|
attr_reader :name, :width, :height, :mode
|
|
6
6
|
|
|
7
7
|
def initialize(name:, width: 150, height: 150, mode: nil)
|
|
8
|
-
@name
|
|
8
|
+
@name = name
|
|
9
|
+
@width = width
|
|
10
|
+
@height = height
|
|
11
|
+
@mode = mode
|
|
9
12
|
end
|
|
10
13
|
|
|
11
14
|
def class_sketch
|
|
@@ -26,6 +29,7 @@ class SketchClass
|
|
|
26
29
|
|
|
27
30
|
def size
|
|
28
31
|
return format(' size %d, %d', width.to_i, height.to_i) unless mode
|
|
32
|
+
|
|
29
33
|
format(' size %d, %d, %s', width.to_i, height.to_i, mode.upcase)
|
|
30
34
|
end
|
|
31
35
|
|
|
@@ -36,6 +40,7 @@ class SketchClass
|
|
|
36
40
|
|
|
37
41
|
def method_lines(name, content = nil)
|
|
38
42
|
return [format(' def %s', name), '', ' end'] unless content
|
|
43
|
+
|
|
39
44
|
[format(' def %s', name), content, ' end', '']
|
|
40
45
|
end
|
|
41
46
|
|
|
@@ -43,6 +48,7 @@ class SketchClass
|
|
|
43
48
|
lines = [
|
|
44
49
|
'#!/usr/bin/env jruby',
|
|
45
50
|
'# frozen_string_literal: false',
|
|
51
|
+
'',
|
|
46
52
|
"require 'propane'",
|
|
47
53
|
'',
|
|
48
54
|
class_sketch
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'sketch_writer'
|
|
2
4
|
|
|
3
5
|
class SketchFactory
|
|
4
|
-
NAMES = %w[One Two Three]
|
|
5
|
-
def initialize(
|
|
6
|
+
NAMES = %w[One Two Three].freeze
|
|
7
|
+
def initialize(_argc)
|
|
6
8
|
NAMES.each do |name|
|
|
7
9
|
SketchWriter.new(File.basename(name, '.rb'), width: 300, height: 300).write
|
|
8
10
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: false
|
|
2
|
+
|
|
2
3
|
# processing module wrapper
|
|
3
|
-
require_relative 'helpers/numeric'
|
|
4
4
|
module Propane
|
|
5
5
|
# Provides some convenience methods
|
|
6
6
|
module HelperMethods
|
|
@@ -52,11 +52,12 @@ module Propane
|
|
|
52
52
|
|
|
53
53
|
def color(*args)
|
|
54
54
|
return super(*args) unless args.length == 1
|
|
55
|
+
|
|
55
56
|
super(hex_color(args[0]))
|
|
56
57
|
end
|
|
57
58
|
|
|
58
59
|
def web_to_color_array(web)
|
|
59
|
-
Java::Monkstone::ColorUtil.webArray(web)
|
|
60
|
+
Java::Monkstone::ColorUtil.webArray(web.to_java(:string))
|
|
60
61
|
end
|
|
61
62
|
|
|
62
63
|
def int_to_ruby_colors(hex)
|
|
@@ -66,11 +67,8 @@ module Propane
|
|
|
66
67
|
# Overrides Processing convenience function thread, which takes a String
|
|
67
68
|
# arg (for a function) to more rubylike version, takes a block...
|
|
68
69
|
def thread(&block)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
else
|
|
72
|
-
raise ArgumentError, 'thread must be called with a block', caller
|
|
73
|
-
end
|
|
70
|
+
warn 'A Block is Needed' unless block_given?
|
|
71
|
+
Java::JavaLang::Thread.new(&block).start
|
|
74
72
|
end
|
|
75
73
|
|
|
76
74
|
# explicitly provide 'processing.org' min instance method
|
|
@@ -94,9 +92,9 @@ module Propane
|
|
|
94
92
|
def dist(*args)
|
|
95
93
|
case args.length
|
|
96
94
|
when 4
|
|
97
|
-
|
|
95
|
+
dist2d(*args)
|
|
98
96
|
when 6
|
|
99
|
-
|
|
97
|
+
dist3d(*args)
|
|
100
98
|
else
|
|
101
99
|
raise ArgumentError, 'takes 4 or 6 parameters'
|
|
102
100
|
end
|
|
@@ -111,13 +109,13 @@ module Propane
|
|
|
111
109
|
# Here's a convenient way to look for them.
|
|
112
110
|
def find_method(method_name)
|
|
113
111
|
reg = Regexp.new(method_name.to_s, true)
|
|
114
|
-
methods.sort.select { |meth| reg.match(meth) }
|
|
112
|
+
methods.sort.select { |meth| reg.match?(meth) }
|
|
115
113
|
end
|
|
116
114
|
|
|
117
115
|
# Proxy over a list of Java declared fields that have the same name as
|
|
118
116
|
# some methods. Add to this list as needed.
|
|
119
117
|
def proxy_java_fields
|
|
120
|
-
fields = %w
|
|
118
|
+
fields = %w[key frameRate mousePressed keyPressed]
|
|
121
119
|
methods = fields.map { |field| java_class.declared_field(field) }
|
|
122
120
|
@declared_fields = Hash[fields.zip(methods)]
|
|
123
121
|
end
|
|
@@ -163,6 +161,7 @@ module Propane
|
|
|
163
161
|
# frame_rate needs to support reading and writing
|
|
164
162
|
def frame_rate(fps = nil)
|
|
165
163
|
return @declared_fields['frameRate'].value(java_self) unless fps
|
|
164
|
+
|
|
166
165
|
super(fps)
|
|
167
166
|
end
|
|
168
167
|
|
|
@@ -178,21 +177,19 @@ module Propane
|
|
|
178
177
|
|
|
179
178
|
private
|
|
180
179
|
|
|
181
|
-
INTEGER_COL = -> (x) { x.is_a?(Integer) }
|
|
182
|
-
STRING_COL = -> (x) { x.is_a?(String) }
|
|
183
|
-
FLOAT_COL = -> (x) { x.is_a?(Float) }
|
|
184
180
|
# parse single argument color int/double/String
|
|
185
|
-
def hex_color(
|
|
186
|
-
case
|
|
187
|
-
when
|
|
188
|
-
Java::Monkstone::ColorUtil.colorLong(
|
|
189
|
-
when
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
181
|
+
def hex_color(arg)
|
|
182
|
+
case arg
|
|
183
|
+
when Integer
|
|
184
|
+
Java::Monkstone::ColorUtil.colorLong(arg)
|
|
185
|
+
when String
|
|
186
|
+
raise 'Dodgy Hexstring' unless /#\h{6}$/.match?(arg)
|
|
187
|
+
|
|
188
|
+
Java::Monkstone::ColorUtil.colorString(arg)
|
|
189
|
+
when Float
|
|
190
|
+
Java::Monkstone::ColorUtil.colorDouble(arg)
|
|
194
191
|
else
|
|
195
|
-
raise
|
|
192
|
+
raise 'Dodgy Color Conversion'
|
|
196
193
|
end
|
|
197
194
|
end
|
|
198
195
|
|
|
@@ -200,6 +197,7 @@ module Propane
|
|
|
200
197
|
dx = args[0] - args[2]
|
|
201
198
|
dy = args[1] - args[3]
|
|
202
199
|
return 0 if dx.abs < EPSILON && dy.abs < EPSILON
|
|
200
|
+
|
|
203
201
|
Math.hypot(dx, dy)
|
|
204
202
|
end
|
|
205
203
|
|
|
@@ -208,6 +206,7 @@ module Propane
|
|
|
208
206
|
dy = args[1] - args[4]
|
|
209
207
|
dz = args[2] - args[5]
|
|
210
208
|
return 0 if dx.abs < EPSILON && dy.abs < EPSILON && dz.abs < EPSILON
|
|
209
|
+
|
|
211
210
|
Math.sqrt(dx * dx + dy * dy + dz * dz)
|
|
212
211
|
end
|
|
213
212
|
end
|
data/lib/propane/library.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require_relative 'native_folder'
|
|
2
4
|
require_relative 'native_loader'
|
|
3
5
|
require 'pathname'
|
|
@@ -18,6 +20,7 @@ class Library
|
|
|
18
20
|
return if (@path = Pathname.new(
|
|
19
21
|
File.join(PROPANE_ROOT, 'library', name, "#{name}.rb")
|
|
20
22
|
)).exist?
|
|
23
|
+
|
|
21
24
|
locate_java
|
|
22
25
|
end
|
|
23
26
|
|
|
@@ -46,10 +49,11 @@ class Library
|
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def load_jars
|
|
49
|
-
Dir.glob("#{dir}/*.jar").each do |jar|
|
|
52
|
+
Dir.glob("#{dir}/*.jar").sort.each do |jar|
|
|
50
53
|
require jar
|
|
51
54
|
end
|
|
52
55
|
return true unless native_binaries?
|
|
56
|
+
|
|
53
57
|
add_binaries_to_classpath
|
|
54
58
|
end
|
|
55
59
|
|
|
@@ -33,10 +33,12 @@ module Propane
|
|
|
33
33
|
|
|
34
34
|
def loader(name)
|
|
35
35
|
return true if @loaded_libraries.include?(name)
|
|
36
|
+
|
|
36
37
|
fname = name.to_s
|
|
37
38
|
library = Library.new(fname)
|
|
38
39
|
library.locate
|
|
39
40
|
return require_library(library, name) if library.ruby?
|
|
41
|
+
|
|
40
42
|
warn("Not found library: #{fname}") unless library.exist?
|
|
41
43
|
load_jars(library, name)
|
|
42
44
|
end
|
|
@@ -1,33 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rbconfig'
|
|
2
4
|
|
|
3
5
|
# Utility to load native binaries on Java CLASSPATH
|
|
4
6
|
class NativeFolder
|
|
5
7
|
attr_reader :os, :bit
|
|
6
8
|
|
|
7
|
-
WIN_FORMAT = 'windows%d'
|
|
8
|
-
LINUX_FORMAT = 'linux%d'
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
9
|
+
WIN_FORMAT = 'windows%d'
|
|
10
|
+
LINUX_FORMAT = 'linux%d'
|
|
11
|
+
WIN_PATTERNS = [
|
|
12
|
+
/bccwin/i,
|
|
13
|
+
/cygwin/i,
|
|
14
|
+
/djgpp/i,
|
|
15
|
+
/ming/i,
|
|
16
|
+
/mswin/i,
|
|
17
|
+
/wince/i
|
|
18
|
+
].freeze
|
|
17
19
|
|
|
18
20
|
def initialize
|
|
19
21
|
@os = RbConfig::CONFIG['host_os'].downcase
|
|
20
|
-
@bit = java.lang.System.get_property('os.arch')
|
|
22
|
+
@bit = /64/.match?(java.lang.System.get_property('os.arch')) ? 64 : 32
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def name
|
|
24
|
-
return 'macosx' if
|
|
25
|
-
|
|
26
|
-
return format(
|
|
26
|
+
return 'macosx' if /darwin|mac/.match?(os)
|
|
27
|
+
return format(LINUX_FORMAT, bit) if /linux/.match?(os)
|
|
28
|
+
return format(WIN_FORMAT, bit) if WIN_PATTERNS.any? { |pat| pat.match?(os) }
|
|
29
|
+
|
|
30
|
+
raise 'Unsupported Architecture'
|
|
27
31
|
end
|
|
28
32
|
|
|
29
33
|
def extension
|
|
30
|
-
return '*.so' if
|
|
34
|
+
return '*.so' if /linux/.match?(os)
|
|
35
|
+
return '*.dll' if WIN_PATTERNS.any? { |pat| pat.match?(os) }
|
|
36
|
+
|
|
31
37
|
'*.dylib' # MacOS
|
|
32
38
|
end
|
|
33
39
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# This class knows how to dynamically set the 'java' native library path
|
|
2
4
|
# It might not work with java 9?
|
|
3
5
|
class NativeLoader
|
|
@@ -21,6 +23,7 @@ class NativeLoader
|
|
|
21
23
|
field = JC::Class.for_name('java.lang.ClassLoader')
|
|
22
24
|
.get_declared_field('sys_paths')
|
|
23
25
|
return unless field
|
|
26
|
+
|
|
24
27
|
field.accessible = true # some jruby magic
|
|
25
28
|
field.set(JC::Class.for_name('java.lang.System').get_class_loader, nil)
|
|
26
29
|
end
|
data/lib/propane/runner.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: false
|
|
2
|
+
|
|
2
3
|
require 'optparse'
|
|
3
4
|
require_relative 'version'
|
|
4
5
|
|
|
@@ -40,7 +41,7 @@ module Propane
|
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
options[:install] = false
|
|
43
|
-
message = '<Samples><
|
|
44
|
+
message = '<Samples><Video><Sound> Install samples or library'
|
|
44
45
|
opts.on('-i', '--install', message) do
|
|
45
46
|
options[:install] = true
|
|
46
47
|
end
|
|
@@ -54,6 +55,8 @@ module Propane
|
|
|
54
55
|
# assumed to have this option.
|
|
55
56
|
opts.on('-h', '--help', 'Display this screen') do
|
|
56
57
|
puts opts
|
|
58
|
+
puts ''
|
|
59
|
+
puts 'Run a sketch: jruby [--dev] [<sketch.rb>]'
|
|
57
60
|
exit
|
|
58
61
|
end
|
|
59
62
|
end
|
|
@@ -67,7 +70,6 @@ module Propane
|
|
|
67
70
|
end
|
|
68
71
|
|
|
69
72
|
def show_version
|
|
70
|
-
|
|
71
73
|
v_format = "Propane version %s\nJRuby version %s"
|
|
72
74
|
puts format(v_format, Propane::VERSION, JRUBY_VERSION)
|
|
73
75
|
end
|
|
@@ -75,7 +77,8 @@ module Propane
|
|
|
75
77
|
def show_version
|
|
76
78
|
require 'erb'
|
|
77
79
|
require_relative 'helpers/version_error'
|
|
78
|
-
raise JDKVersionError
|
|
80
|
+
raise JDKVersionError if ENV_JAVA['java.specification.version'] < '11'
|
|
81
|
+
|
|
79
82
|
template = ERB.new <<-EOF
|
|
80
83
|
propane version <%= Propane::VERSION %>
|
|
81
84
|
JRuby version <%= JRUBY_VERSION %>
|
|
@@ -86,8 +89,13 @@ module Propane
|
|
|
86
89
|
def install(library)
|
|
87
90
|
choice = library.downcase
|
|
88
91
|
valid = Regexp.union('samples', 'sound', 'video', 'glvideo')
|
|
89
|
-
|
|
92
|
+
unless valid.match?(choice)
|
|
93
|
+
return warn format('No installer for %<lib>s', lib: choice)
|
|
94
|
+
end
|
|
95
|
+
|
|
90
96
|
system "cd #{PROPANE_ROOT}/vendors && rake download_and_copy_#{choice}"
|
|
91
97
|
end
|
|
92
|
-
end
|
|
93
|
-
|
|
98
|
+
end
|
|
99
|
+
# class Runner
|
|
100
|
+
end
|
|
101
|
+
# module Propane
|
data/lib/propane/version.rb
CHANGED
data/library/boids/boids.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# Boids -- after Tom de Smedt.
|
|
2
4
|
# See his Python version: http://nodebox.net/code/index.php/Boids
|
|
3
5
|
# This is an example of how a pure-Ruby library can work. Original for
|
|
@@ -7,7 +9,8 @@ class Boid
|
|
|
7
9
|
attr_accessor :boids, :pos, :vel, :is_perching, :perch_time
|
|
8
10
|
|
|
9
11
|
def initialize(boids, pos)
|
|
10
|
-
@boids
|
|
12
|
+
@boids = boids
|
|
13
|
+
@flock = boids
|
|
11
14
|
@pos = pos
|
|
12
15
|
@vel = Vec3D.new
|
|
13
16
|
@is_perching = false
|
|
@@ -53,6 +56,7 @@ class Boid
|
|
|
53
56
|
# Tweet, Tweet! The boid police will bust you for breaking the speed limit.
|
|
54
57
|
most = [vel.x.abs, vel.y.abs, vel.z.abs].max
|
|
55
58
|
return if most < max
|
|
59
|
+
|
|
56
60
|
scale = max / most.to_f
|
|
57
61
|
@vel *= scale
|
|
58
62
|
end
|
|
@@ -75,7 +79,7 @@ class Boids
|
|
|
75
79
|
extend Forwardable
|
|
76
80
|
def_delegators(:@boids, :reject, :<<, :each, :shuffle!, :length, :next)
|
|
77
81
|
|
|
78
|
-
attr_reader :has_goal, :
|
|
82
|
+
attr_reader :has_goal, :perchance, :perch_tm, :perch_y
|
|
79
83
|
|
|
80
84
|
def initialize
|
|
81
85
|
@boids = []
|
|
@@ -88,16 +92,20 @@ class Boids
|
|
|
88
92
|
|
|
89
93
|
def setup(n, x, y, w, h)
|
|
90
94
|
n.times do
|
|
91
|
-
dx
|
|
95
|
+
dx = rand(w)
|
|
96
|
+
dy = rand(h)
|
|
92
97
|
z = rand(200.0)
|
|
93
98
|
self << Boid.new(self, Vec3D.new(x + dx, y + dy, z))
|
|
94
99
|
end
|
|
95
|
-
@x
|
|
100
|
+
@x = x
|
|
101
|
+
@y = y
|
|
102
|
+
@w = w
|
|
103
|
+
@h = h
|
|
96
104
|
@scattered = false
|
|
97
105
|
@scatter = 0.005
|
|
98
106
|
@scatter_time = 50.0
|
|
99
107
|
@scatter_i = 0.0
|
|
100
|
-
@
|
|
108
|
+
@perchance = 1.0 # Lower this number to divebomb.
|
|
101
109
|
@perch_y = h
|
|
102
110
|
@perch_tm = -> { 25.0 + rand(50.0) }
|
|
103
111
|
@has_goal = false
|
|
@@ -118,11 +126,11 @@ class Boids
|
|
|
118
126
|
def perch(ground = nil, chance = 1.0, frames = nil)
|
|
119
127
|
@perch_tm = frames.nil? ? -> { 25.0 + rand(50.0) } : frames
|
|
120
128
|
@perch_y = ground.nil? ? @h : ground
|
|
121
|
-
@
|
|
129
|
+
@perchance = chance
|
|
122
130
|
end
|
|
123
131
|
|
|
124
132
|
def no_perch
|
|
125
|
-
@
|
|
133
|
+
@perchance = 0.0
|
|
126
134
|
end
|
|
127
135
|
|
|
128
136
|
def goal(target:, flee: false)
|
|
@@ -138,7 +146,8 @@ class Boids
|
|
|
138
146
|
|
|
139
147
|
def constrain
|
|
140
148
|
# Put them boids in a cage.
|
|
141
|
-
dx
|
|
149
|
+
dx = @w * 0.1
|
|
150
|
+
dy = @h * 0.1
|
|
142
151
|
each do |b|
|
|
143
152
|
b.vel.x += rand(dx) if b.pos.x < @x - dx
|
|
144
153
|
b.vel.x += rand(dy) if b.pos.y < @y - dy
|
|
@@ -146,9 +155,10 @@ class Boids
|
|
|
146
155
|
b.vel.y -= rand(dy) if b.pos.y > @y + @h + dy
|
|
147
156
|
b.vel.z += 10.0 if b.pos.z < 0.0
|
|
148
157
|
b.vel.z -= 10.0 if b.pos.z > 100.0
|
|
149
|
-
next unless b.pos.y > perch_y && rand <
|
|
158
|
+
next unless b.pos.y > perch_y && rand < perchance
|
|
159
|
+
|
|
150
160
|
b.pos.y = perch_y
|
|
151
|
-
b.vel.y = -
|
|
161
|
+
b.vel.y = -b.vel.y.abs * 0.2
|
|
152
162
|
b.is_perching = true
|
|
153
163
|
b.perch_time = perch_tm.respond_to?(:call) ? perch_tm.call : perch_tm
|
|
154
164
|
end
|
|
@@ -166,7 +176,7 @@ class Boids
|
|
|
166
176
|
m2 = 1.0 # separation
|
|
167
177
|
m3 = 1.0 # alignment
|
|
168
178
|
m4 = 1.0 # goal
|
|
169
|
-
@scattered = true if
|
|
179
|
+
@scattered = true if !@scattered && rand < @scatter
|
|
170
180
|
if @scattered
|
|
171
181
|
m1 = -m1
|
|
172
182
|
m3 *= 0.25
|