mittsu 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/README.md +1 -1
  4. data/lib/mittsu/cameras/orthographic_camera.rb +13 -0
  5. data/lib/mittsu/cameras/perspective_camera.rb +11 -0
  6. data/lib/mittsu/core/geometry.rb +12 -9
  7. data/lib/mittsu/core/object_3d.rb +33 -66
  8. data/lib/mittsu/lights/ambient_light.rb +8 -0
  9. data/lib/mittsu/lights/directional_light.rb +9 -0
  10. data/lib/mittsu/lights/hemisphere_light.rb +9 -0
  11. data/lib/mittsu/lights/point_light.rb +11 -0
  12. data/lib/mittsu/lights/spot_light.rb +13 -0
  13. data/lib/mittsu/loaders.rb +1 -0
  14. data/lib/mittsu/loaders/mtl_loader.rb +5 -12
  15. data/lib/mittsu/loaders/obj_loader.rb +212 -0
  16. data/lib/mittsu/loaders/obj_mtl_loader.rb +11 -207
  17. data/lib/mittsu/materials/material.rb +5 -2
  18. data/lib/mittsu/materials/mesh_basic_material.rb +0 -9
  19. data/lib/mittsu/math/color.rb +44 -104
  20. data/lib/mittsu/math/matrix3.rb +8 -1
  21. data/lib/mittsu/math/matrix4.rb +6 -0
  22. data/lib/mittsu/math/vector.rb +251 -0
  23. data/lib/mittsu/math/vector2.rb +14 -213
  24. data/lib/mittsu/math/vector3.rb +61 -351
  25. data/lib/mittsu/math/vector4.rb +45 -295
  26. data/lib/mittsu/objects/line.rb +12 -2
  27. data/lib/mittsu/objects/mesh.rb +18 -9
  28. data/lib/mittsu/renderers/glfw_window.rb +15 -13
  29. data/lib/mittsu/renderers/opengl/core/opengl_geometry.rb +253 -0
  30. data/lib/mittsu/renderers/opengl/core/opengl_object_3d.rb +131 -0
  31. data/lib/mittsu/renderers/opengl/lights/opengl_ambient_light.rb +26 -0
  32. data/lib/mittsu/renderers/opengl/lights/opengl_directional_light.rb +35 -0
  33. data/lib/mittsu/renderers/opengl/lights/opengl_hemisphere_light.rb +42 -0
  34. data/lib/mittsu/renderers/opengl/lights/opengl_light.rb +52 -0
  35. data/lib/mittsu/renderers/opengl/lights/opengl_point_light.rb +36 -0
  36. data/lib/mittsu/renderers/opengl/lights/opengl_spot_light.rb +47 -0
  37. data/lib/mittsu/renderers/opengl/materials/opengl_line_basic_material.rb +16 -0
  38. data/lib/mittsu/renderers/opengl/materials/opengl_material.rb +275 -0
  39. data/lib/mittsu/renderers/opengl/materials/opengl_mesh_basic_material.rb +69 -0
  40. data/lib/mittsu/renderers/opengl/materials/opengl_mesh_lambert_material.rb +29 -0
  41. data/lib/mittsu/renderers/opengl/materials/opengl_mesh_phong_material.rb +40 -0
  42. data/lib/mittsu/renderers/opengl/materials/opengl_shader_material.rb +11 -0
  43. data/lib/mittsu/renderers/opengl/objects/opengl_group.rb +8 -0
  44. data/lib/mittsu/renderers/opengl/objects/opengl_line.rb +54 -0
  45. data/lib/mittsu/renderers/opengl/objects/opengl_mesh.rb +77 -0
  46. data/lib/mittsu/renderers/opengl/opengl_buffer.rb +5 -0
  47. data/lib/mittsu/renderers/opengl/opengl_debug.rb +49 -7
  48. data/lib/mittsu/renderers/opengl/opengl_default_target.rb +54 -0
  49. data/lib/mittsu/renderers/opengl/opengl_geometry_group.rb +763 -0
  50. data/lib/mittsu/renderers/opengl/opengl_geometry_like.rb +130 -0
  51. data/lib/mittsu/renderers/opengl/opengl_helper.rb +161 -0
  52. data/lib/mittsu/renderers/opengl/opengl_implementations.rb +61 -0
  53. data/lib/mittsu/renderers/opengl/opengl_light_renderer.rb +43 -0
  54. data/lib/mittsu/renderers/opengl/opengl_mittsu_params.rb +53 -0
  55. data/lib/mittsu/renderers/opengl/opengl_program.rb +147 -296
  56. data/lib/mittsu/renderers/opengl/opengl_state.rb +3 -5
  57. data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +12 -10
  58. data/lib/mittsu/renderers/opengl/scenes/opengl_scene.rb +8 -0
  59. data/lib/mittsu/renderers/opengl/textures/opengl_compressed_texture.rb +21 -0
  60. data/lib/mittsu/renderers/opengl/textures/opengl_cube_texture.rb +75 -0
  61. data/lib/mittsu/renderers/opengl/textures/opengl_data_texture.rb +23 -0
  62. data/lib/mittsu/renderers/opengl/textures/opengl_texture.rb +111 -0
  63. data/lib/mittsu/renderers/opengl_render_target.rb +117 -2
  64. data/lib/mittsu/renderers/opengl_renderer.rb +653 -2978
  65. data/lib/mittsu/renderers/shaders/rbsl_loader.rb +166 -0
  66. data/lib/mittsu/renderers/shaders/shader_chunk.rb +6 -9
  67. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +36 -37
  68. data/lib/mittsu/renderers/shaders/shader_lib.rb +26 -403
  69. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_fragment.rbsl +37 -0
  70. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_uniforms.rbslu +3 -0
  71. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_vertex.rbsl +33 -0
  72. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_fragment.rbsl +12 -0
  73. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_uniforms.rbslu +2 -0
  74. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_vertex.rbsl +12 -0
  75. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_fragment.rbsl +26 -0
  76. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_uniforms.rbslu +0 -0
  77. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_vertex.rbsl +12 -0
  78. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_fragment.rbsl +56 -0
  79. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_uniforms.rbslu +7 -0
  80. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_vertex.rbsl +37 -0
  81. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_fragment.rbsl +45 -0
  82. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_uniforms.rbslu +11 -0
  83. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_vertex.rbsl +43 -0
  84. data/lib/mittsu/renderers/shaders/shader_templates/fragment.glsl.erb +105 -0
  85. data/lib/mittsu/renderers/shaders/shader_templates/vertex.glsl.erb +143 -0
  86. data/lib/mittsu/renderers/shaders/uniforms_lib.rb +54 -55
  87. data/lib/mittsu/textures/texture.rb +5 -2
  88. data/lib/mittsu/version.rb +1 -1
  89. data/run_all_examples.sh +7 -0
  90. metadata +77 -28
  91. data/.ruby-version +0 -1
  92. data/lib/mittsu/core/hash_object.rb +0 -19
