LiteRGSS 0.1.3

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 (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
+ }