Load images when they accessed

Load previews when they are accessed
This commit is contained in:
Magnus Norddahl 2020-01-12 23:10:57 +01:00
parent acfd4f5283
commit fc7093b959
16 changed files with 71 additions and 208 deletions

View file

@ -102,8 +102,6 @@ namespace CodeImp.DoomBuilder.Data
private object syncobject = new object(); private object syncobject = new object();
private Queue<ImageData> imageque; private Queue<ImageData> imageque;
private Thread[] backgroundloader; private Thread[] backgroundloader;
private int threadsfinished;
private bool notifiedbusy;
// Special images // Special images
private ImageData missingtexture3d; private ImageData missingtexture3d;
@ -134,10 +132,6 @@ namespace CodeImp.DoomBuilder.Data
private List<ThingCategory> thingcategories; private List<ThingCategory> thingcategories;
private Dictionary<int, ThingTypeInfo> thingtypes; private Dictionary<int, ThingTypeInfo> thingtypes;
// Timing
private long loadstarttime;
private long loadfinishtime;
// Disposing // Disposing
private bool isdisposed; private bool isdisposed;
@ -235,16 +229,12 @@ namespace CodeImp.DoomBuilder.Data
// Load special images (mxd: the rest is loaded in LoadInternalTextures()) // Load special images (mxd: the rest is loaded in LoadInternalTextures())
whitetexture = new ResourceImage("CodeImp.DoomBuilder.Resources.White.png") { UseColorCorrection = false }; whitetexture = new ResourceImage("CodeImp.DoomBuilder.Resources.White.png") { UseColorCorrection = false };
whitetexture.LoadImage();
blacktexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Black.png") { UseColorCorrection = false }; //mxd blacktexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Black.png") { UseColorCorrection = false }; //mxd
blacktexture.LoadImage(); //mxd
unknownimage = new UnknownImage(Properties.Resources.UnknownImage); //mxd. There should be only one! unknownimage = new UnknownImage(Properties.Resources.UnknownImage); //mxd. There should be only one!
//mxd. Textures browser images //mxd. Textures browser images
foldertexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Folder96.png") { UseColorCorrection = false }; foldertexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Folder96.png") { UseColorCorrection = false };
foldertexture.LoadImage();
folderuptexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Folder96Up.png") { UseColorCorrection = false }; folderuptexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Folder96Up.png") { UseColorCorrection = false };
folderuptexture.LoadImage();
//mxd. Create comment icons //mxd. Create comment icons
commenttextures = new ImageData[] commenttextures = new ImageData[]
@ -255,12 +245,6 @@ namespace CodeImp.DoomBuilder.Data
new ResourceImage("CodeImp.DoomBuilder.Resources.CommentProblem.png") { UseColorCorrection = false }, new ResourceImage("CodeImp.DoomBuilder.Resources.CommentProblem.png") { UseColorCorrection = false },
new ResourceImage("CodeImp.DoomBuilder.Resources.CommentSmile.png") { UseColorCorrection = false }, new ResourceImage("CodeImp.DoomBuilder.Resources.CommentSmile.png") { UseColorCorrection = false },
}; };
//mxd. Load comment icons
foreach(ImageData data in commenttextures)
{
data.LoadImage();
}
} }
// Disposer // Disposer
@ -661,12 +645,6 @@ namespace CodeImp.DoomBuilder.Data
mapinfo = null; //mxd mapinfo = null; //mxd
} }
//mxd. Called before Clock is reset
internal void OnBeforeClockReset()
{
if(loadstarttime > 0) loadstarttime -= Clock.CurrentTime;
}
#endregion #endregion
#region ================== Suspend / Resume #region ================== Suspend / Resume
@ -717,11 +695,6 @@ namespace CodeImp.DoomBuilder.Data
// This starts background loading // This starts background loading
private void StartBackgroundLoader() private void StartBackgroundLoader()
{ {
// Timing
loadstarttime = Clock.CurrentTime;
loadfinishtime = 0;
threadsfinished = 0;
// If a loader is already running, stop it first // If a loader is already running, stop it first
if(backgroundloader != null) StopBackgroundLoader(); if(backgroundloader != null) StopBackgroundLoader();
@ -756,7 +729,6 @@ namespace CodeImp.DoomBuilder.Data
} }
// Done // Done
notifiedbusy = false;
backgroundloader = null; backgroundloader = null;
General.MainWindow.UpdateStatus(); General.MainWindow.UpdateStatus();
} }
@ -770,7 +742,7 @@ namespace CodeImp.DoomBuilder.Data
// Wait a bit before loading to give the main thread a headstart on acquiring the locks in the resource loader part of the codebase.. // Wait a bit before loading to give the main thread a headstart on acquiring the locks in the resource loader part of the codebase..
Thread.Sleep(666); Thread.Sleep(666);
do while (true)
{ {
// Get next item // Get next item
ImageData image = null; ImageData image = null;
@ -778,78 +750,12 @@ namespace CodeImp.DoomBuilder.Data
{ {
// Fetch next image to process // Fetch next image to process
if(imageque.Count > 0) image = imageque.Dequeue(); if(imageque.Count > 0) image = imageque.Dequeue();
}
// Any image to process?
if(image != null)
{
image.LoadImage();
}
// Doing something?
if(image != null)
{
// Wait a bit and update icon
if(!notifiedbusy)
{
notifiedbusy = true;
General.MainWindow.UpdateStatus();
}
}
else
{
bool lastthread = false;
lock (syncobject)
{
threadsfinished++;
if (threadsfinished == backgroundloader.Length)
lastthread = true;
}
if (lastthread)
{
// Timing
if (loadfinishtime == 0)
{
//mxd. Release PK3 files
foreach (DataReader reader in containers)
{
if (reader is PK3Reader) (reader as PK3Reader).BatchMode = false;
}
loadfinishtime = Clock.CurrentTime;
string deltatimesec = ((loadfinishtime - loadstarttime) / 1000.0f).ToString("########0.00");
General.WriteLogLine("Resources loading took " + deltatimesec + " seconds");
loadstarttime = 0; //mxd
lock (syncobject)
{
threadsfinished = 0;
}
//mxd. Show more detailed message
if (notifiedbusy)
{
notifiedbusy = false;
General.MainWindow.ResourcesLoaded(deltatimesec);
}
}
else if (notifiedbusy) //mxd. Sould never happen (?)
{
notifiedbusy = false;
General.MainWindow.UpdateStatus();
}
}
// Wait until there's more to do.
lock (syncobject)
{
if (imageque.Count == 0) Monitor.Wait(syncobject); if (imageque.Count == 0) Monitor.Wait(syncobject);
} }
image?.BackgroundLoadImage();
} }
} }
while (true);
}
catch(ThreadInterruptedException) { } catch(ThreadInterruptedException) { }
} }
@ -867,7 +773,7 @@ namespace CodeImp.DoomBuilder.Data
} }
} }
void QueueLoadPreview(ImageData img) internal void QueueLoadPreview(ImageData img)
{ {
if (img.PreviewState == ImageLoadState.None) if (img.PreviewState == ImageLoadState.None)
{ {
@ -944,8 +850,6 @@ namespace CodeImp.DoomBuilder.Data
list.Remove(img.LongName); list.Remove(img.LongName);
list.Add(img.LongName, img); list.Add(img.LongName, img);
counter++; counter++;
QueueLoadPreview(img);
} }
} }
} }
@ -1012,8 +916,6 @@ namespace CodeImp.DoomBuilder.Data
{ {
nametranslation.Remove(img.LongName); nametranslation.Remove(img.LongName);
} }
QueueLoadPreview(img);
} }
} }
} }
@ -1097,7 +999,7 @@ namespace CodeImp.DoomBuilder.Data
if(!(img is UnknownImage)) if(!(img is UnknownImage))
{ {
if(!img.IsImageLoaded) img.LoadImage(); img.LoadImageNow();
if(!img.LoadFailed) if(!img.LoadFailed)
{ {
// HiResImage will not give us it's actual scale // HiResImage will not give us it's actual scale
@ -1197,6 +1099,7 @@ namespace CodeImp.DoomBuilder.Data
if(File.Exists(path)) if(File.Exists(path))
{ {
result = new FileImage(name, path) { AllowUnload = false }; result = new FileImage(name, path) { AllowUnload = false };
result.LoadImageNow();
} }
else else
{ {
@ -1204,7 +1107,6 @@ namespace CodeImp.DoomBuilder.Data
result = new ResourceImage("CodeImp.DoomBuilder.Resources." + name); result = new ResourceImage("CodeImp.DoomBuilder.Resources." + name);
} }
result.LoadImage();
return result; return result;
} }
@ -1243,8 +1145,6 @@ namespace CodeImp.DoomBuilder.Data
{ {
nametranslation.Remove(img.LongName); nametranslation.Remove(img.LongName);
} }
QueueLoadPreview(img);
} }
} }
} }
@ -1373,7 +1273,6 @@ namespace CodeImp.DoomBuilder.Data
textures[img.LongName] = replacer; textures[img.LongName] = replacer;
//replaced = true; //replaced = true;
QueueLoadPreview(img);
counter++; counter++;
} }
@ -1386,7 +1285,6 @@ namespace CodeImp.DoomBuilder.Data
flats[img.LongName] = replacer; flats[img.LongName] = replacer;
//replaced = true; //replaced = true;
QueueLoadPreview(img);
counter++; counter++;
} }
@ -1398,7 +1296,6 @@ namespace CodeImp.DoomBuilder.Data
sprites[img.LongName] = replacer; sprites[img.LongName] = replacer;
//replaced = true; //replaced = true;
QueueLoadPreview(img);
counter++; counter++;
} }
@ -1522,8 +1419,6 @@ namespace CodeImp.DoomBuilder.Data
// Add to collection // Add to collection
sprites.Add(image.LongName, image); sprites.Add(image.LongName, image);
QueueLoadPreview(image);
} }
} }
else else
@ -1569,8 +1464,6 @@ namespace CodeImp.DoomBuilder.Data
{ {
image = sprites[info.SpriteLongName]; image = sprites[info.SpriteLongName];
} }
if (image != null) QueueLoadPreview(image);
} }
} }
} }
@ -1628,7 +1521,7 @@ namespace CodeImp.DoomBuilder.Data
foreach(string spritefile in files) foreach(string spritefile in files)
{ {
ImageData img = new FileImage(Path.GetFileNameWithoutExtension(spritefile).ToLowerInvariant(), spritefile); ImageData img = new FileImage(Path.GetFileNameWithoutExtension(spritefile).ToLowerInvariant(), spritefile);
img.LoadImage(); img.LoadImageNow();
img.AllowUnload = false; img.AllowUnload = false;
name = INTERNAL_PREFIX + img.Name; name = INTERNAL_PREFIX + img.Name;
long hash = Lump.MakeLongName(name, true); //mxd long hash = Lump.MakeLongName(name, true); //mxd
@ -1642,7 +1535,6 @@ namespace CodeImp.DoomBuilder.Data
if(!internalspriteslookup.ContainsKey(name)) if(!internalspriteslookup.ContainsKey(name))
{ {
ImageData img = new ResourceImage("CodeImp.DoomBuilder.Resources.Nothing.png"); ImageData img = new ResourceImage("CodeImp.DoomBuilder.Resources.Nothing.png");
img.LoadImage();
img.AllowUnload = false; img.AllowUnload = false;
long hash = Lump.MakeLongName(name, true); //mxd long hash = Lump.MakeLongName(name, true); //mxd
sprites[hash] = img; //mxd sprites[hash] = img; //mxd
@ -1654,7 +1546,6 @@ namespace CodeImp.DoomBuilder.Data
if(!internalspriteslookup.ContainsKey(name)) if(!internalspriteslookup.ContainsKey(name))
{ {
ImageData img = new ResourceImage("CodeImp.DoomBuilder.Resources.UnknownThing.png"); ImageData img = new ResourceImage("CodeImp.DoomBuilder.Resources.UnknownThing.png");
img.LoadImage();
img.AllowUnload = false; img.AllowUnload = false;
sprites[UNKNOWN_THING] = img; //mxd sprites[UNKNOWN_THING] = img; //mxd
internalspriteslookup[name] = UNKNOWN_THING; //mxd internalspriteslookup[name] = UNKNOWN_THING; //mxd
@ -1666,7 +1557,6 @@ namespace CodeImp.DoomBuilder.Data
if(!internalspriteslookup.ContainsKey(name)) if(!internalspriteslookup.ContainsKey(name))
{ {
ImageData img = new ResourceImage("CodeImp.DoomBuilder.Resources.MissingThing.png"); ImageData img = new ResourceImage("CodeImp.DoomBuilder.Resources.MissingThing.png");
img.LoadImage();
img.AllowUnload = false; img.AllowUnload = false;
sprites[MISSING_THING] = img; //mxd sprites[MISSING_THING] = img; //mxd
internalspriteslookup[name] = MISSING_THING; //mxd internalspriteslookup[name] = MISSING_THING; //mxd
@ -1688,7 +1578,6 @@ namespace CodeImp.DoomBuilder.Data
if (img != null) if (img != null)
{ {
img.UsedInMap = true; img.UsedInMap = true;
QueueLoadImage(img);
} }
return img; return img;
} }
@ -1705,7 +1594,6 @@ namespace CodeImp.DoomBuilder.Data
if (img != null) if (img != null)
{ {
img.UsedInMap = true; img.UsedInMap = true;
QueueLoadImage(img);
} }
return img; return img;
} }
@ -1739,7 +1627,6 @@ namespace CodeImp.DoomBuilder.Data
if (image != null) if (image != null)
{ {
image.UsedInMap = true; image.UsedInMap = true;
QueueLoadImage(image);
} }
return image; return image;
} }
@ -1754,7 +1641,6 @@ namespace CodeImp.DoomBuilder.Data
if (img != null) if (img != null)
{ {
img.UsedInMap = true; img.UsedInMap = true;
QueueLoadImage(img);
} }
return img; return img;
} }
@ -2416,8 +2302,6 @@ namespace CodeImp.DoomBuilder.Data
// Add to collection // Add to collection
sprites.Add(sprite.LongName, sprite); sprites.Add(sprite.LongName, sprite);
QueueLoadPreview(sprite);
} }
// Apply VOXELDEF settings to the preview image... // Apply VOXELDEF settings to the preview image...
@ -2783,8 +2667,6 @@ namespace CodeImp.DoomBuilder.Data
textures[camteximage.LongName] = camteximage; textures[camteximage.LongName] = camteximage;
flats[camteximage.LongName] = camteximage; flats[camteximage.LongName] = camteximage;
QueueLoadPreview(camteximage);
// Add to container's texture set // Add to container's texture set
currentreader.TextureSet.AddFlat(camteximage); currentreader.TextureSet.AddFlat(camteximage);
currentreader.TextureSet.AddTexture(camteximage); currentreader.TextureSet.AddTexture(camteximage);
@ -3143,7 +3025,6 @@ namespace CodeImp.DoomBuilder.Data
if (i.Value.LoadFailed) if (i.Value.LoadFailed)
continue; continue;
i.Value.UsedInMap = usedtextures.ContainsKey(i.Key); i.Value.UsedInMap = usedtextures.ContainsKey(i.Key);
QueueLoadImage(i.Value);
} }
// Set used on all flats // Set used on all flats
@ -3152,7 +3033,6 @@ namespace CodeImp.DoomBuilder.Data
if (i.Value.LoadFailed) if (i.Value.LoadFailed)
continue; continue;
i.Value.UsedInMap = usedtextures.ContainsKey(i.Key); i.Value.UsedInMap = usedtextures.ContainsKey(i.Key);
QueueLoadImage(i.Value);
} }
} }
//mxd. Use separate collections //mxd. Use separate collections
@ -3164,7 +3044,6 @@ namespace CodeImp.DoomBuilder.Data
if (i.Value.LoadFailed) if (i.Value.LoadFailed)
continue; continue;
i.Value.UsedInMap = usedtextures.ContainsKey(i.Key); i.Value.UsedInMap = usedtextures.ContainsKey(i.Key);
QueueLoadImage(i.Value);
} }
// Set used on all flats // Set used on all flats
@ -3173,7 +3052,6 @@ namespace CodeImp.DoomBuilder.Data
if (i.Value.LoadFailed) if (i.Value.LoadFailed)
continue; continue;
i.Value.UsedInMap = usedflats.ContainsKey(i.Key); i.Value.UsedInMap = usedflats.ContainsKey(i.Key);
QueueLoadImage(i.Value);
} }
} }

