mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-15 23:52:35 +00:00
Fixed bounding box rendering! fixed AABB collision detection (was a bit weird), misc. tweaks and fixes.
This commit is contained in:
@@ -3,9 +3,10 @@ class IMICFPS
|
||||
include OpenGL
|
||||
include GLU
|
||||
|
||||
attr_reader :bounding_boxes
|
||||
attr_reader :bounding_boxes, :vertex_count
|
||||
def initialize
|
||||
@bounding_boxes = {normals: [], colors: [], vertices: []}
|
||||
@bounding_boxes = {}
|
||||
@vertex_count = 0
|
||||
end
|
||||
|
||||
def handleGlError
|
||||
@@ -16,15 +17,25 @@ class IMICFPS
|
||||
end
|
||||
end
|
||||
|
||||
def create_bounding_box(object, box, color = nil)
|
||||
def create_bounding_box(object, box, color = nil, mesh_object_id)
|
||||
color ||= object.debug_color
|
||||
|
||||
if @bounding_boxes[mesh_object_id]
|
||||
if @bounding_boxes[mesh_object_id][:color] != color
|
||||
update_mesh_colors(mesh_object_id, color)
|
||||
return
|
||||
else
|
||||
return
|
||||
end
|
||||
end
|
||||
@bounding_boxes[mesh_object_id] = {}
|
||||
@bounding_boxes[mesh_object_id] = {object: object, box: box, color: color}
|
||||
|
||||
box = object.normalize_bounding_box(box)
|
||||
|
||||
@bounding_boxes[:normals] ||= []
|
||||
@bounding_boxes[:colors] ||= []
|
||||
@bounding_boxes[:vertices] ||= []
|
||||
update_mesh_colors(mesh_object_id, color)
|
||||
|
||||
@bounding_boxes[:normals] << [
|
||||
normals = [
|
||||
0,1,0,
|
||||
0,1,0,
|
||||
0,1,0,
|
||||
@@ -68,45 +79,7 @@ class IMICFPS
|
||||
-1,0,0,
|
||||
-1,0,0
|
||||
]
|
||||
@bounding_boxes[:colors] << [
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue
|
||||
]
|
||||
@bounding_boxes[:vertices] << [
|
||||
vertices = [
|
||||
box.min_x, box.max_y, box.max_z,
|
||||
box.min_x, box.max_y, box.min_z,
|
||||
box.max_x, box.max_y, box.min_z,
|
||||
@@ -155,25 +128,83 @@ class IMICFPS
|
||||
box.min_x, box.max_y, box.min_z,
|
||||
box.max_x, box.max_y, box.min_z
|
||||
]
|
||||
|
||||
@vertex_count+=vertices.size
|
||||
|
||||
@bounding_boxes[mesh_object_id][:vertices_size] = vertices.size
|
||||
@bounding_boxes[mesh_object_id][:vertices] = vertices.pack("f*")
|
||||
@bounding_boxes[mesh_object_id][:normals] = normals.pack("f*")
|
||||
end
|
||||
|
||||
def update_mesh_colors(mesh_object_id, color)
|
||||
@bounding_boxes[mesh_object_id][:colors] = [
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue,
|
||||
color.red, color.green, color.blue
|
||||
].pack("f*")
|
||||
|
||||
@bounding_boxes[mesh_object_id][:color] = color
|
||||
end
|
||||
|
||||
def draw_bounding_boxes
|
||||
@bounding_boxes.each do |key, bounding_box|
|
||||
glPushMatrix
|
||||
|
||||
glTranslatef(bounding_box[:object].x, bounding_box[:object].y, bounding_box[:object].z)
|
||||
draw_bounding_box(bounding_box)
|
||||
|
||||
glPopMatrix
|
||||
|
||||
found = ObjectManager.objects.detect { |o| o == bounding_box[:object] }
|
||||
@bounding_boxes.delete(key) unless found
|
||||
end
|
||||
end
|
||||
|
||||
def draw_bounding_box(bounding_box)
|
||||
glEnableClientState(GL_VERTEX_ARRAY)
|
||||
glEnableClientState(GL_COLOR_ARRAY)
|
||||
glEnableClientState(GL_NORMAL_ARRAY)
|
||||
|
||||
_normals = @bounding_boxes[:normals].flatten.pack("f*")
|
||||
_colors = @bounding_boxes[:colors].flatten.pack("f*")
|
||||
_vertices_size = @bounding_boxes[:vertices].size
|
||||
_vertices = @bounding_boxes[:vertices].flatten.pack("f*")
|
||||
|
||||
glVertexPointer(3, GL_FLOAT, 0, _vertices)
|
||||
glColorPointer(3, GL_FLOAT, 0, _colors)
|
||||
glNormalPointer(GL_FLOAT, 0, _normals)
|
||||
glVertexPointer(3, GL_FLOAT, 0, bounding_box[:vertices])
|
||||
glColorPointer(3, GL_FLOAT, 0, bounding_box[:colors])
|
||||
glNormalPointer(GL_FLOAT, 0, bounding_box[:normals])
|
||||
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
|
||||
glDisable(GL_LIGHTING)
|
||||
glDrawArrays(GL_TRIANGLES, 0, _vertices_size/3)
|
||||
glDrawArrays(GL_TRIANGLES, 0, bounding_box[:vertices_size]/3)
|
||||
glEnable(GL_LIGHTING)
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
|
||||
|
||||
@@ -182,4 +213,4 @@ class IMICFPS
|
||||
glDisableClientState(GL_NORMAL_ARRAY)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,9 +19,6 @@ class IMICFPS
|
||||
|
||||
glEnable(GL_NORMALIZE)
|
||||
glPushMatrix
|
||||
# Render bounding boxes before transformation is applied
|
||||
create_bounding_box(object, object.model.bounding_box) if $debug
|
||||
object.model.objects.each {|o| create_bounding_box(object, o.bounding_box, o.debug_color)} if $debug
|
||||
|
||||
glTranslatef(object.x, object.y, object.z)
|
||||
glRotatef(object.x_rotation,1.0, 0, 0)
|
||||
@@ -59,9 +56,7 @@ class IMICFPS
|
||||
glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
|
||||
glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size/4)
|
||||
|
||||
if $debug
|
||||
if $debug # This is kinda expensive
|
||||
glDisable(GL_LIGHTING)
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
|
||||
glPolygonOffset(2, 0.5)
|
||||
@@ -71,6 +66,9 @@ class IMICFPS
|
||||
glPolygonOffset(0, 0)
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
|
||||
glEnable(GL_LIGHTING)
|
||||
glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size/4)
|
||||
else
|
||||
glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size/4)
|
||||
end
|
||||
|
||||
glDisableClientState(GL_VERTEX_ARRAY)
|
||||
|
||||
@@ -11,16 +11,20 @@ class IMICFPS
|
||||
end
|
||||
|
||||
def draw
|
||||
@bounding_box_renderer.draw_bounding_boxes if $debug
|
||||
$window.number_of_faces+=@bounding_box_renderer.bounding_boxes[:vertices].size/3 if $debug
|
||||
@bounding_box_renderer.bounding_boxes.clear
|
||||
|
||||
|
||||
ObjectManager.objects.each do |object|
|
||||
if object.visible && object.renderable
|
||||
# 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
|
||||
object.model.objects.each {|o| @bounding_box_renderer.create_bounding_box(object, o.bounding_box, o.debug_color, o.object_id)} if $debug
|
||||
|
||||
@opengl_renderer.draw_object(object)
|
||||
end
|
||||
end
|
||||
|
||||
@bounding_box_renderer.draw_bounding_boxes if $debug
|
||||
$window.number_of_faces+=$window.number_of_faces if $debug
|
||||
$window.number_of_faces+=@bounding_box_renderer.vertex_count/3 if $debug
|
||||
# @bounding_box_renderer.bounding_boxes.clear
|
||||
end
|
||||
|
||||
def handleGlError
|
||||
@@ -34,4 +38,4 @@ class IMICFPS
|
||||
def finalize # cleanup
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user