public static Root LoadModel(string inputPath, ExportFormat format) { switch (format) { case ExportFormat.GR2: { using (var fs = new FileStream(inputPath, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite)) { var root = new LSLib.Granny.Model.Root(); var gr2 = new LSLib.Granny.GR2.GR2Reader(fs); gr2.Read(root); root.PostLoad(); return(root); } } case ExportFormat.DAE: { var root = new LSLib.Granny.Model.Root(); root.ImportFromCollada(inputPath); return(root); } default: throw new ArgumentException("Invalid model format"); } }
public static Root LoadModel(string inputPath, ExportFormat format) { switch (format) { case ExportFormat.GR2: { using (var fs = new FileStream(inputPath, FileMode.Open, System.IO.FileAccess.Read, FileShare.ReadWrite)) { var root = new LSLib.Granny.Model.Root(); var gr2 = new LSLib.Granny.GR2.GR2Reader(fs); gr2.Read(root); root.PostLoad(); return root; } } case ExportFormat.DAE: { var root = new LSLib.Granny.Model.Root(); root.ImportFromCollada(inputPath); return root; } default: throw new ArgumentException("Invalid model format"); } }
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); }