Error checks: PlaneAlign action is now taken into account when checking for missing upper/lower textures.

Several fixes in flat/texture/patch loading and precedence. Texture loading will no longer fail when there's a texture and a flat with the same name.
This commit is contained in:
MaxED 2013-12-02 15:02:01 +00:00
parent cd50592cd5
commit d9439850f7
7 changed files with 151 additions and 114 deletions

View file

@ -93,13 +93,17 @@ namespace CodeImp.DoomBuilder.Config
// Mix the textures and flats // Mix the textures and flats
internal void MixTexturesAndFlats() internal void MixTexturesAndFlats()
{ {
Dictionary<long, ImageData> newflats = new Dictionary<long, ImageData>(); //mxd
// Add flats to textures // Add flats to textures
foreach(KeyValuePair<long, ImageData> f in flats) { foreach(KeyValuePair<long, ImageData> f in flats) {
if(!textures.ContainsKey(f.Key)) if(!textures.ContainsKey(f.Key))
textures.Add(f.Key, f.Value); textures.Add(f.Key, f.Value);
else
newflats.Add(f.Key, f.Value); //mxd
} }
flats.Clear(); //mxd flats = newflats; //mxd
} }
#endregion #endregion

View file

@ -342,32 +342,29 @@ namespace CodeImp.DoomBuilder.Data
} }
} }
// Process flats
foreach(KeyValuePair<long, ImageData> f in flatsonly)
{
flats.Add(f.Key, f.Value);
flatnames.Add(f.Value.Name);
}
// Mixed textures and flats? // Mixed textures and flats?
if(General.Map.Config.MixTexturesFlats) if (General.Map.Config.MixTexturesFlats) {
{
// Add flats to textures // Add flats to textures
foreach(KeyValuePair<long, ImageData> f in flatsonly) foreach (KeyValuePair<long, ImageData> f in flatsonly) {
{ if (!textures.ContainsKey(f.Key)) {
if(!textures.ContainsKey(f.Key))
{
textures.Add(f.Key, f.Value); textures.Add(f.Key, f.Value);
texturenames.Add(f.Value.Name); texturenames.Add(f.Value.Name);
} else {
//mxd. If there are flats with the same name as textures - add them to flats
flats.Add(f.Key, f.Value);
flatnames.Add(f.Value.Name);
} }
} }
flats.Clear(); //mxd
flatnames.Clear(); //mxd
// Do the same on the data readers // Do the same on the data readers
foreach(DataReader dr in containers) foreach (DataReader dr in containers)
dr.TextureSet.MixTexturesAndFlats(); dr.TextureSet.MixTexturesAndFlats();
} else {
// Process flats
foreach(KeyValuePair<long, ImageData> f in flatsonly) {
flats.Add(f.Key, f.Value);
flatnames.Add(f.Value.Name);
}
} }
// Sort names // Sort names
@ -704,11 +701,9 @@ namespace CodeImp.DoomBuilder.Data
} }
// Set used on all flats // Set used on all flats
if(!General.Map.Config.MixTexturesFlats) { foreach(KeyValuePair<long, ImageData> i in flats) {
foreach(KeyValuePair<long, ImageData> i in flats) { i.Value.SetUsedInMap(usedimages.ContainsKey(i.Key));
i.Value.SetUsedInMap(usedimages.ContainsKey(i.Key)); if(i.Value.IsImageLoaded != i.Value.IsReferenced) ProcessImage(i.Value);
if(i.Value.IsImageLoaded != i.Value.IsReferenced) ProcessImage(i.Value);
}
} }
// Done // Done
@ -980,13 +975,13 @@ namespace CodeImp.DoomBuilder.Data
public bool GetFlatExists(string name) public bool GetFlatExists(string name)
{ {
long longname = Lump.MakeLongName(name); long longname = Lump.MakeLongName(name);
return General.Map.Config.MixTexturesFlats ? textures.ContainsKey(longname) : flats.ContainsKey(longname); return General.Map.Config.MixTexturesFlats ? flats.ContainsKey(longname) || textures.ContainsKey(longname) : flats.ContainsKey(longname);
} }
// This checks if a flat is known // This checks if a flat is known
public bool GetFlatExists(long longname) public bool GetFlatExists(long longname)
{ {
return General.Map.Config.MixTexturesFlats ? textures.ContainsKey(longname) : flats.ContainsKey(longname); return General.Map.Config.MixTexturesFlats ? flats.ContainsKey(longname) || textures.ContainsKey(longname) : flats.ContainsKey(longname);
} }
// This returns an image by string // This returns an image by string
@ -1000,16 +995,12 @@ namespace CodeImp.DoomBuilder.Data
// This returns an image by long // This returns an image by long
public ImageData GetFlatImage(long longname) public ImageData GetFlatImage(long longname)
{ {
if(General.Map.Config.MixTexturesFlats) { //mxd // Does this flat exist?
// Does this flat exist? if(flats.ContainsKey(longname)) return flats[longname];
if(textures.ContainsKey(longname)) {
// Return flat //mxd. Probably a texture will do?
return textures[longname]; if(General.Map.Config.MixTexturesFlats && textures.ContainsKey(longname))
} return textures[longname];
} else if(flats.ContainsKey(longname)) { // Does this flat exist?
// Return flat
return flats[longname];
}
// Return null image // Return null image
return unknownImage; //mxd return unknownImage; //mxd
@ -1018,8 +1009,14 @@ namespace CodeImp.DoomBuilder.Data
// This returns an image by long and doesn't check if it exists // This returns an image by long and doesn't check if it exists
public ImageData GetFlatImageKnown(long longname) public ImageData GetFlatImageKnown(long longname)
{ {
//mxd. Err... can't it do without checks...
if(General.Map.Config.MixTexturesFlats) {
if(flats.ContainsKey(longname)) return flats[longname];
return textures[longname];
}
// Return flat // Return flat
return General.Map.Config.MixTexturesFlats ? textures[longname] : flats[longname]; //mxd return flats[longname]; //mxd
} }
#endregion #endregion

View file

@ -126,12 +126,18 @@ namespace CodeImp.DoomBuilder.Data
reader = ImageDataFormat.GetImageReader(mem, ImageDataFormat.DOOMPICTURE, General.Map.Data.Palette); reader = ImageDataFormat.GetImageReader(mem, ImageDataFormat.DOOMPICTURE, General.Map.Data.Palette);
if(reader is UnknownImageReader) if(reader is UnknownImageReader)
{ {
// Data is in an unknown format! //mxd. Probably that's a flat?..
General.ErrorLogger.Add(ErrorType.Error, "Patch lump '" + p.lumpname + "' data format could not be read, while loading texture '" + this.Name + "'"); if (General.Map.Config.MixTexturesFlats) {
failCount++; //mxd reader = ImageDataFormat.GetImageReader(mem, ImageDataFormat.DOOMFLAT, General.Map.Data.Palette);
}
if (reader is UnknownImageReader) {
// Data is in an unknown format!
General.ErrorLogger.Add(ErrorType.Error, "Patch lump '" + p.lumpname + "' data format could not be read, while loading texture '" + this.Name + "'");
failCount++; //mxd
}
} }
else
{ if(!(reader is UnknownImageReader)) {
// Get the patch // Get the patch
mem.Seek(0, SeekOrigin.Begin); mem.Seek(0, SeekOrigin.Begin);
Bitmap patchbmp = null; Bitmap patchbmp = null;

View file

@ -43,69 +43,66 @@ namespace CodeImp.DoomBuilder.Data
// This check image data and returns the appropriate image reader // This check image data and returns the appropriate image reader
public static IImageReader GetImageReader(Stream data, int guessformat, Playpal palette) public static IImageReader GetImageReader(Stream data, int guessformat, Playpal palette)
{ {
DoomPictureReader picreader; //mxd. Try to read it as "classic" image format first...
DoomFlatReader flatreader;
DoomColormapReader colormapreader;
// First check the formats that provide the means to 'ensure' that
// it actually is that format. Then guess the Doom image format.
// Data long enough to check for signatures?
if(data.Length > 10)
{
// Check for PNG signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, PNG_SIGNATURE)) return new FileImageReader(DevilImageType.IL_PNG);
// Check for DDS signature
data.Seek(0, SeekOrigin.Begin);
if (CheckSignature(data, DDS_SIGNATURE)) return new FileImageReader(DevilImageType.IL_DDS);
// Check for GIF signature
data.Seek(0, SeekOrigin.Begin);
if (CheckSignature(data, GIF_SIGNATURE)) return new FileImageReader(DevilImageType.IL_GIF);
//mxd. Check for PCX signature
data.Seek(0, SeekOrigin.Begin);
if (CheckSignature(data, PCX_SIGNATURE)) return new FileImageReader(DevilImageType.IL_PCX);
//mxd. Check for JPG signature
data.Seek(0, SeekOrigin.Begin);
if (CheckSignature(data, JPG_SIGNATURE)) return new FileImageReader(DevilImageType.IL_JPG);
//mxd. Check for TGA signature
data.Seek(0, SeekOrigin.Begin);
if (CheckSignature(data, TGA_SIGNATURE)) return new FileImageReader(DevilImageType.IL_TGA);
// Check for BMP signature
data.Seek(0, SeekOrigin.Begin);
if (CheckSignature(data, BMP_SIGNATURE)) return new UnknownImageReader(); //mxd. Not supported in (G)ZDoom
}
// Could it be a doom picture? // Could it be a doom picture?
if(guessformat == DOOMPICTURE) if(guessformat == DOOMPICTURE) {
{
// Check if data is valid for a doom picture // Check if data is valid for a doom picture
data.Seek(0, SeekOrigin.Begin); data.Seek(0, SeekOrigin.Begin);
picreader = new DoomPictureReader(palette); DoomPictureReader picreader = new DoomPictureReader(palette);
if(picreader.Validate(data)) return picreader; if(picreader.Validate(data)) return picreader;
} }
// Could it be a doom flat? // Could it be a doom flat?
else if(guessformat == DOOMFLAT) else if(guessformat == DOOMFLAT) {
{
// Check if data is valid for a doom flat // Check if data is valid for a doom flat
data.Seek(0, SeekOrigin.Begin); data.Seek(0, SeekOrigin.Begin);
flatreader = new DoomFlatReader(palette); DoomFlatReader flatreader = new DoomFlatReader(palette);
if(flatreader.Validate(data)) return flatreader; if(flatreader.Validate(data)) return flatreader;
} }
// Could it be a doom colormap? // Could it be a doom colormap?
else if(guessformat == DOOMCOLORMAP) else if(guessformat == DOOMCOLORMAP) {
{
// Check if data is valid for a doom colormap // Check if data is valid for a doom colormap
data.Seek(0, SeekOrigin.Begin); data.Seek(0, SeekOrigin.Begin);
colormapreader = new DoomColormapReader(palette); DoomColormapReader colormapreader = new DoomColormapReader(palette);
if(colormapreader.Validate(data)) return colormapreader; if(colormapreader.Validate(data)) return colormapreader;
} }
// Data long enough to check for signatures?
if(data.Length > 10) {
// Check for PNG signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, PNG_SIGNATURE))
return new FileImageReader(DevilImageType.IL_PNG);
// Check for DDS signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, DDS_SIGNATURE))
return new FileImageReader(DevilImageType.IL_DDS);
// Check for GIF signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, GIF_SIGNATURE))
return new FileImageReader(DevilImageType.IL_GIF);
//mxd. Check for PCX signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, PCX_SIGNATURE))
return new FileImageReader(DevilImageType.IL_PCX);
//mxd. Check for JPG signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, JPG_SIGNATURE))
return new FileImageReader(DevilImageType.IL_JPG);
//mxd. Check for TGA signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, TGA_SIGNATURE))
return new FileImageReader(DevilImageType.IL_TGA);
// Check for BMP signature
data.Seek(0, SeekOrigin.Begin);
if(CheckSignature(data, BMP_SIGNATURE))
return new UnknownImageReader(); //mxd. Not supported in (G)ZDoom
}
// Format not supported // Format not supported
return new UnknownImageReader(); return new UnknownImageReader();

View file

@ -118,13 +118,19 @@ namespace CodeImp.DoomBuilder.Data
reader = ImageDataFormat.GetImageReader(mem, ImageDataFormat.DOOMPICTURE, General.Map.Data.Palette); reader = ImageDataFormat.GetImageReader(mem, ImageDataFormat.DOOMPICTURE, General.Map.Data.Palette);
if(reader is UnknownImageReader) if(reader is UnknownImageReader)
{ {
// Data is in an unknown format! //mxd. Probably that's a flat?..
General.ErrorLogger.Add(ErrorType.Error, "Patch lump '" + p.lumpname + "' data format could not be read, while loading texture '" + this.Name + "'. Does this lump contain valid picture data at all?"); if (General.Map.Config.MixTexturesFlats) {
loadfailed = true; reader = ImageDataFormat.GetImageReader(mem, ImageDataFormat.DOOMFLAT, General.Map.Data.Palette);
failCount++; //mxd }
if (reader is UnknownImageReader) {
// Data is in an unknown format!
General.ErrorLogger.Add(ErrorType.Error, "Patch lump '" + p.lumpname + "' data format could not be read, while loading texture '" + this.Name + "'. Does this lump contain valid picture data at all?");
loadfailed = true;
failCount++; //mxd
}
} }
else
{ if(!(reader is UnknownImageReader)) {
// Draw the patch // Draw the patch
mem.Seek(0, SeekOrigin.Begin); mem.Seek(0, SeekOrigin.Begin);
try { reader.DrawToPixelData(mem, pixels, width, height, p.x, p.y); } try { reader.DrawToPixelData(mem, pixels, width, height, p.x, p.y); }

View file

@ -53,6 +53,7 @@ namespace CodeImp.DoomBuilder.Data
// Lump ranges // Lump ranges
private List<LumpRange> flatranges; private List<LumpRange> flatranges;
private List<LumpRange> invertedflatranges; //mxd
private List<LumpRange> patchranges; private List<LumpRange> patchranges;
private List<LumpRange> spriteranges; private List<LumpRange> spriteranges;
private List<LumpRange> textureranges; private List<LumpRange> textureranges;
@ -93,6 +94,33 @@ namespace CodeImp.DoomBuilder.Data
FindRanges(textureranges, General.Map.Config.TextureRanges, "textures"); FindRanges(textureranges, General.Map.Config.TextureRanges, "textures");
FindRanges(colormapranges, General.Map.Config.ColormapRanges, "colormaps"); FindRanges(colormapranges, General.Map.Config.ColormapRanges, "colormaps");
//mxd
invertedflatranges = new List<LumpRange>();
if(flatranges.Count > 0 && flatranges[0].start > 0) {
LumpRange range = new LumpRange();
range.start = 0;
range.end = flatranges[0].start - 1;
invertedflatranges.Add(range);
}
for (int i = 0; i < flatranges.Count; i++) {
if (flatranges[i].start == 0) continue;
LumpRange range = new LumpRange();
if(i == flatranges.Count - 1) {
if (flatranges[i].end < file.Lumps.Count - 1) {
range.start = flatranges[i].end + 1;
range.end = file.Lumps.Count - 1;
invertedflatranges.Add(range);
}
} else {
range.start = flatranges[i - 1].end + 1;
range.end = flatranges[i].start - 1;
invertedflatranges.Add(range);
}
}
// We have no destructor // We have no destructor
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
@ -445,8 +473,8 @@ namespace CodeImp.DoomBuilder.Data
} }
// Determine actual scales // Determine actual scales
if(scalebytex == 0) scalex = defaultscale; else scalex = 1f / ((float)scalebytex / 8f); if(scalebytex == 0) scalex = defaultscale; else scalex = 1f / (scalebytex / 8f);
if(scalebytey == 0) scaley = defaultscale; else scaley = 1f / ((float)scalebytey / 8f); if(scalebytey == 0) scaley = defaultscale; else scaley = 1f / (scalebytey / 8f);
// Validate data // Validate data
if((width > 0) && (height > 0) && (patches > 0) && if((width > 0) && (height > 0) && (patches > 0) &&
@ -532,22 +560,23 @@ namespace CodeImp.DoomBuilder.Data
// Error when suspended // Error when suspended
if(issuspended) throw new Exception("Data reader is suspended"); if(issuspended) throw new Exception("Data reader is suspended");
// Strictly read patches only between P_START and P_END? // mxd. First strictly read patches between P_START and P_END
if(strictpatches) foreach(LumpRange range in patchranges) {
{ lump = file.FindLump(pname, range.start, range.end);
// Find the lump in ranges if(lump != null) return lump.Stream;
foreach(LumpRange range in patchranges) }
{
if (!strictpatches) {
//mxd. Find the lump anywhere EXCEPT flat ranges (the way it's done in ZDoom)
foreach (LumpRange range in invertedflatranges) {
lump = file.FindLump(pname, range.start, range.end); lump = file.FindLump(pname, range.start, range.end);
if(lump != null) return lump.Stream; if(lump != null) return lump.Stream;
} }
}
else // Find the lump anywhere IN flat ranges
{ foreach (LumpRange range in flatranges) {
// Find the lump anywhere lump = file.FindLump(pname, range.start, range.end);
lump = file.FindLump(pname); if(lump != null) return lump.Stream;
if (lump != null) {
return lump.Stream;
} }
} }
@ -623,12 +652,8 @@ namespace CodeImp.DoomBuilder.Data
private void LoadFlatsRange(string startlump, string endlump, ref List<ImageData> images) private void LoadFlatsRange(string startlump, string endlump, ref List<ImageData> images)
{ {
int startindex, endindex; int startindex, endindex;
float defaultscale;
FlatImage image; FlatImage image;
// Determine default scale
defaultscale = General.Map.Config.DefaultTextureScale;
// Continue until no more start can be found // Continue until no more start can be found
startindex = file.FindLumpIndex(startlump); startindex = file.FindLumpIndex(startlump);
while(startindex > -1) while(startindex > -1)

View file

@ -59,6 +59,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// set to be sky // set to be sky
if (sd.HighRequired() && sd.HighTexture == "-") if (sd.HighRequired() && sd.HighTexture == "-")
{ {
if(sd.Line.Action == 181 && sd.Line.Args[1] > 0) continue; //mxd. Ceiling slopes doesn't require upper texture
if (sd.Other != null && sd.Other.Sector.CeilTexture != General.Map.Config.SkyFlatName) if (sd.Other != null && sd.Other.Sector.CeilTexture != General.Map.Config.SkyFlatName)
{ {
SubmitResult(new ResultMissingTexture(sd, SidedefPart.Upper)); SubmitResult(new ResultMissingTexture(sd, SidedefPart.Upper));
@ -76,6 +77,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// set to be sky // set to be sky
if (sd.LowRequired() && sd.LowTexture == "-") if (sd.LowRequired() && sd.LowTexture == "-")
{ {
if(sd.Line.Action == 181 && sd.Line.Args[0] > 0) continue; //mxd. Floor slopes doesn't require lower texture
if (sd.Other != null && sd.Other.Sector.FloorTexture != General.Map.Config.SkyFlatName) if (sd.Other != null && sd.Other.Sector.FloorTexture != General.Map.Config.SkyFlatName)
{ {
SubmitResult(new ResultMissingTexture(sd, SidedefPart.Lower)); SubmitResult(new ResultMissingTexture(sd, SidedefPart.Lower));