示例#1
0
        private void setEffectNameTSMI_Click(object sender, EventArgs e)
        {
            VisualEffectHandleContainer container = this.outputEffectLST.SelectedItem as VisualEffectHandleContainer;

            if (container != null)
            {
                container.SetEffectName(this.PromptForEffectName(container.Handle.EffectName));
                int index = this.outputEffectLST.SelectedIndex;
                this.outputEffectLST.Items.RemoveAt(index);
                this.outputEffectLST.Items.Insert(index, container);/**/
                //this.outputEffectLST.Invalidate();
            }
        }

        private void LocateMetaReferences(VisualEffectName handle, EffectResource resource,
                                          List <VisualEffectHandleContainer> references)
        {
            MetaparticleEffect[] metaEffects = EffectHelper.FindEffects <MetaparticleEffect>(handle, resource);
            if (metaEffects != null && metaEffects.Length > 0)
            {
                int i, j;
                VisualEffectName dep;
                string           effectName;
                bool             flag = false;
                for (i = 0; i < metaEffects.Length; i++)
                {
                    // compensate for variations in casing
                    effectName = metaEffects[i].ComponentName.ToLowerInvariant();
                    for (j = 0; j < references.Count && !flag; j++)
                    {
                        if (references[j].OriginalName == effectName)
                        {
                            //references[j].Dependents.Add(metaEffects[i]);
                            flag = true;
                        }
                    }
                    if (!flag)
                    {
                        dep = EffectHelper.FindVisualEffectHandle(effectName, resource);
                        if (dep != null)
                        {
                            references.Add(new VisualEffectHandleContainer(
                                               new VisualEffectName(0, null, dep), resource));
                            this.LocateMetaReferences(dep, resource, references);
                        }
                    }
                    flag = false;
                    // compensate for variations in casing
                    effectName = metaEffects[i].ComponentType.ToLowerInvariant();
                    for (j = 0; j < references.Count && !flag; j++)
                    {
                        if (references[j].OriginalName == effectName)
                        {
                            //references[j].Dependents.Add(metaEffects[i]);
                            flag = true;
                        }
                    }
                    if (!flag)
                    {
                        dep = EffectHelper.FindVisualEffectHandle(effectName, resource);
                        if (dep != null)
                        {
                            references.Add(new VisualEffectHandleContainer(
                                               new VisualEffectName(0, null, dep), resource));
                            this.LocateMetaReferences(dep, resource, references);
                        }
                    }
                    flag = false;
                }
            }
        }

        private void LocateSeqReferences(VisualEffectName handle, EffectResource resource,
                                         List <VisualEffectHandleContainer> references)
        {
            SequenceEffect[] seqEffects = EffectHelper.FindEffects <SequenceEffect>(handle, resource);
            if (seqEffects != null && seqEffects.Length > 0)
            {
                int i, j, k;
                VisualEffectName dep;
                SequenceEffect   seqEffect;
                string           effectName;
                bool             flag = false;
                for (i = 0; i < seqEffects.Length; i++)
                {
                    seqEffect = seqEffects[i];
                    for (j = 0; j < seqEffect.Elements.Count; j++)
                    {
                        // compensate for variations in casing
                        effectName = seqEffect.Elements[j].EffectName.ToLowerInvariant();
                        for (k = 0; k < references.Count && !flag; k++)
                        {
                            if (references[k].OriginalName == effectName)
                            {
                                //references[j].Dependents.Add(seqEffects[i]);
                                flag = true;
                            }
                        }
                        if (!flag)
                        {
                            dep = EffectHelper.FindVisualEffectHandle(effectName, resource);
                            if (dep != null)
                            {
                                references.Add(new VisualEffectHandleContainer(
                                                   new VisualEffectName(0, null, dep), resource));
                                this.LocateSeqReferences(dep, resource, references);
                            }
                        }
                        flag = false;
                    }
                }
            }
        }

        private void cloneEffect_Click(object sender, EventArgs e)
        {
            VisualEffectName handle = (this.inputEffectLST.SelectedItem as VisualEffectHandleContainer).Handle;
            EffectResource   owner  = (this.inputEffectLST.SelectedItem as VisualEffectHandleContainer).Owner;

            if (handle != null)
            {
                VisualEffectHandleContainer con;
                foreach (VisualEffectHandleContainer container in this.outputEffectLST.Items)
                {
                    if (container.Handle.Index == handle.Index)
                    {
                        MessageBox.Show("Selected effect has already been cloned.");
                        return;
                    }
                }
                con = new VisualEffectHandleContainer(new VisualEffectName(0, null, handle), owner);
                con.SetEffectName(this.PromptForEffectName(con.OriginalName));
                this.outputEffectLST.Items.Add(con);

                List <VisualEffectHandleContainer> references = new List <VisualEffectHandleContainer>();
                this.LocateMetaReferences(handle, owner, references);
                int metaCount = references.Count;
                this.LocateSeqReferences(handle, owner, references);
                int seqCount = references.Count - metaCount;
                if (references.Count > 0)
                {
                    string format;
                    if (metaCount > 0)
                    {
                        if (seqCount > 0)
                        {
                            format = "{0} has metaparticle and sequence effects.\n";
                        }
                        else
                        {
                            format = "{0} has metaparticle effects.\n";
                        }
                    }
                    else
                    {
                        format = "{0} has sequence effects.\n";
                    }
                    DialogResult result = MessageBox.Show(
                        //string.Concat(handle.EffectName, " has metaparticle and/or sequence effects.\n",
                        string.Concat(string.Format(format, handle.EffectName),
                                      "Would you like to clone all effects referenced by them?"),
                        "Clone Referenced Effects", MessageBoxButtons.YesNo);
                    if (result == System.Windows.Forms.DialogResult.Yes)
                    {
                        for (int i = 0; i < references.Count; i++)
                        {
                            con = references[i];
                            con.SetEffectName(this.PromptForEffectName(con.OriginalName));
                            this.outputEffectLST.Items.Add(con);
                        }
                    }
                }
                this.saveOutputBTN.Enabled  = true;
                this.printOutputBTN.Enabled = true;
            }
        }

        private void removeEffect_Click(object sender, EventArgs e)
        {
            int index = this.outputEffectLST.SelectedIndex;

            if (index >= 0)
            {
                this.outputEffectLST.Items.RemoveAt(index);
            }
            if (this.outputEffectLST.Items.Count == 0)
            {
                this.saveOutputBTN.Enabled  = false;
                this.printOutputBTN.Enabled = false;
            }
        }

        private void saveOutput_Click(object sender, EventArgs e)
        {
            /*if (this.mEffectResource == null)
             * {
             *  MessageBox.Show("Please open an effect file to clone effects from it.");
             *  return;
             * }
             * if (this.outputEffectLST.Items.Count == 0)
             * {
             *  MessageBox.Show("Please select at least one effect from the left list to clone.");
             *  return;
             * }/**/
            using (SaveFileDialog dialog = new SaveFileDialog())
            {
                dialog.Title           = "Save Effect Clone";
                dialog.Filter          = kEffectDialogFilter;
                dialog.AddExtension    = true;
                dialog.OverwritePrompt = true;
                DialogResult result = dialog.ShowDialog();
                if (result == DialogResult.OK)
                {
                    string resName = Path.GetFileNameWithoutExtension(dialog.FileName);
                    ulong  resHash = System.Security.Cryptography.FNV64.GetHash(resName);

                    string fileName  = dialog.FileName;
                    string extension = Path.GetExtension(fileName).ToLowerInvariant();

                    if (extension == ".effects")
                    {
                        resName = kEffectS3piNameHead + resHash.ToString("X16") + "_" + resName
                                  + kEffectS3piNameTail;
                        string prompt = "Would you like to save the effect file as:\n\n" + resName
                                        + "\n\ninstead of:\n\n" + Path.GetFileName(fileName);
                        result = MessageBox.Show(prompt, "Make S3PI File Name?", MessageBoxButtons.YesNo);
                        if (result == DialogResult.Yes)
                        {
                            fileName = dialog.FileName.Replace(Path.GetFileNameWithoutExtension(fileName), resName);
                        }
                        else
                        {
                            fileName = dialog.FileName;
                        }
                    }

                    VisualEffectHandleContainer con;
                    int i, count = this.outputEffectLST.Items.Count;
                    for (i = 0; i < count; i++)
                    {
                        con = this.outputEffectLST.Items[i] as VisualEffectHandleContainer;
                        this.mOutputEffectResBuilder.AddVisualEffect(con.Handle, con.Owner);
                    }
                    this.mOutputEffectResBuilder.FlushEffects();

                    for (i = 0; i < count; i++)
                    {
                        con = this.outputEffectLST.Items[i] as VisualEffectHandleContainer;
                        this.mOutputEffectResBuilder.SetAllEffectReferences(con.OriginalName, con.Handle.EffectName);
                    }
                    //EffectResource output = this.mInputEffectResBuilder.BuildResource();
                    //this.mInputEffectResBuilder.ResetOld();

                    if (extension == ".effects")
                    {
                        using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
                        {
                            this.mOutputEffectResBuilder.UnParse(fileStream);

                            /*Stream stream = output.Stream;
                             * int length = (int)stream.Length;
                             * byte[] buffer = new byte[length];
                             * stream.Read(buffer, 0, length);
                             * fileStream.Write(buffer, 0, length);/**/
                        }
                    }
                    else if (extension == ".package")
                    {
                        // Fail-safe to prevent accidental collision with existing SWB resources
                        //resHash = System.Security.Cryptography.FNV64.GetHash(resName + DateTime.Now.ToString());
                        TGIBlock     effectKey = new TGIBlock(0, null, kEffectTID, kEffectGID, resHash);
                        MemoryStream mStream   = new MemoryStream();
                        this.mOutputEffectResBuilder.UnParse(mStream);

                        TGIBlock nameMapKey = new TGIBlock(0, null, 0x0166038C, 0, 0L);
                        NameMapResource.NameMapResource nameMap
                            = new NameMapResource.NameMapResource(0, null);
                        nameMap.Add(resHash, resName);

                        IPackage effectPackage = s3pi.Package.Package.NewPackage(0);
                        effectPackage.AddResource(effectKey, mStream, false);
                        effectPackage.AddResource(nameMapKey, nameMap.Stream, false);
                        effectPackage.SaveAs(fileName);
                    }
                    this.outputEffectLST.Items.Clear();
                    this.mOutputEffectResBuilder = new EffectResourceBuilder();
                }
            }
        }
