processing 0.5.32 → 0.5.34

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.
@@ -25,6 +25,14 @@ module Processing
25
25
  #
26
26
  TAU = PI * 2
27
27
 
28
+ # Processing mode for renderMode().
29
+ #
30
+ PROCESSING = :processing
31
+
32
+ # p5.js mode for renderMode().
33
+ #
34
+ P5JS = :p5js
35
+
28
36
  # RGBA format for createImage().
29
37
  #
30
38
  RGBA = :rgba
@@ -115,96 +123,127 @@ module Processing
115
123
  REPLACE = :replace
116
124
 
117
125
  # Key code or Mode for textAlign().
126
+ #
118
127
  LEFT = :left
119
128
 
120
129
  # Key code or Mode for textAlign().
130
+ #
121
131
  RIGHT = :right
122
132
 
123
133
  # Mode for textAlign().
134
+ #
124
135
  TOP = :top
125
136
 
126
137
  # Mode for textAlign().
138
+ #
127
139
  BOTTOM = :bottom
128
140
 
129
141
  # Mode for textAlign().
142
+ #
130
143
  BASELINE = :baseline
131
144
 
132
145
  # Mode for textureMode().
146
+ #
133
147
  IMAGE = :image
134
148
 
135
149
  # Mode for textureMode().
150
+ #
136
151
  NORMAL = :normal
137
152
 
138
153
  # Mode for textureWrap().
154
+ #
139
155
  CLAMP = :clamp
140
156
 
141
157
  # Mode for textureWrap().
158
+ #
142
159
  REPEAT = :repeat
143
160
 
144
161
  # Filter type for filter()
162
+ #
145
163
  THRESHOLD = :threshold
146
164
 
147
165
  # Filter type for filter()
166
+ #
148
167
  GRAY = :gray
149
168
 
150
169
  # Filter type for filter()
170
+ #
151
171
  INVERT = :invert
152
172
 
153
173
  # Filter type for filter()
174
+ #
154
175
  BLUR = :blur
155
176
 
156
177
  # Shape mode for createShape()
178
+ #
157
179
  LINE = :line
158
180
 
159
181
  # Shape mode for createShape()
182
+ #
160
183
  RECT = :rect
161
184
 
162
185
  # Shape mode for createShape()
186
+ #
163
187
  ELLIPSE = :ellipse
164
188
 
165
189
  # Shape mode for createShape()
190
+ #
166
191
  ARC = :arc
167
192
 
168
193
  # Shape mode for createShape()
194
+ #
169
195
  TRIANGLE = :triangle
170
196
 
171
197
  # Shape mode for createShape()
198
+ #
172
199
  QUAD = :quad
173
200
 
174
201
  # Shape mode for createShape()
202
+ #
175
203
  GROUP = :group
176
204
 
177
205
  # Shape mode for beginShape()
206
+ #
178
207
  POINTS = :points
179
208
 
180
209
  # Shape mode for beginShape()
210
+ #
181
211
  LINES = :lines
182
212
 
183
213
  # Shape mode for beginShape()
214
+ #
184
215
  TRIANGLES = :triangles
185
216
 
186
217
  # Shape mode for beginShape()
218
+ #
187
219
  TRIANGLE_FAN = :triangle_fan
188
220
 
189
221
  # Shape mode for beginShape()
222
+ #
190
223
  TRIANGLE_STRIP = :triangle_strip
191
224
 
192
225
  # Shape mode for beginShape()
226
+ #
193
227
  QUADS = :quads
194
228
 
195
229
  # Shape mode for beginShape()
230
+ #
196
231
  QUAD_STRIP = :quad_strip
197
232
 
198
233
  # Shape mode for beginShape()
234
+ #
199
235
  TESS = :tess
200
236
 
201
237
  # OPEN flag for endShape()
238
+ #
202
239
  OPEN = :open
203
240
 
204
241
  # CLOSE flag for endShape()
242
+ #
205
243
  CLOSE = :close
206
244
 
207
245
  # Key codes.
246
+ #
208
247
  ENTER = :enter
209
248
  SPACE = :space
210
249
  TAB = :tab
@@ -267,28 +306,42 @@ module Processing
267
306
 
268
307
  # @private
269
308
  def init__(image, painter)
270
- @drawing__ = false
271
- @colorMode__ = nil
272
- @hsbColor__ = false
273
- @colorMaxes__ = [1.0] * 4
274
- @angleMode__ = nil
275
- @angleScale__ = 1.0
276
- @rectMode__ = nil
277
- @ellipseMode__ = nil
278
- @imageMode__ = nil
279
- @shapeMode__ = nil
280
- @blendMode__ = nil
281
- @textAlignH__ = nil
282
- @textAlignV__ = nil
283
- @textFont__ = nil
284
- @tint__ = nil
285
- @filter__ = nil
286
- @pixels__ = nil
287
- @matrixStack__ = []
288
- @styleStack__ = []
309
+ @drawing__ = false
310
+ @renderMode__ = nil
311
+ @p5jsMode__ = false
312
+ @colorMode__ = nil
313
+ @hsbColor__ = false
314
+ @colorMaxes__ = [1.0] * 4
315
+ @angleMode__ = nil
316
+ @toRad__ = 1.0
317
+ @toDeg__ = 1.0
318
+ @fromRad__ = 1.0
319
+ @fromDeg__ = 1.0
320
+ @rectMode__ = nil
321
+ @ellipseMode__ = nil
322
+ @imageMode__ = nil
323
+ @shapeMode__ = nil
324
+ @blendMode__ = nil
325
+ @curveDetail__ = nil
326
+ @curveTightness__ = nil
327
+ @bezierDetail__ = nil
328
+ @textAlignH__ = nil
329
+ @textAlignV__ = nil
330
+ @textFont__ = nil
331
+ @tint__ = nil
332
+ @filter__ = nil
333
+ @pixels__ = nil
334
+ @random__ = nil
335
+ @nextGaussian__ = nil
336
+ @noiseSeed__ = nil
337
+ @noiseOctaves__ = nil
338
+ @noiseFallOff__ = nil
339
+ @matrixStack__ = []
340
+ @styleStack__ = []
289
341
 
290
342
  updateCanvas__ image, painter
291
343
 
344
+ renderMode PROCESSING
292
345
  colorMode RGB, 255
293
346
  angleMode RADIANS
294
347
  rectMode CORNER
@@ -303,10 +356,16 @@ module Processing
303
356
  textureMode IMAGE
304
357
  textureWrap CLAMP
305
358
 
306
- fill 255
307
- stroke 0
308
- strokeWeight 1
359
+ fill 255
360
+ stroke 0
361
+ strokeWeight 1
309
362
  noTint
363
+ curveDetail 20
364
+ curveTightness 0
365
+ bezierDetail 20
366
+ randomSeed Random.new_seed
367
+ noiseSeed Random.new_seed
368
+ noiseDetail 4, 0.5
310
369
  end
311
370
 
312
371
  # @private
@@ -322,6 +381,26 @@ module Processing
322
381
  @matrixStack__.clear
323
382
  @styleStack__.clear
324
383
  @drawing__ = true
384
+ setupMatrix__
385
+ end
386
+
387
+ # @private
388
+ def setupMatrix__()
389
+ w, h = width.to_f, height.to_f
390
+ x, y = w / 2.0, h / 2.0
391
+
392
+ fov, z = nil
393
+ if @p5jsMode__
394
+ z = 800
395
+ fov = degrees Math.atan(y / z) * 2.0
396
+ else
397
+ fov = 60
398
+ z = y / Math.tan(radians(fov) / 2.0)
399
+ end
400
+
401
+ @painter__.matrix =
402
+ Rays::Matrix.perspective(fov, w / h, z / 10.0, z * 10.0) *
403
+ Rays::Matrix.look_at(x, y, z, x, y, 0)
325
404
  end
326
405
 
327
406
  # @private
@@ -334,6 +413,9 @@ module Processing
334
413
  #
335
414
  # @return [Numeric] width
336
415
  #
416
+ # @see https://processing.org/reference/width.html
417
+ # @see https://p5js.org/reference/#/p5/width
418
+ #
337
419
  def width()
338
420
  getInternal__.width
339
421
  end
@@ -342,6 +424,9 @@ module Processing
342
424
  #
343
425
  # @return [Numeric] height
344
426
  #
427
+ # @see https://processing.org/reference/height.html
428
+ # @see https://p5js.org/reference/#/p5/height
429
+ #
345
430
  def height()
346
431
  getInternal__.height
347
432
  end
@@ -350,6 +435,8 @@ module Processing
350
435
  #
351
436
  # @return [Numeric] width
352
437
  #
438
+ # @see https://processing.org/reference/pixelWidth.html
439
+ #
353
440
  def pixelWidth()
354
441
  width * pixelDensity
355
442
  end
@@ -358,6 +445,8 @@ module Processing
358
445
  #
359
446
  # @return [Numeric] height
360
447
  #
448
+ # @see https://processing.org/reference/pixelHeight.html
449
+ #
361
450
  def pixelHeight()
362
451
  height * pixelDensity
363
452
  end
@@ -366,10 +455,27 @@ module Processing
366
455
  #
367
456
  # @return [Numeric] pixel density
368
457
  #
458
+ # @see https://processing.org/reference/pixelDensity_.html
459
+ # @see https://p5js.org/reference/#/p5/pixelDensity
460
+ #
369
461
  def pixelDensity()
370
462
  @painter__.pixel_density
371
463
  end
372
464
 
465
+ # Sets render mode.
466
+ #
467
+ # @param mode [PROCESSING, P5JS] compatible to Processing or p5.js
468
+ #
469
+ # @return [PROCESSING, P5JS] current mode
470
+ #
471
+ def renderMode(mode = nil)
472
+ if mode
473
+ @renderMode__ = mode
474
+ @p5jsMode__ = mode == P5JS
475
+ end
476
+ @renderMode__
477
+ end
478
+
373
479
  # Sets color mode and max color values.
374
480
  #
375
481
  # @overload colorMode(mode)
@@ -386,6 +492,9 @@ module Processing
386
492
  #
