Пример #1
0
        public Texture2D UseTexture(Memory.MemoryImage image, string name = null)
        {
            if (_Device == null)
            {
                throw new InvalidOperationException();
            }

            if (!image.IsValid)
            {
                return(null);
            }

            if (_Textures.TryGetValue(image, out Texture2D tex))
            {
                return(tex);
            }

            using (var m = image.Open())
            {
                tex = Texture2D.FromStream(_Device, m);
                _Disposables.AddDisposable(tex);

                tex.Name = name;

                _Textures[image] = tex;

                return(tex);
            }
        }
Пример #2
0
        /// <summary>
        /// Called internally by the serializer when the image content is to be embedded into the JSON document.
        /// </summary>
        internal void _WriteToInternal()
        {
            if (_SatelliteImageContent == null)
            {
                _WriteAsBufferView(); return;
            }

            var imimg = new Memory.MemoryImage(_SatelliteImageContent);

            _mimeType = imimg.MimeType;
            _uri      = imimg.ToMime64();
        }
Пример #3
0
        private static IReadOnlyDictionary <Material, string> _WriteMaterials(IDictionary <String, BYTES> files, string baseName, IEnumerable <Material> materials)
        {
            // write all image files
            var images = materials
                         .Select(item => item.DiffuseTexture)
                         .Where(item => item.Array != null)
                         .Distinct(new _ArraySegmentEqualityComparer <Byte>());

            bool firstImg = true;

            foreach (var img in images)
            {
                var imimg = new Memory.MemoryImage(img);

                var imgName = firstImg ? baseName : $"{baseName}_{files.Count}.{imimg.FileExtension}";

                files[imgName] = img;

                firstImg = false;
            }

            // write materials

            var mmap = new Dictionary <Material, string>();

            var sb = new StringBuilder();

            foreach (var m in materials)
            {
                mmap[m] = $"Material_{mmap.Count}";

                sb.AppendLine($"newmtl {mmap[m]}");
                sb.AppendLine("illum 2");
                sb.AppendLine(Invariant($"Ka {m.DiffuseColor.X} {m.DiffuseColor.Y} {m.DiffuseColor.Z}"));
                sb.AppendLine(Invariant($"Kd {m.DiffuseColor.X} {m.DiffuseColor.Y} {m.DiffuseColor.Z}"));
                sb.AppendLine(Invariant($"Ks {m.SpecularColor.X} {m.SpecularColor.Y} {m.SpecularColor.Z}"));

                if (m.DiffuseTexture.Array != null)
                {
                    var imgName = files.FirstOrDefault(kvp => kvp.Value.SequenceEqual(m.DiffuseTexture)).Key;
                    sb.AppendLine($"map_Kd {imgName}");
                }

                sb.AppendLine();
            }

            // write material library
            _WriteTextContent(files, baseName + ".mtl", sb);

            return(mmap);
        }
Пример #4
0
        /// <summary>
        /// Initializes this <see cref="Image"/> with an image stored in a <see cref="Byte"/> array.
        /// </summary>
        /// <param name="content">A <see cref="Byte"/> array containing a PNG or JPEG image.</param>
        public void SetSatelliteContent(Byte[] content)
        {
            Guard.NotNull(content, nameof(content));

            var imimg = new Memory.MemoryImage(content);

            if (!imimg.IsValid)
            {
                throw new ArgumentException($"{nameof(content)} must be a PNG, JPG, DDS or WEBP image", nameof(content));
            }

            _DiscardContent();

            this._SatelliteImageContent = content;
        }
Пример #5
0
        /// <summary>
        /// Called internally by the serializer when the image content is to be written as an external file
        /// </summary>
        /// <param name="writer">The satellite asset writer</param>
        /// <param name="satelliteUri">A local satellite URI</param>
        internal void _WriteToSatellite(IO.WriteContext writer, string satelliteUri)
        {
            if (_SatelliteImageContent == null)
            {
                _WriteAsBufferView();
                return;
            }

            _mimeType = null;

            var imimg = new Memory.MemoryImage(_SatelliteImageContent);

            if (!imimg.IsValid)
            {
                throw new InvalidOperationException();
            }

            _uri = System.IO.Path.ChangeExtension(satelliteUri, imimg.FileExtension);
            writer.WriteAllBytesToEnd(_uri, imimg.GetBuffer());
        }
Пример #6
0
        /// <summary>
        /// Creates or reuses an <see cref="Image"/> with the image content set by <paramref name="image"/>
        /// </summary>
        /// <param name="root">The <see cref="ModelRoot"/> root instance.</param>
        /// <param name="image">A buffer containing the bytes of the image file.</param>
        /// <returns>A <see cref="Image"/> instance.</returns>
        public static Image UseImageWithContent(this ModelRoot root, Memory.MemoryImage image)
        {
            Guard.NotNull(root, nameof(root));

            return(root.UseImage(image));
        }