示例#2
0
        private void OpenInputEffect(string fileName)
        {
            if (this.outputEffectLST.Items.Count > 0)
            {
                DialogResult result = MessageBox.Show("Discard unsaved changes?", "Alert", MessageBoxButtons.YesNo);
                if (result == System.Windows.Forms.DialogResult.No)
                {
                    return;
                }
            }
            string extension = Path.GetExtension(fileName).ToLowerInvariant();

            if (extension == ".effects")
            {
                using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    this.mEffectResources    = new EffectResource[1];
                    this.mEffectResources[0] = new EffectResource(0, fileStream);
                }
            }
            else if (extension == ".package")
            {
                this.mEffectPackage = s3pi.Package.Package.OpenPackage(0, fileName) as s3pi.Package.Package;
                List <IResourceIndexEntry> effectResources = this.mEffectPackage.FindAll(
                    new Predicate <IResourceIndexEntry>(IsEffectResource));
                if (effectResources == null || effectResources.Count == 0)
                {
                    MessageBox.Show(string.Concat(Path.GetFileName(fileName),
                                                  " does not contain any effect resources."));
                    return;
                }
                this.mEffectResources = new EffectResource[effectResources.Count];
                for (int k = 0; k < effectResources.Count; k++)
                {
                    this.mEffectResources[k] = new EffectResource(0,
                                                                  this.mEffectPackage.GetResource(effectResources[k]));
                }
            }
            else
            {
                MessageBox.Show(string.Concat("Unknown file type: *", extension));
                return;
            }
            this.inputEffectLST.Items.Clear();
            this.outputEffectLST.Items.Clear();
            this.mOutputEffectResBuilder = new EffectResourceBuilder(/*this.mEffectResource/**/);

            EffectResource effectResource;
            int            i, j, count;

            for (i = 0; i < this.mEffectResources.Length; i++)
            {
                effectResource = this.mEffectResources[i];
                count          = effectResource.VisualEffectNames.Count;
                for (j = 0; j < count; j++)
                {
                    this.inputEffectLST.Items.Add(new VisualEffectHandleContainer(
                                                      effectResource.VisualEffectNames[j], effectResource));
                }
            }
            this.printInputBTN.Enabled = true;
        }
