summaryrefslogtreecommitdiffstats
path: root/src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp')
-rw-r--r--src/Runtime/Source/runtime/Qt3DSQmlEngine.cpp53
1 files changed, 53 insertions, 0 deletions
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)
{