387
493
  # @return [RGB, HSB] current mode
388
494
  #
495
+ # @see https://processing.org/reference/colorMode_.html
496
+ # @see https://p5js.org/reference/#/p5/colorMode
497
+ #
389
498
  def colorMode(mode = nil, *maxes)
390
499
  if mode != nil
391
500
  mode = mode.downcase.to_sym
@@ -417,6 +526,9 @@ module Processing
417
526
  #
418
527
  # @return [Integer] the rgba color value
419
528
  #
529
+ # @see https://processing.org/reference/color_.html
530
+ # @see https://p5js.org/reference/#/p5/color
531
+ #
420
532
  def color(*args)
421
533
  toRGBA__(*args)
422
534
  .map {|n| (n * 255).to_i.clamp 0, 255}
@@ -429,6 +541,9 @@ module Processing
429
541
  #
430
542
  # @return [Numeric] the red value
431
543
  #
544
+ # @see https://processing.org/reference/red_.html
545
+ # @see https://p5js.org/reference/#/p5/red
546
+ #
432
547
  def red(color)
433
548
  ((color >> 16) & 0xff) / 255.0 * @colorMaxes__[0]
434
549
  end
@@ -439,6 +554,9 @@ module Processing
439
554
  #
440
555
  # @return [Numeric] the green value
441
556
  #
557
+ # @see https://processing.org/reference/green_.html
558
+ # @see https://p5js.org/reference/#/p5/green
559
+ #
442
560
  def green(color)
443
561
  ((color >> 8) & 0xff) / 255.0 * @colorMaxes__[1]
444
562
  end
@@ -449,6 +567,9 @@ module Processing
449
567
  #
450
568
  # @return [Numeric] the blue value
451
569
  #
570
+ # @see https://processing.org/reference/blue_.html
571
+ # @see https://p5js.org/reference/#/p5/blue
572
+ #
452
573
  def blue(color)
453
574
  (color & 0xff) / 255.0 * @colorMaxes__[2]
454
575
  end
@@ -459,19 +580,64 @@ module Processing
459
580
  #
460
581
  # @return [Numeric] the red value
461
582
  #
583
+ # @see https://processing.org/reference/alpha_.html
584
+ # @see https://p5js.org/reference/#/p5/alpha
585
+ #
462
586
  def alpha(color)
463
587
  ((color >> 24) & 0xff) / 255.0 * @colorMaxes__[3]
464
588
  end
465
589
 
590
+ # Returns the hue value of the color.
591
+ #
592
+ # @param color [Numeric] color value
593
+ #
594
+ # @return [Numeric] the hue value
595
+ #
596
+ # @see https://processing.org/reference/hue_.html
597
+ # @see https://p5js.org/reference/#/p5/hue
598
+ #
599
+ def hue(color)
600
+ h, = toRawColor__(color).to_hsv
601
+ h * (@hsbColor__ ? @colorMaxes__[0] : 1)
602
+ end
603
+
604
+ # Returns the saturation value of the color.
605
+ #
606
+ # @param color [Numeric] color value
607
+ #
608
+ # @return [Numeric] the saturation value
609
+ #
610
+ # @see https://processing.org/reference/saturation_.html
611
+ # @see https://p5js.org/reference/#/p5/saturation
612
+ #
613
+ def saturation(color)
614
+ _, s, = toRawColor__(color).to_hsv
615
+ s * (@hsbColor__ ? @colorMaxes__[1] : 1)
616
+ end
617
+
618
+ # Returns the brightness value of the color.
619
+ #
620
+ # @param color [Numeric] color value
621
+ #
622
+ # @return [Numeric] the brightness value
623
+ #
624
+ # @see https://processing.org/reference/brightness_.html
625
+ # @see https://p5js.org/reference/#/p5/brightness
626
+ #
627
+ def brightness(color)
628
+ _, _, b = toRawColor__(color).to_hsv
629
+ b * (@hsbColor__ ? @colorMaxes__[2] : 1)
630
+ end
631
+
466
632
  # @private
467
633
  private def toRGBA__(*args)
468
634
  a, b = args
469
635
  return parseColor__(a, b || alphaMax__) if a.kind_of?(String)
470
- toRaysColor__(*args).to_a
636
+ rawColor__(*args).to_a
471
637
  end
472
638
 
473
639
  # @private
474
- def toRaysColor__(*args)
640
+ def rawColor__(*args)
475
641
  a, b, c, d = args
476
642
  rgba = case args.size
477
643
  when 1, 2 then [a, a, a, b || alphaMax__]
@@ -496,46 +662,54 @@ module Processing
496
662
  @colorMaxes__[3]
497
663
  end
498
664
 
665
+ # @private
666
+ private def toRawColor__(color)
667
+ Rays::Color.new(
668
+ ((color >> 16) & 0xff) / 255.0,
669
+ ((color >> 8) & 0xff) / 255.0,
670
+ ( color & 0xff) / 255.0,
671
+ ((color >> 24) & 0xff) / 255.0)
672
+ end
673
+
499
674
  # Sets angle mode.
500
675
  #
501
676
  # @param mode [RADIANS, DEGREES] RADIANS or DEGREES
502
677
  #
503
678
  # @return [RADIANS, DEGREES] current mode
504
679
  #
680
+ # @see https://p5js.org/reference/#/p5/angleMode
681
+ #
505
682
  def angleMode(mode = nil)
506
683
  if mode != nil
507
684
  @angleMode__ = mode
508
- @angleScale__ =
685
+ @toRad__, @toDeg__, @fromRad__, @fromDeg__ =
509
686
  case mode.downcase.to_sym
510
- when RADIANS then RAD2DEG__
511
- when DEGREES then 1.0
687
+ when RADIANS then [1.0, RAD2DEG__, 1.0, DEG2RAD__]
688
+ when DEGREES then [DEG2RAD__, 1.0, RAD2DEG__, 1.0]
512
689
  else raise ArgumentError, "invalid angle mode: #{mode}"
513
690
  end
514
691
  end
515
692
  @angleMode__
516
693
  end
517
694
 
695
+ # @private
696
+ def toRadians__(angle)
697
+ angle * @toRad__
698
+ end
699
+
518
700
  # @private
519
701
  def toDegrees__(angle)
520
- angle * @angleScale__
702
+ angle * @toDeg__
521
703
  end
522
704
 
523
705
  # @private
524
706
  def fromRadians__(radians)
525
- case @angleMode__
526
- when RADIANS then radians
527
- when DEGREES then radians * RAD2DEG__
528
- else raise "invalid angle mode: #{mode}"
529
- end
707
+ radians * @fromRad__
530
708
  end
531
709
 
532
710
  # @private
533
711
  def fromDegrees__(degrees)
534
- case @angleMode__
535
- when RADIANS then degrees * DEG2RAD__
536
- when DEGREES then degrees
537
- else raise "invalid angle mode: #{mode}"
538
- end
712
+ degrees * @fromDeg__
539
713
  end
540
714
 
541
715
  # Sets rect mode. Default is CORNER.
@@ -549,6 +723,9 @@ module Processing
549
723
  #
550
724
  # @return [nil] nil
551
725
  #
726
+ # @see https://processing.org/reference/rectMode_.html
727
+ # @see https://p5js.org/reference/#/p5/rectMode
728
+ #
552
729
  def rectMode(mode)
553
730
  @rectMode__ = mode
554
731
  end
@@ -564,6 +741,9 @@ module Processing
564
741
  #
565
742
  # @return [nil] nil
566
743
  #
744
+ # @see https://processing.org/reference/ellipseMode_.html
745
+ # @see https://p5js.org/reference/#/p5/ellipseMode
746
+ #
567
747
  def ellipseMode(mode)
568
748
  @ellipseMode__ = mode
569
749
  end
@@ -578,6 +758,9 @@ module Processing
578
758
  #
579
759
  # @return [nil] nil
580
760
  #
761
+ # @see https://processing.org/reference/imageMode_.html
762
+ # @see https://p5js.org/reference/#/p5/imageMode
763
+ #
581
764
  def imageMode(mode)
582
765
  @imageMode__ = mode
583
766
  end
@@ -592,6 +775,8 @@ module Processing
592
775
  #
593
776
  # @return [nil] nil
594
777
  #
778
+ # @see https://processing.org/reference/shapeMode_.html
779
+ #
595
780
  def shapeMode(mode)
596
781
  @shapeMode__ = mode
597
782
  end
@@ -613,6 +798,9 @@ module Processing
613
798
  #
614
799
  # @return [nil] nil
615
800
  #
801
+ # @see https://processing.org/reference/blendMode_.html
802
+ # @see https://p5js.org/reference/#/p5/blendMode
803
+ #
616
804
  def blendMode(mode = nil)
617
805
  if mode != nil
618
806
  @blendMode__ = mode
@@ -639,6 +827,9 @@ module Processing
639
827
  #
640
828
  # @return [nil] nil
641
829
  #
830
+ # @see https://processing.org/reference/fill_.html
831
+ # @see https://p5js.org/reference/#/p5/fill
832
+ #
642
833
  def fill(*args)
643
834
  @painter__.fill(*toRGBA__(*args))
644
835
  nil
@@ -653,6 +844,9 @@ module Processing
653
844
  #
654
845
  # @return [nil] nil
655
846
  #
847
+ # @see https://processing.org/reference/noFill_.html
848
+ # @see https://p5js.org/reference/#/p5/noFill
849
+ #
656
850
  def noFill()
657
851
  @painter__.fill nil
658
852
  nil
@@ -676,6 +870,9 @@ module Processing
676
870
  #
677
871
  # @return [nil] nil
678
872
  #
873
+ # @see https://processing.org/reference/stroke_.html
874
+ # @see https://p5js.org/reference/#/p5/stroke
875
+ #
679
876
  def stroke(*args)
680
877
  @painter__.stroke(*toRGBA__(*args))
681
878
  nil
@@ -685,6 +882,9 @@ module Processing
685
882
  #
686
883
  # @return [nil] nil
687
884
  #
885
+ # @see https://processing.org/reference/noStroke_.html
886
+ # @see https://p5js.org/reference/#/p5/noStroke
887
+ #
688
888
  def noStroke()