示例#3
0
        private void OpenInputEffect(string fileName)
        {
            if (this.outputEffectLST.Items.Count > 0)
            {
                DialogResult result = MessageBox.Show("Discard unsaved changes?", "Alert", MessageBoxButtons.YesNo);
                if (result == System.Windows.Forms.DialogResult.No)
                    return;
            }
            string extension = Path.GetExtension(fileName).ToLowerInvariant();
            if (extension == ".effects")
            {
                using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
                {
                    this.mEffectResources = new EffectResource[1];
                    this.mEffectResources[0] = new EffectResource(0, fileStream);
                }
            }
            else if (extension == ".package")
            {
                this.mEffectPackage = s3pi.Package.Package.OpenPackage(0, fileName) as s3pi.Package.Package;
                List<IResourceIndexEntry> effectResources = this.mEffectPackage.FindAll(
                    new Predicate<IResourceIndexEntry>(IsEffectResource));
                if (effectResources == null || effectResources.Count == 0)
                {
                    MessageBox.Show(string.Concat(Path.GetFileName(fileName),
                        " does not contain any effect resources."));
                    return;
                }
                this.mEffectResources = new EffectResource[effectResources.Count];
                for (int k = 0; k < effectResources.Count; k++)
                {
                    this.mEffectResources[k] = new EffectResource(0,
                        this.mEffectPackage.GetResource(effectResources[k]));
                }
            }
            else
            {
                MessageBox.Show(string.Concat("Unknown file type: *", extension));
                return;
            }
            this.inputEffectLST.Items.Clear();
            this.outputEffectLST.Items.Clear();
            this.mOutputEffectResBuilder = new EffectResourceBuilder(/*this.mEffectResource/**/);

            EffectResource effectResource;
            int i, j, count;
            for (i = 0; i < this.mEffectResources.Length; i++)
            {
                effectResource = this.mEffectResources[i];
                count = effectResource.VisualEffectNames.Count;
                for (j = 0; j < count; j++)
                    this.inputEffectLST.Items.Add(new VisualEffectHandleContainer(
                        effectResource.VisualEffectNames[j], effectResource));
            }
            this.printInputBTN.Enabled = true;
        }