@@ -1,117 +1,26 @@
1
1
  require 'mittsu/math'
2
+ require 'mittsu/math/vector'
2
3
 
3
4
  module Mittsu
4
- class Vector3
5
- attr_reader :x, :y, :z
5
+ class Vector3 < Vector
6
+ ELEMENTS = { x: 0, y: 1, z: 2 }
7
+ DIMENSIONS = ELEMENTS.count
6
8
 
7
9
  def initialize(x = 0, y = 0, z = 0)
8
- @x = x.to_f
9
- @y = y.to_f
10
- @z = z.to_f
11
- end
12
-
13
- def x=(value)
14
- @x = value.to_f
15
- end
16
-
17
- def y=(value)
18
- @y = value.to_f
19
- end
20
-
21
- def z=(value)
22
- @z = value.to_f
10
+ super [x.to_f, y.to_f, z.to_f]
23
11
  end
24
12
 
25
13
  def set(x, y, z)
26
- @x = x.to_f
27
- @y = y.to_f
28
- @z = z.to_f
29
- self
30
- end
31
-
32
- def []=(index, value)
33
- return @x = value.to_f if index == 0 || index == :x
34
- return @y = value.to_f if index == 1 || index == :y
35
- return @z = value.to_f if index == 2 || index == :z
36
- raise IndexError
37
- end
38
-
39
- def [](index)
40
- return @x if index == 0 || index == :x
41
- return @y if index == 1 || index == :y
42
- return @z if index == 2 || index == :z
43
- raise IndexError
44
- end
45
-
46
- def copy(v)
47
- @x = v.x
48
- @y = v.y
49
- @z = v.z
50
- self
51
- end
52
-
53
- def add(v)
54
- @x += v.x
55
- @y += v.y
56
- @z += v.z
57
- self
58
- end
59
-
60
- def add_scalar(s)
61
- @x += s
62
- @y += s
63
- @z += s
64
- self
14
+ super [x.to_f, y.to_f, z.to_f]
65
15
  end
