// <Animation name="Take 001" trackcount="60" framecount="61" duration="1.199999928" dtime="4">
        /// <summary>
        ///
        /// </summary>
        /// <param name="xAnimation"></param>
        /// <returns></returns>
        public static EZMAnimation Parse(System.Xml.Linq.XElement xElement)
        {
            EZMAnimation result = null;

            if (xElement.Name == "Animation")
            {
                result = new EZMAnimation();
                {
                    var xAttr = xElement.Attribute("name");
                    if (xAttr != null)
                    {
                        result.Name = xAttr.Value;
                    }
                }
                {
                    var xAttr = xElement.Attribute("trackcount");
                    if (xAttr != null)
                    {
                        result.TrackCount = int.Parse(xAttr.Value);
                    }
                }
                {
                    var xAttr = xElement.Attribute("framecount");
                    if (xAttr != null)
                    {
                        result.FrameCount = int.Parse(xAttr.Value);
                    }
                }
                {
                    var xAttr = xElement.Attribute("duration");
                    if (xAttr != null)
                    {
                        result.duration = float.Parse(xAttr.Value);
                    }
                }
                {
                    var xAttr = xElement.Attribute("dtime");
                    if (xAttr != null)
                    {
                        result.dtime = float.Parse(xAttr.Value);
                    }
                }
                {
                    var xAnimTracks = xElement.Elements("AnimTrack");
                    var animTracks  = new EZMAnimTrack[xAnimTracks.Count()];
                    int index       = 0;
                    foreach (var xAnimTrack in xAnimTracks)
                    {
                        animTracks[index++] = EZMAnimTrack.Parse(xAnimTrack);
                    }
                    result.AnimTracks = animTracks;
                }
            }

            return(result);
        }
