ray 0.0.1 → 0.1.0.pre1

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 (188) hide show
  1. data/.gemtest +0 -0
  2. data/.yardopts +4 -0
  3. data/README.md +17 -21
  4. data/Rakefile +18 -139
  5. data/VERSION +1 -1
  6. data/ext/audio.cpp +723 -0
  7. data/ext/{color.c → color.cpp} +25 -13
  8. data/ext/drawable.cpp +91 -0
  9. data/ext/event.cpp +460 -0
  10. data/ext/extconf.rb +5 -104
  11. data/ext/font.cpp +190 -0
  12. data/ext/image.cpp +733 -0
  13. data/ext/input.cpp +74 -0
  14. data/ext/ray.cpp +168 -0
  15. data/ext/ray.hpp +356 -0
  16. data/ext/{rect.c → rect.cpp} +51 -37
  17. data/ext/shader.cpp +169 -0
  18. data/ext/shape.cpp +409 -0
  19. data/ext/sprite.cpp +306 -0
  20. data/ext/text.cpp +181 -0
  21. data/ext/vector.cpp +215 -0
  22. data/guide.md +619 -0
  23. data/lib/ray/audio.rb +0 -41
  24. data/lib/ray/color.rb +32 -10
  25. data/lib/ray/drawable.rb +16 -0
  26. data/lib/ray/dsl/event_listener.rb +25 -2
  27. data/lib/ray/dsl/event_runner.rb +33 -5
  28. data/lib/ray/dsl/event_translator.rb +66 -30
  29. data/lib/ray/dsl/handler.rb +3 -2
  30. data/lib/ray/dsl/matcher.rb +58 -14
  31. data/lib/ray/font.rb +38 -96
  32. data/lib/ray/font_set.rb +8 -8
  33. data/lib/ray/game.rb +87 -66
  34. data/lib/ray/helper.rb +105 -10
  35. data/lib/ray/image.rb +150 -24
  36. data/lib/ray/image_set.rb +3 -1
  37. data/lib/ray/input.rb +10 -0
  38. data/lib/ray/music_set.rb +5 -3
  39. data/lib/ray/ray.rb +21 -9
  40. data/lib/ray/rect.rb +48 -7
  41. data/lib/ray/rmagick.rb +41 -0
  42. data/lib/ray/scene.rb +99 -43
  43. data/lib/ray/scene_list.rb +67 -0
  44. data/lib/ray/shape.rb +132 -0
  45. data/lib/ray/sound_set.rb +4 -2
  46. data/lib/ray/sprite.rb +49 -111
  47. data/lib/ray/text.rb +101 -0
  48. data/lib/ray/text_helper.rb +37 -0
  49. data/lib/ray/turtle.rb +215 -0
  50. data/lib/ray/vector.rb +226 -0
  51. data/samples/audio/spacial.rb +44 -0
  52. data/samples/hello_world/hello.rb +9 -13
  53. data/samples/hello_world/hello_dsl.rb +8 -12
  54. data/samples/hello_world/text.rb +15 -0
  55. data/samples/opengl/binding.rb +38 -0
  56. data/samples/opengl/image.rb +32 -0
  57. data/samples/opengl/opengl.rb +34 -0
  58. data/samples/opengl/shader.rb +42 -0
  59. data/samples/pong/pong.rb +14 -10
  60. data/samples/run_scene.rb +53 -0
  61. data/samples/shaders/scene.rb +40 -0
  62. data/samples/shaders/shaders.rb +42 -0
  63. data/samples/shaders/shape.rb +34 -0
  64. data/samples/sokoban/sokoban.rb +18 -18
  65. data/samples/test/actual_scene.rb +41 -0
  66. data/samples/test/scene_riot.rb +39 -0
  67. data/samples/test/scene_spec.rb +32 -0
  68. data/samples/test/scene_test_unit.rb +25 -0
  69. data/samples/turtle/byzantium.rb +45 -0
  70. data/samples/turtle/hilbert.rb +48 -0
  71. data/samples/turtle/koch.rb +55 -0
  72. data/samples/turtle/mandala.rb +61 -0
  73. data/samples/turtle/tree.rb +57 -0
  74. data/test/audio_test.rb +69 -0
  75. data/test/color_test.rb +77 -0
  76. data/test/drawable_test.rb +19 -0
  77. data/test/dsl_test.rb +93 -0
  78. data/test/font_test.rb +57 -0
  79. data/test/helpers.rb +94 -0
  80. data/test/image_test.rb +82 -0
  81. data/test/ray_test.rb +25 -0
  82. data/test/rect_test.rb +121 -0
  83. data/{spec → test}/res/VeraMono.ttf +0 -0
  84. data/{spec → test}/res/aqua.bmp +0 -0
  85. data/{spec → test}/res/aqua.png +0 -0
  86. data/{spec → test}/res/aqua2.bmp +0 -0
  87. data/{spec → test}/res/not_a_jpeg.jpeg +0 -0
  88. data/{spec → test}/res/pop.wav +0 -0
  89. data/test/resource_set_test.rb +99 -0
  90. data/test/run_all.rb +7 -0
  91. data/test/shape_test.rb +101 -0
  92. data/test/sprite_test.rb +89 -0
  93. data/test/text_test.rb +78 -0
  94. data/test/turtle_test.rb +176 -0
  95. data/test/vector_test.rb +111 -0
  96. data/yard_ext.rb +0 -28
  97. metadata +95 -139
  98. data/.gitignore +0 -23
  99. data/.gitmodules +0 -3
  100. data/.rspec +0 -3
  101. data/ext/audio.c +0 -473
  102. data/ext/event.c +0 -557
  103. data/ext/font.c +0 -287
  104. data/ext/image.c +0 -933
  105. data/ext/joystick.c +0 -145
  106. data/ext/ray.c +0 -489
  107. data/ext/ray.h +0 -245
  108. data/ext/ray_osx.m +0 -161
  109. data/lib/ray/joystick.rb +0 -30
  110. data/psp/SDL_psp_main.c +0 -84
  111. data/psp/bigdecimal/README +0 -60
  112. data/psp/bigdecimal/bigdecimal.c +0 -4697
  113. data/psp/bigdecimal/bigdecimal.h +0 -216
  114. data/psp/bigdecimal/lib/bigdecimal/jacobian.rb +0 -85
  115. data/psp/bigdecimal/lib/bigdecimal/ludcmp.rb +0 -84
  116. data/psp/bigdecimal/lib/bigdecimal/math.rb +0 -235
  117. data/psp/bigdecimal/lib/bigdecimal/newton.rb +0 -77
  118. data/psp/bigdecimal/lib/bigdecimal/util.rb +0 -65
  119. data/psp/digest/bubblebabble/bubblebabble.c +0 -142
  120. data/psp/digest/defs.h +0 -20
  121. data/psp/digest/digest.c +0 -643
  122. data/psp/digest/digest.h +0 -32
  123. data/psp/digest/lib/digest.rb +0 -50
  124. data/psp/digest/lib/md5.rb +0 -27
  125. data/psp/digest/lib/sha1.rb +0 -27
  126. data/psp/digest/md5/md5.c +0 -420
  127. data/psp/digest/md5/md5.h +0 -80
  128. data/psp/digest/md5/md5init.c +0 -40
  129. data/psp/digest/rmd160/rmd160.c +0 -457
  130. data/psp/digest/rmd160/rmd160.h +0 -56
  131. data/psp/digest/rmd160/rmd160init.c +0 -40
  132. data/psp/digest/sha1/sha1.c +0 -269
  133. data/psp/digest/sha1/sha1.h +0 -39
  134. data/psp/digest/sha1/sha1init.c +0 -40
  135. data/psp/digest/sha2/lib/sha2.rb +0 -73
  136. data/psp/digest/sha2/sha2.c +0 -919
  137. data/psp/digest/sha2/sha2.h +0 -109
  138. data/psp/digest/sha2/sha2init.c +0 -52
  139. data/psp/enumerator/enumerator.c +0 -298
  140. data/psp/etc/etc.c +0 -559
  141. data/psp/ext.c +0 -289
  142. data/psp/fcntl/fcntl.c +0 -187
  143. data/psp/lib/rbconfig.rb +0 -178
  144. data/psp/nkf/lib/kconv.rb +0 -367
  145. data/psp/nkf/nkf-utf8/config.h +0 -88
  146. data/psp/nkf/nkf-utf8/nkf.c +0 -6040
  147. data/psp/nkf/nkf-utf8/utf8tbl.c +0 -8500
  148. data/psp/nkf/nkf-utf8/utf8tbl.h +0 -34
  149. data/psp/nkf/nkf.c +0 -654
  150. data/psp/socket/addrinfo.h +0 -173
  151. data/psp/socket/getaddrinfo.c +0 -676
  152. data/psp/socket/getnameinfo.c +0 -270
  153. data/psp/socket/pspsocket.c +0 -71
  154. data/psp/socket/pspsocket.h +0 -28
  155. data/psp/socket/socket.c +0 -4662
  156. data/psp/socket/sockport.h +0 -76
  157. data/psp/stringio/stringio.c +0 -1306
  158. data/psp/strscan/strscan.c +0 -1320
  159. data/psp/syck/bytecode.c +0 -1166
  160. data/psp/syck/emitter.c +0 -1242
  161. data/psp/syck/gram.c +0 -1894
  162. data/psp/syck/gram.h +0 -79
  163. data/psp/syck/handler.c +0 -174
  164. data/psp/syck/implicit.c +0 -2990
  165. data/psp/syck/node.c +0 -408
  166. data/psp/syck/rubyext.c +0 -2367
  167. data/psp/syck/syck.c +0 -504
  168. data/psp/syck/syck.h +0 -456
  169. data/psp/syck/token.c +0 -2725
  170. data/psp/syck/yaml2byte.c +0 -257
  171. data/psp/syck/yamlbyte.h +0 -170
  172. data/psp/thread/thread.c +0 -1175
  173. data/psp/zlib/zlib.c +0 -3547
  174. data/script.rb +0 -10
  175. data/spec/ray/audio_spec.rb +0 -146
  176. data/spec/ray/color_spec.rb +0 -57
  177. data/spec/ray/event_spec.rb +0 -80
  178. data/spec/ray/font_spec.rb +0 -93
  179. data/spec/ray/image_set_spec.rb +0 -48
  180. data/spec/ray/image_spec.rb +0 -162
  181. data/spec/ray/joystick_spec.rb +0 -21
  182. data/spec/ray/matcher_spec.rb +0 -50
  183. data/spec/ray/ray_spec.rb +0 -88
  184. data/spec/ray/rect_spec.rb +0 -154
  185. data/spec/ray/resource_set_spec.rb +0 -105
  186. data/spec/ray/sprite_spec.rb +0 -163
  187. data/spec/spec.opts +0 -4
  188. data/spec/spec_helper.rb +0 -8
