mirror of
https://github.com/overte-org/overte.git
synced 2025-08-05 18:38:24 +02:00
Refactored ModelBaker
This commit is contained in:
parent
d8b0a6360e
commit
730202b7fc
2 changed files with 51 additions and 54 deletions
|
@ -38,8 +38,6 @@ ModelBaker::ModelBaker(const QUrl& inputModelURL, TextureBakerThreadGetter input
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelBaker::bake() {}
|
|
||||||
|
|
||||||
void ModelBaker::abort() {
|
void ModelBaker::abort() {
|
||||||
Baker::abort();
|
Baker::abort();
|
||||||
|
|
||||||
|
@ -288,38 +286,6 @@ QByteArray* ModelBaker::compressTexture(QString modelTextureFileName, getTexture
|
||||||
return &textureChild;
|
return &textureChild;
|
||||||
}
|
}
|
||||||
|
|
||||||
QUrl ModelBaker::getTextureURL(const QFileInfo& textureFileInfo, QString relativeFileName, bool isEmbedded) {
|
|
||||||
QUrl urlToTexture;
|
|
||||||
|
|
||||||
// use QFileInfo to easily split up the existing texture filename into its components
|
|
||||||
auto apparentRelativePath = QFileInfo(relativeFileName.replace("\\", "/"));
|
|
||||||
|
|
||||||
if (isEmbedded) {
|
|
||||||
urlToTexture = modelURL.toString() + "/" + apparentRelativePath.filePath();
|
|
||||||
} else {
|
|
||||||
if (textureFileInfo.exists() && textureFileInfo.isFile()) {
|
|
||||||
// set the texture URL to the local texture that we have confirmed exists
|
|
||||||
urlToTexture = QUrl::fromLocalFile(textureFileInfo.absoluteFilePath());
|
|
||||||
} else {
|
|
||||||
// external texture that we'll need to download or find
|
|
||||||
|
|
||||||
// this is a relative file path which will require different handling
|
|
||||||
// depending on the location of the original model
|
|
||||||
if (modelURL.isLocalFile() && apparentRelativePath.exists() && apparentRelativePath.isFile()) {
|
|
||||||
// the absolute path we ran into for the texture in the model exists on this machine
|
|
||||||
// so use that file
|
|
||||||
urlToTexture = QUrl::fromLocalFile(apparentRelativePath.absoluteFilePath());
|
|
||||||
} else {
|
|
||||||
// we didn't find the texture on this machine at the absolute path
|
|
||||||
// so assume that it is right beside the model to match the behaviour of interface
|
|
||||||
urlToTexture = modelURL.resolved(apparentRelativePath.fileName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return urlToTexture;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ModelBaker::bakeTexture(const QUrl& textureURL, image::TextureUsage::Type textureType,
|
void ModelBaker::bakeTexture(const QUrl& textureURL, image::TextureUsage::Type textureType,
|
||||||
const QDir& outputDir, const QString& bakedFilename, const QByteArray& textureContent) {
|
const QDir& outputDir, const QString& bakedFilename, const QByteArray& textureContent) {
|
||||||
|
|
||||||
|
@ -416,6 +382,57 @@ void ModelBaker::handleBakedTexture() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelBaker::handleAbortedTexture() {
|
||||||
|
// grab the texture bake that was aborted and remove it from our hash since we don't need to track it anymore
|
||||||
|
TextureBaker* bakedTexture = qobject_cast<TextureBaker*>(sender());
|
||||||
|
|
||||||
|
if (bakedTexture) {
|
||||||
|
bakingTextures.remove(bakedTexture->getTextureURL());
|
||||||
|
}
|
||||||
|
|
||||||
|
// since a texture we were baking aborted, our status is also aborted
|
||||||
|
_shouldAbort.store(true);
|
||||||
|
|
||||||
|
// abort any other ongoing texture bakes since we know we'll end up failing
|
||||||
|
for (auto& bakingTexture : bakingTextures) {
|
||||||
|
bakingTexture->abort();
|
||||||
|
}
|
||||||
|
|
||||||
|
checkIfTexturesFinished();
|
||||||
|
}
|
||||||
|
|
||||||
|
QUrl ModelBaker::getTextureURL(const QFileInfo& textureFileInfo, QString relativeFileName, bool isEmbedded) {
|
||||||
|
QUrl urlToTexture;
|
||||||
|
|
||||||
|
// use QFileInfo to easily split up the existing texture filename into its components
|
||||||
|
auto apparentRelativePath = QFileInfo(relativeFileName.replace("\\", "/"));
|
||||||
|
|
||||||
|
if (isEmbedded) {
|
||||||
|
urlToTexture = modelURL.toString() + "/" + apparentRelativePath.filePath();
|
||||||
|
} else {
|
||||||
|
if (textureFileInfo.exists() && textureFileInfo.isFile()) {
|
||||||
|
// set the texture URL to the local texture that we have confirmed exists
|
||||||
|
urlToTexture = QUrl::fromLocalFile(textureFileInfo.absoluteFilePath());
|
||||||
|
} else {
|
||||||
|
// external texture that we'll need to download or find
|
||||||
|
|
||||||
|
// this is a relative file path which will require different handling
|
||||||
|
// depending on the location of the original model
|
||||||
|
if (modelURL.isLocalFile() && apparentRelativePath.exists() && apparentRelativePath.isFile()) {
|
||||||
|
// the absolute path we ran into for the texture in the model exists on this machine
|
||||||
|
// so use that file
|
||||||
|
urlToTexture = QUrl::fromLocalFile(apparentRelativePath.absoluteFilePath());
|
||||||
|
} else {
|
||||||
|
// we didn't find the texture on this machine at the absolute path
|
||||||
|
// so assume that it is right beside the model to match the behaviour of interface
|
||||||
|
urlToTexture = modelURL.resolved(apparentRelativePath.fileName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return urlToTexture;
|
||||||
|
}
|
||||||
|
|
||||||
QString ModelBaker::texturePathRelativeToModel(QUrl modelURL, QUrl textureURL) {
|
QString ModelBaker::texturePathRelativeToModel(QUrl modelURL, QUrl textureURL) {
|
||||||
auto modelPath = modelURL.toString(QUrl::RemoveFilename | QUrl::RemoveQuery | QUrl::RemoveFragment);
|
auto modelPath = modelURL.toString(QUrl::RemoveFilename | QUrl::RemoveQuery | QUrl::RemoveFragment);
|
||||||
auto texturePath = textureURL.toString(QUrl::RemoveFilename | QUrl::RemoveQuery | QUrl::RemoveFragment);
|
auto texturePath = textureURL.toString(QUrl::RemoveFilename | QUrl::RemoveQuery | QUrl::RemoveFragment);
|
||||||
|
@ -451,25 +468,6 @@ void ModelBaker::checkIfTexturesFinished() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelBaker::handleAbortedTexture() {
|
|
||||||
// grab the texture bake that was aborted and remove it from our hash since we don't need to track it anymore
|
|
||||||
TextureBaker* bakedTexture = qobject_cast<TextureBaker*>(sender());
|
|
||||||
|
|
||||||
if (bakedTexture) {
|
|
||||||
bakingTextures.remove(bakedTexture->getTextureURL());
|
|
||||||
}
|
|
||||||
|
|
||||||
// since a texture we were baking aborted, our status is also aborted
|
|
||||||
_shouldAbort.store(true);
|
|
||||||
|
|
||||||
// abort any other ongoing texture bakes since we know we'll end up failing
|
|
||||||
for (auto& bakingTexture : bakingTextures) {
|
|
||||||
bakingTexture->abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
checkIfTexturesFinished();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString ModelBaker::createBakedTextureFileName(const QFileInfo& textureFileInfo) {
|
QString ModelBaker::createBakedTextureFileName(const QFileInfo& textureFileInfo) {
|
||||||
// first make sure we have a unique base name for this texture
|
// first make sure we have a unique base name for this texture
|
||||||
// in case another texture referenced by this model has the same base name
|
// in case another texture referenced by this model has the same base name
|
||||||
|
|
|
@ -54,7 +54,6 @@ protected:
|
||||||
QMultiHash<QUrl, QSharedPointer<TextureBaker>> bakingTextures;
|
QMultiHash<QUrl, QSharedPointer<TextureBaker>> bakingTextures;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual void bake() override;
|
|
||||||
virtual void abort() override;
|
virtual void abort() override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
Loading…
Reference in a new issue