示例#4
0
        private void saveOutput_Click(object sender, EventArgs e)
        {
            /*if (this.mEffectResource == null)
            {
                MessageBox.Show("Please open an effect file to clone effects from it.");
                return;
            }
            if (this.outputEffectLST.Items.Count == 0)
            {
                MessageBox.Show("Please select at least one effect from the left list to clone.");
                return;
            }/**/
            using (SaveFileDialog dialog = new SaveFileDialog())
            {
                dialog.Title = "Save Effect Clone";
                dialog.Filter = kEffectDialogFilter;
                dialog.AddExtension = true;
                dialog.OverwritePrompt = true;
                DialogResult result = dialog.ShowDialog();
                if (result == DialogResult.OK)
                {
                    string resName = Path.GetFileNameWithoutExtension(dialog.FileName);
                    ulong resHash = System.Security.Cryptography.FNV64.GetHash(resName);

                    string fileName = dialog.FileName;
                    string extension = Path.GetExtension(fileName).ToLowerInvariant();

                    if (extension == ".effects")
                    {
                        resName = kEffectS3piNameHead + resHash.ToString("X16") + "_" + resName
                            + kEffectS3piNameTail;
                        string prompt = "Would you like to save the effect file as:\n\n" + resName
                            + "\n\ninstead of:\n\n" + Path.GetFileName(fileName);
                        result = MessageBox.Show(prompt, "Make S3PI File Name?", MessageBoxButtons.YesNo);
                        if (result == DialogResult.Yes)
                            fileName = dialog.FileName.Replace(Path.GetFileNameWithoutExtension(fileName), resName);
                        else
                            fileName = dialog.FileName;
                    }

                    VisualEffectHandleContainer con;
                    int i, count = this.outputEffectLST.Items.Count;
                    for (i = 0; i < count; i++)
                    {
                        con = this.outputEffectLST.Items[i] as VisualEffectHandleContainer;
                        this.mOutputEffectResBuilder.AddVisualEffect(con.Handle, con.Owner);
                    }
                    this.mOutputEffectResBuilder.FlushEffects();

                    for (i = 0; i < count; i++)
                    {
                        con = this.outputEffectLST.Items[i] as VisualEffectHandleContainer;
                        this.mOutputEffectResBuilder.SetAllEffectReferences(con.OriginalName, con.Handle.EffectName);
                    }
                    //EffectResource output = this.mInputEffectResBuilder.BuildResource();
                    //this.mInputEffectResBuilder.ResetOld();

                    if (extension == ".effects")
                    {
                        using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
                        {
                            this.mOutputEffectResBuilder.UnParse(fileStream);
                            /*Stream stream = output.Stream;
                            int length = (int)stream.Length;
                            byte[] buffer = new byte[length];
                            stream.Read(buffer, 0, length);
                            fileStream.Write(buffer, 0, length);/**/
                        }
                    }
                    else if (extension == ".package")
                    {
                        // Fail-safe to prevent accidental collision with existing SWB resources
                        //resHash = System.Security.Cryptography.FNV64.GetHash(resName + DateTime.Now.ToString());
                        TGIBlock effectKey = new TGIBlock(0, null, kEffectTID, kEffectGID, resHash);
                        MemoryStream mStream = new MemoryStream();
                        this.mOutputEffectResBuilder.UnParse(mStream);

                        TGIBlock nameMapKey = new TGIBlock(0, null, 0x0166038C, 0, 0L);
                        NameMapResource.NameMapResource nameMap
                            = new NameMapResource.NameMapResource(0, null);
                        nameMap.Add(resHash, resName);

                        IPackage effectPackage = s3pi.Package.Package.NewPackage(0);
                        effectPackage.AddResource(effectKey, mStream, false);
                        effectPackage.AddResource(nameMapKey, nameMap.Stream, false);
                        effectPackage.SaveAs(fileName);
                    }
                    this.outputEffectLST.Items.Clear();
                    this.mOutputEffectResBuilder = new EffectResourceBuilder();
                }
            }
        }
示例#5
0
 public void SetEffectBuilder(EffectResourceBuilder source)
 {
     if (this.mEffectBuilder != null)
     {
         this.mEffectBuilder.RemoveIndex(this);
     }
     this.mEffectBuilder = new EffectBuilder(this.EffectType, this.ComponentIndex);
     this.mEffectBuilder.Effect = source.GetEffect(this.EffectType, this.ComponentIndex);
     this.mEffectBuilder.AddIndex(this);
 }