View file

@ -98,7 +98,7 @@ namespace CodeImp.DoomBuilder.Data
hasLongName = overridden.HasLongName; hasLongName = overridden.HasLongName;
overridesettingsapplied = true; overridesettingsapplied = true;
if(!overridden.IsImageLoaded) overridden.LoadImage(); overridden.LoadImageNow();
if(overridden.ImageState == ImageLoadState.Ready) if(overridden.ImageState == ImageLoadState.Ready)
{ {
// Store source properteis // Store source properteis

View file

@ -106,8 +106,27 @@ namespace CodeImp.DoomBuilder.Data
internal bool HasLongName { get { return hasLongName; } } //mxd internal bool HasLongName { get { return hasLongName; } } //mxd
public bool UseColorCorrection { get { return usecolorcorrection; } set { usecolorcorrection = value; } } public bool UseColorCorrection { get { return usecolorcorrection; } set { usecolorcorrection = value; } }
public Texture Texture { get { return GetTexture(); } } public Texture Texture { get { return GetTexture(); } }
public bool IsPreviewLoaded { get { return (previewstate == ImageLoadState.Ready); } } public bool IsPreviewLoaded
public bool IsImageLoaded { get { return (imagestate == ImageLoadState.Ready); } } {
get
{
if (previewstate == ImageLoadState.None)
General.Map.Data.QueueLoadPreview(this);
return (previewstate == ImageLoadState.Ready);
}
}
public bool IsImageLoaded
{
get
{
if (imagestate == ImageLoadState.None)
General.Map.Data.QueueLoadImage(this);
return (imagestate == ImageLoadState.Ready);
}
}
public bool LoadFailed { get { return loadfailed; } } public bool LoadFailed { get { return loadfailed; } }
public bool IsDisposed { get { return isdisposed; } } public bool IsDisposed { get { return isdisposed; } }
public bool AllowUnload { get; set; } public bool AllowUnload { get; set; }
@ -251,7 +270,16 @@ namespace CodeImp.DoomBuilder.Data
return result.bitmap; return result.bitmap;
} }
public void LoadImage() public void LoadImageNow()
{
if (imagestate != ImageLoadState.Ready)
{
imagestate = ImageLoadState.Loading;
LoadImage(true);
}
}
internal void BackgroundLoadImage()
{ {
LoadImage(true); LoadImage(true);
} }
@ -271,15 +299,16 @@ namespace CodeImp.DoomBuilder.Data
// Save memory by disposing the original image immediately if we only used it to load a preview image // Save memory by disposing the original image immediately if we only used it to load a preview image
bool onlyPreview = false; bool onlyPreview = false;
if (imagestate == ImageLoadState.Ready) if (imagestate != ImageLoadState.Loading)
{ {
loadResult.bitmap?.Dispose(); loadResult.bitmap?.Dispose();
loadResult.bitmap = null;
onlyPreview = true; onlyPreview = true;
} }
General.MainWindow.RunOnUIThread(() => General.MainWindow.RunOnUIThread(() =>
{ {
if (imagestate != ImageLoadState.Ready && !onlyPreview) if (imagestate == ImageLoadState.Loading && !onlyPreview)
{ {
// Log errors and warnings // Log errors and warnings
foreach (LogMessage message in loadResult.messages) foreach (LogMessage message in loadResult.messages)
@ -712,6 +741,11 @@ namespace CodeImp.DoomBuilder.Data
return Properties.Resources.Failed; return Properties.Resources.Failed;
} }
if (previewstate == ImageLoadState.None)
{
General.Map.Data.QueueLoadPreview(this);
}
// Return loading bitmap // Return loading bitmap
return Properties.Resources.Hourglass; return Properties.Resources.Hourglass;
} }

View file

@ -60,8 +60,7 @@ namespace CodeImp.DoomBuilder.Data
bmp.Dispose(); bmp.Dispose();
bitmapdata.Dispose(); bitmapdata.Dispose();
// We have no destructor LoadImageNow();
GC.SuppressFinalize(this);
} }
#endregion #endregion

