processing 0.5.32 → 0.5.34

Sign up to get free protection for your applications and to get access to all the features.
@@ -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