상속: System.IO.BinaryReader
예제 #1
0
        public static Kn5 FromFile(string filename, IKn5TextureLoader textureLoader = null, IKn5MaterialLoader materialLoader = null,
                                   IKn5NodeLoader nodeLoader = null)
        {
            if (!File.Exists(filename))
            {
                throw new FileNotFoundException(filename);
            }

            var kn5 = new Kn5(filename);

            (textureLoader = textureLoader ?? DefaultKn5TextureLoader.Instance).OnNewKn5(filename);
            (materialLoader = materialLoader ?? DefaultKn5MaterialLoader.Instance).OnNewKn5(filename);
            (nodeLoader = nodeLoader ?? DefaultKn5NodeLoader.Instance).OnNewKn5(filename);

            using (var reader = new Kn5Reader(filename)) {
                kn5.FromFile_Header(reader);
                kn5.FromFile_Textures(reader, textureLoader);
                if (nodeLoader != SkippingNodeLoader.Instance || materialLoader != SkippingMaterialLoader.Instance)
                {
                    kn5.FromFile_Materials(reader, materialLoader);
                    kn5.FromFile_Nodes(reader, nodeLoader);
                }
            }

            return(kn5);
        }
예제 #2
0
        public static Kn5 FromFile(string filename, bool skipTextures, bool readNodesAsBytes = true)
        {
            if (!File.Exists(filename))
            {
                throw new FileNotFoundException(filename);
            }

            var kn5 = new Kn5(filename);

            using (var reader = new Kn5Reader(filename)) {
                kn5.FromFile_Header(reader);

                if (skipTextures)
                {
                    kn5.FromFile_Textures(reader, BlankKn5TextureLoader.Instance);
                }
                else
                {
                    kn5.FromFile_Textures(reader, DefaultKn5TextureLoader.Instance);
                }

                kn5.FromFile_Materials(reader);
                kn5.FromFile_Nodes(reader, readNodesAsBytes);
            }

            return(kn5);
        }
예제 #3
0
        public static Kn5 FromStream(Stream entry, IKn5TextureLoader textureLoader = null)
        {
            var kn5 = new Kn5(string.Empty);

            using (var reader = new Kn5Reader(entry)) {
                kn5.FromFile_Header(reader);
                kn5.FromFile_Textures(reader, textureLoader ?? DefaultKn5TextureLoader.Instance);
                kn5.FromFile_Materials(reader);
                kn5.FromFile_Nodes(reader, false);
            }

            return(kn5);
        }
예제 #4
0
        private void FromFile_Nodes(Kn5Reader reader, bool readAsBytes)
        {
            if (readAsBytes)
            {
                var nodesStart  = reader.BaseStream.Position;
                var nodesLength = reader.BaseStream.Length - nodesStart;
                NodesBytes = reader.ReadBytes((int)nodesLength);
                reader.BaseStream.Seek(nodesStart, SeekOrigin.Begin);
            }

            try {
                RootNode = FromFile_Node(reader);
            } catch (NotImplementedException) {
                RootNode = null;
            }
        }
예제 #5
0
        private void FromFile_Materials(Kn5Reader reader)
        {
            try {
                var count = reader.ReadInt32();

                Materials = new Dictionary <string, Kn5Material>(count);

                for (var i = 0; i < count; i++)
                {
                    var material = reader.ReadMaterial();
                    Materials[material.Name] = material;
                }
            } catch (NotImplementedException) {
                Materials = null;
            }
        }
예제 #6
0
        private static Kn5Node SkipNode(Kn5Reader reader)
        {
            var node     = reader.ReadNodeHierarchy();
            var capacity = node.Children.Capacity;

            try {
                for (var i = 0; i < capacity; i++)
                {
                    node.Children.Add(SkipNode(reader));
                }
            } catch (EndOfStreamException) {
                node.Children.Capacity = node.Children.Count;
            }

            return(node);
        }
예제 #7
0
        private Kn5Node FromFile_Node(Kn5Reader reader)
        {
            var node     = reader.ReadNode();
            var capacity = node.Children.Capacity;

            try {
                for (var i = 0; i < capacity; i++)
                {
                    node.Children.Add(FromFile_Node(reader));
                }
            } catch (EndOfStreamException) {
                node.Children.Capacity = node.Children.Count;
            }

            return(node);
        }
예제 #8
0
        public static Kn5 FromStream(Stream entry, IKn5TextureLoader textureLoader = null, IKn5MaterialLoader materialLoader = null,
                                     IKn5NodeLoader nodeLoader = null)
        {
            var kn5 = new Kn5(string.Empty);

            using (var reader = new Kn5Reader(entry)) {
                kn5.FromFile_Header(reader);
                kn5.FromFile_Textures(reader, textureLoader ?? DefaultKn5TextureLoader.Instance);
                if (nodeLoader != SkippingNodeLoader.Instance || materialLoader != SkippingMaterialLoader.Instance)
                {
                    kn5.FromFile_Materials(reader, materialLoader ?? DefaultKn5MaterialLoader.Instance);
                    kn5.FromFile_Nodes(reader, nodeLoader ?? DefaultKn5NodeLoader.Instance);
                }
            }

            return(kn5);
        }
