Ejemplo n.º 1
0
 private void LoadBonesInfo(AnimatedNode node, BoneInfo parent = null)
 {
     if (bonesMapping.ContainsKey(node.Name))
     {
         var point     = Vector3.Zero;
         var boneIndex = bonesMapping[node.Name];
         var bone      = Bones[boneIndex];
         var transform = m_globalInverseTransform * bone.BoneOffset;
         transform.Transpose();
         bone.Point = -Vector3.Transform(point, transform);
         if (parent != null)
         {
             var line = new BoneLineInfo
             {
                 Point     = bone.Point,
                 Direction = bone.Point - parent.Point
             };
             line.Length     = line.Direction.Length;
             line.Direction /= line.Length;
             parent.Lines.Add(line);
         }
         foreach (var child in node.Childs)
         {
             LoadBonesInfo(child, bone);
         }
     }
     else
     {
         foreach (var child in node.Childs)
         {
             LoadBonesInfo(child, parent);
         }
     }
 }
Ejemplo n.º 2
0
        private void ReadNodeHeirarchy(float animationTime, AnimatedNode node, Matrix4 parentTransform)
        {
            var channel            = СurrentAnimation.AnimationNodes.ContainsKey(node.Name) ? СurrentAnimation.AnimationNodes[node.Name] : null;
            var nodeTransformation = node.Transform;

            if (channel != null)
            {
                var scale       = CalcInterpolatedScaling(animationTime, channel);
                var scaleMatrix = Matrix4.CreateScale(scale);

                var rotateMatrix = CalcInterpolatedRotation(animationTime, channel);

                var translate = CalcInterpolatedPosition(animationTime, channel);

                nodeTransformation     = rotateMatrix * scaleMatrix;
                nodeTransformation.M14 = translate.X;
                nodeTransformation.M24 = translate.Y;
                nodeTransformation.M34 = translate.Z;
            }
            var globalTransformation = parentTransform * nodeTransformation;

            if (bonesMapping.ContainsKey(node.Name))
            {
                var boneIndex = bonesMapping[node.Name];
                Bones[boneIndex].FinalTransformation = m_globalInverseTransform * globalTransformation * Bones[boneIndex].BoneOffset;
                Bones[boneIndex].FinalTransformation.Transpose();
            }

            foreach (var child in node.Childs)
            {
                ReadNodeHeirarchy(animationTime, child, globalTransformation);
            }
        }
        protected override void OnDetachedFromNode(AnimatedNode parent)
        {
            if (parent != _parent)
            {
                throw new InvalidOperationException("Invalid parent node provided.");
            }

            _parent = null;
        }
        protected override void OnAttachedToNode(AnimatedNode parent)
        {
            if (_parent != null)
            {
                throw new InvalidOperationException("Parent already attached.");
            }

            var valueNode = parent as ValueAnimatedNode;
            if (valueNode == null)
            {
                throw new InvalidOperationException("Parent is not a value node.");
            }

            _parent = valueNode;
        }
Ejemplo n.º 5
0
        public bool Initialize(String daeFileName)
        {
            var fi = new FileInfo(daeFileName);

            if (!fi.Exists)
            {
                return(false);
            }

            var scene = LoadDaeScene(fi.FullName);

            if (scene == null)
            {
                return(false);
            }

            foreach (var t in BodyMeshes)
            {
                t.Destroy();
            }
            BodyMeshes.Clear();
            Bones.Clear();
            bonesMapping.Clear();
            Animations.Clear();
            Poses.Clear();
            rootNode         = null;
            СurrentAnimation = null;

            m_globalInverseTransform = FromMatrix(scene.RootNode.Transform);
            m_globalInverseTransform.Invert();

            var title = Path.GetFileNameWithoutExtension(fi.FullName);

            LoadBodyMeshes(fi.FullName, scene, scene.RootNode, null);
            LoadBonesInfo(rootNode);
            LoadAnimations(scene, title);

            return(true);
        }
