using System; using System.Collections.Generic; using System.Windows.Forms; using CodeImp.DoomBuilder.Map; using CodeImp.DoomBuilder.Types; using CodeImp.DoomBuilder.Rendering; using CodeImp.DoomBuilder.GZBuilder.Tools; namespace CodeImp.DoomBuilder.Windows { internal partial class SectorEditFormUDMF : DelayedForm { #region ================== Events public event EventHandler OnValuesChanged; //mxd #endregion #region ================== Variables private ICollection sectors; #endregion #region ================== Constructor public SectorEditFormUDMF() { InitializeComponent(); // Fill flags list foreach(KeyValuePair lf in General.Map.Config.SectorFlags) flags.Add(lf.Value, lf.Key); // Fill effects list effect.AddInfo(General.Map.Config.SortedSectorEffects.ToArray()); // Fill universal fields list fieldslist.ListFixedFields(General.Map.Config.SectorFields); // Initialize image selectors floortex.Initialize(); ceilingtex.Initialize(); // Set steps for brightness field brightness.StepValues = General.Map.Config.BrightnessLevels; // Custom fields? if(!General.Map.FormatInterface.HasCustomFields) tabs.TabPages.Remove(tabcustom); // Initialize custom fields editor fieldslist.Setup("sector"); } #endregion #region ================== Methods // This sets up the form to edit the given sectors public void Setup(ICollection sectors) { Sector sc; // Keep this list this.sectors = sectors; if(sectors.Count > 1) this.Text = "Edit Sectors (" + sectors.Count + ")"; //////////////////////////////////////////////////////////////////////// // Set all options to the first sector properties //////////////////////////////////////////////////////////////////////// // Get first sector sc = General.GetByIndex(sectors, 0); // Flags foreach(CheckBox c in flags.Checkboxes) if(sc.Flags.ContainsKey(c.Tag.ToString())) c.Checked = sc.Flags[c.Tag.ToString()]; // Effects effect.Value = sc.Effect; brightness.Text = sc.Brightness.ToString(); // Floor/ceiling floorheight.Text = sc.FloorHeight.ToString(); ceilingheight.Text = sc.CeilHeight.ToString(); floortex.TextureName = sc.FloorTexture; ceilingtex.TextureName = sc.CeilTexture; //UDMF stuff //Texture offsets ceilOffsets.SetValuesFrom(sc.Fields); floorOffsets.SetValuesFrom(sc.Fields); //Texture scale ceilScale.SetValuesFrom(sc.Fields); floorScale.SetValuesFrom(sc.Fields); //Texture rotation float ceilAngle = sc.Fields.GetValue("rotationceiling", 0.0f); float floorAngle = sc.Fields.GetValue("rotationfloor", 0.0f); ceilRotation.Text = ceilAngle.ToString(); floorRotation.Text = floorAngle.ToString(); ceilAngleControl.Angle = General.ClampAngle(360 - (int)ceilAngle); floorAngleControl.Angle = General.ClampAngle(360 - (int)floorAngle); //Texture brightness ceilBrightness.Text = sc.Fields.GetValue("lightceiling", 0).ToString(); floorBrightness.Text = sc.Fields.GetValue("lightfloor", 0).ToString(); //Alpha ceilAlpha.Text = General.Clamp(sc.Fields.GetValue("alphaceiling", 1.0f), 0f, 1f).ToString(); floorAlpha.Text = General.Clamp(sc.Fields.GetValue("alphafloor", 1.0f), 0f, 1f).ToString(); //Render style ceilRenderStyle.SelectedIndex = (sc.Fields.GetValue("renderstyleceiling", "") == "add" ? 1 : 0); floorRenderStyle.SelectedIndex = (sc.Fields.GetValue("renderstylefloor", "") == "add" ? 1 : 0); //Misc soundSequence.Text = sc.Fields.GetValue("soundsequence", string.Empty); gravity.Text = sc.Fields.GetValue("gravity", 1.0f).ToString(); desaturation.Text = General.Clamp(sc.Fields.GetValue("desaturation", 0.0f), 0f, 1f).ToString(); //Sector colors fadeColor.SetValueFrom(sc.Fields); lightColor.SetValueFrom(sc.Fields); // Action tagSelector.Setup(); //mxd tagSelector.SetTag(sc.Tag);//mxd // Custom fields fieldslist.SetValues(sc.Fields, true); //////////////////////////////////////////////////////////////////////// // Now go for all sectors and change the options when a setting is different //////////////////////////////////////////////////////////////////////// // Go for all sectors foreach(Sector s in sectors) { // Flags foreach(CheckBox c in flags.Checkboxes) { if(s.Flags.ContainsKey(c.Tag.ToString())) { if(s.Flags[c.Tag.ToString()] != c.Checked) { c.ThreeState = true; c.CheckState = CheckState.Indeterminate; } } } // Effects if(s.Effect != effect.Value) effect.Empty = true; if(s.Brightness.ToString() != brightness.Text) brightness.Text = ""; // Floor/Ceiling if(s.FloorHeight.ToString() != floorheight.Text) floorheight.Text = ""; if(s.CeilHeight.ToString() != ceilingheight.Text) ceilingheight.Text = ""; if(s.FloorTexture != floortex.TextureName) floortex.TextureName = ""; if(s.CeilTexture != ceilingtex.TextureName) ceilingtex.TextureName = ""; //mxd. UDMF stuff //Texture offsets ceilOffsets.SetValuesFrom(s.Fields); floorOffsets.SetValuesFrom(s.Fields); //Texture scale ceilScale.SetValuesFrom(s.Fields); floorScale.SetValuesFrom(s.Fields); //Texture rotation if(s.Fields.GetValue("rotationceiling", 0.0f).ToString() != ceilRotation.Text) { ceilRotation.Text = ""; ceilAngleControl.Angle = 0; } if(s.Fields.GetValue("rotationfloor", 0.0f).ToString() != floorRotation.Text) { floorRotation.Text = ""; floorAngleControl.Angle = 0; } //Texture brightness if(s.Fields.GetValue("lightceiling", 0).ToString() != ceilBrightness.Text) ceilBrightness.Text = ""; if(s.Fields.GetValue("lightfloor", 0).ToString() != floorBrightness.Text) floorBrightness.Text = ""; //Alpha if(s.Fields.GetValue("alphaceiling", 1.0f).ToString() != ceilAlpha.Text) ceilAlpha.Text = ""; if(s.Fields.GetValue("alphafloor", 1.0f).ToString() != floorAlpha.Text) floorAlpha.Text = ""; //Render style if(ceilRenderStyle.SelectedIndex != (s.Fields.GetValue("renderstyleceiling", "") == "add" ? 1 : 0)) ceilRenderStyle.SelectedIndex = -1; if(floorRenderStyle.SelectedIndex != (s.Fields.GetValue("renderstylefloor", "") == "add" ? 1 : 0)) floorRenderStyle.SelectedIndex = -1; //Misc if(s.Fields.GetValue("soundsequence", string.Empty) != soundSequence.Text) soundSequence.Text = ""; if(s.Fields.GetValue("gravity", 1.0f).ToString() != gravity.Text) gravity.Text = ""; if(s.Fields.GetValue("desaturation", 0.0f).ToString() != desaturation.Text) desaturation.Text = ""; //Sector colors fadeColor.SetValueFrom(s.Fields); lightColor.SetValueFrom(s.Fields); // Action if(s.Tag != sc.Tag) tagSelector.ClearTag(); //mxd // Custom fields fieldslist.SetValues(s.Fields, false); } // Show sector height UpdateSectorHeight(); } // This updates the sector height field private void UpdateSectorHeight() { bool showheight = true; int delta = 0; Sector first = null; // Check all selected sectors foreach(Sector s in sectors) { if(first == null) { // First sector in list delta = s.CeilHeight - s.FloorHeight; showheight = true; first = s; } else { if(delta != (s.CeilHeight - s.FloorHeight)) { // We can't show heights because the delta // heights for the sectors is different showheight = false; break; } } } if(showheight) { int fh = floorheight.GetResult(first.FloorHeight); int ch = ceilingheight.GetResult(first.CeilHeight); int height = ch - fh; sectorheight.Text = height.ToString(); sectorheight.Visible = true; sectorheightlabel.Visible = true; } else { sectorheight.Visible = false; sectorheightlabel.Visible = false; } } #endregion #region ================== Events private void apply_Click(object sender, EventArgs e) { string undodesc = "sector"; // Verify the tag tagSelector.ValidateTag(); //mxd if((tagSelector.GetTag(0) < General.Map.FormatInterface.MinTag) || (tagSelector.GetTag(0) > General.Map.FormatInterface.MaxTag)) { General.ShowWarningMessage("Sector tag must be between " + General.Map.FormatInterface.MinTag + " and " + General.Map.FormatInterface.MaxTag + ".", MessageBoxButtons.OK); return; } // Verify the effect if((effect.Value < General.Map.FormatInterface.MinEffect) || (effect.Value > General.Map.FormatInterface.MaxEffect)) { General.ShowWarningMessage("Sector effect must be between " + General.Map.FormatInterface.MinEffect + " and " + General.Map.FormatInterface.MaxEffect + ".", MessageBoxButtons.OK); return; } // Make undo if(sectors.Count > 1) undodesc = sectors.Count + " sectors"; General.Map.UndoRedo.CreateUndo("Edit " + undodesc); // Go for all sectors foreach(Sector s in sectors) { // Apply all flags foreach(CheckBox c in flags.Checkboxes) { if(c.CheckState == CheckState.Checked) s.SetFlag(c.Tag.ToString(), true); else if(c.CheckState == CheckState.Unchecked) s.SetFlag(c.Tag.ToString(), false); } // Effects if(!effect.Empty) s.Effect = effect.Value; s.Brightness = General.Clamp(brightness.GetResult(s.Brightness), General.Map.FormatInterface.MinBrightness, General.Map.FormatInterface.MaxBrightness); // Floor/Ceiling s.FloorHeight = floorheight.GetResult(s.FloorHeight); s.CeilHeight = ceilingheight.GetResult(s.CeilHeight); s.SetFloorTexture(floortex.GetResult(s.FloorTexture)); s.SetCeilTexture(ceilingtex.GetResult(s.CeilTexture)); // Action s.Tag = tagSelector.GetTag(s.Tag); //mxd // Custom fields fieldslist.Apply(s.Fields); //mxd. UDMF stuff ceilOffsets.ApplyTo(s.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset); floorOffsets.ApplyTo(s.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset); ceilScale.ApplyTo(s.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset); floorScale.ApplyTo(s.Fields, General.Map.FormatInterface.MinTextureOffset, General.Map.FormatInterface.MaxTextureOffset); //rotation if(ceilRotation.Text != ""){ float angle = General.ClampAngle(ceilRotation.GetResultFloat(0f)); UDMFTools.SetFloat(s.Fields, "rotationceiling", angle, 0f, false); } if(floorRotation.Text != "") { float angle = General.ClampAngle(floorRotation.GetResultFloat(0f)); UDMFTools.SetFloat(s.Fields, "rotationfloor", angle, 0f, false); } //alpha if(ceilAlpha.Text != "") { float ceilAlphaVal = General.Clamp(ceilAlpha.GetResultFloat(1.0f), 0f, 1f); UDMFTools.SetFloat(s.Fields, "alphaceiling", ceilAlphaVal, 1.0f, false); } if(floorAlpha.Text != ""){ float floorAlphaVal = General.Clamp(floorAlpha.GetResultFloat(1.0f), 0f, 1f); UDMFTools.SetFloat(s.Fields, "alphafloor", floorAlphaVal, 1.0f, false); } //renderstyle if(ceilRenderStyle.SelectedIndex == 1) { //add s.Fields["renderstyleceiling"] = new UniValue(UniversalType.String, "add"); } else if(s.Fields.ContainsKey("renderstyleceiling")) { s.Fields.Remove("renderstyleceiling"); } if(floorRenderStyle.SelectedIndex == 1) { //add s.Fields["renderstylefloor"] = new UniValue(UniversalType.String, "add"); } else if(s.Fields.ContainsKey("renderstylefloor")) { s.Fields.Remove("renderstylefloor"); } //brightness if(!string.IsNullOrEmpty(ceilBrightness.Text)) { string key = ceilBrightness.Tag.ToString(); bool absolute = (ceilLightAbsolute.CheckState == CheckState.Checked); int value = General.Clamp(ceilBrightness.GetResult(UDMFTools.GetInteger(s.Fields, key, 0)), (absolute ? 0 : -255), 255); UDMFTools.SetInteger(s.Fields, key, value, 0, false); } if(!string.IsNullOrEmpty(floorBrightness.Text)) { string key = floorBrightness.Tag.ToString(); bool absolute = (floorLightAbsolute.CheckState == CheckState.Checked); int value = General.Clamp(floorBrightness.GetResult(UDMFTools.GetInteger(s.Fields, key, 0)), (absolute ? 0 : -255), 255); UDMFTools.SetInteger(s.Fields, key, value, 0, false); } //Sector colors fadeColor.ApplyTo(s.Fields); lightColor.ApplyTo(s.Fields); //misc if(soundSequence.Text != "") s.Fields["soundsequence"] = new UniValue(UniversalType.String, soundSequence.Text); if(gravity.Text != "") UDMFTools.SetFloat(s.Fields, "alphafloor", gravity.GetResultFloat(1.0f), 1.0f, false); if(desaturation.Text != "") { float val = General.Clamp(desaturation.GetResultFloat(0f), 0f, 1f); UDMFTools.SetFloat(s.Fields, "desaturation", val, 0f, false); } } // Update the used textures General.Map.Data.UpdateUsedTextures(); // Done General.Map.IsChanged = true; //dbg if(OnValuesChanged != null) OnValuesChanged(this, EventArgs.Empty); this.DialogResult = DialogResult.OK; this.Close(); } private void cancel_Click(object sender, EventArgs e) { // Be gone this.DialogResult = DialogResult.Cancel; this.Close(); } private void browseeffect_Click(object sender, EventArgs e) { effect.Value = EffectBrowserForm.BrowseEffect(this, effect.Value); } private void ceilingheight_WhenTextChanged(object sender, EventArgs e) { UpdateSectorHeight(); } private void floorheight_WhenTextChanged(object sender, EventArgs e) { UpdateSectorHeight(); } private void SectorEditFormUDMF_HelpRequested(object sender, HelpEventArgs hlpevent) { General.ShowHelp("w_sectoredit.html"); hlpevent.Handled = true; } private void tabcustom_MouseEnter(object sender, EventArgs e) { fieldslist.Focus(); } private void ceilAngleControl_AngleChanged() { ceilRotation.Text = (General.ClampAngle(360 - ceilAngleControl.Angle)).ToString(); } private void floorAngleControl_AngleChanged() { floorRotation.Text = (General.ClampAngle(360 - floorAngleControl.Angle)).ToString(); } private void floorRotation_WhenTextChanged(object sender, EventArgs e) { floorAngleControl.Angle = General.ClampAngle(360 - floorRotation.GetResult(0)); } private void ceilRotation_WhenTextChanged(object sender, EventArgs e) { ceilAngleControl.Angle = General.ClampAngle(360 - ceilRotation.GetResult(0)); } #endregion } }