propane 0.3.0.pre-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 (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
@@ -0,0 +1,670 @@
1
+ package monkstone.vecmath.vec2;
2
+ /*
3
+ * Copyright (C) 2015-16 Martin Prout
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * http://creativecommons.org/licenses/LGPL/2.1/
11
+ *
12
+ * This library is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with this library; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+ import org.jruby.Ruby;
23
+ import org.jruby.RubyArray;
24
+ import org.jruby.RubyBoolean;
25
+ import org.jruby.RubyClass;
26
+ import org.jruby.RubyObject;
27
+ import org.jruby.anno.JRubyClass;
28
+ import org.jruby.anno.JRubyMethod;
29
+ import org.jruby.runtime.Arity;
30
+ import org.jruby.runtime.Block;
31
+ import org.jruby.runtime.ObjectAllocator;
32
+ import org.jruby.runtime.ThreadContext;
33
+ import org.jruby.runtime.builtin.IRubyObject;
34
+ import monkstone.vecmath.JRender;
35
+
36
+ /**
37
+ *
38
+ * @author Martin Prout
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 = -7013225882277559392L;
45
+ private double jx = 0;
46
+ private double jy = 0;
47
+
48
+ public double javax(){
49
+ return jx;
50
+ }
51
+
52
+ public double javay(){
53
+ return jy;
54
+ }
55
+
56
+ /**
57
+ *
58
+ * @param runtime
59
+ */
60
+ public static void createVec2(final Ruby runtime) {
61
+ RubyClass vec2Cls = runtime.defineClass("Vec2D", runtime.getObject(), new ObjectAllocator() {
62
+ @Override
63
+ public IRubyObject allocate(Ruby runtime, RubyClass rubyClass) {
64
+ return new Vec2(runtime, rubyClass);
65
+ }
66
+ });
67
+ vec2Cls.defineAnnotatedMethods(Vec2.class);
68
+
69
+ }
70
+
71
+ /**
72
+ *
73
+ * @param context
74
+ * @param klazz
75
+ * @param args optional (no args jx = 0, jy = 0)
76
+ * @return new Vec2 object (ruby)
77
+ */
78
+ @JRubyMethod(name = "new", meta = true, rest = true)
79
+ public static final IRubyObject rbNew(ThreadContext context, IRubyObject klazz, IRubyObject[] args) {
80
+ Vec2 vec2 = (Vec2) ((RubyClass) klazz).allocate();
81
+ vec2.init(context, args);
82
+ return vec2;
83
+ }
84
+
85
+ /**
86
+ *
87
+ * @param runtime
88
+ * @param klass
89
+ */
90
+ public Vec2(Ruby runtime, RubyClass klass) {
91
+ super(runtime, klass);
92
+ }
93
+
94
+ void init(ThreadContext context, IRubyObject[] args) {
95
+ if (Arity.checkArgumentCount(context.getRuntime(), args, Arity.OPTIONAL.getValue(), 2) == 2) {
96
+ jx = (Double) args[0].toJava(Double.class);
97
+ jy = (Double) args[1].toJava(Double.class);
98
+ }
99
+ }
100
+
101
+ /**
102
+ *
103
+ * @param context
104
+ * @return jx float
105
+ */
106
+ @JRubyMethod(name = "x")
107
+
108
+ public IRubyObject getX(ThreadContext context) {
109
+ return context.getRuntime().newFloat(jx);
110
+ }
111
+
112
+ /**
113
+ *
114
+ * @param context
115
+ * @return jy float
116
+ */
117
+ @JRubyMethod(name = "y")
118
+
119
+ public IRubyObject getY(ThreadContext context) {
120
+ return context.getRuntime().newFloat(jy);
121
+ }
122
+
123
+ /**
124
+ *
125
+ * @param context
126
+ * @param other
127
+ * @return jx float
128
+ */
129
+ @JRubyMethod(name = "x=")
130
+
131
+ public IRubyObject setX(ThreadContext context, IRubyObject other) {
132
+ jx = (Double) other.toJava(Double.class);
133
+ return other;
134
+ }
135
+
136
+ /**
137
+ *
138
+ * @param context
139
+ * @param other
140
+ * @return jy float
141
+ */
142
+ @JRubyMethod(name = "y=")
143
+
144
+ public IRubyObject setY(ThreadContext context, IRubyObject other) {
145
+ jy = (Double) other.toJava(Double.class);
146
+ return other;
147
+ }
148
+
149
+ /**
150
+ *
151
+ * @param context
152
+ * @param other
153
+ * @return hypotenuse float
154
+ */
155
+ @JRubyMethod(name = "dist", required = 1)
156
+
157
+ public IRubyObject dist(ThreadContext context, IRubyObject other) {
158
+ Vec2 b = null;
159
+ Ruby runtime = context.getRuntime();
160
+ if (other instanceof Vec2) {
161
+ b = (Vec2) other.toJava(Vec2.class);
162
+ } else {
163
+ throw runtime.newTypeError("argument should be Vec2D");
164
+ }
165
+ double result = Math.hypot((jx - b.jx), (jy - b.jy));
166
+ return runtime.newFloat(result);
167
+ }
168
+
169
+ /**
170
+ *
171
+ * @param context
172
+ * @param other
173
+ * @return cross product as a new Vec3D
174
+ */
175
+ @JRubyMethod(name = "cross", required = 1)
176
+
177
+ public IRubyObject cross(ThreadContext context, IRubyObject other) {
178
+ Vec2 b = null;
179
+ Ruby runtime = context.getRuntime();
180
+ if (other instanceof Vec2) {
181
+ b = (Vec2) other.toJava(Vec2.class);
182
+ } else {
183
+ throw runtime.newTypeError("argument should be Vec2D");
184
+ }
185
+ return runtime.newFloat(jx * b.jy - jy * b.jx);
186
+ }
187
+
188
+ /**
189
+ *
190
+ * @param context
191
+ * @param other
192
+ * @return do product as a float
193
+ */
194
+ @JRubyMethod(name = "dot", required = 1)
195
+
196
+ public IRubyObject dot(ThreadContext context, IRubyObject other) {
197
+ Vec2 b = null;
198
+ Ruby runtime = context.getRuntime();
199
+ if (other instanceof Vec2) {
200
+ b = (Vec2) other.toJava(Vec2.class);
201
+ } else {
202
+ throw runtime.newTypeError("argument should be Vec2D");
203
+ }
204
+ return runtime.newFloat(jx * b.jx + jy * b.jy);
205
+ }
206
+
207
+ /**
208
+ *
209
+ * @param context
210
+ * @param other
211
+ * @return new Vec2 object (ruby)
212
+ */
213
+ @JRubyMethod(name = "+", required = 1)
214
+
215
+ public IRubyObject op_plus(ThreadContext context, IRubyObject other) {
216
+ Vec2 b = null;
217
+ Ruby runtime = context.getRuntime();
218
+ if (other instanceof Vec2) {
219
+ b = (Vec2) other.toJava(Vec2.class);
220
+ } else {
221
+ throw runtime.newTypeError("argument should be Vec2D");
222
+ }
223
+ return Vec2.rbNew(context, other.getMetaClass(), new IRubyObject[]{
224
+ runtime.newFloat(jx + b.jx),
225
+ runtime.newFloat(jy + b.jy)});
226
+ }
227
+
228
+ /**
229
+ *
230
+ * @param context
231
+ * @param other
232
+ * @return new Vec2 object (ruby)
233
+ */
234
+ @JRubyMethod(name = "-", required = 1)
235
+
236
+ public IRubyObject op_minus(ThreadContext context, IRubyObject other) {
237
+ Vec2 b = null;
238
+ Ruby runtime = context.getRuntime();
239
+ if (other instanceof Vec2) {
240
+ b = (Vec2) other.toJava(Vec2.class);
241
+ } else {
242
+ throw runtime.newTypeError("argument should be Vec2D");
243
+ }
244
+ return Vec2.rbNew(context, other.getMetaClass(), new IRubyObject[]{
245
+ runtime.newFloat(jx - b.jx),
246
+ runtime.newFloat(jy - b.jy)});
247
+ }
248
+
249
+ /**
250
+ *
251
+ * @param context
252
+ * @param other
253
+ * @return new Vec2 object (ruby)
254
+ */
255
+ @JRubyMethod(name = "*")
256
+
257
+ public IRubyObject op_mul(ThreadContext context, IRubyObject other) {
258
+ Ruby runtime = context.getRuntime();
259
+ double scalar = (Double) other.toJava(Double.class);
260
+ return Vec2.rbNew(context, this.getMetaClass(),
261
+ new IRubyObject[]{runtime.newFloat(jx * scalar),
262
+ runtime.newFloat(jy * scalar)});
263
+ }
264
+
265
+ /**
266
+ *
267
+ * @param context
268
+ * @param other
269
+ * @return new Vec2 object (ruby)
270
+ */
271
+ @JRubyMethod(name = "/", required = 1)
272
+
273
+ public IRubyObject op_div(ThreadContext context, IRubyObject other) {
274
+ Ruby runtime = context.getRuntime();
275
+ double scalar = (Double) other.toJava(Double.class);
276
+ if (Math.abs(scalar) < Vec2.EPSILON) {
277
+ return this;
278
+ }
279
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
280
+ runtime.newFloat(jx / scalar),
281
+ runtime.newFloat(jy / scalar)});
282
+ }
283
+
284
+ /**
285
+ *
286
+ * @param context
287
+ * @return angle radians as a float
288
+ */
289
+ @JRubyMethod(name = "heading")
290
+ public IRubyObject heading(ThreadContext context) {
291
+ return context.getRuntime().newFloat(Math.atan2(jy, jx));
292
+ }
293
+
294
+ /**
295
+ *
296
+ * @param context
297
+ * @return magnitude float
298
+ */
299
+ @JRubyMethod(name = "mag")
300
+
301
+ public IRubyObject mag(ThreadContext context) {
302
+ double result = 0;
303
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
304
+ result = Math.hypot(jx, jy);
305
+ }
306
+ else{
307
+ if (Math.abs(jy) > EPSILON) {
308
+ result = Math.abs(jy);
309
+ }
310
+ if (Math.abs(jx) > EPSILON) {
311
+ result = Math.abs(jx);
312
+ }
313
+ }
314
+ return context.getRuntime().newFloat(result);
315
+ }
316
+
317
+ /**
318
+ * Call yield if block given, do nothing if yield == false else set_mag to
319
+ * given scalar
320
+ *
321
+ * @param context
322
+ * @param scalar double value to set
323
+ * @param block should return a boolean (optional)
324
+ * @return this Vec2D with the new magnitude
325
+ */
326
+ @JRubyMethod(name = "set_mag")
327
+
328
+ public IRubyObject set_mag(ThreadContext context, IRubyObject scalar, Block block) {
329
+ double new_mag = (Double) scalar.toJava(Double.class);
330
+ if (block.isGiven()) {
331
+ if (!(boolean) block.yield(context, scalar).toJava(Boolean.class)) {
332
+ return this;
333
+ }
334
+ }
335
+ double current = 0;
336
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
337
+ current = Math.hypot(jx, jy);
338
+ }
339
+ else{
340
+ if (Math.abs(jy) > EPSILON) {
341
+ current = Math.abs(jy);
342
+ }
343
+ if (Math.abs(jx) > EPSILON) {
344
+ current = Math.abs(jx);
345
+ }
346
+ }
347
+ if (current > 0) {
348
+ jx *= new_mag / current;
349
+ jy *= new_mag / current;
350
+ }
351
+ return this;
352
+ }
353
+
354
+ /**
355
+ *
356
+ * @param context
357
+ * @return this as a ruby object
358
+ */
359
+ @JRubyMethod(name = "normalize!")
360
+
361
+ public IRubyObject normalize_bang(ThreadContext context) {
362
+ double mag = 0;
363
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
364
+ mag = Math.hypot(jx, jy);
365
+ }
366
+ else{
367
+ if (Math.abs(jx) > EPSILON) {
368
+ mag = Math.abs(jx);
369
+ }
370
+ if (Math.abs(jy) > EPSILON) {
371
+ mag = Math.abs(jy);
372
+ }
373
+ }
374
+ if (mag > 0) {
375
+ jx /= mag;
376
+ jy /= mag;
377
+ }
378
+ return this;
379
+ }
380
+
381
+ /**
382
+ *
383
+ * @param context
384
+ * @return new Vec2 object (ruby)
385
+ */
386
+ @JRubyMethod(name = "normalize")
387
+
388
+ public IRubyObject normalize(ThreadContext context) {
389
+ double mag = 0;
390
+ Ruby runtime = context.getRuntime();
391
+ if (Math.abs(jx) > EPSILON && Math.abs(jy) > EPSILON) {
392
+ mag = Math.hypot(jx, jy);
393
+ }
394
+ else{
395
+ if (Math.abs(jx) > EPSILON) {
396
+ mag = jx;
397
+ }
398
+ if (Math.abs(jy) > EPSILON) {
399
+ mag = jy;
400
+ }
401
+ }
402
+ if (mag < EPSILON) {
403
+ mag = 1.0;
404
+ }
405
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
406
+ runtime.newFloat(jx / mag),
407
+ runtime.newFloat(jy / mag)});
408
+ }
409
+
410
+ /**
411
+ * Example of a regular ruby class method Use Math rather than RadLut
412
+ * here!!!
413
+ *
414
+ * @param context
415
+ * @param klazz
416
+ * @param other input angle in radians
417
+ * @return new Vec2 object (ruby)
418
+ */
419
+ @JRubyMethod(name = "from_angle", meta = true)
420
+ public static IRubyObject from_angle(ThreadContext context, IRubyObject klazz, IRubyObject other) {
421
+ Ruby runtime = context.getRuntime();
422
+ double scalar = (Double) other.toJava(Double.class);
423
+ return Vec2.rbNew(context, klazz, new IRubyObject[]{
424
+ runtime.newFloat(Math.cos(scalar)),
425
+ runtime.newFloat(Math.sin(scalar))});
426
+ }
427
+
428
+ /**
429
+ *
430
+ * @param context
431
+ * @param other
432
+ * @return this Vec2 object rotated
433
+ */
434
+ @JRubyMethod(name = "rotate!")
435
+ public IRubyObject rotate_bang(ThreadContext context, IRubyObject other) {
436
+ double theta = (Double) other.toJava(Double.class);
437
+ double x = (jx * Math.cos(theta) - jy * Math.sin(theta));
438
+ double y = (jx * Math.sin(theta) + jy * Math.cos(theta));
439
+ jx = x;
440
+ jy = y;
441
+ return this;
442
+ }
443
+
444
+
445
+
446
+ /**
447
+ *
448
+ * @param context
449
+ * @param other
450
+ * @return a new Vec2 object rotated
451
+ */
452
+ @JRubyMethod(name = "rotate")
453
+ public IRubyObject rotate(ThreadContext context, IRubyObject other) {
454
+ Ruby runtime = context.getRuntime();
455
+ double theta = (Double) other.toJava(Double.class);
456
+ IRubyObject[] ary = new IRubyObject[]{
457
+ runtime.newFloat(jx * Math.cos(theta) - jy * Math.sin(theta)),
458
+ runtime.newFloat(jx * Math.sin(theta) + jy * Math.cos(theta))};
459
+ return Vec2.rbNew(context, this.getMetaClass(), ary);
460
+ }
461
+
462
+ /**
463
+ *
464
+ * @param context
465
+ * @param args
466
+ * @return as a new Vec2 object (ruby)
467
+ */
468
+ @JRubyMethod(name = "lerp", rest = true)
469
+ public IRubyObject lerp(ThreadContext context, IRubyObject[] args) {
470
+ Ruby runtime = context.getRuntime();
471
+ Arity.checkArgumentCount(runtime, args, 2, 2);
472
+ Vec2 vec = (Vec2) args[0].toJava(Vec2.class);
473
+ double scalar = (Double) args[1].toJava(Double.class);
474
+ assert (scalar >= 0 && scalar < 1.0) :
475
+ "Lerp value " + scalar + " out of range 0 .. 1.0";
476
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
477
+ runtime.newFloat(jx + (vec.jx - jx) * scalar),
478
+ runtime.newFloat(jy + (vec.jy - jy) * scalar)});
479
+ }
480
+
481
+ /**
482
+ *
483
+ * @param context
484
+ * @param args
485
+ * @return this
486
+ */
487
+ @JRubyMethod(name = "lerp!", rest = true)
488
+ public IRubyObject lerp_bang(ThreadContext context, IRubyObject[] args) {
489
+ Arity.checkArgumentCount(context.getRuntime(), args, 2, 2);
490
+ Vec2 vec = (Vec2) args[0].toJava(Vec2.class);
491
+ double scalar = (Double) args[1].toJava(Double.class);
492
+ assert (scalar >= 0 && scalar < 1.0) :
493
+ "Lerp value " + scalar + " out of range 0 .. 1.0";
494
+ jx += (vec.jx - jx) * scalar;
495
+ jy += (vec.jy - jy) * scalar;
496
+ return this;
497
+ }
498
+
499
+ /**
500
+ *
501
+ * @param context
502
+ * @param other
503
+ * @return theta radians float
504
+ */
505
+ @JRubyMethod(name = "angle_between")
506
+
507
+ public IRubyObject angleBetween(ThreadContext context, IRubyObject other) {
508
+ Vec2 vec = null;
509
+ Ruby runtime = context.getRuntime();
510
+ if (other instanceof Vec2) {
511
+ vec = (Vec2) other.toJava(Vec2.class);
512
+ } else {
513
+ throw runtime.newTypeError("argument should be Vec2D");
514
+ }
515
+ return runtime.newFloat(Math.atan2(jx - vec.jx, jy - vec.jy));
516
+ }
517
+
518
+ /**
519
+ * Example of a regular ruby class method Use Math rather than RadLut
520
+ * here!!!
521
+ *
522
+ * @param context
523
+ * @param klazz
524
+ * @return new Vec2 object (ruby)
525
+ */
526
+ @JRubyMethod(name = "random", meta = true)
527
+ public static IRubyObject random_direction(ThreadContext context, IRubyObject klazz) {
528
+ Ruby runtime = context.getRuntime();
529
+ double angle = Math.random() * Math.PI * 2;
530
+ return Vec2.rbNew(context, klazz, new IRubyObject[]{
531
+ runtime.newFloat(Math.cos(angle)),
532
+ runtime.newFloat(Math.sin(angle))});
533
+ }
534
+
535
+ /**
536
+ *
537
+ * @param context
538
+ * @return new copy
539
+ */
540
+ @JRubyMethod(name = {"copy", "dup"})
541
+
542
+ public IRubyObject copy(ThreadContext context) {
543
+ Ruby runtime = context.runtime;
544
+ return Vec2.rbNew(context, this.getMetaClass(), new IRubyObject[]{
545
+ runtime.newFloat(jx),
546
+ runtime.newFloat(jy)});
547
+ }
548
+
549
+ /**
550
+ *
551
+ * @param context
552
+ * @return ruby array
553
+ */
554
+ @JRubyMethod(name = "to_a")
555
+
556
+ public IRubyObject toArray(ThreadContext context) {
557
+ Ruby runtime = context.runtime;
558
+ return RubyArray.newArray(context.getRuntime(), new IRubyObject[]{
559
+ runtime.newFloat(jx),
560
+ runtime.newFloat(jy)});
561
+ }
562
+
563
+ /**
564
+ *
565
+ * @param context
566
+ * @param object
567
+ */
568
+ @JRubyMethod(name = "to_vertex")
569
+
570
+ public void toVertex(ThreadContext context, IRubyObject object) {
571
+ JRender renderer = (JRender) object.toJava(JRender.class);
572
+ renderer.vertex(jx, jy);
573
+ }
574
+
575
+ /**
576
+ *
577
+ * @param context
578
+ * @param object
579
+ */
580
+ @JRubyMethod(name = "to_curve_vertex")
581
+
582
+ public void toCurveVertex(ThreadContext context, IRubyObject object) {
583
+ JRender renderer = (JRender) object.toJava(JRender.class);
584
+ renderer.curveVertex(jx, jy);
585
+ }
586
+
587
+
588
+ /**
589
+ * For jruby-9000 we alias to inspect
590
+ * @param context
591
+ * @return custom to string (inspect)
592
+ */
593
+ @JRubyMethod(name = {"to_s", "inspect"})
594
+
595
+ public IRubyObject to_s(ThreadContext context) {
596
+ return context.getRuntime().newString(String.format("Vec2D(x = %4.4f, y = %4.4f)", jx, jy));
597
+ }
598
+
599
+ /**
600
+ *
601
+ * @return hash int
602
+ */
603
+ @Override
604
+ public int hashCode() {
605
+ int hash = 5;
606
+ hash = 53 * hash + (int) (Double.doubleToLongBits(this.jx) ^ (Double.doubleToLongBits(this.jx) >>> 32));
607
+ hash = 53 * hash + (int) (Double.doubleToLongBits(this.jy) ^ (Double.doubleToLongBits(this.jy) >>> 32));
608
+ return hash;
609
+ }
610
+
611
+ /**
612
+ *
613
+ * @param obj
614
+ * @return ruby boolean
615
+ */
616
+ @Override
617
+ public boolean equals(Object obj) {
618
+ if (obj instanceof Vec2){
619
+ final Vec2 other = (Vec2) obj;
620
+ if (!((Double)this.jx).equals(other.jx)) {
621
+ return false;
622
+ }
623
+ return ((Double)this.jy).equals(other.jy);
624
+ }
625
+ return false;
626
+ }
627
+
628
+ /**
629
+ *
630
+ * @param context
631
+ * @param other
632
+ * @return ruby boolean
633
+ */
634
+ @JRubyMethod(name = "eql?", required = 1)
635
+ public IRubyObject eql_p(ThreadContext context, IRubyObject other) {
636
+ Ruby runtime = context.getRuntime();
637
+ if (other instanceof Vec2){
638
+ Vec2 v = (Vec2) other.toJava(Vec2.class);
639
+ if (!((Double)this.jx).equals(v.jx)) {
640
+ return RubyBoolean.newBoolean(runtime, false);
641
+ }
642
+ return RubyBoolean.newBoolean(runtime, ((Double)this.jy).equals(v.jy));
643
+ }
644
+ return RubyBoolean.newBoolean(runtime, false);
645
+ }
646
+
647
+ /**
648
+ *
649
+ * @param context
650
+ * @param other
651
+ * @return ruby boolean
652
+ */
653
+ @JRubyMethod(name = "==", required = 1)
654
+
655
+ @Override
656
+ public IRubyObject op_equal(ThreadContext context, IRubyObject other) {
657
+ Ruby runtime = context.getRuntime();
658
+ if (other instanceof Vec2) {
659
+ Vec2 v = (Vec2) other.toJava(Vec2.class);
660
+ double diff = jx - v.jx;
661
+ if ((diff < 0 ? -diff : diff) > Vec2.EPSILON) {
662
+ return RubyBoolean.newBoolean(runtime, false);
663
+ }
664
+ diff = jy - v.jy;
665
+ boolean result = ((diff < 0 ? -diff : diff) < Vec2.EPSILON);
666
+ return RubyBoolean.newBoolean(runtime, result);
667
+ }
668
+ return RubyBoolean.newBoolean(runtime, false);
669
+ }
670
+ }