private static Bone[] CreateBoneHierarchy(Assimp.Scene scene) { var root = SearchBoneRoot(scene, scene.RootNode); var nodeCount = GetNodeCount(root); var bones = new Bone[nodeCount]; CopyAssimpBone(root, bones, null, 0); return(bones); }
private static int CopyAssimpBone(Node node, Bone[] bones, Bone parent, int index) { bones[index] = new Bone { mName = node.Name, mTransformation = AssimpToXna(node.Transform), mParent = parent }; var temporaryIndex = index; for (var i = 0; i < node.ChildCount; i++) { bones[index].mChildren.Add(bones[temporaryIndex + 1]); temporaryIndex = CopyAssimpBone(node.Children[i], bones, bones[index], temporaryIndex + 1); } return(temporaryIndex); }
private static CollisionRectangle CalculateBoundingRectangle(MeshData meshData) { var min = Vector2.Zero; var max = Vector2.Zero; if (meshData.mIsSkinned) { // We need the matrices to calculate the actual position var matrices = new Matrix[meshData.mBones.Length]; Bone.CalculateBoneBaseTransformation(meshData.mBones, ref matrices); foreach (var vertex in meshData.mVerticesExt) { var index = vertex.BoneIndex.ToVector4(); var boneTransform = matrices[(int)index.X] * vertex.BoneWeights.X; boneTransform += matrices[(int)index.Y] * vertex.BoneWeights.Y; boneTransform += matrices[(int)index.Z] * vertex.BoneWeights.Z; boneTransform += matrices[(int)index.W] * vertex.BoneWeights.W; var location = Vector3.Transform(vertex.Position, boneTransform); if (location.Y < BoundingRectangleBias && location.Y > 0.0f) { if (max == Vector2.Zero) { max = new Vector2(location.X, location.Z); } if (min == Vector2.Zero) { max = new Vector2(location.X, location.Z); } max.X = location.X > max.X ? location.X : max.X; max.Y = location.Z > max.Y ? location.Z : max.Y; min.X = location.X < min.X ? location.X : min.X; min.Y = location.Z < min.Y ? location.Z : min.Y; } } } else { foreach (var vertex in meshData.mVertices) { var location = vertex.Position; if (location.Y < BoundingRectangleBias && location.Y > 0.0f) { if (max == Vector2.Zero) { max = new Vector2(location.X, location.Z); } if (min == Vector2.Zero) { max = new Vector2(location.X, location.Z); } max.X = location.X > max.X ? location.X : max.X; max.Y = location.Z > max.Y ? location.Z : max.Y; min.X = location.X < min.X ? location.X : min.X; min.Y = location.Z < min.Y ? location.Z : min.Y; } } } return(new CollisionRectangle(new Vector2(min.X, max.Y), min, max)); }