66
16
 
67
- def add_vectors(a, b)
68
- @x = a.x + b.x
69
- @y = a.y + b.y
70
- @z = a.z + b.z
71
- self
72
- end
17
+ def x; @elements[0]; end
18
+ def y; @elements[1]; end
19
+ def z; @elements[2]; end
73
20
 
74
- def sub(v)
75
- @x -= v.x
76
- @y -= v.y
77
- @z -= v.z
78
- self
79
- end
80
-
81
- def sub_scalar(s)
82
- @x -= s
83
- @y -= s
84
- @z -= s
85
- self
86
- end
87
-
88
- def sub_vectors(a, b)
89
- @x = a.x - b.x
90
- @y = a.y - b.y
91
- @z = a.z - b.z
92
- self
93
- end
94
-
95
- def multiply(v)
96
- @x *= v.x
97
- @y *= v.y
98
- @z *= v.z
99
- self
100
- end
101
-
102
- def multiply_scalar(scalar)
103
- @x *= scalar
104
- @y *= scalar
105
- @z *= scalar
106
- self
107
- end
108
-
109
- def multiply_vectors(a, b)
110
- @x = a.x * b.x
111
- @y = a.y * b.y
112
- @z = a.z * b.z
113
- self
114
- end
21
+ def x=(value); @elements[0] = value.to_f; end
22
+ def y=(value); @elements[1] = value.to_f; end
23
+ def z=(value); @elements[2] = value.to_f; end
115
24
 
116
25
  def apply_euler(euler)
117
26
  quaternion = Mittsu::Quaternion.new
@@ -126,52 +35,46 @@ module Mittsu
126
35
  end
127
36
 
128
37
  def apply_matrix3(m)
129
- x = @x
130
- y = @y
131
- z = @z
38
+ _x, _y, _z = *@elements
132
39
 
133
40
  e = m.elements
134
41
 
135
- @x = e[0] * x + e[3] * y + e[6] * z
136
- @y = e[1] * x + e[4] * y + e[7] * z
137
- @z = e[2] * x + e[5] * y + e[8] * z
42
+ @elements[0] = e[0] * _x + e[3] * _y + e[6] * _z
43
+ @elements[1] = e[1] * _x + e[4] * _y + e[7] * _z
44
+ @elements[2] = e[2] * _x + e[5] * _y + e[8] * _z
138
45
 
139
46
  self
140
47
  end
141
48
 
142
49
  def apply_matrix4(m)
143
50
  # input: THREE.Matrix4 affine matrix
144
-
145
- xx, yy, zz = @x, @y, @z
51
+ _x, _y, _z = *@elements
146
52
 
147
53
  e = m.elements
148
54
 
149
- @x = e[0] * xx + e[4] * yy + e[8] * zz + e[12]
150
- @y = e[1] * xx + e[5] * yy + e[9] * zz + e[13]
151
- @z = e[2] * xx + e[6] * yy + e[10] * zz + e[14]
55
+ @elements[0] = e[0] * _x + e[4] * _y + e[8] * _z + e[12]
56
+ @elements[1] = e[1] * _x + e[5] * _y + e[9] * _z + e[13]
57
+ @elements[2] = e[2] * _x + e[6] * _y + e[10] * _z + e[14]
152
58
 
153
59
  self
