Пример #1
0
        public static Root LoadModel(string inputPath, ExportFormat format)
        {
            switch (format)
            {
            case ExportFormat.GR2:
            {
                using (var fs = new FileStream(inputPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    var root = new Root();
                    var gr2  = new GR2Reader(fs);
                    gr2.Read(root);
                    root.PostLoad();
                    return(root);
                }
            }

            case ExportFormat.DAE:
            {
                var  importer = new ColladaImporter();
                Root root     = importer.Import(inputPath);
                return(root);
            }

            default:
                throw new ArgumentException("Invalid model format");
            }
        }
Пример #2
0
 public override void Unserialize(GR2Reader reader)
 {
     Position    = ReadVector3(reader);
     BoneWeights = ReadInfluences2(reader);
     BoneIndices = ReadInfluences2(reader);
     Normal      = ReadVector3(reader);
 }
Пример #3
0
 public override void Unserialize(GR2Reader reader)
 {
     Position            = ReadVector3(reader);
     BoneWeights         = ReadInfluences2(reader);
     BoneIndices         = ReadInfluences2(reader);
     TextureCoordinates0 = ReadVector2(reader);
 }
Пример #4
0
 public override void Unserialize(GR2Reader reader)
 {
     Position            = ReadVector3(reader);
     Normal              = ReadVector3(reader);
     TextureCoordinates0 = ReadVector2(reader);
     TextureCoordinates1 = ReadVector2(reader);
 }
Пример #5
0
 public override void Unserialize(GR2Reader reader)
 {
     Position = ReadVector3(reader);
     Normal   = ReadVector3(reader);
     Tangent  = ReadVector3(reader);
     Binormal = ReadVector3(reader);
 }
Пример #6
0
        protected Vector2 ReadHalfVector2(GR2Reader reader)
        {
            Vector2 v;

            v.X = HalfHelpers.HalfToSingle(reader.Reader.ReadUInt16());
            v.Y = HalfHelpers.HalfToSingle(reader.Reader.ReadUInt16());
            return(v);
        }
Пример #7
0
        public static Vector2 ReadVector2(GR2Reader reader)
        {
            Vector2 v;

            v.X = reader.Reader.ReadSingle();
            v.Y = reader.Reader.ReadSingle();
            return(v);
        }
Пример #8
0
        protected Vector2 ReadVector2(GR2Reader reader)
        {
            Vector2 v;

            v.X = reader.Reader.ReadSingle();
            v.Y = reader.Reader.ReadSingle();
            return(v);
        }
Пример #9
0
        protected Vector3 ReadVector3(GR2Reader reader)
        {
            Vector3 v;

            v.X = reader.Reader.ReadSingle();
            v.Y = reader.Reader.ReadSingle();
            v.Z = reader.Reader.ReadSingle();
            return(v);
        }
Пример #10
0
        public static Vector3 ReadHalfVector3(GR2Reader reader)
        {
            Vector3 v;

            v.X = HalfHelpers.HalfToSingle(reader.Reader.ReadUInt16());
            v.Y = HalfHelpers.HalfToSingle(reader.Reader.ReadUInt16());
            v.Z = HalfHelpers.HalfToSingle(reader.Reader.ReadUInt16());
            return(v);
        }
Пример #11
0
 public override void Unserialize(GR2Reader reader)
 {
     Position            = ReadVector3(reader);
     Normal              = ReadVector3(reader);
     Tangent             = ReadVector3(reader);
     Binormal            = ReadVector3(reader);
     DiffuseColor0       = ReadVector4(reader);
     TextureCoordinates0 = ReadVector2(reader);
 }
Пример #12
0
        public static Vector4 ReadNormalByteVector4(GR2Reader reader)
        {
            Vector4 v;

            v.X = reader.Reader.ReadByte() * 255.0f;
            v.Y = reader.Reader.ReadByte() * 255.0f;
            v.Z = reader.Reader.ReadByte() * 255.0f;
            v.W = reader.Reader.ReadByte() * 255.0f;
            return(v);
        }
Пример #13
0
        public static BoneWeight ReadInfluences(GR2Reader reader)
        {
            BoneWeight v;

            v.A = reader.Reader.ReadByte();
            v.B = reader.Reader.ReadByte();
            v.C = reader.Reader.ReadByte();
            v.D = reader.Reader.ReadByte();
            return(v);
        }
        public static Quaternion ReadBinormalShortVector4(GR2Reader reader)
        {
            Quaternion v = new Quaternion();

            v.X = reader.Reader.ReadInt16() / 32767.0f;
            v.Y = reader.Reader.ReadInt16() / 32767.0f;
            v.Z = reader.Reader.ReadInt16() / 32767.0f;
            v.W = reader.Reader.ReadInt16() / 32767.0f;
            return(v);
        }
Пример #15
0
        public static Vector3 ReadBinormalShortVector4As3(GR2Reader reader)
        {
            Vector3 v;

            v.X = reader.Reader.ReadInt16() / 32767.0f;
            v.Y = reader.Reader.ReadInt16() / 32767.0f;
            v.Z = reader.Reader.ReadInt16() / 32767.0f;
            reader.Reader.ReadInt16();
            return(v);
        }
Пример #16
0
        public static Vector4 ReadVector4(GR2Reader reader)
        {
            Vector4 v;

            v.X = reader.Reader.ReadSingle();
            v.Y = reader.Reader.ReadSingle();
            v.Z = reader.Reader.ReadSingle();
            v.W = reader.Reader.ReadSingle();
            return(v);
        }
Пример #17
0
        protected BoneWeight ReadInfluences(GR2Reader reader)
        {
            BoneWeight v;

            v.A = reader.Reader.ReadByte();
            v.B = reader.Reader.ReadByte();
            v.C = reader.Reader.ReadByte();
            v.D = reader.Reader.ReadByte();
            return(v);
        }
Пример #18
0
        protected Vector4 ReadVector4(GR2Reader reader)
        {
            Vector4 v;

            v.X = reader.Reader.ReadSingle();
            v.Y = reader.Reader.ReadSingle();
            v.Z = reader.Reader.ReadSingle();
            v.W = reader.Reader.ReadSingle();
            return(v);
        }
Пример #19
0
        public object Read(GR2Reader reader, StructDefinition definition, MemberDefinition member, uint arraySize, object parent)
        {
            Type type;

            if (!VertexTypeCache.TryGetValue(parent, out type))
            {
                type = SelectType(member, definition, parent);
                VertexTypeCache.Add(parent, type);
            }

            var vertex = Helpers.CreateInstance(type);

            (vertex as Vertex).Unserialize(reader);
            return(vertex);
        }
Пример #20
0
        public object Read(GR2Reader reader, StructDefinition definition, MemberDefinition member, uint arraySize, object parent)
        {
            VertexDescriptor descriptor;

            if (!VertexTypeCache.TryGetValue(parent, out descriptor))
            {
                descriptor = ConstructDescriptor(member, definition, parent);
                VertexTypeCache.Add(parent, descriptor);
            }

            var vertex = descriptor.CreateInstance();

            vertex.Unserialize(reader);
            return(vertex);
        }
Пример #21
0
        /// <summary>
        /// Opens filename, reading it as a GR2 file and returning back a new suitable name.
        /// Returns an empty string if no suitable name was found.
        /// </summary>
        public static string GetGR2Name(string filename)
        {
            using (var fs = File.OpenRead(filename))
            {
                GR2Reader gr2Reader = new GR2Reader(fs);
                Root      root      = new Root();
                gr2Reader.Read(root);
                gr2Reader.Dispose();

                if (root.Meshes?.Count > 0)
                {
                    return(root.Meshes[0].Name);
                }
                else if (root.Animations?.Count > 0)
                {
                    return($"ANIM_{root.Animations[0].Name}");
                }
                else if (root.Skeletons?.Count > 0)
                {
                    return($"SKELETONS_{root.Skeletons.Count}:{root.Skeletons[0].Bones?.Count}");
                }
                return("");
            }
        }
Пример #22
0
 public override void Unserialize(GR2Reader reader)
 {
     Position = ReadVector3(reader);
 }
        public static Matrix3 ReadQTangent(GR2Reader reader)
        {
            Quaternion qTangent = ReadBinormalShortVector4(reader);

            return(QTangentToMatrix(qTangent));
        }
Пример #24
0
 public void Unserialize(GR2Reader reader)
 {
     VertexSerializationHelpers.Unserialize(reader, this);
 }
        public static void Unserialize(GR2Reader reader, Vertex v)
        {
            var d = v.Format;

            if (d.HasPosition)
            {
                v.Position = ReadVector3(reader);
            }

            if (d.HasBoneWeights)
            {
                if (d.NumBoneInfluences == 2)
                {
                    v.BoneWeights = ReadInfluences2(reader);
                    v.BoneIndices = ReadInfluences2(reader);
                }
                else
                {
                    v.BoneWeights = ReadInfluences(reader);
                    v.BoneIndices = ReadInfluences(reader);
                }
            }

            switch (d.NormalType)
            {
            case NormalType.None: break;

            case NormalType.Float3: v.Normal = ReadVector3(reader); break;

            case NormalType.Half4: v.Normal = ReadHalfVector4As3(reader); break;

            case NormalType.QTangent:
            {
                var qTangent = ReadQTangent(reader);
                v.Normal   = qTangent.Row2;
                v.Tangent  = qTangent.Row1;
                v.Binormal = qTangent.Row0;
                break;
            }
            }

            switch (d.TangentType)
            {
            case NormalType.None: break;

            case NormalType.Float3: v.Tangent = ReadVector3(reader); break;

            case NormalType.Half4: v.Tangent = ReadHalfVector4As3(reader); break;

            case NormalType.QTangent: break;     // Tangent read from QTangent
            }

            switch (d.BinormalType)
            {
            case NormalType.None: break;

            case NormalType.Float3: v.Binormal = ReadVector3(reader); break;

            case NormalType.Half4: v.Binormal = ReadHalfVector4As3(reader); break;

            case NormalType.QTangent: break;     // Binormal read from QTangent
            }

            if (d.ColorMaps > 0)
            {
                for (var i = 0; i < d.ColorMaps; i++)
                {
                    Vector4 color;
                    switch (d.ColorMapType)
                    {
                    case ColorMapType.Float4: color = ReadVector4(reader); break;

                    case ColorMapType.Byte4: color = ReadNormalByteVector4(reader); break;

                    default: throw new Exception($"Cannot unserialize color map: Unsupported format {d.ColorMapType}");
                    }

                    v.SetColor(i, color);
                }
            }

            if (d.TextureCoordinates > 0)
            {
                for (var i = 0; i < d.TextureCoordinates; i++)
                {
                    Vector2 uv;
                    switch (d.TextureCoordinateType)
                    {
                    case TextureCoordinateType.Float2: uv = ReadVector2(reader); break;

                    case TextureCoordinateType.Half2: uv = ReadHalfVector2(reader); break;

                    default: throw new Exception($"Cannot unserialize UV map: Unsupported format {d.TextureCoordinateType}");
                    }

                    v.SetUV(i, uv);
                }
            }
        }
Пример #26
0
        public static void Unserialize(GR2Reader reader, Vertex v)
        {
            var d = v.Format;

            if (d.HasPosition)
            {
                v.Position = ReadVector3(reader);
            }

            if (d.HasBoneWeights)
            {
                if (d.NumBoneInfluences == 2)
                {
                    v.BoneWeights = ReadInfluences2(reader);
                    v.BoneIndices = ReadInfluences2(reader);
                }
                else
                {
                    v.BoneWeights = ReadInfluences(reader);
                    v.BoneIndices = ReadInfluences(reader);
                }
            }

            switch (d.NormalType)
            {
            case NormalType.None: break;

            case NormalType.Float3: v.Normal = ReadVector3(reader); break;

            case NormalType.Half4: v.Normal = ReadHalfVector4As3(reader); break;

            case NormalType.Short4: v.Normal = ReadBinormalShortVector4As3(reader); break;
            }

            switch (d.TangentType)
            {
            case NormalType.None: break;

            case NormalType.Float3: v.Tangent = ReadVector3(reader); break;

            case NormalType.Half4: v.Tangent = ReadHalfVector4As3(reader); break;

            case NormalType.Short4: v.Tangent = ReadBinormalShortVector4As3(reader); break;
            }

            switch (d.BinormalType)
            {
            case NormalType.None: break;

            case NormalType.Float3: v.Binormal = ReadVector3(reader); break;

            case NormalType.Half4: v.Binormal = ReadHalfVector4As3(reader); break;

            case NormalType.Short4: v.Binormal = ReadBinormalShortVector4As3(reader); break;
            }

            switch (d.DiffuseType)
            {
            case DiffuseColorType.None: break;

            case DiffuseColorType.Float4: v.DiffuseColor0 = ReadVector4(reader); break;

            case DiffuseColorType.Byte4: v.DiffuseColor0 = ReadNormalByteVector4(reader); break;
            }

            if (d.TextureCoordinates > 0)
            {
                switch (d.TextureCoordinateType)
                {
                case TextureCoordinateType.None: break;

                case TextureCoordinateType.Float2: v.TextureCoordinates0 = ReadVector2(reader); break;

                case TextureCoordinateType.Half2: v.TextureCoordinates0 = ReadHalfVector2(reader); break;
                }

                if (d.TextureCoordinates > 1)
                {
                    switch (d.TextureCoordinateType)
                    {
                    case TextureCoordinateType.None: break;

                    case TextureCoordinateType.Float2: v.TextureCoordinates1 = ReadVector2(reader); break;

                    case TextureCoordinateType.Half2: v.TextureCoordinates1 = ReadHalfVector2(reader); break;
                    }
                }
            }
        }
Пример #27
0
 public abstract void Unserialize(GR2Reader reader);