picrate 0.0.2-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.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +47 -0
  3. data/.mvn/extensions.xml +9 -0
  4. data/.mvn/wrapper/maven-wrapper.properties +1 -0
  5. data/.travis.yml +10 -0
  6. data/CHANGELOG.md +4 -0
  7. data/LICENSE.md +165 -0
  8. data/README.md +51 -0
  9. data/Rakefile +59 -0
  10. data/bin/picrate +8 -0
  11. data/docs/.gitignore +6 -0
  12. data/docs/_config.yml +30 -0
  13. data/docs/_includes/footer.html +38 -0
  14. data/docs/_includes/head.html +16 -0
  15. data/docs/_includes/header.html +27 -0
  16. data/docs/_includes/icon-github.html +1 -0
  17. data/docs/_includes/icon-github.svg +1 -0
  18. data/docs/_includes/icon-twitter.html +1 -0
  19. data/docs/_includes/icon-twitter.svg +1 -0
  20. data/docs/_includes/navigation.html +24 -0
  21. data/docs/_layouts/default.html +20 -0
  22. data/docs/_layouts/page.html +14 -0
  23. data/docs/_layouts/post.html +15 -0
  24. data/docs/_posts/2018-05-06-getting_started.md +8 -0
  25. data/docs/_posts/2018-05-06-install_jruby.md +35 -0
  26. data/docs/_sass/_base.scss +206 -0
  27. data/docs/_sass/_layout.scss +242 -0
  28. data/docs/_sass/_syntax-highlighting.scss +71 -0
  29. data/docs/about.md +10 -0
  30. data/docs/css/main.scss +38 -0
  31. data/docs/favicon.ico +0 -0
  32. data/docs/feed.xml +30 -0
  33. data/docs/index.html +38 -0
  34. data/lib/picrate.rb +10 -0
  35. data/lib/picrate/app.rb +187 -0
  36. data/lib/picrate/creators/sketch_class.rb +57 -0
  37. data/lib/picrate/creators/sketch_factory.rb +12 -0
  38. data/lib/picrate/creators/sketch_writer.rb +21 -0
  39. data/lib/picrate/helper_methods.rb +214 -0
  40. data/lib/picrate/helpers/numeric.rb +9 -0
  41. data/lib/picrate/library.rb +69 -0
  42. data/lib/picrate/library_loader.rb +53 -0
  43. data/lib/picrate/native_folder.rb +35 -0
  44. data/lib/picrate/native_loader.rb +27 -0
  45. data/lib/picrate/runner.rb +81 -0
  46. data/lib/picrate/version.rb +4 -0
  47. data/library/boids/boids.rb +209 -0
  48. data/library/chooser/chooser.rb +19 -0
  49. data/library/control_panel/control_panel.rb +182 -0
  50. data/library/library_proxy/README.md +99 -0
  51. data/library/library_proxy/library_proxy.rb +14 -0
  52. data/library/slider/slider.rb +42 -0
  53. data/library/vector_utils/vector_utils.rb +69 -0
  54. data/library/video_event/video_event.rb +3 -0
  55. data/license.txt +508 -0
  56. data/picrate.gemspec +35 -0
  57. data/pom.rb +122 -0
  58. data/pom.xml +214 -0
  59. data/src/main/java/japplemenubar/JAppleMenuBar.java +88 -0
  60. data/src/main/java/japplemenubar/libjAppleMenuBar.jnilib +0 -0
  61. data/src/main/java/monkstone/ColorUtil.java +115 -0
  62. data/src/main/java/monkstone/MathToolModule.java +236 -0
  63. data/src/main/java/monkstone/PicrateLibrary.java +47 -0
  64. data/src/main/java/monkstone/core/LibraryProxy.java +127 -0
  65. data/src/main/java/monkstone/fastmath/Deglut.java +122 -0
  66. data/src/main/java/monkstone/fastmath/package-info.java +6 -0
  67. data/src/main/java/monkstone/filechooser/Chooser.java +48 -0
  68. data/src/main/java/monkstone/noise/SimplexNoise.java +465 -0
  69. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +168 -0
  70. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +182 -0
  71. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +149 -0
  72. data/src/main/java/monkstone/slider/SimpleSlider.java +196 -0
  73. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +163 -0
  74. data/src/main/java/monkstone/slider/Slider.java +67 -0
  75. data/src/main/java/monkstone/slider/SliderBar.java +277 -0
  76. data/src/main/java/monkstone/slider/SliderGroup.java +78 -0
  77. data/src/main/java/monkstone/slider/WheelHandler.java +35 -0
  78. data/src/main/java/monkstone/vecmath/AppRender.java +87 -0
  79. data/src/main/java/monkstone/vecmath/JRender.java +56 -0
  80. data/src/main/java/monkstone/vecmath/ShapeRender.java +87 -0
  81. data/src/main/java/monkstone/vecmath/package-info.java +20 -0
  82. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +757 -0
  83. data/src/main/java/monkstone/vecmath/vec2/package-info.java +6 -0
  84. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +727 -0
  85. data/src/main/java/monkstone/vecmath/vec3/package-info.java +6 -0
  86. data/src/main/java/monkstone/videoevent/VideoInterface.java +42 -0
  87. data/src/main/java/monkstone/videoevent/package-info.java +20 -0
  88. data/src/main/java/processing/awt/PGraphicsJava2D.java +3098 -0
  89. data/src/main/java/processing/awt/PShapeJava2D.java +401 -0
  90. data/src/main/java/processing/awt/PSurfaceAWT.java +1660 -0
  91. data/src/main/java/processing/core/PApplet.java +17647 -0
  92. data/src/main/java/processing/core/PConstants.java +1033 -0
  93. data/src/main/java/processing/core/PFont.java +1250 -0
  94. data/src/main/java/processing/core/PGraphics.java +9614 -0
  95. data/src/main/java/processing/core/PImage.java +3608 -0
  96. data/src/main/java/processing/core/PMatrix.java +347 -0
  97. data/src/main/java/processing/core/PMatrix2D.java +694 -0
  98. data/src/main/java/processing/core/PMatrix3D.java +1153 -0
  99. data/src/main/java/processing/core/PShape.java +4332 -0
  100. data/src/main/java/processing/core/PShapeOBJ.java +544 -0
  101. data/src/main/java/processing/core/PShapeSVG.java +1987 -0
  102. data/src/main/java/processing/core/PStyle.java +208 -0
  103. data/src/main/java/processing/core/PSurface.java +242 -0
  104. data/src/main/java/processing/core/PSurfaceNone.java +479 -0
  105. data/src/main/java/processing/core/PVector.java +1140 -0
  106. data/src/main/java/processing/data/FloatDict.java +829 -0
  107. data/src/main/java/processing/data/FloatList.java +912 -0
  108. data/src/main/java/processing/data/IntDict.java +796 -0
  109. data/src/main/java/processing/data/IntList.java +913 -0
  110. data/src/main/java/processing/data/JSONArray.java +1260 -0
  111. data/src/main/java/processing/data/JSONObject.java +2282 -0
  112. data/src/main/java/processing/data/JSONTokener.java +435 -0
  113. data/src/main/java/processing/data/Sort.java +46 -0
  114. data/src/main/java/processing/data/StringDict.java +601 -0
  115. data/src/main/java/processing/data/StringList.java +775 -0
  116. data/src/main/java/processing/data/Table.java +4923 -0
  117. data/src/main/java/processing/data/TableRow.java +198 -0
  118. data/src/main/java/processing/data/XML.java +1149 -0
  119. data/src/main/java/processing/event/Event.java +108 -0
  120. data/src/main/java/processing/event/KeyEvent.java +70 -0
  121. data/src/main/java/processing/event/MouseEvent.java +149 -0
  122. data/src/main/java/processing/event/TouchEvent.java +57 -0
  123. data/src/main/java/processing/javafx/PGraphicsFX2D.java +354 -0
  124. data/src/main/java/processing/opengl/FontTexture.java +379 -0
  125. data/src/main/java/processing/opengl/FrameBuffer.java +503 -0
  126. data/src/main/java/processing/opengl/LinePath.java +623 -0
  127. data/src/main/java/processing/opengl/LineStroker.java +685 -0
  128. data/src/main/java/processing/opengl/PGL.java +3366 -0
  129. data/src/main/java/processing/opengl/PGraphics2D.java +615 -0
  130. data/src/main/java/processing/opengl/PGraphics3D.java +281 -0
  131. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +13634 -0
  132. data/src/main/java/processing/opengl/PJOGL.java +1966 -0
  133. data/src/main/java/processing/opengl/PShader.java +1478 -0
  134. data/src/main/java/processing/opengl/PShapeOpenGL.java +5234 -0
  135. data/src/main/java/processing/opengl/PSurfaceJOGL.java +1315 -0
  136. data/src/main/java/processing/opengl/Texture.java +1670 -0
  137. data/src/main/java/processing/opengl/VertexBuffer.java +88 -0
  138. data/src/main/java/processing/opengl/cursors/arrow.png +0 -0
  139. data/src/main/java/processing/opengl/cursors/cross.png +0 -0
  140. data/src/main/java/processing/opengl/cursors/hand.png +0 -0
  141. data/src/main/java/processing/opengl/cursors/license.txt +27 -0
  142. data/src/main/java/processing/opengl/cursors/move.png +0 -0
  143. data/src/main/java/processing/opengl/cursors/text.png +0 -0
  144. data/src/main/java/processing/opengl/cursors/wait.png +0 -0
  145. data/src/main/java/processing/opengl/shaders/ColorFrag.glsl +32 -0
  146. data/src/main/java/processing/opengl/shaders/ColorVert.glsl +34 -0
  147. data/src/main/java/processing/opengl/shaders/LightFrag.glsl +33 -0
  148. data/src/main/java/processing/opengl/shaders/LightVert-vc4.glsl +154 -0
  149. data/src/main/java/processing/opengl/shaders/LightVert.glsl +151 -0
  150. data/src/main/java/processing/opengl/shaders/LineFrag.glsl +32 -0
  151. data/src/main/java/processing/opengl/shaders/LineVert.glsl +100 -0
  152. data/src/main/java/processing/opengl/shaders/MaskFrag.glsl +40 -0
  153. data/src/main/java/processing/opengl/shaders/PointFrag.glsl +32 -0
  154. data/src/main/java/processing/opengl/shaders/PointVert.glsl +56 -0
  155. data/src/main/java/processing/opengl/shaders/TexFrag.glsl +37 -0
  156. data/src/main/java/processing/opengl/shaders/TexLightFrag.glsl +37 -0
  157. data/src/main/java/processing/opengl/shaders/TexLightVert-vc4.glsl +160 -0
  158. data/src/main/java/processing/opengl/shaders/TexLightVert.glsl +157 -0
  159. data/src/main/java/processing/opengl/shaders/TexVert.glsl +38 -0
  160. data/src/main/resources/icon/icon-1024.png +0 -0
  161. data/src/main/resources/icon/icon-128.png +0 -0
  162. data/src/main/resources/icon/icon-16.png +0 -0
  163. data/src/main/resources/icon/icon-256.png +0 -0
  164. data/src/main/resources/icon/icon-32.png +0 -0
  165. data/src/main/resources/icon/icon-48.png +0 -0
  166. data/src/main/resources/icon/icon-512.png +0 -0
  167. data/src/main/resources/icon/icon-64.png +0 -0
  168. data/src/main/resources/license.txt +508 -0
  169. data/test/create_test.rb +68 -0
  170. data/test/deglut_spec_test.rb +24 -0
  171. data/test/helper_methods_test.rb +58 -0
  172. data/test/math_tool_test.rb +75 -0
  173. data/test/respond_to_test.rb +215 -0
  174. data/test/sketches/key_event.rb +37 -0
  175. data/test/sketches/library/my_library/my_library.rb +32 -0
  176. data/test/test_helper.rb +3 -0
  177. data/test/vecmath_spec_test.rb +522 -0
  178. data/vendors/Rakefile +127 -0
  179. metadata +289 -0
