internal ModelBoneHierarchy(W3dHierarchyDef w3dHierarchy) { SetNameAndInstanceId("W3DHierarchy", w3dHierarchy.Header.Name); Bones = new ModelBone[w3dHierarchy.Pivots.Items.Count]; for (var i = 0; i < w3dHierarchy.Pivots.Items.Count; i++) { var pivot = w3dHierarchy.Pivots.Items[i]; var parent = pivot.ParentIdx == -1 ? null : Bones[pivot.ParentIdx]; Bones[i] = new ModelBone( i, pivot.Name, parent, pivot.Translation, pivot.Rotation); } }
private Model CreateModel( ContentManager contentManager, W3dFile w3dFile, W3dHierarchyDef w3dHierarchy) { ModelBone[] bones; if (w3dHierarchy != null) { if (w3dHierarchy.Pivots.Length > ModelMesh.MaxBones) { throw new NotSupportedException(); } bones = new ModelBone[w3dHierarchy.Pivots.Length]; for (var i = 0; i < w3dHierarchy.Pivots.Length; i++) { var pivot = w3dHierarchy.Pivots[i]; var parent = pivot.ParentIdx == -1 ? null : bones[pivot.ParentIdx]; bones[i] = new ModelBone( i, pivot.Name, parent, pivot.Translation, pivot.Rotation); } } else { bones = new ModelBone[1]; bones[0] = new ModelBone(0, null, null, Vector3.Zero, Quaternion.Identity); } //BoundingSphere boundingSphere = default(BoundingSphere); var meshes = new ModelMesh[w3dFile.Meshes.Count]; for (var i = 0; i < w3dFile.Meshes.Count; i++) { var w3dMesh = w3dFile.Meshes[i]; ModelBone bone; if (w3dFile.HLod != null) { var hlodSubObject = w3dFile.HLod.Lods[0].SubObjects.Single(x => x.Name == w3dMesh.Header.ContainerName + "." + w3dMesh.Header.MeshName); bone = bones[(int)hlodSubObject.BoneIndex]; } else { bone = bones[0]; } meshes[i] = CreateModelMesh( contentManager, w3dMesh, bone, bones.Length); //var meshBoundingSphere = mesh.BoundingSphere.Transform(bone.Transform); //boundingSphere = (i == 0) // ? meshBoundingSphere // : BoundingSphere.CreateMerged(boundingSphere, meshBoundingSphere); } var animations = new Animation[w3dFile.Animations.Count + w3dFile.CompressedAnimations.Count]; for (var i = 0; i < w3dFile.Animations.Count; i++) { animations[i] = CreateAnimation(w3dFile.Animations[i]); } for (var i = 0; i < w3dFile.CompressedAnimations.Count; i++) { animations[w3dFile.Animations.Count + i] = CreateAnimation(w3dFile.CompressedAnimations[i]); } return(new Model( bones, meshes, animations)); }
private Model CreateModel( ContentManager contentManager, W3dFile w3dFile, W3dHierarchyDef w3dHierarchy) { ModelBone[] bones; if (w3dHierarchy != null) { bones = new ModelBone[w3dHierarchy.Pivots.Items.Count]; for (var i = 0; i < w3dHierarchy.Pivots.Items.Count; i++) { var pivot = w3dHierarchy.Pivots.Items[i]; var parent = pivot.ParentIdx == -1 ? null : bones[pivot.ParentIdx]; bones[i] = new ModelBone( i, pivot.Name, parent, pivot.Translation, pivot.Rotation); } } else { bones = new ModelBone[1]; bones[0] = new ModelBone(0, null, null, Vector3.Zero, Quaternion.Identity); } //BoundingSphere boundingSphere = default(BoundingSphere); var w3dMeshes = w3dFile.GetMeshes(); var w3dHLod = w3dFile.GetHLod(); var subObjects = new List <ModelSubObject>(); if (w3dHLod != null) { foreach (var w3dSubObject in w3dHLod.Lods[0].SubObjects) { // TODO: Collision boxes var w3dMesh = w3dMeshes.FirstOrDefault(x => x.Header.ContainerName + "." + x.Header.MeshName == w3dSubObject.Name); if (w3dMesh == null) { continue; } var bone = bones[(int)w3dSubObject.BoneIndex]; var mesh = CreateModelMesh( contentManager, w3dMesh); //var meshBoundingSphere = mesh.BoundingSphere.Transform(bone.Transform); //boundingSphere = (i == 0) // ? meshBoundingSphere // : BoundingSphere.CreateMerged(boundingSphere, meshBoundingSphere); subObjects.Add(new ModelSubObject(w3dSubObject.Name, bone, mesh)); } } else { // Simple models can have only one mesh with no HLod chunk. if (w3dMeshes.Count != 1) { throw new InvalidOperationException(); } var w3dMesh = w3dMeshes[0]; var mesh = CreateModelMesh( contentManager, w3dMesh); subObjects.Add(new ModelSubObject( w3dMesh.Header.MeshName, bones[0], mesh)); } LoadAnimations(w3dFile, contentManager); return(new Model( new ModelBoneHierarchy(bones), subObjects.ToArray())); }