mittsu 0.1.7 → 0.2.0

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -0
  3. data/circle.yml +5 -5
  4. data/lib/mittsu/core/raycaster.rb +5 -5
  5. data/lib/mittsu/materials.rb +2 -0
  6. data/lib/mittsu/materials/point_cloud_material.rb +53 -0
  7. data/lib/mittsu/materials/sprite_material.rb +53 -0
  8. data/lib/mittsu/math/euler.rb +1 -1
  9. data/lib/mittsu/math/ray.rb +0 -1
  10. data/lib/mittsu/objects.rb +2 -0
  11. data/lib/mittsu/objects/mesh.rb +54 -28
  12. data/lib/mittsu/objects/point_cloud.rb +100 -0
  13. data/lib/mittsu/objects/sprite.rb +53 -0
  14. data/lib/mittsu/renderers/glfw_window.rb +8 -0
  15. data/lib/mittsu/renderers/opengl/core/buffer_geometry.rb +11 -0
  16. data/lib/mittsu/renderers/opengl/core/geometry.rb +119 -17
  17. data/lib/mittsu/renderers/opengl/materials/point_cloud_material.rb +27 -0
  18. data/lib/mittsu/renderers/opengl/objects/line.rb +1 -1
  19. data/lib/mittsu/renderers/opengl/objects/point_cloud.rb +39 -0
  20. data/lib/mittsu/renderers/opengl/objects/sprite.rb +12 -0
  21. data/lib/mittsu/renderers/opengl/opengl_buffer.rb +4 -0
  22. data/lib/mittsu/renderers/opengl/opengl_debug.rb +6 -6
  23. data/lib/mittsu/renderers/opengl/opengl_geometry_like.rb +1 -0
  24. data/lib/mittsu/renderers/opengl/opengl_helper.rb +7 -7
  25. data/lib/mittsu/renderers/opengl/opengl_implementations.rb +5 -0
  26. data/lib/mittsu/renderers/opengl/plugins/sprite_fragment.glsl +38 -0
  27. data/lib/mittsu/renderers/opengl/plugins/sprite_plugin.rb +250 -0
  28. data/lib/mittsu/renderers/opengl/plugins/sprite_vertex.glsl +31 -0
  29. data/lib/mittsu/renderers/opengl_renderer.rb +8 -28
  30. data/lib/mittsu/renderers/shaders/shader_lib/particle_basic/particle_basic_fragment.rbsl +27 -0
  31. data/lib/mittsu/renderers/shaders/shader_lib/particle_basic/particle_basic_uniforms.rbslu +2 -0
  32. data/lib/mittsu/renderers/shaders/shader_lib/particle_basic/particle_basic_vertex.rbsl +25 -0
  33. data/lib/mittsu/version.rb +1 -1
  34. metadata +18 -3
@@ -0,0 +1,53 @@
1
+ module Mittsu
2
+ class Sprite < Object3D
3
+ attr_accessor :material, :z
4
+
5
+ INDICES = [0, 1, 2,
6
+ 0, 2, 3] # Uint16Array
7
+ VERTICES = [-0.5, -0.5, 0.0,
8
+ 0.5, -0.5, 0.0,
9
+ 0.5, 0.5, 0.0,
10
+ -0.5, 0.5, 0.0] # Float32Array
11
+ UVS = [0.0, 0.0,
12
+ 1.0, 0.0,
13
+ 1.0, 1.0,
14
+ 0.0, 1.0] # Float32Array
15
+
16
+ GEOMETRY = BufferGeometry.new
17
+ GEOMETRY[:index] = BufferAttribute.new(INDICES, 1)
18
+ GEOMETRY[:position] = BufferAttribute.new(VERTICES, 3)
19
+ GEOMETRY[:uv] = BufferAttribute.new(UVS, 2)
20
+
21
+ def initialize(material = SpriteMaterial.new)
22
+ super()
23
+
24
+ @type = 'Sprite'
25
+
26
+ @geometry = GEOMETRY
27
+ @material = material
28
+ @z = nil
29
+ end
30
+
31
+ def raycast(raycaster, intersects)
32
+ @_matrix_position ||= Vector3.new
33
+
34
+ @_matrix_position.set_from_matrix_position(@matrix_world)
35
+
36
+ distance = raycaster.ray.distance_to_pint(@_matrix_position)
37
+
38
+ return if distance > @scale.x
39
+
40
+ intersects.push({
41
+ distance: distance,
42
+ point: @position,
43
+ face: nil,
44
+ object: self
45
+ })
46
+ end
47
+
48
+ def clone(object = Sprite.new(@material))
49
+ super(object)
50
+ object
51
+ end
52
+ end
53
+ end
@@ -178,6 +178,14 @@ module Mittsu
178
178
  glfwGetJoystickName(joystick)