View file

@ -217,8 +217,6 @@ namespace CodeImp.DoomBuilder.Data
ImageData img = General.Map.Data.GetTextureImage(p.LumpName); ImageData img = General.Map.Data.GetTextureImage(p.LumpName);
if(!(img is UnknownImage) && img != this) if(!(img is UnknownImage) && img != this)
{ {
if(!img.IsImageLoaded) img.LoadImage();
//mxd. Apply transformations from TexturePatch. We don't want to modify the original bitmap here, so make a copy //mxd. Apply transformations from TexturePatch. We don't want to modify the original bitmap here, so make a copy
Bitmap bmp = new Bitmap(img.LocalGetBitmap()); Bitmap bmp = new Bitmap(img.LocalGetBitmap());
Bitmap patchbmp = TransformPatch(bitmap, p, bmp); Bitmap patchbmp = TransformPatch(bitmap, p, bmp);

View file

@ -42,10 +42,7 @@ namespace CodeImp.DoomBuilder.Data
this.loadbitmap = image; this.loadbitmap = image;
SetName(""); SetName("");
LoadImage(false); LoadImageNow();
// We have no destructor
GC.SuppressFinalize(this);
} }
#endregion #endregion

View file

@ -234,7 +234,7 @@ namespace CodeImp.DoomBuilder.Editing
} }
// Make sure it is loaded // Make sure it is loaded
backimage.LoadImage(); backimage.LoadImageNow();
} }
// This returns the next higher coordinate // This returns the next higher coordinate