Beispiel #2
0
        private static AiAnimation Parse(EZMAnimation ezmAnimation)
        {
            var aiAnimation = new AiAnimation();

            aiAnimation.Name = ezmAnimation.Name;

            /*
             * double ticksPerSecond = aiScene.Animations[0].TicksPerSecond;
             * if (ticksPerSecond == 0) { ticksPerSecond = 25.0; }
             * double timeInTicks = TimeInSeconds * ticksPerSecond;
             * float animationTime = (float)(timeInTicks % aiScene.Animations[0].DurationInTicks);
             */
            /*
             * DateTime now = DateTime.Now;
             *  var deltaTime = now.Subtract(this.lastTime).TotalSeconds;
             *  float frameDuration = animation.duration / animation.FrameCount;
             *  if (deltaTime + passedTime > frameDuration)
             *  {
             *      this.currentFrame = (this.currentFrame + 1) % animation.FrameCount;
             *      passedTime = deltaTime - frameDuration;
             *  }
             *  this.lastTime = now;*/
            float durationInSeconds = ezmAnimation.duration;

            aiAnimation.TicksPerSecond  = 1;
            aiAnimation.DurationInTicks = ezmAnimation.duration;
            // nothing to do with ezmAnimation.dtime...
            int trackCount = ezmAnimation.TrackCount;
            var channels   = new AiNodeAnimationChannel[trackCount];

            for (int i = 0; i < trackCount; i++)
            {
                var            channel     = new AiNodeAnimationChannel();
                EZMAnimTrack   track       = ezmAnimation.AnimTracks[i];
                EZMBoneState[] states      = track.States;
                int            stateCount  = states.Length;
                var            positions   = new VectorKey[stateCount];
                var            quaternions = new QuaternionKey[stateCount];
                var            scalings    = new VectorKey[stateCount];
                for (int t = 0; t < stateCount; t++)
                {
                    EZMBoneState state = states[t];
                    positions[i]   = new VectorKey(0, state.position);
                    quaternions[i] = new QuaternionKey(0, state.orientation);
                    scalings[i]    = new VectorKey(0, state.scale);
                }
                channel.PositionKeys   = positions;
                channel.QuaternionKeys = quaternions;
                channel.ScalingKeys    = scalings;
                channels[i]            = channel;
            }
            aiAnimation.NodeAnimationChannels = channels;

            return(aiAnimation);
        }
        // <MeshSystem asset_name="dude.fbx" asset_info="null" mesh_system_version="1" mesh_system_asset_version="0">
        /// <summary>
        ///
        /// </summary>
        /// <param name="xElement"></param>
        /// <returns></returns>
        public static EZMMeshSystem Parse(System.Xml.Linq.XElement xElement)
        {
            EZMMeshSystem result = null;

            if (xElement.Name == "MeshSystem")
            {
                result = new EZMMeshSystem();
                {
                    var attr = xElement.Attribute("asset_name");
                    if (attr != null)
                    {
                        result.AssetName = attr.Value;
                    }
                }
                {
                    var attr = xElement.Attribute("asset_info");
                    if (attr != null)
                    {
                        result.AssetInfo = attr.Value;
                    }
                }
                {
                    var attr = xElement.Attribute("mesh_system_version");
                    if (attr != null)
                    {
                        result.Version = attr.Value;
                    }
                }
                {
                    var attr = xElement.Attribute("mesh_system_asset_version");
                    if (attr != null)
                    {
                        result.AssetVersion = attr.Value;
                    }
                }
                {
                    var skeletionRoot = xElement.Element("Skeletons");
                    if (skeletionRoot != null)
                    {
                        var xSkeletons = skeletionRoot.Elements("Skeleton");
                        var skeletons  = new EZMSkeleton[xSkeletons.Count()];
                        int index      = 0;
                        foreach (var xSkeleton in xSkeletons)
                        {
                            skeletons[index++] = EZMSkeleton.Parse(xSkeleton);
                        }
                        result.Skeletons = skeletons;
                    }
                }
                {
                    var animationRoot = xElement.Element("Animations");
                    if (animationRoot != null)
                    {
                        var xAnimations = animationRoot.Elements("Animation");
                        var animations  = new EZMAnimation[xAnimations.Count()];
                        int index       = 0;
                        foreach (var xAnimation in xAnimations)
                        {
                            var animation = EZMAnimation.Parse(xAnimation);
                            foreach (var animTrack in animation.AnimTracks)
                            {
                                string name = animTrack.BoneName;
                                if (name != null)
                                {
                                    foreach (var skeleton in result.Skeletons)
                                    {
                                        EZMBone bone = null;
                                        if (skeleton.nameBoneDict.TryGetValue(name, out bone))
                                        {
                                            if (animTrack.Bone != null)
                                            {
                                                throw new Exception("More than 1 bone for the animTrack!");
                                            }

                                            animTrack.Bone = bone;
                                            //break;
                                        }
                                    }
                                }
                            }
                            animations[index++] = animation;
                        }
                        result.Animations = animations;
                    }
                }

                var nameMaterialDict = new Dictionary <string, EZMMaterial>();
                {
                    var materialsRoot = xElement.Element("Materials");
                    if (materialsRoot != null)
                    {
                        var xMaterials = materialsRoot.Elements("Material");
                        var materials  = new EZMMaterial[xMaterials.Count()];
                        int index      = 0;
                        foreach (var xMaterial in xMaterials)
                        {
                            var material = EZMMaterial.Parse(xMaterial);
                            nameMaterialDict.Add(material.Name, material);
                            materials[index++] = material;
                        }
                        result.Materials = materials;
                    }
                }
                {
                    var meshesRoot = xElement.Element("Meshes");
                    if (meshesRoot != null)
                    {
                        var xMeshes = meshesRoot.Elements("Mesh");
                        var meshes  = new EZMMesh[xMeshes.Count()];
                        int index   = 0;
                        foreach (var xMesh in xMeshes)
                        {
                            EZMMesh mesh = EZMMesh.Parse(xMesh);
                            foreach (var meshSection in mesh.MeshSections)
                            {
                                string      name     = meshSection.MaterialName;
                                EZMMaterial material = null;
                                if (nameMaterialDict.TryGetValue(name, out material))
                                {
                                    meshSection.Material = material;
                                }
                            }
                            EZMSkeleton[] skeletons = result.Skeletons;
                            if (skeletons.Length > 0)
                            {
                                if (string.IsNullOrEmpty(mesh.SkeletonName) ||
                                    mesh.SkeletonName == "null")
                                {
                                    mesh.Skeleton = skeletons[0];
                                }
                                else
                                {
                                    foreach (var skeleton in skeletons)
                                    {
                                        if (mesh.SkeletonName == skeleton.Name)
                                        {
                                            mesh.Skeleton = skeleton;
                                            break;
                                        }
                                    }
                                }
                            }
                            meshes[index++] = mesh;
                        }
                        result.Meshes = meshes;
                    }
                }
            }

            return(result);
        }