154
60
  end
155
61
 
156
62
  def apply_projection(m)
157
63
  # input: THREE.Matrix4 projection matrix
158
-
159
- _x, _y, _z = @x, @y, @z
64
+ _x, _y, _z = *@elements
160
65
 
161
66
  e = m.elements
162
67
  d = 1.0 / (e[3] * _x + e[7] * _y + e[11] * _z + e[15]) # perspective divide
163
68
 
164
- @x = (e[0] * _x + e[4] * _y + e[8] * _z + e[12]) * d
165
- @y = (e[1] * _x + e[5] * _y + e[9] * _z + e[13]) * d
166
- @z = (e[2] * _x + e[6] * _y + e[10] * _z + e[14]) * d
69
+ @elements[0] = (e[0] * _x + e[4] * _y + e[8] * _z + e[12]) * d
70
+ @elements[1] = (e[1] * _x + e[5] * _y + e[9] * _z + e[13]) * d
71
+ @elements[2] = (e[2] * _x + e[6] * _y + e[10] * _z + e[14]) * d
167
72
 
168
73
  self
169
74
  end
170
75
 
171
76
  def apply_quaternion(q)
172
- x = @x
173
- y = @y
174
- z = @z
77
+ _x, _y, _z = *@elements
175
78
 
176
79
  qx = q.x
177
80
  qy = q.y
@@ -179,17 +82,15 @@ module Mittsu
179
82
  qw = q.w
180
83
 
181
84
  # calculate quat * vector
182
-
183
- ix = qw * x + qy * z - qz * y
184
- iy = qw * y + qz * x - qx * z
185
- iz = qw * z + qx * y - qy * x
186
- iw = - qx * x - qy * y - qz * z
85
+ ix = qw * _x + qy * _z - qz * _y
86
+ iy = qw * _y + qz * _x - qx * _z
87
+ iz = qw * _z + qx * _y - qy * _x
88
+ iw = -qx * _x - qy * _y - qz * _z
187
89
 
188
90
  # calculate result * inverse quat
189
-
190
- @x = ix * qw + iw * - qx + iy * - qz - iz * - qy
191
- @y = iy * qw + iw * - qy + iz * - qx - ix * - qz
192
- @z = iz * qw + iw * - qz + ix * - qy - iy * - qx
91
+ @elements[0] = ix * qw + iw * - qx + iy * - qz - iz * - qy
92
+ @elements[1] = iy * qw + iw * - qy + iz * - qx - ix * - qz
93
+ @elements[2] = iz * qw + iw * - qz + ix * - qy - iy * - qx
193
94
 
194
95
  self
195
96
  end
@@ -209,161 +110,32 @@ module Mittsu
209
110
  def transform_direction(m)
210
111
  # input: THREE.Matrix4 affine matrix
211
112
  # vector interpreted as a direction
212
-
213
- x = @x, y = @y, z = @z
113
+ _x, _y, _z = *@elements
214
114
 
215
115
  e = m.elements
216
116
 
217
- @x = e[0] * x + e[4] * y + e[8] * z
218
- @y = e[1] * x + e[5] * y + e[9] * z
219
- @z = e[2] * x + e[6] * y + e[10] * z
117
+ @elements[0] = e[0] * _x + e[4] * _y + e[8] * _z
118
+ @elements[1] = e[1] * _x + e[5] * _y + e[9] * _z
119
+ @elements[2] = e[2] * _x + e[6] * _y + e[10] * _z
220
120
 
221
121
  self.normalize
222
122
 
223
123
  self
224
124
  end
225
125
 