View file

@ -277,9 +277,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
if (General.Map.Data.GetTextureExists(name)) if (General.Map.Data.GetTextureExists(name))
{ {
ImageData image = General.Map.Data.GetTextureImage(name); ImageData image = General.Map.Data.GetTextureImage(name);
image.LoadImageNow();
if (!image.IsImageLoaded)
image.LoadImage();
t = image.Texture; t = image.Texture;
@ -296,9 +294,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
if (General.Map.Data.GetTextureExists(name)) if (General.Map.Data.GetTextureExists(name))
{ {
ImageData image = General.Map.Data.GetTextureImage(name); ImageData image = General.Map.Data.GetTextureImage(name);
image.LoadImageNow();
if (!image.IsImageLoaded)
image.LoadImage();
t = image.Texture; t = image.Texture;
} }
@ -312,9 +308,7 @@ namespace CodeImp.DoomBuilder.GZBuilder.MD3
if (General.Map.Data.GetSpriteExists(name)) if (General.Map.Data.GetSpriteExists(name))
{ {
ImageData image = General.Map.Data.GetSpriteImage(name); ImageData image = General.Map.Data.GetSpriteImage(name);
image.LoadImageNow();
if (!image.IsImageLoaded)
image.LoadImage();
t = image.Texture; t = image.Texture;
} }

View file

@ -718,13 +718,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Render the geometry collected // Render the geometry collected
foreach (KeyValuePair<ImageData, List<VisualGeometry>> group in geopass) foreach (KeyValuePair<ImageData, List<VisualGeometry>> group in geopass)
{ {
// What texture to use?
if(group.Key is UnknownImage)
curtexture = General.Map.Data.UnknownTexture3D;
else if(group.Key.IsImageLoaded && !group.Key.IsDisposed)
curtexture = group.Key; curtexture = group.Key;
else
curtexture = General.Map.Data.Hourglass3D;
// Apply texture // Apply texture
graphics.SetTexture(curtexture.Texture); graphics.SetTexture(curtexture.Texture);
@ -865,10 +859,6 @@ namespace CodeImp.DoomBuilder.Rendering
{ {
if(group.Key is UnknownImage) continue; if(group.Key is UnknownImage) continue;
// What texture to use?
if(!group.Key.IsImageLoaded || group.Key.IsDisposed)
curtexture = General.Map.Data.Hourglass3D;
else
curtexture = group.Key; curtexture = group.Key;
// Apply texture // Apply texture
@ -1093,13 +1083,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Change texture? // Change texture?
if(g.Texture.LongName != curtexturename) if(g.Texture.LongName != curtexturename)
{ {
// What texture to use?
if(g.Texture is UnknownImage)
curtexture = General.Map.Data.UnknownTexture3D;
else if(g.Texture.IsImageLoaded && !g.Texture.IsDisposed)
curtexture = g.Texture; curtexture = g.Texture;
else
curtexture = General.Map.Data.Hourglass3D;
// Apply texture // Apply texture
graphics.SetTexture(curtexture.Texture); graphics.SetTexture(curtexture.Texture);
@ -1226,11 +1210,7 @@ namespace CodeImp.DoomBuilder.Rendering
// Change texture? // Change texture?
if(t.Texture.LongName != curtexturename) if(t.Texture.LongName != curtexturename)
{ {
// What texture to use?
if(t.Texture.IsImageLoaded && !t.Texture.IsDisposed)
curtexture = t.Texture; curtexture = t.Texture;
else
curtexture = General.Map.Data.Hourglass3D;
// Apply texture // Apply texture
graphics.SetTexture(curtexture.Texture); graphics.SetTexture(curtexture.Texture);

View file

@ -93,7 +93,6 @@ namespace CodeImp.DoomBuilder.Windows
backgroundname = result; backgroundname = result;
backgroundsource = GridSetup.SOURCE_TEXTURES; backgroundsource = GridSetup.SOURCE_TEXTURES;
ImageData img = General.Map.Data.GetTextureImage(result); ImageData img = General.Map.Data.GetTextureImage(result);
img.LoadImage();
General.DisplayZoomedImage(backgroundimage, img.GetBackgroundBitmap()); General.DisplayZoomedImage(backgroundimage, img.GetBackgroundBitmap());
} }
} }
@ -109,7 +108,6 @@ namespace CodeImp.DoomBuilder.Windows
backgroundname = result; backgroundname = result;
backgroundsource = GridSetup.SOURCE_FLATS; backgroundsource = GridSetup.SOURCE_FLATS;
ImageData img = General.Map.Data.GetFlatImage(result); ImageData img = General.Map.Data.GetFlatImage(result);
img.LoadImage();
General.DisplayZoomedImage(backgroundimage, img.GetBackgroundBitmap()); General.DisplayZoomedImage(backgroundimage, img.GetBackgroundBitmap());
} }
} }
@ -124,7 +122,6 @@ namespace CodeImp.DoomBuilder.Windows
backgroundname = browsefile.FileName; backgroundname = browsefile.FileName;
backgroundsource = GridSetup.SOURCE_FILE; backgroundsource = GridSetup.SOURCE_FILE;
ImageData img = new FileImage(Path.GetFileNameWithoutExtension(backgroundname), backgroundname, false, 1.0f, 1.0f); ImageData img = new FileImage(Path.GetFileNameWithoutExtension(backgroundname), backgroundname, false, 1.0f, 1.0f);
img.LoadImage();
General.DisplayZoomedImage(backgroundimage, new Bitmap(img.GetBackgroundBitmap())); General.DisplayZoomedImage(backgroundimage, new Bitmap(img.GetBackgroundBitmap()));
img.Dispose(); img.Dispose();
} }

