LiteRGSS 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/ext/LiteRGSS/Bitmap.cpp +316 -0
  3. data/ext/LiteRGSS/Bitmap.h +24 -0
  4. data/ext/LiteRGSS/BlendMode.cpp +202 -0
  5. data/ext/LiteRGSS/BlendMode.h +20 -0
  6. data/ext/LiteRGSS/CBitmap_Element.cpp +50 -0
  7. data/ext/LiteRGSS/CBitmap_Element.h +17 -0
  8. data/ext/LiteRGSS/CDrawable_Element.cpp +38 -0
  9. data/ext/LiteRGSS/CDrawable_Element.h +30 -0
  10. data/ext/LiteRGSS/CRect_Element.h +15 -0
  11. data/ext/LiteRGSS/CShaderSprite_Element.cpp +17 -0
  12. data/ext/LiteRGSS/CShaderSprite_Element.h +17 -0
  13. data/ext/LiteRGSS/CSprite_Element.cpp +15 -0
  14. data/ext/LiteRGSS/CSprite_Element.h +36 -0
  15. data/ext/LiteRGSS/CText_Element.cpp +12 -0
  16. data/ext/LiteRGSS/CText_Element.h +29 -0
  17. data/ext/LiteRGSS/CTone_Element.h +17 -0
  18. data/ext/LiteRGSS/CViewport_Element.cpp +224 -0
  19. data/ext/LiteRGSS/CViewport_Element.h +57 -0
  20. data/ext/LiteRGSS/Color.cpp +200 -0
  21. data/ext/LiteRGSS/Color.h +22 -0
  22. data/ext/LiteRGSS/Fonts.cpp +126 -0
  23. data/ext/LiteRGSS/Fonts.h +20 -0
  24. data/ext/LiteRGSS/Graphics.cpp +314 -0
  25. data/ext/LiteRGSS/Graphics.h +31 -0
  26. data/ext/LiteRGSS/Graphics.local.cpp +365 -0
  27. data/ext/LiteRGSS/Graphics.local.h +37 -0
  28. data/ext/LiteRGSS/Image.cpp +460 -0
  29. data/ext/LiteRGSS/Image.h +32 -0
  30. data/ext/LiteRGSS/Input.cpp +664 -0
  31. data/ext/LiteRGSS/Input.h +38 -0
  32. data/ext/LiteRGSS/LiteRGSS.cpp +34 -0
  33. data/ext/LiteRGSS/LiteRGSS.h +113 -0
  34. data/ext/LiteRGSS/Rect.cpp +324 -0
  35. data/ext/LiteRGSS/Rect.h +24 -0
  36. data/ext/LiteRGSS/Shader.cpp +279 -0
  37. data/ext/LiteRGSS/Shader.h +13 -0
  38. data/ext/LiteRGSS/ShaderSprite.cpp +78 -0
  39. data/ext/LiteRGSS/ShaderSprite.h +8 -0
  40. data/ext/LiteRGSS/Sprite.cpp +495 -0
  41. data/ext/LiteRGSS/Sprite.h +43 -0
  42. data/ext/LiteRGSS/Table.cpp +228 -0
  43. data/ext/LiteRGSS/Table.h +29 -0
  44. data/ext/LiteRGSS/Table32.cpp +228 -0
  45. data/ext/LiteRGSS/Table32.h +29 -0
  46. data/ext/LiteRGSS/Text.cpp +574 -0
  47. data/ext/LiteRGSS/Text.h +52 -0
  48. data/ext/LiteRGSS/Texture.hpp +735 -0
  49. data/ext/LiteRGSS/Tone.cpp +228 -0
  50. data/ext/LiteRGSS/Tone.h +22 -0
  51. data/ext/LiteRGSS/Viewport.cpp +491 -0
  52. data/ext/LiteRGSS/Viewport.h +33 -0
  53. data/ext/LiteRGSS/Yuki.cpp +29 -0
  54. data/ext/LiteRGSS/Yuki.h +8 -0
  55. data/ext/LiteRGSS/Yuki_Gif.cpp +218 -0
  56. data/ext/LiteRGSS/Yuki_Gif.h +25 -0
  57. data/ext/LiteRGSS/extconf.rb +8 -0
  58. data/ext/LiteRGSS/libnsgif.c +1169 -0
  59. data/ext/LiteRGSS/libnsgif.h +183 -0
  60. data/ext/LiteRGSS/libnsgif.hpp +184 -0
  61. data/ext/LiteRGSS/lodepng.cpp +6245 -0
  62. data/ext/LiteRGSS/lodepng.h +1769 -0
  63. data/ext/LiteRGSS/lzw.c +377 -0
  64. data/ext/LiteRGSS/lzw.h +105 -0
  65. data/ext/LiteRGSS/sf_Text2.cpp +690 -0
  66. data/ext/LiteRGSS/sf_Text2.hpp +549 -0
  67. data/ext/LiteRGSS/utils/log.h +21 -0
  68. metadata +112 -0
