mittsu 0.1.1 → 0.1.2

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