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
@@ -3,7 +3,10 @@ require 'mittsu/math'
3
3
  module Mittsu
4
4
  class Matrix3
5
5
  attr_accessor :elements
6
- def initialize
6
+
7
+ DIMENSIONS = 3
8
+
9
+ def initialize()
7
10
  @elements = [
8
11
  1.0, 0.0, 0.0,
9
12
  0.0, 1.0, 0.0,
@@ -141,6 +144,10 @@ module Mittsu
141
144
  self
142
145
  end
143
146
 
147
+ def ==(other)
148
+ other.elements == @elements
149
+ end
150
+
144
151
  def from_array(array)
145
152
  self.elements[0..array.length] = (array)
146
153
  self
@@ -4,6 +4,8 @@ module Mittsu
4
4
  class Matrix4
5
5
  attr_accessor :elements
6
6
 
7
+ DIMENSIONS = 4
8
+
7
9
  def initialize()
8
10
  @elements = [
9
11
  1.0, 0.0, 0.0, 0.0,
@@ -563,6 +565,10 @@ module Mittsu
563
565
  self
564
566
  end
565
567
 
568
+ def ==(other)
569
+ other.elements == @elements
570
+ end
571
+
566
572
  def to_a
567
573
  te = self.elements
568
574
  [
@@ -0,0 +1,251 @@
1
+ module Mittsu
2
+ class Vector
3
+ attr_accessor :elements
4
+
5
+ def initialize(elements)
6
+ @elements = elements
7
+ end
8
+
9
+ def set(elements)
10
+ @elements = elements
11
+ self
12
+ end
13
+
14
+ def each_dimension
15
+ self.class::DIMENSIONS.times do |i|
16
+ yield i
17
+ end
18
+ end
19
+
20
+ def []=(index, value)
21
+ index = self.class::ELEMENTS[index] if index.is_a?(Symbol)
22
+ raise IndexError if index.nil? || index < 0 || index >= self.class::DIMENSIONS
23
+ @elements[index] = value
24
+ end
25
+
26
+ def [](index)
27
+ index = self.class::ELEMENTS[index] if index.is_a?(Symbol)
28
+ raise IndexError if index.nil? || index < 0 || index >= self.class::DIMENSIONS
29
+ @elements[index]
30
+ end
31
+
32
+ def copy(v)
33
+ @elements = v.elements.dup
34
+ self
35
+ end
36
+
37
+ def add(v)
38
+ each_dimension do |i|
39
+ @elements[i] = @elements[i] + v.elements[i]
40
+ end
41
+ self
42
+ end
43
+
44
+ def add_scalar(s)
45
+ @elements.map!{ |e| e + s }
46
+ self
47
+ end
48
+
49
+ def add_vectors(a, b)
50
+ each_dimension do |i|
51
+ @elements[i] = a.elements[i] + b.elements[i]
52
+ end
53
+ self
54
+ end
55
+
56
+ def sub(v)
57
+ each_dimension do |i|
58
+ @elements[i] = @elements[i] - v.elements[i]
59
+ end
60
+ self
61
+ end
62
+
63
+ def sub_scalar(s)
64
+ @elements.map!{ |e| e - s }
65
+ self
66
+ end
67
+
68
+ def sub_vectors(a, b)
69
+ each_dimension do |i|
70
+ @elements[i] = a.elements[i] - b.elements[i]
71
+ end
72
+ self
73
+ end
74
+
75
+ def multiply(v)
76
+ each_dimension do |i|
77
+ @elements[i] = @elements[i] * v.elements[i]
78
+ end
79
+ self
80
+ end
81
+
82
+ def multiply_scalar(s)
83
+ @elements.map!{ |e| e * s }
84
+ self
85
+ end
86
+
87
+ def multiply_vectors(a, b)
88
+ each_dimension do |i|
89
+ @elements[i] = a.elements[i] * b.elements[i]
90
+ end
91
+ self
92
+ end
93
+
94
+ def divide(v)
95
+ each_dimension do |i|
96
+ @elements[i] = @elements[i] / v.elements[i]
97
+ end
98
+ self
99
+ end
100
+
101
+ def divide_scalar(s)
102
+ inv_scalar = s == 0 ? 0 : 1.0 / s
103
+ @elements.map!{ |e| e * inv_scalar }
104
+ self
105
+ end
106
+
107
+ def min(v)
108
+ each_dimension do |i|
109
+ @elements[i] = v.elements[i] if @elements[i] > v.elements[i]
110
+ end
111
+ self
112
+ end
113
+
114
+ def max(v)
115
+ each_dimension do |i|
116
+ @elements[i] = v.elements[i] if @elements[i] < v.elements[i]
117
+ end
118
+ self
119
+ end
120
+
121
+ def clamp(min, max)
122
+ each_dimension do |i|
123
+ @elements[i] = Math.clamp(@elements[i], min.elements[i], max.elements[i])
124
+ end
125
+ self
126
+ end
127
+
128
+ def clamp_scalar(min, max)
129
+ @elements.map!{ |e| Math.clamp(e, min, max) }
130
+ self
131
+ end
132
+
133
+ def floor
134
+ @elements.map!{ |e| e.floor.to_f }
135
+ self
136
+ end
137
+
138
+ def ceil
139
+ @elements.map!{ |e| e.ceil.to_f }
140
+ self
141
+ end
142
+
143
+ def round
144
+ @elements.map!{ |e| e.round.to_f }
145
+ self
146
+ end
147
+
148
+ def round_to_zero
149
+ @elements.map!{ |e| (e < 0) ? e.ceil.to_f : e.floor.to_f }
150
+ self
151
+ end
152
+
153
+ def negate
154
+ @elements.map!{ |e| -e }
155
+ self
156
+ end
157
+
158
+ def length_sq
159
+ self.dot(self)
160
+ end
161
+
162
+ def length
163
+ Math.sqrt(length_sq)
164
+ end
165
+
166
+ def normalize
167
+ self.divide_scalar(self.length)
168
+ end
169
+
170
+ def set_length(l)
171
+ old_length = self.length
172
+ if old_length != 0 && l != old_length
173
+ self.multiply_scalar(l / old_length)
174
+ end
175
+ self
176
+ end
177
+
178
+ def lerp(v, alpha)
179
+ each_dimension do |i|
180
+ @elements[i] += (v.elements[i] - @elements[i]) * alpha
181
+ end
182
+ self
183
+ end
184
+
185
+ def lerp_vectors(v1, v2, alpha)
186
+ self.sub_vectors(v2, v1).multiply_scalar(alpha).add(v1)
187
+ self
188
+ end
189
+
190
+ def project_on_vector(vector)
191
+ v1 = self.class.new
192
+ v1.copy(vector).normalize
193
+ dot = self.dot(v1)
194
+ self.copy(v1).multiply_scalar(dot)
195
+ end
196
+
197
+ def project_on_plane(plane_normal)
198
+ v1 = self.class.new
199
+ v1.copy(self).project_on_vector(plane_normal)
200
+ self.sub(v1)
201
+ end
202
+
203
+ def reflect(normal)
204
+ # reflect incident vector off plane orthogonal to normal
205
+ # normal is assumed to have unit length
206
+ v1 = self.class.new
207
+ self.sub(v1.copy(normal).multiply_scalar(2.0 * self.dot(normal)))
208
+ end
209
+
210
+ def angle_to(v)
211
+ theta = self.dot(v) / (self.length * v.length)
212
+
213
+ # clamp, to handle numerical problems
214
+ Math.acos(Math.clamp(theta, -1.0, 1.0))
215
+ end
216
+
217
+ def distance_to(v)
218
+ Math.sqrt(self.distance_to_squared(v))
219
+ end
220
+
221
+ def ==(v)
222
+ each_dimension do |i|
223
+ return false if @elements[i] != v.elements[i]
224
+ end
225
+ true
226
+ end
227
+
228
+ def from_array(array, offset = 0)
229
+ each_dimension do |i|
230
+ @elements[i] = array[offset + i]
231
+ end
232
+ self
233
+ end
234
+
235
+ def to_array(array = [], offset = 0)
236
+ each_dimension do |i|
237
+ array[offset + i] = @elements[i]
238
+ end
239
+ array
240
+ end
241
+ alias :to_a :to_array
242
+
243
+ def clone
244
+ self.class.new(*@elements)
245
+ end
246
+
247
+ def to_s
248
+ "[#{@elements.join(', ')}]"
249
+ end
250
+ end
251
+ end
@@ -1,238 +1,39 @@
1
1
  require 'mittsu/math'
2
+ require 'mittsu/math/vector'
2
3
 
3
4
  module Mittsu
4
- class Vector2
5
- attr_reader :x, :y
5
+ class Vector2 < Vector
6
+ ELEMENTS = { x: 0, y: 1 }
7
+ DIMENSIONS = ELEMENTS.count
6
8
 
7
9
  def initialize(x = 0, y = 0)
8
- @x = x.to_f
9
- @y = y.to_f
10
- end
11
-
12
- def x=(value)
13
- @x = value.to_f
14
- end
15
-
16
- def y=(value)
17
- @y = value.to_f
10
+ super [x.to_f, y.to_f]
18
11
  end
19
12
 
20
13
  def set(x, y)
21
- @x = x.to_f
22
- @y = y.to_f
23
- self
24
- end
25
-
26
- def []=(index, value)
27
- return @x = value.to_f if index == 0
28
- return @y = value.to_f if index == 1
29
- raise IndexError
30
- end
31
-
32
- def [](index)
33
- return @x if index == 0
34
- return @y if index == 1
35
- raise IndexError
36
- end
37
-
38
- def copy(v)
39
- @x = v.x
40
- @y = v.y
41
- self
42
- end
43
-
44
- def add(v)
45
- @x += v.x
46
- @y += v.y
47
- self
48
- end
49
-
50
- def add_scalar(s)
51
- @x += s
52
- @y += s
53
- self
54
- end
55
-
56
- def add_vectors(a, b)
57
- @x = a.x + b.x
58
- @y = a.y + b.y
59
- self
60
- end
61
-
62
- def sub(v)
63
- @x -= v.x
64
- @y -= v.y
65
- self
66
- end
67
-
68
- def sub_scalar(s)
69
- @x -= s
70
- @y -= s
71
- self
72
- end
73
-
74
- def sub_vectors(a, b)
75
- @x = a.x - b.x
76
- @y = a.y - b.y
77
- self
78
- end
79
-
80
- def multiply(v)
81
- @x *= v.x
82
- @y *= v.y
83
- self
84
- end
85
-
86
- def multiply_scalar(s)
87
- @x *= s
88
- @y *= s
89
- self
90
- end
91
-
92
- def divide(v)
93
- @x /= v.x
94
- @y /= v.y
95
- self
96
- end
97
-
98
- def divide_scalar(s)
99
- @x /= s
100
- @y /= s
101
- self
102
- end
103
-
104
- def min(v)
105
- @x = [@x, v.x].min
106
- @y = [@y, v.y].min
107
- self
108
- end
109
-
110
- def max(v)
111
- @x = [@x, v.x].max
112
- @y = [@y, v.y].max
113
- self
14
+ super [x.to_f, y.to_f]
114
15
  end
115
16
 
116
- def clamp(min, max)
117
- @x = Math.clamp(@x, min.x, max.x)
118
- @y = Math.clamp(@y, min.y, max.y)
119
- self
120
- end
121
-
122
- def clamp_scalar(min, max)
123
- min, max = min.to_f, max.to_f
124
- @x = Math.clamp(@x, min, max)
125
- @y = Math.clamp(@y, min, max)
126
- self
127
- end
128
-
129
- def floor
130
- @x = @x.floor.to_f
131
- @y = @y.floor.to_f
132
- self
133
- end
134
-
135
- def ceil
136
- @x = @x.ceil.to_f
137
- @y = @y.ceil.to_f
138
- self
139
- end
140
-
141
- def round
142
- @x = @x.round.to_f
143
- @y = @y.round.to_f
144
- self
145
- end
146
-
147
- def round_to_zero
148
- @x = ( @x < 0 ) ? @x.ceil.to_f : @x.floor.to_f
149
- @y = ( @y < 0 ) ? @y.ceil.to_f : @y.floor.to_f
150
- self
151
- end
17
+ def x; @elements[0]; end
18
+ def y; @elements[1]; end
152
19
 
153
- def negate
154
- @x = -@x
155
- @y = -@y
156
- self
157
- end
20
+ def x=(value); @elements[0] = value.to_f; end
21
+ def y=(value); @elements[1] = value.to_f; end
158
22
 
159
23
  def dot(v)
160
- @x * v.x + @y * v.y
161
- end
162
-
163
- def length
164
- Math.sqrt(length_sq)
165
- end
166
-
167
- def length_sq
168
- self.dot(self)
169
- end
170
-
171
- def normalize
172
- self.divide_scalar(self.length)
173
- end
174
-
175
- def distance_to(v)
176
- Math.sqrt(distance_to_squared(v))
24
+ x * v.x + y * v.y
177
25
  end
178
26
 
179
27
  def distance_to_squared(v)
180
- dx, dy = @x - v.x, @y - v.y
28
+ dx, dy = x - v.x, y - v.y
181
29
  dx * dx + dy * dy
182
30
  end
183
31
 
184
- def set_length(l)
185
- old_length = self.length
186
- if old_length != 0 && l != old_length
187
- self.multiply_scalar(l / old_length)
188
- end
189
- self
190
- end
191
-
192
- def lerp(v, alpha)
193
- @x += (v.x - @x) * alpha
194
- @y += (v.y - @y) * alpha
195
- self
196
- end
197
-
198
- def lerp_vectors(v1, v2, alpha)
199
- self.sub_vectors(v2, v1).multiply_scalar(alpha).add(v1);
200
- end
201
-
202
- def ==(v)
203
- v.x == @x && v.y == @y
204
- end
205
-
206
- def from_array(array, offset = 0)
207
- @x = array[offset]
208
- @y = array[offset + 1]
209
- self
210
- end
211
-
212
- def to_array(array = [], offset = 0)
213
- array.tap { |a|
214
- a[offset] = @x;
215
- a[offset + 1] = @y;
216
- }
217
- end
218
-
219
- def to_a
220
- self.to_array
221
- end
222
-
223
32
  def from_attribute(attribute, index, offset = 0)
224
33
  index = index * attribute.item_size + offset
225
- @x = attribute.array[index]
226
- @y = attribute.array[index + 1]
34
+ @elements[0] = attribute.array[index]
35
+ @elements[1] = attribute.array[index + 1]
227
36
  self
228
37
  end
229
-
230
- def clone
231
- Vector2.new(@x, @y)
232
- end
233
-
234
- def to_s
235
- "[#{x}, #{y}]"
236
- end
237
38
  end
238
39
  end