mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-16 08:02:36 +00:00
Progress towards modern gl made
This commit is contained in:
@@ -7,10 +7,10 @@ when :OPENGL_PLATFORM_MACOSX
|
|||||||
GLU.load_lib("libGLU.dylib", "/System/Library/Frameworks/OpenGL.framework/Libraries")
|
GLU.load_lib("libGLU.dylib", "/System/Library/Frameworks/OpenGL.framework/Libraries")
|
||||||
when :OPENGL_PLATFORM_LINUX
|
when :OPENGL_PLATFORM_LINUX
|
||||||
# Black magic to get GLSL 3.30 support on older Intel hardware
|
# Black magic to get GLSL 3.30 support on older Intel hardware
|
||||||
# if `glxinfo | egrep "OpenGL vendor|OpenGL renderer"`.include?("Intel")
|
if ARGV.join.include?("--mesa-override") && `glxinfo | egrep "OpenGL vendor|OpenGL renderer"`.include?("Intel")
|
||||||
# ENV["MESA_GL_VERSION_OVERRIDE"] = "3.3"
|
ENV["MESA_GL_VERSION_OVERRIDE"] = "3.3"
|
||||||
# ENV["MESA_GLSL_VERSION_OVERRIDE"] = "330"
|
ENV["MESA_GLSL_VERSION_OVERRIDE"] = "330"
|
||||||
# end
|
end
|
||||||
|
|
||||||
gl_library_path = nil
|
gl_library_path = nil
|
||||||
|
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ class IMICFPS
|
|||||||
|
|
||||||
attr_accessor :field_of_view, :mouse_sensitivity
|
attr_accessor :field_of_view, :mouse_sensitivity
|
||||||
attr_reader :entity, :position, :orientation, :mouse_captured
|
attr_reader :entity, :position, :orientation, :mouse_captured
|
||||||
def initialize(position:, orientation: Vector.new(0, 0, 0), fov: 70.0, view_distance: 155.0)
|
def initialize(position:, orientation: Vector.new(0, 0, 0), fov: 70.0, min_view_distance: 0.1, max_view_distance: 155.0)
|
||||||
@position = position
|
@position = position
|
||||||
@orientation = orientation
|
@orientation = orientation
|
||||||
@field_of_view = fov
|
@field_of_view = fov
|
||||||
@view_distance = view_distance
|
@min_view_distance = min_view_distance
|
||||||
|
@max_view_distance = max_view_distance
|
||||||
@constant_pitch = 20.0
|
@constant_pitch = 20.0
|
||||||
|
|
||||||
@entity = nil
|
@entity = nil
|
||||||
@@ -69,7 +70,7 @@ class IMICFPS
|
|||||||
glMatrixMode(GL_PROJECTION) # The projection matrix is responsible for adding perspective to our scene.
|
glMatrixMode(GL_PROJECTION) # The projection matrix is responsible for adding perspective to our scene.
|
||||||
glLoadIdentity # Resets current modelview matrix
|
glLoadIdentity # Resets current modelview matrix
|
||||||
# Calculates aspect ratio of the window. Gets perspective view. 45 is degree viewing angle, (0.1, 100) are ranges how deep can we draw into the screen
|
# Calculates aspect ratio of the window. Gets perspective view. 45 is degree viewing angle, (0.1, 100) are ranges how deep can we draw into the screen
|
||||||
gluPerspective(@field_of_view, window.width / window.height, 0.1, @view_distance)
|
gluPerspective(@field_of_view, window.width / window.height, 0.1, @max_view_distance)
|
||||||
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
|
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)
|
||||||
glRotatef(@orientation.z, 1, 0, 0)
|
glRotatef(@orientation.z, 1, 0, 0)
|
||||||
glRotatef(@orientation.y, 0, 1, 0)
|
glRotatef(@orientation.y, 0, 1, 0)
|
||||||
@@ -158,14 +159,38 @@ class IMICFPS
|
|||||||
elsif InputMapper.is?(:increase_view_distance, id)
|
elsif InputMapper.is?(:increase_view_distance, id)
|
||||||
# @field_of_view += 1
|
# @field_of_view += 1
|
||||||
# @field_of_view = @field_of_view.clamp(1, 100)
|
# @field_of_view = @field_of_view.clamp(1, 100)
|
||||||
@view_distance += 1
|
@max_view_distance += 1
|
||||||
@view_distance = @view_distance.clamp(1, 1000)
|
@max_view_distance = @max_view_distance.clamp(1, 1000)
|
||||||
elsif InputMapper.is?(:decrease_view_distance, id)
|
elsif InputMapper.is?(:decrease_view_distance, id)
|
||||||
# @field_of_view -= 1
|
# @field_of_view -= 1
|
||||||
# @field_of_view = @field_of_view.clamp(1, 100)
|
# @field_of_view = @field_of_view.clamp(1, 100)
|
||||||
@view_distance -= 1
|
@max_view_distance -= 1
|
||||||
@view_distance = @view_distance.clamp(1, 1000)
|
@max_view_distance = @max_view_distance.clamp(1, 1000)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def aspect_ratio
|
||||||
|
window.width / window.height
|
||||||
|
end
|
||||||
|
|
||||||
|
def projection_matrix
|
||||||
|
fov = 1 / Math.tan(@field_of_view / 2) # field of view
|
||||||
|
zn = @max_view_distance - @min_view_distance # near plane
|
||||||
|
zf = @max_view_distance + @min_view_distance # far plane
|
||||||
|
z_num = -(2 * @max_view_distance * @min_view_distance) / zn # something
|
||||||
|
|
||||||
|
Transform.new(
|
||||||
|
[
|
||||||
|
fov / aspect_ratio, 0, 0, 0,
|
||||||
|
0, fov, 0, 0,
|
||||||
|
0, 0, -zf / zn, z_num,
|
||||||
|
0, 0, -1, 0
|
||||||
|
]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def view_matrix
|
||||||
|
Transform.identity# Transform.rotate_3d(@orientation) * Transform.translate_3d(@position)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ class IMICFPS
|
|||||||
class Entity
|
class Entity
|
||||||
include CommonMethods
|
include CommonMethods
|
||||||
|
|
||||||
attr_accessor :scale, :visible, :renderable, :backface_culling
|
attr_accessor :visible, :renderable, :backface_culling
|
||||||
attr_accessor :position, :orientation, :velocity
|
attr_accessor :position, :orientation, :scale, :velocity
|
||||||
attr_reader :name, :debug_color, :bounding_box, :drag, :camera, :manifest
|
attr_reader :name, :debug_color, :bounding_box, :drag, :camera, :manifest
|
||||||
|
|
||||||
def initialize(manifest:, map_entity: nil, spawnpoint: nil, backface_culling: true, auto_manage: true)
|
def initialize(manifest:, map_entity: nil, spawnpoint: nil, backface_culling: true, auto_manage: true)
|
||||||
@@ -117,5 +117,9 @@ class IMICFPS
|
|||||||
def normalize_bounding_box
|
def normalize_bounding_box
|
||||||
@bound_model.model.bounding_box.normalize(self)
|
@bound_model.model.bounding_box.normalize(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def model_matrix
|
||||||
|
Transform.rotate_3d(@orientation) * Transform.translate_3d(@position)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class IMICFPS
|
|||||||
@lights = []
|
@lights = []
|
||||||
|
|
||||||
@collision_manager = CollisionManager.new(map: self)
|
@collision_manager = CollisionManager.new(map: self)
|
||||||
@renderer = Renderer.new(map: self)
|
@renderer = Renderer.new
|
||||||
Publisher.new
|
Publisher.new
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -55,12 +55,7 @@ class IMICFPS
|
|||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # clear the screen and the depth buffer
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) # clear the screen and the depth buffer
|
||||||
glError?
|
glError?
|
||||||
|
|
||||||
@lights.each(&:draw)
|
@renderer.draw(camera, @lights, @entities)
|
||||||
|
|
||||||
camera.draw
|
|
||||||
glEnable(GL_DEPTH_TEST)
|
|
||||||
|
|
||||||
@renderer.draw
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -37,9 +37,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.get(:stats)
|
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.get(:stats)
|
||||||
|
|
||||||
# allocate_gl_objects
|
allocate_gl_objects
|
||||||
# populate_vertex_buffer
|
populate_vertex_buffer
|
||||||
# configure_vao
|
configure_vao
|
||||||
|
|
||||||
@objects.each {|o| @vertex_count+=o.vertices.size}
|
@objects.each {|o| @vertex_count+=o.vertices.size}
|
||||||
@objects.each_with_index do |o, i|
|
@objects.each_with_index do |o, i|
|
||||||
|
|||||||
@@ -2,37 +2,40 @@ class IMICFPS
|
|||||||
class OpenGLRenderer
|
class OpenGLRenderer
|
||||||
include CommonMethods
|
include CommonMethods
|
||||||
|
|
||||||
def draw_object(object)
|
def draw_object(camera, lights, object)
|
||||||
handleGlError
|
|
||||||
|
|
||||||
glEnable(GL_NORMALIZE)
|
|
||||||
glPushMatrix
|
|
||||||
|
|
||||||
glTranslatef(object.position.x, object.position.y, object.position.z)
|
|
||||||
glScalef(object.scale.x, object.scale.y, object.scale.z)
|
|
||||||
glRotatef(object.orientation.x, 1.0, 0, 0)
|
|
||||||
glRotatef(object.orientation.y, 0, 1.0, 0)
|
|
||||||
glRotatef(object.orientation.z, 0, 0, 1.0)
|
|
||||||
|
|
||||||
handleGlError
|
|
||||||
|
|
||||||
if Shader.available?("ddefault")
|
if Shader.available?("ddefault")
|
||||||
Shader.use("default") do |shader|
|
Shader.use("default") do |shader|
|
||||||
glUniform3f(shader.attribute_location("worldPosition"), object.position.x, object.position.y, object.position.z)
|
shader.set_uniform("projection", camera.projection_matrix)
|
||||||
|
shader.set_uniform("view", camera.view_matrix)
|
||||||
|
shader.set_uniform("model", object.model_matrix)
|
||||||
|
|
||||||
|
# TODO: Upload and use lights
|
||||||
|
|
||||||
handleGlError
|
handleGlError
|
||||||
draw_mesh(object.model)
|
draw_model(object.model)
|
||||||
# draw_model(object.model)
|
|
||||||
object.draw
|
object.draw
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
|
handleGlError
|
||||||
|
lights.each(&:draw)
|
||||||
|
camera.draw
|
||||||
|
glEnable(GL_DEPTH_TEST)
|
||||||
|
|
||||||
|
glEnable(GL_NORMALIZE)
|
||||||
|
glPushMatrix
|
||||||
|
|
||||||
|
glTranslatef(object.position.x, object.position.y, object.position.z)
|
||||||
|
glScalef(object.scale.x, object.scale.y, object.scale.z)
|
||||||
|
glRotatef(object.orientation.x, 1.0, 0, 0)
|
||||||
|
glRotatef(object.orientation.y, 0, 1.0, 0)
|
||||||
|
glRotatef(object.orientation.z, 0, 0, 1.0)
|
||||||
|
|
||||||
handleGlError
|
handleGlError
|
||||||
draw_mesh(object.model)
|
draw_mesh(object.model)
|
||||||
object.draw
|
object.draw
|
||||||
|
glPopMatrix
|
||||||
end
|
end
|
||||||
handleGlError
|
|
||||||
|
|
||||||
glPopMatrix
|
|
||||||
handleGlError
|
handleGlError
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -4,25 +4,23 @@ class IMICFPS
|
|||||||
|
|
||||||
attr_reader :opengl_renderer, :bounding_box_renderer
|
attr_reader :opengl_renderer, :bounding_box_renderer
|
||||||
|
|
||||||
def initialize(map:)
|
def initialize
|
||||||
@map = map
|
# @bounding_box_renderer = BoundingBoxRenderer.new(map: map)
|
||||||
|
|
||||||
@bounding_box_renderer = BoundingBoxRenderer.new(map: map)
|
|
||||||
@opengl_renderer = OpenGLRenderer.new
|
@opengl_renderer = OpenGLRenderer.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def draw
|
def draw(camera, lights, entities)
|
||||||
@map.entities.each do |object|
|
entities.each do |object|
|
||||||
if object.visible && object.renderable
|
if object.visible && object.renderable
|
||||||
# Render bounding boxes before transformation is applied
|
# Render bounding boxes before transformation is applied
|
||||||
@bounding_box_renderer.create_bounding_box(object, object.model.bounding_box, object.debug_color, object.object_id) if $debug.get(:boundingboxes)
|
# @bounding_box_renderer.create_bounding_box(object, object.model.bounding_box, object.debug_color, object.object_id) if $debug.get(:boundingboxes)
|
||||||
|
|
||||||
@opengl_renderer.draw_object(object)
|
@opengl_renderer.draw_object(camera, lights, object)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@bounding_box_renderer.draw_bounding_boxes if $debug.get(:boundingboxes)
|
# @bounding_box_renderer.draw_bounding_boxes if $debug.get(:boundingboxes)
|
||||||
window.number_of_vertices+=@bounding_box_renderer.vertex_count if $debug.get(:boundingboxes)
|
# window.number_of_vertices+=@bounding_box_renderer.vertex_count if $debug.get(:boundingboxes)
|
||||||
# @bounding_box_renderer.bounding_boxes.clear
|
# @bounding_box_renderer.bounding_boxes.clear
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ class IMICFPS
|
|||||||
@dummy_entity = nil
|
@dummy_entity = nil
|
||||||
@assets = []
|
@assets = []
|
||||||
@asset_index = 0
|
@asset_index = 0
|
||||||
# add_asset(:shader, nil, "default")
|
add_asset(:shader, nil, "default")
|
||||||
|
|
||||||
add_asset(:model, @map_loader.terrain.package, @map_loader.terrain.name)
|
add_asset(:model, @map_loader.terrain.package, @map_loader.terrain.name)
|
||||||
add_asset(:model, @map_loader.skydome.package, @map_loader.skydome.name)
|
add_asset(:model, @map_loader.skydome.package, @map_loader.skydome.name)
|
||||||
@@ -55,7 +55,8 @@ class IMICFPS
|
|||||||
when :model
|
when :model
|
||||||
ModelLoader.new(manifest: hash[:manifest], entity: @dummy_entity)
|
ModelLoader.new(manifest: hash[:manifest], entity: @dummy_entity)
|
||||||
when :shader
|
when :shader
|
||||||
Shader.new(name: hash[:name], vertex: "shaders/vertex/#{hash[:name]}.glsl", fragment: "shaders/fragment/#{hash[:name]}.glsl")
|
shader = Shader.new(name: hash[:name], vertex: "shaders/vertex/#{hash[:name]}.glsl", fragment: "shaders/fragment/#{hash[:name]}.glsl")
|
||||||
|
Shader.add(hash[:name], shader) if shader.compiled?
|
||||||
else
|
else
|
||||||
warn "Unknown asset: #{hash}"
|
warn "Unknown asset: #{hash}"
|
||||||
end
|
end
|
||||||
@@ -79,9 +80,16 @@ class IMICFPS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def add_asset(type, package, name)
|
def add_asset(type, package, name)
|
||||||
manifest = Manifest.new(manifest_file: IMICFPS.assets_path + "/#{package}/#{name}/manifest.yaml")
|
case type
|
||||||
add_required_assets(manifest)
|
when :model
|
||||||
@assets << {type: type, manifest: manifest, package: package, name: name}
|
manifest = Manifest.new(manifest_file: IMICFPS.assets_path + "/#{package}/#{name}/manifest.yaml")
|
||||||
|
add_required_assets(manifest)
|
||||||
|
@assets << {type: type, manifest: manifest, package: package, name: name}
|
||||||
|
when :shader
|
||||||
|
@assets << {type: type, manifest: manifest, package: package, name: name}
|
||||||
|
else
|
||||||
|
raise TypeError "Unable to load asset of type #{type}"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_required_assets(manifest)
|
def add_required_assets(manifest)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# version 330
|
# version 330 core
|
||||||
|
|
||||||
in vec3 outColor;
|
in vec3 outColor;
|
||||||
in vec4 outNormal;
|
in vec4 outNormal;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# version 330
|
# version 330 core
|
||||||
|
|
||||||
layout(location = 0) in vec3 inPosition;
|
layout(location = 0) in vec3 inPosition;
|
||||||
layout(location = 1) in vec3 inColor;
|
layout(location = 1) in vec3 inColor;
|
||||||
@@ -11,14 +11,16 @@ out vec4 outNormal;
|
|||||||
out vec3 outUV;
|
out vec3 outUV;
|
||||||
out float outTextureID;
|
out float outTextureID;
|
||||||
|
|
||||||
uniform vec3 worldPosition;
|
uniform mat4 projection;
|
||||||
|
uniform mat4 view;
|
||||||
|
uniform mat4 model;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
// projection * view * model *
|
// projection * view * model * position
|
||||||
outColor = inColor;
|
outColor = inColor;
|
||||||
outNormal= inNormal;
|
outNormal= inNormal;
|
||||||
outUV = inUV;
|
outUV = inUV;
|
||||||
outTextureID = inTextureID;
|
outTextureID = inTextureID;
|
||||||
|
|
||||||
gl_Position = vec4(worldPosition + inPosition, 1.0);
|
gl_Position = projection * view * model * vec4(inPosition, 1.0);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user