Skip to content

Commit 2a38ef6

Browse files
committed
Better error handling for missing textures
1 parent e83e4a1 commit 2a38ef6

File tree

6 files changed

+132
-21
lines changed

6 files changed

+132
-21
lines changed

engine/source/game/tsStatic.cpp

+22-1
Original file line numberDiff line numberDiff line change
@@ -119,8 +119,29 @@ bool TSStatic::onAdd()
119119
bool foundAllMaterials = true;
120120
for (int i = 0; i < mShape->materialList->size(); i++) {
121121
Material* mat = mShape->materialList->getMappedMaterial(i);
122+
122123
if (mat != NULL)
123-
foundAllMaterials = foundAllMaterials && mat->preloadTextures();
124+
{
125+
//char errorBuff[4096];
126+
//errorBuff[0] = '\0';
127+
128+
Vector<const char*> errorBuff;
129+
foundAllMaterials = foundAllMaterials && mat->preloadTextures(errorBuff);
130+
131+
if (!errorBuff.empty())
132+
{
133+
Con::errorf(ConsoleLogEntry::General, "Error preloading material(%s):", mShape->materialList->getMaterialName(i));
134+
Con::errorf("{");
135+
for (U32 k = 0; k < errorBuff.size(); k++)
136+
{
137+
Con::errorf(" missing file %s", errorBuff[k]);
138+
}
139+
Con::errorf("}");
140+
}
141+
142+
//if (dStrlen(errorBuff) > 0)
143+
// Con::errorf(ConsoleLogEntry::General, "Error preloading material(%s):\n{%s\n}", mShape->materialList->getMaterialName(i), errorBuff);
144+
}
124145
}
125146
if (!foundAllMaterials) {
126147
Con::errorf(ConsoleLogEntry::General, "Unable to load TSStatic due to missing materials: %s", mShapeName);

engine/source/interior/interiorInstance.cpp

+20-4
Original file line numberDiff line numberDiff line change
@@ -380,18 +380,34 @@ bool InteriorInstance::onAdd()
380380
if (materialUsages.find(j) == materialUsages.end()) continue;
381381
Material* mat = pInterior->mMaterialList->getMappedMaterial(j);
382382
if (mat != NULL)
383-
foundAllMaterials = foundAllMaterials && mat->preloadTextures();
383+
{
384+
//char errorBuff[4096];
385+
//errorBuff[0] = '\0';
386+
Vector<const char*> errorBuff;
387+
foundAllMaterials = foundAllMaterials && mat->preloadTextures(errorBuff);
388+
389+
if (!errorBuff.empty())
390+
{
391+
Con::errorf(ConsoleLogEntry::General, "Error preloading material(%s):", pInterior->mMaterialList->getMaterialName(j));
392+
Con::errorf("{");
393+
for (U32 k = 0; k < errorBuff.size(); k++)
394+
{
395+
Con::errorf(" missing file %s", errorBuff[k]);
396+
}
397+
Con::errorf("}");
398+
}
384399

385-
if (!foundAllMaterials)
386-
Con::errorf(ConsoleLogEntry::General, "missing texture for material: %s", pInterior->mMaterialList->getMaterialName(j));
400+
//if (dStrlen(errorBuff) > 0)
401+
// Con::errorf(ConsoleLogEntry::General, "Error preloading material(%s):\n{%s\n}", pInterior->mMaterialList->getMaterialName(j), errorBuff);
402+
}
387403
}
388404
}
389405
if (!foundAllMaterials) {
390406
Con::errorf(ConsoleLogEntry::General, "Unable to load interior due to missing materials: %s", mInteriorFileName);
391407
NetConnection::setLastError("Unable to load interior due to missing materials: %s", mInteriorFileName);
392408
return false;
393409
}
394-
410+
395411

396412

397413
if (!isClientObject())

engine/source/materials/customMaterial.cpp

+31-7
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,45 @@ void CustomMaterial::initPersistFields()
6969

7070
}
7171

72-
bool CustomMaterial::preloadTextures()
72+
bool CustomMaterial::preloadTextures(Vector<const char*>& errorBuffer)
7373
{
74-
bool found = Parent::preloadTextures();
74+
bool found = Parent::preloadTextures(errorBuffer);
7575
for (int i = 0; i < MAX_TEX_PER_PASS; i++)
7676
{
77-
found = found && (!texFilename[i] || didFindTexture(texFilename[i]));
77+
bool foundTex = (!texFilename[i] || didFindTexture(texFilename[i]));
78+
if (!foundTex)
79+
{
80+
errorBuffer.push_back(texFilename[i]);
81+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find texture: %s", errorBuffer, texFilename[i]);
82+
}
83+
found = found && foundTex;
7884
}
7985
for (int i = 0; i < MAX_PASSES; i++)
8086
{
81-
found = found && (!pass[i] || pass[i]->preloadTextures());
87+
found = found && (!pass[i] || pass[i]->preloadTextures(errorBuffer));
8288
}
8389
if (fallback != NULL)
84-
found = found && fallback->preloadTextures();
85-
found = found && (!mShaderData->DXVertexShaderName || ResourceManager->find(mShaderData->getVertexShaderPath())); // Transfer shaders too lmao (attempt)
86-
found = found && (!mShaderData->DXVertexShaderName || ResourceManager->find(mShaderData->getPixelShaderPath()));
90+
found = found && fallback->preloadTextures(errorBuffer);
91+
92+
bool foundVert = (!mShaderData->DXVertexShaderName || ResourceManager->find(mShaderData->getVertexShaderPath())); // Transfer shaders too lmao (attempt)
93+
if (!foundVert)
94+
{
95+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find vertex shader: %s", errorBuffer,
96+
// mShaderData->getVertexShaderPath());
97+
98+
errorBuffer.push_back(mShaderData->getVertexShaderPath());
99+
}
100+
found = found && foundVert;
101+
102+
bool foundPixel = (!mShaderData->DXPixelShaderName || ResourceManager->find(mShaderData->getPixelShaderPath()));
103+
if (!foundPixel)
104+
{
105+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find pixel shader: %s", errorBuffer,
106+
// mShaderData->getPixelShaderPath());
107+
108+
errorBuffer.push_back(mShaderData->getPixelShaderPath());
109+
}
110+
found = found && foundPixel;
87111

88112
return found;
89113
}

