private void btnImportTexture_Click(object sender, EventArgs e) { if (cmbFormat.SelectedIndex == -1 || cmbFormat.SelectedIndex == 4 || cmbRepeatX.SelectedIndex == -1 || cmbRepeatY.SelectedIndex == -1) { return; } try { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Select an image"; DialogResult result = ofd.ShowDialog(); if (result == DialogResult.Cancel) { return; } Bitmap bmp = new Bitmap(ofd.FileName); m_Texture = new Particle.Texture(bmp, cmbFormat.SelectedIndex + 1, (Particle.Texture.RepeatMode)cmbRepeatX.SelectedIndex, (Particle.Texture.RepeatMode)cmbRepeatY.SelectedIndex, 0); } catch (Exception ex) { MessageBox.Show("Failed to load image. Details:\n" + ex.Message, "Failed to image"); } RefreshImage(); PopulatePaletteSettings(); }
private static void SaveTextureAsPNG(Particle.Texture currentTexture, String fileName) { try { currentTexture.m_Tex.ToBitmap().Save(fileName, System.Drawing.Imaging.ImageFormat.Png); } catch (Exception ex) { MessageBox.Show("An error occurred while trying to save the texture.\n\n " + ex.Message + "\n" + ex.Data + "\n" + ex.StackTrace + "\n" + ex.Source); } }
private void replaceSelectedToolStripMenuItem_Click(object sender, EventArgs e) { int texDefID = lbxTexDef.SelectedIndex; // this shouldn't happen but you never know if (texDefID == -1 || cmbFormat.SelectedIndex == -1 || cmbFormat.SelectedIndex == 4 || cmbRepeatX.SelectedIndex == -1 || cmbRepeatY.SelectedIndex == -1) { return; } try { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Select an image"; DialogResult result = ofd.ShowDialog(); if (result == DialogResult.Cancel) { return; } Bitmap bmp = new Bitmap(ofd.FileName); Particle.Texture oldTex = m_TexDefs[texDefID]; m_TexDefs[texDefID].Unload(); m_TexDefs[texDefID] = new Particle.Texture(bmp, cmbFormat.SelectedIndex + 1, (Particle.Texture.RepeatMode)cmbRepeatX.SelectedIndex, (Particle.Texture.RepeatMode)cmbRepeatY.SelectedIndex, lbxTexDef.SelectedIndex); m_TexDefs[texDefID].Load(); /*for (int i = 0; i < oldTex.m_Tex.m_ARGB.Length; i++) * { * Console.WriteLine($"o = {oldTex.m_Tex.m_ARGB[i]}, n = {m_TexDefs[texDefID].m_Tex.m_ARGB[i]}"); * } * Console.WriteLine($"ow = {oldTex.m_Tex.m_Width}, nw = {m_TexDefs[texDefID].m_Tex.m_Width}"); * Console.WriteLine($"oh = {oldTex.m_Tex.m_Height}, nh = {m_TexDefs[texDefID].m_Tex.m_Height}");*/ //Console.WriteLine($" raw: {m_TexDefs[texDefID].m_Tex.m_RawTextureData.Length}"); //Console.WriteLine($"ARGB: {m_TexDefs[texDefID].m_Tex.m_ARGB.Length}"); UpdateParticleTextures(texDefID); } catch (Exception ex) { MessageBox.Show("Failed to load image. Details:\n" + ex.Message, "Failed to image"); } RefreshImage(); PopulatePaletteSettings(); }
private void UpdateParticleTextures(int textureId) { // m_SpriteID contains the previous id, update all of the textures that are still using it Particle.Texture newTexture = m_TexDefs[textureId]; for (int i = 0; i < m_SysDefs.Count; i++) { Particle.System.Def sysDef = m_SysDefs[i]; // main texture Particle.MainInfo info = sysDef.m_MainInfo; if (info.m_Sprite.m_SpriteID == textureId) { info.m_Sprite = newTexture; } // texseq textures if (sysDef.m_TexSeq != null) { Particle.TextureSequence texSeq = sysDef.m_TexSeq; for (int j = 0; j < texSeq.m_Sprites.Length; j++) { if (texSeq.m_Sprites[j] != null && texSeq.m_Sprites[j].m_SpriteID == textureId) { texSeq.m_Sprites[j] = newTexture; } } } // glitter texture if (sysDef.m_Glitter != null) { Particle.Glitter glitter = sysDef.m_Glitter; if (glitter.m_Sprite.m_SpriteID == textureId) { glitter.m_Sprite = newTexture; } } } }
public void LoadTexture() { //Console.WriteLine($"offset = 0x{Convert.ToString(offset, 16)}"); if (m_ParticleTexFile.Read32(0x0) != 0x53505420) { MessageBox.Show(string.Format("This SPT file is invalid."), "Bad texture"); Close(); return; } uint flags = m_ParticleTexFile.Read32(0x04); uint texelArrSize = m_ParticleTexFile.Read32(0x08); uint palOffset = m_ParticleTexFile.Read32(0x0c); uint palSize = m_ParticleTexFile.Read32(0x10); uint totalSize = m_ParticleTexFile.Read32(0x1c); byte[] texels = m_ParticleTexFile.ReadBlock(0x20, texelArrSize); byte[] palette = m_ParticleTexFile.ReadBlock(palOffset, palSize); int width = 1 << (((int)flags >> 4 & 0xf) + 3); int height = 1 << (((int)flags >> 8 & 0xf) + 3); bool color0Transp = ((flags & 0x8) | (flags & 0x10000)) != 0; int type = (int)flags & 0x7; Particle.Texture.RepeatMode repeatX = (flags & 0x4000) != 0 ? Particle.Texture.RepeatMode.FLIP : (flags & 0x1000) != 0 ? Particle.Texture.RepeatMode.REPEAT : Particle.Texture.RepeatMode.CLAMP; Particle.Texture.RepeatMode repeatY = (flags & 0x8000) != 0 ? Particle.Texture.RepeatMode.FLIP : (flags & 0x2000) != 0 ? Particle.Texture.RepeatMode.REPEAT : Particle.Texture.RepeatMode.CLAMP; m_Texture = new Particle.Texture(texels, palette, width, height, (byte)(color0Transp ? 1 : 0), type, repeatX, repeatY, 0); }
private void loadExternalToolStripMenuItem_Click(object sender, EventArgs e) { int texDefID = lbxTexDef.SelectedIndex; // this shouldn't happen but you never know if (texDefID == -1) { return; } m_ROMFileSelect.ReInitialize("Select a SPT file to load", new String[] { ".spt" }); DialogResult result = m_ROMFileSelect.ShowDialog(); if (result != DialogResult.OK) { return; } else { try { NitroFile SPT = Program.m_ROM.GetFileFromName(m_ROMFileSelect.m_SelectedFile); if (SPT.Read32(0x0) != 0x53505420) { throw new Exception("Invalid SPT header."); } uint flags = SPT.Read32(0x04); uint texelArrSize = SPT.Read32(0x08); uint palOffset = SPT.Read32(0x0c); uint palSize = SPT.Read32(0x10); uint totalSize = SPT.Read32(0x1c); byte[] texels = SPT.ReadBlock(0x20, texelArrSize); byte[] palette = SPT.ReadBlock(palOffset, palSize); int width = 1 << (((int)flags >> 4 & 0xf) + 3); int height = 1 << (((int)flags >> 8 & 0xf) + 3); bool color0Transp = ((flags & 0x8) | (flags & 0x10000)) != 0; int type = (int)flags & 0x7; Particle.Texture.RepeatMode repeatX = (flags & 0x4000) != 0 ? Particle.Texture.RepeatMode.FLIP : (flags & 0x1000) != 0 ? Particle.Texture.RepeatMode.REPEAT : Particle.Texture.RepeatMode.CLAMP; Particle.Texture.RepeatMode repeatY = (flags & 0x8000) != 0 ? Particle.Texture.RepeatMode.FLIP : (flags & 0x2000) != 0 ? Particle.Texture.RepeatMode.REPEAT : Particle.Texture.RepeatMode.CLAMP; m_TexDefs[texDefID].Unload(); m_TexDefs[texDefID] = new Particle.Texture(texels, palette, width, height, (byte)(color0Transp ? 1 : 0), type, repeatX, repeatY, texDefID); m_TexDefs[texDefID].Load(); UpdateParticleTextures(texDefID); } catch (Exception ex) { MessageBox.Show("Failed to load external SPT. Details:\n" + ex.Message, "Failed to load SPT"); } RefreshImage(); PopulatePaletteSettings(); } }