rays 0.1.12 → 0.1.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +5 -5
  2. data/.doc/ext/rays/bitmap.cpp +22 -76
  3. data/.doc/ext/rays/bounds.cpp +95 -125
  4. data/.doc/ext/rays/camera.cpp +171 -0
  5. data/.doc/ext/rays/color.cpp +223 -45
  6. data/.doc/ext/rays/color_space.cpp +146 -46
  7. data/.doc/ext/rays/defs.cpp +183 -0
  8. data/.doc/ext/rays/font.cpp +69 -21
  9. data/.doc/ext/rays/image.cpp +26 -37
  10. data/.doc/ext/rays/matrix.cpp +186 -29
  11. data/.doc/ext/rays/native.cpp +14 -8
  12. data/.doc/ext/rays/noise.cpp +53 -0
  13. data/.doc/ext/rays/painter.cpp +187 -292
  14. data/.doc/ext/rays/point.cpp +96 -77
  15. data/.doc/ext/rays/polygon.cpp +313 -0
  16. data/.doc/ext/rays/polygon_line.cpp +96 -0
  17. data/.doc/ext/rays/polyline.cpp +167 -0
  18. data/.doc/ext/rays/rays.cpp +103 -12
  19. data/.doc/ext/rays/shader.cpp +83 -9
  20. data/LICENSE +21 -0
  21. data/README.md +1 -1
  22. data/Rakefile +24 -9
  23. data/VERSION +1 -1
  24. data/ext/rays/bitmap.cpp +23 -81
  25. data/ext/rays/bounds.cpp +100 -128
  26. data/ext/rays/camera.cpp +186 -0
  27. data/ext/rays/color.cpp +231 -51
  28. data/ext/rays/color_space.cpp +149 -47
  29. data/ext/rays/defs.cpp +183 -0
  30. data/ext/rays/defs.h +26 -2
  31. data/ext/rays/extconf.rb +2 -3
  32. data/ext/rays/font.cpp +74 -24
  33. data/ext/rays/image.cpp +28 -40
  34. data/ext/rays/matrix.cpp +198 -30
  35. data/ext/rays/native.cpp +14 -8
  36. data/ext/rays/noise.cpp +55 -0
  37. data/ext/rays/painter.cpp +203 -298
  38. data/ext/rays/point.cpp +105 -81
  39. data/ext/rays/polygon.cpp +329 -0
  40. data/ext/rays/polygon_line.cpp +99 -0
  41. data/ext/rays/polyline.cpp +176 -0
  42. data/ext/rays/rays.cpp +103 -13
  43. data/ext/rays/shader.cpp +84 -9
  44. data/include/rays.h +10 -2
  45. data/include/rays/bitmap.h +14 -26
  46. data/include/rays/bounds.h +21 -4
  47. data/include/rays/camera.h +74 -0
  48. data/include/rays/color.h +25 -14
  49. data/include/rays/color_space.h +15 -10
  50. data/include/rays/coord.h +114 -0
  51. data/include/rays/debug.h +22 -0
  52. data/include/rays/defs.h +36 -0
  53. data/include/rays/exception.h +6 -2
  54. data/include/rays/font.h +4 -4
  55. data/include/rays/image.h +12 -18
  56. data/include/rays/matrix.h +50 -24
  57. data/include/rays/noise.h +42 -0
  58. data/include/rays/opengl.h +2 -50
  59. data/include/rays/painter.h +89 -93
  60. data/include/rays/point.h +44 -51
  61. data/include/rays/polygon.h +198 -0
  62. data/include/rays/polyline.h +71 -0
  63. data/include/rays/rays.h +3 -0
  64. data/include/rays/ruby.h +7 -1
  65. data/include/rays/ruby/bounds.h +1 -1
  66. data/include/rays/ruby/camera.h +41 -0
  67. data/include/rays/ruby/color.h +1 -1
  68. data/include/rays/ruby/color_space.h +1 -1
  69. data/include/rays/ruby/font.h +1 -1
  70. data/include/rays/ruby/matrix.h +1 -1
  71. data/include/rays/ruby/point.h +1 -1
  72. data/include/rays/ruby/polygon.h +52 -0
  73. data/include/rays/ruby/polyline.h +41 -0
  74. data/include/rays/ruby/rays.h +8 -0
  75. data/include/rays/ruby/shader.h +1 -1
  76. data/include/rays/shader.h +36 -8
  77. data/lib/rays.rb +7 -2
  78. data/lib/rays/bitmap.rb +0 -15
  79. data/lib/rays/bounds.rb +17 -23
  80. data/lib/rays/camera.rb +24 -0
  81. data/lib/rays/color.rb +20 -47
  82. data/lib/rays/color_space.rb +13 -13
  83. data/lib/rays/image.rb +3 -7
  84. data/lib/rays/matrix.rb +28 -0
  85. data/lib/rays/module.rb +4 -19
  86. data/lib/rays/painter.rb +78 -93
  87. data/lib/rays/point.rb +13 -21
  88. data/lib/rays/polygon.rb +58 -0
  89. data/lib/rays/polygon_line.rb +36 -0
  90. data/lib/rays/polyline.rb +32 -0
  91. data/lib/rays/shader.rb +20 -1
  92. data/rays.gemspec +5 -7
  93. data/src/bitmap.h +36 -0
  94. data/src/bounds.cpp +74 -11
  95. data/src/color.cpp +58 -23
  96. data/src/color_space.cpp +52 -34
  97. data/src/color_space.h +22 -0
  98. data/src/coord.cpp +170 -0
  99. data/src/coord.h +35 -0
  100. data/src/font.cpp +118 -0
  101. data/src/font.h +64 -0
  102. data/src/frame_buffer.cpp +37 -71
  103. data/src/frame_buffer.h +4 -4
  104. data/src/image.cpp +172 -98
  105. data/src/image.h +25 -0
  106. data/src/ios/bitmap.h +23 -0
  107. data/src/ios/bitmap.mm +133 -110
  108. data/src/ios/camera.mm +510 -0
  109. data/src/ios/font.mm +50 -62
  110. data/src/ios/helper.h +4 -4
  111. data/src/ios/opengl.mm +19 -4
  112. data/src/ios/rays.mm +3 -0
  113. data/src/matrix.cpp +111 -26
  114. data/src/matrix.h +30 -0
  115. data/src/noise.cpp +74 -0
  116. data/src/opengl.cpp +9 -27
  117. data/src/opengl.h +37 -0
  118. data/src/osx/bitmap.h +23 -0
  119. data/src/osx/bitmap.mm +133 -110
  120. data/src/osx/camera.mm +451 -0
  121. data/src/osx/font.mm +49 -62
  122. data/src/osx/helper.h +2 -2
  123. data/src/osx/opengl.mm +19 -83
  124. data/src/osx/rays.mm +3 -0
  125. data/src/painter.cpp +845 -671
  126. data/src/painter.h +24 -0
  127. data/src/point.cpp +140 -119
  128. data/src/polygon.cpp +1266 -0
  129. data/src/polygon.h +32 -0
  130. data/src/polyline.cpp +160 -0
  131. data/src/polyline.h +69 -0
  132. data/src/render_buffer.cpp +11 -4
  133. data/src/render_buffer.h +2 -2
  134. data/src/shader.cpp +163 -106
  135. data/src/shader.h +38 -0
  136. data/src/shader_program.cpp +533 -0
  137. data/src/{program.h → shader_program.h} +28 -16
  138. data/src/shader_source.cpp +140 -0
  139. data/src/shader_source.h +52 -0
  140. data/src/texture.cpp +136 -160
  141. data/src/texture.h +65 -0
  142. data/src/win32/bitmap.cpp +62 -52
  143. data/src/win32/font.cpp +11 -13
  144. data/src/win32/font.h +24 -0
  145. data/src/win32/gdi.h +6 -6
  146. data/test/helper.rb +0 -3
  147. data/test/test_bitmap.rb +31 -7
  148. data/test/test_bounds.rb +36 -0
  149. data/test/test_color.rb +59 -19
  150. data/test/test_color_space.rb +95 -0
  151. data/test/test_font.rb +5 -0
  152. data/test/test_image.rb +24 -20
  153. data/test/test_matrix.rb +106 -0
  154. data/test/test_painter.rb +157 -51
  155. data/test/test_painter_shape.rb +102 -0
  156. data/test/test_point.rb +29 -0
  157. data/test/test_polygon.rb +234 -0
  158. data/test/test_polygon_line.rb +167 -0
  159. data/test/test_polyline.rb +171 -0
  160. data/test/test_shader.rb +9 -9
  161. metadata +102 -70
  162. data/.doc/ext/rays/texture.cpp +0 -138
  163. data/ext/rays/texture.cpp +0 -149
  164. data/include/rays/ruby/texture.h +0 -41
  165. data/include/rays/texture.h +0 -71
  166. data/lib/rays/texture.rb +0 -24
  167. data/src/program.cpp +0 -648
  168. data/test/test_texture.rb +0 -27