179
179
  end
180
180
 
181
+ def set_mouselock(value)
182
+ if value
183
+ glfwSetInputMode(@handle, GLFW_CURSOR, GLFW_CURSOR_DISABLED)
184
+ else
185
+ glfwSetInputMode(@handle, GLFW_CURSOR, GLFW_CURSOR_NORMAL)
186
+ end
187
+ end
188
+
181
189
  private
182
190
 
183
191
  def poll_all_joysticks_buttons
@@ -0,0 +1,11 @@
1
+ module Mittsu
2
+ class BufferGeometry
3
+ include OpenGLGeometryLike
4
+
5
+ attr_accessor :initted
6
+
7
+ def init
8
+ @initted = true
9
+ end
10
+ end
11
+ end
@@ -34,7 +34,7 @@ module Mittsu
34
34
  @tangents_need_update = true
35
35
  @colors_need_update = true
36
36
 
37
- add_buffers = true
37
+ add_buffers = true
38
38
  else
39
39
  add_buffers = false
40
40
  end
@@ -59,6 +59,17 @@ module Mittsu
59
59
  init_custom_attributes(object)
60
60
  end
61
61
 
62
+ def init_particle_buffers(object)
63
+ nvertices = @vertices.length
64
+
65
+ @vertex_array = Array.new(nvertices * 3, 0.0) # Float32Array
66
+ @color_array = Array.new(nvertices * 3, 0.0) # Float32Array
67
+
68
+ @particle_count = nvertices
69
+
70
+ init_custom_attributes(object)
71
+ end
72
+
62
73
  def create_line_buffers
63
74
  @vertex_array_object = glCreateVertexArray
64
75
 
@@ -69,6 +80,15 @@ module Mittsu
69
80
  @renderer.info[:memory][:geometries] += 1
70
81
  end
71
82
 
83
+ def create_particle_buffers
84
+ @vertex_array_object = glCreateVertexArray
85
+
86
+ @vertex_buffer = glCreateBuffer
87
+ @color_buffer = glCreateBuffer
88
+
89
+ @renderer.info[:memory][:geometries] += 1
90
+ end
91
+
72
92
  def set_line_buffers(hint)
73
93
  if @vertices_need_update
74
94
  @vertices.each_with_index do |vertex, v|
@@ -117,36 +137,36 @@ module Mittsu
117
137
  custom_attribute.array[ca] = value
118
138
  end
119
139
  when 2
120
- values.each_with_index do |value, ca|
121
- custom_attribute[offset ] = value.x
122
- custom_attribute[offset + 1] = value.y
140
+ values.each do |value|
141
+ custom_attribute.array[offset ] = value.x
142
+ custom_attribute.array[offset + 1] = value.y
123
143
 
124
144
  offset += 2
125
145
  end
126
146
  when 3
127
147
  if custom_attribute.type === :c
128
- values.each_with_index do |value, ca|
129
- custom_attribute[offset ] = value.r
130
- custom_attribute[offset + 1] = value.g
131
- custom_attribute[offset + 2] = value.b
148
+ values.each do |value|
149
+ custom_attribute.array[offset ] = value.r
150
+ custom_attribute.array[offset + 1] = value.g
151
+ custom_attribute.array[offset + 2] = value.b
132
152
 
