Example #1
0
        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();
            }
        }