Ejemplo n.º 6
0
        private void LoadBodyMeshes(string daePath, Scene scene, Node node, AnimatedNode animationNode)
        {
            if (node.HasMeshes)
            {
                var vertexPositions          = new List <float>();
                var vertexNormals            = new List <float>();
                var vertexTextureCoordinates = new List <float>();
                var vertexBoneIndices        = new List <float>();
                var vertexBoneWeights        = new List <float>();
                var indeces = new List <uint>();

                var fi = new FileInfo(daePath);
                foreach (var index in node.MeshIndices)
                {
                    var mesh = scene.Meshes[index];

                    var hasTexCoords = mesh.HasTextureCoords(0);

                    vertexPositions.Clear();
                    vertexNormals.Clear();
                    vertexTextureCoordinates.Clear();
                    vertexBoneIndices.Clear();
                    vertexBoneWeights.Clear();
                    indeces.Clear();

                    for (var i = 0; i < mesh.VertexCount; i++)
                    {
                        var vector = mesh.Vertices[i];
                        vertexPositions.Add(vector.X);
                        vertexPositions.Add(vector.Y);
                        vertexPositions.Add(vector.Z);

                        vector = mesh.HasNormals ? mesh.Normals[i] : ZERO_VECTRO3D;
                        vertexNormals.Add(vector.X);
                        vertexNormals.Add(vector.Y);
                        vertexNormals.Add(vector.Z);
                        vector = hasTexCoords ? mesh.GetTextureCoords(0)[i] : ZERO_VECTRO3D;
                        vertexTextureCoordinates.Add(vector.X);
                        vertexTextureCoordinates.Add(1.0f - vector.Y);
                        vertexBoneIndices.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f });
                        vertexBoneWeights.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f });
                    }

                    foreach (var face in mesh.Faces)
                    {
                        indeces.Add(face.Indices[0]);
                        indeces.Add(face.Indices[1]);
                        indeces.Add(face.Indices[2]);
                    }

                    if (mesh.HasBones)
                    {
                        foreach (var bone in mesh.Bones)
                        {
                            if (!bone.HasVertexWeights)
                            {
                                continue;
                            }
                            int boneIndex;
                            if (bonesMapping.ContainsKey(bone.Name))
                            {
                                boneIndex = bonesMapping[bone.Name];
                            }
                            else
                            {
                                boneIndex = Bones.Count;
                                var boneInfo = new BoneInfo
                                {
                                    BoneOffset = FromMatrix(bone.OffsetMatrix),
                                };
                                Bones.Add(boneInfo);
                                bonesMapping.Add(bone.Name, boneIndex);
                            }
                            foreach (var weight in bone.VertexWeights)
                            {
                                var vi = (int)weight.VertexID * 4;
                                for (var i = 0; i < 4; i++)
                                {
                                    if (vertexBoneWeights[vi + i] == 0.0f)
                                    {
                                        vertexBoneIndices[vi + i] = boneIndex;
                                        vertexBoneWeights[vi + i] = weight.Weight;
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    var mtr = scene.Materials[mesh.MaterialIndex];

                    var texturePath     = string.Empty;
                    var transparentPath = string.Empty;
                    if (mtr.GetTextureCount(TextureType.Diffuse) > 0)
                    {
                        var tex = mtr.GetTexture(TextureType.Diffuse, 0);
                        texturePath = Path.Combine(fi.DirectoryName, tex.FilePath);

                        transparentPath = Path.Combine(Path.GetDirectoryName(tex.FilePath), Path.GetFileNameWithoutExtension(tex.FilePath) + "_alpha" + Path.GetExtension(tex.FilePath));
                        transparentPath = File.Exists(transparentPath) ? transparentPath : string.Empty;
                    }

                    var renderMesh = new DynamicRenderMesh(MeshType.Head);
                    if (renderMesh.Create(vertexPositions, vertexNormals, vertexTextureCoordinates, vertexBoneIndices, vertexBoneWeights, indeces, texturePath, transparentPath))
                    {
                        renderMesh.Transform             = FromMatrix(node.Transform);
                        renderMesh.Material.DiffuseColor = new Vector4(mtr.ColorDiffuse.R, mtr.ColorDiffuse.G, mtr.ColorDiffuse.B, mtr.ColorDiffuse.A);
                        BodyMeshes.Add(renderMesh);
                    }
                }
            }

            var parentNode = animationNode;

            if (animationNode == null)
            {
                rootNode   = new AnimatedNode();
                parentNode = rootNode;
            }

            parentNode.Name      = node.Name;
            parentNode.Transform = FromMatrix(node.Transform);

            for (var i = 0; i < node.ChildCount; i++)
            {
                var childNode = new AnimatedNode
                {
                    Parent = parentNode
                };
                LoadBodyMeshes(daePath, scene, node.Children[i], childNode);
                parentNode.Childs.Add(childNode);
            }
        }
        private void ReadNodeHeirarchy(float animationTime, AnimatedNode node, Matrix4 parentTransform)
        {
            var channel = СurrentAnimation.AnimationNodes.ContainsKey(node.Name) ? СurrentAnimation.AnimationNodes[node.Name] : null;
            var nodeTransformation = node.Transform;
            if (channel != null)
            {
                var scale = CalcInterpolatedScaling(animationTime, channel);
                var scaleMatrix = Matrix4.CreateScale(scale);

                var rotateMatrix = CalcInterpolatedRotation(animationTime, channel);

                var translate = CalcInterpolatedPosition(animationTime, channel);

                nodeTransformation = rotateMatrix * scaleMatrix;
                nodeTransformation.M14 = translate.X;
                nodeTransformation.M24 = translate.Y;
                nodeTransformation.M34 = translate.Z;
            }
            var globalTransformation = parentTransform * nodeTransformation;

            if (bonesMapping.ContainsKey(node.Name))
            {
                var boneIndex = bonesMapping[node.Name];
                Bones[boneIndex].FinalTransformation = m_globalInverseTransform * globalTransformation * Bones[boneIndex].BoneOffset;
                Bones[boneIndex].FinalTransformation.Transpose();
            }

            foreach (var child in node.Childs)
            {
                ReadNodeHeirarchy(animationTime, child, globalTransformation);
            }
        }
 private void LoadBonesInfo(AnimatedNode node, BoneInfo parent = null)
 {
     if (bonesMapping.ContainsKey(node.Name))
     {
         var point = Vector3.Zero;
         var boneIndex = bonesMapping[node.Name];
         var bone = Bones[boneIndex];
         var transform = m_globalInverseTransform * bone.BoneOffset;
         transform.Transpose();
         bone.Point = -Vector3.Transform(point, transform);
         if (parent != null)
         {
             var line = new BoneLineInfo
             {
                 Point = bone.Point,
                 Direction = bone.Point - parent.Point
             };
             line.Length = line.Direction.Length;
             line.Direction /= line.Length;
             parent.Lines.Add(line);
         }
         foreach (var child in node.Childs)
         {
             LoadBonesInfo(child, bone);
         }
     }
     else
     {
         foreach (var child in node.Childs)
         {
             LoadBonesInfo(child, parent);
         }
     }
 }
        private void LoadBodyMeshes(string daePath, Scene scene, Node node, AnimatedNode animationNode)
        {
            if (node.HasMeshes)
            {
                var vertexPositions = new List<float>();
                var vertexNormals = new List<float>();
                var vertexTextureCoordinates = new List<float>();
                var vertexBoneIndices = new List<float>();
                var vertexBoneWeights = new List<float>();
                var indeces = new List<uint>();

                var fi = new FileInfo(daePath);
                foreach (var index in node.MeshIndices)
                {
                    var mesh = scene.Meshes[index];

                    var hasTexCoords = mesh.HasTextureCoords(0);

                    vertexPositions.Clear();
                    vertexNormals.Clear();
                    vertexTextureCoordinates.Clear();
                    vertexBoneIndices.Clear();
                    vertexBoneWeights.Clear();
                    indeces.Clear();

                    for (var i = 0; i < mesh.VertexCount; i++)
                    {
                        var vector = mesh.Vertices[i];
                        vertexPositions.Add(vector.X);
                        vertexPositions.Add(vector.Y);
                        vertexPositions.Add(vector.Z);

                        vector = mesh.HasNormals ? mesh.Normals[i] : ZERO_VECTRO3D;
                        vertexNormals.Add(vector.X);
                        vertexNormals.Add(vector.Y);
                        vertexNormals.Add(vector.Z);
                        vector = hasTexCoords ? mesh.GetTextureCoords(0)[i] : ZERO_VECTRO3D;
                        vertexTextureCoordinates.Add(vector.X);
                        vertexTextureCoordinates.Add(1.0f - vector.Y);
                        vertexBoneIndices.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f });
                        vertexBoneWeights.AddRange(new[] { 0.0f, 0.0f, 0.0f, 0.0f });
                    }

                    foreach (var face in mesh.Faces)
                    {
                        indeces.Add(face.Indices[0]);
                        indeces.Add(face.Indices[1]);
                        indeces.Add(face.Indices[2]);
                    }

                    if (mesh.HasBones)
                    {
                        foreach (var bone in mesh.Bones)
                        {
                            if (!bone.HasVertexWeights)
                                continue;
                            int boneIndex;
                            if (bonesMapping.ContainsKey(bone.Name))
                            {
                                boneIndex = bonesMapping[bone.Name];
                            }
                            else
                            {
                                boneIndex = Bones.Count;
                                var boneInfo = new BoneInfo
                                                   {
                                                       BoneOffset = FromMatrix(bone.OffsetMatrix),
                                                   };
                                Bones.Add(boneInfo);
                                bonesMapping.Add(bone.Name, boneIndex);
                            }
                            foreach (var weight in bone.VertexWeights)
                            {
                                var vi = (int)weight.VertexID * 4;
                                for (var i = 0; i < 4; i++)
                                {
                                    if (vertexBoneWeights[vi + i] == 0.0f)
                                    {
                                        vertexBoneIndices[vi + i] = boneIndex;
                                        vertexBoneWeights[vi + i] = weight.Weight;
                                        break;
                                    }
                                }
                            }
                        }
                    }

                    var mtr = scene.Materials[mesh.MaterialIndex];

                    var texturePath = string.Empty;
                    var transparentPath = string.Empty;
                    if (mtr.GetTextureCount(TextureType.Diffuse) > 0)
                    {
                        var tex = mtr.GetTexture(TextureType.Diffuse, 0);
                        texturePath = Path.Combine(fi.DirectoryName, tex.FilePath);

                        transparentPath = Path.Combine(Path.GetDirectoryName(tex.FilePath), Path.GetFileNameWithoutExtension(tex.FilePath) + "_alpha" + Path.GetExtension(tex.FilePath));
                        transparentPath = File.Exists(transparentPath) ? transparentPath : string.Empty;
                    }

                    var renderMesh = new DynamicRenderMesh(MeshType.Head);
                    if (renderMesh.Create(vertexPositions, vertexNormals, vertexTextureCoordinates, vertexBoneIndices, vertexBoneWeights, indeces, texturePath, transparentPath))
                    {
                        renderMesh.Transform = FromMatrix(node.Transform);
                        renderMesh.Material.DiffuseColor = new Vector4(mtr.ColorDiffuse.R, mtr.ColorDiffuse.G, mtr.ColorDiffuse.B, mtr.ColorDiffuse.A);
                        BodyMeshes.Add(renderMesh);
                    }
                }
            }

            var parentNode = animationNode;
            if (animationNode == null)
            {
                rootNode = new AnimatedNode();
                parentNode = rootNode;
            }

            parentNode.Name = node.Name;
            parentNode.Transform = FromMatrix(node.Transform);

            for (var i = 0; i < node.ChildCount; i++)
            {
                var childNode = new AnimatedNode
                {
                    Parent = parentNode
                };
                LoadBodyMeshes(daePath, scene, node.Children[i], childNode);
                parentNode.Childs.Add(childNode);
            }
        }
        public bool Initialize(String daeFileName)
        {
            var fi = new FileInfo(daeFileName);
            if (!fi.Exists)
                return false;

            var scene = LoadDaeScene(fi.FullName);
            if (scene == null)
                return false;

            foreach (var t in BodyMeshes)
                t.Destroy();
            BodyMeshes.Clear();
            Bones.Clear();
            bonesMapping.Clear();
            Animations.Clear();
            Poses.Clear();
            rootNode = null;
            СurrentAnimation = null;

            m_globalInverseTransform = FromMatrix(scene.RootNode.Transform);
            m_globalInverseTransform.Invert();

            var title = Path.GetFileNameWithoutExtension(fi.FullName);
            LoadBodyMeshes(fi.FullName, scene, scene.RootNode, null);
            LoadBonesInfo(rootNode);
            LoadAnimations(scene, title);

            return true;
        }