propane 0.3.0.pre-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.mvn/extensions.xml +8 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  5. data/.travis.yml +9 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +69 -0
  9. data/Rakefile +59 -0
  10. data/VERSION.txt +4 -0
  11. data/bin/propane +8 -0
  12. data/examples/complete/Rakefile +32 -0
  13. data/examples/complete/data/Texture01.jpg +0 -0
  14. data/examples/complete/data/Texture02.jpg +0 -0
  15. data/examples/complete/data/Univers45.vlw +0 -0
  16. data/examples/complete/data/displaceFrag.glsl +8 -0
  17. data/examples/complete/data/displaceVert.glsl +201 -0
  18. data/examples/complete/glsl_heightmap_noise.rb +121 -0
  19. data/examples/complete/kinetic_type.rb +79 -0
  20. data/examples/regular/Rakefile +30 -0
  21. data/examples/regular/arcball_box.rb +36 -0
  22. data/examples/regular/creating_colors.rb +57 -0
  23. data/examples/regular/elegant_ball.rb +159 -0
  24. data/examples/regular/flight_patterns.rb +63 -0
  25. data/examples/regular/grey_circles.rb +28 -0
  26. data/examples/regular/jwishy.rb +100 -0
  27. data/examples/regular/letters.rb +42 -0
  28. data/examples/regular/lib/boundary.rb +38 -0
  29. data/examples/regular/lib/particle.rb +77 -0
  30. data/examples/regular/lib/particle_system.rb +111 -0
  31. data/examples/regular/liquidy.rb +40 -0
  32. data/examples/regular/mouse_button_demo.rb +34 -0
  33. data/examples/regular/polyhedrons.rb +248 -0
  34. data/examples/regular/ribbon_doodle.rb +89 -0
  35. data/examples/regular/vector_math.rb +36 -0
  36. data/examples/regular/words.rb +41 -0
  37. data/lib/PROCESSING_LICENSE.txt +456 -0
  38. data/lib/export.txt +10 -0
  39. data/lib/propane.rb +12 -0
  40. data/lib/propane/app.rb +197 -0
  41. data/lib/propane/helper_methods.rb +177 -0
  42. data/lib/propane/helpers/numeric.rb +9 -0
  43. data/lib/propane/library_loader.rb +117 -0
  44. data/lib/propane/runner.rb +88 -0
  45. data/lib/propane/underscorer.rb +19 -0
  46. data/lib/propane/version.rb +5 -0
  47. data/library/boids/boids.rb +201 -0
  48. data/library/control_panel/control_panel.rb +172 -0
  49. data/pom.rb +113 -0
  50. data/pom.xml +198 -0
  51. data/propane.gemspec +28 -0
  52. data/src/monkstone/ColorUtil.java +67 -0
  53. data/src/monkstone/MathTool.java +195 -0
  54. data/src/monkstone/PropaneLibrary.java +47 -0
  55. data/src/monkstone/core/AbstractLibrary.java +102 -0
  56. data/src/monkstone/fastmath/Deglut.java +115 -0
  57. data/src/monkstone/vecmath/AppRender.java +87 -0
  58. data/src/monkstone/vecmath/JRender.java +56 -0
  59. data/src/monkstone/vecmath/ShapeRender.java +87 -0
  60. data/src/monkstone/vecmath/vec2/Vec2.java +670 -0
  61. data/src/monkstone/vecmath/vec3/Vec3.java +708 -0
  62. data/test/respond_to_test.rb +208 -0
  63. data/vendors/Rakefile +48 -0
  64. metadata +130 -0
