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