diff options
author | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-05-22 11:51:14 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@qt.io> | 2019-05-23 16:48:54 +0300 |
commit | 08f021f7fa01ab0a458c939ee2af110e410a841a (patch) | |
tree | 0205a4aedcbd38d7c6946f48bd965c3a1cad23bd | |
parent | 1cc2c2fa919c6f2cf2e1ac836248184258fe779e (diff) |
Support deleting dynamically created meshes and materials
Task-number: QT3DS-3513
Task-number: QT3DS-3514
Change-Id: Iba9168e40e20b534256a6e53c959dd981027fb37
Reviewed-by: Jere Tuliniemi <jere.tuliniemi@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
Reviewed-by: Tomi Korpipää <tomi.korpipaa@qt.io>
Reviewed-by: Antti Määttä <antti.maatta@qt.io>
Reviewed-by: Jari Karppinen <jari.karppinen@qt.io>
-rw-r--r-- | src/Runtime/Source/engine/Qt3DSRuntimeView.cpp | 22 | ||||
-rw-r--r-- | src/Runtime/Source/engine/Qt3DSRuntimeView.h | 2 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/Qt3DSIScriptBridge.h | 4 | ||||
-rw-r--r-- | src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp | 53 | ||||
-rw-r--r-- | src/Runtime/Source/viewer/Qt3DSViewerApp.cpp | 16 | ||||
-rw-r--r-- | src/Runtime/Source/viewer/Qt3DSViewerApp.h | 2 | ||||
-rw-r--r-- | src/Runtime/api/studio3d/q3dscommandqueue.cpp | 4 | ||||
-rw-r--r-- | src/Runtime/api/studio3d/q3dscommandqueue_p.h | 2 | ||||
-rw-r--r-- | src/Runtime/api/studio3d/q3dspresentation.cpp | 37 | ||||
-rw-r--r-- | src/Runtime/api/studio3d/q3dspresentation.h | 4 | ||||
-rw-r--r-- | src/Runtime/api/studio3dqml/q3dsrenderer.cpp | 16 | ||||
-rw-r--r-- | tests/auto/viewer/tst_qt3dsviewer.cpp | 44 | ||||
-rw-r--r-- | tests/auto/viewer/tst_qt3dsviewer.h | 4 |
13 files changed, 205 insertions, 5 deletions
diff --git a/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp b/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp index 2849cd39..fc6c3cac 100644 --- a/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp +++ b/src/Runtime/Source/engine/Qt3DSRuntimeView.cpp @@ -218,7 +218,9 @@ public: void deleteElements(const QStringList &elementPaths) override; void createMaterials(const QString &elementPath, const QStringList &materialDefinitions) override; + void deleteMaterials(const QString &elementPath, const QStringList &materialNames) override; void createMesh(const QString &name, qt3dsimp::Mesh *mesh) override; + void deleteMeshes(const QStringList &meshNames) override; void SetAttribute(const char *elementPath, const char *attributeName, const char *value) override; bool GetAttribute(const char *elementPath, const char *attributeName, void *value) override; @@ -670,6 +672,16 @@ void CRuntimeView::createMaterials(const QString &elementPath, } } +void CRuntimeView::deleteMaterials(const QString &elementPath, const QStringList &materialNames) +{ + if (m_Application) { + Q3DStudio::CQmlEngine &theBridgeEngine + = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml()); + theBridgeEngine.deleteMaterials(elementPath, materialNames, + &m_RuntimeFactory->GetQt3DSRenderContext().GetRenderer()); + } +} + void CRuntimeView::createMesh(const QString &name, qt3dsimp::Mesh *mesh) { if (m_Application) { @@ -680,6 +692,16 @@ void CRuntimeView::createMesh(const QString &name, qt3dsimp::Mesh *mesh) } } +void CRuntimeView::deleteMeshes(const QStringList &meshNames) +{ + if (m_Application) { + Q3DStudio::CQmlEngine &theBridgeEngine + = static_cast<Q3DStudio::CQmlEngine &>(m_RuntimeFactoryCore->GetScriptEngineQml()); + theBridgeEngine.deleteMeshes( + meshNames, &m_RuntimeFactory->GetQt3DSRenderContext().GetBufferManager()); + } +} + void CRuntimeView::SetAttribute(const char *elementPath, const char *attributeName, const char *value) { diff --git a/src/Runtime/Source/engine/Qt3DSRuntimeView.h b/src/Runtime/Source/engine/Qt3DSRuntimeView.h index 5273d635..9ade9c7f 100644 --- a/src/Runtime/Source/engine/Qt3DSRuntimeView.h +++ b/src/Runtime/Source/engine/Qt3DSRuntimeView.h @@ -205,7 +205,9 @@ public: virtual void deleteElements(const QStringList &elementPaths) = 0; virtual void createMaterials(const QString &elementPath, const QStringList &materialDefinitions) = 0; + virtual void deleteMaterials(const QString &elementPath, const QStringList &materialNames) = 0; virtual void createMesh(const QString &name, qt3dsimp::Mesh *mesh) = 0; + virtual void deleteMeshes(const QStringList &meshNames) = 0; virtual void SetAttribute(const char *elementPath, const char *attributeName, const char *value) = 0; virtual bool GetAttribute(const char *elementPath, const char *attributeName, void *value) = 0; diff --git a/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h b/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h index d570a392..abbfcd5b 100644 --- a/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h +++ b/src/Runtime/Source/runtime/Qt3DSIScriptBridge.h @@ -177,8 +177,12 @@ public: // Elements qt3ds::render::ICustomMaterialSystem *customMaterialSystem, qt3ds::render::IDynamicObjectSystem *dynamicObjectSystem, qt3ds::render::IQt3DSRenderer *renderer) = 0; + virtual void deleteMaterials(const QString &elementPath, const QStringList &materialNames, + qt3ds::render::IQt3DSRenderer *renderer) = 0; virtual void createMesh(const QString &name, qt3dsimp::Mesh *mesh, qt3ds::render::IBufferManager *bufferManager) = 0; + virtual void deleteMeshes(const QStringList &elementPath, + qt3ds::render::IBufferManager *bufferManager) = 0; public: // Components virtual void GotoSlide(const char *component, const char *slideName, diff --git a/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp b/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp index 02bfbd5b..3249c6d4 100644 --- a/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp +++ b/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp @@ -437,8 +437,12 @@ public: qt3ds::render::ICustomMaterialSystem *customMaterialSystem, IDynamicObjectSystem *dynamicObjectSystem, qt3ds::render::IQt3DSRenderer *renderer) override; + void deleteMaterials(const QString &elementPath, const QStringList &materialNames, + qt3ds::render::IQt3DSRenderer *renderer) override; void createMesh(const QString &name, qt3dsimp::Mesh *mesh, qt3ds::render::IBufferManager *bufferManager) override; + void deleteMeshes(const QStringList &meshNames, + qt3ds::render::IBufferManager *bufferManager) override; void GotoSlide(const char *component, const char *slideName, const SScriptEngineGotoSlideArgs &inArgs) override; @@ -1645,6 +1649,44 @@ void CQmlEngineImpl::createMaterials(const QString &elementPath, handleError(); } +void CQmlEngineImpl::deleteMaterials(const QString &elementPath, + const QStringList &materialNames, + IQt3DSRenderer *renderer) +{ + // Material class (i.e. the shader) is not deleted as those can be shared between materials, + // so we just delete the material elements from the container and the related render objects + + QByteArray thePath = elementPath.toUtf8(); + TElement *element = getTarget(thePath.constData()); + Q_ASSERT_X(element, __FUNCTION__, QStringLiteral("Invalid element path: '%1'") + .arg(elementPath).toUtf8()); + CPresentation *presentation = static_cast<CPresentation *>(element->GetBelongedPresentation()); + + // Find material container + auto &strTable = presentation->GetStringTable(); + TElement *rootElement = presentation->GetRoot(); + const auto containerName = strTable.RegisterStr("__Container"); + TElement *container = rootElement->FindChild(CHash::HashString(containerName.c_str())); + Q_ASSERT_X(container, __FUNCTION__, + QStringLiteral("No material container found for element: '%1'") + .arg(elementPath).toUtf8()); + + QVector<TElement *> elementsToDelete; + for (const auto &materialName : materialNames) { + TElement *firstChild = nullptr; + TElement *nextChild = container->GetChild(); + firstChild = nextChild; + while (nextChild) { + QString childName = QString::fromUtf8(nextChild->m_Name); + if (childName == materialName) + elementsToDelete << nextChild; + nextChild = nextChild->GetSibling(); + } + } + + deleteElements(elementsToDelete, renderer); +} + void CQmlEngineImpl::createMesh(const QString &name, qt3dsimp::Mesh *mesh, qt3ds::render::IBufferManager *bufferManager) { @@ -1652,6 +1694,17 @@ void CQmlEngineImpl::createMesh(const QString &name, qt3dsimp::Mesh *mesh, bufferManager->loadCustomMesh(name, mesh); } +void CQmlEngineImpl::deleteMeshes(const QStringList &meshNames, + qt3ds::render::IBufferManager *bufferManager) +{ + for (const auto &meshName : meshNames) { + if (!meshName.isEmpty()) { + CRegisteredString regName = bufferManager->GetStringTable().RegisterStr(meshName); + bufferManager->InvalidateBuffer(regName); + } + } +} + void CQmlEngineImpl::GotoSlide(const char *component, const char *slideName, const SScriptEngineGotoSlideArgs &inArgs) { diff --git a/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp b/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp index b58849aa..094f140f 100644 --- a/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp +++ b/src/Runtime/Source/viewer/Qt3DSViewerApp.cpp @@ -936,6 +936,14 @@ void Q3DSViewerApp::createMaterials(const QString &elementPath, m_Impl.m_view->createMaterials(elementPath, materialDefinitions); } +void Q3DSViewerApp::deleteMaterials(const QString &elementPath, const QStringList &materialNames) +{ + if (!m_Impl.m_view) + return; + + m_Impl.m_view->deleteMaterials(elementPath, materialNames); +} + void Q3DSViewerApp::createMeshes(const QHash<QString, Q3DSViewer::MeshData> &meshData) { if (!m_Impl.m_view) @@ -962,6 +970,14 @@ void Q3DSViewerApp::createMeshes(const QHash<QString, Q3DSViewer::MeshData> &mes SigMeshesCreated(meshData.keys(), error); } +void Q3DSViewerApp::deleteMeshes(const QStringList &meshNames) +{ + if (!m_Impl.m_view) + return; + + m_Impl.m_view->deleteMeshes(meshNames); +} + Q3DSViewerApp &Q3DSViewerApp::Create(void *glContext, Q3DStudio::IAudioPlayer *inAudioPlayer, QElapsedTimer *startupTimer) { diff --git a/src/Runtime/Source/viewer/Qt3DSViewerApp.h b/src/Runtime/Source/viewer/Qt3DSViewerApp.h index f20244f3..975e3b12 100644 --- a/src/Runtime/Source/viewer/Qt3DSViewerApp.h +++ b/src/Runtime/Source/viewer/Qt3DSViewerApp.h @@ -466,7 +466,9 @@ public: const QVector<QHash<QString, QVariant>> &properties); void deleteElements(const QStringList &elementPaths); void createMaterials(const QString &elementPath, const QStringList &materialDefinitions); + void deleteMaterials(const QString &elementPath, const QStringList &materialNames); void createMeshes(const QHash<QString, Q3DSViewer::MeshData> &meshData); + void deleteMeshes(const QStringList &meshNames); QString error(); diff --git a/src/Runtime/api/studio3d/q3dscommandqueue.cpp b/src/Runtime/api/studio3d/q3dscommandqueue.cpp index e7a02073..550dc24f 100644 --- a/src/Runtime/api/studio3d/q3dscommandqueue.cpp +++ b/src/Runtime/api/studio3d/q3dscommandqueue.cpp @@ -268,11 +268,13 @@ void CommandQueue::copyCommands(CommandQueue &fromQueue) fromQueue.commandAt(i).m_data = nullptr; // This queue takes ownership of data break; case CommandType_DeleteElements: + case CommandType_DeleteMeshes: case CommandType_CreateMeshes: queueCommand(source.m_commandType, source.m_data); fromQueue.commandAt(i).m_data = nullptr; // This queue takes ownership of data break; case CommandType_CreateMaterials: + case CommandType_DeleteMaterials: queueCommand(source.m_elementPath, source.m_commandType, source.m_data); fromQueue.commandAt(i).m_data = nullptr; // This queue takes ownership of data break; @@ -313,6 +315,8 @@ void CommandQueue::clear(bool deleteCommandData) break; case CommandType_DeleteElements: case CommandType_CreateMaterials: + case CommandType_DeleteMaterials: + case CommandType_DeleteMeshes: delete static_cast<QStringList *>(cmd.m_data); break; case CommandType_CreateMeshes: { diff --git a/src/Runtime/api/studio3d/q3dscommandqueue_p.h b/src/Runtime/api/studio3d/q3dscommandqueue_p.h index b27f5ae7..12d1b7e3 100644 --- a/src/Runtime/api/studio3d/q3dscommandqueue_p.h +++ b/src/Runtime/api/studio3d/q3dscommandqueue_p.h @@ -71,7 +71,9 @@ enum CommandType { CommandType_CreateElements, CommandType_DeleteElements, CommandType_CreateMaterials, + CommandType_DeleteMaterials, CommandType_CreateMeshes, + CommandType_DeleteMeshes, // Requests CommandType_RequestSlideInfo, diff --git a/src/Runtime/api/studio3d/q3dspresentation.cpp b/src/Runtime/api/studio3d/q3dspresentation.cpp index 0633050e..9d2247df 100644 --- a/src/Runtime/api/studio3d/q3dspresentation.cpp +++ b/src/Runtime/api/studio3d/q3dspresentation.cpp @@ -389,6 +389,25 @@ void Q3DSPresentation::createMaterials(const QString &elementPath, } } +void Q3DSPresentation::deleteMaterial(const QString &elementPath, const QString &materialName) +{ + QStringList materialNames; + materialNames << materialName; + deleteMaterials(elementPath, materialNames); +} + +void Q3DSPresentation::deleteMaterials(const QString &elementPath, const QStringList &materialNames) +{ + if (d_ptr->m_viewerApp) { + d_ptr->m_viewerApp->deleteMaterials(elementPath, materialNames); + } else if (d_ptr->m_commandQueue) { + // We need to copy the list as queue takes ownership of it + QStringList *theMaterialNames = new QStringList(materialNames); + d_ptr->m_commandQueue->queueCommand(elementPath, CommandType_DeleteMaterials, + theMaterialNames); + } +} + /** Creates a mesh specified by given geometry. The given meshName can be used as sourcepath property value for model elements created with future createElement calls. @@ -420,6 +439,24 @@ void Q3DSPresentation::createMeshes(const QHash<QString, const Q3DSGeometry *> & } } +void Q3DSPresentation::deleteMesh(const QString &meshName) +{ + QStringList meshNames; + meshNames << meshName; + deleteMeshes(meshNames); +} + +void Q3DSPresentation::deleteMeshes(const QStringList &meshNames) +{ + if (d_ptr->m_viewerApp) { + d_ptr->m_viewerApp->deleteMeshes(meshNames); + } else if (d_ptr->m_commandQueue) { + // We need to copy the list as queue takes ownership of it + QStringList *theMeshNames = new QStringList(meshNames); + d_ptr->m_commandQueue->queueCommand(CommandType_DeleteMeshes, theMeshNames); + } +} + void Q3DSPresentation::mousePressEvent(QMouseEvent *e) { if (d_ptr->m_viewerApp) { diff --git a/src/Runtime/api/studio3d/q3dspresentation.h b/src/Runtime/api/studio3d/q3dspresentation.h index 4b02ffe5..60191be2 100644 --- a/src/Runtime/api/studio3d/q3dspresentation.h +++ b/src/Runtime/api/studio3d/q3dspresentation.h @@ -101,8 +101,12 @@ public: void deleteElements(const QStringList &elementPaths); void createMaterial(const QString &elementPath, const QString &materialDefinition); void createMaterials(const QString &elementPath, const QStringList &materialDefinitions); + void deleteMaterial(const QString &elementPath, const QString &materialName); + void deleteMaterials(const QString &elementPath, const QStringList &materialNames); void createMesh(const QString &meshName, const Q3DSGeometry &geometry); void createMeshes(const QHash<QString, const Q3DSGeometry *> &meshData); + void deleteMesh(const QString &meshName); + void deleteMeshes(const QStringList &meshNames); public Q_SLOTS: void setSource(const QUrl &source); diff --git a/src/Runtime/api/studio3dqml/q3dsrenderer.cpp b/src/Runtime/api/studio3dqml/q3dsrenderer.cpp index 9ecf5c33..0452bf14 100644 --- a/src/Runtime/api/studio3dqml/q3dsrenderer.cpp +++ b/src/Runtime/api/studio3dqml/q3dsrenderer.cpp @@ -367,6 +367,14 @@ void Q3DSRenderer::processCommands() command.m_data = nullptr; break; } + case CommandType_DeleteMaterials: { + m_runtime->deleteMaterials(cmd.m_elementPath, *static_cast<QStringList *>(cmd.m_data)); + // Runtime makes copy of the data in its own format, so we can delete it now + auto &command = m_commands.commandAt(i); + delete reinterpret_cast<QStringList *>(command.m_data); + command.m_data = nullptr; + break; + } case CommandType_CreateMeshes: { m_runtime->createMeshes(*static_cast<QHash<QString, Q3DSViewer::MeshData> *>( cmd.m_data)); @@ -378,6 +386,14 @@ void Q3DSRenderer::processCommands() command.m_data = nullptr; break; } + case CommandType_DeleteMeshes: { + m_runtime->deleteMeshes(*static_cast<QStringList *>(cmd.m_data)); + // Runtime makes copy of the data in its own format, so we can delete it now + auto &command = m_commands.commandAt(i); + delete reinterpret_cast<QStringList *>(command.m_data); + command.m_data = nullptr; + break; + } case CommandType_RequestSlideInfo: { int current = 0; int previous = 0; diff --git a/tests/auto/viewer/tst_qt3dsviewer.cpp b/tests/auto/viewer/tst_qt3dsviewer.cpp index 4f4b58de..97429039 100644 --- a/tests/auto/viewer/tst_qt3dsviewer.cpp +++ b/tests/auto/viewer/tst_qt3dsviewer.cpp @@ -103,7 +103,7 @@ void tst_qt3dsviewer::init() void tst_qt3dsviewer::cleanup() { - deleteCreatedElements(); + deleteCreated(); if (!m_ignoreError) QCOMPARE(m_studio3DItem->property("error").toString(), {}); m_studio3DItem = nullptr; @@ -388,7 +388,7 @@ void tst_qt3dsviewer::testCreateElement() QTest::qWait(500); QCOMPARE(spyElemCreated.count(), 9); - deleteCreatedElements(); + deleteCreated(); // Switch to slide 1 QVERIFY(spyExited.wait(20000)); @@ -430,6 +430,9 @@ void tst_qt3dsviewer::testCreateMaterial() materialDefinitions << matDef; m_presentation->createMaterials(QStringLiteral("Scene"), materialDefinitions); + m_createdMaterials << QStringLiteral("materials/Basic Blue") + << QStringLiteral("materials/Basic Texture") + << QStringLiteral("materials/Copper"); QObject::connect(m_presentation, &Q3DSPresentation::materialsCreated, [this](const QStringList &materialNames, const QString &error) { @@ -480,11 +483,30 @@ void tst_qt3dsviewer::testCreateMaterial() md.replace(QRegularExpression(QStringLiteral("\"diffuse\">.*<")), QStringLiteral("\"diffuse\">1 1 0 1<")); m_presentation->createMaterial(QStringLiteral("Scene"), md); + m_createdMaterials << QStringLiteral("materials/Just Yellow"); + }); + + // Delete material + QTimer::singleShot(2500, [&]() { + // Material not removed from m_createdMaterials purposefully to ensure deleting already + // deleted material is handled properly later + m_presentation->deleteElement(QStringLiteral("Scene.Layer.Textured Cone")); + m_presentation->deleteMaterial(QStringLiteral("Scene"), "materials/Basic Texture"); + + // Try to use the deleted material - should find a fallback material + QHash<QString, QVariant> data; + data.insert(QStringLiteral("name"), QStringLiteral("Textured Cone 2")); + data.insert(QStringLiteral("sourcepath"), QStringLiteral("#Cone")); + data.insert(QStringLiteral("material"), QStringLiteral("materials/Basic Texture")); + data.insert(QStringLiteral("position"), + QVariant::fromValue<QVector3D>(QVector3D(-100, -300, 200))); + createElement(QStringLiteral("Scene.Layer"), QStringLiteral("Slide1"), data); }); QVERIFY(spyExited.wait(20000)); QCOMPARE(spyMatCreated.count(), 2); - QCOMPARE(spyElemCreated.count(), 4); + QCOMPARE(spyElemCreated.count(), 5); + deleteCreated(); QTest::qWait(200); // Extra wait to verify slide change visually } @@ -523,6 +545,7 @@ void tst_qt3dsviewer::testCreateMesh() QStringLiteral("Scene"), QStringLiteral(":/scenes/simple_cube_animation/materials/Basic Texture.materialdef")); m_presentation->createMesh(QStringLiteral("Pyramid"), pyramid); + m_createdMeshes << QStringLiteral("Pyramid"); QObject::connect(m_presentation, &Q3DSPresentation::meshesCreated, [&](const QStringList &meshNames, const QString &error) { @@ -553,18 +576,31 @@ void tst_qt3dsviewer::testCreateMesh() // Create mesh after start QTimer::singleShot(1000, [&]() { m_presentation->createMesh(QStringLiteral("Star"), star); + m_createdMeshes << QStringLiteral("Star"); + }); + + QTimer::singleShot(3000, [&]() { + m_presentation->deleteElement(QStringLiteral("Scene.Layer.Star")); + m_presentation->deleteMesh(QStringLiteral("Star")); + // Mesh nor removed from m_createdMeshes purposefully to ensure deleting already deleted + // mesh is handled properly later }); QVERIFY(spyExited.wait(20000)); QCOMPARE(spyMeshCreated.count(), 2); QCOMPARE(spyElemCreated.count(), 2); + deleteCreated(); QTest::qWait(200); // Extra wait to verify slide change visually } -void tst_qt3dsviewer::deleteCreatedElements() +void tst_qt3dsviewer::deleteCreated() { m_presentation->deleteElements(m_createdElements); + m_presentation->deleteMaterials(QStringLiteral("Scene"), m_createdMaterials); + m_presentation->deleteMeshes(m_createdMeshes); m_createdElements.clear(); + m_createdMaterials.clear(); + m_createdMeshes.clear(); } void tst_qt3dsviewer::createElement(const QString &parentElementPath, const QString &slideName, diff --git a/tests/auto/viewer/tst_qt3dsviewer.h b/tests/auto/viewer/tst_qt3dsviewer.h index 4cb8063c..e6fae709 100644 --- a/tests/auto/viewer/tst_qt3dsviewer.h +++ b/tests/auto/viewer/tst_qt3dsviewer.h @@ -60,7 +60,7 @@ private Q_SLOTS: void testCreateMesh(); private: - void deleteCreatedElements(); + void deleteCreated(); void createElement(const QString &parentElementPath, const QString &slideName, const QHash<QString, QVariant> &properties); void createGeometries(Q3DSGeometry &pyramid, Q3DSGeometry &star); @@ -70,6 +70,8 @@ private: Q3DSPresentation *m_presentation = nullptr; Q3DSViewerSettings *m_settings = nullptr; QStringList m_createdElements; + QStringList m_createdMaterials; + QStringList m_createdMeshes; bool m_ignoreError = false; }; |