data/pom.rb ADDED
@@ -0,0 +1,113 @@
1
+ require 'fileutils'
2
+ project 'rp5extras', 'https://github.com/monkstone/propane' do
3
+ model_version '4.0.0'
4
+ id 'propane:rp5extras', '0.3.0'
5
+ packaging 'jar'
6
+ description 'rp5extras for propane'
7
+ organization 'ruby-processing', 'https://ruby-processing.github.io'
8
+ { 'monkstone' => 'Martin Prout', 'filib' => 'Phillip Cunningham' }.each do |key, value|
9
+ developer key do
10
+ name value
11
+ roles 'developer'
12
+ end
13
+ end
14
+ license 'MIT', 'http://www.opensource.org/licenses/mit-license.php'
15
+ license 'GPL 3', 'http://www.gnu.org/licenses/gpl-3.0-standalone.html'
16
+ issue_management 'https://github.com/monkstone/propane/issues', 'Github'
17
+
18
+ source_control(
19
+ url: 'https://github.com/monkstone/propane',
20
+ connection: 'scm:git:git://github.com/monkstone/propane.git',
21
+ developer_connection: 'scm:git:git@github.com/monkstone/propane.git'
22
+ )
23
+
24
+ properties('source.directory' => 'src',
25
+ 'propane.basedir' => '${project.basedir}',
26
+ 'polyglot.dump.pom' => 'pom.xml',
27
+ 'maven.compiler.source' => '1.7',
28
+ 'project.build.sourceEncoding' => 'utf-8',
29
+ 'maven.compiler.target' => '1.7',
30
+ 'jruby.api' => 'http://jruby.org/apidocs/',
31
+ 'processing.api' => 'http://processing.github.io/processing-javadocs/core/',
32
+ 'jruby.api' => 'http://jruby.org/apidocs/',
33
+ 'jogl.version' => '2.1.5-01'
34
+ )
35
+
36
+ pom('org.jruby:jruby:9.0.5.0')
37
+ jar('org.processing:core:2.2.1')
38
+ jar('org.jogamp.jogl:jogl-all:${jogl.version}')
39
+ jar('org.jogamp.gluegen:gluegen-rt-main:${jogl.version}')
40
+
41
+ overrides do
42
+ plugin :resources, '2.6'
43
+ plugin :dependency, '2.10' do
44
+ execute_goals( id: 'default-cli',
45
+ artifactItems: [ { groupId: 'org.processing',
46
+ artifactId: 'core',
47
+ version: '2.2.1',
48
+ type: 'jar',
49
+ outputDirectory: '${propane.basedir}/lib'
50
+ },
51
+ { groupId: 'org.jogamp.jogl',
52
+ artifactId: 'jogl-all',
53
+ version: '${jogl.version}',
54
+ type: 'jar',
55
+ outputDirectory: '${propane.basedir}/lib'
56
+ },
57
+ { groupId: 'org.jogamp.gluegen',
58
+ artifactId: 'gluegen-rt',
59
+ version: '${jogl.version}',
60
+ type: 'jar',
61
+ outputDirectory: '${propane.basedir}/lib'
62
+ },
63
+ { groupId: 'org.jogamp.jogl',
64
+ artifactId: 'jogl-all',
65
+ version: '${jogl.version}',
66
+ classifier: 'natives-linux-amd64',
67
+ type: 'jar',
68
+ outputDirectory: '${propane.basedir}/lib'
69
+ },
70
+ { groupId: 'org.jogamp.gluegen',
71
+ artifactId: 'gluegen-rt',
72
+ version: '${jogl.version}',
73
+ type: 'jar',
74
+ classifier: 'natives-linux-amd64',
75
+ outputDirectory: '${propane.basedir}/lib'
76
+ },
77
+ { groupId: 'org.jogamp.jogl',
78
+ artifactId: 'jogl-all',
79
+ version: '${jogl.version}',
80
+ classifier: 'natives-macosx-universal',
81
+ type: 'jar',
82
+ outputDirectory: '${propane.basedir}/lib'
83
+ },
84
+ { groupId: 'org.jogamp.gluegen',
85
+ artifactId: 'gluegen-rt',
86
+ version: '${jogl.version}',
87
+ type: 'jar',
88
+ classifier: 'natives-macosx-universal',
89
+ outputDirectory: '${propane.basedir}/lib'
90
+ }
91
+ ]
92
+ )
93
+ end
94
+
95
+ plugin( :compiler, '3.3',
96
+ source: '${maven.compiler.source}',
97
+ target: '${maven.compiler.target}'
98
+ )
99
+ plugin( :javadoc, '2.10.3',
100
+ detect_offline_links: 'false',
101
+ links: ['${jruby.api}', '${processing.api}']
102
+ )
103
+ plugin( :jar, '2.6',
104
+ archive: { manifestFile: 'MANIFEST.MF' }
105
+ )
106
+ end
107
+
108
+ build do
109
+ default_goal 'package'
110
+ source_directory 'src'
111
+ final_name 'rpextras'
112
+ end
113
+ end
data/pom.xml ADDED
@@ -0,0 +1,198 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!--
3
+
4
+
5
+ DO NOT MODIFIY - GENERATED CODE
6
+
7
+
8
+ -->
9
+ <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
10
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
11
+ <modelVersion>4.0.0</modelVersion>
12
+ <groupId>propane</groupId>
13
+ <artifactId>rp5extras</artifactId>
14
+ <version>0.3.0</version>
15
+ <name>rp5extras</name>
16
+ <description>rp5extras for propane</description>
17
+ <url>https://github.com/monkstone/propane</url>
18
+ <organization>
19
+ <name>ruby-processing</name>
20
+ <url>https://ruby-processing.github.io</url>
21
+ </organization>
22
+ <licenses>
23
+ <license>
24
+ <name>MIT</name>
25
+ <url>http://www.opensource.org/licenses/mit-license.php</url>
26
+ </license>
27
+ <license>
28
+ <name>GPL 3</name>
29
+ <url>http://www.gnu.org/licenses/gpl-3.0-standalone.html</url>
30
+ </license>
31
+ </licenses>
32
+ <developers>
33
+ <developer>
34
+ <id>monkstone</id>
35
+ <name>Martin Prout</name>
36
+ <roles>
37
+ <role>developer</role>
38
+ </roles>
39
+ </developer>
40
+ <developer>
41
+ <id>filib</id>
42
+ <name>Phillip Cunningham</name>
43
+ <roles>
44
+ <role>developer</role>
45
+ </roles>
46
+ </developer>
47
+ </developers>
48
+ <scm>
49
+ <connection>scm:git:git://github.com/monkstone/propane.git</connection>
50
+ <developerConnection>scm:git:git@github.com/monkstone/propane.git</developerConnection>
51
+ <url>https://github.com/monkstone/propane</url>
52
+ </scm>
53
+ <issueManagement>
54
+ <system>Github</system>
55
+ <url>https://github.com/monkstone/propane/issues</url>
56
+ </issueManagement>
57
+ <properties>
58
+ <jogl.version>2.1.5-01</jogl.version>
59
+ <jruby.api>http://jruby.org/apidocs/</jruby.api>
60
+ <source.directory>src</source.directory>
61
+ <maven.compiler.target>1.7</maven.compiler.target>
62
+ <processing.api>http://processing.github.io/processing-javadocs/core/</processing.api>
63
+ <propane.basedir>${project.basedir}</propane.basedir>
64
+ <project.build.sourceEncoding>utf-8</project.build.sourceEncoding>
65
+ <polyglot.dump.pom>pom.xml</polyglot.dump.pom>
66
+ <maven.compiler.source>1.7</maven.compiler.source>
67
+ </properties>
68
+ <dependencies>
69
+ <dependency>
70
+ <groupId>org.jruby</groupId>
71
+ <artifactId>jruby</artifactId>
72
+ <version>9.0.5.0</version>
73
+ <type>pom</type>
74
+ </dependency>
75
+ <dependency>
76
+ <groupId>org.processing</groupId>
77
+ <artifactId>core</artifactId>
78
+ <version>2.2.1</version>
79
+ </dependency>
80
+ <dependency>
81
+ <groupId>org.jogamp.jogl</groupId>
82
+ <artifactId>jogl-all</artifactId>
83
+ <version>${jogl.version}</version>
84
+ </dependency>
85
+ <dependency>
86
+ <groupId>org.jogamp.gluegen</groupId>
87
+ <artifactId>gluegen-rt-main</artifactId>
88
+ <version>${jogl.version}</version>
89
+ </dependency>
90
+ </dependencies>
91
+ <build>
92
+ <sourceDirectory>src</sourceDirectory>
93
+ <defaultGoal>package</defaultGoal>
94
+ <finalName>rpextras</finalName>
95
+ <pluginManagement>
96
+ <plugins>
97
+ <plugin>
98
+ <artifactId>maven-resources-plugin</artifactId>
99
+ <version>2.6</version>
100
+ </plugin>
101
+ <plugin>
102
+ <artifactId>maven-dependency-plugin</artifactId>
103
+ <version>2.10</version>
104
+ <executions>
105
+ <execution>
106
+ <id>default-cli</id>
107
+ <configuration>
108
+ <artifactItems>
109
+ <artifactItem>
110
+ <groupId>org.processing</groupId>
111
+ <artifactId>core</artifactId>
112
+ <version>2.2.1</version>
113
+ <type>jar</type>
114
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
115
+ </artifactItem>
116
+ <artifactItem>
117
+ <groupId>org.jogamp.jogl</groupId>
118
+ <artifactId>jogl-all</artifactId>
119
+ <version>${jogl.version}</version>
120
+ <type>jar</type>
121
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
122
+ </artifactItem>
123
+ <artifactItem>
124
+ <groupId>org.jogamp.gluegen</groupId>
125
+ <artifactId>gluegen-rt</artifactId>
126
+ <version>${jogl.version}</version>
127
+ <type>jar</type>
128
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
129
+ </artifactItem>
130
+ <artifactItem>
131
+ <groupId>org.jogamp.jogl</groupId>
132
+ <artifactId>jogl-all</artifactId>
133
+ <version>${jogl.version}</version>
134
+ <classifier>natives-linux-amd64</classifier>
135
+ <type>jar</type>
136
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
137
+ </artifactItem>
138
+ <artifactItem>
139
+ <groupId>org.jogamp.gluegen</groupId>
140
+ <artifactId>gluegen-rt</artifactId>
141
+ <version>${jogl.version}</version>
142
+ <type>jar</type>
143
+ <classifier>natives-linux-amd64</classifier>
144
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
145
+ </artifactItem>
146
+ <artifactItem>
147
+ <groupId>org.jogamp.jogl</groupId>
148
+ <artifactId>jogl-all</artifactId>
149
+ <version>${jogl.version}</version>
150
+ <classifier>natives-macosx-universal</classifier>
151
+ <type>jar</type>
152
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
153
+ </artifactItem>
154
+ <artifactItem>
155
+ <groupId>org.jogamp.gluegen</groupId>
156
+ <artifactId>gluegen-rt</artifactId>
157
+ <version>${jogl.version}</version>
158
+ <type>jar</type>
159
+ <classifier>natives-macosx-universal</classifier>
160
+ <outputDirectory>${propane.basedir}/lib</outputDirectory>
161
+ </artifactItem>
162
+ </artifactItems>
163
+ </configuration>
164
+ </execution>
165
+ </executions>
166
+ </plugin>
167
+ <plugin>
168
+ <artifactId>maven-compiler-plugin</artifactId>
169
+ <version>3.3</version>
170
+ <configuration>
171
+ <source>${maven.compiler.source}</source>
172
+ <target>${maven.compiler.target}</target>
173
+ </configuration>
174
+ </plugin>
175
+ <plugin>
176
+ <artifactId>maven-javadoc-plugin</artifactId>
177
+ <version>2.10.3</version>
178
+ <configuration>
179
+ <detect_offline_links>false</detect_offline_links>
180
+ <links>
181
+ <link>${jruby.api}</link>
182
+ <link>${processing.api}</link>
183
+ </links>
184
+ </configuration>
185
+ </plugin>
186
+ <plugin>
187
+ <artifactId>maven-jar-plugin</artifactId>
188
+ <version>2.6</version>
189
+ <configuration>
190
+ <archive>
191
+ <manifestFile>MANIFEST.MF</manifestFile>
192
+ </archive>
193
+ </configuration>
194
+ </plugin>
195
+ </plugins>
196
+ </pluginManagement>
197
+ </build>
198
+ </project>
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'propane/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = 'propane'
8
+ gem.version = Propane::VERSION
9
+ gem.authors = ['filib', 'monkstone']
10
+ gem.email = ['martin_p@lineone.net']
11
+ gem.license = 'MIT'
12
+ gem.description = %q{A Standalone Ruby Processing implementation}
13
+ gem.summary = %q{A really slim layer between Ruby and Processing-2.2.1.}
14
+ gem.homepage = 'https://github.com/monkstone/propane'
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.files << 'lib/rpextras.jar'
17
+ gem.files << 'lib/core-2.2.1.jar'
18
+ gem.files << 'lib/gluegen-rt-2.1.5-01.jar'
19
+ gem.files << 'lib/gluegen-rt-2.1.5-01-natives-linux-amd64.jar'
20
+ gem.files << 'lib/gluegen-rt-2.1.5-01-natives-macosx-universal.jar'
21
+ gem.files << 'lib/jogl-all-2.1.5-01-natives-linux-amd64.jar'
22
+ gem.files << 'lib/jogl-all-2.1.5-01-natives-macosx-universal.jar'
23
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
24
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
25
+ gem.add_runtime_dependency 'arcball', '~> 0.0.1'
26
+ gem.require_paths = ['lib']
27
+ gem.platform = 'java'
28
+ end
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The purpose of this utility is to allow ruby-processing users to use an alternative
3
+ * to processing.org color their sketches (to cope with ruby FixNumber vs java int)
4
+ * Copyright (C) 2015-16 Martin Prout. This tool is free software; you can
5
+ * redistribute it and/or modify it under the terms of the GNU Lesser General
6
+ * Public License as published by the Free Software Foundation; either version
7
+ * 2.1 of the License, or (at your option) any later version.
8
+ *
9
+ * Obtain a copy of the license at http://www.gnu.org/licenses/lgpl-2.1.html
10
+ */
11
+ package monkstone;
12
+
13
+ /**
14
+ *
15
+ * @author Martin Prout
16
+ */
17
+ public class ColorUtil {
18
+
19
+ /**
20
+ * Returns hex long as a positive int unless greater than Integer.MAX_VALUE
21
+ * else return the complement as a negative integer or something like that
22
+ */
23
+ static final int hexLong(long hexlong) {
24
+ long SPLIT = Integer.MAX_VALUE + 1;
25
+ if (hexlong < SPLIT) {
26
+ return (int) hexlong;
27
+ } else {
28
+ return (int) (hexlong - SPLIT * 2L);
29
+ }
30
+ }
31
+
32
+ /**
33
+ *
34
+ * @param hexstring
35
+ * @return
36
+ */
37
+ static public int colorString(String hexstring) {
38
+ return java.awt.Color.decode(hexstring).getRGB();
39
+ }
40
+
41
+ /**
42
+ *
43
+ * @param hex
44
+ * @return
45
+ */
46
+ static public float colorLong(double hex) {
47
+ return (float) hex;
48
+ }
49
+
50
+ /**
51
+ *
52
+ * @param hexlong
53
+ * @return
54
+ */
55
+ static public int colorLong(long hexlong){
56
+ return hexLong(hexlong);
57
+ }
58
+
59
+ /**
60
+ *
61
+ * @param hex
62
+ * @return
63
+ */
64
+ static public float colorDouble(double hex){
65
+ return (float)hex;
66
+ }
67
+ }
@@ -0,0 +1,195 @@
1
+ /**
2
+ * The purpose of this tool is to allow ruby-processing users to use an alternative
3
+ * to processing.org map, lerp and norm methods in their sketches
4
+ * Copyright (C) 2015-16 Martin Prout. This tool is free software; you can
5
+ * redistribute it and/or modify it under the terms of the GNU Lesser General
6
+ * Public License as published by the Free Software Foundation; either version
7
+ * 2.1 of the License, or (at your option) any later version.
8
+ *
9
+ * Obtain a copy of the license at http://www.gnu.org/licenses/lgpl-2.1.html
10
+ */
11
+ package monkstone;
12
+
13
+ import org.jruby.Ruby;
14
+ import org.jruby.RubyClass;
15
+ import org.jruby.RubyFloat;
16
+ import org.jruby.RubyModule;
17
+ import org.jruby.RubyObject;
18
+ import org.jruby.RubyRange;
19
+ import org.jruby.anno.JRubyMethod;
20
+ import org.jruby.runtime.ThreadContext;
21
+ import org.jruby.runtime.builtin.IRubyObject;
22
+
23
+ /**
24
+ *
25
+ * @author MartinProut
26
+ */
27
+
28
+ public class MathTool extends RubyObject {
29
+
30
+ private static final long serialVersionUID = 4427564758225746633L;
31
+ /**
32
+ *
33
+ * @param runtime
34
+ */
35
+ public static void createMathTool(Ruby runtime) {
36
+ RubyModule processing = runtime.defineModule("Processing");
37
+ RubyModule module = processing.defineModuleUnder("MathTool");
38
+ module.defineAnnotatedMethods(MathTool.class);
39
+ }
40
+
41
+ /**
42
+ *
43
+ * @param context JRuby runtime
44
+ * @param recv self
45
+ * @param args array of RubyRange (must be be numeric)
46
+ * @return RubyFloat
47
+ */
48
+ @JRubyMethod(name = "map1d", rest = true, module = true)
49
+ public static IRubyObject mapOneD(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
50
+ double value = (Double) args[0].toJava(Double.class);
51
+ RubyRange r1 = (RubyRange) args[1];
52
+ RubyRange r2 = (RubyRange) args[2];
53
+ double first1 = (Double) r1.first(context).toJava(Double.class);
54
+ double first2 = (Double) r2.first(context).toJava(Double.class);
55
+ double last1 = (Double) r1.last(context).toJava(Double.class);
56
+ double last2 = (Double) r2.last(context).toJava(Double.class);
57
+ return mapMt(context, value, first1, last1, first2, last2);
58
+ }
59
+
60
+ /**
61
+ *
62
+ * @param context JRuby runtime
63
+ * @param recv self
64
+ * @param args array of RubyRange (must be be numeric)
65
+ * @return RubyFloat
66
+ */
67
+ @JRubyMethod(name = "constrained_map", rest = true, module = true)
68
+ public static IRubyObject constrainedMap(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
69
+ double value = (Double) args[0].toJava(Double.class);
70
+ RubyRange r1 = (RubyRange) args[1];
71
+ RubyRange r2 = (RubyRange) args[2];
72
+ double first1 = (Double) r1.first(context).toJava(Double.class);
73
+ double first2 = (Double) r2.first(context).toJava(Double.class);
74
+ double last1 = (Double) r1.last(context).toJava(Double.class);
75
+ double last2 = (Double) r2.last(context).toJava(Double.class);
76
+ double max = Math.max(first1, last1);
77
+ double min = Math.min(first1, last1);
78
+ if (value < min) {
79
+ value = min;
80
+ }
81
+ if (value > max) {
82
+ value = max;
83
+ }
84
+ return mapMt(context, value, first1, last1, first2, last2);
85
+ }
86
+
87
+ /**
88
+ *
89
+ * @param context JRuby runtime
90
+ * @param recv self
91
+ * @param args floats as in processing map function
92
+ * @return RubyFloat
93
+ */
94
+ @JRubyMethod(name = {"p5map", "map"}, rest = true, module = true)
95
+ public static IRubyObject mapProcessing(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
96
+ double value = (Double) args[0].toJava(Double.class);
97
+ double first1 = (Double) args[1].toJava(Double.class);
98
+ double first2 = (Double) args[3].toJava(Double.class);
99
+ double last1 = (Double) args[2].toJava(Double.class);
100
+ double last2 = (Double) args[4].toJava(Double.class);
101
+ return mapMt(context, value, first1, last1, first2, last2);
102
+ }
103
+
104
+ /**
105
+ * A more correct version than processing.org version
106
+ * @param context
107
+ * @param recv
108
+ * @param args args[2] should be between 0 and 1.0 if not returns start or stop
109
+ * @return lerp value
110
+ */
111
+ @JRubyMethod(name = "lerp", rest = true, module = true)
112
+ public static IRubyObject lerpP(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
113
+ double start = (Double) args[0].toJava(Double.class);
114
+ double stop = (Double) args[1].toJava(Double.class);
115
+ double amount = (Double) args[2].toJava(Double.class);
116
+ if (amount <= 0) return args[0];
117
+ if (amount >= 1.0) return args[1];
118
+ return context.getRuntime().newFloat((1 - amount) * start + (stop * amount));
119
+ }
120
+
121
+ /**
122
+ * Identical to p5map(value, low, high, 0, 1).
123
+ * Numbers outside of the range are not clamped to 0 and 1,
124
+ * because out-of-range values are often intentional and useful.
125
+ * @param context
126
+ * @param recv
127
+ * @param args
128
+ * @return norm value
129
+ */
130
+ @JRubyMethod(name = "norm", rest = true, module = true)
131
+ public static IRubyObject normP(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
132
+ double value = (Double) args[0].toJava(Double.class);
133
+ double start = (Double) args[1].toJava(Double.class);
134
+ double stop = (Double) args[2].toJava(Double.class);
135
+ return mapMt(context, value, start, stop, 0, 1.0);
136
+ }
137
+
138
+ /**
139
+ * Identical to p5map(value, low, high, 0, 1) but 'clamped'.
140
+ * Numbers outside of the range are clamped to 0 and 1,
141
+ * @param context
142
+ * @param recv
143
+ * @param args
144
+ * @return strict normalized value ie 0..1.0
145
+ */
146
+ @JRubyMethod(name = "norm_strict", rest = true, module = true)
147
+ public static IRubyObject norm_strict(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
148
+ Ruby ruby = context.runtime;
149
+ double value = (Double) args[0].toJava(Double.class);
150
+ double start = (Double) args[1].toJava(Double.class);
151
+ double stop = (Double) args[2].toJava(Double.class);
152
+ if (value <= start) {
153
+ return new RubyFloat(ruby, 0);
154
+ } else if (value >= stop) {
155
+ return new RubyFloat(ruby, 1.0);
156
+ } else {
157
+ return mapMt(context, value, start, stop, 0, 1.0);
158
+ }
159
+ }
160
+
161
+ static final RubyFloat mapMt(ThreadContext context, double value, double first1, double last1, double first2, double last2) {
162
+ double result = first2 + (last2 - first2) * ((value - first1) / (last1 - first1));
163
+ return context.getRuntime().newFloat(result);
164
+ }
165
+
166
+ /**
167
+ * Provides processing constrain method as a ruby module method
168
+ * @param context
169
+ * @param recv
170
+ * @param args
171
+ * @return original or limit values
172
+ */
173
+ @JRubyMethod(name = "constrain", rest = true, module = true)
174
+ public static IRubyObject constrainValue(ThreadContext context, IRubyObject recv, IRubyObject[] args) {
175
+ RubyFloat value = args[0].convertToFloat();
176
+ RubyFloat start = args[1].convertToFloat();
177
+ RubyFloat stop = args[2].convertToFloat();
178
+ if (value.op_ge(context, start).isTrue() && value.op_le(context, stop).isTrue()) {
179
+ return args[0];
180
+ } else if (value.op_ge(context, start).isTrue()) {
181
+ return args[2];
182
+ } else {
183
+ return args[1];
184
+ }
185
+ }
186
+
187
+ /**
188
+ *
189
+ * @param runtime
190
+ * @param metaClass
191
+ */
192
+ public MathTool(Ruby runtime, RubyClass metaClass) {
193
+ super(runtime, metaClass);
194
+ }
195
+ }