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:
MaxED 2016-05-04 11:16:17 +00:00
parent 68db725c92
commit 895a7bb719
3 changed files with 88 additions and 67 deletions

View file

@ -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
{

View file

@ -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 + "\"");

View file

@ -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()
{