@@ -0,0 +1,101 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module Ray
4
+ class Text
5
+ include Ray::TextHelper
6
+
7
+ # @param [String] content The content of the text
8
+ # @option opts :encoding ("utf-8") The encoding for the text. Unneeded in
9
+ # 1.9.
10
+ # @option opts :size (12) The character size.
11
+ # @option opts :style (Font::STYLE_NORMAL) Style of the text.
12
+ # @option opts :at ((0, 0)) Position of the text.
13
+ # @option opts :scale ((1, 1)) Scale applied to the text.
14
+ # @option opts :zoom Same as :scale
15
+ # @option opts :angle (0) Rotation applied to the text.
16
+ # @option opts :color (Ray::Color.white) The color used to draw the text
17
+ # @option opts :font [Ray::Font, String] (Ray::Font.default) Font used to
18
+ # draw the text.
19
+ def initialize(content, opts = {})
20
+ opts = {
21
+ :encoding => content.respond_to?(:encoding) ? content.encoding : "utf-8",
22
+ :size => 12,
23
+ :style => 0,
24
+ :at => [0, 0],
25
+ :angle => 0,
26
+ :color => Ray::Color.white
27
+ }.merge(opts)
28
+
29
+ @encoding = opts[:encoding].to_s
30
+
31
+ self.content = content
32
+ self.character_size = opts[:size]
33
+ self.style = opts[:style]
34
+ self.pos = opts[:at]
35
+ self.scale = opts[:scale] || opts[:zoom] || [1, 1]
36
+ self.angle = opts[:angle]
37
+ self.color = opts[:color]
38
+
39
+ if font = opts[:font]
40
+ self.font = font.is_a?(String) ? Ray::FontSet[font] : font
41
+ end
42
+ end
43
+
44
+ # Draws the text.
45
+ # @option opts [Ray::Image] :on (Ray.screen) The image to draw on.
46
+ def draw(opts = {})
47
+ draw_on(opts[:on] || Ray.screen)
48
+ end
49
+
50
+ def x; pos.x; end
51
+ def y; pos.y; end
52
+
53
+ def x=(val); self.pos = [val, y]; end
54
+ def y=(val); self.pos = [x, val]; end
55
+
56
+ def scale_x; scale.x; end
57
+ def scale_y; scale.y; end
58
+
59
+ def scale_x=(val); self.scale = [val, scale_y]; end
60
+ def scale_y=(val); self.scale = [scale_x, val]; end
61
+
62
+ alias :to_rect :rect
63
+
64
+ # @return [Ray::Vector2] The size of the text, taking the scale
65
+ # in account.
66
+ def size
67
+ rect.size
68
+ end
69
+
70
+ ## @param [Integer, Array<Symbol>] style Flags for the font style.
71
+ # Valid symbols are :normal, :italic, :bold, and :underline.
72
+ def style=(style)
73
+ basic_set_style parse_style(style)
74
+ end
75
+
76
+ # @return [String] The string used by the text, using @encoding as the
77
+ # encoding.
78
+ def content
79
+ Iconv.conv(@encoding, INTERNAL_ENCODING, basic_content)
80
+ end
81
+
82
+ # Sets the string used by the text.
83
+ # In 1.9, @encoding is changed approprietly. In 1.8, it is defaulted
84
+ # to utf-8. Change it to whatever is the right encoding.
85
+ def content=(string)
86
+ if string.respond_to? :encoding # Change encoding in 1.9
87
+ @encoding = string.encoding.to_s
88
+ end
89
+
90
+ basic_set_content internal_string(string, @encoding)
91
+ end
92
+
93
+ attr_accessor :encoding
94
+
95
+ def inspect
96
+ "text(#{content.inspect})"
97
+ end
98
+
99
+ alias :to_s :content
100
+ end
101
+ end
@@ -0,0 +1,37 @@
1
+ module Ray
2
+ module TextHelper
3
+ module_function
4
+ def parse_style(style)
5
+ case style
6
+ when Integer
7
+ style
8
+ when Array
9
+ style.inject(0) do |last, e|
10
+ last | case e
11
+ when :normal then Font::STYLE_NORMAL
12
+ when :italic then Font::STYLE_ITALIC
13
+ when :bold then Font::STYLE_BOLD
14
+ when :underline then Font::STYLE_UNDERLINE
15
+ else
16
+ raise ArgumentError, "Unknown style #{e.inspect}"
17
+ end
18
+ end
19
+ when nil
20
+ Font::STYLE_NORMAL
21
+ else
22
+ raise ArgumentError, "Can't convert #{style.class} into Integer"
23
+ end
24
+ end
25
+
26
+ def internal_string(string, enc)
27
+ # Hackish. Use to make the string null-terminated (a null character being,
28
+ # in UTF-32, 4 bytes set to 0)
29
+ null_character = "\0\0\0\0"
30
+ if null_character.respond_to? :force_encoding
31
+ null_character.force_encoding(INTERNAL_ENCODING)
32
+ end
33
+
34
+ Iconv.conv(INTERNAL_ENCODING, enc, string) + null_character
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,215 @@
1
+ module Ray
2
+ # Implementation of turtle graphics.
3
+ #
4
+ # A turtle keeps the following caracteristics:
5
+ # - An image which it is manipulating.
6
+ # - Its position (x, y), relative to the image. Set to (0, 0) by default.
7
+ # - An angle, in radians or in degrees (using degrees by default).
8
+ # Set to 0 by default, i.e. heading East.
9
+ # - Whether the turtle should draw when moved (defaults to true)
10
+ # - The color in which lines will be drawn. Defaults to white.
11
+ class Turtle
12
+ include Math
13
+
14
+ # @param [Ray::Image] img the image on which the turtle should be
15
+ # drawing on.
16
+ def initialize(img)
17
+ @img = img
18
+ @drawing = true
19
+
20
+ @x = @y = 0
21
+ @angle = 0 # in rad
22
+
23
+ @angle_unit = :deg
24
+
25
+ @pen_width = 1
26
+
27
+ @color = Ray::Color.white
28
+ end
29
+
30
+ # Stops drawing
31
+ def pen_up
32
+ @drawing = false
33
+ end
34
+
35
+ # Starts drawing
36
+ def pen_down
37
+ @drawing = true
38
+ end
39
+
40
+ # @return Whether the turtle is drawing
41
+ def drawing?
42
+ @drawing
43
+ end
44
+
45
+ alias :pen_down? :drawing?
46
+
47
+ # @return The opposite of #pen_down?
48
+ def pen_up?
49
+ !@drawing
50
+ end
51
+
52
+ # Moves the turtle in the direction it's facing.
53
+ # Draws a line if the pen is down.
54
+ #
55
+ # @param [Float] dist Length of the line
56
+ # @see #backward
57
+ def forward(dist)
58
+ x = @x + dist * cos(@angle)
59
+
60
+ # The y-axis is reversed
61
+ y = @y - dist * sin(@angle)
62
+
63
+ go_to(x, y)
64
+ end
65
+
66
+ # Same as forward(-dist)
67
+ # @see #forward
68
+ def backward(dist)
69
+ forward(-dist)
70
+ end
71
+
72
+ # Turns the turtle counter-clockwise.
73
+ # @param [Float] angle The angle, in degrees if the angle unit
74
+ # is set to degrees. In radians otherwise.
75
+ # @see #right
76
+ def left(angle)
77
+ self.angle += angle
78
+ end
79
+
80
+ # Turns the turtle clockwise.
81
+ # @param [Float] angle The angle, in degrees if the angle unit
82
+ # is set to degrees. In radians otherwise.
83
+ # @see #left
84
+ def right(angle)
85
+ self.angle -= angle
86
+ end
87
+
88
+ # Makes the turtle move to (x, y). Draws if the pen is down.
89
+ def go_to(x, y)
90
+ if pen_down?
91
+ @img.draw_line([@x, @y], [x, y], @color, @pen_width)
92
+ end
93
+
94
+ self.pos = [x, y]
95
+ end
96
+
97
+ # Makes the turtle go to the center. Draws if the pen is down.
98
+ def center
99
+ go_to(@img.w / 2, @img.h / 2)
100
+ end
101
+
102
+ # Resets the turtle's position, angle, and color but not
103
+ # the content of the image. Also sets the pen down.
104
+ # @see #clear
105
+ def reset
106
+ self.angle = 0
107
+ self.pos = [0, 0]
108
+ self.color = Ray::Color.white
109
+ self.pen_width = 1
110
+
111
+ pen_down
112
+ end
113
+
114
+ # Clears the content of the image and call reset.
115
+ # @see #reset
116
+ def clear
117
+ img.fill(Ray::Color.none)
118
+ reset
119
+ end
120
+
121
+ # Returns the distance between the turtle and a point.
122
+ # @see #dist_square
123
+ def dist(x, y)
124
+ sqrt(dist_square(x, y))
125
+ end
126
+
127
+ # Returns the square of the distance between the turtle and a point.
128
+ # Since this doesn't require to call sqrt, it is faster to use this
129
+ # when possible.
130
+ #
131
+ # @see #dist
132
+ def dist_square(x, y)
133
+ dx = (@x - x)
134
+ dy = (@y - y)
135
+ dx * dx + dy * dy
136
+ end
137
+
138
+ # The image the turtle is drawing on
139
+ attr_reader :img
140
+
141
+ # Position of the turtle
142
+ attr_accessor :x, :y
143
+ alias :set_x :x=
144
+ alias :set_y :y=
145
+
146
+ # @return [Ray::Vector2] The position of the turtle, as [x, y].
147
+ def pos
148
+ Vector2[@x, @y]
149
+ end
150
+
151
+ # Sets the position of the turtle.
152
+ # @example
153
+ # turtle.pos = [10, 20]
154
+ # turtle.pos = Ray::Vector2[10, 20]
155
+ def pos=(ary)
156
+ @x, @y = ary.to_a
157
+ end
158
+
159
+ alias :set_pos :pos=
160
+
161
+ # The unit used for angle. Either :deg (degrees) or :rad
162
+ # (radians)
163
+ attr_reader :angle_unit
164
+
165
+ # Sets the angle unit.
166
+ def angle_unit=(unit)
167
+ unless unit == :deg || unit == :rad
168
+ raise ArgumentError, "Unknown angle unit '#{unit}'"
169
+ end
170
+
171
+ @angle_unit = unit
172
+ end
173
+
174
+ # @return [Float] The angle, either in radians or in degrees,
175
+ # depending on angle_unit.
176
+ def angle
177
+ @angle_unit == :deg ? rad_to_deg(@angle) : @angle
178
+ end
179
+
180
+ # Sets the angle.
181
+ # @param [Float] val The angle, either in radians or in degrees,
182
+ # depending on angle_unit.
183
+ def angle=(val)
184
+ @angle = @angle_unit == :deg ? deg_to_rad(val) : val
185
+ end
186
+
187
+ alias :set_angle :angle=
188
+
189
+ # The color the turtle uses for drawing.
190
+ attr_accessor :color
191
+ alias :pen_color :color=
192
+
193
+ attr_accessor :pen_width
194
+
195
+ private
196
+ def deg_to_rad(deg)
197
+ (PI * deg) / 180
198
+ end
199
+
200
+ def rad_to_deg(rad)
201
+ (180 * rad) / PI
202
+ end
203
+ end
204
+
205
+ class Image
206
+ # Creates a turtle operating on the receiver.
207
+ # Instance evaluates the block it is given if any.
208
+ # @return [Ray::Turtle] The turtle it created.
209
+ def turtle(&block)
210
+ turtle = Ray::Turtle.new(self)
211
+ turtle.instance_eval(&block) if block
212
+ turtle
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,226 @@
1
+ module Ray
2
+ class Vector2
3
+ class << self
4
+ alias :[] :new
5
+ end
6
+
7
+ # @return [true, false] True if the receive is contained in the rect
8
+ def inside?(rect)
9
+ rect.to_rect.contain? self
10
+ end
11
+
12
+ # Opposite of #inside?
13
+ def outside?(rect)
14
+ !inside?(rect)
15
+ end
16
+
17
+ # @param [Ray::Vector2, #to_vector2] other
18
+ # @return [Ray::Vector2] (x + other.x, y + other.y)
19
+ def +(other)
20
+ other = other.to_vector2
21
+ Ray::Vector2[x + other.x, y + other.y]
22
+ end
23
+
24
+ # @param [Ray::Vector2, #to_vector2] other
25
+ # @return [Ray::Vector2] (x - other.x, y - other.y)
26
+ def -(other)
27
+ other = other.to_vector2
28
+ Ray::Vector2[x - other.x, y - other.y]
29
+ end
30
+
31
+ # @overload *(float)
32
+ # @param [Float] float
33
+ # @return [Ray::Vector2] (x * float, y * float)
34
+ #
35
+ # @overload *(vector)
36
+ # @param [Ray::Vector2, #to_vector2] vector
37
+ # @return [Ray::Vector2] (a.x * b.x, a.y * b.y)
38
+ def *(other)
39
+ if other.respond_to? :to_vector2
40
+ other = other.to_vector2
41
+ Ray::Vector2[x * other.x, y * other.y]
42
+ else
43
+ Ray::Vector2[x * other, y * other]
44
+ end
45
+ end
46
+
47
+ # @overload /(float)
48
+ # @param [Float] float
49
+ # @return [Ray::Vector2] (x / float, y / float)
50
+ #
51
+ # @overload /(vector)
52
+ # @param [Ray::Vector2, #to_vector2] vector
53
+ # @return [Ray::Vector2] (a.x / b.x, a.y / b.y)
54
+ def /(other)
55
+ if other.respond_to? :to_vector2
56
+ other = other.to_vector2
57
+ Ray::Vector2[x / other.x, y / other.y]
58
+ else
59
+ Ray::Vector2[x / other, y / other]
60
+ end
61
+ end
62
+
63
+
64
+ # @param [Ray::Vector2, #to_vector2]
65
+ # @return [Float] a.x * b.x + a.y * b.y
66
+ def dot(vector)
67
+ vector = vector.to_vector2
68
+ x * vector.x + y * vector.y
69
+ end
70
+
71
+ # @return [Ray::Vector2] (-x, -y)
72
+ def -@; Ray::Vector2[-x, -y] end
73
+
74
+ # @return [Ray::Vector2] (x, y)
75
+ def +@; self; end
76
+
77
+ def ==(other)
78
+ if other.is_a? Vector2
79
+ x == other.x && y == other.y
80
+ elsif other.respond_to? :to_vector2
81
+ other = other.to_vector2
82
+ x == other.x && y == other.y
83
+ else
84
+ false
85
+ end
86
+ end
87
+
88
+ def eql?(other)
89
+ self.class == other.class && self == other
90
+ end
91
+
92
+ def hash
93
+ to_a.hash
94
+ end
95
+
96
+ def to_a
97
+ [x, y]
98
+ end
99
+
100
+ def to_vector2
101
+ self
102
+ end
103
+
104
+ def to_s
105
+ "(%g, %g)" % [x, y]
106
+ end
107
+
108
+ alias :w :x
109
+ alias :h :y
110
+
111
+ alias :width :w
112
+ alias :height :h
113
+
114
+ alias :w= :x=
115
+ alias :h= :y=
116
+
117
+ alias :width= :x=
118
+ alias :height= :h=
119
+ end
120
+
121
+ class Vector3
122
+ class << self
123
+ alias :[] :new
124
+ end
125
+
126
+ # @param [Ray::Vector3, #to_vector3] other
127
+ # @return [Ray::Vector3] (x + other.x, y + other.y, z + other.z)
128
+ def +(other)
129
+ other = other.to_vector3
130
+ Ray::Vector3[x + other.x, y + other.y, z + other.z]
131
+ end
132
+
133
+ # @param [Ray::Vector3, #to_vector3] other
134
+ # @return [Ray::Vector3] (x - other.x, y - other.y, z - other.z)
135
+ def -(other)
136
+ other = other.to_vector3
137
+ Ray::Vector3[x - other.x, y - other.y, z - other.z]
138
+ end
139
+
140
+ # @overload *(float)
141
+ # @param [Float] float
142
+ # @return [Ray::Vector3] (x * float, y * float, z * float)
143
+ #
144
+ # @overload *(vector)
145
+ # @param [Ray::Vector3, #to_vector3] vector
146
+ # @return [Ray::Vector3] (a.x * b.x, a.y * b.y, a.z * b.z)
147
+ def *(other)
148
+ if other.respond_to? :to_vector3
149
+ other = other.to_vector3
150
+ Ray::Vector3[x * other.x, y * other.y, z * other.z]
151
+ else
152
+ Ray::Vector3[x * other, y * other, z * other]
153
+ end
154
+ end
155
+
156
+ # @overload /(float)
157
+ # @param [Float] float
158
+ # @return [Ray::Vector3] (x / float, y / float, z / float)
159
+ #
160
+ # @overload /(vector)
161
+ # @param [Ray::Vector3, #to_vector3] vector
162
+ # @return [Ray::Vector3] (a.x / b.x, a.y / b.y, a.z / b.z)
163
+ def /(other)
164
+ if other.respond_to? :to_vector3
165
+ other = other.to_vector3
166
+ Ray::Vector3[x / other.x, y / other.y, z / other.z]
167
+ else
168
+ Ray::Vector3[x / other, y / other, z / other]
169
+ end
170
+ end
171
+
172
+ # @param [Ray::Vector3, #to_vector3] vector
173
+ # @return [Float] Dot product (i.e. x * vector.x + y * vector.y + z * vector.z)
174
+ def dot(vector)
175
+ vector = vector.to_vector3
176
+ x * vector.x + y * vector.y + z * vector.z
177
+ end
178
+
179
+ # @return [Ray::Vector3] (-x, -y, -z)
180
+ def -@; Ray::Vector3[-x, -y, -z] end
181
+
182
+ # @return [Ray::Vector3] (x, y, y)
183
+ def +@; self; end
184
+
185
+ def ==(other)
186
+ if other.is_a? Vector3
187
+ x == other.x && y == other.y && z == other.z
188
+ elsif other.respond_to? :to_vector3
189
+ other = other.to_vector3
190
+ x == other.x && y == other.y && z == other.z
191
+ else
192
+ false
193
+ end
194
+ end
195
+
196
+ def eql?(other)
197
+ self.class == other.class && self == other
198
+ end
199
+
200
+ def hash
201
+ to_a.hash
202
+ end
203
+
204
+ def to_s
205
+ "(%g, %g, %g)" % [x, y, z]
206
+ end
207
+
208
+ def to_a
209
+ [x, y, z]
210
+ end
211
+
212
+ def to_vector3
213
+ self
214
+ end
215
+ end
216
+ end
217
+
218
+ class Array
219
+ def to_vector2
220
+ Ray::Vector2[*self]
221
+ end
222
+
223
+ def to_vector3
224
+ Ray::Vector3[*self]
225
+ end
226
+ end