processing 0.5.14 → 0.5.17
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.
- checksums.yaml +4 -4
- data/ChangeLog.md +22 -0
- data/VERSION +1 -1
- data/lib/processing/context.rb +8 -0
- data/lib/processing/graphics.rb +7 -4
- data/lib/processing/graphics_context.rb +74 -4
- data/lib/processing/image.rb +42 -0
- data/lib/processing/shader.rb +104 -61
- data/lib/processing/window.rb +17 -8
- data/lib/processing.rb +3 -1
- data/processing.gemspec +2 -2
- data/test/test_graphics_context.rb +40 -0
- data/test/test_image.rb +30 -2
- data/test/test_shader.rb +14 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d69cca41be46b8a061bcafc55fd36cf71d50616b5b5697ab558dfac1c9c2449c
|
4
|
+
data.tar.gz: 4b3869b1fb410a2da488c03dd58e95fa1f0c42521888869bd70c0c18904831dc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0db54f243695541c85db93d6f28bf3bc42dc76d68e40e3d63cc4e3524110f33372987be661a9fe1e58698d7c3eae40c32b6a76f7660102efbd952591f041db33
|
7
|
+
data.tar.gz: e0719f14ed2fddc28d2dc908339fb633a3dcf645f20a98a52a333541078154aab4c5bcdb1dd36032b1dabbed8f229915ee8b36549085a785446b6aae38e6debc
|
data/ChangeLog.md
CHANGED
@@ -1,6 +1,28 @@
|
|
1
1
|
# processing ChangeLog
|
2
2
|
|
3
3
|
|
4
|
+
## [v0.5.17] - 2023-06-07
|
5
|
+
|
6
|
+
- Add Image#set() and Image#get()
|
7
|
+
- Add color(), red(), green(), blue(), and alpha()
|
8
|
+
- Add lerpColor()
|
9
|
+
- Add focused()
|
10
|
+
|
11
|
+
|
12
|
+
## [v0.5.16] - 2023-06-02
|
13
|
+
|
14
|
+
- Fix failed tests and add tests
|
15
|
+
|
16
|
+
|
17
|
+
## [v0.5.15] - 2023-06-02
|
18
|
+
|
19
|
+
- Set initial canvas size to same as the window size
|
20
|
+
- Use WIDTH and HEIGHT env vars for initial canvas size
|
21
|
+
- Shader class can take shadertoy frament shader source
|
22
|
+
- createGraphics() can take pixelDensity parameter
|
23
|
+
- Pass self to the block call of beginDraw(), and ensure endDraw
|
24
|
+
|
25
|
+
|
4
26
|
## [v0.5.14] - 2023-05-29
|
5
27
|
|
6
28
|
- Add windowMove() and windowResize()
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.5.
|
1
|
+
0.5.17
|
data/lib/processing/context.rb
CHANGED
@@ -468,6 +468,14 @@ module Processing
|
|
468
468
|
@window__.height
|
469
469
|
end
|
470
470
|
|
471
|
+
# Returns weather the window is active or not.
|
472
|
+
#
|
473
|
+
# @return [Boolean] active or not
|
474
|
+
#
|
475
|
+
def focused()
|
476
|
+
@window__.active?
|
477
|
+
end
|
478
|
+
|
471
479
|
# Returns the number of frames since the program started.
|
472
480
|
#
|
473
481
|
# @return [Integer] total number of frames
|
data/lib/processing/graphics.rb
CHANGED
@@ -10,8 +10,8 @@ module Processing
|
|
10
10
|
|
11
11
|
# Initialize graphics object.
|
12
12
|
#
|
13
|
-
def initialize(width, height)
|
14
|
-
image = Rays::Image.new width, height
|
13
|
+
def initialize(width, height, pixelDensity = 1)
|
14
|
+
image = Rays::Image.new width, height, Rays::RGBA, pixelDensity
|
15
15
|
init__ image, image.painter
|
16
16
|
end
|
17
17
|
|
@@ -22,8 +22,11 @@ module Processing
|
|
22
22
|
@painter__.__send__ :begin_paint
|
23
23
|
push
|
24
24
|
if block
|
25
|
-
|
26
|
-
|
25
|
+
begin
|
26
|
+
block.call self
|
27
|
+
ensure
|
28
|
+
endDraw
|
29
|
+
end
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
@@ -324,6 +324,59 @@ module Processing
|
|
324
324
|
@colorMode__
|
325
325
|
end
|
326
326
|
|
327
|
+
# Creates color value.
|
328
|
+
#
|
329
|
+
# @overload color(gray)
|
330
|
+
# @overload color(gray, alpha)
|
331
|
+
# @overload color(v1, v2, v3)
|
332
|
+
# @overload color(v1, v2, v3, alpha)
|
333
|
+
#
|
334
|
+
# @param gray [Numeric] the value for gray
|
335
|
+
# @param alpha [Numeric] the value for alpha
|
336
|
+
# @param v1 [Numeric] the value for red or hue
|
337
|
+
# @param v2 [Numeric] the value for green or saturation
|
338
|
+
# @param v3 [Numeric] the value for blue or brightness
|
339
|
+
#
|
340
|
+
# @return [Integer] the rgba color value
|
341
|
+
#
|
342
|
+
def color(*args)
|
343
|
+
toRGBA__(*args)
|
344
|
+
.map {|n| (n * 255).to_i.clamp 0, 255}
|
345
|
+
.then {|r, g, b, a| Image.toColor__ r, g, b, a}
|
346
|
+
end
|
347
|
+
|
348
|
+
# Returns the red value of the color.
|
349
|
+
#
|
350
|
+
# @return [Numeric] the red value
|
351
|
+
#
|
352
|
+
def red(color)
|
353
|
+
((color >> 16) & 0xff) / 255.0 * @colorMaxes__[0]
|
354
|
+
end
|
355
|
+
|
356
|
+
# Returns the green value of the color.
|
357
|
+
#
|
358
|
+
# @return [Numeric] the green value
|
359
|
+
#
|
360
|
+
def green(color)
|
361
|
+
((color >> 8) & 0xff) / 255.0 * @colorMaxes__[1]
|
362
|
+
end
|
363
|
+
|
364
|
+
# Returns the blue value of the color.
|
365
|
+
#
|
366
|
+
# @return [Numeric] the blue value
|
367
|
+
#
|
368
|
+
def blue(color)
|
369
|
+
(color & 0xff) / 255.0 * @colorMaxes__[2]
|
370
|
+
end
|
371
|
+
|
372
|
+
# Returns the red value of the color.
|
373
|
+
#
|
374
|
+
# @return [Numeric] the red value
|
375
|
+
#
|
376
|
+
def alpha(color)
|
377
|
+
((color >> 24) & 0xff) / 255.0 * @colorMaxes__[3]
|
378
|
+
end
|
379
|
+
|
327
380
|
# @private
|
328
381
|
private def toRGBA__(*args)
|
329
382
|
a, b, c, d = args
|
@@ -1427,6 +1480,22 @@ module Processing
|
|
1427
1480
|
start + (stop - start) * amount
|
1428
1481
|
end
|
1429
1482
|
|
1483
|
+
# Returns the interpolated color between color1 and color2.
|
1484
|
+
#
|
1485
|
+
# @param color1 [Integer] the 1st color for interpolation
|
1486
|
+
# @param color2 [Integer] the 2nd color for interpolation
|
1487
|
+
# @param amount [Numeric] amount to interpolate
|
1488
|
+
#
|
1489
|
+
# @return [Integer] interporated color
|
1490
|
+
#
|
1491
|
+
def lerpColor(color1, color2, amount)
|
1492
|
+
color(
|
1493
|
+
lerp(red( color1), red( color2), amount),
|
1494
|
+
lerp(green(color1), green(color2), amount),
|
1495
|
+
lerp(blue( color1), blue( color2), amount),
|
1496
|
+
lerp(alpha(color1), alpha(color2), amount))
|
1497
|
+
end
|
1498
|
+
|
1430
1499
|
# Maps a number from range start1..stop1 to range start2..stop2.
|
1431
1500
|
#
|
1432
1501
|
# @param value [Numeric] number to be mapped
|
@@ -1648,13 +1717,14 @@ module Processing
|
|
1648
1717
|
|
1649
1718
|
# Creates a new off-screen graphics context object.
|
1650
1719
|
#
|
1651
|
-
# @param width
|
1652
|
-
# @param height
|
1720
|
+
# @param width [Numeric] width of graphics image
|
1721
|
+
# @param height [Numeric] height of graphics image
|
1722
|
+
# @param pixelDensity [Numeric] pixel density of graphics image
|
1653
1723
|
#
|
1654
1724
|
# @return [Graphics] graphics object
|
1655
1725
|
#
|
1656
|
-
def createGraphics(width, height)
|
1657
|
-
Graphics.new width, height
|
1726
|
+
def createGraphics(width, height, pixelDensity = 1)
|
1727
|
+
Graphics.new width, height, pixelDensity
|
1658
1728
|
end
|
1659
1729
|
|
1660
1730
|
# Creates a shader object.
|
data/lib/processing/image.rb
CHANGED
@@ -39,6 +39,30 @@ module Processing
|
|
39
39
|
@image.size
|
40
40
|
end
|
41
41
|
|
42
|
+
# Sets the color of the pixel.
|
43
|
+
#
|
44
|
+
# @param x [Integer] x position of the pixel
|
45
|
+
# @param y [Integer] y position of the pixel
|
46
|
+
# @param c [Integer] color value
|
47
|
+
#
|
48
|
+
# @return [nil] nil
|
49
|
+
#
|
50
|
+
def set(x, y, c)
|
51
|
+
@image.bitmap[x, y] = self.class.fromColor__ c
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
# Returns the color of the pixel.
|
57
|
+
#
|
58
|
+
# @return [Integer] color value (0xAARRGGBB)
|
59
|
+
#
|
60
|
+
def get(x, y)
|
61
|
+
@image.bitmap[x, y]
|
62
|
+
.map {|n| (n * 255).to_i.clamp 0, 255}
|
63
|
+
.then {|r, g, b, a| self.class.toColor__ r, g, b, a}
|
64
|
+
end
|
65
|
+
|
42
66
|
# Applies an image filter.
|
43
67
|
#
|
44
68
|
# overload filter(shader)
|
@@ -135,6 +159,24 @@ module Processing
|
|
135
159
|
end
|
136
160
|
end
|
137
161
|
|
162
|
+
# @private
|
163
|
+
def self.fromColor__(color)
|
164
|
+
[
|
165
|
+
color >> 16 & 0xff,
|
166
|
+
color >> 8 & 0xff,
|
167
|
+
color & 0xff,
|
168
|
+
color >> 24 & 0xff
|
169
|
+
]
|
170
|
+
end
|
171
|
+
|
172
|
+
# @private
|
173
|
+
def self.toColor__(r, g, b, a)
|
174
|
+
(r & 0xff) << 16 |
|
175
|
+
(g & 0xff) << 8 |
|
176
|
+
(b & 0xff) |
|
177
|
+
(a & 0xff) << 24
|
178
|
+
end
|
179
|
+
|
138
180
|
end# Image
|
139
181
|
|
140
182
|
|
data/lib/processing/shader.rb
CHANGED
@@ -13,7 +13,7 @@ module Processing
|
|
13
13
|
# @param fragSrc [String] fragment shader source
|
14
14
|
#
|
15
15
|
def initialize(vertSrc, fragSrc)
|
16
|
-
@shader = Rays::Shader.new fragSrc, vertSrc, ENV__
|
16
|
+
@shader = Rays::Shader.new modifyFragSource(fragSrc), vertSrc, ENV__
|
17
17
|
end
|
18
18
|
|
19
19
|
# Sets uniform variables.
|
@@ -83,74 +83,117 @@ module Processing
|
|
83
83
|
when Shader
|
84
84
|
arg
|
85
85
|
when :threshold
|
86
|
-
self.new(nil,
|
87
|
-
uniform float threshold;
|
88
|
-
uniform sampler2D texMap;
|
89
|
-
varying vec4 vertTexCoord;
|
90
|
-
varying vec4 vertColor;
|
91
|
-
void main() {
|
92
|
-
vec4 col = texture2D(texMap, vertTexCoord.xy) * vertColor;
|
93
|
-
float gray = col.r * 0.3 + col.g * 0.59 + col.b * 0.11;
|
94
|
-
gl_FragColor = vec4(vec3(gray > threshold ? 1.0 : 0.0), 1.0);
|
95
|
-
}
|
96
|
-
END
|
86
|
+
self.new(nil, THRESHOLD_SOURCE).tap {|sh| sh.set :threshold, (args.shift || 0.5)}
|
97
87
|
when :gray
|
98
|
-
self.new nil,
|
99
|
-
uniform sampler2D texMap;
|
100
|
-
varying vec4 vertTexCoord;
|
101
|
-
varying vec4 vertColor;
|
102
|
-
void main() {
|
103
|
-
vec4 col = texture2D(texMap, vertTexCoord.xy);
|
104
|
-
float gray = col.r * 0.3 + col.g * 0.59 + col.b * 0.11;
|
105
|
-
gl_FragColor = vec4(vec3(gray), 1.0) * vertColor;
|
106
|
-
}
|
107
|
-
END
|
88
|
+
self.new nil, GRAY_SOURCE
|
108
89
|
when :invert
|
109
|
-
self.new nil,
|
110
|
-
uniform sampler2D texMap;
|
111
|
-
varying vec4 vertTexCoord;
|
112
|
-
varying vec4 vertColor;
|
113
|
-
void main() {
|
114
|
-
vec4 col = texture2D(texMap, vertTexCoord.xy);
|
115
|
-
gl_FragColor = vec4(vec3(1.0 - col.rgb), 1.0) * vertColor;
|
116
|
-
}
|
117
|
-
END
|
90
|
+
self.new nil, INVERT_SOURCE
|
118
91
|
when :blur
|
119
|
-
self.new(nil,
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
92
|
+
self.new(nil, BLUR_SOURCE).tap {|sh| sh.set :radius, (args.shift || 1).to_f}
|
93
|
+
else
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
THRESHOLD_SOURCE = <<~END
|
101
|
+
uniform float threshold;
|
102
|
+
uniform sampler2D texMap;
|
103
|
+
varying vec4 vertTexCoord;
|
104
|
+
varying vec4 vertColor;
|
105
|
+
void main() {
|
106
|
+
vec4 col = texture2D(texMap, vertTexCoord.xy) * vertColor;
|
107
|
+
float gray = col.r * 0.3 + col.g * 0.59 + col.b * 0.11;
|
108
|
+
gl_FragColor = vec4(vec3(gray > threshold ? 1.0 : 0.0), 1.0);
|
109
|
+
}
|
110
|
+
END
|
111
|
+
|
112
|
+
GRAY_SOURCE = <<~END
|
113
|
+
uniform sampler2D texMap;
|
114
|
+
varying vec4 vertTexCoord;
|
115
|
+
varying vec4 vertColor;
|
116
|
+
void main() {
|
117
|
+
vec4 col = texture2D(texMap, vertTexCoord.xy);
|
118
|
+
float gray = col.r * 0.3 + col.g * 0.59 + col.b * 0.11;
|
119
|
+
gl_FragColor = vec4(vec3(gray), 1.0) * vertColor;
|
120
|
+
}
|
121
|
+
END
|
122
|
+
|
123
|
+
INVERT_SOURCE = <<~END
|
124
|
+
uniform sampler2D texMap;
|
125
|
+
varying vec4 vertTexCoord;
|
126
|
+
varying vec4 vertColor;
|
127
|
+
void main() {
|
128
|
+
vec4 col = texture2D(texMap, vertTexCoord.xy);
|
129
|
+
gl_FragColor = vec4(vec3(1.0 - col.rgb), 1.0) * vertColor;
|
130
|
+
}
|
131
|
+
END
|
132
|
+
|
133
|
+
BLUR_SOURCE = <<~END
|
134
|
+
#define PI 3.1415926538
|
135
|
+
uniform float radius;
|
136
|
+
uniform sampler2D texMap;
|
137
|
+
uniform vec3 texMin;
|
138
|
+
uniform vec3 texMax;
|
139
|
+
uniform vec3 texOffset;
|
140
|
+
varying vec4 vertTexCoord;
|
141
|
+
varying vec4 vertColor;
|
142
|
+
float gaussian(vec2 pos, float sigma) {
|
143
|
+
float s2 = sigma * sigma;
|
144
|
+
return 1.0 / (2.0 * PI * s2) * exp(-(dot(pos, pos) / (2.0 * s2)));
|
145
|
+
}
|
146
|
+
void main() {
|
147
|
+
float sigma = radius * 0.5;
|
148
|
+
vec3 color = vec3(0.0);
|
149
|
+
float total_weight = 0.0;
|
150
|
+
for (float y = -radius; y < radius; y += 1.0)
|
151
|
+
for (float x = -radius; x < radius; x += 1.0) {
|
152
|
+
vec2 offset = vec2(x, y);
|
153
|
+
float weight = gaussian(offset, sigma);
|
154
|
+
vec2 texcoord = vertTexCoord.xy + offset * texOffset.xy;
|
155
|
+
if (
|
156
|
+
texcoord.x < texMin.x || texMax.x < texcoord.x ||
|
157
|
+
texcoord.y < texMin.y || texMax.y < texcoord.y
|
158
|
+
) continue;
|
159
|
+
color += texture2D(texMap, texcoord).rgb * weight;
|
160
|
+
total_weight += weight;
|
161
|
+
}
|
162
|
+
gl_FragColor = vec4(color / total_weight, 1.0) * vertColor;
|
163
|
+
}
|
164
|
+
END
|
165
|
+
|
166
|
+
def modifyFragSource(source)
|
167
|
+
return nil unless source
|
168
|
+
if hasShadertoyMainImage?(source) && source !~ /void\s+main\s*\(/
|
169
|
+
source += <<~END
|
126
170
|
varying vec4 vertTexCoord;
|
127
|
-
varying vec4 vertColor;
|
128
|
-
float gaussian(vec2 pos, float sigma) {
|
129
|
-
float s2 = sigma * sigma;
|
130
|
-
return 1.0 / (2.0 * PI * s2) * exp(-(dot(pos, pos) / (2.0 * s2)));
|
131
|
-
}
|
132
171
|
void main() {
|
133
|
-
|
134
|
-
vec3 color = vec3(0.0);
|
135
|
-
float total_weight = 0.0;
|
136
|
-
for (float y = -radius; y < radius; y += 1.0)
|
137
|
-
for (float x = -radius; x < radius; x += 1.0) {
|
138
|
-
vec2 offset = vec2(x, y);
|
139
|
-
float weight = gaussian(offset, sigma);
|
140
|
-
vec2 texcoord = vertTexCoord.xy + offset * texOffset.xy;
|
141
|
-
if (
|
142
|
-
texcoord.x < texMin.x || texMax.x < texcoord.x ||
|
143
|
-
texcoord.y < texMin.y || texMax.y < texcoord.y
|
144
|
-
) continue;
|
145
|
-
color += texture2D(texMap, texcoord).rgb * weight;
|
146
|
-
total_weight += weight;
|
147
|
-
}
|
148
|
-
gl_FragColor = vec4(color / total_weight, 1.0) * vertColor;
|
172
|
+
mainImage(gl_FragColor, vertTexCoord.xy);
|
149
173
|
}
|
150
174
|
END
|
151
|
-
else
|
152
|
-
nil
|
153
175
|
end
|
176
|
+
{
|
177
|
+
iTime: :float,
|
178
|
+
iResolution: :vec2,
|
179
|
+
iMouse: :vec2
|
180
|
+
}.each do |uniformName, type|
|
181
|
+
if needsUniformDeclaration type, uniformName, source
|
182
|
+
source = <<~END + source
|
183
|
+
uniform #{type} #{uniformName};
|
184
|
+
END
|
185
|
+
end
|
186
|
+
end
|
187
|
+
source
|
188
|
+
end
|
189
|
+
|
190
|
+
def hasShadertoyMainImage?(source)
|
191
|
+
source =~ /void\s+mainImage\s*\(\s*out\s+vec4\s+\w+\s*,\s*in\s+vec2\s+\w+\s*\)/
|
192
|
+
end
|
193
|
+
|
194
|
+
def needsUniformDeclaration(type, uniformName, source)
|
195
|
+
source.include?(uniformName.to_s) &&
|
196
|
+
source !~ /uniform\s+#{type}\s+#{uniformName}/
|
154
197
|
end
|
155
198
|
|
156
199
|
end# Shader
|
data/lib/processing/window.rb
CHANGED
@@ -6,7 +6,7 @@ module Processing
|
|
6
6
|
|
7
7
|
include Xot::Inspectable
|
8
8
|
|
9
|
-
attr_accessor :setup, :update, :draw,
|
9
|
+
attr_accessor :setup, :update, :draw,
|
10
10
|
:key_down, :key_up,
|
11
11
|
:pointer_down, :pointer_up, :pointer_move, :pointer_drag,
|
12
12
|
:move, :resize, :motion,
|
@@ -18,9 +18,10 @@ module Processing
|
|
18
18
|
Processing.instance_variable_set :@window, self
|
19
19
|
|
20
20
|
@events = []
|
21
|
+
@active = false
|
21
22
|
@error = nil
|
22
23
|
@auto_resize = true
|
23
|
-
@canvas = Canvas.new self
|
24
|
+
@canvas = Canvas.new self, width, height
|
24
25
|
@canvas_view = add CanvasView.new name: :canvas
|
25
26
|
@overlay_view = @canvas_view.add Reflex::View.new name: :overlay
|
26
27
|
|
@@ -43,6 +44,10 @@ module Processing
|
|
43
44
|
@events.last
|
44
45
|
end
|
45
46
|
|
47
|
+
def active?()
|
48
|
+
@active
|
49
|
+
end
|
50
|
+
|
46
51
|
def add_overlay(view)
|
47
52
|
@overlay_view.add view
|
48
53
|
end
|
@@ -58,14 +63,18 @@ module Processing
|
|
58
63
|
call_block @setup, nil
|
59
64
|
end
|
60
65
|
|
61
|
-
def on_resize(e)
|
62
|
-
on_canvas_resize e
|
63
|
-
end
|
64
|
-
|
65
66
|
def on_change_pixel_density(pixel_density)
|
66
67
|
resize_canvas width, height, window_pixel_density: pixel_density
|
67
68
|
end
|
68
69
|
|
70
|
+
def on_activate(e)
|
71
|
+
@active = true
|
72
|
+
end
|
73
|
+
|
74
|
+
def on_deactivate(e)
|
75
|
+
@active = false
|
76
|
+
end
|
77
|
+
|
69
78
|
def on_draw(e)
|
70
79
|
window_painter.pixel_density.tap do |pd|
|
71
80
|
prev, @prev_pixel_density = @prev_pixel_density, pd
|
@@ -204,11 +213,11 @@ module Processing
|
|
204
213
|
|
205
214
|
attr_reader :image, :painter
|
206
215
|
|
207
|
-
def initialize(window)
|
216
|
+
def initialize(window, width, height)
|
208
217
|
@image = nil
|
209
218
|
@painter = window.painter
|
210
219
|
|
211
|
-
resize
|
220
|
+
resize width, height
|
212
221
|
painter.miter_limit = 10
|
213
222
|
end
|
214
223
|
|
data/lib/processing.rb
CHANGED
@@ -2,7 +2,9 @@ require 'processing/all'
|
|
2
2
|
|
3
3
|
|
4
4
|
module Processing
|
5
|
-
|
5
|
+
w = (ENV['WIDTH'] || 500).to_i
|
6
|
+
h = (ENV['HEIGHT'] || 500).to_i
|
7
|
+
WINDOW = Processing::Window.new(w, h) {start}
|
6
8
|
CONTEXT = Processing::Context.new WINDOW
|
7
9
|
|
8
10
|
refine Object do
|
data/processing.gemspec
CHANGED
@@ -27,8 +27,8 @@ Gem::Specification.new do |s|
|
|
27
27
|
|
28
28
|
s.add_runtime_dependency 'xot', '~> 0.1.38'
|
29
29
|
s.add_runtime_dependency 'rucy', '~> 0.1.38'
|
30
|
-
s.add_runtime_dependency 'rays', '~> 0.1.
|
31
|
-
s.add_runtime_dependency 'reflexion', '~> 0.1.
|
30
|
+
s.add_runtime_dependency 'rays', '~> 0.1.40'
|
31
|
+
s.add_runtime_dependency 'reflexion', '~> 0.1.43'
|
32
32
|
|
33
33
|
s.add_development_dependency 'rake'
|
34
34
|
s.add_development_dependency 'test-unit'
|
@@ -40,4 +40,44 @@ class TestGraphicsContext < Test::Unit::TestCase
|
|
40
40
|
assert_raise {g.blendMode LEFT}
|
41
41
|
end
|
42
42
|
|
43
|
+
def test_color()
|
44
|
+
g = graphics
|
45
|
+
|
46
|
+
g.colorMode G::RGB, 255
|
47
|
+
c = g.color 10, 20, 30, 40
|
48
|
+
assert_equal 0x280a141e, c
|
49
|
+
assert_equal [10, 20, 30, 40], [g.red(c), g.green(c), g.blue(c), g.alpha(c)]
|
50
|
+
|
51
|
+
g.colorMode G::RGB, 1.0
|
52
|
+
c = g.color 0.1, 0.2, 0.3, 0.4
|
53
|
+
assert_equal 0x6619334c, c
|
54
|
+
assert_in_delta 0.1, g.red(c), 1 / 256.0
|
55
|
+
assert_in_delta 0.2, g.green(c), 1 / 256.0
|
56
|
+
assert_in_delta 0.3, g.blue(c), 1 / 256.0
|
57
|
+
assert_in_delta 0.4, g.alpha(c), 1 / 256.0
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_lerp()
|
61
|
+
g = graphics
|
62
|
+
|
63
|
+
assert_equal 1.0, g.lerp(1.0, 2.0, 0.0)
|
64
|
+
assert_equal 1.5, g.lerp(1.0, 2.0, 0.5)
|
65
|
+
assert_equal 2.0, g.lerp(1.0, 2.0, 1.0)
|
66
|
+
|
67
|
+
assert_equal 0.9, g.lerp(1.0, 2.0, -0.1)
|
68
|
+
assert_equal 2.1, g.lerp(1.0, 2.0, 1.1)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_lerpColor()
|
72
|
+
g = graphics
|
73
|
+
c = -> red, green, blue {g.color red, green, blue}
|
74
|
+
|
75
|
+
assert_equal c[10, 20, 30], g.lerpColor(c[10, 20, 30], c[50, 60, 70], 0.0)
|
76
|
+
assert_equal c[30, 40, 50], g.lerpColor(c[10, 20, 30], c[50, 60, 70], 0.5)
|
77
|
+
assert_equal c[50, 60, 70], g.lerpColor(c[10, 20, 30], c[50, 60, 70], 1.0)
|
78
|
+
|
79
|
+
assert_equal c[-10, 0, 10], g.lerpColor(c[10, 20, 30], c[50, 60, 70], -0.5)
|
80
|
+
assert_equal c[ 70, 80, 90], g.lerpColor(c[10, 20, 30], c[50, 60, 70], 1.5)
|
81
|
+
end
|
82
|
+
|
43
83
|
end# TestGraphics
|
data/test/test_image.rb
CHANGED
@@ -5,8 +5,36 @@ class TestImage < Test::Unit::TestCase
|
|
5
5
|
|
6
6
|
P = Processing
|
7
7
|
|
8
|
-
def image(w = 10, h = 10)
|
9
|
-
|
8
|
+
def image(w = 10, h = 10, &block)
|
9
|
+
img = Rays::Image.new w, h
|
10
|
+
img.paint &block if block
|
11
|
+
P::Image.new img
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_set_color()
|
15
|
+
g = graphics
|
16
|
+
i = image(2, 2) {fill 0; rect 0, 0, 1, 1}
|
17
|
+
|
18
|
+
assert_equal g.color(0, 0, 0), i.get(0, 0)
|
19
|
+
|
20
|
+
i.set 0, 0, g.color(0, 255, 0)
|
21
|
+
assert_equal g.color(0, 255, 0), i.get(0, 0)
|
22
|
+
|
23
|
+
i.set 0, 0, g.color(0, 0, 255)
|
24
|
+
assert_equal g.color(0, 0, 255), i.get(0, 0)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_get_color()
|
28
|
+
g = graphics
|
29
|
+
i = image 2, 2 do
|
30
|
+
fill 1, 0, 0; rect 0, 0, 1, 1
|
31
|
+
fill 0, 1, 0; rect 1, 0, 1, 1
|
32
|
+
fill 0, 0, 1; rect 0, 1, 1, 1
|
33
|
+
end
|
34
|
+
|
35
|
+
assert_equal g.color(255, 0, 0), i.get(0, 0)
|
36
|
+
assert_equal g.color(0, 255, 0), i.get(1, 0)
|
37
|
+
assert_equal g.color(0, 0, 255), i.get(0, 1)
|
10
38
|
end
|
11
39
|
|
12
40
|
def test_inspect()
|
data/test/test_shader.rb
CHANGED
@@ -41,6 +41,20 @@ class TestShader < Test::Unit::TestCase
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
def test_shadertoy_shader()
|
45
|
+
assert_equal <<~EXPECTED, shader(nil, <<~ACTUAL).instance_variable_get(:@shader).fragment_shader_source
|
46
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
47
|
+
}
|
48
|
+
varying vec4 vertTexCoord;
|
49
|
+
void main() {
|
50
|
+
mainImage(gl_FragColor, vertTexCoord.xy);
|
51
|
+
}
|
52
|
+
EXPECTED
|
53
|
+
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
54
|
+
}
|
55
|
+
ACTUAL
|
56
|
+
end
|
57
|
+
|
44
58
|
def test_inspect()
|
45
59
|
assert_match %r|#<Processing::Shader:0x\w{16}>|, shader.inspect
|
46
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: processing
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- xordog
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: xot
|
@@ -44,28 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.1.
|
47
|
+
version: 0.1.40
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.1.
|
54
|
+
version: 0.1.40
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: reflexion
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.1.
|
61
|
+
version: 0.1.43
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.1.
|
68
|
+
version: 0.1.43
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|