Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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));
        }