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