mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-23 04:12:12 +00:00
Fixed, MODELDEF parser: negative frame number of FrameIndex definition should be treated as "skip model rendering". Also added some more corner case handling.
Fixed, Sound Environment mode: in some cases the view was not updated after updating sound environments. Added, Sound Environment mode: Sound environment things of currently highlighted sound environment are now highlighted.
This commit is contained in:
parent
68db725c92
commit
895a7bb719
3 changed files with 88 additions and 67 deletions
|
@ -100,6 +100,7 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
md.SetTransform(mrotation, moffset, mds.Scale);
|
||||
|
||||
// Add models
|
||||
int disabledframescount = 0;
|
||||
foreach(var fs in mds.Frames[targetsprite])
|
||||
{
|
||||
// Sanity checks
|
||||
|
@ -109,6 +110,13 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
continue;
|
||||
}
|
||||
|
||||
//INFO: setting frame index to a negative number disables model rendering in GZDoom
|
||||
if(fs.FrameIndex < 0)
|
||||
{
|
||||
disabledframescount++;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Texture name will be empty when skin path is embedded in the model
|
||||
string texturename = (!string.IsNullOrEmpty(mds.TextureNames[fs.ModelIndex]) ? mds.TextureNames[fs.ModelIndex].ToLowerInvariant() : string.Empty);
|
||||
|
||||
|
@ -121,7 +129,9 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
// More sanity checks...
|
||||
if(md.ModelNames.Count == 0)
|
||||
{
|
||||
LogWarning("Model definition \"" + classname + "\" has no defined models");
|
||||
// Show warning only when frames were not delibeartely disabled
|
||||
if(mds.Frames[targetsprite].Count > 0 && disabledframescount < mds.Frames[targetsprite].Count)
|
||||
LogWarning("Model definition \"" + classname + "\" has no defined models");
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -103,18 +103,19 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
parser.SkipWhitespace(true);
|
||||
|
||||
// Model index
|
||||
int index;
|
||||
int index = 0;
|
||||
token = parser.ReadToken();
|
||||
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out index) || index < 0)
|
||||
if(!parser.ReadSignedInt(token, ref index))
|
||||
{
|
||||
// Not numeric!
|
||||
parser.ReportError("Expected model index, but got \"" + token + "\"");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(index >= MAX_MODELS)
|
||||
if(index < 0 || index > MAX_MODELS - 1)
|
||||
{
|
||||
parser.ReportError("GZDoom doesn't allow more than " + MAX_MODELS + " models per MODELDEF entry");
|
||||
// Out of bounds
|
||||
parser.ReportError("Model index must be in [0.." + (MAX_MODELS - 1) + "] range");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -153,18 +154,19 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
parser.SkipWhitespace(true);
|
||||
|
||||
// Skin index
|
||||
int skinindex;
|
||||
int skinindex = 0;
|
||||
token = parser.ReadToken();
|
||||
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out skinindex) || skinindex < 0)
|
||||
if(!parser.ReadSignedInt(token, ref skinindex))
|
||||
{
|
||||
// Not numeric!
|
||||
parser.ReportError("Expected skin index, but got \"" + token + "\"");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(skinindex >= MAX_MODELS)
|
||||
if(skinindex < 0 || skinindex >= MAX_MODELS)
|
||||
{
|
||||
parser.ReportError("GZDoom doesn't allow more than " + MAX_MODELS + " skins per MODELDEF entry");
|
||||
// Out of bounds
|
||||
parser.ReportError("Skin index must be in [0.." + (MAX_MODELS - 1) + "] range");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -333,9 +335,9 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
|
||||
// Model index
|
||||
parser.SkipWhitespace(true);
|
||||
int fimodelindnex;
|
||||
int fimodelindnex = 0;
|
||||
token = parser.ReadToken();
|
||||
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out fimodelindnex))
|
||||
if(!parser.ReadSignedInt(token, ref fimodelindnex))
|
||||
{
|
||||
// Not numeric!
|
||||
parser.ReportError("Expected model index, but got \"" + token + "\"");
|
||||
|
@ -350,9 +352,10 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
|
||||
// Frame number
|
||||
parser.SkipWhitespace(true);
|
||||
int fiframeindnex;
|
||||
int fiframeindnex = 0;
|
||||
token = parser.ReadToken();
|
||||
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out fiframeindnex) || fiframeindnex < 0)
|
||||
//INFO: setting frame index to a negative number disables model rendering in GZDoom
|
||||
if(!parser.ReadSignedInt(token, ref fiframeindnex))
|
||||
{
|
||||
// Not numeric!
|
||||
parser.ReportError("Expected frame index, but got \"" + token + "\"");
|
||||
|
@ -411,9 +414,9 @@ namespace CodeImp.DoomBuilder.ZDoom
|
|||
|
||||
// Model index
|
||||
parser.SkipWhitespace(true);
|
||||
int modelindnex;
|
||||
int modelindnex = 0;
|
||||
token = parser.ReadToken();
|
||||
if(!int.TryParse(token, NumberStyles.Integer, CultureInfo.InvariantCulture, out modelindnex))
|
||||
if(!parser.ReadSignedInt(token, ref modelindnex))
|
||||
{
|
||||
// Not numeric!
|
||||
parser.ReportError("Expected model index, but got \"" + token + "\"");
|
||||
|
|
|
@ -18,15 +18,14 @@
|
|||
#region ================== Namespaces
|
||||
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms;
|
||||
using CodeImp.DoomBuilder.Actions;
|
||||
using CodeImp.DoomBuilder.Geometry;
|
||||
using CodeImp.DoomBuilder.Windows;
|
||||
using CodeImp.DoomBuilder.Controls;
|
||||
using CodeImp.DoomBuilder.Editing;
|
||||
using CodeImp.DoomBuilder.Map;
|
||||
using CodeImp.DoomBuilder.Rendering;
|
||||
using CodeImp.DoomBuilder.Editing;
|
||||
using CodeImp.DoomBuilder.Controls;
|
||||
using CodeImp.DoomBuilder.Windows;
|
||||
|
||||
#endregion
|
||||
|
||||
|
@ -48,6 +47,7 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
// Highlighted item
|
||||
private Sector highlighted;
|
||||
private SoundEnvironment highlightedsoundenvironment;
|
||||
private SoundEnvironment oldhighlightedsoundenvironment; //mxd
|
||||
private Linedef highlightedline; //mxd
|
||||
private Thing highlightedthing; //mxd
|
||||
|
||||
|
@ -236,6 +236,7 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
{
|
||||
panel.HighlightSoundEnvironment(highlightedsoundenvironment); //mxd. Expand highlighted node in the treeview
|
||||
General.Interface.DisplayStatus(StatusType.Ready, "Finished updating sound environments");
|
||||
General.Interface.RedrawDisplay(); //mxd
|
||||
}
|
||||
|
||||
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
|
||||
|
@ -285,7 +286,7 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
|
||||
// Since there will usually be way less blocking linedefs than total linedefs, it's presumably
|
||||
// faster to draw them on their own instead of checking if each linedef is in BlockingLinedefs
|
||||
lock (BuilderPlug.Me.BlockingLinedefs)
|
||||
lock(BuilderPlug.Me.BlockingLinedefs)
|
||||
{
|
||||
foreach(Linedef ld in BuilderPlug.Me.BlockingLinedefs)
|
||||
{
|
||||
|
@ -309,11 +310,20 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
renderer.RenderThingSet(General.Map.ThingsFilter.HiddenThings, General.Settings.HiddenThingsAlpha);
|
||||
renderer.RenderThingSet(General.Map.ThingsFilter.VisibleThings, General.Settings.InactiveThingsAlpha);
|
||||
|
||||
lock (BuilderPlug.Me.SoundEnvironments)
|
||||
lock(BuilderPlug.Me.SoundEnvironments)
|
||||
{
|
||||
foreach(SoundEnvironment se in BuilderPlug.Me.SoundEnvironments)
|
||||
{
|
||||
if(se.Things.Count > 0) renderer.RenderThingSet(se.Things, General.Settings.ActiveThingsAlpha);
|
||||
if(se.Things.Count == 0) continue;
|
||||
if(se == highlightedsoundenvironment)
|
||||
{
|
||||
foreach(Thing t in se.Things)
|
||||
renderer.RenderThing(t, General.Colors.Highlight, General.Settings.ActiveThingsAlpha);
|
||||
}
|
||||
else
|
||||
{
|
||||
renderer.RenderThingSet(se.Things, General.Settings.ActiveThingsAlpha);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -327,7 +337,7 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
// Render overlay geometry (sectors)
|
||||
if(BuilderPlug.Me.OverlayGeometry != null)
|
||||
{
|
||||
lock (BuilderPlug.Me.OverlayGeometry)
|
||||
lock(BuilderPlug.Me.OverlayGeometry)
|
||||
{
|
||||
if(BuilderPlug.Me.OverlayGeometry.Length > 0 && renderer.StartOverlay(true))
|
||||
{
|
||||
|
@ -407,6 +417,13 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
redrawrequired = true;
|
||||
}
|
||||
|
||||
//mxd. Highlighted environment changed?
|
||||
if(oldhighlightedsoundenvironment != highlightedsoundenvironment)
|
||||
{
|
||||
oldhighlightedsoundenvironment = highlightedsoundenvironment;
|
||||
redrawrequired = true;
|
||||
}
|
||||
|
||||
//mxd. Find the nearest thing within default highlight range
|
||||
if(highlightedline == null && highlightedsoundenvironment != null)
|
||||
{
|
||||
|
@ -459,21 +476,50 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
|
||||
// This creates a new thing at the mouse position
|
||||
[BeginAction("insertitem", BaseAction = true)]
|
||||
public virtual void InsertThing()
|
||||
public void InsertThing()
|
||||
{
|
||||
// Mouse in window?
|
||||
if(mouseinside)
|
||||
{
|
||||
// Insert new thing
|
||||
General.Map.UndoRedo.CreateUndo("Insert sound environment thing");
|
||||
Thing t = InsertThing(mousemappos);
|
||||
// Check the boundaries
|
||||
if(mousemappos.x < General.Map.Config.LeftBoundary || mousemappos.x > General.Map.Config.RightBoundary ||
|
||||
mousemappos.y > General.Map.Config.TopBoundary || mousemappos.y < General.Map.Config.BottomBoundary)
|
||||
{
|
||||
General.Interface.DisplayStatus(StatusType.Warning, "Failed to insert thing: outside of map boundaries.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Create undo
|
||||
General.Map.UndoRedo.CreateUndo("Insert sound environment thing");
|
||||
|
||||
// Create thing
|
||||
Thing t = General.Map.Map.CreateThing();
|
||||
if(t == null)
|
||||
{
|
||||
General.Map.UndoRedo.WithdrawUndo();
|
||||
return;
|
||||
}
|
||||
|
||||
General.Settings.ApplyDefaultThingSettings(t);
|
||||
t.Type = BuilderPlug.SOUND_ENVIROMNEMT_THING_TYPE;
|
||||
t.Move(mousemappos);
|
||||
t.UpdateConfiguration();
|
||||
|
||||
// Update things filter so that it includes this thing
|
||||
General.Map.ThingsFilter.Update();
|
||||
|
||||
// Snap to grid enabled?
|
||||
if(General.Interface.SnapToGrid)
|
||||
{
|
||||
// Snap to grid
|
||||
t.SnapToGrid();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Snap to map format accuracy
|
||||
t.SnapToAccuracy();
|
||||
}
|
||||
|
||||
// Add to current sound environment
|
||||
if(highlightedsoundenvironment != null)
|
||||
{
|
||||
|
@ -501,44 +547,6 @@ namespace CodeImp.DoomBuilder.SoundPropagationMode
|
|||
}
|
||||
}
|
||||
|
||||
// This creates a new thing
|
||||
private static Thing InsertThing(Vector2D pos)
|
||||
{
|
||||
if(pos.x < General.Map.Config.LeftBoundary || pos.x > General.Map.Config.RightBoundary ||
|
||||
pos.y > General.Map.Config.TopBoundary || pos.y < General.Map.Config.BottomBoundary)
|
||||
{
|
||||
General.Interface.DisplayStatus(StatusType.Warning, "Failed to insert thing: outside of map boundaries.");
|
||||
return null;
|
||||
}
|
||||
|
||||
// Create thing
|
||||
Thing t = General.Map.Map.CreateThing();
|
||||
if(t != null)
|
||||
{
|
||||
General.Settings.ApplyDefaultThingSettings(t);
|
||||
t.Type = BuilderPlug.SOUND_ENVIROMNEMT_THING_TYPE;
|
||||
t.Move(pos);
|
||||
t.UpdateConfiguration();
|
||||
|
||||
// Update things filter so that it includes this thing
|
||||
General.Map.ThingsFilter.Update();
|
||||
|
||||
// Snap to grid enabled?
|
||||
if(General.Interface.SnapToGrid)
|
||||
{
|
||||
// Snap to grid
|
||||
t.SnapToGrid();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Snap to map format accuracy
|
||||
t.SnapToAccuracy();
|
||||
}
|
||||
}
|
||||
|
||||
return t;
|
||||
}
|
||||
|
||||
[BeginAction("deleteitem", BaseAction = true)]
|
||||
public void DeleteItem()
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue