picrate 1.3.0-java → 2.0.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/.mvn/extensions.xml +1 -1
  3. data/.mvn/wrapper/maven-wrapper.properties +2 -2
  4. data/CHANGELOG.md +2 -1
  5. data/Gemfile +3 -1
  6. data/README.md +4 -2
  7. data/Rakefile +8 -4
  8. data/bin/picrate +3 -1
  9. data/docs/_posts/2019-11-11-getting_started_buster.md +1 -1
  10. data/lib/picrate.rb +1 -1
  11. data/lib/picrate/app.rb +10 -3
  12. data/lib/picrate/creators/parameters.rb +8 -8
  13. data/lib/picrate/creators/sketch_factory.rb +5 -3
  14. data/lib/picrate/helper_methods.rb +21 -21
  15. data/lib/picrate/helpers/numeric.rb +2 -0
  16. data/lib/picrate/library.rb +5 -1
  17. data/lib/picrate/library_loader.rb +2 -0
  18. data/lib/picrate/native_folder.rb +6 -4
  19. data/lib/picrate/native_loader.rb +3 -0
  20. data/lib/picrate/runner.rb +1 -0
  21. data/lib/picrate/version.rb +1 -1
  22. data/library/boids/boids.rb +17 -8
  23. data/library/chooser/chooser.rb +10 -9
  24. data/library/color_group/color_group.rb +2 -0
  25. data/library/control_panel/control_panel.rb +7 -4
  26. data/library/dxf/dxf.rb +2 -0
  27. data/library/library_proxy/library_proxy.rb +2 -0
  28. data/library/net/net.rb +2 -0
  29. data/library/slider/slider.rb +24 -23
  30. data/library/vector_utils/vector_utils.rb +4 -0
  31. data/library/video_event/video_event.rb +2 -0
  32. data/picrate.gemspec +14 -12
  33. data/pom.rb +15 -15
  34. data/pom.xml +5 -5
  35. data/src/main/java/monkstone/ColorUtil.java +1 -1
  36. data/src/main/java/monkstone/MathToolModule.java +1 -1
  37. data/src/main/java/monkstone/PicrateLibrary.java +8 -8
  38. data/src/main/java/monkstone/fastmath/Deglut.java +16 -16
  39. data/src/main/java/monkstone/filechooser/Chooser.java +1 -1
  40. data/src/main/java/monkstone/noise/SimplexNoise.java +3 -3
  41. data/src/main/java/monkstone/slider/CustomHorizontalSlider.java +1 -1
  42. data/src/main/java/monkstone/slider/CustomVerticalSlider.java +1 -1
  43. data/src/main/java/monkstone/slider/SimpleHorizontalSlider.java +12 -12
  44. data/src/main/java/monkstone/slider/SimpleVerticalSlider.java +1 -1
  45. data/src/main/java/monkstone/slider/SliderBar.java +1 -1
  46. data/src/main/java/monkstone/slider/SliderGroup.java +1 -1
  47. data/src/main/java/monkstone/slider/WheelHandler.java +1 -1
  48. data/src/main/java/monkstone/vecmath/package-info.java +1 -1
  49. data/src/main/java/monkstone/vecmath/vec2/Vec2.java +1 -1
  50. data/src/main/java/monkstone/vecmath/vec3/Vec3.java +1 -1
  51. data/src/main/java/monkstone/videoevent/CaptureEvent.java +1 -1
  52. data/src/main/java/monkstone/videoevent/MovieEvent.java +1 -1
  53. data/src/main/java/monkstone/videoevent/package-info.java +1 -1
  54. data/src/main/java/processing/awt/PGraphicsJava2D.java +11 -13
  55. data/src/main/java/processing/awt/PSurfaceAWT.java +0 -20
  56. data/src/main/java/processing/core/PApplet.java +1949 -2247
  57. data/src/main/java/processing/core/PConstants.java +180 -180
  58. data/src/main/java/processing/core/PFont.java +2 -2
  59. data/src/main/java/processing/core/PGraphics.java +90 -90
  60. data/src/main/java/processing/core/PImage.java +65 -65
  61. data/src/main/java/processing/core/PMatrix.java +39 -39
  62. data/src/main/java/processing/core/PSurface.java +37 -37
  63. data/src/main/java/processing/core/PVector.java +2 -2
  64. data/src/main/java/processing/data/FloatDict.java +251 -284
  65. data/src/main/java/processing/data/TableRow.java +32 -32
  66. data/src/main/java/processing/dxf/RawDXF.java +3 -3
  67. data/src/main/java/processing/net/Client.java +1 -1
  68. data/src/main/java/processing/opengl/PGL.java +3884 -3950
  69. data/src/main/java/processing/opengl/PGraphicsOpenGL.java +38 -21
  70. data/src/main/java/processing/opengl/PSurfaceJOGL.java +42 -61
  71. data/test/color_group_test.rb +4 -4
  72. data/test/deglut_spec_test.rb +2 -0
  73. data/test/helper_methods_test.rb +41 -13
  74. data/test/math_tool_test.rb +46 -37
  75. data/test/respond_to_test.rb +5 -3
  76. data/test/sketches/key_event.rb +2 -2
  77. data/test/sketches/library/my_library/my_library.rb +3 -0
  78. data/test/test_helper.rb +2 -0
  79. data/test/vecmath_spec_test.rb +30 -19
  80. data/vendors/Rakefile +2 -2
  81. metadata +29 -17
