Collada parser mostly works for single object/material models

This commit is contained in:
2020-01-30 13:36:34 -06:00
parent b8e53c7a88
commit dbf4edbb93
4 changed files with 39 additions and 8 deletions

View File

@@ -1,10 +1,11 @@
class IMICFPS class IMICFPS
class Model class Model
class ModelObject class ModelObject
attr_reader :name, :vertices, :textures, :normals, :bounding_box, :debug_color attr_reader :id, :name, :vertices, :textures, :normals, :bounding_box, :debug_color
attr_accessor :faces, :scale attr_accessor :faces, :scale
def initialize(name) def initialize(id, name)
@id = id
@name = name @name = name
@vertices = [] @vertices = []
@textures = [] @textures = []

View File

@@ -30,8 +30,26 @@ class IMICFPS
def parse def parse
end end
def change_object(name) def set_object(id: nil, name: nil)
@model.objects << Model::ModelObject.new(name) _model = nil
if id
_model = @model.objects.find { |o| o.id == id }
elsif name
_model = @model.objects.find { |o| o.id == id }
else
raise "Must provide either an id: or name:"
end
if _model
@model.current_object = _model
else
raise "Couldn't find ModelObject!"
end
end
def change_object(id, name)
@model.objects << Model::ModelObject.new(id, name)
@model.current_object = @model.objects.last @model.current_object = @model.objects.last
end end

View File

@@ -40,7 +40,7 @@ class IMICFPS
geometry_id = geometry.attributes["id"].value geometry_id = geometry.attributes["id"].value
geometry_name = geometry.attributes["name"].value geometry_name = geometry.attributes["name"].value
change_object(geometry_name) change_object(geometry_id, geometry_name)
mesh = geometry.at_css("mesh") mesh = geometry.at_css("mesh")
@@ -80,10 +80,20 @@ class IMICFPS
def build_faces(id, mesh) def build_faces(id, mesh)
material_name = mesh.at_css("triangles").attributes["material"].value material_name = mesh.at_css("triangles").attributes["material"].value
set_material(material_name)
positions_index = []
normals_index = []
uvs_index = []
mesh.at_css("triangles p").children.first.to_s.split(" ").map { |i| Integer(i) }.each_slice(3).each do |slice| mesh.at_css("triangles p").children.first.to_s.split(" ").map { |i| Integer(i) }.each_slice(3).each do |slice|
set_material(material_name) positions_index << slice[0]
normals_index << slice[1]
uvs_index << slice[2]
end
norm_index = 0
positions_index.each_slice(3) do |slice|
face = Face.new face = Face.new
face.vertices = [] face.vertices = []
face.uvs = [] face.uvs = []
@@ -95,8 +105,10 @@ class IMICFPS
slice.each do |index| slice.each do |index|
face.vertices << @model.vertices[index] face.vertices << @model.vertices[index]
# face.uvs << @model.uvs[index] # face.uvs << @model.uvs[index]
face.normals << @model.normals[index] face.normals << @model.normals[normals_index[norm_index]]
face.colors << current_material.diffuse face.colors << current_material.diffuse
norm_index += 1
end end
@model.current_object.faces << face @model.current_object.faces << face

View File

@@ -23,7 +23,7 @@ class IMICFPS
when 'usemtl' when 'usemtl'
set_material(array[1]) set_material(array[1])
when 'o' when 'o'
change_object(array[1]) change_object(nil, array[1])
when 's' when 's'
set_smoothing(array[1]) set_smoothing(array[1])
when 'v' when 'v'