mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01:00
Merge pull request #15425 from sabrina-shanman/bug_hfm_main-thread
(case 22011) Fix model processing occurring on main thread
This commit is contained in:
commit
16da80b9b6
2 changed files with 14 additions and 9 deletions
|
@ -108,6 +108,7 @@ private:
|
||||||
|
|
||||||
using NetworkMaterialResourcePointer = QSharedPointer<NetworkMaterialResource>;
|
using NetworkMaterialResourcePointer = QSharedPointer<NetworkMaterialResource>;
|
||||||
using MaterialMapping = std::vector<std::pair<std::string, NetworkMaterialResourcePointer>>;
|
using MaterialMapping = std::vector<std::pair<std::string, NetworkMaterialResourcePointer>>;
|
||||||
|
Q_DECLARE_METATYPE(MaterialMapping)
|
||||||
|
|
||||||
class MaterialCache : public ResourceCache {
|
class MaterialCache : public ResourceCache {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -282,8 +282,16 @@ void GeometryReader::run() {
|
||||||
hfmModel->scripts.push_back(script.toString());
|
hfmModel->scripts.push_back(script.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do processing on the model
|
||||||
|
baker::Baker modelBaker(hfmModel, _mapping.second, _mapping.first);
|
||||||
|
modelBaker.run();
|
||||||
|
|
||||||
|
auto processedHFMModel = modelBaker.getHFMModel();
|
||||||
|
auto materialMapping = modelBaker.getMaterialMapping();
|
||||||
|
|
||||||
QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition",
|
QMetaObject::invokeMethod(resource.data(), "setGeometryDefinition",
|
||||||
Q_ARG(HFMModel::Pointer, hfmModel), Q_ARG(GeometryMappingPair, _mapping));
|
Q_ARG(HFMModel::Pointer, processedHFMModel), Q_ARG(MaterialMapping, materialMapping));
|
||||||
} catch (const std::exception&) {
|
} catch (const std::exception&) {
|
||||||
auto resource = _resource.toStrongRef();
|
auto resource = _resource.toStrongRef();
|
||||||
if (resource) {
|
if (resource) {
|
||||||
|
@ -317,7 +325,7 @@ public:
|
||||||
void setExtra(void* extra) override;
|
void setExtra(void* extra) override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Q_INVOKABLE void setGeometryDefinition(HFMModel::Pointer hfmModel, const GeometryMappingPair& mapping);
|
Q_INVOKABLE void setGeometryDefinition(HFMModel::Pointer hfmModel, const MaterialMapping& materialMapping);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ModelLoader _modelLoader;
|
ModelLoader _modelLoader;
|
||||||
|
@ -340,14 +348,10 @@ void GeometryDefinitionResource::downloadFinished(const QByteArray& data) {
|
||||||
QThreadPool::globalInstance()->start(new GeometryReader(_modelLoader, _self, _effectiveBaseURL, _mapping, data, _combineParts, _request->getWebMediaType()));
|
QThreadPool::globalInstance()->start(new GeometryReader(_modelLoader, _self, _effectiveBaseURL, _mapping, data, _combineParts, _request->getWebMediaType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GeometryDefinitionResource::setGeometryDefinition(HFMModel::Pointer hfmModel, const GeometryMappingPair& mapping) {
|
void GeometryDefinitionResource::setGeometryDefinition(HFMModel::Pointer hfmModel, const MaterialMapping& materialMapping) {
|
||||||
// Do processing on the model
|
|
||||||
baker::Baker modelBaker(hfmModel, mapping.second, mapping.first);
|
|
||||||
modelBaker.run();
|
|
||||||
|
|
||||||
// Assume ownership of the processed HFMModel
|
// Assume ownership of the processed HFMModel
|
||||||
_hfmModel = modelBaker.getHFMModel();
|
_hfmModel = hfmModel;
|
||||||
_materialMapping = modelBaker.getMaterialMapping();
|
_materialMapping = materialMapping;
|
||||||
|
|
||||||
// Copy materials
|
// Copy materials
|
||||||
QHash<QString, size_t> materialIDAtlas;
|
QHash<QString, size_t> materialIDAtlas;
|
||||||
|
|
Loading…
Reference in a new issue