2013-06-25 12:35:13 +00:00
using System ;
using System.Collections.Generic ;
2013-11-21 10:53:11 +00:00
using System.Drawing ;
2013-06-25 12:35:13 +00:00
using System.Windows.Forms ;
2013-11-21 10:53:11 +00:00
using CodeImp.DoomBuilder.GZBuilder.Tools ;
2013-06-25 12:35:13 +00:00
using CodeImp.DoomBuilder.Map ;
using CodeImp.DoomBuilder.Types ;
namespace CodeImp.DoomBuilder.Windows
{
2013-07-10 08:59:17 +00:00
internal partial class SectorEditFormUDMF : DelayedForm
2013-06-25 12:35:13 +00:00
{
2013-07-09 13:13:00 +00:00
#region = = = = = = = = = = = = = = = = = = Events
public event EventHandler OnValuesChanged ; //mxd
#endregion
#region = = = = = = = = = = = = = = = = = = Variables
2013-06-25 12:35:13 +00:00
private ICollection < Sector > sectors ;
2013-07-19 15:30:58 +00:00
private List < SectorProperties > sectorProps ; //mxd
private bool blockUpdate ; //mxd
2013-08-12 10:15:08 +00:00
private StepsList angleSteps ; //mxd
2013-07-19 15:30:58 +00:00
2013-11-21 10:53:11 +00:00
//mxd. Persistent settings
2013-07-19 15:30:58 +00:00
private static bool linkCeilingScale ;
private static bool linkFloorScale ;
2013-08-12 10:15:08 +00:00
private static bool useFloorLineAngles ;
private static bool useCeilLineAngles ;
2013-07-19 15:30:58 +00:00
2013-11-21 10:53:11 +00:00
//mxd. Window setup stuff
private static Point location = Point . Empty ;
private static int activeTab ;
2013-07-19 15:30:58 +00:00
private struct SectorProperties //mxd
{
2014-05-05 14:24:57 +00:00
public readonly int Brightness ;
public readonly int FloorHeight ;
public readonly int CeilHeight ;
public readonly string FloorTexture ;
public readonly string CeilTexture ;
2013-07-19 15:30:58 +00:00
//UDMF stuff
2014-05-05 14:24:57 +00:00
public readonly int LightColor ;
public readonly int FadeColor ;
2013-07-19 15:30:58 +00:00
//public float Desaturation;
//UDMF Ceiling
2014-05-05 14:24:57 +00:00
public readonly float CeilOffsetX ;
public readonly float CeilOffsetY ;
public readonly float CeilScaleX ;
public readonly float CeilScaleY ;
2013-07-19 15:30:58 +00:00
//public float CeilAlpha;
2014-05-05 14:24:57 +00:00
public readonly float CeilRotation ;
public readonly int CeilBrightness ;
public readonly bool CeilLightAbsoulte ;
2013-07-19 15:30:58 +00:00
//UDMF Floor
2014-05-05 14:24:57 +00:00
public readonly float FloorOffsetX ;
public readonly float FloorOffsetY ;
public readonly float FloorScaleX ;
public readonly float FloorScaleY ;
2013-07-19 15:30:58 +00:00
//public float FloorAlpha;
2014-05-05 14:24:57 +00:00
public readonly float FloorRotation ;
public readonly int FloorBrightness ;
public readonly bool FloorLightAbsoulte ;
2013-07-19 15:30:58 +00:00
public SectorProperties ( Sector s ) {
Brightness = s . Brightness ;
FloorHeight = s . FloorHeight ;
CeilHeight = s . CeilHeight ;
FloorTexture = s . FloorTexture ;
CeilTexture = s . CeilTexture ;
//UDMF stuff
LightColor = UDMFTools . GetInteger ( s . Fields , "lightcolor" , 16777215 ) ;
FadeColor = UDMFTools . GetInteger ( s . Fields , "fadecolor" , 0 ) ;
//UDMF Ceiling
CeilOffsetX = UDMFTools . GetFloat ( s . Fields , "xpanningceiling" , 0f ) ;
CeilOffsetY = UDMFTools . GetFloat ( s . Fields , "ypanningceiling" , 0f ) ;
CeilScaleX = UDMFTools . GetFloat ( s . Fields , "xscaleceiling" , 1.0f ) ;
CeilScaleY = UDMFTools . GetFloat ( s . Fields , "yscaleceiling" , 1.0f ) ;
//CeilAlpha = UDMFTools.GetFloat(s.Fields, "alphaceiling", 1.0f);
CeilRotation = s . Fields . GetValue ( "rotationceiling" , 0.0f ) ;
CeilBrightness = s . Fields . GetValue ( "lightceiling" , 0 ) ;
CeilLightAbsoulte = s . Fields . GetValue ( "lightceilingabsolute" , false ) ;
//UDMF Floor
FloorOffsetX = UDMFTools . GetFloat ( s . Fields , "xpanningfloor" , 0f ) ;
FloorOffsetY = UDMFTools . GetFloat ( s . Fields , "ypanningfloor" , 0f ) ;
FloorScaleX = UDMFTools . GetFloat ( s . Fields , "xscalefloor" , 1.0f ) ;
FloorScaleY = UDMFTools . GetFloat ( s . Fields , "yscalefloor" , 1.0f ) ;
//FloorAlpha = UDMFTools.GetFloat(s.Fields, "alphafloor", 1.0f);
FloorRotation = s . Fields . GetValue ( "rotationfloor" , 0.0f ) ;
FloorBrightness = s . Fields . GetValue ( "lightfloor" , 0 ) ;
FloorLightAbsoulte = s . Fields . GetValue ( "lightfloorabsolute" , false ) ;
}
}
2013-07-09 13:13:00 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Constructor
2013-06-25 12:35:13 +00:00
public SectorEditFormUDMF ( ) {
InitializeComponent ( ) ;
2013-11-21 10:53:11 +00:00
//mxd. Widow setup
if ( location ! = Point . Empty ) {
this . StartPosition = FormStartPosition . Manual ;
this . Location = location ;
if ( activeTab > 0 ) tabs . SelectTab ( activeTab ) ;
}
2013-07-10 08:59:17 +00:00
// Fill flags list
foreach ( KeyValuePair < string , string > lf in General . Map . Config . SectorFlags )
flags . Add ( lf . Value , lf . Key ) ;
2014-05-05 14:24:57 +00:00
//mxd. Fill renderstyles
foreach ( KeyValuePair < string , string > lf in General . Map . Config . SectorRenderStyles ) {
floorRenderStyle . Items . Add ( lf . Value ) ;
ceilRenderStyle . Items . Add ( lf . Value ) ;
}
2013-06-25 12:35:13 +00:00
// Fill effects list
effect . AddInfo ( General . Map . Config . SortedSectorEffects . ToArray ( ) ) ;
2013-08-08 11:04:13 +00:00
// Initialize custom fields editor
fieldslist . Setup ( "sector" ) ;
2013-06-25 12:35:13 +00:00
// 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 ;
2013-07-19 15:30:58 +00:00
// Value linking
ceilScale . LinkValues = linkCeilingScale ;
floorScale . LinkValues = linkFloorScale ;
2013-08-12 10:15:08 +00:00
cbUseCeilLineAngles . Checked = useCeilLineAngles ;
cbUseFloorLineAngles . Checked = useFloorLineAngles ;
2013-06-25 12:35:13 +00:00
}
2013-07-09 13:13:00 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Methods
2013-06-25 12:35:13 +00:00
// This sets up the form to edit the given sectors
public void Setup ( ICollection < Sector > sectors ) {
2013-07-19 15:30:58 +00:00
blockUpdate = true ; //mxd
2013-06-25 12:35:13 +00:00
// Keep this list
this . sectors = sectors ;
if ( sectors . Count > 1 ) this . Text = "Edit Sectors (" + sectors . Count + ")" ;
2013-07-19 15:30:58 +00:00
sectorProps = new List < SectorProperties > ( ) ; //mxd
//mxd. Make undo
string undodesc = "sector" ;
if ( sectors . Count > 1 ) undodesc = sectors . Count + " sectors" ;
General . Map . UndoRedo . CreateUndo ( "Edit " + undodesc ) ;
2013-06-25 12:35:13 +00:00
////////////////////////////////////////////////////////////////////////
// Set all options to the first sector properties
////////////////////////////////////////////////////////////////////////
// Get first sector
2013-07-19 15:30:58 +00:00
Sector sc = General . GetByIndex ( sectors , 0 ) ;
2013-06-25 12:35:13 +00:00
2013-07-10 08:59:17 +00:00
// Flags
foreach ( CheckBox c in flags . Checkboxes )
if ( sc . Flags . ContainsKey ( c . Tag . ToString ( ) ) ) c . Checked = sc . Flags [ c . Tag . ToString ( ) ] ;
2013-06-25 12:35:13 +00:00
// 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
2013-07-19 15:30:58 +00:00
ceilOffsets . SetValuesFrom ( sc . Fields , true ) ;
floorOffsets . SetValuesFrom ( sc . Fields , true ) ;
2013-06-25 12:35:13 +00:00
//Texture scale
2013-07-19 15:30:58 +00:00
ceilScale . SetValuesFrom ( sc . Fields , true ) ;
floorScale . SetValuesFrom ( sc . Fields , true ) ;
2013-06-25 12:35:13 +00:00
//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 ( ) ;
2013-07-19 15:30:58 +00:00
ceilLightAbsolute . Checked = sc . Fields . GetValue ( "lightceilingabsolute" , false ) ;
floorLightAbsolute . Checked = sc . Fields . GetValue ( "lightfloorabsolute" , false ) ;
2013-06-25 12:35:13 +00:00
//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
2014-05-05 14:24:57 +00:00
string [ ] rskeys = null ;
if ( General . Map . Config . SectorRenderStyles . Count > 0 ) {
rskeys = new string [ General . Map . Config . SectorRenderStyles . Count ] ;
General . Map . Config . SectorRenderStyles . Keys . CopyTo ( rskeys , 0 ) ;
ceilRenderStyle . SelectedIndex = Array . IndexOf ( rskeys , sc . Fields . GetValue ( "renderstyleceiling" , "translucent" ) ) ;
floorRenderStyle . SelectedIndex = Array . IndexOf ( rskeys , sc . Fields . GetValue ( "renderstylefloor" , "translucent" ) ) ;
} else {
ceilRenderStyle . Enabled = false ;
floorRenderStyle . Enabled = false ;
}
2013-06-25 12:35:13 +00:00
//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
2013-08-28 08:29:06 +00:00
tagSelector . Setup ( UniversalType . SectorTag ) ; //mxd
2013-06-25 12:35:13 +00:00
tagSelector . SetTag ( sc . Tag ) ; //mxd
// Custom fields
fieldslist . SetValues ( sc . Fields , true ) ;
2013-08-12 10:15:08 +00:00
angleSteps = new StepsList ( ) ;
2013-06-25 12:35:13 +00:00
////////////////////////////////////////////////////////////////////////
// Now go for all sectors and change the options when a setting is different
////////////////////////////////////////////////////////////////////////
// Go for all sectors
foreach ( Sector s in sectors ) {
2013-07-10 08:59:17 +00:00
// 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 ;
}
}
}
2013-06-25 12:35:13 +00:00
// 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 = "" ;
2014-03-05 09:21:28 +00:00
if ( s . FloorTexture ! = floortex . TextureName ) {
floortex . MultipleTextures = true ; //mxd
floortex . TextureName = "" ;
}
if ( s . CeilTexture ! = ceilingtex . TextureName ) {
ceilingtex . MultipleTextures = true ; //mxd
ceilingtex . TextureName = "" ;
}
2013-06-25 12:35:13 +00:00
//mxd. UDMF stuff
//Texture offsets
2013-07-19 15:30:58 +00:00
ceilOffsets . SetValuesFrom ( s . Fields , false ) ;
floorOffsets . SetValuesFrom ( s . Fields , false ) ;
2013-06-25 12:35:13 +00:00
//Texture scale
2013-07-19 15:30:58 +00:00
ceilScale . SetValuesFrom ( s . Fields , false ) ;
floorScale . SetValuesFrom ( s . Fields , false ) ;
2013-06-25 12:35:13 +00:00
//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 = "" ;
2013-08-08 11:04:13 +00:00
if ( s . Fields . GetValue ( "lightfloor" , 0 ) . ToString ( ) ! = floorBrightness . Text ) floorBrightness . Text = "" ;
2013-07-19 15:30:58 +00:00
if ( s . Fields . GetValue ( "lightceilingabsolute" , false ) ! = ceilLightAbsolute . Checked ) {
ceilLightAbsolute . ThreeState = true ;
ceilLightAbsolute . CheckState = CheckState . Indeterminate ;
}
if ( s . Fields . GetValue ( "lightfloorabsolute" , false ) ! = floorLightAbsolute . Checked ) {
floorLightAbsolute . ThreeState = true ;
floorLightAbsolute . CheckState = CheckState . Indeterminate ;
}
2013-06-25 12:35:13 +00:00
//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
2014-05-05 14:24:57 +00:00
if ( rskeys ! = null ) {
if ( ceilRenderStyle . SelectedIndex > - 1 & & ceilRenderStyle . SelectedIndex ! = Array . IndexOf ( rskeys , s . Fields . GetValue ( "renderstyleceiling" , "translucent" ) ) )
ceilRenderStyle . SelectedIndex = - 1 ;
if ( floorRenderStyle . SelectedIndex > - 1 & & floorRenderStyle . SelectedIndex ! = Array . IndexOf ( rskeys , s . Fields . GetValue ( "renderstylefloor" , "translucent" ) ) )
floorRenderStyle . SelectedIndex = - 1 ;
}
2013-06-25 12:35:13 +00:00
//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
2013-07-19 15:30:58 +00:00
s . Fields . BeforeFieldsChange ( ) ; //mxd
2013-06-25 12:35:13 +00:00
fieldslist . SetValues ( s . Fields , false ) ;
2013-07-19 15:30:58 +00:00
//mxd. Store initial properties
sectorProps . Add ( new SectorProperties ( s ) ) ;
2013-08-12 10:15:08 +00:00
//mxd. Angle steps
int angle ;
foreach ( Sidedef side in s . Sidedefs ) {
if ( side . Line . Front ! = null & & side . Index = = side . Line . Front . Index )
angle = General . ClampAngle ( 270 - side . Line . AngleDeg ) ;
else
angle = General . ClampAngle ( 90 - side . Line . AngleDeg ) ;
if ( ! angleSteps . Contains ( angle ) ) angleSteps . Add ( angle ) ;
}
2013-06-25 12:35:13 +00:00
}
// Show sector height
UpdateSectorHeight ( ) ;
2013-07-19 15:30:58 +00:00
2013-08-12 10:15:08 +00:00
//mxd. Angle steps
angleSteps . Sort ( ) ;
if ( useCeilLineAngles ) ceilRotation . StepValues = angleSteps ;
if ( useFloorLineAngles ) floorRotation . StepValues = angleSteps ;
2013-07-19 15:30:58 +00:00
blockUpdate = false ; //mxd
2013-06-25 12:35:13 +00:00
}
// This updates the sector height field
private void UpdateSectorHeight ( ) {
int delta = 0 ;
2013-09-17 08:21:12 +00:00
int index = - 1 ; //mxd
int i = 0 ; //mxd
2013-06-25 12:35:13 +00:00
// Check all selected sectors
foreach ( Sector s in sectors ) {
2013-09-17 08:21:12 +00:00
if ( index = = - 1 ) {
2013-06-25 12:35:13 +00:00
// First sector in list
delta = s . CeilHeight - s . FloorHeight ;
2013-09-17 08:21:12 +00:00
index = i ; //mxd
2013-08-12 10:15:08 +00:00
} else if ( delta ! = ( s . CeilHeight - s . FloorHeight ) ) {
// We can't show heights because the delta
// heights for the sectors is different
2013-09-17 08:21:12 +00:00
index = - 1 ;
2013-08-12 10:15:08 +00:00
break ;
2013-06-25 12:35:13 +00:00
}
2013-09-17 08:21:12 +00:00
i + + ;
2013-06-25 12:35:13 +00:00
}
2013-09-17 08:21:12 +00:00
if ( index > - 1 ) {
int fh = floorheight . GetResult ( sectorProps [ index ] . FloorHeight ) ; //mxd
int ch = ceilingheight . GetResult ( sectorProps [ index ] . CeilHeight ) ; //mxd
2013-06-25 12:35:13 +00:00
int height = ch - fh ;
sectorheight . Text = height . ToString ( ) ;
sectorheight . Visible = true ;
sectorheightlabel . Visible = true ;
} else {
sectorheight . Visible = false ;
sectorheightlabel . Visible = false ;
}
}
2013-07-09 13:13:00 +00:00
#endregion
#region = = = = = = = = = = = = = = = = = = Events
2013-06-25 12:35:13 +00:00
private void apply_Click ( object sender , EventArgs e ) {
// 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 ;
}
2014-05-05 14:24:57 +00:00
//mxd
string [ ] rskeys = null ;
if ( General . Map . Config . SectorRenderStyles . Count > 0 ) {
rskeys = new string [ General . Map . Config . SectorRenderStyles . Count ] ;
General . Map . Config . SectorRenderStyles . Keys . CopyTo ( rskeys , 0 ) ;
}
2013-06-25 12:35:13 +00:00
// Go for all sectors
foreach ( Sector s in sectors ) {
2013-07-10 08:59:17 +00:00
// 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 ) ;
}
2013-06-25 12:35:13 +00:00
// Effects
if ( ! effect . Empty ) s . Effect = effect . Value ;
s . Brightness = General . Clamp ( brightness . GetResult ( s . Brightness ) , General . Map . FormatInterface . MinBrightness , General . Map . FormatInterface . MaxBrightness ) ;
// Action
s . Tag = tagSelector . GetTag ( s . Tag ) ; //mxd
2013-08-08 11:04:13 +00:00
//Fields
fieldslist . Apply ( s . Fields ) ;
2013-06-25 12:35:13 +00:00
//alpha
2013-07-19 15:30:58 +00:00
if ( ! string . IsNullOrEmpty ( ceilAlpha . Text ) ) {
float ceilAlphaVal = General . Clamp ( ceilAlpha . GetResultFloat ( s . Fields . GetValue ( "alphaceiling" , 1.0f ) ) , 0f , 1f ) ;
2013-08-10 11:28:51 +00:00
UDMFTools . SetFloat ( s . Fields , "alphaceiling" , ceilAlphaVal , 1.0f ) ;
2013-06-25 12:35:13 +00:00
}
2013-07-19 15:30:58 +00:00
if ( ! string . IsNullOrEmpty ( floorAlpha . Text ) ) {
float floorAlphaVal = General . Clamp ( floorAlpha . GetResultFloat ( s . Fields . GetValue ( "alphafloor" , 1.0f ) ) , 0f , 1f ) ;
2013-08-10 11:28:51 +00:00
UDMFTools . SetFloat ( s . Fields , "alphafloor" , floorAlphaVal , 1.0f ) ;
2013-06-25 12:35:13 +00:00
}
//renderstyle
2014-05-05 14:24:57 +00:00
if ( rskeys ! = null ) {
if ( ceilRenderStyle . SelectedIndex > - 1 ) {
UDMFTools . SetString ( s . Fields , "renderstyleceiling" , rskeys [ ceilRenderStyle . SelectedIndex ] , "translucent" ) ;
}
if ( floorRenderStyle . SelectedIndex > - 1 ) {
UDMFTools . SetString ( s . Fields , "renderstylefloor" , rskeys [ floorRenderStyle . SelectedIndex ] , "translucent" ) ;
}
2013-06-25 12:35:13 +00:00
}
//misc
if ( soundSequence . Text ! = "" ) s . Fields [ "soundsequence" ] = new UniValue ( UniversalType . String , soundSequence . Text ) ;
2013-07-19 15:30:58 +00:00
if ( gravity . Text ! = "" )
2013-08-10 11:28:51 +00:00
UDMFTools . SetFloat ( s . Fields , "gravity" , gravity . GetResultFloat ( s . Fields . GetValue ( "gravity" , 1.0f ) ) , 1.0f ) ;
2013-06-25 12:35:13 +00:00
if ( desaturation . Text ! = "" ) {
2013-07-19 15:30:58 +00:00
float val = General . Clamp ( desaturation . GetResultFloat ( s . Fields . GetValue ( "desaturation" , 0f ) ) , 0f , 1f ) ;
2013-08-10 11:28:51 +00:00
UDMFTools . SetFloat ( s . Fields , "desaturation" , val , 0f ) ;
2013-06-25 12:35:13 +00:00
}
}
// Update the used textures
General . Map . Data . UpdateUsedTextures ( ) ;
2013-07-19 15:30:58 +00:00
// Store value linking
linkCeilingScale = ceilScale . LinkValues ;
linkFloorScale = floorScale . LinkValues ;
2013-08-12 10:15:08 +00:00
useCeilLineAngles = cbUseCeilLineAngles . Checked ;
useFloorLineAngles = cbUseFloorLineAngles . Checked ;
2013-07-19 15:30:58 +00:00
2013-06-25 12:35:13 +00:00
// Done
General . Map . IsChanged = true ;
2013-07-19 15:30:58 +00:00
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ; //mxd
2013-06-25 12:35:13 +00:00
this . DialogResult = DialogResult . OK ;
this . Close ( ) ;
}
private void cancel_Click ( object sender , EventArgs e ) {
2013-07-19 15:30:58 +00:00
//mxd. Let's pretend nothing of this really happened...
General . Map . UndoRedo . WithdrawUndo ( ) ;
2013-06-25 12:35:13 +00:00
// Be gone
this . DialogResult = DialogResult . Cancel ;
this . Close ( ) ;
}
private void browseeffect_Click ( object sender , EventArgs e ) {
effect . Value = EffectBrowserForm . BrowseEffect ( this , effect . Value ) ;
}
2013-11-21 10:53:11 +00:00
//mxd
private void SectorEditFormUDMF_FormClosing ( object sender , FormClosingEventArgs e ) {
location = this . Location ;
activeTab = tabs . SelectedIndex ;
}
2013-06-25 12:35:13 +00:00
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 ( ) ;
}
2013-08-12 10:15:08 +00:00
private void cbUseCeilLineAngles_CheckedChanged ( object sender , EventArgs e ) {
ceilRotation . StepValues = ( cbUseCeilLineAngles . Checked ? angleSteps : null ) ;
}
private void cbUseFloorLineAngles_CheckedChanged ( object sender , EventArgs e ) {
floorRotation . StepValues = ( cbUseFloorLineAngles . Checked ? angleSteps : null ) ;
}
2013-07-19 15:30:58 +00:00
#endregion
#region mxd . Sector Realtime events
private void ceilingheight_WhenTextChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
2013-08-22 15:30:50 +00:00
int i = 0 ;
2013-07-19 15:30:58 +00:00
//restore values
if ( string . IsNullOrEmpty ( ceilingheight . Text ) ) {
foreach ( Sector s in sectors )
s . CeilHeight = sectorProps [ i + + ] . CeilHeight ;
//update values
} else {
foreach ( Sector s in sectors )
2013-08-22 15:30:50 +00:00
s . CeilHeight = ceilingheight . GetResult ( sectorProps [ i + + ] . CeilHeight ) ;
2013-07-19 15:30:58 +00:00
}
2013-09-17 08:21:12 +00:00
UpdateSectorHeight ( ) ;
2013-07-19 15:30:58 +00:00
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void floorheight_WhenTextChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
2013-08-22 15:30:50 +00:00
int i = 0 ;
2013-07-19 15:30:58 +00:00
//restore values
if ( string . IsNullOrEmpty ( floorheight . Text ) ) {
foreach ( Sector s in sectors )
s . FloorHeight = sectorProps [ i + + ] . FloorHeight ;
2013-08-22 15:30:50 +00:00
//update values
2013-07-19 15:30:58 +00:00
} else {
foreach ( Sector s in sectors )
2013-08-22 15:30:50 +00:00
s . FloorHeight = floorheight . GetResult ( sectorProps [ i + + ] . FloorHeight ) ;
2013-07-19 15:30:58 +00:00
}
2013-09-17 08:21:12 +00:00
UpdateSectorHeight ( ) ;
2013-07-19 15:30:58 +00:00
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void brightness_WhenTextChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
2013-08-22 15:30:50 +00:00
int i = 0 ;
2013-07-19 15:30:58 +00:00
//restore values
if ( string . IsNullOrEmpty ( brightness . Text ) ) {
foreach ( Sector s in sectors )
s . Brightness = sectorProps [ i + + ] . Brightness ;
//update values
} else {
//clamp value?
int val = brightness . GetResult ( 0 ) ;
int clampedVal = General . Clamp ( val , 0 , 255 ) ;
if ( val ! = clampedVal ) {
brightness . Text = clampedVal . ToString ( ) ;
return ;
}
foreach ( Sector s in sectors )
2013-08-22 15:30:50 +00:00
s . Brightness = General . Clamp ( brightness . GetResult ( sectorProps [ i + + ] . Brightness ) , General . Map . FormatInterface . MinBrightness , General . Map . FormatInterface . MaxBrightness ) ;
2013-07-19 15:30:58 +00:00
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void ceilingtex_OnValueChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
//restore values
if ( string . IsNullOrEmpty ( ceilingtex . TextureName ) ) {
int i = 0 ;
foreach ( Sector s in sectors )
s . SetCeilTexture ( sectorProps [ i + + ] . CeilTexture ) ;
//update values
} else {
foreach ( Sector s in sectors )
s . SetCeilTexture ( ceilingtex . GetResult ( s . CeilTexture ) ) ;
}
// Update the used textures
General . Map . Data . UpdateUsedTextures ( ) ;
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void floortex_OnValueChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
//restore values
if ( string . IsNullOrEmpty ( floortex . TextureName ) ) {
int i = 0 ;
foreach ( Sector s in sectors )
s . SetFloorTexture ( sectorProps [ i + + ] . FloorTexture ) ;
//update values
} else {
foreach ( Sector s in sectors )
s . SetFloorTexture ( floortex . GetResult ( s . FloorTexture ) ) ;
}
// Update the used textures
General . Map . Data . UpdateUsedTextures ( ) ;
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
2013-06-25 12:35:13 +00:00
private void floorRotation_WhenTextChanged ( object sender , EventArgs e ) {
2013-09-11 14:22:11 +00:00
floorAngleControl . Angle = ( int ) General . ClampAngle ( 360 - floorRotation . GetResultFloat ( 0 ) ) ;
2013-07-19 15:30:58 +00:00
if ( blockUpdate ) return ;
int i = 0 ;
//restore values
if ( string . IsNullOrEmpty ( floorRotation . Text ) ) {
foreach ( Sector s in sectors ) {
2013-08-10 11:28:51 +00:00
UDMFTools . SetFloat ( s . Fields , "rotationfloor" , sectorProps [ i + + ] . FloorRotation , 0f ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
//update values
} else {
foreach ( Sector s in sectors ) {
2013-09-11 14:22:11 +00:00
UDMFTools . SetFloat ( s . Fields , "rotationfloor" , floorRotation . GetResultFloat ( sectorProps [ i + + ] . FloorRotation ) , 0f ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
2013-06-25 12:35:13 +00:00
}
private void ceilRotation_WhenTextChanged ( object sender , EventArgs e ) {
2013-09-11 14:22:11 +00:00
ceilAngleControl . Angle = ( int ) General . ClampAngle ( 360 - ceilRotation . GetResultFloat ( 0 ) ) ;
2013-07-19 15:30:58 +00:00
if ( blockUpdate ) return ;
int i = 0 ;
//restore values
if ( string . IsNullOrEmpty ( ceilRotation . Text ) ) {
foreach ( Sector s in sectors ) {
2013-08-10 11:28:51 +00:00
UDMFTools . SetFloat ( s . Fields , "rotationceiling" , sectorProps [ i + + ] . CeilRotation , 0f ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
//update values
} else {
foreach ( Sector s in sectors ) {
2013-09-11 14:22:11 +00:00
UDMFTools . SetFloat ( s . Fields , "rotationceiling" , ceilRotation . GetResultFloat ( sectorProps [ i + + ] . CeilRotation ) , 0f ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void lightColor_OnValueChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
foreach ( Sector s in sectors ) {
lightColor . ApplyTo ( s . Fields , sectorProps [ i + + ] . LightColor ) ;
s . UpdateNeeded = true ;
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void fadeColor_OnValueChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
foreach ( Sector s in sectors ) {
fadeColor . ApplyTo ( s . Fields , sectorProps [ i + + ] . FadeColor ) ;
s . UpdateNeeded = true ;
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
#endregion
#region mxd . Ceiling / Floor realtime events
private void ceilOffsets_OnValuesChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
foreach ( Sector s in sectors ) {
ceilOffsets . ApplyTo ( s . Fields , General . Map . FormatInterface . MinTextureOffset , General . Map . FormatInterface . MaxTextureOffset , sectorProps [ i ] . CeilOffsetX , sectorProps [ i + + ] . CeilOffsetY ) ;
s . UpdateNeeded = true ;
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void floorOffsets_OnValuesChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
foreach ( Sector s in sectors ) {
floorOffsets . ApplyTo ( s . Fields , General . Map . FormatInterface . MinTextureOffset , General . Map . FormatInterface . MaxTextureOffset , sectorProps [ i ] . FloorOffsetX , sectorProps [ i + + ] . FloorOffsetY ) ;
s . UpdateNeeded = true ;
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void ceilScale_OnValuesChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
foreach ( Sector s in sectors ) {
ceilScale . ApplyTo ( s . Fields , General . Map . FormatInterface . MinTextureOffset , General . Map . FormatInterface . MaxTextureOffset , sectorProps [ i ] . CeilScaleX , sectorProps [ i + + ] . CeilScaleY ) ;
s . UpdateNeeded = true ;
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void floorScale_OnValuesChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
foreach ( Sector s in sectors ) {
floorScale . ApplyTo ( s . Fields , General . Map . FormatInterface . MinTextureOffset , General . Map . FormatInterface . MaxTextureOffset , sectorProps [ i ] . FloorScaleX , sectorProps [ i + + ] . FloorScaleY ) ;
s . UpdateNeeded = true ;
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void ceilBrightness_WhenTextChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
//restore values
if ( string . IsNullOrEmpty ( ceilBrightness . Text ) ) {
foreach ( Sector s in sectors ) {
2013-08-10 11:28:51 +00:00
UDMFTools . SetInteger ( s . Fields , "lightceiling" , sectorProps [ i + + ] . CeilBrightness , 0 ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
//update values
} else {
foreach ( Sector s in sectors ) {
bool absolute = false ;
if ( ceilLightAbsolute . CheckState = = CheckState . Indeterminate ) {
absolute = s . Fields . GetValue ( "lightceilingabsolute" , false ) ;
} else if ( ceilLightAbsolute . CheckState = = CheckState . Checked ) {
absolute = true ;
}
int value = General . Clamp ( ceilBrightness . GetResult ( sectorProps [ i + + ] . CeilBrightness ) , ( absolute ? 0 : - 255 ) , 255 ) ;
2013-08-10 11:28:51 +00:00
UDMFTools . SetInteger ( s . Fields , "lightceiling" , value , 0 ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void floorBrightness_WhenTextChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
int i = 0 ;
//restore values
if ( string . IsNullOrEmpty ( floorBrightness . Text ) ) {
foreach ( Sector s in sectors ) {
2013-08-10 11:28:51 +00:00
UDMFTools . SetInteger ( s . Fields , "lightfloor" , sectorProps [ i + + ] . FloorBrightness , 0 ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
//update values
} else {
foreach ( Sector s in sectors ) {
bool absolute = false ;
if ( floorLightAbsolute . CheckState = = CheckState . Indeterminate ) {
absolute = s . Fields . GetValue ( "lightfloorabsolute" , false ) ;
} else if ( floorLightAbsolute . CheckState = = CheckState . Checked ) {
absolute = true ;
}
int value = General . Clamp ( floorBrightness . GetResult ( sectorProps [ i + + ] . FloorBrightness ) , ( absolute ? 0 : - 255 ) , 255 ) ;
2013-08-10 11:28:51 +00:00
UDMFTools . SetInteger ( s . Fields , "lightfloor" , value , 0 ) ;
2013-07-19 15:30:58 +00:00
s . UpdateNeeded = true ;
}
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void ceilLightAbsolute_CheckedChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
if ( ceilLightAbsolute . Checked ) {
foreach ( Sector s in sectors ) {
s . Fields [ "lightceilingabsolute" ] = new UniValue ( UniversalType . Boolean , true ) ;
s . UpdateNeeded = true ;
}
} else if ( ceilLightAbsolute . CheckState = = CheckState . Indeterminate ) {
int i = 0 ;
foreach ( Sector s in sectors ) {
if ( sectorProps [ i ] . CeilLightAbsoulte ) {
s . Fields [ "lightceilingabsolute" ] = new UniValue ( UniversalType . Boolean , true ) ;
s . UpdateNeeded = true ;
} else if ( s . Fields . ContainsKey ( "lightceilingabsolute" ) ) {
s . Fields . Remove ( "lightceilingabsolute" ) ;
s . UpdateNeeded = true ;
}
i + + ;
}
} else {
foreach ( Sector s in sectors ) {
if ( s . Fields . ContainsKey ( "lightceilingabsolute" ) ) {
s . Fields . Remove ( "lightceilingabsolute" ) ;
s . UpdateNeeded = true ;
}
}
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
}
private void floorLightAbsolute_CheckedChanged ( object sender , EventArgs e ) {
if ( blockUpdate ) return ;
if ( floorLightAbsolute . Checked ) {
foreach ( Sector s in sectors ) {
s . Fields [ "lightfloorabsolute" ] = new UniValue ( UniversalType . Boolean , true ) ;
s . UpdateNeeded = true ;
}
} else if ( floorLightAbsolute . CheckState = = CheckState . Indeterminate ) {
int i = 0 ;
foreach ( Sector s in sectors ) {
if ( sectorProps [ i ] . FloorLightAbsoulte ) {
s . Fields [ "lightfloorabsolute" ] = new UniValue ( UniversalType . Boolean , true ) ;
s . UpdateNeeded = true ;
} else if ( s . Fields . ContainsKey ( "lightfloorabsolute" ) ) {
s . Fields . Remove ( "lightfloorabsolute" ) ;
s . UpdateNeeded = true ;
}
i + + ;
}
} else {
foreach ( Sector s in sectors ) {
if ( s . Fields . ContainsKey ( "lightfloorabsolute" ) ) {
s . Fields . Remove ( "lightfloorabsolute" ) ;
s . UpdateNeeded = true ;
}
}
}
General . Map . IsChanged = true ;
if ( OnValuesChanged ! = null ) OnValuesChanged ( this , EventArgs . Empty ) ;
2013-06-25 12:35:13 +00:00
}
2013-07-09 13:13:00 +00:00
#endregion
2013-07-19 15:30:58 +00:00
2013-06-25 12:35:13 +00:00
}
}