sfml3-rb 0.2.2 → 0.3.0
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/.yardopts +9 -0
- data/CHANGELOG.md +43 -17
- data/README.md +97 -29
- data/ext/audio/audio_enums.c +58 -20
- data/ext/audio/listener.c +89 -6
- data/ext/audio/music.c +206 -5
- data/ext/audio/sound.c +175 -5
- data/ext/audio/sound_buffer.c +189 -47
- data/ext/audio/sound_buffer_recorder.c +83 -16
- data/ext/audio/sound_recorder.c +172 -52
- data/ext/audio/sound_source_cone.c +108 -29
- data/ext/audio/sound_stream.c +178 -5
- data/ext/core/exceptions.c +10 -8
- data/ext/core/unicode.c +12 -2
- data/ext/ext.c +4 -0
- data/ext/graphics/blend_mode.c +203 -53
- data/ext/graphics/circle.c +271 -4
- data/ext/graphics/color.c +240 -90
- data/ext/graphics/drawable.c +15 -4
- data/ext/graphics/font.c +138 -25
- data/ext/graphics/glyph.c +31 -8
- data/ext/graphics/image.c +180 -37
- data/ext/graphics/polygon.c +293 -26
- data/ext/graphics/rect.c +211 -54
- data/ext/graphics/rectangle.c +279 -26
- data/ext/graphics/render_state.c +116 -2
- data/ext/graphics/render_texture.c +163 -2
- data/ext/graphics/shader.c +283 -17
- data/ext/graphics/shape.c +252 -26
- data/ext/graphics/sprite.c +216 -25
- data/ext/graphics/stencil_mode.c +148 -39
- data/ext/graphics/target.c +67 -22
- data/ext/graphics/target.h +15 -15
- data/ext/graphics/text.c +306 -6
- data/ext/graphics/texture.c +257 -3
- data/ext/graphics/transform.c +178 -5
- data/ext/graphics/transformable.c +126 -2
- data/ext/graphics/vertex.c +79 -2
- data/ext/graphics/vertex_array.c +128 -16
- data/ext/graphics/vertex_buffer.c +124 -2
- data/ext/graphics/view.c +130 -2
- data/ext/network/ftp.c +249 -10
- data/ext/network/http.c +156 -38
- data/ext/network/ip_address.c +107 -26
- data/ext/network/network_enums.c +248 -141
- data/ext/network/packet.c +273 -39
- data/ext/network/socket_selector.c +91 -19
- data/ext/network/tcp_listener.c +75 -16
- data/ext/network/tcp_socket.c +128 -25
- data/ext/network/udp_socket.c +122 -26
- data/ext/ports.rb +7 -0
- data/ext/system/buffer.c +41 -12
- data/ext/system/clock.c +68 -9
- data/ext/system/input_stream.c +94 -42
- data/ext/system/sleep.c +10 -2
- data/ext/system/time.c +172 -34
- data/ext/system/vec2.c +156 -35
- data/ext/system/vec3.c +166 -35
- data/ext/window/clipboard.c +47 -17
- data/ext/window/context.c +59 -9
- data/ext/window/context_settings.c +116 -38
- data/ext/window/cursor.c +39 -9
- data/ext/window/event.c +163 -42
- data/ext/window/joystick.c +69 -3
- data/ext/window/keyboard.c +168 -116
- data/ext/window/mouse.c +36 -2
- data/ext/window/sensor.c +28 -2
- data/ext/window/touch.c +20 -2
- data/ext/window/video_mode.c +90 -19
- data/ext/window/vulkan.c +34 -6
- data/ext/window/window.c +340 -16
- data/lib/sfml/version.rb +1 -1
- data/sig/audio/audio_enums.rbs +30 -0
- data/sig/audio/listener.rbs +16 -0
- data/sig/audio/music.rbs +56 -0
- data/sig/audio/sound.rbs +51 -0
- data/sig/audio/sound_buffer.rbs +17 -0
- data/sig/audio/sound_buffer_recorder.rbs +14 -0
- data/sig/audio/sound_recorder.rbs +17 -0
- data/sig/audio/sound_source_cone.rbs +14 -0
- data/sig/audio/sound_stream.rbs +51 -0
- data/sig/graphics/blend_mode.rbs +29 -0
- data/sig/graphics/circle.rbs +44 -0
- data/sig/graphics/color.rbs +39 -0
- data/sig/graphics/drawable.rbs +5 -0
- data/sig/graphics/font.rbs +20 -0
- data/sig/graphics/glyph.rbs +7 -0
- data/sig/graphics/image.rbs +22 -0
- data/sig/graphics/polygon.rbs +42 -0
- data/sig/graphics/rect.rbs +33 -0
- data/sig/graphics/rectangle.rbs +42 -0
- data/sig/graphics/render_state.rbs +21 -0
- data/sig/graphics/render_texture.rbs +37 -0
- data/sig/graphics/shader.rbs +39 -0
- data/sig/graphics/shape.rbs +38 -0
- data/sig/graphics/sprite.rbs +34 -0
- data/sig/graphics/stencil_mode.rbs +18 -0
- data/sig/graphics/target.rbs +10 -0
- data/sig/graphics/text.rbs +48 -0
- data/sig/graphics/texture.rbs +34 -0
- data/sig/graphics/transform.rbs +37 -0
- data/sig/graphics/transformable.rbs +25 -0
- data/sig/graphics/vertex.rbs +17 -0
- data/sig/graphics/vertex_array.rbs +17 -0
- data/sig/graphics/vertex_buffer.rbs +22 -0
- data/sig/graphics/view.rbs +24 -0
- data/sig/network/ftp.rbs +46 -0
- data/sig/network/http.rbs +27 -0
- data/sig/network/ip_address.rbs +22 -0
- data/sig/network/network_enums.rbs +95 -0
- data/sig/network/packet.rbs +40 -0
- data/sig/network/socket_selector.rbs +14 -0
- data/sig/network/tcp_listener.rbs +13 -0
- data/sig/network/tcp_socket.rbs +18 -0
- data/sig/network/udp_socket.rbs +17 -0
- data/sig/system/buffer.rbs +11 -0
- data/sig/system/clock.rbs +13 -0
- data/sig/system/input_stream.rbs +7 -0
- data/sig/system/sleep.rbs +3 -0
- data/sig/system/time.rbs +28 -0
- data/sig/system/vec2.rbs +26 -0
- data/sig/system/vec3.rbs +27 -0
- data/sig/window/clipboard.rbs +8 -0
- data/sig/window/context.rbs +11 -0
- data/sig/window/context_settings.rbs +20 -0
- data/sig/window/cursor.rbs +6 -0
- data/sig/window/event.rbs +20 -0
- data/sig/window/joystick.rbs +15 -0
- data/sig/window/keyboard.rbs +10 -0
- data/sig/window/mouse.rbs +9 -0
- data/sig/window/sensor.rbs +8 -0
- data/sig/window/touch.rbs +6 -0
- data/sig/window/video_mode.rbs +16 -0
- data/sig/window/vulkan.rbs +7 -0
- data/sig/window/window.rbs +57 -0
- metadata +66 -2
data/ext/graphics/shader.c
CHANGED
|
@@ -13,21 +13,49 @@
|
|
|
13
13
|
|
|
14
14
|
static VALUE rb_cShader;
|
|
15
15
|
|
|
16
|
+
/* SFML's Shader::setUniform(name, const Texture&) stores a pointer to the
|
|
17
|
+
texture internally and re-binds it at draw/bind time, so (per SFML's own
|
|
18
|
+
docs) the caller must keep every Texture passed to #set_texture alive for
|
|
19
|
+
as long as the shader might use it -- hence the retaining Hash and the
|
|
20
|
+
dmark this needs, unlike a bare pointer wrap. */
|
|
21
|
+
typedef struct {
|
|
22
|
+
sfShader* shader;
|
|
23
|
+
VALUE rb_textures;
|
|
24
|
+
} Shader;
|
|
25
|
+
|
|
26
|
+
static void Shader_mark(void* ptr) {
|
|
27
|
+
rb_gc_mark(((Shader*)ptr)->rb_textures);
|
|
28
|
+
}
|
|
29
|
+
|
|
16
30
|
static void Shader_free(void* ptr) {
|
|
17
|
-
|
|
31
|
+
Shader* wrapper = ptr;
|
|
32
|
+
|
|
33
|
+
sfShader_destroy(wrapper->shader);
|
|
34
|
+
free(wrapper);
|
|
18
35
|
}
|
|
19
36
|
|
|
20
37
|
static const rb_data_type_t Shader_data_type = {
|
|
21
38
|
.wrap_struct_name = "SFML::Shader",
|
|
22
|
-
.function = {.dmark =
|
|
39
|
+
.function = {.dmark = Shader_mark, .dfree = Shader_free, .dsize = NULL},
|
|
23
40
|
.flags = RUBY_TYPED_FREE_IMMEDIATELY};
|
|
24
41
|
|
|
25
|
-
static VALUE Shader_wrap(VALUE klass, sfShader*
|
|
26
|
-
|
|
42
|
+
static VALUE Shader_wrap(VALUE klass, sfShader* c_shader) {
|
|
43
|
+
Shader* wrapper;
|
|
44
|
+
|
|
45
|
+
if (c_shader == NULL) {
|
|
27
46
|
rb_raise(rb_eRuntimeError, "failed to create shader");
|
|
28
47
|
}
|
|
29
48
|
|
|
30
|
-
|
|
49
|
+
wrapper = malloc(sizeof(Shader));
|
|
50
|
+
|
|
51
|
+
if (wrapper == NULL) {
|
|
52
|
+
rb_raise(rb_eNoMemError, "failed to allocate shader");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
wrapper->shader = c_shader;
|
|
56
|
+
wrapper->rb_textures = rb_hash_new();
|
|
57
|
+
|
|
58
|
+
return TypedData_Wrap_Struct(klass, &Shader_data_type, wrapper);
|
|
31
59
|
}
|
|
32
60
|
|
|
33
61
|
/* NULL skips a stage, mirroring CSFML. */
|
|
@@ -39,6 +67,17 @@ static const char* Shader_optional_cstr(VALUE rb_value) {
|
|
|
39
67
|
return StringValueCStr(rb_value);
|
|
40
68
|
}
|
|
41
69
|
|
|
70
|
+
/* call-seq:
|
|
71
|
+
* Shader.from_file(vertex) -> Shader
|
|
72
|
+
* Shader.from_file(vertex, fragment) -> Shader
|
|
73
|
+
* Shader.from_file(vertex, fragment, geometry) -> Shader
|
|
74
|
+
*
|
|
75
|
+
* Compiles a shader from GLSL source file paths. Any of the three may be
|
|
76
|
+
* +nil+ to skip that stage.
|
|
77
|
+
*
|
|
78
|
+
* @return [Shader]
|
|
79
|
+
* @raise [RuntimeError] if compilation fails
|
|
80
|
+
*/
|
|
42
81
|
static VALUE Shader_from_file(int argc, VALUE* argv, VALUE klass) {
|
|
43
82
|
VALUE rb_vertex, rb_fragment, rb_geometry;
|
|
44
83
|
|
|
@@ -49,6 +88,17 @@ static VALUE Shader_from_file(int argc, VALUE* argv, VALUE klass) {
|
|
|
49
88
|
Shader_optional_cstr(rb_fragment)));
|
|
50
89
|
}
|
|
51
90
|
|
|
91
|
+
/* call-seq:
|
|
92
|
+
* Shader.from_memory(vertex) -> Shader
|
|
93
|
+
* Shader.from_memory(vertex, fragment) -> Shader
|
|
94
|
+
* Shader.from_memory(vertex, fragment, geometry) -> Shader
|
|
95
|
+
*
|
|
96
|
+
* Compiles a shader from GLSL source Strings. Any of the three may be
|
|
97
|
+
* +nil+ to skip that stage.
|
|
98
|
+
*
|
|
99
|
+
* @return [Shader]
|
|
100
|
+
* @raise [RuntimeError] if compilation fails
|
|
101
|
+
*/
|
|
52
102
|
static VALUE Shader_from_memory(int argc, VALUE* argv, VALUE klass) {
|
|
53
103
|
VALUE rb_vertex, rb_fragment, rb_geometry;
|
|
54
104
|
|
|
@@ -59,6 +109,17 @@ static VALUE Shader_from_memory(int argc, VALUE* argv, VALUE klass) {
|
|
|
59
109
|
Shader_optional_cstr(rb_fragment)));
|
|
60
110
|
}
|
|
61
111
|
|
|
112
|
+
/* call-seq:
|
|
113
|
+
* Shader.from_stream(vertex) -> Shader
|
|
114
|
+
* Shader.from_stream(vertex, fragment) -> Shader
|
|
115
|
+
* Shader.from_stream(vertex, fragment, geometry) -> Shader
|
|
116
|
+
*
|
|
117
|
+
* Compiles a shader from GLSL source read through InputStream objects. Any
|
|
118
|
+
* of the three may be +nil+ to skip that stage.
|
|
119
|
+
*
|
|
120
|
+
* @return [Shader]
|
|
121
|
+
* @raise [RuntimeError] if compilation fails
|
|
122
|
+
*/
|
|
62
123
|
static VALUE Shader_from_stream(int argc, VALUE* argv, VALUE klass) {
|
|
63
124
|
VALUE rb_vertex, rb_fragment, rb_geometry;
|
|
64
125
|
VALUE holder_vertex = Qnil, holder_fragment = Qnil, holder_geometry = Qnil;
|
|
@@ -87,19 +148,46 @@ static VALUE Shader_from_stream(int argc, VALUE* argv, VALUE klass) {
|
|
|
87
148
|
return Shader_wrap(klass, sfShader_createFromStream(vertex, geometry, fragment));
|
|
88
149
|
}
|
|
89
150
|
|
|
151
|
+
/* call-seq: native_handle -> Integer
|
|
152
|
+
*
|
|
153
|
+
* Returns the underlying OpenGL handle.
|
|
154
|
+
*
|
|
155
|
+
* @return [Integer] the underlying OpenGL program handle
|
|
156
|
+
*/
|
|
90
157
|
static VALUE Shader_get_native_handle(VALUE self) {
|
|
91
158
|
return UINT2NUM(sfShader_getNativeHandle(Get_Shader_Struct(self)));
|
|
92
159
|
}
|
|
93
160
|
|
|
161
|
+
/* call-seq: bind -> self
|
|
162
|
+
*
|
|
163
|
+
* Activates this shader for rendering. Pass a RenderState carrying it to
|
|
164
|
+
* Target#draw instead of calling this directly, unless drawing raw OpenGL.
|
|
165
|
+
*
|
|
166
|
+
* @return [self]
|
|
167
|
+
*/
|
|
94
168
|
static VALUE Shader_bind(VALUE self) {
|
|
95
169
|
sfShader_bind(Get_Shader_Struct(self));
|
|
96
170
|
return self;
|
|
97
171
|
}
|
|
98
172
|
|
|
173
|
+
/* call-seq:
|
|
174
|
+
* Shader.available? -> true or false
|
|
175
|
+
*
|
|
176
|
+
* Returns +true+ if shaders are supported.
|
|
177
|
+
*
|
|
178
|
+
* @return [Boolean] whether the system supports shaders at all
|
|
179
|
+
*/
|
|
99
180
|
static VALUE Shader_is_available(VALUE klass) {
|
|
100
181
|
return BOOL2RB(sfShader_isAvailable());
|
|
101
182
|
}
|
|
102
183
|
|
|
184
|
+
/* call-seq:
|
|
185
|
+
* Shader.geometry_available? -> true or false
|
|
186
|
+
*
|
|
187
|
+
* Returns +true+ if geometry shaders are supported.
|
|
188
|
+
*
|
|
189
|
+
* @return [Boolean] whether the system supports geometry shaders
|
|
190
|
+
*/
|
|
103
191
|
static VALUE Shader_is_geometry_available(VALUE klass) {
|
|
104
192
|
return BOOL2RB(sfShader_isGeometryAvailable());
|
|
105
193
|
}
|
|
@@ -110,6 +198,13 @@ static void Shader_name(VALUE rb_name, char* buffer, size_t length) {
|
|
|
110
198
|
snprintf(buffer, length, "%s", name);
|
|
111
199
|
}
|
|
112
200
|
|
|
201
|
+
/* call-seq:
|
|
202
|
+
* set_float(name, x) -> self
|
|
203
|
+
*
|
|
204
|
+
* Sets the +name+ uniform to a single Float.
|
|
205
|
+
*
|
|
206
|
+
* @return [self]
|
|
207
|
+
*/
|
|
113
208
|
static VALUE Shader_set_float(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
114
209
|
char name[256];
|
|
115
210
|
|
|
@@ -119,6 +214,13 @@ static VALUE Shader_set_float(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
|
119
214
|
return self;
|
|
120
215
|
}
|
|
121
216
|
|
|
217
|
+
/* call-seq:
|
|
218
|
+
* set_int(name, x) -> self
|
|
219
|
+
*
|
|
220
|
+
* Sets the +name+ uniform to a single Integer.
|
|
221
|
+
*
|
|
222
|
+
* @return [self]
|
|
223
|
+
*/
|
|
122
224
|
static VALUE Shader_set_int(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
123
225
|
char name[256];
|
|
124
226
|
|
|
@@ -128,6 +230,13 @@ static VALUE Shader_set_int(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
|
128
230
|
return self;
|
|
129
231
|
}
|
|
130
232
|
|
|
233
|
+
/* call-seq:
|
|
234
|
+
* set_bool(name, x) -> self
|
|
235
|
+
*
|
|
236
|
+
* Sets the +name+ uniform to a boolean.
|
|
237
|
+
*
|
|
238
|
+
* @return [self]
|
|
239
|
+
*/
|
|
131
240
|
static VALUE Shader_set_bool(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
132
241
|
char name[256];
|
|
133
242
|
|
|
@@ -137,6 +246,14 @@ static VALUE Shader_set_bool(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
|
137
246
|
return self;
|
|
138
247
|
}
|
|
139
248
|
|
|
249
|
+
/* call-seq:
|
|
250
|
+
* set_color(name, color) -> self
|
|
251
|
+
*
|
|
252
|
+
* Sets a +vec4+ uniform from +color+ (a Color), normalized to the 0..1
|
|
253
|
+
* range.
|
|
254
|
+
*
|
|
255
|
+
* @return [self]
|
|
256
|
+
*/
|
|
140
257
|
static VALUE Shader_set_color(VALUE self, VALUE rb_name, VALUE rb_color) {
|
|
141
258
|
char name[256];
|
|
142
259
|
|
|
@@ -146,6 +263,13 @@ static VALUE Shader_set_color(VALUE self, VALUE rb_name, VALUE rb_color) {
|
|
|
146
263
|
return self;
|
|
147
264
|
}
|
|
148
265
|
|
|
266
|
+
/* call-seq:
|
|
267
|
+
* set_int_color(name, color) -> self
|
|
268
|
+
*
|
|
269
|
+
* Sets an +ivec4+ uniform from +color+ (a Color), in the 0..255 range.
|
|
270
|
+
*
|
|
271
|
+
* @return [self]
|
|
272
|
+
*/
|
|
149
273
|
static VALUE Shader_set_int_color(VALUE self, VALUE rb_name, VALUE rb_color) {
|
|
150
274
|
char name[256];
|
|
151
275
|
|
|
@@ -155,6 +279,13 @@ static VALUE Shader_set_int_color(VALUE self, VALUE rb_name, VALUE rb_color) {
|
|
|
155
279
|
return self;
|
|
156
280
|
}
|
|
157
281
|
|
|
282
|
+
/* call-seq:
|
|
283
|
+
* set_vec2(name, vector) -> self
|
|
284
|
+
*
|
|
285
|
+
* Sets the +name+ uniform to a Vector2.
|
|
286
|
+
*
|
|
287
|
+
* @return [self]
|
|
288
|
+
*/
|
|
158
289
|
static VALUE Shader_set_vec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
159
290
|
char name[256];
|
|
160
291
|
|
|
@@ -164,6 +295,13 @@ static VALUE Shader_set_vec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
164
295
|
return self;
|
|
165
296
|
}
|
|
166
297
|
|
|
298
|
+
/* call-seq:
|
|
299
|
+
* set_vec3(name, vector) -> self
|
|
300
|
+
*
|
|
301
|
+
* Sets the +name+ uniform to a Vector3.
|
|
302
|
+
*
|
|
303
|
+
* @return [self]
|
|
304
|
+
*/
|
|
167
305
|
static VALUE Shader_set_vec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
168
306
|
char name[256];
|
|
169
307
|
|
|
@@ -223,6 +361,14 @@ static sfGlslMat4 glsl_mat4_from_rb(VALUE rb_matrix) {
|
|
|
223
361
|
return matrix;
|
|
224
362
|
}
|
|
225
363
|
|
|
364
|
+
/* call-seq:
|
|
365
|
+
* set_vec4(name, vector) -> self
|
|
366
|
+
*
|
|
367
|
+
* +vector+ is a 4-element Array.
|
|
368
|
+
*
|
|
369
|
+
* @return [self]
|
|
370
|
+
* @raise [ArgumentError] if +vector+ has fewer than 4 elements
|
|
371
|
+
*/
|
|
226
372
|
static VALUE Shader_set_vec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
227
373
|
char name[256];
|
|
228
374
|
sfGlslVec4 vector = glsl_vec4_from_rb(rb_vector);
|
|
@@ -234,6 +380,13 @@ static VALUE Shader_set_vec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
234
380
|
return self;
|
|
235
381
|
}
|
|
236
382
|
|
|
383
|
+
/* call-seq:
|
|
384
|
+
* set_ivec2(name, vector) -> self
|
|
385
|
+
*
|
|
386
|
+
* Sets the +name+ uniform to a Vector2 of Integers.
|
|
387
|
+
*
|
|
388
|
+
* @return [self]
|
|
389
|
+
*/
|
|
237
390
|
static VALUE Shader_set_ivec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
238
391
|
char name[256];
|
|
239
392
|
sfVector2f vec = vec2f_from_rb(rb_vector);
|
|
@@ -245,6 +398,14 @@ static VALUE Shader_set_ivec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
245
398
|
return self;
|
|
246
399
|
}
|
|
247
400
|
|
|
401
|
+
/* call-seq:
|
|
402
|
+
* set_ivec3(name, vector) -> self
|
|
403
|
+
*
|
|
404
|
+
* +vector+ is a 3-element Array.
|
|
405
|
+
*
|
|
406
|
+
* @return [self]
|
|
407
|
+
* @raise [ArgumentError] if +vector+ has fewer than 3 elements
|
|
408
|
+
*/
|
|
248
409
|
static VALUE Shader_set_ivec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
249
410
|
char name[256];
|
|
250
411
|
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
@@ -265,6 +426,14 @@ static VALUE Shader_set_ivec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
265
426
|
return self;
|
|
266
427
|
}
|
|
267
428
|
|
|
429
|
+
/* call-seq:
|
|
430
|
+
* set_ivec4(name, vector) -> self
|
|
431
|
+
*
|
|
432
|
+
* +vector+ is a 4-element Array.
|
|
433
|
+
*
|
|
434
|
+
* @return [self]
|
|
435
|
+
* @raise [ArgumentError] if +vector+ has fewer than 4 elements
|
|
436
|
+
*/
|
|
268
437
|
static VALUE Shader_set_ivec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
269
438
|
char name[256];
|
|
270
439
|
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
@@ -286,6 +455,14 @@ static VALUE Shader_set_ivec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
286
455
|
return self;
|
|
287
456
|
}
|
|
288
457
|
|
|
458
|
+
/* call-seq:
|
|
459
|
+
* set_bvec2(name, vector) -> self
|
|
460
|
+
*
|
|
461
|
+
* +vector+ is a 2-element Array.
|
|
462
|
+
*
|
|
463
|
+
* @return [self]
|
|
464
|
+
* @raise [ArgumentError] if +vector+ has fewer than 2 elements
|
|
465
|
+
*/
|
|
289
466
|
static VALUE Shader_set_bvec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
290
467
|
char name[256];
|
|
291
468
|
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
@@ -303,6 +480,14 @@ static VALUE Shader_set_bvec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
303
480
|
return self;
|
|
304
481
|
}
|
|
305
482
|
|
|
483
|
+
/* call-seq:
|
|
484
|
+
* set_bvec3(name, vector) -> self
|
|
485
|
+
*
|
|
486
|
+
* +vector+ is a 3-element Array.
|
|
487
|
+
*
|
|
488
|
+
* @return [self]
|
|
489
|
+
* @raise [ArgumentError] if +vector+ has fewer than 3 elements
|
|
490
|
+
*/
|
|
306
491
|
static VALUE Shader_set_bvec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
307
492
|
char name[256];
|
|
308
493
|
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
@@ -321,6 +506,14 @@ static VALUE Shader_set_bvec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
321
506
|
return self;
|
|
322
507
|
}
|
|
323
508
|
|
|
509
|
+
/* call-seq:
|
|
510
|
+
* set_bvec4(name, vector) -> self
|
|
511
|
+
*
|
|
512
|
+
* +vector+ is a 4-element Array.
|
|
513
|
+
*
|
|
514
|
+
* @return [self]
|
|
515
|
+
* @raise [ArgumentError] if +vector+ has fewer than 4 elements
|
|
516
|
+
*/
|
|
324
517
|
static VALUE Shader_set_bvec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
325
518
|
char name[256];
|
|
326
519
|
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
@@ -339,6 +532,14 @@ static VALUE Shader_set_bvec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
|
339
532
|
return self;
|
|
340
533
|
}
|
|
341
534
|
|
|
535
|
+
/* call-seq:
|
|
536
|
+
* set_mat3(name, matrix) -> self
|
|
537
|
+
*
|
|
538
|
+
* +matrix+ is a 9-element Array.
|
|
539
|
+
*
|
|
540
|
+
* @return [self]
|
|
541
|
+
* @raise [ArgumentError] if +matrix+ has fewer than 9 elements
|
|
542
|
+
*/
|
|
342
543
|
static VALUE Shader_set_mat3(VALUE self, VALUE rb_name, VALUE rb_matrix) {
|
|
343
544
|
char name[256];
|
|
344
545
|
sfGlslMat3 matrix = glsl_mat3_from_rb(rb_matrix);
|
|
@@ -350,6 +551,14 @@ static VALUE Shader_set_mat3(VALUE self, VALUE rb_name, VALUE rb_matrix) {
|
|
|
350
551
|
return self;
|
|
351
552
|
}
|
|
352
553
|
|
|
554
|
+
/* call-seq:
|
|
555
|
+
* set_mat4(name, matrix) -> self
|
|
556
|
+
*
|
|
557
|
+
* +matrix+ is a 16-element Array.
|
|
558
|
+
*
|
|
559
|
+
* @return [self]
|
|
560
|
+
* @raise [ArgumentError] if +matrix+ has fewer than 16 elements
|
|
561
|
+
*/
|
|
353
562
|
static VALUE Shader_set_mat4(VALUE self, VALUE rb_name, VALUE rb_matrix) {
|
|
354
563
|
char name[256];
|
|
355
564
|
sfGlslMat4 matrix = glsl_mat4_from_rb(rb_matrix);
|
|
@@ -403,26 +612,44 @@ SHADER_ARRAY_UNIFORM(mat4, sfGlslMat4, glsl_mat4_from_rb, sfShader_setMat4Unifor
|
|
|
403
612
|
|
|
404
613
|
#undef SHADER_ARRAY_UNIFORM
|
|
405
614
|
|
|
615
|
+
/* Document-method: SFML::Shader#set_texture
|
|
616
|
+
* call-seq:
|
|
617
|
+
* set_texture(name, texture) -> Texture
|
|
618
|
+
*
|
|
619
|
+
* SFML keeps and re-binds a pointer to +texture+ internally (rather than
|
|
620
|
+
* copying it) for as long as the shader may use it; this binding keeps a
|
|
621
|
+
* reference alongside it so the Texture can't be GC'd out from under the
|
|
622
|
+
* shader. CSFML's C API unconditionally dereferences the texture argument,
|
|
623
|
+
* so unlike most other uniform setters here, +nil+ is not accepted.
|
|
624
|
+
*
|
|
625
|
+
* @return [Texture] +texture+
|
|
626
|
+
* @raise [ArgumentError] if +texture+ is not a Texture
|
|
627
|
+
*/
|
|
406
628
|
static VALUE Shader_set_texture(VALUE self, VALUE rb_name, VALUE rb_texture) {
|
|
629
|
+
Shader* wrapper;
|
|
407
630
|
char name[256];
|
|
408
631
|
|
|
632
|
+
TypedData_Get_Struct(self, Shader, &Shader_data_type, wrapper);
|
|
409
633
|
Shader_name(rb_name, name, sizeof(name));
|
|
410
634
|
|
|
411
|
-
if (NIL_P(rb_texture)) {
|
|
412
|
-
sfShader_setTextureUniform((sfShader*)Get_Shader_Struct(self), name, NULL);
|
|
413
|
-
return rb_texture;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
635
|
if (!rb_obj_is_kind_of(rb_texture, Get_Klass_Texture())) {
|
|
417
636
|
raise_invalid_argument_class(Get_Klass_Texture());
|
|
418
637
|
}
|
|
419
638
|
|
|
420
|
-
sfShader_setTextureUniform(
|
|
421
|
-
|
|
639
|
+
sfShader_setTextureUniform(wrapper->shader, name, Get_Texture_Struct(rb_texture));
|
|
640
|
+
rb_hash_aset(wrapper->rb_textures, rb_str_new_cstr(name), rb_texture);
|
|
422
641
|
|
|
423
642
|
return rb_texture;
|
|
424
643
|
}
|
|
425
644
|
|
|
645
|
+
/* call-seq:
|
|
646
|
+
* set_current_texture(name) -> self
|
|
647
|
+
*
|
|
648
|
+
* Binds the target's own currently-bound texture (CSFML's "current
|
|
649
|
+
* texture" special value) to the sampler uniform +name+.
|
|
650
|
+
*
|
|
651
|
+
* @return [self]
|
|
652
|
+
*/
|
|
426
653
|
static VALUE Shader_set_current_texture(VALUE self, VALUE rb_name) {
|
|
427
654
|
char name[256];
|
|
428
655
|
|
|
@@ -432,6 +659,18 @@ static VALUE Shader_set_current_texture(VALUE self, VALUE rb_name) {
|
|
|
432
659
|
return self;
|
|
433
660
|
}
|
|
434
661
|
|
|
662
|
+
/* call-seq:
|
|
663
|
+
* set_uniform(name, value) -> self
|
|
664
|
+
* uniform=(name, value) -> self
|
|
665
|
+
*
|
|
666
|
+
* Sets the uniform +name+, dispatching to the appropriate +set_*+ method
|
|
667
|
+
* based on +value+'s class: Color, Texture, Vector2, Vector3, true/false,
|
|
668
|
+
* Integer, Float, or an Array (dispatched by length: 2 -> vec2, 3 -> vec3,
|
|
669
|
+
* 4 -> vec4, 9 -> mat3, 16 -> mat4).
|
|
670
|
+
*
|
|
671
|
+
* @return [self]
|
|
672
|
+
* @raise [ArgumentError] if +value+'s class/length isn't recognized
|
|
673
|
+
*/
|
|
435
674
|
static VALUE Shader_set_uniform(VALUE self, VALUE rb_name, VALUE rb_value) {
|
|
436
675
|
if (rb_obj_is_kind_of(rb_value, Get_Klass_Color())) {
|
|
437
676
|
return Shader_set_color(self, rb_name, rb_value);
|
|
@@ -489,8 +728,35 @@ static VALUE Shader_set_uniform(VALUE self, VALUE rb_name, VALUE rb_value) {
|
|
|
489
728
|
return self;
|
|
490
729
|
}
|
|
491
730
|
|
|
492
|
-
|
|
493
|
-
|
|
731
|
+
/* Document-class: SFML::Shader
|
|
732
|
+
* A GLSL vertex/geometry/fragment shader program, uploaded to the GPU and
|
|
733
|
+
* carried on RenderState#shader.
|
|
734
|
+
*
|
|
735
|
+
* The +set_*_array+ methods below are generated from a shared macro (see
|
|
736
|
+
* ext/graphics/shader.c) and documented here directly since the macro hides
|
|
737
|
+
* their function bodies from the doc-comment scanner.
|
|
738
|
+
*
|
|
739
|
+
* @!method set_float_array(name, values)
|
|
740
|
+
* Sets the +name+ uniform to an Array of Floats.
|
|
741
|
+
* @return [self]
|
|
742
|
+
* @!method set_vec2_array(name, values)
|
|
743
|
+
* Sets the +name+ uniform to an Array of Vector2 values.
|
|
744
|
+
* @return [self]
|
|
745
|
+
* @!method set_vec3_array(name, values)
|
|
746
|
+
* Sets the +name+ uniform to an Array of Vector3 values.
|
|
747
|
+
* @return [self]
|
|
748
|
+
* @!method set_vec4_array(name, values)
|
|
749
|
+
* values is an Array of 4-element Arrays.
|
|
750
|
+
* @return [self]
|
|
751
|
+
* @!method set_mat3_array(name, values)
|
|
752
|
+
* values is an Array of 9-element Arrays.
|
|
753
|
+
* @return [self]
|
|
754
|
+
* @!method set_mat4_array(name, values)
|
|
755
|
+
* values is an Array of 16-element Arrays.
|
|
756
|
+
* @return [self]
|
|
757
|
+
*/
|
|
758
|
+
void Init_Shader(VALUE rb_mSFML) {
|
|
759
|
+
rb_cShader = rb_define_class_under(rb_mSFML, "Shader", rb_cObject);
|
|
494
760
|
|
|
495
761
|
rb_define_singleton_method(rb_cShader, "from_file", Shader_from_file, -1);
|
|
496
762
|
rb_define_singleton_method(rb_cShader, "from_memory", Shader_from_memory, -1);
|
|
@@ -534,7 +800,7 @@ VALUE Get_Klass_Shader(void) {
|
|
|
534
800
|
}
|
|
535
801
|
|
|
536
802
|
const sfShader* Get_Shader_Struct(VALUE self) {
|
|
537
|
-
|
|
538
|
-
TypedData_Get_Struct(self,
|
|
539
|
-
return ptr;
|
|
803
|
+
Shader* ptr;
|
|
804
|
+
TypedData_Get_Struct(self, Shader, &Shader_data_type, ptr);
|
|
805
|
+
return ptr->shader;
|
|
540
806
|
}
|