예제 #1
0
        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();
        }
예제 #2
0
 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);
     }
 }
예제 #3
0
        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();
        }
예제 #4
0
        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;
                    }
                }
            }
        }
예제 #5
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);
        }
예제 #6
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();
            }
        }