processing 0.5.32 → 0.5.34
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog.md +49 -1
- data/VERSION +1 -1
- data/lib/processing/all.rb +3 -1
- data/lib/processing/context.rb +232 -16
- data/lib/processing/events.rb +22 -0
- data/lib/processing/font.rb +5 -0
- data/lib/processing/graphics.rb +11 -2
- data/lib/processing/graphics_context.rb +968 -74
- data/lib/processing/image.rb +92 -1
- data/lib/processing/shader.rb +29 -16
- data/lib/processing/shape.rb +268 -12
- data/lib/processing/vector.rb +126 -0
- data/lib/processing/window.rb +98 -58
- data/processing.gemspec +4 -4
- data/test/helper.rb +5 -2
- data/test/p5.rb +1 -1
- data/test/test_font.rb +1 -1
- data/test/test_graphics_context.rb +442 -8
- data/test/test_utility.rb +0 -19
- metadata +12 -11
data/lib/processing/vector.rb
CHANGED
@@ -3,6 +3,9 @@ module Processing
|
|
3
3
|
|
4
4
|
# Vector class.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PVector.html
|
7
|
+
# @see https://p5js.org/reference/#/p5.Vector
|
8
|
+
#
|
6
9
|
class Vector
|
7
10
|
|
8
11
|
include Comparable
|
@@ -22,6 +25,9 @@ module Processing
|
|
22
25
|
# @param v [Vector] vector object to copy
|
23
26
|
# @param a [Array] array like [x, y, z]
|
24
27
|
#
|
28
|
+
# @see https://processing.org/reference/PVector.html
|
29
|
+
# @see https://p5js.org/reference/#/p5.Vector
|
30
|
+
#
|
25
31
|
def initialize(x = 0, y = 0, z = 0, context: nil)
|
26
32
|
@point = case x
|
27
33
|
when Rays::Point then x.dup
|
@@ -42,6 +48,9 @@ module Processing
|
|
42
48
|
#
|
43
49
|
# @return [Vector] duplicated vector object
|
44
50
|
#
|
51
|
+
# @see https://processing.org/reference/PVector_copy_.html
|
52
|
+
# @see https://p5js.org/reference/#/p5.Vector/copy
|
53
|
+
#
|
45
54
|
alias copy dup
|
46
55
|
|
47
56
|
# Sets x, y and z.
|
@@ -60,6 +69,9 @@ module Processing
|
|
60
69
|
#
|
61
70
|
# @return [nil] nil
|
62
71
|
#
|
72
|
+
# @see https://processing.org/reference/PVector_set_.html
|
73
|
+
# @see https://p5js.org/reference/#/p5.Vector/set
|
74
|
+
#
|
63
75
|
def set(*args)
|
64
76
|
initialize(*args)
|
65
77
|
self
|
@@ -69,6 +81,9 @@ module Processing
|
|
69
81
|
#
|
70
82
|
# @return [Numeric] x value of vector
|
71
83
|
#
|
84
|
+
# @see https://processing.org/reference/PVector_x.html
|
85
|
+
# @see https://p5js.org/reference/#/p5.Vector/x
|
86
|
+
#
|
72
87
|
def x()
|
73
88
|
@point.x
|
74
89
|
end
|
@@ -77,6 +92,9 @@ module Processing
|
|
77
92
|
#
|
78
93
|
# @return [Numeric] y value of vector
|
79
94
|
#
|
95
|
+
# @see https://processing.org/reference/PVector_y.html
|
96
|
+
# @see https://p5js.org/reference/#/p5.Vector/y
|
97
|
+
#
|
80
98
|
def y()
|
81
99
|
@point.y
|
82
100
|
end
|
@@ -85,6 +103,9 @@ module Processing
|
|
85
103
|
#
|
86
104
|
# @return [Numeric] z value of vector
|
87
105
|
#
|
106
|
+
# @see https://processing.org/reference/PVector_z.html
|
107
|
+
# @see https://p5js.org/reference/#/p5.Vector/z
|
108
|
+
#
|
88
109
|
def z()
|
89
110
|
@point.z
|
90
111
|
end
|
@@ -93,6 +114,9 @@ module Processing
|
|
93
114
|
#
|
94
115
|
# @return [Numeric] x value of vector
|
95
116
|
#
|
117
|
+
# @see https://processing.org/reference/PVector_x.html
|
118
|
+
# @see https://p5js.org/reference/#/p5.Vector/x
|
119
|
+
#
|
96
120
|
def x=(x)
|
97
121
|
@point.x = x
|
98
122
|
end
|
@@ -101,6 +125,9 @@ module Processing
|
|
101
125
|
#
|
102
126
|
# @return [Numeric] y value of vector
|
103
127
|
#
|
128
|
+
# @see https://processing.org/reference/PVector_y.html
|
129
|
+
# @see https://p5js.org/reference/#/p5.Vector/y
|
130
|
+
#
|
104
131
|
def y=(y)
|
105
132
|
@point.y = y
|
106
133
|
end
|
@@ -109,6 +136,9 @@ module Processing
|
|
109
136
|
#
|
110
137
|
# @return [Numeric] z value of vector
|
111
138
|
#
|
139
|
+
# @see https://processing.org/reference/PVector_z.html
|
140
|
+
# @see https://p5js.org/reference/#/p5.Vector/z
|
141
|
+
#
|
112
142
|
def z=(z)
|
113
143
|
@point.z = z
|
114
144
|
end
|
@@ -127,6 +157,9 @@ module Processing
|
|
127
157
|
#
|
128
158
|
# @return [Vector] interporated vector
|
129
159
|
#
|
160
|
+
# @see https://processing.org/reference/PVector_lerp_.html
|
161
|
+
# @see https://p5js.org/reference/#/p5.Vector/lerp
|
162
|
+
#
|
130
163
|
def lerp(*args, amount)
|
131
164
|
v = toVector__(*args)
|
132
165
|
self.x = x + (v.x - x) * amount
|
@@ -143,6 +176,9 @@ module Processing
|
|
143
176
|
#
|
144
177
|
# @return [Vector] interporated vector
|
145
178
|
#
|
179
|
+
# @see https://processing.org/reference/PVector_lerp_.html
|
180
|
+
# @see https://p5js.org/reference/#/p5.Vector/lerp
|
181
|
+
#
|
146
182
|
def self.lerp(v1, v2, amount)
|
147
183
|
v1.dup.lerp v2, amount
|
148
184
|
end
|
@@ -153,6 +189,9 @@ module Processing
|
|
153
189
|
#
|
154
190
|
# @return [Array] array of x, y, z
|
155
191
|
#
|
192
|
+
# @see https://processing.org/reference/PVector_array_.html
|
193
|
+
# @see https://p5js.org/reference/#/p5.Vector/array
|
194
|
+
#
|
156
195
|
def array(n = 3)
|
157
196
|
@point.to_a n
|
158
197
|
end
|
@@ -172,6 +211,9 @@ module Processing
|
|
172
211
|
#
|
173
212
|
# @return [Vector] added vector
|
174
213
|
#
|
214
|
+
# @see https://processing.org/reference/PVector_add_.html
|
215
|
+
# @see https://p5js.org/reference/#/p5.Vector/add
|
216
|
+
#
|
175
217
|
def add(*args)
|
176
218
|
@point += toVector__(*args).getInternal__
|
177
219
|
self
|
@@ -190,6 +232,9 @@ module Processing
|
|
190
232
|
#
|
191
233
|
# @return [Vector] subtracted vector
|
192
234
|
#
|
235
|
+
# @see https://processing.org/reference/PVector_sub_.html
|
236
|
+
# @see https://p5js.org/reference/#/p5.Vector/sub
|
237
|
+
#
|
193
238
|
def sub(*args)
|
194
239
|
@point -= toVector__(*args).getInternal__
|
195
240
|
self
|
@@ -201,6 +246,9 @@ module Processing
|
|
201
246
|
#
|
202
247
|
# @return [Vector] multiplied vector
|
203
248
|
#
|
249
|
+
# @see https://processing.org/reference/PVector_mult_.html
|
250
|
+
# @see https://p5js.org/reference/#/p5.Vector/mult
|
251
|
+
#
|
204
252
|
def mult(num)
|
205
253
|
@point *= num
|
206
254
|
self
|
@@ -212,6 +260,9 @@ module Processing
|
|
212
260
|
#
|
213
261
|
# @return [Vector] divided vector
|
214
262
|
#
|
263
|
+
# @see https://processing.org/reference/PVector_div_.html
|
264
|
+
# @see https://p5js.org/reference/#/p5.Vector/div
|
265
|
+
#
|
215
266
|
def div(num)
|
216
267
|
@point /= num
|
217
268
|
self
|
@@ -223,6 +274,9 @@ module Processing
|
|
223
274
|
#
|
224
275
|
# @return [Vector] added vector
|
225
276
|
#
|
277
|
+
# @see https://processing.org/reference/PVector_add_.html
|
278
|
+
# @see https://p5js.org/reference/#/p5.Vector/add
|
279
|
+
#
|
226
280
|
def +(v)
|
227
281
|
dup.add v
|
228
282
|
end
|
@@ -233,6 +287,9 @@ module Processing
|
|
233
287
|
#
|
234
288
|
# @return [Vector] subtracted vector
|
235
289
|
#
|
290
|
+
# @see https://processing.org/reference/PVector_sub_.html
|
291
|
+
# @see https://p5js.org/reference/#/p5.Vector/sub
|
292
|
+
#
|
236
293
|
def -(v)
|
237
294
|
dup.sub v
|
238
295
|
end
|
@@ -243,6 +300,9 @@ module Processing
|
|
243
300
|
#
|
244
301
|
# @return [Vector] multiplied vector
|
245
302
|
#
|
303
|
+
# @see https://processing.org/reference/PVector_mult_.html
|
304
|
+
# @see https://p5js.org/reference/#/p5.Vector/mult
|
305
|
+
#
|
246
306
|
def *(num)
|
247
307
|
dup.mult num
|
248
308
|
end
|
@@ -253,6 +313,9 @@ module Processing
|
|
253
313
|
#
|
254
314
|
# @return [Vector] divided vector
|
255
315
|
#
|
316
|
+
# @see https://processing.org/reference/PVector_div_.html
|
317
|
+
# @see https://p5js.org/reference/#/p5.Vector/div
|
318
|
+
#
|
256
319
|
def /(num)
|
257
320
|
dup.div num
|
258
321
|
end
|
@@ -268,6 +331,9 @@ module Processing
|
|
268
331
|
#
|
269
332
|
# @return [Vector] added vector
|
270
333
|
#
|
334
|
+
# @see https://processing.org/reference/PVector_add_.html
|
335
|
+
# @see https://p5js.org/reference/#/p5.Vector/add
|
336
|
+
#
|
271
337
|
def self.add(v1, v2, target = nil)
|
272
338
|
v = v1 + v2
|
273
339
|
target.set v if self === target
|
@@ -285,6 +351,9 @@ module Processing
|
|
285
351
|
#
|
286
352
|
# @return [Vector] subtracted vector
|
287
353
|
#
|
354
|
+
# @see https://processing.org/reference/PVector_sub_.html
|
355
|
+
# @see https://p5js.org/reference/#/p5.Vector/sub
|
356
|
+
#
|
288
357
|
def self.sub(v1, v2, target = nil)
|
289
358
|
v = v1 - v2
|
290
359
|
target.set v if self === target
|
@@ -302,6 +371,9 @@ module Processing
|
|
302
371
|
#
|
303
372
|
# @return [Vector] multiplied vector
|
304
373
|
#
|
374
|
+
# @see https://processing.org/reference/PVector_mult_.html
|
375
|
+
# @see https://p5js.org/reference/#/p5.Vector/mult
|
376
|
+
#
|
305
377
|
def self.mult(v1, num, target = nil)
|
306
378
|
v = v1 * num
|
307
379
|
target.set v if self === target
|
@@ -319,6 +391,9 @@ module Processing
|
|
319
391
|
#
|
320
392
|
# @return [Vector] divided vector
|
321
393
|
#
|
394
|
+
# @see https://processing.org/reference/PVector_div_.html
|
395
|
+
# @see https://p5js.org/reference/#/p5.Vector/div
|
396
|
+
#
|
322
397
|
def self.div(v1, num, target = nil)
|
323
398
|
v = v1 / num
|
324
399
|
target.set v if self === target
|
@@ -329,6 +404,9 @@ module Processing
|
|
329
404
|
#
|
330
405
|
# @return [Numeric] length
|
331
406
|
#
|
407
|
+
# @see https://processing.org/reference/PVector_mag_.html
|
408
|
+
# @see https://p5js.org/reference/#/p5.Vector/mag
|
409
|
+
#
|
332
410
|
def mag()
|
333
411
|
@point.length
|
334
412
|
end
|
@@ -337,6 +415,9 @@ module Processing
|
|
337
415
|
#
|
338
416
|
# @return [Numeric] squared length
|
339
417
|
#
|
418
|
+
# @see https://processing.org/reference/PVector_magSq_.html
|
419
|
+
# @see https://p5js.org/reference/#/p5.Vector/magSq
|
420
|
+
#
|
340
421
|
def magSq()
|
341
422
|
Rays::Point::dot(@point, @point)
|
342
423
|
end
|
@@ -351,6 +432,9 @@ module Processing
|
|
351
432
|
#
|
352
433
|
# @return [Vector] vector with new length
|
353
434
|
#
|
435
|
+
# @see https://processing.org/reference/PVector_setMag_.html
|
436
|
+
# @see https://p5js.org/reference/#/p5.Vector/setMag
|
437
|
+
#
|
354
438
|
def setMag(target = nil, len)
|
355
439
|
(target || self).set @point.normal * len
|
356
440
|
end
|
@@ -361,6 +445,9 @@ module Processing
|
|
361
445
|
#
|
362
446
|
# @return [Vector] normalized vector
|
363
447
|
#
|
448
|
+
# @see https://processing.org/reference/PVector_normalize_.html
|
449
|
+
# @see https://p5js.org/reference/#/p5.Vector/normalize
|
450
|
+
#
|
364
451
|
def normalize(target = nil)
|
365
452
|
(target || self).set @point.normal
|
366
453
|
end
|
@@ -371,6 +458,9 @@ module Processing
|
|
371
458
|
#
|
372
459
|
# @return [Vector] new vector
|
373
460
|
#
|
461
|
+
# @see https://processing.org/reference/PVector_limit_.html
|
462
|
+
# @see https://p5js.org/reference/#/p5.Vector/limit
|
463
|
+
#
|
374
464
|
def limit(max)
|
375
465
|
setMag max if magSq > max ** 2
|
376
466
|
self
|
@@ -382,6 +472,9 @@ module Processing
|
|
382
472
|
#
|
383
473
|
# @return [Numeric] the distance
|
384
474
|
#
|
475
|
+
# @see https://processing.org/reference/PVector_dist_.html
|
476
|
+
# @see https://p5js.org/reference/#/p5.Vector/dist
|
477
|
+
#
|
385
478
|
def dist(v)
|
386
479
|
(self - v).mag
|
387
480
|
end
|
@@ -393,6 +486,9 @@ module Processing
|
|
393
486
|
#
|
394
487
|
# @return [Numeric] the distance
|
395
488
|
#
|
489
|
+
# @see https://processing.org/reference/PVector_dist_.html
|
490
|
+
# @see https://p5js.org/reference/#/p5.Vector/dist
|
491
|
+
#
|
396
492
|
def self.dist(v1, v2)
|
397
493
|
v1.dist v2
|
398
494
|
end
|
@@ -410,6 +506,9 @@ module Processing
|
|
410
506
|
#
|
411
507
|
# @return [Numeric] result of dot product
|
412
508
|
#
|
509
|
+
# @see https://processing.org/reference/PVector_dot_.html
|
510
|
+
# @see https://p5js.org/reference/#/p5.Vector/dot
|
511
|
+
#
|
413
512
|
def dot(*args)
|
414
513
|
Rays::Point::dot getInternal__, toVector__(*args).getInternal__
|
415
514
|
end
|
@@ -421,6 +520,9 @@ module Processing
|
|
421
520
|
#
|
422
521
|
# @return [Numeric] result of dot product
|
423
522
|
#
|
523
|
+
# @see https://processing.org/reference/PVector_dot_.html
|
524
|
+
# @see https://p5js.org/reference/#/p5.Vector/dot
|
525
|
+
#
|
424
526
|
def self.dot(v1, v2)
|
425
527
|
v1.dot v2
|
426
528
|
end
|
@@ -438,6 +540,9 @@ module Processing
|
|
438
540
|
#
|
439
541
|
# @return [Numeric] result of cross product
|
440
542
|
#
|
543
|
+
# @see https://processing.org/reference/PVector_cross_.html
|
544
|
+
# @see https://p5js.org/reference/#/p5.Vector/cross
|
545
|
+
#
|
441
546
|
def cross(a, *rest)
|
442
547
|
target = self.class === rest.last ? rest.pop : nil
|
443
548
|
v = self.class.new Rays::Point::cross getInternal__, toVector__(a, *rest).getInternal__
|
@@ -452,6 +557,9 @@ module Processing
|
|
452
557
|
#
|
453
558
|
# @return [Numeric] result of cross product
|
454
559
|
#
|
560
|
+
# @see https://processing.org/reference/PVector_cross_.html
|
561
|
+
# @see https://p5js.org/reference/#/p5.Vector/cross
|
562
|
+
#
|
455
563
|
def self.cross(v1, v2, target = nil)
|
456
564
|
v1.cross v2, target
|
457
565
|
end
|
@@ -462,6 +570,9 @@ module Processing
|
|
462
570
|
#
|
463
571
|
# @return [Vector] rotated this object
|
464
572
|
#
|
573
|
+
# @see https://processing.org/reference/PVector_rotate_.html
|
574
|
+
# @see https://p5js.org/reference/#/p5.Vector/rotate
|
575
|
+
#
|
465
576
|
def rotate(angle)
|
466
577
|
deg = @context ?
|
467
578
|
@context.toDegrees__(angle) : angle * GraphicsContext::RAD2DEG__
|
@@ -473,6 +584,9 @@ module Processing
|
|
473
584
|
#
|
474
585
|
# @return [Numeric] the angle in radians
|
475
586
|
#
|
587
|
+
# @see https://processing.org/reference/PVector_heading_.html
|
588
|
+
# @see https://p5js.org/reference/#/p5.Vector/heading
|
589
|
+
#
|
476
590
|
def heading()
|
477
591
|
Math.atan2 y, x
|
478
592
|
end
|
@@ -484,6 +598,9 @@ module Processing
|
|
484
598
|
#
|
485
599
|
# @return [Vector] rotated vector
|
486
600
|
#
|
601
|
+
# @see https://processing.org/reference/PVector_fromAngle_.html
|
602
|
+
# @see https://p5js.org/reference/#/p5.Vector/fromAngle
|
603
|
+
#
|
487
604
|
def self.fromAngle(angle, target = nil)
|
488
605
|
v = self.new(1, 0, 0).rotate(angle)
|
489
606
|
target.set v if target
|
@@ -497,6 +614,9 @@ module Processing
|
|
497
614
|
#
|
498
615
|
# @return [Numeric] angle in radians
|
499
616
|
#
|
617
|
+
# @see https://processing.org/reference/PVector_angleBetween_.html
|
618
|
+
# @see https://p5js.org/reference/#/p5.Vector/angleBetween
|
619
|
+
#
|
500
620
|
def self.angleBetween(v1, v2)
|
501
621
|
x1, y1, z1 = v1.array
|
502
622
|
x2, y2, z2 = v2.array
|
@@ -514,6 +634,9 @@ module Processing
|
|
514
634
|
#
|
515
635
|
# @return [Vector] a random vector
|
516
636
|
#
|
637
|
+
# @see https://processing.org/reference/PVector_random2D_.html
|
638
|
+
# @see https://p5js.org/reference/#/p5.Vector/random2D
|
639
|
+
#
|
517
640
|
def self.random2D(target = nil)
|
518
641
|
v = self.new(1, 0, 0)
|
519
642
|
v.getInternal__.rotate! rand 0.0...360.0
|
@@ -527,6 +650,9 @@ module Processing
|
|
527
650
|
#
|
528
651
|
# @return [Vector] a random vector
|
529
652
|
#
|
653
|
+
# @see https://processing.org/reference/PVector_random3D_.html
|
654
|
+
# @see https://p5js.org/reference/#/p5.Vector/random3D
|
655
|
+
#
|
530
656
|
def self.random3D(target = nil)
|
531
657
|
angle = rand 0.0...(Math::PI * 2)
|
532
658
|
z = rand(-1.0..1.0)
|
data/lib/processing/window.rb
CHANGED
@@ -6,14 +6,6 @@ module Processing
|
|
6
6
|
|
7
7
|
include Xot::Inspectable
|
8
8
|
|
9
|
-
attr_accessor :setup, :update, :draw,
|
10
|
-
:key_down, :key_up,
|
11
|
-
:pointer_down, :pointer_up, :pointer_move,
|
12
|
-
:move, :resize, :motion,
|
13
|
-
:before_draw, :after_draw, :update_window, :update_canvas
|
14
|
-
|
15
|
-
attr_accessor :auto_resize
|
16
|
-
|
17
9
|
def initialize(width = 500, height = 500, *args, **kwargs, &block)
|
18
10
|
Processing.instance_variable_set :@window, self
|
19
11
|
|
@@ -26,19 +18,16 @@ module Processing
|
|
26
18
|
@overlay_view = @canvas_view.add Reflex::View.new name: :overlay
|
27
19
|
|
28
20
|
super(*args, size: [width, height], **kwargs, &block)
|
21
|
+
self.center = screen.center
|
29
22
|
end
|
30
23
|
|
31
|
-
|
32
|
-
|
33
|
-
|
24
|
+
attr_accessor :setup, :update, :draw, :move, :resize, :motion,
|
25
|
+
:key_down, :key_up, :pointer_down, :pointer_up, :pointer_move, :wheel,
|
26
|
+
:before_draw, :after_draw, :update_window, :update_canvas
|
34
27
|
|
35
|
-
|
36
|
-
@canvas.painter
|
37
|
-
end
|
28
|
+
attr_accessor :auto_resize
|
38
29
|
|
39
|
-
|
40
|
-
self.painter
|
41
|
-
end
|
30
|
+
attr_reader :canvas
|
42
31
|
|
43
32
|
def event()
|
44
33
|
@events.last
|
@@ -64,7 +53,9 @@ module Processing
|
|
64
53
|
end
|
65
54
|
|
66
55
|
def on_change_pixel_density(pixel_density)
|
67
|
-
resize_canvas
|
56
|
+
resize_canvas(
|
57
|
+
@canvas.width, @canvas.height,
|
58
|
+
window_pixel_density: pixel_density)
|
68
59
|
end
|
69
60
|
|
70
61
|
def on_activate(e)
|
@@ -80,7 +71,7 @@ module Processing
|
|
80
71
|
end
|
81
72
|
|
82
73
|
def on_draw(e)
|
83
|
-
|
74
|
+
painter.pixel_density.tap do |pd|
|
84
75
|
prev, @prev_pixel_density = @prev_pixel_density, pd
|
85
76
|
on_change_pixel_density pd if prev && pd != prev
|
86
77
|
end
|
@@ -127,28 +118,35 @@ module Processing
|
|
127
118
|
draw_canvas {call_block block, e} if block
|
128
119
|
end
|
129
120
|
|
121
|
+
def on_canvas_wheel(e)
|
122
|
+
draw_canvas {call_block @wheel, e} if @wheel
|
123
|
+
end
|
124
|
+
|
130
125
|
def on_canvas_resize(e)
|
131
126
|
resize_canvas e.width, e.height if @auto_resize
|
132
127
|
draw_canvas {call_block @resize, e} if @resize
|
133
128
|
end
|
134
129
|
|
135
|
-
def resize_canvas(
|
136
|
-
|
137
|
-
|
130
|
+
def resize_canvas(
|
131
|
+
width, height,
|
132
|
+
pixel_density = nil,
|
133
|
+
window_pixel_density: nil,
|
134
|
+
antialiasing: nil)
|
135
|
+
|
136
|
+
painting = @canvas.painter.painting?
|
137
|
+
@canvas.painter.__send__ :end_paint if painting
|
138
138
|
|
139
139
|
@pixel_density = pixel_density if pixel_density
|
140
140
|
|
141
141
|
resized =
|
142
142
|
begin
|
143
|
-
|
143
|
+
pd = @pixel_density || window_pixel_density
|
144
|
+
@canvas.resize width, height, pd, antialiasing
|
144
145
|
ensure
|
145
|
-
|
146
|
+
@canvas.painter.__send__ :begin_paint if painting
|
146
147
|
end
|
147
148
|
|
148
|
-
if resized
|
149
|
-
@update_canvas.call canvas_image, canvas_painter if @update_canvas
|
150
|
-
size width, height
|
151
|
-
end
|
149
|
+
@update_canvas&.call @canvas.image, @canvas.painter if resized
|
152
150
|
end
|
153
151
|
|
154
152
|
private
|
@@ -157,12 +155,12 @@ module Processing
|
|
157
155
|
scrollx, scrolly, zoom = get_scroll_and_zoom
|
158
156
|
@canvas_view.scroll_to scrollx, scrolly
|
159
157
|
@canvas_view.zoom = zoom
|
160
|
-
@overlay_view.size =
|
158
|
+
@overlay_view.size = @canvas.image.size
|
161
159
|
end
|
162
160
|
|
163
161
|
def get_scroll_and_zoom()
|
164
|
-
ww, wh =
|
165
|
-
cw, ch =
|
162
|
+
ww, wh = width.to_f, height.to_f
|
163
|
+
cw, ch = @canvas.image.width.to_f, @canvas.image.height.to_f
|
166
164
|
return [0, 0, 1] if ww == 0 || wh == 0 || cw == 0 || ch == 0
|
167
165
|
|
168
166
|
wratio, cratio = ww / wh, cw / ch
|
@@ -184,21 +182,21 @@ module Processing
|
|
184
182
|
end
|
185
183
|
|
186
184
|
def begin_draw()
|
187
|
-
|
185
|
+
@canvas.painter.__send__ :begin_paint
|
188
186
|
@before_draw&.call
|
189
187
|
end
|
190
188
|
|
191
189
|
def end_draw()
|
192
190
|
@after_draw&.call
|
193
|
-
|
191
|
+
@canvas.painter.__send__ :end_paint
|
194
192
|
end
|
195
193
|
|
196
194
|
def drawing?()
|
197
|
-
|
195
|
+
@canvas.painter.painting?
|
198
196
|
end
|
199
197
|
|
200
198
|
def draw_screen(painter)
|
201
|
-
|
199
|
+
painter.image @canvas.render
|
202
200
|
end
|
203
201
|
|
204
202
|
def call_block(block, event, *args)
|
@@ -214,60 +212,98 @@ module Processing
|
|
214
212
|
end# Window
|
215
213
|
|
216
214
|
|
215
|
+
# @private
|
217
216
|
class Window::Canvas
|
218
217
|
|
219
|
-
attr_reader :image, :painter
|
220
|
-
|
221
218
|
def initialize(window, width, height)
|
222
|
-
@
|
223
|
-
@
|
219
|
+
@framebuffer = nil
|
220
|
+
@paintable = nil
|
221
|
+
@painter = window.painter
|
222
|
+
|
223
|
+
@painter.miter_limit = 10
|
224
224
|
|
225
225
|
resize width, height
|
226
|
-
painter.miter_limit = 10
|
227
226
|
end
|
228
227
|
|
229
|
-
|
228
|
+
attr_reader :painter
|
229
|
+
|
230
|
+
def resize(width, height, pixel_density = nil, antialiasing = nil)
|
230
231
|
return false if width <= 0 || height <= 0
|
231
232
|
|
233
|
+
cs = @framebuffer&.color_space || Rays::RGBA
|
234
|
+
pd = pixel_density || (@framebuffer || @painter).pixel_density
|
235
|
+
aa = antialiasing == nil ? antialiasing? : (antialiasing && pd < 2)
|
232
236
|
return false if
|
233
|
-
width
|
234
|
-
height
|
235
|
-
|
237
|
+
width == @framebuffer&.width &&
|
238
|
+
height == @framebuffer&.height &&
|
239
|
+
pd == @framebuffer&.pixel_density &&
|
240
|
+
aa == antialiasing?
|
236
241
|
|
237
|
-
|
238
|
-
old_painter = @painter
|
239
|
-
cs = old_image&.color_space || Rays::RGBA
|
240
|
-
pd = pixel_density || old_painter.pixel_density
|
242
|
+
old_paintable, old_painter = @paintable, @painter
|
241
243
|
|
242
|
-
@
|
243
|
-
@
|
244
|
+
@framebuffer = Rays::Image.new width, height, cs, pd
|
245
|
+
@paintable = aa ? Rays::Image.new(width, height, cs, pd * 2) : @framebuffer
|
246
|
+
@painter = @paintable.painter
|
244
247
|
|
245
|
-
@painter.paint {image
|
248
|
+
@painter.paint {image old_paintable} if old_paintable
|
246
249
|
copy_painter old_painter, @painter
|
247
250
|
|
248
251
|
GC.start
|
249
252
|
return true
|
250
253
|
end
|
251
254
|
|
255
|
+
def render()
|
256
|
+
@framebuffer.paint {|p| p.image @paintable} if antialiasing?
|
257
|
+
@framebuffer
|
258
|
+
end
|
259
|
+
|
260
|
+
def image()
|
261
|
+
@paintable
|
262
|
+
end
|
263
|
+
|
264
|
+
def width()
|
265
|
+
@framebuffer.width
|
266
|
+
end
|
267
|
+
|
268
|
+
def height()
|
269
|
+
@framebuffer.height
|
270
|
+
end
|
271
|
+
|
272
|
+
def pixel_density()
|
273
|
+
@framebuffer.pixel_density
|
274
|
+
end
|
275
|
+
|
276
|
+
def antialiasing?()
|
277
|
+
!!@framebuffer && !!@paintable && @framebuffer != @paintable
|
278
|
+
end
|
279
|
+
|
252
280
|
private
|
253
281
|
|
254
282
|
def copy_painter(from, to)
|
255
|
-
to.fill
|
256
|
-
to.stroke
|
257
|
-
to.stroke_width
|
258
|
-
to.stroke_cap
|
259
|
-
to.stroke_join
|
260
|
-
to.miter_limit
|
261
|
-
to.
|
283
|
+
to.fill = from.fill
|
284
|
+
to.stroke = from.stroke
|
285
|
+
to.stroke_width = from.stroke_width
|
286
|
+
to.stroke_cap = from.stroke_cap
|
287
|
+
to.stroke_join = from.stroke_join
|
288
|
+
to.miter_limit = from.miter_limit
|
289
|
+
to.clip = from.clip
|
290
|
+
to.blend_mode = from.blend_mode
|
291
|
+
to.font = from.font
|
292
|
+
to.texture = from.texture
|
293
|
+
to.texcoord_mode = from.texcoord_mode
|
294
|
+
to.texcoord_wrap = from.texcoord_wrap
|
295
|
+
to.shader = from.shader
|
262
296
|
end
|
263
297
|
|
264
298
|
end# Window::Canvas
|
265
299
|
|
266
300
|
|
301
|
+
# @private
|
267
302
|
class Window::CanvasView < Reflex::View
|
268
303
|
|
269
304
|
def on_update(e)
|
270
305
|
window.on_canvas_update e
|
306
|
+
Thread.pass
|
271
307
|
end
|
272
308
|
|
273
309
|
def on_draw(e)
|
@@ -278,6 +314,10 @@ module Processing
|
|
278
314
|
window.on_canvas_pointer e
|
279
315
|
end
|
280
316
|
|
317
|
+
def on_wheel(e)
|
318
|
+
window.on_canvas_wheel e
|
319
|
+
end
|
320
|
+
|
281
321
|
def on_resize(e)
|
282
322
|
window.on_canvas_resize e
|
283
323
|
end
|
data/processing.gemspec
CHANGED
@@ -25,10 +25,10 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.platform = Gem::Platform::RUBY
|
26
26
|
s.required_ruby_version = '>= 3.0.0'
|
27
27
|
|
28
|
-
s.add_runtime_dependency 'xot', '~> 0.1.
|
29
|
-
s.add_runtime_dependency 'rucy', '~> 0.1.
|
30
|
-
s.add_runtime_dependency 'rays', '~> 0.1.
|
31
|
-
s.add_runtime_dependency 'reflexion', '~> 0.1.
|
28
|
+
s.add_runtime_dependency 'xot', '~> 0.1.42'
|
29
|
+
s.add_runtime_dependency 'rucy', '~> 0.1.44'
|
30
|
+
s.add_runtime_dependency 'rays', '~> 0.1.49'
|
31
|
+
s.add_runtime_dependency 'reflexion', '~> 0.1.57'
|
32
32
|
|
33
33
|
s.files = `git ls-files`.split $/
|
34
34
|
s.test_files = s.files.grep %r{^(test|spec|features)/}
|