@@ -0,0 +1,99 @@
1
+ #include "rays/ruby/polygon.h"
2
+
3
+
4
+ #include "rays/ruby/polyline.h"
5
+ #include "defs.h"
6
+
7
+
8
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Polygon::Line)
9
+
10
+ #define THIS to<Rays::Polygon::Line*>(self)
11
+
12
+ #define CHECK RUCY_CHECK_OBJECT(Rays::Polygon::Line, self)
13
+
14
+
15
+ static
16
+ RUCY_DEF_ALLOC(alloc, klass)
17
+ {
18
+ return new_type<Rays::Polygon::Line>(klass);
19
+ }
20
+ RUCY_END
21
+
22
+ static
23
+ RUCY_DEF3(setup, points, loop, hole)
24
+ {
25
+ CHECK;
26
+
27
+ std::vector<Rays::Point> array;
28
+ get_line_args(&array, points.size(), points.as_array());
29
+ *THIS = Rays::Polygon::Line(&array[0], array.size(), loop, hole);
30
+ }
31
+ RUCY_END
32
+
33
+ static
34
+ RUCY_DEF0(hole)
35
+ {
36
+ CHECK;
37
+ return value(THIS->hole());
38
+ }
39
+ RUCY_END
40
+
41
+
42
+ static Class cPolygonLine;
43
+
44
+ void
45
+ Init_polygon_line ()
46
+ {
47
+ Module mRays = define_module("Rays");
48
+ Class cPolygon = mRays.define_class("Polygon");
49
+
50
+ cPolygonLine = cPolygon.define_class("Line", Rays::polyline_class());
51
+ cPolygonLine.define_alloc_func(alloc);
52
+ cPolygonLine.define_private_method("setup", setup);
53
+ cPolygonLine.define_method("hole?", hole);
54
+ }
55
+
56
+
57
+ namespace Rucy
58
+ {
59
+
60
+
61
+ template <> Rays::Polygon::Line
62
+ value_to<Rays::Polygon::Line> (int argc, const Value* argv, bool convert)
63
+ {
64
+ assert(argc == 0 || (argc > 0 && argv));
65
+
66
+ if (convert)
67
+ {
68
+ if (argc <= 0)
69
+ return Rays::Polygon::Line();
70
+ else if (argv->is_num() || argv->is_array())
71
+ {
72
+ std::vector<Rays::Point> points;
73
+ get_line_args(&points, argc, argv);
74
+ return Rays::Polygon::Line(&points[0], points.size());
75
+ }
76
+ }
77
+
78
+ if (argc != 1)
79
+ argument_error(__FILE__, __LINE__);
80
+
81
+ return value_to<Rays::Polygon::Line&>(*argv, convert);
82
+ }
83
+
84
+
85
+ }// Rucy
86
+
87
+
88
+ namespace Rays
89
+ {
90
+
91
+
92
+ Class
93
+ polygon_line_class ()
94
+ {
95
+ return cPolygonLine;
96
+ }
97
+
98
+
99
+ }// Rays
@@ -0,0 +1,176 @@
1
+ #include "rays/ruby/polyline.h"
2
+
3
+
4
+ #include <vector>
5
+ #include "rays/ruby/point.h"
6
+ #include "rays/ruby/bounds.h"
7
+ #include "rays/ruby/polygon.h"
8
+ #include "defs.h"
9
+
10
+
11
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Polyline)
12
+
13
+ #define THIS to<Rays::Polyline*>(self)
14
+
15
+ #define CHECK RUCY_CHECK_OBJECT(Rays::Polyline, self)
16
+
17
+
18
+ static
19
+ RUCY_DEF_ALLOC(alloc, klass)
20
+ {
21
+ return new_type<Rays::Polyline>(klass);
22
+ }
23
+ RUCY_END
24
+
25
+ static
26
+ RUCY_DEF2(setup, points, loop)
27
+ {
28
+ CHECK;
29
+
30
+ std::vector<Rays::Point> array;
31
+ get_line_args(&array, points.size(), points.as_array());
32
+ *THIS = Rays::Polyline(&array[0], array.size(), loop);
33
+ }
34
+ RUCY_END
35
+
36
+ static
37
+ RUCY_DEFN(expand)
38
+ {
39
+ CHECK;
40
+ check_arg_count(__FILE__, __LINE__, "Polyline#expand", argc, 1, 2, 3, 4);
41
+
42
+ coord width = to<coord> (argv[0]);
43
+ Rays::CapType cap = argc >= 2 ? to<Rays::CapType> (argv[1]) : Rays::CAP_DEFAULT;
44
+ Rays::JoinType join = argc >= 3 ? to<Rays::JoinType>(argv[2]) : Rays::JOIN_DEFAULT;
45
+ coord ml = argc >= 4 ? to<coord> (argv[3]) : Rays::JOIN_DEFAULT_MITER_LIMIT;
46
+
47
+ Rays::Polygon polygon;
48
+ THIS->expand(&polygon, width, cap, join, ml);
49
+ return value(polygon);
50
+ }
51
+ RUCY_END
52
+
53
+ static
54
+ RUCY_DEF0(bounds)
55
+ {
56
+ CHECK;
57
+ return value(THIS->bounds());
58
+ }
59
+ RUCY_END
60
+
61
+ static
62
+ RUCY_DEF0(loop)
63
+ {
64
+ CHECK;
65
+ return value(THIS->loop());
66
+ }
67
+ RUCY_END
68
+
69
+ static
70
+ RUCY_DEF0(size)
71
+ {
72
+ CHECK;
73
+ return value(THIS->size());
74
+ }
75
+ RUCY_END
76
+
77
+ static
78
+ RUCY_DEF0(empty)
79
+ {
80
+ CHECK;
81
+ return value(THIS->empty());
82
+ }
83
+ RUCY_END
84
+
85
+ static
86
+ RUCY_DEF1(get_at, index)
87
+ {
88
+ CHECK;
89
+
90
+ int size = (int) THIS->size();
91
+ int i = to<int>(index);
92
+ if (i < 0) i += size;
93
+
94
+ if (i < 0 || size <= i)
95
+ index_error(__FILE__, __LINE__);
96
+
97
+ return value((*THIS)[i]);
98
+ }
99
+ RUCY_END
100
+
101
+ static
102
+ RUCY_DEF0(each)
103
+ {
104
+ CHECK;
105
+
106
+ Value ret = Qnil;
107
+ for (const auto& point : *THIS)
108
+ ret = rb_yield(value(point));
109
+ return ret;
110
+ }
111
+ RUCY_END
112
+
113
+
114
+ static Class cPolyline;
115
+
116
+ void
117
+ Init_polyline ()
118
+ {
119
+ Module mRays = define_module("Rays");
120
+
121
+ cPolyline = mRays.define_class("Polyline");
122
+ cPolyline.define_alloc_func(alloc);
123
+ cPolyline.define_private_method("setup", setup);
124
+ cPolyline.define_method("expand", expand);
125
+ cPolyline.define_method("bounds", bounds);
126
+ cPolyline.define_method("loop?", loop);
127
+ cPolyline.define_method("size", size);
128
+ cPolyline.define_method("empty?", empty);
129
+ cPolyline.define_method("[]", get_at);
130
+ cPolyline.define_method("each", each);
131
+ }
132
+
133
+
134
+ namespace Rucy
135
+ {
136
+
137
+
138
+ template <> Rays::Polyline
139
+ value_to<Rays::Polyline> (int argc, const Value* argv, bool convert)
140
+ {
141
+ assert(argc == 0 || (argc > 0 && argv));
142
+
143
+ if (convert)
144
+ {
145
+ if (argc <= 0)
146
+ return Rays::Polyline();
147
+ else if (argv->is_num() || argv->is_array())
148
+ {
149
+ std::vector<Rays::Point> points;
150
+ get_line_args(&points, argc, argv);
151
+ return Rays::Polyline(&points[0], points.size());
152
+ }
153
+ }
154
+
155
+ if (argc != 1)
156
+ argument_error(__FILE__, __LINE__);
157
+
158
+ return value_to<Rays::Polyline&>(*argv, convert);
159
+ }
160
+
161
+
162
+ }// Rucy
163
+
164
+
165
+ namespace Rays
166
+ {
167
+
168
+
169
+ Class
170
+ polyline_class ()
171
+ {
172
+ return cPolyline;
173
+ }
174
+
175
+
176
+ }// Rays
@@ -1,10 +1,33 @@
1
- #include <rucy.h>
2
- #include "rays/rays.h"
3
- #include "rays/opengl.h"
1
+ #include "rays/ruby/rays.h"
2
+
3
+
4
+ #include <vector>
4
5
  #include "defs.h"