@@ -0,0 +1,78 @@
1
+ /*
2
+ * Copyright (c) 2016-18 Martin Prout
3
+ *
4
+ * This library is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public
6
+ * License as published by the Free Software Foundation; either
7
+ * version 3.0 of the License, or (at your option) any later version.
8
+ *
9
+ * http://creativecommons.org/licenses/LGPL/2.1/
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+ package monkstone.slider;
21
+
22
+ import java.util.ArrayList;
23
+ import java.util.List;
24
+ import processing.core.PApplet;
25
+
26
+ /**
27
+ *
28
+ * @author tux
29
+ */
30
+ public class SliderGroup {
31
+
32
+ int count = 0;
33
+ List<Slider> sliders;
34
+ PApplet applet;
35
+ boolean vertical;
36
+
37
+ /**
38
+ *
39
+ * @param outer
40
+ */
41
+ public SliderGroup(final PApplet outer) {
42
+ applet = outer;
43
+ sliders = new ArrayList<>();
44
+ vertical = false;
45
+ }
46
+
47
+ /**
48
+ *
49
+ */
50
+ public void vertical() {
51
+ vertical = true;
52
+ }
53
+
54
+ /**
55
+ *
56
+ * @param beginRange
57
+ * @param endRange
58
+ * @param initial
59
+ */
60
+ public void addSlider(float beginRange, float endRange, float initial) {
61
+ if (vertical) {
62
+ sliders.add(new SimpleVerticalSlider(applet, beginRange, endRange, initial, count));
63
+ } else {
64
+ sliders.add(new SimpleHorizontalSlider(applet, beginRange, endRange, initial, count));
65
+ }
66
+ count = sliders.size();
67
+ }
68
+
69
+ /**
70
+ *
71
+ * @param count
72
+ * @return
73
+ */
74
+ public float readValue(int count) {
75
+ return sliders.get(count).readValue();
76
+ }
77
+
78
+ }
@@ -0,0 +1,35 @@
1
+ /*
2
+ * Copyright (c) 2016-18 Martin Prout
3
+ *
4
+ * This library is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public
6
+ * License as published by the Free Software Foundation; either
7
+ * version 3.0 of the License, or (at your option) any later version.
8
+ *
9
+ * http://creativecommons.org/licenses/LGPL/2.1/
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+ package monkstone.slider;
21
+
22
+ /**
23
+ *
24
+ * from a borrowed pattern seen in Jonathan Feinbergs Peasycam
25
+ * when I was struggling with non functioning browser applet,
26
+ * probably superfluous here.
27
+ */
28
+ public interface WheelHandler {
29
+ /**
30
+ *
31
+ * @param amount int
32
+ */
33
+
34
+ public void handleWheel(final short amount);
35
+ }
@@ -0,0 +1,87 @@
1
+ package monkstone.vecmath;
2
+
3
+ import processing.core.PApplet;
4
+ import processing.core.PGraphics;
5
+
6
+ /**
7
+ *
8
+ *
9
+ */
10
+ public class AppRender implements JRender {
11
+
12
+ final PGraphics g;
13
+
14
+ /**
15
+ *
16
+ * @param app PApplet
17
+ */
18
+ public AppRender(final PApplet app) {
19
+ this.g = app.g;
20
+ }
21
+
22
+ /**
23
+ *
24
+ * @param x double
25
+ * @param y double
26
+ */
27
+ @Override
28
+ public void vertex(double x, double y) {
29
+ g.vertex((float) x, (float) y);
30
+ }
31
+
32
+ /**
33
+ *
34
+ * @param x double
35
+ * @param y double
36
+ */
37
+ @Override
38
+ public void curveVertex(double x, double y) {
39
+ g.curveVertex((float) x, (float) y);
40
+ }
41
+
42
+ /**
43
+ *
44
+ * @param x double
45
+ * @param y double
46
+ * @param z double
47
+ */
48
+ @Override
49
+ public void vertex(double x, double y, double z) {
50
+ g.vertex((float) x, (float) y, (float) z);
51
+ }
52
+
53
+ /**
54
+ *
55
+ * @param x double
56
+ * @param y double
57
+ * @param z double
58
+ */
59
+ @Override
60
+ public void normal(double x, double y, double z) {
61
+ g.normal((float) x, (float) y, (float) z);
62
+ }
63
+
64
+ /**
65
+ *
66
+ * @param x double
67
+ * @param y double
68
+ * @param z double
69
+ * @param u double
70
+ * @param v double
71
+ */
72
+ @Override
73
+ public void vertex(double x, double y, double z, double u, double v) {
74
+ g.vertex((float) x, (float) y, (float) z, (float) u, (float) v);
75
+ }
76
+
77
+ /**
78
+ *
79
+ * @param x double
80
+ * @param y double
81
+ * @param z double
82
+ */
83
+ @Override
84
+ public void curveVertex(double x, double y, double z) {
85
+ g.curveVertex((float) x, (float) y, (float) z);
86
+ }
87
+ }
@@ -0,0 +1,56 @@
1
+ package monkstone.vecmath;
2
+
3
+ /**
4
+ *
5
+ *
6
+ */
7
+ public interface JRender {
8
+
9
+ /**
10
+ *
11
+ * @param x double
12
+ * @param y double
13
+ */
14
+ public void vertex(double x, double y);
15
+
16
+ /**
17
+ *
18
+ * @param x double
19
+ * @param y double
20
+ */
21
+ public void curveVertex(double x, double y);
22
+
23
+ /**
24
+ *
25
+ * @param x double
26
+ * @param y double
27
+ * @param z double
28
+ */
29
+ public void vertex(double x, double y, double z);
30
+
31
+ /**
32
+ *
33
+ * @param x double
34
+ * @param y double
35
+ * @param z double
36
+ * @param u double
37
+ * @param v double
38
+ */
39
+ public void vertex(double x, double y, double z, double u, double v);
40
+
41
+ /**
42
+ *
43
+ * @param x double
44
+ * @param y double
45
+ * @param z double
46
+ */
47
+ public void curveVertex(double x, double y, double z);
48
+
49
+ /**
50
+ *
51
+ * @param x double
52
+ * @param y double
53
+ * @param z double
54
+ */
55
+ public void normal(double x, double y, double z);
56
+ }
@@ -0,0 +1,87 @@
1
+ package monkstone.vecmath;
2
+
3
+ import processing.core.PShape;
4
+
5
+ /**
6
+ *
7
+ *
8
+ */
9
+ public class ShapeRender implements JRender {
10
+
11
+ final PShape shape;
12
+
13
+ /**
14
+ *
15
+ * @param shape PShape
16
+ */
17
+ public ShapeRender(final PShape shape) {
18
+ this.shape = shape;
19
+
20
+ }
21
+
22
+ /**
23
+ *
24
+ * @param x double
25
+ * @param y double
26
+ */
27
+ @Override
28
+ public void vertex(double x, double y) {
29
+ shape.vertex((float) x, (float) y);
30
+ }
31
+
32
+ /**
33
+ *
34
+ * @param x double
35
+ * @param y double
36
+ */
37
+ @Override
38
+ public void curveVertex(double x, double y) {
39
+ throw new UnsupportedOperationException("Not implemented for this renderer");
40
+ }
41
+
42
+ /**
43
+ *
44
+ * @param x double
45
+ * @param y double
46
+ * @param z double
47
+ */
48
+ @Override
49
+ public void vertex(double x, double y, double z) {
50
+ shape.vertex((float) x, (float) y, (float) z);
51
+ }
52
+
53
+ /**
54
+ *
55
+ * @param x double
56
+ * @param y double
57
+ * @param z double
58
+ */
59
+ @Override
60
+ public void normal(double x, double y, double z) {
61
+ shape.normal((float) x, (float) y, (float) z);
62
+ }
63
+
64
+ /**
65
+ *
66
+ * @param x double
67
+ * @param y double
68
+ * @param z double
69
+ * @param u double
70
+ * @param v double
71
+ */
72
+ @Override
73
+ public void vertex(double x, double y, double z, double u, double v) {
74
+ shape.vertex((float) x, (float) y, (float) z, (float) u, (float) v);
75
+ }
76
+
77
+ /**
78
+ *
79
+ * @param x double
80
+ * @param y double
81
+ * @param z double
82
+ */
83
+ @Override
84
+ public void curveVertex(double x, double y, double z) {
85
+ throw new UnsupportedOperationException("Not implemented for this renderer");
86
+ }
87
+ }
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Copyright (c) 2018 Martin Prout
3
+ *
4
+ * This library is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU General Public
6
+ * License as published by the Free Software Foundation; either
7
+ * version 3.0 of the License, or (at your option) any later version.
8
+ *
9
+ * http://creativecommons.org/licenses/LGPL/2.1/
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+ package monkstone.vecmath;
@@ -0,0 +1,757 @@
1
+ package monkstone.vecmath.vec2;
2
+
3
+ /*
4
+ * Copyright (c) 2018 Martin Prout
5
+ *
6
+ * This library is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 3.0 of the License, or (at your option) any later version.
10
+ *
11
+ * http://creativecommons.org/licenses/LGPL/2.1/
12
+ *
13
+ * This library is distributed in the hope that it will be useful,
14
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
+ * Lesser General Public License for more details.
17
+ *
18
+ * You should have received a copy of the GNU General Public
19
+ * License along with this library; if not, write to the Free Software
20
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ */
22
+ import org.jruby.Ruby;
23
+ import org.jruby.RubyArray;
24
+ import org.jruby.RubyClass;
25
+ import org.jruby.RubyFixnum;
26
+ import org.jruby.RubyFloat;
27
+ import org.jruby.RubyObject;
28
+ import org.jruby.RubySymbol;
29
+ import org.jruby.anno.JRubyClass;
30
+ import org.jruby.anno.JRubyMethod;
31
+ import org.jruby.runtime.Block;
32
+ import org.jruby.runtime.ThreadContext;
33
+ import org.jruby.runtime.builtin.IRubyObject;
34
+ import monkstone.vecmath.JRender;
35
+
36
+ /**
37
+ *
38
+ *
39
+ */
40
+ @JRubyClass(name = "Vec2D")
41
+ public class Vec2 extends RubyObject {
42
+
43
+ static final double EPSILON = 9.999999747378752e-05; // matches processing.org EPSILON
44
+ private static final long serialVersionUID = -2950154560223211646L;
45
+
46
+ private double jx = 0;
47
+ private double jy = 0;
48
+
49
+ /**
50
+ *
51
+ * @param runtime ThreadContext
52
+ */
53
+ public static void createVec2(final Ruby runtime) {
54
+ RubyClass vec2Cls = runtime.defineClass("Vec2D", runtime.getObject(), (Ruby runtime1, RubyClass rubyClass) -> new Vec2(runtime1, rubyClass));
55
+ vec2Cls.defineAnnotatedMethods(Vec2.class);
56
+ }
57
+
58
+ /**
59
+ *
60
+ * @return
61
+ */
62
+ public double javax() {
63
+ return jx;
64
+ }
65
+
66
+ /**
67
+ *
68
+ * @return
69
+ */
70
+ public double javay() {
71
+ return jy;
72
+ }
73
+
74
+ /**
75
+ *
76
+ * @param context ThreadContext
77
+ * @param klazz IRubyObject
78
+ * @param args optional (no args jx = 0, jy = 0)
79
+ * @return new Vec2 object (ruby)
80
+ */
81
+ @JRubyMethod(name = "new", meta = true, rest = true)
82
+ public static final IRubyObject rbNew(ThreadContext context, IRubyObject klazz, IRubyObject... args) {
83
+ Vec2 vec2 = (Vec2) ((RubyClass) klazz).allocate();
84
+ vec2.init(context, args);
85
+ return vec2;
86
+ }
87
+
88
+ /**
89
+ *
90
+ * @param runtime Ruby
91
+ * @param klass RubyClass
92
+ */
93
+ public Vec2(Ruby runtime, RubyClass klass) {
94
+ super(runtime, klass);
95
+ }
96
+
97
+ void init(ThreadContext context, IRubyObject... args) {
98
+ int count = args.length;
99
+ if (count == 2) {
100
+ jx = (args[0] instanceof RubyFloat) ? ((RubyFloat) args[0]).getValue() : ((RubyFixnum) args[0]).getDoubleValue();
101
+ jy = (args[1] instanceof RubyFloat) ? ((RubyFloat) args[1]).getValue() : ((RubyFixnum) args[1]).getDoubleValue();
102
+ } // allow ruby ducktyping in constructor
103
+ if (count == 1) {
104
+ if (!(args[0].respondsTo("x"))) {
105
+ throw context.runtime.newTypeError(args[0].getType() + " doesn't respond_to :x & :y");
106
+ }
107
+ jx = ((args[0].callMethod(context, "x")) instanceof RubyFloat)
108
+ ? ((RubyFloat) args[0].callMethod(context, "x")).getValue() : ((RubyFixnum) args[0].callMethod(context, "x")).getDoubleValue();
109
+ jy = ((args[0].callMethod(context, "y")) instanceof RubyFloat)
110
+ ? ((RubyFloat) args[0].callMethod(context, "y")).getValue() : ((RubyFixnum) args[0].callMethod(context, "y")).getDoubleValue();
111
+ }
112
+ }
113
+
114
+ /**
115
+ *
116
+ * @param context ThreadContext
117
+ * @return x IRubyObject
118
+ */
119
+ @JRubyMethod(name = "x")
120
+
121
+ public IRubyObject getX(ThreadContext context) {
122
+ return context.runtime.newFloat(jx);
123
+ }
124
+
125
+ /**
126
+ *
127
+ * @param context ThreadContext
128
+ * @return y IRubyObject
129
+ */
130
+ @JRubyMethod(name = "y")
131
+
132
+ public IRubyObject getY(ThreadContext context) {
133
+ return context.runtime.newFloat(jy);
134
+ }
135
+
136
+ /**
137
+ *
138
+ * @param context ThreadContext
139
+ * @param key as symbol
140
+ * @return value float
141
+ */
142
+ @JRubyMethod(name = "[]", required = 1)
143
+
144
+ public IRubyObject aref(ThreadContext context, IRubyObject key) {
145
+ Ruby runtime = context.runtime;
146
+ if (key instanceof RubySymbol) {
147
+ if (key == RubySymbol.newSymbol(runtime, "x")) {
148
+ return runtime.newFloat(jx);
149
+ } else if (key == RubySymbol.newSymbol(runtime, "y")) {
150
+ return runtime.newFloat(jy);
151
+ } else {
152
+ throw runtime.newIndexError("invalid key");
153
+ }
154
+ } else {
155
+ throw runtime.newIndexError("invalid key");
156
+ }
157
+ }
158
+
159
+ /**
160
+ * @param context ThreadContext
161
+ * @param key as symbol
162
+ * @param value as float
163
+ * @return value float
164
+ */
165
+ @JRubyMethod(name = "[]=")
166
+
167
+ public IRubyObject aset(ThreadContext context, IRubyObject key, IRubyObject value) {
168
+ Ruby runtime = context.runtime;
169
+ if (key instanceof RubySymbol) {
170
+ if (key == RubySymbol.newSymbol(runtime, "x")) {
171
+ jx = (value instanceof RubyFloat)
172
+ ? ((RubyFloat) value).getValue() : ((RubyFixnum) value).getDoubleValue();
173
+ } else if (key == RubySymbol.newSymbol(runtime, "y")) {
174
+ jy = (value instanceof RubyFloat)
175
+ ? ((RubyFloat) value).getValue() : ((RubyFixnum) value).getDoubleValue();
176
+ }
177
+ } else {
178
+ throw runtime.newIndexError("invalid key");
179
+ }
180
+ return value;
181
+ }
182
+
183
+ /**
184
+ *
185
+ * @param context ThreadContext
186
+ * @param other IRubyObject
187
+ * @return x IRubyObject
188
+ */
189
+ @JRubyMethod(name = "x=")
190
+
191
+ public IRubyObject setX(ThreadContext context, IRubyObject other) {
192
+ if (other instanceof RubyFloat) {
193
+ jx = ((RubyFloat) other).getValue();
194
+ } else {
195
+ jx = ((RubyFixnum) other).getDoubleValue();
196
+ }
197
+ return other;
198
+ }
199
+
200
+ /**
201
+ *
202
+ * @param context ThreadContext
203
+ * @param other IRubyObject
204
+ * @return y IRubyObject
205
+ */
206
+ @JRubyMethod(name = "y=")
207
+
208
+ public IRubyObject setY(ThreadContext context, IRubyObject other) {
209
+ if (other instanceof RubyFloat) {
210
+ jy = ((RubyFloat) other).getValue();
211
+ } else {
212
+ jy = ((RubyFixnum) other).getDoubleValue();
213
+ }
214
+ return other;
215
+ }
216
+
217
+ /**
218
+ *
219
+ * @param context ThreadContext
220
+ * @param other IRubyObject
221
+ * @return distance float
222
+ */
223
+ @JRubyMethod(name = "dist", required = 1)
224
+
225
+ public IRubyObject dist(ThreadContext context, IRubyObject other) {
226
+ Vec2 b = null;
227
+ Ruby runtime = context.runtime;
228
+ if (other instanceof Vec2) {
229
+ b = (Vec2) other.toJava(Vec2.class);
230
+ } else {
231
+ throw runtime.newTypeError("argument should be Vec2D");
232
+ }
233
+ double result = Math.hypot((jx - b.jx), (jy - b.jy));
234
+ return runtime.newFloat(result);
235
+ }
236
+
237
+ /**
238
+ *
239
+ * @param context ThreadContext
240
+ * @param other IRubyObject
241
+ * @return cross product IRubyObject
242
+ */
243
+ @JRubyMethod(name = "cross", required = 1)
244
+
245
+ public IRubyObject cross(ThreadContext context, IRubyObject other) {
246
+ Vec2 b = null;
247
+ Ruby runtime = context.runtime;
248
+ if (other instanceof Vec2) {
249
+ b = (Vec2) other.toJava(Vec2.class);
250
+ } else {
251
+ throw runtime.newTypeError("argument should be Vec2D");
252
+ }
253
+ return runtime.newFloat(jx * b.jy - jy * b.jx);
254
+ }
255
+
256
+ /**
257
+ *
258
+ * @param context ThreadContext
259
+ * @param other IRubyObject
260
+ * @return dot product IRubyObject
261
+ */
262
+ @JRubyMethod(name = "dot", required = 1)
263
+
264
+ public IRubyObject dot(ThreadContext context, IRubyObject other) {
265
+ Vec2 b = null;
266
+ Ruby runtime = context.runtime;
267
+ if (other instanceof Vec2) {
268
+ b = (Vec2) other.toJava(Vec2.class);
269
+ } else {
270
+ throw runtime.newTypeError("argument should be Vec2D");
271
+ }
272
+ return runtime.newFloat(jx * b.jx + jy * b.jy);
273
+ }
274
+
275
+ /**
276
+ *
277
+ * @param context ThreadContext
278
+ * @param other IRubyObject
279
+ * @return new Vec2D object (ruby)
280
+ */
281
+ @JRubyMethod(name = "+", required = 1)
282
+
283
+ public IRubyObject op_plus(ThreadContext context, IRubyObject other) {
284
+ Vec2 b = null;
285
+ Ruby runtime = context.runtime;
286
+ if (other instanceof Vec2) {
287
+ b = (Vec2) other.toJava(Vec2.class);
288
+ } else {
289
+ throw runtime.newTypeError("argument should be Vec2D");
290
+ }
291
+ return Vec2.rbNew(context, other.getMetaClass(), new IRubyObject[]{
292
+ runtime.newFloat(jx + b.jx),
293
+ runtime.newFloat(jy + b.jy)});
294
+ }
295
+
296
+ /**
297
+ *
298
+ * @param context ThreadContext
299
+ * @param other IRubyObject
300
+ * @return new Vec2D object (ruby)
301
+ */
302
+ @JRubyMethod(name = "-", required = 1)
303
+
304
+ public IRubyObject op_minus(ThreadContext context, IRubyObject other) {
305
+ Vec2 b = null;
306
+ Ruby runtime = context.runtime;
307
+ if (other instanceof Vec2) {
308
+ b = (Vec2) other.toJava(Vec2.class);
309
+ } else {
310
+ throw runtime.newTypeError("argument should be Vec2D");
311
+ }
312
+ return Vec2.rbNew(context, other.getMetaClass(), new IRubyObject[]{
313
+ runtime.newFloat(jx - b.jx),
314
+ runtime.newFloat(jy - b.jy)});
315
+ }
316
+
317
+ /**
318
+ *
319
+ * @param context ThreadContext
320
+ * @param other IRubyObject scalar
321
+ * @return new Vec2D object (ruby)
322
+ */
323
+ @JRubyMethod(name = "*")
324
+
325
+ public IRubyObject op_mul(ThreadContext context, IRubyObject other) {
326
+ Ruby runtime = context.runtime;
327
+ double scalar = (other instanceof RubyFloat)
328
+ ? ((RubyFloat) other).getValue() : ((RubyFixnum) other).getDoubleValue();
329
+ return Vec2.rbNew(context, this.getMetaClass(),
330
+ new IRubyObject[]{runtime.newFloat(jx * scalar),
331
+ runtime.newFloat(jy * scalar)});
332
+ }
333
+
334
+ /**
335
+ *
336
+ * @param context ThreadContext
337
+ * @param other IRubyObject scalar
338
+ * @return new Vec2D object (ruby)
339
+ */
340
+ @JRubyMethod(name = "/", required = 1)
341
+
342
+ public IRubyObject op_div(ThreadContext context, IRubyObject other) {
343
+ Ruby runtime = context.runtime;
344
+ double scalar = (other instanceof RubyFloat)
345
+ ? ((RubyFloat) other).getValue() : ((RubyFixnum) other).getDoubleValue();
346
+ if (Math.abs(scalar) < Vec2.EPSILON) {
347
+ return this;
348
+ }
349
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
350
+ runtime.newFloat(jx / scalar),
351
+ runtime.newFloat(jy / scalar)});
352
+ }
353
+
354
+ /**
355
+ *
356
+ * @param context ThreadContext
357
+ * @return heading IRubyObject radians
358
+ */
359
+ @JRubyMethod(name = "heading")
360
+ public IRubyObject heading(ThreadContext context) {
361
+ return context.runtime.newFloat(Math.atan2(jy, jx));
362
+ }
363
+
364
+ /**
365
+ *
366
+ * @param context ThreadContext
367
+ * @return magnitude IRubyObject
368
+ */
369
+ @JRubyMethod(name = "mag")
370
+
371
+ public IRubyObject mag(ThreadContext context) {
372
+ double result = 0;
373
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
374
+ result = Math.hypot(jx, jy);
375
+ } else {
376
+ if (Math.abs(jy) > EPSILON) {
377
+ result = Math.abs(jy);
378
+ }
379
+ if (Math.abs(jx) > EPSILON) {
380
+ result = Math.abs(jx);
381
+ }
382
+ }
383
+ return context.runtime.newFloat(result);
384
+ }
385
+
386
+ /**
387
+ * Call yield if block given, do nothing if yield == false else set_mag to
388
+ * given scalar
389
+ *
390
+ * @param context ThreadContext
391
+ * @param scalar double value to set
392
+ * @param block should return a boolean (optional)
393
+ * @return magnitude IRubyObject
394
+ */
395
+ @JRubyMethod(name = "set_mag")
396
+
397
+ public IRubyObject set_mag(ThreadContext context, IRubyObject scalar, Block block) {
398
+ double new_mag = (Double) scalar.toJava(Double.class);
399
+ if (block.isGiven()) {
400
+ if (!(boolean) block.yield(context, scalar).toJava(Boolean.class)) {
401
+ return this;
402
+ }
403
+ }
404
+ double current = 0;
405
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
406
+ current = Math.hypot(jx, jy);
407
+ } else {
408
+ if (Math.abs(jy) > EPSILON) {
409
+ current = Math.abs(jy);
410
+ }
411
+ if (Math.abs(jx) > EPSILON) {
412
+ current = Math.abs(jx);
413
+ }
414
+ }
415
+ if (current > 0) {
416
+ jx *= new_mag / current;
417
+ jy *= new_mag / current;
418
+ }
419
+ return this;
420
+ }
421
+
422
+ /**
423
+ *
424
+ * @param context ThreadContext
425
+ * @return this as a ruby object
426
+ */
427
+ @JRubyMethod(name = "normalize!")
428
+
429
+ public IRubyObject normalize_bang(ThreadContext context) {
430
+ double mag = 0;
431
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
432
+ mag = Math.hypot(jx, jy);
433
+ } else {
434
+ if (Math.abs(jx) > EPSILON) {
435
+ mag = Math.abs(jx);
436
+ }
437
+ if (Math.abs(jy) > EPSILON) {
438
+ mag = Math.abs(jy);
439
+ }
440
+ }
441
+ if (mag > 0) {
442
+ jx /= mag;
443
+ jy /= mag;
444
+ }
445
+ return this;
446
+ }
447
+
448
+ /**
449
+ *
450
+ * @param context ThreadContext
451
+ * @return new normalized Vec3D object (ruby)
452
+ */
453
+ @JRubyMethod(name = "normalize")
454
+
455
+ public IRubyObject normalize(ThreadContext context) {
456
+ double mag = 0;
457
+ Ruby runtime = context.runtime;
458
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
459
+ mag = Math.hypot(jx, jy);
460
+ } else {
461
+ if (Math.abs(jx) > EPSILON) {
462
+ mag = jx;
463
+ }
464
+ if (Math.abs(jy) > EPSILON) {
465
+ mag = jy;
466
+ }
467
+ }
468
+ if (mag < EPSILON) {
469
+ mag = 1.0;
470
+ }
471
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
472
+ runtime.newFloat(jx / mag),
473
+ runtime.newFloat(jy / mag)});
474
+ }
475
+
476
+ /**
477
+ * Example of a regular ruby class method Use Math rather than RadLut
478
+ * here!!!
479
+ *
480
+ * @param context ThreadContext
481
+ * @param klazz IRubyObject
482
+ * @param scalar input angle in radians
483
+ * @return new Vec2 object (ruby)
484
+ */
485
+ @JRubyMethod(name = "from_angle", meta = true)
486
+ public static IRubyObject from_angle(ThreadContext context, IRubyObject klazz, IRubyObject scalar) {
487
+ Ruby runtime = context.runtime;
488
+ double angle = (scalar instanceof RubyFloat)
489
+ ? ((RubyFloat) scalar).getValue() : ((RubyFixnum) scalar).getDoubleValue();
490
+ return Vec2.rbNew(context, klazz, new IRubyObject[]{
491
+ runtime.newFloat(Math.cos(angle)),
492
+ runtime.newFloat(Math.sin(angle))});
493
+ }
494
+
495
+ /**
496
+ * Example of a regular ruby class method
497
+ *
498
+ * @param context ThreadContext
499
+ * @param klazz IRubyObject
500
+ * @return new Vec2 object (ruby)
501
+ */
502
+ @JRubyMethod(name = "random", meta = true)
503
+ public static IRubyObject random_direction(ThreadContext context, IRubyObject klazz) {
504
+ Ruby runtime = context.runtime;
505
+ double angle = Math.random() * Math.PI * 2;
506
+ return Vec2.rbNew(context, klazz, new IRubyObject[]{
507
+ runtime.newFloat(Math.cos(angle)),
508
+ runtime.newFloat(Math.sin(angle))});
509
+ }
510
+
511
+ /**
512
+ *
513
+ * @param context ThreadContext
514
+ * @param scalar IRubyObject
515
+ * @return this Vec2 object rotated
516
+ */
517
+ @JRubyMethod(name = "rotate!")
518
+ public IRubyObject rotate_bang(ThreadContext context, IRubyObject scalar) {
519
+ double theta = (scalar instanceof RubyFloat)
520
+ ? ((RubyFloat) scalar).getValue() : ((RubyFixnum) scalar).getDoubleValue();
521
+ double x = (jx * Math.cos(theta) - jy * Math.sin(theta));
522
+ double y = (jx * Math.sin(theta) + jy * Math.cos(theta));
523
+ jx = x;
524
+ jy = y;
525
+ return this;
526
+ }
527
+
528
+ /**
529
+ *
530
+ * @param context ThreadContext
531
+ * @param scalar IRubyObject
532
+ * @return a new Vec2 object rotated
533
+ */
534
+ @JRubyMethod(name = "rotate")
535
+ public IRubyObject rotate(ThreadContext context, IRubyObject scalar) {
536
+ Ruby runtime = context.runtime;
537
+ double theta = (scalar instanceof RubyFloat)
538
+ ? ((RubyFloat) scalar).getValue() : ((RubyFixnum) scalar).getDoubleValue();
539
+ IRubyObject[] ary = new IRubyObject[]{
540
+ runtime.newFloat(jx * Math.cos(theta) - jy * Math.sin(theta)),
541
+ runtime.newFloat(jx * Math.sin(theta) + jy * Math.cos(theta))};
542
+ return Vec2.rbNew(context, this.getMetaClass(), ary);
543
+ }
544
+
545
+ /**
546
+ *
547
+ * @param context ThreadContext
548
+ * @param args IRubyObject[]
549
+ * @return as a new Vec2 object (ruby)
550
+ */
551
+ @JRubyMethod(name = "lerp", rest = true)
552
+ public IRubyObject lerp(ThreadContext context, IRubyObject[] args) {
553
+ Ruby runtime = context.runtime;
554
+ if (args.length != 2) {
555
+ throw runtime.newSyntaxError("Check syntax");
556
+ }
557
+ Vec2 vec = (Vec2) args[0].toJava(Vec2.class);
558
+ double scalar = (args[1] instanceof RubyFloat)
559
+ ? ((RubyFloat) args[1]).getValue() : ((RubyFixnum) args[1]).getDoubleValue();
560
+ assert (scalar >= 0 && scalar < 1.0) :
561
+ "Lerp value " + scalar + " out of range 0..1.0";
562
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
563
+ runtime.newFloat(jx + (vec.jx - jx) * scalar),
564
+ runtime.newFloat(jy + (vec.jy - jy) * scalar)});
565
+ }
566
+
567
+ /**
568
+ *
569
+ * @param context ThreadContext
570
+ * @param args IRubyObject[]
571
+ * @return this IRubyObject
572
+ */
573
+ @JRubyMethod(name = "lerp!", rest = true)
574
+ public IRubyObject lerp_bang(ThreadContext context, IRubyObject[] args) {
575
+ Ruby runtime = context.runtime;
576
+ if (args.length != 2) {
577
+ throw runtime.newSyntaxError("Check syntax");
578
+ }
579
+ Vec2 vec = (Vec2) args[0].toJava(Vec2.class);
580
+ double scalar = (args[1] instanceof RubyFloat)
581
+ ? ((RubyFloat) args[1]).getValue() : ((RubyFixnum) args[1]).getDoubleValue();
582
+ assert (scalar >= 0 && scalar < 1.0) :
583
+ "Lerp value " + scalar + " out of range 0..1.0";
584
+ jx += (vec.jx - jx) * scalar;
585
+ jy += (vec.jy - jy) * scalar;
586
+ return this;
587
+ }
588
+
589
+ /**
590
+ *
591
+ * @param context ThreadContext
592
+ * @param other IRubyObject another Vec3D
593
+ * @return angle IRubyObject in radians
594
+ */
595
+ @JRubyMethod(name = "angle_between")
596
+
597
+ public IRubyObject angleBetween(ThreadContext context, IRubyObject other) {
598
+ Vec2 vec = null;
599
+ Ruby runtime = context.runtime;
600
+ if (other instanceof Vec2) {
601
+ vec = (Vec2) other.toJava(Vec2.class);
602
+ } else {
603
+ throw runtime.newTypeError("argument should be Vec2D");
604
+ }
605
+ return runtime.newFloat(Math.atan2(jx - vec.jx, jy - vec.jy));
606
+ }
607
+
608
+ /**
609
+ *
610
+ * @param context ThreadContext
611
+ * @return IRubyObject copy
612
+ */
613
+ @JRubyMethod(name = {"copy", "dup"})
614
+
615
+ public IRubyObject copy(ThreadContext context) {
616
+ Ruby runtime = context.runtime;
617
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
618
+ runtime.newFloat(jx),
619
+ runtime.newFloat(jy)});
620
+ }
621
+
622
+ /**
623
+ *
624
+ * @param context ThreadContext
625
+ * @return IRubyObject array of float
626
+ */
627
+ @JRubyMethod(name = "to_a")
628
+
629
+ public IRubyObject toArray(ThreadContext context) {
630
+ Ruby runtime = context.runtime;
631
+ return RubyArray.newArray(runtime, new IRubyObject[]{
632
+ runtime.newFloat(jx),
633
+ runtime.newFloat(jy)});
634
+ }
635
+
636
+ /**
637
+ *
638
+ * To vertex
639
+ *
640
+ * @param context ThreadContext
641
+ * @param object IRubyObject vertex renderer
642
+ */
643
+ @JRubyMethod(name = "to_vertex")
644
+
645
+ public void toVertex(ThreadContext context, IRubyObject object) {
646
+ JRender renderer = (JRender) object.toJava(JRender.class);
647
+ renderer.vertex(jx, jy);
648
+ }
649
+
650
+ /**
651
+ *
652
+ * To curve vertex
653
+ *
654
+ * @param context ThreadContext
655
+ * @param object IRubyObject vertex renderer
656
+ */
657
+ @JRubyMethod(name = "to_curve_vertex")
658
+
659
+ public void toCurveVertex(ThreadContext context, IRubyObject object) {
660
+ JRender renderer = (JRender) object.toJava(JRender.class);
661
+ renderer.curveVertex(jx, jy);
662
+ }
663
+
664
+ /**
665
+ * For jruby-9000 we alias to inspect
666
+ *
667
+ * @param context ThreadContext
668
+ * @return IRubyObject to_s
669
+ */
670
+ @JRubyMethod(name = {"to_s", "inspect"})
671
+
672
+ public IRubyObject to_s(ThreadContext context) {
673
+ return context.runtime.newString(String.format("Vec2D(x = %4.4f, y = %4.4f)", jx, jy));
674
+ }
675
+
676
+ /**
677
+ *
678
+ * @return hash int
679
+ */
680
+ @Override
681
+ public int hashCode() {
682
+ int hash = 5;
683
+ hash = 53 * hash + (int) (Double.doubleToLongBits(this.jx) ^ (Double.doubleToLongBits(this.jx) >>> 32));
684
+ hash = 53 * hash + (int) (Double.doubleToLongBits(this.jy) ^ (Double.doubleToLongBits(this.jy) >>> 32));
685
+ return hash;
686
+ }
687
+
688
+ /**
689
+ *
690
+ * Java Equals
691
+ *
692
+ * @param obj Object
693
+ * @return result boolean
694
+ */
695
+ @Override
696
+ public boolean equals(Object obj) {
697
+ if (obj == this) {
698
+ return true;
699
+ }
700
+ if (obj instanceof Vec2) {
701
+ final Vec2 other = (Vec2) obj;
702
+ if ((Double.compare(jx, (Double) other.jx) == 0)
703
+ && (Double.compare(jy, (Double) other.jy) == 0)) {
704
+ return true;
705
+ }
706
+ }
707
+ return false;
708
+ }
709
+
710
+ /**
711
+ *
712
+ * @param context ThreadContext
713
+ * @param other IRubyObject
714
+ * @return result IRubyObject as boolean
715
+ */
716
+ @JRubyMethod(name = "eql?", required = 1)
717
+ public IRubyObject eql_p(ThreadContext context, IRubyObject other) {
718
+ Ruby runtime = context.runtime;
719
+ if (other == this) {
720
+ return runtime.newBoolean(true);
721
+ }
722
+ if (other instanceof Vec2) {
723
+ Vec2 v = (Vec2) other.toJava(Vec2.class);
724
+ if ((Double.compare(jx, (Double) v.jx) == 0)
725
+ && (Double.compare(jy, (Double) v.jy) == 0)) {
726
+ return runtime.newBoolean(true);
727
+ }
728
+ }
729
+ return runtime.newBoolean(false);
730
+ }
731
+
732
+ /**
733
+ *
734
+ * @param context ThreadContext
735
+ * @param other IRubyObject
736
+ * @return result IRubyObject as boolean
737
+ */
738
+ @JRubyMethod(name = "==", required = 1)
739
+
740
+ @Override
741
+ public IRubyObject op_equal(ThreadContext context, IRubyObject other) {
742
+ Ruby runtime = context.runtime;
743
+ if (other == this) {
744
+ return runtime.newBoolean(true);
745
+ }
746
+ if (other instanceof Vec2) {
747
+ Vec2 v = (Vec2) other.toJava(Vec2.class);
748
+ double diff = jx - v.jx;
749
+ if ((diff < 0 ? -diff : diff) > Vec2.EPSILON) {
750
+ return runtime.newBoolean(false);
751
+ }
752
+ diff = jy - v.jy;
753
+ return runtime.newBoolean((diff < 0 ? -diff : diff) < Vec2.EPSILON);
754
+ }
755
+ return runtime.newBoolean(false);
756
+ }
757
+ }