/// <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.InMemoryImage(_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.InMemoryImage(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.InMemoryImage(content); if (!imimg.IsValid) { throw new ArgumentException($"{nameof(content)} must be a PNG, JPG, DDS or WEBP image", nameof(content)); } string imageType = imimg.MimeType; _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.InMemoryImage(_SatelliteImageContent); if (!imimg.IsValid) { throw new InvalidOperationException(); } _uri = System.IO.Path.ChangeExtension(satelliteUri, imimg.FileExtension); writer.WriteAllBytesToEnd(_uri, imimg.GetBuffer()); }