5
6
 
6
7
 
7
- using namespace Rucy;
8
+ RUCY_DEFINE_CONVERT_TO(Rays::CapType)
9
+ RUCY_DEFINE_CONVERT_TO(Rays::JoinType)
10
+
11
+
12
+ template <typename T>
13
+ struct EnumType
14
+ {
15
+ const char* name;
16
+ const char* short_name;
17
+ T type;
18
+ };
19
+
20
+ static std::vector<EnumType<Rays::CapType>> CAP_TYPES({
21
+ {"CAP_BUTT", "BUTT", Rays::CAP_BUTT},
22
+ {"CAP_ROUND", "ROUND", Rays::CAP_ROUND},
23
+ {"CAP_SQUARE", "SQUARE", Rays::CAP_SQUARE},
24
+ });
25
+
26
+ static std::vector<EnumType<Rays::JoinType>> JOIN_TYPES({
27
+ {"JOIN_MITER", "MITER", Rays::JOIN_MITER},
28
+ {"JOIN_ROUND", "ROUND", Rays::JOIN_ROUND},
29
+ {"JOIN_SQUARE", "SQUARE", Rays::JOIN_SQUARE},
30
+ });
8
31
 
9
32
 
10
33
  static
@@ -23,14 +46,6 @@ RUCY_DEF0(fin)
23
46
  }
