// <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); }
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); }