689
889
  @painter__.stroke nil
690
890
  nil
@@ -696,6 +896,9 @@ module Processing
696
896
  #
697
897
  # @return [nil] nil
698
898
  #
899
+ # @see https://processing.org/reference/strokeWeight_.html
900
+ # @see https://p5js.org/reference/#/p5/strokeWeight
901
+ #
699
902
  def strokeWeight(weight)
700
903
  @painter__.stroke_width weight
701
904
  nil
@@ -707,6 +910,9 @@ module Processing
707
910
  #
708
911
  # @return [nil] nil
709
912
  #
913
+ # @see https://processing.org/reference/strokeCap_.html
914
+ # @see https://p5js.org/reference/#/p5/strokeCap
915
+ #
710
916
  def strokeCap(cap)
711
917
  @painter__.stroke_cap cap
712
918
  nil
@@ -718,11 +924,60 @@ module Processing
718
924
  #
719
925
  # @return [nil] nil
720
926
  #
927
+ # @see https://processing.org/reference/strokeJoin_.html
928
+ # @see https://p5js.org/reference/#/p5/strokeJoin
929
+ #
721
930
  def strokeJoin(join)
722
931
  @painter__.stroke_join join
723
932
  nil
724
933
  end
725
934
 
935
+ # Sets the resolution at which curves display.
936
+ # The default value is 20 while the minimum value is 3.
937
+ #
938
+ # @param detail [Numeric] resolution of the curves
939
+ #
940
+ # @return [nil] nil
941
+ #
942
+ # @see https://processing.org/reference/curveDetail_.html
943
+ # @see https://p5js.org/reference/#/p5/curveDetail
944
+ #
945
+ def curveDetail(detail)
946
+ detail = 3 if detail < 3
947
+ @curveDetail__ = detail
948
+ nil
949
+ end
950
+
951
+ # Sets the quality of curve forms.
952
+ #
953
+ # @param tightness [Numeric] determines how the curve fits to the vertex points
954
+ #
955
+ # @return [nil] nil
956
+ #
957
+ # @see https://processing.org/reference/curveTightness_.html
958
+ # @see https://p5js.org/reference/#/p5/curveTightness
959
+ #
960
+ def curveTightness(tightness)
961
+ @curveTightness__ = tightness
962
+ nil
963
+ end
964
+
965
+ # Sets the resolution at which Bezier's curve is displayed.
966
+ # The default value is 20.
967
+ #
968
+ # @param detail [Numeric] resolution of the curves
969
+ #
970
+ # @return [nil] nil
971
+ #
972
+ # @see https://processing.org/reference/bezierDetail_.html
973
+ # @see https://p5js.org/reference/#/p5/bezierDetail
974
+ #
975
+ def bezierDetail(detail)
976
+ detail = 1 if detail < 1
977
+ @bezierDetail__ = detail
978
+ nil
979
+ end
980
+
726
981
  # Sets fill color for drawing images.
727
982
  #
728
983
  # @overload tint(rgb)
@@ -741,6 +996,9 @@ module Processing
741
996
  #
742
997
  # @return [nil] nil
743
998
  #
999
+ # @see https://processing.org/reference/tint_.html
1000
+ # @see https://p5js.org/reference/#/p5/tint
1001
+ #
744
1002
  def tint(*args)
745
1003
  @tint__ = args
746
1004
  nil
@@ -750,6 +1008,9 @@ module Processing
750
1008
  #
751
1009
  # @return [nil] nil
752
1010
  #
1011
+ # @see https://processing.org/reference/noTint_.html
1012
+ # @see https://p5js.org/reference/#/p5/noTint
1013
+ #
753
1014
  def noTint()
754
1015
  @tint__ = nil
755
1016
  end
@@ -770,6 +1031,9 @@ module Processing
770
1031
  #
771
1032
  # @return [nil] nil
772
1033
  #
1034
+ # @see https://processing.org/reference/clip_.html
1035
+ # @see https://p5js.org/reference/#/p5/clip
1036
+ #
773
1037
  def clip(a, b, c, d)
774
1038
  x, y, w, h = toXYWH__ @imageMode__, a, b, c, d
775
1039
  @painter__.clip x, y, w, h
@@ -780,36 +1044,43 @@ module Processing
780
1044
  #
781
1045
  # @return [nil] nil
782
1046
  #
1047
+ # @see https://processing.org/reference/noClip_.html
1048
+ #
783
1049
  def noClip()
784
1050
  @painter__.no_clip
785
1051
  nil
786
1052
  end
787
1053
 
788
1054
  # Sets text font.
789
- #
790
1055
  # (Passing a font name as the first parameter is deprecated)
791
1056
  #
1057
+ # @overload textFont()
792
1058
  # @overload textFont(font)
793
- # @overload textFont(name)
1059
+ # @overload textFont(name) [DEPRECATED]
794
1060
  # @overload textFont(font, size)
795
- # @overload textFont(name, size)
1061
+ # @overload textFont(name, size) [DEPRECATED]
796
1062
  #
797
1063
  # @param font [Font] font
798
1064
  # @param name [String] font name
799
1065
  # @param size [Numeric] font size (max 256)
800
1066
  #
801
- # @return [nil] nil
1067
+ # @return [Font] current font
802
1068
  #
803
- def textFont(font, size = nil)
804
- size = FONT_SIZE_MAX__ if size && size > FONT_SIZE_MAX__
805
- if font.nil? || font.kind_of?(String)
806
- font = createFont font, size
807
- elsif size
808
- font.setSize__ size
1069
+ # @see https://processing.org/reference/textFont_.html
1070
+ # @see https://p5js.org/reference/#/p5/textFont
1071
+ #
1072
+ def textFont(font = nil, size = nil)
1073
+ if font != nil || size != nil
1074
+ size = FONT_SIZE_MAX__ if size && size > FONT_SIZE_MAX__
1075
+ if font.nil? || font.kind_of?(String)
1076
+ font = createFont font, size
1077
+ elsif size
1078
+ font.setSize__ size
1079
+ end
1080
+ @painter__.font = font.getInternal__
1081
+ @textFont__ = font
809
1082
  end
810
- @textFont__ = font
811
- @painter__.font = font.getInternal__
812
- nil
1083
+ @textFont__
813
1084
  end
814
1085
 
815
1086
  # Sets text size.
@@ -818,27 +1089,91 @@ module Processing
818
1089
  #
819
1090
  # @return [nil] nil
820
1091
  #
1092
+ # @see https://processing.org/reference/textSize_.html
1093
+ # @see https://p5js.org/reference/#/p5/textSize
1094
+ #
821
1095
  def textSize(size)
822
1096
  textFont @textFont__, size
1097
+ nil
823
1098
  end
824
1099
 
1100
+ # Returns the width of the text.
1101
+ #
1102
+ # @param str [String] text string
1103
+ #
1104
+ # @return [Numeric] width of the text
1105
+ #
1106
+ # @see https://processing.org/reference/textWidth_.html
1107
+ # @see https://p5js.org/reference/#/p5/textWidth
1108
+ #
825
1109
  def textWidth(str)
826
1110
  @painter__.font.width str
827
1111
  end
828
1112
 
1113
+ # Returns ascent of the current font at its current size.
1114
+ #
1115
+ # @return [Numeric] ascent
1116
+ #
1117
+ # @see https://processing.org/reference/textAscent_.html
1118
+ # @see https://p5js.org/reference/#/p5/textAscent
1119
+ #
829
1120
  def textAscent()
830
1121
  @painter__.font.ascent
831
1122
  end
832
1123
 
1124
+ # Returns descent of the current font at its current size.
1125
+ #
1126
+ # @return [Numeric] descent
1127
+ #
1128
+ # @see https://processing.org/reference/textDescent_.html
1129
+ # @see https://p5js.org/reference/#/p5/textDescent
1130
+ #
833
1131
  def textDescent()
834
1132
  @painter__.font.descent
835
1133
  end
836
1134
 
1135
+ # Sets the alignment for drawing text.
1136
+ #
1137
+ # @param horizontal [LEFT, CENTER, RIGHT] horizontal alignment
1138
+ # @param vertical [TOP, BOTTOM, CENTER, BASELINE] vertical alignment
1139
+ #
1140
+ # @return [nil] nil
1141
+ #
1142
+ # @see https://processing.org/reference/textAlign_.html
1143
+ # @see https://p5js.org/reference/#/p5/textAlign
1144
+ #
837
1145
  def textAlign(horizontal, vertical = BASELINE)
838
1146
  @textAlignH__ = horizontal
839
1147
  @textAlignV__ = vertical
1148
+ nil
840
1149
  end
841
1150
 
1151
+ # Sets the spacing between lines of text in units of pixels.
1152
+ #
1153
+ # @overload textLeading()
1154
+ # @overload textLeading(leading)
1155
+ #
1156
+ # @param leading [Numeric] the size in pixels for spacing between lines
1157
+ #
1158
+ # @return [Numeric] current spacing
1159
+ #
1160
+ # @see https://processing.org/reference/textLeading_.html
1161
+ # @see https://p5js.org/reference/#/p5/textLeading
1162
+ #
1163
+ def textLeading(leading = nil)
1164
+ @painter__.line_height = leading if leading
1165
+ @painter__.line_height
1166
+ end
1167
+
1168
+ # Sets texture.
1169
+ #
1170
+ # @param image [Image] texture image
1171
+ #
1172
+ # @return [nil] nil
1173
+ #
1174
+ # @see https://processing.org/reference/texture_.html
1175
+ # @see https://p5js.org/reference/#/p5/texture
1176
+ #
842
1177
  def texture(image)
843
1178
  @painter__.texture image&.getInternal__
844
1179
  nil
@@ -887,6 +1222,9 @@ module Processing
887
1222
  #
888
1223
  # @return [nil] nil
889
1224
  #
1225
+ # @see https://processing.org/reference/shader_.html
1226
+ # @see https://p5js.org/reference/#/p5/shader
1227
+ #
890
1228
  def shader(shader)
891
1229
  @painter__.shader shader&.getInternal__
