Exemple #1
0
        private static Animation ParseVDF(BinaryReader reader)
        {
            Animation animation;
            Dictionary <uint, AnimationObject> animationObjects;

            AnimationFrame GetNextAnimationFrame(AnimationObject animationObject)
            {
                var animationFrames = animationObject.AnimationFrames;
                var frameTime       = (uint)animationFrames.Count;
                var frame           = new AnimationFrame {
                    FrameTime = frameTime, AnimationObject = animationObject
                };

                animationFrames.Add(frameTime, frame);
                if (frameTime >= animation.FrameCount)
                {
                    animation.FrameCount = frameTime + 1;
                }
                return(frame);
            }

            AnimationObject GetAnimationObject(uint objectId)
            {
                if (animationObjects.ContainsKey(objectId))
                {
                    return(animationObjects[objectId]);
                }
                var animationObject = new AnimationObject {
                    Animation = animation, ID = objectId, TMDID = objectId
                };

                animationObjects.Add(objectId, animationObject);
                return(animationObject);
            }

            var frameCount = reader.ReadUInt32();

            if (frameCount < Program.MinVDFFrames || frameCount > Program.MaxVDFFrames)
            {
                return(null);
            }
            animation = new Animation();
            var rootAnimationObject = new AnimationObject();

            animationObjects = new Dictionary <uint, AnimationObject>();
            if (Program.Debug)
            {
                Program.Logger.WriteLine("VDF---------------------------------");
                Program.Logger.WriteLine("VDF frameCount:" + frameCount);
            }
            for (uint f = 0; f < frameCount; f++)
            {
                var objectId = reader.ReadUInt32();
                if (objectId > Program.MaxVDFObjects)
                {
                    return(null);
                }
                if (Program.Debug)
                {
                    Program.Logger.WriteLine("  VDF objectId:" + objectId);
                }
                var vertexOffset    = reader.ReadUInt32();
                var skippedVertices = vertexOffset / 8;
                var vertexCount     = reader.ReadUInt32();
                if (vertexCount + skippedVertices == 0 || vertexCount + skippedVertices > Program.MaxVDFVertices)
                {
                    return(null);
                }
                if (Program.Debug)
                {
                    Program.Logger.WriteLine("  VDF skippedVertices:" + skippedVertices);
                }
                if (Program.Debug)
                {
                    Program.Logger.WriteLine("  VDF vertexCount:" + vertexCount);
                }
                var animationObject = GetAnimationObject(objectId);
                //if (f == 0)
                //{
                //    var firstAnimationFrame = GetAnimationFrame(animationObject, 0);
                //    var firstVertices = new Vector3[vertexCount + skippedVertices];
                //    firstAnimationFrame.Vertices = firstVertices;
                //    firstAnimationFrame.TempVertices = new Vector3[firstAnimationFrame.Vertices.Length];
                //}
                var animationFrame = GetNextAnimationFrame(animationObject);
                var vertices       = new Vector3[vertexCount + skippedVertices];
                for (var i = 0; i < vertexCount; i++)
                {
                    var vx = reader.ReadInt16();
                    var vy = reader.ReadInt16();
                    var vz = reader.ReadInt16();
                    reader.ReadInt16();
                    var vertex = new Vector3(vx, vy, vz);
                    vertices[i + skippedVertices] = vertex;
                    //if (Program.Debug)
                    //{
                    //    Program.Logger.WriteLine("      VDF vertex:" + vertex);
                    //}
                }
                animationFrame.Vertices     = vertices;
                animationFrame.TempVertices = new Vector3[animationFrame.Vertices.Length];
            }
            foreach (var animationObject in animationObjects.Values)
            {
                if (animationObject.ParentID != 0 && animationObjects.ContainsKey(animationObject.ParentID))
                {
                    var parent = animationObjects[animationObject.ParentID];
                    animationObject.Parent = parent;
                    parent.Children.Add(animationObject);
                    continue;
                }
                animationObject.Parent = rootAnimationObject;
                rootAnimationObject.Children.Add(animationObject);
            }
            animation.AnimationType       = AnimationType.VertexDiff;
            animation.RootAnimationObject = rootAnimationObject;
            animation.ObjectCount         = animationObjects.Count;
            animation.FPS = 1f;
            return(animation);
        }
