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