226
- def divide(v)
227
- @x /= v.x
228
- @y /= v.y
229
- @z /= v.z
230
- self
231
- end
232
-
233
- def divide_scalar(scalar)
234
- if scalar != 0
235
- invScalar = 1.0 / scalar
236
- @x *= invScalar
237
- @y *= invScalar
238
- @z *= invScalar
239
- else
240
- @x = 0
241
- @y = 0
242
- @z = 0
243
- end
244
- self
245
- end
246
-
247
- def min(v)
248
- if @x > v.x
249
- @x = v.x
250
- end
251
- if @y > v.y
252
- @y = v.y
253
- end
254
- if @z > v.z
255
- @z = v.z
256
- end
257
- self
258
- end
259
-
260
- def max(v)
261
- if @x < v.x
262
- @x = v.x
263
- end
264
- if @y < v.y
265
- @y = v.y
266
- end
267
- if @z < v.z
268
- @z = v.z
269
- end
270
- self
271
- end
272
-
273
- def clamp(min, max)
274
- @x = Math.clamp(@x, min.x, max.x)
275
- @y = Math.clamp(@y, min.y, max.y)
276
- @z = Math.clamp(@z, min.z, max.z)
277
- self
278
- end
279
-
280
- def clamp_scalar(min, max)
281
- @x = Math.clamp(@x, min, max)
282
- @y = Math.clamp(@y, min, max)
283
- @z = Math.clamp(@z, min, max)
284
- self
285
- end
286
-
287
- def floor
288
- @x = @x.floor.to_f
289
- @y = @y.floor.to_f
290
- @z = @z.floor.to_f
291
- self
292
- end
293
-
294
- def ceil
295
- @x = @x.ceil.to_f
296
- @y = @y.ceil.to_f
297
- @z = @z.ceil.to_f
298
- self
299
- end
300
-
301
- def round
302
- @x = @x.round.to_f
303
- @y = @y.round.to_f
304
- @z = @z.round.to_f
305
- self
306
- end
307
-
308
- def round_to_zero
309
- @x = (@x < 0) ? @x.ceil.to_f : @x.floor.to_f
310
- @y = (@y < 0) ? @y.ceil.to_f : @y.floor.to_f
311
- @z = (@z < 0) ? @z.ceil.to_f : @z.floor.to_f
312
- self
313
- end
314
-
315
- def negate
316
- @x = - @x
317
- @y = - @y
318
- @z = - @z
319
- self
320
- end
321
-
322
126
  def dot(v)
323
- @x * v.x + @y * v.y + @z * v.z
324
- end
325
-
326
- def length_sq
327
- self.dot(self)
328
- end
329
-
330
- def length
331
- Math.sqrt(length_sq)
127
+ x * v.x + y * v.y + z * v.z
332
128
  end
333
129
 
334
130
  def length_manhattan
335
- @x.abs + @y.abs + @z.abs
336
- end
337
-
338
- def normalize
339
- self.divide_scalar(self.length)
340
- end
341
-
342
- def set_length(l)
343
- old_length = self.length
344
- if old_length != 0 && l != old_length
345
- self.multiply_scalar(l / old_length)
346
- end
347
- self
348
- end
349
-
350
- def lerp(v, alpha)
351
- @x += (v.x - @x) * alpha
352
- @y += (v.y - @y) * alpha
353
- @z += (v.z - @z) * alpha
354
- self
355
- end
356
-
357
- def lerp_vectors(v1, v2, alpha)
358
- self.sub_vectors(v2, v1).multiply_scalar(alpha).add(v1)
359
- self
131
+ x.abs + y.abs + z.abs
360
132
  end
361
133
 
362
134
  def cross(v)
363
- x, y, z = @x, @y, @z
364
- @x = y * v.z - z * v.y
365
- @y = z * v.x - x * v.z
366
- @z = x * v.y - y * v.x
135
+ _x, _y, _z = *@elements
136
+ @elements[0] = _y * v.z - _z * v.y
137
+ @elements[1] = _z * v.x - _x * v.z
138
+ @elements[2] = _x * v.y - _y * v.x
367
139
  self
368
140
  end
369
141
 
@@ -371,55 +143,24 @@ module Mittsu
371
143
  ax, ay, az = a.x, a.y, a.z
372
144
  bx, by, bz = b.x, b.y, b.z
373
145
 
374
- @x = ay * bz - az * by
375
- @y = az * bx - ax * bz
376
- @z = ax * by - ay * bx
146
+ @elements[0] = ay * bz - az * by
147
+ @elements[1] = az * bx - ax * bz
148
+ @elements[2] = ax * by - ay * bx
377
149
 
378
150
  self