@@ -0,0 +1,24 @@
1
+ #ifndef L_RECT_HEADER
2
+ #define L_RECT_HEADER
3
+
4
+ VALUE rb_Rect_initialize(int argc, VALUE* argv, VALUE self);
5
+ VALUE rb_Rect_initialize_copy(VALUE self, VALUE other);
6
+ VALUE rb_Rect_set(int argc, VALUE* argv, VALUE self);
7
+ VALUE rb_Rect_getX(VALUE self);
8
+ VALUE rb_Rect_setX(VALUE self, VALUE val);
9
+ VALUE rb_Rect_getY(VALUE self);
10
+ VALUE rb_Rect_setY(VALUE self, VALUE val);
11
+ VALUE rb_Rect_getWidth(VALUE self);
12
+ VALUE rb_Rect_setWidth(VALUE self, VALUE val);
13
+ VALUE rb_Rect_getHeight(VALUE self);
14
+ VALUE rb_Rect_setHeight(VALUE self, VALUE val);
15
+ VALUE rb_Rect_load(VALUE self, VALUE str);
16
+ VALUE rb_Rect_save(VALUE self, VALUE limit);
17
+ VALUE rb_Rect_eql(VALUE self, VALUE other);
18
+ VALUE rb_Rect_empty(VALUE self);
19
+ VALUE rb_Rect_to_s(VALUE self);
20
+
21
+ CRect_Element* rb_Rect_get_rect(VALUE self);
22
+ void rb_Rect_test_rect(VALUE self);
23
+
24
+ #endif
@@ -0,0 +1,279 @@
1
+ #include "LiteRGSS.h"
2
+ #include "CTone_Element.h"
3
+
4
+ VALUE rb_cShader = Qnil;
5
+
6
+ #define SHADER_PROTECT if(RDATA(self)->data == nullptr) \
7
+ {\
8
+ rb_raise(rb_eRGSSError, "Disposed Shader."); \
9
+ return self; \
10
+ }
11
+
12
+ #define GET_SHADER sf::RenderStates* render_state; \
13
+ Data_Get_Struct(self, sf::RenderStates, render_state); \
14
+ SHADER_PROTECT \
15
+ sf::Shader* shader = const_cast<sf::Shader*>(render_state->shader);
16
+
17
+ void rb_Shader_Free(void* data)
18
+ {
19
+ sf::RenderStates* render_state = reinterpret_cast<sf::RenderStates*>(data);
20
+ if (render_state != nullptr)
21
+ {
22
+ if (render_state->shader != nullptr)
23
+ {
24
+ delete render_state->shader;
25
+ }
26
+ delete render_state;
27
+ }
28
+ }
29
+
30
+ VALUE rb_Shader_Alloc(VALUE klass)
31
+ {
32
+ sf::Shader* shader = new sf::Shader();
33
+ sf::RenderStates* render_state = new sf::RenderStates(shader);
34
+ return Data_Wrap_Struct(klass, NULL, rb_Shader_Free, render_state);
35
+ }
36
+
37
+ void Init_Shader()
38
+ {
39
+ rb_cShader = rb_define_class_under(rb_mLiteRGSS, "Shader", rb_cBlendMode); //<--- Should inherit of rb_cBlendMode
40
+ rb_define_alloc_func(rb_cShader, rb_Shader_Alloc);
41
+ rb_define_method(rb_cShader, "initialize", _rbf rb_Shader_loadFromMemory, -1);
42
+ rb_define_method(rb_cShader, "load", _rbf rb_Shader_loadFromMemory, -1);
43
+ rb_define_method(rb_cShader, "set_float_uniform", _rbf rb_Shader_setFloatUniform, 2);
44
+ rb_define_method(rb_cShader, "set_int_uniform", _rbf rb_Shader_setIntUniform, 2);
45
+ rb_define_method(rb_cShader, "set_bool_uniform", _rbf rb_Shader_setBoolUniform, 2);
46
+ rb_define_method(rb_cShader, "set_texture_uniform", _rbf rb_Shader_setTextureUniform, 2);
47
+ rb_define_method(rb_cShader, "set_matrix_uniform", _rbf rb_Shader_setMatrixUniform, 2);
48
+ rb_define_method(rb_cShader, "set_float_array_uniform", _rbf rb_Shader_setFloatArrayUniform, 2);
49
+
50
+ rb_define_method(rb_cShader, "clone", _rbf rb_Shader_Copy, 0);
51
+ rb_define_method(rb_cShader, "dup", _rbf rb_Shader_Copy, 0);
52
+
53
+ rb_define_singleton_method(rb_cShader, "is_geometry_available?", _rbf rb_Shader_isGeometryAvailable, 0);
54
+
55
+ rb_define_const(rb_cShader, "Fragment", LONG2FIX(sf::Shader::Type::Fragment));
56
+ rb_define_const(rb_cShader, "Vertex", LONG2FIX(sf::Shader::Type::Vertex));
57
+ rb_define_const(rb_cShader, "Geometry", LONG2FIX(sf::Shader::Type::Geometry));
58
+ }
59
+
60
+ VALUE rb_Shader_loadFromMemory(int argc, VALUE *argv, VALUE self)
61
+ {
62
+ VALUE arg1, arg2, arg3;
63
+ GET_SHADER
64
+ rb_scan_args(argc, argv, "12", &arg1, &arg2, &arg3);
65
+ rb_check_type(arg1, T_STRING);
66
+ if (RTEST(arg2))
67
+ {
68
+ if (rb_obj_is_kind_of(arg2, rb_cInteger) == Qtrue)
69
+ {
70
+ shader->loadFromMemory(rb_string_value_cstr(&arg1), static_cast<sf::Shader::Type>(NUM2LONG(arg2)));
71
+ }
72
+ else
73
+ {
74
+ rb_check_type(arg2, T_STRING);
75
+ if (argc == 2)
76
+ {
77
+ shader->loadFromMemory(rb_string_value_cstr(&arg1), rb_string_value_cstr(&arg2));
78
+ }
79
+ else if (argc == 3)
80
+ {
81
+ rb_check_type(arg3, T_STRING);
82
+ shader->loadFromMemory(rb_string_value_cstr(&arg1), rb_string_value_cstr(&arg2), rb_string_value_cstr(&arg3));
83
+ }
84
+ }
85
+ }
86
+ else
87
+ {
88
+ shader->loadFromMemory(rb_string_value_cstr(&arg1), sf::Shader::Type::Fragment);
89
+ }
90
+ //rb_obj_is_kind_of(other, rb_cBitmap)
91
+ return self;
92
+ }
93
+
94
+ VALUE rb_Shader_setFloatUniform(VALUE self, VALUE name, VALUE uniform)
95
+ {
96
+ GET_SHADER;
97
+ rb_check_type(name, T_STRING);
98
+ if (rb_obj_is_kind_of(uniform, rb_cArray) == Qtrue)
99
+ {
100
+ long arylen = RARRAY_LEN(uniform);
101
+ if (arylen == 4)
102
+ {
103
+ sf::Glsl::Vec4 vect4(NUM2DBL(rb_ary_entry(uniform, 0)), NUM2DBL(rb_ary_entry(uniform, 1)), NUM2DBL(rb_ary_entry(uniform, 2)), NUM2DBL(rb_ary_entry(uniform, 3)));
104
+ shader->setUniform(rb_string_value_cstr(&name), vect4);
105
+ }
106
+ else if (arylen == 3)
107
+ {
108
+ sf::Glsl::Vec3 vect3(NUM2DBL(rb_ary_entry(uniform, 0)), NUM2DBL(rb_ary_entry(uniform, 1)), NUM2DBL(rb_ary_entry(uniform, 2)));
109
+ shader->setUniform(rb_string_value_cstr(&name), vect3);
110
+ }
111
+ else if(arylen == 2)
112
+ {
113
+ sf::Glsl::Vec2 vect2(NUM2DBL(rb_ary_entry(uniform, 0)), NUM2DBL(rb_ary_entry(uniform, 1)));
114
+ shader->setUniform(rb_string_value_cstr(&name), vect2);
115
+ }
116
+ }
117
+ else if (rb_obj_is_kind_of(uniform, rb_cColor) == Qtrue)
118
+ {
119
+ sf::Color* color;
120
+ Data_Get_Struct(uniform, sf::Color, color);
121
+ if (color != nullptr)
122
+ {
123
+ sf::Glsl::Vec4 vect4(color->r / 255.0, color->g / 255.0, color->b / 255.0, color->a / 255.0);
124
+ shader->setUniform(rb_string_value_cstr(&name), vect4);
125
+ }
126
+ }
127
+ else if (rb_obj_is_kind_of(uniform, rb_cTone) == Qtrue)
128
+ {
129
+ CTone_Element* tone;
130
+ Data_Get_Struct(uniform, CTone_Element, tone);
131
+ if(tone != nullptr)
132
+ shader->setUniform(rb_string_value_cstr(&name), *tone->getTone());
133
+ }
134
+ else
135
+ {
136
+ shader->setUniform(rb_string_value_cstr(&name), static_cast<float>(NUM2DBL(uniform)));
137
+ }
138
+ return self;
139
+ }
140
+
141
+ VALUE rb_Shader_setIntUniform(VALUE self, VALUE name, VALUE uniform)
142
+ {
143
+ GET_SHADER;
144
+ rb_check_type(name, T_STRING);
145
+ if (rb_obj_is_kind_of(uniform, rb_cArray) == Qtrue)
146
+ {
147
+ long arylen = RARRAY_LEN(uniform);
148
+ if (arylen == 4)
149
+ {
150
+ sf::Glsl::Ivec4 vect4(rb_num2long(rb_ary_entry(uniform, 0)), rb_num2long(rb_ary_entry(uniform, 1)), rb_num2long(rb_ary_entry(uniform, 2)), rb_num2long(rb_ary_entry(uniform, 3)));
151
+ shader->setUniform(rb_string_value_cstr(&name), vect4);
152
+ }
153
+ else if (arylen == 3)
154
+ {
155
+ sf::Glsl::Ivec3 vect3(rb_num2long(rb_ary_entry(uniform, 0)), rb_num2long(rb_ary_entry(uniform, 1)), rb_num2long(rb_ary_entry(uniform, 2)));
156
+ shader->setUniform(rb_string_value_cstr(&name), vect3);
157
+ }
158
+ else if(arylen == 2)
159
+ {
160
+ sf::Glsl::Ivec2 vect2(rb_num2long(rb_ary_entry(uniform, 0)), rb_num2long(rb_ary_entry(uniform, 1)));
161
+ shader->setUniform(rb_string_value_cstr(&name), vect2);
162
+ }
163
+ }
164
+ else
165
+ {
166
+ shader->setUniform(rb_string_value_cstr(&name), static_cast<int>(rb_num2long(uniform)));
167
+ }
168
+ return self;
169
+ }
170
+
171
+
172
+ VALUE rb_Shader_setBoolUniform(VALUE self, VALUE name, VALUE uniform)
173
+ {
174
+ GET_SHADER;
175
+ rb_check_type(name, T_STRING);
176
+ if (rb_obj_is_kind_of(uniform, rb_cArray) == Qtrue)
177
+ {
178
+ long arylen = RARRAY_LEN(uniform);
179
+ if (arylen == 4)
180
+ {
181
+ sf::Glsl::Bvec4 vect4(RTEST(rb_ary_entry(uniform, 0)), RTEST(rb_ary_entry(uniform, 1)), RTEST(rb_ary_entry(uniform, 2)), RTEST(rb_ary_entry(uniform, 3)));
182
+ shader->setUniform(rb_string_value_cstr(&name), vect4);
183
+ }
184
+ else if (arylen == 3)
185
+ {
186
+ sf::Glsl::Bvec3 vect3(RTEST(rb_ary_entry(uniform, 0)), RTEST(rb_ary_entry(uniform, 1)), RTEST(rb_ary_entry(uniform, 2)));
187
+ shader->setUniform(rb_string_value_cstr(&name), vect3);
188
+ }
189
+ else if(arylen == 2)
190
+ {
191
+ sf::Glsl::Bvec2 vect2(RTEST(rb_ary_entry(uniform, 0)), RTEST(rb_ary_entry(uniform, 1)));
192
+ shader->setUniform(rb_string_value_cstr(&name), vect2);
193
+ }
194
+ }
195
+ else
196
+ {
197
+ shader->setUniform(rb_string_value_cstr(&name), RTEST(uniform));
198
+ }
199
+ return self;
200
+ }
201
+
202
+ VALUE rb_Shader_setTextureUniform(VALUE self, VALUE name, VALUE uniform)
203
+ {
204
+ GET_SHADER;
205
+ rb_check_type(name, T_STRING);
206
+ if (rb_obj_is_kind_of(uniform, rb_cBitmap) == Qtrue)
207
+ {
208
+ sf::Texture* texture = rb_Bitmap_getTexture(uniform);
209
+ if (texture != nullptr)
210
+ {
211
+ shader->setUniform(rb_string_value_cstr(&name), *texture);
212
+ }
213
+ }
214
+ else
215
+ {
216
+ shader->setUniform(rb_string_value_cstr(&name), sf::Shader::CurrentTexture);
217
+ }
218
+ return self;
219
+ }
220
+
221
+ VALUE rb_Shader_setMatrixUniform(VALUE self, VALUE name, VALUE uniform)
222
+ {
223
+ GET_SHADER;
224
+ unsigned long i;
225
+ rb_check_type(name, T_STRING);
226
+ rb_check_type(uniform, T_ARRAY);
227
+ long arylen = RARRAY_LEN(uniform);
228
+ float floats[16];
229
+ if (arylen == 9)
230
+ {
231
+ for (i = 0; i < 9; i++)
232
+ {
233
+ floats[i] = NUM2DBL(rb_ary_entry(uniform, i));
234
+ }
235
+ sf::Glsl::Mat3 matrix3(floats);
236
+ shader->setUniform(rb_string_value_cstr(&name), matrix3);
237
+ }
238
+ else if(arylen == 16)
239
+ {
240
+ for (i = 0; i < 16; i++)
241
+ {
242
+ floats[i] = NUM2DBL(rb_ary_entry(uniform, i));
243
+ }
244
+ sf::Glsl::Mat4 matrix4(floats);
245
+ shader->setUniform(rb_string_value_cstr(&name), matrix4);
246
+ }
247
+
248
+ return self;
249
+ }
250
+
251
+ VALUE rb_Shader_setFloatArrayUniform(VALUE self, VALUE name, VALUE uniform)
252
+ {
253
+ GET_SHADER;
254
+ rb_check_type(name, T_STRING);
255
+ rb_check_type(uniform, T_ARRAY);
256
+ unsigned int len = RARRAY_LEN(uniform);
257
+ float* floats = new float[len];
258
+ for (unsigned int i = 0; i < len; i++)
259
+ {
260
+ VALUE val = rb_ary_entry(uniform, i);
261
+ rb_check_type(val, T_FLOAT);
262
+ floats[i] = static_cast<float>(NUM2DBL(val));
263
+ }
264
+ shader->setUniformArray(rb_string_value_cstr(&name), floats, len);
265
+ delete floats;
266
+ return self;
267
+ }
268
+
269
+ VALUE rb_Shader_isGeometryAvailable(VALUE self)
270
+ {
271
+ return sf::Shader::isAvailable() ? Qtrue : Qfalse;
272
+ }
273
+
274
+
275
+ VALUE rb_Shader_Copy(VALUE self)
276
+ {
277
+ rb_raise(rb_eRGSSError, "Shaders cannot be cloned or duplicated.");
278
+ return self;
279
+ }
@@ -0,0 +1,13 @@
1
+ #ifndef L_SHADER_HEADER
2
+ #define L_SHADER_HEADER
3
+
4
+ VALUE rb_Shader_isGeometryAvailable(VALUE self);
5
+ VALUE rb_Shader_loadFromMemory(int argc, VALUE *argv, VALUE self);
6
+ VALUE rb_Shader_Copy(VALUE self);
7
+ VALUE rb_Shader_setFloatUniform(VALUE self, VALUE name, VALUE uniform);
8
+ VALUE rb_Shader_setIntUniform(VALUE self, VALUE name, VALUE uniform);
9
+ VALUE rb_Shader_setBoolUniform(VALUE self, VALUE name, VALUE uniform);
10
+ VALUE rb_Shader_setTextureUniform(VALUE self, VALUE name, VALUE uniform);
11
+ VALUE rb_Shader_setMatrixUniform(VALUE self, VALUE name, VALUE uniform);
12
+ VALUE rb_Shader_setFloatArrayUniform(VALUE self, VALUE name, VALUE uniform);
13
+ #endif // !L_SHADER_HEADER
@@ -0,0 +1,78 @@
1
+ #include "LiteRGSS.h"
2
+ #include "CBitmap_Element.h"
3
+ #include "CRect_Element.h"
4
+
5
+ VALUE rb_cShaderSprite = Qnil;
6
+
7
+ #define SHADER_SPRITE_PROTECT if(RDATA(self)->data == nullptr) \
8
+ {\
9
+ rb_raise(rb_eRGSSError, "Disposed Sprite."); \
10
+ return self; \
11
+ }
12
+
13
+ #define GET_SHADER_SPRITE CShaderSprite_Element* sprite; \
14
+ Data_Get_Struct(self, CShaderSprite_Element, sprite); \
15
+ SHADER_SPRITE_PROTECT
16
+
17
+ void rb_ShaderSprite_Mark(CShaderSprite_Element* sprite)
18
+ {
19
+ if(sprite == nullptr)
20
+ return;
21
+ rb_gc_mark(sprite->rViewport);
22
+ rb_gc_mark(sprite->rBitmap);
23
+ rb_gc_mark(sprite->rX);
24
+ rb_gc_mark(sprite->rY);
25
+ rb_gc_mark(sprite->rZ);
26
+ rb_gc_mark(sprite->rOX);
27
+ rb_gc_mark(sprite->rOY);
28
+ rb_gc_mark(sprite->rAngle);
29
+ rb_gc_mark(sprite->rZoomX);
30
+ rb_gc_mark(sprite->rZoomY);
31
+ rb_gc_mark(sprite->rRect);
32
+ rb_gc_mark(sprite->rRenderStates);
33
+ }
34
+
35
+ VALUE rb_ShaderSprite_Alloc(VALUE klass)
36
+ {
37
+ CShaderSprite_Element* sprite = new CShaderSprite_Element();
38
+ sprite->getSprite()->setColor(sf::Color(255, 255, 255, 255));
39
+ sprite->setLinkedRect(nullptr);
40
+ sprite->rRenderStates = Qnil;
41
+ return Data_Wrap_Struct(klass, rb_ShaderSprite_Mark, rb_Sprite_Free, sprite);
42
+ }
43
+
44
+ void Init_ShaderSprite() {
45
+ rb_cShaderSprite = rb_define_class_under(rb_mLiteRGSS, "ShaderedSprite", rb_cSprite);
46
+ rb_define_alloc_func(rb_cShaderSprite, rb_ShaderSprite_Alloc);
47
+
48
+ rb_define_method(rb_cShaderSprite, "shader", _rbf rb_ShaderSprite_getShader, 0);
49
+ rb_define_method(rb_cShaderSprite, "shader=", _rbf rb_ShaderSprite_setShader, 1);
50
+
51
+ rb_define_method(rb_cShaderSprite, "blendmode", _rbf rb_ShaderSprite_getShader, 0);
52
+ rb_define_method(rb_cShaderSprite, "blendmode=", _rbf rb_ShaderSprite_setShader, 1);
53
+ }
54
+
55
+ VALUE rb_ShaderSprite_getShader(VALUE self)
56
+ {
57
+ GET_SHADER_SPRITE;
58
+ return sprite->rRenderStates;
59
+ }
60
+
61
+ VALUE rb_ShaderSprite_setShader(VALUE self, VALUE shader)
62
+ {
63
+ sf::RenderStates* render_state;
64
+ GET_SHADER_SPRITE;
65
+ if (rb_obj_is_kind_of(shader, rb_cBlendMode) == Qtrue)
66
+ {
67
+ Data_Get_Struct(shader, sf::RenderStates, render_state);
68
+ if (render_state != nullptr)
69
+ {
70
+ sprite->rRenderStates = shader;
71
+ sprite->setRenderState(render_state);
72
+ return self;
73
+ }
74
+ }
75
+ sprite->rRenderStates = Qnil;
76
+ sprite->setRenderState(nullptr);
77
+ return self;
78
+ }
@@ -0,0 +1,8 @@
1
+ #ifndef L_SHADER_SPRITE_HEADER
2
+ #define L_SHADER_SPRITE_HEADER
3
+ #include "Graphics.h"
4
+
5
+ VALUE rb_ShaderSprite_getShader(VALUE self);
6
+ VALUE rb_ShaderSprite_setShader(VALUE self, VALUE shader);
7
+
8
+ #endif
@@ -0,0 +1,495 @@
1
+ #include "LiteRGSS.h"
2
+ #include "CBitmap_Element.h"
3
+ #include "CRect_Element.h"
4
+
5
+ VALUE rb_cSprite = Qnil;
6
+
7
+ #define SPRITE_PROTECT if(RDATA(self)->data == nullptr) \
8
+ {\
9
+ rb_raise(rb_eRGSSError, "Disposed Sprite."); \
10
+ return self; \
11
+ }
12
+
13
+ #define GET_SPRITE CSprite_Element* sprite; \
14
+ Data_Get_Struct(self, CSprite_Element, sprite); \
15
+ SPRITE_PROTECT
16
+
17
+ void rb_Sprite_Free(void* data)
18
+ {
19
+ CSprite_Element* sprite = reinterpret_cast<CSprite_Element*>(data);
20
+ if(sprite != nullptr)
21
+ {
22
+ if(NIL_P(sprite->rViewport)) // I can drop a sprite from the viewport it's stored in its table
23
+ sprite->setOriginStack(nullptr);
24
+ CRect_Element* rect = sprite->getLinkedRect();
25
+ if(rect != nullptr)
26
+ rect->setElement(nullptr);
27
+ delete sprite;
28
+ }
29
+ }
30
+
31
+ void rb_Sprite_Mark(CSprite_Element* sprite)
32
+ {
33
+ if(sprite == nullptr)
34
+ return;
35
+ rb_gc_mark(sprite->rViewport);
36
+ rb_gc_mark(sprite->rBitmap);
37
+ rb_gc_mark(sprite->rX);
38
+ rb_gc_mark(sprite->rY);
39
+ rb_gc_mark(sprite->rZ);
40
+ rb_gc_mark(sprite->rOX);
41
+ rb_gc_mark(sprite->rOY);
42
+ rb_gc_mark(sprite->rAngle);
43
+ rb_gc_mark(sprite->rZoomX);
44
+ rb_gc_mark(sprite->rZoomY);
45
+ rb_gc_mark(sprite->rRect);
46
+ }
47
+
48
+ VALUE rb_Sprite_Alloc(VALUE klass)
49
+ {
50
+ CSprite_Element* sprite = new CSprite_Element();
51
+ sprite->getSprite()->setColor(sf::Color(255, 255, 255, 255));
52
+ sprite->setLinkedRect(nullptr);
53
+ return Data_Wrap_Struct(klass, rb_Sprite_Mark, rb_Sprite_Free, sprite);
54
+ }
55
+
56
+ void Init_Sprite() {
57
+ rb_cSprite = rb_define_class_under(rb_mLiteRGSS, "Sprite", rb_cObject);
58
+ rb_define_alloc_func(rb_cSprite, rb_Sprite_Alloc);
59
+
60
+ rb_define_method(rb_cSprite, "initialize", _rbf rb_Sprite_Initialize, -1);
61
+ rb_define_method(rb_cSprite, "dispose", _rbf rb_Sprite_Dispose, 0);
62
+ rb_define_method(rb_cSprite, "bitmap", _rbf rb_Sprite_getBitmap, 0);
63
+ rb_define_method(rb_cSprite, "bitmap=", _rbf rb_Sprite_setBitmap, 1);
64
+ rb_define_method(rb_cSprite, "x", _rbf rb_Sprite_getX, 0);
65
+ rb_define_method(rb_cSprite, "x=", _rbf rb_Sprite_setX, 1);
66
+ rb_define_method(rb_cSprite, "y", _rbf rb_Sprite_getY, 0);
67
+ rb_define_method(rb_cSprite, "y=", _rbf rb_Sprite_setY, 1);
68
+ rb_define_method(rb_cSprite, "z", _rbf rb_Sprite_getZ, 0);
69
+ rb_define_method(rb_cSprite, "z=", _rbf rb_Sprite_setZ, 1);
70
+ rb_define_method(rb_cSprite, "ox", _rbf rb_Sprite_getOX, 0);
71
+ rb_define_method(rb_cSprite, "ox=", _rbf rb_Sprite_setOX, 1);
72
+ rb_define_method(rb_cSprite, "oy", _rbf rb_Sprite_getOY, 0);
73
+ rb_define_method(rb_cSprite, "oy=", _rbf rb_Sprite_setOY, 1);
74
+ rb_define_method(rb_cSprite, "visible", _rbf rb_Sprite_getVisible, 0);
75
+ rb_define_method(rb_cSprite, "visible=", _rbf rb_Sprite_setVisible, 1);
76
+ rb_define_method(rb_cSprite, "angle", _rbf rb_Sprite_getAngle, 0);
77
+ rb_define_method(rb_cSprite, "angle=", _rbf rb_Sprite_setAngle, 1);
78
+ rb_define_method(rb_cSprite, "zoom_x", _rbf rb_Sprite_getZoomX, 0);
79
+ rb_define_method(rb_cSprite, "zoom_x=", _rbf rb_Sprite_setZoomX, 1);
80
+ rb_define_method(rb_cSprite, "zoom_y", _rbf rb_Sprite_getZoomY, 0);
81
+ rb_define_method(rb_cSprite, "zoom_y=", _rbf rb_Sprite_setZoomY, 1);
82
+ rb_define_method(rb_cSprite, "set_position", _rbf rb_Sprite_setPosition, 2);
83
+ rb_define_method(rb_cSprite, "set_origin", _rbf rb_Sprite_setOrigin, 2);
84
+ rb_define_method(rb_cSprite, "zoom=", _rbf rb_Sprite_setZoom, 1);
85
+ rb_define_method(rb_cSprite, "opacity", _rbf rb_Sprite_getOpacity, 0);
86
+ rb_define_method(rb_cSprite, "opacity=", _rbf rb_Sprite_setOpacity, 1);
87
+ rb_define_method(rb_cSprite, "src_rect", _rbf rb_Sprite_getRect, 0);
88
+ rb_define_method(rb_cSprite, "src_rect=", _rbf rb_Sprite_setRect, 1);
89
+ rb_define_method(rb_cSprite, "disposed?", _rbf rb_Sprite_Disposed, 0);
90
+ rb_define_method(rb_cSprite, "viewport", _rbf rb_Sprite_Viewport, 0);
91
+ rb_define_method(rb_cSprite, "mirror", _rbf rb_Sprite_getMirror, 0);
92
+ rb_define_method(rb_cSprite, "mirror=", _rbf rb_Sprite_setMirror, 1);
93
+ rb_define_method(rb_cSprite, "width", _rbf rb_Sprite_width, 0);
94
+ rb_define_method(rb_cSprite, "height", _rbf rb_Sprite_height, 0);
95
+ rb_define_method(rb_cSprite, "__index__", _rbf rb_Sprite_Index, 0);
96
+
97
+ rb_define_method(rb_cSprite, "clone", _rbf rb_Sprite_Copy, 0);
98
+ rb_define_method(rb_cSprite, "dup", _rbf rb_Sprite_Copy, 0);
99
+ }
100
+
101
+ VALUE rb_Sprite_Initialize(int argc, VALUE* argv, VALUE self)
102
+ {
103
+ GET_SPRITE
104
+ VALUE table;
105
+ /* If a viewport was specified */
106
+ if(argc == 1 && rb_obj_is_kind_of(argv[0], rb_cViewport) == Qtrue)
107
+ {
108
+ CViewport_Element* viewport;
109
+ Data_Get_Struct(argv[0], CViewport_Element, viewport);
110
+ viewport->bind(sprite);
111
+ table = rb_ivar_get(argv[0], rb_iElementTable);
112
+ sprite->rViewport = argv[0];
113
+ }
114
+ /* Otherwise */
115
+ else
116
+ {
117
+ global_Graphics_Bind(sprite);
118
+ table = rb_ivar_get(rb_mGraphics, rb_iElementTable);
119
+ sprite->rViewport = Qnil;
120
+ }
121
+ /* Ajout à la table de sauvegarde */
122
+ rb_ary_push(table, self);
123
+ /* Initializing Instance variables */
124
+ sprite->rX = LONG2FIX(0);
125
+ sprite->rY = LONG2FIX(0);
126
+ sprite->rZ = LONG2FIX(0);
127
+ sprite->rOX = LONG2FIX(0);
128
+ sprite->rOY = LONG2FIX(0);
129
+ sprite->rAngle = LONG2FIX(0);
130
+ sprite->rZoomX = LONG2FIX(1);
131
+ sprite->rZoomY = LONG2FIX(1);
132
+ sprite->rBitmap = Qnil;
133
+ sprite->rRect = Qnil;
134
+ sprite->rMirror = Qfalse;
135
+ return self;
136
+ }
137
+
138
+ VALUE rb_Sprite_Copy(VALUE self)
139
+ {
140
+ rb_raise(rb_eRGSSError, "Sprites cannot be cloned or duplicated.");
141
+ return self;
142
+ }
143
+
144
+ VALUE rb_Sprite_Dispose(VALUE self)
145
+ {
146
+ GET_SPRITE
147
+ RDATA(self)->data = nullptr;
148
+ /* Suppression du sprite de ses stacks */
149
+ VALUE viewport = sprite->rViewport;
150
+ VALUE table;
151
+ if(NIL_P(viewport))
152
+ table = rb_ivar_get(rb_mGraphics, rb_iElementTable);
153
+ else
154
+ table = rb_ivar_get(viewport, rb_iElementTable);
155
+ rb_ary_delete(table, self);
156
+ sprite->setOriginStack(nullptr); // Ensure the sprite has been removed from the sprite stack
157
+ rb_Sprite_Free(reinterpret_cast<void*>(sprite));
158
+ return self;
159
+ }
160
+
161
+ VALUE rb_Sprite_DisposeFromViewport(VALUE self)
162
+ {
163
+ if(RDATA(self)->data == nullptr)
164
+ return self;
165
+ GET_SPRITE
166
+ RDATA(self)->data = nullptr;
167
+ rb_Sprite_Free(reinterpret_cast<void*>(sprite));
168
+ return self;
169
+ }
170
+
171
+ VALUE rb_Sprite_Disposed(VALUE self)
172
+ {
173
+ rb_check_type(self, T_DATA);
174
+ return (RDATA(self)->data == nullptr ? Qtrue : Qfalse);
175
+ }
176
+
177
+ VALUE rb_Sprite_setBitmap(VALUE self, VALUE bitmap)
178
+ {
179
+ GET_SPRITE
180
+ if(rb_obj_is_kind_of(bitmap, rb_cBitmap) == Qfalse)
181
+ {
182
+ if(bitmap == Qnil)
183
+ {
184
+ sprite->setDrawable(false);
185
+ sprite->rBitmap = bitmap;
186
+ }
187
+ else
188
+ rb_raise(rb_eTypeError, "Expected a Bitmap.");
189
+ return self;
190
+ }
191
+ /* Bitmap Protection */
192
+ if(RDATA(bitmap)->data == nullptr)
193
+ {
194
+ rb_raise(rb_eRGSSError, "Disposed Bitmap.");
195
+ return self;
196
+ }
197
+ /* Retreiving Bitmap Objecy */
198
+ CBitmap_Element* bmp;
199
+ Data_Get_Struct(bitmap, CBitmap_Element, bmp);
200
+ sf::Sprite* sp = sprite->getSprite();
201
+ sp->setTexture(*bmp->getTexture(), true);
202
+ sprite->setDrawable(true);
203
+ sprite->rBitmap = bitmap;
204
+ if (!NIL_P(sprite->rRect))
205
+ {
206
+ CRect_Element* rect;
207
+ Data_Get_Struct(sprite->rRect, CRect_Element, rect);
208
+ /* Setting rect parameter */
209
+ const sf::IntRect rectorigin = sp->getTextureRect();
210
+ rect_copy(rect->getRect(), &rectorigin);
211
+ }
212
+ return self;
213
+ }
214
+
215
+ VALUE rb_Sprite_getBitmap(VALUE self)
216
+ {
217
+ GET_SPRITE
218
+ return sprite->rBitmap;
219
+ }
220
+
221
+ VALUE rb_Sprite_setX(VALUE self, VALUE val)
222
+ {
223
+ GET_SPRITE
224
+ sf::Sprite* sp = sprite->getSprite();
225
+ const sf::Vector2f vect = sp->getPosition();
226
+ sp->setPosition(static_cast<float>(rb_num2long(val)), vect.y);
227
+ sprite->rX = val;
228
+ return val;
229
+ }
230
+
231
+ VALUE rb_Sprite_getX(VALUE self)
232
+ {
233
+ GET_SPRITE
234
+ return sprite->rX;
235
+ }
236
+
237
+ VALUE rb_Sprite_setY(VALUE self, VALUE val)
238
+ {
239
+ GET_SPRITE
240
+ sf::Sprite* sp = sprite->getSprite();
241
+ const sf::Vector2f vect = sp->getPosition();
242
+ sp->setPosition(vect.x, static_cast<float>(rb_num2long(val)));
243
+ sprite->rY = val;
244
+ return val;
245
+ }
246
+
247
+ VALUE rb_Sprite_getY(VALUE self)
248
+ {
249
+ GET_SPRITE
250
+ return sprite->rY;
251
+ }
252
+
253
+ VALUE rb_Sprite_setZ(VALUE self, VALUE val)
254
+ {
255
+ GET_SPRITE
256
+ rb_num2long(val);
257
+ sprite->rZ = val;
258
+ return val;
259
+ }
260
+
261
+ VALUE rb_Sprite_getZ(VALUE self)
262
+ {
263
+ GET_SPRITE
264
+ return sprite->rZ;
265
+ }
266
+
267
+ VALUE rb_Sprite_setOX(VALUE self, VALUE val)
268
+ {
269
+ GET_SPRITE
270
+ sf::Sprite* sp = sprite->getSprite();
271
+ const sf::Vector2f vect = sp->getOrigin();
272
+ sp->setOrigin(static_cast<float>(rb_num2long(val)), vect.y);
273
+ sprite->rOX = val;
274
+ return val;
275
+ }
276
+
277
+ VALUE rb_Sprite_getOX(VALUE self)
278
+ {
279
+ GET_SPRITE
280
+ return sprite->rOX;
281
+ }
282
+
283
+ VALUE rb_Sprite_setOY(VALUE self, VALUE val)
284
+ {
285
+ GET_SPRITE
286
+ sf::Sprite* sp = sprite->getSprite();
287
+ const sf::Vector2f vect = sp->getOrigin();
288
+ sp->setOrigin(vect.x, static_cast<float>(rb_num2long(val)));
289
+ sprite->rOY = val;
290
+ return val;
291
+ }
292
+
293
+ VALUE rb_Sprite_getOY(VALUE self)
294
+ {
295
+ GET_SPRITE
296
+ return sprite->rOY;
297
+ }
298
+
299
+ VALUE rb_Sprite_setVisible(VALUE self, VALUE val)
300
+ {
301
+ GET_SPRITE
302
+ sprite->setVisible(RTEST(val));
303
+ return val;
304
+ }
305
+
306
+ VALUE rb_Sprite_getVisible(VALUE self)
307
+ {
308
+ GET_SPRITE
309
+ return sprite->getVisible() ? Qtrue : Qfalse;
310
+ }
311
+
312
+ VALUE rb_Sprite_setAngle(VALUE self, VALUE val)
313
+ {
314
+ GET_SPRITE
315
+ sprite->getSprite()->setRotation(static_cast<float>(-NUM2DBL(val))); // RGSS rotation is trigo, SFML looks like anti-trigo
316
+ sprite->rAngle = val;
317
+ return val;
318
+ }
319
+
320
+ VALUE rb_Sprite_getAngle(VALUE self)
321
+ {
322
+ GET_SPRITE
323
+ return sprite->rAngle;
324
+ }
325
+
326
+ VALUE rb_Sprite_setZoomX(VALUE self, VALUE val)
327
+ {
328
+ GET_SPRITE
329
+ sf::Sprite* sp = sprite->getSprite();
330
+ const sf::Vector2f vect = sp->getScale();
331
+ sp->setScale(static_cast<float>(rb_num2dbl(val)), vect.y);
332
+ sprite->rZoomX = val;
333
+ return val;
334
+ }
335
+
336
+ VALUE rb_Sprite_getZoomX(VALUE self)
337
+ {
338
+ GET_SPRITE
339
+ return sprite->rZoomX;
340
+ }
341
+
342
+ VALUE rb_Sprite_setZoomY(VALUE self, VALUE val)
343
+ {
344
+ GET_SPRITE
345
+ sf::Sprite* sp = sprite->getSprite();
346
+ const sf::Vector2f vect = sp->getScale();
347
+ sp->setScale(vect.x, static_cast<float>(rb_num2dbl(val)));
348
+ sprite->rZoomY = val;
349
+ return val;
350
+ }
351
+
352
+ VALUE rb_Sprite_getZoomY(VALUE self)
353
+ {
354
+ GET_SPRITE
355
+ return sprite->rZoomY;
356
+ }
357
+
358
+
359
+ VALUE rb_Sprite_setPosition(VALUE self, VALUE x, VALUE y)
360
+ {
361
+ GET_SPRITE
362
+ sprite->getSprite()->setPosition(static_cast<float>(rb_num2long(x)), static_cast<float>(rb_num2long(y)));
363
+ sprite->rX = x;
364
+ sprite->rY = y;
365
+ return self;
366
+ }
367
+
368
+ VALUE rb_Sprite_setOrigin(VALUE self, VALUE x, VALUE y)
369
+ {
370
+ GET_SPRITE
371
+ sprite->getSprite()->setOrigin(static_cast<float>(rb_num2long(x)), static_cast<float>(rb_num2long(y)));
372
+ sprite->rOX = x;
373
+ sprite->rOY = y;
374
+ return self;
375
+ }
376
+
377
+ VALUE rb_Sprite_setZoom(VALUE self, VALUE zoom)
378
+ {
379
+ GET_SPRITE
380
+ float scale = static_cast<float>(rb_num2dbl(zoom));
381
+ sprite->getSprite()->setScale(scale, scale);
382
+ sprite->rZoomX = zoom;
383
+ sprite->rZoomY = zoom;
384
+ return zoom;
385
+ }
386
+
387
+ VALUE rb_Sprite_setOpacity(VALUE self, VALUE val)
388
+ {
389
+ GET_SPRITE
390
+ sf::Sprite* sp = sprite->getSprite();
391
+ const sf::Color col = sp->getColor();
392
+ sp->setColor(sf::Color(col.r, col.g, col.b, normalize_long(rb_num2long(val), 0, 255)));
393
+ return val;
394
+ }
395
+
396
+ VALUE rb_Sprite_getOpacity(VALUE self)
397
+ {
398
+ GET_SPRITE
399
+ sf::Sprite* sp = sprite->getSprite();
400
+ const sf::Color col = sp->getColor();
401
+ return rb_int2inum(col.a);
402
+ }
403
+
404
+ VALUE rb_Sprite_getRect(VALUE self)
405
+ {
406
+ GET_SPRITE
407
+ VALUE rc = sprite->rRect;
408
+ if(!NIL_P(rc))
409
+ return rc;
410
+ /* Creating rect */
411
+ VALUE argv[2];
412
+ argv[0] = argv[1] = LONG2FIX(0);
413
+ rc = rb_class_new_instance(2, argv, rb_cRect);
414
+ /* Fetching data */
415
+ CRect_Element* rect;
416
+ Data_Get_Struct(rc, CRect_Element, rect);
417
+ /* Setting rect parameter */
418
+ const sf::IntRect rectorigin = sprite->getSprite()->getTextureRect();
419
+ rect_copy(rect->getRect(), &rectorigin);
420
+ /* Linking Rect */
421
+ rect->setElement(sprite);
422
+ sprite->setLinkedRect(rect);
423
+ sprite->rRect = rc;
424
+ return rc;
425
+ }
426
+
427
+ VALUE rb_Sprite_setRect(VALUE self, VALUE val)
428
+ {
429
+ VALUE rc = rb_Sprite_getRect(self);
430
+ if(RDATA(rc)->data == nullptr) { return Qnil; }
431
+ if(rb_obj_is_kind_of(val, rb_cRect) != Qtrue)
432
+ {
433
+ rb_raise(rb_eTypeError, "Expected Rect got %s.", RSTRING_PTR(rb_class_name(CLASS_OF(val))));
434
+ return Qnil;
435
+ }
436
+ if(RDATA(val)->data == nullptr) { return Qnil; }
437
+ CSprite_Element* sprite;
438
+ Data_Get_Struct(self, CSprite_Element, sprite);
439
+ /* Getting data to update the rect */
440
+ CRect_Element* rect1;
441
+ Data_Get_Struct(val, CRect_Element, rect1);
442
+ CRect_Element* rect2;
443
+ Data_Get_Struct(rc, CRect_Element, rect2);
444
+ /* Copying the rect */
445
+ sf::IntRect* rect_target = rect2->getRect();
446
+ rect_copy(rect_target, rect1->getRect());
447
+ /* Mirror management */
448
+ sf::IntRect rect_setter = *rect_target;
449
+ if (RTEST(sprite->rMirror))
450
+ {
451
+ rect_setter.left += rect_setter.width;
452
+ rect_setter.width = -rect_setter.width;
453
+ }
454
+ /* Updating the texture rect */
455
+ sprite->getSprite()->setTextureRect(rect_setter);
456
+ return val;
457
+ }
458
+
459
+ VALUE rb_Sprite_getMirror(VALUE self)
460
+ {
461
+ GET_SPRITE;
462
+ return sprite->rMirror;
463
+ }
464
+
465
+ VALUE rb_Sprite_setMirror(VALUE self, VALUE val)
466
+ {
467
+ GET_SPRITE;
468
+ sprite->rMirror = RTEST(val) ? Qtrue : Qfalse;
469
+ rb_Sprite_setRect(self, rb_Sprite_getRect(self));
470
+ return self;
471
+ }
472
+
473
+ VALUE rb_Sprite_Viewport(VALUE self)
474
+ {
475
+ GET_SPRITE
476
+ return sprite->rViewport;
477
+ }
478
+
479
+ VALUE rb_Sprite_Index(VALUE self)
480
+ {
481
+ GET_SPRITE
482
+ return rb_uint2inum(sprite->getIndex());
483
+ }
484
+
485
+ VALUE rb_Sprite_width(VALUE self)
486
+ {
487
+ VALUE rc = rb_Sprite_getRect(self);
488
+ return rb_Rect_getWidth(rc);
489
+ }
490
+
491
+ VALUE rb_Sprite_height(VALUE self)
492
+ {
493
+ VALUE rc = rb_Sprite_getRect(self);
494
+ return rb_Rect_getHeight(rc);
495
+ }