133
153
  offset += 3
134
154
  end
135
155
  else
136
- values.each_with_index do |value, ca|
137
- custom_attribute[offset ] = value.x
138
- custom_attribute[offset + 1] = value.y
139
- custom_attribute[offset + 2] = value.z
156
+ values.each do |value|
157
+ custom_attribute.array[offset ] = value.x
158
+ custom_attribute.array[offset + 1] = value.y
159
+ custom_attribute.array[offset + 2] = value.z
140
160
 
141
161
  offset += 3
142
162
  end
143
163
  end
144
164
  when 4
145
- values.each_with_index do |value, ca|
146
- custom_attribute[offset ] = value.x
147
- custom_attribute[offset + 1] = value.y
148
- custom_attribute[offset + 2] = value.z
149
- custom_attribute[offset + 3] = value.w
165
+ values.each do |value|
166
+ custom_attribute.array[offset ] = value.x
167
+ custom_attribute.array[offset + 1] = value.y
168
+ custom_attribute.array[offset + 2] = value.z
169
+ custom_attribute.array[offset + 3] = value.w
150
170
 
151
171
  offset += 4
152
172
  end
@@ -160,6 +180,88 @@ module Mittsu
160
180
  end
161
181
  end
162
182
 
183
+ def set_particle_buffers(hint)
184
+ if @vertices_need_update
185
+ @vertices.each_with_index do |vertex, v|
186
+ offset = v * 3
187
+
188
+ @vertex_array[offset] = vertex.x
189
+ @vertex_array[offset + 1] = vertex.y
190
+ @vertex_array[offset + 2] = vertex.z
191
+ end
192
+
193
+
194
+ glBindBuffer(GL_ARRAY_BUFFER, @vertex_buffer)
195
+ glBufferData_easy(GL_ARRAY_BUFFER, @vertex_array, hint)
196
+ end
197
+
198
+ if @colors_need_update
199
+ @colors.each_with_index do |color, c|
200
+ offset = c * 3;
201
+
202
+ @color_array[offset] = color.r
203
+ @color_array[offset + 1] = color.g
204
+ @color_array[offset + 2] = color.b
205
+ end
206
+
207
+ glBindBuffer(GL_ARRAY_BUFFER, @color_buffer)
208
+ glBufferData_easy(GL_ARRAY_BUFFER, @color_array, hint)
209
+ end
210
+
211
+ if @custom_attribute
212
+ @custom_attributes.each do |custom_attribute|
213
+ if custom_attribute.needs_update? && (custom_attribute.bount_to.nil? || custom_attribute.bount_to == 'vertices')
214
+ offset = 0
215
+
216
+ if custom_attribute.size == 1
217
+ custom_attribute.value.each_with_index do |value, ca|
218
+ custom_attribute.array[ca] = value
219
+ end
220
+ elsif custom_attribute.size == 2
221
+ custom_attribute.value.each do |value|
222
+ custom_attribute.array[offset] = value.x
223
+ custom_attribute.array[offset + 1] = value.y
224
+
225
+ offset += 2
226
+ end
227
+ elsif custom_attribute.size == 3
228
+ if custom_attribute.type == :c
229
+ custom_attribute.value.each do |value|
230
+ custom_attribute.array[offset] = value.r
231
+ custom_attribute.array[offset + 1] = value.g
232
+ custom_attribute.array[offset + 2] = value.b
233
+
234
+ offset += 3
235
+ end
236
+ else
237
+ custom_attribute.value.each do |value|
238
+ custom_attribute.array[offset] = value.x
239
+ custom_attribute.array[offset + 1] = value.y
240
+ custom_attribute.array[offset + 2] = value.z
241
+
242
+ offset += 3
243
+ end
244
+ end
245
+ elsif custom_attribute.size == 4
246
+ custom_attribute.value.each do |value|
247
+ custom_attribute.array[offset] = value.x
248
+ custom_attribute.array[offset + 1] = value.y
249
+ custom_attribute.array[offset + 2] = value.z
250
+ custom_attribute.array[offset + 3] = value.w
251
+
252
+ offset += 3
253
+ end
254
+ end
255
+ end
256
+
257
+ glBindBuffer(GL_ARRAY_BUFFER, customAttribute.buffer)
258
+ glBufferData(GL_ARRAY_BUFFER, customAttribute.array, hint)
259
+
260
+ custom_attribute.needs_update = false
261
+ end
262
+ end
263
+ end
264
+
163
265
  private
