sfml3-rb 0.0.1 → 0.2.2
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 +342 -0
- data/README.md +51 -14
- data/TODO.md +199 -0
- data/ext/audio/audio_enums.c +131 -0
- data/ext/audio/audio_enums.h +18 -0
- data/ext/audio/effect_processor.c +233 -0
- data/ext/audio/effect_processor.h +25 -0
- data/ext/audio/listener.c +83 -0
- data/ext/audio/listener.h +8 -0
- data/ext/audio/music.c +174 -0
- data/ext/audio/music.h +14 -0
- data/ext/audio/sound.c +139 -0
- data/ext/audio/sound.h +14 -0
- data/ext/audio/sound_buffer.c +274 -0
- data/ext/audio/sound_buffer.h +18 -0
- data/ext/audio/sound_buffer_recorder.c +109 -0
- data/ext/audio/sound_buffer_recorder.h +14 -0
- data/ext/audio/sound_recorder.c +268 -0
- data/ext/audio/sound_recorder.h +14 -0
- data/ext/audio/sound_source.h +13 -0
- data/ext/audio/sound_source.inc +271 -0
- data/ext/audio/sound_source_cone.c +138 -0
- data/ext/audio/sound_source_cone.h +20 -0
- data/ext/audio/sound_stream.c +294 -0
- data/ext/audio/sound_stream.h +14 -0
- data/ext/{exceptions.c → core/exceptions.c} +10 -8
- data/ext/{ext → core}/exceptions.h +3 -3
- data/ext/core/foreign_thread.c +149 -0
- data/ext/core/foreign_thread.h +31 -0
- data/ext/core/macros.h +8 -0
- data/ext/{ext → core}/sfml.h +5 -3
- data/ext/core/unicode.c +46 -0
- data/ext/core/unicode.h +25 -0
- data/ext/ext.c +125 -14
- data/ext/extconf.rb +51 -6
- data/ext/graphics/blend_mode.c +261 -0
- data/ext/graphics/blend_mode.h +18 -0
- data/ext/graphics/circle.c +319 -0
- data/ext/{ext/klass/drawable → graphics}/circle.h +3 -3
- data/ext/graphics/color.c +318 -0
- data/ext/graphics/color.h +37 -0
- data/ext/{drawable.c → graphics/drawable.c} +11 -11
- data/ext/graphics/drawable.h +10 -0
- data/ext/graphics/enums.c +123 -0
- data/ext/graphics/enums.h +20 -0
- data/ext/graphics/font.c +148 -0
- data/ext/graphics/font.h +14 -0
- data/ext/graphics/glyph.c +60 -0
- data/ext/graphics/glyph.h +14 -0
- data/ext/graphics/image.c +205 -0
- data/ext/graphics/image.h +16 -0
- data/ext/graphics/polygon.c +300 -0
- data/ext/graphics/polygon.h +10 -0
- data/ext/graphics/rect.c +287 -0
- data/ext/graphics/rect.h +30 -0
- data/ext/graphics/rectangle.c +302 -0
- data/ext/graphics/rectangle.h +10 -0
- data/ext/graphics/render_state.c +204 -0
- data/ext/graphics/render_state.h +18 -0
- data/ext/graphics/render_target.inc +181 -0
- data/ext/graphics/render_texture.c +182 -0
- data/ext/graphics/render_texture.h +14 -0
- data/ext/graphics/shader.c +540 -0
- data/ext/graphics/shader.h +14 -0
- data/ext/graphics/shape.c +311 -0
- data/ext/graphics/shape.h +10 -0
- data/ext/graphics/sprite.c +249 -0
- data/ext/graphics/sprite.h +10 -0
- data/ext/graphics/stencil_mode.c +211 -0
- data/ext/graphics/stencil_mode.h +18 -0
- data/ext/graphics/target.c +133 -0
- data/ext/graphics/target.h +40 -0
- data/ext/graphics/text.c +344 -0
- data/ext/graphics/text.h +10 -0
- data/ext/graphics/texture.c +379 -0
- data/ext/graphics/texture.h +16 -0
- data/ext/graphics/transform.c +372 -0
- data/ext/graphics/transform.h +35 -0
- data/ext/{transformable.c → graphics/transformable.c} +168 -144
- data/ext/{ext/klass → graphics}/transformable.h +3 -3
- data/ext/graphics/vertex.c +179 -0
- data/ext/graphics/vertex.h +23 -0
- data/ext/graphics/vertex_array.c +127 -0
- data/ext/graphics/vertex_array.h +10 -0
- data/ext/graphics/vertex_buffer.c +211 -0
- data/ext/graphics/vertex_buffer.h +14 -0
- data/ext/{view.c → graphics/view.c} +168 -169
- data/ext/{ext/klass → graphics}/view.h +3 -3
- data/ext/network/ftp.c +405 -0
- data/ext/network/ftp.h +20 -0
- data/ext/network/http.c +243 -0
- data/ext/network/http.h +18 -0
- data/ext/network/ip_address.c +164 -0
- data/ext/network/ip_address.h +20 -0
- data/ext/network/network_enums.c +298 -0
- data/ext/network/network_enums.h +26 -0
- data/ext/network/packet.c +189 -0
- data/ext/network/packet.h +14 -0
- data/ext/network/socket_selector.c +142 -0
- data/ext/network/socket_selector.h +14 -0
- data/ext/network/tcp_listener.c +115 -0
- data/ext/network/tcp_listener.h +14 -0
- data/ext/network/tcp_socket.c +199 -0
- data/ext/network/tcp_socket.h +17 -0
- data/ext/network/udp_socket.c +190 -0
- data/ext/network/udp_socket.h +14 -0
- data/ext/ports.rb +97 -21
- data/ext/system/buffer.c +77 -0
- data/ext/system/buffer.h +14 -0
- data/ext/system/clock.c +100 -0
- data/ext/{ext/klass → system}/clock.h +3 -3
- data/ext/system/input_stream.c +229 -0
- data/ext/system/input_stream.h +23 -0
- data/ext/system/sleep.c +16 -0
- data/ext/system/sleep.h +8 -0
- data/ext/system/time.c +218 -0
- data/ext/system/time.h +18 -0
- data/ext/system/vec2.c +251 -0
- data/ext/system/vec2.h +55 -0
- data/ext/system/vec3.c +219 -0
- data/ext/system/vec3.h +18 -0
- data/ext/window/clipboard.c +89 -0
- data/ext/window/clipboard.h +8 -0
- data/ext/window/context.c +70 -0
- data/ext/window/context.h +8 -0
- data/ext/window/context_settings.c +220 -0
- data/ext/window/context_settings.h +18 -0
- data/ext/window/cursor.c +56 -0
- data/ext/window/cursor.h +14 -0
- data/ext/window/event.c +216 -0
- data/ext/window/event.h +14 -0
- data/ext/{event_name.c → window/event_name.c} +2 -2
- data/ext/window/event_name.h +8 -0
- data/ext/window/input_enums.c +261 -0
- data/ext/window/input_enums.h +36 -0
- data/ext/window/joystick.c +60 -0
- data/ext/window/joystick.h +8 -0
- data/ext/{keyboard.c → window/keyboard.c} +74 -2
- data/ext/window/keyboard.h +12 -0
- data/ext/window/mouse.c +70 -0
- data/ext/window/mouse.h +8 -0
- data/ext/window/sensor.c +30 -0
- data/ext/window/sensor.h +8 -0
- data/ext/window/touch.c +49 -0
- data/ext/window/touch.h +8 -0
- data/ext/window/video_mode.c +133 -0
- data/ext/window/video_mode.h +14 -0
- data/ext/window/vulkan.c +44 -0
- data/ext/window/vulkan.h +8 -0
- data/ext/window/window.c +414 -0
- data/ext/{ext/klass → window}/window.h +3 -3
- data/lib/sfml/version.rb +4 -2
- data/lib/sfml.rb +2 -0
- metadata +163 -56
- data/ext/circle.c +0 -198
- data/ext/clock.c +0 -65
- data/ext/color.c +0 -43
- data/ext/event.c +0 -148
- data/ext/ext/klass/color.h +0 -26
- data/ext/ext/klass/drawable/image.h +0 -4
- data/ext/ext/klass/drawable/polygon.h +0 -4
- data/ext/ext/klass/drawable/rectangle.h +0 -4
- data/ext/ext/klass/drawable/sprite.h +0 -4
- data/ext/ext/klass/drawable/texture.h +0 -4
- data/ext/ext/klass/event/event_name.h +0 -8
- data/ext/ext/klass/event.h +0 -12
- data/ext/ext/klass/keyboard.h +0 -8
- data/ext/ext/klass/render_state.h +0 -16
- data/ext/ext/klass/target.h +0 -18
- data/ext/ext/klass/transform.h +0 -17
- data/ext/ext/klass/video_mode.h +0 -12
- data/ext/ext/module/drawable/drawable.h +0 -10
- data/ext/ext/module/transform.h +0 -18
- data/ext/ext/module.h +0 -10
- data/ext/ext/rect.h +0 -16
- data/ext/ext/style_name.h +0 -11
- data/ext/ext/vec2.h +0 -38
- data/ext/image.c +0 -5
- data/ext/polygon.c +0 -5
- data/ext/rect.c +0 -26
- data/ext/rectangle.c +0 -5
- data/ext/render_state.c +0 -109
- data/ext/sprite.c +0 -5
- data/ext/style_name.c +0 -15
- data/ext/target.c +0 -106
- data/ext/texture.c +0 -5
- data/ext/transform.c +0 -107
- data/ext/vec2.c +0 -42
- data/ext/video_mode.c +0 -78
- data/ext/window.c +0 -274
|
@@ -0,0 +1,540 @@
|
|
|
1
|
+
#include "graphics/shader.h"
|
|
2
|
+
|
|
3
|
+
#include <ruby.h>
|
|
4
|
+
#include <stdlib.h>
|
|
5
|
+
|
|
6
|
+
#include "graphics/color.h"
|
|
7
|
+
#include "graphics/texture.h"
|
|
8
|
+
#include "system/input_stream.h"
|
|
9
|
+
#include "system/vec2.h"
|
|
10
|
+
#include "system/vec3.h"
|
|
11
|
+
#include "core/exceptions.h"
|
|
12
|
+
#include "core/macros.h"
|
|
13
|
+
|
|
14
|
+
static VALUE rb_cShader;
|
|
15
|
+
|
|
16
|
+
static void Shader_free(void* ptr) {
|
|
17
|
+
sfShader_destroy(ptr);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static const rb_data_type_t Shader_data_type = {
|
|
21
|
+
.wrap_struct_name = "SFML::Shader",
|
|
22
|
+
.function = {.dmark = NULL, .dfree = Shader_free, .dsize = NULL},
|
|
23
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY};
|
|
24
|
+
|
|
25
|
+
static VALUE Shader_wrap(VALUE klass, sfShader* shader) {
|
|
26
|
+
if (shader == NULL) {
|
|
27
|
+
rb_raise(rb_eRuntimeError, "failed to create shader");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return TypedData_Wrap_Struct(klass, &Shader_data_type, shader);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* NULL skips a stage, mirroring CSFML. */
|
|
34
|
+
static const char* Shader_optional_cstr(VALUE rb_value) {
|
|
35
|
+
if (NIL_P(rb_value)) {
|
|
36
|
+
return NULL;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return StringValueCStr(rb_value);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
static VALUE Shader_from_file(int argc, VALUE* argv, VALUE klass) {
|
|
43
|
+
VALUE rb_vertex, rb_fragment, rb_geometry;
|
|
44
|
+
|
|
45
|
+
rb_scan_args(argc, argv, "12", &rb_vertex, &rb_fragment, &rb_geometry);
|
|
46
|
+
|
|
47
|
+
return Shader_wrap(klass, sfShader_createFromFile(StringValueCStr(rb_vertex),
|
|
48
|
+
Shader_optional_cstr(rb_geometry),
|
|
49
|
+
Shader_optional_cstr(rb_fragment)));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static VALUE Shader_from_memory(int argc, VALUE* argv, VALUE klass) {
|
|
53
|
+
VALUE rb_vertex, rb_fragment, rb_geometry;
|
|
54
|
+
|
|
55
|
+
rb_scan_args(argc, argv, "12", &rb_vertex, &rb_fragment, &rb_geometry);
|
|
56
|
+
|
|
57
|
+
return Shader_wrap(klass, sfShader_createFromMemory(Shader_optional_cstr(rb_vertex),
|
|
58
|
+
Shader_optional_cstr(rb_geometry),
|
|
59
|
+
Shader_optional_cstr(rb_fragment)));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static VALUE Shader_from_stream(int argc, VALUE* argv, VALUE klass) {
|
|
63
|
+
VALUE rb_vertex, rb_fragment, rb_geometry;
|
|
64
|
+
VALUE holder_vertex = Qnil, holder_fragment = Qnil, holder_geometry = Qnil;
|
|
65
|
+
sfInputStream* vertex = NULL;
|
|
66
|
+
sfInputStream* fragment = NULL;
|
|
67
|
+
sfInputStream* geometry = NULL;
|
|
68
|
+
|
|
69
|
+
rb_scan_args(argc, argv, "12", &rb_vertex, &rb_fragment, &rb_geometry);
|
|
70
|
+
|
|
71
|
+
if (!NIL_P(rb_vertex)) {
|
|
72
|
+
vertex = input_stream_from_rb(rb_vertex, &holder_vertex);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (!NIL_P(rb_fragment)) {
|
|
76
|
+
fragment = input_stream_from_rb(rb_fragment, &holder_fragment);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (!NIL_P(rb_geometry)) {
|
|
80
|
+
geometry = input_stream_from_rb(rb_geometry, &holder_geometry);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
(void)holder_vertex;
|
|
84
|
+
(void)holder_fragment;
|
|
85
|
+
(void)holder_geometry;
|
|
86
|
+
|
|
87
|
+
return Shader_wrap(klass, sfShader_createFromStream(vertex, geometry, fragment));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
static VALUE Shader_get_native_handle(VALUE self) {
|
|
91
|
+
return UINT2NUM(sfShader_getNativeHandle(Get_Shader_Struct(self)));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static VALUE Shader_bind(VALUE self) {
|
|
95
|
+
sfShader_bind(Get_Shader_Struct(self));
|
|
96
|
+
return self;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
static VALUE Shader_is_available(VALUE klass) {
|
|
100
|
+
return BOOL2RB(sfShader_isAvailable());
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
static VALUE Shader_is_geometry_available(VALUE klass) {
|
|
104
|
+
return BOOL2RB(sfShader_isGeometryAvailable());
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static void Shader_name(VALUE rb_name, char* buffer, size_t length) {
|
|
108
|
+
const char* name = StringValueCStr(rb_name);
|
|
109
|
+
|
|
110
|
+
snprintf(buffer, length, "%s", name);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static VALUE Shader_set_float(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
114
|
+
char name[256];
|
|
115
|
+
|
|
116
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
117
|
+
sfShader_setFloatUniform((sfShader*)Get_Shader_Struct(self), name, NUM2DBL(rb_x));
|
|
118
|
+
|
|
119
|
+
return self;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static VALUE Shader_set_int(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
123
|
+
char name[256];
|
|
124
|
+
|
|
125
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
126
|
+
sfShader_setIntUniform((sfShader*)Get_Shader_Struct(self), name, NUM2INT(rb_x));
|
|
127
|
+
|
|
128
|
+
return self;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
static VALUE Shader_set_bool(VALUE self, VALUE rb_name, VALUE rb_x) {
|
|
132
|
+
char name[256];
|
|
133
|
+
|
|
134
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
135
|
+
sfShader_setBoolUniform((sfShader*)Get_Shader_Struct(self), name, RTEST(rb_x));
|
|
136
|
+
|
|
137
|
+
return self;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
static VALUE Shader_set_color(VALUE self, VALUE rb_name, VALUE rb_color) {
|
|
141
|
+
char name[256];
|
|
142
|
+
|
|
143
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
144
|
+
sfShader_setColorUniform((sfShader*)Get_Shader_Struct(self), name, color_from_rb(rb_color));
|
|
145
|
+
|
|
146
|
+
return self;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
static VALUE Shader_set_int_color(VALUE self, VALUE rb_name, VALUE rb_color) {
|
|
150
|
+
char name[256];
|
|
151
|
+
|
|
152
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
153
|
+
sfShader_setIntColorUniform((sfShader*)Get_Shader_Struct(self), name, color_from_rb(rb_color));
|
|
154
|
+
|
|
155
|
+
return self;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
static VALUE Shader_set_vec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
159
|
+
char name[256];
|
|
160
|
+
|
|
161
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
162
|
+
sfShader_setVec2Uniform((sfShader*)Get_Shader_Struct(self), name, vec2f_from_rb(rb_vector));
|
|
163
|
+
|
|
164
|
+
return self;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
static VALUE Shader_set_vec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
168
|
+
char name[256];
|
|
169
|
+
|
|
170
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
171
|
+
sfShader_setVec3Uniform((sfShader*)Get_Shader_Struct(self), name, vec3f_from_rb(rb_vector));
|
|
172
|
+
|
|
173
|
+
return self;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/* Element converters shared by the scalar setters below and by the *_array
|
|
177
|
+
setters, which need the same conversion once per element. */
|
|
178
|
+
static sfGlslVec4 glsl_vec4_from_rb(VALUE rb_vector) {
|
|
179
|
+
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
180
|
+
sfGlslVec4 vector;
|
|
181
|
+
|
|
182
|
+
if (RARRAY_LEN(array) < 4) {
|
|
183
|
+
raise_invalid_array_length(4);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
vector.x = NUM2DBL(rb_ary_entry(array, 0));
|
|
187
|
+
vector.y = NUM2DBL(rb_ary_entry(array, 1));
|
|
188
|
+
vector.z = NUM2DBL(rb_ary_entry(array, 2));
|
|
189
|
+
vector.w = NUM2DBL(rb_ary_entry(array, 3));
|
|
190
|
+
|
|
191
|
+
return vector;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
static sfGlslMat3 glsl_mat3_from_rb(VALUE rb_matrix) {
|
|
195
|
+
VALUE array = rb_convert_type(rb_matrix, T_ARRAY, "Array", "to_ary");
|
|
196
|
+
sfGlslMat3 matrix;
|
|
197
|
+
long i;
|
|
198
|
+
|
|
199
|
+
if (RARRAY_LEN(array) < 9) {
|
|
200
|
+
raise_invalid_array_length(9);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
for (i = 0; i < 9; i++) {
|
|
204
|
+
matrix.array[i] = NUM2DBL(rb_ary_entry(array, i));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return matrix;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
static sfGlslMat4 glsl_mat4_from_rb(VALUE rb_matrix) {
|
|
211
|
+
VALUE array = rb_convert_type(rb_matrix, T_ARRAY, "Array", "to_ary");
|
|
212
|
+
sfGlslMat4 matrix;
|
|
213
|
+
long i;
|
|
214
|
+
|
|
215
|
+
if (RARRAY_LEN(array) < 16) {
|
|
216
|
+
raise_invalid_array_length(16);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
for (i = 0; i < 16; i++) {
|
|
220
|
+
matrix.array[i] = NUM2DBL(rb_ary_entry(array, i));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return matrix;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
static VALUE Shader_set_vec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
227
|
+
char name[256];
|
|
228
|
+
sfGlslVec4 vector = glsl_vec4_from_rb(rb_vector);
|
|
229
|
+
|
|
230
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
231
|
+
|
|
232
|
+
sfShader_setVec4Uniform((sfShader*)Get_Shader_Struct(self), name, vector);
|
|
233
|
+
|
|
234
|
+
return self;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
static VALUE Shader_set_ivec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
238
|
+
char name[256];
|
|
239
|
+
sfVector2f vec = vec2f_from_rb(rb_vector);
|
|
240
|
+
|
|
241
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
242
|
+
sfShader_setIvec2Uniform((sfShader*)Get_Shader_Struct(self), name,
|
|
243
|
+
(sfGlslIvec2){(int)vec.x, (int)vec.y});
|
|
244
|
+
|
|
245
|
+
return self;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
static VALUE Shader_set_ivec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
249
|
+
char name[256];
|
|
250
|
+
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
251
|
+
sfGlslIvec3 vector;
|
|
252
|
+
|
|
253
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
254
|
+
|
|
255
|
+
if (RARRAY_LEN(array) < 3) {
|
|
256
|
+
raise_invalid_array_length(3);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
vector.x = NUM2INT(rb_ary_entry(array, 0));
|
|
260
|
+
vector.y = NUM2INT(rb_ary_entry(array, 1));
|
|
261
|
+
vector.z = NUM2INT(rb_ary_entry(array, 2));
|
|
262
|
+
|
|
263
|
+
sfShader_setIvec3Uniform((sfShader*)Get_Shader_Struct(self), name, vector);
|
|
264
|
+
|
|
265
|
+
return self;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
static VALUE Shader_set_ivec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
269
|
+
char name[256];
|
|
270
|
+
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
271
|
+
sfGlslIvec4 vector;
|
|
272
|
+
|
|
273
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
274
|
+
|
|
275
|
+
if (RARRAY_LEN(array) < 4) {
|
|
276
|
+
raise_invalid_array_length(4);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
vector.x = NUM2INT(rb_ary_entry(array, 0));
|
|
280
|
+
vector.y = NUM2INT(rb_ary_entry(array, 1));
|
|
281
|
+
vector.z = NUM2INT(rb_ary_entry(array, 2));
|
|
282
|
+
vector.w = NUM2INT(rb_ary_entry(array, 3));
|
|
283
|
+
|
|
284
|
+
sfShader_setIvec4Uniform((sfShader*)Get_Shader_Struct(self), name, vector);
|
|
285
|
+
|
|
286
|
+
return self;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
static VALUE Shader_set_bvec2(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
290
|
+
char name[256];
|
|
291
|
+
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
292
|
+
|
|
293
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
294
|
+
|
|
295
|
+
if (RARRAY_LEN(array) < 2) {
|
|
296
|
+
raise_invalid_array_length(2);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
sfShader_setBvec2Uniform(
|
|
300
|
+
(sfShader*)Get_Shader_Struct(self), name,
|
|
301
|
+
(sfGlslBvec2){RTEST(rb_ary_entry(array, 0)), RTEST(rb_ary_entry(array, 1))});
|
|
302
|
+
|
|
303
|
+
return self;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
static VALUE Shader_set_bvec3(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
307
|
+
char name[256];
|
|
308
|
+
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
309
|
+
|
|
310
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
311
|
+
|
|
312
|
+
if (RARRAY_LEN(array) < 3) {
|
|
313
|
+
raise_invalid_array_length(3);
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
sfShader_setBvec3Uniform((sfShader*)Get_Shader_Struct(self), name,
|
|
317
|
+
(sfGlslBvec3){RTEST(rb_ary_entry(array, 0)),
|
|
318
|
+
RTEST(rb_ary_entry(array, 1)),
|
|
319
|
+
RTEST(rb_ary_entry(array, 2))});
|
|
320
|
+
|
|
321
|
+
return self;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
static VALUE Shader_set_bvec4(VALUE self, VALUE rb_name, VALUE rb_vector) {
|
|
325
|
+
char name[256];
|
|
326
|
+
VALUE array = rb_convert_type(rb_vector, T_ARRAY, "Array", "to_ary");
|
|
327
|
+
|
|
328
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
329
|
+
|
|
330
|
+
if (RARRAY_LEN(array) < 4) {
|
|
331
|
+
raise_invalid_array_length(4);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
sfShader_setBvec4Uniform(
|
|
335
|
+
(sfShader*)Get_Shader_Struct(self), name,
|
|
336
|
+
(sfGlslBvec4){RTEST(rb_ary_entry(array, 0)), RTEST(rb_ary_entry(array, 1)),
|
|
337
|
+
RTEST(rb_ary_entry(array, 2)), RTEST(rb_ary_entry(array, 3))});
|
|
338
|
+
|
|
339
|
+
return self;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
static VALUE Shader_set_mat3(VALUE self, VALUE rb_name, VALUE rb_matrix) {
|
|
343
|
+
char name[256];
|
|
344
|
+
sfGlslMat3 matrix = glsl_mat3_from_rb(rb_matrix);
|
|
345
|
+
|
|
346
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
347
|
+
|
|
348
|
+
sfShader_setMat3Uniform((sfShader*)Get_Shader_Struct(self), name, &matrix);
|
|
349
|
+
|
|
350
|
+
return self;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
static VALUE Shader_set_mat4(VALUE self, VALUE rb_name, VALUE rb_matrix) {
|
|
354
|
+
char name[256];
|
|
355
|
+
sfGlslMat4 matrix = glsl_mat4_from_rb(rb_matrix);
|
|
356
|
+
|
|
357
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
358
|
+
|
|
359
|
+
sfShader_setMat4Uniform((sfShader*)Get_Shader_Struct(self), name, &matrix);
|
|
360
|
+
|
|
361
|
+
return self;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* The six array setters differ only in element type, converter and CSFML
|
|
365
|
+
entry point, so they are generated rather than written out six times.
|
|
366
|
+
|
|
367
|
+
ALLOCV_N, not ALLOC_N: the converter runs per element and can raise (a bad
|
|
368
|
+
element, a short vector), and ALLOCV's buffer is owned by a temporary VALUE
|
|
369
|
+
that Ruby frees while unwinding. The hand-written versions this replaced
|
|
370
|
+
leaked the buffer on that path. */
|
|
371
|
+
#define SHADER_ARRAY_UNIFORM(suffix, c_type, converter, sf_setter) \
|
|
372
|
+
static VALUE Shader_set_##suffix##_array(VALUE self, VALUE rb_name, VALUE rb_values) { \
|
|
373
|
+
char name[256]; \
|
|
374
|
+
VALUE array = rb_convert_type(rb_values, T_ARRAY, "Array", "to_ary"); \
|
|
375
|
+
VALUE buffer; \
|
|
376
|
+
long count = RARRAY_LEN(array); \
|
|
377
|
+
long i; \
|
|
378
|
+
c_type* values = ALLOCV_N(c_type, buffer, count); \
|
|
379
|
+
\
|
|
380
|
+
Shader_name(rb_name, name, sizeof(name)); \
|
|
381
|
+
\
|
|
382
|
+
for (i = 0; i < count; i++) { \
|
|
383
|
+
values[i] = converter(rb_ary_entry(array, i)); \
|
|
384
|
+
} \
|
|
385
|
+
\
|
|
386
|
+
sf_setter((sfShader*)Get_Shader_Struct(self), name, values, (size_t)count); \
|
|
387
|
+
\
|
|
388
|
+
ALLOCV_END(buffer); \
|
|
389
|
+
\
|
|
390
|
+
return self; \
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
static float shader_float_from_rb(VALUE rb_value) {
|
|
394
|
+
return (float)NUM2DBL(rb_value);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
SHADER_ARRAY_UNIFORM(float, float, shader_float_from_rb, sfShader_setFloatUniformArray)
|
|
398
|
+
SHADER_ARRAY_UNIFORM(vec2, sfGlslVec2, vec2f_from_rb, sfShader_setVec2UniformArray)
|
|
399
|
+
SHADER_ARRAY_UNIFORM(vec3, sfGlslVec3, vec3f_from_rb, sfShader_setVec3UniformArray)
|
|
400
|
+
SHADER_ARRAY_UNIFORM(vec4, sfGlslVec4, glsl_vec4_from_rb, sfShader_setVec4UniformArray)
|
|
401
|
+
SHADER_ARRAY_UNIFORM(mat3, sfGlslMat3, glsl_mat3_from_rb, sfShader_setMat3UniformArray)
|
|
402
|
+
SHADER_ARRAY_UNIFORM(mat4, sfGlslMat4, glsl_mat4_from_rb, sfShader_setMat4UniformArray)
|
|
403
|
+
|
|
404
|
+
#undef SHADER_ARRAY_UNIFORM
|
|
405
|
+
|
|
406
|
+
static VALUE Shader_set_texture(VALUE self, VALUE rb_name, VALUE rb_texture) {
|
|
407
|
+
char name[256];
|
|
408
|
+
|
|
409
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
410
|
+
|
|
411
|
+
if (NIL_P(rb_texture)) {
|
|
412
|
+
sfShader_setTextureUniform((sfShader*)Get_Shader_Struct(self), name, NULL);
|
|
413
|
+
return rb_texture;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (!rb_obj_is_kind_of(rb_texture, Get_Klass_Texture())) {
|
|
417
|
+
raise_invalid_argument_class(Get_Klass_Texture());
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
sfShader_setTextureUniform((sfShader*)Get_Shader_Struct(self), name,
|
|
421
|
+
Get_Texture_Struct(rb_texture));
|
|
422
|
+
|
|
423
|
+
return rb_texture;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
static VALUE Shader_set_current_texture(VALUE self, VALUE rb_name) {
|
|
427
|
+
char name[256];
|
|
428
|
+
|
|
429
|
+
Shader_name(rb_name, name, sizeof(name));
|
|
430
|
+
sfShader_setCurrentTextureUniform((sfShader*)Get_Shader_Struct(self), name);
|
|
431
|
+
|
|
432
|
+
return self;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
static VALUE Shader_set_uniform(VALUE self, VALUE rb_name, VALUE rb_value) {
|
|
436
|
+
if (rb_obj_is_kind_of(rb_value, Get_Klass_Color())) {
|
|
437
|
+
return Shader_set_color(self, rb_name, rb_value);
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if (rb_obj_is_kind_of(rb_value, Get_Klass_Texture())) {
|
|
441
|
+
return Shader_set_texture(self, rb_name, rb_value);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (rb_obj_is_kind_of(rb_value, Get_Klass_Vector2())) {
|
|
445
|
+
return Shader_set_vec2(self, rb_name, rb_value);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
if (rb_obj_is_kind_of(rb_value, Get_Klass_Vector3())) {
|
|
449
|
+
return Shader_set_vec3(self, rb_name, rb_value);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
if (rb_value == Qtrue || rb_value == Qfalse) {
|
|
453
|
+
return Shader_set_bool(self, rb_name, rb_value);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
if (RB_INTEGER_TYPE_P(rb_value)) {
|
|
457
|
+
return Shader_set_int(self, rb_name, rb_value);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
if (RB_FLOAT_TYPE_P(rb_value)) {
|
|
461
|
+
return Shader_set_float(self, rb_name, rb_value);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
if (RB_TYPE_P(rb_value, T_ARRAY)) {
|
|
465
|
+
long length = RARRAY_LEN(rb_value);
|
|
466
|
+
|
|
467
|
+
if (length == 2) {
|
|
468
|
+
return Shader_set_vec2(self, rb_name, rb_value);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
if (length == 3) {
|
|
472
|
+
return Shader_set_vec3(self, rb_name, rb_value);
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
if (length == 4) {
|
|
476
|
+
return Shader_set_vec4(self, rb_name, rb_value);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (length == 9) {
|
|
480
|
+
return Shader_set_mat3(self, rb_name, rb_value);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (length == 16) {
|
|
484
|
+
return Shader_set_mat4(self, rb_name, rb_value);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
rb_raise(rb_eArgError, "unsupported shader uniform value");
|
|
489
|
+
return self;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
void Init_Shader(VALUE rb_module) {
|
|
493
|
+
rb_cShader = rb_define_class_under(rb_module, "Shader", rb_cObject);
|
|
494
|
+
|
|
495
|
+
rb_define_singleton_method(rb_cShader, "from_file", Shader_from_file, -1);
|
|
496
|
+
rb_define_singleton_method(rb_cShader, "from_memory", Shader_from_memory, -1);
|
|
497
|
+
rb_define_singleton_method(rb_cShader, "from_stream", Shader_from_stream, -1);
|
|
498
|
+
rb_define_singleton_method(rb_cShader, "available?", Shader_is_available, 0);
|
|
499
|
+
rb_define_singleton_method(rb_cShader, "geometry_available?", Shader_is_geometry_available, 0);
|
|
500
|
+
|
|
501
|
+
rb_define_method(rb_cShader, "native_handle", Shader_get_native_handle, 0);
|
|
502
|
+
rb_define_method(rb_cShader, "bind", Shader_bind, 0);
|
|
503
|
+
|
|
504
|
+
rb_define_method(rb_cShader, "set_float", Shader_set_float, 2);
|
|
505
|
+
rb_define_method(rb_cShader, "set_int", Shader_set_int, 2);
|
|
506
|
+
rb_define_method(rb_cShader, "set_bool", Shader_set_bool, 2);
|
|
507
|
+
rb_define_method(rb_cShader, "set_color", Shader_set_color, 2);
|
|
508
|
+
rb_define_method(rb_cShader, "set_int_color", Shader_set_int_color, 2);
|
|
509
|
+
rb_define_method(rb_cShader, "set_vec2", Shader_set_vec2, 2);
|
|
510
|
+
rb_define_method(rb_cShader, "set_vec3", Shader_set_vec3, 2);
|
|
511
|
+
rb_define_method(rb_cShader, "set_vec4", Shader_set_vec4, 2);
|
|
512
|
+
rb_define_method(rb_cShader, "set_ivec2", Shader_set_ivec2, 2);
|
|
513
|
+
rb_define_method(rb_cShader, "set_ivec3", Shader_set_ivec3, 2);
|
|
514
|
+
rb_define_method(rb_cShader, "set_ivec4", Shader_set_ivec4, 2);
|
|
515
|
+
rb_define_method(rb_cShader, "set_bvec2", Shader_set_bvec2, 2);
|
|
516
|
+
rb_define_method(rb_cShader, "set_bvec3", Shader_set_bvec3, 2);
|
|
517
|
+
rb_define_method(rb_cShader, "set_bvec4", Shader_set_bvec4, 2);
|
|
518
|
+
rb_define_method(rb_cShader, "set_mat3", Shader_set_mat3, 2);
|
|
519
|
+
rb_define_method(rb_cShader, "set_mat4", Shader_set_mat4, 2);
|
|
520
|
+
rb_define_method(rb_cShader, "set_float_array", Shader_set_float_array, 2);
|
|
521
|
+
rb_define_method(rb_cShader, "set_vec2_array", Shader_set_vec2_array, 2);
|
|
522
|
+
rb_define_method(rb_cShader, "set_vec3_array", Shader_set_vec3_array, 2);
|
|
523
|
+
rb_define_method(rb_cShader, "set_vec4_array", Shader_set_vec4_array, 2);
|
|
524
|
+
rb_define_method(rb_cShader, "set_mat3_array", Shader_set_mat3_array, 2);
|
|
525
|
+
rb_define_method(rb_cShader, "set_mat4_array", Shader_set_mat4_array, 2);
|
|
526
|
+
rb_define_method(rb_cShader, "set_texture", Shader_set_texture, 2);
|
|
527
|
+
rb_define_method(rb_cShader, "set_current_texture", Shader_set_current_texture, 1);
|
|
528
|
+
rb_define_method(rb_cShader, "set_uniform", Shader_set_uniform, 2);
|
|
529
|
+
rb_define_method(rb_cShader, "uniform=", Shader_set_uniform, 2);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
VALUE Get_Klass_Shader(void) {
|
|
533
|
+
return rb_cShader;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
const sfShader* Get_Shader_Struct(VALUE self) {
|
|
537
|
+
sfShader* ptr;
|
|
538
|
+
TypedData_Get_Struct(self, sfShader, &Shader_data_type, ptr);
|
|
539
|
+
return ptr;
|
|
540
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#ifndef SFML_RB_GRAPHICS_SHADER_H
|
|
2
|
+
#define SFML_RB_GRAPHICS_SHADER_H
|
|
3
|
+
|
|
4
|
+
#include <ruby.h>
|
|
5
|
+
|
|
6
|
+
#include "core/sfml.h"
|
|
7
|
+
|
|
8
|
+
void Init_Shader(VALUE rb_module);
|
|
9
|
+
|
|
10
|
+
VALUE Get_Klass_Shader(void);
|
|
11
|
+
|
|
12
|
+
const sfShader *Get_Shader_Struct(VALUE self);
|
|
13
|
+
|
|
14
|
+
#endif //SFML_RB_GRAPHICS_SHADER_H
|