24
47
  RUCY_END
25
48
 
26
- static
27
- RUCY_DEF0(init_offscreen_context)
28
- {
29
- Rays::init_offscreen_context();
30
- return self;
31
- }
32
- RUCY_END
33
-
34
49
 
35
50
  static Module mRays;
36
51
 
@@ -38,12 +53,87 @@ void
38
53
  Init_rays ()
39
54
  {
40
55
  mRays = define_module("Rays");
56
+
41
57
  mRays.define_singleton_method("init!", init);
42
58
  mRays.define_singleton_method("fin!", fin);
43
- mRays.define_singleton_method("init_offscreen_context", init_offscreen_context);
59
+
60
+ for (auto it = CAP_TYPES.begin(); it != CAP_TYPES.end(); ++it)
61
+ mRays.define_const(it->name, it->type);
62
+
63
+ for (auto it = JOIN_TYPES.begin(); it != JOIN_TYPES.end(); ++it)
64
+ mRays.define_const(it->name, it->type);
44
65
  }
45
66
 
46
67
 
68
+ namespace Rucy
69
+ {
70
+
71
+
72
+ template <> Rays::CapType
73
+ value_to<Rays::CapType> (int argc, const Value* argv, bool convert)
74
+ {
75
+ assert(argc > 0 && argv);
76
+
77
+ if (convert)
78
+ {
79
+ if (argv->is_s() || argv->is_sym())
80
+ {
81
+ const char* str = argv->c_str();
82
+ for (auto it = CAP_TYPES.begin(); it != CAP_TYPES.end(); ++it)
83
+ {
84
+ if (
85
+ strcasecmp(str, it->name) == 0 ||
86
+ strcasecmp(str, it->short_name) == 0)
87
+ {
88
+ return it->type;
89
+ }
90
+ }
91
+ argument_error(__FILE__, __LINE__, "invalid cap type -- %s", str);
92
+ }
93
+ }
94
+
95
+ int type = value_to<int>(*argv, convert);
96
+ if (type < 0 || Rays::CAP_MAX <= type)
97
+ argument_error(__FILE__, __LINE__, "invalid cap type -- %d", type);
98
+
99
+ return (Rays::CapType) type;
100
+ }
101
+
102
+
103
+ template <> Rays::JoinType
104
+ value_to<Rays::JoinType> (int argc, const Value* argv, bool convert)
105
+ {
106
+ assert(argc > 0 && argv);
107
+
108
+ if (convert)
109
+ {
110
+ if (argv->is_s() || argv->is_sym())
111
+ {
112
+ const char* str = argv->c_str();
113
+ for (auto it = JOIN_TYPES.begin(); it != JOIN_TYPES.end(); ++it)
114
+ {
115
+ if (
116
+ strcasecmp(str, it->name) == 0 ||
117
+ strcasecmp(str, it->short_name) == 0)
118
+ {
119
+ return it->type;
120
+ }
121
+ }
122
+ argument_error(__FILE__, __LINE__, "invalid join type -- %s", str);
123
+ }
124
+ }
125
+
126
+ int type = value_to<int>(*argv, convert);
127
+ if (type < 0 || Rays::JOIN_MAX <= type)
128
+ argument_error(__FILE__, __LINE__, "invalid join type -- %d", type);
129
+
130
+ return (Rays::JoinType) type;
131
+ }
132
+
133
+
134
+ }// Rucy
135
+
136
+
47
137
  namespace Rays