164
266
 
165
267
  def make_groups(uses_face_material = false)
@@ -0,0 +1,27 @@
1
+ module Mittsu
2
+ class PointCloudMaterial
3
+ def refresh_uniforms(uniforms)
4
+ uniforms['psColor'].value = color
5
+ uniforms['opacity'].value = opacity
6
+ uniforms['size'].value = size
7
+ # uniforms['scale'].value = _canvas.height / 2.0 # TODO get window height?
8
+
9
+ uniforms['map'].value = map
10
+
11
+ if !map.nil?
12
+ offset = material.map.offset
13
+ repeat = material.map.repeat
14
+
15
+ uniforms['offsetRepeat'].value.set(offset.x, offset.y, repeat.x, repeat.y)
16
+ end
17
+ end
18
+
19
+ def init_shader
20
+ @shader = ShaderLib.create_shader(shader_id)
21
+ end
22
+
23
+ def shader_id
24
+ :particle_basic
25
+ end
26
+ end
27
+ end
@@ -34,7 +34,7 @@ module Mittsu
34
34
 
35
35
  geometry.vertices_need_update = true
36
36
  geometry.colors_need_update = true
37
- geometry.line_distances_need_update
37
+ geometry.line_distances_need_update = true
38
38
  end
39
39
  end
40
40
 
@@ -0,0 +1,39 @@
1
+ module Mittsu
2
+ class PointCloud
3
+ def render_buffer(camera, lights, fog, material, geometry_group, update_buffers)
4
+ glDrawArrays(GL_POINTS, 0, geometry_group.particle_count)
5
+
6
+ @renderer.info[:render][:calls] += 1
7
+ @renderer.info[:render][:points] += geometry_group.particle_count
8
+ end
9
+
10
+ def update
11
+ material = buffer_material(geometry)
12
+ custom_attributes_dirty = material.attributes && material.custom_attributes_dirty?
13
+
14
+ if geometry.vertices_need_update || geometry.colors_need_update || custom_attributes_dirty
15
+ geometry.set_particle_buffers(GL_DYNAMIC_DRAW)
16
+ end
17
+
18
+ geometry.vertices_need_update = false
19
+ geometry.colors_need_update = false
20
+
21
+ material.attributes && material.clear_custom_attributes
22
+ end
23
+
24
+ def init_geometry
25
+ geometry.renderer = @renderer
26
+ if geometry.vertex_buffer.nil?
27
+ geometry.create_particle_buffers
28
+ geometry.init_particle_buffers(self)
29
+
30
+ geometry.vertices_need_update = true
31
+ geometry.colors_need_update = true
32
+ end
33
+ end
34
+
35
+ def add_opengl_object
36
+ @renderer.add_opengl_object(geometry, self)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,12 @@
1
+ module Mittsu
2
+ class Sprite
3
+ def project(renderer)
4
+ @renderer = renderer
5
+ return unless visible
6
+ init
7
+ # TODO!!! FIXME!!!
8
+ @renderer.instance_variable_get(:@sprites) << self
9
+ project_children
10
+ end
11
+ end
12
+ end
@@ -5,5 +5,9 @@ module Mittsu
5
5
  def name
6
6
  "BUFFER(#{object.name})"
