public int LoadFromStream(Stream stream) { if (stream == null) { return(0); } ImageImporter imageImporter = new ImageImporter(); Image image = imageImporter.LoadImageFromStream(stream); GCHandle imageDataGCHandle = GCHandle.Alloc(image.GetImageData(0).Data, GCHandleType.Pinned); IntPtr imageDataIntPtr = imageDataGCHandle.AddrOfPinnedObject(); int glTextureHandle = GL.GenTexture(); GL.Enable(EnableCap.Texture2D); GL.BindTexture(TextureTarget.Texture2D, glTextureHandle); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, image.Width, image.Height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, imageDataIntPtr); GL.BindTexture(TextureTarget.Texture2D, 0); GL.Disable(EnableCap.Texture2D); imageDataGCHandle.Free(); textures.Add(glTextureHandle); return(glTextureHandle); }
private void LoadImage(Stream stream) { try { m_activeImage = m_importer.LoadImageFromStream(stream); m_copy = m_activeImage.Clone(); } catch (Exception) { m_activeImage = null; m_copy = null; //Show a pop up dialog? } }
public static System.Drawing.Image LoadDrawingImageFromStream(Stream stream) { ImageImporter importer = new ImageImporter(); Image img = importer.LoadImageFromStream(stream); DevIL.Unmanaged.ImageInfo data = img.GetImageInfo(); SD.Bitmap bitmap = new SD.Bitmap(data.Width, data.Height, SDI.PixelFormat.Format32bppArgb); SD.Rectangle rect = new SD.Rectangle(0, 0, data.Width, data.Height); SDI.BitmapData bdata = bitmap.LockBits(rect, SDI.ImageLockMode.WriteOnly, SDI.PixelFormat.Format32bppArgb); DevIL.Unmanaged.IL.CopyPixels(0, 0, 0, data.Width, data.Height, 1, DataFormat.BGRA, DevIL.DataType.UnsignedByte, bdata.Scan0); bitmap.UnlockBits(bdata); return((SD.Image)bitmap); }
/// <summary> /// Exports all textures to the directory specified. /// </summary> /// <param name="dir">Directory where all textures should be extracted.</param> /// <param name="mode">Mode of extraction. Range: ".dds", ".png", ".jpg", ".tiff", ".bmp".</param> /// <returns>True if export was successful.</returns> public override bool ExportTextures(string dir, string mode) { ImageType type; switch (mode) { case ".dds": type = ImageType.Dds; break; case ".png": type = ImageType.Png; break; case ".jpg": type = ImageType.Jpg; break; case ".tiff": type = ImageType.Tiff; break; case ".bmp": type = ImageType.Bmp; break; default: if (Process.MessageShow) { MessageBox.Show("Export mode provided is not supported.", "Warning"); } else { Console.WriteLine("Export mode provided is not supported."); } return(false); } if (!Directory.Exists(dir)) { if (Process.MessageShow) { MessageBox.Show("Directory provided does not exist.", "Warning"); } else { Console.WriteLine("Directory provided does not exist."); } return(false); } try { foreach (var tpk in this.TPKBlocks.Collections) { string tpkdir = tpk.CollectionName.Substring(2, tpk.CollectionName.Length - 2); tpkdir = Path.Combine(dir, tpkdir); if (!Directory.Exists(tpkdir)) { Directory.CreateDirectory(tpkdir); } foreach (var tex in tpk.Textures) { string texdir = Path.Combine(tpkdir, tex.CollectionName); texdir += mode; var data = tex.GetDDSArray(); if (mode == ".dds") { using (var bw = new BinaryWriter(File.Open(texdir, FileMode.Create))) { bw.Write(data); } } else { using (var sr = new MemoryStream(data)) using (var im = new ImageImporter()) using (var ex = new ImageExporter()) { using (var image = im.LoadImageFromStream(sr)) { ex.SaveImage(image, type, texdir); } } } } } return(true); } catch (Exception e) { if (Process.MessageShow) { MessageBox.Show(e.Message, "Warning"); } else { Console.WriteLine($"{e.Message}"); } return(false); } }
/// <summary> /// Attemps to export <see cref="Texture"/> specified to the path and mode provided. /// </summary> /// <param name="key">Key of the Collection Name of the <see cref="Texture"/> to be exported.</param> /// <param name="type">Type of the key passed.</param> /// <param name="path">Path where the texture should be exported.</param> /// <param name="mode">Mode in which export the texture. Range: ".dds", ".png", ".jpg", ".tiff", ".bmp".</param> /// <param name="error">Error occured when trying to clone a texture.</param> /// <returns>True if texture export was successful, false otherwise.</returns> public override bool TryExportTexture(uint key, eKeyType type, string path, string mode, out string error) { error = null; ImageType ddstype; switch (mode) { case ".dds": ddstype = ImageType.Dds; break; case ".png": ddstype = ImageType.Png; break; case ".jpg": ddstype = ImageType.Jpg; break; case ".tiff": ddstype = ImageType.Tiff; break; case ".bmp": ddstype = ImageType.Bmp; break; default: error = $"{mode} is not a supported image type that can be exported."; return(false); } var tex = (Texture)this.FindTexture(key, type); if (tex == null) { error = $"Texture with key 0x{key:X8} does not exist."; return(false); } try { var data = tex.GetDDSArray(); if (mode == ".dds") { using (var bw = new BinaryWriter(File.Open(path, FileMode.Create))) { bw.Write(data); } } else { using (var sr = new MemoryStream(data)) using (var im = new ImageImporter()) using (var ex = new ImageExporter()) { using (var image = im.LoadImageFromStream(sr)) { ex.SaveImage(image, ddstype, path); } } } return(true); } catch (System.Exception e) { while (e.InnerException != null) { e = e.InnerException; } error = e.Message; return(false); } }
/// <summary> /// Attemps to export <see cref="Texture"/> specified to the path and mode provided. /// </summary> /// <param name="key">Key of the Collection Name of the <see cref="Texture"/> to be exported.</param> /// <param name="type">Type of the key passed.</param> /// <param name="path">Path where the texture should be exported.</param> /// <param name="mode">Mode in which export the texture. Range: ".dds", ".png", ".jpg", ".tiff", ".bmp".</param> /// <returns>True if texture export was successful, false otherwise.</returns> public override bool TryExportTexture(uint key, eKeyType type, string path, string mode) { ImageType ddstype; switch (mode) { case ".dds": ddstype = ImageType.Dds; break; case ".png": ddstype = ImageType.Png; break; case ".jpg": ddstype = ImageType.Jpg; break; case ".tiff": ddstype = ImageType.Tiff; break; case ".bmp": ddstype = ImageType.Bmp; break; default: return(false); } var tex = (Texture)this.FindTexture(key, type); if (tex == null) { return(false); } try { var data = tex.GetDDSArray(); if (mode == ".dds") { using (var bw = new BinaryWriter(File.Open(path, FileMode.Create))) { bw.Write(data); } } else { using (var sr = new MemoryStream(data)) using (var im = new ImageImporter()) using (var ex = new ImageExporter()) { using (var image = im.LoadImageFromStream(sr)) { ex.SaveImage(image, ddstype, path); } } } return(true); } catch (System.Exception) { return(false); } }
public void ExportModelToDirectoryWithExportOptions(Model model, String directory, ExportOptions exportOptions) { //TODO: Figure out what to do with non-version 4 models. if (model != null && model.Version != 4) { return; } NumberFormatInfo format = new NumberFormatInfo(); format.NumberDecimalSeparator = "."; if (exportOptions.Package) { try { DirectoryInfo directoryInfo = Directory.CreateDirectory(directory + @"\" + Path.GetFileNameWithoutExtension(model.Name)); directory = directoryInfo.FullName; } catch (Exception) { } } if (exportOptions.Textures) { ImageImporter imageImporter = new ImageImporter(); ImageExporter imageExporter = new ImageExporter(); foreach (String textureString in model.TextureStrings) { MemoryStream textureMemoryStream = AssetManager.Instance.CreateAssetMemoryStreamByName(textureString); if (textureMemoryStream == null) { continue; } Image textureImage = imageImporter.LoadImageFromStream(textureMemoryStream); if (textureImage == null) { continue; } imageExporter.SaveImage(textureImage, exportOptions.TextureFormat.ImageType, directory + @"\" + Path.GetFileNameWithoutExtension(textureString) + @"." + exportOptions.TextureFormat.Extension); } } String path = directory + @"\" + Path.GetFileNameWithoutExtension(model.Name) + ".obj"; FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write); StreamWriter streamWriter = new StreamWriter(fileStream); for (Int32 i = 0; i < model.Meshes.Length; ++i) { Mesh mesh = model.Meshes[i]; MaterialDefinition materialDefinition = MaterialDefinitionManager.Instance.MaterialDefinitions[model.Materials[(Int32)mesh.MaterialIndex].MaterialDefinitionHash]; VertexLayout vertexLayout = MaterialDefinitionManager.Instance.VertexLayouts[materialDefinition.DrawStyles[0].VertexLayoutNameHash]; //position VertexLayout.Entry.DataTypes positionDataType; Int32 positionOffset; Int32 positionStreamIndex; vertexLayout.GetEntryInfoFromDataUsageAndUsageIndex(VertexLayout.Entry.DataUsages.Position, 0, out positionDataType, out positionStreamIndex, out positionOffset); Mesh.VertexStream positionStream = mesh.VertexStreams[positionStreamIndex]; for (Int32 j = 0; j < mesh.VertexCount; ++j) { Vector3 position = readVector3(exportOptions, positionOffset, positionStream, j); position.X *= exportOptions.Scale.X; position.Y *= exportOptions.Scale.Y; position.Z *= exportOptions.Scale.Z; streamWriter.WriteLine("v " + position.X.ToString(format) + " " + position.Y.ToString(format) + " " + position.Z.ToString(format)); } //texture coordinates if (exportOptions.TextureCoordinates) { VertexLayout.Entry.DataTypes texCoord0DataType; Int32 texCoord0Offset = 0; Int32 texCoord0StreamIndex = 0; Boolean texCoord0Present = vertexLayout.GetEntryInfoFromDataUsageAndUsageIndex(VertexLayout.Entry.DataUsages.Texcoord, 0, out texCoord0DataType, out texCoord0StreamIndex, out texCoord0Offset); if (texCoord0Present) { Mesh.VertexStream texCoord0Stream = mesh.VertexStreams[texCoord0StreamIndex]; for (Int32 j = 0; j < mesh.VertexCount; ++j) { Vector2 texCoord; switch (texCoord0DataType) { case VertexLayout.Entry.DataTypes.Float2: texCoord.X = BitConverter.ToSingle(texCoord0Stream.Data, (j * texCoord0Stream.BytesPerVertex) + 0); texCoord.Y = 1.0f - BitConverter.ToSingle(texCoord0Stream.Data, (j * texCoord0Stream.BytesPerVertex) + 4); break; case VertexLayout.Entry.DataTypes.float16_2: texCoord.X = Half.FromBytes(texCoord0Stream.Data, (j * texCoord0Stream.BytesPerVertex) + texCoord0Offset + 0).ToSingle(); texCoord.Y = 1.0f - Half.FromBytes(texCoord0Stream.Data, (j * texCoord0Stream.BytesPerVertex) + texCoord0Offset + 2).ToSingle(); break; default: texCoord.X = 0; texCoord.Y = 0; break; } streamWriter.WriteLine("vt " + texCoord.X.ToString(format) + " " + texCoord.Y.ToString(format)); } } } } //faces UInt32 vertexCount = 0; for (Int32 i = 0; i < model.Meshes.Length; ++i) { Mesh mesh = model.Meshes[i]; streamWriter.WriteLine("g Mesh" + i); for (Int32 j = 0; j < mesh.IndexCount; j += 3) { UInt32 index0, index1, index2; switch (mesh.IndexSize) { case 2: index0 = vertexCount + BitConverter.ToUInt16(mesh.IndexData, (j * 2) + 0) + 1; index1 = vertexCount + BitConverter.ToUInt16(mesh.IndexData, (j * 2) + 2) + 1; index2 = vertexCount + BitConverter.ToUInt16(mesh.IndexData, (j * 2) + 4) + 1; break; case 4: index0 = vertexCount + BitConverter.ToUInt32(mesh.IndexData, (j * 4) + 0) + 1; index1 = vertexCount + BitConverter.ToUInt32(mesh.IndexData, (j * 4) + 4) + 1; index2 = vertexCount + BitConverter.ToUInt32(mesh.IndexData, (j * 4) + 8) + 1; break; default: index0 = 0; index1 = 0; index2 = 0; break; } if (exportOptions.Normals && exportOptions.TextureCoordinates) { streamWriter.WriteLine("f " + index2 + "/" + index2 + "/" + index2 + " " + index1 + "/" + index1 + "/" + index1 + " " + index0 + "/" + index0 + "/" + index0); } else if (exportOptions.Normals) { streamWriter.WriteLine("f " + index2 + "//" + index2 + " " + index1 + "//" + index1 + " " + index0 + "//" + index0); } else if (exportOptions.TextureCoordinates) { streamWriter.WriteLine("f " + index2 + "/" + index2 + " " + index1 + "/" + index1 + " " + index0 + "/" + index0); } else { streamWriter.WriteLine("f " + index2 + " " + index1 + " " + index0); } } vertexCount += (UInt32)mesh.VertexCount; } streamWriter.Close(); }
public void ExportModelToDirectoryWithExportOptions(Model model, string directory, ModelExportOptions exportOptions) { if (model == null || directory == null || exportOptions == null) { return; } NumberFormatInfo numberFormatInfo = new NumberFormatInfo(); numberFormatInfo.NumberDecimalSeparator = "."; if (exportOptions.Package) { try { DirectoryInfo directoryInfo = Directory.CreateDirectory(directory + @"\" + Path.GetFileNameWithoutExtension(model.Name)); directory = directoryInfo.FullName; } catch (Exception) { } } if (exportOptions.Textures) { ImageImporter imageImporter = new ImageImporter(); ImageExporter imageExporter = new ImageExporter(); foreach (string textureString in model.TextureStrings) { MemoryStream textureMemoryStream = AssetManager.Instance.CreateAssetMemoryStreamByName(textureString); if (textureMemoryStream == null) { continue; } Image textureImage = imageImporter.LoadImageFromStream(textureMemoryStream); if (textureImage == null) { continue; } imageExporter.SaveImage(textureImage, exportOptions.TextureFormat.ImageType, directory + @"\" + Path.GetFileNameWithoutExtension(textureString) + @"." + exportOptions.TextureFormat.Extension); } } string path = string.Format(@"{0}\{1}.{2}", directory, Path.GetFileNameWithoutExtension(model.Name), Extension); FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Write); StreamWriter streamWriter = new StreamWriter(fileStream); for (int i = 0; i < model.Meshes.Length; ++i) { Mesh mesh = model.Meshes[i]; //positions List <Vector3> positions; if (mesh.GetPositions(out positions, 0)) { foreach (Vector3 position in positions) { Vector3 scaledPosition = Vector3.Multiply(position, exportOptions.Scale); streamWriter.WriteLine("v {0} {1} {2}", scaledPosition.X.ToString(numberFormatInfo), scaledPosition.Y.ToString(numberFormatInfo), scaledPosition.Z.ToString(numberFormatInfo)); } } //texture coordinates if (exportOptions.TextureCoordinates) { Vector2[] texCoords; if (mesh.GetTexCoords(out texCoords, 0)) { foreach (Vector2 texcoord in texCoords) { streamWriter.WriteLine("vt {0} {1}", texcoord.X.ToString(numberFormatInfo), (-texcoord.Y).ToString(numberFormatInfo)); } } } //normals if (exportOptions.Normals) { Vector3[] normals; if (mesh.GetNormals(out normals, 0)) { foreach (Vector3 normal in normals) { streamWriter.WriteLine("vn {0} {1} {2}", normal.X.ToString(numberFormatInfo), normal.Y.ToString(numberFormatInfo), normal.Z.ToString(numberFormatInfo)); } } } } //faces uint vertexCount = 0; for (int i = 0; i < model.Meshes.Length; ++i) { Mesh mesh = model.Meshes[i]; streamWriter.WriteLine("g Mesh{0}", i); uint[] indices; mesh.GetIndices(out indices); for (int j = 0; j < mesh.IndexCount; j += 3) { uint index0 = indices[j + 0]; uint index1 = indices[j + 1]; uint index2 = indices[j + 2]; if (exportOptions.TextureCoordinates && exportOptions.Normals) { streamWriter.WriteLine("f {0}/{0}/{0} {1}/{1}/{1} {2}/{2}/{2}", index2, index1, index0); } else if (exportOptions.Normals) { streamWriter.WriteLine("f {0}//{0} {1}//{1} {2}//{2}", index2, index1, index0); } else if (exportOptions.TextureCoordinates) { streamWriter.WriteLine("f {0}/{0} {1}/{1} {2}/{2}", index2, index1, index0); } else { streamWriter.WriteLine("f {0} {1} {2}", index2, index1, index0); } } vertexCount += (uint)mesh.VertexCount; } streamWriter.Close(); }