@@ -3651,7 +3651,7 @@ public class PGraphicsOpenGL extends PGraphics {
3651
3651
  * Ported from the implementation of textCharShapeImpl() in 1.5.1
3652
3652
  *
3653
3653
  * <EM>No attempt has been made to optimize this code</EM>
3654
- *
3654
+ *
3655
3655
  * TODO: Implement a FontShape class where each glyph is tessellated and
3656
3656
  * stored inside a larger PShapeOpenGL object (which needs to be expanded as
3657
3657
  * new glyphs are added and exceed the initial capacity in a similar way as
@@ -3659,18 +3659,18 @@ public class PGraphicsOpenGL extends PGraphics {
3659
3659
  * in shape mode, then the correct sequences of vertex indices are computed
3660
3660
  * (akin to the texcoords in the texture case) and used to draw only those
3661
3661
  * parts of the PShape object that are required for the text.
3662
- *
3662
+ *
3663
3663
  *
3664
3664
  * Some issues of the original implementation probably remain, so they are
3665
3665
  * reproduced below:
3666
- *
3666
+ *
3667
3667
  * Also a problem where some fonts seem to be a bit slight, as if the
3668
3668
  * control points aren't being mapped quite correctly. Probably doing
3669
3669
  * something dumb that the control points don't map to P5's control
3670
3670
  * points. Perhaps it's returning b-spline data from the TrueType font?
3671
3671
  * Though it seems like that would make a lot of garbage rather than
3672
3672
  * just a little flattening.
3673
- *
3673
+ *
3674
3674
  * There also seems to be a bug that is causing a line (but not a filled
3675
3675
  * triangle) back to the origin on some letters (i.e. a capital L when
3676
3676
  * tested with Akzidenz Grotesk Light). But this won't be visible
@@ -5352,7 +5352,7 @@ public class PGraphicsOpenGL extends PGraphics {
5352
5352
  // showWarning() and showException() available from PGraphics.
5353
5353
 
5354
5354
  /**
5355
- * Report on anything from glError().Don't use this inside glBegin/glEnd
5355
+ * Report on anything from glError().Don't use this inside glBegin/glEnd
5356
5356
  * otherwise it'll throw an GL_INVALID_OPERATION error.
5357
5357
  * @param where
5358
5358
  */
@@ -6366,11 +6366,11 @@ public class PGraphicsOpenGL extends PGraphics {
6366
6366
 
6367
6367
 
6368
6368
  /**
6369
- * Not an approved function, this will change or be removed in the future.This
6370
- * utility method returns the texture associated to the renderer's. drawing
6371
- * surface, making sure is updated to reflect the current contents off the
6369
+ * Not an approved function, this will change or be removed in the future.This
6370
+ * utility method returns the texture associated to the renderer's. drawing
6371
+ * surface, making sure is updated to reflect the current contents off the
6372
6372
  * screen (or offscreen drawing surface).
6373
- * @return
6373
+ * @return
6374
6374
  */
6375
6375
  public Texture getTexture() {
6376
6376
  return getTexture(true);
@@ -6380,7 +6380,7 @@ public class PGraphicsOpenGL extends PGraphics {
6380
6380
  /**
6381
6381
  * Not an approved function either, don't use it.
6382
6382
  * @param load
6383
- * @return
6383
+ * @return
6384
6384
  */
6385
6385
  public Texture getTexture(boolean load) {
6386
6386
  if (load) loadTexture();
@@ -6393,7 +6393,7 @@ public class PGraphicsOpenGL extends PGraphics {
6393
6393
  * creating and/or updating it if needed.
6394
6394
  *
6395
6395
  * @param img the image to have a texture metadata associated to it
6396
- * @return
6396
+ * @return
6397
6397
  */
6398
6398
  public Texture getTexture(PImage img) {
6399
6399
  Texture tex = (Texture)initCache(img);
@@ -6419,7 +6419,7 @@ public class PGraphicsOpenGL extends PGraphics {
6419
6419
  /**
6420
6420
  * Not an approved function, test its use in libraries to grab the FB objects
6421
6421
  * for offscreen PGraphics.
6422
- * @return
6422
+ * @return
6423
6423
  */
6424
6424
  public FrameBuffer getFrameBuffer() {
6425
6425
  return getFrameBuffer(false);
@@ -6478,7 +6478,7 @@ public class PGraphicsOpenGL extends PGraphics {
6478
6478
  * This utility method creates a texture for the provided image, and adds it
6479
6479
  * to the metadata cache of the image.
6480
6480
  * @param img the image to have a texture metadata associated to it
6481
- * @return
6481
+ * @return
6482
6482
  */
6483
6483
  protected Texture addTexture(PImage img) {
6484
6484
  Texture.Parameters params =
@@ -6892,6 +6892,7 @@ public class PGraphicsOpenGL extends PGraphics {
6892
6892
  OPENGL_VERSION = pgl.getString(PGL.VERSION);
6893
6893
  OPENGL_EXTENSIONS = pgl.getString(PGL.EXTENSIONS);
6894
6894
  GLSL_VERSION = pgl.getString(PGL.SHADING_LANGUAGE_VERSION);
6895
+
6895
6896
  npotTexSupported = pgl.hasNpotTexSupport();
6896
6897
  autoMipmapGenSupported = pgl.hasAutoMipmapGenSupport();
6897
6898
  fboMultisampleSupported = pgl.hasFboMultisampleSupport();
@@ -6899,28 +6900,45 @@ public class PGraphicsOpenGL extends PGraphics {
6899
6900
  anisoSamplingSupported = pgl.hasAnisoSamplingSupport();
6900
6901
  readBufferSupported = pgl.hasReadBuffer();
6901
6902
  drawBufferSupported = pgl.hasDrawBuffer();
6903
+
6902
6904
  try {
6903
6905
  pgl.blendEquation(PGL.FUNC_ADD);
6904
6906
  blendEqSupported = true;
6905
6907
  } catch (Exception e) {
6906
6908
  blendEqSupported = false;
6907
6909
  }
6910
+
6908
6911
  depthBits = pgl.getDepthBits();
6909
6912
  stencilBits = pgl.getStencilBits();
6913
+
6910
6914
  pgl.getIntegerv(PGL.MAX_TEXTURE_SIZE, intBuffer);
6911
6915
  maxTextureSize = intBuffer.get(0);
6912
- pgl.getIntegerv(PGL.MAX_SAMPLES, intBuffer);
6913
- maxSamples = intBuffer.get(0);
6916
+
6917
+ // work around runtime exceptions in Broadcom's VC IV driver
6918
+ if (false == OPENGL_RENDERER.equals("VideoCore IV HW")) {
6919
+ pgl.getIntegerv(PGL.MAX_SAMPLES, intBuffer);
6920
+ maxSamples = intBuffer.get(0);
6921
+ }
6922
+
6914
6923
  if (anisoSamplingSupported) {
6915
6924
  pgl.getFloatv(PGL.MAX_TEXTURE_MAX_ANISOTROPY, floatBuffer);
6916
6925
  maxAnisoAmount = floatBuffer.get(0);
6917
6926
  }
6918
- // Broadcom's binary drivers for Raspberry Pi don't work with PiCrate in Buster
6919
- if (OPENGL_RENDERER.equals("VideoCore IV HW")) {
6920
- pgl.dispose();
6921
- System.out.println("Use FakeKMS or FullKMS video driver for P2D and P3D sketches");
6922
- super.dispose();
6927
+
6928
+ // overwrite the default shaders with vendor specific versions
6929
+ // if needed
6930
+ if (OPENGL_RENDERER.equals("VideoCore IV HW")) { // Broadcom's binary driver for Raspberry Pi
6931
+ defLightShaderVertURL =
6932
+ PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/LightVert-brcm.glsl");
6933
+ defTexlightShaderVertURL =
6934
+ PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/TexLightVert-brcm.glsl");
6935
+ } else if (OPENGL_RENDERER.contains("VC4")) { // Mesa driver for same hardware
6936
+ defLightShaderVertURL =
6937
+ PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/LightVert-vc4.glsl");
6938
+ defTexlightShaderVertURL =
6939
+ PGraphicsOpenGL.class.getResource("/processing/opengl/shaders/TexLightVert-vc4.glsl");
6923
6940
  }
6941
+
6924
6942
  glParamsRead = true;
6925
6943
  }
6926
6944
 
@@ -13142,7 +13160,6 @@ public class PGraphicsOpenGL extends PGraphics {
13142
13160
  else if (type == PGL.TRIANGLES) primitive = TRIANGLES;
13143
13161
  }
13144
13162
 
13145
- @Override
13146
13163
  public void end() {
13147
13164
  if (PGL.MAX_VERTEX_INDEX1 <= vertFirst + vertCount) {
13148
13165
  // We need a new index block for the new batch of
@@ -438,21 +438,6 @@ public class PSurfaceJOGL implements PSurface {
438
438
  *
439
439
  */
440
440
  protected void initAnimator() {
441
- if (PApplet.platform == PConstants.WINDOWS) {
442
- // Force Windows to keep timer resolution high by
443
- // sleeping for time which is not a multiple of 10 ms.
444
- // See section "Clocks and Timers on Windows":
445
- // https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks
446
- Thread highResTimerThread = new Thread(() -> {
447
- try {
448
- Thread.sleep(Long.MAX_VALUE);
449
- } catch (InterruptedException ignore) {
450
- }
451
- }, "HighResTimerThread");
452
- highResTimerThread.setDaemon(true);
453
- highResTimerThread.start();
454
- }
455
-
456
441
  animator = new FPSAnimator(window, 60);
457
442
  drawException = null;
458
443
  animator.setUncaughtExceptionHandler((final GLAnimatorControl animator1, final GLAutoDrawable drawable, final Throwable cause) -> {
@@ -462,34 +447,31 @@ public class PSurfaceJOGL implements PSurface {
462
447
  }
463
448
  });
464
449
 
465
- drawExceptionHandler = new Thread(new Runnable() {
466
- @Override
467
- public void run() {
468
- synchronized (drawExceptionMutex) {
469
- try {
470
- while (drawException == null) {
471
- drawExceptionMutex.wait();
472
- }
473
- // System.err.println("Caught exception: " + drawException.getMessage());
474
- if (drawException != null) {
475
- Throwable cause = drawException.getCause();
476
- if (cause instanceof ThreadDeath) {
477
- // System.out.println("caught ThreadDeath");
478
- // throw (ThreadDeath)cause;
479
- } else if (cause instanceof RuntimeException) {
480
- throw (RuntimeException) cause;
481
- } else if (cause instanceof UnsatisfiedLinkError) {
482
- throw new UnsatisfiedLinkError(cause.getMessage());
483
- } else if (cause == null) {
484
- throw new RuntimeException(drawException.getMessage());
485
- } else {
486
- throw new RuntimeException(cause);
487
- }
488
- }
489
- } catch (InterruptedException e) {
490
- }
450
+ drawExceptionHandler = new Thread(() -> {
451
+ synchronized (drawExceptionMutex) {
452
+ try {
453
+ while (drawException == null) {
454
+ drawExceptionMutex.wait();
455
+ }
456
+ // System.err.println("Caught exception: " + drawException.getMessage());
457
+ if (drawException != null) {
458
+ Throwable cause = drawException.getCause();
459
+ if (cause instanceof ThreadDeath) {
460
+ // System.out.println("caught ThreadDeath");
461
+ // throw (ThreadDeath)cause;
462
+ } else if (cause instanceof RuntimeException) {
463
+ throw (RuntimeException) cause;
464
+ } else if (cause instanceof UnsatisfiedLinkError) {
465
+ throw new UnsatisfiedLinkError(cause.getMessage());
466
+ } else if (cause == null) {
467
+ throw new RuntimeException(drawException.getMessage());
468
+ } else {
469
+ throw new RuntimeException(cause);
491
470
  }
471
+ }
472
+ } catch (InterruptedException e) {
492
473
  }
474
+ }
493
475
  });
494
476
  drawExceptionHandler.start();
495
477
  }
@@ -532,7 +514,7 @@ public class PSurfaceJOGL implements PSurface {
532
514
  *
533
515
  */
534
516
  protected void initIcons() {
535
- IOUtil.ClassResources res = null;
517
+ IOUtil.ClassResources res;
536
518
  if (PJOGL.icons == null || PJOGL.icons.length == 0) {
537
519
  // Default Processing icons
538
520
  final int[] sizes = {16, 32, 48, 64, 128, 256, 512};
@@ -560,7 +542,7 @@ public class PSurfaceJOGL implements PSurface {
560
542
  @SuppressWarnings("resource")
561
543
  private String resourceFilename(String filename) {
562
544
  // The code below comes from PApplet.createInputRaw() with a few adaptations
563
- InputStream stream = null;
545
+ InputStream stream;
564
546
  try {
565
547
  // First see if it's in a data folder. This may fail by throwing
566
548
  // a SecurityException. If so, this whole block will be skipped.
@@ -592,10 +574,10 @@ public class PSurfaceJOGL implements PSurface {
592
574
  }
593
575
 
594
576
  stream = new FileInputStream(file);
595
- if (stream != null) {
577
+ // if (stream != null) {
596
578
  stream.close();
597
579
  return file.getCanonicalPath();
598
- }
580
+ // }
599
581
 
600
582
  // have to break these out because a general Exception might
601
583
  // catch the RuntimeException being thrown above
@@ -641,29 +623,29 @@ public class PSurfaceJOGL implements PSurface {
641
623
  try {
642
624
  String path = sketch.dataPath(filename);
643
625
  stream = new FileInputStream(path);
644
- if (stream != null) {
626
+ // if (stream != null) {
645
627
  stream.close();
646
628
  return path;
647
- }
629
+ // }
648
630
  } catch (IOException e2) {
649
631
  }
650
632
 
651
633
  try {
652
634
  String path = sketch.sketchPath(filename);
653
635
  stream = new FileInputStream(path);
654
- if (stream != null) {
636
+ //if (stream != null) {
655
637
  stream.close();
656
638
  return path;
657
- }
639
+ // }
658
640
  } catch (IOException e) {
659
641
  } // ignored
660
642
 
661
643
  try {
662
644
  stream = new FileInputStream(filename);
663
- if (stream != null) {
645
+ // if (stream != null) {
664
646
  stream.close();
665
647
  return filename;
666
- }
648
+ // }
667
649
  } catch (IOException e1) {
668
650
  }
669
651
 
@@ -1389,16 +1371,15 @@ public class PSurfaceJOGL implements PSurface {
1389
1371
  }
1390
1372
 
1391
1373
  static Map<Integer, CursorInfo> cursors = new HashMap<>();
1392
- static Map<Integer, String> cursorNames = new HashMap<>();
1393
-
1394
- static {
1395
- cursorNames.put(PConstants.ARROW, "arrow");
1396
- cursorNames.put(PConstants.CROSS, "cross");
1397
- cursorNames.put(PConstants.WAIT, "wait");
1398
- cursorNames.put(PConstants.MOVE, "move");
1399
- cursorNames.put(PConstants.HAND, "hand");
1400
- cursorNames.put(PConstants.TEXT, "text");
1401
- }
1374
+ static Map<Integer, String> cursorNames = Map.of(
1375
+ PConstants.ARROW, "arrow",
1376
+ PConstants.CROSS, "cross",
1377
+ PConstants.WAIT, "wait",
1378
+ PConstants.MOVE, "move",
1379
+ PConstants.HAND, "hand",
1380
+ PConstants.TEXT, "text"
1381
+ );
1382
+
1402
1383
 
1403
1384
  @Override
1404
1385
  public void setCursor(int kind) {
@@ -9,21 +9,21 @@ java_import Java::Monkstone::ColorUtil
9
9
  Dir.chdir(File.dirname(__FILE__))
10
10
 
11
11
  PALETTE = %w[#FFFFFF #FF0000 #0000FF].freeze
12
- COLORS = [16777215, 16711680, 255].to_java(:int)
12
+ COLORS = [16_777_215, 16_711_680, 255].to_java(:int)
13
13
 
14
14
  class ColorGroupTest < Minitest::Test
15
15
  def test_new
16
16
  group = ColorGroup.new(COLORS)
17
- assert group.kind_of? ColorGroup
17
+ assert group.is_a? ColorGroup
18
18
  end
19
19
 
20
20
  def test_web_array
21
21
  group = ColorGroup.from_web_array(PALETTE)
22
- assert group.kind_of? ColorGroup
22
+ assert group.is_a? ColorGroup
23
23
  end
24
24
 
25
25
  def test_ruby_string
26
- p5array = [16777215, 16711680, 255]
26
+ p5array = [16_777_215, 16_711_680, 255]
27
27
  group = ColorGroup.new(COLORS)
28
28
  code_string = "%w[#FFFFFF #FF0000 #0000FF]\n"
29
29
  result = group.ruby_code
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'test_helper'
2
4
 
3
5
  Dir.chdir(File.dirname(__FILE__))
@@ -10,40 +10,68 @@ include MathTool
10
10
  Dir.chdir(File.dirname(__FILE__))
11
11
 
12
12
  class HelperMethodsTest < Minitest::Test
13
-
14
- ARRAY = %w(albatross dog horse)
15
- def test_hex_color
13
+ ARRAY = %w[albatross dog horse].freeze
14
+ def test_hex_color
16
15
  col_double = 0.5
17
16
  hexcolor = 0xFFCC6600
18
17
  dodgy_hexstring = '*56666'
19
18
  hexstring = '#CC6600'
20
19
  assert hex_color(col_double) == 0.5, 'double as a color'
21
- assert hex_color(hexcolor) == -3381760, 'hexadecimal fixnum color'
22
- assert hex_color(hexstring) == -3381760, 'hexadecimal string color'
20
+ assert hex_color(hexcolor) == -3_381_760, 'hexadecimal fixnum color'
21
+ assert hex_color(hexstring) == -3_381_760, 'hexadecimal string color'
23
22
  assert_raises(StandardError, 'Dodgy Hexstring') do
24
23
  hex_color(dodgy_hexstring)
25
24
  end
26
25
  assert_raises(StandardError, 'Dodgy Color Conversion') do
27
26
  hex_color([])
28
27
  end
29
- end
28
+ end
30
29
 
31
30
  def test_dist
32
- ax, ay, bx, by = 0, 0, 1.0, 1.0
31
+ ax = 0
32
+ ay = 0
33
+ bx = 1.0
34
+ by = 1.0
33
35
  assert_in_epsilon(dist(ax, ay, bx, by), Math.sqrt(2), epsilon = 0.0001, msg = '2D distance')
34
36
  by = 0.0
35
37
  assert_in_epsilon(dist(ax, ay, bx, by), 1.0, epsilon = 0.0001, msg = 'when y dimension is zero')
36
- ax, ay, bx, by = 0, 0, 0.0, 0.0
38
+ ax = 0
39
+ ay = 0
40
+ bx = 0.0
41
+ by = 0.0
37
42
  assert_in_epsilon(dist(ax, ay, bx, by), 0.0, epsilon = 0.0001, msg = 'when x and y dimension are zero')
38
- ax, ay, bx, by = 1, 1, -2.0, -3.0
43
+ ax = 1
44
+ ay = 1
45
+ bx = -2.0
46
+ by = -3.0
39
47
  assert_in_epsilon(dist(ax, ay, bx, by), 5.0, epsilon = 0.0001, msg = 'classic triangle dimensions')
40
- ax, ay, bx, by, cx, cy = -1, -1, 100, 2.0, 3.0, 100
48
+ ax = -1
49
+ ay = -1
50
+ bx = 100
51
+ by = 2.0
52
+ cx = 3.0
53
+ cy = 100
41
54
  assert_in_epsilon(dist(ax, ay, bx, by, cx, cy), 5.0, epsilon = 0.0001, msg = 'classic triangle dimensions')
42
- ax, ay, bx, by, cx, cy = 0, 0, -1.0, -1.0, 0, 0
55
+ ax = 0
56
+ ay = 0
57
+ bx = -1.0
58
+ by = -1.0
59
+ cx = 0
60
+ cy = 0
43
61
  assert_in_epsilon(dist(ax, ay, bx, by, cx, cy), Math.sqrt(2), epsilon = 0.0001, msg = '2D distance')
44
- ax, ay, bx, by, cx, cy = 0, 0, 0.0, 0.0, 0, 0
62
+ ax = 0
63
+ ay = 0
64
+ bx = 0.0
65
+ by = 0.0
66
+ cx = 0
67
+ cy = 0
45
68
  assert_in_epsilon(dist(ax, ay, bx, by, cx, cy), 0.0)
46
- ax, ay, bx, by, cx, cy = 0, 0, 1.0, 0.0, 0, 0
69
+ ax = 0
70
+ ay = 0
71
+ bx = 1.0
72
+ by = 0.0
73
+ cx = 0
74
+ cy = 0
47
75
  assert_in_epsilon(dist(ax, ay, bx, by, cx, cy), 1.0, epsilon = 0.0001, msg = 'when x and z dimension are zero')
48
76
  end
49
77
 
@@ -1,73 +1,82 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'test_helper'
2
4
 
3
5
  Java::Monkstone::PicrateLibrary.new.load(JRuby.runtime, false)
4
6
 
5
7
  # include Processing::HelperMethods
6
8
 
7
-
8
9
  Dir.chdir(File.dirname(__FILE__))
9
-
10
- class MathToolTest < Minitest::Test
11
- include MathTool
12
- def test_map1d
10
+ # Test processing map functions
11
+ class ProcessingMapTest < Minitest::Test
12
+ include MathTool
13
+ def test_map1d
13
14
  x = [0, 5, 7.5, 10]
14
15
  range1 = (0..10)
15
16
  range2 = (100..1)
16
17
  range3 = (0..10)
17
18
  range4 = (5..105)
18
- assert_in_delta(map1d(x[0], range1, range2), 100, delta = 0.00001, msg = 'map to first')
19
- assert_in_delta(map1d(x[1], range1, range2), 50.5, delta = 0.00001, msg = 'map to reversed intermediate')
20
- assert_in_delta(map1d(x[2], range3, range4), 80.0, delta = 0.00001, msg = 'map to intermediate')
21
- assert_in_delta(map1d(x[3], range1, range2), 1, delta = 0.00001, msg = 'map to last')
22
- end
19
+ assert_in_delta(map1d(x[0], range1, range2), 100, 0.00001, 'map to first')
20
+ assert_in_delta(map1d(x[1], range1, range2), 50.5, 0.00001, 'map to reversed intermediate')
21
+ assert_in_delta(map1d(x[2], range3, range4), 80.0, 0.00001, 'map to intermediate')
22
+ assert_in_delta(map1d(x[3], range1, range2), 1, 0.00001, 'map to last')
23
+ end
23
24
 
24
- def test_p5map # as map1d except not using range input
25
+ # as map1d except not using range input
26
+ def test_p5map
25
27
  x = [0, 5, 7.5, 10]
26
28
  range1 = (0..10)
27
29
  range2 = (100..1)
28
30
  range3 = (0..10)
29
31
  range4 = (5..105)
30
- assert_in_delta(p5map(x[0], range1.first, range1.last, range2.first, range2.last), 100, delta = 0.00001)
31
- assert_in_delta(p5map(x[1], range1.first, range1.last, range2.first, range2.last), 50.5, delta = 0.00001)
32
- assert_in_delta(p5map(x[2], range3.first, range3.last, range4.first, range4.last), 80.0, delta = 0.00001)
33
- assert_in_delta(p5map(x[3], range1.first, range1.last, range2.first, range2.last), 1, delta = 0.00001)
32
+ assert_in_delta(p5map(x[0], range1.first, range1.last, range2.first, range2.last), 100, 0.00001)
33
+ assert_in_delta(p5map(x[1], range1.first, range1.last, range2.first, range2.last), 50.5, 0.00001)
34
+ assert_in_delta(p5map(x[2], range3.first, range3.last, range4.first, range4.last), 80.0, 0.00001)
35
+ assert_in_delta(p5map(x[3], range1.first, range1.last, range2.first, range2.last), 1, 0.00001)
34
36
  end
35
37
 
36
38
  def test_norm
37
39
  x = [10, 140, 210]
38
- start0, last0 = 30, 200
39
- start_int, last_int = 0, 200
40
- assert_in_delta(norm(x[0], start0, last0), -0.11764705882352941, delta = 0.00001, msg = 'unclamped map')
41
- assert_in_delta(norm(x[1], start_int, last_int), 0.7, delta = 0.00001, msg = 'map to intermediate')
42
- assert_in_delta(norm(x[2], start_int, last_int), 1.05, delta = 0.00001, msg = 'unclamped map')
40
+ start0 = 30
41
+ last0 = 200
42
+ start_int = 0
43
+ last_int = 200
44
+ assert_in_delta(norm(x[0], start0, last0), -0.11764705882352941, 0.00001, 'unclamped map')
45
+ assert_in_delta(norm(x[1], start_int, last_int), 0.7, 0.00001, 'map to intermediate')
46
+ assert_in_delta(norm(x[2], start_int, last_int), 1.05, 0.00001, 'unclamped map')
43
47
  end
44
48
 
45
49
  def test_norm_strict
46
50
  x = [10, 140, 210]
47
- assert_in_delta(norm_strict(x[2], x[0], x[1]), 1.0, delta = 0.00001, msg = 'clamped map to 0..1.0')
48
- assert_in_delta(norm_strict(x[2], x[1], x[0]), 0.0, delta = 0.00001, msg = 'clamped map to 0..1.0')
49
- assert_in_delta(norm_strict(x[1], x[0], x[2]), 0.65, delta = 0.00001, msg = 'clamped map to 0..1.0')
51
+ assert_in_delta(norm_strict(x[2], x[0], x[1]), 1.0, 0.00001, 'clamped map to 0..1.0')
52
+ assert_in_delta(norm_strict(x[2], x[1], x[0]), 0.0, 0.00001, 'clamped map to 0..1.0')
53
+ assert_in_delta(norm_strict(x[1], x[0], x[2]), 0.65, 0.00001, 'clamped map to 0..1.0')
50
54
  end
51
55
 
52
- def test_lerp # behaviour is deliberately different to processing which is unclamped
56
+ # behaviour is deliberately different to processing which is unclamped
57
+ def test_lerp
53
58
  x = [0.5, 0.8, 2.0]
54
- start0, last0 = 300, 200
55
- start_int, last_int = 0, 200
56
- assert_in_delta(lerp(start0, last0, x[0]), 250, delta = 0.00001, msg = 'produces a intermediate value of a reversed range')
57
- assert_in_delta(lerp(start_int, last_int, x[1]), 160, delta = 0.00001, msg = 'lerps to an intermediate value')
58
- assert_in_delta(lerp(start_int, last_int, x[2]), 200, delta = 0.00001, msg = 'lerps to the last value of a range')
59
+ start0 = 300
60
+ last0 = 200
61
+ start_int = 0
62
+ last_int = 200
63
+ assert_in_delta(lerp(start0, last0, x[0]), 250, 0.00001, 'produces a intermediate value of a reversed range')
64
+ assert_in_delta(lerp(start_int, last_int, x[1]), 160, 0.00001, 'lerps to an intermediate value')
65
+ assert_in_delta(lerp(start_int, last_int, x[2]), 200, 0.00001, 'lerps to the last value of a range')
59
66
  end
60
67
 
61
68
  def test_constrain
62
69
  x_int = [15, 2_500, -2_500]
63
- start_int, last_int = 0, 200
64
- assert_in_delta(constrain(x_int[0], start_int, last_int), 15, delta = 0.00001)
65
- assert_in_delta(constrain(x_int[1], start_int, last_int), 200, delta = 0.00001)
66
- assert_in_delta(constrain(x_int[2], start_int, last_int), 0, delta = 0.00001)
70
+ start_int = 0
71
+ last_int = 200
72
+ assert_in_delta(constrain(x_int[0], start_int, last_int), 15, 0.00001)
73
+ assert_in_delta(constrain(x_int[1], start_int, last_int), 200, 0.00001)
74
+ assert_in_delta(constrain(x_int[2], start_int, last_int), 0, 0.00001)
67
75
  xf = [15.0, 2_500.0, -2_500.0]
68
- startf, lastf = 0, 200.0
69
- assert_in_delta(constrain(xf[0], startf, lastf), 15.0, delta = 0.00001, msg = 'constrain to 0..200')
70
- assert_in_delta(constrain(xf[1], startf, lastf), 200.0, delta = 0.00001, msg = 'constrain to 0..200')
71
- assert_in_delta(constrain(xf[2], startf, lastf), 0.0, delta = 0.00001, msg = 'constrain to 0..200')
76
+ startf = 0
77
+ lastf = 200.0
78
+ assert_in_delta(constrain(xf[0], startf, lastf), 15.0, 0.00001, 'constrain to 0..200')
79
+ assert_in_delta(constrain(xf[1], startf, lastf), 200.0, 0.00001, 'constrain to 0..200')
80
+ assert_in_delta(constrain(xf[2], startf, lastf), 0.0, 0.00001, 'constrain to 0..200')
72
81
  end
73
82
  end