7
7
  end
8
+
9
+ def id
10
+ object.id
11
+ end
8
12
  end
9
13
  end
@@ -39,7 +39,7 @@ module OpenGLDebug
39
39
  const_set c, OpenGL.const_get(c)
40
40
  end
41
41
 
42
- def call_debug_method m, *args
42
+ def call_debug_method m, called_from = caller[0], *args
43
43
  if m.to_s.start_with?('glUniform')
44
44
  uniform_name = @@current_shader.get_uniform_name(args.first)
45
45
  call = "#{m}('#{uniform_name}',#{args[1..-1].map { |s| s.to_s[0..20] }.join(', ')})"
@@ -49,7 +49,7 @@ module OpenGLDebug
49
49
  print call
50
50
  r = OpenGLProxy.send(m, *args)
51
51
  ret = r.nil? ? '' : " => #{r}"
52
- puts "#{ret} (#{caller[0]})"
52
+ puts "#{ret} (#{called_from})"
53
53
  e = OpenGLProxy.glGetError
54
54
  raise "ERROR: #{m} => #{ERROR_STRINGS[e]}" unless e == OpenGL::GL_NO_ERROR
55
55
  r
@@ -57,12 +57,12 @@ module OpenGLDebug
57
57
 
58
58
  OpenGL.instance_methods.each do |m|
59
59
  define_method m do |*args|
60
- self.call_debug_method(m, *args)
60
+ self.call_debug_method(m, caller[0], *args)
61
61
  end
62
62
  end
63
63
 
64
64
  def glCreateProgram
65
- call_debug_method(:glCreateProgram).tap do |handle|
65
+ call_debug_method(:glCreateProgram, caller[0]).tap do |handle|
66
66
  @@shaders ||= {}
67
67
  @@shaders[handle] = DebugShader.new(handle)
68
68
  end
@@ -70,11 +70,11 @@ module OpenGLDebug
70
70
 
71
71
  def glUseProgram(handle)
72
72
  @@current_shader = @@shaders[handle]
73
- call_debug_method(:glUseProgram, handle)
73
+ call_debug_method(:glUseProgram, caller[0], handle)
74
74
  end
75
75
 
76
76
  def glGetUniformLocation(program, name)
77
- call_debug_method(:glGetUniformLocation, program, name).tap do |handle|
77
+ call_debug_method(:glGetUniformLocation, caller[0], program, name).tap do |handle|
78
78
  @@shaders[program].set_uniform(handle, name)
79
79
  end
80
80
  end
@@ -27,6 +27,7 @@ module Mittsu
27
27
  :type_array,
28
28
  :face_count,
29
29
  :line_count,
30
+ :particle_count,
30
31
  :initted_arrays,
31
32
  :custom_attributes_list,
32
33
  :num_vertices,
@@ -137,23 +137,23 @@ module Mittsu
137
137
 
138
138
  def painter_sort_stable(a, b)
139
139
  if a.object.render_order != b.object.render_order
140
- a.object.render_order - b.object.render_order
140
+ a.object.render_order <=> b.object.render_order
141
141
  elsif a.material.id != b.material.id
142
- a.material.id - b.material.id
142
+ a.material.id <=> b.material.id
143
143
  elsif a.z != b.z
144
- a.z - b.z
144
+ a.z <=> b.z
145
145
  else
146
- a.object.id - b.object.id
146
+ a.object.id <=> b.object.id
147
147
  end
148
148
  end
149
149
 
150
150
  def reverse_painter_sort_stable(a, b)
151
151
  if a.object.render_order != b.object.render_order
152
- a.object.render_order - b.object.render_order
152
+ a.object.render_order <=> b.object.render_order
153
153
  elsif a.z != b.z
154
- b.z - a.z
154
+ b.z <=> a.z
155
155
  else
156
- a.id - b.id
156
+ b.id <=> a.id
157
157
  end
158
158
  end
159
159
  end