public Root Import(string inputPath)
{
var collada = COLLADA.Load(inputPath);
var root = new Root();
root.ArtToolInfo = ImportArtToolInfo(collada);
if (!Options.StripMetadata)
{
root.ExporterInfo = ImportExporterInfo(collada);
}
root.FromFileName = inputPath;
root.Skeletons = new List <Skeleton>();
root.VertexDatas = new List <VertexData>();
root.TriTopologies = new List <TriTopology>();
root.Meshes = new List <Mesh>();
root.Models = new List <Model>();
root.TrackGroups = new List <TrackGroup>();
root.Animations = new List <Animation>();
ColladaGeometries = new Dictionary <string, Mesh>();
SkinnedMeshes = new HashSet <string>();
var collGeometries = new List <geometry>();
var collSkins = new List <skin>();
var collAnimations = new List <animation>();
var rootBones = new List <RootBoneInfo>();
// Import skinning controllers after skeleton and geometry loading has finished, as
// we reference both of them during skin import
foreach (var item in collada.Items)
{
if (item is library_controllers)
{
var controllers = item as library_controllers;
if (controllers.controller != null)
{
foreach (var controller in controllers.controller)
{
if (controller.Item is skin)
{
collSkins.Add(controller.Item as skin);
SkinnedMeshes.Add((controller.Item as skin).source1.Substring(1));
}
else
{
Utils.Warn(String.Format("Controller {0} is unsupported and will be ignored", controller.Item.GetType().Name));
}
}
}
}
else if (item is library_visual_scenes)
{
var scenes = item as library_visual_scenes;
if (scenes.visual_scene != null)
{
foreach (var scene in scenes.visual_scene)
{
if (scene.node != null)
{
foreach (var node in scene.node)
{
FindRootBones(new List <node>(), node, rootBones);
}
}
}
}
}
else if (item is library_geometries)
{
var geometries = item as library_geometries;
if (geometries.geometry != null)
{
foreach (var geometry in geometries.geometry)
{
if (geometry.Item is mesh)
{
collGeometries.Add(geometry);
}
else
{
Utils.Warn(String.Format("Geometry type {0} is unsupported and will be ignored", geometry.Item.GetType().Name));
}
}
}
}
else if (item is library_animations)
{
var animations = item as library_animations;
if (animations.animation != null)
{
collAnimations.AddRange(animations.animation);
}
}
else
{
Utils.Warn(String.Format("Library {0} is unsupported and will be ignored", item.GetType().Name));
}
}
foreach (var bone in rootBones)
{
var skeleton = Skeleton.FromCollada(bone.Bone);
var rootTransform = NodeHelpers.GetTransformHierarchy(bone.Parents);
skeleton.TransformRoots(rootTransform.Inverted());
root.Skeletons.Add(skeleton);
}
foreach (var geometry in collGeometries)
{
VertexDescriptor vertexFormat = null;
// Use the override vertex format, if one was specified
Options.VertexFormats.TryGetValue(geometry.name, out vertexFormat);
var mesh = ImportMesh(root, geometry.name, geometry, geometry.Item as mesh, vertexFormat);
ColladaGeometries.Add(geometry.id, mesh);
}
// Import skinning controllers after skeleton and geometry loading has finished, as
// we reference both of them during skin import
if (rootBones.Count > 0)
{
foreach (var skin in collSkins)
{
ImportSkin(root, skin);
}
}
if (collAnimations.Count > 0)
{
ImportAnimations(collAnimations, root, root.Skeletons.FirstOrDefault());
}
var rootModel = new Model();
rootModel.Name = "Unnamed"; // TODO
if (root.Skeletons.Count > 0)
{
rootModel.Skeleton = root.Skeletons[0];
rootModel.Name = rootModel.Skeleton.Bones[0].Name;
}
rootModel.InitialPlacement = new Transform();
rootModel.MeshBindings = new List <MeshBinding>();
foreach (var mesh in root.Meshes)
{
var binding = new MeshBinding();
binding.Mesh = mesh;
rootModel.MeshBindings.Add(binding);
}
root.Models.Add(rootModel);
// TODO: make this an option!
if (root.Skeletons.Count > 0)
{
root.Skeletons[0].UpdateWorldTransforms();
}
root.ZUp = ZUp;
root.PostLoad(GR2.Header.DefaultTag);
this.UpdateUserDefinedProperties(root);
return(root);
}