Skip to content

Commit

Permalink
Work around not-found textures.
Browse files Browse the repository at this point in the history
As discussed in IRC and Discord, 3ds Max does some manipulation and
pretty much always successfully loads the bitmap data. Unfortunately,
we are trying to access the file manually here, which might be an
absolute path to a file on another machine. This path may not be valid
on our system, which fails, causing textures to be duplicated.
  • Loading branch information
Hoikas committed Nov 18, 2024
1 parent 5cdc425 commit f9337d0
Showing 1 changed file with 26 additions and 12 deletions.
38 changes: 26 additions & 12 deletions Sources/MaxPlugin/MaxConvert/plBitmapCreator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -552,16 +552,23 @@ plBitmap *plBitmapCreator::ICreateTexture( plBitmapData *bd, const plLocation &l
// Texture reuse optimization
if( texture )
{
WIN32_FILE_ATTRIBUTE_DATA fileAttrib;
GetFileAttributesExW(bd->fileName.WideString().data(), GetFileExInfoStandard, &fileAttrib);
FILETIME &fileTime = fileAttrib.ftLastWriteTime;
WIN32_FILE_ATTRIBUTE_DATA fileAttrib{};
if (GetFileAttributesExW(bd->fileName.WideString().data(), GetFileExInfoStandard, &fileAttrib) != FALSE)
{
FILETIME &fileTime = fileAttrib.ftLastWriteTime;

// If this texture has been modified since the last export, delete the old version but reuse the key
if (!texture->IsSameModifiedTime(fileTime.dwLowDateTime, fileTime.dwHighDateTime))
// If this texture has been modified since the last export, delete the old version but reuse the key
if (!texture->IsSameModifiedTime(fileTime.dwLowDateTime, fileTime.dwHighDateTime))
{
DeleteExportedBitmap( texture->GetKey() );
texture = nullptr;
key = nullptr;
}
}
else
{
DeleteExportedBitmap( texture->GetKey() );
texture = nullptr;
key = nullptr;
// Well, this really sucks. We couldn't tell what the modify time is, so just pretend all is well (but assert in Debug mode)
hsAssert(0, ST::format("Couldn't get bitmap '{}' modify time: {}", bd->fileName, hsCOMError(hsLastWin32Error, GetLastError()).c_str()));
}
}

Expand Down Expand Up @@ -644,10 +651,17 @@ plBitmap *plBitmapCreator::ICreateTexture( plBitmapData *bd, const plLocation &l
}

// Texture reuse optimization
WIN32_FILE_ATTRIBUTE_DATA fileAttrib;
GetFileAttributesExW(bd->fileName.WideString().data(), GetFileExInfoStandard, &fileAttrib);
FILETIME &fileTime = fileAttrib.ftLastWriteTime;
texture->SetModifiedTime(fileTime.dwLowDateTime, fileTime.dwHighDateTime);
WIN32_FILE_ATTRIBUTE_DATA fileAttrib{};
if (GetFileAttributesExW(bd->fileName.WideString().data(), GetFileExInfoStandard, &fileAttrib) != FALSE)
{
FILETIME &fileTime = fileAttrib.ftLastWriteTime;
texture->SetModifiedTime(fileTime.dwLowDateTime, fileTime.dwHighDateTime);
}
else
{
// Well, this really sucks. We couldn't tell what the modify time is, so just pretend all is well (but assert in Debug mode)
hsAssert(0, ST::format("Couldn't set bitmap '{}' modify time: {}", bd->fileName, hsCOMError(hsLastWin32Error, GetLastError()).c_str()));
}

// Add to our list of created textures and ref, since we have a hold of them
IAddBitmap( texture );
Expand Down

0 comments on commit f9337d0

Please sign in to comment.