예제 #9
0
        public static Kn5 FromFile(string filename, IKn5TextureLoader textureLoader = null)
        {
            if (!File.Exists(filename))
            {
                throw new FileNotFoundException(filename);
            }

            var kn5 = new Kn5(filename);

            using (var reader = new Kn5Reader(filename)) {
                kn5.FromFile_Header(reader);
                kn5.FromFile_Textures(reader, textureLoader ?? DefaultKn5TextureLoader.Instance);
                kn5.FromFile_Materials(reader);
                kn5.FromFile_Nodes(reader, false);
            }

            return(kn5);
        }
예제 #10
0
        public static Kn5 FromStream(Stream entry, bool skipTextures = false) {
            var kn5 = new Kn5(string.Empty);

            using (var reader = new Kn5Reader(entry)) {
                kn5.FromFile_Header(reader);

                if (skipTextures) {
                    kn5.FromFile_SkipTextures(reader);
                } else {
                    kn5.FromFile_Textures(reader);
                }

                kn5.FromFile_Materials(reader);
                kn5.FromFile_Nodes(reader);
            }

            return kn5;
        }
예제 #11
0
        private void FromFile_Textures(Kn5Reader reader, [NotNull] IKn5TextureLoader textureLoader)
        {
            try {
                var count = reader.ReadInt32();

                Textures     = new Dictionary <string, Kn5Texture>(count);
                TexturesData = new Dictionary <string, byte[]>(count);

                for (var i = 0; i < count; i++)
                {
                    var texture = reader.ReadTexture();
                    if (texture.Length > 0)
                    {
                        Textures[texture.Name]     = texture;
                        TexturesData[texture.Name] = textureLoader.LoadTexture(texture.Name, reader.BaseStream, texture.Length) ?? new byte[0];
                    }
                }
            } catch (NotImplementedException) {
                Textures     = null;
                TexturesData = null;
            }
        }
예제 #12
0
        public static Kn5 FromFile(string filename, bool skipTextures = false) {
            if (!File.Exists(filename)) {
                throw new FileNotFoundException(filename);
            }

            var kn5 = new Kn5(filename);

            using (var reader = new Kn5Reader(filename)) {
                kn5.FromFile_Header(reader);

                if (skipTextures) {
                    kn5.FromFile_SkipTextures(reader);
                } else {
                    kn5.FromFile_Textures(reader);
                }

                kn5.FromFile_Materials(reader);
                kn5.FromFile_Nodes(reader);
            }

            return kn5;
        }
예제 #13
0
 private void FromFile_Header(Kn5Reader reader)
 {
     Header = reader.ReadHeader();
 }
예제 #14
0
        private Kn5Node FromFile_Node(Kn5Reader reader) {
            var node = reader.ReadNode();
            var capacity = node.Children.Capacity;

            try {
                for (var i = 0; i < capacity; i++) {
                    node.Children.Add(FromFile_Node(reader));
                }
            } catch (EndOfStreamException) {
                node.Children.Capacity = node.Children.Count;
            }

            return node;
        }
예제 #15
0
        private void FromFile_Materials(Kn5Reader reader) {
            try {
                var count = reader.ReadInt32();

                Materials = new Dictionary<string, Kn5Material>(count);

                for (var i = 0; i < count; i++) {
                    var material = reader.ReadMaterial();
                    Materials[material.Name] = material;
                }
            } catch (NotImplementedException) {
                Materials = null;
            }
        }
예제 #16
0
        private void FromFile_Textures(Kn5Reader reader) {
            try {
                var count = reader.ReadInt32();

                Textures = new Dictionary<string, Kn5Texture>(count);
                TexturesData = new Dictionary<string, byte[]>(count);

                for (var i = 0; i < count; i++) {
                    var texture = reader.ReadTexture();
                    if (!Textures.ContainsKey(texture.Name)) {
                        Textures[texture.Name] = texture;
                        TexturesData[texture.Name] = reader.ReadBytes(texture.Length);
                    } else {
                        reader.BaseStream.Seek(texture.Length, SeekOrigin.Current);
                    }
                }
            } catch (NotImplementedException) {
                Textures = null;
                TexturesData = null;
            }
        }
예제 #17
0
 private void FromFile_Header(Kn5Reader reader) {
     Header = reader.ReadHeader();
 }
예제 #18
0
 public void LoadTexturesFrom(string filename) {
     using (var reader = new Kn5Reader(filename)) {
         reader.ReadHeader();
         FromFile_Textures(reader);
     }
 }
예제 #19
0
 private void FromFile_Nodes(Kn5Reader reader, [NotNull] IKn5NodeLoader nodeLoader)
 {
     NodeLoader = nodeLoader;
     RootNode   = nodeLoader.LoadNode(reader);
 }
예제 #20
0
        private void FromFile_Nodes(Kn5Reader reader) {
            var nodesStart = reader.BaseStream.Position;
            var nodesLength = reader.BaseStream.Length - nodesStart;
            NodesBytes = reader.ReadBytes((int)nodesLength);
            reader.BaseStream.Seek(nodesStart, SeekOrigin.Begin);

            try {
                RootNode = FromFile_Node(reader);
            } catch (NotImplementedException) {
                RootNode = null;
            }
        }