892
1230
  nil
@@ -896,6 +1234,9 @@ module Processing
896
1234
  #
897
1235
  # @return [nil] nil
898
1236
  #
1237
+ # @see https://processing.org/reference/resetShader_.html
1238
+ # @see https://p5js.org/reference/#/p5/resetShader
1239
+ #
899
1240
  def resetShader()
900
1241
  @painter__.no_shader
901
1242
  nil
@@ -911,8 +1252,14 @@ module Processing
911
1252
  # @param type [THRESHOLD, GRAY, INVERT, BLUR] filter type
912
1253
  # @param param [Numeric] a parameter for each filter
913
1254
  #
1255
+ # @return [nil] nil
1256
+ #
1257
+ # @see https://processing.org/reference/filter_.html
1258
+ # @see https://p5js.org/reference/#/p5/filter
1259
+ #
914
1260
  def filter(*args)
915
1261
  @filter__ = Shader.createFilter__(*args)
1262
+ nil
916
1263
  end
917
1264
 
918
1265
  # Clears screen.
@@ -933,6 +1280,9 @@ module Processing
933
1280
  #
934
1281
  # @return [nil] nil
935
1282
  #
1283
+ # @see https://processing.org/reference/background_.html
1284
+ # @see https://p5js.org/reference/#/p5/background
1285
+ #
936
1286
  def background(*args)
937
1287
  assertDrawing__
938
1288
  rgba = toRGBA__(*args)
@@ -959,9 +1309,12 @@ module Processing
959
1309
  #
960
1310
  # @return [nil] nil
961
1311
  #
1312
+ # @see https://processing.org/reference/point_.html
1313
+ # @see https://p5js.org/reference/#/p5/point
1314
+ #
962
1315
  def point(x, y)
963
1316
  assertDrawing__
964
- @painter__.line x, y, x, y
1317
+ @painter__.point x, y
965
1318
  nil
966
1319
  end
967
1320
 
@@ -976,6 +1329,9 @@ module Processing
976
1329
  #
977
1330
  # @return [nil] nil
978
1331
  #
1332
+ # @see https://processing.org/reference/line_.html
1333
+ # @see https://p5js.org/reference/#/p5/line
1334
+ #
979
1335
  def line(x1, y1, x2, y2)
980
1336
  assertDrawing__
981
1337
  @painter__.line x1, y1, x2, y2
@@ -1004,6 +1360,9 @@ module Processing
1004
1360
  #
1005
1361
  # @return [nil] nil
1006
1362
  #
1363
+ # @see https://processing.org/reference/rect_.html
1364
+ # @see https://p5js.org/reference/#/p5/rect
1365
+ #
1007
1366
  def rect(a, b, c, d, *args)
1008
1367
  assertDrawing__
1009
1368
  x, y, w, h = toXYWH__ @rectMode__, a, b, c, d
@@ -1029,6 +1388,9 @@ module Processing
1029
1388
  #
1030
1389
  # @return [nil] nil
1031
1390
  #
1391
+ # @see https://processing.org/reference/ellipse_.html
1392
+ # @see https://p5js.org/reference/#/p5/ellipse
1393
+ #
1032
1394
  def ellipse(a, b, c, d)
1033
1395
  assertDrawing__
1034
1396
  x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
@@ -1046,6 +1408,9 @@ module Processing
1046
1408
  #
1047
1409
  # @return [nil] nil
1048
1410
  #
1411
+ # @see https://processing.org/reference/circle_.html
1412
+ # @see https://p5js.org/reference/#/p5/circle
1413
+ #
1049
1414
  def circle(x, y, extent)
1050
1415
  ellipse x, y, extent, extent
1051
1416
  end
@@ -1065,6 +1430,9 @@ module Processing
1065
1430
  #
1066
1431
  # @return [nil] nil
1067
1432
  #
1433
+ # @see https://processing.org/reference/arc_.html
1434
+ # @see https://p5js.org/reference/#/p5/arc
1435
+ #
1068
1436
  def arc(a, b, c, d, start, stop)
1069
1437
  assertDrawing__
1070
1438
  x, y, w, h = toXYWH__ @ellipseMode__, a, b, c, d
@@ -1083,6 +1451,9 @@ module Processing
1083
1451
  #
1084
1452
  # @return [nil] nil
1085
1453
  #
1454
+ # @see https://processing.org/reference/square_.html
1455
+ # @see https://p5js.org/reference/#/p5/square
1456
+ #
1086
1457
  def square(x, y, extent)
1087
1458
  rect x, y, extent, extent
1088
1459
  end
@@ -1100,6 +1471,9 @@ module Processing
1100
1471
  #
1101
1472
  # @return [nil] nil
1102
1473
  #
1474
+ # @see https://processing.org/reference/triangle_.html
1475
+ # @see https://p5js.org/reference/#/p5/triangle
1476
+ #
1103
1477
  def triangle(x1, y1, x2, y2, x3, y3)
1104
1478
  assertDrawing__
1105
1479
  @painter__.line x1, y1, x2, y2, x3, y3, loop: true
@@ -1121,6 +1495,9 @@ module Processing
1121
1495
  #
1122
1496
  # @return [nil] nil
1123
1497
  #
1498
+ # @see https://processing.org/reference/quad_.html
1499
+ # @see https://p5js.org/reference/#/p5/quad
1500
+ #
1124
1501
  def quad(x1, y1, x2, y2, x3, y3, x4, y4)
1125
1502
  assertDrawing__
1126
1503
  @painter__.line x1, y1, x2, y2, x3, y3, x4, y4, loop: true
@@ -1142,9 +1519,14 @@ module Processing
1142
1519
  #
1143
1520
  # @return [nil] nil
1144
1521
  #
1522
+ # @see https://processing.org/reference/curve_.html
1523
+ # @see https://p5js.org/reference/#/p5/curve
1524
+ #
1145
1525
  def curve(cx1, cy1, x1, y1, x2, y2, cx2, cy2)
1146
1526
  assertDrawing__
1527
+ @painter__.nsegment = @curveDetail__
1147
1528
  @painter__.curve cx1, cy1, x1, y1, x2, y2, cx2, cy2
1529
+ @painter__.nsegment = 0
1148
1530
  nil
1149
1531
  end
1150
1532
 
@@ -1163,9 +1545,14 @@ module Processing
1163
1545
  #
1164
1546
  # @return [nil] nil
1165
1547
  #
1548
+ # @see https://processing.org/reference/bezier_.html
1549
+ # @see https://p5js.org/reference/#/p5/bezier
1550
+ #
1166
1551
  def bezier(x1, y1, cx1, cy1, cx2, cy2, x2, y2)
1167
1552
  assertDrawing__
1553
+ @painter__.nsegment = @bezierDetail__
1168
1554
  @painter__.bezier x1, y1, cx1, cy1, cx2, cy2, x2, y2
1555
+ @painter__.nsegment = 0
1169
1556
  nil
1170
1557
  end
1171
1558
 
@@ -1189,6 +1576,9 @@ module Processing
1189
1576
  #
1190
1577
  # @return [nil] nil
1191
1578
  #
1579
+ # @see https://processing.org/reference/text_.html
1580
+ # @see https://p5js.org/reference/#/p5/text
1581
+ #
1192
1582
  def text(str, x, y, x2 = nil, y2 = nil)
1193
1583
  assertDrawing__
1194
1584
  if x2
@@ -1227,6 +1617,9 @@ module Processing
1227
1617
  #
1228
1618
  # @return [nil] nil
1229
1619
  #
1620
+ # @see https://processing.org/reference/image_.html
1621
+ # @see https://p5js.org/reference/#/p5/image
1622
+ #
1230
1623
  def image(img, a, b, c = nil, d = nil)
1231
1624
  assertDrawing__
1232
1625
  x, y, w, h = toXYWH__ @imageMode__, a, b, c || img.width, d || img.height
@@ -1251,6 +1644,8 @@ module Processing
1251
1644
  #
1252
1645
  # @return [nil] nil
1253
1646
  #
1647
+ # @see https://processing.org/reference/shape_.html
1648
+ #
1254
1649
  def shape(shp, a = 0, b = 0, c = nil, d = nil)
1255
1650
  assertDrawing__
1256
1651
  return nil unless shp.isVisible
@@ -1437,6 +1832,9 @@ module Processing
1437
1832
  #
1438
1833
  # @return [nil] nil
1439
1834
  #
