diff --git a/i-mic-fps.rb b/i-mic-fps.rb index 3d141f6..76eb56c 100644 --- a/i-mic-fps.rb +++ b/i-mic-fps.rb @@ -1,3 +1,5 @@ +require "fiddle" + require "opengl" require "glu" require "gosu" diff --git a/lib/renderer/bounding_box_renderer.rb b/lib/renderer/bounding_box_renderer.rb index 11c70f7..4937a6f 100644 --- a/lib/renderer/bounding_box_renderer.rb +++ b/lib/renderer/bounding_box_renderer.rb @@ -219,7 +219,7 @@ class IMICFPS unless found @vertex_count -= @bounding_boxes[key][:vertices_size] - @bounding_boxes[key][:objects].each {|o| @vertex_count -= [:vertex_count]} + @bounding_boxes[key][:objects].each {|o| @vertex_count -= o[:vertices_size]} @bounding_boxes.delete(key) end end diff --git a/lib/states/game_states/game.rb b/lib/states/game_states/game.rb index 5d4b06a..2f19a50 100644 --- a/lib/states/game_states/game.rb +++ b/lib/states/game_states/game.rb @@ -108,15 +108,14 @@ eos # Expensive AABB collision detection ObjectManager.objects.each do |object| ObjectManager.objects.each do |b| - next if b == object - next if object.is_a?(Terrain) - next if b.is_a?(Terrain) + next if object == b + next if object.is_a?(Terrain) || b.is_a?(Terrain) if object.intersect(object, b) object.debug_color = Color.new(1.0,0.0,0.0) b.debug_color = Color.new(1.0,0.0,0.0) - # ObjectManager.objects.delete(object) + # ObjectManager.objects.delete(object) unless object.is_a?(Player) # puts "#{object} is intersecting #{b}" if object.is_a?(Player) else object.debug_color = Color.new(0,1,0) diff --git a/lib/states/game_states/loading_state.rb b/lib/states/game_states/loading_state.rb index 8deac7a..4180845 100644 --- a/lib/states/game_states/loading_state.rb +++ b/lib/states/game_states/loading_state.rb @@ -15,7 +15,7 @@ class IMICFPS add_asset(:obj, "objects/biped.obj") # Currently broken - # Shader.new(name: "lighting", vertex_file: "shaders/vertex/lighting.glsl", fragment_file: "shaders/fragment/lighting.glsl") + Shader.new(name: "lighting", vertex_file: "shaders/vertex/lighting.glsl", fragment_file: "shaders/fragment/lighting.glsl") @act = false @cycled = false diff --git a/lib/wavefront/model.rb b/lib/wavefront/model.rb index 246bac5..5b0861d 100644 --- a/lib/wavefront/model.rb +++ b/lib/wavefront/model.rb @@ -16,6 +16,7 @@ class IMICFPS attr_reader :normals_buffer, :uvs_buffer, :vertices_buffer attr_reader :vertices_buffer_data, :uvs_buffer_data, :normals_buffer_data + attr_reader :vertex_array_id def initialize(file_path:, game_object: nil) @game_object = game_object @@ -34,20 +35,6 @@ class IMICFPS @faces = [] @smoothing= 0 - # Allocate buffers for future use - @normals_buffer, @colors_buffer, @vertices_buffer = nil - buffer = " " * 4 - glGenBuffers(1, buffer) - @normals_buffer = buffer.unpack('L2').first - - buffer = " " * 4 - glGenBuffers(1, buffer) - @uvs_buffer = buffer.unpack('L2').first - - buffer = " " * 4 - glGenBuffers(1, buffer) - @vertices_buffer = buffer.unpack('L2').first - @bounding_box = BoundingBox.new(0,0,0, 0,0,0) start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond) @@ -55,7 +42,9 @@ class IMICFPS puts "#{@file_path.split('/').last} took #{((Process.clock_gettime(Process::CLOCK_MONOTONIC, :float_millisecond)-start_time)/1000.0).round(2)} seconds to parse" if $debug - # populate_buffers + allocate_gl_objects + populate_buffers + populate_arrays @objects.each {|o| @vertex_count+=o.vertices.size} @objects.each_with_index do |o, i| @@ -71,13 +60,35 @@ class IMICFPS end end + def allocate_gl_objects + # Allocate arrays for future use + @vertex_array_id = nil + buffer = " " * 4 + glGenVertexArrays(1, buffer) + @vertex_array_id = buffer.unpack('L2').first + + # Allocate buffers for future use + @normals_buffer, @colors_buffer, @vertices_buffer = nil + buffer = " " * 4 + glGenBuffers(1, buffer) + @normals_buffer = buffer.unpack('L2').first + + buffer = " " * 4 + glGenBuffers(1, buffer) + @uvs_buffer = buffer.unpack('L2').first + + buffer = " " * 4 + glGenBuffers(1, buffer) + @vertices_buffer = buffer.unpack('L2').first + end + def populate_buffers @vertices_buffer_data = @vertices.map {|vert| [vert.x, vert.y, vert.z]}.flatten.pack("f*") @uvs_buffer_data = @uvs.map {|uv| [uv.x, uv.y, uv.z]}.flatten.pack("f*") @normals_buffer_data = @normals.map {|norm| [norm.x, norm.y, norm.z, norm.weight]}.flatten.pack("f*") glBindBuffer(GL_ARRAY_BUFFER, @vertices_buffer) - glBufferData(GL_ARRAY_BUFFER, @vertices.size, @vertices_buffer_data, GL_STATIC_DRAW) + glBufferData(GL_ARRAY_BUFFER, Fiddle::SIZEOF_FLOAT * @vertices.size, @vertices_buffer_data, GL_STATIC_DRAW) glBindBuffer(GL_ARRAY_BUFFER, 0) glBindBuffer(GL_ARRAY_BUFFER, @uvs_buffer) @@ -89,6 +100,13 @@ class IMICFPS glBindBuffer(GL_ARRAY_BUFFER, 0) end + def populate_arrays + glBindVertexArray(@vertex_array_id) + glBindBuffer(GL_ARRAY_BUFFER, @vertices_buffer) + glBindVertexArray(0) + glBindBuffer(GL_ARRAY_BUFFER, 0) + end + def update @x, @y, @z = @game_object.x, @game_object.y, @game_object.z @scale = @game_object.scale diff --git a/shaders/vertex/lighting.glsl b/shaders/vertex/lighting.glsl index 72d9852..2af6e81 100644 --- a/shaders/vertex/lighting.glsl +++ b/shaders/vertex/lighting.glsl @@ -1,9 +1,9 @@ -# version 150 -# extension GL_ARB_explicit_attrib_location : enable +# version 330 -in vec3 vert; -uniform vec3 SunLight; +layout(location = 0) in vec3 vert; +uniform vec3 position; void main() { - gl_Position = vec4(vert, 1.0); + // projection * view * model * + gl_Position = vec4(vert+position, 1.0); } \ No newline at end of file