View file

@ -4214,14 +4214,6 @@ namespace CodeImp.DoomBuilder.Windows
}); });
} }
public void ResourcesLoaded(string loadtime)
{
RunOnUIThread(() =>
{
DisplayStatus(StatusType.Info, "Resources loaded in " + loadtime + " seconds");
});
}
#endregion #endregion
#region ================== Message Pump #region ================== Message Pump
@ -4377,10 +4369,6 @@ namespace CodeImp.DoomBuilder.Windows
//mxd //mxd
internal void ResetClock() internal void ResetClock()
{ {
// Let the data manager know...
if(General.Map != null && General.Map.Data != null)
General.Map.Data.OnBeforeClockReset();
Clock.Reset(); Clock.Reset();
lastupdatetime = 0; lastupdatetime = 0;

View file

@ -94,7 +94,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.IO
continue; continue;
} }
if(!id.IsImageLoaded) id.LoadImage();
Bitmap bmp = id.ExportBitmap(); Bitmap bmp = id.ExportBitmap();
lock (bmp) lock (bmp)
{ {
@ -122,7 +121,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.IO
continue; continue;
} }
if(!id.IsImageLoaded) id.LoadImage();
Bitmap bmp = id.ExportBitmap(); Bitmap bmp = id.ExportBitmap();
// Handle duplicate names // Handle duplicate names