48
138
  {
49
139
 
@@ -1,14 +1,10 @@
1
1
  #include "rays/ruby/shader.h"
2
2
 
3
3
 
4
- #include <rucy.h>
5
4
  #include "defs.h"
6
5
 
7
6
 
8
- using namespace Rucy;
9
-
10
-
11
- RUCY_DEFINE_VALUE_FROM_TO(Rays::Shader)
7
+ RUCY_DEFINE_VALUE_OR_ARRAY_FROM_TO(Rays::Shader)
12
8
 
13
9
  #define THIS to<Rays::Shader*>(self)
14
10
 
@@ -23,14 +19,61 @@ RUCY_DEF_ALLOC(alloc, klass)
23
19
  RUCY_END
24
20
 
25
21
  static
26
- RUCY_DEF1(initialize, source)
22
+ RUCY_DEF1(setup, source)
27
23
  {
28
24
  RUCY_CHECK_OBJ(Rays::Shader, self);
29
25
 
30
- if (!source.is_s())
26
+ *THIS = to<Rays::Shader>(source);
27
+ }
28
+ RUCY_END
29
+
30
+ static
31
+ RUCY_DEFN(set_uniform)
32
+ {
33
+ CHECK;
34
+ check_arg_count(__FILE__, __LINE__, "Painter#set_uniform", argc, 2, 3, 4, 5);
35
+
36
+ #define Ai(n) (argv[n].as_i())
37
+ #define Af(n) ((float) argv[n].as_f())
38
+
39
+ const char* name = argv[0].c_str();
40
+ if (argv[1].is_array())
41
+ {
42
+ argc = argv[1].size();
43
+ argv = argv[1].as_array();
44
+ }
45
+ else
46
+ {
47
+ argc -= 1;
48
+ argv += 1;
49
+ }
50
+
51
+ if (argv[0].is_i())
52
+ {
53
+ switch (argc)
54
+ {
55
+ case 1: THIS->set_uniform(name, Ai(0)); break;
56
+ case 2: THIS->set_uniform(name, Ai(0), Ai(1)); break;
57
+ case 3: THIS->set_uniform(name, Ai(0), Ai(1), Ai(2)); break;
58
+ case 4: THIS->set_uniform(name, Ai(0), Ai(1), Ai(2), Ai(3)); break;
59
+ }
60
+ }
61
+ else if (argv[0].is_f())
62
+ {
63
+ switch (argc)
64
+ {
65
+ case 1: THIS->set_uniform(name, Af(0)); break;
66
+ case 2: THIS->set_uniform(name, Af(0), Af(1)); break;
67
+ case 3: THIS->set_uniform(name, Af(0), Af(1), Af(2)); break;
68
+ case 4: THIS->set_uniform(name, Af(0), Af(1), Af(2), Af(3)); break;
69
+ }
70
+ }
71
+ else
31
72
  argument_error(__FILE__, __LINE__);
32
73
 
33
- *THIS = Rays::Shader(source.c_str());
74
+ #undef Ai
75
+ #undef Af
76
+
34
77
  return self;
35
78
  }
36
79
  RUCY_END
@@ -45,10 +88,42 @@ Init_shader ()
45
88
 
46
89
  cShader = mRays.define_class("Shader");
47
90
  cShader.define_alloc_func(alloc);
48
- cShader.define_private_method("initialize", initialize);
91
+ cShader.define_private_method("setup", setup);
92
+ cShader.define_private_method("set_uniform", set_uniform);
49
93
  }
50
94
 
51
95
 
96
+ namespace Rucy
97
+ {
98
+
99
+
100
+ template <> Rays::Shader
101
+ value_to<Rays::Shader> (int argc, const Value* argv, bool convert)
102
+ {
103
+ if (argc == 1 && argv->is_array())
104
+ {
105
+ argc = argv->size();
106
+ argv = argv->as_array();
107
+ }
108
+
109
+ assert(argc > 0 && argv);
110
+
111
+ if (convert)
112
+ {
113
+ if (argv->is_s())
114
+ return Rays::Shader(argv[0].c_str());
115
+ }
116
+
117
+ if (argc != 1)
118
+ argument_error(__FILE__, __LINE__);
119
+
120
+ return value_to<Rays::Shader&>(*argv, convert);
121
+ }
122
+
123
+
124
+ }// Rucy
125
+
126
+
52
127
  namespace Rays
53
128
  {
54
129