engine/source/materials/customMaterial.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class CustomMaterial : public Material
7272

7373
static void initPersistFields();
7474
static void updateTime();
75-
virtual bool preloadTextures();
75+
virtual bool preloadTextures(Vector<const char*>& errorBuffer);
7676
const char* mShaderDataName;
7777
ShaderData* mShaderData;
7878

engine/source/materials/material.cpp

+57-7
Original file line numberDiff line numberDiff line change
@@ -320,21 +320,71 @@ void Material::updateTime()
320320
}
321321
}
322322

323-
bool Material::preloadTextures()
323+
bool Material::preloadTextures(Vector<const char*>& errorBuffer)
324324
{
325325
bool found = true;
326326
for (int i = 0; i < MAX_STAGES; i++)
327327
{
328-
found = found && (!baseTexFilename[i] || didFindTexture(baseTexFilename[i]));
329-
found = found && (!detailFilename[i] || didFindTexture(detailFilename[i]));
330-
found = found && (!bumpFilename[i] || didFindTexture(bumpFilename[i]));
331-
found = found && (!envFilename[i] || didFindTexture(envFilename[i]));
328+
bool foundBaseTex = (!baseTexFilename[i] || didFindTexture(baseTexFilename[i]));
329+
if (!foundBaseTex)
330+
{
331+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find base texture: %s", errorBuffer,
332+
// baseTexFilename[i]);
333+
334+
errorBuffer.push_back(baseTexFilename[i]);
335+
}
336+
found = found && foundBaseTex;
337+
338+
bool foundDetail = (!detailFilename[i] || didFindTexture(detailFilename[i]));
339+
if (!foundDetail)
340+
{
341+
errorBuffer.push_back(detailFilename[i]);
342+
343+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find detail texture: %s", errorBuffer,
344+
// detailFilename[i]);
345+
}
346+
found = found && foundDetail;
347+
348+
bool foundBump = (!bumpFilename[i] || didFindTexture(bumpFilename[i]));
349+
if (!foundBump)
350+
{
351+
errorBuffer.push_back(bumpFilename[i]);
352+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find bump texture: %s", errorBuffer,
353+
// bumpFilename[i]);
354+
}
355+
found = found && foundBump;
356+
357+
bool foundEnv = (!envFilename[i] || didFindTexture(envFilename[i]));
358+
if (!foundEnv)
359+
{
360+
errorBuffer.push_back(envFilename[i]);
361+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find env texture: %s", errorBuffer,
362+
// envFilename[i]);
363+
}
364+
found = found && foundEnv;
365+
}
366+
bool foundNoiseTex = (!noiseTexFileName || didFindTexture(noiseTexFileName));
367+
if (!foundNoiseTex)
368+
{
369+
errorBuffer.push_back(noiseTexFileName);
370+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find noise texture: %s", errorBuffer,
371+
// noiseTexFileName);
332372
}
333-
found = found && (!noiseTexFileName || didFindTexture(noiseTexFileName));
373+
found = found && foundNoiseTex;
374+
334375
if (mCubemapData != NULL && !dynamicCubemap)
335376
{
336377
for (int i = 0; i < 6; i++)
337-
found = found && (!mCubemapData->cubeFaceFile[i] || didFindTexture(mCubemapData->cubeFaceFile[i]));
378+
{
379+
bool foundCubemap = (!mCubemapData->cubeFaceFile[i] || didFindTexture(mCubemapData->cubeFaceFile[i]));
380+
if (!foundCubemap)
381+
{
382+
errorBuffer.push_back(mCubemapData->cubeFaceFile[i]);
383+
//dSprintf(errorBuffer, errorBufferSize, "%s\n Could not find cubemap face texture: %s", errorBuffer,
384+
// mCubemapData->cubeFaceFile[i]);
385+
}
386+
found = found && foundCubemap;
387+
}
338388
}
339389
return found;
340390
}

engine/source/materials/material.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ class Material : public SimObject
242242
bool isIFL(){ return mIsIFL; }
243243
bool isTranslucent() { return translucent || subPassTranslucent; }
244244
char* getPath() { return mPath; }
245-
virtual bool preloadTextures();
245+
virtual bool preloadTextures(Vector<const char*>& errorBuffer);
246246
bool didFindTexture(const char* path);
247247

248248
void updateTimeBasedParams();

0 commit comments

Comments
 (0)