View file

@ -1174,7 +1174,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
mode.SetActionResult("Auto-aligned textures " + rest + "."); mode.SetActionResult("Auto-aligned textures " + rest + ".");
// Make sure the texture is loaded (we need the texture size) // Make sure the texture is loaded (we need the texture size)
if(!base.Texture.IsImageLoaded) base.Texture.LoadImage(); if(!base.Texture.IsImageLoaded) base.Texture.LoadImageNow();
if(mode.IsSingleSelection) if(mode.IsSingleSelection)
{ {

View file

@ -2988,7 +2988,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
BaseVisualGeometrySidedef side = (BaseVisualGeometrySidedef)i; BaseVisualGeometrySidedef side = (BaseVisualGeometrySidedef)i;
// Make sure the texture is loaded (we need the texture size) // Make sure the texture is loaded (we need the texture size)
if(!side.Texture.IsImageLoaded) side.Texture.LoadImage(); if(!side.Texture.IsImageLoaded) side.Texture.LoadImageNow();
//Align textures //Align textures
AutoAlignTextures(side, side.Texture, alignX, alignY, false, false); AutoAlignTextures(side, side.Texture, alignX, alignY, false, false);

View file

@ -301,7 +301,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
// Check if the texture is loaded // Check if the texture is loaded
ImageData sprite = sprites[i]; ImageData sprite = sprites[i];
if (!sprite.IsImageLoaded && !sprite.LoadFailed) if (!sprite.IsImageLoaded && !sprite.LoadFailed)
sprite.LoadImage(); sprite.LoadImageNow();
if(sprite.IsImageLoaded) if(sprite.IsImageLoaded)
{ {
base.textures[i] = sprite; base.textures[i] = sprite;
@ -354,7 +354,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
else else
{ {
isloaded = false; isloaded = false;
base.textures[i] = General.Map.Data.Hourglass3D; base.textures[i] = sprite;
// Determine sprite size // Determine sprite size
float radius = Math.Min(thingradius, thingheight / 2f); float radius = Math.Min(thingradius, thingheight / 2f);

View file

@ -280,7 +280,7 @@ namespace CodeImp.DoomBuilder.Plugins.VisplaneExplorer
image = new DynamicBitmapImage(canvas, "_CANVAS_"); image = new DynamicBitmapImage(canvas, "_CANVAS_");
image.UseColorCorrection = false; image.UseColorCorrection = false;
image.MipMapLevels = 1; image.MipMapLevels = 1;
image.LoadImage(); image.LoadImageNow();
// Make custom presentation // Make custom presentation
CustomPresentation p = new CustomPresentation(); CustomPresentation p = new CustomPresentation();