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/image.rb
CHANGED
@@ -3,6 +3,9 @@ module Processing
|
|
3
3
|
|
4
4
|
# Image object.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PImage.html
|
7
|
+
# @see https://p5js.org/reference/#/p5.Image
|
8
|
+
#
|
6
9
|
class Image
|
7
10
|
|
8
11
|
include Xot::Inspectable
|
@@ -17,6 +20,9 @@ module Processing
|
|
17
20
|
#
|
18
21
|
# @return [Numeric] width of image
|
19
22
|
#
|
23
|
+
# @see https://processing.org/reference/PImage_width.html
|
24
|
+
# @see https://p5js.org/reference/#/p5.Image/width
|
25
|
+
#
|
20
26
|
def width()
|
21
27
|
@image&.width || (@error ? -1 : 0)
|
22
28
|
end
|
@@ -25,6 +31,9 @@ module Processing
|
|
25
31
|
#
|
26
32
|
# @return [Numeric] height of image
|
27
33
|
#
|
34
|
+
# @see https://processing.org/reference/PImage_height.html
|
35
|
+
# @see https://p5js.org/reference/#/p5.Image/height
|
36
|
+
#
|
28
37
|
def height()
|
29
38
|
@image&.height || (@error ? -1 : 0)
|
30
39
|
end
|
@@ -48,8 +57,11 @@ module Processing
|
|
48
57
|
#
|
49
58
|
# @return [nil] nil
|
50
59
|
#
|
60
|
+
# @see https://processing.org/reference/PImage_set_.html
|
61
|
+
# @see https://p5js.org/reference/#/p5.Image/set
|
62
|
+
#
|
51
63
|
def set(x, y, c)
|
52
|
-
getInternal__.bitmap[x, y] = self.class.fromColor__
|
64
|
+
getInternal__.bitmap(true)[x, y] = self.class.fromColor__(c).map {|n| n / 255.0}
|
53
65
|
nil
|
54
66
|
end
|
55
67
|
|
@@ -57,6 +69,9 @@ module Processing
|
|
57
69
|
#
|
58
70
|
# @return [Integer] color value (0xAARRGGBB)
|
59
71
|
#
|
72
|
+
# @see https://processing.org/reference/PImage_get_.html
|
73
|
+
# @see https://p5js.org/reference/#/p5.Image/get
|
74
|
+
#
|
60
75
|
def get(x, y)
|
61
76
|
getInternal__.bitmap[x, y]
|
62
77
|
.map {|n| (n * 255).to_i.clamp 0, 255}
|
@@ -67,6 +82,9 @@ module Processing
|
|
67
82
|
#
|
68
83
|
# @return [nil] nil
|
69
84
|
#
|
85
|
+
# @see https://processing.org/reference/PImage_loadPixels_.html
|
86
|
+
# @see https://p5js.org/reference/#/p5.Image/loadPixels
|
87
|
+
#
|
70
88
|
def loadPixels()
|
71
89
|
@pixels = getInternal__.pixels
|
72
90
|
end
|
@@ -75,6 +93,9 @@ module Processing
|
|
75
93
|
#
|
76
94
|
# @return [nil] nil
|
77
95
|
#
|
96
|
+
# @see https://processing.org/reference/PImage_updatePixels_.html
|
97
|
+
# @see https://p5js.org/reference/#/p5.Image/updatePixels
|
98
|
+
#
|
78
99
|
def updatePixels()
|
79
100
|
return unless @pixels
|
80
101
|
getInternal__.pixels = @pixels
|
@@ -84,6 +105,11 @@ module Processing
|
|
84
105
|
# An array of all pixels.
|
85
106
|
# Call loadPixels() before accessing the array.
|
86
107
|
#
|
108
|
+
# @return [Array] color array
|
109
|
+
#
|
110
|
+
# @see https://processing.org/reference/PImage_pixels.html
|
111
|
+
# @see https://p5js.org/reference/#/p5.Image/pixels
|
112
|
+
#
|
87
113
|
attr_reader :pixels
|
88
114
|
|
89
115
|
# Applies an image filter.
|
@@ -96,6 +122,9 @@ module Processing
|
|
96
122
|
# @param type [THRESHOLD, GRAY, INVERT, BLUR] filter type
|
97
123
|
# @param param [Numeric] a parameter for each filter
|
98
124
|
#
|
125
|
+
# @see https://processing.org/reference/PImage_filter_.html
|
126
|
+
# @see https://p5js.org/reference/#/p5.Image/filter
|
127
|
+
#
|
99
128
|
def filter(*args)
|
100
129
|
@filter = Shader.createFilter__(*args)
|
101
130
|
end
|
@@ -107,6 +136,9 @@ module Processing
|
|
107
136
|
#
|
108
137
|
# @return [nil] nil
|
109
138
|
#
|
139
|
+
# @see https://processing.org/reference/PImage_resize_.html
|
140
|
+
# @see https://p5js.org/reference/#/p5.Image/resize
|
141
|
+
#
|
110
142
|
def resize(width, height)
|
111
143
|
@image = Rays::Image.new(width, height).paint do |painter|
|
112
144
|
painter.image getInternal__, 0, 0, width, height
|
@@ -131,10 +163,18 @@ module Processing
|
|
131
163
|
#
|
132
164
|
# @return [nil] nil
|
133
165
|
#
|
166
|
+
# @see https://processing.org/reference/PImage_copy_.html
|
167
|
+
# @see https://p5js.org/reference/#/p5.Image/copy
|
168
|
+
#
|
134
169
|
def copy(img = nil, sx, sy, sw, sh, dx, dy, dw, dh)
|
135
170
|
blend img, sx, sy, sw, sh, dx, dy, dw, dh, :normal
|
136
171
|
end
|
137
172
|
|
173
|
+
# @private
|
174
|
+
def mask__()
|
175
|
+
raise NotImplementedError
|
176
|
+
end
|
177
|
+
|
138
178
|
# Blends image.
|
139
179
|
#
|
140
180
|
# @overload blend(sx, sy, sw, sh, dx, dy, dw, dh, mode)
|
@@ -153,6 +193,9 @@ module Processing
|
|
153
193
|
#
|
154
194
|
# @return [nil] nil
|
155
195
|
#
|
196
|
+
# @see https://processing.org/reference/PImage_blend_.html
|
197
|
+
# @see https://p5js.org/reference/#/p5.Image/blend
|
198
|
+
#
|
156
199
|
def blend(img = nil, sx, sy, sw, sh, dx, dy, dw, dh, mode)
|
157
200
|
img ||= self
|
158
201
|
getInternal__.paint do |painter|
|
@@ -161,12 +204,60 @@ module Processing
|
|
161
204
|
nil
|
162
205
|
end
|
163
206
|
|
207
|
+
# @private
|
208
|
+
def blendColor__()
|
209
|
+
raise NotImplementedError
|
210
|
+
end
|
211
|
+
|
212
|
+
# @private
|
213
|
+
def reset__()
|
214
|
+
raise NotImplementedError
|
215
|
+
end
|
216
|
+
|
217
|
+
# @private
|
218
|
+
def setFrame__()
|
219
|
+
raise NotImplementedError
|
220
|
+
end
|
221
|
+
|
222
|
+
# @private
|
223
|
+
def getCurrentFrame__()
|
224
|
+
raise NotImplementedError
|
225
|
+
end
|
226
|
+
|
227
|
+
# @private
|
228
|
+
def setFrame__()
|
229
|
+
raise NotImplementedError
|
230
|
+
end
|
231
|
+
|
232
|
+
# @private
|
233
|
+
def numFrames__()
|
234
|
+
raise NotImplementedError
|
235
|
+
end
|
236
|
+
|
237
|
+
# @private
|
238
|
+
def play__()
|
239
|
+
raise NotImplementedError
|
240
|
+
end
|
241
|
+
|
242
|
+
# @private
|
243
|
+
def pause__()
|
244
|
+
raise NotImplementedError
|
245
|
+
end
|
246
|
+
|
247
|
+
# @private
|
248
|
+
def delay__()
|
249
|
+
raise NotImplementedError
|
250
|
+
end
|
251
|
+
|
164
252
|
# Saves image to file.
|
165
253
|
#
|
166
254
|
# @param filename [String] file name to save image
|
167
255
|
#
|
168
256
|
# @return [nil] nil
|
169
257
|
#
|
258
|
+
# @see https://processing.org/reference/PImage_save_.html
|
259
|
+
# @see https://p5js.org/reference/#/p5.Image/save
|
260
|
+
#
|
170
261
|
def save(filename)
|
171
262
|
getInternal__.save filename
|
172
263
|
nil
|
data/lib/processing/shader.rb
CHANGED
@@ -3,6 +3,9 @@ module Processing
|
|
3
3
|
|
4
4
|
# Shader object.
|
5
5
|
#
|
6
|
+
# @see https://processing.org/reference/PShader.html
|
7
|
+
# @see https://p5js.org/reference/#/p5.Shader
|
8
|
+
#
|
6
9
|
class Shader
|
7
10
|
|
8
11
|
include Xot::Inspectable
|
@@ -13,7 +16,7 @@ module Processing
|
|
13
16
|
# @param fragSrc [String] fragment shader source
|
14
17
|
#
|
15
18
|
def initialize(vertSrc, fragSrc)
|
16
|
-
@shader = Rays::Shader.new
|
19
|
+
@shader = Rays::Shader.new modifyFragSource__(fragSrc), vertSrc, ENV__
|
17
20
|
end
|
18
21
|
|
19
22
|
# Sets uniform variables.
|
@@ -37,7 +40,10 @@ module Processing
|
|
37
40
|
# @param ncoords [Integer] number of coordinates, max 4
|
38
41
|
# @param tex [Image] texture image
|
39
42
|
#
|
40
|
-
|
43
|
+
# @see https://processing.org/reference/PShader_set_.html
|
44
|
+
# @see https://p5js.org/reference/#/p5.Shader/setUniform
|
45
|
+
#
|
46
|
+
def set(name, *args)
|
41
47
|
arg = args.first
|
42
48
|
case
|
43
49
|
when Array === arg
|
@@ -54,7 +60,7 @@ module Processing
|
|
54
60
|
end
|
55
61
|
end
|
56
62
|
|
57
|
-
alias set
|
63
|
+
alias setUniform set
|
58
64
|
|
59
65
|
# @private
|
60
66
|
def getInternal__()
|
@@ -83,13 +89,13 @@ module Processing
|
|
83
89
|
when Shader
|
84
90
|
arg
|
85
91
|
when :threshold
|
86
|
-
self.new(nil,
|
92
|
+
self.new(nil, THRESHOLD_SOURCE__).tap {|sh| sh.set :threshold, (args.shift || 0.5)}
|
87
93
|
when :gray
|
88
|
-
self.new nil,
|
94
|
+
self.new nil, GRAY_SOURCE__
|
89
95
|
when :invert
|
90
|
-
self.new nil,
|
96
|
+
self.new nil, INVERT_SOURCE__
|
91
97
|
when :blur
|
92
|
-
self.new(nil,
|
98
|
+
self.new(nil, BLUR_SOURCE__).tap {|sh| sh.set :radius, (args.shift || 1).to_f}
|
93
99
|
else
|
94
100
|
nil
|
95
101
|
end
|
@@ -97,7 +103,8 @@ module Processing
|
|
97
103
|
|
98
104
|
private
|
99
105
|
|
100
|
-
|
106
|
+
# @private
|
107
|
+
THRESHOLD_SOURCE__ = <<~END
|
101
108
|
uniform float threshold;
|
102
109
|
uniform sampler2D texMap;
|
103
110
|
varying vec4 vertTexCoord;
|
@@ -109,7 +116,8 @@ module Processing
|
|
109
116
|
}
|
110
117
|
END
|
111
118
|
|
112
|
-
|
119
|
+
# @private
|
120
|
+
GRAY_SOURCE__ = <<~END
|
113
121
|
uniform sampler2D texMap;
|
114
122
|
varying vec4 vertTexCoord;
|
115
123
|
varying vec4 vertColor;
|
@@ -120,7 +128,8 @@ module Processing
|
|
120
128
|
}
|
121
129
|
END
|
122
130
|
|
123
|
-
|
131
|
+
# @private
|
132
|
+
INVERT_SOURCE__ = <<~END
|
124
133
|
uniform sampler2D texMap;
|
125
134
|
varying vec4 vertTexCoord;
|
126
135
|
varying vec4 vertColor;
|
@@ -130,7 +139,8 @@ module Processing
|
|
130
139
|
}
|
131
140
|
END
|
132
141
|
|
133
|
-
|
142
|
+
# @private
|
143
|
+
BLUR_SOURCE__ = <<~END
|
134
144
|
#define PI 3.1415926538
|
135
145
|
uniform float radius;
|
136
146
|
uniform sampler2D texMap;
|
@@ -163,9 +173,10 @@ module Processing
|
|
163
173
|
}
|
164
174
|
END
|
165
175
|
|
166
|
-
|
176
|
+
# @private
|
177
|
+
def modifyFragSource__(source)
|
167
178
|
return nil unless source
|
168
|
-
if
|
179
|
+
if hasShadertoyMainImage__?(source) && source !~ /void\s+main\s*\(/
|
169
180
|
source += <<~END
|
170
181
|
varying vec4 vertTexCoord;
|
171
182
|
void main() {
|
@@ -178,7 +189,7 @@ module Processing
|
|
178
189
|
iResolution: :vec2,
|
179
190
|
iMouse: :vec2
|
180
191
|
}.each do |uniformName, type|
|
181
|
-
if
|
192
|
+
if needsUniformDeclaration__ type, uniformName, source
|
182
193
|
source = <<~END + source
|
183
194
|
uniform #{type} #{uniformName};
|
184
195
|
END
|
@@ -187,11 +198,13 @@ module Processing
|
|
187
198
|
source
|
188
199
|
end
|
189
200
|
|
190
|
-
|
201
|
+
# @private
|
202
|
+
def hasShadertoyMainImage__?(source)
|
191
203
|
source =~ /void\s+mainImage\s*\(\s*out\s+vec4\s+\w+\s*,\s*in\s+vec2\s+\w+\s*\)/
|
192
204
|
end
|
193
205
|
|
194
|
-
|
206
|
+
# @private
|
207
|
+
def needsUniformDeclaration__(type, uniformName, source)
|
195
208
|
source.include?(uniformName.to_s) &&
|
196
209
|
source !~ /uniform\s+#{type}\s+#{uniformName}/
|
197
210
|
end
|