Exemple #2
0
        private Animation ProcessMimeVertexData(Dictionary <uint, List <Triangle> > groupedTriangles, BinaryReader reader, uint driver, uint primitiveType, uint primitiveHeaderPointer, uint nextPrimitivePointer, uint diffTop, uint dataCount, bool rst)
        {
            Animation animation;
            Dictionary <uint, AnimationObject> animationObjects;

            AnimationFrame GetNextAnimationFrame(AnimationObject animationObject)
            {
                var animationFrames = animationObject.AnimationFrames;
                var frameTime       = (uint)animationFrames.Count;
                var frame           = new AnimationFrame {
                    FrameTime = frameTime, AnimationObject = animationObject
                };

                animationFrames.Add(frameTime, frame);
                if (frameTime >= animation.FrameCount)
                {
                    animation.FrameCount = frameTime + 1;
                }
                return(frame);
            }

            AnimationObject GetAnimationObject(uint objectId)
            {
                if (animationObjects.ContainsKey(objectId))
                {
                    return(animationObjects[objectId]);
                }
                var animationObject = new AnimationObject {
                    Animation = animation, ID = objectId, TMDID = objectId
                };

                animationObjects.Add(objectId, animationObject);
                return(animationObject);
            }

            animation = new Animation();
            var rootAnimationObject = new AnimationObject();

            animationObjects = new Dictionary <uint, AnimationObject>();
            var primitiveDataTop = reader.BaseStream.Position;

            ProcessMimeVertexPrimitiveHeader(reader, primitiveHeaderPointer, out var coordTop, out var mimeDiffTop, out var mimeOrgTop, out var mimeVertTop, out var mimeNormTop, out var mimeTop);
            reader.BaseStream.Seek(primitiveDataTop, SeekOrigin.Begin);
            for (uint i = 0; i < dataCount; i++)
            {
                reader.BaseStream.Seek(_offset + mimeDiffTop, SeekOrigin.Begin);
                var oNum     = reader.ReadUInt16();
                var numDiffs = reader.ReadUInt16();
                if (numDiffs > Program.MaxHMDMimeDiffs)
                {
                    return(null);
                }
                var flags           = reader.ReadUInt32();
                var animationObject = GetAnimationObject(oNum);
                for (uint j = 0; j < numDiffs; j++)
                {
                    var position    = reader.BaseStream.Position;
                    var diffDataTop = reader.ReadUInt32() * 4;
                    reader.BaseStream.Seek(_offset + mimeDiffTop + diffTop + diffDataTop, SeekOrigin.Begin);
                    var vertexStart = reader.ReadUInt32();
                    var res         = reader.ReadUInt16();
                    var vertexCount = reader.ReadUInt16();
                    if (vertexCount + vertexStart == 0 || vertexCount + vertexStart >= Program.MaxHMDVertCount)
                    {
                        return(null);
                    }
                    var animationFrame = GetNextAnimationFrame(animationObject);
                    var vertices       = new Vector3[vertexCount + vertexStart];
                    for (var k = 0; k < vertexCount; k++)
                    {
                        var x   = reader.ReadInt16();
                        var y   = reader.ReadInt16();
                        var z   = reader.ReadInt16();
                        var pad = reader.ReadUInt16();
                        vertices[vertexStart + k] = new Vector3(x, y, z);
                    }
                    animationFrame.Vertices     = vertices;
                    animationFrame.TempVertices = new Vector3[animationFrame.Vertices.Length];
                    reader.BaseStream.Seek(position, SeekOrigin.Begin);
                }
                if (flags == 1)
                {
                    var resetOffset = reader.ReadUInt32() * 4;
                }
            }
            foreach (var animationObject in animationObjects.Values)
            {
                if (animationObject.ParentID != 0 && animationObjects.ContainsKey(animationObject.ParentID))
                {
                    var parent = animationObjects[animationObject.ParentID];
                    animationObject.Parent = parent;
                    parent.Children.Add(animationObject);
                    continue;
                }
                animationObject.Parent = rootAnimationObject;
                rootAnimationObject.Children.Add(animationObject);
            }
            animation.AnimationType       = AnimationType.VertexDiff;
            animation.RootAnimationObject = rootAnimationObject;
            animation.ObjectCount         = animationObjects.Count;
            animation.FPS = 1f;
            return(animation);
        }
        private bool ProcessAnimationObject(AnimationObject animationObject, float frameIndex, RootEntity selectedRootEntity, Matrix4 worldMatrix)
        {
            switch (_animation.AnimationType)
            {
            case AnimationType.VertexDiff:
            case AnimationType.NormalDiff:
            {
                if (selectedRootEntity != null && animationObject.Parent != null)
                {
                    var objectId = animationObject.TMDID.GetValueOrDefault();
                    foreach (ModelEntity childModel in selectedRootEntity.ChildEntities)
                    {
                        if (childModel.TMDID == objectId)
                        {
                            var intFrameIndex = (uint)frameIndex;
                            if (intFrameIndex > animationObject.AnimationFrames.Count - 1)
                            {
                                return(false);
                            }
                            var animationFrame = animationObject.AnimationFrames[intFrameIndex];
                            if (intFrameIndex > 0)
                            {
                                var lastFrame = animationObject.AnimationFrames[intFrameIndex - 1];
                                for (uint j = 0; j < animationFrame.Vertices.Length; j++)
                                {
                                    if (j < lastFrame.Vertices.Length)
                                    {
                                        animationFrame.TempVertices[j] = lastFrame.Vertices[j];
                                    }
                                    else
                                    {
                                        animationFrame.TempVertices[j] = Vector3.Zero;
                                    }
                                }
                            }
                            else
                            {
                                for (uint j = 0; j < animationFrame.Vertices.Length; j++)
                                {
                                    animationFrame.TempVertices[j] = Vector3.Zero;
                                }
                            }
                            var interpolator    = frameIndex % 1;
                            var initialVertices = _animation.AnimationType == AnimationType.VertexDiff ? animationFrame.TempVertices : null;
                            var finalVertices   = _animation.AnimationType == AnimationType.VertexDiff ? animationFrame.Vertices : null;
                            var initialNormals  = _animation.AnimationType == AnimationType.NormalDiff ? animationFrame.TempVertices : null;
                            var finalNormals    = _animation.AnimationType == AnimationType.NormalDiff ? animationFrame.Vertices : null;
                            childModel.Interpolator    = interpolator;
                            childModel.InitialVertices = initialVertices;
                            childModel.FinalVertices   = finalVertices;
                            childModel.InitialNormals  = initialNormals;
                            childModel.FinalNormals    = finalNormals;
                            childModel.TempMatrix      = Matrix4.Identity;
                            //_scene.MeshBatch.BindModelBatch(childModel, childModel.WorldMatrix, _scene.TextureBinder, initialVertices, initialNormals, finalVertices, finalNormals, interpolator);
                        }
                    }
                }
                break;
            }

            case AnimationType.Common:
            {
                if (selectedRootEntity != null)
                {
                    var animationFrames = animationObject.AnimationFrames;
                    var totalFrames     = animationFrames.Count;
                    var localMatrix     = Matrix4.Identity;
                    for (uint f = 0; f <= frameIndex && f < totalFrames; f++)
                    {
                        if (!animationFrames.ContainsKey(f))
                        {
                            continue;
                        }

                        var frameMatrix = Matrix4.Identity;
                        var sumFrame    = animationFrames[f];
                        if (sumFrame.Rotation != null)
                        {
                            var r = Matrix4.CreateFromQuaternion(sumFrame.Rotation.Value);
                            frameMatrix = frameMatrix * r;
                        }
                        else if (sumFrame.EulerRotation != null)
                        {
                            var r = GeomUtils.CreateR(sumFrame.EulerRotation.Value);
                            frameMatrix = frameMatrix * r;
                        }

                        if (sumFrame.Scale != null)
                        {
                            var scale = (Vector3)sumFrame.Scale;
                            var s     = GeomUtils.CreateS(scale.X);
                            frameMatrix = frameMatrix * s;
                        }

                        if (sumFrame.Translation != null)
                        {
                            var translation = (Vector3)sumFrame.Translation;
                            var t           = GeomUtils.CreateT(translation);
                            frameMatrix = frameMatrix * t;
                        }

                        var absoluteMatrixValue = sumFrame.AbsoluteMatrix;
                        if (!absoluteMatrixValue)
                        {
                            frameMatrix *= localMatrix;
                        }

                        localMatrix = frameMatrix;
                    }

                    //if (parentMatrix != null)
                    //{
                    worldMatrix = localMatrix * worldMatrix;
                    //_scene.SkeletonBatch.AddLine(Vector3.TransformPosition(Vector3.One, parentMatrix.Value), Vector3.TransformPosition(Vector3.One, worldMatrix), animationObject == selectedAnimationObject ? Color.Blue : Color.Red);
                    //}
                    //else
                    //{
                    //    worldMatrix = localMatrix;
                    //}
                    //if (selectedRootEntity != null)
                    //{
                    var objectId = animationObject.TMDID.GetValueOrDefault();
                    if (objectId > 0)
                    {
                        var models = selectedRootEntity.GetModelsWithTMDID(objectId - 1);
                        foreach (var childModel in models)
                        {
                            childModel.Interpolator    = 0;
                            childModel.InitialVertices = null;
                            childModel.FinalVertices   = null;
                            childModel.InitialNormals  = null;
                            childModel.FinalNormals    = null;
                            childModel.TempMatrix      = worldMatrix;
                            //_scene.MeshBatch.BindModelBatch(childModel, worldMatrix, _scene.TextureBinder);
                        }
                    }

                    //}
                }

                break;
            }
            }
            foreach (var childAnimationObject in animationObject.Children)
            {
                if (!ProcessAnimationObject(childAnimationObject, frameIndex, selectedRootEntity, worldMatrix))
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #4
0
        private Animation ParseAN(BinaryReader reader)
        {
            Animation animation;
            Dictionary <uint, AnimationObject> animationObjects;

            AnimationFrame GetAnimationFrame(AnimationObject animationObject, uint frameTime)
            {
                var animationFrames = animationObject.AnimationFrames;

                if (!animationObject.AnimationFrames.TryGetValue(frameTime, out var animationFrame))
                {
                    animationFrame = new AnimationFrame {
                        FrameTime = frameTime, AnimationObject = animationObject
                    };
                    animationFrames.Add(frameTime, animationFrame);
                }
                if (frameTime >= animation.FrameCount)
                {
                    animation.FrameCount = frameTime + 1;
                }
                return(animationFrame);
            }

            AnimationObject GetAnimationObject(uint objectId)
            {
                if (animationObjects.ContainsKey(objectId))
                {
                    return(animationObjects[objectId]);
                }
                var animationObject = new AnimationObject {
                    Animation = animation, ID = objectId, TMDID = objectId
                };

                animationObjects.Add(objectId, animationObject);
                return(animationObject);
            }

            var version   = reader.ReadByte();
            var numJoints = reader.ReadByte();

            if (numJoints == 0 || numJoints > Program.MaxANJoints)
            {
                return(null);
            }
            var numFrames = reader.ReadUInt16();

            if (numFrames == 0 || numFrames > Program.MaxANFrames)
            {
                return(null);
            }
            var frameRate = reader.ReadUInt16();

            if (frameRate == 0 || frameRate > 60)
            {
                return(null);
            }
            animation        = new Animation();
            animationObjects = new Dictionary <uint, AnimationObject>();
            var rootAnimationObject = new AnimationObject();
            var translationTop      = reader.ReadUInt32();
            var rotationTop         = reader.ReadUInt32();

            for (uint f = 0; f < numFrames; f++)
            {
                for (uint i = 0; i < numJoints; i++)
                {
                    reader.BaseStream.Seek(_offset + translationTop + 64 * f, SeekOrigin.Begin);
                    var animationObject = GetAnimationObject(i);
                    var animationFrame  = GetAnimationFrame(animationObject, f);
                    var x   = reader.ReadUInt16();
                    var y   = reader.ReadUInt16();
                    var z   = reader.ReadUInt16();
                    var pad = reader.ReadUInt16();
                    animationFrame.Translation = new Vector3(x, y, z);
                }
                for (uint i = 0; i < numJoints; i++)
                {
                    reader.BaseStream.Seek(_offset + rotationTop + 64 * f, SeekOrigin.Begin);
                    var animationObject = GetAnimationObject(i);
                    var animationFrame  = GetAnimationFrame(animationObject, f);
                    var x   = reader.ReadUInt16();
                    var y   = reader.ReadUInt16();
                    var z   = reader.ReadUInt16();
                    var pad = reader.ReadUInt16();
                    animationFrame.EulerRotation = new Vector3(x, y, z);
                }
            }
            foreach (var animationObject in animationObjects.Values)
            {
                if (animationObject.ParentID != 0 && animationObjects.ContainsKey(animationObject.ParentID))
                {
                    var parent = animationObjects[animationObject.ParentID];
                    animationObject.Parent = parent;
                    parent.Children.Add(animationObject);
                    continue;
                }
                animationObject.Parent = rootAnimationObject;
                rootAnimationObject.Children.Add(animationObject);
            }
            animation.AnimationType       = AnimationType.Common;
            animation.RootAnimationObject = rootAnimationObject;
            animation.ObjectCount         = animationObjects.Count;
            animation.FPS = frameRate;
            return(animation);
        }
Exemple #5
0
        private Animation ParseTOD(BinaryReader reader)
        {
            Animation animation;
            Dictionary <uint, AnimationObject> animationObjects;

            AnimationFrame GetAnimationFrame(AnimationObject animationObject, uint frameTime)
            {
                var animationFrames = animationObject.AnimationFrames;

                if (animationFrames.ContainsKey(frameTime))
                {
                    return(animationFrames[frameTime]);
                }
                var frame = new AnimationFrame {
                    FrameTime = frameTime, AnimationObject = animationObject
                };

                animationFrames.Add(frameTime, frame);
                return(frame);
            }

            AnimationObject GetAnimationObject(ushort objectId)
            {
                if (animationObjects.ContainsKey(objectId))
                {
                    return(animationObjects[objectId]);
                }
                var animationObject = new AnimationObject {
                    Animation = animation, ID = objectId, TMDID = (uint?)(objectId + 1)
                };

                animationObjects.Add(objectId, animationObject);
                return(animationObject);
            }

            var version    = reader.ReadByte();
            var resolution = reader.ReadUInt16();

            if (resolution == 0)
            {
                return(null);
            }
            var frameCount = reader.ReadUInt32();

            if (frameCount == 0 || frameCount > Program.MaxTODFrames)
            {
                return(null);
            }
            animation = new Animation();
            var rootAnimationObject = new AnimationObject();

            animationObjects = new Dictionary <uint, AnimationObject>();
            for (var f = 0; f < frameCount; f++)
            {
                var frameTop    = reader.BaseStream.Position;
                var frameSize   = reader.ReadUInt16();
                var packetCount = reader.ReadUInt16();
                if (packetCount > Program.MaxTODPackets)
                {
                    return(null);
                }
                var frameNumber = reader.ReadUInt32();
                //if (frameNumber != f)
                //{
                //    return null;
                //}
                if (packetCount == 0 || frameSize == 0)
                {
                    continue;
                    //reader.BaseStream.Position = frameTop + (frameSize * 4);
                }
                for (var p = 0; p < packetCount; p++)
                {
                    var packetTop         = reader.BaseStream.Position;
                    var objectId          = reader.ReadUInt16();
                    var packetTypeAndFlag = reader.ReadByte();
                    var packetType        = (packetTypeAndFlag & 0xF);
                    var flag            = (packetTypeAndFlag & 0xF0) >> 0x4;
                    var packetLength    = reader.ReadByte();
                    var animationObject = GetAnimationObject(objectId);
                    var animationFrame  = GetAnimationFrame(animationObject, frameNumber);
                    switch (packetType)
                    {
                    case 0x01:     //Coordinate
                        var matrixType  = (flag & 0x1);
                        var rotation    = (flag & 0x2) >> 0x1;
                        var scaling     = (flag & 0x4) >> 0x2;
                        var translation = (flag & 0x8) >> 0x3;
                        if (rotation != 0x00)
                        {
                            var rx = (reader.ReadInt32() / 4096f) * GeomUtils.Deg2Rad;
                            var ry = (reader.ReadInt32() / 4096f) * GeomUtils.Deg2Rad;
                            var rz = (reader.ReadInt32() / 4096f) * GeomUtils.Deg2Rad;
                            animationFrame.EulerRotation = new Vector3(rx, ry, rz);
                        }
                        if (scaling != 0x00)
                        {
                            var sx = reader.ReadInt16() / 4096f;
                            var sy = reader.ReadInt16() / 4096f;
                            var sz = reader.ReadInt16() / 4096f;
                            reader.ReadUInt16();
                            animationFrame.Scale = new Vector3(sx, sy, sz);
                        }
                        if (translation != 0x00)
                        {
                            float tx = reader.ReadInt32();
                            float ty = reader.ReadInt32();
                            float tz = reader.ReadInt32();
                            animationFrame.Translation = new Vector3(tx, ty, tz);
                        }
                        animationFrame.AbsoluteMatrix = matrixType == 0x00;
                        //if ((reader.BaseStream.Position - packetTop) / 4 != packetLength)
                        //{
                        //    return null;
                        //}
                        break;

                    case 0x02:     //TMD data ID
                        animationObject.TMDID = reader.ReadUInt16();
                        reader.ReadUInt16();
                        //if ((reader.BaseStream.Position - packetTop) / 4 != packetLength)
                        //{
                        //    return null;
                        //}
                        break;

                    case 0x03:     //Parent Object ID
                        animationObject.ParentID = reader.ReadUInt16();
                        reader.ReadUInt16();
                        //if ((reader.BaseStream.Position - packetTop) / 4 != packetLength)
                        //{
                        //    return null;
                        //}
                        break;

                    case 0x04:
                        float r00 = reader.ReadInt16() / 4096f;
                        float r01 = reader.ReadInt16() / 4096f;
                        float r02 = reader.ReadInt16() / 4096f;

                        float r10 = reader.ReadInt16() / 4096f;
                        float r11 = reader.ReadInt16() / 4096f;
                        float r12 = reader.ReadInt16() / 4096f;

                        float r20 = reader.ReadInt16() / 4096f;
                        float r21 = reader.ReadInt16() / 4096f;
                        float r22 = reader.ReadInt16() / 4096f;

                        reader.ReadInt16();

                        var x = reader.ReadInt32();
                        var y = reader.ReadInt32();
                        var z = reader.ReadInt32();

                        var matrix = new Matrix3(
                            new Vector3(r00, r01, r02),
                            new Vector3(r10, r11, r12),
                            new Vector3(r20, r21, r22)
                            );

                        animationFrame.Translation    = new Vector3(x, y, z);
                        animationFrame.Rotation       = matrix.ExtractRotation();
                        animationFrame.Scale          = matrix.ExtractScale();
                        animationFrame.AbsoluteMatrix = true;

                        //if ((reader.BaseStream.Position - packetTop) / 4 != packetLength)
                        //{
                        //    return null;
                        //}
                        break;

                    default:
                        if (packetType <= 0xF)
                        {
                            reader.BaseStream.Position = packetTop + packetLength * 4;
                            continue;
                        }
                        return(null);
                    }
                }
            }

            foreach (var animationObject in animationObjects.Values)
            {
                if (animationObject.ParentID != 0 && animationObjects.ContainsKey(animationObject.ParentID))
                {
                    var parent = animationObjects[animationObject.ParentID];
                    animationObject.Parent = parent;
                    parent.Children.Add(animationObject);
                    continue;
                }
                animationObject.Parent = rootAnimationObject;
                rootAnimationObject.Children.Add(animationObject);
            }
            animation.RootAnimationObject = rootAnimationObject;
            animation.FrameCount          = frameCount;
            animation.ObjectCount         = animationObjects.Count;
            animation.FPS = 1f / resolution * 60f;
            if (float.IsInfinity(animation.FPS) || animation.FPS % 1 > 0)
            {
                return(null);
            }
            return(animation);
        }