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.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -0
  3. data/CHANGELOG.md +43 -17
  4. data/README.md +97 -29
  5. data/ext/audio/audio_enums.c +58 -20
  6. data/ext/audio/listener.c +89 -6
  7. data/ext/audio/music.c +206 -5
  8. data/ext/audio/sound.c +175 -5
  9. data/ext/audio/sound_buffer.c +189 -47
  10. data/ext/audio/sound_buffer_recorder.c +83 -16
  11. data/ext/audio/sound_recorder.c +172 -52
  12. data/ext/audio/sound_source_cone.c +108 -29
  13. data/ext/audio/sound_stream.c +178 -5
  14. data/ext/core/exceptions.c +10 -8
  15. data/ext/core/unicode.c +12 -2
  16. data/ext/ext.c +4 -0
  17. data/ext/graphics/blend_mode.c +203 -53
  18. data/ext/graphics/circle.c +271 -4
  19. data/ext/graphics/color.c +240 -90
  20. data/ext/graphics/drawable.c +15 -4
  21. data/ext/graphics/font.c +138 -25
  22. data/ext/graphics/glyph.c +31 -8
  23. data/ext/graphics/image.c +180 -37
  24. data/ext/graphics/polygon.c +293 -26
  25. data/ext/graphics/rect.c +211 -54
  26. data/ext/graphics/rectangle.c +279 -26
  27. data/ext/graphics/render_state.c +116 -2
  28. data/ext/graphics/render_texture.c +163 -2
  29. data/ext/graphics/shader.c +283 -17
  30. data/ext/graphics/shape.c +252 -26
  31. data/ext/graphics/sprite.c +216 -25
  32. data/ext/graphics/stencil_mode.c +148 -39
  33. data/ext/graphics/target.c +67 -22
  34. data/ext/graphics/target.h +15 -15
  35. data/ext/graphics/text.c +306 -6
  36. data/ext/graphics/texture.c +257 -3
  37. data/ext/graphics/transform.c +178 -5
  38. data/ext/graphics/transformable.c +126 -2
  39. data/ext/graphics/vertex.c +79 -2
  40. data/ext/graphics/vertex_array.c +128 -16
  41. data/ext/graphics/vertex_buffer.c +124 -2
  42. data/ext/graphics/view.c +130 -2
  43. data/ext/network/ftp.c +249 -10
  44. data/ext/network/http.c +156 -38
  45. data/ext/network/ip_address.c +107 -26
  46. data/ext/network/network_enums.c +248 -141
  47. data/ext/network/packet.c +273 -39
  48. data/ext/network/socket_selector.c +91 -19
  49. data/ext/network/tcp_listener.c +75 -16
  50. data/ext/network/tcp_socket.c +128 -25
  51. data/ext/network/udp_socket.c +122 -26
  52. data/ext/ports.rb +7 -0
  53. data/ext/system/buffer.c +41 -12
  54. data/ext/system/clock.c +68 -9
  55. data/ext/system/input_stream.c +94 -42
  56. data/ext/system/sleep.c +10 -2
  57. data/ext/system/time.c +172 -34
  58. data/ext/system/vec2.c +156 -35
  59. data/ext/system/vec3.c +166 -35
  60. data/ext/window/clipboard.c +47 -17
  61. data/ext/window/context.c +59 -9
  62. data/ext/window/context_settings.c +116 -38
  63. data/ext/window/cursor.c +39 -9
  64. data/ext/window/event.c +163 -42
  65. data/ext/window/joystick.c +69 -3
  66. data/ext/window/keyboard.c +168 -116
  67. data/ext/window/mouse.c +36 -2
  68. data/ext/window/sensor.c +28 -2
  69. data/ext/window/touch.c +20 -2
  70. data/ext/window/video_mode.c +90 -19
  71. data/ext/window/vulkan.c +34 -6
  72. data/ext/window/window.c +340 -16
  73. data/lib/sfml/version.rb +1 -1
  74. data/sig/audio/audio_enums.rbs +30 -0
  75. data/sig/audio/listener.rbs +16 -0
  76. data/sig/audio/music.rbs +56 -0
  77. data/sig/audio/sound.rbs +51 -0
  78. data/sig/audio/sound_buffer.rbs +17 -0
  79. data/sig/audio/sound_buffer_recorder.rbs +14 -0
  80. data/sig/audio/sound_recorder.rbs +17 -0
  81. data/sig/audio/sound_source_cone.rbs +14 -0
  82. data/sig/audio/sound_stream.rbs +51 -0
  83. data/sig/graphics/blend_mode.rbs +29 -0
  84. data/sig/graphics/circle.rbs +44 -0
  85. data/sig/graphics/color.rbs +39 -0
  86. data/sig/graphics/drawable.rbs +5 -0
  87. data/sig/graphics/font.rbs +20 -0
  88. data/sig/graphics/glyph.rbs +7 -0
  89. data/sig/graphics/image.rbs +22 -0
  90. data/sig/graphics/polygon.rbs +42 -0
  91. data/sig/graphics/rect.rbs +33 -0
  92. data/sig/graphics/rectangle.rbs +42 -0
  93. data/sig/graphics/render_state.rbs +21 -0
  94. data/sig/graphics/render_texture.rbs +37 -0
  95. data/sig/graphics/shader.rbs +39 -0
  96. data/sig/graphics/shape.rbs +38 -0
  97. data/sig/graphics/sprite.rbs +34 -0
  98. data/sig/graphics/stencil_mode.rbs +18 -0
  99. data/sig/graphics/target.rbs +10 -0
  100. data/sig/graphics/text.rbs +48 -0
  101. data/sig/graphics/texture.rbs +34 -0
  102. data/sig/graphics/transform.rbs +37 -0
  103. data/sig/graphics/transformable.rbs +25 -0
  104. data/sig/graphics/vertex.rbs +17 -0
  105. data/sig/graphics/vertex_array.rbs +17 -0
  106. data/sig/graphics/vertex_buffer.rbs +22 -0
  107. data/sig/graphics/view.rbs +24 -0
  108. data/sig/network/ftp.rbs +46 -0
  109. data/sig/network/http.rbs +27 -0
  110. data/sig/network/ip_address.rbs +22 -0
  111. data/sig/network/network_enums.rbs +95 -0
  112. data/sig/network/packet.rbs +40 -0
  113. data/sig/network/socket_selector.rbs +14 -0
  114. data/sig/network/tcp_listener.rbs +13 -0
  115. data/sig/network/tcp_socket.rbs +18 -0
  116. data/sig/network/udp_socket.rbs +17 -0
  117. data/sig/system/buffer.rbs +11 -0
  118. data/sig/system/clock.rbs +13 -0
  119. data/sig/system/input_stream.rbs +7 -0
  120. data/sig/system/sleep.rbs +3 -0
  121. data/sig/system/time.rbs +28 -0
  122. data/sig/system/vec2.rbs +26 -0
  123. data/sig/system/vec3.rbs +27 -0
  124. data/sig/window/clipboard.rbs +8 -0
  125. data/sig/window/context.rbs +11 -0
  126. data/sig/window/context_settings.rbs +20 -0
  127. data/sig/window/cursor.rbs +6 -0
  128. data/sig/window/event.rbs +20 -0
  129. data/sig/window/joystick.rbs +15 -0
  130. data/sig/window/keyboard.rbs +10 -0
  131. data/sig/window/mouse.rbs +9 -0
  132. data/sig/window/sensor.rbs +8 -0
  133. data/sig/window/touch.rbs +6 -0
  134. data/sig/window/video_mode.rbs +16 -0
  135. data/sig/window/vulkan.rbs +7 -0
  136. data/sig/window/window.rbs +57 -0
  137. metadata +66 -2
@@ -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
- sfShader_destroy(ptr);
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 = NULL, .dfree = Shader_free, .dsize = NULL},
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* shader) {
26
- if (shader == NULL) {
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
- return TypedData_Wrap_Struct(klass, &Shader_data_type, shader);
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((sfShader*)Get_Shader_Struct(self), name,
421
- Get_Texture_Struct(rb_texture));
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
- void Init_Shader(VALUE rb_module) {
493
- rb_cShader = rb_define_class_under(rb_module, "Shader", rb_cObject);
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
- sfShader* ptr;
538
- TypedData_Get_Struct(self, sfShader, &Shader_data_type, ptr);
539
- return ptr;
803
+ Shader* ptr;
804
+ TypedData_Get_Struct(self, Shader, &Shader_data_type, ptr);
805
+ return ptr->shader;
540
806
  }