1835
+ # @see https://processing.org/reference/copy_.html
1836
+ # @see https://p5js.org/reference/#/p5/copy
1837
+ #
1440
1838
  def copy(img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
1441
1839
  blend img, sx, sy, sw, sh, dx, dy, dw, dh, BLEND
1442
1840
  end
@@ -1459,6 +1857,9 @@ module Processing
1459
1857
  #
1460
1858
  # @return [nil] nil
1461
1859
  #
1860
+ # @see https://processing.org/reference/blend_.html
1861
+ # @see https://p5js.org/reference/#/p5/blend
1862
+ #
1462
1863
  def blend(img = nil, sx, sy, sw, sh, dx, dy, dw, dh, mode)
1463
1864
  assertDrawing__
1464
1865
  (img || self).drawImage__(
@@ -1470,6 +1871,9 @@ module Processing
1470
1871
  #
1471
1872
  # @return [nil] nil
1472
1873
  #
1874
+ # @see https://processing.org/reference/loadPixels_.html
1875
+ # @see https://p5js.org/reference/#/p5/loadPixels
1876
+ #
1473
1877
  def loadPixels()
1474
1878
  @pixels__ = getInternal__.pixels
1475
1879
  end
@@ -1478,15 +1882,30 @@ module Processing
1478
1882
  #
1479
1883
  # @return [nil] nil
1480
1884
  #
1481
- def updatePixels()
1482
- return unless @pixels__
1483
- getInternal__.pixels = @pixels__
1885
+ # @see https://processing.org/reference/updatePixels_.html
1886
+ # @see https://p5js.org/reference/#/p5/updatePixels
1887
+ #
1888
+ def updatePixels(&block)
1889
+ return if !block && !@pixels__
1890
+ if block
1891
+ loadPixels
1892
+ block.call pixels
1893
+ end
1894
+ getInternal__.tap do |img|
1895
+ img.pixels = @pixels__
1896
+ img.paint {} # update texture and set modifiied
1897
+ end
1484
1898
  @pixels__ = nil
1485
1899
  end
1486
1900
 
1487
1901
  # An array of all pixels.
1488
1902
  # Call loadPixels() before accessing the array.
1489
1903
  #
1904
+ # @return [Array] color array
1905
+ #
1906
+ # @see https://processing.org/reference/pixels.html
1907
+ # @see https://p5js.org/reference/#/p5/pixels
1908
+ #
1490
1909
  def pixels()
1491
1910
  @pixels__
1492
1911
  end
@@ -1497,6 +1916,9 @@ module Processing
1497
1916
  #
1498
1917
  # @return [nil] nil
1499
1918
  #
1919
+ # @see https://processing.org/reference/save_.html
1920
+ # @see https://p5js.org/reference/#/p5/save
1921
+ #
1500
1922
  def save(filename)
1501
1923
  getInternal__.save filename
1502
1924
  nil
@@ -1509,10 +1931,13 @@ module Processing
1509
1931
  #
1510
1932
  # @param x [Numeric] left/right translation
1511
1933
  # @param y [Numeric] up/down translation
1512
- # @param y [Numeric] forward/backward translation
1934
+ # @param z [Numeric] forward/backward translation
1513
1935
  #
1514
1936
  # @return [nil] nil
1515
1937
  #
1938
+ # @see https://processing.org/reference/translate_.html
1939
+ # @see https://p5js.org/reference/#/p5/translate
1940
+ #
1516
1941
  def translate(x, y, z = 0)
1517
1942
  assertDrawing__
1518
1943
  @painter__.translate x, y, z
@@ -1523,13 +1948,18 @@ module Processing
1523
1948
  #
1524
1949
  # @overload scale(s)
1525
1950
  # @overload scale(x, y)
1951
+ # @overload scale(x, y, z)
1526
1952
  #
1527
1953
  # @param s [Numeric] horizontal and vertical scale
1528
1954
  # @param x [Numeric] horizontal scale
1529
1955
  # @param y [Numeric] vertical scale
1956
+ # @param z [Numeric] depth scale
1530
1957
  #
1531
1958
  # @return [nil] nil
1532
1959
  #
1960
+ # @see https://processing.org/reference/scale_.html
1961
+ # @see https://p5js.org/reference/#/p5/scale
1962
+ #
1533
1963
  def scale(x, y = nil, z = 1)
1534
1964
  assertDrawing__
1535
1965
  @painter__.scale x, (y || x), z
@@ -1542,16 +1972,104 @@ module Processing
1542
1972
  #
1543
1973
  # @return [nil] nil
1544
1974
  #
1975
+ # @see https://processing.org/reference/rotate_.html
1976
+ # @see https://p5js.org/reference/#/p5/rotate
1977
+ #
1545
1978
  def rotate(angle)
1546
1979
  assertDrawing__
1547
1980
  @painter__.rotate toDegrees__ angle
1548
1981
  nil
1549
1982
  end
1550
1983
 
1984
+ # Applies rotation around the x-axis.
1985
+ #
1986
+ # @param angle [Numeric] angle for rotation
1987
+ #
1988
+ # @return [nil] nil
1989
+ #
1990
+ # @see https://processing.org/reference/rotateX_.html
1991
+ # @see https://p5js.org/reference/#/p5/rotateX
1992
+ #
1993
+ def rotateX(angle)
1994
+ assertDrawing__
1995
+ @painter__.rotate toDegrees__(angle), 1, 0, 0
1996
+ nil
1997
+ end
1998
+
1999
+ # Applies rotation around the y-axis.
2000
+ #
2001
+ # @param angle [Numeric] angle for rotation
2002
+ #
2003
+ # @return [nil] nil
2004
+ #
2005
+ # @see https://processing.org/reference/rotateY_.html
2006
+ # @see https://p5js.org/reference/#/p5/rotateY
2007
+ #
2008
+ def rotateY(angle)
2009
+ assertDrawing__
2010
+ @painter__.rotate toDegrees__(angle), 0, 1, 0
2011
+ nil
2012
+ end
2013
+
2014
+ # Applies rotation around the z-axis.
2015
+ #
2016
+ # @param angle [Numeric] angle for rotation
2017
+ #
2018
+ # @return [nil] nil
2019
+ #
2020
+ # @see https://processing.org/reference/rotateZ_.html
2021
+ # @see https://p5js.org/reference/#/p5/rotateZ
2022
+ #
2023
+ def rotateZ(angle)
2024
+ assertDrawing__
2025
+ @painter__.rotate toDegrees__(angle), 0, 0, 1
2026
+ nil
2027
+ end
2028
+
2029
+ # Applies shear around the x-axis.
2030
+ #
2031
+ # @param angle [Numeric] angle for shearing
2032
+ #
2033
+ # @return [nil] nil
2034
+ #
2035
+ # @see https://processing.org/reference/shearX_.html
2036
+ # @see https://p5js.org/reference/#/p5/shearX
2037
+ #
2038
+ def shearX(angle)
2039
+ t = Math.tan toRadians__(angle)
2040
+ @painter__.matrix *= Rays::Matrix.new(
2041
+ 1, t, 0, 0,
2042
+ 0, 1, 0, 0,
2043
+ 0, 0, 1, 0,
2044
+ 0, 0, 0, 1)
2045
+ nil
2046
+ end
2047
+
2048
+ # Applies shear around the y-axis.
2049
+ #
2050
+ # @param angle [Numeric] angle for shearing
2051
+ #
2052
+ # @return [nil] nil
2053
+ #
2054
+ # @see https://processing.org/reference/shearY_.html
2055
+ # @see https://p5js.org/reference/#/p5/shearY
2056
+ #
2057
+ def shearY(angle)
2058
+ t = Math.tan toRadians__(angle)
2059
+ @painter__.matrix *= Rays::Matrix.new(
2060
+ 1, 0, 0, 0,
2061
+ t, 1, 0, 0,
2062
+ 0, 0, 1, 0,
2063
+ 0, 0, 0, 1)
2064
+ nil
2065
+ end
2066
+
1551
2067
  # Pushes the current transformation matrix to stack.
1552
2068
  #
1553
2069
  # @return [Object] result of the expression at the end of the block
1554
2070
  #
2071
+ # @see https://processing.org/reference/pushMatrix_.html
2072
+ #
1555
2073
  def pushMatrix(&block)
1556
2074
  assertDrawing__
1557
2075
  @matrixStack__.push @painter__.matrix
@@ -1564,6 +2082,8 @@ module Processing
1564
2082
  #
1565
2083
  # @return [nil] nil
1566
2084
  #
2085
+ # @see https://processing.org/reference/popMatrix_.html
2086
+ #
1567
2087
  def popMatrix()
1568
2088
  assertDrawing__
1569
2089
  raise "matrix stack underflow" if @matrixStack__.empty?
@@ -1571,20 +2091,86 @@ module Processing
1571
2091
  nil
1572
2092
  end
1573
2093
 
2094
+ # Reset current transformation matrix with 2x3, or 4x4 matrix.
2095
+ #
2096
+ # @overload applyMatrix(array)
2097
+ # @overload applyMatrix(a, b, c, d, e, f)
2098
+ # @overload applyMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
2099
+ #
2100
+ # @param array [Array] 6 or 16 numbers which define the matrix
2101
+ # @param a [Numeric] number which defines the matrix
2102
+ # @param b [Numeric] number which defines the matrix
2103
+ # @param c [Numeric] number which defines the matrix
2104
+ # @param d [Numeric] number which defines the matrix
2105
+ # @param e [Numeric] number which defines the matrix
2106
+ # @param f [Numeric] number which defines the matrix
2107
+ # @param g [Numeric] number which defines the matrix
2108
+ # @param h [Numeric] number which defines the matrix
2109
+ # @param i [Numeric] number which defines the matrix
2110
+ # @param j [Numeric] number which defines the matrix
2111
+ # @param k [Numeric] number which defines the matrix
2112
+ # @param l [Numeric] number which defines the matrix
2113
+ # @param m [Numeric] number which defines the matrix
2114
+ # @param n [Numeric] number which defines the matrix
2115
+ # @param o [Numeric] number which defines the matrix
2116
+ # @param p [Numeric] number which defines the matrix
2117
+ #
2118
+ # @return [nil] nil
2119
+ #
2120
+ # @see https://processing.org/reference/applyMatrix_.html
2121
+ # @see https://p5js.org/reference/#/p5/applyMatrix
2122
+ #
2123
+ def applyMatrix(*args)
2124
+ assertDrawing__
2125
+ args = args.first if args.first.kind_of?(Array)
2126
+ if args.size == 6
2127
+ a, b, c, d, e, f = args
2128
+ args = [
2129
+ a, b, 0, 0,
2130
+ c, d, 0, 0,
2131
+ 0, 0, 1, 0,
2132
+ e, f, 0, 1
2133
+ ]
2134
+ end
2135
+ raise ArgumentError unless args.size == 16
2136
+ m = Rays::Matrix.new(*args)
2137
+ m.transpose! if @p5jsMode__
2138
+ @painter__.matrix *= m
2139
+ nil
2140
+ end
2141
+
1574
2142
  # Reset current transformation matrix with identity matrix.
1575
2143
  #
1576
2144
  # @return [nil] nil
1577
2145
  #
2146
+ # @see https://processing.org/reference/resetMatrix_.html
2147
+ # @see https://p5js.org/reference/#/p5/resetMatrix
2148
+ #
1578
2149
  def resetMatrix()
1579
2150
  assertDrawing__
1580
2151
  @painter__.matrix = 1
1581
2152
  nil
1582
2153
  end
1583
2154
 
2155
+ # Prints matrix elements to console.
2156
+ #
2157
+ # @return [nil] nil
2158
+ #
2159
+ # @see https://processing.org/reference/printMatrix_.html
2160
+ #
2161
+ def printMatrix()
2162
+ m = @painter__.matrix
2163
+ m.transpose! if @p5jsMode__
2164
+ print "%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n%f %f %f %f\n" % m.to_a
2165
+ nil
2166
+ end
2167
+
1584
2168
  # Save current style values to the style stack.
1585
2169
  #
1586
2170
  # @return [Object] result of the expression at the end of the block
1587
2171
  #
2172
+ # @see https://processing.org/reference/pushStyle_.html
2173
+ #
1588
2174
  def pushStyle(&block)
1589
2175
  assertDrawing__
1590
2176
  @styleStack__.push [
@@ -1593,6 +2179,8 @@ module Processing
1593
2179
  @painter__.stroke_width,
1594
2180
  @painter__.stroke_cap,
1595
2181
  @painter__.stroke_join,
2182
+ @painter__.miter_limit,
2183
+ @painter__.line_height!,
1596
2184
  @painter__.clip,
1597
2185
  @painter__.blend_mode,
1598
2186
  @painter__.font,
@@ -1600,13 +2188,22 @@ module Processing
1600
2188
  @painter__.texcoord_mode,
1601
2189
  @painter__.texcoord_wrap,
1602
2190
  @painter__.shader,
2191
+ @colorMode__,
1603
2192
  @hsbColor__,
1604
2193
  @colorMaxes__,
1605
- @angleScale__,
2194
+ @angleMode__,
2195
+ @toRad__,
2196
+ @toDeg__,
2197
+ @fromRad__,
2198
+ @fromDeg__,
1606
2199
  @rectMode__,
1607
2200
  @ellipseMode__,
1608
2201
  @imageMode__,
1609
2202
  @shapeMode__,
2203
+ @blendMode__,
2204
+ @curveDetail__,
2205
+ @curveTightness__,
2206
+ @bezierDetail__,
1610
2207
  @textAlignH__,
1611
2208
  @textAlignV__,
1612
2209
  @textFont__,
@@ -1621,6 +2218,8 @@ module Processing
1621
2218
  #
1622
2219
  # @return [nil] nil
1623
2220
  #
2221
+ # @see https://processing.org/reference/popStyle_.html
2222
+ #
1624
2223
  def popStyle()
1625
2224
  assertDrawing__
1626
2225
  raise "style stack underflow" if @styleStack__.empty?
@@ -1629,6 +2228,8 @@ module Processing
1629
2228
  @painter__.stroke_width,
1630
2229
  @painter__.stroke_cap,
1631
2230
  @painter__.stroke_join,
2231
+ @painter__.miter_limit,
2232
+ @painter__.line_height,
1632
2233
  @painter__.clip,
1633
2234
  @painter__.blend_mode,
1634
2235
  @painter__.font,
@@ -1636,13 +2237,22 @@ module Processing
1636
2237
  @painter__.texcoord_mode,
1637
2238
  @painter__.texcoord_wrap,
1638
2239
  @painter__.shader,
2240
+ @colorMode__,
1639
2241
  @hsbColor__,
1640
2242
  @colorMaxes__,
1641
- @angleScale__,
2243
+ @angleMode__,
2244
+ @toRad__,
2245
+ @toDeg__,
2246
+ @fromRad__,
2247
+ @fromDeg__,
1642
2248
  @rectMode__,
1643
2249
  @ellipseMode__,
1644
2250
  @imageMode__,
1645
2251
  @shapeMode__,
2252
+ @blendMode__,
2253
+ @curveDetail__,
2254
+ @curveTightness__,
2255
+ @bezierDetail__,
1646
2256
  @textAlignH__,
1647
2257
  @textAlignV__,
1648
2258
  @textFont__,
@@ -1655,6 +2265,9 @@ module Processing
1655
2265
  #
1656
2266
  # @return [Object] result of the expression at the end of the block
1657
2267
  #
2268
+ # @see https://processing.org/reference/push_.html
2269
+ # @see https://p5js.org/reference/#/p5/push
2270
+ #
1658
2271
  def push(&block)
1659
2272
  pushMatrix
1660
2273
  pushStyle
@@ -1667,6 +2280,9 @@ module Processing
1667
2280
  #
1668
2281
  # @return [nil] nil
1669
2282
  #
2283
+ # @see https://processing.org/reference/pop_.html
2284
+ # @see https://p5js.org/reference/#/p5/pop
2285
+ #
1670
2286
  def pop()
1671
2287
  popMatrix
1672
2288
  popStyle
@@ -1678,10 +2294,10 @@ module Processing
1678
2294
  end
1679
2295
 
1680
2296
  # @private
1681
- def drawImage__(painter, *args, **states)
2297
+ def drawImage__(painter, *args, image__: getInternal__, **states)
1682
2298
  shader = painter.shader || @filter__&.getInternal__
1683
2299
  painter.push shader: shader, **states do |_|
1684
- painter.image getInternal__, *args
2300
+ painter.image image__, *args
1685
2301
  end
1686
2302
  end
1687
2303
 
@@ -1700,6 +2316,9 @@ module Processing
1700
2316
  #
1701
2317
  # @return [Numeric] absolute number
1702
2318
  #
2319
+ # @see https://processing.org/reference/abs_.html
2320
+ # @see https://p5js.org/reference/#/p5/abs
2321
+ #
1703
2322
  def abs(value)
1704
2323
  value.abs
1705
2324
  end
@@ -1710,6 +2329,9 @@ module Processing
1710
2329
  #
1711
2330
  # @return [Numeric] rounded up number
1712
2331
  #
2332
+ # @see https://processing.org/reference/ceil_.html
2333
+ # @see https://p5js.org/reference/#/p5/ceil
2334
+ #
1713
2335
  def ceil(value)
1714
2336
  value.ceil
1715
2337
  end
@@ -1720,6 +2342,9 @@ module Processing
1720
2342
  #
1721
2343
  # @return [Numeric] rounded down number
1722
2344
  #
2345
+ # @see https://processing.org/reference/floor_.html
2346
+ # @see https://p5js.org/reference/#/p5/floor
2347
+ #
1723
2348
  def floor(value)
1724
2349
  value.floor
1725
2350
  end
@@ -1730,6 +2355,9 @@ module Processing
1730
2355
  #
1731
2356
  # @return [Numeric] rounded number
1732
2357
  #
2358
+ # @see https://processing.org/reference/round_.html
2359
+ # @see https://p5js.org/reference/#/p5/round
2360
+ #
1733
2361
  def round(value)
1734
2362
  value.round
1735
2363
  end
@@ -1740,6 +2368,9 @@ module Processing
1740
2368
  #
1741
2369
  # @return [Numeric] result number
1742
2370
  #
2371
+ # @see https://processing.org/reference/log_.html
2372
+ # @see https://p5js.org/reference/#/p5/log
2373
+ #
1743
2374
  def log(n)
1744
2375
  Math.log n
1745
2376
  end
@@ -1750,6 +2381,9 @@ module Processing
1750
2381
  #
1751
2382
  # @return [Numeric] result number
1752
2383
  #
2384
+ # @see https://processing.org/reference/exp_.html
2385
+ # @see https://p5js.org/reference/#/p5/exp
2386
+ #
1753
2387
  def exp(n)
1754
2388
  Math.exp n
1755
2389
  end
@@ -1761,6 +2395,9 @@ module Processing
1761
2395
  #
1762
2396
  # @return [Numeric] value ** exponent
1763
2397
  #
2398
+ # @see https://processing.org/reference/pow_.html
2399
+ # @see https://p5js.org/reference/#/p5/pow
2400
+ #
1764
2401
  def pow(value, exponent)
1765
2402
  value ** exponent
1766
2403
  end
@@ -1771,6 +2408,9 @@ module Processing
1771
2408
  #
1772
2409
  # @return [Numeric] squared value
1773
2410
  #
2411
+ # @see https://processing.org/reference/sq_.html
2412
+ # @see https://p5js.org/reference/#/p5/sq
2413
+ #
1774
2414
  def sq(value)
1775
2415
  value * value
1776
2416
  end
@@ -1781,6 +2421,9 @@ module Processing
1781
2421
  #
1782
2422
  # @return [Numeric] squared value
1783
2423
  #
2424
+ # @see https://processing.org/reference/sqrt_.html
2425
+ # @see https://p5js.org/reference/#/p5/sqrt
2426
+ #
1784
2427
  def sqrt(value)
1785
2428
  Math.sqrt value
1786
2429
  end
@@ -1796,6 +2439,9 @@ module Processing
1796
2439
  #
1797
2440
  # @return [Numeric] magnitude
1798
2441
  #
2442
+ # @see https://processing.org/reference/mag_.html
2443
+ # @see https://p5js.org/reference/#/p5/mag
2444
+ #
1799
2445
  def mag(*args)
1800
2446
  x, y, z = *args
1801
2447
  case args.size
@@ -1819,6 +2465,9 @@ module Processing
1819
2465
  #
1820
2466
  # @return [Numeric] distance between 2 points
1821
2467
  #
2468
+ # @see https://processing.org/reference/dist_.html
2469
+ # @see https://p5js.org/reference/#/p5/dist
2470
+ #
1822
2471
  def dist(*args)
1823
2472
  case args.size
1824
2473
  when 4
@@ -1841,6 +2490,9 @@ module Processing
1841
2490
  #
1842
2491
  # @return [Numeric] normalized value between 0..1
1843
2492
  #
2493
+ # @see https://processing.org/reference/norm_.html
2494
+ # @see https://p5js.org/reference/#/p5/norm
2495
+ #
1844
2496
  def norm(value, start, stop)
1845
2497
  (value.to_f - start.to_f) / (stop.to_f - start.to_f)
1846
2498
  end
@@ -1853,6 +2505,9 @@ module Processing
1853
2505
  #
1854
2506
  # @return [Numeric] interporated number
1855
2507
  #
2508
+ # @see https://processing.org/reference/lerp_.html
2509
+ # @see https://p5js.org/reference/#/p5/lerp
2510
+ #
1856
2511
  def lerp(start, stop, amount)
1857
2512
  start + (stop - start) * amount
1858
2513
  end
@@ -1865,6 +2520,9 @@ module Processing
1865
2520
  #
1866
2521
  # @return [Integer] interporated color
1867
2522
  #
2523
+ # @see https://processing.org/reference/lerpColor_.html
2524
+ # @see https://p5js.org/reference/#/p5/lerpColor
2525
+ #
1868
2526
  def lerpColor(color1, color2, amount)
1869
2527
  color(
1870
2528
  lerp(red( color1), red( color2), amount),
@@ -1883,6 +2541,9 @@ module Processing
1883
2541
  #
1884
2542
  # @return [Numeric] mapped number
1885
2543
  #
2544
+ # @see https://processing.org/reference/map_.html
2545
+ # @see https://p5js.org/reference/#/p5/map
2546
+ #
1886
2547
  def map(value, start1, stop1, start2, stop2)
1887
2548
  lerp start2, stop2, norm(value, start1, stop1)
1888
2549
  end
@@ -1900,6 +2561,9 @@ module Processing
1900
2561
  #
1901
2562
  # @return [Numeric] minimum value
1902
2563
  #
2564
+ # @see https://processing.org/reference/min_.html
2565
+ # @see https://p5js.org/reference/#/p5/min
2566
+ #
1903
2567
  def min(*args)
1904
2568
  args.flatten.min
1905
2569
  end
@@ -1917,6 +2581,9 @@ module Processing
1917
2581
  #
1918
2582
  # @return [Numeric] maximum value
1919
2583
  #
2584
+ # @see https://processing.org/reference/max_.html
2585
+ # @see https://p5js.org/reference/#/p5/max
2586
+ #
1920
2587
  def max(*args)
1921
2588
  args.flatten.max
1922
2589
  end
@@ -1929,6 +2596,9 @@ module Processing
1929
2596
  #
1930
2597
  # @return [Numeric] constrained number
1931
2598
  #
2599
+ # @see https://processing.org/reference/constrain_.html
2600
+ # @see https://p5js.org/reference/#/p5/constrain
2601
+ #
1932
2602
  def constrain(value, min, max)
1933
2603
  value < min ? min : (value > max ? max : value)
1934
2604
  end
@@ -1939,6 +2609,9 @@ module Processing
1939
2609
  #
1940
2610
  # @return [Numeric] radian
1941
2611
  #
2612
+ # @see https://processing.org/reference/radians_.html
2613
+ # @see https://p5js.org/reference/#/p5/radians
2614
+ #
1942
2615
  def radians(degree)
1943
2616
  degree * DEG2RAD__
1944
2617
  end
@@ -1949,6 +2622,9 @@ module Processing
1949
2622
  #
1950
2623
  # @return [Numeric] degree
1951
2624
  #
2625
+ # @see https://processing.org/reference/degrees_.html
2626
+ # @see https://p5js.org/reference/#/p5/degrees
2627
+ #
1952
2628
  def degrees(radian)
1953
2629
  radian * RAD2DEG__
1954
2630
  end
@@ -1959,6 +2635,9 @@ module Processing
1959
2635
  #
1960
2636
  # @return [Numeric] the sine
1961
2637
  #
2638
+ # @see https://processing.org/reference/sin_.html
2639
+ # @see https://p5js.org/reference/#/p5/sin
2640
+ #
1962
2641
  def sin(angle)
1963
2642
  Math.sin angle
1964
2643
  end
@@ -1969,6 +2648,9 @@ module Processing
1969
2648
  #
1970
2649
  # @return [Numeric] the cosine
1971
2650
  #
2651
+ # @see https://processing.org/reference/cos_.html
2652
+ # @see https://p5js.org/reference/#/p5/cos
2653
+ #
1972
2654
  def cos(angle)
1973
2655
  Math.cos angle
1974
2656
  end
@@ -1979,6 +2661,9 @@ module Processing
1979
2661
  #
1980
2662
  # @return [Numeric] the tangent
1981
2663
  #
2664
+ # @see https://processing.org/reference/tan_.html
2665
+ # @see https://p5js.org/reference/#/p5/tan
2666
+ #
1982
2667
  def tan(angle)
1983
2668
  Math.tan angle
1984
2669
  end
@@ -1989,6 +2674,9 @@ module Processing
1989
2674
  #
1990
2675
  # @return [Numeric] the arc sine
1991
2676
  #
2677
+ # @see https://processing.org/reference/asin_.html
2678
+ # @see https://p5js.org/reference/#/p5/asin
2679
+ #
1992
2680
  def asin(value)
1993
2681
  Math.asin value
1994
2682
  end
@@ -1999,6 +2687,9 @@ module Processing
1999
2687
  #
2000
2688
  # @return [Numeric] the arc cosine
2001
2689
  #
2690
+ # @see https://processing.org/reference/acos_.html
2691
+ # @see https://p5js.org/reference/#/p5/acos
2692
+ #
2002
2693
  def acos(value)
2003
2694
  Math.acos value
2004
2695
  end
@@ -2009,6 +2700,9 @@ module Processing
2009
2700
  #
2010
2701
  # @return [Numeric] the arc tangent
2011
2702
  #
2703
+ # @see https://processing.org/reference/atan_.html
2704
+ # @see https://p5js.org/reference/#/p5/atan
2705
+ #
2012
2706
  def atan(value)
2013
2707
  Math.atan value
2014
2708
  end
@@ -2020,10 +2714,105 @@ module Processing
2020
2714
  #
2021
2715
  # @return [Numeric] the angle in radians
2022
2716
  #
2717
+ # @see https://processing.org/reference/atan2_.html
2718
+ # @see https://p5js.org/reference/#/p5/atan2
2719
+ #
2023
2720
  def atan2(y, x)
2024
2721
  Math.atan2 y, x
2025
2722
  end
2026
2723
 
2724
+ # Evaluates the curve at point t for points a, b, c, d.
2725
+ #
2726
+ # @param a [Numeric] coordinate of first control point
2727
+ # @param b [Numeric] coordinate of first point on the curve
2728
+ # @param c [Numeric] coordinate of second point on the curve
2729
+ # @param d [Numeric] coordinate of second control point
2730
+ # @param t [Numeric] value between 0.0 and 1.0
2731
+ #
2732
+ # @return [Numeric] interpolated value
2733
+ #
2734
+ # @see https://processing.org/reference/curvePoint_.html
2735
+ # @see https://p5js.org/reference/#/p5/curvePoint
2736
+ #
2737
+ def curvePoint(a, b, c, d, t)
2738
+ s = @curveTightness__
2739
+ t3 = t * t * t
2740
+ t2 = t * t
2741
+ f1 = ( s - 1.0) / 2.0 * t3 + ( 1.0 - s) * t2 + (s - 1.0) / 2.0 * t
2742
+ f2 = ( s + 3.0) / 2.0 * t3 + (-5.0 - s) / 2.0 * t2 + 1.0
2743
+ f3 = (-3.0 - s) / 2.0 * t3 + ( s + 2.0) * t2 + (1.0 - s) / 2.0 * t
2744
+ f4 = ( 1.0 - s) / 2.0 * t3 + ( s - 1.0) / 2.0 * t2
2745
+ a * f1 + b * f2 + c * f3 + d * f4
2746
+ end
2747
+
2748
+ # Calculates the tangent of a point on a curve.
2749
+ #
2750
+ # @param a [Numeric] coordinate of first control point
2751
+ # @param b [Numeric] coordinate of first point on the curve
2752
+ # @param c [Numeric] coordinate of second point on the curve
2753
+ # @param d [Numeric] coordinate of second control point
2754
+ # @param t [Numeric] value between 0.0 and 1.0
2755
+ #
2756
+ # @return [Numeric] tangent value
2757
+ #
2758
+ # @see https://processing.org/reference/curveTangent_.html
2759
+ # @see https://p5js.org/reference/#/p5/curveTangent
2760
+ #
2761
+ def curveTangent(a, b, c, d, t)
2762
+ s = @curveTightness__
2763
+ tt3 = t * t * 3.0
2764
+ t2 = t * 2.0
2765
+ f1 = ( s - 1.0) / 2.0 * tt3 + ( 1.0 - s) * t2 + (s - 1.0) / 2.0
2766
+ f2 = ( s + 3.0) / 2.0 * tt3 + (-5.0 - s) / 2.0 * t2
2767
+ f3 = (-3.0 - s) / 2.0 * tt3 + ( s + 2.0) * t2 + (1.0 - s) / 2.0
2768
+ f4 = ( 1.0 - s) / 2.0 * tt3 + ( s - 1.0) / 2.0 * t2
2769
+ a * f1 + b * f2 + c * f3 + d * f4
2770
+ end
2771
+
2772
+ # Evaluates the Bezier at point t for points a, b, c, d.
2773
+ #
2774
+ # @param a [Numeric] coordinate of first point on the curve
2775
+ # @param b [Numeric] coordinate of first control point
2776
+ # @param c [Numeric] coordinate of second control point
2777
+ # @param d [Numeric] coordinate of second point on the curve
2778
+ # @param t [Numeric] value between 0.0 and 1.0
2779
+ #
2780
+ # @return [Numeric] interpolated value
2781
+ #
2782
+ # @see https://processing.org/reference/bezierPoint_.html
2783
+ # @see https://p5js.org/reference/#/p5/bezierPoint
2784
+ #
2785
+ def bezierPoint(a, b, c, d, t)
2786
+ tt = 1.0 - t
2787
+ tt ** 3.0 * a +
2788
+ tt ** 2.0 * b * 3.0 * t +
2789
+ t ** 2.0 * c * 3.0 * tt +
2790
+ t ** 3.0 * d
2791
+ end
2792
+
2793
+ # Calculates the tangent of a point on a Bezier curve.
2794
+ #
2795
+ # @param a [Numeric] coordinate of first point on the curve
2796
+ # @param b [Numeric] coordinate of first control point
2797
+ # @param c [Numeric] coordinate of second control point
2798
+ # @param d [Numeric] coordinate of second point on the curve
2799
+ # @param t [Numeric] value between 0.0 and 1.0
2800
+ #
2801
+ # @return [Numeric] tangent value
2802
+ #
2803
+ # @see https://processing.org/reference/bezierTangent_.html
2804
+ # @see https://p5js.org/reference/#/p5/bezierTangent
2805
+ #
2806
+ def bezierTangent(a, b, c, d, t)
2807
+ tt = 1.0 - t
2808
+ 3.0 * d * t ** 2.0 -
2809
+ 3.0 * c * t ** 2.0 +
2810
+ 6.0 * c * tt * t -
2811
+ 6.0 * b * tt * t +
2812
+ 3.0 * b * tt ** 2.0 -
2813
+ 3.0 * a * tt ** 2.0
2814
+ end
2815
+
2027
2816
  # Returns the perlin noise value.
2028
2817
  #
2029
2818
  # @overload noise(x)
@@ -2036,13 +2825,52 @@ module Processing
2036
2825
  #
2037
2826
  # @return [Numeric] noise value (0.0..1.0)
2038
2827
  #
2828
+ # @see https://processing.org/reference/noise_.html
2829
+ # @see https://p5js.org/reference/#/p5/noise
2830
+ #
2039
2831
  def noise(x, y = 0, z = 0)
2040
- Rays.perlin(x, y, z) / 2.0 + 0.5
2832
+ seed, falloff = @noiseSeed__, @noiseFallOff__
2833
+ amp = 0.5
2834
+ @noiseOctaves__.times.reduce(0) do |sum|
2835
+ value = (Rays.perlin(x, y, z, seed) / 2.0 + 0.5) * amp
2836
+ x *= 2
2837
+ y *= 2
2838
+ z *= 2
2839
+ amp *= falloff
2840
+ sum + value
2841
+ end
2842
+ end
2843
+
2844
+ # Sets the seed value for noise()
2845
+ #
2846
+ # @param seed [Numeric] seed value
2847
+ #
2848
+ # @return [nil] nil
2849
+ #
2850
+ # @see https://processing.org/reference/noiseSeed_.html
2851
+ # @see https://p5js.org/reference/#/p5/noiseSeed
2852
+ #
2853
+ def noiseSeed(seed)
2854
+ @noiseSeed__ = Random.new(seed).rand 0.0..1.0
2855
+ end
2856
+
2857
+ # Adjusts the character and level of detail produced by the Perlin noise function.
2858
+ #
2859
+ # @param lod [Numeric] number of octaves to be used by the noise
2860
+ # @param falloff [Numeric] falloff factor for each octave
2861
+ #
2862
+ # @return [nil] nil
2863
+ #
2864
+ # @see https://processing.org/reference/noiseDetail_.html
2865
+ # @see https://p5js.org/reference/#/p5/noiseDetail
2866
+ #
2867
+ def noiseDetail(lod, falloff = nil)
2868
+ @noiseOctaves__ = lod if lod && lod > 0
2869
+ @noiseFallOff__ = falloff if falloff && falloff > 0
2041
2870
  end
2042
2871
 
2043
2872
  # Returns a random number in range low...high
2044
2873
  #
2045
- # @overload random()
2046
2874
  # @overload random(high)
2047
2875
  # @overload random(low, high)
2048
2876
  # @overload random(choices)
@@ -2053,10 +2881,60 @@ module Processing
2053
2881
  #
2054
2882
  # @return [Float] random number
2055
2883
  #
2884
+ # @see https://processing.org/reference/random_.html
2885
+ # @see https://p5js.org/reference/#/p5/random
2886
+ #
2056
2887
  def random(*args)
2057
- return args.first.sample if args.first.kind_of? Array
2058
- high, low = args.reverse
2059
- rand (low || 0).to_f...(high || 1).to_f
2888
+ if args.first.kind_of? Array
2889
+ a = args.first
2890
+ a.empty? ? nil : a[@random__.rand a.size]
2891
+ else
2892
+ high, low = args.reverse
2893
+ @random__.rand (low || 0).to_f...(high || 1).to_f
2894
+ end
2895
+ end
2896
+
2897
+ # Sets the seed value for random()
2898
+ #
2899
+ # @param seed [Numeric] seed value
2900
+ #
2901
+ # @return [nil] nil
2902
+ #
2903
+ # @see https://processing.org/reference/randomSeed_.html
2904
+ # @see https://p5js.org/reference/#/p5/randomSeed
2905
+ #
2906
+ def randomSeed(seed)
2907
+ @random__ = Random.new seed
2908
+ @nextGaussian__ = nil
2909
+ end
2910
+
2911
+ # Returns a random number fitting a Gaussian, or normal, distribution.
2912
+ #
2913
+ # @param mean [Numeric] mean
2914
+ # @param sd [Numeric] standard deviation
2915
+ #
2916
+ # @return [Float] random number
2917
+ #
2918
+ # @see https://processing.org/reference/randomGaussian_.html
2919
+ # @see https://p5js.org/reference/#/p5/randomGaussian
2920
+ #
2921
+ def randomGaussian(mean = 0, sd = 1)
2922
+ value =
2923
+ if @nextGaussian__
2924
+ x, @nextGaussian__ = @nextGaussian__, nil
2925
+ x
2926
+ else
2927
+ a, b, w = 0, 0, 1
2928
+ until w < 1
2929
+ a = random(2) - 1
2930
+ b = random(2) - 1
2931
+ w = a ** 2 + b ** 2
2932
+ end
2933
+ w = Math.sqrt(-2 * Math.log(w) / w)
2934
+ @randomGaussian__ = a * w
2935
+ b * w
2936
+ end
2937
+ value * sd + mean
2060
2938
  end
2061
2939
 
2062
2940
  # Creates a new vector object.
@@ -2071,6 +2949,8 @@ module Processing
2071
2949
  #
2072
2950
  # @return [Vector] new vector
2073
2951
  #
2952
+ # @see https://p5js.org/reference/#/p5/createVector
2953
+ #
2074
2954
  def createVector(*args)
2075
2955
  Vector.new(*args, context: self)
2076
2956
  end
@@ -2080,6 +2960,10 @@ module Processing
2080
2960
  # @param name [String] font name
2081
2961
  # @param size [Numeric] font size (max 256)
2082
2962
  #
2963
+ # @return [Font] new font
2964
+ #
2965
+ # @see https://processing.org/reference/createFont_.html
2966
+ #
2083
2967
  def createFont(name, size)
2084
2968
  size = FONT_SIZE_MAX__ if size && size > FONT_SIZE_MAX__
2085
2969
  Font.new Rays::Font.new(name, size || FONT_SIZE_DEFAULT__)
@@ -2096,6 +2980,9 @@ module Processing
2096
2980
  #
2097
2981
  # @return [Image] new image
2098
2982
  #
2983
+ # @see https://processing.org/reference/createImage_.html
2984
+ # @see https://p5js.org/reference/#/p5/createImage
2985
+ #
2099
2986
  def createImage(w, h, format = RGBA)
2100
2987
  colorspace = {RGB => Rays::RGB, RGBA => Rays::RGBA}[format]
2101
2988
  raise ArgumentError, "Unknown image format" unless colorspace
@@ -2115,6 +3002,10 @@ module Processing
2115
3002
  #
2116
3003
  # @param kind [LINE, RECT, ELLIPSE, ARC, TRIANGLE, QUAD, GROUP]
2117
3004
  #
3005
+ # @return [Shape] new shape
3006
+ #
3007
+ # @see https://processing.org/reference/createShape_.html
3008
+ #
2118
3009
  def createShape(kind = nil, *args)
2119
3010
  case kind
2120
3011
  when LINE then createLineShape__( *args)
@@ -2171,6 +3062,9 @@ module Processing
2171
3062
  #
2172
3063
  # @return [Graphics] graphics object
2173
3064
  #
3065
+ # @see https://processing.org/reference/createGraphics_.html
3066
+ # @see https://p5js.org/reference/#/p5/createGraphics
3067
+ #
2174
3068
  def createGraphics(width, height, pixelDensity = 1)
2175
3069
  Graphics.new width, height, pixelDensity
2176
3070
  end
@@ -2207,6 +3101,8 @@ module Processing
2207
3101
  #
2208
3102
  # @return [Shader] shader object
2209
3103
  #
3104
+ # @see https://p5js.org/reference/#/p5/createShader
3105
+ #
2210
3106
  def createShader(vert, frag)
2211
3107
  vert = File.read if vert && File.exist?(vert)
2212
3108
  frag = File.read if frag && File.exist?(frag)
@@ -2235,7 +3131,7 @@ module Processing
2235
3131
  raise "unsupported font type -- '#{ext}'" unless ext =~ /^\.?(ttf|otf)$/i
2236
3132
 
2237
3133
  filename = httpGet__ filename, ext if filename =~ %r|^https?://|
2238
- Font.new Rays::Font.load p filename
3134
+ Font.new Rays::Font.load filename
2239
3135
  end
2240
3136
 
2241
3137
  # Loads image.
@@ -2288,6 +3184,9 @@ module Processing
2288
3184
  #
2289
3185
  # @return [Shader] loaded shader object
2290
3186
  #
3187
+ # @see https://processing.org/reference/loadShader_.html
3188
+ # @see https://p5js.org/reference/#/p5/loadShader
3189
+ #
2291
3190
  def loadShader(fragPath, vertPath = nil)
2292
3191
  createShader vertPath, fragPath
2293
3192
  end
@@ -2299,15 +3198,10 @@ module Processing
2299
3198
  path = path.sub_ext ext
2300
3199
 
2301
3200
  unless path.file?
2302
- URI.open uri do |input|
2303
- input.set_encoding nil# disable default_internal
3201
+ Net::HTTP.get_response URI.parse(uri) do |res|
3202
+ res.value # raise an error unless successful
2304
3203
  tmpdir.mkdir unless tmpdir.directory?
2305
- path.open('w') do |output|
2306
- output.set_encoding Encoding::ASCII_8BIT
2307
- while buf = input.read(2 ** 16)
2308
- output.write buf
2309
- end
2310
- end
3204
+ path.open('wb') {|file| res.read_body {|body| file.write body}}
2311
3205
  end
2312
3206
  end
2313
3207
  path.to_s