mirror of
https://github.com/cyberarm/i-mic-fps.git
synced 2025-12-16 08:02:36 +00:00
Bounding Box rendering for Mesh objects is now fixed: used to be the objects were all drawn on the original Mesh instead of its copies.
This commit is contained in:
@@ -18,24 +18,55 @@ class IMICFPS
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_bounding_box(object, box, color = nil, mesh_object_id)
|
def create_bounding_box(object, box, color = nil, mesh_object_id)
|
||||||
|
|
||||||
color ||= object.debug_color
|
color ||= object.debug_color
|
||||||
|
|
||||||
if @bounding_boxes[mesh_object_id]
|
if @bounding_boxes[mesh_object_id]
|
||||||
if @bounding_boxes[mesh_object_id][:color] != color
|
if @bounding_boxes[mesh_object_id][:color] != color
|
||||||
update_mesh_colors(mesh_object_id, color)
|
@bounding_boxes[mesh_object_id][:colors] = mesh_colors(color).pack("f*")
|
||||||
|
@bounding_boxes[mesh_object_id][:color] = color
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@bounding_boxes[mesh_object_id] = {}
|
@bounding_boxes[mesh_object_id] = {}
|
||||||
@bounding_boxes[mesh_object_id] = {object: object, box: box, color: color}
|
@bounding_boxes[mesh_object_id] = {object: object, box: box, color: color, objects: []}
|
||||||
|
|
||||||
box = object.normalize_bounding_box(box)
|
box = object.normalize_bounding_box(box)
|
||||||
|
|
||||||
update_mesh_colors(mesh_object_id, color)
|
normals = mesh_normals
|
||||||
|
colors = mesh_colors(color)
|
||||||
|
vertices = mesh_vertices(box)
|
||||||
|
|
||||||
normals = [
|
@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*")
|
||||||
|
@bounding_boxes[mesh_object_id][:colors] = colors.pack("f*")
|
||||||
|
|
||||||
|
object.model.objects.each do |mesh|
|
||||||
|
data = {}
|
||||||
|
box = object.normalize_bounding_box(mesh.bounding_box)
|
||||||
|
|
||||||
|
normals = mesh_normals
|
||||||
|
colors = mesh_colors(mesh.debug_color)
|
||||||
|
vertices = mesh_vertices(box)
|
||||||
|
|
||||||
|
@vertex_count+=vertices.size
|
||||||
|
|
||||||
|
data[:vertices_size] = vertices.size
|
||||||
|
data[:vertices] = vertices.pack("f*")
|
||||||
|
data[:normals] = normals.pack("f*")
|
||||||
|
data[:colors] = colors.pack("f*")
|
||||||
|
|
||||||
|
@bounding_boxes[mesh_object_id][:objects] << data
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def mesh_normals
|
||||||
|
[
|
||||||
0,1,0,
|
0,1,0,
|
||||||
0,1,0,
|
0,1,0,
|
||||||
0,1,0,
|
0,1,0,
|
||||||
@@ -79,7 +110,51 @@ class IMICFPS
|
|||||||
-1,0,0,
|
-1,0,0,
|
||||||
-1,0,0
|
-1,0,0
|
||||||
]
|
]
|
||||||
vertices = [
|
end
|
||||||
|
|
||||||
|
def mesh_colors(color)
|
||||||
|
[
|
||||||
|
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
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
def mesh_vertices(box)
|
||||||
|
[
|
||||||
box.min_x, box.max_y, box.max_z,
|
box.min_x, box.max_y, box.max_z,
|
||||||
box.min_x, box.max_y, box.min_z,
|
box.min_x, box.max_y, box.min_z,
|
||||||
box.max_x, box.max_y, box.min_z,
|
box.max_x, box.max_y, box.min_z,
|
||||||
@@ -128,55 +203,6 @@ class IMICFPS
|
|||||||
box.min_x, box.max_y, box.min_z,
|
box.min_x, box.max_y, box.min_z,
|
||||||
box.max_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
|
end
|
||||||
|
|
||||||
def draw_bounding_boxes
|
def draw_bounding_boxes
|
||||||
@@ -185,12 +211,15 @@ class IMICFPS
|
|||||||
|
|
||||||
glTranslatef(bounding_box[:object].x, bounding_box[:object].y, bounding_box[:object].z)
|
glTranslatef(bounding_box[:object].x, bounding_box[:object].y, bounding_box[:object].z)
|
||||||
draw_bounding_box(bounding_box)
|
draw_bounding_box(bounding_box)
|
||||||
|
@bounding_boxes[key][:objects].each {|o| draw_bounding_box(o)}
|
||||||
|
|
||||||
glPopMatrix
|
glPopMatrix
|
||||||
|
|
||||||
found = ObjectManager.objects.detect { |o| o == bounding_box[:object] }
|
found = ObjectManager.objects.detect { |o| o == bounding_box[:object] }
|
||||||
|
|
||||||
unless found
|
unless found
|
||||||
@vertex_count -= @bounding_boxes[key][:vertices_size]
|
@vertex_count -= @bounding_boxes[key][:vertices_size]
|
||||||
|
@bounding_boxes[key][:objects].each {|o| @vertex_count -= [:vertex_count]}
|
||||||
@bounding_boxes.delete(key)
|
@bounding_boxes.delete(key)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ class IMICFPS
|
|||||||
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
|
@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)
|
@opengl_renderer.draw_object(object)
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user