379
151
  end
380
152
 
381
- def project_on_vector(vector)
382
- v1 = Mittsu::Vector3.new
383
- v1.copy(vector).normalize
384
- dot = self.dot(v1)
385
- self.copy(v1).multiply_scalar(dot)
386
- end
387
-
388
- def project_on_plane(plane_normal)
389
- v1 = Mittsu::Vector3.new
390
- v1.copy(self).project_on_vector(plane_normal)
391
- self.sub(v1)
392
- end
393
-
394
- def reflect(normal)
395
- # reflect incident vector off plane orthogonal to normal
396
- # normal is assumed to have unit length
397
- v1 = Mittsu::Vector3.new
398
- self.sub(v1.copy(normal).multiply_scalar(2.0 * self.dot(normal)))
399
- end
400
-
401
- def angle_to(v)
402
- theta = self.dot(v) / (self.length * v.length)
403
-
404
- # clamp, to handle numerical problems
405
- Math.acos(Math.clamp(theta, -1.0, 1.0))
406
- end
407
-
408
- def distance_to(v)
409
- Math.sqrt(self.distance_to_squared(v))
410
- end
411
-
412
153
  def distance_to_squared(v)
413
- dx = @x - v.x
414
- dy = @y - v.y
415
- dz = @z - v.z
154
+ dx = x - v.x
155
+ dy = y - v.y
156
+ dz = z - v.z
416
157
  dx * dx + dy * dy + dz * dz
417
158
  end
418
159
 
419
160
  def set_from_matrix_position(m)
420
- @x = m.elements[12]
421
- @y = m.elements[13]
422
- @z = m.elements[14]
161
+ @elements[0] = m.elements[12]
162
+ @elements[1] = m.elements[13]
163
+ @elements[2] = m.elements[14]
423
164
  self
424
165
  end
425
166
 
@@ -428,9 +169,9 @@ module Mittsu
428
169
  sy = self.set(m.elements[4], m.elements[5], m.elements[ 6]).length
429
170
  sz = self.set(m.elements[8], m.elements[9], m.elements[10]).length
430
171
 
431
- @x = sx
432
- @y = sy
433
- @z = sz
172
+ @elements[0] = sx
173
+ @elements[1] = sy
174
+ @elements[2] = sz
434
175
 
435
176
  self
436
177
  end
@@ -440,52 +181,21 @@ module Mittsu
440
181
 
441
182
  me = matrix.elements
442
183
 
443
- @x = me[offset]
444
- @y = me[offset + 1]
445
- @z = me[offset + 2]
184
+ @elements[0] = me[offset]
185
+ @elements[1] = me[offset + 1]
186
+ @elements[2] = me[offset + 2]
446
187
 
447
188
  self
448
189
  end
449
190
 
450
- def ==(v)
451
- ((v.x == @x) && (v.y == @y) && (v.z == @z))
452
- end
453
-
454
- def fromArray(array, offset = 0)
455
- @x = array[offset]
456
- @y = array[offset + 1]
457
- @z = array[offset + 2]
458
- self
459
- end
460
-
461
- def to_array(array = [], offset = 0)
462
- array[offset] = @x
463
- array[offset + 1] = @y
464
- array[offset + 2] = @z
465
-
466
- array
467
- end
468
-
469
- def to_a
470
- self.to_array
471
- end
472
-
473
- def from_attribute(attribute, index, offse = 0)
191
+ def from_attribute(attribute, index, offset = 0)
474
192
  index = index * attribute.itemSize + offset
475
193
 
476
- @x = attribute.array[index]
477
- @y = attribute.array[index + 1]
478
- @z = attribute.array[index + 2]
194
+ @elements[0] = attribute.array[index]
195
+ @elements[1] = attribute.array[index + 1]
196
+ @elements[2] = attribute.array[index + 2]
479
197
 
480
198
  self
481
199
  end
482
-
483
- def clone
484
- Mittsu::Vector3.new(@x, @y, @z)
485
- end
486
-
487
- def to_s
488
- "[#{x}, #{y}, #{z}]"
489
- end
490
200
  end
491
201
  end