mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 23:32:48 +02:00
enable js baking from non-local file
This commit is contained in:
parent
270b96aa8d
commit
162573bc63
6 changed files with 87 additions and 25 deletions
|
@ -11,9 +11,11 @@
|
||||||
|
|
||||||
#include "JSBaker.h"
|
#include "JSBaker.h"
|
||||||
|
|
||||||
#include <PathUtils.h>
|
#include <QtNetwork/QNetworkReply>
|
||||||
|
|
||||||
#include "Baker.h"
|
#include <NetworkAccessManager.h>
|
||||||
|
#include <SharedUtil.h>
|
||||||
|
#include <PathUtils.h>
|
||||||
|
|
||||||
const int ASCII_CHARACTERS_UPPER_LIMIT = 126;
|
const int ASCII_CHARACTERS_UPPER_LIMIT = 126;
|
||||||
|
|
||||||
|
@ -21,25 +23,79 @@ JSBaker::JSBaker(const QUrl& jsURL, const QString& bakedOutputDir) :
|
||||||
_jsURL(jsURL),
|
_jsURL(jsURL),
|
||||||
_bakedOutputDir(bakedOutputDir)
|
_bakedOutputDir(bakedOutputDir)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSBaker::bake() {
|
void JSBaker::bake() {
|
||||||
qCDebug(js_baking) << "JS Baker " << _jsURL << "bake starting";
|
qCDebug(js_baking) << "JS Baker " << _jsURL << "bake starting";
|
||||||
|
|
||||||
// Import file to start baking
|
// once our texture is loaded, kick off a the processing
|
||||||
QFile jsFile(_jsURL.toLocalFile());
|
connect(this, &JSBaker::originalScriptLoaded, this, &JSBaker::processScript);
|
||||||
if (!jsFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
|
||||||
handleError("Error opening " + _jsURL.fileName() + " for reading");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (_jsURL.isEmpty()) {
|
||||||
|
// first load the texture (either locally or remotely)
|
||||||
|
loadScript();
|
||||||
|
} else {
|
||||||
|
// we already have a texture passed to us, use that
|
||||||
|
emit originalScriptLoaded();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSBaker::loadScript() {
|
||||||
|
// check if the texture is local or first needs to be downloaded
|
||||||
|
if (_jsURL.isLocalFile()) {
|
||||||
|
// load up the local file
|
||||||
|
QFile localScript(_jsURL.toLocalFile());
|
||||||
|
if (!localScript.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||||
|
handleError("Error opening " + _jsURL.fileName() + " for reading");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_originalScript = localScript.readAll();
|
||||||
|
|
||||||
|
emit originalScriptLoaded();
|
||||||
|
} else {
|
||||||
|
// remote file, kick off a download
|
||||||
|
auto& networkAccessManager = NetworkAccessManager::getInstance();
|
||||||
|
|
||||||
|
QNetworkRequest networkRequest;
|
||||||
|
|
||||||
|
// setup the request to follow re-directs and always hit the network
|
||||||
|
networkRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||||
|
networkRequest.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysNetwork);
|
||||||
|
networkRequest.setHeader(QNetworkRequest::UserAgentHeader, HIGH_FIDELITY_USER_AGENT);
|
||||||
|
|
||||||
|
networkRequest.setUrl(_jsURL);
|
||||||
|
|
||||||
|
qCDebug(js_baking) << "Downloading" << _jsURL;
|
||||||
|
|
||||||
|
// kickoff the download, wait for slot to tell us it is done
|
||||||
|
auto networkReply = networkAccessManager.get(networkRequest);
|
||||||
|
connect(networkReply, &QNetworkReply::finished, this, &JSBaker::handleScriptNetworkReply);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSBaker::handleScriptNetworkReply() {
|
||||||
|
auto requestReply = qobject_cast<QNetworkReply*>(sender());
|
||||||
|
|
||||||
|
if (requestReply->error() == QNetworkReply::NoError) {
|
||||||
|
qCDebug(js_baking) << "Downloaded texture" << _jsURL;
|
||||||
|
|
||||||
|
// store the original texture so it can be passed along for the bake
|
||||||
|
_originalScript = requestReply->readAll();
|
||||||
|
|
||||||
|
emit originalScriptLoaded();
|
||||||
|
} else {
|
||||||
|
// add an error to our list stating that this texture could not be downloaded
|
||||||
|
handleError("Error downloading " + _jsURL.toString() + " - " + requestReply->errorString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void JSBaker::processScript() {
|
||||||
// Read file into an array
|
// Read file into an array
|
||||||
QByteArray inputJS = jsFile.readAll();
|
|
||||||
QByteArray outputJS;
|
QByteArray outputJS;
|
||||||
|
|
||||||
// Call baking on inputJS and store result in outputJS
|
// Call baking on inputJS and store result in outputJS
|
||||||
bool success = bakeJS(inputJS, outputJS);
|
bool success = bakeJS(_originalScript, outputJS);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
qCDebug(js_baking) << "Bake Failed";
|
qCDebug(js_baking) << "Bake Failed";
|
||||||
handleError("Unterminated multi-line comment");
|
handleError("Unterminated multi-line comment");
|
||||||
|
|
|
@ -25,14 +25,24 @@ public:
|
||||||
JSBaker(const QUrl& jsURL, const QString& bakedOutputDir);
|
JSBaker(const QUrl& jsURL, const QString& bakedOutputDir);
|
||||||
static bool bakeJS(const QByteArray& inputFile, QByteArray& outputFile);
|
static bool bakeJS(const QByteArray& inputFile, QByteArray& outputFile);
|
||||||
|
|
||||||
QString getJSPath() const { return _jsURL.fileName(); }
|
QString getJSPath() const { return _jsURL.toDisplayString(); }
|
||||||
QString getBakedJSFilePath() const { return _bakedJSFilePath; }
|
QString getBakedJSFilePath() const { return _bakedJSFilePath; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
virtual void bake() override;
|
virtual void bake() override;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void originalScriptLoaded();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void processScript();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void loadScript();
|
||||||
|
void handleScriptNetworkReply();
|
||||||
|
|
||||||
QUrl _jsURL;
|
QUrl _jsURL;
|
||||||
|
QByteArray _originalScript;
|
||||||
QString _bakedOutputDir;
|
QString _bakedOutputDir;
|
||||||
QString _bakedJSFilePath;
|
QString _bakedJSFilePath;
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,7 @@
|
||||||
#include "baking/BakerLibrary.h"
|
#include "baking/BakerLibrary.h"
|
||||||
|
|
||||||
DomainBaker::DomainBaker(const QUrl& localModelFileURL, const QString& domainName,
|
DomainBaker::DomainBaker(const QUrl& localModelFileURL, const QString& domainName,
|
||||||
const QString& baseOutputPath, const QUrl& destinationPath,
|
const QString& baseOutputPath, const QUrl& destinationPath) :
|
||||||
bool shouldRebakeOriginals) :
|
|
||||||
_localEntitiesFileURL(localModelFileURL),
|
_localEntitiesFileURL(localModelFileURL),
|
||||||
_domainName(domainName),
|
_domainName(domainName),
|
||||||
_baseOutputPath(baseOutputPath)
|
_baseOutputPath(baseOutputPath)
|
||||||
|
@ -178,7 +177,8 @@ void DomainBaker::addModelBaker(const QString& property, const QString& url, QJs
|
||||||
}
|
}
|
||||||
|
|
||||||
void DomainBaker::addTextureBaker(const QString& property, const QString& url, image::TextureUsage::Type type, QJsonValueRef& jsonRef) {
|
void DomainBaker::addTextureBaker(const QString& property, const QString& url, image::TextureUsage::Type type, QJsonValueRef& jsonRef) {
|
||||||
auto idx = url.lastIndexOf('.');
|
QString cleanURL = QUrl(url).adjusted(QUrl::RemoveQuery | QUrl::RemoveFragment).toDisplayString();
|
||||||
|
auto idx = cleanURL.lastIndexOf('.');
|
||||||
auto extension = idx >= 0 ? url.mid(idx + 1).toLower() : "";
|
auto extension = idx >= 0 ? url.mid(idx + 1).toLower() : "";
|
||||||
|
|
||||||
if (QImageReader::supportedImageFormats().contains(extension.toLatin1())) {
|
if (QImageReader::supportedImageFormats().contains(extension.toLatin1())) {
|
||||||
|
@ -211,6 +211,8 @@ void DomainBaker::addTextureBaker(const QString& property, const QString& url, i
|
||||||
// add this QJsonValueRef to our multi hash so that it can re-write the texture URL
|
// add this QJsonValueRef to our multi hash so that it can re-write the texture URL
|
||||||
// to the baked version once the baker is complete
|
// to the baked version once the baker is complete
|
||||||
_entitiesNeedingRewrite.insert(textureURL, { property, jsonRef });
|
_entitiesNeedingRewrite.insert(textureURL, { property, jsonRef });
|
||||||
|
} else {
|
||||||
|
qDebug() << "Texture extension not supported: " << extension;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -551,6 +553,7 @@ void DomainBaker::handleFinishedScriptBaker() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove the baked URL from the multi hash of entities needing a re-write
|
// remove the baked URL from the multi hash of entities needing a re-write
|
||||||
|
|
||||||
_entitiesNeedingRewrite.remove(baker->getJSPath());
|
_entitiesNeedingRewrite.remove(baker->getJSPath());
|
||||||
|
|
||||||
// drop our shared pointer to this baker so that it gets cleaned up
|
// drop our shared pointer to this baker so that it gets cleaned up
|
||||||
|
@ -611,5 +614,5 @@ void DomainBaker::writeNewEntitiesFile() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "Exported entities file with baked model URLs to" << bakedEntitiesFilePath;
|
qDebug() << "Exported baked entities file to" << bakedEntitiesFilePath;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,8 +29,7 @@ public:
|
||||||
// This means that we need to put all of the FBX importing/exporting from the same process on the same thread.
|
// This means that we need to put all of the FBX importing/exporting from the same process on the same thread.
|
||||||
// That means you must pass a usable running QThread when constructing a domain baker.
|
// That means you must pass a usable running QThread when constructing a domain baker.
|
||||||
DomainBaker(const QUrl& localEntitiesFileURL, const QString& domainName,
|
DomainBaker(const QUrl& localEntitiesFileURL, const QString& domainName,
|
||||||
const QString& baseOutputPath, const QUrl& destinationPath,
|
const QString& baseOutputPath, const QUrl& destinationPath);
|
||||||
bool shouldRebakeOriginals = false);
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void allModelsFinished();
|
void allModelsFinished();
|
||||||
|
|
|
@ -126,10 +126,6 @@ void DomainBakeWidget::setupUI() {
|
||||||
// start a new row for the next component
|
// start a new row for the next component
|
||||||
++rowIndex;
|
++rowIndex;
|
||||||
|
|
||||||
// setup a checkbox to allow re-baking of original assets
|
|
||||||
_rebakeOriginalsCheckBox = new QCheckBox("Re-bake originals");
|
|
||||||
gridLayout->addWidget(_rebakeOriginalsCheckBox, rowIndex, 0);
|
|
||||||
|
|
||||||
// add a button that will kickoff the bake
|
// add a button that will kickoff the bake
|
||||||
QPushButton* bakeButton = new QPushButton("Bake");
|
QPushButton* bakeButton = new QPushButton("Bake");
|
||||||
connect(bakeButton, &QPushButton::clicked, this, &DomainBakeWidget::bakeButtonClicked);
|
connect(bakeButton, &QPushButton::clicked, this, &DomainBakeWidget::bakeButtonClicked);
|
||||||
|
@ -211,8 +207,7 @@ void DomainBakeWidget::bakeButtonClicked() {
|
||||||
auto fileToBakeURL = QUrl::fromLocalFile(_entitiesFileLineEdit->text());
|
auto fileToBakeURL = QUrl::fromLocalFile(_entitiesFileLineEdit->text());
|
||||||
auto domainBaker = std::unique_ptr<DomainBaker> {
|
auto domainBaker = std::unique_ptr<DomainBaker> {
|
||||||
new DomainBaker(fileToBakeURL, _domainNameLineEdit->text(),
|
new DomainBaker(fileToBakeURL, _domainNameLineEdit->text(),
|
||||||
outputDirectory.absolutePath(), _destinationPathLineEdit->text(),
|
outputDirectory.absolutePath(), _destinationPathLineEdit->text())
|
||||||
_rebakeOriginalsCheckBox->isChecked())
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// make sure we hear from the baker when it is done
|
// make sure we hear from the baker when it is done
|
||||||
|
|
|
@ -45,7 +45,6 @@ private:
|
||||||
QLineEdit* _entitiesFileLineEdit;
|
QLineEdit* _entitiesFileLineEdit;
|
||||||
QLineEdit* _outputDirLineEdit;
|
QLineEdit* _outputDirLineEdit;
|
||||||
QLineEdit* _destinationPathLineEdit;
|
QLineEdit* _destinationPathLineEdit;
|
||||||
QCheckBox* _rebakeOriginalsCheckBox;
|
|
||||||
|
|
||||||
Setting::Handle<QString> _domainNameSetting;
|
Setting::Handle<QString> _domainNameSetting;
|
||||||
Setting::Handle<QString> _exportDirectory;
|
Setting::Handle<QString> _exportDirectory;
|
||||||
|
|
Loading…
Reference in a new issue