diff options
Diffstat (limited to 'src/Authoring')
97 files changed, 88 insertions, 30444 deletions
diff --git a/src/Authoring/Authoring.pro b/src/Authoring/Authoring.pro index 025a7b42..da658893 100644 --- a/src/Authoring/Authoring.pro +++ b/src/Authoring/Authoring.pro @@ -2,7 +2,6 @@ TEMPLATE = subdirs CONFIG += ordered SUBDIRS += \ - QT3DSDM \ CoreLib \ Common \ Studio/Qt3DStudio.pro diff --git a/src/Authoring/Common/Common.pro b/src/Authoring/Common/Common.pro index 40afde5c..d154d36e 100644 --- a/src/Authoring/Common/Common.pro +++ b/src/Authoring/Common/Common.pro @@ -24,18 +24,18 @@ INCLUDEPATH += \ Code/Serialize \ ../Client/Code/Shared \ ../Client/Code/Core/Utility \ - ../QT3DSDM \ - ../QT3DSDM/Systems \ + ../../Runtime/ogl-runtime/src/dm \ + ../../Runtime/ogl-runtime/src/dm/systems \ ../Studio/Utils \ - ../../Runtime/Source/foundation \ - ../../3rdparty/EASTL/UnknownVersion/include \ - ../../3rdparty/color \ + ../../Runtime/ogl-runtime/src/foundation \ + ../../Runtime/ogl-runtime/src/3rdparty/EASTL/UnknownVersion/include \ + ../../Runtime/ogl-runtime/src/3rdparty/color \ .. PRECOMPILED_HEADER += Code/Qt3DSCommonPrecompile.h SOURCES += \ - ../../3rdparty/color/CColor.cpp \ + ../../Runtime/ogl-runtime/src/3rdparty/color/CColor.cpp \ Code/HiResTimer.cpp \ Code/MasterP.cpp \ Code/MethProf.cpp \ diff --git a/src/Authoring/CoreLib/CoreLib.pro b/src/Authoring/CoreLib/CoreLib.pro index 118e432d..30e5ad81 100644 --- a/src/Authoring/CoreLib/CoreLib.pro +++ b/src/Authoring/CoreLib/CoreLib.pro @@ -33,10 +33,11 @@ INCLUDEPATH += \ ../Client/Code/Shared/Log \ ../Client/Code/Core/Timer \ ../Client/Code/Core/VirtualAssets \ + ../../Runtime/ogl-runtime/src/importlib \ ../QT3DSIMP/Qt3DSImportLib \ - ../QT3DSDM/Systems \ - ../QT3DSDM/Systems/Cores \ ../QT3DSIMP/Qt3DSImportSGTranslation \ + ../../Runtime/ogl-runtime/src/dm/systems \ + ../../Runtime/ogl-runtime/src/dm/systems/cores \ ../Studio \ ../Studio/DragAndDrop \ ../Studio/Render \ @@ -53,17 +54,17 @@ INCLUDEPATH += \ ../Common/Code/Graph \ ../Common/Code/EulerAngles \ ../Common/Code/Serialize \ - ../../Runtime/Source/datamodel \ - ../../Runtime/Source/render \ - ../../Runtime/Source/foundation \ - ../../Runtime/Source/runtimerender \ - ../../Runtime/Source/runtimerender/graphobjects \ - ../../Runtime/Source/runtimerender/resourcemanager \ - ../../3rdparty/EASTL/UnknownVersion/include \ + ../../Runtime/ogl-runtime/src/datamodel \ + ../../Runtime/ogl-runtime/src/render \ + ../../Runtime/ogl-runtime/src/foundation \ + ../../Runtime/ogl-runtime/src/runtimerender \ + ../../Runtime/ogl-runtime/src/runtimerender/graphobjects \ + ../../Runtime/ogl-runtime/src/runtimerender/resourcemanager \ + ../../Runtime/ogl-runtime/src/3rdparty/EASTL/UnknownVersion/include \ $$QMAKE_INCDIR_FBX \ ../../3rdparty/ColladaDOM/2.4.0/dom/include \ ../../3rdparty/ColladaDOM/2.4.0/dom/include/1.4 \ - ../../3rdparty/color \ + ../../Runtime/ogl-runtime/src/3rdparty/color \ .. PRECOMPILED_HEADER = ../Common/Code/Qt3DSCommonPrecompile.h @@ -113,12 +114,12 @@ SOURCES += \ ../Client/Code/Core/Timer/Timer.cpp \ ../Client/Code/Core/VirtualAssets/PlaybackClock.cpp \ ../Client/Code/Core/VirtualAssets/VClockPolicy.cpp \ + ../../Runtime/ogl-runtime/src/importlib/Qt3DSImportMesh.cpp \ + ../../Runtime/ogl-runtime/src/importlib/Qt3DSImportMeshBuilder.cpp \ + ../../Runtime/ogl-runtime/src/importlib/Qt3DSImportPath.cpp \ ../QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp \ ../QT3DSIMP/Qt3DSImportLib/Qt3DSImportComposerTypes.cpp \ - ../QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.cpp \ - ../QT3DSIMP/Qt3DSImportLib/Qt3DSImportMeshBuilder.cpp \ ../QT3DSIMP/Qt3DSImportLib/Qt3DSImportMeshStudioOnly.cpp \ - ../QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.cpp \ ../QT3DSIMP/Qt3DSImportLib/Qt3DSImportPerformImport.cpp \ ../QT3DSIMP/Qt3DSImportSGTranslation/Qt3DSImportColladaSGTranslation.cpp \ ../QT3DSIMP/Qt3DSImportSGTranslation/Qt3DSImportFbxSGTranslation.cpp \ diff --git a/src/Authoring/FBXLineExporter/FBXLineExporter.pro b/src/Authoring/FBXLineExporter/FBXLineExporter.pro index 5ae46df8..aaac8d3e 100644 --- a/src/Authoring/FBXLineExporter/FBXLineExporter.pro +++ b/src/Authoring/FBXLineExporter/FBXLineExporter.pro @@ -9,9 +9,9 @@ QT -= gui DEFINES += _UNICODE QT3DS_AUTHORING _AFXDLL PCRE_STATIC INCLUDEPATH += \ - ../../Runtime/Source/foundation \ + ../../Runtime/ogl-runtime/src/foundation \ $$QMAKE_INCDIR_FBX \ - ../../3rdparty/EASTL/UnknownVersion/include + ../../Runtime/ogl-runtime/src/3rdparty/EASTL/UnknownVersion/include LIBS += \ $$QMAKE_LIBS_FBX \ diff --git a/src/Authoring/MorphLines/MorphLines.pro b/src/Authoring/MorphLines/MorphLines.pro index 9cdace66..7885d743 100644 --- a/src/Authoring/MorphLines/MorphLines.pro +++ b/src/Authoring/MorphLines/MorphLines.pro @@ -10,9 +10,9 @@ DEFINES += _UNICODE QT3DS_AUTHORING _AFXDLL PCRE_STATIC INCLUDEPATH += \ ../QT3DSIMP/Qt3DSImportLib \ - ../../Runtime/Source/render \ - ../../Runtime/Source/foundation \ - ../../3rdparty/EASTL/UnknownVersion/include + ../../Runtime/ogl-runtime/src/render \ + ../../Runtime/ogl-runtime/src/foundation \ + ../../Runtime/ogl-runtime/src/3rdparty/EASTL/UnknownVersion/include LIBS += \ $$QMAKE_LIBS_FBX \ diff --git a/src/Authoring/QT3DSDM/EASTL_new.cpp b/src/Authoring/QT3DSDM/EASTL_new.cpp deleted file mode 100644 index 1ca308e7..00000000 --- a/src/Authoring/QT3DSDM/EASTL_new.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "EASTL/allocator.h" - -void *operator new[](size_t size, const char *, int, unsigned, const char *, int) -{ - return malloc(size); -} - -void *operator new[](size_t size, size_t, size_t, const char *, int, unsigned, const char *, int) -{ - return malloc(size); -} diff --git a/src/Authoring/QT3DSDM/QT3DSDM.pro b/src/Authoring/QT3DSDM/QT3DSDM.pro deleted file mode 100644 index d0367220..00000000 --- a/src/Authoring/QT3DSDM/QT3DSDM.pro +++ /dev/null @@ -1,60 +0,0 @@ -TEMPLATE = lib -TARGET = QT3DSDM -CONFIG += staticlib -include(../commoninclude.pri) - -DEFINES += QT3DS_AUTHORING _AFXDLL PCRE_STATIC _UNICODE - -linux { - DEFINES += QT3DSDM_META_DATA_NO_SIGNALS -} - -INCLUDEPATH += \ - \ - Systems \ - Systems/Cores \ - ../../Runtime/Source/system \ - ../../Runtime/Source/foundation \ - ../../Runtime/Source/runtimerender \ - ../../Runtime/Source/datamodel \ - ../../Runtime/Source/render \ - ../../3rdparty/EASTL/UnknownVersion/include \ - ../../3rdparty/utf8cpp/2.3.2/source \ - ../../3rdparty/color \ - .. - -PRECOMPILED_HEADER = Qt3DSDMPrefix.h - -SOURCES += \ - EASTL_new.cpp \ - Systems/ActionSystem.cpp \ - Systems/SignalsImpl.cpp \ - Systems/SlideSystem.cpp \ - Systems/StudioAnimationSystem.cpp \ - Systems/StudioCoreSystem.cpp \ - Systems/StudioFullSystem.cpp \ - Systems/StudioPropertySystem.cpp \ - Systems/Qt3DSDMComposerTypeDefinitions.cpp \ - Systems/Qt3DSDMGuides.cpp \ - Systems/Qt3DSDMMetaData.cpp \ - Systems/Qt3DSDMSignalSystem.cpp \ - Systems/Qt3DSDMStringTable.cpp \ - Systems/Qt3DSDMValue.cpp \ - Systems/Qt3DSDMXML.cpp \ - Systems/Cores/ActionCoreProducer.cpp \ - Systems/Cores/AnimationCoreProducer.cpp \ - Systems/Cores/DataCoreProducer.cpp \ - Systems/Cores/SimpleActionCore.cpp \ - Systems/Cores/SimpleAnimationCore.cpp \ - Systems/Cores/SimpleDataCore.cpp \ - Systems/Cores/SimpleSlideCore.cpp \ - Systems/Cores/SimpleSlideGraphCore.cpp \ - Systems/Cores/SlideCoreProducer.cpp \ - Systems/Cores/SlideGraphCoreProducer.cpp \ - -HEADERS += \ - Systems/Qt3DSDMDataTypes.h \ - Systems/Qt3DSDMMetaDataTypes.h \ - Systems/Qt3DSDMMetaDataValue.h \ - Systems/Qt3DSDMMetaData.h \ - Systems/Qt3DSDMWStrOpsImpl.h diff --git a/src/Authoring/QT3DSDM/Qt3DSDMPrefix.h b/src/Authoring/QT3DSDM/Qt3DSDMPrefix.h deleted file mode 100644 index 4164d646..00000000 --- a/src/Authoring/QT3DSDM/Qt3DSDMPrefix.h +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifdef __cplusplus -#pragma once - -#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. -#define _WIN32_WINNT \ - 0x0501 // Change this to the appropriate value to target other versions of Windows. -#endif - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -// TODO: reference additional headers your program requires here -#if defined(WIN32) && defined(MSVC) -#pragma warning(push) -#pragma warning(disable : 4100) -#pragma warning(disable : 4512) -#pragma warning(disable : 4702) -#pragma warning(disable : 4996) -#endif - -// std includes -#include <map> -#include <vector> -#include <string> -#include <exception> -#include <set> -#include <iostream> -#include <sstream> -#include <fstream> -#include <memory> -#include <functional> - -// Project includes -#include "StandardExtensions.h" - -namespace qt3dsdm { -using std::ref; -using std::get; -using std::bind; -using std::tuple; -using std::static_pointer_cast; -using std::make_pair; -using std::equal_to; -using std::vector; -using std::make_tuple; -using std::function; -using std::shared_ptr; -using std::make_shared; -} -#if defined(WIN32) && defined(MSVC) -#pragma warning(pop) -#endif -#endif diff --git a/src/Authoring/QT3DSDM/Systems/ActionSystem.cpp b/src/Authoring/QT3DSDM/Systems/ActionSystem.cpp deleted file mode 100644 index fbd25938..00000000 --- a/src/Authoring/QT3DSDM/Systems/ActionSystem.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "ActionSystem.h" - -using namespace std; - -namespace qt3dsdm { - -CActionSystem::CActionSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore, - TSlideGraphCorePtr inSlideGraphCore, TActionCorePtr inActionCore, - TSlideSystemPtr inSlideSystem, Qt3DSDMInstanceHandle inActionInstance, - Qt3DSDMPropertyHandle inActionEyeball) - : m_DataCore(inDataCore) - , m_SlideCore(inSlideCore) - , m_SlideGraphCore(inSlideGraphCore) - , m_ActionCore(inActionCore) - , m_SlideSystem(inSlideSystem) - , m_ActionInstance(inActionInstance) - , m_ActionEyeball(inActionEyeball) -{ - m_Signaller = CreateActionSystemSignaller(); -} - -Qt3DSDMActionHandle CActionSystem::CreateAction(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner, - SLong4 inTriggerTargetObjects) -{ - Q_ASSERT(inSlide.Valid() && inOwner.Valid()); - - // Create Action instance handle that derives from Action instance - Qt3DSDMInstanceHandle theActionInstance = m_DataCore->CreateInstance(); - m_DataCore->DeriveInstance(theActionInstance, m_ActionInstance); - - // Associate Action instance handle with Slide - m_SlideSystem->AssociateInstanceWithSlide(inSlide, theActionInstance); - - // Unlink the eyeball property because Action can be eyeballed-on/off per-slide - m_SlideSystem->UnlinkProperty(theActionInstance, m_ActionEyeball); - - // Create the Action handle - Qt3DSDMActionHandle retval = - m_ActionCore->CreateAction(theActionInstance, inSlide, inOwner, inTriggerTargetObjects); - - GetSignalSender()->SendActionCreated(retval, inSlide, inOwner); - return retval; -} - -void CActionSystem::DeleteAction(Qt3DSDMActionHandle inAction) -{ - Qt3DSDMInstanceHandle theActionInstance; - SActionInfo theActionInfo = m_ActionCore->GetActionInfo(inAction); - m_ActionCore->DeleteAction(inAction, theActionInstance); - m_DataCore->DeleteInstance(theActionInstance); - GetSignalSender()->SendActionDeleted(inAction, theActionInfo.m_Slide, theActionInfo.m_Owner); -} - -void CActionSystem::GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const -{ - // Get all actions that exist in inSlide - m_ActionCore->GetActions(inSlide, inOwner, outActions); - - // if inSlide is not master, get all actions that exist in master slide - Qt3DSDMSlideHandle theMaster = m_SlideSystem->GetMasterSlide(inSlide); - if (theMaster != inSlide) { - TActionHandleList theMasterActions; - m_ActionCore->GetActions(theMaster, inOwner, theMasterActions); - outActions.insert(outActions.end(), theMasterActions.begin(), theMasterActions.end()); - sort(outActions.begin(), outActions.end()); - } -} - -bool CActionSystem::GetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, - Qt3DSDMActionHandle inAction) const -{ - SValue theValue; - Qt3DSDMInstanceHandle theInstance = m_ActionCore->GetActionInstance(inAction); - // Get the eyeball property value from SlideCore. There is no animation on eyeball so we can - // query SlideCore directly. - m_SlideCore->GetInstancePropertyValue(inActiveSlide, theInstance, m_ActionEyeball, theValue); - if (m_SlideCore->IsSlide(inActiveSlide)) - return qt3dsdm::get<bool>(theValue); - return false; -} - -void CActionSystem::SetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, - Qt3DSDMActionHandle inAction, bool inValue) -{ - Qt3DSDMInstanceHandle theInstance = m_ActionCore->GetActionInstance(inAction); - // Set the eyeball property value to SlideCore. - m_SlideCore->ForceSetInstancePropertyValue(inActiveSlide, theInstance, m_ActionEyeball, - inValue); -} - -IActionSystemSignalProvider *CActionSystem::GetSignalProvider() -{ - return dynamic_cast<IActionSystemSignalProvider *>(m_Signaller.get()); -} - -IActionSystemSignalSender *CActionSystem::GetSignalSender() -{ - return dynamic_cast<IActionSystemSignalSender *>(m_Signaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/ActionSystem.h b/src/Authoring/QT3DSDM/Systems/ActionSystem.h deleted file mode 100644 index fea9894a..00000000 --- a/src/Authoring/QT3DSDM/Systems/ActionSystem.h +++ /dev/null @@ -1,84 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef ACTIONSYSTEMH -#define ACTIONSYSTEMH -#include "Qt3DSDMActionSystem.h" -#include "Qt3DSDMActionCore.h" -#include "Qt3DSDMDataCore.h" -#include "Qt3DSDMSlideCore.h" -#include "Qt3DSDMSlideGraphCore.h" -#include "Qt3DSDMSlides.h" -#include "Qt3DSDMTransactions.h" -#include "SignalsImpl.h" - -namespace qt3dsdm { - -class CActionSystem : public IActionSystem -{ - TDataCorePtr m_DataCore; - TSlideCorePtr m_SlideCore; - TSlideGraphCorePtr m_SlideGraphCore; - TActionCorePtr m_ActionCore; - - TSlideSystemPtr m_SlideSystem; - - Qt3DSDMInstanceHandle m_ActionInstance; - Qt3DSDMPropertyHandle m_ActionEyeball; - - std::shared_ptr<ISignalItem> m_Signaller; - -public: - CActionSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore, - TSlideGraphCorePtr inSlideGraphCore, TActionCorePtr inActionCore, - TSlideSystemPtr inSlideSystem, Qt3DSDMInstanceHandle inActionInstance, - Qt3DSDMPropertyHandle inActionEyeball); - - Qt3DSDMActionHandle CreateAction(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - SLong4 inTriggerTargetObjects) override; - void DeleteAction(Qt3DSDMActionHandle inAction) override; - void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const override; - - bool GetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, - Qt3DSDMActionHandle inAction) const override; - void SetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, Qt3DSDMActionHandle inAction, - bool inValue) override; - - virtual IActionSystemSignalProvider *GetSignalProvider(); - -private: - virtual IActionSystemSignalSender *GetSignalSender(); - - CActionSystem(const CActionSystem&) = delete; - CActionSystem& operator=(const CActionSystem&) = delete; -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/ActionCoreProducer.cpp b/src/Authoring/QT3DSDM/Systems/Cores/ActionCoreProducer.cpp deleted file mode 100644 index c262c239..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/ActionCoreProducer.cpp +++ /dev/null @@ -1,289 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "ActionCoreProducer.h" -#include "HandleSystemTransactions.h" -#include "VectorTransactions.h" -#include "SignalsImpl.h" - -using namespace std; - -namespace qt3dsdm { - -Qt3DSDMActionHandle CActionCoreProducer::CreateAction(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner, - SLong4 inTriggerTargetObjects) -{ - Qt3DSDMActionHandle retval = - m_Data->CreateAction(inInstance, inSlide, inOwner, inTriggerTargetObjects); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - return retval; -} - -void CActionCoreProducer::DeleteAction(Qt3DSDMActionHandle inAction, - Qt3DSDMInstanceHandle &outInstance) -{ - // Ensure action exists - SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects); - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inAction, m_Data->m_Objects); - do_all(theAction->m_ActionInfo.m_HandlerArgs, - std::bind(DoCreateHandleDeleteTransaction, __FILE__, __LINE__, m_Consumer, - std::placeholders::_1, std::ref(m_Data->m_Objects))); - m_Data->DeleteAction(inAction, outInstance); -} - -const SActionInfo &CActionCoreProducer::GetActionInfo(Qt3DSDMActionHandle inAction) const -{ - return m_Data->GetActionInfo(inAction); -} - -void CActionCoreProducer::GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const -{ - return m_Data->GetActions(inSlide, inOwner, outActions); -} - -void CActionCoreProducer::GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const -{ - return m_Data->GetActions(inSlide, outActions); -} - -void CActionCoreProducer::GetActions(Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const -{ - return m_Data->GetActions(inOwner, outActions); -} - -void CActionCoreProducer::GetActions(TActionHandleList &outActions) const -{ - return m_Data->GetActions(outActions); -} - -Qt3DSDMInstanceHandle CActionCoreProducer::GetActionInstance(Qt3DSDMActionHandle inAction) const -{ - return m_Data->GetActionInstance(inAction); -} - -Qt3DSDMActionHandle -CActionCoreProducer::GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const -{ - return m_Data->GetActionByInstance(inActionInstance); -} - -void CActionCoreProducer::SetTriggerObject(Qt3DSDMActionHandle inAction, - const SObjectRefType &inTriggerObject) -{ - SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects); - if (m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleActionCore::SetTriggerObject, m_Data, inAction, inTriggerObject), - std::bind(&CSimpleActionCore::SetTriggerObject, m_Data, inAction, - theAction->m_ActionInfo.m_TriggerObject)))); - } - m_Data->SetTriggerObject(inAction, inTriggerObject); - GetSignalSender()->SendTriggerObjectSet(inAction, theAction->m_ActionInfo.m_TriggerObject); -} - -void CActionCoreProducer::SetTargetObject(Qt3DSDMActionHandle inAction, - const SObjectRefType &inTargetObject) -{ - SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects); - if (m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleActionCore::SetTargetObject, m_Data, inAction, inTargetObject), - std::bind(&CSimpleActionCore::SetTargetObject, m_Data, inAction, - theAction->m_ActionInfo.m_TargetObject)))); - } - m_Data->SetTargetObject(inAction, inTargetObject); - GetSignalSender()->SendTargetObjectSet(inAction, theAction->m_ActionInfo.m_TargetObject); -} - -void CActionCoreProducer::SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) -{ - SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects); - if (m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleActionCore::SetEvent, m_Data, inAction, inEventHandle), - std::bind(&CSimpleActionCore::SetEvent, m_Data, inAction, - theAction->m_ActionInfo.m_Event)))); - } - m_Data->SetEvent(inAction, inEventHandle); - GetSignalSender()->SendEventSet(inAction, inEventHandle); -} - -void CActionCoreProducer::SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle) -{ - SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects); - if (m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleActionCore::SetHandler, m_Data, inAction, inHandlerHandle), - std::bind(&CSimpleActionCore::SetHandler, m_Data, inAction, - theAction->m_ActionInfo.m_Handler)))); - } - m_Data->SetHandler(inAction, inHandlerHandle); - GetSignalSender()->SendHandlerSet(inAction, inHandlerHandle); -} - -Qt3DSDMHandlerArgHandle CActionCoreProducer::AddHandlerArgument(Qt3DSDMActionHandle inAction, - const TCharStr &inName, - HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) -{ - Qt3DSDMHandlerArgHandle retval = - m_Data->AddHandlerArgument(inAction, inName, inArgType, inValueType); - SAction *theAction = CSimpleActionCore::GetActionNF(inAction, m_Data->m_Objects); - CreateVecInsertTransaction<Qt3DSDMHandlerArgHandle>(__FILE__, __LINE__, m_Consumer, retval, - theAction->m_ActionInfo.m_HandlerArgs); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - GetSignalSender()->SendHandlerArgumentAdded(inAction, retval, inName, inArgType, inValueType); - return retval; -} - -void CActionCoreProducer::RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) -{ - SHandlerArgument *theHandlerArgument = - CSimpleActionCore::GetHandlerArgumentNF(inHandlerArgument, m_Data->m_Objects); - SAction *theAction = CSimpleActionCore::GetActionNF( - theHandlerArgument->m_HandlerArgInfo.m_Action, m_Data->m_Objects); - if (exists(theAction->m_ActionInfo.m_HandlerArgs, - std::bind(equal_to<Qt3DSDMHandlerArgHandle>(), inHandlerArgument, - std::placeholders::_1))) { - CreateVecEraseTransaction<Qt3DSDMHandlerArgHandle>(__FILE__, __LINE__, m_Consumer, - inHandlerArgument, - theAction->m_ActionInfo.m_HandlerArgs); - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inHandlerArgument, m_Data->m_Objects); - } - m_Data->RemoveHandlerArgument(inHandlerArgument); - GetSignalSender()->SendHandlerArgumentRemoved(theAction->m_Handle, theHandlerArgument->m_Handle, - theHandlerArgument->m_HandlerArgInfo.m_Name, - theHandlerArgument->m_HandlerArgInfo.m_ArgType, - theHandlerArgument->m_HandlerArgInfo.m_ValueType); -} - -const SHandlerArgumentInfo & -CActionCoreProducer::GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const -{ - return m_Data->GetHandlerArgumentInfo(inHandlerArgument); -} - -void CActionCoreProducer::GetHandlerArguments(Qt3DSDMActionHandle inAction, - THandlerArgHandleList &outHandlerArguments) const -{ - return m_Data->GetHandlerArguments(inAction, outHandlerArguments); -} - -void CActionCoreProducer::GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, - SValue &outValue) const -{ - return m_Data->GetHandlerArgumentValue(inHandlerArgument, outValue); -} - -void CActionCoreProducer::SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, - const SValue &inValue) -{ - SHandlerArgument *theHandlerArgument = - CSimpleActionCore::GetHandlerArgumentNF(inHandlerArgument, m_Data->m_Objects); - if (m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleActionCore::SetHandlerArgumentValue, m_Data, inHandlerArgument, - inValue), - std::bind(&CSimpleActionCore::SetHandlerArgumentValue, m_Data, inHandlerArgument, - theHandlerArgument->m_HandlerArgInfo.m_Value)))); - } - m_Data->SetHandlerArgumentValue(inHandlerArgument, inValue); - GetSignalSender()->SendHandlerArgumentValueSet(inHandlerArgument, inValue); -} - -// CHandleBase -bool CActionCoreProducer::HandleValid(int inHandle) const -{ - return m_Data->HandleValid(inHandle); -} - -// ITransactionProducer implementation -void CActionCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_Consumer = inConsumer; -} - -TSignalConnectionPtr CActionCoreProducer::ConnectTriggerObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) -{ - return GetSignalProvider()->ConnectTriggerObjectSet(inCallback); -} -TSignalConnectionPtr CActionCoreProducer::ConnectTargetObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) -{ - return GetSignalProvider()->ConnectTargetObjectSet(inCallback); -} -TSignalConnectionPtr CActionCoreProducer::ConnectEventSet( - const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) -{ - return GetSignalProvider()->ConnectEventSet(inCallback); -} -TSignalConnectionPtr CActionCoreProducer::ConnectHandlerSet( - const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) -{ - return GetSignalProvider()->ConnectHandlerSet(inCallback); -} - -TSignalConnectionPtr CActionCoreProducer::ConnectHandlerArgumentAdded( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) -{ - return GetSignalProvider()->ConnectHandlerArgumentAdded(inCallback); -} -TSignalConnectionPtr CActionCoreProducer::ConnectHandlerArgumentRemoved( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) -{ - return GetSignalProvider()->ConnectHandlerArgumentRemoved(inCallback); -} -TSignalConnectionPtr CActionCoreProducer::ConnectHandlerArgumentValueSet( - const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) -{ - return GetSignalProvider()->ConnectHandlerArgumentValueSet(inCallback); -} - -void CActionCoreProducer::InitSignaller() -{ - m_Signaller = CreateActionCoreSignaller(); -} - -IActionCoreSignalProvider *CActionCoreProducer::GetSignalProvider() -{ - return dynamic_cast<IActionCoreSignalProvider *>(m_Signaller.get()); -} - -IActionCoreSignalSender *CActionCoreProducer::GetSignalSender() -{ - return dynamic_cast<IActionCoreSignalSender *>(m_Signaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/ActionCoreProducer.h b/src/Authoring/QT3DSDM/Systems/Cores/ActionCoreProducer.h deleted file mode 100644 index bf65a387..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/ActionCoreProducer.h +++ /dev/null @@ -1,125 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef ACTIONCOREPRODUCERH -#define ACTIONCOREPRODUCERH - -#include "SimpleActionCore.h" -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMSignals.h" -#include "Qt3DSDMStringTable.h" - -namespace qt3dsdm { -class CActionCoreProducer : public IActionCore, - public ITransactionProducer, - public IActionCoreSignalProvider -{ - Q_DISABLE_COPY(CActionCoreProducer) - - TSimpleActionCorePtr m_Data; - TTransactionConsumerPtr m_Consumer; - TSignalItemPtr m_Signaller; - -public: - CActionCoreProducer(TStringTablePtr inStringTable) - : m_Data(new CSimpleActionCore(inStringTable)) - { - InitSignaller(); - } - - TSimpleActionCorePtr GetTransactionlessActionCore() const { return m_Data; } - - // IActionCore implementation - IStringTable &GetStringTable() const override { return m_Data->GetStringTable(); } - TStringTablePtr GetStringTablePtr() const override { return m_Data->GetStringTablePtr(); } - // Action - Qt3DSDMActionHandle CreateAction(Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner, SLong4 inTriggerTargetObjects) override; - void DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) override; - const SActionInfo &GetActionInfo(Qt3DSDMActionHandle inAction) const override; - void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const override; - void GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const override; - void GetActions(Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) const override; - void GetActions(TActionHandleList &outActions) const override; - Qt3DSDMInstanceHandle GetActionInstance(Qt3DSDMActionHandle inAction) const override; - Qt3DSDMActionHandle GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const override; - - // Action Properties - void SetTriggerObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTriggerObject) override; - void SetTargetObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTargetObject) override; - void SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) override; - void SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle) override; - - // Action Argument - Qt3DSDMHandlerArgHandle AddHandlerArgument(Qt3DSDMActionHandle inAction, const TCharStr &inName, - HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) override; - void RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) override; - const SHandlerArgumentInfo & - GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const override; - void GetHandlerArguments(Qt3DSDMActionHandle inAction, - THandlerArgHandleList &outHandlerArguments) const override; - - // Action Argument Properties - void GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, SValue &outValue) const override; - void SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, const SValue &inValue) override; - - // CHandleBase - bool HandleValid(int inHandle) const override; - - // ITransactionProducer implementation - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - - TSignalConnectionPtr ConnectTriggerObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override; - TSignalConnectionPtr ConnectTargetObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectEventSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override; - - TSignalConnectionPtr ConnectHandlerArgumentAdded( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override; - TSignalConnectionPtr ConnectHandlerArgumentRemoved( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override; - TSignalConnectionPtr ConnectHandlerArgumentValueSet( - const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) override; - -private: - void InitSignaller(); - IActionCoreSignalProvider *GetSignalProvider(); - IActionCoreSignalSender *GetSignalSender(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/AnimationCoreProducer.cpp b/src/Authoring/QT3DSDM/Systems/Cores/AnimationCoreProducer.cpp deleted file mode 100644 index 14d18240..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/AnimationCoreProducer.cpp +++ /dev/null @@ -1,488 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "AnimationCoreProducer.h" -#include "HandleSystemTransactions.h" -#include "VectorTransactions.h" -#include "SignalsImpl.h" -#ifdef _WIN32 -#pragma warning(disable : 4512) // assignment operator not generated -#endif - -using namespace std; - -namespace qt3dsdm { - -struct SArtistEditedUndoRedoScope -{ - TSimpleAnimationCorePtr m_AnimationCore; - Qt3DSDMAnimationHandle m_Animation; - TTransactionConsumerPtr m_Consumer; - bool m_ArtistEdited; - SArtistEditedUndoRedoScope(TSimpleAnimationCorePtr inAnimCore, Qt3DSDMAnimationHandle inAnim, - TTransactionConsumerPtr inConsumer) - : m_AnimationCore(inAnimCore) - , m_Animation(inAnim) - , m_Consumer(inConsumer) - , m_ArtistEdited(inAnimCore->IsArtistEdited(inAnim)) - { - } - ~SArtistEditedUndoRedoScope() - { - bool edited = m_AnimationCore->IsArtistEdited(m_Animation); - if (m_Consumer && edited != m_ArtistEdited) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleAnimationCore::SetIsArtistEdited, m_AnimationCore, m_Animation, - edited), - std::bind(&CSimpleAnimationCore::SetIsArtistEdited, m_AnimationCore, m_Animation, - m_ArtistEdited)))); - } - } -}; - -struct SLookupCacheDoUndoOp : public ITransaction -{ - std::shared_ptr<SAnimationTrack> m_Animation; - TSimpleAnimationCorePtr m_AnimationCore; - bool m_AddOnDo; - SLookupCacheDoUndoOp(const char *inFile, int inLine, Qt3DSDMAnimationHandle inAnimHandle, - TSimpleAnimationCorePtr inCore, bool addOnDo) - : ITransaction(inFile, inLine) - , m_AnimationCore(inCore) - , m_AddOnDo(addOnDo) - { - THandleObjectMap::const_iterator theIter(inCore->m_Objects.find(inAnimHandle)); - if (theIter != inCore->m_Objects.end()) - m_Animation = static_pointer_cast<SAnimationTrack>(theIter->second); - } - void Remove() - { - if (m_Animation) - m_AnimationCore->RemoveAnimationFromLookupCache(m_Animation); - } - void Add() - { - if (m_Animation) - m_AnimationCore->AddAnimationToLookupCache(m_Animation); - } - void Do() override - { - if (m_AddOnDo) - Add(); - else - Remove(); - } - void Undo() override - { - if (m_AddOnDo) - Remove(); - else - Add(); - } -}; - -Qt3DSDMAnimationHandle -CAnimationCoreProducer::CreateAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, bool inFirstKeyframeDynamic) -{ - Qt3DSDMAnimationHandle retval = m_Data->CreateAnimation(inSlide, inInstance, inProperty, inIndex, - inAnimationType, inFirstKeyframeDynamic); - - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - if (m_Consumer) - m_Consumer->OnTransaction( - std::make_shared<SLookupCacheDoUndoOp>(__FILE__, __LINE__, retval, m_Data, true)); - GetSignalSender()->SendAnimationCreated(retval, inSlide, inInstance, inProperty, inIndex, - inAnimationType); - return retval; -} - -void CAnimationCoreProducer::DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) -{ - // Ensure animation exists - SAnimationTrack *theAnimation = - CSimpleAnimationCore::GetAnimationNF(inAnimation, m_Data->m_Objects); - GetSignalSender()->SendBeforeAnimationDeleted(inAnimation); - if (m_Consumer) - m_Consumer->OnTransaction(std::make_shared<SLookupCacheDoUndoOp>( - __FILE__, __LINE__, inAnimation, m_Data, false)); - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inAnimation, m_Data->m_Objects); - do_all(theAnimation->m_Keyframes, - std::bind(DoCreateHandleDeleteTransaction, __FILE__, __LINE__, m_Consumer, - std::placeholders::_1, std::ref(m_Data->m_Objects))); - SAnimationInfo theInfo = m_Data->GetAnimationInfo(inAnimation); - m_Data->DeleteAnimation(inAnimation); - GetSignalSender()->SendAnimationDeleted(inAnimation, theInfo.m_Slide, theInfo.m_Instance, - theInfo.m_Property, theInfo.m_Index, - theInfo.m_AnimationType); -} - -Qt3DSDMAnimationHandle CAnimationCoreProducer::GetAnimation(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - size_t inIndex) const -{ - return m_Data->GetAnimation(inSlide, inInstance, inProperty, inIndex); -} - -SAnimationInfo CAnimationCoreProducer::GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const -{ - return m_Data->GetAnimationInfo(inAnimation); -} - -void CAnimationCoreProducer::GetAnimations(TAnimationHandleList &outAnimations) const -{ - return m_Data->GetAnimations(outAnimations); -} - -void CAnimationCoreProducer::GetAnimations(TAnimationInfoList &outAnimations, - Qt3DSDMSlideHandle inMaster, - Qt3DSDMSlideHandle inSlide) const -{ - return m_Data->GetAnimations(outAnimations, inMaster, inSlide); -} - -void CAnimationCoreProducer::SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, - bool inValue) -{ - SAnimationInfo theInfo(m_Data->GetAnimationInfo(inAnimation)); - SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer); - if (m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(&CSimpleAnimationCore::SetFirstKeyframeDynamic, m_Data, inAnimation, - inValue), - std::bind(&CSimpleAnimationCore::SetFirstKeyframeDynamic, m_Data, inAnimation, - theInfo.m_DynamicFirstKeyframe)))); - } - m_Data->SetFirstKeyframeDynamic(inAnimation, inValue); - GetSignalSender()->SendFirstKeyframeDynamicSet(inAnimation, inValue); -} - -inline void DirtyKeyframes(Qt3DSDMAnimationHandle inAnimation, THandleObjectMap &inObjects) -{ - SAnimationTrack *theAnimation = CSimpleAnimationCore::GetAnimationNF(inAnimation, inObjects); - theAnimation->m_KeyframesDirty = true; -} - -inline void CreateDirtyKeyframesTransaction(TTransactionConsumerPtr inConsumer, - Qt3DSDMAnimationHandle inAnimation, - THandleObjectMap &inObjects) -{ - if (inConsumer) { - inConsumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(DirtyKeyframes, inAnimation, std::ref(inObjects)), - std::bind(DirtyKeyframes, inAnimation, std::ref(inObjects))))); - } -} - -Qt3DSDMKeyframeHandle CAnimationCoreProducer::InsertKeyframe(Qt3DSDMAnimationHandle inAnimation, - const TKeyframe &inKeyframe) -{ - SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer); - Qt3DSDMKeyframeHandle retval = m_Data->InsertKeyframe(inAnimation, inKeyframe); - SAnimationTrack *theAnimation = - CSimpleAnimationCore::GetAnimationNF(inAnimation, m_Data->m_Objects); - CreateVecInsertTransaction<Qt3DSDMKeyframeHandle>(__FILE__, __LINE__, m_Consumer, retval, - theAnimation->m_Keyframes); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - CreateDirtyKeyframesTransaction(m_Consumer, inAnimation, m_Data->m_Objects); - GetSignalSender()->SendKeyframeInserted(inAnimation, retval, inKeyframe); - return retval; -} - -void CAnimationCoreProducer::EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe) -{ - SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, m_Data->m_Objects); - SArtistEditedUndoRedoScope __editedScope(m_Data, theKeyframe->m_Animation, m_Consumer); - GetSignalSender()->SendBeforeKeyframeErased(inKeyframe); - SAnimationTrack *theAnimation = - CSimpleAnimationCore::GetAnimationNF(theKeyframe->m_Animation, m_Data->m_Objects); - if (exists(theAnimation->m_Keyframes, std::bind(equal_to<int>(), inKeyframe, - std::placeholders::_1))) { - CreateVecEraseTransaction<Qt3DSDMKeyframeHandle>(__FILE__, __LINE__, m_Consumer, inKeyframe, - theAnimation->m_Keyframes); - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inKeyframe, m_Data->m_Objects); - CreateDirtyKeyframesTransaction(m_Consumer, theKeyframe->m_Animation, m_Data->m_Objects); - } - int theKeyframeHandle = theKeyframe->m_Handle; - TKeyframe theData = theKeyframe->m_Keyframe; - m_Data->EraseKeyframe(inKeyframe); - GetSignalSender()->SendKeyframeErased(theAnimation->m_Handle, theKeyframeHandle, theData); -} - -template <typename TDataType> -struct VectorSwapTransaction : public ITransaction -{ - vector<TDataType> m_Data; - vector<TDataType> &m_Target; - VectorSwapTransaction(const char *inFile, int inLine, vector<TDataType> &inTarget) - : ITransaction(inFile, inLine) - , m_Data(inTarget) - , m_Target(inTarget) - { - } - void Do() override { std::swap(m_Data, m_Target); } - void Undo() override { Do(); } -}; - -void CAnimationCoreProducer::DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) -{ - // Ensure animation exists - SAnimationTrack *theAnimation = - CSimpleAnimationCore::GetAnimationNF(inAnimation, m_Data->m_Objects); - SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer); - GetSignalSender()->SendBeforeAllKeyframesErased(inAnimation); - do_all(theAnimation->m_Keyframes, - std::bind(DoCreateHandleDeleteTransaction, __FILE__, __LINE__, m_Consumer, - std::placeholders::_1, std::ref(m_Data->m_Objects))); - if (m_Consumer) - m_Consumer->OnTransaction(std::make_shared<VectorSwapTransaction<Qt3DSDMKeyframeHandle>>( - __FILE__, __LINE__, std::ref(theAnimation->m_Keyframes))); - theAnimation->m_Keyframes.clear(); -} - -Qt3DSDMAnimationHandle -CAnimationCoreProducer::GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const -{ - return m_Data->GetAnimationForKeyframe(inKeyframe); -} - -struct KeyframeDataTransaction : public ITransaction, public IMergeableTransaction<TKeyframe> -{ - TSimpleAnimationCorePtr m_AnimationCore; - Qt3DSDMKeyframeHandle m_Keyframe; - TKeyframe m_OldData; - TKeyframe m_NewData; - - KeyframeDataTransaction(const char *inFile, int inLine, TSimpleAnimationCorePtr animCore, - Qt3DSDMKeyframeHandle keyframe, TKeyframe oldData, TKeyframe newData) - : ITransaction(inFile, inLine) - , m_AnimationCore(animCore) - , m_Keyframe(keyframe) - , m_OldData(oldData) - , m_NewData(newData) - { - } - - void Do() override { m_AnimationCore->DoSetKeyframeData(m_Keyframe, m_NewData); } - void Undo() override { m_AnimationCore->DoSetKeyframeData(m_Keyframe, m_OldData); } - - void Update(const TKeyframe &inKeyframe) override { m_NewData = inKeyframe; } -}; - -void CAnimationCoreProducer::SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, - const TKeyframe &inData) -{ - SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, m_Data->m_Objects); - SArtistEditedUndoRedoScope __editedScope(m_Data, theKeyframe->m_Animation, m_Consumer); - TKeyframe theNewData(inData); - TKeyframe theOldData = theKeyframe->m_Keyframe; - m_Data->SetKeyframeData(inKeyframe, inData); - TKeyframeDataMergeMap::iterator iter(m_KeyframeMergeMap.find(inKeyframe)); - if (iter != m_KeyframeMergeMap.end()) - iter->second->Update(theNewData); - else { - if (m_Consumer) { - std::shared_ptr<KeyframeDataTransaction> theKeyframeTransaction( - std::make_shared<KeyframeDataTransaction>(__FILE__, __LINE__, m_Data, inKeyframe, - theOldData, theNewData)); - m_Consumer->OnTransaction(static_pointer_cast<ITransaction>(theKeyframeTransaction)); - m_KeyframeMergeMap.insert(make_pair( - inKeyframe, - static_pointer_cast<IMergeableTransaction<TKeyframe>>(theKeyframeTransaction))); - } - GetSignalSender()->SendKeyframeUpdated(inKeyframe, inData); - } -} - -TKeyframe CAnimationCoreProducer::GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const -{ - return m_Data->GetKeyframeData(inKeyframe); -} - -void CAnimationCoreProducer::GetKeyframes(Qt3DSDMAnimationHandle inAnimation, - TKeyframeHandleList &outKeyframes) const -{ - return m_Data->GetKeyframes(inAnimation, outKeyframes); -} - -size_t CAnimationCoreProducer::GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const -{ - return m_Data->GetKeyframeCount(inAnimation); -} - -void CAnimationCoreProducer::OffsetAnimations(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - long inMillisecondOffset) -{ - float theOffsetSeconds = static_cast<float>(inMillisecondOffset) / 1000.f; - for (THandleObjectMap::const_iterator iter = m_Data->m_Objects.begin(), - end = m_Data->m_Objects.end(); - iter != end; ++iter) { - SAnimationTrack *theTrack = static_cast<SAnimationTrack *>(iter->second.get()); - if (theTrack->m_Slide == inSlide && theTrack->m_Instance == inInstance) { - for (size_t keyframeIdx = 0, keyframeEnd = theTrack->m_Keyframes.size(); - keyframeIdx < keyframeEnd; ++keyframeIdx) { - Qt3DSDMKeyframeHandle theKeyframeHandle(theTrack->m_Keyframes[keyframeIdx]); - TKeyframe theCurrentKeyframe = m_Data->GetKeyframeData(theKeyframeHandle); - - float seconds = qt3dsdm::GetKeyframeSeconds(theCurrentKeyframe); - - theCurrentKeyframe = - qt3dsdm::SetKeyframeSeconds(theCurrentKeyframe, seconds + theOffsetSeconds); - - SetKeyframeData(theKeyframeHandle, theCurrentKeyframe); - } - } - } -} - -void CAnimationCoreProducer::SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited) -{ - SArtistEditedUndoRedoScope __editedScope(m_Data, inAnimation, m_Consumer); - m_Data->SetIsArtistEdited(inAnimation, inEdited); -} - -bool CAnimationCoreProducer::IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const -{ - return m_Data->IsArtistEdited(inAnimation); -} -// Animation Evaluation. -float CAnimationCoreProducer::EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, - float inSeconds) const -{ - return m_Data->EvaluateAnimation(inAnimation, inSeconds); -} - -bool CAnimationCoreProducer::KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const -{ - return m_Data->KeyframeValid(inKeyframe); -} - -bool CAnimationCoreProducer::AnimationValid(Qt3DSDMAnimationHandle inAnimation) const -{ - return m_Data->AnimationValid(inAnimation); -} - -void CAnimationCoreProducer::CopyAnimations(Qt3DSDMSlideHandle inSourceSlide, - Qt3DSDMInstanceHandle inSourceInstance, - Qt3DSDMSlideHandle inDestSlide, - Qt3DSDMInstanceHandle inDestInstance) -{ - std::vector<SAnimationTrack *> theAnimations; - for (THandleObjectMap::const_iterator iter = m_Data->m_Objects.begin(), - end = m_Data->m_Objects.end(); - iter != end; ++iter) { - SAnimationTrack *theTrack = static_cast<SAnimationTrack *>(iter->second.get()); - if (theTrack->m_Instance == inSourceInstance && theTrack->m_Slide == inSourceSlide) - theAnimations.push_back(theTrack); - } - for (size_t idx = 0, end = theAnimations.size(); idx < end; ++idx) { - const SAnimationTrack &newTrack(*theAnimations[idx]); - Qt3DSDMAnimationHandle theNewAnimation( - CreateAnimation(inDestSlide, inDestInstance, newTrack.m_Property, newTrack.m_Index, - newTrack.m_AnimationType, newTrack.m_FirstKeyframeDynamic)); - for (size_t keyIdx = 0, keyEnd = newTrack.m_Keyframes.size(); keyIdx < keyEnd; ++keyIdx) - InsertKeyframe(theNewAnimation, GetKeyframeData(newTrack.m_Keyframes[keyIdx])); - } -} - -// ITransactionProducer implementation -void CAnimationCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_Consumer = inConsumer; - m_KeyframeMergeMap.clear(); -} - -TSignalConnectionPtr CAnimationCoreProducer::ConnectAnimationCreated( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) -{ - return GetSignalProvider()->ConnectAnimationCreated(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectBeforeAnimationDeleted( - const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectBeforeAnimationDeleted(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectAnimationDeleted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) -{ - return GetSignalProvider()->ConnectAnimationDeleted(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectKeyframeInserted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) -{ - return GetSignalProvider()->ConnectKeyframeInserted(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectBeforeKeyframeErased( - const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectBeforeKeyframeErased(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectKeyframeErased( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) -{ - return GetSignalProvider()->ConnectKeyframeErased(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectBeforeAllKeyframesErased( - const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectBeforeAllKeyframesErased(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectKeyframeUpdated( - const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) -{ - return GetSignalProvider()->ConnectKeyframeUpdated(inCallback); -} -TSignalConnectionPtr CAnimationCoreProducer::ConnectFirstKeyframeDynamicSet( - const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) -{ - return GetSignalProvider()->ConnectFirstKeyframeDynamicSet(inCallback); -} - -void CAnimationCoreProducer::InitSignaller() -{ - m_Signaller = CreateAnimationCoreSignaller(); -} - -IAnimationCoreSignalProvider *CAnimationCoreProducer::GetSignalProvider() -{ - return dynamic_cast<IAnimationCoreSignalProvider *>(m_Signaller.get()); -} - -IAnimationCoreSignalSender *CAnimationCoreProducer::GetSignalSender() -{ - return dynamic_cast<IAnimationCoreSignalSender *>(m_Signaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/AnimationCoreProducer.h b/src/Authoring/QT3DSDM/Systems/Cores/AnimationCoreProducer.h deleted file mode 100644 index 17603d64..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/AnimationCoreProducer.h +++ /dev/null @@ -1,148 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef ANIMATIONCOREPRODUCERH -#define ANIMATIONCOREPRODUCERH -#include "SimpleAnimationCore.h" -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMSignals.h" - -namespace qt3dsdm { -class CAnimationCoreProducer : public IAnimationCore, - public ITransactionProducer, - public IAnimationCoreSignalProvider -{ - Q_DISABLE_COPY(CAnimationCoreProducer) - - typedef std::shared_ptr<IMergeableTransaction<TKeyframe>> TKeyframeDataMergeMapEntry; - typedef std::unordered_map<int, TKeyframeDataMergeMapEntry> TKeyframeDataMergeMap; - - TSimpleAnimationCorePtr m_Data; - TTransactionConsumerPtr m_Consumer; - TSignalItemPtr m_Signaller; - TKeyframeDataMergeMap m_KeyframeMergeMap; - -public: - CAnimationCoreProducer() - : m_Data(new CSimpleAnimationCore()) - { - InitSignaller(); - } - CAnimationCoreProducer(TStringTablePtr strTable) - : m_Data(new CSimpleAnimationCore(strTable)) - { - InitSignaller(); - } - - TSimpleAnimationCorePtr GetTransactionlessAnimationCore() const { return m_Data; } - - // IAnimationManger implementation - - Qt3DSDMAnimationHandle CreateAnimation(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, - bool inFirstKeyframeDynamic) override; - void DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) override; - Qt3DSDMAnimationHandle GetAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex) const override; - SAnimationInfo GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const override; - void GetAnimations(TAnimationHandleList &outAnimations) const override; - void GetAnimations(TAnimationInfoList &outAnimations, Qt3DSDMSlideHandle inMaster, - Qt3DSDMSlideHandle inSlide) const override; - void GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - TAnimationHandleList &outAnimations) override - { - m_Data->GetSpecificInstanceAnimations(inSlide, inInstance, outAnimations); - } - - void SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) override; - - Qt3DSDMKeyframeHandle InsertKeyframe(Qt3DSDMAnimationHandle inAnimation, - const TKeyframe &inKeyframe) override; - void EraseKeyframe(Qt3DSDMKeyframeHandle) override; - void DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) override; - Qt3DSDMAnimationHandle GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override; - TKeyframe GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const override; - void SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override; - void GetKeyframes(Qt3DSDMAnimationHandle inAnimation, TKeyframeHandleList &outKeyframes) const override; - size_t GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const override; - bool IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override - { - return m_Data->IsFirstKeyframe(inKeyframe); - } - void OffsetAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - long inMillisecondOffset) override; - - void SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited = true) override; - bool IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const override; - - // Animation Evaluation. - float EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, float inSeconds) const override; - - bool KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const override; - bool AnimationValid(Qt3DSDMAnimationHandle inAnimation) const override; - - void CopyAnimations(Qt3DSDMSlideHandle inSourceSlide, Qt3DSDMInstanceHandle inSourceInstance, - Qt3DSDMSlideHandle inDestSlide, Qt3DSDMInstanceHandle inDestInstance) override; - - // ITransactionProducer implementation - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - - TSignalConnectionPtr ConnectAnimationCreated( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectBeforeAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override; - TSignalConnectionPtr ConnectAnimationDeleted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override; - TSignalConnectionPtr ConnectKeyframeInserted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) override; - virtual TSignalConnectionPtr - ConnectBeforeKeyframeErased(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) override; - TSignalConnectionPtr ConnectKeyframeErased( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) override; - virtual TSignalConnectionPtr - ConnectBeforeAllKeyframesErased(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override; - TSignalConnectionPtr ConnectKeyframeUpdated( - const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) override; - TSignalConnectionPtr ConnectFirstKeyframeDynamicSet( - const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) override; - -private: - void InitSignaller(); - IAnimationCoreSignalProvider *GetSignalProvider(); - IAnimationCoreSignalSender *GetSignalSender(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/DataCoreProducer.cpp b/src/Authoring/QT3DSDM/Systems/Cores/DataCoreProducer.cpp deleted file mode 100644 index 5c3cc924..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/DataCoreProducer.cpp +++ /dev/null @@ -1,457 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "DataCoreProducer.h" -#include "HandleSystemTransactions.h" -#include "VectorTransactions.h" -#include "SignalsImpl.h" -#ifdef _WIN32 -#pragma warning(disable : 4503) // decorated name length exceeded -#endif -namespace qt3dsdm { - -Qt3DSDMInstanceHandle CDataCoreProducer::CreateInstance(Qt3DSDMInstanceHandle inTargetId) -{ - Qt3DSDMInstanceHandle retval = m_Data->CreateInstance(inTargetId); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - GetDataCoreSender()->SignalInstanceCreated(retval); - return retval; -} - -inline tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition> -TransformProperty(Qt3DSDMPropertyHandle inProperty, CSimpleDataCore &inData) -{ - return make_tuple(inProperty, inData.GetProperty(inProperty)); -} - -inline void SignalPropertyRemoved(Qt3DSDMInstanceHandle inInstance, - tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition> inData, - IDataCoreSignalSender *inSender) -{ - inSender->SignalPropertyRemoved(inInstance, get<0>(inData), get<1>(inData).m_Name.wide_str(), - get<1>(inData).m_Type); -} - -void CDataCoreProducer::DeleteInstance(Qt3DSDMInstanceHandle inInstance) -{ - TIntList theProperties; - TIntList theInstances; - - GetDataCoreSender()->SignalBeforeInstanceDeleted(inInstance); - // Ensure the instance exists - m_Data->GetInstanceNF(inInstance, m_Data->m_Objects); - do_all(m_Data->m_Objects, - std::bind(CSimpleDataCore::FindRelatedItemsForDelete, inInstance.GetHandleValue(), - std::ref(theProperties), std::ref(theInstances), std::placeholders::_1)); - - if (m_Consumer) { - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inInstance, m_Data->m_Objects); - do_all(theProperties, std::bind(HandleDeleteTransaction, __FILE__, __LINE__, - std::placeholders::_1, - std::ref(m_Data->m_Objects), m_Consumer)); - } - - vector<tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition>> theDefinitionList; - theDefinitionList.resize(theProperties.size()); - - function<tuple<Qt3DSDMPropertyHandle, Qt3DSDMPropertyDefinition>(Qt3DSDMPropertyHandle)> - thePropertyTransform(bind(TransformProperty, std::placeholders::_1, ref(*m_Data))); - transform(theProperties.begin(), theProperties.end(), theDefinitionList.begin(), - thePropertyTransform); - - GetDataCoreSender()->SignalInstanceDeleted(inInstance); - - m_Data->DeleteInstance(inInstance); - // Signal that these theProperties are no longer with us. - do_all(theDefinitionList, bind(SignalPropertyRemoved, inInstance, - std::placeholders::_1, GetDataCoreSender())); -} - -bool CDataCoreProducer::IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const -{ - return m_Data->IsInstanceOrDerivedFrom(inInstance, inParent); -} - -void CDataCoreProducer::GetInstances(TInstanceHandleList &outInstances) const -{ - m_Data->GetInstances(outInstances); -} -void CDataCoreProducer::GetInstancesDerivedFrom(TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParentHandle) const -{ - m_Data->GetInstancesDerivedFrom(outInstances, inParentHandle); -} - -struct ClearInstanceParentCacheTransaction : public ITransaction -{ - const CDataModelInstance &m_Instance; - ClearInstanceParentCacheTransaction(const char *inFile, int inLine, - const CDataModelInstance &inst) - : ITransaction(inFile, inLine) - , m_Instance(inst) - { - } - void Do() override { m_Instance.ClearParentCache(); } - void Undo() override { m_Instance.ClearParentCache(); } -}; - -void CDataCoreProducer::DeriveInstance(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) -{ - m_Data->DeriveInstance(inInstance, inParent); - TDataModelInstancePtr theInstance = - CSimpleDataCore::GetInstanceNF(inInstance, m_Data->m_Objects); - if (m_Consumer) { - CreateHashMapInsertTransaction( - __FILE__, __LINE__, m_Consumer, - make_pair(inParent.GetHandleValue(), - CSimpleDataCore::GetInstanceNF(inParent, m_Data->m_Objects)), - theInstance->m_Parents); - m_Consumer->OnTransaction(std::static_pointer_cast<ITransaction>( - std::make_shared<ClearInstanceParentCacheTransaction>(__FILE__, __LINE__, - *theInstance))); - } - GetDataCoreSender()->SignalInstanceDerived(inInstance, inParent); -} - -void CDataCoreProducer::GetInstanceParents(Qt3DSDMInstanceHandle inHandle, - TInstanceHandleList &outParents) const -{ - m_Data->GetInstanceParents(inHandle, outParents); -} - -Qt3DSDMPropertyHandle CDataCoreProducer::AddProperty(Qt3DSDMInstanceHandle inInstance, - TCharPtr inName, DataModelDataType::Value inPropType) -{ - Qt3DSDMPropertyHandle retval = m_Data->AddProperty(inInstance, inName, inPropType); - TDataModelInstancePtr theInstance = - CSimpleDataCore::GetInstanceNF(inInstance, m_Data->m_Objects); - CreateVecInsertTransaction<int>(__FILE__, __LINE__, m_Consumer, retval, - theInstance->m_Properties); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - GetDataCoreSender()->SignalPropertyAdded(inInstance, retval, inName, inPropType); - return retval; -} - -void CDataCoreProducer::GetInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const -{ - m_Data->GetInstanceProperties(inInstance, outProperties); -} - -const Qt3DSDMPropertyDefinition & -CDataCoreProducer::GetProperty(Qt3DSDMPropertyHandle inProperty) const -{ - return m_Data->GetProperty(inProperty); -} - -void CDataCoreProducer::RemoveProperty(Qt3DSDMPropertyHandle inProperty) -{ - Qt3DSDMPropertyDefinition theDef = GetProperty(inProperty); - TDataModelInstancePtr theInstance = - CSimpleDataCore::GetInstanceNF(theDef.m_Instance, m_Data->m_Objects); - if (find_if<TIntList::iterator>(theInstance->m_Properties, - std::bind(equal_to<int>(), inProperty, std::placeholders::_1)) - != theInstance->m_Properties.end()) { - CreateVecEraseTransaction<int>(__FILE__, __LINE__, m_Consumer, inProperty, - theInstance->m_Properties); - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inProperty, m_Data->m_Objects); - GetDataCoreSender()->SignalPropertyRemoved(theDef.m_Instance, inProperty, - theDef.m_Name.wide_str(), theDef.m_Type); - m_Data->RemoveProperty(inProperty); - } else { - throw PropertyNotFound(L""); - } -} - -inline void AddCopyInstancePropertyTransaction(int inProperty, const TIntList &inOriginalList, - CDataModelInstance &inInstance, - TTransactionConsumerPtr &inConsumer) -{ - // if this property was never in the original list - if (find_if<TIntList::const_iterator>(inOriginalList, - std::bind(equal_to<int>(), inProperty, - std::placeholders::_1)) - == inOriginalList.end()) - CreateVecInsertTransaction<int>(__FILE__, __LINE__, inConsumer, - Qt3DSDMPropertyHandle(inProperty), inInstance.m_Properties); -} - -inline void AddCopyInstanceValuePropertyTransaction(const TPropertyPair &inProperty, - const TPropertyPairHash &inOriginalList, - CDataModelInstance &inInstance, - TTransactionConsumerPtr &inConsumer) -{ - // if this property was never in the original list - if (inOriginalList.end() == inOriginalList.find(inProperty.first)) - CreateHashMapInsertTransaction(__FILE__, __LINE__, inConsumer, inProperty, - inInstance.m_PropertyValues); -} - -struct InstancePropertyValuesTransaction : public ITransaction -{ - CDataModelInstance &m_Instance; - TIntList m_OldProperties; - TPropertyPairList m_OldValues; - TIntList m_NewProperties; - TPropertyPairList m_NewValues; - - InstancePropertyValuesTransaction(const char *inFile, int inLine, - CDataModelInstance &inInstance) - : ITransaction(inFile, inLine) - , m_Instance(inInstance) - , m_OldProperties(inInstance.m_Properties) - { - inInstance.ToPropertyPairList(m_OldValues); - } - - void SetNew() - { - m_NewProperties = m_Instance.m_Properties; - m_Instance.ToPropertyPairList(m_NewValues); - } - - void Do() override - { - m_Instance.m_Properties = m_NewProperties; - m_Instance.FromPropertyPairList(m_NewValues); - } - - void Undo() override - { - m_Instance.m_Properties = m_OldProperties; - m_Instance.FromPropertyPairList(m_OldValues); - } -}; - -void CDataCoreProducer::CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance, - Qt3DSDMInstanceHandle inDestInstance) -{ - TDataModelInstancePtr theInstance = - CSimpleDataCore::GetInstanceNF(inDestInstance, m_Data->m_Objects); - if (m_Consumer) { - // Create the transaction object setting its 'old values' property to the current instance - // property values. - std::shared_ptr<InstancePropertyValuesTransaction> theTransaction( - std::make_shared<InstancePropertyValuesTransaction>(__FILE__, __LINE__, - ref(*theInstance))); - - // Change the current instance property values - m_Data->CopyInstanceProperties(inSrcInstance, inDestInstance); - - // Ask the transaction to copy the new values into it's new values datastructure. - theTransaction->SetNew(); - - m_Consumer->OnTransaction(std::static_pointer_cast<ITransaction>(theTransaction)); - } else { - m_Data->CopyInstanceProperties(inSrcInstance, inDestInstance); - } -} - -Qt3DSDMPropertyHandle -CDataCoreProducer::GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const -{ - return m_Data->GetAggregateInstancePropertyByName(inInstance, inStr); -} - -void CDataCoreProducer::GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const -{ - m_Data->GetAggregateInstanceProperties(inInstance, outProperties); -} - -void CDataCoreProducer::GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle, - TPropertyHandleValuePairList &outValues) -{ - m_Data->GetSpecificInstancePropertyValues(inHandle, outValues); -} - -bool CDataCoreProducer::HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - return m_Data->HasAggregateInstanceProperty(inInstance, inProperty); -} - -void CDataCoreProducer::CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) const -{ - return m_Data->CheckValue(inInstance, inProperty, inValue); -} - -bool CDataCoreProducer::GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - return m_Data->GetInstancePropertyValue(inHandle, inProperty, outValue); -} - -inline void EraseProperty(TPropertyPairHash &inProperties, int inProperty) -{ - inProperties.erase( - find_if(inProperties.begin(), inProperties.end(), - std::bind(CSimpleDataCore::InstancePropertyMatches, inProperty, - std::placeholders::_1))); -} - -void CDataCoreProducer::SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - // Two possible courses of actions. The property exists, in which case - // we need to get its old value. - // If it doesn't exist, then we need to erase for undo. - TPropertyValuePair theOldValue(PropertyValueFlags(PropertyValueFlags::SetViaAutoPropagate), - SInternValue(0.0f, GetStringTable())); - TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inHandle, m_Data->m_Objects); - TPropertyPairHash::iterator theItem = - theInstance->m_PropertyValues.find(inProperty.GetHandleValue()); - bool foundProp = theItem != theInstance->m_PropertyValues.end(); - if (foundProp) - theOldValue = theItem->second; - m_Data->SetInstancePropertyValue(inHandle, inProperty, inValue); - TPropertyValuePair theNewValue = - theInstance->m_PropertyValues.find(inProperty.GetHandleValue())->second; - if (m_Consumer) { - // Check if we already have the entry - TSlideInstancePropertyPair theKey(inHandle, inProperty); - TPropertyMergeMap::iterator iter = m_PropertyMergeMap.find(theKey); - // Then we merge the values in to the original event where they - // first happened. - if (iter != m_PropertyMergeMap.end()) { - iter->second->Update(theNewValue); - return; // don't send the signal if we just updated value - } else // Else we add a new merge entry. - { - TPropertyMergeMapEntry theEntry; - if (!foundProp) - theEntry = CreateHashMapInsertTransaction( - __FILE__, __LINE__, m_Consumer, - make_pair(inProperty.GetHandleValue(), theNewValue), - theInstance->m_PropertyValues); - else - theEntry = CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, - inProperty.GetHandleValue(), theOldValue, - theNewValue, theInstance->m_PropertyValues); - m_PropertyMergeMap.insert(std::make_pair(theKey, theEntry)); - } - } - GetPropertyCoreSender()->SignalInstancePropertyValue(inHandle, inProperty, inValue); -} - -bool CDataCoreProducer::HandleValid(int inHandle) const -{ - return m_Data->HandleValid(inHandle); -} - -void CDataCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_Consumer = inConsumer; - m_PropertyMergeMap.clear(); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectInstancePropertyValue( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)> - &inCallback) -{ - return GetPropertyCoreProvider()->ConnectInstancePropertyValue(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectInstanceCreated( - const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) -{ - return GetDataCoreProvider()->ConnectInstanceCreated(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectInstanceDeleted( - const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) -{ - return GetDataCoreProvider()->ConnectInstanceDeleted(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectBeforeInstanceDeleted( - const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) -{ - return GetDataCoreProvider()->ConnectBeforeInstanceDeleted(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectInstanceDerived( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) -{ - return GetDataCoreProvider()->ConnectInstanceDerived(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectInstanceParentRemoved( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) -{ - return GetDataCoreProvider()->ConnectInstanceParentRemoved(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectPropertyAdded( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr, - DataModelDataType::Value)> &inCallback) -{ - return GetDataCoreProvider()->ConnectPropertyAdded(inCallback); -} - -TSignalConnectionPtr CDataCoreProducer::ConnectPropertyRemoved( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr, - DataModelDataType::Value)> &inCallback) -{ - return GetDataCoreProvider()->ConnectPropertyRemoved(inCallback); -} - -void CDataCoreProducer::InitSignallers() -{ - m_InstancePropertyCoreSignaller = CreatePropertyCoreSignaller(); - m_DataCoreSignaller = CreateDataCoreSignaller(); -} - -IInstancePropertyCoreSignalProvider *CDataCoreProducer::GetPropertyCoreProvider() -{ - return dynamic_cast<IInstancePropertyCoreSignalProvider *>( - m_InstancePropertyCoreSignaller.get()); -} - -IInstancePropertyCoreSignalSender *CDataCoreProducer::GetPropertyCoreSender() -{ - return dynamic_cast<IInstancePropertyCoreSignalSender *>(m_InstancePropertyCoreSignaller.get()); -} - -IDataCoreSignalProvider *CDataCoreProducer::GetDataCoreProvider() -{ - return dynamic_cast<IDataCoreSignalProvider *>(m_DataCoreSignaller.get()); -} - -IDataCoreSignalSender *CDataCoreProducer::GetDataCoreSender() -{ - return dynamic_cast<IDataCoreSignalSender *>(m_DataCoreSignaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/DataCoreProducer.h b/src/Authoring/QT3DSDM/Systems/Cores/DataCoreProducer.h deleted file mode 100644 index 8d89bfab..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/DataCoreProducer.h +++ /dev/null @@ -1,175 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef DATACOREPRODUCERH -#define DATACOREPRODUCERH - -#include "Qt3DSDMTransactions.h" -#include "SimpleDataCore.h" -#include "Qt3DSDMSignals.h" -#include "SimpleSlideCore.h" - -namespace qt3dsdm { - -class CDataCoreProducer : public IDataCore, - public ITransactionProducer, - public IInstancePropertyCoreSignalProvider, - public IDataCoreSignalProvider -{ - typedef std::shared_ptr<IMergeableTransaction<TPropertyValuePair>> TPropertyMergeMapEntry; - typedef std::unordered_map<TSlideInstancePropertyPair, TPropertyMergeMapEntry> - TPropertyMergeMap; - - TTransactionConsumerPtr m_Consumer; - TSimpleDataCorePtr m_Data; - TSignalItemPtr m_InstancePropertyCoreSignaller; - TSignalItemPtr m_DataCoreSignaller; - - TPropertyMergeMap m_PropertyMergeMap; - -public: - CDataCoreProducer(TStringTablePtr inStringTable) - : m_Data(new CSimpleDataCore(inStringTable)) - { - InitSignallers(); - } - virtual ~CDataCoreProducer() {} - - IStringTable &GetStringTable() const override { return m_Data->GetStringTable(); } - std::shared_ptr<IStringTable> GetStringTablePtr() const override - { - return m_Data->GetStringTablePtr(); - } - - // IHandleBase - bool HandleValid(int inHandle) const override; - - // IInstancePropertyCore - //=============================================================== - Qt3DSDMPropertyHandle GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const override; - void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const override; - void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle, - TPropertyHandleValuePairList &outValues) override; - bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - - void CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) const override; - bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - //=============================================================== - - // IDataCore - //=============================================================== - Qt3DSDMInstanceHandle CreateInstance(Qt3DSDMInstanceHandle hdl = Qt3DSDMInstanceHandle()) override; - void GetInstances(TInstanceHandleList &outInstances) const override; - void GetInstancesDerivedFrom(TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParent) const override; - void DeleteInstance(Qt3DSDMInstanceHandle inHandle) override; - - void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) override; - void GetInstanceParents(Qt3DSDMInstanceHandle inHandle, - TInstanceHandleList &outParents) const override; - bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const override; - - Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName, - DataModelDataType::Value inPropType) override; - void GetInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const override; - const Qt3DSDMPropertyDefinition &GetProperty(Qt3DSDMPropertyHandle inProperty) const override; - void RemoveProperty(Qt3DSDMPropertyHandle inProperty) override; - void CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance, - Qt3DSDMInstanceHandle inDestInstance) override; - - void RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) override - { - m_Data->RemoveCachedValues(inInstance); - } - bool IsInstance(int inHandle) const override { return m_Data->IsInstance(inHandle); } - bool IsProperty(int inHandle) const override { return m_Data->IsProperty(inHandle); } - //=============================================================== - - //=============================================================== - // Set the current consumer - //=============================================================== - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - - //=============================================================== - // Return a serializable data model for load/save - //=============================================================== - virtual TSimpleDataCorePtr GetTransactionlessDataCore() { return m_Data; } - virtual TSimpleDataCorePtr GetTransactionlessDataCore() const { return m_Data; } - - //=============================================================== - // Signal provider implementation - //=============================================================== - TSignalConnectionPtr ConnectInstancePropertyValue( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)> - &inCallback) override; - virtual TSignalConnectionPtr - ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectBeforeInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override; - TSignalConnectionPtr ConnectInstanceDerived( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override; - TSignalConnectionPtr ConnectInstanceParentRemoved( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectPropertyAdded(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - TCharPtr, DataModelDataType::Value)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectPropertyRemoved(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - TCharPtr, DataModelDataType::Value)> &inCallback) override; - -private: - CDataCoreProducer(const CDataCoreProducer&) = delete; - CDataCoreProducer& operator=(const CDataCoreProducer&) = delete; - - template <typename TTransactionType> - inline void RunWithConsumer(TTransactionType inTransaction) - { - qt3dsdm::RunWithConsumer(m_Consumer, inTransaction); - } - - void InitSignallers(); - IInstancePropertyCoreSignalProvider *GetPropertyCoreProvider(); - IInstancePropertyCoreSignalSender *GetPropertyCoreSender(); - IDataCoreSignalProvider *GetDataCoreProvider(); - IDataCoreSignalSender *GetDataCoreSender(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleActionCore.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SimpleActionCore.cpp deleted file mode 100644 index b2f35538..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleActionCore.cpp +++ /dev/null @@ -1,240 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "SimpleActionCore.h" - -namespace qt3dsdm { - -Qt3DSDMActionHandle CSimpleActionCore::CreateAction(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner, - SLong4 inTriggerTargetObjects) -{ - int nextId = GetNextId(); - Qt3DSDMActionHandle retval = CreateActionWithHandle(nextId, inInstance, inSlide, inOwner); - SetTriggerObject(retval, inTriggerTargetObjects); - SetTargetObject(retval, inTriggerTargetObjects); - return retval; -} - -void CSimpleActionCore::DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) -{ - SAction *theAction = GetActionNF(inAction, m_Objects); - outInstance = theAction->m_ActionInfo.m_Instance; - do_all(theAction->m_ActionInfo.m_HandlerArgs, - std::bind(EraseHandle, std::placeholders::_1, std::ref(m_Objects))); - EraseHandle(inAction, m_Objects); -} - -const SActionInfo &CSimpleActionCore::GetActionInfo(Qt3DSDMActionHandle inAction) const -{ - const SAction *theAction = GetActionNF(inAction, m_Objects); - return theAction->m_ActionInfo; -} - -inline void AddIfActionMatches(const THandleObjectPair &inPair, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) -{ - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeAction) { - const SAction *theAction = static_cast<SAction *>(inPair.second.get()); - if ((!inSlide.Valid() || inSlide == theAction->m_ActionInfo.m_Slide) - && (!inOwner.Valid() || inOwner == theAction->m_ActionInfo.m_Owner)) - outActions.push_back(inPair.first); - } -} - -// Return all actions that belong to a certain instance in a certain slide -void CSimpleActionCore::GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const -{ - outActions.clear(); - do_all(m_Objects, - std::bind(AddIfActionMatches, - std::placeholders::_1, inSlide, inOwner, std::ref(outActions))); -} - -// Return all actions that exist in a certain slide -void CSimpleActionCore::GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const -{ - GetActions(inSlide, 0, outActions); -} - -// Return all actions that belong to a certain instance -void CSimpleActionCore::GetActions(Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const -{ - GetActions(0, inOwner, outActions); -} - -// Return all actions -void CSimpleActionCore::GetActions(TActionHandleList &outActions) const -{ - outActions.clear(); - outActions.reserve(m_Objects.size()); - do_all(m_Objects, - std::bind(MaybeAddObject<SAction, Qt3DSDMActionHandle>, - std::placeholders::_1, std::ref(outActions))); -} - -// Return the instance that was allocated for this action. -Qt3DSDMInstanceHandle CSimpleActionCore::GetActionInstance(Qt3DSDMActionHandle inAction) const -{ - return GetActionNF(inAction, m_Objects)->m_ActionInfo.m_Instance; -} - -inline bool ActionInstanceMatches(const THandleObjectPair &inPair, Qt3DSDMInstanceHandle inInstance) -{ - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeAction) { - const SAction *theAction = static_cast<SAction *>(inPair.second.get()); - if (inInstance == theAction->m_ActionInfo.m_Instance) - return true; - } - return false; -} - -// Reverse lookup into the action system so you can match actions to instances. -Qt3DSDMActionHandle -CSimpleActionCore::GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const -{ - THandleObjectMap::const_iterator theAction = - find_if(m_Objects.begin(), m_Objects.end(), - std::bind(ActionInstanceMatches, std::placeholders::_1, inActionInstance)); - if (theAction != m_Objects.end()) - return theAction->first; - throw ActionNotFound(L""); -} - -// Action Properties -void CSimpleActionCore::SetTriggerObject(Qt3DSDMActionHandle inAction, - const SObjectRefType &inTriggerObject) -{ - SAction *theAction = GetActionNF(inAction, m_Objects); - theAction->m_ActionInfo.m_TriggerObject = inTriggerObject; -} - -void CSimpleActionCore::SetTargetObject(Qt3DSDMActionHandle inAction, - const SObjectRefType &inTargetObject) -{ - SAction *theAction = GetActionNF(inAction, m_Objects); - theAction->m_ActionInfo.m_TargetObject = inTargetObject; -} - -void CSimpleActionCore::SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) -{ - SAction *theAction = GetActionNF(inAction, m_Objects); - theAction->m_ActionInfo.m_Event = inEventHandle; -} - -void CSimpleActionCore::SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle) -{ - SAction *theAction = GetActionNF(inAction, m_Objects); - theAction->m_ActionInfo.m_Handler = inHandlerHandle; -} - -// Action Argument -Qt3DSDMHandlerArgHandle CSimpleActionCore::AddHandlerArgument(Qt3DSDMActionHandle inAction, - const TCharStr &inName, - HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) -{ - int nextId = GetNextId(); - return AddHandlerArgumentWithHandle(nextId, inAction, inName, inArgType, inValueType); -} - -void CSimpleActionCore::RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) -{ - SHandlerArgument *theHandlerArgument = GetHandlerArgumentNF(inHandlerArgument, m_Objects); - SAction *theAction = GetActionNF(theHandlerArgument->m_HandlerArgInfo.m_Action, m_Objects); - EraseHandle(inHandlerArgument, m_Objects); - erase_if(theAction->m_ActionInfo.m_HandlerArgs, - std::bind(equal_to<int>(), std::placeholders::_1, inHandlerArgument.GetHandleValue())); -} - -const SHandlerArgumentInfo & -CSimpleActionCore::GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const -{ - if (HandleValid(inHandlerArgument)) { - const SHandlerArgument *theHandlerArgument = - GetHandlerArgumentNF(inHandlerArgument, m_Objects); - return theHandlerArgument->m_HandlerArgInfo; - } else { - static SHandlerArgumentInfo dummy; - return dummy; - } -} - -void CSimpleActionCore::GetHandlerArguments(Qt3DSDMActionHandle inAction, - THandlerArgHandleList &outHandlerArguments) const -{ - const SAction *theAction = GetActionNF(inAction, m_Objects); - outHandlerArguments = theAction->m_ActionInfo.m_HandlerArgs; -} - -// Action Argument Properties -void CSimpleActionCore::GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, - SValue &outValue) const -{ - const SHandlerArgument *theHandlerArgument = GetHandlerArgumentNF(inHandlerArgument, m_Objects); - outValue = theHandlerArgument->m_HandlerArgInfo.m_Value; -} - -void CSimpleActionCore::SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, - const SValue &inValue) -{ - SHandlerArgument *theHandlerArgument = GetHandlerArgumentNF(inHandlerArgument, m_Objects); - theHandlerArgument->m_HandlerArgInfo.m_Value = inValue; -} - -// Helper functions -Qt3DSDMActionHandle CSimpleActionCore::CreateActionWithHandle(int inHandle, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) -{ - if (HandleValid(inHandle)) - throw HandleExists(L""); - m_Objects.insert(make_pair( - inHandle, (THandleObjectPtr) new SAction(inHandle, inInstance, inSlide, inOwner))); - return inHandle; -} - -Qt3DSDMHandlerArgHandle -CSimpleActionCore::AddHandlerArgumentWithHandle(int inHandle, Qt3DSDMActionHandle inAction, - const TCharStr &inName, HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) -{ - if (HandleValid(inHandle)) - throw HandleExists(L""); - m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SHandlerArgument( - inHandle, inAction, inName, inArgType, inValueType))); - SAction *theAction = GetActionNF(inAction, m_Objects); - theAction->m_ActionInfo.m_HandlerArgs.push_back(inHandle); - return inHandle; -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleActionCore.h b/src/Authoring/QT3DSDM/Systems/Cores/SimpleActionCore.h deleted file mode 100644 index 1e229f18..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleActionCore.h +++ /dev/null @@ -1,165 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef ACTIONCOREH -#define ACTIONCOREH - -#include "Qt3DSDMActionCore.h" -#include "HandleSystemBase.h" -#include "Qt3DSDMErrors.h" - -namespace qt3dsdm { -struct SAction : public CHandleObject -{ - SActionInfo m_ActionInfo; - - SAction() {} - - SAction(int inHandle, Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) - : CHandleObject(inHandle) - , m_ActionInfo(inInstance, inSlide, inOwner) - { - } - - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeAction; - EHandleObjectType GetType() override { return s_Type; } -}; - -struct SHandlerArgument : public CHandleObject -{ - SHandlerArgumentInfo m_HandlerArgInfo; - - SHandlerArgument() {} - - SHandlerArgument(int inHandle, Qt3DSDMActionHandle inAction, const TCharStr &inName, - HandlerArgumentType::Value inArgType, DataModelDataType::Value inValueType) - : CHandleObject(inHandle) - , m_HandlerArgInfo(inAction, inName, inArgType, inValueType) - { - } - - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeActionHandlerArgument; - EHandleObjectType GetType() override { return s_Type; } -}; - -class CSimpleActionCore : public CHandleBase, public IActionCore -{ - mutable TStringTablePtr m_StringTable; - -public: // Use - CSimpleActionCore(TStringTablePtr strTable) - : m_StringTable(strTable) - { - } - - IStringTable &GetStringTable() const override { return *m_StringTable.get(); } - TStringTablePtr GetStringTablePtr() const override { return m_StringTable; } - // Action - Qt3DSDMActionHandle CreateAction(Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner, SLong4 inTriggerTargetObjects) override; - void DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) override; - const SActionInfo &GetActionInfo(Qt3DSDMActionHandle inAction) const override; - void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const override; - void GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const override; - void GetActions(Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) const override; - void GetActions(TActionHandleList &outActions) const override; - - // Return the instance that was allocated for this action. - Qt3DSDMInstanceHandle GetActionInstance(Qt3DSDMActionHandle inAction) const override; - // Reverse lookup into the action system so you can match actions to instances. - Qt3DSDMActionHandle GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const override; - - // Action Properties - void SetTriggerObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTriggerObject) override; - void SetTargetObject(Qt3DSDMActionHandle inAction, const SObjectRefType &inTargetObject) override; - void SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEvent) override; - void SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandler) override; - - // Action Argument - Qt3DSDMHandlerArgHandle AddHandlerArgument(Qt3DSDMActionHandle inAction, const TCharStr &inName, - HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) override; - void RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) override; - const SHandlerArgumentInfo & - GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const override; - void GetHandlerArguments(Qt3DSDMActionHandle inAction, - THandlerArgHandleList &outHandlerArguments) const override; - - // Action Argument Properties - void GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, SValue &outValue) const override; - void SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, const SValue &inValue) override; - - // CHandleBase - bool HandleValid(int inHandle) const override { return CHandleBase::HandleValid(inHandle); } - - // Helper functions - Qt3DSDMActionHandle CreateActionWithHandle(int inHandle, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner); - Qt3DSDMHandlerArgHandle AddHandlerArgumentWithHandle(int inHandle, Qt3DSDMActionHandle inAction, - const TCharStr &inName, - HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType); - - static SAction *GetActionNF(int inHandle, THandleObjectMap &inObjects) - { - return const_cast<SAction *>( - GetActionNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const SAction *GetActionNF(int inHandle, const THandleObjectMap &inObjects) - { - const SAction *theAction = GetHandleObject<SAction>(inHandle, inObjects); - if (theAction) - return theAction; - throw ActionNotFound(L""); - } - - static SHandlerArgument *GetHandlerArgumentNF(int inHandle, THandleObjectMap &inObjects) - { - return const_cast<SHandlerArgument *>( - GetHandlerArgumentNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const SHandlerArgument *GetHandlerArgumentNF(int inHandle, - const THandleObjectMap &inObjects) - { - const SHandlerArgument *theItem = GetHandleObject<SHandlerArgument>(inHandle, inObjects); - if (theItem) - return theItem; - throw HandlerArgumentNotFound(L""); - } -}; - -typedef std::shared_ptr<CSimpleActionCore> TSimpleActionCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleAnimationCore.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SimpleAnimationCore.cpp deleted file mode 100644 index 00d6df4e..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleAnimationCore.cpp +++ /dev/null @@ -1,618 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "SimpleAnimationCore.h" - -#ifdef _WIN32 -#pragma warning(disable : 4503) // decorated name length exceeded -#endif - -typedef long INT32; -typedef float FLOAT; -#define DATALOGGER_CUBICROOT 0 - -struct SPerfLogEvent -{ - SPerfLogEvent(int) {} -}; - -typedef SPerfLogEvent TPerfLogMathEvent1; - -#include "Qt3DSCubicRoots.h" -#include "Qt3DSCubicRootsImpl.h" -#include "Qt3DSBezierEval.h" -using namespace std; - -namespace qt3dsdm { - -Qt3DSDMAnimationHandle -CSimpleAnimationCore::CreateAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, bool inFirstKeyframeDynamic) -{ - if (GetAnimation(inSlide, inInstance, inProperty, inIndex).Valid()) - throw AnimationExists(L""); - - int nextId = GetNextId(); - Qt3DSDMAnimationHandle retval = CreateAnimationWithHandle( - nextId, inSlide, inInstance, inProperty, inIndex, inAnimationType, inFirstKeyframeDynamic); - AddAnimationToLookupCache(retval); - return retval; -} - -void CSimpleAnimationCore::DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) -{ - RemoveAnimationFromLookupCache(inAnimation); - SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - do_all(theItem->m_Keyframes, std::bind(EraseHandle, - std::placeholders::_1, std::ref(m_Objects))); - EraseHandle(inAnimation, m_Objects); -} - -void CSimpleAnimationCore::EnsureAnimationCache() const -{ - if (m_AnimationMatchesCache.size() == 0) { - for (THandleObjectMap::const_iterator theIter = m_Objects.begin(), theEnd = m_Objects.end(); - theIter != theEnd; ++theIter) { - if (theIter->second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack) - AddAnimationToLookupCache(static_pointer_cast<SAnimationTrack>(theIter->second)); - } - } -} - -Qt3DSDMAnimationHandle CSimpleAnimationCore::GetAnimation(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - size_t inIndex) const -{ - EnsureAnimationCache(); - - pair<TStateInstanceAnimationMap::const_iterator, TStateInstanceAnimationMap::const_iterator> - theRange(m_AnimationMatchesCache.equal_range( - make_pair(inSlide.GetHandleValue(), inInstance.GetHandleValue()))); - for (TStateInstanceAnimationMap::const_iterator theIter = theRange.first; - theIter != theRange.second; ++theIter) { - std::shared_ptr<SAnimationTrack> theItem = theIter->second; - if (inSlide.GetHandleValue() == theItem->m_Slide - && inInstance.GetHandleValue() == theItem->m_Instance - && inProperty.GetHandleValue() == theItem->m_Property && inIndex == theItem->m_Index) - return theItem->m_Handle; - } - return 0; -} - -SAnimationInfo CSimpleAnimationCore::GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const -{ - if (m_Objects.find(inAnimation) != m_Objects.end()) { - const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - return CreateAnimationInfo(theItem->m_Slide, theItem->m_Instance, theItem->m_Property, - theItem->m_Index, theItem->m_AnimationType, - theItem->m_FirstKeyframeDynamic, theItem->m_ArtistEdited); - } - return SAnimationInfo(); -} - -inline void AddIfAnimation(const THandleObjectPair &inPair, TAnimationHandleList &outAnimations) -{ - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack) - outAnimations.push_back(inPair.first); -} - -void CSimpleAnimationCore::GetAnimations(TAnimationHandleList &outAnimations) const -{ - outAnimations.clear(); - do_all(m_Objects, std::bind(AddIfAnimation, std::placeholders::_1, std::ref(outAnimations))); -} - -void CSimpleAnimationCore::GetAnimations(TAnimationInfoList &outAnimations, - Qt3DSDMSlideHandle inMaster, - Qt3DSDMSlideHandle inSlide) const -{ - outAnimations.clear(); - for (THandleObjectMap::const_iterator iter = m_Objects.begin(), end = m_Objects.end(); - iter != end; ++iter) { - if (iter->second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack) { - const SAnimationTrack *theItem = - static_cast<const SAnimationTrack *>(iter->second.get()); - // If either master or slide is valid, then item slide must match. - // If item slide matches neither, then we ignore unless neither are valid. - bool keep = (theItem->m_Slide == inMaster || theItem->m_Slide == inSlide) - || (inMaster.Valid() == false && inSlide.Valid() == false); - if (keep) { - outAnimations.push_back( - CreateAnimationInfo(theItem->m_Slide, theItem->m_Instance, theItem->m_Property, - theItem->m_Index, theItem->m_AnimationType, - theItem->m_FirstKeyframeDynamic, theItem->m_ArtistEdited)); - } - } - } -} - -inline void AddSpecificAnimationsIf(const THandleObjectPair &inPair, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TAnimationHandleList &outAnimations) -{ - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSAnimationTrack) { - const SAnimationTrack *theTrack = static_cast<const SAnimationTrack *>(inPair.second.get()); - if (theTrack->m_Slide == inSlide && theTrack->m_Instance == inInstance) - outAnimations.push_back(inPair.first); - } -} - -void CSimpleAnimationCore::GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TAnimationHandleList &outAnimations) -{ - EnsureAnimationCache(); - pair<TStateInstanceAnimationMap::const_iterator, TStateInstanceAnimationMap::const_iterator> - theRange(m_AnimationMatchesCache.equal_range( - make_pair(inSlide.GetHandleValue(), inInstance.GetHandleValue()))); - for (TStateInstanceAnimationMap::const_iterator iter = theRange.first; iter != theRange.second; - ++iter) - outAnimations.push_back(iter->second->m_Handle); -} - -void CSimpleAnimationCore::SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) -{ - SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - theItem->m_FirstKeyframeDynamic = inValue; - SetIsArtistEdited(inAnimation); -} - -inline void CheckKeyframeType(EAnimationType inExpected, const TKeyframe &inKeyframe) -{ - if (inExpected != GetKeyframeType(inKeyframe)) - throw AnimationKeyframeTypeError(L""); -} - -// keyframe manipulation -Qt3DSDMKeyframeHandle CSimpleAnimationCore::InsertKeyframe(Qt3DSDMAnimationHandle inAnimation, - const TKeyframe &inKeyframe) -{ - SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - CheckKeyframeType(theItem->m_AnimationType, inKeyframe); - int nextId = GetNextId(); - m_Objects.insert( - make_pair(nextId, (THandleObjectPtr) new SKeyframe(nextId, inAnimation, inKeyframe))); - theItem->m_Keyframes.push_back(nextId); - theItem->m_KeyframesDirty = true; - SetIsArtistEdited(inAnimation); - return nextId; -} - -void CSimpleAnimationCore::EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe) -{ - SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects); - int theAnimHandle(theKeyframe->m_Animation); - SAnimationTrack *theItem = GetAnimationNF(theAnimHandle, m_Objects); - EraseHandle(inKeyframe, m_Objects); - erase_if(theItem->m_Keyframes, std::bind(equal_to<int>(), - std::placeholders::_1, inKeyframe.GetHandleValue())); - SetIsArtistEdited(theAnimHandle); -} - -void CSimpleAnimationCore::DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) -{ - SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - do_all(theItem->m_Keyframes, std::bind(EraseHandle, - std::placeholders::_1, std::ref(m_Objects))); - theItem->m_Keyframes.clear(); - SetIsArtistEdited(inAnimation); -} - -Qt3DSDMAnimationHandle -CSimpleAnimationCore::GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const -{ - const SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects); - return theKeyframe->m_Animation; -} - -TKeyframe CSimpleAnimationCore::GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const -{ - const SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects); - return theKeyframe->m_Keyframe; -} - -void CSimpleAnimationCore::SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) -{ - DoSetKeyframeData(inKeyframe, inData); - SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects); - SetIsArtistEdited(theKeyframe->m_Animation); -} - -void CSimpleAnimationCore::DoSetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, - const TKeyframe &inData) -{ - SKeyframe *theKeyframe = GetKeyframeNF(inKeyframe, m_Objects); - CheckKeyframeType(GetKeyframeType(theKeyframe->m_Keyframe), inData); - theKeyframe->m_Keyframe = inData; - SAnimationTrack *theItem = GetAnimationNF(theKeyframe->m_Animation, m_Objects); - theItem->m_KeyframesDirty = true; -} - -bool KeyframeLessThan(int inLeftSide, int inRightSide, const THandleObjectMap &inObjects) -{ - const SKeyframe *theLeft = CSimpleAnimationCore::GetKeyframeNF(inLeftSide, inObjects); - const SKeyframe *theRight = CSimpleAnimationCore::GetKeyframeNF(inRightSide, inObjects); - return KeyframeTime(theLeft->m_Keyframe) < KeyframeTime(theRight->m_Keyframe); -} - -void SortKeyframes(TKeyframeHandleList &inKeyframes, const THandleObjectMap &inObjects) -{ - return stable_sort(inKeyframes.begin(), inKeyframes.end(), - std::bind(KeyframeLessThan, std::placeholders::_1, - std::placeholders::_2, std::ref(inObjects))); -} - -void CheckKeyframesSorted(const SAnimationTrack *theItem, const THandleObjectMap &inObjects) -{ - if (theItem->m_KeyframesDirty) { - SAnimationTrack *theNonConst = const_cast<SAnimationTrack *>(theItem); - SortKeyframes(theNonConst->m_Keyframes, inObjects); - theNonConst->m_KeyframesDirty = false; - } -} - -void CSimpleAnimationCore::GetKeyframes(Qt3DSDMAnimationHandle inAnimation, - TKeyframeHandleList &outKeyframes) const -{ - const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - CheckKeyframesSorted(theItem, m_Objects); - outKeyframes = theItem->m_Keyframes; -} - -size_t CSimpleAnimationCore::GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const -{ - const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - return theItem->m_Keyframes.size(); -} - -bool CSimpleAnimationCore::IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const -{ - Qt3DSDMAnimationHandle theAnimation = GetAnimationForKeyframe(inKeyframe); - if (theAnimation.Valid()) { - const SAnimationTrack *theItem = GetAnimationNF(theAnimation, m_Objects); - return theItem->m_Keyframes.size() && theItem->m_Keyframes[0] == inKeyframe; - } - return false; -} - -void CSimpleAnimationCore::OffsetAnimations(Qt3DSDMSlideHandle /*inSlide*/, - Qt3DSDMInstanceHandle /*inInstance*/, long /*inOffset*/) -{ - throw std::runtime_error("unimplemented"); -} - -void CSimpleAnimationCore::SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited) -{ - if (m_Objects.find(inAnimation) == m_Objects.end()) { - Q_ASSERT(false); - return; - } - SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - if (theItem->m_ArtistEdited != inEdited) - theItem->m_ArtistEdited = inEdited; -} - -bool CSimpleAnimationCore::IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const -{ - if (m_Objects.find(inAnimation) == m_Objects.end()) { - return false; - } - const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - return theItem->m_ArtistEdited; -} - -inline bool KeyframeTimeLessThan(int inKeyframe, float inSeconds, const THandleObjectMap &inObjects) -{ - const SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, inObjects); - return KeyframeTime(theKeyframe->m_Keyframe) < inSeconds; -} - -inline bool KeyframeValueTimeLessThan(const TKeyframe &inLeft, const TKeyframe &inRight) -{ - return KeyframeTime(inLeft) < KeyframeTime(inRight); -} - -TKeyframe IntToKeyframe(int inKeyframe, const THandleObjectMap &inObjects) -{ - const SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, inObjects); - return theKeyframe->m_Keyframe; -} - -inline float KeyframeValue(int inKeyframe, const THandleObjectMap &inObjects) -{ - const SKeyframe *theKeyframe = CSimpleAnimationCore::GetKeyframeNF(inKeyframe, inObjects); - return KeyframeValueValue(theKeyframe->m_Keyframe); -} - -inline float EvaluateLinear(float inS1, float inS2, float inV1, float inV2, float inSeconds) -{ - float amount = (inSeconds - inS1) / (inS2 - inS1); - return inV1 + amount * (inV2 - inV1); -} - -inline float EvaluateLinearKeyframe(SLinearKeyframe &inK1, SLinearKeyframe &inK2, float inSeconds) -{ - return EvaluateLinear(inK1.m_KeyframeSeconds, inK2.m_KeyframeSeconds, inK1.m_KeyframeValue, - inK2.m_KeyframeValue, inSeconds); -} - -inline float DoBezierEvaluation(float inSeconds, const SBezierKeyframe &inK1, - const SBezierKeyframe &inK2) -{ - return Q3DStudio::EvaluateBezierKeyframe( - inSeconds, inK1.m_KeyframeSeconds, inK1.m_KeyframeValue, inK1.m_OutTangentTime, - inK1.m_OutTangentValue, inK2.m_InTangentTime, inK2.m_InTangentValue, inK2.m_KeyframeSeconds, - inK2.m_KeyframeValue); -} - -// Animation Evaluation. -float CSimpleAnimationCore::EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, - float inSeconds) const -{ - const SAnimationTrack *theItem = GetAnimationNF(inAnimation, m_Objects); - if (theItem->m_Keyframes.empty()) - return 0.0f; - CheckKeyframesSorted(theItem, m_Objects); - // Default to linear for now. - SLinearKeyframe theKeyframe = { 0 }; - theKeyframe.m_KeyframeSeconds = inSeconds; - TKeyframe theSearchKey(theKeyframe); - function<TKeyframe(int)> theIntToKeyframe( - std::bind(IntToKeyframe, std::placeholders::_1, std::ref(m_Objects))); - - TKeyframeHandleList::const_iterator theBound = - lower_bound(theItem->m_Keyframes.begin(), theItem->m_Keyframes.end(), theSearchKey, - [theIntToKeyframe](const Qt3DSDMKeyframeHandle &inLeft, - const TKeyframe &inRight) - {return KeyframeTime(theIntToKeyframe(inLeft)) < KeyframeTime(inRight);}); - - if (theBound == theItem->m_Keyframes.end()) - return KeyframeValue(theItem->m_Keyframes.back(), m_Objects); - if (theBound == theItem->m_Keyframes.begin()) - return KeyframeValue(*theItem->m_Keyframes.begin(), m_Objects); - - TKeyframeHandleList::const_iterator theStartIter = theBound; - --theStartIter; - - // Both iterators must be valid at this point... - Qt3DSDMKeyframeHandle theStart = *theStartIter; - Qt3DSDMKeyframeHandle theFinish = *theBound; - switch (theItem->m_AnimationType) { - default: - throw AnimationEvaluationError(L""); - case EAnimationTypeLinear: { - SLinearKeyframe k1 = get<SLinearKeyframe>(theIntToKeyframe(theStart)); - SLinearKeyframe k2 = get<SLinearKeyframe>(theIntToKeyframe(theFinish)); - return EvaluateLinearKeyframe(k1, k2, inSeconds); - } - case EAnimationTypeBezier: { - SBezierKeyframe k1 = get<SBezierKeyframe>(theIntToKeyframe(theStart)); - SBezierKeyframe k2 = get<SBezierKeyframe>(theIntToKeyframe(theFinish)); - return DoBezierEvaluation(inSeconds, k1, k2); - } - case EAnimationTypeEaseInOut: { - SEaseInEaseOutKeyframe k1 = get<SEaseInEaseOutKeyframe>(theIntToKeyframe(theStart)); - SEaseInEaseOutKeyframe k2 = get<SEaseInEaseOutKeyframe>(theIntToKeyframe(theFinish)); - return DoBezierEvaluation( - inSeconds, CreateBezierKeyframeFromEaseInEaseOutKeyframe(NULL, k1, &k2.m_KeyframeValue), - CreateBezierKeyframeFromEaseInEaseOutKeyframe(&k1.m_KeyframeValue, k2, NULL)); - } - } -} - -bool CSimpleAnimationCore::KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const -{ - return HandleObjectValid<SKeyframe>(inKeyframe, m_Objects); -} - -bool CSimpleAnimationCore::AnimationValid(Qt3DSDMAnimationHandle inAnimation) const -{ - return HandleObjectValid<SAnimationTrack>(inAnimation, m_Objects); -} - -Qt3DSDMAnimationHandle CSimpleAnimationCore::CreateAnimationWithHandle( - int inHandle, Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, EAnimationType inAnimationType, - bool inFirstKeyframeDynamic) -{ - if (HandleValid(inHandle)) - throw HandleExists(L""); - m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SAnimationTrack( - inHandle, inSlide, inInstance, inProperty, inIndex, - inAnimationType, inFirstKeyframeDynamic, true))); - return inHandle; -} - -void CSimpleAnimationCore::AddAnimationToLookupCache(Qt3DSDMAnimationHandle inAnimation) const -{ - THandleObjectMap::const_iterator theAnim = m_Objects.find(inAnimation); - if (theAnim != m_Objects.end()) - AddAnimationToLookupCache(static_pointer_cast<SAnimationTrack>(theAnim->second)); -} -void CSimpleAnimationCore::RemoveAnimationFromLookupCache(Qt3DSDMAnimationHandle inAnimation) const -{ - THandleObjectMap::const_iterator theAnim = m_Objects.find(inAnimation); - if (theAnim != m_Objects.end()) - RemoveAnimationFromLookupCache(static_pointer_cast<SAnimationTrack>(theAnim->second)); -} - -// Ensure there is only one of these in the multimap. -void CSimpleAnimationCore::AddAnimationToLookupCache( - std::shared_ptr<SAnimationTrack> inAnimation) const -{ - Qt3DSDMSlideHandle theSlide = inAnimation->m_Slide; - Qt3DSDMInstanceHandle theInstance = inAnimation->m_Instance; - pair<TStateInstanceAnimationMap::iterator, TStateInstanceAnimationMap::iterator> theRange = - m_AnimationMatchesCache.equal_range( - make_pair(theSlide.GetHandleValue(), theInstance.GetHandleValue())); - for (TStateInstanceAnimationMap::iterator theIter = theRange.first; theIter != theRange.second; - ++theIter) { - if (theIter->second == inAnimation) - return; - } - m_AnimationMatchesCache.insert( - make_pair(make_pair(theSlide.GetHandleValue(), theInstance.GetHandleValue()), inAnimation)); -} - -// Remove this from the multimap -void CSimpleAnimationCore::RemoveAnimationFromLookupCache( - std::shared_ptr<SAnimationTrack> inAnimation) const -{ - TStateInstanceAnimationMap &theMap(m_AnimationMatchesCache); - Qt3DSDMSlideHandle theSlide = inAnimation->m_Slide; - Qt3DSDMInstanceHandle theInstance = inAnimation->m_Instance; - pair<TStateInstanceAnimationMap::iterator, TStateInstanceAnimationMap::iterator> theRange = - theMap.equal_range(make_pair(theSlide.GetHandleValue(), theInstance.GetHandleValue())); - for (TStateInstanceAnimationMap::iterator theIter = theRange.first; theIter != theRange.second; - ++theIter) { - if (theIter->second == inAnimation) { - theMap.erase(theIter); - break; - } - } -} - -//================================================================================ -// UICDMAnimation.h function implementations -//================================================================================ - -void CopyKeyframe(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe, - const IAnimationCore &inSourceAnimationCore, IAnimationCore &inDestAnimationCore) -{ - TKeyframe theData = inSourceAnimationCore.GetKeyframeData(inKeyframe); - inDestAnimationCore.InsertKeyframe(inAnimation, theData); -} - -void CopyKeyframes(const IAnimationCore &inSourceAnimationCore, IAnimationCore &inDestAnimationCore, - Qt3DSDMAnimationHandle inDestAnimation, const TKeyframeHandleList &inKeyframes) -{ - do_all(inKeyframes, - std::bind(CopyKeyframe, inDestAnimation, std::placeholders::_1, - std::cref(inSourceAnimationCore), std::ref(inDestAnimationCore))); -} - -Qt3DSDMAnimationHandle CopyAnimation(TAnimationCorePtr inAnimationCore, - Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inNewSlide, - Qt3DSDMInstanceHandle inNewInstance, - Qt3DSDMPropertyHandle inNewProperty, size_t inNewIndex) -{ - TKeyframeHandleList theKeyframes; - inAnimationCore->GetKeyframes(inAnimation, theKeyframes); - SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); - Qt3DSDMAnimationHandle theAnimation = - inAnimationCore->CreateAnimation(inNewSlide, inNewInstance, inNewProperty, inNewIndex, - theInfo.m_AnimationType, theInfo.m_DynamicFirstKeyframe); - CopyKeyframes(*inAnimationCore, *inAnimationCore, theAnimation, theKeyframes); - return theAnimation; -} - -SBezierKeyframe GetBezierKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, - const IAnimationCore &inAnimationCore) -{ - return get<SBezierKeyframe>(inAnimationCore.GetKeyframeData(inKeyframe)); -} - -SEaseInEaseOutKeyframe GetEaseInEaseOutKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, - const IAnimationCore &inAnimationCore) -{ - return get<SEaseInEaseOutKeyframe>(inAnimationCore.GetKeyframeData(inKeyframe)); -} - -TKeyframeHandleList::iterator SafeIncrementIterator(TKeyframeHandleList::iterator inIter, - const TKeyframeHandleList::iterator &inEnd) -{ - return inIter == inEnd ? inEnd : inIter + 1; -} - -void GetKeyframesAsBezier(Qt3DSDMAnimationHandle inAnimation, const IAnimationCore &inAnimationCore, - TBezierKeyframeList &outKeyframes) -{ - SAnimationInfo theInfo(inAnimationCore.GetAnimationInfo(inAnimation)); - TKeyframeHandleList theKeyframes; - inAnimationCore.GetKeyframes(inAnimation, theKeyframes); - outKeyframes.resize(theKeyframes.size()); - switch (theInfo.m_AnimationType) { - default: - throw invalid_argument("AnimationType"); - case EAnimationTypeBezier: - transform(theKeyframes.begin(), theKeyframes.end(), outKeyframes.begin(), - std::bind(GetBezierKeyframeData, std::placeholders::_1, - std::cref(inAnimationCore))); - break; - case EAnimationTypeEaseInOut: { - - TKeyframeHandleList::iterator theEndKeyframe = theKeyframes.end(); - - typedef std::function<SEaseInEaseOutKeyframe(Qt3DSDMKeyframeHandle)> TConvertFunc; - TConvertFunc theDataConverter( - std::bind(GetEaseInEaseOutKeyframeData, std::placeholders::_1, - std::cref(inAnimationCore))); - - TKeyframeHandleList::iterator thePreviousKeyframe = theKeyframes.begin(); - - TKeyframeHandleList::iterator theCurrentKeyframe = - SafeIncrementIterator(thePreviousKeyframe, theEndKeyframe); - - TKeyframeHandleList::iterator theNextKeyframe = - SafeIncrementIterator(theCurrentKeyframe, theEndKeyframe); - - TBezierKeyframeList::iterator theResult(outKeyframes.begin()); - - if (thePreviousKeyframe != theEndKeyframe) { - float *theNextValuePtr = NULL; - float theNextValue; - if (theCurrentKeyframe != theEndKeyframe) { - theNextValue = theDataConverter(*theCurrentKeyframe).m_KeyframeValue; - theNextValuePtr = &theNextValue; - } - *theResult = CreateBezierKeyframeFromEaseInEaseOutKeyframe( - NULL, theDataConverter(*thePreviousKeyframe), theNextValuePtr); - theResult = theResult + 1; - } - for (; theCurrentKeyframe != theEndKeyframe; - ++thePreviousKeyframe, - theCurrentKeyframe = SafeIncrementIterator(theCurrentKeyframe, theEndKeyframe), - theNextKeyframe = SafeIncrementIterator(theNextKeyframe, theEndKeyframe), - ++theResult) { - float theLastValue(theDataConverter(*thePreviousKeyframe).m_KeyframeValue); - float *theNextValuePtr = NULL; - float theNextValue; - if (theNextKeyframe != theEndKeyframe) { - theNextValue = theDataConverter(*theNextKeyframe).m_KeyframeValue; - theNextValuePtr = &theNextValue; - } - *theResult = CreateBezierKeyframeFromEaseInEaseOutKeyframe( - &theLastValue, theDataConverter(*theCurrentKeyframe), theNextValuePtr); - } - } break; - } -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleAnimationCore.h b/src/Authoring/QT3DSDM/Systems/Cores/SimpleAnimationCore.h deleted file mode 100644 index cb4c4154..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleAnimationCore.h +++ /dev/null @@ -1,230 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef ANIMATIONCOREH -#define ANIMATIONCOREH -#include "Qt3DSDMAnimation.h" -#include "HandleSystemBase.h" -#include <unordered_map> - -namespace { -struct pair_hash { - template <class T1, class T2> - std::size_t operator () (const std::pair<T1, T2> &p) const { - auto h1 = std::hash<T1>{}(p.first); - auto h2 = std::hash<T2>{}(p.second); - - return h1 ^ h2; - } - }; -} - -namespace qt3dsdm { -struct SAnimationTrack : public CHandleObject -{ - int m_Slide; - int m_Instance; - int m_Property; - EAnimationType m_AnimationType; - size_t m_Index; - TKeyframeHandleList m_Keyframes; - bool m_KeyframesDirty; - bool m_FirstKeyframeDynamic; - bool m_ArtistEdited; - - SAnimationTrack() - : m_Slide(0) - , m_Instance(0) - , m_Property(0) - , m_AnimationType(EAnimationTypeLinear) - , m_Index(0) - , m_KeyframesDirty(false) - , m_FirstKeyframeDynamic(false) - , m_ArtistEdited(true) - { - } - - SAnimationTrack(int inHandle, Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, EAnimationType inAnimationType, - bool inFirstKeyframeDynamic, bool inArtistEdited) - : CHandleObject(inHandle) - , m_Slide(inSlide) - , m_Instance(inInstance) - , m_Property(inProperty) - , m_AnimationType(inAnimationType) - , m_Index(inIndex) - , m_KeyframesDirty(false) - , m_FirstKeyframeDynamic(inFirstKeyframeDynamic) - , m_ArtistEdited(inArtistEdited) - { - } - - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSAnimationTrack; - EHandleObjectType GetType() override { return s_Type; } -}; - -struct SKeyframe : public CHandleObject -{ - TKeyframe m_Keyframe; - int m_Animation; - - SKeyframe(int inHandle, int inAnimation, const TKeyframe &inKeyframe) - : CHandleObject(inHandle) - , m_Keyframe(inKeyframe) - , m_Animation(inAnimation) - { - } - - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSKeyframe; - EHandleObjectType GetType() override { return s_Type; } -}; - -class CAnimationCoreProducer; - -class CSimpleAnimationCore : public CHandleBase, public IAnimationCore -{ - TStringTablePtr m_StringTable; - typedef std::unordered_multimap<std::pair<int, int>, - std::shared_ptr<SAnimationTrack>, pair_hash> TStateInstanceAnimationMap; - // state,instance pair map to animation handle to speed up querying if a particular - // property is animated. - mutable TStateInstanceAnimationMap m_AnimationMatchesCache; - -public: // Use - friend class CAnimationCoreProducer; - // We don't use the string table ptr we are constructed with - // but the testing system needs an unified interface to creating - // objects - CSimpleAnimationCore() {} - CSimpleAnimationCore(TStringTablePtr strTable) - : m_StringTable(strTable) - { - } - TStringTablePtr GetStringTablePtr() const { return m_StringTable; } - - Qt3DSDMAnimationHandle CreateAnimation(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, - bool inFirstKeyframeDynamic) override; - void DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) override; - Qt3DSDMAnimationHandle GetAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex) const override; - SAnimationInfo GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const override; - void GetAnimations(TAnimationHandleList &outAnimations) const override; - void GetAnimations(TAnimationInfoList &outAnimations, Qt3DSDMSlideHandle inMaster, - Qt3DSDMSlideHandle inSlide) const override; - void GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - TAnimationHandleList &outAnimations) override; - - void SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) override; - - // keyframe manipulation - Qt3DSDMKeyframeHandle InsertKeyframe(Qt3DSDMAnimationHandle inAnimation, - const TKeyframe &inKeyframe) override; - void EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe) override; - void DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) override; - Qt3DSDMAnimationHandle GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override; - TKeyframe GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const override; - void SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override; - // Set the keyframe data, but don't set the artist edited flag. Used for undo/redo operations - // where the artist edited flag has handeled by a different transaction - void DoSetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData); - void GetKeyframes(Qt3DSDMAnimationHandle inAnimation, TKeyframeHandleList &outKeyframes) const override; - size_t GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const override; - bool IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const override; - // Only implemented in the producer for now. - void OffsetAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - long inOffset) override; - - void SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited = true) override; - bool IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const override; - - // Animation Evaluation. - float EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, float inSeconds) const override; - - bool KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const override; - bool AnimationValid(Qt3DSDMAnimationHandle inAnimation) const override; - - // Only implemented at the producer level, not at the simple core level. - void CopyAnimations(Qt3DSDMSlideHandle /*inSourceSlide*/, - Qt3DSDMInstanceHandle /*inSourceInstance*/, - Qt3DSDMSlideHandle /*inDestSlide*/, Qt3DSDMInstanceHandle /*inDestInstance*/) override - { - throw AnimationNotFound(L""); - } - - // Lookup cache management so we can find particular animations quickly. - void ClearAnimationMatchesLookupCache() const { m_AnimationMatchesCache.clear(); } - void AddAnimationToLookupCache(Qt3DSDMAnimationHandle inAnimation) const; - void RemoveAnimationFromLookupCache(Qt3DSDMAnimationHandle inAnimation) const; - void AddAnimationToLookupCache(std::shared_ptr<SAnimationTrack> inAnimation) const; - void RemoveAnimationFromLookupCache(std::shared_ptr<SAnimationTrack> inAnimation) const; - - void EnsureAnimationCache() const; - - Qt3DSDMAnimationHandle CreateAnimationWithHandle(int inHandle, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, - bool inFirstKeyframeDynamic); - - static SAnimationTrack *GetAnimationNF(int inHandle, THandleObjectMap &inObjects) - { - return const_cast<SAnimationTrack *>( - GetAnimationNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const SAnimationTrack *GetAnimationNF(int inHandle, const THandleObjectMap &inObjects) - { - const SAnimationTrack *theAnimation = GetHandleObject<SAnimationTrack>(inHandle, inObjects); - if (theAnimation) - return theAnimation; - throw AnimationNotFound(L""); - } - - static SKeyframe *GetKeyframeNF(int inHandle, THandleObjectMap &inObjects) - { - return const_cast<SKeyframe *>( - GetKeyframeNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const SKeyframe *GetKeyframeNF(int inHandle, const THandleObjectMap &inObjects) - { - const SKeyframe *theItem = GetHandleObject<SKeyframe>(inHandle, inObjects); - if (theItem) - return theItem; - throw AnimationKeyframeNotFound(L""); - } -}; - -typedef std::shared_ptr<CSimpleAnimationCore> TSimpleAnimationCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleDataCore.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SimpleDataCore.cpp deleted file mode 100644 index d6a1470b..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleDataCore.cpp +++ /dev/null @@ -1,574 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "SimpleDataCore.h" - -namespace qt3dsdm { -Qt3DSDMDebugLogFunction g_DataModelDebugLogger = NULL; -// Instances -Qt3DSDMInstanceHandle CSimpleDataCore::CreateInstance(Qt3DSDMInstanceHandle hdl) -{ - int nextId = hdl; - if (hdl.Valid() == false) - nextId = GetNextId(); - - return CreateInstanceWithHandle(nextId); -} - -inline void RemoveParentFromClass(int inParent, int inChild, THandleObjectMap &inMap) -{ - TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inChild, inMap); - theInstance->m_Parents.erase(theInstance->m_Parents.find(inParent)); - // Cascade the delete operation -} - -void CSimpleDataCore::DeleteInstance(Qt3DSDMInstanceHandle inHandle) -{ - // Ensure it exists in the first place. - CSimpleDataCore::GetInstanceNF(inHandle, m_Objects); // Check for instance existance - CSimpleDataCore::EraseHandle(inHandle, m_Objects); - TIntList properties; - TIntList instances; - do_all(m_Objects, std::bind(FindRelatedItemsForDelete, inHandle.GetHandleValue(), - std::ref(properties), std::ref(instances), std::placeholders::_1)); - do_all(instances, std::bind(RemoveParentFromClass, inHandle.GetHandleValue(), - std::placeholders::_1, std::ref(m_Objects))); - do_all(properties, std::bind(EraseHandle, std::placeholders::_1, std::ref(m_Objects))); -} - -void CSimpleDataCore::GetInstances(TInstanceHandleList &outInstances) const -{ - // reserve the vector to m_Objects.size() to prevent vector reallocation - // m_Objects.size() is the upper bound of the no of instances - // the exact no of instances = m_Objects.size() - the no of properties as added by - // CClientDataModelBridge::InitializeDataCore (as of now, we have 31 properties) - outInstances.reserve(m_Objects.size()); - do_all(m_Objects, std::bind(MaybeAddObject<CDataModelInstance, Qt3DSDMInstanceHandle>, - std::placeholders::_1, std::ref(outInstances))); -} - -// Get instances that are derived from a specific parent -void CSimpleDataCore::GetInstancesDerivedFrom(TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParentHandle) const -{ - do_all(m_Objects, std::bind(&CSimpleDataCore::AddInstanceIfDerivedFrom, this, - std::placeholders::_1, - std::ref(outInstances), inParentHandle)); -} - -// add instance that is derived from a specific parent -void CSimpleDataCore::AddInstanceIfDerivedFrom(const std::pair<int, THandleObjectPtr> &inItem, - TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParentHandle) const -{ - if (inItem.second->GetType() == CHandleObject::EHandleObjectTypeCDataModelInstance) { - TDataModelInstancePtr theInstance = static_pointer_cast<CDataModelInstance>(inItem.second); - if (IsInstanceOrDerivedFromHelper(theInstance, inParentHandle)) - outInstances.push_back(inItem.first); - } -} - -// Derivation -void CSimpleDataCore::DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) -{ - if (g_DataModelDebugLogger) - g_DataModelDebugLogger("CSimpleDataCore::DeriveInstance Enter"); - TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inInstance, m_Objects); - if (theInstance->m_Parents.find(inParent) == theInstance->m_Parents.end()) { - std::shared_ptr<CDataModelInstance> theParent(GetInstanceNF(inParent, m_Objects)); - theInstance->m_Parents.insert(make_pair(inParent, theParent)); - } - if (g_DataModelDebugLogger) - g_DataModelDebugLogger("CSimpleDataCore::DeriveInstance Leave"); -} - -void CSimpleDataCore::GetInstanceParents(Qt3DSDMInstanceHandle inHandle, - TInstanceHandleList &outParents) const -{ - const TDataModelInstancePtr theInstance = GetInstanceNF(inHandle, m_Objects); - for (CDataModelInstance::TInstancePairList::const_iterator theParent = - theInstance->m_Parents.begin(); - theParent != theInstance->m_Parents.end(); ++theParent) - outParents.push_back(theParent->first); -} - -inline bool ComparePropertyNames(const TCharStr &inName, int inPropHandle, - const THandleObjectMap &inObjects) -{ - if (CSimpleDataCore::GetPropertyDefinitionNF(inPropHandle, inObjects)->m_Definition.m_Name - == inName) - return true; - return false; -} - -inline const wchar_t *SafeStrPtr(const wchar_t *inData) -{ - return inData == NULL ? L"" : inData; -} - -// Properties -Qt3DSDMPropertyHandle CSimpleDataCore::AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName, - DataModelDataType::Value inPropType) -{ - QT3DSDM_LOG_FUNCTION("CSimpleDataCore::AddProperty"); - QT3DSDM_DEBUG_LOG(m_StringTable->GetNarrowStr(inName)); - TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - TCharStr theName(inName); - if (find_if<TIntList::iterator>( - theInstance->m_Properties, - std::bind(ComparePropertyNames, std::ref(theName), - std::placeholders::_1, std::ref(m_Objects))) - != theInstance->m_Properties.end()) { - QT3DSDM_DEBUG_LOG("Property Exists!!"); - throw PropertyExists(L""); - } - - int nextId = GetNextId(); - return AddPropertyWithHandle(nextId, inInstance, inName, inPropType); -} - -void CSimpleDataCore::GetInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const -{ - transformv_all(GetInstanceNF(inInstance, m_Objects)->m_Properties, outProperties); -} - -const Qt3DSDMPropertyDefinition &CSimpleDataCore::GetProperty(Qt3DSDMPropertyHandle inProperty) const -{ - const CDataModelPropertyDefinitionObject *theProp = - GetPropertyDefinitionNF(inProperty, m_Objects); - return theProp->m_Definition; -} - -void CSimpleDataCore::RemoveProperty(Qt3DSDMPropertyHandle inProperty) -{ - CDataModelPropertyDefinitionObject *theProp = - CSimpleDataCore::GetPropertyDefinitionNF(inProperty, m_Objects); - TDataModelInstancePtr theInstance = - CSimpleDataCore::GetInstanceNF(theProp->m_Definition.m_Instance, m_Objects); - erase_if(theInstance->m_Properties, - std::bind(equal_to<int>(), inProperty.GetHandleValue(), std::placeholders::_1)); - CSimpleDataCore::EraseHandle(inProperty, m_Objects); -} - -inline bool PropertyMatches(int inProperty, Qt3DSDMPropertyHandle inTarget) -{ - return inProperty == inTarget.GetHandleValue(); -} - -inline bool GetInstanceValue(Qt3DSDMInstanceHandle inInstanceHandle, - Qt3DSDMPropertyHandle inPropertyHandle, CSimpleDataCore &inDataCore, - SValue &outValue) -{ - const TDataModelInstancePtr theInstance = - CSimpleDataCore::GetInstanceNF(inInstanceHandle, inDataCore.m_Objects); - - TPropertyPairHash::const_iterator theInstanceProp = - theInstance->m_PropertyValues.find(inPropertyHandle.GetHandleValue()); - if (theInstanceProp != theInstance->m_PropertyValues.end()) { - outValue = theInstanceProp->second.second.GetValue(); - return true; - } - return false; -} - -inline void CopyInstanceProperty(Qt3DSDMPropertyHandle inSrcPropertyHandle, - Qt3DSDMInstanceHandle inSrcInstanceHandle, - Qt3DSDMInstanceHandle inInstanceHandle, CSimpleDataCore &inDataCore) -{ - // create the property definition that matches the source - const Qt3DSDMPropertyDefinition &theProperty = inDataCore.GetProperty(inSrcPropertyHandle); - Qt3DSDMPropertyHandle theNewProperty = - inDataCore.AddProperty(inInstanceHandle, theProperty.m_Name.wide_str(), theProperty.m_Type); - // copy the value if one exists on the src. - SValue theValue; - if (GetInstanceValue(inSrcInstanceHandle, inSrcPropertyHandle, inDataCore, theValue)) - inDataCore.SetInstancePropertyValue(inInstanceHandle, theNewProperty, theValue); -} - -// logic : if destination property is one gained through derivation in inSrcInstanceHandle, copy the -// value over. -inline void CopyAggregatedPropertyValues(Qt3DSDMPropertyHandle inDestPropertyHandle, - Qt3DSDMInstanceHandle inSrcInstanceHandle, - Qt3DSDMInstanceHandle inInstanceHandle, - const TPropertyHandleList &inSrcNonAggregateList, - CSimpleDataCore &inDataCore) -{ - if (find_if(inSrcNonAggregateList.begin(), inSrcNonAggregateList.end(), - bind(PropertyMatches, inDestPropertyHandle, std::placeholders::_1)) - == inSrcNonAggregateList.end() - && inDataCore.HasAggregateInstanceProperty(inSrcInstanceHandle, inDestPropertyHandle)) { - SValue theValue; - if (GetInstanceValue(inSrcInstanceHandle, inDestPropertyHandle, inDataCore, theValue)) - inDataCore.SetInstancePropertyValue(inInstanceHandle, inDestPropertyHandle, theValue); - } -} - -void CSimpleDataCore::CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance, - Qt3DSDMInstanceHandle inDestInstance) -{ - TPropertyHandleList theList; - GetInstanceProperties(inSrcInstance, theList); - do_all(theList, bind(CopyInstanceProperty, std::placeholders::_1, - inSrcInstance, inDestInstance, ref(*this))); - - TPropertyHandleList theDestList; - GetAggregateInstanceProperties(inDestInstance, theDestList); - do_all(theDestList, std::bind(CopyAggregatedPropertyValues, std::placeholders::_1, - inSrcInstance, inDestInstance, - theList, std::ref(*this))); -} - -void CSimpleDataCore::RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) -{ - const TDataModelInstancePtr theInstance = CSimpleDataCore::GetInstanceNF(inInstance, m_Objects); - theInstance->RemoveCachedValues(); -} - -void GetAggregateProperties(const TDataModelInstancePtr inInstance, TIntList &inVisited, - TPropertyHandleList &outProperties) -{ - if (find(inVisited.begin(), inVisited.end(), inInstance->m_Handle) == inVisited.end()) { - inVisited.push_back(inInstance->m_Handle); - size_t theSize = outProperties.size(); - outProperties.resize(theSize + inInstance->m_Properties.size()); - transform(inInstance->m_Properties.begin(), inInstance->m_Properties.end(), - outProperties.begin() + theSize, identity<int>); - for (CDataModelInstance::TInstancePairList::const_iterator theParent = - inInstance->m_Parents.begin(); - theParent != inInstance->m_Parents.end(); ++theParent) - GetAggregateProperties(theParent->second, inVisited, outProperties); - } -} - -template <typename TPredicate> -inline std::tuple<bool, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle> -RecurseFindProperty(const TDataModelInstancePtr inInstance, TPredicate inPredicate) -{ - TIntList::const_iterator theFind = eastl::find_if(inInstance->m_Properties.begin(), - inInstance->m_Properties.end(), inPredicate); - if (theFind != inInstance->m_Properties.end()) - return make_tuple(true, inInstance->m_Handle, *theFind); - - for (CDataModelInstance::TInstancePairList::const_iterator theParent = - inInstance->m_Parents.begin(); - theParent != inInstance->m_Parents.end(); ++theParent) { - std::tuple<bool, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle> theValue = - RecurseFindProperty(theParent->second, inPredicate); - if (get<0>(theValue)) - return theValue; - } - return make_tuple(false, 0, 0); -} - -inline bool PropertyNameMatches(int inProperty, const THandleObjectMap &inObjects, - const TCharStr &inStr) -{ - const CDataModelPropertyDefinitionObject *theProp = - CSimpleDataCore::GetPropertyDefinitionNF(inProperty, inObjects); - return (theProp->m_Definition.m_Name == inStr); -} - -Qt3DSDMPropertyHandle -CSimpleDataCore::GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const -{ - const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - return get<2>( - RecurseFindProperty(theInstance, std::bind(PropertyNameMatches, - std::placeholders::_1, std::ref(m_Objects), - std::ref(inStr)))); -} - -// A simplified RecurseFindProperty function -bool RecurseFindPropertyMatches(const TDataModelInstancePtr inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - TIntList::const_iterator theFind = - find(inInstance->m_Properties.begin(), inInstance->m_Properties.end(), - inProperty.GetHandleValue()); - if (theFind != inInstance->m_Properties.end()) - return true; - - for (CDataModelInstance::TInstancePairList::const_iterator theParent = - inInstance->m_Parents.begin(); - theParent != inInstance->m_Parents.end(); ++theParent) { - if (RecurseFindPropertyMatches(theParent->second, inProperty)) - return true; - } - return false; -} - -bool CSimpleDataCore::HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - if (theInstance->m_PropertyValues.find(inProperty.GetHandleValue()) - != theInstance->m_PropertyValues.end()) - return true; - - return RecurseFindPropertyMatches(theInstance, inProperty); -} - -void CSimpleDataCore::GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const -{ - TIntList inVisited; - const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - GetAggregateProperties(theInstance, inVisited, outProperties); -} - -void CSimpleDataCore::CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) const -{ - CheckPropertyExistence(GetInstanceNF(inInstance, m_Objects), inProperty, m_Objects); - const CDataModelPropertyDefinitionObject *theDefinition = - CSimpleDataCore::GetPropertyDefinitionNF(inProperty, m_Objects); - CheckValueType(theDefinition->m_Definition.m_Type, inValue); -} - -bool CSimpleDataCore::GetInstancePropertyValueHelper(const TDataModelInstancePtr inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - TPropertyPairHash::const_iterator theInstanceProp = - inInstance->m_PropertyValues.find(inProperty); - if (theInstanceProp != inInstance->m_PropertyValues.end()) { - outValue = theInstanceProp->second.second.GetValue(); - return true; - } else { - // Is the property valid? - const CDataModelPropertyDefinitionObject *theProp = - GetPropertyDefinitionNF(inProperty, m_Objects); - int thePropInstance = theProp->m_Definition.m_Instance; - if (thePropInstance != inInstance->m_Handle) { - for (CDataModelInstance::TInstancePairList::const_iterator theParent = - inInstance->m_Parents.begin(); - theParent != inInstance->m_Parents.end(); ++theParent) { - if (IsInstanceOrDerivedFromHelper(theParent->second, thePropInstance) - && GetInstancePropertyValueHelper(theParent->second, inProperty, outValue)) { - // Quietly propagate to this instance so next time we won't go through this - // large property lookup chain. - inInstance->m_PropertyValues.insert(std::make_pair( - inProperty, - TPropertyValuePair( - PropertyValueFlags(PropertyValueFlags::SetViaAutoPropagate), - SInternValue::ISwearThisHasAlreadyBeenInternalized(outValue)))); - return true; - } - } - } - } - return false; -} - -bool CSimpleDataCore::GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - if (IsInstance(inHandle) == false || IsProperty(inProperty) == false) { - Q_ASSERT(0); - return false; - } - const TDataModelInstancePtr theInstance = GetInstanceNF(inHandle, m_Objects); - return GetInstancePropertyValueHelper(theInstance, inProperty, outValue); -} - -void CSimpleDataCore::SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - if (IsInstance(inHandle) == false || IsProperty(inProperty) == false) { - Q_ASSERT(0); - return; - } - CheckValue(inHandle, inProperty, inValue); - UncheckedSetSpecificInstancePropertyValue(inHandle, inProperty, inValue, PropertyValueFlags()); -} - -void CSimpleDataCore::GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle, - TPropertyHandleValuePairList &outValues) -{ - if (IsInstance(inHandle) == false) - return; - - TDataModelInstancePtr theInstance = GetInstanceNF(inHandle, m_Objects); - for (TPropertyPairHash::const_iterator theIter = theInstance->m_PropertyValues.begin(), - theEnd = theInstance->m_PropertyValues.end(); - theIter != theEnd; ++theIter) { - const pair<int, TPropertyValuePair> &thePair(*theIter); - if (thePair.second.first.IsSetViaAutoPropagation() == false) { - Qt3DSDMPropertyHandle thePropertyHandle(thePair.first); - SValue theValue(thePair.second.second.GetValue()); - outValues.push_back(make_pair(thePair.first, theValue)); - } - } -} - -bool CSimpleDataCore::IsInstance(int inHandle) const -{ - return HandleObjectValid<CDataModelInstance>(inHandle, m_Objects); -} -bool CSimpleDataCore::IsProperty(int inHandle) const -{ - return HandleObjectValid<CDataModelPropertyDefinitionObject>(inHandle, m_Objects); -} - -Qt3DSDMInstanceHandle CSimpleDataCore::CreateInstanceWithHandle(int inHandle) -{ - if (g_DataModelDebugLogger) - g_DataModelDebugLogger("CSimpleDataCore::CreateInstance Enter"); - if (HandleValid(inHandle)) { - if (g_DataModelDebugLogger) { - g_DataModelDebugLogger("CSimpleDataCore::CreateInstance Handle Exists!!"); - char buf[32]; - sprintf(buf, "%d", inHandle); - g_DataModelDebugLogger(buf); - } - throw HandleExists(L""); - } - - THandleObjectPtr theHandleObjectPtr(new CDataModelInstance(inHandle)); - const pair<int, THandleObjectPtr> thePair(std::make_pair(inHandle, theHandleObjectPtr)); - m_Objects.insert(thePair); - - if (g_DataModelDebugLogger) - g_DataModelDebugLogger("CSimpleDataCore::CreateInstance Leave"); - - return inHandle; -} - -Qt3DSDMPropertyHandle CSimpleDataCore::AddPropertyWithHandle(int inHandle, - Qt3DSDMInstanceHandle inInstance, - TCharPtr inName, - DataModelDataType::Value inPropType) -{ - QT3DSDM_DEBUG_LOG("CSimpleDataCore::AddPropertyWithHandle Enter"); - QT3DSDM_DEBUG_LOG(m_StringTable->GetNarrowStr(inName)); - if (HandleValid(inHandle)) { - if (g_DataModelDebugLogger) { - g_DataModelDebugLogger("CSimpleDataCore::AddPropertyWithHandle Handle Exists!!"); - char buf[32]; - sprintf(buf, "%d", inHandle); - g_DataModelDebugLogger(buf); - } - - throw HandleExists(L""); - } - - TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - - Qt3DSDMPropertyDefinition theDefinition(inInstance, SafeStrPtr(inName), inPropType); - THandleObjectPtr theHandleObjectPtr( - new CDataModelPropertyDefinitionObject(inHandle, theDefinition)); - const pair<int, THandleObjectPtr> thePair(std::make_pair(inHandle, theHandleObjectPtr)); - m_Objects.insert(thePair); - theInstance->m_Properties.push_back(inHandle); - QT3DSDM_DEBUG_LOG("CSimpleDataCore::AddPropertyWithHandle Leave"); - return inHandle; -} - -bool CSimpleDataCore::GetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - TPropertyPairHash::const_iterator theInstanceProp = - theInstance->m_PropertyValues.find(inProperty); - if (theInstanceProp != theInstance->m_PropertyValues.end()) { - outValue = theInstanceProp->second.second.GetValue(); - return true; - } - return false; -} - -void CSimpleDataCore::GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inInstance, - TPropertyPairHash &outValues) const -{ - const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - outValues = theInstance->m_PropertyValues; -} - -void CSimpleDataCore::UncheckedSetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue, - PropertyValueFlags inIsUserSet) -{ - TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - TPropertyValuePair theValuePair(inIsUserSet, SInternValue(inValue, GetStringTable())); - - std::pair<TPropertyPairHash::iterator, bool> theInsert = theInstance->m_PropertyValues.insert( - std::make_pair(inProperty.GetHandleValue(), theValuePair)); - if (theInsert.second == false) - theInsert.first->second = theValuePair; -} - -bool CSimpleDataCore::CheckParentPropertyExistenceWithFail(const TDataModelInstancePtr inInstance, - int inProperty, - const THandleObjectMap &inObjects) -{ - if (find(inInstance->m_Properties.begin(), inInstance->m_Properties.end(), inProperty) - != inInstance->m_Properties.end()) - return true; - for (CDataModelInstance::TInstancePairList::const_iterator theParent = - inInstance->m_Parents.begin(); - theParent != inInstance->m_Parents.end(); ++theParent) { - if (CheckParentPropertyExistenceWithFail(theParent->second, inProperty, inObjects)) - return true; - } - return false; -} - -// safety check to see if property exists -void CSimpleDataCore::CheckPropertyExistence(const TDataModelInstancePtr inInstance, int inProperty, - const THandleObjectMap &inObjects) -{ - if (!CheckParentPropertyExistenceWithFail(inInstance, inProperty, inObjects)) - throw PropertyNotFound(L""); -} - -bool CSimpleDataCore::IsInstanceOrDerivedFromHelper(const TDataModelInstancePtr inInstance, - Qt3DSDMInstanceHandle inParent) const -{ - if (inInstance->m_Handle == inParent) // Am I this object? - return true; - return inInstance->IsDerivedFrom(inParent); -} - -bool CSimpleDataCore::IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const -{ - if (IsInstance(inInstance) == false || IsInstance(inParent) == false) - return false; - if (inInstance == inParent) // Am I this object? - return true; - const TDataModelInstancePtr theInstance = GetInstanceNF(inInstance, m_Objects); - return IsInstanceOrDerivedFromHelper(theInstance, inParent); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleDataCore.h b/src/Authoring/QT3DSDM/Systems/Cores/SimpleDataCore.h deleted file mode 100644 index 2664dab4..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleDataCore.h +++ /dev/null @@ -1,373 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef DATACOREH -#define DATACOREH - -#include "Qt3DSDMDataTypes.h" -#include "Qt3DSDMSignals.h" -#include "HandleSystemBase.h" -#include "Qt3DSDMPropertyDefinition.h" -#include "Qt3DSDMDataCore.h" -#include "Qt3DSDMStringTable.h" -#include <unordered_set> -#include "Qt3DSDMValue.h" - -namespace qt3dsdm { - -struct PropertyValueFlags -{ - enum Enum { - // Property values that are set via event propagation should - // not be serialized to a file. The auto-propagation step - // is meant to make looking up property values quicker because - // the the derivation chain doesn't need to be followed to get - // the latest default value. - SetViaAutoPropagate = 1, - }; - - int m_Flags; - - PropertyValueFlags() - : m_Flags(0) - { - } - explicit PropertyValueFlags(int inFlags) - : m_Flags(inFlags) - { - } - - bool IsSetViaAutoPropagation() const { return (m_Flags & SetViaAutoPropagate) > 0; } -}; - -// Pair of property value flags and property value. The property value flags allow -// us to track metadata that is -typedef std::pair<PropertyValueFlags, SInternValue> TPropertyValuePair; -typedef std::unordered_map<int, TPropertyValuePair> TPropertyPairHash; -// Property pairs are referred to by property handle. -typedef std::pair<int, TPropertyValuePair> TPropertyPair; -typedef std::vector<TPropertyPair> TPropertyPairList; - -class CDataModelPropertyDefinitionObject : public CHandleObject -{ -public: - Qt3DSDMPropertyDefinition m_Definition; - - CDataModelPropertyDefinitionObject(int inHandle, const Qt3DSDMPropertyDefinition &inDefinition) - : CHandleObject(inHandle) - , m_Definition(inDefinition) - { - } - CDataModelPropertyDefinitionObject() {} - - static const EHandleObjectType s_Type = - CHandleObject::EHandleObjectTypeCDataModelPropertyDefinitionObject; - EHandleObjectType GetType() override { return s_Type; } -}; - -typedef std::unordered_map<int, SInternValue> TIntStringVariantList; - -class CDataModelInstance : public CHandleObject -{ -public: - typedef std::pair<int, std::shared_ptr<CDataModelInstance>> TInstancePair; - typedef std::unordered_map<int, std::shared_ptr<CDataModelInstance>> TInstancePairList; - typedef std::unordered_map<int, bool> TInstanceParentMap; - - TInstancePairList m_Parents; - mutable TInstanceParentMap m_CachedParents; - // Properties specific to this class - TIntList m_Properties; - TPropertyPairHash m_PropertyValues; - - CDataModelInstance() {} - CDataModelInstance(int inHandle) - : CHandleObject(inHandle) - { - } - - void ToPropertyPairList(TPropertyPairList &outList) const - { - for (TPropertyPairHash::const_iterator iter = m_PropertyValues.begin(), - end = m_PropertyValues.end(); - iter != end; ++iter) - outList.push_back(*iter); - } - - void FromPropertyPairList(const TPropertyPairList &inList) - { - m_PropertyValues.clear(); - for (TPropertyPairList::const_iterator iter = inList.begin(), end = inList.end(); - iter != end; ++iter) - m_PropertyValues.insert(*iter); - } - - void ClearParentCache() const { m_CachedParents.clear(); } - - bool IsDerivedFrom(Qt3DSDMInstanceHandle inParent) const - { - std::pair<TInstanceParentMap::iterator, bool> theQueryResult = - m_CachedParents.insert(std::make_pair(inParent.GetHandleValue(), false)); - // If the insert failed, returned what the hashtable already had in it - if (theQueryResult.second == false) - return theQueryResult.first->second; - - // Else find a valid answer - if (m_Parents.find(inParent.GetHandleValue()) != m_Parents.end()) { - theQueryResult.first->second = true; - } else { - for (TInstancePairList::const_iterator iter = m_Parents.begin(), end = m_Parents.end(); - iter != end; ++iter) { - if (iter->second->IsDerivedFrom(inParent)) { - theQueryResult.first->second = true; - break; - } - } - } - - // Note that we inserted false to begin with. This means that - // we can return the insert result here safely as if it wasn't - // supposed to be false, we would have set it above. - return theQueryResult.first->second; - } - - void RemoveCachedValues() - { - vector<int> theCachedProperties; - - for (TPropertyPairHash::iterator theProperty = m_PropertyValues.begin(), - end = m_PropertyValues.end(); - theProperty != end; ++theProperty) { - if (theProperty->second.first.IsSetViaAutoPropagation()) - theCachedProperties.push_back(theProperty->first); - } - - for (size_t idx = 0, end = theCachedProperties.size(); idx < end; ++idx) - m_PropertyValues.erase(theCachedProperties[idx]); - } - - // CHandleObject - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeCDataModelInstance; - EHandleObjectType GetType() override { return s_Type; } -}; - -typedef std::shared_ptr<CDataModelInstance> TDataModelInstancePtr; - -class CSimpleDataCore : public CHandleBase, public IDataCore -{ - mutable TStringTablePtr m_StringTable; - -public: - CSimpleDataCore(TStringTablePtr strTable) - : m_StringTable(strTable) - { - } - CSimpleDataCore(const CSimpleDataCore &inOther) - : CHandleBase(inOther) - , m_StringTable(inOther.m_StringTable) - { - } - - CSimpleDataCore &operator=(const CSimpleDataCore &inOther) - { - CHandleBase::operator=(inOther); - return *this; - } - - IStringTable &GetStringTable() const override { return *m_StringTable.get(); } - TStringTablePtr GetStringTablePtr() const override { return m_StringTable; } - - // IHandleBase - bool HandleValid(int inHandle) const override - { - return m_Objects.find(inHandle) != m_Objects.end(); - } - - // IInstancePropertyCore - Qt3DSDMPropertyHandle GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const override; - void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const override; - void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle, - TPropertyHandleValuePairList &outValues) override; - bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - void CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) const override; - bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - - // IDataCore - //=============================================================== - Qt3DSDMInstanceHandle CreateInstance(Qt3DSDMInstanceHandle hdl = Qt3DSDMInstanceHandle()) override; - void DeleteInstance(Qt3DSDMInstanceHandle inHandle) override; - void GetInstances(TInstanceHandleList &outInstances) const override; - void GetInstancesDerivedFrom(TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParentHandle) const override; - - void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) override; - void GetInstanceParents(Qt3DSDMInstanceHandle inHandle, - TInstanceHandleList &outParents) const override; - // Returns true if inParent == inInstance || inInstance is derived from inParent somehow. - // Recursive. - bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const override; - - Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inClass, TCharPtr inName, - DataModelDataType::Value inPropType) override; - const Qt3DSDMPropertyDefinition &GetProperty(Qt3DSDMPropertyHandle inProperty) const override; - void GetInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const override; - void RemoveProperty(Qt3DSDMPropertyHandle inProperty) override; - void CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance, - Qt3DSDMInstanceHandle inDestInstance) override; - void RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) override; - - bool IsInstance(int inHandle) const override; - bool IsProperty(int inHandle) const override; - //=============================================================== - - bool GetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const; - void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inInstance, - TPropertyPairHash &outValues) const; - - static CDataModelPropertyDefinitionObject *GetPropertyDefinitionNF(int inHandle, - THandleObjectMap &inObjects) - { - return const_cast<CDataModelPropertyDefinitionObject *>( - GetPropertyDefinitionNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const CDataModelPropertyDefinitionObject * - GetPropertyDefinitionNF(int inHandle, const THandleObjectMap &inObjects) - { - const CDataModelPropertyDefinitionObject *theClass = - GetHandleObject<CDataModelPropertyDefinitionObject>(inHandle, inObjects); - if (theClass) - return theClass; - throw PropertyNotFound(L""); - } - - static TDataModelInstancePtr GetInstance(int inHandle, const THandleObjectMap &inObjects) - { - THandleObjectMap::const_iterator theFind(inObjects.find(inHandle)); - // dynamic cast isn't allowed in runtime code as the runtime doesn't enable rtti. - if (theFind != inObjects.end()) - return std::static_pointer_cast<CDataModelInstance>(theFind->second); - return TDataModelInstancePtr(); - } - - static TDataModelInstancePtr GetInstanceNF(int inHandle, const THandleObjectMap &inObjects) - { - TDataModelInstancePtr retval = GetInstance(inHandle, inObjects); - if (retval) - return retval; - throw InstanceNotFound(L""); - } - - static inline bool InstancePairMatches(int inHandle, - const CDataModelInstance::TInstancePair &inInstancePair) - { - return inHandle == inInstancePair.first; - } - - // if inInstance doesn't exists in inObjects, it will push back NULL instead of throwing - // exception - static inline void UncheckAddInstancePair(CDataModelInstance::TInstancePairList &outInstances, - Qt3DSDMInstanceHandle inInstance, - THandleObjectMap &inObjects) - { - outInstances.insert( - std::make_pair(inInstance, CSimpleDataCore::GetInstance(inInstance, inObjects))); - } - - static inline bool InstancePropertyMatches(int inProp, const TPropertyPair &inPropPair) - { - return inProp == inPropPair.first; - } - - static bool CheckParentPropertyExistenceWithFail(const TDataModelInstancePtr inInstance, - int inProperty, - const THandleObjectMap &inObjects); - - static void CheckPropertyExistence(const TDataModelInstancePtr inInstance, int inProperty, - const THandleObjectMap &inObjects); - - static inline void FindRelatedItemsForDelete(int inInstance, TIntList &outProperties, - TIntList &outChildInstances, - const std::pair<int, THandleObjectPtr> &inPair) - { - - using namespace std; - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeCDataModelInstance) { - TDataModelInstancePtr theInstance = - static_pointer_cast<CDataModelInstance>(inPair.second); - // No longer a parent class. - if (find_if(theInstance->m_Parents.begin(), theInstance->m_Parents.end(), - std::bind(InstancePairMatches, inInstance, std::placeholders::_1)) - != theInstance->m_Parents.end()) - outChildInstances.push_back(inPair.first); - } else if (inPair.second->GetType() - == CHandleObject::EHandleObjectTypeCDataModelPropertyDefinitionObject) { - const CDataModelPropertyDefinitionObject *theProperty = - static_cast<const CDataModelPropertyDefinitionObject *>(inPair.second.get()); - if (theProperty->m_Definition.m_Instance.GetHandleValue() == inInstance) - outProperties.push_back(inPair.first); - } - } - -protected: - bool IsInstanceOrDerivedFromHelper(const TDataModelInstancePtr inInstance, - Qt3DSDMInstanceHandle inParent) const; - void AddInstanceIfDerivedFrom(const std::pair<int, THandleObjectPtr> &inItem, - TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParentHandle) const; - - bool GetInstancePropertyValueHelper(const TDataModelInstancePtr inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const; - - // Create an instance *at* this specific handle position - // This is used for special cases of serialization - Qt3DSDMInstanceHandle CreateInstanceWithHandle(int inHandle); - Qt3DSDMPropertyHandle AddPropertyWithHandle(int inHandle, Qt3DSDMInstanceHandle inClass, - TCharPtr inName, DataModelDataType::Value inPropType); - - void UncheckedSetSpecificInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue, - PropertyValueFlags inIsUserSet); -}; - -typedef std::shared_ptr<CSimpleDataCore> TSimpleDataCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideCore.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideCore.cpp deleted file mode 100644 index 87eadb9f..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideCore.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "SimpleSlideCore.h" - -using namespace std; -#ifdef _WIN32 -#pragma warning(disable : 4503) -#endif - -namespace qt3dsdm { - -Qt3DSDMSlideHandle CSimpleSlideCore::CreateSlide(Qt3DSDMInstanceHandle inInstance) -{ - int nextId = GetNextId(); - return CreateSlideWithHandle(nextId, inInstance); -} - -Qt3DSDMInstanceHandle CSimpleSlideCore::GetSlideInstance(Qt3DSDMSlideHandle inSlide) const -{ - return GetSlideNF(inSlide, m_Objects)->m_Instance; -} - -inline bool SlideInstanceMatches(const THandleObjectPair &inPair, int inInstance) -{ - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSSlide - && static_cast<const SSlide *>(inPair.second.get())->m_Instance == inInstance) - return true; - return false; -} - -Qt3DSDMSlideHandle CSimpleSlideCore::GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const -{ - THandleObjectMap::const_iterator theSlide = - find_if(m_Objects.begin(), m_Objects.end(), - std::bind(SlideInstanceMatches, - std::placeholders::_1, inInstance.GetHandleValue())); - if (theSlide != m_Objects.end()) - return theSlide->first; - throw SlideNotFound(L""); -} - -void RecurseDeleteSlide(Qt3DSDMSlideHandle inSlide, THandleObjectMap &inObjects, - TInstanceHandleList &outInstances) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, inObjects); - do_all(theSlide->m_Children, - std::bind(RecurseDeleteSlide, std::placeholders::_1, - std::ref(inObjects), std::ref(outInstances))); - outInstances.push_back(theSlide->m_Instance); - CHandleBase::EraseHandle(inSlide, inObjects); -} - -void CSimpleSlideCore::DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) -{ - SSlide *theSlide = GetSlideNF(inSlide, m_Objects); - if (theSlide->m_Parent) { - SSlide *theParent = GetSlideNF(theSlide->m_Parent, m_Objects); - erase_if(theParent->m_Children, std::bind(equal_to<int>(), theSlide->m_Handle, - std::placeholders::_1)); - } - RecurseDeleteSlide(inSlide, m_Objects, outInstances); -} - -template <typename TDataType, typename TVectorType> -inline void MaybeAddObject(const THandleObjectPair &inPair, vector<TVectorType> &outVectorItems) -{ - if (inPair.second->GetType() == TDataType::s_Type) - outVectorItems.push_back(inPair.first); -} - -void CSimpleSlideCore::GetSlides(TSlideHandleList &outSlides) const -{ - do_all(m_Objects, - std::bind(MaybeAddObject<SSlide, Qt3DSDMSlideHandle>, - std::placeholders::_1, std::ref(outSlides))); -} - -float CSimpleSlideCore::GetSlideTime(Qt3DSDMSlideHandle inSlide) const -{ - return GetSlideNF(inSlide, m_Objects)->m_Time; -} - -void CSimpleSlideCore::SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) -{ - GetSlideNF(inSlide, m_Objects)->m_Time = inNewTime; -} - -void CSimpleSlideCore::DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, - int inIndex) -{ - int oldParent = GetSlideNF(inSlide, m_Objects)->m_Parent; - if (oldParent) - erase_if(GetSlideNF(oldParent, m_Objects)->m_Children, - std::bind(equal_to<int>(), inSlide, std::placeholders::_1)); - if (inParent.Valid()) { - SSlide *theParent = GetSlideNF(inParent, m_Objects); - if (exists(theParent->m_Children, std::bind(equal_to<int>(), inSlide, - std::placeholders::_1))) - throw SlideDerivationError(L"Already derived"); - if (inIndex < 0 || inIndex >= (int)theParent->m_Children.size()) - inIndex = (int)theParent->m_Children.size(); - theParent->m_Children.insert(theParent->m_Children.begin() + inIndex, - inSlide.GetHandleValue()); - } - GetSlideNF(inSlide, m_Objects)->m_Parent = inParent; -} - -Qt3DSDMSlideHandle CSimpleSlideCore::GetParentSlide(Qt3DSDMSlideHandle inSlide) const -{ - return GetSlideNF(inSlide, m_Objects)->m_Parent; -} - -void CSimpleSlideCore::GetChildSlides(Qt3DSDMSlideHandle inSlide, - TSlideHandleList &outChildren) const -{ - transformv_all(GetSlideNF(inSlide, m_Objects)->m_Children, outChildren); -} - -int CSimpleSlideCore::GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const -{ - const SSlide *theSlide = GetSlideNF(inParent, m_Objects); - size_t dist = distance(theSlide->m_Children.begin(), - find_if<TIntList::const_iterator>( - theSlide->m_Children, std::bind(equal_to<int>(), inChild, - std::placeholders::_1))); - if (dist == theSlide->m_Children.size()) - throw SlideChildNotFoundError(L""); - return (int)dist; -} - -bool CSimpleSlideCore::GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - const SSlide *theSlide = GetSlideNF(inSlide, m_Objects); - SInternValue *theValue = theSlide->GetInstancePropertyValue(inHandle, inProperty); - if (theValue) { - outValue = theValue->GetValue(); - return true; - } - if (theSlide->m_Parent) - return GetInstancePropertyValue(theSlide->m_Parent, inHandle, inProperty, outValue); - return false; -} - -std::pair<SSlide *, SInternValue *> CSimpleSlideCore::ResolveSetInstancePropertyValue( - Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, Qt3DSDMPropertyHandle inProperty) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Objects); - SInternValue *theValue = theSlide->GetInstancePropertyValue(inHandle, inProperty); - // If we have the value already *or* or parent is not a valid slide, then return now - if (theValue || theSlide->m_Parent == 0) - return std::make_pair(theSlide, theValue); - // Else give our parent a chance. - return ResolveSetInstancePropertyValue(theSlide->m_Parent, inHandle, inProperty); -} - -void CSimpleSlideCore::SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - std::pair<SSlide *, SInternValue *> theTarget( - ResolveSetInstancePropertyValue(inSlide, inHandle, inProperty)); - SInternValue theValue(inValue, GetStringTable()); - if (theTarget.second) - *theTarget.second = theValue; - else - theTarget.first->SetInstancePropertyValue(inHandle, inProperty, theValue); -} - -void CSimpleSlideCore::ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - CSimpleSlideCore::ForceSetPropertyValue(GetStringTable(), m_Objects, inSlide, inHandle, - inProperty, inValue); -} - -void CSimpleSlideCore::forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - for (auto &it : m_Objects) { - if (it.second->GetType() == SSlide::s_Type) { - Qt3DSDMSlideHandle slide(it.first); - ForceSetInstancePropertyValue(slide, inInstance, inProperty, inValue); - } - } -} - -bool CSimpleSlideCore::GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - const SSlide *theSlide = GetSlideNF(inSlide, m_Objects); - SInternValue *theValue = theSlide->GetInstancePropertyValue(inInstance, inProperty); - if (theValue) { - outValue = theValue->GetValue(); - return true; - } - return false; -} - -void CSimpleSlideCore::GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TPropertyHandleValuePairList &outValues) -{ - const SSlide *theSlide = GetSlideNF(inSlide, m_Objects); - theSlide->GetSpecificInstancePropertyValues(inInstance, outValues); -} - -void CSimpleSlideCore::GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, - TSlideEntryList &outEntries) const -{ - const SSlide *theSlide = GetSlideNF(inSlide, m_Objects); - theSlide->ToSlideEntryList(outEntries); -} - -bool CSimpleSlideCore::ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) const -{ - const SSlide *theSlide = GetSlideNF(inSlide, m_Objects); - return theSlide->GetInstancePropertyValue(inHandle, inProperty) != NULL; -} - -Qt3DSDMSlideHandle CSimpleSlideCore::CreateSlideWithHandle(int inHandle, - Qt3DSDMInstanceHandle inInstance) -{ - if (HandleValid(inHandle)) - throw HandleExists(L""); - m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SSlide(inHandle, inInstance))); - return inHandle; -} - -void CSimpleSlideCore::GetSlideProperties(Qt3DSDMSlideHandle inSlide, - TSlideEntryList &outProperties) const -{ - outProperties.clear(); - GetSlidePropertyEntries(inSlide, outProperties); -} - -bool CSimpleSlideCore::IsSlide(Qt3DSDMSlideHandle inSlide) const -{ - return m_Objects.find(inSlide) != m_Objects.end(); -} - -void CSimpleSlideCore::ForceSetPropertyValue(IStringTable &inStringTable, - THandleObjectMap &inObjects, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) -{ - CSimpleSlideCore::GetSlideNF(inSlide, inObjects) - ->SetInstancePropertyValue(inHandle, inProperty, SInternValue(inValue, inStringTable)); -} - -void CSimpleSlideCore::PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - ForceSetPropertyValue(GetStringTable(), m_Objects, inParent, inHandle, inProperty, inValue); - do_all(CSimpleSlideCore::GetSlideNF(inParent, m_Objects)->m_Children, - std::bind(ForceSetPropertyValue, std::ref(GetStringTable()), std::ref(m_Objects), - std::placeholders::_1, inHandle, inProperty, inValue)); -} - -inline void AddIntersectingEntry(TSlideEntryList &outEntries, Qt3DSDMInstanceHandle inst, - Qt3DSDMPropertyHandle prop, const SInternValue &inValue) -{ - outEntries.push_back(TSlideEntry(inst, prop, inValue.GetValue())); -} - -void CSimpleSlideCore::GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, - Qt3DSDMSlideHandle inSlide2, - TSlideEntryList &outEntries) const -{ - const SSlide *theSlide1 = GetSlideNF(inSlide1, m_Objects); - const SSlide *theSlide2 = GetSlideNF(inSlide2, m_Objects); - theSlide1->IntersectProperties( - *theSlide2, std::bind(AddIntersectingEntry, std::ref(outEntries), - std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3)); -} - -void CSimpleSlideCore::PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, - Qt3DSDMSlideHandle inSlide2, - Qt3DSDMSlideHandle inDestination) -{ - const SSlide *theSlide1 = GetSlideNF(inSlide1, m_Objects); - const SSlide *theSlide2 = GetSlideNF(inSlide2, m_Objects); - SSlide *theDest = GetSlideNF(inDestination, m_Objects); - theSlide1->IntersectProperties( - *theSlide2, std::bind(&SSlide::SetInstancePropertyValue, theDest, - std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3)); -} - -void CSimpleSlideCore::ClearPropertyValue(THandleObjectMap &inObjects, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - CSimpleSlideCore::GetSlideNF(inSlide, inObjects) - ->RemoveInstancePropertyValue(inInstance, inProperty); -} - -inline void DoForEachSlide(std::pair<int, THandleObjectPtr> inObject, - std::function<void(SSlide *)> inFunction) -{ - inFunction((SSlide *)inObject.second.get()); -} - -void CSimpleSlideCore::ForEachSlide(std::function<void(SSlide *)> inFunction) -{ - do_all(m_Objects, std::bind(DoForEachSlide, std::placeholders::_1, inFunction)); -} - -void LookupSlideAndDoSomething(Qt3DSDMSlideHandle inSlide, THandleObjectMap &inObjects, - std::function<void(SSlide *)> inFunction) -{ - inFunction(CSimpleSlideCore::GetSlideNF(inSlide, inObjects)); -} - -void CSimpleSlideCore::ForEachChild(Qt3DSDMSlideHandle inParent, - std::function<void(SSlide *)> inFunction) -{ - do_all(GetSlideNF(inParent, m_Objects)->m_Children, - std::bind(LookupSlideAndDoSomething, std::placeholders::_1, m_Objects, inFunction)); -} - -bool InstanceMatches(Qt3DSDMInstanceHandle inTarget, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle) -{ - return inTarget == inHandle; -} - -bool PropertyMatches(Qt3DSDMPropertyHandle inTarget, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle inProp) -{ - return inTarget == inProp; -} - -bool InstancePropertyMatchesVector(const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties, - Qt3DSDMInstanceHandle slideInst, Qt3DSDMPropertyHandle slideProp) -{ - return std::find(inInstances.begin(), inInstances.end(), slideInst) != inInstances.end() - && std::find(inProperties.begin(), inProperties.end(), slideProp) != inProperties.end(); -} - -bool InstancePropertyMatches(const Qt3DSDMInstanceHandle inInstance, - const Qt3DSDMPropertyHandle inProperty, Qt3DSDMInstanceHandle slideInst, - Qt3DSDMPropertyHandle slideProp) -{ - return inInstance == slideInst && inProperty == slideProp; -} - -void CSimpleSlideCore::DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) -{ - std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate( - std::bind(InstanceMatches, inHandle, std::placeholders::_1, std::placeholders::_2)); - ForEachSlide(std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate)); -} - -void CSimpleSlideCore::DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) -{ - std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate( - std::bind(PropertyMatches, inHandle, std::placeholders::_1, std::placeholders::_2)); - ForEachSlide(std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate)); -} - -void CSimpleSlideCore::DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) -{ - std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate( - std::bind(InstancePropertyMatchesVector, inInstances, inProperties, - std::placeholders::_1, std::placeholders::_2)); - ForEachSlide(std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate)); -} - -void CSimpleSlideCore::ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) -{ - std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> predicate( - std::bind(InstancePropertyMatches, inHandle, inProperty, - std::placeholders::_1, std::placeholders::_2)); - ForEachChild(inParent, std::bind(&SSlide::ClearPropertiesIf, std::placeholders::_1, predicate)); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideCore.h b/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideCore.h deleted file mode 100644 index 278ef777..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideCore.h +++ /dev/null @@ -1,408 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef SLIDECOREH -#define SLIDECOREH -#include "HandleSystemBase.h" -#include "Qt3DSDMSlideCore.h" -#include "SimpleDataCore.h" -#include "Qt3DSDMStringTable.h" -#include <unordered_map> -#include <QtCore/qdebug.h> - -namespace std { - -template<> struct hash<std::pair<int,int> > -{ - typedef std::pair<int,int> argument_type; - typedef std::size_t result_type; - result_type operator()(std::pair<int,int> const& pa) const - { - result_type const h1 ( std::hash<int>{}(pa.first) ); - result_type const h2 ( std::hash<int>{}(pa.second) ); - return h1 ^ (h2 << 1); - } -}; - -} - -namespace qt3dsdm { - -// The first revision of this -typedef std::pair<int, int> TSlideInstancePropertyPair; -typedef std::unordered_map<TSlideInstancePropertyPair, SInternValue > TSlideEntryHash; - -using std::make_pair; - -// Abstract access to these objects a little bit because in the future we are going to -// reorganize the data such that getting a defined set of properties for a single instance is -// very fast. -struct SSlide : public CHandleObject -{ - SSlide() - : m_Instance(0) - , m_Parent(0) - { - } - SSlide(int inHandle, int inInstance) - : CHandleObject(inHandle) - , m_Instance(inInstance) - , m_Parent(0) - , m_Time(0) - { - } - int m_Instance; - int m_Parent; - TIntList m_Children; - TSlideEntryHash m_Properties; - float m_Time; - - // Returns true if it was inserted, false if the property value was set. - bool SetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - const SInternValue &inValue) - { - TSlideInstancePropertyPair theKey(inInstance.GetHandleValue(), inProperty.GetHandleValue()); - std::pair<TSlideEntryHash::iterator, bool> insertResult = - m_Properties.insert(std::make_pair(theKey, inValue)); - - if (insertResult.second == false) - insertResult.first->second = inValue; - return insertResult.second; - } - // Returns true if the property was deleted - bool RemoveInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) - { - TSlideInstancePropertyPair theKey(inInstance.GetHandleValue(), inProperty.GetHandleValue()); - TSlideEntryHash::iterator find(m_Properties.find(theKey)); - if (find != m_Properties.end()) { - m_Properties.erase(find); - return true; - } - return false; - } - // Return a pointer to out property value. This allows quicker checks for isset and such - SInternValue *GetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const - { - TSlideInstancePropertyPair theKey(inInstance.GetHandleValue(), inProperty.GetHandleValue()); - TSlideEntryHash::const_iterator find(m_Properties.find(theKey)); - if (find != m_Properties.end()) - return const_cast<SInternValue *>(&find->second); - return NULL; - } - - void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleValuePairList &outProperties) const - { - for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(), - theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) { - if (theIter->first.first == inInstance) - outProperties.push_back( - make_pair(theIter->first.second, theIter->second.GetValue())); - } - } - - bool HasProperty(std::function<bool(const TSlideEntry &)> inPredicate) const - { - for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(), - theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) { - if (inPredicate(TSlideEntry(theIter->first.first, theIter->first.second, - theIter->second.GetValue()))) - return true; - } - return false; - } - - void DeleteSlideEntries(TSlideEntryList &outList, - std::function<bool(const TSlideEntry &)> inPredicate) - { - for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(), - theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) { - if (inPredicate(TSlideEntry(theIter->first.first, theIter->first.second, - theIter->second.GetValue()))) { - outList.push_back(TSlideEntry(theIter->first.first, theIter->first.second, - theIter->second.GetValue())); - } - } - DeleteEntriesFromList(outList); - } - - void DeleteEntriesFromList(const TSlideEntryList &inList) - { - for (size_t idx = 0, end = inList.size(); idx < end; ++idx) - m_Properties.erase( - std::pair<int, int>(std::get<0>(inList[idx]), std::get<1>(inList[idx]))); - } - - void InsertSlideEntries(const TSlideEntryList &inList, IStringTable &inStringTable) - { - for (size_t idx = 0, end = inList.size(); idx < end; ++idx) { - TSlideInstancePropertyPair theKey(std::get<0>(inList[idx]), std::get<1>(inList[idx])); - - if (m_Properties.find(theKey) != m_Properties.end()) { - // The only known case when this condition happens is when DnD a sub-presentation to - // the scene as a texture rect then undoing. - qWarning() << __FUNCTION__ << ": Instance/Property Pair" << theKey - << "already exists, erasing it."; - m_Properties.erase(theKey); - } - - m_Properties.insert( - std::make_pair(theKey, SInternValue(std::get<2>(inList[idx]), inStringTable))); - } - } - - // Convert to the older, straight forward representation of the - // data in this slide. - void ToSlideEntryList(TSlideEntryList &outList) const - { - for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(), - theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) - outList.push_back(TSlideEntry(theIter->first.first, theIter->first.second, - theIter->second.GetValue())); - } - - void FromSlideEntryList(const TSlideEntryList &inList, IStringTable &inStringTable) - { - using namespace std; - m_Properties.clear(); - for (TSlideEntryList::const_iterator theIter = inList.begin(), theEnd = inList.end(); - theIter != theEnd; ++theIter) - SetInstancePropertyValue(get<0>(*theIter), get<1>(*theIter), - SInternValue(get<2>(*theIter), inStringTable)); - } - - // result is the instance, property, myvalue, othervalue - void IntersectProperties(const SSlide &inOther, - std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - SInternValue, SInternValue)> - inResult) const - { - for (TSlideEntryHash::const_iterator theIter = m_Properties.begin(), - theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) { - SInternValue *otherValue = - inOther.GetInstancePropertyValue(theIter->first.first, theIter->first.second); - if (otherValue) - inResult(theIter->first.first, theIter->first.second, theIter->second, *otherValue); - } - } - - // Call the predicate, if it returns true set the property for all properties. - // This allows a third party to manipulate the property values during the process. - void SetPropertyValuesIf( - IStringTable &inStringTable, - std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, SValue &)> inPredIntercept) - { - for (TSlideEntryHash::iterator theIter = m_Properties.begin(), theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) { - SValue theValue(theIter->second.GetValue()); - if (inPredIntercept(theIter->first.first, theIter->first.second, theValue)) - theIter->second = SInternValue(theValue, inStringTable); - } - } - - void - ClearPropertiesIf(std::function<bool(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> inPredicate) - { - bool foundOne; - do { - foundOne = false; - for (TSlideEntryHash::iterator theIter = m_Properties.begin(), - theEnd = m_Properties.end(); - theIter != theEnd; ++theIter) { - if (inPredicate(theIter->first.first, theIter->first.second)) { - foundOne = true; - m_Properties.erase(theIter->first); - break; - } - } - - } while (foundOne); - } - - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSSlide; - EHandleObjectType GetType() override { return s_Type; } -}; - -class CSimpleSlideCore : public CHandleBase, public ISlideCore -{ - TStringTablePtr m_StringTable; - -public: // use - CSimpleSlideCore(TStringTablePtr inStrTable) - : m_StringTable(inStrTable) - { - } - - TStringTablePtr GetStringTablePtr() const override { return m_StringTable; } - IStringTable &GetStringTable() const override { return *m_StringTable.get(); } - Qt3DSDMSlideHandle CreateSlide(Qt3DSDMInstanceHandle inInstance) override; - Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const override; - Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const override; - void DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) override; - void GetSlides(TSlideHandleList &outSlides) const override; - - float GetSlideTime(Qt3DSDMSlideHandle inSlide) const override; - void SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) override; - - void DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, int inIndex = -1) override; - Qt3DSDMSlideHandle GetParentSlide(Qt3DSDMSlideHandle inSlide) const override; - void GetChildSlides(Qt3DSDMSlideHandle inSlide, TSlideHandleList &outChildren) const override; - int GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const override; - - bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - void SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - - // Return the slide this property should be set on, along with the previous value if any. - // Set the value on the slide. - std::pair<SSlide *, SInternValue *> - ResolveSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty); - void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - void forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) override; - - bool GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - - void GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TPropertyHandleValuePairList &outValues) override; - - void GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, TSlideEntryList &outEntries) const override; - - void PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - - void GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - TSlideEntryList &outEntries) const override; - void PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - Qt3DSDMSlideHandle inDestination) override; - - void ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) override; - - void DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) override; - void DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) override; - void DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) override; - - bool ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) const override; - bool HandleValid(int inHandle) const override { return CHandleBase::HandleValid(inHandle); } - - Qt3DSDMSlideHandle CreateSlideWithHandle(int inHandle, Qt3DSDMInstanceHandle inInstance); - void GetSlideProperties(Qt3DSDMSlideHandle inSlide, TSlideEntryList &outProperties) const; - - bool IsSlide(Qt3DSDMSlideHandle inSlide) const override; - - // Possibly alter every slide in the database - void ForEachSlide(std::function<void(SSlide *)> inFunction); - void ForEachChild(Qt3DSDMSlideHandle inSlide, std::function<void(SSlide *)> inFunction); - - // Only implemented at the producer level, not at this lower level. - void CopyProperties(Qt3DSDMSlideHandle /*inSourceSlide*/, - Qt3DSDMInstanceHandle /*inSourceInstance*/, - Qt3DSDMSlideHandle /*inDestSlide*/, Qt3DSDMInstanceHandle /*inDestInstance*/) override - { - throw SlideNotFound(L""); - } - - static SSlide *GetSlideNF(int inHandle, THandleObjectMap &inObjects) - { - return const_cast<SSlide *>( - GetSlideNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const SSlide *GetSlideNF(int inHandle, const THandleObjectMap &inObjects) - { - const SSlide *theSlide = GetHandleObject<SSlide>(inHandle, inObjects); - if (theSlide) - return theSlide; - throw SlideNotFound(L""); - } - - static inline bool PropertyFound(int inInstance, int inProperty, const TSlideEntry &inEntry) - { - if (inInstance == std::get<0>(inEntry) && inProperty == std::get<1>(inEntry)) - return true; - return false; - } - - static void ForceSetPropertyValue(IStringTable &inStringTable, THandleObjectMap &inObjects, - Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue); - - static void ClearPropertyValue(THandleObjectMap &inObjects, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty); - - static inline bool SlideEntryInstanceMatches(const TSlideEntry &inEntry, - Qt3DSDMInstanceHandle inHandle) - { - using namespace std; - if (inHandle.GetHandleValue() == get<0>(inEntry)) - return true; - return false; - } - - static inline bool SlideEntryPropertyMatches(const TSlideEntry &inEntry, - Qt3DSDMPropertyHandle inProperty) - { - using namespace std; - return inProperty.GetHandleValue() == get<1>(inEntry); - } - - static inline bool SlideEntryInstancePropertyMatches(const TSlideEntry &inEntry, - const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) - { - using namespace std; - return exists(inInstances, std::bind(equal_to<int>(), get<0>(inEntry), - std::placeholders::_1)) - && exists(inProperties, std::bind(equal_to<int>(), get<1>(inEntry), - std::placeholders::_1)); - } -}; - -typedef std::shared_ptr<CSimpleSlideCore> TSimpleSlideCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideGraphCore.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideGraphCore.cpp deleted file mode 100644 index 5f1de1ea..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideGraphCore.cpp +++ /dev/null @@ -1,169 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "SimpleSlideGraphCore.h" - -using namespace std; - -namespace qt3dsdm { - -Qt3DSDMSlideGraphHandle CSimpleSlideGraphCore::CreateSlideGraph(Qt3DSDMSlideHandle inRoot) -{ - int nextId = GetNextId(); - return CreateSlideGraphWithHandle(nextId, inRoot); -} - -Qt3DSDMSlideHandle CSimpleSlideGraphCore::GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const -{ - return GetSlideGraphNF(inGraph, m_Objects)->m_Root; -} - -inline bool RootSlideMatches(const THandleObjectPair &inPair, Qt3DSDMSlideHandle inSlide) -{ - const SSlideGraph *theGraph = static_cast<SSlideGraph *>(inPair.second.get()); - if (theGraph->m_Root == inSlide) - return true; - return false; -} - -Qt3DSDMSlideGraphHandle CSimpleSlideGraphCore::GetSlideGraph(Qt3DSDMSlideHandle inSlide) const -{ - THandleObjectMap::const_iterator theFind = find_if<THandleObjectMap::const_iterator>( - m_Objects, std::bind(RootSlideMatches, std::placeholders::_1, inSlide)); - if (theFind != m_Objects.end()) - return theFind->first; - return 0; -} - -inline Qt3DSDMSlideGraphHandle ToGraphHandle(const THandleObjectPair &inPair) -{ - return inPair.first; -} - -void CSimpleSlideGraphCore::GetSlideGraphs(TSlideGraphHandleList &outGraphs) const -{ - outGraphs.resize(m_Objects.size()); - transform(m_Objects.begin(), m_Objects.end(), outGraphs.begin(), ToGraphHandle); -} - -void CSimpleSlideGraphCore::DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) -{ - TSlideInstancePairList theAssociatedInstances; - GetAssociatedInstances(inHandle, theAssociatedInstances); - for (size_t idx = 0, end = theAssociatedInstances.size(); idx < end; ++idx) - DissociateInstance(theAssociatedInstances[idx].second); - EraseHandle(inHandle, m_Objects); -} - -void CSimpleSlideGraphCore::AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) -{ - pair<TInstanceToGraphMap::iterator, bool> theResult = - m_InstanceToGraph.insert(make_pair(inInstance, make_pair(inSlideGraph, inSlide))); - Q_ASSERT(theResult.second); - if (theResult.second == false) { - theResult.first->second.first = inSlideGraph; - theResult.first->second.second = inSlide; - } - pair<TGraphToInstanceMap::iterator, bool> theGraphResult = - m_GraphToInstances.insert(make_pair(inSlideGraph, TSlideInstancePairList())); - insert_unique(theGraphResult.first->second, make_pair(inSlide, inInstance)); -} - -void CSimpleSlideGraphCore::GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph, - TSlideInstancePairList &outAssociations) const -{ - TGraphToInstanceMap::const_iterator theFind = m_GraphToInstances.find(inSlideGraph); - if (theFind != m_GraphToInstances.end()) - outAssociations.insert(outAssociations.end(), theFind->second.begin(), - theFind->second.end()); -} - -TGraphSlidePair CSimpleSlideGraphCore::GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const -{ - TInstanceToGraphMap::const_iterator theResult = m_InstanceToGraph.find(inInstance); - if (theResult != m_InstanceToGraph.end()) - return theResult->second; - return TGraphSlidePair(); -} - -struct SInstanceMatcher -{ - Qt3DSDMInstanceHandle m_Instance; - SInstanceMatcher(Qt3DSDMInstanceHandle inInst) - : m_Instance(inInst) - { - } - bool operator()(const pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle> &inItem) const - { - return m_Instance == inItem.second; - } -}; - -void CSimpleSlideGraphCore::DissociateInstance(Qt3DSDMInstanceHandle inInstance) -{ - TGraphSlidePair theAssociatedGraph(GetAssociatedGraph(inInstance)); - - TGraphToInstanceMap::iterator theFind = m_GraphToInstances.find(theAssociatedGraph.first); - if (theFind != m_GraphToInstances.end()) { - erase_if(theFind->second, SInstanceMatcher(inInstance)); - if (theFind->second.size() == 0) - m_GraphToInstances.erase(theAssociatedGraph.first); - } - - m_InstanceToGraph.erase(inInstance); -} - -void CSimpleSlideGraphCore::SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, - Qt3DSDMSlideHandle inSlide) -{ - GetSlideGraphNF(inGraph, m_Objects)->m_ActiveSlide = inSlide; -} - -Qt3DSDMSlideHandle CSimpleSlideGraphCore::GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const -{ - const SSlideGraph *theSlide = GetSlideGraphNF(inGraph, m_Objects); - if (theSlide->m_ActiveSlide) - return theSlide->m_ActiveSlide; - return theSlide->m_Root; -} - -bool CSimpleSlideGraphCore::HandleValid(int inHandle) const -{ - return CHandleBase::HandleValid(inHandle); -} - -Qt3DSDMSlideGraphHandle CSimpleSlideGraphCore::CreateSlideGraphWithHandle(int inHandle, - Qt3DSDMSlideHandle inRoot) -{ - m_Objects.insert(make_pair(inHandle, (THandleObjectPtr) new SSlideGraph(inHandle, inRoot))); - return inHandle; -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideGraphCore.h b/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideGraphCore.h deleted file mode 100644 index 484d6750..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SimpleSlideGraphCore.h +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef SLIDEGRAPHCOREH -#define SLIDEGRAPHCOREH -#include "Qt3DSDMStringTable.h" -#include "Qt3DSDMSlideGraphCore.h" -#include "HandleSystemBase.h" -#include "Qt3DSDMErrors.h" - -namespace qt3dsdm { -using namespace std; -struct SSlideGraph : public CHandleObject -{ - SSlideGraph() - : m_Root(0) - , m_ActiveSlide(0) - { - } - SSlideGraph(int inHandle, int inSlideRoot) - : CHandleObject(inHandle) - , m_Root(inSlideRoot) - , m_ActiveSlide(0) - { - } - Qt3DSDMSlideHandle m_Root; - Qt3DSDMSlideHandle m_ActiveSlide; - - static const EHandleObjectType s_Type = CHandleObject::EHandleObjectTypeSSlideGraph; - EHandleObjectType GetType() override { return s_Type; } -}; - -class CSimpleSlideGraphCore : public CHandleBase, public ISlideGraphCore -{ - TStringTablePtr m_StringTable; - typedef std::unordered_map<Qt3DSDMInstanceHandle, - pair<Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle>, std::hash<int>> - TInstanceToGraphMap; - typedef std::unordered_map<Qt3DSDMSlideGraphHandle, TSlideInstancePairList, std::hash<int>> - TGraphToInstanceMap; - - TInstanceToGraphMap m_InstanceToGraph; - TGraphToInstanceMap m_GraphToInstances; - -public: - CSimpleSlideGraphCore(TStringTablePtr strTable = TStringTablePtr()) - : m_StringTable(strTable) - { - } - TStringTablePtr GetStringTablePtr() { return m_StringTable; } - /** - * A slide graph is used to associate a set of instances to a set of slides. - * This allows rapid lookup of properties, as an implementation of these. - * There are a few assumptions here. First is that a given slide can be a member - * of one and only one graph (i.e. it does not derive from another slide outside of the graph). - * Second is that an instance is a member of one and only one graph. - */ - Qt3DSDMSlideGraphHandle CreateSlideGraph(Qt3DSDMSlideHandle inRoot) override; - Qt3DSDMSlideHandle GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const override; - Qt3DSDMSlideGraphHandle GetSlideGraph(Qt3DSDMSlideHandle inSlide) const override; - void GetSlideGraphs(TSlideGraphHandleList &outGraphs) const override; - void DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) override; - - /** - * Associate a given instance handle with a given graph. This will ensure that property - *lookups - * will travel through this graph before they hit the main data core. Instances may be - *associated - * with a sub-slide of a given graph, not just the root. An instance associated with the root - *is - * implicitly associated with any root-derived slides. - */ - void AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) override; - void GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph, - TSlideInstancePairList &outAssociations) const override; - TGraphSlidePair GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const override; - void DissociateInstance(Qt3DSDMInstanceHandle inInstance) override; - - /** - * All graphs always have an active slide. This is assumed to be the root right off the bat. - */ - void SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override; - Qt3DSDMSlideHandle GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const override; - - bool HandleValid(int inHandle) const override; - - Qt3DSDMSlideGraphHandle CreateSlideGraphWithHandle(int inHandle, Qt3DSDMSlideHandle inRoot); - - static SSlideGraph *GetSlideGraphNF(int inHandle, THandleObjectMap &inObjects) - { - return const_cast<SSlideGraph *>( - GetSlideGraphNF(inHandle, static_cast<const THandleObjectMap &>(inObjects))); - } - - static const SSlideGraph *GetSlideGraphNF(int inHandle, const THandleObjectMap &inObjects) - { - const SSlideGraph *theSlide = GetHandleObject<SSlideGraph>(inHandle, inObjects); - if (theSlide) - return theSlide; - throw SlideGraphNotFound(L""); - } -}; - -typedef std::shared_ptr<CSimpleSlideGraphCore> TSimpleSlideGraphCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SlideCoreProducer.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SlideCoreProducer.cpp deleted file mode 100644 index 86b0d1fe..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SlideCoreProducer.cpp +++ /dev/null @@ -1,562 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#ifdef _WIN32 -#pragma warning(disable : 4503) // decorated name length exceeded -#endif -#include "SlideCoreProducer.h" -#include "HandleSystemTransactions.h" -#include "VectorTransactions.h" -#include "SignalsImpl.h" - -using namespace std; - -namespace qt3dsdm { - -Qt3DSDMSlideHandle CSlideCoreProducer::CreateSlide(Qt3DSDMInstanceHandle inInstance) -{ - Qt3DSDMSlideHandle retval = m_Data->CreateSlide(inInstance); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - GetSignalSender()->SendSlideCreated(retval); - return retval; -} - -Qt3DSDMInstanceHandle CSlideCoreProducer::GetSlideInstance(Qt3DSDMSlideHandle inSlide) const -{ - return m_Data->GetSlideInstance(inSlide); -} - -Qt3DSDMSlideHandle CSlideCoreProducer::GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const -{ - return m_Data->GetSlideByInstance(inSlide); -} - -void SendPropertyRemoved(const TSlideEntry &inEntry, Qt3DSDMSlideHandle inSlide, - ISlideCoreSignalSender *inSender) -{ - inSender->SendPropertyValueRemoved(inSlide, get<0>(inEntry), get<1>(inEntry), get<2>(inEntry)); -} - -void RecurseCreateDeleteTransactions(TTransactionConsumerPtr inConsumer, Qt3DSDMSlideHandle inSlide, - THandleObjectMap &inObjects, ISlideCoreSignalSender *inSender) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, inObjects); - inSender->SendBeforeSlideDeleted(theSlide->m_Handle); - do_all(theSlide->m_Children, std::bind(RecurseCreateDeleteTransactions, inConsumer, - std::placeholders::_1, - std::ref(inObjects), inSender)); - if (inConsumer) - CREATE_HANDLE_DELETE_TRANSACTION(inConsumer, inSlide, inObjects); - inSender->SendSlideDeleted(theSlide->m_Handle); -} - -void CSlideCoreProducer::DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) -{ - // Ensure exists - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects); - if (theSlide->m_Parent) { - SSlide *theParent = CSimpleSlideCore::GetSlideNF(theSlide->m_Parent, m_Data->m_Objects); - CreateVecEraseTransaction<int>(__FILE__, __LINE__, m_Consumer, inSlide, - theParent->m_Children); - } - RecurseCreateDeleteTransactions(m_Consumer, inSlide, m_Data->m_Objects, GetSignalSender()); - // Not any more... - m_Data->DeleteSlide(inSlide, outInstances); -} - -void CSlideCoreProducer::GetSlides(TSlideHandleList &outSlides) const -{ - m_Data->GetSlides(outSlides); -} - -float CSlideCoreProducer::GetSlideTime(Qt3DSDMSlideHandle inSlide) const -{ - return m_Data->GetSlideTime(inSlide); -} - -void CSlideCoreProducer::SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects); - float oldTime = theSlide->m_Time; - theSlide->m_Time = inNewTime; - if (m_Consumer) { - m_Consumer->OnTransaction(std::shared_ptr<ITransaction>(CREATE_GENERIC_TRANSACTION( - std::bind(&CSlideCoreProducer::SetSlideTime, this, inSlide, inNewTime), - std::bind(&CSlideCoreProducer::SetSlideTime, this, inSlide, oldTime)))); - } else - GetSignalSender()->SendSlideTimeChanged(inSlide); -} - -inline void SetSlideParent(THandleObjectMap &inObjects, int inSlide, int inParent) -{ - CSimpleSlideCore::GetSlideNF(inSlide, inObjects)->m_Parent = inParent; -} - -void CSlideCoreProducer::DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, - int inIndex) -{ - // Integrity checks to ensure operation will proceed - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects); - SSlide *theNewParent = NULL; - if (inParent) - theNewParent = CSimpleSlideCore::GetSlideNF(inParent, m_Data->m_Objects); - SSlide *theOldParent = NULL; - if (theSlide->m_Parent) - theOldParent = CSimpleSlideCore::GetSlideNF(theSlide->m_Parent, m_Data->m_Objects); - - if (theSlide->m_Parent && m_Consumer) { - m_Consumer->OnTransaction(TTransactionPtr(CREATE_GENERIC_TRANSACTION( - std::bind(SetSlideParent, std::ref(m_Data->m_Objects), inSlide, inParent), - std::bind(SetSlideParent, std::ref(m_Data->m_Objects), inSlide, - theSlide->m_Parent)))); - if (theOldParent) - CreateVecEraseTransaction<int>(__FILE__, __LINE__, m_Consumer, inSlide, - theOldParent->m_Children); - GetSignalSender()->SendSlideDerived(inSlide, 0, inIndex); - } - m_Data->DeriveSlide(inSlide, inParent, inIndex); - if (theNewParent) - CreateVecInsertTransaction<int>(__FILE__, __LINE__, m_Consumer, inSlide, - theNewParent->m_Children); - GetSignalSender()->SendSlideDerived(inSlide, inParent, inIndex); -} - -Qt3DSDMSlideHandle CSlideCoreProducer::GetParentSlide(Qt3DSDMSlideHandle inSlide) const -{ - return m_Data->GetParentSlide(inSlide); -} - -void CSlideCoreProducer::GetChildSlides(Qt3DSDMSlideHandle inSlide, - TSlideHandleList &outChildren) const -{ - m_Data->GetChildSlides(inSlide, outChildren); -} - -int CSlideCoreProducer::GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const -{ - return m_Data->GetChildIndex(inParent, inChild); -} - -bool CSlideCoreProducer::GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - return m_Data->GetInstancePropertyValue(inSlide, inHandle, inProperty, outValue); -} - -inline void EraseProperty(TSlideEntryList &inProperties, int inInstance, int inProperty) -{ - erase_if(inProperties, - std::bind(CSimpleSlideCore::PropertyFound, inInstance, inProperty, - std::placeholders::_1)); -} - -void CSlideCoreProducer::SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - std::pair<SSlide *, SInternValue *> slideAndProp( - m_Data->ResolveSetInstancePropertyValue(inSlide, inHandle, inProperty)); - DoForceSetInstancePropertyValue(slideAndProp.first->m_Handle, inHandle, inProperty, inValue); -} - -struct HashMapDataValueInsertTransaction - : public HashMapInsertTransaction<TSlideInstancePropertyPair, SInternValue, - TSlideEntryHash::hasher> -{ - typedef HashMapInsertTransaction<TSlideInstancePropertyPair, SInternValue, - TSlideEntryHash::hasher> - TBase; - HashMapDataValueInsertTransaction( - const char *inFile, int inLine, TSlideEntryHash &map, - const std::pair<TSlideInstancePropertyPair, SInternValue> &val) - : TBase(inFile, inLine, map, val) - { - } - void Do() override - { - std::pair<int, int> theKey = m_Value.first; - SValue theTempValue = m_Value.second.GetValue(); - TDataStrPtr theStrPtr; - if (GetValueType(theTempValue) == DataModelDataType::String) { - theStrPtr = qt3dsdm::get<TDataStrPtr>(theTempValue); - } - (void)theStrPtr; - TBase::Add(); - } -}; - -inline void CSlideCoreProducer::DoForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, m_Data->m_Objects); - SInternValue theNewValue(inValue, m_Data->GetStringTable()); - SInternValue *theCurrentValue(theSlide->GetInstancePropertyValue(inHandle, inProperty)); - - std::pair<int, int> theKey(inHandle, inProperty); - SlideInstancePropertyKey mergeMapKey(inSlide, inHandle, inProperty); - TSlidePropertyMergeMap::iterator iter = m_PropertyMergeMap.find(mergeMapKey); - if (iter != m_PropertyMergeMap.end()) { - const SValue &theTempValue(theNewValue.GetValue()); - CSimpleSlideCore::ForceSetPropertyValue(m_Data->GetStringTable(), m_Data->m_Objects, - inSlide, inHandle, inProperty, theTempValue); - iter->second->Update(theNewValue); - if (GetValueType(theTempValue) == DataModelDataType::String) { - TDataStrPtr theStrPtr = qt3dsdm::get<TDataStrPtr>(theTempValue); - QT3DSDM_DEBUG_LOG(m_Data->GetStringTable().GetNarrowStr(theStrPtr->GetData())); - } - return; // don't signal - } else { - TSlidePropertyMergeMapEntry theEntry; - if (theCurrentValue) { - theEntry = - CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, theKey, - *theCurrentValue, theNewValue, theSlide->m_Properties); - } else { - if (m_Consumer) { - std::shared_ptr<HashMapDataValueInsertTransaction> theTransaction = - std::make_shared<HashMapDataValueInsertTransaction>( - __FILE__, __LINE__, std::ref(theSlide->m_Properties), - std::make_pair(theKey, theNewValue)); - m_Consumer->OnTransaction(theTransaction); - theEntry = theTransaction; - } - } - if (theEntry) - m_PropertyMergeMap.insert(make_pair(mergeMapKey, theEntry)); - CSimpleSlideCore::ForceSetPropertyValue(m_Data->GetStringTable(), m_Data->m_Objects, - inSlide, inHandle, inProperty, - theNewValue.GetValue()); - GetSignalSender()->SendPropertyValueSet(inSlide, inHandle, inProperty, - theNewValue.GetValue()); - } -} - -void CSlideCoreProducer::ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - if (m_Consumer) - DoForceSetInstancePropertyValue(inSlide, inHandle, inProperty, inValue); - else - m_Data->ForceSetInstancePropertyValue(inSlide, inHandle, inProperty, inValue); -} - -void CSlideCoreProducer::forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - m_Data->forceSetInstancePropertyValueOnAllSlides(inInstance, inProperty, inValue); -} - -bool CSlideCoreProducer::GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - return m_Data->GetSpecificInstancePropertyValue(inSlide, inInstance, inProperty, outValue); -} - -bool CSlideCoreProducer::ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) const -{ - return m_Data->ContainsProperty(inSlide, inHandle, inProperty); -} - -void CSlideCoreProducer::GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, - TSlideEntryList &outEntries) const -{ - return m_Data->GetSlidePropertyEntries(inSlide, outEntries); -} - -void CSlideCoreProducer::PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - SSlide *theParent = CSimpleSlideCore::GetSlideNF(inParent, m_Data->m_Objects); - DoForceSetInstancePropertyValue(inParent, inHandle, inProperty, inValue); - do_all(theParent->m_Children, std::bind(&CSlideCoreProducer::DoForceSetInstancePropertyValue, - this, std::placeholders::_1, - inHandle, inProperty, inValue)); -} - -inline void ClearValueWithTransactions(TTransactionConsumerPtr inConsumer, - THandleObjectMap &inObjects, - ISlideCoreSignalSender *inSignalSender, int inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(inSlide, inObjects); - SInternValue *theCurrentValue(theSlide->GetInstancePropertyValue(inHandle, inProperty)); - if (theCurrentValue) { - SValue theValue(theCurrentValue->GetValue()); - std::pair<int, int> theKey(inHandle, inProperty); - CreateHashMapEraseTransaction(__FILE__, __LINE__, inConsumer, - std::make_pair(theKey, *theCurrentValue), - theSlide->m_Properties); - CSimpleSlideCore::ClearPropertyValue(inObjects, inSlide, inHandle, inProperty); - inSignalSender->SendPropertyValueRemoved(inSlide, inHandle, inProperty, theValue); - } -} - -void CSlideCoreProducer::ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) -{ - SSlide *theParent = CSimpleSlideCore::GetSlideNF(inParent, m_Data->m_Objects); - do_all(theParent->m_Children, - std::bind(ClearValueWithTransactions, m_Consumer, std::ref(m_Data->m_Objects), - GetSignalSender(), std::placeholders::_1, inHandle, inProperty)); -} - -typedef tuple<int, TSlideEntryList, TSlideEntryList> TSlideSlideEntryTuple; -typedef std::vector<TSlideSlideEntryTuple> TSlideSlideEntryTupleList; - -inline void CreateVectorPreReplaceData(THandleObjectPair inPair, - TSlideSlideEntryTupleList &outSlideSlideEntries, - function<bool(const TSlideEntry &)> inPredicate) -{ - if (inPair.second->GetType() == CHandleObject::EHandleObjectTypeSSlide) { - SSlide *theSlide = static_cast<SSlide *>(inPair.second.get()); - if (theSlide->HasProperty(inPredicate)) { - outSlideSlideEntries.push_back( - TSlideSlideEntryTuple(inPair.first, TSlideEntryList(), TSlideEntryList())); - theSlide->DeleteSlideEntries(get<1>(outSlideSlideEntries.back()), inPredicate); - } - } -} - -inline void RunInsert(tuple<int, TSlideEntryList, TSlideEntryList> &inTuple, - THandleObjectMap &inObjects, IStringTable &inStringTable) -{ - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(get<0>(inTuple), inObjects); - theSlide->InsertSlideEntries(get<1>(inTuple), inStringTable); -} - -inline void RunFullInsert(std::shared_ptr<TSlideSlideEntryTupleList> inList, - THandleObjectMap &inObjects, IStringTable &inStringTable) -{ - for (TSlideSlideEntryTupleList::iterator theIter = inList->begin(); theIter != inList->end(); - ++theIter) - RunInsert(*theIter, inObjects, inStringTable); -} - -inline void RunFullErase(std::shared_ptr<TSlideSlideEntryTupleList> inList, - THandleObjectMap &inObjects) -{ - for (TSlideSlideEntryTupleList::iterator theIter = inList->begin(); theIter != inList->end(); - ++theIter) { - SSlide *theSlide = CSimpleSlideCore::GetSlideNF(get<0>(*theIter), inObjects); - theSlide->DeleteEntriesFromList(std::get<1>(*theIter)); - } -} - -void DeleteAllSlideEntriesWithUndo(TTransactionConsumerPtr inConsumer, IStringTable &inStringTable, - THandleObjectMap &inObjects, - function<bool(const TSlideEntry &)> inPredicate) -{ - std::shared_ptr<TSlideSlideEntryTupleList> theEntries(new TSlideSlideEntryTupleList); - do_all(inObjects, - std::bind(CreateVectorPreReplaceData, - std::placeholders::_1, std::ref(*theEntries), inPredicate)); - if (inConsumer) - CreateGenericTransactionWithConsumer( - __FILE__, __LINE__, inConsumer, - std::bind(RunFullErase, theEntries, std::ref(inObjects)), - std::bind(RunFullInsert, theEntries, std::ref(inObjects), - std::ref(inStringTable))); -} - -void CSlideCoreProducer::DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inInstance) -{ - DeleteAllSlideEntriesWithUndo( - m_Consumer, GetStringTable(), m_Data->m_Objects, - std::bind(CSimpleSlideCore::SlideEntryInstanceMatches, std::placeholders::_1, inInstance)); -} -void CSlideCoreProducer::DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) -{ - DeleteAllSlideEntriesWithUndo( - m_Consumer, GetStringTable(), m_Data->m_Objects, - std::bind(CSimpleSlideCore::SlideEntryPropertyMatches, std::placeholders::_1, inHandle)); -} - -void CSlideCoreProducer::DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) -{ - DeleteAllSlideEntriesWithUndo(m_Consumer, GetStringTable(), m_Data->m_Objects, - std::bind(CSimpleSlideCore::SlideEntryInstancePropertyMatches, - std::placeholders::_1, std::cref(inInstances), - std::cref(inProperties))); -} - -void CSlideCoreProducer::GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, - Qt3DSDMSlideHandle inSlide2, - TSlideEntryList &outEntries) const -{ - return m_Data->GetIntersectingProperties(inSlide1, inSlide2, outEntries); -} - -bool InstancePropMatches(Qt3DSDMInstanceHandle instance, Qt3DSDMPropertyHandle prop, - const TSlideEntry &entry) -{ - return instance == get<0>(entry) && prop == get<1>(entry); -} - -bool SendPropertyAddedIfNotInList(Qt3DSDMInstanceHandle instance, Qt3DSDMPropertyHandle prop, - SValue & /*value*/, const TSlideEntryList &inList, - Qt3DSDMSlideHandle inSource, Qt3DSDMSlideHandle inSlide, - ISlideCoreSignalSender * /*inSignalSender*/) -{ - if (find_if<TSlideEntryList::const_iterator>( - inList, std::bind(InstancePropMatches, instance, prop, std::placeholders::_1)) - == inList.end()) { - return true; - } - return false; -} - -// destination gets the properties from slide 1 that have corresponding entries in slide 2 -void CSlideCoreProducer::PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, - Qt3DSDMSlideHandle inSlide2, - Qt3DSDMSlideHandle inDestination) -{ - SSlide *theDest = CSimpleSlideCore::GetSlideNF(inDestination, m_Data->m_Objects); - TSlideEntryList theProperties; - theDest->ToSlideEntryList(theProperties); - m_Data->PushIntersectingProperties(inSlide1, inSlide2, inDestination); - theDest->SetPropertyValuesIf(GetStringTable(), std::bind(SendPropertyAddedIfNotInList, - std::placeholders::_1, - std::placeholders::_2, - std::placeholders::_3, - theProperties, inSlide1, - inDestination, GetSignalSender())); - if (m_Consumer) { - TSlideEntryList theResult; - theDest->ToSlideEntryList(theResult); - m_Consumer->OnTransaction(TTransactionPtr( - CREATE_GENERIC_TRANSACTION(std::bind(&SSlide::FromSlideEntryList, theDest, theResult, - std::ref(GetStringTable())), - std::bind(&SSlide::FromSlideEntryList, theDest, - theProperties, std::ref(GetStringTable()))))); - } -} - -void CSlideCoreProducer::CopyProperties(Qt3DSDMSlideHandle inSourceSlide, - Qt3DSDMInstanceHandle inSourceInstance, - Qt3DSDMSlideHandle inDestSlide, - Qt3DSDMInstanceHandle inDestInstance) -{ - SSlide *sourceSlide = CSimpleSlideCore::GetSlideNF(inSourceSlide, m_Data->m_Objects); - - for (TSlideEntryHash::iterator theIter = sourceSlide->m_Properties.begin(), - theEnd = sourceSlide->m_Properties.end(); - theIter != theEnd; ++theIter) { - if (theIter->first.first == inSourceInstance) { - // Set it once so it appears in the slide - // Then call the main method that will send the events. - DoForceSetInstancePropertyValue(inDestSlide, inDestInstance, theIter->first.second, - theIter->second.GetValue()); - } - } -} - -bool CSlideCoreProducer::HandleValid(int inHandle) const -{ - return m_Data->HandleValid(inHandle); -} - -bool CSlideCoreProducer::IsSlide(Qt3DSDMSlideHandle inSlide) const -{ - return m_Data->IsSlide(inSlide); -} - -void CSlideCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_Consumer = inConsumer; - m_PropertyMergeMap.clear(); -} - -TSignalConnectionPtr -CSlideCoreProducer::ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectSlideCreated(inCallback); -} -TSignalConnectionPtr CSlideCoreProducer::ConnectBeforeSlideDeleted( - const std::function<void(Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectBeforeSlideDeleted(inCallback); -} -TSignalConnectionPtr -CSlideCoreProducer::ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectSlideDeleted(inCallback); -} -TSignalConnectionPtr CSlideCoreProducer::ConnectSlideDerived( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) -{ - return GetSignalProvider()->ConnectSlideDerived(inCallback); -} -TSignalConnectionPtr CSlideCoreProducer::ConnectInstancePropertyValueSet( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) -{ - return GetSignalProvider()->ConnectInstancePropertyValueSet(inCallback); -} -TSignalConnectionPtr CSlideCoreProducer::ConnectInstancePropertyValueRemoved( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) -{ - return GetSignalProvider()->ConnectInstancePropertyValueRemoved(inCallback); -} -TSignalConnectionPtr CSlideCoreProducer::ConnectSlideTimeChanged( - const std::function<void(Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectSlideTimeChanged(inCallback); -} - -void CSlideCoreProducer::InitSignaller() -{ - m_SlideCoreSignaller = CreateSlideCoreSignaller(); -} - -ISlideCoreSignalProvider *CSlideCoreProducer::GetSignalProvider() -{ - return dynamic_cast<ISlideCoreSignalProvider *>(m_SlideCoreSignaller.get()); -} -ISlideCoreSignalSender *CSlideCoreProducer::GetSignalSender() -{ - return dynamic_cast<ISlideCoreSignalSender *>(m_SlideCoreSignaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SlideCoreProducer.h b/src/Authoring/QT3DSDM/Systems/Cores/SlideCoreProducer.h deleted file mode 100644 index dec0297d..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SlideCoreProducer.h +++ /dev/null @@ -1,190 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef SLIDECOREPRODUCERH -#define SLIDECOREPRODUCERH -#include "Qt3DSDMTransactions.h" -#include "SimpleSlideCore.h" -#include "Qt3DSDMSignals.h" - -namespace qt3dsdm { -struct SlideInstancePropertyKey -{ - int m_Slide; - int m_Instance; - int m_Property; - SlideInstancePropertyKey(int slide, int inst, int prop) - : m_Slide(slide) - , m_Instance(inst) - , m_Property(prop) - { - } - SlideInstancePropertyKey() - : m_Slide(0) - , m_Instance(0) - , m_Property(0) - { - } - - bool operator==(const SlideInstancePropertyKey &inOther) const - { - return m_Slide == inOther.m_Slide && m_Instance == inOther.m_Instance - && m_Property == inOther.m_Property; - } -}; - -struct SlideInstancePropertyKeyHasher -{ - std::size_t operator()(const SlideInstancePropertyKey &inEntry) const - { - return std::hash<int>()(inEntry.m_Slide) ^ std::hash<int>()(inEntry.m_Instance) - ^ std::hash<int>()(inEntry.m_Property); - } -}; - -typedef std::shared_ptr<IMergeableTransaction<SInternValue>> TSlidePropertyMergeMapEntry; -typedef std::unordered_map<SlideInstancePropertyKey, TSlidePropertyMergeMapEntry, - SlideInstancePropertyKeyHasher> - TSlidePropertyMergeMap; - -class CSlideCoreProducer : public ISlideCore, - public ITransactionProducer, - public ISlideCoreSignalProvider -{ - Q_DISABLE_COPY(CSlideCoreProducer) - - TTransactionConsumerPtr m_Consumer; - TSimpleSlideCorePtr m_Data; - TSignalItemPtr m_SlideCoreSignaller; - TSlidePropertyMergeMap m_PropertyMergeMap; - -public: - CSlideCoreProducer(TStringTablePtr inStrTable) - : m_Data(new CSimpleSlideCore(inStrTable)) - { - InitSignaller(); - } - - IStringTable &GetStringTable() const override { return m_Data->GetStringTable(); } - TStringTablePtr GetStringTablePtr() const override { return m_Data->GetStringTablePtr(); } - - TSimpleSlideCorePtr GetTransactionlessSlideCore() { return m_Data; } - TSimpleSlideCorePtr GetTransactionlessSlideCore() const { return m_Data; } - - Qt3DSDMSlideHandle CreateSlide(Qt3DSDMInstanceHandle inInstance) override; - Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const override; - Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const override; - void DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) override; - void GetSlides(TSlideHandleList &outSlides) const override; - - float GetSlideTime(Qt3DSDMSlideHandle inSlide) const override; - void SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) override; - - void DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, int inIndex = -1) override; - Qt3DSDMSlideHandle GetParentSlide(Qt3DSDMSlideHandle inSlide) const override; - void GetChildSlides(Qt3DSDMSlideHandle inSlide, TSlideHandleList &outChildren) const override; - int GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const override; - - bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - void SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - void forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) override; - bool GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - void GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TPropertyHandleValuePairList &outValues) override - { - return m_Data->GetSpecificInstancePropertyValues(inSlide, inInstance, outValues); - } - bool ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) const override; - void GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, TSlideEntryList &outEntries) const override; - - void PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - void ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) override; - void DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) override; - void DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) override; - void DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) override; - - void GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - TSlideEntryList &outEntries) const override; - void PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - Qt3DSDMSlideHandle inDestination) override; - void CopyProperties(Qt3DSDMSlideHandle inSourceSlide, Qt3DSDMInstanceHandle inSourceInstance, - Qt3DSDMSlideHandle inDestSlide, Qt3DSDMInstanceHandle inDestInstance) override; - - bool IsSlide(Qt3DSDMSlideHandle inSlide) const override; - - bool HandleValid(int inHandle) const override; - - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - - //=================================================================== - // Signals - //=================================================================== - - virtual TSignalConnectionPtr - ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectBeforeSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override; - TSignalConnectionPtr ConnectSlideDerived( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) override; - TSignalConnectionPtr ConnectInstancePropertyValueSet( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) override; - TSignalConnectionPtr ConnectInstancePropertyValueRemoved( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) override; - virtual TSignalConnectionPtr - ConnectSlideTimeChanged(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override; - -private: - inline void DoForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue); - void InitSignaller(); - ISlideCoreSignalProvider *GetSignalProvider(); - ISlideCoreSignalSender *GetSignalSender(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SlideGraphCoreProducer.cpp b/src/Authoring/QT3DSDM/Systems/Cores/SlideGraphCoreProducer.cpp deleted file mode 100644 index c514108c..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SlideGraphCoreProducer.cpp +++ /dev/null @@ -1,245 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "SlideGraphCoreProducer.h" -#include "HandleSystemTransactions.h" -#include "VectorTransactions.h" -#include "SignalsImpl.h" -using namespace std; - -namespace qt3dsdm { - -Qt3DSDMSlideGraphHandle CSlideGraphCoreProducer::CreateSlideGraph(Qt3DSDMSlideHandle inRoot) -{ - Qt3DSDMSlideGraphHandle retval(m_Data->CreateSlideGraph(inRoot)); - CREATE_HANDLE_CREATE_TRANSACTION(m_Consumer, retval, m_Data->m_Objects); - GetSignalSender()->SendGraphCreated(retval, inRoot); - return retval; -} - -Qt3DSDMSlideHandle CSlideGraphCoreProducer::GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const -{ - return m_Data->GetGraphRoot(inGraph); -} - -Qt3DSDMSlideGraphHandle CSlideGraphCoreProducer::GetSlideGraph(Qt3DSDMSlideHandle inSlide) const -{ - return m_Data->GetSlideGraph(inSlide); -} - -void CSlideGraphCoreProducer::GetSlideGraphs(TSlideGraphHandleList &outGraphs) const -{ - return m_Data->GetSlideGraphs(outGraphs); -} - -struct DissocateAllInstanceTrans : public ITransaction -{ - std::shared_ptr<CSimpleSlideGraphCore> m_Graph; - Qt3DSDMSlideGraphHandle m_Handle; - TSlideInstancePairList m_Instances; - DissocateAllInstanceTrans(const char *inFile, int inLine, - std::shared_ptr<CSimpleSlideGraphCore> inGraph, - Qt3DSDMSlideGraphHandle inHandle) - : ITransaction(inFile, inLine) - , m_Graph(inGraph) - , m_Handle(inHandle) - { - inGraph->GetAssociatedInstances(m_Handle, m_Instances); - } - void Do() override - { - for (size_t idx = 0, end = m_Instances.size(); idx < end; ++idx) - m_Graph->DissociateInstance(m_Instances[idx].second); - } - void Undo() override - { - for (size_t idx = 0, end = m_Instances.size(); idx < end; ++idx) - m_Graph->AssociateInstance(m_Handle, m_Instances[idx].first, m_Instances[idx].second); - } -}; - -void CSlideGraphCoreProducer::DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) -{ - SSlideGraph *theGraph = CSimpleSlideGraphCore::GetSlideGraphNF(inHandle, m_Data->m_Objects); - Qt3DSDMSlideHandle theRootSlide(theGraph->m_Root); - if (m_Consumer) - m_Consumer->OnTransaction( - make_shared<DissocateAllInstanceTrans>(__FILE__, __LINE__, m_Data, inHandle)); - CREATE_HANDLE_DELETE_TRANSACTION(m_Consumer, inHandle, m_Data->m_Objects); - m_Data->DeleteSlideGraph(inHandle); - GetSignalSender()->SendGraphDeleted(inHandle, theRootSlide); -} - -struct SInstanceAssociateTrans : public ITransaction -{ - std::shared_ptr<CSimpleSlideGraphCore> m_Graph; - Qt3DSDMSlideGraphHandle m_GraphHandle; - Qt3DSDMSlideHandle m_Slide; - Qt3DSDMInstanceHandle m_Instance; - bool m_InsertOnDo; - SInstanceAssociateTrans(const char *inFile, int inLine, - std::shared_ptr<CSimpleSlideGraphCore> inGraph, - Qt3DSDMSlideGraphHandle inGraphHandle, Qt3DSDMSlideHandle inSlideHandle, - Qt3DSDMInstanceHandle inInstance, bool inInsertOnDo) - : ITransaction(inFile, inLine) - , m_Graph(inGraph) - , m_GraphHandle(inGraphHandle) - , m_Slide(inSlideHandle) - , m_Instance(inInstance) - , m_InsertOnDo(inInsertOnDo) - { - } - void Insert() { m_Graph->AssociateInstance(m_GraphHandle, m_Slide, m_Instance); } - void Remove() { m_Graph->DissociateInstance(m_Instance); } - - void Do() override - { - if (m_InsertOnDo) - Insert(); - else - Remove(); - } - void Undo() override - { - if (m_InsertOnDo) - Remove(); - else - Insert(); - } -}; - -void CSlideGraphCoreProducer::AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) -{ - m_Data->AssociateInstance(inSlideGraph, inSlide, inInstance); - if (m_Consumer) - m_Consumer->OnTransaction(make_shared<SInstanceAssociateTrans>( - __FILE__, __LINE__, m_Data, inSlideGraph, inSlide, inInstance, true)); - - GetSignalSender()->SendInstanceAssociated(inSlideGraph, inSlide, inInstance); -} -void CSlideGraphCoreProducer::GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph, - TSlideInstancePairList &outAssociations) const -{ - m_Data->GetAssociatedInstances(inSlideGraph, outAssociations); -} - -TGraphSlidePair CSlideGraphCoreProducer::GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const -{ - return m_Data->GetAssociatedGraph(inInstance); -} - -void CSlideGraphCoreProducer::DissociateInstance(Qt3DSDMInstanceHandle inInstance) -{ - TGraphSlidePair theAssociatedGraph(m_Data->GetAssociatedGraph(inInstance)); - - if (theAssociatedGraph.first.Valid()) { - m_Data->DissociateInstance(inInstance); - if (m_Consumer) - m_Consumer->OnTransaction(make_shared<SInstanceAssociateTrans>( - __FILE__, __LINE__, m_Data, theAssociatedGraph.first, theAssociatedGraph.second, - inInstance, false)); - GetSignalSender()->SendInstanceDissociated(theAssociatedGraph.first, - theAssociatedGraph.second, inInstance); - } -} - -void CSlideGraphCoreProducer::SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, - Qt3DSDMSlideHandle inSlide) -{ - if (m_Consumer) { - Qt3DSDMSlideHandle current = m_Data->GetGraphActiveSlide(inGraph); - TTransactionPtr theTransaction(CREATE_GENERIC_TRANSACTION( - bind(&CSimpleSlideGraphCore::SetGraphActiveSlide, m_Data, inGraph, inSlide), - bind(&CSimpleSlideGraphCore::SetGraphActiveSlide, m_Data, inGraph, current))); - m_Consumer->OnTransaction(theTransaction); - } - m_Data->SetGraphActiveSlide(inGraph, inSlide); - GetSignalSender()->SendGraphActiveSlide(inGraph, inSlide); -} - -Qt3DSDMSlideHandle CSlideGraphCoreProducer::GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const -{ - return m_Data->GetGraphActiveSlide(inGraph); -} - -bool CSlideGraphCoreProducer::HandleValid(int inHandle) const -{ - return m_Data->HandleValid(inHandle); -} - -void CSlideGraphCoreProducer::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_Consumer = inConsumer; -} - -TSignalConnectionPtr CSlideGraphCoreProducer::ConnectGraphCreated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectGraphCreated(inCallback); -} -TSignalConnectionPtr CSlideGraphCoreProducer::ConnectGraphDeleted( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectGraphDeleted(inCallback); -} -TSignalConnectionPtr CSlideGraphCoreProducer::ConnectInstanceAssociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) -{ - return GetSignalProvider()->ConnectInstanceAssociated(inCallback); -} -TSignalConnectionPtr CSlideGraphCoreProducer::ConnectInstanceDissociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) -{ - return GetSignalProvider()->ConnectInstanceDissociated(inCallback); -} -TSignalConnectionPtr CSlideGraphCoreProducer::ConnectGraphActiveSlide( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) -{ - return GetSignalProvider()->ConnectGraphActiveSlide(inCallback); -} - -void CSlideGraphCoreProducer::InitSignaller() -{ - m_Signaller = CreateSlideGraphCoreSignaller(); -} - -ISlideGraphCoreSignalProvider *CSlideGraphCoreProducer::GetSignalProvider() -{ - return dynamic_cast<ISlideGraphCoreSignalProvider *>(m_Signaller.get()); -} - -ISlideGraphCoreSignalSender *CSlideGraphCoreProducer::GetSignalSender() -{ - return dynamic_cast<ISlideGraphCoreSignalSender *>(m_Signaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/Cores/SlideGraphCoreProducer.h b/src/Authoring/QT3DSDM/Systems/Cores/SlideGraphCoreProducer.h deleted file mode 100644 index 5b34cdb9..00000000 --- a/src/Authoring/QT3DSDM/Systems/Cores/SlideGraphCoreProducer.h +++ /dev/null @@ -1,98 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef SLIDEGRAPHCOREPRODUCERH -#define SLIDEGRAPHCOREPRODUCERH -#include "SimpleSlideGraphCore.h" -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMSignals.h" - -namespace qt3dsdm { -class CSlideGraphCoreProducer : public ISlideGraphCore, - public ITransactionProducer, - public ISlideGraphCoreSignalProvider -{ - Q_DISABLE_COPY(CSlideGraphCoreProducer) - - TSimpleSlideGraphCorePtr m_Data; - TTransactionConsumerPtr m_Consumer; - TSignalItemPtr m_Signaller; - -public: - CSlideGraphCoreProducer(TStringTablePtr strTable = TStringTablePtr()) - : m_Data(new CSimpleSlideGraphCore(strTable)) - { - InitSignaller(); - } - TSimpleSlideGraphCorePtr GetTransactionlessSlideGraphCore() { return m_Data; } - TSimpleSlideGraphCorePtr GetTransactionlessSlideGraphCore() const { return m_Data; } - - Qt3DSDMSlideGraphHandle CreateSlideGraph(Qt3DSDMSlideHandle inRoot) override; - Qt3DSDMSlideHandle GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const override; - Qt3DSDMSlideGraphHandle GetSlideGraph(Qt3DSDMSlideHandle inSlide) const override; - void GetSlideGraphs(TSlideGraphHandleList &outGraphs) const override; - void DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) override; - - void AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) override; - void GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph, - TSlideInstancePairList &outAssociations) const override; - TGraphSlidePair GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const override; - void DissociateInstance(Qt3DSDMInstanceHandle inInstance) override; - - void SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override; - Qt3DSDMSlideHandle GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const override; - - bool HandleValid(int inHandle) const override; - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - - //=================================================================== - // Signals - //=================================================================== - TSignalConnectionPtr ConnectGraphCreated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override; - TSignalConnectionPtr ConnectGraphDeleted( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override; - TSignalConnectionPtr ConnectInstanceAssociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override; - TSignalConnectionPtr ConnectInstanceDissociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override; - TSignalConnectionPtr ConnectGraphActiveSlide( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override; - -private: - void InitSignaller(); - ISlideGraphCoreSignalProvider *GetSignalProvider(); - ISlideGraphCoreSignalSender *GetSignalSender(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/HandleSystemBase.h b/src/Authoring/QT3DSDM/Systems/HandleSystemBase.h deleted file mode 100644 index cb8e0f6c..00000000 --- a/src/Authoring/QT3DSDM/Systems/HandleSystemBase.h +++ /dev/null @@ -1,169 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef HANDLESYSTEMIMPLH -#define HANDLESYSTEMIMPLH - -#include <unordered_map> - -namespace qt3dsdm { - -class CHandleObject -{ -public: - // Type of CHandleObject - // Each subclass needs to specify what type it is - // This is used to avoid dynamic_cast (RTTI) which is expensive - enum EHandleObjectType { - EHandleObjectTypeUnknown = 0, - EHandleObjectTypeCDataModelInstance, - EHandleObjectTypeCDataModelPropertyDefinitionObject, - EHandleObjectTypeSAnimationTrack, - EHandleObjectTypeSKeyframe, - EHandleObjectTypeSSlide, - EHandleObjectTypeSSlideGraph, - EHandleObjectTypeAction, - EHandleObjectTypeActionHandlerArgument, - EHandleObjectTypeCustomProperty, - EHandleObjectTypeEvent, - EHandleObjectTypeCustomHandler, - EHandleObjectTypeHandlerParam, - EHandleObjectTypeEnd, - }; - - CHandleObject(int inHandle = 0) - : m_Handle(inHandle) - { - } - virtual ~CHandleObject() {} - - virtual EHandleObjectType GetType() = 0; - - int m_Handle; - -private: //noncopyable - CHandleObject(const CHandleObject&) = delete; - CHandleObject& operator=(const CHandleObject&) = delete; - -}; - -typedef std::shared_ptr<CHandleObject> THandleObjectPtr; - -// Note that maps don't need to copy their objects. -typedef std::unordered_map<int, THandleObjectPtr> THandleObjectMap; -typedef std::pair<int, THandleObjectPtr> THandleObjectPair; - -class IHandleBase -{ -public: - /** - * Check whether a given handle exists - */ - virtual bool HandleValid(int inHandle) const = 0; -}; - -struct CHandleBase : public IHandleBase -{ - THandleObjectMap m_Objects; - int m_NextId; - - CHandleBase() - : m_NextId(1) - { - } - CHandleBase(const CHandleBase &inOther) - : m_Objects(inOther.m_Objects) - , m_NextId(inOther.m_NextId) - { - } - - CHandleBase &operator=(const CHandleBase &inOther) - { - m_Objects = inOther.m_Objects; - m_NextId = inOther.m_NextId; - return *this; - } - - // IHandleBase - bool HandleValid(int inHandle) const override - { - return m_Objects.find(inHandle) != m_Objects.end(); - } - - template <typename T> - static inline bool HandleObjectValid(int inHandle, const THandleObjectMap &inMap) - { - THandleObjectMap::const_iterator theIter = inMap.find(inHandle); - if (theIter != inMap.end()) { - if (theIter->second->GetType() == T::s_Type) - return true; - } - return false; - } - - template <typename T> - static inline const T *GetHandleObject(int inHandle, const THandleObjectMap &inMap) - { - THandleObjectMap::const_iterator theIter = inMap.find(inHandle); - if (theIter != inMap.end()) { - if (theIter->second->GetType() == T::s_Type) - return static_cast<const T *>(theIter->second.get()); - } - return NULL; - } - - template <typename ObjectType, typename HandleType> - static inline void MaybeAddObject(const std::pair<int, THandleObjectPtr> &inItem, - std::vector<HandleType> &outHandles) - { - if (inItem.second->GetType() == ObjectType::s_Type) - outHandles.push_back(HandleType(inItem.first)); - } - - static void EraseHandle(int inHandle, THandleObjectMap &inObjects) - { - THandleObjectMap::iterator theFind = inObjects.find(inHandle); - if (theFind != inObjects.end()) - inObjects.erase(theFind); - } - - // Return the next unused id. There are no guarantees whether positive or negative; what this - // will - // guarantee is that it isn't currently used in the object map and it is non-zero. - int GetNextId() - { - do { - ++m_NextId; - } while (m_Objects.find(m_NextId) != m_Objects.end()); - return m_NextId; - } -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/HandleSystemTransactions.h b/src/Authoring/QT3DSDM/Systems/HandleSystemTransactions.h deleted file mode 100644 index 9d77884e..00000000 --- a/src/Authoring/QT3DSDM/Systems/HandleSystemTransactions.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef HANDLESYSTEMTRANSACTIONSH -#define HANDLESYSTEMTRANSACTIONSH -#include "HandleSystemBase.h" -#include "Qt3DSDMTransactions.h" - -namespace qt3dsdm { -inline void InsertItemInMap(THandleObjectMap &inObjects, - const std::pair<int, THandleObjectPtr> &inItem) -{ - inObjects.insert(inItem); -} -inline void HandleCreateTransaction(const char *inFile, int inLine, int inHandle, - THandleObjectMap &inObjects, - TTransactionConsumerPtr &inConsumer) -{ - std::pair<int, THandleObjectPtr> theEntry = *inObjects.find(inHandle); - std::function<void()> doOp(std::bind(InsertItemInMap, std::ref(inObjects), theEntry)); - std::function<void()> undoOp( - std::bind(CHandleBase::EraseHandle, inHandle, std::ref(inObjects))); - TTransactionPtr theTransaction(DoCreateGenericTransaction(inFile, inLine, doOp, undoOp)); - inConsumer->OnTransaction(theTransaction); -} - -inline void HandleDeleteTransaction(const char *inFile, int inLine, int inHandle, - THandleObjectMap &inObjects, - TTransactionConsumerPtr &inConsumer) -{ - using namespace std; - pair<int, THandleObjectPtr> theEntry = *inObjects.find(inHandle); - TTransactionPtr theTransaction(DoCreateGenericTransaction( - inFile, inLine, std::bind(CHandleBase::EraseHandle, inHandle, std::ref(inObjects)), - std::bind(InsertItemInMap, std::ref(inObjects), theEntry))); - inConsumer->OnTransaction(theTransaction); -} - -inline void DoCreateHandleCreateTransaction(const char *inFile, int inLine, - TTransactionConsumerPtr inConsumer, int inHandle, - THandleObjectMap &inObjects) -{ - RunWithConsumer(inConsumer, std::bind(HandleCreateTransaction, inFile, inLine, inHandle, - std::ref(inObjects), std::placeholders::_1)); -} - -#define CREATE_HANDLE_CREATE_TRANSACTION(inConsumer, inHandle, inObjects) \ - DoCreateHandleCreateTransaction(__FILE__, __LINE__, inConsumer, inHandle, inObjects); - -inline void DoCreateHandleDeleteTransaction(const char *inFile, int inLine, - TTransactionConsumerPtr inConsumer, int inHandle, - THandleObjectMap &inObjects) -{ - RunWithConsumer(inConsumer, std::bind(HandleDeleteTransaction, inFile, inLine, inHandle, - std::ref(inObjects), std::placeholders::_1)); -} - -#define CREATE_HANDLE_DELETE_TRANSACTION(inConsumer, inHandle, inObjects) \ - DoCreateHandleDeleteTransaction(__FILE__, __LINE__, inConsumer, inHandle, inObjects); -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionCore.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionCore.h deleted file mode 100644 index a9201462..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionCore.h +++ /dev/null @@ -1,99 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_ACTION_CORE_H -#define QT3DSDM_ACTION_CORE_H - -#include "Qt3DSDMHandles.h" -#include "HandleSystemBase.h" -#include "Qt3DSDMActionInfo.h" - -namespace qt3dsdm { -const long REFERENCED_AS_OWNER = 0x01; -const long REFERENCED_AS_TRIGGER = 0x02; -const long REFERENCED_AS_TARGET = 0x04; -class IStringTable; - -/** - * ActionCore - */ -class IActionCore : public IHandleBase -{ -public: - virtual ~IActionCore() {} - - virtual TStringTablePtr GetStringTablePtr() const = 0; - virtual IStringTable &GetStringTable() const = 0; - // Action - virtual Qt3DSDMActionHandle CreateAction(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - SLong4 inTriggerTargetObjects) = 0; - virtual void DeleteAction(Qt3DSDMActionHandle inAction, Qt3DSDMInstanceHandle &outInstance) = 0; - virtual const SActionInfo &GetActionInfo(Qt3DSDMActionHandle inAction) const = 0; - virtual void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const = 0; - virtual void GetActions(Qt3DSDMSlideHandle inSlide, TActionHandleList &outActions) const = 0; - virtual void GetActions(Qt3DSDMInstanceHandle inOwner, TActionHandleList &outActions) const = 0; - virtual void GetActions(TActionHandleList &outActions) const = 0; - - // Return the instance that was allocated for this action. - virtual Qt3DSDMInstanceHandle GetActionInstance(Qt3DSDMActionHandle inAction) const = 0; - // Reverse lookup into the action system so you can match actions to instances. - virtual Qt3DSDMActionHandle GetActionByInstance(Qt3DSDMInstanceHandle inActionInstance) const = 0; - - // Action Properties - virtual void SetTriggerObject(Qt3DSDMActionHandle inAction, - const SObjectRefType &inTriggerObject) = 0; - virtual void SetTargetObject(Qt3DSDMActionHandle inAction, - const SObjectRefType &inTargetObject) = 0; - virtual void SetEvent(Qt3DSDMActionHandle inAction, const wstring &inEventName) = 0; - virtual void SetHandler(Qt3DSDMActionHandle inAction, const wstring &inHandlerName) = 0; - - // Handler Argument - virtual Qt3DSDMHandlerArgHandle AddHandlerArgument(Qt3DSDMActionHandle inAction, - const TCharStr &inName, - HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) = 0; - virtual void RemoveHandlerArgument(Qt3DSDMHandlerArgHandle inHandlerArgument) = 0; - virtual const SHandlerArgumentInfo & - GetHandlerArgumentInfo(Qt3DSDMHandlerArgHandle inHandlerArgument) const = 0; - virtual void GetHandlerArguments(Qt3DSDMActionHandle inAction, - THandlerArgHandleList &outHandlerArguments) const = 0; - - // Handler Argument Properties - virtual void GetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, - SValue &outValue) const = 0; - virtual void SetHandlerArgumentValue(Qt3DSDMHandlerArgHandle inHandlerArgument, - const SValue &inValue) = 0; -}; - -typedef std::shared_ptr<IActionCore> TActionCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionInfo.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionInfo.h deleted file mode 100644 index 40fd9645..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionInfo.h +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_ACTION_INFO_H -#define QT3DSDM_ACTION_INFO_H - -#include "Qt3DSDMDataTypes.h" -#include "Qt3DSDMMetaDataTypes.h" - -namespace qt3dsdm { -using std::wstring; -struct SActionInfo -{ - // InstanceHandle corresponding to this action (to store other properties not listed here) - Qt3DSDMInstanceHandle m_Instance; - - // Where the action is added to - Qt3DSDMSlideHandle m_Slide; // the slide that the action is added to - Qt3DSDMInstanceHandle - m_Owner; // the object that the action is added to (the owner of the action) - - // Trigger object - SObjectRefType m_TriggerObject; // trigger object - wstring m_Event; // the list of applicable events is based on object type and stored, by type, - // in metadata - - // Target object - SObjectRefType m_TargetObject; // target object - wstring m_Handler; // the list of applicable action handlers is loaded from metadata xml file - // and based on object type - THandlerArgHandleList m_HandlerArgs; // the list of applicable action arguments is dependent on - // the handler and loaded from the metadata xml file. - - SActionInfo() {} - - SActionInfo(Qt3DSDMInstanceHandle inInstance, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) - : m_Instance(inInstance) - , m_Slide(inSlide) - , m_Owner(inOwner) - { - } -}; - -struct SHandlerArgumentInfo -{ - Qt3DSDMActionHandle m_Action; // Action that owns this Action Argument - TCharStr m_Name; // Name of the Action Argument - HandlerArgumentType::Value m_ArgType; // m_ArgType will override m_ValueType - DataModelDataType::Value m_ValueType; // m_ValueType is ignored if ArgType is specified - SValue m_Value; // Value of the Action Argument - - SHandlerArgumentInfo() - : m_ArgType(HandlerArgumentType::None) - , m_ValueType(DataModelDataType::None) - { - } - - SHandlerArgumentInfo(Qt3DSDMActionHandle inAction, const TCharStr &inName, - HandlerArgumentType::Value inArgType, DataModelDataType::Value inValueType) - : m_Action(inAction) - , m_Name(inName) - , m_ArgType(inArgType) - , m_ValueType(inValueType) - { - } -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionSystem.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionSystem.h deleted file mode 100644 index 8713729a..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMActionSystem.h +++ /dev/null @@ -1,68 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_ACTION_SYSTEM_H -#define QT3DSDM_ACTION_SYSTEM_H -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMActionCore.h" - -namespace qt3dsdm { -/** - * ActionSystem acts as a wrapper or helper around ActionCore. ActionSystem will call - * ActionCore and perform other necessary setups. It also has the knowledge of other - * system or core so there are some synchronization being done here. - * - * When in doubts which one to use (ActionSystem or ActionCore), always use ActionSystem - */ -class IActionSystem -{ -public: - virtual ~IActionSystem() {} - - // CreateAction will create Action's InstanceHandle and Action's ActionHandle and do some - // necessary setup - virtual Qt3DSDMActionHandle CreateAction(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - SLong4 inTriggerTargetObjects) = 0; - // DeleteAction will delete both Action's ActionHandle and Action's InstanceHandle - virtual void DeleteAction(Qt3DSDMActionHandle inAction) = 0; - // Return all actions that belong to a certain instance in a certain slide + the master slide - virtual void GetActions(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inOwner, - TActionHandleList &outActions) const = 0; - - // Get/set action eyeball property value - virtual bool GetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, - Qt3DSDMActionHandle inAction) const = 0; - virtual void SetActionEyeballValue(Qt3DSDMSlideHandle inActiveSlide, Qt3DSDMActionHandle inAction, - bool inValue) = 0; -}; - -typedef std::shared_ptr<IActionSystem> TActionSystemPtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMAnimation.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMAnimation.h deleted file mode 100644 index 361e522b..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMAnimation.h +++ /dev/null @@ -1,837 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_ANIMATION_H -#define QT3DSDM_ANIMATION_H -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMDataTypes.h" -#include "Qt3DSDMValue.h" - -namespace qt3dsdm { - -struct SLinearKeyframe -{ - float m_KeyframeSeconds; - float m_KeyframeValue; -}; - -struct SBezierKeyframe : public SLinearKeyframe -{ - float m_InTangentTime; // time - float m_InTangentValue; // value offset - float m_OutTangentTime; // time offset in seconds - float m_OutTangentValue; // value offset -}; - -typedef std::vector<SBezierKeyframe> TBezierKeyframeList; - -/** - * Ease in/out are parameters that affect the bezier evaluation. - * Ease in/out at 100 means that the control values are at the end points thus creating - * a gradual deceleration. Ease in/out at 0 means that interpolation is linear, the - * control points are at 1/3 and 2/3's the distance to the next value. - * Ease in/out go from 0.f to 100.0f - */ -struct SEaseInEaseOutKeyframe : public SLinearKeyframe -{ - float m_EaseIn; - float m_EaseOut; -}; -} - -namespace qt3ds { -namespace foundation { - // Disable calling destructor of these pod types - template <> - struct DestructTraits<qt3dsdm::SEaseInEaseOutKeyframe> - { - void destruct(qt3dsdm::SEaseInEaseOutKeyframe &) {} - }; - template <> - struct DestructTraits<qt3dsdm::SBezierKeyframe> - { - void destruct(qt3dsdm::SBezierKeyframe &) {} - }; - template <> - struct DestructTraits<qt3dsdm::SLinearKeyframe> - { - void destruct(qt3dsdm::SLinearKeyframe &) {} - }; -} -} - -namespace qt3dsdm { - -enum EAnimationType { - EAnimationTypeNone = 0, - EAnimationTypeLinear, - EAnimationTypeBezier, - EAnimationTypeEaseInOut, -}; - -template <typename TDataType> -struct SAnimationTypeTraits -{ -}; - -template <> -struct SAnimationTypeTraits<SBezierKeyframe> -{ - EAnimationType getType() { return EAnimationTypeBezier; } -}; -template <> -struct SAnimationTypeTraits<SLinearKeyframe> -{ - EAnimationType getType() { return EAnimationTypeLinear; } -}; -template <> -struct SAnimationTypeTraits<SEaseInEaseOutKeyframe> -{ - EAnimationType getType() { return EAnimationTypeEaseInOut; } -}; - -struct SKeyframeUnionTraits -{ - typedef EAnimationType TIdType; - enum { - TBufferSize = sizeof(SBezierKeyframe), - }; - static TIdType getNoDataId() { return EAnimationTypeNone; } - template <typename TDataType> - static TIdType getType() - { - return SAnimationTypeTraits<TDataType>().getType(); - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor) - { - switch (inType) { - case EAnimationTypeBezier: - return inVisitor(*reinterpret_cast<SBezierKeyframe *>(inData)); - case EAnimationTypeLinear: - return inVisitor(*reinterpret_cast<SLinearKeyframe *>(inData)); - case EAnimationTypeEaseInOut: - return inVisitor(*reinterpret_cast<SEaseInEaseOutKeyframe *>(inData)); - default: - QT3DS_ASSERT(false); - case EAnimationTypeNone: - return inVisitor(); - } - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor) - { - switch (inType) { - case EAnimationTypeBezier: - return inVisitor(*reinterpret_cast<const SBezierKeyframe *>(inData)); - case EAnimationTypeLinear: - return inVisitor(*reinterpret_cast<const SLinearKeyframe *>(inData)); - case EAnimationTypeEaseInOut: - return inVisitor(*reinterpret_cast<const SEaseInEaseOutKeyframe *>(inData)); - default: - QT3DS_ASSERT(false); - case EAnimationTypeNone: - return inVisitor(); - } - } -}; - -typedef qt3ds::foundation:: - DiscriminatedUnion<qt3ds::foundation:: - DiscriminatedUnionGenericBase<SKeyframeUnionTraits, - SKeyframeUnionTraits::TBufferSize>, - SKeyframeUnionTraits::TBufferSize> - TKeyframe; - -template <> -struct Qt3DSDMGetter<TKeyframe> -{ - template <typename TRetType> - TRetType doGet(const TKeyframe &inValue) - { - return inValue.getData<TRetType>(); - } -}; - -typedef std::vector<TKeyframe> TKeyframeList; - -struct SAnimationInfo -{ - Qt3DSDMSlideHandle m_Slide; - Qt3DSDMInstanceHandle m_Instance; - Qt3DSDMPropertyHandle m_Property; - size_t m_Index; - EAnimationType m_AnimationType; - // Use the existing value for the value of the first keyframe. - // Not reflected in studio at this time, purely a runtime problem. - // Defaults to false - bool m_DynamicFirstKeyframe; - bool m_ArtistEdited; - SAnimationInfo() - : m_Index(0) - , m_AnimationType(EAnimationTypeLinear) - , m_DynamicFirstKeyframe(false) - // Animations are assumed to be artist edited. - // And any change will force this flag to true. - , m_ArtistEdited(true) - - { - } - SAnimationInfo(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, EAnimationType inAnimationType, - bool inDynamicFirstKeyframe, bool inArtistEdited) - : m_Slide(inSlide) - , m_Instance(inInstance) - , m_Property(inProperty) - , m_Index(inIndex) - , m_AnimationType(inAnimationType) - , m_DynamicFirstKeyframe(inDynamicFirstKeyframe) - , m_ArtistEdited(inArtistEdited) - { - } -}; - -typedef std::pair<SAnimationInfo, TKeyframeList> TAnimationKeyframesPair; -typedef std::vector<TAnimationKeyframesPair> TAnimationKeyframesPairList; -typedef std::vector<SAnimationInfo> TAnimationInfoList; - -/** - * Pure animation core. Not wrapped in any niceties. - */ -class IAnimationCore -{ -public: - virtual ~IAnimationCore() {} - virtual Qt3DSDMAnimationHandle CreateAnimation(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, - bool inFirstKeyframeDynamic) = 0; - virtual void DeleteAnimation(Qt3DSDMAnimationHandle inAnimation) = 0; - virtual Qt3DSDMAnimationHandle GetAnimation(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - size_t inIndex) const = 0; - virtual SAnimationInfo GetAnimationInfo(Qt3DSDMAnimationHandle inAnimation) const = 0; - virtual void GetAnimations(TAnimationHandleList &outAnimations) const = 0; - virtual void GetAnimations(TAnimationInfoList &outAnimations, - Qt3DSDMSlideHandle inMaster = Qt3DSDMSlideHandle(), - Qt3DSDMSlideHandle inSlide = Qt3DSDMSlideHandle()) const = 0; - - virtual void GetSpecificInstanceAnimations(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TAnimationHandleList &outAnimations) = 0; - - virtual void SetFirstKeyframeDynamic(Qt3DSDMAnimationHandle inAnimation, bool inValue) = 0; - - // keyframe manipulation - virtual Qt3DSDMKeyframeHandle InsertKeyframe(Qt3DSDMAnimationHandle inAnimation, - const TKeyframe &inKeyframe) = 0; - virtual void EraseKeyframe(Qt3DSDMKeyframeHandle inKeyframe) = 0; - virtual void DeleteAllKeyframes(Qt3DSDMAnimationHandle inAnimation) = 0; - - // All of these mutators will force the artist edited property - // of the animation to true. - virtual Qt3DSDMAnimationHandle - GetAnimationForKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const = 0; - virtual TKeyframe GetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe) const = 0; - virtual void SetKeyframeData(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0; - virtual void GetKeyframes(Qt3DSDMAnimationHandle inAnimation, - TKeyframeHandleList &outKeyframes) const = 0; - virtual size_t GetKeyframeCount(Qt3DSDMAnimationHandle inAnimation) const = 0; - virtual bool IsFirstKeyframe(Qt3DSDMKeyframeHandle inKeyframe) const = 0; - - virtual void OffsetAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - long inOffset) = 0; - - // Direct mutators of the artist edited feature of animations - virtual void SetIsArtistEdited(Qt3DSDMAnimationHandle inAnimation, bool inEdited = true) = 0; - virtual bool IsArtistEdited(Qt3DSDMAnimationHandle inAnimation) const = 0; - - // Animation Evaluation. - virtual float EvaluateAnimation(Qt3DSDMAnimationHandle inAnimation, float inSeconds) const = 0; - - virtual bool KeyframeValid(Qt3DSDMKeyframeHandle inKeyframe) const = 0; - virtual bool AnimationValid(Qt3DSDMAnimationHandle inAnimation) const = 0; - - virtual void CopyAnimations(Qt3DSDMSlideHandle inSourceSlide, - Qt3DSDMInstanceHandle inSourceInstance, - Qt3DSDMSlideHandle inDestSlide, - Qt3DSDMInstanceHandle inDestInstance) = 0; -}; - -typedef std::shared_ptr<IAnimationCore> TAnimationCorePtr; - -struct SGetOrSetKeyframeInfo -{ - float m_Value; - float m_EaseIn; - float m_EaseOut; - bool m_AnimationTrackIsDynamic; - SGetOrSetKeyframeInfo(float inValue, float inEaseIn = -1.f, float inEaseOut = -1.f, - bool inDynamic = false) - : m_Value(inValue) - , m_EaseIn(inEaseIn) - , m_EaseOut(inEaseOut) - , m_AnimationTrackIsDynamic(inDynamic) - { - } - SGetOrSetKeyframeInfo() - : m_Value(0) - , m_EaseIn(-1.f) - , m_EaseOut(-1.f) - , m_AnimationTrackIsDynamic(false) - { - } -}; -/** - * Interface from studio into the animation system that speaks - * a language near to that of studio. Public interface. - */ -class IStudioAnimationSystem -{ -public: - virtual ~IStudioAnimationSystem() {} - - /** - * When auto-keyframing is on, all calls to setinstancepropertyvalue will - * case a keyframe to be set if the instance is a member of a slide graph. - */ - virtual void SetAutoKeyframe(bool inAutoKeyframe) = 0; - /** - * Returns true when auto keyframing is set. - */ - virtual bool GetAutoKeyframe() const = 0; - /** - * Create animation on the property on this instance. If the property was animated and had - *keyframes previously, - * this function will also set the keyframes accordingly. - */ - virtual void Animate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) = 0; - /** - * Delete animation on the property on this instance - */ - virtual void Deanimate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) = 0; - /** - * Set a keyframe on this property. Uses the current time of the slide graph. - * If the keyframe is within a given time distance of another, this function will simply change - * the keyframed value of the other property to match the current value of this property. - */ - virtual void KeyframeProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - bool inDoDiffValue) = 0; - /** - * Set the value of a existing a keyframe or create a new one, on this property, at the given - *time. - * If ease in or ease out are unset then the keyframe gets the default ease in or out. - */ - virtual void SetOrCreateKeyframe(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, float inTimeInSeconds, - SGetOrSetKeyframeInfo *inKeyframeInfo, size_t inNumInfos) = 0; - /** - * Return the animation that is currently controlling this property. This function will return - * an invalid handle value if there is currently no animation controlling this property. - */ - virtual Qt3DSDMAnimationHandle GetControllingAnimation(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - size_t inIndex) const = 0; - - /** - * Return true if the given property is animatable. You can begin animation by calling - *KeyframeProperty *or* - * by setting auto keyframe to on and setting a property value through the - *IInstancePropertyCore system. - */ - virtual bool IsPropertyAnimatable(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - - /** - * Return true if the given property is animated. Currently, either 0 or ALL channels are - *animated. Hence, checking for index = 0 suffices. - * And if that changes, this function can be updated accordingly. - */ - virtual bool IsPropertyAnimated(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - - /** - * Specify if new keyframes should be created with smooth ( ie Ease In/Out values = 100 ) or - *linear ( Ease In/Out values = 0 ) - */ - virtual void SetInterpolation(bool inSmooth) = 0; - - /** - * Get an instance property value. Will override outValue only if the slide, instance, - *property is animated. - */ - virtual bool GetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - /** - * Set an instance property value. Will return true in the cases where - * the property is actually animated. May only set local values, or may auto set a keyframed - *value. - */ - virtual bool SetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - typedef std::function<void(Qt3DSDMInstanceHandle instance)> TRefreshCallbackFunc; - virtual void setRefreshCallback(TRefreshCallbackFunc func) = 0; -}; - -typedef std::shared_ptr<IStudioAnimationSystem> TStudioAnimationSystemPtr; - -inline SLinearKeyframe CreateLinearKeyframe(float inSeconds, float inValue) -{ - SLinearKeyframe retval = { inSeconds, inValue }; - return retval; -} - -inline SBezierKeyframe CreateBezierKeyframe(float inSeconds, float inValue, float inInTangentTime, - float inInTangentValue, float inOutTangentTime, - float inOutTangentValue) -{ - SBezierKeyframe theBezierKeyframe; - theBezierKeyframe.m_KeyframeSeconds = inSeconds; - theBezierKeyframe.m_KeyframeValue = inValue; - theBezierKeyframe.m_InTangentTime = inInTangentTime; - theBezierKeyframe.m_InTangentValue = inInTangentValue; - theBezierKeyframe.m_OutTangentTime = inOutTangentTime; - theBezierKeyframe.m_OutTangentValue = inOutTangentValue; - return theBezierKeyframe; -} - -inline SEaseInEaseOutKeyframe CreateEaseInEaseOutKeyframe(float inSeconds, float inValue, - float inEaseIn, float inEaseOut) -{ - SEaseInEaseOutKeyframe retval; - retval.m_KeyframeSeconds = inSeconds; - retval.m_KeyframeValue = inValue; - retval.m_EaseIn = inEaseIn; - retval.m_EaseOut = inEaseOut; - return retval; -} - -inline SAnimationInfo CreateAnimationInfo(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType, - bool inFirstKeyframeDynamic, bool inArtistEdited) -{ - SAnimationInfo retval(inSlide, inInstance, inProperty, inIndex, inAnimationType, - inFirstKeyframeDynamic, inArtistEdited); - return retval; -} - -struct SKeyframeValueVisitor -{ - float operator()(const SLinearKeyframe &inKeyframe) const { return inKeyframe.m_KeyframeValue; } - float operator()(const SBezierKeyframe &inKeyframe) const { return inKeyframe.m_KeyframeValue; } - float operator()(const SEaseInEaseOutKeyframe &inKeyframe) const - { - return inKeyframe.m_KeyframeValue; - } - float operator()() - { - QT3DS_ASSERT(false); - return 0.0f; - } -}; - -inline float KeyframeValueValue(const TKeyframe &inKeyframe) -{ - return inKeyframe.visit<float>(SKeyframeValueVisitor()); -} - -struct SKeyframeTimeAnalyzer -{ - float operator()(const SLinearKeyframe &inValue) const { return inValue.m_KeyframeSeconds; } - float operator()(const SBezierKeyframe &inValue) const { return inValue.m_KeyframeSeconds; } - float operator()(const SEaseInEaseOutKeyframe &inValue) const - { - return inValue.m_KeyframeSeconds; - } - float operator()() - { - QT3DS_ASSERT(false); - return 0.0f; - } -}; - -inline float KeyframeTime(const TKeyframe &inValue) -{ - return inValue.visit<float>(SKeyframeTimeAnalyzer()); -} - -inline EAnimationType GetKeyframeType(const TKeyframe &inKeyframe) -{ - return inKeyframe.getType(); -} - -struct SAnimatableArityVisitor -{ - std::tuple<bool, size_t> operator()(bool) const - { - return std::tuple<bool, size_t>(true, 1); - } - std::tuple<bool, size_t> operator()(long) const - { - return std::tuple<bool, size_t>(true, 1); - } - std::tuple<bool, size_t> operator()(float) const - { - return std::tuple<bool, size_t>(true, 1); - } - std::tuple<bool, size_t> operator()(const SFloat2 &) const - { - return std::tuple<bool, size_t>(true, 2); - } - std::tuple<bool, size_t> operator()(const SFloat3 &) const - { - return std::tuple<bool, size_t>(true, 3); - } - std::tuple<bool, size_t> operator()(const SFloat4 &) const - { - return std::tuple<bool, size_t>(true, 4); - } - template <typename TDataType> - std::tuple<bool, size_t> operator()(const TDataType &) const - { - return std::tuple<bool, size_t>(false, 0); - } - std::tuple<bool, size_t> operator()() - { - QT3DS_ASSERT(false); - return std::tuple<bool, size_t>(false, 0); - } -}; - -inline std::tuple<bool, size_t> GetVariantAnimatableAndArity(const SValue &inValue) -{ - return inValue.visit<std::tuple<bool, size_t>>(SAnimatableArityVisitor()); -} - -inline std::tuple<bool, size_t> GetDatatypeAnimatableAndArity(DataModelDataType::Value inDataType) -{ - switch (inDataType) { - default: - return std::make_tuple(false, 0); - case DataModelDataType::Long: - case DataModelDataType::Float: - return std::make_tuple(true, 1); - case DataModelDataType::Float2: - return std::make_tuple(true, 2); - case DataModelDataType::Float3: - return std::make_tuple(true, 3); - case DataModelDataType::Float4: - return std::make_tuple(true, 4); - } -} - -template <typename TDataType> -inline TDataType SetFloatValue(float inValue, size_t inIndex, const TDataType &inDataType) -{ - TDataType retval(inDataType); - retval[inIndex] = inValue; - return retval; -} - -struct SAnimationApplier -{ - float m_Value; - size_t m_Index; - SValue operator()(const bool &) { return m_Value > 0.5f ? true : false; } - SValue operator()(const qt3ds::QT3DSI32 &) { return static_cast<qt3ds::QT3DSI32>(m_Value + .5f); } - SValue operator()(const float &) { return m_Value; } - SValue operator()(const SFloat2 &inValue) { return SetFloatValue(m_Value, m_Index, inValue); } - SValue operator()(const SFloat3 &inValue) { return SetFloatValue(m_Value, m_Index, inValue); } - template <typename TDataType> - SValue operator()(const TDataType &inValue) - { - return inValue; - } - SValue operator()() - { - QT3DS_ASSERT(false); - return SValue(); - } -}; - -inline void SetAnimationValue(float inValue, size_t inIndex, SValue &ioValue) -{ - using namespace std; - SAnimationApplier theApplier; - theApplier.m_Value = inValue; - theApplier.m_Index = inIndex; - ioValue = ioValue.visit<SValue>(theApplier); -} - -template <typename TDataType> -inline float GetFloatValue(const TDataType &inValue, size_t inIndex) -{ - return inValue[inIndex]; -} - -struct SAnimationGetter -{ - size_t m_Index; - float operator()(const bool &inValue) const { return inValue ? 1.f : 0.f; } - float operator()(const long &inValue) const { return static_cast<float>(inValue); } - float operator()(const float &inValue) const { return inValue; } - float operator()(const SFloat2 &inValue) const { return GetFloatValue(inValue, m_Index); } - float operator()(const SFloat3 &inValue) const { return GetFloatValue(inValue, m_Index); } - template <typename TDataType> - float operator()(const TDataType & /*inValue*/) const - { - return 0.f; - } - float operator()() - { - QT3DS_ASSERT(false); - return 0.0f; - } -}; - -inline float GetAnimationValue(size_t inIndex, const SValue &ioValue) -{ - SAnimationGetter theGetter; - theGetter.m_Index = inIndex; - return ioValue.visit<float>(theGetter); -} - -struct SKeyframeTimeSetter -{ - float m_Seconds; - TKeyframe operator()(const SLinearKeyframe &inValue) const - { - return CreateLinearKeyframe(m_Seconds, inValue.m_KeyframeValue); - } - TKeyframe operator()(const SBezierKeyframe &inValue) const - { - return CreateBezierKeyframe(m_Seconds, inValue.m_KeyframeValue, inValue.m_InTangentTime, - inValue.m_InTangentValue, inValue.m_OutTangentTime, - inValue.m_OutTangentValue); - } - TKeyframe operator()(const SEaseInEaseOutKeyframe &inValue) const - { - return CreateEaseInEaseOutKeyframe(m_Seconds, inValue.m_KeyframeValue, inValue.m_EaseIn, - inValue.m_EaseOut); - } - TKeyframe operator()() - { - QT3DS_ASSERT(false); - return TKeyframe(); - } -}; - -inline TKeyframe SetKeyframeSeconds(const TKeyframe &inKeyframe, float inSeconds) -{ - SKeyframeTimeSetter theSetter; - theSetter.m_Seconds = inSeconds; - return inKeyframe.visit<TKeyframe>(theSetter); -} - -struct SKeyframeTimeGetter -{ - template <typename TKeyframeType> - float operator()(const TKeyframeType &inValue) const - { - return inValue.m_KeyframeSeconds; - } - float operator()() - { - QT3DS_ASSERT(false); - return 0.0f; - } -}; - -inline float GetKeyframeSeconds(const TKeyframe &inKeyframe) -{ - SKeyframeTimeGetter theGetter; - return inKeyframe.visit<float>(theGetter); -} - -struct SKeyframeValueSetter -{ - float m_Value; - TKeyframe operator()(const SLinearKeyframe &inValue) const - { - return CreateLinearKeyframe(inValue.m_KeyframeSeconds, m_Value); - } - TKeyframe operator()(const SBezierKeyframe &inValue) const - { - return CreateBezierKeyframe(inValue.m_KeyframeSeconds, m_Value, inValue.m_InTangentTime, - inValue.m_InTangentValue, inValue.m_OutTangentTime, - inValue.m_OutTangentValue); - } - TKeyframe operator()(const SEaseInEaseOutKeyframe &inValue) const - { - return CreateEaseInEaseOutKeyframe(inValue.m_KeyframeSeconds, m_Value, inValue.m_EaseIn, - inValue.m_EaseOut); - } - TKeyframe operator()() - { - QT3DS_ASSERT(false); - return TKeyframe(); - } -}; - -inline TKeyframe SetKeyframeValue(const TKeyframe &inKeyframe, float inValue) -{ - SKeyframeValueSetter theSetter; - theSetter.m_Value = inValue; - return inKeyframe.visit<TKeyframe>(theSetter); -} - -inline float AnimationClamp(float inLowerBound, float inUpperBound, float inValue) -{ - if (inValue < inLowerBound) - return inLowerBound; - if (inValue > inUpperBound) - return inUpperBound; - return inValue; -} - -inline SBezierKeyframe -CreateBezierKeyframeFromEaseInEaseOutKeyframe(float *inPreviousValue, - SEaseInEaseOutKeyframe inCurrent, float *inNextValue) -{ - float theValue = inCurrent.m_KeyframeValue; - float theSeconds = inCurrent.m_KeyframeSeconds; - float inSeconds = 0.f; - float inValue = 0.f; - float outSeconds = 0.f; - float outValue = 0.f; - if (inPreviousValue) { - float thePercent = 1.0f - AnimationClamp(0.0f, 1.0f, inCurrent.m_EaseIn / 100.f); - double theAmount = 1.0f - thePercent * .333333333334; - inValue = (float)(*inPreviousValue - + ((inCurrent.m_KeyframeValue - *inPreviousValue) * theAmount)); - } - if (inNextValue) { - float thePercent = 1.0f - AnimationClamp(0.0f, 1.0f, inCurrent.m_EaseOut / 100.f); - double theAmount = thePercent * .3333333333334; - outValue = (float)(inCurrent.m_KeyframeValue - + ((*inNextValue - inCurrent.m_KeyframeValue) * theAmount)); - } - return CreateBezierKeyframe(theSeconds, theValue, inSeconds, inValue, outSeconds, outValue); -} - -void CopyKeyframes(const IAnimationCore &inSourceAnimationCore, IAnimationCore &inDestAnimationCore, - Qt3DSDMAnimationHandle inDestAnimation, const TKeyframeHandleList &inKeyframes); - -Qt3DSDMAnimationHandle CopyAnimation(TAnimationCorePtr inSourceAnimationCore, - Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inNewSlide, - Qt3DSDMInstanceHandle inNewInstance, - Qt3DSDMPropertyHandle inNewProperty, size_t inNewIndex); - -struct SEaseInGetter -{ - float operator()(const SLinearKeyframe &) const { return 0.f; } - float operator()(const SBezierKeyframe &) const { return 0.f; } - float operator()(const SEaseInEaseOutKeyframe &inValue) const { return inValue.m_EaseIn; } - float operator()() - { - QT3DS_ASSERT(false); - return 0.0f; - } -}; -struct SEaseOutGetter -{ - float operator()(const SLinearKeyframe &) const { return 0.f; } - float operator()(const SBezierKeyframe &) const { return 0.f; } - float operator()(const SEaseInEaseOutKeyframe &inValue) const { return inValue.m_EaseOut; } - float operator()() - { - QT3DS_ASSERT(false); - return 0.0f; - } -}; -inline void GetEaseInOutValues(const TKeyframe &inValue, float &outEaseIn, float &outEaseOut) -{ - SEaseInGetter theGetter; - outEaseIn = inValue.visit<float>(theGetter); - - SEaseOutGetter theEaseOutGetter; - outEaseOut = inValue.visit<float>(theEaseOutGetter); -} - -struct SEaseInSetter -{ - float m_Value; - TKeyframe operator()(SLinearKeyframe &inValue) const { return inValue; } - TKeyframe operator()(SBezierKeyframe &inValue) const { return inValue; } - TKeyframe operator()(SEaseInEaseOutKeyframe &inKeyframe) const - { - inKeyframe.m_EaseIn = m_Value; - return inKeyframe; - } - TKeyframe operator()() - { - QT3DS_ASSERT(false); - return TKeyframe(); - } -}; -struct SEaseOutSetter -{ - float m_Value; - TKeyframe operator()(SLinearKeyframe &inValue) const { return inValue; } - TKeyframe operator()(SBezierKeyframe &inValue) const { return inValue; } - TKeyframe operator()(SEaseInEaseOutKeyframe &inKeyframe) const - { - inKeyframe.m_EaseOut = m_Value; - return inKeyframe; - } - TKeyframe operator()() - { - QT3DS_ASSERT(false); - return TKeyframe(); - } -}; -inline TKeyframe SetEaseInOutValues(TKeyframe &inKeyframe, float inEaseIn, float inEaseOut) -{ - SEaseInSetter theSetter; - theSetter.m_Value = inEaseIn; - inKeyframe.visit<TKeyframe>(theSetter); - - SEaseOutSetter theEaseOutSetter; - theEaseOutSetter.m_Value = inEaseOut; - inKeyframe.visit<TKeyframe>(theEaseOutSetter); - - return inKeyframe; -} - -void GetKeyframesAsBezier(Qt3DSDMAnimationHandle inAnimation, const IAnimationCore &inAnimationCore, - TBezierKeyframeList &outKeyframes); -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMComposerTypeDefinitions.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMComposerTypeDefinitions.cpp deleted file mode 100644 index 2bd89418..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMComposerTypeDefinitions.cpp +++ /dev/null @@ -1,579 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "Qt3DSDMComposerTypeDefinitions.h" -#include <memory> -#include "Qt3DSDMDataCore.h" -#include "SimpleDataCore.h" -#include "DataCoreProducer.h" -#include "Qt3DSDMSlideCore.h" - -#include <QtGlobal> - -using namespace qt3dsdm; -using std::make_shared; -using std::shared_ptr; - -#ifdef _WIN32 -#pragma warning(disable : 4100) -#endif - -// SComposerTypePropertyDefinition constructors - -namespace { - -template <typename TDataType> -struct DataConstructor -{ - template <typename TInputType> - TDataType Construct(const TInputType &inInput) - { - return TDataType(inInput); - } -}; - -template <> -struct DataConstructor<SLong4> -{ - SLong4 Construct(int inValue) - { - unsigned long theValue((unsigned long)inValue); - return SLong4(theValue, theValue, theValue, theValue); - } -}; - -template <> -struct DataConstructor<TDataStrPtr> -{ - TDataStrPtr Construct(const wchar_t *inData) - { - if (IsTrivial(inData)) - return make_shared<CDataStr>(); - return make_shared<CDataStr>(inData); - } -}; -template <> -struct DataConstructor<SStringOrInt> -{ - SStringOrInt Construct(const wchar_t *inData) - { - if (IsTrivial(inData)) - return make_shared<CDataStr>(); - return make_shared<CDataStr>(inData); - } -}; -template <> -struct DataConstructor<SObjectRefType> -{ - SObjectRefType Construct(const wchar_t *) { return SObjectRefType(); } -}; -} - -#define QT3DS_WCHAR_T_Typed L"Typed" -#define QT3DS_WCHAR_T_Guided L"Guided" -#define QT3DS_WCHAR_T_Named L"Named" -#define QT3DS_WCHAR_T_SlideOwner L"SlideOwner" -#define QT3DS_WCHAR_T_Slide L"Slide" -#define QT3DS_WCHAR_T_Action L"Action" -#define QT3DS_WCHAR_T_Asset L"Asset" -#define QT3DS_WCHAR_T_Scene L"Scene" -#define QT3DS_WCHAR_T_Image L"Image" -#define QT3DS_WCHAR_T_Material L"Material" -#define QT3DS_WCHAR_T_Behavior L"Behavior" -#define QT3DS_WCHAR_T_Node L"Node" -#define QT3DS_WCHAR_T_Layer L"Layer" -#define QT3DS_WCHAR_T_Group L"Group" -#define QT3DS_WCHAR_T_Model L"Model" -#define QT3DS_WCHAR_T_Light L"Light" -#define QT3DS_WCHAR_T_Camera L"Camera" -#define QT3DS_WCHAR_T_Component L"Component" -#define QT3DS_WCHAR_T_Text L"Text" -#define QT3DS_WCHAR_T_Effect L"Effect" -#define QT3DS_WCHAR_T_RenderPlugin L"RenderPlugin" -#define QT3DS_WCHAR_T_MaterialBase L"MaterialBase" -#define QT3DS_WCHAR_T_CustomMaterial L"CustomMaterial" -#define QT3DS_WCHAR_T_ReferencedMaterial L"ReferencedMaterial" -#define QT3DS_WCHAR_T_Alias L"Alias" -#define QT3DS_WCHAR_T_Lightmaps L"Lightmaps" - -#define QT3DS_WCHAR_T_type L"type" -#define QT3DS_WCHAR_T_id L"id" -#define QT3DS_WCHAR_T_name L"name" -#define QT3DS_WCHAR_T_componentid L"componentid" -#define QT3DS_WCHAR_T_playmode L"playmode" -#define QT3DS_WCHAR_T_playthroughto L"playthroughto" -#define QT3DS_WCHAR_T_initialplaystate L"initialplaystate" -#define QT3DS_WCHAR_T_actioneyeball L"actioneyeball" -#define QT3DS_WCHAR_T_sourcepath L"sourcepath" -#define QT3DS_WCHAR_T_importid L"importid" -#define QT3DS_WCHAR_T_starttime L"starttime" -#define QT3DS_WCHAR_T_endtime L"endtime" -#define QT3DS_WCHAR_T_eyeball L"eyeball" -#define QT3DS_WCHAR_T_shy L"shy" -#define QT3DS_WCHAR_T_locked L"locked" -#define QT3DS_WCHAR_T_timebarcolor L"timebarcolor" -#define QT3DS_WCHAR_T_timebartext L"timebartext" -#define QT3DS_WCHAR_T_bgcolorenable L"bgcolorenable" -#define QT3DS_WCHAR_T_background L"background" -#define QT3DS_WCHAR_T_backgroundcolor L"backgroundcolor" -#define QT3DS_WCHAR_T_blendtype L"blendtype" -#define QT3DS_WCHAR_T_scaleu L"scaleu" -#define QT3DS_WCHAR_T_scalev L"scalev" -#define QT3DS_WCHAR_T_mappingmode L"mappingmode" -#define QT3DS_WCHAR_T_tilingmodehorz L"tilingmodehorz" -#define QT3DS_WCHAR_T_tilingmodevert L"tilingmodevert" -#define QT3DS_WCHAR_T_rotationuv L"rotationuv" -#define QT3DS_WCHAR_T_positionu L"positionu" -#define QT3DS_WCHAR_T_positionv L"positionv" -#define QT3DS_WCHAR_T_pivotu L"pivotu" -#define QT3DS_WCHAR_T_pivotv L"pivotv" -#define QT3DS_WCHAR_T_subpresentation L"subpresentation" -#define QT3DS_WCHAR_T_iblprobe L"iblprobe" -#define QT3DS_WCHAR_T_shaderlighting L"shaderlighting" -#define QT3DS_WCHAR_T_blendmode L"blendmode" -#define QT3DS_WCHAR_T_vertexcolors L"vertexcolors" -#define QT3DS_WCHAR_T_diffuse L"diffuse" -#define QT3DS_WCHAR_T_diffusemap L"diffusemap" -#define QT3DS_WCHAR_T_diffusemap2 L"diffusemap2" -#define QT3DS_WCHAR_T_diffusemap3 L"diffusemap3" -#define QT3DS_WCHAR_T_specularreflection L"specularreflection" -#define QT3DS_WCHAR_T_specularmap L"specularmap" -#define QT3DS_WCHAR_T_specularmodel L"specularmodel" -#define QT3DS_WCHAR_T_speculartint L"speculartint" -#define QT3DS_WCHAR_T_ior L"ior" -#define QT3DS_WCHAR_T_specularamount L"specularamount" -#define QT3DS_WCHAR_T_specularroughness L"specularroughness" -#define QT3DS_WCHAR_T_roughnessmap L"roughnessmap" -#define QT3DS_WCHAR_T_opacitymap L"opacitymap" -#define QT3DS_WCHAR_T_emissivepower L"emissivepower" -#define QT3DS_WCHAR_T_emissivecolor L"emissivecolor" -#define QT3DS_WCHAR_T_emissivemap L"emissivemap" -#define QT3DS_WCHAR_T_emissivemap2 L"emissivemap2" -#define QT3DS_WCHAR_T_normalmap L"normalmap" -#define QT3DS_WCHAR_T_normalstrength L"normalstrength" -#define QT3DS_WCHAR_T_position L"position" -#define QT3DS_WCHAR_T_rotation L"rotation" -#define QT3DS_WCHAR_T_scale L"scale" -#define QT3DS_WCHAR_T_pivot L"pivot" -#define QT3DS_WCHAR_T_opacity L"opacity" -#define QT3DS_WCHAR_T_rotationorder L"rotationorder" -#define QT3DS_WCHAR_T_orientation L"orientation" -#define QT3DS_WCHAR_T_progressiveaa L"progressiveaa" -#define QT3DS_WCHAR_T_multisampleaa L"multisampleaa" -#define QT3DS_WCHAR_T_disabledepthtest L"disabledepthtest" -#define QT3DS_WCHAR_T_disabledepthprepass L"disabledepthprepass" -#define QT3DS_WCHAR_T_layerwidth L"layerwidth" -#define QT3DS_WCHAR_T_layerheight L"layerheight" -#define QT3DS_WCHAR_T_lighttype L"lighttype" -#define QT3DS_WCHAR_T_lightdiffuse L"lightdiffuse" -#define QT3DS_WCHAR_T_lightspecular L"lightspecular" -#define QT3DS_WCHAR_T_lightambient L"lightambient" -#define QT3DS_WCHAR_T_brightness L"brightness" -#define QT3DS_WCHAR_T_linearfade L"linearfade" -#define QT3DS_WCHAR_T_expfade L"expfade" -#define QT3DS_WCHAR_T_areawidth L"areawidth" -#define QT3DS_WCHAR_T_areaheight L"areaheight" -#define QT3DS_WCHAR_T_castshadow L"castshadow" -#define QT3DS_WCHAR_T_shdwbias L"shdwbias" -#define QT3DS_WCHAR_T_shdwfactor L"shdwfactor" -#define QT3DS_WCHAR_T_shdwmapres L"shdwmapres" -#define QT3DS_WCHAR_T_shdwmapfar L"shdwmapfar" -#define QT3DS_WCHAR_T_shdwmapfov L"shdwmapfov" -#define QT3DS_WCHAR_T_shdwfilter L"shdwfilter" -#define QT3DS_WCHAR_T_orthographic L"orthographic" -#define QT3DS_WCHAR_T_fov L"fov" -#define QT3DS_WCHAR_T_fovhorizontal L"fovhorizontal" -#define QT3DS_WCHAR_T_clipnear L"clipnear" -#define QT3DS_WCHAR_T_clipfar L"clipfar" -#define QT3DS_WCHAR_T_lookatlock L"lookatlock" -#define QT3DS_WCHAR_T_lookatpoint L"lookatpoint" -#define QT3DS_WCHAR_T_textstring L"textstring" -#define QT3DS_WCHAR_T_textcolor L"textcolor" -#define QT3DS_WCHAR_T_font L"font" -#define QT3DS_WCHAR_T_size L"size" -#define QT3DS_WCHAR_T_horzalign L"horzalign" -#define QT3DS_WCHAR_T_vertalign L"vertalign" -#define QT3DS_WCHAR_T_leading L"leading" -#define QT3DS_WCHAR_T_tracking L"tracking" -#define QT3DS_WCHAR_T_dropshadow L"dropshadow" -#define QT3DS_WCHAR_T_dropshadowstrength L"dropshadowstrength" -#define QT3DS_WCHAR_T_dropshadowoffsetx L"dropshadowoffsetx" -#define QT3DS_WCHAR_T_dropshadowoffsety L"dropshadowoffsety" -#define QT3DS_WCHAR_T_wordwrap L"wordwrap" -#define QT3DS_WCHAR_T_boundingbox L"boundingbox" -#define QT3DS_WCHAR_T_elide L"elide" -#define QT3DS_WCHAR_T_enableacceleratedfont L"enableacceleratedfont" -#define QT3DS_WCHAR_T_importfile L"importfile" -#define QT3DS_WCHAR_T_fileid L"fileid" -#define QT3DS_WCHAR_T_size L"size" -#define QT3DS_WCHAR_T_location L"location" -#define QT3DS_WCHAR_T_boneid L"boneid" -#define QT3DS_WCHAR_T_poseroot L"poseroot" -#define QT3DS_WCHAR_T_ignoresparent L"ignoresparent" -#define QT3DS_WCHAR_T_shadowcaster L"shadowcaster" -#define QT3DS_WCHAR_T_tessellation L"tessellation" -#define QT3DS_WCHAR_T_edgetess L"edgetess" -#define QT3DS_WCHAR_T_innertess L"innertess" -#define QT3DS_WCHAR_T_scalemode L"scalemode" -#define QT3DS_WCHAR_T_scaleanchor L"scaleanchor" -#define QT3DS_WCHAR_T_horzfields L"horzfields" -#define QT3DS_WCHAR_T_left L"left" -#define QT3DS_WCHAR_T_leftunits L"leftunits" -#define QT3DS_WCHAR_T_width L"width" -#define QT3DS_WCHAR_T_widthunits L"widthunits" -#define QT3DS_WCHAR_T_right L"right" -#define QT3DS_WCHAR_T_rightunits L"rightunits" -#define QT3DS_WCHAR_T_vertfields L"vertfields" -#define QT3DS_WCHAR_T_top L"top" -#define QT3DS_WCHAR_T_topunits L"topunits" -#define QT3DS_WCHAR_T_height L"height" -#define QT3DS_WCHAR_T_heightunits L"heightunits" -#define QT3DS_WCHAR_T_bottom L"bottom" -#define QT3DS_WCHAR_T_bottomunits L"bottomunits" -#define QT3DS_WCHAR_T_aostrength L"aostrength" -#define QT3DS_WCHAR_T_aodistance L"aodistance" -#define QT3DS_WCHAR_T_aosoftness L"aosoftness" -#define QT3DS_WCHAR_T_aobias L"aobias" -#define QT3DS_WCHAR_T_aosamplerate L"aosamplerate" -#define QT3DS_WCHAR_T_aodither L"aodither" -#define QT3DS_WCHAR_T_shadowstrength L"shadowstrength" -#define QT3DS_WCHAR_T_shadowdist L"shadowdist" -#define QT3DS_WCHAR_T_shadowsoftness L"shadowsoftness" -#define QT3DS_WCHAR_T_shadowbias L"shadowbias" -#define QT3DS_WCHAR_T_source L"source" -#define QT3DS_WCHAR_T_referencedmaterial L"referencedmaterial" -#define QT3DS_WCHAR_T_lightprobe L"lightprobe" -#define QT3DS_WCHAR_T_probebright L"probebright" -#define QT3DS_WCHAR_T_fastibl L"fastibl" -#define QT3DS_WCHAR_T_probehorizon L"probehorizon" -#define QT3DS_WCHAR_T_probefov L"probefov" -#define QT3DS_WCHAR_T_lightprobe2 L"lightprobe2" -#define QT3DS_WCHAR_T_probe2fade L"probe2fade" -#define QT3DS_WCHAR_T_probe2window L"probe2window" -#define QT3DS_WCHAR_T_probe2pos L"probe2pos" -#define QT3DS_WCHAR_T_bumpmap L"bumpmap" -#define QT3DS_WCHAR_T_bumpamount L"bumpamount" -#define QT3DS_WCHAR_T_normalmap L"normalmap" -#define QT3DS_WCHAR_T_displacementmap L"displacementmap" -#define QT3DS_WCHAR_T_displaceamount L"displaceamount" -#define QT3DS_WCHAR_T_translucencymap L"translucencymap" -#define QT3DS_WCHAR_T_translucentfalloff L"translucentfalloff" -#define QT3DS_WCHAR_T_diffuselightwrap L"diffuselightwrap" -#define QT3DS_WCHAR_T_fresnelPower L"fresnelPower" -#define QT3DS_WCHAR_T_referencednode L"referencednode" -#define QT3DS_WCHAR_T_temporalaa L"temporalaa" -#define QT3DS_WCHAR_T_scope L"scope" -#define QT3DS_WCHAR_T_Path L"Path" -#define QT3DS_WCHAR_T_pathdata L"pathdata" -#define QT3DS_WCHAR_T_PathAnchorPoint L"PathAnchorPoint" -#define QT3DS_WCHAR_T_incomingangle L"incomingangle" -#define QT3DS_WCHAR_T_incomingdistance L"incomingdistance" -#define QT3DS_WCHAR_T_outgoingdistance L"outgoingdistance" -#define QT3DS_WCHAR_T_linearerror L"linearerror" -#define QT3DS_WCHAR_T_edgetessamount L"edgetessamount" -#define QT3DS_WCHAR_T_innertessamount L"innertessamount" -#define QT3DS_WCHAR_T_begincap L"begincap" -#define QT3DS_WCHAR_T_begincapoffset L"begincapoffset" -#define QT3DS_WCHAR_T_begincapopacity L"begincapopacity" -#define QT3DS_WCHAR_T_begincapwidth L"begincapwidth" -#define QT3DS_WCHAR_T_endcap L"endcap" -#define QT3DS_WCHAR_T_endcapoffset L"endcapoffset" -#define QT3DS_WCHAR_T_endcapopacity L"endcapopacity" -#define QT3DS_WCHAR_T_endcapwidth L"endcapwidth" -#define QT3DS_WCHAR_T_pathtype L"pathtype" -#define QT3DS_WCHAR_T_closed L"closed" -#define QT3DS_WCHAR_T_paintstyle L"paintstyle" -#define QT3DS_WCHAR_T_SubPath L"SubPath" -#define QT3DS_WCHAR_T_lightmapindirect L"lightmapindirect" -#define QT3DS_WCHAR_T_lightmapradiosity L"lightmapradiosity" -#define QT3DS_WCHAR_T_lightmapshadow L"lightmapshadow" -#define QT3DS_WCHAR_T_controlledproperty L"controlledproperty" -#define QT3DS_WCHAR_T_variants L"variants" - -const wchar_t *ComposerObjectTypes::Convert(ComposerObjectTypes::Enum inType) -{ - switch (inType) { -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - case name: \ - return QT3DS_WCHAR_T_##name; - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - default: - break; - } - - QT3DS_ASSERT(false); - return L"Unknown"; -} - -ComposerObjectTypes::Enum ComposerObjectTypes::Convert(const wchar_t *inType) -{ - -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - if (AreEqual(QT3DS_WCHAR_T_##name, inType)) \ - return ComposerObjectTypes::name; - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - - QT3DS_ASSERT(false); - return ComposerObjectTypes::Unknown; -} - -ComposerObjectTypes::Enum ComposerObjectTypes::Convert(const char8_t *inType) -{ - -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - if (AreEqual(#name, inType)) \ - return ComposerObjectTypes::name; - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - - QT3DS_ASSERT(false); - return ComposerObjectTypes::Unknown; -} - -const wchar_t *ComposerPropertyNames::Convert(ComposerPropertyNames::Enum inType) -{ - switch (inType) { -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue) -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \ - case name: \ - return QT3DS_WCHAR_T_##name; -#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \ - HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - default: - break; - } - QT3DS_ASSERT(false); - return L"Unknown"; -} - -ComposerPropertyNames::Enum ComposerPropertyNames::Convert(const wchar_t *inType) -{ -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue) -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \ - if (AreEqual(inType, QT3DS_WCHAR_T_##name)) \ - return name; -#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \ - HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - QT3DS_ASSERT(false); - return ComposerPropertyNames::Unknown; -} - -const char8_t *ComposerPropertyNames::ConvertNarrow(ComposerPropertyNames::Enum inType) -{ - switch (inType) { -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue) -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \ - case name: \ - return #name; -#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \ - HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - default: - break; - } - QT3DS_ASSERT(false); - return "Unknown"; -} - -ComposerPropertyNames::Enum ComposerPropertyNames::Convert(const char8_t *inType) -{ -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue) -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) \ - if (AreEqual(inType, #name)) \ - return name; -#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) \ - HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - QT3DS_ASSERT(false); - return ComposerPropertyNames::Unknown; -} - -#define HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue) \ - , memberName(inCore, inInstance, DataConstructor<dtype>().Construct(defaultValue)) - -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, dtype) \ - , memberName(inCore, inInstance) - -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, dtype, defaultValue) \ - HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue) - -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - SComposerTypePropertyDefinition<ComposerObjectTypes::name>::SComposerTypePropertyDefinition( \ - IDataCore &inCore, Qt3DSDMInstanceHandle inInstance) \ - : reserved(false) propmacro \ - { \ - Q_UNUSED(inCore); \ - Q_UNUSED(inInstance); \ - } -ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - -void ComposerTypeDefinitionsHelper::SetInstanceAsCanonical(IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - ComposerObjectTypes::Enum inObjectType) -{ - inMetaData.SetInstanceAsCanonical(inInstance, ComposerObjectTypes::Convert(inObjectType)); -} - -void ComposerTypeDefinitionsHelper::SetInstancePropertyValue(IDataCore &inDataCore, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const wchar_t *inPropValue) -{ - inDataCore.SetInstancePropertyValue(inInstance, inProperty, make_shared<CDataStr>(inPropValue)); -} - -void ComposerTypeDefinitionsHelper::DeriveInstance(IDataCore &inDataCore, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) -{ - inDataCore.DeriveInstance(inInstance, inParent); -} - -// Container object for all of the object definitions -SComposerObjectDefinitions::SComposerObjectDefinitions(IDataCore &inCore, IMetaData &inMetaData) - : m_Typed(inCore, inMetaData, inCore.CreateInstance()) - , m_Guided(inCore, inMetaData, inCore.CreateInstance()) - , m_Named(inCore, inMetaData, inCore.CreateInstance()) - , m_SlideOwner(inCore, inMetaData, inCore.CreateInstance()) - , m_Slide(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Named) - , m_Action(inCore, inMetaData, inCore.CreateInstance(), m_Typed) - , m_Asset(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Guided, m_Named) - , m_Scene(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset, m_SlideOwner) - , m_Image(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_MaterialBase(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_Lightmaps(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_MaterialBase) - , m_Material(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Lightmaps) - , m_CustomMaterial(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Lightmaps) - , m_ReferencedMaterial(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Lightmaps) - , m_Behavior(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_Effect(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_Node(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_Layer(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_Group(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_Model(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_Light(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_Camera(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_Component(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node, m_SlideOwner) - , m_Text(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_RenderPlugin(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_Alias(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_Path(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Node) - , m_PathAnchorPoint(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_SubPath(inCore, inMetaData, inCore.CreateInstance(), m_Typed, m_Asset) - , m_DataCore(inCore) -{ -} - -bool SComposerObjectDefinitions::IsA(Qt3DSDMInstanceHandle inInstance, - ComposerObjectTypes::Enum inType) -{ - if (m_DataCore.IsInstance(inInstance) == false) - return false; - - switch (inType) { -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - case ComposerObjectTypes::name: \ - return m_DataCore.IsInstanceOrDerivedFrom(inInstance, m_##name.m_Instance); - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - default: - break; - } - - QT3DS_ASSERT(false); - return false; -} - -// Could easily return None, meaning we can't identify the object type. -// Checks the type of the first derivation parent, so this won't ever return -// SlideOwner, for instance. -ComposerObjectTypes::Enum SComposerObjectDefinitions::GetType(Qt3DSDMInstanceHandle inInstance) -{ - if (m_DataCore.IsInstance(inInstance) == false) - return ComposerObjectTypes::Unknown; - - Qt3DSDMInstanceHandle theTargetInstance = inInstance; - TInstanceHandleList theHandleList; - m_DataCore.GetInstanceParents(inInstance, theHandleList); - if (theHandleList.empty() == false) - theTargetInstance = theHandleList[0]; - -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - if (m_##name.m_Instance == theTargetInstance) \ - return ComposerObjectTypes::name; - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - - return ComposerObjectTypes::Unknown; -} - -Qt3DSDMInstanceHandle -SComposerObjectDefinitions::GetInstanceForType(ComposerObjectTypes::Enum inType) -{ - switch (inType) { -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - case ComposerObjectTypes::name: \ - return m_##name.m_Instance; - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - default: - break; - } - - QT3DS_ASSERT(false); - return 0; -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMComposerTypeDefinitions.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMComposerTypeDefinitions.h deleted file mode 100644 index 1a079402..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMComposerTypeDefinitions.h +++ /dev/null @@ -1,956 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMDataTypes.h" -#include "foundation/Qt3DSOption.h" -#include "Qt3DSDMDataCore.h" -#include <utility> - -// Defines the minimal property model that UIComposer needs to -// run off of. -namespace qt3dsdm { -class IDataCore; -class IMetaData; -class ISlideCore; -class IPropertySystem; - -// Extensible macro definitions -// Enumerations *have* to be in derivation order -// else initialization of the SComposerObjectDefinitions class -// will fail catastrophically -// Specific type documentation is below -#define ITERATE_COMPOSER_OBJECT_TYPES \ - HANDLE_COMPOSER_OBJECT_TYPE(Typed, ITERATE_COMPOSER_TYPED_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Guided, ITERATE_COMPOSER_GUIDED_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Named, ITERATE_COMPOSER_NAMED_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(SlideOwner, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Slide, ITERATE_COMPOSER_SLIDE_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Action, ITERATE_COMPOSER_ACTION_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Asset, ITERATE_COMPOSER_ASSET_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Scene, ITERATE_COMPOSER_SCENE_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Image, ITERATE_COMPOSER_IMAGE_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(MaterialBase, ITERATE_COMPOSER_MATERIAL_BASE_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Lightmaps, ITERATE_COMPOSER_LIGHTMAP_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Material, ITERATE_COMPOSER_MATERIAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(CustomMaterial, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(ReferencedMaterial, \ - ITERATE_COMPOSER_REFERENCED_MATERIAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Behavior, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Effect, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Node, ITERATE_COMPOSER_NODE_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Layer, ITERATE_COMPOSER_LAYER_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Group, ITERATE_COMPOSER_GROUP_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Model, ITERATE_COMPOSER_MODEL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Light, ITERATE_COMPOSER_LIGHT_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Camera, ITERATE_COMPOSER_CAMERA_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Component, ITERATE_COMPOSER_COMPONENT_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Text, ITERATE_COMPOSER_TEXT_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(RenderPlugin, ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Alias, ITERATE_COMPOSER_ALIAS_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(Path, ITERATE_COMPOSER_PATH_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(PathAnchorPoint, ITERATE_COMPOSER_PATH_ANCHOR_POINT_PROPERTIES) \ - HANDLE_COMPOSER_OBJECT_TYPE(SubPath, ITERATE_COMPOSER_PATH_SUBPATH_PROPERTIES) - -#define ITERATE_COMPOSER_NO_ADDITIONAL_PROPERTIES - -#define ITERATE_COMPOSER_TYPED_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(type, m_TypeProp, TDataStrPtr, L"Typed") - -#define ITERATE_COMPOSER_GUIDED_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(id, m_GuidProp, SLong4, 0) - -#define ITERATE_COMPOSER_NAMED_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(name, m_NameProp, TDataStrPtr, L"Unnamed") - -#define ITERATE_COMPOSER_ASSET_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(sourcepath, m_SourcePath, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY(importid, m_ImportId, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY(importfile, m_ImportFile, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY(fileid, m_FileId, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY(starttime, m_StartTime, qt3ds::QT3DSI32, 0) \ - HANDLE_COMPOSER_PROPERTY(endtime, m_EndTime, qt3ds::QT3DSI32, 10000) \ - HANDLE_COMPOSER_PROPERTY(eyeball, m_Eyeball, bool, true) \ - HANDLE_COMPOSER_PROPERTY(shy, m_Shy, bool, false) \ - HANDLE_COMPOSER_PROPERTY(locked, m_Locked, bool, false) \ - HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(timebarcolor, m_TimebarColor, SFloat4) \ - HANDLE_COMPOSER_PROPERTY(timebartext, m_TimebarText, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_SCENE_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(bgcolorenable, m_BgColorEnable, bool, true) \ - HANDLE_COMPOSER_PROPERTY(backgroundcolor, m_BackgroundColor, SFloat4, SFloat4(0, 0, 0, 1)) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_COMPONENT_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_NODE_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(position, m_Position, SFloat3, SFloat3(0, 0, 0)) \ - HANDLE_COMPOSER_PROPERTY(rotation, m_Rotation, SFloat3, SFloat3(0, 0, 0)) \ - HANDLE_COMPOSER_PROPERTY(scale, m_Scale, SFloat3, SFloat3(1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(pivot, m_Pivot, SFloat3, SFloat3(0, 0, 0)) \ - HANDLE_COMPOSER_PROPERTY(opacity, m_Opacity, float, 100.f) \ - HANDLE_COMPOSER_PROPERTY(rotationorder, m_RotationOrder, TDataStrPtr, L"YXZ") \ - HANDLE_COMPOSER_PROPERTY(orientation, m_Orientation, TDataStrPtr, L"Left Handed") \ - HANDLE_COMPOSER_PROPERTY(boneid, m_BoneId, qt3ds::QT3DSI32, 0) \ - HANDLE_COMPOSER_PROPERTY(ignoresparent, m_IgnoresParent, bool, false) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_MODEL_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(shadowcaster, m_ShadowCaster, bool, true) \ - HANDLE_COMPOSER_PROPERTY(poseroot, m_PoseRoot, qt3ds::QT3DSI32, -1) \ - HANDLE_COMPOSER_PROPERTY(tessellation, m_Tessellation, TDataStrPtr, L"None") \ - HANDLE_COMPOSER_PROPERTY(edgetess, m_EdgeTess, float, 1.0) \ - HANDLE_COMPOSER_PROPERTY(innertess, m_InnerTess, float, 1.0) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_IMAGE_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(scaleu, m_RepeatU, float, 1.0f) \ - HANDLE_COMPOSER_PROPERTY(scalev, m_RepeatV, float, 1.0f) \ - HANDLE_COMPOSER_PROPERTY(mappingmode, m_TextureMapping, TDataStrPtr, L"UV Mapping") \ - HANDLE_COMPOSER_PROPERTY(tilingmodehorz, m_TilingU, TDataStrPtr, L"No Tiling") \ - HANDLE_COMPOSER_PROPERTY(tilingmodevert, m_TilingV, TDataStrPtr, L"No Tiling") \ - HANDLE_COMPOSER_PROPERTY(rotationuv, m_RotationUV, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(positionu, m_PositionU, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(positionv, m_PositionV, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(pivotu, m_PivotU, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(pivotv, m_PivotV, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(subpresentation, m_SubPresentation, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_LIGHTMAP_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(lightmapindirect, m_LightmapIndirect, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(lightmapradiosity, m_LightmapRadiosity, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(lightmapshadow, m_LightmapShadow, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_CUSTOM_MATERIAL_PROPERTIES \ - HANDLE_QT3DS_RENDER_PROPERTY(iblprobe, m_IblProbe, SLong4, 0) - -#define ITERATE_COMPOSER_MATERIAL_BASE_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(iblprobe, m_IblProbe, SLong4, 0) - -#define ITERATE_COMPOSER_MATERIAL_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(shaderlighting, m_ShaderLighting, TDataStrPtr, L"Vertex") \ - HANDLE_COMPOSER_PROPERTY(blendmode, m_BlendMode, TDataStrPtr, L"Normal") \ - HANDLE_COMPOSER_PROPERTY(diffuse, m_DiffuseColor, SFloat4, SFloat4(1, 1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(diffusemap, m_DiffuseMap1, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(diffusemap2, m_DiffuseMap2, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(diffusemap3, m_DiffuseMap3, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(specularreflection, m_SpecularReflection, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(specularamount, m_SpecularAmount, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(specularroughness, m_SpecularRoughness, float, 50.f) \ - HANDLE_COMPOSER_PROPERTY(roughnessmap, m_RoughnessMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(opacity, m_Opacity, float, 100.f) \ - HANDLE_COMPOSER_PROPERTY(opacitymap, m_OpacityMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(emissivecolor, m_EmissiveColor, SFloat4, SFloat4(1, 1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(emissivepower, m_EmissivePower, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(emissivemap, m_EmissiveMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(emissivemap2, m_EmissiveMap2, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(bumpmap, m_BumpMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(bumpamount, m_BumpAmount, float, 9.0f) \ - HANDLE_COMPOSER_PROPERTY(normalmap, m_NormalMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(displacementmap, m_DisplacementMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(displaceamount, m_DisplaceAmount, float, 0.5f) \ - HANDLE_COMPOSER_PROPERTY(translucencymap, m_TranslucencyMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(translucentfalloff, m_TranslucentFalloff, float, 1.f) \ - HANDLE_COMPOSER_PROPERTY(diffuselightwrap, m_DiffuseLightWrap, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(specularmap, m_SpecularMap, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(specularmodel, m_SpecularModel, TDataStrPtr, L"Default") \ - HANDLE_COMPOSER_PROPERTY(speculartint, m_SpecularTint, SFloat4, SFloat4(1, 1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(ior, m_IOR, float, 0) \ - HANDLE_COMPOSER_PROPERTY(fresnelPower, m_FresnelPower, float, 0) \ - HANDLE_COMPOSER_PROPERTY(vertexcolors, m_VertexColors, bool, false) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_REFERENCED_MATERIAL_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(referencedmaterial, m_ReferencedMaterial, SObjectRefType, L"") - -#define ITERATE_COMPOSER_LAYER_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(progressiveaa, m_ProgressiveAA, TDataStrPtr, L"None") \ - HANDLE_COMPOSER_PROPERTY(multisampleaa, m_MultisampleAA, TDataStrPtr, L"None") \ - HANDLE_COMPOSER_PROPERTY(temporalaa, m_TemporalAA, bool, false) \ - HANDLE_COMPOSER_PROPERTY(disabledepthtest, m_DisableDepthTest, bool, false) \ - HANDLE_COMPOSER_PROPERTY(disabledepthprepass, m_DisableDepthPrepass, bool, false) \ - HANDLE_COMPOSER_PROPERTY(background, m_Background, TDataStrPtr, L"Transparent") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(backgroundcolor, m_BackgroundColor, SFloat4, \ - SFloat4(0, 0, 0, 1)) \ - HANDLE_COMPOSER_PROPERTY(blendtype, m_BlendType, TDataStrPtr, L"Normal") \ - HANDLE_COMPOSER_PROPERTY(horzfields, m_HorizontalFieldValues, TDataStrPtr, L"Left/Width") \ - HANDLE_COMPOSER_PROPERTY(left, m_Left, float, 0) \ - HANDLE_COMPOSER_PROPERTY(leftunits, m_LeftUnits, TDataStrPtr, L"percent") \ - HANDLE_COMPOSER_PROPERTY(width, m_Width, float, 100.0f) \ - HANDLE_COMPOSER_PROPERTY(widthunits, m_WidthUnits, TDataStrPtr, L"percent") \ - HANDLE_COMPOSER_PROPERTY(right, m_Right, float, 0) \ - HANDLE_COMPOSER_PROPERTY(rightunits, m_RightUnits, TDataStrPtr, L"percent") \ - HANDLE_COMPOSER_PROPERTY(vertfields, m_VerticalFieldValues, TDataStrPtr, L"Top/Height") \ - HANDLE_COMPOSER_PROPERTY(top, m_Top, float, 0) \ - HANDLE_COMPOSER_PROPERTY(topunits, m_TopUnits, TDataStrPtr, L"percent") \ - HANDLE_COMPOSER_PROPERTY(height, m_Height, float, 100.0f) \ - HANDLE_COMPOSER_PROPERTY(heightunits, m_HeightUnits, TDataStrPtr, L"percent") \ - HANDLE_COMPOSER_PROPERTY(bottom, m_Bottom, float, 0) \ - HANDLE_COMPOSER_PROPERTY(bottomunits, m_BottomUnits, TDataStrPtr, L"percent") \ - HANDLE_COMPOSER_PROPERTY(aostrength, m_AoStrength, float, 0) \ - HANDLE_COMPOSER_PROPERTY(aodistance, m_AoDistance, float, 0) \ - HANDLE_COMPOSER_PROPERTY(aosoftness, m_AoSoftness, float, 0) \ - HANDLE_COMPOSER_PROPERTY(aobias, m_AoBias, float, 0) \ - HANDLE_COMPOSER_PROPERTY(aosamplerate, m_AoSamplerate, qt3ds::QT3DSI32, 1) \ - HANDLE_COMPOSER_PROPERTY(aodither, m_AoDither, bool, false) \ - HANDLE_COMPOSER_PROPERTY(shadowstrength, m_ShadowStrength, float, 0) \ - HANDLE_COMPOSER_PROPERTY(shadowdist, m_ShadowDist, float, 0) \ - HANDLE_COMPOSER_PROPERTY(shadowsoftness, m_ShadowSoftness, float, 0) \ - HANDLE_COMPOSER_PROPERTY(shadowbias, m_ShadowBias, float, 0) \ - HANDLE_COMPOSER_PROPERTY(lightprobe, m_LightProbe, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(probebright, m_ProbeBright, float, 100.0f) \ - HANDLE_COMPOSER_PROPERTY(fastibl, m_FastIbl, bool, true) \ - HANDLE_COMPOSER_PROPERTY(probehorizon, m_ProbeHorizon, float, -1) \ - HANDLE_COMPOSER_PROPERTY(probefov, m_ProbeFov, float, 180.0f) \ - HANDLE_COMPOSER_PROPERTY(lightprobe2, m_LightProbe2, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(probe2fade, m_Probe2Fade, float, 1) \ - HANDLE_COMPOSER_PROPERTY(probe2window, m_Probe2Window, float, 1) \ - HANDLE_COMPOSER_PROPERTY(probe2pos, m_Probe2Pos, float, 0.5f) \ - HANDLE_COMPOSER_PROPERTY(variants, m_variants, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_GROUP_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \ - -#define ITERATE_COMPOSER_LIGHT_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(lighttype, m_LightType, TDataStrPtr, L"Directional") \ - HANDLE_COMPOSER_PROPERTY(scope, m_Scope, SObjectRefType, L"") \ - HANDLE_COMPOSER_PROPERTY(lightdiffuse, m_LightColor, SFloat4, SFloat4(1, 1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(lightspecular, m_SpecularColor, SFloat4, SFloat4(1, 1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(lightambient, m_AmbientColor, SFloat4, SFloat4(0, 0, 0, 1)) \ - HANDLE_COMPOSER_PROPERTY(brightness, m_Brightness, float, 100.0f) \ - HANDLE_COMPOSER_PROPERTY(linearfade, m_LinearFade, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(expfade, m_ExpFade, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(areawidth, m_AreaWidth, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(areaheight, m_AreaHeight, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(castshadow, m_CastShadow, bool, false) \ - HANDLE_COMPOSER_PROPERTY(shdwbias, m_ShadowBias, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(shdwfactor, m_ShadowFactor, float, 5.0f) \ - HANDLE_COMPOSER_PROPERTY(shdwmapres, m_ShadowMapRes, qt3ds::QT3DSI32, 9) \ - HANDLE_COMPOSER_PROPERTY(shdwmapfar, m_ShadowMapFar, float, 5000.0f) \ - HANDLE_COMPOSER_PROPERTY(shdwmapfov, m_ShadowMapFov, float, 90.0f) \ - HANDLE_COMPOSER_PROPERTY(shdwfilter, m_ShadowFilter, float, 35.0f) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_CAMERA_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(orthographic, m_Orthographic, bool, false) \ - HANDLE_COMPOSER_PROPERTY(fov, m_Fov, float, 60.f) \ - HANDLE_COMPOSER_PROPERTY(fovhorizontal, m_FovHorizontal, bool, false) \ - HANDLE_COMPOSER_PROPERTY(clipnear, m_ClipNear, float, 10.f) \ - HANDLE_COMPOSER_PROPERTY(clipfar, m_ClipFar, float, 100000.f) \ - HANDLE_COMPOSER_PROPERTY(scalemode, m_ScaleMode, TDataStrPtr, L"Fit") \ - HANDLE_COMPOSER_PROPERTY(scaleanchor, m_ScaleAnchor, TDataStrPtr, L"Center") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_EDIT_CAMERA_PROPERTIES HANDLE_COMPOSER_PROPERTY(is3d, m_Is3d, bool, false) - -#define ITERATE_COMPOSER_TEXT_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(textstring, m_TextString, TDataStrPtr, L"Text") \ - HANDLE_COMPOSER_PROPERTY(textcolor, m_TextColor, SFloat4, SFloat4(1, 1, 1, 1)) \ - HANDLE_COMPOSER_PROPERTY(font, m_Font, TDataStrPtr, L"arial") \ - HANDLE_COMPOSER_PROPERTY(size, m_Size, float, 24.f) \ - HANDLE_COMPOSER_PROPERTY(horzalign, m_HorzAlign, TDataStrPtr, L"Center") \ - HANDLE_COMPOSER_PROPERTY(vertalign, m_VertAlign, TDataStrPtr, L"Middle") \ - HANDLE_COMPOSER_PROPERTY(leading, m_Leading, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(tracking, m_Tracking, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(dropshadow, m_DropShadow, bool, false) \ - HANDLE_COMPOSER_PROPERTY(dropshadowstrength, m_DropShadowStrength, float, 80.f) \ - HANDLE_COMPOSER_PROPERTY(dropshadowoffsetx, m_DropShadowOffsetX, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(dropshadowoffsety, m_DropShadowOffsetY, float, 0.f) \ - HANDLE_COMPOSER_PROPERTY(wordwrap, m_WordWrap, TDataStrPtr, L"WrapWord") \ - HANDLE_COMPOSER_PROPERTY(boundingbox, m_BoundingBox, SFloat2, SFloat2(0, 0)) \ - HANDLE_COMPOSER_PROPERTY(elide, m_Elide, TDataStrPtr, L"ElideNone") \ - HANDLE_COMPOSER_PROPERTY(enableacceleratedfont, m_EnableAcceleratedFont, bool, false) \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(variants, m_variants, TDataStrPtr, L"") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_SLIDE_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(componentid, m_ComponentId, SLong4, 0) \ - HANDLE_COMPOSER_PROPERTY(playmode, m_PlayMode, TDataStrPtr, L"Looping") \ - HANDLE_COMPOSER_PROPERTY(playthroughto, m_PlaythroughTo, SStringOrInt, L"Next") \ - HANDLE_COMPOSER_PROPERTY(initialplaystate, m_InitialPlayState, TDataStrPtr, L"Play") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_ACTION_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(actioneyeball, m_ActionEyeball, bool, true) - -#define ITERATE_COMPOSER_ALIAS_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(referencednode, m_ReferencedNode, SObjectRefType, L"") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_PATH_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(pathtype, m_PathType, TDataStrPtr, L"Geometry") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(width, m_Width, float, 5.0f) \ - HANDLE_COMPOSER_PROPERTY(linearerror, m_LinearError, float, 10) \ - HANDLE_COMPOSER_PROPERTY(edgetessamount, m_EdgeTessAmount, float, 8) \ - HANDLE_COMPOSER_PROPERTY(innertessamount, m_InnerTessAmount, float, 8) \ - HANDLE_COMPOSER_PROPERTY(begincap, m_BeginCap, TDataStrPtr, L"None") \ - HANDLE_COMPOSER_PROPERTY(begincapoffset, m_BeginCapOffset, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(begincapopacity, m_BeginCapOpacity, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(begincapwidth, m_BeginCapWidth, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(endcap, m_EndCap, TDataStrPtr, L"None") \ - HANDLE_COMPOSER_PROPERTY(endcapoffset, m_EndCapOffset, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(endcapopacity, m_EndCapOpacity, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(endcapwidth, m_EndCapWidth, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(paintstyle, m_PaintStyle, TDataStrPtr, L"Stroked") \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(controlledproperty, m_ControlledProperty, TDataStrPtr, L"") - -#define ITERATE_COMPOSER_PATH_ANCHOR_POINT_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY_DUPLICATE(position, m_Position, SFloat2, SFloat2(0.0f, 0.0f)) \ - HANDLE_COMPOSER_PROPERTY(incomingangle, m_IncomingAngle, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(incomingdistance, m_IncomingDistance, float, 0.0f) \ - HANDLE_COMPOSER_PROPERTY(outgoingdistance, m_OutgoingDistance, float, 0.0f) - -#define ITERATE_COMPOSER_PATH_SUBPATH_PROPERTIES \ - HANDLE_COMPOSER_PROPERTY(closed, m_Closed, bool, true) - -struct ComposerObjectTypes -{ - enum Enum { - Unknown = 0, -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) name, - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - ControllableObject - }; - static const wchar_t *Convert(ComposerObjectTypes::Enum inType); - static ComposerObjectTypes::Enum Convert(const wchar_t *inType); - static ComposerObjectTypes::Enum Convert(const char8_t *inType); -}; - -struct ComposerPropertyNames -{ - enum Enum { - Unknown = 0, -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, type) name, -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, type, defaultValue) -#define HANDLE_COMPOSER_PROPERTY(name, memberName, type, defaultValue) name, -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) propmacro - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - }; - - static const wchar_t *Convert(ComposerPropertyNames::Enum inType); - static ComposerPropertyNames::Enum Convert(const wchar_t *inType); - static const char8_t *ConvertNarrow(ComposerPropertyNames::Enum inType); - static ComposerPropertyNames::Enum Convert(const char8_t *inType); -}; - -template <typename TDataType> -struct TypeToDataTypeMap -{ - bool force_compile_error; -}; -template <DataModelDataType::Value TEnum> -struct DataTypeToTypeMap -{ - bool force_compile_error; -}; - -#define QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(enumName, type) \ - template <> \ - struct TypeToDataTypeMap<type> \ - { \ - static DataModelDataType::Value GetDataType() { return enumName; } \ - }; \ - template <> \ - struct DataTypeToTypeMap<enumName> \ - { \ - typedef type TDataType; \ - }; - -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float, float) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float2, SFloat2) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float3, SFloat3) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Float4, SFloat4) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Long, qt3ds::QT3DSI32) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::String, TDataStrPtr) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Bool, bool) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::Long4, SLong4) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::StringRef, SStringRef) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::StringOrInt, SStringOrInt) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::ObjectRef, SObjectRefType) -QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE(DataModelDataType::FloatList, TFloatList) - -#undef QT3DSDM_DEFINE_TYPE_TO_DATA_TYPE - -template <typename TDataType> -inline DataModelDataType::Value TypeToDataType() -{ - return TypeToDataTypeMap<TDataType>::GetDataType(); -} - -template <ComposerPropertyNames::Enum TPropName, typename TDataType> -struct SComposerPropertyDefinition -{ - qt3ds::foundation::Option<TDataType> m_DefaultValue; - Qt3DSDMPropertyHandle m_Property; - SComposerPropertyDefinition(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance, - const TDataType &inDefault) - : m_DefaultValue(inDefault) - { - QT3DSDM_LOG_FUNCTION("SComposerPropertyDefinition-1"); - m_Property = inDataCore.AddProperty(inInstance, ComposerPropertyNames::Convert(TPropName), - TypeToDataType<TDataType>()); - if (m_DefaultValue.hasValue()) - inDataCore.SetInstancePropertyValue(inInstance, m_Property, m_DefaultValue.getValue()); - } - SComposerPropertyDefinition(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance) - { - QT3DSDM_LOG_FUNCTION("SComposerPropertyDefinition-2"); - m_Property = inDataCore.AddProperty(inInstance, ComposerPropertyNames::Convert(TPropName), - TypeToDataType<TDataType>()); - } - operator Qt3DSDMPropertyHandle() const { return m_Property; } -}; - -// Define all the objects with their properties - -template <ComposerObjectTypes::Enum> -struct SComposerTypePropertyDefinition -{ - bool force_compile_error; -}; - -#define HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, dtype) \ - SComposerPropertyDefinition<ComposerPropertyNames::name, dtype> memberName; - -#define HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue) \ - HANDLE_COMPOSER_PROPERTY_NO_DEFAULT(name, memberName, dtype) -#define HANDLE_COMPOSER_PROPERTY_DUPLICATE(name, memberName, dtype, defaultValue) \ - HANDLE_COMPOSER_PROPERTY(name, memberName, dtype, defaultValue) - -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - template <> \ - struct SComposerTypePropertyDefinition<ComposerObjectTypes::name> \ - { \ - bool reserved; \ - propmacro SComposerTypePropertyDefinition(IDataCore &inCore, \ - Qt3DSDMInstanceHandle inInstance); \ - }; - -ITERATE_COMPOSER_OBJECT_TYPES - -#undef HANDLE_COMPOSER_OBJECT_TYPE -#undef HANDLE_COMPOSER_PROPERTY -#undef HANDLE_COMPOSER_PROPERTY_NO_DEFAULT -#undef HANDLE_COMPOSER_PROPERTY_DUPLICATE - -struct ComposerTypeDefinitionsHelper -{ - // Functions here so we don't have to include UICDMDataCore.h or UICDMMetaData.h - static void SetInstanceAsCanonical(IMetaData &inMetaData, Qt3DSDMInstanceHandle inInstance, - ComposerObjectTypes::Enum inObjectType); - static void SetInstancePropertyValue(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const wchar_t *inPropValue); - static void DeriveInstance(IDataCore &inDataCore, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent); -}; - -template <ComposerObjectTypes::Enum TEnumType> -struct SComposerBaseObjectDefinition : public SComposerTypePropertyDefinition<TEnumType> -{ - Qt3DSDMInstanceHandle m_Instance; - SComposerBaseObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance) - : SComposerTypePropertyDefinition<TEnumType>(inCore, inInstance) - , m_Instance(inInstance) - { - QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition"); - ComposerTypeDefinitionsHelper::SetInstanceAsCanonical(inMetaData, inInstance, TEnumType); - } - - template <ComposerObjectTypes::Enum TBaseType> - void Derive(IDataCore &inCore, const SComposerBaseObjectDefinition<TBaseType> &inParent) - { - QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition::Derive"); - ComposerTypeDefinitionsHelper::DeriveInstance(inCore, m_Instance, inParent.m_Instance); - } - void SetType(IDataCore &inCore, - const SComposerBaseObjectDefinition<ComposerObjectTypes::Typed> &inParent) - { - QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition::SetInstancePropertyValue"); - ComposerTypeDefinitionsHelper::SetInstancePropertyValue( - inCore, m_Instance, inParent.m_TypeProp, ComposerObjectTypes::Convert(TEnumType)); - } - void TypedDerive(IDataCore &inCore, - const SComposerBaseObjectDefinition<ComposerObjectTypes::Typed> &inParent) - { - QT3DSDM_LOG_FUNCTION("SComposerBaseObjectDefinition::TypedDerive"); - Derive(inCore, inParent); - SetType(inCore, inParent); - } -}; - -template <ComposerObjectTypes::Enum TEnumType> -struct SComposerObjectDefinition : public SComposerBaseObjectDefinition<TEnumType> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance) - : SComposerBaseObjectDefinition<TEnumType>(inCore, inMetaData, inInstance) - { - } -}; - -// Base class of slides -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Slide> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Slide> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Named> &inNamed) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Slide>(inCore, inMetaData, inInstance) - { - TypedDerive(inCore, inTyped); - Derive(inCore, inNamed); - } -}; - -// Base class of actions -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Action> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Action> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Action>(inCore, inMetaData, inInstance) - { - TypedDerive(inCore, inTyped); - } -}; - -// Base class of assets -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Asset> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Asset> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Guided> &inGuided, - SComposerObjectDefinition<ComposerObjectTypes::Named> &inNamed) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Asset>(inCore, inMetaData, inInstance) - { - TypedDerive(inCore, inTyped); - Derive(inCore, inGuided); - Derive(inCore, inNamed); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Scene> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Scene> -{ - SComposerObjectDefinition( - IDataCore &inCore, IMetaData &inMetaData, Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset, - SComposerObjectDefinition<ComposerObjectTypes::SlideOwner> &inSlideOwner) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Scene>(inCore, inMetaData, inInstance) - { - Derive(inCore, inAsset); - Derive(inCore, inSlideOwner); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Image> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Image> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Image>(inCore, inMetaData, inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::MaterialBase> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::MaterialBase> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::MaterialBase>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Lightmaps> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::MaterialBase> &inBase) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Lightmaps>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inBase); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Material> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Material> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> &inBase) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Material>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inBase); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::CustomMaterial> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::CustomMaterial> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> &inBase) - : SComposerBaseObjectDefinition<ComposerObjectTypes::CustomMaterial>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inBase); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::ReferencedMaterial> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::ReferencedMaterial> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Lightmaps> &inBase) - : SComposerBaseObjectDefinition<ComposerObjectTypes::ReferencedMaterial>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inBase); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Behavior> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Behavior> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Behavior>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Effect> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Effect> - -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Effect>(inCore, inMetaData, inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Node> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Node> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Node>(inCore, inMetaData, inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Layer> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Layer> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Layer>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Model> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Model> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Model>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Group> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Group> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Group>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Light> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Light> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Light>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Camera> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Camera> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Camera>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Text> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Text> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Text>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Component> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Component> -{ - SComposerObjectDefinition( - IDataCore &inCore, IMetaData &inMetaData, Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode, - SComposerObjectDefinition<ComposerObjectTypes::SlideOwner> &inSlideOwner) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Component>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inNode); - Derive(inCore, inSlideOwner); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::RenderPlugin> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::RenderPlugin> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::RenderPlugin>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Alias> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Alias> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Alias>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::Path> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::Path> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Node> &inNode) - : SComposerBaseObjectDefinition<ComposerObjectTypes::Path>(inCore, inMetaData, inInstance) - { - Derive(inCore, inNode); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::PathAnchorPoint> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::PathAnchorPoint> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::PathAnchorPoint>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -template <> -struct SComposerObjectDefinition<ComposerObjectTypes::SubPath> - : public SComposerBaseObjectDefinition<ComposerObjectTypes::SubPath> -{ - SComposerObjectDefinition(IDataCore &inCore, IMetaData &inMetaData, - Qt3DSDMInstanceHandle inInstance, - SComposerObjectDefinition<ComposerObjectTypes::Typed> &inTyped, - SComposerObjectDefinition<ComposerObjectTypes::Asset> &inAsset) - : SComposerBaseObjectDefinition<ComposerObjectTypes::SubPath>(inCore, inMetaData, - inInstance) - { - Derive(inCore, inAsset); - SetType(inCore, inTyped); - } -}; - -// Container object for all of the object definitions -class SComposerObjectDefinitions -{ -public: -#define HANDLE_COMPOSER_OBJECT_TYPE(name, propmacro) \ - SComposerObjectDefinition<ComposerObjectTypes::name> m_##name; - ITERATE_COMPOSER_OBJECT_TYPES -#undef HANDLE_COMPOSER_OBJECT_TYPE - - SComposerObjectDefinitions(IDataCore &inDataCore, IMetaData &inMetaData); - SComposerObjectDefinitions() = default; - ~SComposerObjectDefinitions() = default; - - // RTTI API - bool IsA(Qt3DSDMInstanceHandle inInstance, ComposerObjectTypes::Enum inType); - // Could easily return None, meaning we can't identify the object type. - // Checks the type of the first derivation parent, so this won't ever return - // SlideOwner, for instance. - ComposerObjectTypes::Enum GetType(Qt3DSDMInstanceHandle inInstance); - - Qt3DSDMInstanceHandle GetInstanceForType(ComposerObjectTypes::Enum inType); -private: - IDataCore &m_DataCore; - SComposerObjectDefinitions(const SComposerObjectDefinitions&) = delete; - SComposerObjectDefinitions& operator=(const SComposerObjectDefinitions&) = delete; -}; -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMDataCore.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMDataCore.h deleted file mode 100644 index 793cddb4..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMDataCore.h +++ /dev/null @@ -1,320 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_DATACORE_H -#define QT3DSDM_DATACORE_H -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMPropertyDefinition.h" -#include "HandleSystemBase.h" -#include "Qt3DSDMMetaData.h" -#include "Qt3DSDMValue.h" - -namespace qt3dsdm { - -typedef std::pair<Qt3DSDMPropertyHandle, SValue> TPropertyHandleValuePair; -typedef std::vector<TPropertyHandleValuePair> TPropertyHandleValuePairList; - -class IInstancePropertyCore -{ -public: - virtual ~IInstancePropertyCore() {} - - /** - * Find a given instance property by name. May return an invalid handle. - */ - virtual Qt3DSDMPropertyHandle - GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const = 0; - /** - * Get the entire list of instance properties; - */ - virtual void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const = 0; - // Get the properties that are stored only on this instance, not on any parents. - virtual void GetSpecificInstancePropertyValues(Qt3DSDMInstanceHandle inHandle, - TPropertyHandleValuePairList &outValues) = 0; - /** - * Return true if this property is on this instance or one of its parents. - */ - virtual bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - - /** - * Does this value match the approperty property type. - * error - PropertyNotFound - * error - ValueTypeError - */ - virtual void CheckValue(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) const = 0; - /** - * Get this property from this instance. This includes looking up the default value. If the - *instance doesn't have the property - * and it has no default the return value is false. - * error - InstanceNotFound - * error - PropertyNotFound if this property doesn't exist on this instance or doesn't exist. - */ - virtual bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - /** - * Set this property on this instance. - * error - InstanceNotFound - * error - PropertyNotFound if this property doesn't exist on this instance or doesn't exist. - * error - ValueTypeError if this value is of the wrong type - */ - virtual void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; -}; - -typedef std::shared_ptr<IInstancePropertyCore> TInstancePropertyCorePtr; - -class IStringTable; - -/** - * Primary interface to data model system. This allows you to define 'classes', which are - *really just - * collections of properties, and instances of those classes. A zero handle value is regarded - *as empty. - */ -class IDataCore : public IHandleBase, public IInstancePropertyCore -{ -public: - virtual ~IDataCore() {} - - // Bookkeeping - virtual IStringTable &GetStringTable() const = 0; - virtual std::shared_ptr<IStringTable> GetStringTablePtr() const = 0; - - //=============================================================== - // Instances - //=============================================================== - /** - * Create a new instance of a class. Instances can be named, in which case - * they are sometimes treated differently when serialized. If the name is null - * or has no length then it is ignored. If the name is non-null, then a check is - * run as named instances must have unique names. When a named instance is a parent - * of another instance, only its name is serialized out; not its handle thus you can safely - * use names as inter-application instance handles. - * May use a target id to specify what the ideal id is; id must not exist. - * - error DuplicateInstanceName - */ - virtual Qt3DSDMInstanceHandle - CreateInstance(Qt3DSDMInstanceHandle inTargetId = Qt3DSDMInstanceHandle()) = 0; - /** - * Delete an instance. - * error - InstanceNotFound - */ - virtual void DeleteInstance(Qt3DSDMInstanceHandle inHandle) = 0; - /** - * Return all the instances in the system. - */ - virtual void GetInstances(TInstanceHandleList &outInstances) const = 0; - /** - * Return all the instances in the system that is derived from parent. - */ - virtual void GetInstancesDerivedFrom(TInstanceHandleList &outInstances, - Qt3DSDMInstanceHandle inParentHandle) const = 0; - - //=============================================================== - // Instance Derivation - //=============================================================== - /** - * Derive an instance from another instance. This implies a rebuild of - * the aggregate properties of a given instance. - * error - InstanceNotFound if either instance or parent aren't found - */ - virtual void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) = 0; - /** - * Return a count of the parent's of a given instance. - * error - InstanceNotFound - */ - virtual void GetInstanceParents(Qt3DSDMInstanceHandle inHandle, - TInstanceHandleList &outParents) const = 0; - - /** - * Returns true if the instance is derived from the parent somehow. - */ - virtual bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const = 0; - //=============================================================== - - //=============================================================== - // Class Properties - //=============================================================== - /** - * Add a new property to a given instances. You can use this to overshadow properties - * on base instances but you can't add two properties of the same name to a given - * instance. - * error - InstanceNotFound - * error - PropertyExists if the property already exists on this class - * error - ValueTypeError if the default value exists and is if a different type than - *inPropType - */ - virtual Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName, - DataModelDataType::Value inPropType) = 0; - /** - * Return the property definition that corresponds to a given property value. - */ - virtual const Qt3DSDMPropertyDefinition &GetProperty(Qt3DSDMPropertyHandle inProperty) const = 0; - /** - * Return the properties specific to this instance, not including properties - * gained by derivation - */ - virtual void GetInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const = 0; - /** - * Remove a property from an instance. Instances will no long have this property accessible - *nor will - * child instances. - */ - virtual void RemoveProperty(Qt3DSDMPropertyHandle inProperty) = 0; - /** - * Copy properties (definitions & values) specific to one instance, not including properties - * gained by derivation, to another instance. - */ - virtual void CopyInstanceProperties(Qt3DSDMInstanceHandle inSrcInstance, - Qt3DSDMInstanceHandle inDestInstance) = 0; - /** - * Removed cached intermediate values from the instance. DataModel pull properties from the - *inheritance hierarchy chain - * up to the current instance when someone requests a property in order to make the next - *request quicker. This breaks - * some forms of updating where a parent's default value gets changed and the instance won't - *reflect it (until you - * save/load the file). - */ - //=============================================================== - virtual void RemoveCachedValues(Qt3DSDMInstanceHandle inInstance) = 0; - - //=============================================================== - // Handle validation - //=============================================================== - /** - * Is valid and is instances - */ - virtual bool IsInstance(int inHandle) const = 0; - /** - * is valid and is property - */ - virtual bool IsProperty(int inHandle) const = 0; -}; - -typedef std::shared_ptr<IDataCore> TDataCorePtr; - -class IPropertySystem : public IHandleBase -{ -public: - virtual ~IPropertySystem() {} - - virtual Qt3DSDMInstanceHandle CreateInstance() = 0; - virtual void DeleteInstance(Qt3DSDMInstanceHandle inHandle) = 0; - virtual void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) = 0; - - virtual void GetInstances(TInstanceHandleList &outInstances) const = 0; - - virtual Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName, - DataModelDataType::Value inPropType) = 0; - - virtual Qt3DSDMPropertyHandle - GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const = 0; - virtual void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const = 0; - virtual bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - - virtual bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - virtual void SetInstancePropertyValue(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - virtual bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const = 0; - - virtual DataModelDataType::Value GetDataType(Qt3DSDMPropertyHandle inProperty) const = 0; - virtual TCharStr GetName(Qt3DSDMPropertyHandle inProperty) const = 0; - virtual TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - virtual AdditionalMetaDataType::Value - GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - virtual TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - virtual Qt3DSDMInstanceHandle GetPropertyOwner(Qt3DSDMPropertyHandle inProperty) const = 0; - - virtual QVector<Qt3DSDMPropertyHandle> GetControllableProperties( - Qt3DSDMInstanceHandle inInst) const = 0; - -}; -typedef std::shared_ptr<IPropertySystem> TPropertySystemPtr; - -template <typename TCoreType> -inline SValue GetInstancePropertyValue(TCoreType inCore, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - SValue retval; - if (!inCore->GetInstancePropertyValue(inInstance, inProperty, retval)) - throw PropertyNotFound(L""); - return retval; -} - -template <typename TDataType, typename TCoreType> -inline TDataType GetSpecificInstancePropertyValue(TCoreType inDataCore, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - return qt3dsdm::get<TDataType>(GetInstancePropertyValue(inDataCore, inInstance, inProperty)); -} - -template <typename TDataType, typename TCoreType> -inline TDataType GetNamedInstancePropertyValue(TCoreType inDataCore, - Qt3DSDMInstanceHandle inInstance, - const TCharStr &inName) -{ - Qt3DSDMPropertyHandle theProperty = - inDataCore->GetAggregateInstancePropertyByName(inInstance, inName); - return GetSpecificInstancePropertyValue<TDataType, TCoreType>(inDataCore, inInstance, - theProperty); -} - -inline Qt3DSDMPropertyHandle AddPropertyWithValue(IPropertySystem &inPropertySystem, - Qt3DSDMInstanceHandle inInstance, TCharPtr inName, - DataModelDataType::Value inDataType, - const SValue &inValue) -{ - Qt3DSDMPropertyHandle theProperty(inPropertySystem.AddProperty(inInstance, inName, inDataType)); - inPropertySystem.SetInstancePropertyValue(inInstance, theProperty, inValue); - return theProperty; -} -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMDataTypes.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMDataTypes.h deleted file mode 100644 index 7a7157f6..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMDataTypes.h +++ /dev/null @@ -1,891 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_DATA_H -#define QT3DSDM_DATA_H - -#include <memory> -#include <functional> - -#include "Qt3DSDMErrors.h" -#include "Qt3DSDMStringTable.h" -#include "Qt3DSDMWindowsCompatibility.h" -#include <stdexcept> -#include <vector> -#include <map> -#include <set> -#include <EABase/eabase.h> //char8_t, etc. -#include <EASTL/string.h> -#include <EASTL/vector.h> -#include "foundation/StrConvertUTF.h" -#include "foundation/Qt3DSDiscriminatedUnion.h" - -#include <QObject> - -namespace qt3dsdm { - -typedef const wchar_t *TCharPtr; -struct Qt3DSDMStr : public eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> -{ - typedef qt3ds::foundation::TWCharEASTLConverter::TCharType TCharType; - typedef eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> TStrType; - Qt3DSDMStr() {} - Qt3DSDMStr(const wchar_t *inStr) - : TStrType(qt3ds::NVUnionCast<const TCharType *>(inStr)) - { - } - Qt3DSDMStr(const TStrType &inOther) - : TStrType(inOther) - { - } - - const wchar_t *wide_str() const { return reinterpret_cast<const wchar_t *>(c_str()); } - bool operator==(const Qt3DSDMStr &inOther) const { return TStrType::compare(inOther) == 0; } - bool operator!=(const Qt3DSDMStr &inOther) const { return TStrType::compare(inOther) != 0; } - bool operator==(const wchar_t *inOther) const - { - return TStrType::compare(reinterpret_cast<const TCharType *>(inOther)) == 0; - } - bool operator!=(const wchar_t *inOther) const - { - return TStrType::compare(reinterpret_cast<const TCharType *>(inOther)) != 0; - } - - TStrType::size_type find_first_of(const wchar_t *p, size_type position = 0) const - { - return TStrType::find_first_of(reinterpret_cast<const TCharType *>(p), position); - } - TStrType::size_type find_first_not_of(const wchar_t *p, size_type position = 0) const - { - return TStrType::find_first_not_of(reinterpret_cast<const TCharType *>(p), position); - } - TStrType::size_type find_last_not_of(const wchar_t *p, - size_type position = TStrType::npos) const - { - return TStrType::find_last_not_of(reinterpret_cast<const TCharType *>(p), position); - } - TStrType::size_type find(const wchar_t *p, size_type position = 0) const - { - return TStrType::find(reinterpret_cast<const TCharType *>(p), position); - } - TStrType::size_type find(wchar_t p, size_type position = 0) const - { - return TStrType::find(static_cast<TCharType>(p), position); - } - TStrType::size_type rfind(const wchar_t *p, size_type position = TStrType::npos) const - { - return TStrType::rfind(reinterpret_cast<const TCharType *>(p), position); - } - TStrType::size_type rfind(wchar_t p, size_type position = TStrType::npos) const - { - return TStrType::rfind(p, position); - } - Qt3DSDMStr replace(size_type position, size_type length, const wchar_t *inNewStr) - { - return TStrType::replace(position, length, reinterpret_cast<const TCharType *>(inNewStr)); - } - - void append(const wchar_t *p) { TStrType::append(reinterpret_cast<const TCharType *>(p)); } - void append(const wchar_t *p, size_type position, size_type n) - { - TStrType::append(reinterpret_cast<const TCharType *>(p), position, n); - } - void append(const Qt3DSDMStr &p) { TStrType::append(p); } - void assign(const wchar_t *p) { TStrType::assign(reinterpret_cast<const TCharType *>(p)); } - void assign(const Qt3DSDMStr &p) { TStrType::assign(p); } -}; -typedef Qt3DSDMStr TCharStr; -typedef std::vector<wchar_t> TCharList; -typedef eastl::vector<TCharStr> TCharStrList; -typedef std::map<TCharStr, int> TCharStrIntMap; -typedef std::map<int, TCharStr> TIntTCharStrMap; -typedef std::vector<int> TIntList; -typedef std::set<int> TIntSet; -typedef eastl::vector<float> TFloatList; - -template <typename TDataType> -class CImmutableVector : private std::vector<TDataType> -{ -public: - typedef std::vector<TDataType> base; - - CImmutableVector(const std::vector<TDataType> &inSrc) - : base(inSrc) - { - } - CImmutableVector(const CImmutableVector &inSrc) - : base(inSrc) - { - } - - CImmutableVector &operator=(const CImmutableVector &inSrc) - { - base::operator=(inSrc); - return *this; - } - - typename std::vector<TDataType>::const_iterator begin() const { return base::begin(); } - typename std::vector<TDataType>::const_iterator end() const { return base::end(); } - - size_t size() const { return base::size(); } - - const TDataType &at(int inIndex) const { return base::at(inIndex); } - const TDataType &operator[](int inIndex) const { return base::at(inIndex); } -}; - -typedef CImmutableVector<TCharStr> TImmutableCharStrList; -typedef std::shared_ptr<TImmutableCharStrList> TImmutableCharStrListPtr; - -class CDataStr -{ - TCharList m_Data; - -public: - CDataStr() {} - CDataStr(TCharList &inData) { m_Data.swap(inData); } - CDataStr(const wchar_t *inData) - { - if (inData && *inData) - m_Data.insert(m_Data.begin(), inData, inData + wcslen(inData)); - m_Data.push_back(0); - } - CDataStr(const wchar_t *inData, size_t inLen) - { - if (inData && *inData) - m_Data.insert(m_Data.begin(), inData, inData + inLen); - if (m_Data.size() > 0 && m_Data.back() != 0) - m_Data.push_back(0); - } - CDataStr(const CDataStr &inOther) - : m_Data(inOther.m_Data) - { - } - virtual ~CDataStr() {} - - CDataStr &operator=(const CDataStr &inOther) - { - m_Data = inOther.m_Data; - return *this; - } - const wchar_t *GetData() const { return m_Data.size() <= 1 ? L"" : &(*m_Data.begin()); } - size_t GetLength() const { return m_Data.size() > 1 ? m_Data.size() - 1 : 0; } - bool operator==(const CDataStr &inOther) const { return m_Data == inOther.m_Data; } - QString toQString() const { return QString::fromWCharArray(GetData()); } -}; - -typedef std::shared_ptr<CDataStr> TDataStrPtr; - -struct SFloat2 -{ - float m_Floats[2]; - SFloat2(float f1 = 0, float f2 = 0) - { - m_Floats[0] = f1; - m_Floats[1] = f2; - } - SFloat2(const SFloat2 &inOther) { operator=(inOther); } - SFloat2 &operator=(const SFloat2 &inOther) - { - m_Floats[0] = inOther.m_Floats[0]; - m_Floats[1] = inOther.m_Floats[1]; - return *this; - } - bool operator==(const SFloat2 &other) const - { - return m_Floats[0] == other.m_Floats[0] && m_Floats[1] == other.m_Floats[1]; - } - float &operator[](size_t inIndex) - { - switch (inIndex) { - default: - throw std::out_of_range(""); - case 0: - case 1: - return m_Floats[inIndex]; - } - } - const float &operator[](size_t inIndex) const - { - switch (inIndex) { - default: - throw std::out_of_range(""); - case 0: - case 1: - return m_Floats[inIndex]; - } - } -}; - -struct SFloat3 -{ - float m_Floats[3]; - - SFloat3(float f1 = 0, float f2 = 0, float f3 = 0) - { - m_Floats[0] = f1; - m_Floats[1] = f2; - m_Floats[2] = f3; - } - SFloat3(const SFloat3 &inOther) { operator=(inOther); } - SFloat3 &operator=(const SFloat3 &inOther) - { - m_Floats[0] = inOther.m_Floats[0]; - m_Floats[1] = inOther.m_Floats[1]; - m_Floats[2] = inOther.m_Floats[2]; - return *this; - } - - bool operator==(const SFloat3 &other) const - { - return m_Floats[0] == other.m_Floats[0] && m_Floats[1] == other.m_Floats[1] - && m_Floats[2] == other.m_Floats[2]; - } - - float &operator[](size_t inIndex) - { - switch (inIndex) { - default: - throw std::out_of_range(""); - case 0: - case 1: - case 2: - return m_Floats[inIndex]; - } - } - const float &operator[](size_t inIndex) const - { - switch (inIndex) { - default: - throw std::out_of_range(""); - case 0: - case 1: - case 2: - return m_Floats[inIndex]; - } - } -}; - -struct SFloat4 -{ - float m_Floats[4]; - - SFloat4(float f1 = 0, float f2 = 0, float f3 = 0, float f4 = 1) - { - m_Floats[0] = f1; - m_Floats[1] = f2; - m_Floats[2] = f3; - m_Floats[3] = f4; - } - SFloat4(const SFloat4 &inOther) { operator=(inOther); } - SFloat4 &operator=(const SFloat4 &inOther) - { - m_Floats[0] = inOther.m_Floats[0]; - m_Floats[1] = inOther.m_Floats[1]; - m_Floats[2] = inOther.m_Floats[2]; - m_Floats[3] = inOther.m_Floats[3]; - return *this; - } - - bool operator==(const SFloat4 &other) const - { - return m_Floats[0] == other.m_Floats[0] && m_Floats[1] == other.m_Floats[1] - && m_Floats[2] == other.m_Floats[2] && m_Floats[3] == other.m_Floats[3]; - } - - float &operator[](size_t inIndex) - { - if (inIndex < 4) - return m_Floats[inIndex]; - - throw std::out_of_range(""); - } - const float &operator[](size_t inIndex) const - { - if (inIndex < 4) - return m_Floats[inIndex]; - - throw std::out_of_range(""); - } -}; - -struct SLong4 -{ - qt3ds::QT3DSU32 m_Longs[4]; - - SLong4(qt3ds::QT3DSU32 l1 = 0, - qt3ds::QT3DSU32 l2 = 0, - qt3ds::QT3DSU32 l3 = 0, - qt3ds::QT3DSU32 l4 = 0) - { - m_Longs[0] = l1; - m_Longs[1] = l2; - m_Longs[2] = l3; - m_Longs[3] = l4; - } - SLong4(const SLong4 &inOther) { operator=(inOther); } - SLong4 &operator=(const SLong4 &inOther) - { - m_Longs[0] = inOther.m_Longs[0]; - m_Longs[1] = inOther.m_Longs[1]; - m_Longs[2] = inOther.m_Longs[2]; - m_Longs[3] = inOther.m_Longs[3]; - return *this; - } - - bool operator==(const SLong4 &other) const - { - return m_Longs[0] == other.m_Longs[0] && m_Longs[1] == other.m_Longs[1] - && m_Longs[2] == other.m_Longs[2] && m_Longs[3] == other.m_Longs[3]; - } - - bool operator<(const SLong4 &other) const - { - if (m_Longs[0] < other.m_Longs[0]) - return true; - else if (m_Longs[0] == other.m_Longs[0]) { - if (m_Longs[1] < other.m_Longs[1]) - return true; - else if (m_Longs[1] == other.m_Longs[1]) { - if (m_Longs[2] < other.m_Longs[2]) - return true; - else if (m_Longs[3] < other.m_Longs[3]) - return true; - } - } - return false; - } - - bool Valid() const - { - bool retval = false; - for (int idx = 0; idx < 4; ++idx) - retval = retval || m_Longs[0] > 0; - return retval; - } -}; - -typedef std::vector<SLong4> TLong4Vec; - -struct SSizet4 -{ - size_t m_Longs[4]; - - SSizet4(size_t l1 = 0, size_t l2 = 0, size_t l3 = 0, size_t l4 = 0) - { - m_Longs[0] = l1; - m_Longs[1] = l2; - m_Longs[2] = l3; - m_Longs[3] = l4; - } - SSizet4(const SSizet4 &inOther) { operator=(inOther); } - SSizet4 &operator=(const SSizet4 &inOther) - { - m_Longs[0] = inOther.m_Longs[0]; - m_Longs[1] = inOther.m_Longs[1]; - m_Longs[2] = inOther.m_Longs[2]; - m_Longs[3] = inOther.m_Longs[3]; - return *this; - } - - bool operator==(const SSizet4 &other) const - { - return m_Longs[0] == other.m_Longs[0] && m_Longs[1] == other.m_Longs[1] - && m_Longs[2] == other.m_Longs[2] && m_Longs[3] == other.m_Longs[3]; - } - - bool operator<(const SSizet4 &other) const - { - if (m_Longs[0] < other.m_Longs[0]) - return true; - else if (m_Longs[0] == other.m_Longs[0]) { - if (m_Longs[1] < other.m_Longs[1]) - return true; - else if (m_Longs[1] == other.m_Longs[1]) { - if (m_Longs[2] < other.m_Longs[2]) - return true; - else if (m_Longs[3] < other.m_Longs[3]) - return true; - } - } - return false; - } - - bool Valid() const - { - bool retval = false; - for (int idx = 0; idx < 4; ++idx) - retval = retval || m_Longs[0] > 0; - return retval; - } -}; - -inline bool IsTrivial(const wchar_t *inStr) -{ - return inStr == NULL || *inStr == 0; -} -inline const wchar_t *NonNull(const wchar_t *inStr) -{ - return inStr ? inStr : L""; -} -inline bool AreEqual(const wchar_t *lhs, const wchar_t *rhs) -{ - return wcscmp(NonNull(lhs), NonNull(rhs)) == 0; -} - -inline bool IsTrivial(const char8_t *inStr) -{ - return inStr == NULL || *inStr == 0; -} -inline const char8_t *NonNull(const char8_t *inStr) -{ - return inStr ? inStr : ""; -} -inline bool AreEqual(const char8_t *lhs, const char8_t *rhs) -{ - return strcmp(NonNull(lhs), NonNull(rhs)) == 0; -} - -inline bool AreEqualCaseless(const char8_t *lhs, const char8_t *rhs) -{ - if (IsTrivial(lhs) && IsTrivial(rhs)) - return true; - if (IsTrivial(lhs) || IsTrivial(rhs)) - return false; - for (; *lhs && *rhs; ++lhs, ++rhs) - if (tolower(*lhs) != tolower(*rhs)) - return false; - if (*lhs || *rhs) - return false; - return true; -} - -struct SStringRef -{ - const wchar_t *m_Id; - - SStringRef(const wchar_t *id = L"") - : m_Id(NonNull(id)) - { - } - - operator const wchar_t *() const { return m_Id; } - bool operator==(const SStringRef &inOther) const { return AreEqual(m_Id, inOther.m_Id); } -}; -} - -// Traits specializations have to be in the same namespace as they were first declared. -namespace qt3ds { -namespace foundation { - - template <> - struct DestructTraits<qt3dsdm::SFloat2> - { - void destruct(qt3dsdm::SFloat2 &) {} - }; - template <> - struct DestructTraits<qt3dsdm::SFloat3> - { - void destruct(qt3dsdm::SFloat3 &) {} - }; - template <> - struct DestructTraits<qt3dsdm::SFloat4> - { - void destruct(qt3dsdm::SFloat4 &) {} - }; - template <> - struct DestructTraits<qt3dsdm::SLong4> - { - void destruct(qt3dsdm::SLong4 &) {} - }; - template <> - struct DestructTraits<qt3dsdm::SStringRef> - { - void destruct(qt3dsdm::SStringRef &) {} - }; - - template <> - struct EqualVisitorTraits<qt3dsdm::TDataStrPtr> - { - bool operator()(const qt3dsdm::TDataStrPtr &lhs, const qt3dsdm::TDataStrPtr &rhs) - { - if (lhs && rhs) - return *lhs == *rhs; - if (lhs || rhs) - return false; - return true; - } - }; -} -} - -namespace qt3dsdm { - -using qt3ds::NVUnionCast; - -struct ObjectReferenceType -{ - enum Enum { - Unknown = 0, - Absolute = 1, - Relative = 2, - }; -}; - -template <typename TDataType> -struct SObjectRefTypeTraits -{ -}; - -template <> -struct SObjectRefTypeTraits<SLong4> -{ - ObjectReferenceType::Enum getType() { return ObjectReferenceType::Absolute; } -}; -template <> -struct SObjectRefTypeTraits<TDataStrPtr> -{ - ObjectReferenceType::Enum getType() { return ObjectReferenceType::Relative; } -}; - -struct SObjectRefUnionTraits -{ - typedef ObjectReferenceType::Enum TIdType; - enum { - TBufferSize = sizeof(SSizet4), - }; - - static ObjectReferenceType::Enum getNoDataId() { return ObjectReferenceType::Unknown; } - - template <typename TDataType> - static TIdType getType() - { - return SObjectRefTypeTraits<TDataType>().getType(); - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor) - { - switch (inType) { - case ObjectReferenceType::Absolute: - return inVisitor(*NVUnionCast<SLong4 *>(inData)); - case ObjectReferenceType::Relative: - return inVisitor(*NVUnionCast<TDataStrPtr *>(inData)); - default: - QT3DS_ASSERT(false); - case ObjectReferenceType::Unknown: - return inVisitor(); - } - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor) - { - switch (inType) { - case ObjectReferenceType::Absolute: - return inVisitor(*NVUnionCast<const SLong4 *>(inData)); - case ObjectReferenceType::Relative: - return inVisitor(*NVUnionCast<const TDataStrPtr *>(inData)); - default: - QT3DS_ASSERT(false); - case ObjectReferenceType::Unknown: - return inVisitor(); - } - } -}; - -typedef qt3ds::foundation:: - DiscriminatedUnion<qt3ds::foundation:: - DiscriminatedUnionGenericBase<SObjectRefUnionTraits, - SObjectRefUnionTraits::TBufferSize>, - SObjectRefUnionTraits::TBufferSize> - TObjRefUnionType; - -template <typename TDataType> -struct Qt3DSDMGetter -{ -}; - -template <typename TRetType, typename TDataType> -TRetType get(const TDataType &inType) -{ - return Qt3DSDMGetter<TDataType>().template doGet<TRetType>(inType); -} - -template <> -struct Qt3DSDMGetter<TObjRefUnionType> -{ - template <typename TRetType> - TRetType doGet(const TObjRefUnionType &inValue) - { - return inValue.getData<TRetType>(); - } -}; - -// Either an absolute reference (SLong4) or a relative reference (string) -struct SObjectRefType -{ - TObjRefUnionType m_Value; - - SObjectRefType(const TDataStrPtr &inValue) - : m_Value(inValue) - { - } - SObjectRefType(const SLong4 &inValue) - : m_Value(inValue) - { - } - SObjectRefType(const SObjectRefType &inOther) - : m_Value(inOther.m_Value) - { - } - SObjectRefType() {} - SObjectRefType &operator=(const SObjectRefType &inOther) - { - m_Value = inOther.m_Value; - return *this; - } - ObjectReferenceType::Enum GetReferenceType() const { return m_Value.getType(); } - bool operator==(const SObjectRefType &inOther) const { return m_Value == inOther.m_Value; } -}; - -inline bool Equals(const SObjectRefType &lhs, const SObjectRefType &rhs) -{ - return lhs == rhs; -} - -struct SStringOrIntTypes -{ - enum Enum { - Unknown = 0, - Int, - String, - }; -}; - -template <typename TDataType> -struct SStringOrIntTypeTraits -{ -}; - -template <> -struct SStringOrIntTypeTraits<long> -{ - SStringOrIntTypes::Enum getType() { return SStringOrIntTypes::Int; } -}; -template <> -struct SStringOrIntTypeTraits<int> -{ - SStringOrIntTypes::Enum getType() { return SStringOrIntTypes::Int; } -}; -template <> -struct SStringOrIntTypeTraits<TDataStrPtr> -{ - SStringOrIntTypes::Enum getType() { return SStringOrIntTypes::String; } -}; - -struct SStringOrIntUnionTraits -{ - typedef SStringOrIntTypes::Enum TIdType; - enum { - TBufferSize = sizeof(TDataStrPtr), - }; - - static SStringOrIntTypes::Enum getNoDataId() { return SStringOrIntTypes::Unknown; } - - template <typename TDataType> - static TIdType getType() - { - return SStringOrIntTypeTraits<TDataType>().getType(); - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(char *inData, TIdType inType, TVisitorType inVisitor) - { - switch (inType) { - case SStringOrIntTypes::Int: - return inVisitor(*NVUnionCast<long *>(inData)); - case SStringOrIntTypes::String: - return inVisitor(*NVUnionCast<TDataStrPtr *>(inData)); - default: - QT3DS_ASSERT(false); - case SStringOrIntTypes::Unknown: - return inVisitor(); - } - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(const char *inData, TIdType inType, TVisitorType inVisitor) - { - switch (inType) { - case SStringOrIntTypes::Int: - return inVisitor(*NVUnionCast<const qt3ds::QT3DSI32 *>(inData)); - case SStringOrIntTypes::String: - return inVisitor(*NVUnionCast<const TDataStrPtr *>(inData)); - default: - QT3DS_ASSERT(false); - case SStringOrIntTypes::Unknown: - return inVisitor(); - } - } -}; - -typedef qt3ds::foundation:: - DiscriminatedUnion<qt3ds::foundation:: - DiscriminatedUnionGenericBase<SStringOrIntUnionTraits, - SStringOrIntUnionTraits::TBufferSize>, - SStringOrIntUnionTraits::TBufferSize> - TStringOrIntUnionType; - -template <> -struct Qt3DSDMGetter<TStringOrIntUnionType> -{ - template <typename TRetType> - TRetType doGet(const TStringOrIntUnionType &inValue) - { - return inValue.getData<TRetType>(); - } -}; - -struct SStringOrInt -{ - TStringOrIntUnionType m_Value; - - SStringOrInt() {} - SStringOrInt(int inValue) - : m_Value(inValue) - { - } - SStringOrInt(TDataStrPtr inValue) - : m_Value(inValue) - { - } - SStringOrInt(const SStringOrInt &inOther) - : m_Value(inOther.m_Value) - { - } - - SStringOrInt &operator=(const SStringOrInt &inOther) - { - m_Value = inOther.m_Value; - return *this; - } - - SStringOrIntTypes::Enum GetType() const { return m_Value.getType(); } - - bool operator==(const SStringOrInt &inOther) const { return m_Value == inOther.m_Value; } -}; - -inline bool Equals(const SStringOrInt &lhs, const SStringOrInt &rhs) -{ - return lhs == rhs; -} - -//comes from broken X.h -#ifdef None -#undef None -#endif - -#ifdef Bool -#undef Bool -#endif - -struct DataModelDataType { - - enum Value { - None, - Float, - Float2, - Float3, - Float4, - Long, - String, - Bool, - Long4, - StringRef, - ObjectRef, - StringOrInt, - FloatList, - RangedNumber // datainput-specific type for editor only - }; - - - Q_ENUM(Value) - Q_GADGET -}; - - -class IStringTable; - -template <typename TDataType> -struct Qt3DSDMValueTyper -{ -}; - -template <typename TDataType> -inline DataModelDataType::Value GetValueType(const TDataType &inValue) -{ - return Qt3DSDMValueTyper<TDataType>().Get(inValue); -} - -template <typename TDataType> -struct SDefaulter -{ -}; - -template <typename TDataType> -inline bool SetDefault(DataModelDataType::Value inDataType, TDataType &outValue) -{ - return SDefaulter<TDataType>().SetDefault(inDataType, outValue); -} - -typedef void (*Qt3DSDMDebugLogFunction)(const char *message); -// UICDMSimpleDataCore.cpp -extern Qt3DSDMDebugLogFunction g_DataModelDebugLogger; - -#define QT3DSDM_DEBUG_LOG(msg) \ - { \ - if (g_DataModelDebugLogger) { \ - g_DataModelDebugLogger(msg); \ - } \ - } -struct Qt3DSDMLogScope -{ - const char *m_EndMessage; - Qt3DSDMLogScope(const char *inStartMessage, const char *inEndMessage) - : m_EndMessage(inEndMessage) - { - QT3DSDM_DEBUG_LOG(inStartMessage); - } - ~Qt3DSDMLogScope() { QT3DSDM_DEBUG_LOG(m_EndMessage); } -}; - -#define QT3DSDM_LOG_FUNCTION(fnname) Qt3DSDMLogScope __fn_scope(fnname " Enter", fnname " Leave"); -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMErrors.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMErrors.h deleted file mode 100644 index 77ea7bf7..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMErrors.h +++ /dev/null @@ -1,308 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_ERRORS_H -#define QT3DSDM_ERRORS_H -#include "Qt3DSDMWindowsCompatibility.h" - -namespace qt3dsdm { -class Qt3DSDMError : public std::exception -{ -public: - Qt3DSDMError(const wchar_t *inMessage) - : std::exception() - { - wcscpy_s(m_Message, inMessage); - } - wchar_t m_Message[1024]; -}; - -class HandleExists : public Qt3DSDMError -{ -public: - HandleExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class PropertyNotFound : public Qt3DSDMError -{ -public: - PropertyNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class PropertyExists : public Qt3DSDMError -{ -public: - PropertyExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class DuplicateInstanceName : public Qt3DSDMError -{ -public: - DuplicateInstanceName(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class InstanceNotFound : public Qt3DSDMError -{ -public: - InstanceNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class ValueTypeError : public Qt3DSDMError -{ -public: - ValueTypeError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SerializationError : public Qt3DSDMError -{ -public: - SerializationError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SlideNotFound : public Qt3DSDMError -{ -public: - SlideNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SlideExists : public Qt3DSDMError -{ -public: - SlideExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SlideDerivationError : public Qt3DSDMError -{ -public: - SlideDerivationError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SlideChildNotFoundError : public Qt3DSDMError -{ -public: - SlideChildNotFoundError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SlideGraphNotFound : public Qt3DSDMError -{ -public: - SlideGraphNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class SlideGraphExists : public Qt3DSDMError -{ -public: - SlideGraphExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class PropertyLinkError : public Qt3DSDMError -{ -public: - PropertyLinkError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class RearrangeSlideArgumentsMustNotBeZero : public Qt3DSDMError -{ -public: - RearrangeSlideArgumentsMustNotBeZero(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class AnimationNotFound : public Qt3DSDMError -{ -public: - AnimationNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class AnimationExists : public Qt3DSDMError -{ -public: - AnimationExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class AnimationKeyframeTypeError : public Qt3DSDMError -{ -public: - AnimationKeyframeTypeError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class AnimationKeyframeNotFound : public Qt3DSDMError -{ -public: - AnimationKeyframeNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class AnimationEvaluationError : public Qt3DSDMError -{ -public: - AnimationEvaluationError(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class ActionNotFound : public Qt3DSDMError -{ -public: - ActionNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class ActionExists : public Qt3DSDMError -{ -public: - ActionExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class HandlerArgumentNotFound : public Qt3DSDMError -{ -public: - HandlerArgumentNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class HandlerArgumentExists : public Qt3DSDMError -{ -public: - HandlerArgumentExists(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class CustomPropertyNotFound : public Qt3DSDMError -{ -public: - CustomPropertyNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class CustomEventNotFound : public Qt3DSDMError -{ -public: - CustomEventNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class CustomHandlerNotFound : public Qt3DSDMError -{ -public: - CustomHandlerNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class CustomHandlerParamNotFound : public Qt3DSDMError -{ -public: - CustomHandlerParamNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; - -class AttributeTypeNotFound : public Qt3DSDMError -{ -public: - AttributeTypeNotFound(const wchar_t *inMessage) - : Qt3DSDMError(inMessage) - { - } -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMGuides.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMGuides.cpp deleted file mode 100644 index e8ea421f..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMGuides.cpp +++ /dev/null @@ -1,222 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "Qt3DSDMGuides.h" -#include <unordered_map> -#include "VectorTransactions.h" - -using namespace qt3dsdm; - -namespace { - -#define CONNECT(x) std::make_shared<qt3dsdm::QtSignalConnection>(QObject::connect(this, x, inCallback)) - -class SGuideSystem : public QObject, public IGuideSystem -{ - Q_OBJECT -public: - typedef std::unordered_map<long, SGuideInfo> TGuideMap; - typedef std::shared_ptr<IMergeableTransaction<SGuideInfo>> TMergeableTransaction; - typedef std::unordered_map<long, TMergeableTransaction> TGuideInfoMergeMap; - - long m_NextHandleValue; - TGuideMap m_Guides; - bool m_GuidesEditable; - - std::shared_ptr<ITransactionConsumer> m_CurrentTransaction; - TGuideInfoMergeMap m_GuideMergeMap; -Q_SIGNALS: - void guideCreated(Qt3DSDMGuideHandle, SGuideInfo); - void guideDestroyed(Qt3DSDMGuideHandle, SGuideInfo); - void guideModified(Qt3DSDMGuideHandle, SGuideInfo); - void guideModifiedImmediate(Qt3DSDMGuideHandle, SGuideInfo); -public: - SGuideSystem() - : m_NextHandleValue(0) - , m_GuidesEditable(true) - { - } - - void SignalGuideCreated(long hdl, const SGuideInfo &inInfo) { Q_EMIT guideCreated(hdl, inInfo); } - - void SignalGuideDestroyed(long hdl, const SGuideInfo &inInfo) { Q_EMIT guideDestroyed(hdl, inInfo); } - - void SignalGuideModified(long hdl, const SGuideInfo &inInfo) { Q_EMIT guideModified(hdl, inInfo); } - - Qt3DSDMGuideHandle CreateGuide() override - { - ++m_NextHandleValue; - std::pair<long, SGuideInfo> entry(std::make_pair(m_NextHandleValue, SGuideInfo())); - m_Guides.insert(entry); - if (m_CurrentTransaction) { - CreateHashMapInsertTransaction(__FILE__, __LINE__, m_CurrentTransaction, entry, - m_Guides); - m_CurrentTransaction->OnDoNotification(std::bind( - &SGuideSystem::SignalGuideCreated, this, m_NextHandleValue, SGuideInfo())); - m_CurrentTransaction->OnUndoNotification(std::bind( - &SGuideSystem::SignalGuideDestroyed, this, m_NextHandleValue, SGuideInfo())); - } - - return m_NextHandleValue; - } - - SGuideInfo *InternalGetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) - { - TGuideMap::iterator theFind = m_Guides.find((long)inGuideHandle.GetHandleValue()); - if (theFind != m_Guides.end()) - return &theFind->second; - return NULL; - } - - const SGuideInfo *InternalGetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) const - { - return const_cast<SGuideSystem &>(*this).InternalGetGuideInfo(inGuideHandle); - } - - void SetGuideInfo(Qt3DSDMGuideHandle inGuideHandle, const SGuideInfo &info) override - { - SGuideInfo *existing = InternalGetGuideInfo(inGuideHandle); - long theHdlValue = (long)inGuideHandle.GetHandleValue(); - TGuideInfoMergeMap::iterator iter = m_GuideMergeMap.find(theHdlValue); - if (iter != m_GuideMergeMap.end()) { - iter->second->Update(info); - *existing = info; - } else { - if (!existing) { - QT3DS_ASSERT(false); - return; - } - SGuideInfo oldValue(*existing); - *existing = info; - if (m_CurrentTransaction) { - TMergeableTransaction newTransaction = - CreateHashMapSwapTransaction(__FILE__, __LINE__, m_CurrentTransaction, - theHdlValue, oldValue, info, m_Guides); - m_GuideMergeMap.insert(std::make_pair(theHdlValue, newTransaction)); - m_CurrentTransaction->OnDoNotification( - std::bind(&SGuideSystem::SignalGuideModified, this, theHdlValue, info)); - m_CurrentTransaction->OnUndoNotification( - std::bind(&SGuideSystem::SignalGuideModified, this, theHdlValue, oldValue)); - } - } - if (AreDataModelSignalsEnabled()) - Q_EMIT guideModifiedImmediate(theHdlValue, info); - } - - SGuideInfo GetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) const override - { - const SGuideInfo *existing = InternalGetGuideInfo(inGuideHandle); - if (existing) - return *existing; - QT3DS_ASSERT(false); - return SGuideInfo(); - } - - void DeleteGuide(Qt3DSDMGuideHandle inGuideHandle) override - { - - SGuideInfo *existing = InternalGetGuideInfo(inGuideHandle); - if (!existing) { - QT3DS_ASSERT(false); - return; - } - long theHdlValue = (long)inGuideHandle.GetHandleValue(); - SGuideInfo oldValue = *existing; - m_Guides.erase(theHdlValue); - - if (m_CurrentTransaction) { - std::pair<long, SGuideInfo> entry(std::make_pair(theHdlValue, oldValue)); - CreateHashMapEraseTransaction(__FILE__, __LINE__, m_CurrentTransaction, entry, - m_Guides); - m_CurrentTransaction->OnDoNotification( - std::bind(&SGuideSystem::SignalGuideDestroyed, this, theHdlValue, oldValue)); - m_CurrentTransaction->OnUndoNotification( - std::bind(&SGuideSystem::SignalGuideCreated, this, theHdlValue, oldValue)); - } - } - - TGuideHandleList GetAllGuides() const override - { - TGuideHandleList retval; - for (TGuideMap::const_iterator iter = m_Guides.begin(), end = m_Guides.end(); iter != end; - ++iter) - retval.push_back(iter->first); - return retval; - } - - bool IsGuideValid(Qt3DSDMGuideHandle inGuideHandle) const override - { - return InternalGetGuideInfo(inGuideHandle) != NULL; - } - bool AreGuidesEditable() const override { return m_GuidesEditable; } - void SetGuidesEditable(bool val) override { m_GuidesEditable = val; } - - // Undo/Redo - void SetConsumer(std::shared_ptr<ITransactionConsumer> inConsumer) override - { - m_CurrentTransaction = inConsumer; - m_GuideMergeMap.clear(); - } - - // These are events coming from undo/redo operations, not events coming directly from the - // modification of the guides - virtual TSignalConnectionPtr - ConnectGuideCreated(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override - { - return CONNECT(&SGuideSystem::guideCreated); - } - - virtual TSignalConnectionPtr - ConnectGuideDestroyed(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override - { - return CONNECT(&SGuideSystem::guideDestroyed); - } - - virtual TSignalConnectionPtr - ConnectGuideModified(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override - { - return CONNECT(&SGuideSystem::guideModified); - } - - // Signal happens immediately instead of on undo/redo, used for live-update of the inspector - // palette - TSignalConnectionPtr ConnectGuideModifiedImmediate( - const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) override - { - return CONNECT(&SGuideSystem::guideModifiedImmediate); - } -}; -} - -shared_ptr<IGuideSystem> IGuideSystem::CreateGuideSystem() -{ - return std::make_shared<SGuideSystem>(); -} - -#include "Qt3DSDMGuides.moc" diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMGuides.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMGuides.h deleted file mode 100644 index 0362abff..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMGuides.h +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_GUIDES_H -#define QT3DSDM_GUIDES_H -#include "Qt3DSDMDataTypes.h" -#include "foundation/Qt3DSSimpleTypes.h" -#include "Qt3DSDMSignals.h" -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMTransactions.h" -#include <functional> - -namespace qt3dsdm { -struct GuideDirections -{ - enum Enum { - UnknownDirection = 0, - Vertical, - Horizontal, - }; -}; - -struct SGuideInfo -{ - qt3ds::QT3DSF32 m_Position; - GuideDirections::Enum m_Direction; - qt3ds::QT3DSI32 m_Width; - SGuideInfo(qt3ds::QT3DSF32 pos = 0.0f, GuideDirections::Enum dir = GuideDirections::UnknownDirection, - qt3ds::QT3DSI32 width = 1) - : m_Position(pos) - , m_Direction(dir) - , m_Width(width) - { - } -}; - -class IGuideSystem : public ITransactionProducer -{ -protected: - virtual ~IGuideSystem() {} -public: - friend class std::shared_ptr<IGuideSystem>; - - virtual Qt3DSDMGuideHandle CreateGuide() = 0; - virtual void SetGuideInfo(Qt3DSDMGuideHandle inGuideHandle, const SGuideInfo &info) = 0; - virtual SGuideInfo GetGuideInfo(Qt3DSDMGuideHandle inGuideHandle) const = 0; - virtual void DeleteGuide(Qt3DSDMGuideHandle inGuideHandle) = 0; - virtual TGuideHandleList GetAllGuides() const = 0; - virtual bool IsGuideValid(Qt3DSDMGuideHandle inGuideHandle) const = 0; - // No real effect on datamodel because you can still create guides when they are locked. - // Just used in the UI. - virtual bool AreGuidesEditable() const = 0; - virtual void SetGuidesEditable(bool val) = 0; - - // Undo/Redo - void SetConsumer(std::shared_ptr<ITransactionConsumer> inConsumer) override = 0; - - // These are events coming from undo/redo operations, not events coming directly from the - // modification of the guides - virtual TSignalConnectionPtr - ConnectGuideCreated(const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectGuideDestroyed( - const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectGuideModified( - const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0; - - // Signal happens immediately instead of on undo/redo, used for live-update of the inspector - // palette - virtual TSignalConnectionPtr ConnectGuideModifiedImmediate( - const std::function<void(Qt3DSDMGuideHandle, SGuideInfo)> &inCallback) = 0; - - static std::shared_ptr<IGuideSystem> CreateGuideSystem(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMHandles.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMHandles.h deleted file mode 100644 index 05867a14..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMHandles.h +++ /dev/null @@ -1,459 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_HANDLES_H -#define QT3DSDM_HANDLES_H - -#include <QMetaType> - -namespace qt3dsdm { - -class IDataCore; - -class CDataModelHandle -{ - int m_Handle; - -public: - inline CDataModelHandle(int inHandle = 0); - inline CDataModelHandle(const CDataModelHandle &other); - virtual ~CDataModelHandle(); - - // Operators - inline CDataModelHandle &operator=(const CDataModelHandle &other); - inline bool operator==(const CDataModelHandle &other) const; - inline bool operator<(const CDataModelHandle &other) const; - inline operator int() const { return GetHandleValue(); } - - // Use - inline bool Valid() const { return m_Handle != 0; } - int GetHandleValue() const { return m_Handle; } -}; - -inline CDataModelHandle::CDataModelHandle(int inHandle) - : m_Handle(inHandle) -{ -} -inline CDataModelHandle::CDataModelHandle(const CDataModelHandle &other) - : m_Handle(other.m_Handle) -{ -} -inline CDataModelHandle::~CDataModelHandle() -{ -} - -inline CDataModelHandle &CDataModelHandle::operator=(const CDataModelHandle &other) -{ - if (this != &other) { - m_Handle = other.m_Handle; - } - return *this; -} - -inline bool CDataModelHandle::operator==(const CDataModelHandle &other) const -{ - return m_Handle == other.m_Handle; -} - -inline bool CDataModelHandle::operator<(const CDataModelHandle &other) const -{ - return m_Handle < other.m_Handle; -} - -class Qt3DSDMInstanceHandle : public CDataModelHandle -{ -public: - Qt3DSDMInstanceHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMInstanceHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMInstanceHandle(const Qt3DSDMInstanceHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMInstanceHandle &operator=(const Qt3DSDMInstanceHandle &inOther) - { - return static_cast<Qt3DSDMInstanceHandle &>(CDataModelHandle::operator=(inOther)); - } - - inline bool operator==(const Qt3DSDMInstanceHandle &other) const - { - return CDataModelHandle::operator==(other); - } -}; - -typedef std::vector<Qt3DSDMInstanceHandle> TInstanceHandleList; - -class Qt3DSDMPropertyHandle : public CDataModelHandle -{ -public: - Qt3DSDMPropertyHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMPropertyHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMPropertyHandle(const Qt3DSDMInstanceHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMPropertyHandle &operator=(const Qt3DSDMPropertyHandle &inOther) - { - return static_cast<Qt3DSDMPropertyHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMPropertyHandle> TPropertyHandleList; - -class Qt3DSDMSlideHandle : public CDataModelHandle -{ -public: - Qt3DSDMSlideHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMSlideHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMSlideHandle(const Qt3DSDMSlideHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMSlideHandle &operator=(const Qt3DSDMSlideHandle &inOther) - { - return static_cast<Qt3DSDMSlideHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMSlideHandle> TSlideHandleList; - -class Qt3DSDMSlideGraphHandle : public CDataModelHandle -{ -public: - Qt3DSDMSlideGraphHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMSlideGraphHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMSlideGraphHandle(const Qt3DSDMSlideGraphHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMSlideGraphHandle &operator=(const Qt3DSDMSlideGraphHandle &inOther) - { - return static_cast<Qt3DSDMSlideGraphHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMSlideGraphHandle> TSlideGraphHandleList; - -class Qt3DSDMAnimationHandle : public CDataModelHandle -{ -public: - Qt3DSDMAnimationHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMAnimationHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMAnimationHandle(const Qt3DSDMAnimationHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMAnimationHandle &operator=(const Qt3DSDMAnimationHandle &inOther) - { - return static_cast<Qt3DSDMAnimationHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMAnimationHandle> TAnimationHandleList; - -class Qt3DSDMKeyframeHandle : public CDataModelHandle -{ -public: - Qt3DSDMKeyframeHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMKeyframeHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMKeyframeHandle(const Qt3DSDMKeyframeHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMKeyframeHandle &operator=(const Qt3DSDMKeyframeHandle &inOther) - { - return static_cast<Qt3DSDMKeyframeHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMKeyframeHandle> TKeyframeHandleList; - -class Qt3DSDMActionHandle : public CDataModelHandle -{ -public: - Qt3DSDMActionHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMActionHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMActionHandle(const Qt3DSDMActionHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMActionHandle &operator=(const Qt3DSDMActionHandle &inOther) - { - return static_cast<Qt3DSDMActionHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMActionHandle> TActionHandleList; - -class Qt3DSDMHandlerArgHandle : public CDataModelHandle -{ -public: - Qt3DSDMHandlerArgHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMHandlerArgHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMHandlerArgHandle(const Qt3DSDMHandlerArgHandle &inOther) - : CDataModelHandle(inOther) - { - } - Qt3DSDMHandlerArgHandle &operator=(const Qt3DSDMHandlerArgHandle &inOther) - { - return static_cast<Qt3DSDMHandlerArgHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMHandlerArgHandle> THandlerArgHandleList; - -class Qt3DSDMEventHandle : public CDataModelHandle -{ -public: - Qt3DSDMEventHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMEventHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMEventHandle(const Qt3DSDMEventHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMEventHandle &operator=(const Qt3DSDMEventHandle &inOther) - { - return static_cast<Qt3DSDMEventHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMEventHandle> TEventHandleList; - -class Qt3DSDMHandlerHandle : public CDataModelHandle -{ -public: - Qt3DSDMHandlerHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMHandlerHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMHandlerHandle(const Qt3DSDMHandlerHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMHandlerHandle &operator=(const Qt3DSDMHandlerHandle &inOther) - { - return static_cast<Qt3DSDMHandlerHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMHandlerHandle> THandlerHandleList; - -class Qt3DSDMHandlerParamHandle : public CDataModelHandle -{ -public: - Qt3DSDMHandlerParamHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMHandlerParamHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMHandlerParamHandle(const Qt3DSDMHandlerParamHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMHandlerParamHandle &operator=(const Qt3DSDMHandlerParamHandle &inOther) - { - return static_cast<Qt3DSDMHandlerParamHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMHandlerParamHandle> THandlerParamHandleList; - -class Qt3DSDMMetaDataPropertyHandle : public CDataModelHandle -{ -public: - Qt3DSDMMetaDataPropertyHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMMetaDataPropertyHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMMetaDataPropertyHandle(const Qt3DSDMMetaDataPropertyHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMMetaDataPropertyHandle &operator=(const Qt3DSDMMetaDataPropertyHandle &inOther) - { - return static_cast<Qt3DSDMMetaDataPropertyHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMMetaDataPropertyHandle> TMetaDataPropertyHandleList; - -class Qt3DSDMCategoryHandle : public CDataModelHandle -{ -public: - Qt3DSDMCategoryHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMCategoryHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMCategoryHandle(const Qt3DSDMCategoryHandle &inOther) - : CDataModelHandle(inOther) - { - } - Qt3DSDMCategoryHandle &operator=(const Qt3DSDMCategoryHandle &inOther) - { - return static_cast<Qt3DSDMCategoryHandle &>(CDataModelHandle::operator=(inOther)); - } -}; - -typedef std::vector<Qt3DSDMCategoryHandle> TCategoryHandleList; - -class Qt3DSDMGuideHandle : public CDataModelHandle -{ -public: - Qt3DSDMGuideHandle(int inHandle = 0) - : CDataModelHandle(inHandle) - { - } - - Qt3DSDMGuideHandle(const CDataModelHandle &inOther) - : CDataModelHandle(inOther) - { - } - - Qt3DSDMGuideHandle(const Qt3DSDMCategoryHandle &inOther) - : CDataModelHandle(inOther) - { - } - Qt3DSDMGuideHandle &operator=(const Qt3DSDMGuideHandle &inOther) - { - CDataModelHandle::operator=(inOther); - return *this; - } -}; - -typedef std::vector<Qt3DSDMGuideHandle> TGuideHandleList; -} - -Q_DECLARE_METATYPE(qt3dsdm::Qt3DSDMSlideHandle); - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaData.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaData.cpp deleted file mode 100644 index bc4e905d..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaData.cpp +++ /dev/null @@ -1,4168 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#ifdef _WIN32 -#pragma warning(disable : 4103) -#endif -#include "Qt3DSDMMetaData.h" -#include "Qt3DSDMXML.h" -#include "foundation/Qt3DSAssert.h" -#include "StandardExtensions.h" -#include <unordered_map> -#include <memory> -#include <unordered_set> -#include "Qt3DSDMTransactions.h" -#include "VectorTransactions.h" -#include "Qt3DSDMSignals.h" -// Pull in the fancy str-type implementations -#include "Qt3DSDMWStrOpsImpl.h" -#include "Qt3DSDMDataCore.h" -#include "DataCoreProducer.h" -#include "Qt3DSDMWindowsCompatibility.h" -#include "Qt3DSRenderEffectSystem.h" -#include "Qt3DSRenderDynamicObjectSystemCommands.h" -#include "foundation/StringConversionImpl.h" - -#include <QtCore/qdir.h> - -using namespace qt3dsdm; -using std::shared_ptr; -using std::make_shared; -using std::static_pointer_cast; -using std::unordered_map; -using std::unordered_set; -using std::function; -using std::bind; -using std::ref; -using std::get; -using qt3ds::foundation::Empty; - -typedef Qt3DSDMInstanceHandle TInstanceHandle; -typedef Qt3DSDMPropertyHandle TPropertyHandle; -typedef Qt3DSDMEventHandle TEventHandle; -typedef Qt3DSDMHandlerHandle THandlerHandle; -typedef Qt3DSDMHandlerArgHandle THandlerArgHandle; -typedef Qt3DSDMMetaDataPropertyHandle TMetaDataPropertyHandle; -typedef Qt3DSDMCategoryHandle TCategoryHandle; - -namespace qt3dsdm { -#define QT3DS_WCHAR_T_None L"None" -#define QT3DS_WCHAR_T_StringList L"StringList" -#define QT3DS_WCHAR_T_Range L"Range" -#define QT3DS_WCHAR_T_Image L"Image" -#define QT3DS_WCHAR_T_Color L"Color" -#define QT3DS_WCHAR_T_Rotation L"Rotation" -#define QT3DS_WCHAR_T_Font L"Font" -#define QT3DS_WCHAR_T_FontSize L"FontSize" -#define QT3DS_WCHAR_T_MultiLine L"MultiLine" -#define QT3DS_WCHAR_T_ObjectRef L"ObjectRef" -#define QT3DS_WCHAR_T_Mesh L"Mesh" -#define QT3DS_WCHAR_T_Import L"Import" -#define QT3DS_WCHAR_T_Texture L"Texture" -#define QT3DS_WCHAR_T_Image2D L"Image2D" -#define QT3DS_WCHAR_T_Buffer L"Buffer" -#define QT3DS_WCHAR_T_Property L"Property" -#define QT3DS_WCHAR_T_Dependent L"Dependent" -#define QT3DS_WCHAR_T_Slide L"Slide" -#define QT3DS_WCHAR_T_Event L"Event" -#define QT3DS_WCHAR_T_Object L"Object" -#define QT3DS_WCHAR_T_Signal L"Signal" -#define QT3DS_WCHAR_T_Renderable L"Renderable" -#define QT3DS_WCHAR_T_PathBuffer L"PathBuffer" -#define QT3DS_WCHAR_T_ShadowMapResolution L"ShadowMapResolution" -#define QT3DS_WCHAR_T_String L"String" - -#define ITERATE_ADDITIONAL_META_DATA_TYPES \ - HANDLE_ADDITIONAL_META_DATA_TYPE(None) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(StringList) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Range) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Image) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Color) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Rotation) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Font) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(FontSize) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(MultiLine) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(ObjectRef) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Mesh) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Import) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Texture) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(Renderable) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(PathBuffer) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(ShadowMapResolution) \ - HANDLE_ADDITIONAL_META_DATA_TYPE(String) -template <> -struct WStrOps<AdditionalMetaDataType::Value> -{ - QT3DSU32 ToStr(AdditionalMetaDataType::Value item, NVDataRef<wchar_t> buffer) - { - switch (item) { -#define HANDLE_ADDITIONAL_META_DATA_TYPE(name) \ - case AdditionalMetaDataType::name: \ - wcscpy_s(buffer.begin(), buffer.size(), QT3DS_WCHAR_T_##name); \ - return 1; - ITERATE_ADDITIONAL_META_DATA_TYPES - #undef HANDLE_ADDITIONAL_META_DATA_TYPE - } - return 0; - } - bool StrTo(const wchar_t *buffer, AdditionalMetaDataType::Value &item) - { -#define HANDLE_ADDITIONAL_META_DATA_TYPE(name) \ - if (AreEqual(buffer, QT3DS_WCHAR_T_##name)) { \ - item = AdditionalMetaDataType::name; \ - return true; \ - } - ITERATE_ADDITIONAL_META_DATA_TYPES - #undef HANDLE_ADDITIONAL_META_DATA_TYPE - return false; - } -}; - -#undef ITERATE_ADDITIONAL_META_DATA_TYPES - -#define ITERATE_HANDLER_ARG_TYPES \ - HANDLE_HANDLER_ARG_TYPE(None) \ - HANDLE_HANDLER_ARG_TYPE(Property) \ - HANDLE_HANDLER_ARG_TYPE(Dependent) \ - HANDLE_HANDLER_ARG_TYPE(Slide) \ - HANDLE_HANDLER_ARG_TYPE(Event) \ - HANDLE_HANDLER_ARG_TYPE(Object) \ - HANDLE_HANDLER_ARG_TYPE(Signal) - -QT3DSU32 WStrOps<HandlerArgumentType::Value>::ToStr(HandlerArgumentType::Value item, NVDataRef<wchar_t> buffer) -{ - switch (item) { -#define HANDLE_HANDLER_ARG_TYPE(name) \ - case HandlerArgumentType::name: \ - wcscpy_s(buffer.begin(), buffer.size(), QT3DS_WCHAR_T_##name); \ - return 1; - ITERATE_HANDLER_ARG_TYPES - #undef HANDLE_HANDLER_ARG_TYPE - } - return 0; -} - -bool WStrOps<HandlerArgumentType::Value>::StrTo(const wchar_t *buffer, HandlerArgumentType::Value &item) -{ -#define HANDLE_HANDLER_ARG_TYPE(name) \ - if (AreEqual(buffer, QT3DS_WCHAR_T_##name)) { \ - item = HandlerArgumentType::name; \ - return true; \ -} - ITERATE_HANDLER_ARG_TYPES - #undef HANDLE_HANDLER_ARG_TYPE - return false; -} - -#define QT3DS_WCHAR_T_FloatRange L"FloatRange" -#define QT3DS_WCHAR_T_LongRange L"LongRange" -#define QT3DS_WCHAR_T_Vector L"Vector" -#define QT3DS_WCHAR_T_MultiLineString L"MultiLineString" -#define QT3DS_WCHAR_T_Boolean L"Boolean" -#define QT3DS_WCHAR_T_Guid L"Guid" -#define QT3DS_WCHAR_T_StringListOrInt L"StringListOrInt" -#define QT3DS_WCHAR_T_Scale L"Scale" - -#define ITERATE_QT3DSDM_COMPLETE_TYPES \ - HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \ - HANDLE_QT3DSDM_COMPLETE_TYPE(StringList, StringList, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(FloatRange, Range, DataModelDataType::Float) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(LongRange, Range, DataModelDataType::Long) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Float, None, DataModelDataType::Float) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Long, None, DataModelDataType::Long) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Float2, None, DataModelDataType::Float2) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Vector, None, DataModelDataType::Float3) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Scale, None, DataModelDataType::Float3) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Rotation, Rotation, DataModelDataType::Float3) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Color, Color, DataModelDataType::Float4) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Boolean, None, DataModelDataType::Bool) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Slide, None, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Font, Font, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(FontSize, FontSize, DataModelDataType::Float) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(String, String, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(MultiLineString, MultiLine, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(ObjectRef, ObjectRef, DataModelDataType::ObjectRef) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Image, Image, DataModelDataType::Long4) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Mesh, Mesh, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Import, Import, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Texture, Texture, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Image2D, Texture, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Buffer, Texture, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Guid, None, DataModelDataType::Long4) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(StringListOrInt, StringList, DataModelDataType::StringOrInt) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(Renderable, Renderable, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(PathBuffer, PathBuffer, DataModelDataType::String) \ - HANDLE_QT3DSDM_COMPLETE_TYPE(ShadowMapResolution, ShadowMapResolution, DataModelDataType::Long) - -DataModelDataType::Value CompleteMetaDataType::ToDataType(CompleteMetaDataType::Enum inCompleteType) -{ - switch (inCompleteType) { -#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \ - case Unknown: \ - return DataModelDataType::None; -#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \ - case name: \ - return dtype; - ITERATE_QT3DSDM_COMPLETE_TYPES - #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE - #undef HANDLE_QT3DSDM_COMPLETE_TYPE - } - QT3DS_ASSERT(false); - return DataModelDataType::None; -} - -AdditionalMetaDataType::Value -CompleteMetaDataType::ToAdditionalType(CompleteMetaDataType::Enum inCompleteType) -{ - switch (inCompleteType) { -#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \ - case Unknown: \ - return AdditionalMetaDataType::None; -#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \ - case name: \ - return AdditionalMetaDataType::addtype; - ITERATE_QT3DSDM_COMPLETE_TYPES - #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE - #undef HANDLE_QT3DSDM_COMPLETE_TYPE - } - QT3DS_ASSERT(false); - return AdditionalMetaDataType::None; -} - -CompleteMetaDataType::Enum -CompleteMetaDataType::ToCompleteType(DataModelDataType::Value inDataType, - AdditionalMetaDataType::Value inAdditionalType) -{ -#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \ - if (inDataType == DataModelDataType::None) \ - return CompleteMetaDataType::Unknown; -#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \ - if (inDataType == dtype \ - && inAdditionalType == AdditionalMetaDataType::addtype) \ - return CompleteMetaDataType::name; - - ITERATE_QT3DSDM_COMPLETE_TYPES - #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE - #undef HANDLE_QT3DSDM_COMPLETE_TYPE - QT3DS_ASSERT(false); - return CompleteMetaDataType::Unknown; -} - -QT3DSU32 WStrOps<CompleteMetaDataType::Enum>::ToStr(CompleteMetaDataType::Enum item, - NVDataRef<wchar_t> buffer) -{ - switch (item) { -#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \ - case CompleteMetaDataType::Unknown: \ - wcscpy_s(buffer.begin(), buffer.size(), L"None"); \ - return 1; -#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \ - case CompleteMetaDataType::name: \ - wcscpy_s(buffer.begin(), buffer.size(), QT3DS_WCHAR_T_##name); \ - return 1; - - ITERATE_QT3DSDM_COMPLETE_TYPES - #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE - #undef HANDLE_QT3DSDM_COMPLETE_TYPE - } - QT3DS_ASSERT(false); - return 0; -} -bool WStrOps<CompleteMetaDataType::Enum>::StrTo(const wchar_t *buffer, - CompleteMetaDataType::Enum &item) -{ - -#define HANDLE_QT3DSDM_COMPLETE_NONE_TYPE \ - if (AreEqual(buffer, L"None")) { \ - item = CompleteMetaDataType::Unknown; \ - return true; \ -} -#define HANDLE_QT3DSDM_COMPLETE_TYPE(name, addtype, dtype) \ - if (AreEqual(buffer, QT3DS_WCHAR_T_##name)) { \ - item = CompleteMetaDataType::name; \ - return true; \ -} - - ITERATE_QT3DSDM_COMPLETE_TYPES - #undef HANDLE_QT3DSDM_COMPLETE_NONE_TYPE - #undef HANDLE_QT3DSDM_COMPLETE_TYPE - return false; -} -} - -namespace { - -#ifndef QT3DSDM_META_DATA_NO_SIGNALS -#define CONNECT(x) std::make_shared<qt3dsdm::QtSignalConnection>(QObject::connect(this, x, inCallback)) -#else -#define CONNECT(x) std::shared_ptr<qt3dsdm::ISignalConnection>() - -struct SNullFunc -{ - template <typename TArgType> - void operator()(TArgType) - { - } - template <typename TA1, typename TA2> - void operator()(TA1, TA2) - { - } -}; - -#endif - -typedef TCharStr TStrType; -using std::hash; - -struct InstanceHandleVecHash -{ - size_t operator()(const vector<TInstanceHandle> &inInstances) const - { - size_t retval = 0; - for (size_t idx = 0, end = inInstances.size(); idx < end; ++idx) - retval = retval ^ hash<int>()(inInstances[idx]); - return retval; - } -}; - -struct SEventAndHandlerBase -{ - Qt3DSDMInstanceHandle m_Instance; - TStrType m_Name; - TStrType m_FormalName; - TStrType m_Category; - TStrType m_Description; - SEventAndHandlerBase() {} - SEventAndHandlerBase(Qt3DSDMInstanceHandle hdl) - : m_Instance(hdl) - { - } -}; - -struct SEvent : public SEventAndHandlerBase -{ - SEvent() {} - SEvent(Qt3DSDMInstanceHandle hdl) - : SEventAndHandlerBase(hdl) - { - } -}; - -struct SHandler : public SEventAndHandlerBase -{ - SHandler() {} - SHandler(Qt3DSDMInstanceHandle hdl) - : SEventAndHandlerBase(hdl) - { - } - vector<SMetaDataHandlerArgumentInfo> m_Arguments; -}; - -// Note that this hash item only works for strings that are in the string table. -// These have the property that pointer comparison also indicates string equality. -struct SInstanceStrHash -{ - size_t operator()(const pair<TInstanceHandle, TCharPtr> &inPair) const - { - return hash<int>()(inPair.first) ^ hash<const void *>()(inPair.second); - } -}; - -template <typename TDataType> -NVConstDataRef<TDataType> VecToCRef(const eastl::vector<TDataType> &inType) -{ - return NVConstDataRef<TDataType>(inType.data(), (QT3DSU32)inType.size()); -} - -struct SMetaDataDynamicObjectImpl -{ -private: - SMetaDataDynamicObjectImpl &operator=(const SMetaDataDynamicObjectImpl &inOther); - -public: - TCharStr m_Name; - TCharStr m_SourcePath; - eastl::vector<SMetaDataShader> m_Shaders; - eastl::vector<qt3ds::render::dynamic::SPropertyDefinition> m_Properties; - eastl::vector<eastl::vector<qt3ds::foundation::CRegisteredString> *> m_EnumValueNames; - ~SMetaDataDynamicObjectImpl() { ClearEnumValueNames(); } - - void ClearEnumValueNames() - { - for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) - delete (m_EnumValueNames[idx]); - m_EnumValueNames.clear(); - } -}; - -struct SMetaDataEffectImpl : public SMetaDataDynamicObjectImpl -{ -private: - SMetaDataEffectImpl &operator=(const SMetaDataEffectImpl &inOther); - -public: - eastl::vector<qt3ds::render::dynamic::SCommand *> m_EffectCommands; - - void ClearEffectCommands() - { - for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) - free(m_EffectCommands[idx]); - m_EffectCommands.clear(); - } - SMetaDataEffect ToEffect() const - { - return SMetaDataEffect(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties), - VecToCRef(m_EffectCommands)); - } -}; - -struct SMetaDataCustomMaterialImpl : public SMetaDataDynamicObjectImpl -{ -private: - SMetaDataCustomMaterialImpl &operator=(const SMetaDataCustomMaterialImpl &); - -public: - eastl::vector<qt3ds::render::dynamic::SCommand *> - m_CustomerMaterialCommands; ///< our command stream used for rendering - bool m_HasTransparency; ///< this material is transparent - bool m_HasRefraction; ///< this material is refractive (e.g glass) - bool m_AlwaysDirty; - QT3DSU32 m_ShaderKey; ///< What does this shader contain ( e.g. specular, diffuse, ...) - QT3DSU32 m_LayerCount; ///< How much layers does this material have - - void ClearEffectCommands() - { - for (QT3DSU32 idx = 0, end = m_EnumValueNames.size(); idx < end; ++idx) { - free(m_CustomerMaterialCommands[idx]); - } - - m_CustomerMaterialCommands.clear(); - } - - SMetaDataCustomMaterial ToMaterial() const - { - return SMetaDataCustomMaterial(m_Name, VecToCRef(m_Shaders), VecToCRef(m_Properties), - VecToCRef(m_CustomerMaterialCommands), m_HasTransparency, - m_HasRefraction, m_AlwaysDirty, m_ShaderKey, m_LayerCount); - } -}; - -#ifndef QT3DSDM_META_DATA_NO_SIGNALS -class SNewMetaDataImpl : public QObject, public IMetaData -{ - Q_OBJECT -#else -class SNewMetaDataImpl : public IMetaData -{ -#endif -public: - typedef unordered_map<TCharPtr, TInstanceHandle> TStrInstanceMap; - typedef unordered_map<TInstanceHandle, TCharPtr, hash<int>> TInstanceStrMap; - // Caching the derivation chain lookup so we can quickly lookup the entire list of - // derived instances (and have it ordered, somewhat). - typedef unordered_map<vector<TInstanceHandle>, vector<TInstanceHandle>, InstanceHandleVecHash> - TDerivationMap; - - typedef unordered_map<TCategoryHandle, SCategoryInfo, hash<int>> TCategoryMap; - typedef unordered_map<TCharPtr, TCategoryHandle> TNameCategoryMap; - - typedef unordered_map<TMetaDataPropertyHandle, SMetaDataPropertyInfo, hash<int>> - TMetaDataPropertyMap; - typedef unordered_map<TInstanceHandle, vector<TMetaDataPropertyHandle>, hash<int>> - TInstancePropertyMap; - typedef unordered_map<pair<TInstanceHandle, TCharPtr>, TMetaDataPropertyHandle, - SInstanceStrHash> - TInstancePropertyNamePropertyMap; - typedef unordered_map<TMetaDataPropertyHandle, eastl::vector<SPropertyFilterInfo>, hash<int>> - TMetaDataPropertyFilterMap; - typedef unordered_map<TInstanceHandle, vector<TCharPtr>, hash<int>> TInstanceGroupMap; - - typedef unordered_map<TEventHandle, SEvent, hash<int>> TEventMap; - typedef unordered_map<TInstanceHandle, vector<TEventHandle>, hash<int>> TInstanceEventMap; - typedef unordered_map<pair<TInstanceHandle, TCharPtr>, TEventHandle, SInstanceStrHash> - TInstanceEventNameEventMap; - - typedef unordered_map<THandlerHandle, SHandler, hash<int>> THandlerMap; - typedef unordered_map<TInstanceHandle, vector<THandlerHandle>, hash<int>> TInstanceHandlerMap; - typedef unordered_map<pair<TInstanceHandle, TCharPtr>, THandlerHandle, SInstanceStrHash> - TInstanceHandlerNameHandlerMap; - - typedef unordered_map<TInstanceHandle, vector<TCharPtr>, hash<int>> TInstanceStringListMap; - typedef unordered_map<TCharPtr, SMetaDataEffectImpl> TEffectMap; - typedef unordered_map<TCharPtr, SMetaDataCustomMaterialImpl> TCustomMaterialMap; - - std::shared_ptr<IDataCore> m_DataCore; - IStringTable &m_StringTable; - TTransactionConsumerPtr m_Consumer; - - int m_NextId; - - // Helper objects to speed up queries - TStrInstanceMap m_CanonicalTypeToInstances; - TInstanceStrMap m_InstancesToCanonicalType; - TDerivationMap m_DerivationMap; - - TCategoryMap m_Categories; - TNameCategoryMap m_NameToCategories; - - TMetaDataPropertyMap m_Properties; - TInstancePropertyMap m_InstanceToProperties; - TInstancePropertyNamePropertyMap m_InstanceNameToProperties; - TMetaDataPropertyFilterMap m_PropertyFilters; - TInstanceGroupMap m_InstanceGroupMap; - - TEventMap m_Events; - TInstanceEventMap m_InstanceToEvents; - TInstanceEventNameEventMap m_InstanceNameToEvents; - - THandlerMap m_Handlers; - TInstanceHandlerMap m_InstanceToHandlers; - TInstanceHandlerNameHandlerMap m_InstanceNameToHandlers; - - TInstanceStringListMap m_InstanceToReferences; - - vector<TInstanceHandle> m_Parents; - vector<TInstanceHandle> m_NextParents; - vector<TInstanceHandle> m_DerivationChain; - unordered_set<int> m_UniqueSet; - unordered_set<size_t> m_SizeTSet; - - MemoryBuffer<RawAllocator> m_TempBuffer; - MemoryBuffer<RawAllocator> m_ReadBuffer; - - eastl::string m_ConvertStr; - - TCharStr m_ObjectName; - - TEffectMap m_EffectMap; - TCustomMaterialMap m_CustomMaterials; - -#ifndef QT3DSDM_META_DATA_NO_SIGNALS -Q_SIGNALS: - void internalCategoryDestroyed(Qt3DSDMCategoryHandle); - void internalMetaDataPropertyDestroyed(Qt3DSDMMetaDataPropertyHandle); - void internalEventDestroyed(Qt3DSDMEventHandle); - void internalHandlerDestroyed(Qt3DSDMHandlerHandle); - void internalHandlerArgDestroyed(Qt3DSDMHandlerHandle, QT3DSU32); -#else - SNullFunc internalCategoryDestroyed; - SNullFunc internalMetaDataPropertyDestroyed; - SNullFunc internalEventDestroyed; - SNullFunc internalHandlerDestroyed; - SNullFunc internalHandlerArgDestroyed; -#endif -public: - TSignalConnectionPtr m_PropertyDeletedConnection; - bool m_IgnorePropertyDeleted; - TSignalConnectionPtr m_InstanceDeletedConnection; - - SNewMetaDataImpl(std::shared_ptr<IDataCore> inDataCore) - : m_DataCore(inDataCore) - , m_StringTable(inDataCore->GetStringTable()) - , m_NextId(1) - , m_IgnorePropertyDeleted(false) - { -#ifndef QT3DSDM_META_DATA_NO_SIGNALS - CDataCoreProducer *producer = dynamic_cast<CDataCoreProducer *>(inDataCore.get()); - if (producer) { - m_PropertyDeletedConnection = producer->ConnectPropertyRemoved( - bind(&SNewMetaDataImpl::OnPropertyRemoved, this, - std::placeholders::_1, std::placeholders::_2)); - m_InstanceDeletedConnection = producer->ConnectBeforeInstanceDeleted( - bind(&SNewMetaDataImpl::OnInstanceRemoved, this, - std::placeholders::_1)); - } -#endif - } - - //////////////////////////////////////////////////////////////////////////// - // Helper Functions - - const wchar_t *Intern(TStrType inData) { return m_StringTable.RegisterStr(inData.wide_str()); } - const wchar_t *Intern(const char *inData) { return m_StringTable.GetWideStr(inData); } - - inline int GetNextId() - { - int retval = m_NextId; - ++m_NextId; - return retval; - } - - template <typename TMapType, typename THandleType> - static void AddItemToInstanceList(TInstanceHandle inInstance, THandleType inHandle, QT3DSU32 inIdx, - TMapType &ioMap) - { - pair<typename TMapType::iterator, bool> inserter = - ioMap.insert(make_pair(inInstance, vector<THandleType>())); - inserter.first->second.insert(inserter.first->second.begin() + inIdx, inHandle); - } - - template <typename TMapType, typename THandleType> - static QT3DSU32 AddItemToInstanceList(TInstanceHandle inInstance, THandleType inHandle, - TMapType &ioMap) - { - pair<typename TMapType::iterator, bool> inserter = - ioMap.insert(make_pair(inInstance, vector<THandleType>())); - QT3DSU32 offset = (QT3DSU32)inserter.first->second.size(); - inserter.first->second.push_back(inHandle); - return offset; - } - - template <typename TItemType> - struct VectorEqualPred - { - TItemType m_Item; - VectorEqualPred(const TItemType &inItem) - : m_Item(inItem) - { - } - - bool operator()(const TItemType &inOther) const { return m_Item == inOther; } - }; - - template <typename THandleType, typename TMapType> - static QT3DSU32 DoRemoveItemFromInstanceList(TInstanceHandle inInstance, THandleType inHandle, - TMapType &ioMap) - { - typename TMapType::iterator find = ioMap.find(inInstance); - if (find != ioMap.end()) { - typename vector<THandleType>::iterator theVecFind = - std::find(find->second.begin(), find->second.end(), inHandle); - if (theVecFind != find->second.end()) { - QT3DSU32 retval = (QT3DSU32)(theVecFind - find->second.begin()); - find->second.erase(theVecFind); - if (find->second.empty()) - ioMap.erase(find); - return retval; - } - } - QT3DS_ASSERT(false); - return QT3DS_MAX_U32; - } - - template <typename TMapType, typename THandleType> - struct InstanceListTransaction : ITransaction - { - TInstanceHandle m_Instance; - THandleType m_Handle; - TMapType &m_Map; - QT3DSU32 m_Idx; - bool m_InsertOnDo; - - InstanceListTransaction(const char *inFile, int inLine, TInstanceHandle inst, - THandleType handle, TMapType &map, QT3DSU32 inIdx, bool inInsertOnDo) - : ITransaction(inFile, inLine) - , m_Instance(inst) - , m_Handle(handle) - , m_Map(map) - , m_Idx(inIdx) - , m_InsertOnDo(inInsertOnDo) - { - } - - void insert() - { - SNewMetaDataImpl::AddItemToInstanceList(m_Instance, m_Handle, m_Idx, m_Map); - } - void remove() - { - SNewMetaDataImpl::DoRemoveItemFromInstanceList(m_Instance, m_Handle, m_Map); - } - - void Do() override - { - if (m_InsertOnDo) - insert(); - else - remove(); - } - void Undo() override - { - if (m_InsertOnDo) - remove(); - else - insert(); - } - }; - - template <typename THandleType, typename TMapType> - void RemoveItemFromInstanceList(const char *inFile, int inLine, TInstanceHandle inInstance, - THandleType inHandle, TMapType &ioMap) - { - typename TMapType::iterator find = ioMap.find(inInstance); - if (find != ioMap.end()) { - QT3DSU32 idx = DoRemoveItemFromInstanceList(inInstance, inHandle, ioMap); - if (m_Consumer != NULL) { - m_Consumer->OnTransaction( - std::make_shared<InstanceListTransaction<TMapType, THandleType>>( - inFile, inLine, inInstance, inHandle, std::ref(ioMap), idx, false)); - } - } - } - - template <typename THandleType, typename TValueType, typename TMapType, - typename TInstanceListMapType> - THandleType CreateItem(const char *inFile, int inLine, Qt3DSDMInstanceHandle inInstance, - TMapType &inMap, TInstanceListMapType &inInstanceListMap) - { - int retval = GetNextId(); - pair<THandleType, TValueType> thePair(make_pair(retval, TValueType(inInstance))); - inMap.insert(thePair); - QT3DSU32 idx = AddItemToInstanceList(inInstance, THandleType(retval), inInstanceListMap); - if (m_Consumer) { - CreateHashMapInsertTransaction(inFile, inLine, m_Consumer, thePair, inMap); - m_Consumer->OnTransaction( - std::make_shared<InstanceListTransaction<TInstanceListMapType, THandleType>>( - inFile, inLine, inInstance, retval, std::ref(inInstanceListMap), idx, true)); - } - return retval; - } - - template <typename TKeyType, typename TValueType, typename THashType> - TValueType *FindHashItem(TKeyType inHandle, - unordered_map<TKeyType, TValueType, THashType> &ioHash) - { - typename unordered_map<TKeyType, TValueType, THashType>::iterator find = - ioHash.find(inHandle); - if (find != ioHash.end()) - return &find->second; - return NULL; - } - - template <typename THandleType, typename TMapType> - static void DoReplaceNamedItem(TInstanceHandle inInst, TCharPtr inOldName, TCharPtr inNewName, - THandleType inNewHandle, TMapType &ioMap) - { - ioMap.erase(make_pair(inInst, inOldName)); - bool success = ioMap.insert(make_pair(make_pair(inInst, inNewName), inNewHandle)).second; - (void)success; - QT3DS_ASSERT(success); - } - - template <typename TMapType, typename THandleType> - struct ReplaceNamedItemTransaction : ITransaction - { - TInstanceHandle m_Instance; - TCharPtr m_OldName; - TCharPtr m_NewName; - THandleType m_OldHandle; - THandleType m_NewHandle; - TMapType &m_Map; - ReplaceNamedItemTransaction(const char *inFile, int inLine, TInstanceHandle inst, - TCharPtr oldNm, TCharPtr newNm, THandleType oldHdl, - THandleType newHdl, TMapType &map) - : ITransaction(inFile, inLine) - , m_Instance(inst) - , m_OldName(oldNm) - , m_NewName(newNm) - , m_OldHandle(oldHdl) - , m_NewHandle(newHdl) - , m_Map(map) - { - } - void Do() override - { - SNewMetaDataImpl::DoReplaceNamedItem(m_Instance, m_OldName, m_NewName, m_NewHandle, - m_Map); - } - void Undo() override - { - SNewMetaDataImpl::DoReplaceNamedItem(m_Instance, m_NewName, m_OldName, m_OldHandle, - m_Map); - } - }; - - template <typename THandleType, typename TMapType> - void ReplaceNamedItem(const char *inFile, int inLine, TInstanceHandle inInst, - TCharPtr inOldName, TCharPtr inNewName, THandleType inNewHandle, - TMapType &ioMap) - { - typename TMapType::iterator find = ioMap.find(std::make_pair(inInst, inOldName)); - THandleType oldHandle; - if (find != ioMap.end()) - oldHandle = find->second; - DoReplaceNamedItem(inInst, inOldName, inNewName, inNewHandle, ioMap); - if (m_Consumer) { - if (oldHandle.Valid()) { - m_Consumer->OnTransaction( - std::make_shared<ReplaceNamedItemTransaction<TMapType, THandleType>>( - inFile, inLine, inInst, inOldName, inNewName, oldHandle, inNewHandle, - std::ref(ioMap))); - } else - CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer, - make_pair(make_pair(inInst, inNewName), inNewHandle), - ioMap); - } - } - - template <typename THandleType, typename TMapType> - void DestroyNamedItem(const char *inFile, int inLine, TInstanceHandle inInst, TCharPtr inName, - TMapType &ioMap) - { - typename TMapType::iterator iter = ioMap.find(make_pair(inInst, inName)); - if (iter != ioMap.end()) { - pair<pair<TInstanceHandle, TCharPtr>, THandleType> existing(*iter); - ioMap.erase(iter); - CreateHashMapEraseTransaction(inFile, inLine, m_Consumer, existing, ioMap); - } - } - - template <typename THandleType, typename TInfoType, typename TMapType, typename TNamedMapType> - void SetItemInfo(const char *inFile, int inLine, THandleType inItem, const TInfoType &oldInfo, - const TInfoType &newInfo, TMapType &inMap, TNamedMapType &inNamedMap) - { - TCharPtr newName = Intern(newInfo.m_Name.wide_str()); - TCharPtr oldName = Intern(oldInfo.m_Name.wide_str()); - ReplaceNamedItem(inFile, inLine, newInfo.m_Instance, oldName, newName, inItem, inNamedMap); - CreateHashMapSwapTransaction(inFile, inLine, m_Consumer, inItem, oldInfo, newInfo, inMap); - } - - bool AddDerivationChainItem(TInstanceHandle inInst) - { - if (m_UniqueSet.find(inInst) == m_UniqueSet.end()) { - m_DerivationChain.push_back(inInst); - m_UniqueSet.insert(inInst); - return true; - } - return false; - } - - void GetDerivationChain(TInstanceHandle inInst) - { - m_Parents.clear(); - m_DerivationChain.clear(); - m_UniqueSet.clear(); - m_NextParents.clear(); - m_DataCore->GetInstanceParents(inInst, m_Parents); - - TDerivationMap::iterator mapIter = m_DerivationMap.find(m_Parents); - if (mapIter != m_DerivationMap.end()) - m_DerivationChain = mapIter->second; - else { - while (m_Parents.empty() == false) { - for (size_t idx = 0, end = m_Parents.size(); idx < end; ++idx) { - if (AddDerivationChainItem(m_Parents[idx])) - m_DataCore->GetInstanceParents(m_Parents[idx], m_NextParents); - } - m_Parents = m_NextParents; - m_NextParents.clear(); - } - m_NextParents.clear(); - - m_DataCore->GetInstanceParents(inInst, m_NextParents); - m_DerivationMap.insert(make_pair(m_NextParents, m_DerivationChain)); - } - } - - template <typename THandleType, typename TMapType> - THandleType FindItemByName(TInstanceHandle inInst, TCharPtr inName, TMapType &ioMap) - { - typename TMapType::iterator find(ioMap.find(make_pair(inInst, inName))); - if (find != ioMap.end()) - return find->second; - - GetDerivationChain(inInst); - for (size_t idx = 0, end = m_DerivationChain.size(); idx < end; ++idx) { - find = ioMap.find(make_pair(m_DerivationChain[idx], inName)); - if (find != ioMap.end()) - return find->second; - } - return 0; - } - - template <typename TItemType, typename TVectorType> - void AddListMapItems(const std::vector<TItemType> &inMapEntry, TVectorType &outVector) - { - typedef typename std::vector<TItemType>::const_iterator TIterType; - for (TIterType theIter = inMapEntry.begin(), theEnd = inMapEntry.end(); theIter != theEnd; - ++theIter) - outVector.push_back(*theIter); - } - - template <typename TListMapType, typename TSizeTOpType, typename TVectorType> - void DoGetHandleList(Qt3DSDMInstanceHandle inInstance, TListMapType &inMap, - TVectorType &outHandles, TSizeTOpType inOperator) - { - typename TListMapType::iterator find; - GetDerivationChain(inInstance); - for (size_t idx = 0, end = m_DerivationChain.size(); idx < end; ++idx) { - // Add base classes to the list first - find = inMap.find(m_DerivationChain[end - idx - 1]); - if (find != inMap.end()) - AddListMapItems(find->second, outHandles); - } - find = inMap.find(inInstance); - if (find != inMap.end()) - AddListMapItems(find->second, outHandles); - m_SizeTSet.clear(); - for (size_t ridx = 0; ridx < outHandles.size(); ++ridx) { - size_t idx = outHandles.size() - ridx - 1; - // Run through the list backwards, making sure that items further in the list - // completely overshadow items earlier in the list. - - // Create unique key from the item that we can check against - size_t item = inOperator(outHandles[idx]); - if (m_SizeTSet.insert(item).second == false) { - outHandles.erase(outHandles.begin() + idx); - --ridx; - } - } - } - - template <typename THandleType, typename TMapType> - struct NameSizeTOpType - { - SNewMetaDataImpl &m_Impl; - TMapType &m_Map; - NameSizeTOpType(SNewMetaDataImpl &inImpl, TMapType &inMap) - : m_Impl(inImpl) - , m_Map(inMap) - { - } - - size_t operator()(THandleType inHandle) - { - return reinterpret_cast<size_t>(m_Impl.Intern(m_Map[inHandle].m_Name)); - } - }; - - // Ensure we don't return two items of the same name. - template <typename THandleType, typename TListMapType, typename TMapType> - void GetHandleList(Qt3DSDMInstanceHandle inInstance, TListMapType &inMap, TMapType &inTypeName, - vector<THandleType> &outHandles) - { - DoGetHandleList(inInstance, inMap, outHandles, - NameSizeTOpType<THandleType, TMapType>(*this, inTypeName)); - } - - template <typename THandleType, typename TMapType, typename TNameMapType, - typename TListMapType> - bool DestroyItem(const char *inFile, int inLine, THandleType inItem, - TMapType &inMap, TNameMapType &inNameMap, TListMapType &inListMap) - { - typename TMapType::iterator find(inMap.find(inItem)); - if (find == inMap.end()) - return false; - DestroyNamedItem<THandleType>(inFile, inLine, find->second.m_Instance, - Intern(find->second.m_Name.wide_str()), inNameMap); - RemoveItemFromInstanceList(inFile, inLine, find->second.m_Instance, inItem, inListMap); - CreateHashMapEraseTransaction(inFile, inLine, m_Consumer, - make_pair(find->first, find->second), inMap); - inMap.erase(find); - return true; - } - - template <typename THandleType, typename TListMapType> - void ForEachItem(Qt3DSDMInstanceHandle inInstance, TListMapType &ioMap, - function<void(THandleType)> inOperation) - { - typename TListMapType::iterator find = ioMap.find(inInstance); - if (find != ioMap.end()) { - vector<THandleType> itemData(find->second); - for (size_t idx = 0, end = itemData.size(); idx < end; ++idx) - inOperation(itemData[idx]); - } - } - - SCategoryInfo *FindCategory(Qt3DSDMCategoryHandle inCategory) - { - return FindHashItem(inCategory, m_Categories); - } - - SMetaDataPropertyInfo *FindProperty(Qt3DSDMMetaDataPropertyHandle inPropertyHandle) - { - return FindHashItem(inPropertyHandle, m_Properties); - } - - SEvent *FindEvent(Qt3DSDMEventHandle inEventHandle) - { - return FindHashItem(inEventHandle, m_Events); - } - - SHandler *FindHandler(Qt3DSDMHandlerHandle inHandle) - { - return FindHashItem(inHandle, m_Handlers); - } - - SMetaDataHandlerArgumentInfo *FindHandlerArg(Qt3DSDMHandlerHandle inHandler, QT3DSU32 inIdx) - { - SHandler *theHandler(FindHandler(inHandler)); - if (theHandler && theHandler->m_Arguments.size() > inIdx) - return &theHandler->m_Arguments[inIdx]; - return NULL; - } - - void OnPropertyRemoved(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) - { - if (m_IgnorePropertyDeleted) - return; - - vector<Qt3DSDMMetaDataPropertyHandle> propertiesToDestroy; - for (TMetaDataPropertyMap::iterator iter = m_Properties.begin(), end = m_Properties.end(); - iter != end; ++iter) { - if (iter->second.m_Property == inProperty) - propertiesToDestroy.push_back(iter->first); - } - - for (size_t idx = 0, end = propertiesToDestroy.size(); idx < end; ++idx) - DestroyMetaDataProperty(propertiesToDestroy[idx]); - } - - void OnInstanceRemoved(Qt3DSDMInstanceHandle inInstance) { DestroyMetaData(inInstance); } - template <typename TEntryType, typename TMapType> - void InsertWithTransaction(const char *inFile, int inLine, const TEntryType &inEntry, - TMapType &inMap) - { - inMap.insert(inEntry); - CreateHashMapInsertTransaction(inFile, inLine, m_Consumer, inEntry, inMap); - } - - template <typename TKeyType, typename TMapType> - void EraseWithTransaction(const char *inFile, int inLine, TKeyType inKey, TMapType &inMap) - { - typename TMapType::iterator find(inMap.find(inKey)); - if (find != inMap.end()) { - CreateHashMapEraseTransaction(inFile, inLine, m_Consumer, - std::make_pair(find->first, find->second), inMap); - inMap.erase(find); - } - } - - template <typename TEntryType, typename TMapType> - void InsertOrUpdateWithTransaction(const TEntryType &inEntry, TMapType &inMap) - { - pair<typename TMapType::iterator, bool> inserter = inMap.insert(inEntry); - if (inserter.second) - CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer, inEntry, inMap); - else { - typename TMapType::iterator theIter(inserter.first); - CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, theIter->first, - theIter->second, inEntry.second, inMap); - theIter->second = inEntry.second; - } - } - - //////////////////////////////////////////////////////////////////////////////////// - // API Implementation - - //////////////////////////////////////////////////////////////////////////////////// - // Sharing some utility objects - IStringTable &GetStringTable() override { return m_DataCore->GetStringTable(); } - TStringTablePtr GetStringTablePtr() override { return m_DataCore->GetStringTablePtr(); } - TDataCorePtr GetDataCore() override { return m_DataCore; } - - //////////////////////////////////////////////////////////////////////////////////// - // Canonical Instances - void SetInstanceAsCanonical(Qt3DSDMInstanceHandle inInstance, TStrType inTypename) override - { - const wchar_t *theTypename(Intern(inTypename)); - if (g_DataModelDebugLogger) - g_DataModelDebugLogger("IMetaData::SetInstanceAsCanonical Enter"); - if (g_DataModelDebugLogger) - g_DataModelDebugLogger(GetStringTable().GetNarrowStr(inTypename.wide_str())); - m_CanonicalTypeToInstances.insert(make_pair(theTypename, inInstance)); - m_InstancesToCanonicalType.insert(make_pair(inInstance, theTypename)); - CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer, - make_pair(theTypename, inInstance), - m_CanonicalTypeToInstances); - CreateHashMapInsertTransaction(__FILE__, __LINE__, m_Consumer, - make_pair(inInstance, theTypename), - m_InstancesToCanonicalType); - if (g_DataModelDebugLogger) - g_DataModelDebugLogger("IMetaData::SetInstanceAsCanonical Leave"); - } - - Qt3DSDMInstanceHandle GetCanonicalInstanceForType(TStrType inTypename) override - { - TStrInstanceMap::iterator find = m_CanonicalTypeToInstances.find(Intern(inTypename)); - if (find != m_CanonicalTypeToInstances.end()) - return find->second; - return 0; - } - - Option<TCharStr> GetTypeForCanonicalInstance(Qt3DSDMInstanceHandle inInstance) override - { - TInstanceStrMap::iterator find = m_InstancesToCanonicalType.find(inInstance); - if (find != m_InstancesToCanonicalType.end()) - return TCharStr(find->second); - return Empty(); - } - - Option<TCharStr> GetTypeForInstance(Qt3DSDMInstanceHandle inInstance) override - { - Option<TCharStr> theType = GetTypeForCanonicalInstance(inInstance); - if (theType.hasValue()) - return theType; - GetDerivationChain(inInstance); - for (size_t idx = 0, end = m_DerivationChain.size(); idx < end; ++idx) { - theType = GetTypeForCanonicalInstance(m_DerivationChain[idx]); - if (theType.hasValue()) - return theType; - } - return Empty(); - } - - QT3DSU32 GetGroupCountForInstance(Qt3DSDMInstanceHandle inInstance) override - { - std::vector<TCharStr> outNames; - QT3DSU32 count = GetGroupNamesForInstance(inInstance, outNames); - return (count == 0) ? 1 : count; - } - - QT3DSU32 GetGroupNamesForInstance(Qt3DSDMInstanceHandle inInstance, - std::vector<TCharStr> &outNames) override - { - TInstanceStrMap::iterator canonicalFind = m_InstancesToCanonicalType.find(inInstance); - if (canonicalFind != m_InstancesToCanonicalType.end()) { - TInstanceGroupMap::iterator find = m_InstanceGroupMap.find(inInstance); - if (find != m_InstanceGroupMap.end()) { - pair<typename TInstanceGroupMap::iterator, bool> inserter = - m_InstanceGroupMap.insert(make_pair(inInstance, vector<TCharPtr>())); - vector<TCharPtr> &itemList = inserter.first->second; - for (size_t i = 0, j = itemList.size(); i < j; ++i) { - bool alreadyInList = false; - // discard duplicates - for (size_t k = 0, l = outNames.size(); k < l; ++k) { - TCharStr curListName = itemList[i]; - if (curListName == outNames[k].wide_str()) { - alreadyInList = true; - break; - } - } - if (!alreadyInList) - outNames.push_back(itemList[i]); - } - } - return (QT3DSU32)outNames.size(); - } - - GetDerivationChain(inInstance); - - for (int idx = (int)m_DerivationChain.size() - 1, end = 0; idx >= end; --idx) { - TInstanceGroupMap::iterator find = m_InstanceGroupMap.find(m_DerivationChain[idx]); - if (find != m_InstanceGroupMap.end()) { - pair<typename TInstanceGroupMap::iterator, bool> inserter = - m_InstanceGroupMap.insert( - make_pair(m_DerivationChain[idx], vector<TCharPtr>())); - vector<TCharPtr> &itemList = inserter.first->second; - for (size_t i = 0, j = itemList.size(); i < j; ++i) { - bool alreadyInList = false; - // discard duplicates - for (size_t k = 0, l = outNames.size(); k < l; ++k) { - TCharStr curListName = itemList[i]; - if (curListName == outNames[k].wide_str()) { - alreadyInList = true; - break; - } - } - if (!alreadyInList) - outNames.push_back(itemList[i]); - } - } - } - - return (QT3DSU32)outNames.size(); - } - - Option<TCharStr> GetGroupFilterNameForInstance(Qt3DSDMInstanceHandle inInstance, - long inIndex) override - { - std::vector<TCharStr> outNames; - QT3DSU32 count = GetGroupNamesForInstance(inInstance, outNames); - if (count > (QT3DSU32)inIndex) - return outNames[inIndex]; - - return Empty(); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Categories - - std::pair<Qt3DSDMCategoryHandle, bool> GetOrCreateCategory(TStrType inName) override - { - TCharPtr theName(Intern(inName)); - TNameCategoryMap::iterator find = m_NameToCategories.find(theName); - if (find != m_NameToCategories.end()) - return make_pair(find->second, false); - - TCategoryHandle retval(GetNextId()); - InsertWithTransaction(__FILE__, __LINE__, make_pair(retval, SCategoryInfo(inName)), - m_Categories); - InsertWithTransaction(__FILE__, __LINE__, make_pair(theName, retval), m_NameToCategories); - return make_pair(retval, true); - } - - void SetCategoryInfo(Qt3DSDMCategoryHandle inCategory, TStrType inIcon, - TStrType inHighlight, TStrType inDescription) override - { - SCategoryInfo *infoPtr(FindCategory(inCategory)); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - SCategoryInfo &newInfo(*infoPtr); - SCategoryInfo oldInfo(newInfo); - - newInfo.m_Icon = inIcon; - newInfo.m_HighlightIcon = inHighlight; - newInfo.m_Description = inDescription; - CreateHashMapSwapTransaction(__FILE__, __LINE__, m_Consumer, inCategory, oldInfo, newInfo, - m_Categories); - } - - void DestroyCategory(Qt3DSDMCategoryHandle inCategory) override - { - SCategoryInfo *infoPtr(FindCategory(inCategory)); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - EraseWithTransaction(__FILE__, __LINE__, Intern(infoPtr->m_Name), m_NameToCategories); - EraseWithTransaction(__FILE__, __LINE__, inCategory, m_Categories); - } - Option<SCategoryInfo> GetCategoryInfo(Qt3DSDMCategoryHandle inCategory) override - { - SCategoryInfo *infoPtr(FindCategory(inCategory)); - if (infoPtr) - return *infoPtr; - return Empty(); - } - Qt3DSDMCategoryHandle FindCategoryByName(TStrType inName) override - { - TCharPtr theName(Intern(inName)); - TNameCategoryMap::iterator find = m_NameToCategories.find(theName); - if (find != m_NameToCategories.end()) - return find->second; - return 0; - } - - void GetCategories(vector<Qt3DSDMCategoryHandle> &outCategories) override - { - for (TCategoryMap::iterator iter = m_Categories.begin(), end = m_Categories.end(); - iter != end; ++iter) - outCategories.push_back(iter->first); - } - - Option<SCategoryInfo> GetEventCategory(TStrType inName) override - { - return GetCategoryInfo(FindCategoryByName(inName)); - } - - Option<SCategoryInfo> GetHandlerCategory(TStrType inName) override - { - return GetCategoryInfo(FindCategoryByName(inName)); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Properties - - Qt3DSDMMetaDataPropertyHandle CreateMetaDataProperty(Qt3DSDMInstanceHandle inInstance) override - { - return CreateItem<Qt3DSDMMetaDataPropertyHandle, SMetaDataPropertyInfo>( - __FILE__, __LINE__, inInstance, m_Properties, m_InstanceToProperties); - } - - void EnsureDataCoreProperty(SMetaDataPropertyInfo &newInfo) - { - m_IgnorePropertyDeleted = true; - // If the existing property under the new name doesn't match - // the new info, then we also have to delete the property - Qt3DSDMPropertyHandle theExistingProperty = - m_DataCore->GetAggregateInstancePropertyByName(newInfo.m_Instance, newInfo.m_Name); - // Ensure the types match. - if (theExistingProperty.Valid()) { - Qt3DSDMPropertyDefinition theDefinition(m_DataCore->GetProperty(theExistingProperty)); - if (theDefinition.m_Name != newInfo.m_Name - || theDefinition.m_Type != newInfo.GetDataType()) { - m_DataCore->RemoveProperty(theExistingProperty); - theExistingProperty = 0; - } - } - - // Finally, if we don't have a property at this point, create a new property - if (theExistingProperty.Valid() == false) - theExistingProperty = m_DataCore->AddProperty( - newInfo.m_Instance, newInfo.m_Name.wide_str(), newInfo.GetDataType()); - newInfo.m_Property = theExistingProperty; - m_IgnorePropertyDeleted = false; - } - - // If the type doesn't match the default, then it has no default. - SValue VerifyDefaultPropertyType(DataModelDataType::Value inDataType, const SValue &inValue) - { - if (inValue.empty() == false) { - DataModelDataType::Value theType = GetValueType(inValue); - if (theType != inDataType) { - return SValue(0.0f); - } - } - return inValue; - } - // If the datatype doesn't match the value, force the value to match the type. - // some types *have* to have values. - TMetaDataData VerifyMetaDataDataType(AdditionalMetaDataType::Value inDataType, - const TMetaDataData &inValue) - { - if (inDataType == AdditionalMetaDataType::StringList - || inDataType == AdditionalMetaDataType::Range) { - if (inValue.empty() == true || inDataType != GetMetaDataValueType(inValue)) { - QT3DS_ASSERT(false); - if (inDataType == AdditionalMetaDataType::StringList) - return TMetaDataStringList(); - if (inDataType == AdditionalMetaDataType::Range) - return SMetaDataRange(0, 1); - } - } - return inValue; - } - - void SetPropertyBaseInfo(SMetaPropertyBase &newInfo, TStrType inName, TStrType inFormalName, - TStrType inDescription, TStrType inUsage, - CompleteMetaDataType::Enum inDataType, const SValue &inDefaultValue, - const TMetaDataData &inMetaData) - { - newInfo.m_Name = inName; - newInfo.m_FormalName = inFormalName; - newInfo.m_Description = inDescription; - newInfo.m_Usage = inUsage; - newInfo.m_CompleteType = inDataType; - newInfo.m_DefaultValue = - VerifyDefaultPropertyType(CompleteMetaDataType::ToDataType(inDataType), - inDefaultValue); - newInfo.m_MetaDataData = - VerifyMetaDataDataType(CompleteMetaDataType::ToAdditionalType(inDataType), - inMetaData); - } - - // For properties, you set the default values separately - // This may delete the underlying data model property rebuild it. - void SetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inPropertyHandle, - TStrType inName, TStrType inFormalName, - TStrType inDescription, TStrType inUsage, - CompleteMetaDataType::Enum inDataType, - const SValue &inDefaultValue, - const TMetaDataData &inMetaData, TStrType inGroupName, - bool inIsHidden, bool inIsAnimatable, - bool inIsControllable) override - { - SMetaDataPropertyInfo *infoPtr = FindProperty(inPropertyHandle); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - SMetaDataPropertyInfo &newInfo(*infoPtr); - SMetaDataPropertyInfo oldInfo(newInfo); - - SetPropertyBaseInfo(newInfo, inName, inFormalName, inDescription, inUsage, inDataType, - inDefaultValue, inMetaData); - newInfo.m_IsHidden = inIsHidden; - newInfo.m_Animatable = inIsAnimatable; - newInfo.m_Controllable = inIsControllable; - newInfo.m_GroupName = inGroupName; - EnsureDataCoreProperty(newInfo); - - SetItemInfo(__FILE__, __LINE__, inPropertyHandle, oldInfo, newInfo, m_Properties, - m_InstanceNameToProperties); - - SetPropertyDefault(newInfo, CompleteMetaDataType::ToDataType(inDataType)); - } - - void SetPropertyDefault(SMetaDataPropertyInfo &newInfo, DataModelDataType::Value inDataType) - { - if (newInfo.m_DefaultValue.empty() == false - && GetValueType(newInfo.m_DefaultValue) == inDataType) { - m_DataCore->SetInstancePropertyValue(newInfo.m_Instance, newInfo.m_Property, - newInfo.m_DefaultValue); - } - } - - // Destroy just this meta data property - void DestroyMetaDataProperty(Qt3DSDMMetaDataPropertyHandle inProperty) override - { - SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - if (DestroyItem(__FILE__, __LINE__, inProperty, - m_Properties, m_InstanceNameToProperties, m_InstanceToProperties)) { - Q_EMIT internalMetaDataPropertyDestroyed(inProperty); - } - - RemoveMetaDataPropertyFilters(inProperty); - } - - Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance, - TStrType inPropertyName) override - { - return FindItemByName<Qt3DSDMMetaDataPropertyHandle>(inInstance, Intern(inPropertyName), - m_InstanceNameToProperties); - } - Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - Qt3DSDMPropertyDefinition propDef(m_DataCore->GetProperty(inProperty)); - return GetMetaDataProperty(inInstance, propDef.m_Name); - } - // Sets the value in the data core - virtual Option<SMetaDataPropertyInfo> - GetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inProperty) override - { - SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty); - if (infoPtr == NULL) { - return Empty(); - } - return *infoPtr; - } - - void GetMetaDataProperties(Qt3DSDMInstanceHandle inInstance, - vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) override - { - return GetHandleList<Qt3DSDMMetaDataPropertyHandle>(inInstance, m_InstanceToProperties, - m_Properties, outProperties); - } - virtual Qt3DSDMMetaDataPropertyHandle - GetSpecificMetaDataProperty(Qt3DSDMInstanceHandle inInstance, TStrType inPropertyName) - { - TInstancePropertyNamePropertyMap::iterator theFind = m_InstanceNameToProperties.find( - make_pair(inInstance, m_StringTable.RegisterStr(inPropertyName.wide_str()))); - if (theFind != m_InstanceNameToProperties.end()) - return theFind->second; - return 0; - } - virtual Qt3DSDMMetaDataPropertyHandle - GetOrCreateSpecificMetaDataProperty(Qt3DSDMInstanceHandle inInstance, - TStrType inPropertyName) override - { - Qt3DSDMMetaDataPropertyHandle theProp( - GetSpecificMetaDataProperty(inInstance, inPropertyName)); - if (theProp.Valid()) - return theProp; - return CreateMetaDataProperty(inInstance); - } - - void GetSpecificMetaDataProperties(Qt3DSDMInstanceHandle inInstance, - vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) override - { - TInstancePropertyMap::iterator find = m_InstanceToProperties.find(inInstance); - if (find != m_InstanceToProperties.end()) - outProperties.insert(outProperties.end(), find->second.begin(), find->second.end()); - } - - TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty)); - SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle); - if (infoPtr) - return infoPtr->m_FormalName; - return TCharStr(); - } - AdditionalMetaDataType::Value GetAdditionalMetaDataType( - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override - { - Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty)); - SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle); - if (infoPtr) - return infoPtr->GetAdditionalType(); - return AdditionalMetaDataType::None; - } - TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty)); - SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle); - if (propHandle.Valid()) - return infoPtr->m_MetaDataData; - return TMetaDataData(); - } - - bool IsCustomInstance(Qt3DSDMInstanceHandle inInstance) - { - return m_InstancesToCanonicalType.find(inInstance) == m_InstancesToCanonicalType.end(); - } - - SValue GetDefaultValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - Qt3DSDMMetaDataPropertyHandle theProperty(GetMetaDataProperty(inInstance, inProperty)); - if (theProperty.Valid() == false) { - QT3DS_ASSERT(false); - return SValue(); - } - return FindProperty(theProperty)->m_DefaultValue; - } - - bool IsCustomProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - Qt3DSDMMetaDataPropertyHandle propHandle(GetMetaDataProperty(inInstance, inProperty)); - SMetaDataPropertyInfo *infoPtr = FindProperty(propHandle); - if (infoPtr) - return IsCustomInstance(infoPtr->m_Instance); - - return false; - } - - bool IsFilterValid(Qt3DSDMMetaDataPropertyHandle inProperty, - const SPropertyFilterInfo &inFilter) - { - SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty); - if (m_DataCore->IsProperty(inFilter.m_FilterProperty) == false) { - QT3DS_ASSERT(false); - return false; - } - - Qt3DSDMPropertyDefinition theProp(m_DataCore->GetProperty(inFilter.m_FilterProperty)); - Qt3DSDMPropertyHandle propCheck = - m_DataCore->GetAggregateInstancePropertyByName(infoPtr->m_Instance, theProp.m_Name); - if (propCheck != inFilter.m_FilterProperty) { - QT3DS_ASSERT(false); - return false; - } - - DataModelDataType::Value theType = GetValueType(inFilter.m_Value); - if (theType != theProp.m_Type) { - QT3DS_ASSERT(false); - return false; - } - - return true; - } - - void SetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty, - NVConstDataRef<SPropertyFilterInfo> inFilters) override - { - SMetaDataPropertyInfo *infoPtr = FindProperty(inProperty); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - - eastl::vector<SPropertyFilterInfo> newFilters; - for (QT3DSU32 idx = 0, end = inFilters.size(); idx < end; ++idx) { - const SPropertyFilterInfo &theFilter(inFilters[idx]); - if (IsFilterValid(inProperty, theFilter)) - newFilters.push_back(theFilter); - } - - InsertOrUpdateWithTransaction(std::make_pair(inProperty, newFilters), m_PropertyFilters); - } - - virtual NVConstDataRef<SPropertyFilterInfo> - GetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) override - { - TMetaDataPropertyFilterMap::iterator theIter(m_PropertyFilters.find(inProperty)); - if (theIter != m_PropertyFilters.end()) - return qt3ds::foundation::toDataRef(theIter->second.data(), theIter->second.size()); - return NVConstDataRef<SPropertyFilterInfo>(); - } - - void RemoveMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) override - { - TMetaDataPropertyFilterMap::iterator theIter(m_PropertyFilters.find(inProperty)); - if (theIter != m_PropertyFilters.end()) - EraseWithTransaction(__FILE__, __LINE__, inProperty, m_PropertyFilters); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Properties - Qt3DSDMEventHandle CreateMetaDataEvent(TInstanceHandle inInstance) override - { - return CreateItem<Qt3DSDMEventHandle, SEvent>(__FILE__, __LINE__, inInstance, m_Events, - m_InstanceToEvents); - } - - void SetEventInfo(Qt3DSDMEventHandle inEventHandle, TStrType inName, - TStrType inFormalName, TStrType inCategory, TStrType inDescription) override - { - SEvent *infoPtr = FindEvent(inEventHandle); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - SEvent &newInfo(*infoPtr); - SEvent oldInfo(newInfo); - newInfo.m_Name = inName; - newInfo.m_FormalName = inFormalName; - newInfo.m_Category = inCategory; - newInfo.m_Description = inDescription; - SetItemInfo(__FILE__, __LINE__, inEventHandle, oldInfo, newInfo, m_Events, - m_InstanceNameToEvents); - } - - void DestroyEvent(Qt3DSDMEventHandle inEventHandle) override - { - if (DestroyItem(__FILE__, __LINE__, inEventHandle, m_Events, - m_InstanceNameToEvents, m_InstanceToEvents)) { - Q_EMIT internalEventDestroyed(inEventHandle); - } - } - - void GetEvents(Qt3DSDMInstanceHandle inInstance, TEventHandleList &outEvents) override - { - return GetHandleList<Qt3DSDMEventHandle>(inInstance, m_InstanceToEvents, m_Events, - outEvents); - } - - Qt3DSDMEventHandle FindEvent(Qt3DSDMInstanceHandle inInstance, TStrType inName) override - { - return FindItemByName<Qt3DSDMEventHandle>(inInstance, Intern(inName), - m_InstanceNameToEvents); - } - - Option<SEventInfo> GetEventInfo(Qt3DSDMEventHandle inEventHandle) override - { - SEvent *infoPtr = FindEvent(inEventHandle); - if (infoPtr == NULL) { - return Empty(); - } - SEventInfo retval; - retval.m_Name = infoPtr->m_Name; - retval.m_FormalName = infoPtr->m_FormalName; - retval.m_Description = infoPtr->m_Description; - retval.m_Category = infoPtr->m_Category; - return retval; - } - - bool IsCustomEvent(Qt3DSDMEventHandle inEventHandle) override - { - SEvent *infoPtr = FindEvent(inEventHandle); - if (infoPtr != NULL) - return IsCustomInstance(infoPtr->m_Instance); - return false; - } - - void GetSpecificEvents(Qt3DSDMInstanceHandle inInstance, TEventHandleList &outEvents) override - { - TInstanceEventMap::iterator theFind(m_InstanceToEvents.find(inInstance)); - if (theFind != m_InstanceToEvents.end()) - outEvents.insert(outEvents.end(), theFind->second.begin(), theFind->second.end()); - } - - Qt3DSDMEventHandle GetOrCreateSpecificEvent(Qt3DSDMInstanceHandle inInstance, - TStrType inName) override - { - TInstanceEventNameEventMap::iterator theFind( - m_InstanceNameToEvents.find(make_pair(inInstance, Intern(inName)))); - if (theFind != m_InstanceNameToEvents.end()) - return theFind->second; - return CreateMetaDataEvent(inInstance); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Handlers - - Qt3DSDMHandlerHandle CreateHandler(Qt3DSDMInstanceHandle inInstance) override - { - return CreateItem<Qt3DSDMHandlerHandle, SHandler>(__FILE__, __LINE__, inInstance, - m_Handlers, m_InstanceToHandlers); - } - - void SetHandlerInfo(Qt3DSDMHandlerHandle inHandle, TStrType inName, - TStrType inFormalName, TStrType inCategoryName, - TStrType inDescription) override - { - SHandler *infoPtr = FindHandler(inHandle); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - SHandler &newInfo(*infoPtr); - SHandler oldInfo(newInfo); - newInfo.m_Name = inName; - newInfo.m_FormalName = inFormalName; - newInfo.m_Description = inDescription; - newInfo.m_Category = inCategoryName; - SetItemInfo(__FILE__, __LINE__, inHandle, oldInfo, newInfo, m_Handlers, - m_InstanceNameToHandlers); - } - - void DestroyHandler(Qt3DSDMHandlerHandle inHandlerHandle) override - { - SHandler *infoPtr(FindHandler(inHandlerHandle)); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - while (infoPtr->m_Arguments.empty() == false) - DestroyHandlerArgument(inHandlerHandle, (QT3DSU32)infoPtr->m_Arguments.size() - 1); - if (DestroyItem(__FILE__, __LINE__, inHandlerHandle, m_Handlers, - m_InstanceNameToHandlers, m_InstanceToHandlers)) { - Q_EMIT internalHandlerDestroyed(inHandlerHandle); - } - } - - Qt3DSDMHandlerHandle FindHandlerByName(Qt3DSDMInstanceHandle inInstance, - TStrType inName) override - { - return FindItemByName<Qt3DSDMHandlerHandle>(inInstance, Intern(inName), - m_InstanceNameToHandlers); - } - - Option<SHandlerInfo> GetHandlerInfo(Qt3DSDMHandlerHandle inHandlerHandle) override - { - SHandler *infoPtr = FindHandler(inHandlerHandle); - if (infoPtr == NULL) - return Empty(); - - SHandlerInfo retval; - retval.m_Name = infoPtr->m_Name; - retval.m_FormalName = infoPtr->m_FormalName; - retval.m_Category = infoPtr->m_Category; - retval.m_Description = infoPtr->m_Description; - - return retval; - } - - void GetHandlers(Qt3DSDMInstanceHandle inInstance, THandlerHandleList &outHandlers) override - { - return GetHandleList<Qt3DSDMHandlerHandle>(inInstance, m_InstanceToHandlers, m_Handlers, - outHandlers); - } - - bool IsCustomHandler(Qt3DSDMHandlerHandle inHandle) override - { - SHandler *infoPtr = FindHandler(inHandle); - if (infoPtr != NULL) - return IsCustomInstance(infoPtr->m_Instance); - return false; - } - - void GetSpecificHandlers(Qt3DSDMInstanceHandle inInstance, - THandlerHandleList &outHandlers) override - { - TInstanceHandlerMap::iterator theFind = m_InstanceToHandlers.find(inInstance); - if (theFind != m_InstanceToHandlers.end()) - outHandlers.insert(outHandlers.end(), theFind->second.begin(), theFind->second.end()); - } - - Qt3DSDMHandlerHandle GetOrCreateSpecificHandler(Qt3DSDMInstanceHandle inInstance, - TStrType inName) override - { - TInstanceHandlerNameHandlerMap::iterator theFind = - m_InstanceNameToHandlers.find(make_pair(inInstance, Intern(inName))); - if (theFind != m_InstanceNameToHandlers.end()) - return theFind->second; - return CreateHandler(inInstance); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Handler Arguments - - void DoAddHandlerArgument(Qt3DSDMHandlerHandle inHandler, - const SMetaDataHandlerArgumentInfo &inArgHandle, QT3DSU32 inIdx) - { - SHandler *infoPtr = FindHandler(inHandler); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - infoPtr->m_Arguments.insert(infoPtr->m_Arguments.begin() + inIdx, inArgHandle); - } - - struct ArgNameEqual - { - const TCharStr &m_Name; - ArgNameEqual(const TCharStr &nm) - : m_Name(nm) - { - } - bool operator()(const SMetaDataHandlerArgumentInfo &info) const - { - return m_Name == info.m_Name; - } - }; - - void DoRemoveHandlerArgument(Qt3DSDMHandlerHandle inHandler, - const SMetaDataHandlerArgumentInfo &inArgHandle) - { - SHandler *infoPtr = FindHandler(inHandler); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - erase_if(infoPtr->m_Arguments, ArgNameEqual(inArgHandle.m_Name)); - } - - struct HandlerArgumentAddRemoveTransaction : public ITransaction - { - SNewMetaDataImpl &m_Impl; - Qt3DSDMHandlerHandle m_Handler; - SMetaDataHandlerArgumentInfo m_Arg; - QT3DSU32 m_Idx; - bool m_AddOnDo; - - HandlerArgumentAddRemoveTransaction(const char *inFile, int inLine, SNewMetaDataImpl &impl, - Qt3DSDMHandlerHandle hdl, - const SMetaDataHandlerArgumentInfo &arg, QT3DSU32 inIdx, - bool inAddOnDo) - : ITransaction(inFile, inLine) - , m_Impl(impl) - , m_Handler(hdl) - , m_Arg(arg) - , m_Idx(inIdx) - , m_AddOnDo(inAddOnDo) - { - } - void insert() { m_Impl.DoAddHandlerArgument(m_Handler, m_Arg, m_Idx); } - void remove() { m_Impl.DoRemoveHandlerArgument(m_Handler, m_Arg); } - void Do() override - { - if (m_AddOnDo) - insert(); - else - remove(); - } - void Undo() override - { - if (m_AddOnDo) - remove(); - else - insert(); - } - }; - - QT3DSU32 AddHandlerArgument(Qt3DSDMHandlerHandle inHandler) override - { - SHandler *infoPtr = FindHandler(inHandler); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return 0; - } - - SMetaDataHandlerArgumentInfo theInfo(inHandler); - QT3DSU32 idx = (QT3DSU32)infoPtr->m_Arguments.size(); - DoAddHandlerArgument(inHandler, theInfo, idx); - if (m_Consumer) - m_Consumer->OnTransaction(make_shared<HandlerArgumentAddRemoveTransaction>( - __FILE__, __LINE__, ref(*this), inHandler, theInfo, - idx, true)); - - return idx; - } - - void DoSetHandlerArgument(THandlerHandle inHandler, QT3DSU32 inIdx, - const SMetaDataHandlerArgumentInfo &inInfo) - { - SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandler, inIdx)); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - *infoPtr = inInfo; - } - - struct SetHandlerArgumentInfoTrans : public ITransaction - { - SNewMetaDataImpl &m_Impl; - THandlerHandle m_Handler; - QT3DSU32 m_Idx; - SMetaDataHandlerArgumentInfo m_NewValue; - SMetaDataHandlerArgumentInfo m_OldValue; - SetHandlerArgumentInfoTrans(const char *inFile, int inLine, SNewMetaDataImpl &impl, - THandlerHandle handler, QT3DSU32 inIdx, - const SMetaDataHandlerArgumentInfo &inNewVal, - const SMetaDataHandlerArgumentInfo &inOldVal) - : ITransaction(inFile, inLine) - , m_Impl(impl) - , m_Handler(handler) - , m_Idx(inIdx) - , m_NewValue(inNewVal) - , m_OldValue(inOldVal) - { - } - void Do() override { m_Impl.DoSetHandlerArgument(m_Handler, m_Idx, m_NewValue); } - void Undo() override { m_Impl.DoSetHandlerArgument(m_Handler, m_Idx, m_OldValue); } - }; - - void SetHandlerArgumentInfo(THandlerHandle inHandler, QT3DSU32 inIdx, TStrType inName, - TStrType inFormalName, TStrType inDescription, - CompleteMetaDataType::Enum inDataType, - const SValue &inDefaultValue, - const TMetaDataData &inMetaData, - HandlerArgumentType::Value inArgType) override - { - SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandler, inIdx)); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - SMetaDataHandlerArgumentInfo &newInfo(*infoPtr); - SMetaDataHandlerArgumentInfo oldInfo(newInfo); - SetPropertyBaseInfo(newInfo, inName, inFormalName, inDescription, L"", inDataType, - inDefaultValue, inMetaData); - newInfo.m_ArgType = inArgType; - if (m_Consumer != NULL) - m_Consumer->OnTransaction(make_shared<SetHandlerArgumentInfoTrans>( - __FILE__, __LINE__, ref(*this), inHandler, inIdx, - newInfo, oldInfo)); - } - - void DestroyHandlerArgument(THandlerHandle inHandler, QT3DSU32 inIdx) override - { - SHandler *ownerPtr = FindHandler(inHandler); - SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandler, inIdx)); - if (infoPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - if (ownerPtr == NULL) { - QT3DS_ASSERT(false); - return; - } - - Q_EMIT internalHandlerArgDestroyed(inHandler, inIdx); - - if (m_Consumer) - m_Consumer->OnTransaction(make_shared<HandlerArgumentAddRemoveTransaction>( - __FILE__, __LINE__, ref(*this), infoPtr->m_Handler, - *infoPtr, inIdx, false)); - - DoRemoveHandlerArgument(infoPtr->m_Handler, *infoPtr); - } - - Option<SMetaDataHandlerArgumentInfo> FindHandlerArgumentByName(THandlerHandle inHandler, - TStrType inName) override - { - SHandler *ownerPtr = FindHandler(inHandler); - if (ownerPtr == NULL) { - return Empty(); - } - for (size_t idx = 0, end = ownerPtr->m_Arguments.size(); idx < end; ++idx) { - if (ownerPtr->m_Arguments[idx].m_Name == inName) - return ownerPtr->m_Arguments[idx]; - } - return Empty(); - } - - void GetHandlerArguments(THandlerHandle inHandler, - vector<SMetaDataHandlerArgumentInfo> &outArguments) override - { - SHandler *ownerPtr = FindHandler(inHandler); - if (ownerPtr == NULL) { - return; - } - outArguments.insert(outArguments.end(), ownerPtr->m_Arguments.begin(), - ownerPtr->m_Arguments.end()); - } - - virtual Option<SMetaDataHandlerArgumentInfo> - GetHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandle, QT3DSU32 inIdx) override - { - SMetaDataHandlerArgumentInfo *infoPtr(FindHandlerArg(inHandle, inIdx)); - if (infoPtr == NULL) { - return Empty(); - } - return *infoPtr; - } - - QT3DSU32 GetNumHandlerArguments(Qt3DSDMHandlerHandle inHandler) override - { - SHandler *ownerPtr = FindHandler(inHandler); - if (ownerPtr == NULL) { - return 0; - } - return (QT3DSU32)ownerPtr->m_Arguments.size(); - } - - //////////////////////////////////////////////////////////////////////////////////// - // References - void AddReference(Qt3DSDMInstanceHandle inInstance, TStrType inRefString) override - { - // trim whitespace from the beginning and the end of the string - TCharStr::size_type startPos = inRefString.find_first_not_of(L"\n\r\t "); - TCharStr::size_type endPos = inRefString.find_last_not_of(L"\n\r\t "); - const wchar_t *theStr = NULL; - if (startPos != TCharStr::npos) { - TStrType temp = inRefString.substr(startPos, endPos - startPos + 1); - theStr = Intern(temp); - } else - theStr = Intern(inRefString); - - QT3DSU32 idx = AddItemToInstanceList(inInstance, theStr, m_InstanceToReferences); - if (m_Consumer) { - m_Consumer->OnTransaction( - std::make_shared<InstanceListTransaction<TInstanceStringListMap, - const wchar_t *>>( - __FILE__, __LINE__, inInstance, theStr, - std::ref(m_InstanceToReferences), idx, - true)); - } - } - - void DestroyReferences(Qt3DSDMInstanceHandle inInstance) override - { - TInstanceStringListMap::iterator find = m_InstanceToReferences.find(inInstance); - - if (find == m_InstanceToReferences.end()) - return; - - CreateHashMapEraseTransaction(__FILE__, __LINE__, m_Consumer, - make_pair(find->first, find->second), m_InstanceToReferences); - m_InstanceToReferences.erase(find); - } - - struct InternSizeTOpType - { - SNewMetaDataImpl &m_Impl; - InternSizeTOpType(SNewMetaDataImpl &inImpl) - : m_Impl(inImpl) - { - } - - size_t operator()(const TCharStr &inHandle) - { - return reinterpret_cast<size_t>(m_Impl.Intern(inHandle)); - } - }; - - void GetReferences(Qt3DSDMInstanceHandle inInstance, vector<TCharStr> &outReferences) override - { - DoGetHandleList(inInstance, m_InstanceToReferences, outReferences, - InternSizeTOpType(*this)); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Instance-global functions - // Destroy all meta data that relates to this instance. - // Calling this on a derived instance does nothing, this only works if this specific - // instance was mapped to a type. - // This function must be completely undoable. - void DestroyMetaData(Qt3DSDMInstanceHandle inInstance) override - { - ForEachItem<TMetaDataPropertyHandle>( - inInstance, m_InstanceToProperties, - bind(&SNewMetaDataImpl::DestroyMetaDataProperty, this, - std::placeholders::_1)); - ForEachItem<TEventHandle>(inInstance, m_InstanceToEvents, - bind(&SNewMetaDataImpl::DestroyEvent, this, - std::placeholders::_1)); - ForEachItem<THandlerHandle>(inInstance, m_InstanceToHandlers, - bind(&SNewMetaDataImpl::DestroyHandler, this, - std::placeholders::_1)); - DestroyReferences(inInstance); - - TInstanceStrMap::iterator find = m_InstancesToCanonicalType.find(inInstance); - if (find != m_InstancesToCanonicalType.end()) { - TCharPtr theName(find->second); - m_CanonicalTypeToInstances.erase(theName); - m_InstancesToCanonicalType.erase(inInstance); - CreateHashMapEraseTransaction(__FILE__, __LINE__, m_Consumer, - make_pair(theName, inInstance), - m_CanonicalTypeToInstances); - CreateHashMapEraseTransaction(__FILE__, __LINE__, m_Consumer, - make_pair(inInstance, theName), - m_InstancesToCanonicalType); - } - } - - //////////////////////////////////////////////////////////////////////////////////// - // Serialization - // You can either save out in canonical format (and it will only save canonical-instance-related - // information *or* you can save out in normal format where we link directly to instance handle - // instead of to typename - template <typename THashType> - void AddInstancesFromHash(THashType &inHash, - unordered_set<TInstanceHandle, hash<int>> &outInstances) - { - for (typename THashType::const_iterator iter = inHash.begin(), end = inHash.end(); - iter != end; ++iter) - outInstances.insert(iter->first); - } - - void SerializeMetaDataData(IDOMWriter &inWriter, TMetaDataData &inItem, - AdditionalMetaDataType::Value inType) - { - if (!inItem.empty()) { - if (inType == AdditionalMetaDataType::Range) { - SMetaDataRange theRange(get<SMetaDataRange>(inItem)); - inWriter.Att(L"min", theRange.m_Min); - inWriter.Att(L"max", theRange.m_Max); - } else if (inType == AdditionalMetaDataType::StringList) { - const TMetaDataStringList &theList(get<TMetaDataStringList>(inItem)); - TCharStr theBuffer; - for (uint32_t idx = 0, end = theList.size(); idx < end; ++idx) { - if (idx) - theBuffer.append(L":"); - theBuffer.append(theList[idx]); - } - inWriter.Att(L"list", theBuffer.wide_str()); - } - } - } - - void SerializeDataModelValue(IDOMWriter &inWriter, const SValue &inValue, - DataModelDataType::Value /*inType*/, - const wchar_t *inName = L"default") - { - if (inValue.empty()) - return; - - m_TempBuffer.clear(); - WCharTWriter writer(m_TempBuffer); - WStrOps<SValue>().ToBuf(inValue, writer); - - if (m_TempBuffer.size()) { - m_TempBuffer.write((QT3DSU16)0); - inWriter.Att(inName, (const wchar_t *)m_TempBuffer.begin()); - } - } - - void SerializeDataModelValue(IDOMReader &inReader, SValue &outValue, - DataModelDataType::Value inType, - const wchar_t *inName = L"default") - { - const char8_t *theDefaultValue; - qt3ds::foundation::ConvertUTF( - reinterpret_cast<const qt3ds::foundation::TWCharEASTLConverter::TCharType *>( - inName), 0, - m_ConvertStr); - if (inReader.UnregisteredAtt(m_ConvertStr.c_str(), theDefaultValue)) { - m_TempBuffer.clear(); - // We have to write a temporary value because the parsing of floats, - // in order to be efficient, is destructive. - if (theDefaultValue && *theDefaultValue) - m_TempBuffer.write(theDefaultValue, (QT3DSU32)strlen(theDefaultValue) + 1); - - if (m_TempBuffer.size() == 0) { - SetDefault(inType, outValue); - return; - } - m_ReadBuffer.clear(); - - char8_t *trashPtr = (char8_t *)m_TempBuffer.begin(); - WCharTReader theReader(trashPtr, m_ReadBuffer, m_StringTable); - outValue = WStrOps<SValue>().BufTo(inType, theReader); - } else - SetDefault(inType, outValue); - } - - void SerializeMetaDataData(IDOMReader &inReader, TMetaDataData &ioItem, - CompleteMetaDataType::Enum &ioType) - { - // Use the meta data extra information to force the type - // to something that works correctly. - SMetaDataRange theRange; - if (inReader.Att("min", theRange.m_Min) && inReader.Att("max", theRange.m_Max)) { - ioItem = theRange; - if (ioType == CompleteMetaDataType::Long) - ioType = CompleteMetaDataType::LongRange; - else - ioType = CompleteMetaDataType::FloatRange; - } else { - TMetaDataStringList theList; - TCharStr theItems; - if (inReader.Att(L"list", theItems)) { - for (TCharStr::size_type theIter = theItems.find_first_of(L":,"); - theIter != theItems.npos; theIter = theItems.find_first_of(L":,")) { - theList.push_back(theItems.substr(0, theIter)); - theItems = theItems.substr(theIter + 1); - } - theList.push_back(theItems); - ioItem = theList; - if (ioType != CompleteMetaDataType::StringListOrInt) - ioType = CompleteMetaDataType::StringList; - } - } - } - void EnsureCategory(IDOMWriter &, const TCharStr &, const TCharStr &) {} - void EnsureCategory(IDOMReader &, TCharStr &inCategory, const TCharStr &inObjectName) - { - Qt3DSDMCategoryHandle theCategory = FindCategoryByName(inCategory); - if (theCategory.Valid() == false) { - if (inObjectName.empty()) { - QT3DS_ASSERT(false); - } else { - if (inCategory.empty()) - inCategory = inObjectName; - - pair<Qt3DSDMCategoryHandle, bool> theGetOrCreateResult( - GetOrCreateCategory(inCategory)); - - if (theGetOrCreateResult.second == true) { - SetCategoryInfo(theGetOrCreateResult.first, L"Objects-Behavior-Normal.png", - L"Objects-Behavior-Normal.png", inCategory); - } - } - } - } - - void SerializePropertyBase(IDOMWriter &inArchive, SMetaPropertyBase &inItem) - { - inArchive.Att(L"name", inItem.m_Name); - if (inItem.m_FormalName != inItem.m_Name) - inArchive.Att(L"formalName", inItem.m_FormalName); - if (inItem.m_Description != inItem.m_Name) - inArchive.Att(L"description", inItem.m_Description); - if (inItem.m_CompleteType != CompleteMetaDataType::Float - && inItem.m_CompleteType != CompleteMetaDataType::FloatRange - && inItem.m_CompleteType != CompleteMetaDataType::LongRange - && inItem.m_CompleteType != CompleteMetaDataType::StringList) { - inArchive.Att(L"type", inItem.m_CompleteType); - } - - // Ensure that all types work - if (inItem.GetAdditionalType() != AdditionalMetaDataType::None) - SerializeMetaDataData(inArchive, inItem.m_MetaDataData, inItem.GetAdditionalType()); - - if (inItem.GetDataType() != DataModelDataType::None) { - SValue theGlobalDefault; - SetDefault(inItem.GetDataType(), theGlobalDefault); - if (!Equals(theGlobalDefault.toOldSkool(), inItem.m_DefaultValue.toOldSkool())) - SerializeDataModelValue(inArchive, inItem.m_DefaultValue, inItem.GetDataType()); - } - } - - void SerializePropertyBase(IDOMReader &inArchive, SMetaPropertyBase &inItem) - { - inArchive.Att(L"name", inItem.m_Name); - inArchive.Att(L"formalName", inItem.m_FormalName); - inArchive.Att(L"usage", inItem.m_Usage); - inArchive.Att(L"description", inItem.m_Description); - inArchive.Att(L"type", inItem.m_CompleteType); - // Setup reasonable defaults in the case where the users are specifying little information - // in the file format - if (inItem.m_FormalName.empty()) - inItem.m_FormalName = inItem.m_Name; - if (inItem.m_Description.empty()) - inItem.m_Description = inItem.m_FormalName; - - // Ensure that users can use a float type and make minimal decisions - SerializeMetaDataData(inArchive, inItem.m_MetaDataData, inItem.m_CompleteType); - - if (inItem.GetDataType() != DataModelDataType::None) - SerializeDataModelValue(inArchive, inItem.m_DefaultValue, inItem.GetDataType()); - } - - void FinalizeCategory(IDOMWriter &, SCategoryInfo &) {} - - void FinalizeCategory(IDOMReader &, SCategoryInfo &inCategory) - { - if (inCategory.m_Description.empty()) - inCategory.m_Description = inCategory.m_Name; - } - - template <typename TArchiveType> - void SerializeItem(TArchiveType &inArchive, SCategoryInfo &inItem) - { - inArchive.Att(L"name", inItem.m_Name); - inArchive.Att(L"description", inItem.m_Description); - inArchive.Att(L"icon", inItem.m_Icon); - inArchive.Att(L"highlightIcon", inItem.m_HighlightIcon); - - FinalizeCategory(inArchive, inItem); - } - - void SerializeItem(IDOMWriter &inArchive, SMetaDataPropertyInfo &inItem, - Qt3DSDMMetaDataPropertyHandle inHandle) - { - SerializePropertyBase(inArchive, inItem); - if (inItem.m_IsHidden == true) - inArchive.Att("hidden", inItem.m_IsHidden); - if (inItem.m_Animatable == false) - inArchive.Att("animatable", inItem.m_Animatable); - if (inItem.m_Controllable == true) - inArchive.Att("controllable", inItem.m_Controllable); - NVConstDataRef<SPropertyFilterInfo> theInfos = GetMetaDataPropertyFilters(inHandle); - for (QT3DSU32 idx = 0, end = theInfos.size(); idx < end; ++idx) { - const SPropertyFilterInfo &theInfo(theInfos[idx]); - Qt3DSDMPropertyDefinition thePropertyInfo( - m_DataCore->GetProperty(theInfo.m_FilterProperty)); - - const wchar_t *theFilterName; - if (theInfo.m_FilterType == PropertyFilterTypes::HideIfEqual) - theFilterName = L"HideIfEqual"; - else - theFilterName = L"ShowIfEqual"; - - IDOMWriter::Scope filterScope(inArchive, theFilterName); - inArchive.Att(L"property", thePropertyInfo.m_Name); - SerializeDataModelValue(inArchive, theInfo.m_Value, thePropertyInfo.m_Type, L"value"); - } - } - - void SerializeItem(IDOMReader &inArchive, SMetaDataPropertyInfo &inItem, - Qt3DSDMMetaDataPropertyHandle inHandle) - { - QT3DS_ASSERT(inHandle.Valid()); - - SerializePropertyBase(inArchive, inItem); - inArchive.Att("hidden", inItem.m_IsHidden); - inArchive.Att("animatable", inItem.m_Animatable); - inArchive.Att("controllable", inItem.m_Controllable); - inArchive.Att(L"category", inItem.m_GroupName); - } - - void ReadChildren(IDOMReader &inArchive, SMetaDataPropertyInfo &inItem, - Qt3DSDMMetaDataPropertyHandle inHandle) - { - IDOMReader::Scope __readerScope(inArchive); - eastl::vector<SPropertyFilterInfo> theFilters; - for (bool success = inArchive.MoveToFirstChild(); success; - success = inArchive.MoveToNextSibling()) { - - if (AreEqual(inArchive.GetElementName(), L"ShowIfEqual")) { - TCharStr theName; - inArchive.Att(L"property", theName); - Qt3DSDMPropertyHandle theProperty = - m_DataCore->GetAggregateInstancePropertyByName(inItem.m_Instance, theName); - if (theProperty.Valid() == false) { - QT3DS_ASSERT(false); - return; - } - Qt3DSDMPropertyDefinition thePropDef(m_DataCore->GetProperty(theProperty)); - - SPropertyFilterInfo theInfo; - theInfo.m_FilterType = PropertyFilterTypes::ShowIfEqual; - theInfo.m_FilterProperty = theProperty; - SerializeDataModelValue(inArchive, theInfo.m_Value, thePropDef.m_Type, L"value"); - theFilters.push_back(theInfo); - } else if (AreEqual(inArchive.GetElementName(), L"HideIfEqual")) { - TCharStr theName; - inArchive.Att(L"property", theName); - Qt3DSDMPropertyHandle theProperty = - m_DataCore->GetAggregateInstancePropertyByName(inItem.m_Instance, theName); - if (theProperty.Valid() == false) { - QT3DS_ASSERT(false); - return; - } - Qt3DSDMPropertyDefinition thePropDef(m_DataCore->GetProperty(theProperty)); - - SPropertyFilterInfo theInfo; - theInfo.m_FilterType = PropertyFilterTypes::HideIfEqual; - theInfo.m_FilterProperty = theProperty; - SerializeDataModelValue(inArchive, theInfo.m_Value, thePropDef.m_Type, L"value"); - theFilters.push_back(theInfo); - } else { - QT3DS_ASSERT(false); - } - } - if (theFilters.size()) - SetMetaDataPropertyFilters( - inHandle, qt3ds::foundation::toDataRef(theFilters.data(), - theFilters.size())); - } - - void EnsureEventHandlerBase(IDOMWriter &, SEventAndHandlerBase &) {} - - void EnsureEventHandlerBase(IDOMReader &, SEventAndHandlerBase &inItem) - { - if (inItem.m_FormalName.empty()) - inItem.m_FormalName = inItem.m_Name; - if (inItem.m_Description.empty()) - inItem.m_Description = inItem.m_Name; - } - - void SerializeItem(IDOMWriter &inArchive, SEvent &inItem, Qt3DSDMEventHandle &) - { - inArchive.Att(L"name", inItem.m_Name); - if (inItem.m_Name != inItem.m_FormalName) - inArchive.Att(L"formalName", inItem.m_FormalName); - if (inItem.m_Category != L"Default") - inArchive.Att(L"category", inItem.m_Category); - if (inItem.m_Description != inItem.m_Name) - inArchive.Att(L"description", inItem.m_Description); - - EnsureCategory(inArchive, inItem.m_Category, m_ObjectName); - EnsureEventHandlerBase(inArchive, inItem); - } - - void SerializeItem(IDOMReader &inArchive, SEvent &inItem, Qt3DSDMEventHandle &) - { - inArchive.Att(L"name", inItem.m_Name); - inArchive.Att(L"formalName", inItem.m_FormalName); - inArchive.Att(L"category", inItem.m_Category); - EnsureCategory(inArchive, inItem.m_Category, m_ObjectName); - inArchive.Att(L"description", inItem.m_Description); - EnsureEventHandlerBase(inArchive, inItem); - } - - void SerializeHandlerArgument(IDOMWriter &inArchive, SMetaDataHandlerArgumentInfo &inArgument) - { - SerializePropertyBase(inArchive, inArgument); - if (inArgument.m_ArgType != HandlerArgumentType::None) - inArchive.Att(L"argumentType", inArgument.m_ArgType); - } - - void SerializeHandlerArgument(IDOMReader &inArchive, SMetaDataHandlerArgumentInfo &inArgument) - { - SerializePropertyBase(inArchive, inArgument); - inArchive.Att(L"argumentType", inArgument.m_ArgType); - } - - void SerializeHandlerArguments(IDOMWriter &inWriter, SHandler &inItem, Qt3DSDMHandlerHandle &) - { - for (size_t idx = 0, end = inItem.m_Arguments.size(); idx < end; ++idx) { - SMetaDataHandlerArgumentInfo &theArg(inItem.m_Arguments[idx]); - IDOMWriter::Scope __argScope(inWriter, L"Argument"); - SerializeHandlerArgument(inWriter, theArg); - } - } - - void SerializeHandlerArguments(IDOMReader &inReader, SHandler &inItem, THandlerHandle &inHandle) - { - if (inHandle.GetHandleValue() == 0) - inHandle = THandlerHandle(GetNextId()); - - IDOMReader::Scope __handlerScope(inReader); - for (bool success = inReader.MoveToFirstChild(); success; - success = inReader.MoveToNextSibling()) { - SMetaDataHandlerArgumentInfo theArg(inHandle); - SerializeHandlerArgument(inReader, theArg); - inItem.m_Arguments.push_back(theArg); - } - } - - void SerializeHandlerItem(IDOMWriter &inArchive, SHandler &inItem) - { - inArchive.Att(L"name", inItem.m_Name); - if (inItem.m_FormalName != inItem.m_Name) - inArchive.Att(L"formalName", inItem.m_FormalName); - if (inItem.m_Category != L"Default") - inArchive.Att(L"category", inItem.m_Category); - if (inItem.m_Description != inItem.m_Name) - inArchive.Att(L"description", inItem.m_Description); - EnsureEventHandlerBase(inArchive, inItem); - } - - void SerializeHandlerItem(IDOMReader &inArchive, SHandler &inItem) - { - inArchive.Att(L"name", inItem.m_Name); - inArchive.Att(L"formalName", inItem.m_FormalName); - inArchive.Att(L"category", inItem.m_Category); - EnsureCategory(inArchive, inItem.m_Category, m_ObjectName); - inArchive.Att(L"description", inItem.m_Description); - EnsureEventHandlerBase(inArchive, inItem); - } - - template <typename TArchiveType> - void SerializeItem(TArchiveType &inArchive, SHandler &inItem, Qt3DSDMHandlerHandle &inHandle) - { - SerializeHandlerItem(inArchive, inItem); - SerializeHandlerArguments(inArchive, inItem, inHandle); - } - - template <typename TInfoType, typename THandleType, typename TListMapType, typename THashType, - typename TNameMapType> - void SerializeInstanceData(IDOMWriter &inArchive, TInstanceHandle inInstanceHandle, - TCharPtr inElementName, - unordered_map<THandleType, TInfoType, THashType> &inMap, - TListMapType &inListMap, TNameMapType & /*inNameMap*/) - { - typedef unordered_map<THandleType, TInfoType, THashType> TMapType; - typename TListMapType::iterator find = inListMap.find(inInstanceHandle); - if (find == inListMap.end()) - return; - - vector<THandleType> &itemList = find->second; - for (size_t idx = 0, end = itemList.size(); idx < end; ++idx) { - typename TMapType::iterator iter = inMap.find(itemList[idx]); - if (iter == inMap.end()) { - QT3DS_ASSERT(false); - continue; - } - TInfoType &theType = iter->second; - IDOMWriter::Scope __elemScope(inArchive, inElementName); - SerializeItem(inArchive, theType, itemList[idx]); - } - } - - void CreateInstanceGroupInfo(SMetaDataPropertyInfo &inProperty) - { - if (!inProperty.m_GroupName.empty()) { - const wchar_t *theGroupName = Intern(inProperty.m_GroupName); - bool found = false; - pair<typename TInstanceGroupMap::iterator, bool> inserter = - m_InstanceGroupMap.insert(make_pair(inProperty.m_Instance, vector<TCharPtr>())); - vector<TCharPtr> &itemList = inserter.first->second; - for (size_t idx = 0, end = itemList.size(); idx < end; ++idx) { - TCharStr curListName = itemList[idx]; - if (curListName == theGroupName) { - found = true; - break; - } - } - if (!found && !inProperty.m_IsHidden) - inserter.first->second.push_back(theGroupName); - } - } - void CreateInstanceGroupInfo(SEvent &) {} - void CreateInstanceGroupInfo(SHandler &) {} - - // Make sure the data core - void PostLoad(SMetaDataPropertyInfo &inProperty) - { - EnsureDataCoreProperty(inProperty); - SetPropertyDefault(inProperty, inProperty.GetDataType()); - } - - void ReadChildren(IDOMReader &, SEvent &, Qt3DSDMEventHandle) {} - void ReadChildren(IDOMReader &, SHandler &, Qt3DSDMHandlerHandle) {} - - void PostLoad(SEvent &) {} - void PostLoad(SHandler &) {} - template <typename TInfoType, typename THandleType, typename TListMapType, typename THashType, - typename TNameMapType> - void SerializeInstanceData(IDOMReader &inArchive, TInstanceHandle inInstanceHandle, - TCharPtr inElementName, - unordered_map<THandleType, TInfoType, THashType> &inMap, - TListMapType &inListMap, TNameMapType &inNameMap) - { - // Ensure we pop out to where we were. - IDOMReader::Scope __readerScope(inArchive); - for (bool success = inArchive.MoveToFirstChild(inElementName); success; - success = inArchive.MoveToNextSibling(inElementName)) { - TInfoType theInfo(inInstanceHandle); - THandleType theHandle(GetNextId()); - SerializeItem(inArchive, theInfo, theHandle); - PostLoad(theInfo); - CreateInstanceGroupInfo(theInfo); - inMap.insert(make_pair(theHandle, theInfo)); - this->AddItemToInstanceList(inInstanceHandle, theHandle, inListMap); - inNameMap.insert( - make_pair(make_pair(inInstanceHandle, Intern(theInfo.m_Name)), theHandle)); - ReadChildren(inArchive, theInfo, theHandle); - } - } - - void SerializeInstanceData(IDOMWriter &inArchive, TInstanceHandle inInstance, - TCharPtr inElementName, TInstanceStringListMap &inMap) - { - TInstanceStringListMap::iterator iter = inMap.find(inInstance); - if (iter == inMap.end()) - return; - const vector<TCharPtr> &theValueList(iter->second); - for (size_t idx = 0, end = theValueList.size(); idx < end; ++idx) { - IDOMWriter::Scope __elemScope(inArchive, inElementName); - inArchive.Value(theValueList[idx]); - } - } - - void SerializeInstanceData(IDOMReader &inArchive, TInstanceHandle inInstance, - TCharPtr inElementName, TInstanceStringListMap &inMap) - { - IDOMReader::Scope __readerScope(inArchive); - for (bool success = inArchive.MoveToFirstChild(inElementName); success; - success = inArchive.MoveToNextSibling(inElementName)) { - const wchar_t *theValue; - if (inArchive.RegisteredValue(theValue)) - AddItemToInstanceList(inInstance, theValue, inMap); - } - } - - template <typename TArchiveType> - void SerializeInstance(TArchiveType &inArchive, TInstanceHandle inInstance) - { - SerializeInstanceData(inArchive, inInstance, L"Property", m_Properties, - m_InstanceToProperties, m_InstanceNameToProperties); - SerializeInstanceData(inArchive, inInstance, L"Event", m_Events, m_InstanceToEvents, - m_InstanceNameToEvents); - SerializeInstanceData(inArchive, inInstance, L"Handler", m_Handlers, m_InstanceToHandlers, - m_InstanceNameToHandlers); - SerializeInstanceData(inArchive, inInstance, L"Reference", m_InstanceToReferences); - } - void SerializeCategories(IDOMWriter &inWriter) - { - for (TCategoryMap::iterator iter = m_Categories.begin(), end = m_Categories.end(); - iter != end; ++iter) { - IDOMWriter::Scope __writerScope(inWriter, L"Category"); - SerializeItem(inWriter, iter->second); - } - } - void SerializeCategories(IDOMReader &inReader) - { - IDOMReader::Scope __readerScope(inReader); - for (bool success = inReader.MoveToFirstChild(L"Category"); success; - success = inReader.MoveToNextSibling(L"Category")) { - SCategoryInfo theInfo; - SerializeItem(inReader, theInfo); - TCategoryHandle newHandle(GetNextId()); - theInfo.m_Canonical = true; - m_Categories.insert(make_pair(newHandle, theInfo)); - m_NameToCategories.insert(make_pair(Intern(theInfo.m_Name), newHandle)); - } - } - - struct SInstanceSorter - { - const TInstanceStrMap &m_Map; - SInstanceSorter(const TInstanceStrMap &inMap) - : m_Map(inMap) - { - } - bool operator()(TInstanceHandle lhs, TInstanceHandle rhs) - { - TInstanceStrMap::const_iterator lhsIter(m_Map.find(lhs)); - TInstanceStrMap::const_iterator rhsIter(m_Map.find(rhs)); - if (lhsIter == rhsIter) - return false; - if (lhsIter == m_Map.end()) - return false; - if (rhsIter == m_Map.end()) - return true; - return wcscmp(lhsIter->second, rhsIter->second) < 0; - } - }; - - void Save(IDOMWriter &inWriter) override - { - SerializeCategories(inWriter); - typedef unordered_set<TInstanceHandle, hash<int>> TInstanceListType; - TInstanceListType theInstanceList; - // Get the list of instances to serialize. - - AddInstancesFromHash(m_InstanceToProperties, theInstanceList); - AddInstancesFromHash(m_InstanceToEvents, theInstanceList); - AddInstancesFromHash(m_InstanceToHandlers, theInstanceList); - AddInstancesFromHash(m_InstanceToReferences, theInstanceList); - - vector<TInstanceHandle> theInstances; - theInstances.reserve(theInstanceList.size()); - theInstances.insert(theInstances.begin(), theInstanceList.begin(), theInstanceList.end()); - sort(theInstances.begin(), theInstances.end(), SInstanceSorter(m_InstancesToCanonicalType)); - - for (vector<TInstanceHandle>::iterator iter = theInstances.begin(), - end = theInstances.end(); - iter != end; ++iter) { - TInstanceHandle instHandle = *iter; - Option<TCharStr> theType(GetTypeForCanonicalInstance(*iter)); - if (theType.hasValue()) { - IDOMWriter::Scope __instanceElem(inWriter, theType->wide_str()); - SerializeInstance(inWriter, *iter); - } - } - } - - // Loading expects the canonical instances to be setup already which means that - // it will perform lookups based on - void Load(IDOMReader &inReader) override - { - if (!inReader.Att("NextId", m_NextId)) - m_NextId = 1; - m_ObjectName = L""; - SerializeCategories(inReader); - IDOMReader::Scope __instanceGatherScope(inReader); - for (bool success = inReader.MoveToFirstChild(); success; - success = inReader.MoveToNextSibling()) { - const wchar_t *elemName = inReader.GetElementName(); - TStrInstanceMap::iterator find = m_CanonicalTypeToInstances.find(elemName); - if (find == m_CanonicalTypeToInstances.end()) { - continue; - } - - SerializeInstance(inReader, find->second); - } - } - - template <typename THandleType, typename TMapType> - void RemoveOldItemsAndSetOrder( - Qt3DSDMInstanceHandle inInstance, vector<THandleType> &inNewHandles, - void (SNewMetaDataImpl::*inGetSpecificFun)(Qt3DSDMInstanceHandle, vector<THandleType> &), - void (SNewMetaDataImpl::*inDestroyFun)(THandleType), TMapType &inListMap) - { - vector<THandleType> theHandles; - (this->*inGetSpecificFun)(inInstance, theHandles); - for (size_t idx = 0, end = theHandles.size(); idx < end; ++idx) - if (find(inNewHandles.begin(), inNewHandles.end(), theHandles[idx]) - == inNewHandles.end()) - (this->*inDestroyFun)(theHandles[idx]); - - InsertOrUpdateWithTransaction(make_pair(inInstance, inNewHandles), inListMap); - } - - // Load meta data and apply it to just this instance - // This needs to be undoable so we have to do this through a slightly different - // system than we did before. - void LoadInstance(IDOMReader &inReader, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings) override - { - const wchar_t *theAtt; - vector<Qt3DSDMMetaDataPropertyHandle> theProperties; - vector<Qt3DSDMEventHandle> theEvents; - vector<Qt3DSDMHandlerHandle> theHandlers; - DestroyReferences(inInstance); - m_ObjectName = inObjectName; - for (bool success = inReader.MoveToFirstChild(); success; - success = inReader.MoveToNextSibling()) { - if (AreEqual(inReader.GetElementName(), L"Category")) { - SCategoryInfo theInfo; - SerializeItem(inReader, theInfo); - Qt3DSDMCategoryHandle theCategoryInfo(GetOrCreateCategory(theInfo.m_Name).first); - SetCategoryInfo(theCategoryInfo, theInfo.m_Icon, theInfo.m_HighlightIcon, - theInfo.m_Description); - } else if (AreEqual(inReader.GetElementName(), L"Property")) { - SMetaDataPropertyInfo theInfo(inInstance); - if (inReader.Att(L"name", theAtt)) { - Qt3DSDMMetaDataPropertyHandle theProperty( - GetOrCreateSpecificMetaDataProperty(inInstance, theAtt)); - SerializeItem(inReader, theInfo, theProperty); - SetMetaDataPropertyInfo(theProperty, theInfo.m_Name, theInfo.m_FormalName, - theInfo.m_Description, theInfo.m_Usage, - theInfo.m_CompleteType, theInfo.m_DefaultValue, - theInfo.m_MetaDataData, theInfo.m_GroupName, - theInfo.m_IsHidden, theInfo.m_Animatable, - theInfo.m_Controllable); - CreateInstanceGroupInfo(theInfo); - theProperties.push_back(theProperty); - ReadChildren(inReader, theInfo, theProperty); - } else - outWarnings.push_back( - SMetaDataLoadWarning(MetaDataLoadWarningType::InvalidProperty, - MetaDataLoadWarningMessage::MissingName)); - } else if (AreEqual(inReader.GetElementName(), L"Event")) { - SEvent theInfo(inInstance); - if (inReader.Att(L"name", theAtt)) { - Qt3DSDMEventHandle theEvent(GetOrCreateSpecificEvent(inInstance, theAtt)); - SerializeItem(inReader, theInfo, theEvent); - SetEventInfo(theEvent, theInfo.m_Name, theInfo.m_FormalName, theInfo.m_Category, - theInfo.m_Description); - theEvents.push_back(theEvent); - } else - outWarnings.push_back( - SMetaDataLoadWarning(MetaDataLoadWarningType::InvalidEvent, - MetaDataLoadWarningMessage::MissingName)); - } else if (AreEqual(inReader.GetElementName(), L"Handler")) { - if (inReader.Att(L"name", theAtt)) { - Qt3DSDMHandlerHandle theHandler(GetOrCreateSpecificHandler(inInstance, theAtt)); - SHandler theInfo(inInstance); - SerializeHandlerItem(inReader, theInfo); - SetHandlerInfo(theHandler, theInfo.m_Name, theInfo.m_FormalName, - theInfo.m_Category, theInfo.m_Description); - IDOMReader::Scope __argScope(inReader); - QT3DSU32 argIdx = 0; - for (bool argSuccess = inReader.MoveToFirstChild(); argSuccess; - argSuccess = inReader.MoveToNextSibling(), ++argIdx) { - SMetaDataHandlerArgumentInfo theArg(theHandler); - SerializeHandlerArgument(inReader, theArg); - while (argIdx >= GetNumHandlerArguments(theHandler)) - AddHandlerArgument(theHandler); - - if (argIdx < GetNumHandlerArguments(theHandler)) { - SetHandlerArgumentInfo(theHandler, argIdx, theArg.m_Name, - theArg.m_FormalName, theArg.m_Description, - theArg.m_CompleteType, theArg.m_DefaultValue, - theArg.m_MetaDataData, theArg.m_ArgType); - } - } - while (GetNumHandlerArguments(theHandler) > argIdx) - DestroyHandlerArgument(theHandler, GetNumHandlerArguments(theHandler) - 1); - theHandlers.push_back(theHandler); - } else - outWarnings.push_back( - SMetaDataLoadWarning(MetaDataLoadWarningType::InvalidHandler, - MetaDataLoadWarningMessage::MissingName)); - } else if (AreEqual(inReader.GetElementName(), L"Reference")) { - const wchar_t *theValue; - if (inReader.Value(theValue)) - AddReference(inInstance, theValue); - } else { - QT3DS_ASSERT(false); - } - } - RemoveOldItemsAndSetOrder( - inInstance, theProperties, &SNewMetaDataImpl::GetSpecificMetaDataProperties, - &SNewMetaDataImpl::DestroyMetaDataProperty, m_InstanceToProperties); - RemoveOldItemsAndSetOrder(inInstance, theEvents, &SNewMetaDataImpl::GetSpecificEvents, - &SNewMetaDataImpl::DestroyEvent, m_InstanceToEvents); - RemoveOldItemsAndSetOrder(inInstance, theHandlers, &SNewMetaDataImpl::GetSpecificHandlers, - &SNewMetaDataImpl::DestroyHandler, m_InstanceToHandlers); - } - - // Save just this instances meta data out to the writer - void SaveInstance(IDOMWriter &inWriter, Qt3DSDMInstanceHandle inInstance) override - { - SerializeInstance(inWriter, inInstance); - } - - // Helper to convert char to wchar_t - eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> m_Buf; - const wchar_t *ConvertChar(const char *inName) - { - if (inName && *inName) { - qt3ds::foundation::ConvertUTF(inName, 0, m_Buf); - return reinterpret_cast<const wchar_t *>(m_Buf.c_str()); - } - return NULL; - } - - void LoadEffectInstance(const char *inShaderFile, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) override - { - QString shaderFile(inShaderFile); - if (shaderFile.endsWith(".effect")) { - LoadEffectXMLFromSourcePath(inShaderFile, inInstance, inObjectName, outWarnings, - inStream); - } else { - QT3DS_ASSERT(false); - } - } - - bool IsEffectInstanceRegistered(const char *inName) override - { - return m_EffectMap.find(Intern(inName)) != m_EffectMap.end(); - } - - inline qt3ds::render::NVRenderTextureFormats::Enum - ConvertTypeAndFormatToTextureFormat(const char8_t *inType, const char8_t *inFormat) - { - qt3ds::render::NVRenderTextureFormats::Enum retval - = qt3ds::render::NVRenderTextureFormats::RGBA8; - if (AreEqual(inFormat, "source")) - retval = qt3ds::render::NVRenderTextureFormats::Unknown; - else if (AreEqual(inFormat, "depth24stencil8")) - retval = qt3ds::render::NVRenderTextureFormats::Depth24Stencil8; - else { - if (AreEqual(inType, "ubyte")) { - if (AreEqual(inFormat, "rgb")) - retval = qt3ds::render::NVRenderTextureFormats::RGB8; - else if (AreEqual(inFormat, "rgba")) - retval = qt3ds::render::NVRenderTextureFormats::RGBA8; - else if (AreEqual(inFormat, "alpha")) - retval = qt3ds::render::NVRenderTextureFormats::Alpha8; - else if (AreEqual(inFormat, "lum")) - retval = qt3ds::render::NVRenderTextureFormats::Luminance8; - else if (AreEqual(inFormat, "lum_alpha")) - retval = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8; - else if (AreEqual(inFormat, "rg")) - retval = qt3ds::render::NVRenderTextureFormats::RG8; - } else if (AreEqual(inType, "ushort")) { - if (AreEqual(inFormat, "rgb")) - retval = qt3ds::render::NVRenderTextureFormats::RGB565; - else if (AreEqual(inFormat, "rgba")) - retval = qt3ds::render::NVRenderTextureFormats::RGBA5551; - } else if (AreEqual(inType, "fp16")) { - if (AreEqual(inFormat, "rgba")) - retval = qt3ds::render::NVRenderTextureFormats::RGBA16F; - else if (AreEqual(inFormat, "rg")) - retval = qt3ds::render::NVRenderTextureFormats::RG16F; - } else if (AreEqual(inType, "fp32")) { - if (AreEqual(inFormat, "rgba")) - retval = qt3ds::render::NVRenderTextureFormats::RGBA32F; - else if (AreEqual(inFormat, "rg")) - retval = qt3ds::render::NVRenderTextureFormats::RG32F; - } else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported texture type %s, - // defaulting to RGBA8", inType ); - } - } - return retval; - } - - static inline qt3ds::render::NVRenderTextureMagnifyingOp::Enum - ConvertFilterToMagOp(const char8_t *inFilter) - { - if (AreEqual(inFilter, "linear")) - return qt3ds::render::NVRenderTextureMagnifyingOp::Linear; - if (IsTrivial(inFilter) || AreEqual(inFilter, "nearest")) - return qt3ds::render::NVRenderTextureMagnifyingOp::Nearest; - else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting to - // linear", inFilter ); - return qt3ds::render::NVRenderTextureMagnifyingOp::Linear; - } - } - - static inline qt3ds::render::NVRenderTextureMinifyingOp::Enum - ConvertFilterToMinOp(const char8_t *inFilter) - { - // we make the decision based on the texture usage - if (AreEqual(inFilter, "linear")) - return qt3ds::render::NVRenderTextureMinifyingOp::Linear; - if (AreEqual(inFilter, "nearest")) - return qt3ds::render::NVRenderTextureMinifyingOp::Nearest; - if (AreEqual(inFilter, "linearMipmapLinear")) - return qt3ds::render::NVRenderTextureMinifyingOp::LinearMipmapLinear; - if (AreEqual(inFilter, "nearestMipmapNearest")) - return qt3ds::render::NVRenderTextureMinifyingOp::NearestMipmapNearest; - if (AreEqual(inFilter, "nearestMipmapLinear")) - return qt3ds::render::NVRenderTextureMinifyingOp::NearestMipmapLinear; - if (AreEqual(inFilter, "linearMipmapNearest")) - return qt3ds::render::NVRenderTextureMinifyingOp::LinearMipmapNearest; - else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting - // to linear", inFilter ); - return qt3ds::render::NVRenderTextureMinifyingOp::Linear; - } - } - - static inline qt3ds::render::NVRenderTextureCoordOp::Enum - ConvertTextureCoordOp(const char8_t *inWrap) - { - if (IsTrivial(inWrap) || AreEqual(inWrap, "clamp")) - return qt3ds::render::NVRenderTextureCoordOp::ClampToEdge; - if (AreEqual(inWrap, "repeat")) - return qt3ds::render::NVRenderTextureCoordOp::Repeat; - else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported wrap type %s, defaulting to - // clamp", inWrap ); - return qt3ds::render::NVRenderTextureCoordOp::ClampToEdge; - } - } - - static inline qt3ds::render::NVRenderTextureTypeValue::Enum - ConvertTextureType(const char8_t *inTexType) - { - // this usually comes from a MDL description file - if (IsTrivial(inTexType)) - return qt3ds::render::NVRenderTextureTypeValue::Unknown; - if (AreEqual(inTexType, "environment")) - return qt3ds::render::NVRenderTextureTypeValue::Environment; - if (AreEqual(inTexType, "diffuse")) - return qt3ds::render::NVRenderTextureTypeValue::Diffuse; - if (AreEqual(inTexType, "specular")) - return qt3ds::render::NVRenderTextureTypeValue::Specular; - if (AreEqual(inTexType, "bump")) - return qt3ds::render::NVRenderTextureTypeValue::Bump; - if (AreEqual(inTexType, "displacement")) - return qt3ds::render::NVRenderTextureTypeValue::Displace; - if (AreEqual(inTexType, "shadow")) - return qt3ds::render::NVRenderTextureTypeValue::LightmapShadow; - if (AreEqual(inTexType, "emissive")) - return qt3ds::render::NVRenderTextureTypeValue::Emissive; - if (AreEqual(inTexType, "emissive_mask")) - return qt3ds::render::NVRenderTextureTypeValue::Emissive2; - else { - return qt3ds::render::NVRenderTextureTypeValue::Unknown; - } - } - - static inline qt3ds::render::NVRenderSrcBlendFunc::Enum - ConvertToSrcBlendFunc(const char8_t *inFilter) - { - if (AreEqual(inFilter, "SrcAlpha")) - return qt3ds::render::NVRenderSrcBlendFunc::SrcAlpha; - if (AreEqual(inFilter, "OneMinusSrcAlpha")) - return qt3ds::render::NVRenderSrcBlendFunc::OneMinusSrcAlpha; - if (AreEqual(inFilter, "One")) - return qt3ds::render::NVRenderSrcBlendFunc::One; - else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting - // to linear", inFilter ); - return qt3ds::render::NVRenderSrcBlendFunc::One; - } - } - - static inline qt3ds::render::NVRenderDstBlendFunc::Enum - ConvertToDstBlendFunc(const char8_t *inFilter) - { - if (AreEqual(inFilter, "SrcAlpha")) - return qt3ds::render::NVRenderDstBlendFunc::SrcAlpha; - if (AreEqual(inFilter, "OneMinusSrcAlpha")) - return qt3ds::render::NVRenderDstBlendFunc::OneMinusSrcAlpha; - if (AreEqual(inFilter, "One")) - return qt3ds::render::NVRenderDstBlendFunc::One; - else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting - // to linear", inFilter ); - return qt3ds::render::NVRenderDstBlendFunc::One; - } - } - - static inline qt3ds::render::NVRenderState::Enum ConvertRenderState(const char8_t *inState) - { - if (AreEqual(inState, "Stencil")) - return qt3ds::render::NVRenderState::StencilTest; - else { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Unsupported filter type %s, defaulting - // to linear", inFilter ); - return qt3ds::render::NVRenderState::StencilTest; - } - } - - static inline qt3ds::render::NVRenderImageAccessType::Enum - ConvertToImageAccessType(const char8_t *inAccess) - { - if (AreEqual(inAccess, "read")) - return qt3ds::render::NVRenderImageAccessType::Read; - if (AreEqual(inAccess, "write")) - return qt3ds::render::NVRenderImageAccessType::Write; - if (AreEqual(inAccess, "readwrite")) - return qt3ds::render::NVRenderImageAccessType::ReadWrite; - else - QT3DS_ASSERT(false); - - return qt3ds::render::NVRenderImageAccessType::ReadWrite; - } - - static inline size_t GetTypeSize(const char8_t *inType) - { - if (AreEqual(inType, "uint")) - return sizeof(QT3DSU32); - else if (AreEqual(inType, "int")) - return sizeof(QT3DSI32); - else if (AreEqual(inType, "uvec4")) - return sizeof(QT3DSU32) * 4; - else - QT3DS_ASSERT(false); - - return 1; - } - - inline qt3ds::render::NVRenderBufferBindValues::Enum - ConvertFormatToBufferBindFlags(const char8_t *inFormat) - { - if (AreEqual(inFormat, "storage")) - return qt3ds::render::NVRenderBufferBindValues::Storage; - else if (AreEqual(inFormat, "indirect")) - return qt3ds::render::NVRenderBufferBindValues::Draw_Indirect; - else - QT3DS_ASSERT(false); - - return qt3ds::render::NVRenderBufferBindValues::Unknown; - } - - static inline void AppendShaderUniform(const char8_t *type, const char8_t *name, - eastl::string &shaderPrefix) - { - shaderPrefix.append("uniform "); - shaderPrefix.append(type); - shaderPrefix.append(" "); - shaderPrefix.append(name); - shaderPrefix.append(";\n"); - } - static inline void AppendShaderCode( - const char8_t *inCode, Qt3DSDMStr &ioStr, - eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> - &inConvertBuffer) - { - qt3ds::foundation::ConvertUTF(inCode, 0, inConvertBuffer); - ioStr.append(inConvertBuffer); - } - void HideEffectProperty(Qt3DSDMInstanceHandle inInstance, const char8_t *inParamName) - { - Qt3DSDMMetaDataPropertyHandle theProp = - GetSpecificMetaDataProperty(inInstance, Intern(inParamName)); - if (theProp.Valid()) { - SMetaDataPropertyInfo theInfo = GetMetaDataPropertyInfo(theProp); - SetMetaDataPropertyInfo(theProp, theInfo.m_Name, theInfo.m_FormalName, - theInfo.m_Description, theInfo.m_Usage, theInfo.m_CompleteType, - theInfo.m_DefaultValue, theInfo.m_MetaDataData, - theInfo.m_GroupName, true, theInfo.m_Animatable, - theInfo.m_Controllable); - } - } - - static inline void GetShaderName(const TCharStr &inObjectName, - const char8_t *inShaderSpecificName, - eastl::string &outShaderName) - { - outShaderName.clear(); - qt3ds::foundation::ConvertUTF(inObjectName.c_str(), 0, outShaderName); - outShaderName.append(" - "); - outShaderName.append(inShaderSpecificName); - } - - void LoadDynamicObjectProperties(IDOMReader &inStream, SMetaDataDynamicObjectImpl &ioObject, - Qt3DSDMInstanceHandle inInstance, const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - eastl::string &shaderPrefix) - { - eastl::string vertexUniforms; - eastl::string fragmentUniforms; - vertexUniforms += "#ifdef VERTEX_SHADER\n"; - fragmentUniforms += "#ifdef FRAGMENT_SHADER\n"; - using namespace qt3ds::render::dynamic; - ioObject.m_Properties.clear(); - ioObject.ClearEnumValueNames(); - IDOMReader::Scope __readerScope(inStream); - if (inStream.MoveToFirstChild("MetaData")) { - { - IDOMReader::Scope __readerScope(inStream); - LoadInstance(inStream, inInstance, inObjectName, outWarnings); - } - - vector<Qt3DSDMMetaDataPropertyHandle> theProperties; - GetSpecificMetaDataProperties(inInstance, theProperties); - size_t propIdx = 0, propEnd = theProperties.size(); - for (bool success = inStream.MoveToFirstChild("Property"); success && propIdx < propEnd; - success = inStream.MoveToNextSibling("Property"), ++propIdx) { - ioObject.m_Properties.push_back(); - SPropertyDefinition &theNewDefinition = ioObject.m_Properties.back(); - SMetaDataPropertyInfo theInfo(GetMetaDataPropertyInfo(theProperties[propIdx])); - theNewDefinition.m_Name = - m_StringTable.GetRenderStringTable().RegisterStr(theInfo.m_Name.c_str()); - const char8_t *xmlName; - inStream.Att("name", xmlName); - const char8_t *stage; - inStream.Att("stage", stage); - eastl::string uniforms; - if (AreEqual(xmlName, theNewDefinition.m_Name.c_str())) { - switch (theInfo.GetDataType()) { - case DataModelDataType::Bool: - theNewDefinition.m_DataType = - qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool; - AppendShaderUniform("bool", theNewDefinition.m_Name.c_str(), uniforms); - break; - case DataModelDataType::Long: - theNewDefinition.m_DataType - = qt3ds::render::NVRenderShaderDataTypes::QT3DSI32; - AppendShaderUniform("int", theNewDefinition.m_Name.c_str(), uniforms); - break; - case DataModelDataType::Float2: - theNewDefinition.m_DataType - = qt3ds::render::NVRenderShaderDataTypes::QT3DSVec2; - AppendShaderUniform("vec2", theNewDefinition.m_Name.c_str(), uniforms); - break; - case DataModelDataType::Float3: - theNewDefinition.m_DataType - = qt3ds::render::NVRenderShaderDataTypes::QT3DSVec3; - AppendShaderUniform("vec3", theNewDefinition.m_Name.c_str(), uniforms); - break; - case DataModelDataType::Float4: - theNewDefinition.m_DataType - = qt3ds::render::NVRenderShaderDataTypes::QT3DSVec4; - AppendShaderUniform("vec4", theNewDefinition.m_Name.c_str(), uniforms); - break; - case DataModelDataType::String: - if (theInfo.m_CompleteType == CompleteMetaDataType::Texture) { - theNewDefinition.m_DataType = - qt3ds::render::NVRenderShaderDataTypes::NVRenderTexture2DPtr; - const char8_t *filter = "linear", *minFilter = "linear", - *clamp = "clamp", *usage = "", *path = ""; - if (inStream.Att("filter", filter)) - theNewDefinition.m_MagFilterOp = ConvertFilterToMagOp(filter); - if (inStream.Att("minfilter", minFilter)) - theNewDefinition.m_MinFilterOp = ConvertFilterToMinOp(minFilter); - if (inStream.Att("clamp", clamp)) - theNewDefinition.m_CoordOp = ConvertTextureCoordOp(clamp); - if (inStream.Att("usage", usage)) - theNewDefinition.m_TexUsageType = ConvertTextureType(usage); - if (inStream.Att("default", path)) { - TDataStrPtr theDataStr( - theInfo.m_DefaultValue.getData<TDataStrPtr>()); - theNewDefinition.m_ImagePath = - m_StringTable.GetRenderStringTable().RegisterStr( - theDataStr->GetData()); - } - - // Output macro so we can change the set of variables used for this - // independent of the - // meta data system. - uniforms.append("SNAPPER_SAMPLER2D("); - uniforms.append(theNewDefinition.m_Name.c_str()); - uniforms.append(", "); - uniforms.append(theNewDefinition.m_Name.c_str()); - uniforms.append(", "); - uniforms.append(filter); - uniforms.append(", "); - uniforms.append(clamp); - uniforms.append(", "); - uniforms.append("false )\n"); - } else if (theInfo.m_CompleteType == CompleteMetaDataType::StringList) { - theNewDefinition.m_DataType = - qt3ds::render::NVRenderShaderDataTypes::QT3DSI32; - const TMetaDataStringList &theList = - qt3dsdm::get<TMetaDataStringList>(theInfo.m_MetaDataData); - ioObject.m_EnumValueNames.push_back( - new eastl::vector<qt3ds::foundation::CRegisteredString>()); - eastl::vector<qt3ds::foundation::CRegisteredString> &theBack = - *ioObject.m_EnumValueNames.back(); - for (QT3DSU32 idx = 0, end = (QT3DSU32)theList.size(); idx < end; ++idx) - theBack.push_back(m_StringTable.GetRenderStringTable().RegisterStr( - theList[idx].c_str())); - theNewDefinition.m_EnumValueNames = VecToCRef(theBack); - theNewDefinition.m_IsEnumProperty = true; - AppendShaderUniform("int", theNewDefinition.m_Name.c_str(), - uniforms); - } else if (theInfo.m_CompleteType == CompleteMetaDataType::Image2D) { - theNewDefinition.m_DataType = - qt3ds::render::NVRenderShaderDataTypes::NVRenderImage2DPtr; - const char8_t *format = "", *binding = "", *access = "readonly"; - uniforms.append("layout("); - inStream.Att("format", format); - uniforms.append(format); - if (inStream.Att("binding", binding)) { - uniforms.append(", binding = "); - uniforms.append(binding); - } - uniforms.append(") "); - - // if we have format layout we cannot set an additional access qualifier - if (inStream.Att("access", access) && !AreEqual(format, "")) - uniforms.append(access); - - uniforms.append(" uniform image2D "); - uniforms.append(theNewDefinition.m_Name.c_str()); - uniforms.append(";\n"); - } else if (theInfo.m_CompleteType == CompleteMetaDataType::Buffer) { - theNewDefinition.m_DataType = - qt3ds::render::NVRenderShaderDataTypes::NVRenderDataBufferPtr; - const char8_t *align = "std140", *usage = "storage", *binding = "", - *format = "float"; - uniforms.append("layout("); - - inStream.Att("format", format); - inStream.Att("usage", usage); - if (AreEqual(usage, "storage")) { - inStream.Att("align", align); - uniforms.append(align); - - if (inStream.Att("binding", binding)) { - uniforms.append(", binding = "); - uniforms.append(binding); - } - - uniforms.append(") "); - - uniforms.append("buffer "); - uniforms.append(theNewDefinition.m_Name.c_str()); - uniforms.append("\n{ \n"); - uniforms.append(format); - uniforms.append(" "); - uniforms.append(theNewDefinition.m_Name.c_str()); - uniforms.append("_data[]; \n};\n"); - } else { - // currently we only handle storage counters - QT3DS_ASSERT(false); - } - } - break; - default: - QT3DS_ASSERT(false); - // Fallthrough intentional - case DataModelDataType::Float: - theNewDefinition.m_DataType = qt3ds::render::NVRenderShaderDataTypes::QT3DSF32; - AppendShaderUniform("float", theNewDefinition.m_Name.c_str(), uniforms); - break; - } - } else { - // It is conceivable that we not every property tag gets parsed into a property. - QT3DS_ASSERT(false); - // So we will bump to the next item and try again. - --propIdx; - } - - if (AreEqual(stage, "vertex")) { - vertexUniforms += uniforms; - } else if (AreEqual(stage, "fragment")) { - fragmentUniforms += uniforms; - } else { - vertexUniforms += uniforms; - fragmentUniforms += uniforms; - } - } - } - vertexUniforms += "#endif\n"; - fragmentUniforms += "#endif\n"; - shaderPrefix.append(vertexUniforms); - shaderPrefix.append(fragmentUniforms); - } - - void LoadDynamicObjectShaders(IDOMReader &inStream, SMetaDataDynamicObjectImpl &ioObject, - eastl::string &shaderPrefix, const TCharStr &inObjectName) - { - eastl::string theShaderNameStr; - eastl::string theShaderTypeStr; - eastl::string theShaderVersionStr; - { - IDOMReader::Scope __readerScope(inStream); - eastl::basic_string<qt3ds::foundation::TWCharEASTLConverter::TCharType> theConvertBuffer; - if (inStream.MoveToFirstChild("Shaders")) { - const char8_t *globalShared = ""; - const char8_t *globalVertexShared = ""; - const char8_t *globalFragmentShared = ""; - inStream.ChildValue("Shared", globalShared); - inStream.ChildValue("VertexShaderShared", globalVertexShared); - inStream.ChildValue("FragmentShaderShared", globalFragmentShared); - - inStream.Att("type", theShaderTypeStr); // can be empty - inStream.Att("version", theShaderVersionStr); // can be empty - - for (bool success = inStream.MoveToFirstChild(); success; - success = inStream.MoveToNextSibling()) { - IDOMReader::Scope __shaderScope(inStream); - const char8_t *elemName = inStream.GetNarrowElementName(); - // If this is neither a compute shader nor a normal shader, go on and ignore - // element. - if (!(AreEqual(elemName, "Shader") || AreEqual(elemName, "ComputeShader"))) - continue; - - ioObject.m_Shaders.push_back(); - SMetaDataShader &theShader = ioObject.m_Shaders.back(); - - qt3ds::foundation::ConvertUTF(theShaderTypeStr.c_str(), theShaderTypeStr.size(), - theShader.m_Type); - qt3ds::foundation::ConvertUTF(theShaderVersionStr.c_str(), - theShaderVersionStr.size(), theShader.m_Version); - const char8_t *theName = ""; - char8_t theITOABuffer[64] = { 0 }; - if (!inStream.Att("name", theName)) { - sprintf(theITOABuffer, "%d", (int)ioObject.m_Shaders.size() - 1); - theName = theITOABuffer; - } - GetShaderName(inObjectName, theName, theShaderNameStr); - qt3ds::foundation::ConvertUTF(theShaderNameStr.c_str(), theShaderNameStr.size(), - theShader.m_Name); - - if (AreEqual(elemName, "Shader")) { - const char8_t *shaderShared = ""; - inStream.ChildValue("Shared", shaderShared); - const char8_t *vertexCode = ""; - inStream.ChildValue("VertexShader", vertexCode); - if (IsTrivial(vertexCode)) - vertexCode = "void vert(){}"; - const char8_t *fragmentCode = "void frag(){}"; - inStream.ChildValue("FragmentShader", fragmentCode); - if (IsTrivial(fragmentCode)) - fragmentCode = "void frag(){}"; - const char8_t *geomCode = ""; - inStream.ChildValue("GeometryShader", geomCode); - - AppendShaderCode(shaderPrefix.c_str(), theShader.m_Code, theConvertBuffer); - AppendShaderCode(globalShared, theShader.m_Code, theConvertBuffer); - AppendShaderCode(shaderShared, theShader.m_Code, theConvertBuffer); - AppendShaderCode("\n#ifdef VERTEX_SHADER\n", theShader.m_Code, - theConvertBuffer); - AppendShaderCode(globalVertexShared, theShader.m_Code, theConvertBuffer); - AppendShaderCode(vertexCode, theShader.m_Code, theConvertBuffer); - AppendShaderCode("\n#endif\n", theShader.m_Code, theConvertBuffer); - if (!IsTrivial(geomCode)) { - AppendShaderCode("\n#ifdef USER_GEOMETRY_SHADER\n", theShader.m_Code, - theConvertBuffer); - AppendShaderCode(geomCode, theShader.m_Code, theConvertBuffer); - AppendShaderCode("\n#endif\n", theShader.m_Code, theConvertBuffer); - theShader.m_HasGeomShader = true; - } - AppendShaderCode("\n#ifdef FRAGMENT_SHADER\n", theShader.m_Code, - theConvertBuffer); - AppendShaderCode(globalFragmentShared, theShader.m_Code, theConvertBuffer); - AppendShaderCode(fragmentCode, theShader.m_Code, theConvertBuffer); - AppendShaderCode("\n#endif\n", theShader.m_Code, theConvertBuffer); - } else if (AreEqual(elemName, "ComputeShader")) { - const char8_t *shaderCode = ""; - inStream.Value(shaderCode); - theShader.m_IsComputeShader = true; - AppendShaderCode(shaderCode, theShader.m_Code, theConvertBuffer); - } - } - } - } - } - - static size_t Align(size_t inValue) - { - if (inValue % 4) - return inValue + (4 - (inValue % 4)); - return inValue; - } - - static qt3ds::render::dynamic::SDepthStencilFlags ParseDepthStencilFlags(const char8_t *inFlags) - { - eastl::string parseStr(inFlags); - eastl::string tokenStr; - qt3ds::render::dynamic::SDepthStencilFlags retval; - for (uint32_t pos = parseStr.find('|'); parseStr.empty() == false; - pos = parseStr.find('|')) { - if (pos != eastl::string::npos) { - tokenStr = parseStr.substr(pos); - parseStr.erase(parseStr.begin(), parseStr.begin() + pos + 1); - } else { - tokenStr = parseStr; - parseStr.clear(); - } - if (AreEqual(tokenStr.c_str(), "clear-stencil")) - retval |= qt3ds::render::dynamic::DepthStencilFlagValues::ClearStencil; - if (AreEqual(tokenStr.c_str(), "clear-depth")) - retval |= qt3ds::render::dynamic::DepthStencilFlagValues::ClearDepth; - } - return retval; - } - - static qt3ds::render::NVRenderBoolOp::Enum ParseBoolOp(const char8_t *inOp) - { - if (AreEqual(inOp, "never")) - return qt3ds::render::NVRenderBoolOp::Never; - if (AreEqual(inOp, "less")) - return qt3ds::render::NVRenderBoolOp::Less; - if (AreEqual(inOp, "less-than-or-equal")) - return qt3ds::render::NVRenderBoolOp::LessThanOrEqual; - if (AreEqual(inOp, "equal")) - return qt3ds::render::NVRenderBoolOp::Equal; - if (AreEqual(inOp, "not-equal")) - return qt3ds::render::NVRenderBoolOp::NotEqual; - if (AreEqual(inOp, "greater")) - return qt3ds::render::NVRenderBoolOp::Greater; - if (AreEqual(inOp, "greater-than-or-equal")) - return qt3ds::render::NVRenderBoolOp::GreaterThanOrEqual; - if (AreEqual(inOp, "always")) - return qt3ds::render::NVRenderBoolOp::AlwaysTrue; - - QT3DS_ASSERT(false); - return qt3ds::render::NVRenderBoolOp::Unknown; - } - - static qt3ds::render::NVRenderStencilOp::Enum ParseStencilOp(const char8_t *inOp) - { - - if (AreEqual(inOp, "keep")) - return qt3ds::render::NVRenderStencilOp::Keep; - if (AreEqual(inOp, "zero")) - return qt3ds::render::NVRenderStencilOp::Zero; - if (AreEqual(inOp, "replace")) - return qt3ds::render::NVRenderStencilOp::Replace; - if (AreEqual(inOp, "increment")) - return qt3ds::render::NVRenderStencilOp::Increment; - if (AreEqual(inOp, "increment-wrap")) - return qt3ds::render::NVRenderStencilOp::IncrementWrap; - if (AreEqual(inOp, "decrement")) - return qt3ds::render::NVRenderStencilOp::Decrement; - if (AreEqual(inOp, "decrement-wrap")) - return qt3ds::render::NVRenderStencilOp::DecrementWrap; - if (AreEqual(inOp, "invert")) - return qt3ds::render::NVRenderStencilOp::Invert; - - QT3DS_ASSERT(false); - return qt3ds::render::NVRenderStencilOp::Unknown; - } - - // Reloads an effect if one is already loaded so we can replace the existing effect definition - void LoadEffectXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - const TCharStr &inSourcePath) override - { - using namespace qt3ds::render::dynamic; - std::pair<TEffectMap::iterator, bool> theInserter = - m_EffectMap.insert(std::make_pair(Intern(inObjectName), SMetaDataEffectImpl())); - /*if ( inStream.MoveToFirstChild( "Effect" ) == false ) - { - outWarnings.push_back( SMetaDataLoadWarning( MetaDataLoadWarningType::Unknown, - MetaDataLoadWarningMessage::GeneralError, L"File doesn't appear to be an effect xml file, - missing top level Effect tag" ) ); - return; - }*/ - eastl::string shaderPrefix = "#include \"effect.glsllib\"\n"; - - SMetaDataEffectImpl &theEffect = theInserter.first->second; - m_ObjectName = inObjectName; - theEffect.m_Name = inObjectName; - theEffect.m_SourcePath = inSourcePath; - theEffect.ClearEffectCommands(); - LoadDynamicObjectProperties(inStream, theEffect, inInstance, inObjectName, outWarnings, - shaderPrefix); - theEffect.m_Shaders.clear(); - LoadDynamicObjectShaders(inStream, theEffect, shaderPrefix, inObjectName); - eastl::string theShaderNameStr; - { - IDOMReader::Scope __readerScope(inStream); - if (inStream.MoveToFirstChild("Passes")) { - for (bool success = inStream.MoveToFirstChild(); success; - success = inStream.MoveToNextSibling()) { - IDOMReader::Scope __passScope(inStream); - if (AreEqual("Pass", inStream.GetNarrowElementName())) { - bool drawIndirect = false; - const char8_t *shader = "", *input = "[source]", *output = "[dest]", - *outputFormat = "rgba"; - inStream.Att("shader", shader); - inStream.Att("input", input); - inStream.Att("output", output); - // this is only for the final output of the effect - inStream.Att("format", outputFormat); - qt3ds::render::NVRenderTextureFormats::Enum theOutputFormat = - ConvertTypeAndFormatToTextureFormat("ubyte", outputFormat); - if (AreEqual(output, "[dest]") || IsTrivial(output)) - theEffect.m_EffectCommands.push_back(new SBindTarget(theOutputFormat)); - else - theEffect.m_EffectCommands.push_back( - new SBindBuffer( - m_StringTable.GetRenderStringTable().RegisterStr(output), - false)); - GetShaderName(inObjectName, shader, theShaderNameStr); - theEffect.m_EffectCommands.push_back( - new SBindShader(m_StringTable.GetRenderStringTable().RegisterStr( - theShaderNameStr.c_str()))); - theEffect.m_EffectCommands.push_back(new SApplyInstanceValue()); - if (AreEqual(input, "[source]") || IsTrivial(input)) - theEffect.m_EffectCommands.push_back( - new SApplyBufferValue( - m_StringTable.GetRenderStringTable().RegisterStr(""), - m_StringTable.GetRenderStringTable().RegisterStr(""))); - else - theEffect.m_EffectCommands.push_back( - new SApplyBufferValue( - m_StringTable.GetRenderStringTable().RegisterStr(input), - m_StringTable.GetRenderStringTable().RegisterStr(""))); - for (bool bufParam = inStream.MoveToFirstChild(); bufParam; - bufParam = inStream.MoveToNextSibling()) { - if (AreEqual("BufferInput", inStream.GetNarrowElementName())) { - const char8_t *param = ""; - const char8_t *value = ""; - inStream.Att("param", param); - inStream.Att("value", value); - if (AreEqual("[source]", value)) - value = ""; - theEffect.m_EffectCommands.push_back( - new SApplyBufferValue( - m_StringTable.GetRenderStringTable().RegisterStr( - value), - m_StringTable.GetRenderStringTable().RegisterStr( - param))); - HideEffectProperty(inInstance, param); - } else if (AreEqual("DepthInput", inStream.GetNarrowElementName())) { - const char8_t *param = ""; - inStream.Att("param", param); - theEffect.m_EffectCommands.push_back( - new SApplyDepthValue( - m_StringTable.GetRenderStringTable().RegisterStr( - param))); - HideEffectProperty(inInstance, param); - } else if (AreEqual("ImageInput", inStream.GetNarrowElementName())) { - bool useAsTexture = false; - bool needSync = false; - const char8_t *param = ""; - const char8_t *value = ""; - const char8_t *usage = ""; - const char8_t *sync = ""; - inStream.Att("param", param); - inStream.Att("value", value); - if (AreEqual("[source]", value)) - value = ""; - inStream.Att("usage", usage); - if (AreEqual("texture", usage)) - useAsTexture = true; - inStream.Att("sync", sync); - if (AreEqual("true", sync)) - needSync = true; - - theEffect.m_EffectCommands.push_back( - new SApplyImageValue( - m_StringTable.GetRenderStringTable().RegisterStr( - value), - m_StringTable.GetRenderStringTable().RegisterStr( - param), useAsTexture, needSync)); - HideEffectProperty(inInstance, param); - } else if (AreEqual("DataBufferInput", - inStream.GetNarrowElementName())) { - const char8_t *param = ""; - const char8_t *usage = ""; - inStream.Att("param", param); - inStream.Att("usage", usage); - qt3ds::render::NVRenderBufferBindValues::Enum bufType = - ConvertFormatToBufferBindFlags(usage); - - // check if we using an indirect buffer for drawing - if (bufType == qt3ds::render::NVRenderBufferBindValues::Draw_Indirect) - drawIndirect = true; - - theEffect.m_EffectCommands.push_back( - new SApplyDataBufferValue( - m_StringTable.GetRenderStringTable().RegisterStr( - param), bufType)); - HideEffectProperty(inInstance, param); - } else if (AreEqual("SetParam", inStream.GetNarrowElementName())) { - const char8_t *name = ""; - inStream.Att("name", name); - const char8_t *value = ""; - inStream.Att("value", value); - // find the param and the type. - qt3ds::foundation::CRegisteredString propName = - m_StringTable.GetRenderStringTable().RegisterStr(name); - qt3ds::render::dynamic::SPropertyDefinition *theDefinition = NULL; - for (uint32_t propIdx = 0, propEnd = theEffect.m_Properties.size(); - propIdx < propEnd && theDefinition == NULL; ++propIdx) { - if (theEffect.m_Properties[propIdx].m_Name == propName) - theDefinition = &theEffect.m_Properties[propIdx]; - } - if (theDefinition != NULL) { - // Hack it for now because the shader datatypes don't have a - // built in sizeof operator. - QT3DSU32 valueSize = 4; - qt3ds::render::NVRenderShaderDataTypes::Enum theDataType = - theDefinition->m_DataType; - size_t allocSize = sizeof(SApplyValue) + valueSize; - QT3DSU8 *theCommandData = (QT3DSU8 *)malloc(allocSize); - QT3DSU8 *theValueData = theCommandData + sizeof(SApplyValue); - new (theCommandData) SApplyValue(propName, theDataType); - SApplyValue *theCommand = - reinterpret_cast<SApplyValue *>(theCommandData); - switch (theDataType) { - case qt3ds::render::NVRenderShaderDataTypes::QT3DSRenderBool: { - bool &target = *reinterpret_cast<bool *>(theValueData); - qt3ds::foundation::StringConversion<bool>().StrTo(value, - target); - } break; - case qt3ds::render::NVRenderShaderDataTypes::QT3DSI32: { - QT3DSI32 &target = *reinterpret_cast<QT3DSI32 *>( - theValueData); - qt3ds::foundation::StringConversion<QT3DSI32>().StrTo( - value, target); - } break; - default: - QT3DS_ASSERT(false); - // Fallthrough intentional - case qt3ds::render::NVRenderShaderDataTypes::QT3DSF32: { - QT3DSF32 &target = *reinterpret_cast<QT3DSF32 *>( - theValueData); - qt3ds::foundation::StringConversion<QT3DSF32>().StrTo( - value, target); - } break; - } - theCommand->m_Value = NVDataRef<QT3DSU8>(theValueData, - valueSize); - theEffect.m_EffectCommands.push_back(theCommand); - } - } else if (AreEqual("Blending", inStream.GetNarrowElementName())) { - const char8_t *theSrcBlendFuncStr = "", *theDestBlendFuncStr = ""; - inStream.Att("source", theSrcBlendFuncStr); - inStream.Att("dest", theDestBlendFuncStr); - - qt3ds::render::NVRenderSrcBlendFunc::Enum theSrcBlendFunc = - ConvertToSrcBlendFunc(theSrcBlendFuncStr); - qt3ds::render::NVRenderDstBlendFunc::Enum theDstBlendFuc = - ConvertToDstBlendFunc(theDestBlendFuncStr); - - // this will setup blending - theEffect.m_EffectCommands.push_back( - new SApplyBlending(theSrcBlendFunc, theDstBlendFuc)); - } else if (AreEqual("RenderState", inStream.GetNarrowElementName())) { - const char8_t *name = ""; - inStream.Att("name", name); - const char8_t *value = ""; - inStream.Att("value", value); - // find the param and the type. - bool theStateEnable = false; - qt3ds::render::NVRenderState::Enum theState - = ConvertRenderState(name); - if (AreEqual("true", value)) - theStateEnable = true; - - // this will setup blending - theEffect.m_EffectCommands.push_back( - new SApplyRenderState(theState, theStateEnable)); - } else if (AreEqual("DepthStencil", inStream.GetNarrowElementName())) { - const char8_t *bufferName = ""; - inStream.Att("buffer", bufferName); - QT3DSU32 stencilvalue = 0; - inStream.Att("reference", stencilvalue); - const char8_t *flags = ""; - inStream.Att("flags", flags); - QT3DSU32 mask = QT3DS_MAX_U32; - inStream.Att("mask", mask); - qt3ds::render::NVRenderBoolOp::Enum stencilFunction = - qt3ds::render::NVRenderBoolOp::Equal; - qt3ds::render::NVRenderStencilOp::Enum stencilFailOperation = - qt3ds::render::NVRenderStencilOp::Keep; - qt3ds::render::NVRenderStencilOp::Enum depthPass = - qt3ds::render::NVRenderStencilOp::Keep; - qt3ds::render::NVRenderStencilOp::Enum depthFail = - qt3ds::render::NVRenderStencilOp::Keep; - const char8_t *temp; - if (inStream.Att("stencil-fail", temp)) - stencilFailOperation = ParseStencilOp(temp); - if (inStream.Att("depth-pass", temp)) - depthPass = ParseStencilOp(temp); - if (inStream.Att("depth-fail", temp)) - depthFail = ParseStencilOp(temp); - if (inStream.Att("stencil-function", temp)) - stencilFunction = ParseBoolOp(temp); - - qt3ds::render::dynamic::SDepthStencilFlags flagValues = - ParseDepthStencilFlags(flags); - theEffect.m_EffectCommands.push_back( - new SDepthStencil( - m_StringTable.GetRenderStringTable().RegisterStr( - bufferName), flagValues, stencilFailOperation, - depthPass, depthFail, stencilFunction, stencilvalue, - mask)); - } else { - QT3DS_ASSERT(false); - } - } - theEffect.m_EffectCommands.push_back(new SRender(drawIndirect)); - } else if (AreEqual("Buffer", inStream.GetNarrowElementName()) - || AreEqual("Image", inStream.GetNarrowElementName())) { - SAllocateBufferFlags theFlags; - const char8_t *theLifetimeStr = "", *theType = "", *theFormat = "", - *theFilter = "", *theWrap = "", *theName = ""; - QT3DSF32 theSize = 1.0f; - bool isImage = AreEqual("Image", inStream.GetNarrowElementName()); - inStream.Att("name", theName); - inStream.Att("lifetime", theLifetimeStr); - inStream.Att("type", theType); - inStream.Att("format", theFormat); - inStream.Att("filter", theFilter); - inStream.Att("wrap", theWrap); - inStream.Att("size", theSize); - // Clamp the size to valid amounts - if (theSize <= 0) - theSize = 1.0f; - if (theSize > 1.0f) - theSize = 1.0f; - if (AreEqual(theLifetimeStr, "scene")) - theFlags.SetSceneLifetime(true); - qt3ds::render::NVRenderTextureFormats::Enum theTexFormat = - ConvertTypeAndFormatToTextureFormat(theType, theFormat); - qt3ds::render::NVRenderTextureMagnifyingOp::Enum theMagOp = - ConvertFilterToMagOp(theFilter); - qt3ds::render::NVRenderTextureCoordOp::Enum theCoordOp = - ConvertTextureCoordOp(theWrap); - if (*theName == 0) { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Buffer is missing its - // name" ); - } else if (isImage) { - const char8_t *temp; - qt3ds::render::NVRenderImageAccessType::Enum theAccess = - qt3ds::render::NVRenderImageAccessType::ReadWrite; - if (inStream.Att("access", temp)) - theAccess = ConvertToImageAccessType(temp); - - theEffect.m_EffectCommands.push_back( - new SAllocateImage( - m_StringTable.GetRenderStringTable().RegisterStr( - theName), theTexFormat, theMagOp, theCoordOp, - theSize, theFlags, theAccess)); - } else { - theEffect.m_EffectCommands.push_back( - new SAllocateBuffer( - m_StringTable.GetRenderStringTable().RegisterStr( - theName), theTexFormat, theMagOp, theCoordOp, - theSize, theFlags)); - } - } else if (AreEqual("DataBuffer", inStream.GetNarrowElementName())) { - SAllocateBufferFlags theFlags; - const char8_t *theLifetimeStr = "", *theType = "", *theWrapName = "", - *theWrapType = "", *theFormat = "", *theName = ""; - QT3DSF32 theSize = 1.0f; - qt3ds::render::NVRenderBufferBindValues::Enum bufType, - wrapBufType = qt3ds::render::NVRenderBufferBindValues::Unknown; - - inStream.Att("name", theName); - inStream.Att("lifetime", theLifetimeStr); - inStream.Att("type", theType); - inStream.Att("format", theFormat); - inStream.Att("size", theSize); - if (AreEqual(theLifetimeStr, "scene")) - theFlags.SetSceneLifetime(true); - bufType = ConvertFormatToBufferBindFlags(theType); - - if (inStream.Att("wrapType", theWrapType)) { - wrapBufType = ConvertFormatToBufferBindFlags(theWrapType); - inStream.Att("wrapName", theWrapName); - if (*theWrapName == 0) - QT3DS_ASSERT(false); - } - - theSize *= GetTypeSize(theFormat); - - if (theSize <= 0) - theSize = 1.0f; - - if (*theName == 0) { - QT3DS_ASSERT(false); - } else { - theEffect.m_EffectCommands.push_back( - new SAllocateDataBuffer( - m_StringTable.GetRenderStringTable().RegisterStr( - theName), bufType, - m_StringTable.GetRenderStringTable().RegisterStr( - theWrapName), wrapBufType, theSize, theFlags)); - } - } else { - QT3DS_ASSERT(false); // Unrecognized effect passes member. - } - } - - } else { - if (theEffect.m_Shaders.size()) { - // Create the minimal set of commands that we could run the first shader with. - theEffect.m_EffectCommands.push_back(new SBindTarget()); - theEffect.m_EffectCommands.push_back( - new SBindShader(m_StringTable.GetRenderStringTable().RegisterStr( - theEffect.m_Shaders[0].m_Name.c_str()))); - theEffect.m_EffectCommands.push_back(new SApplyInstanceValue()); - theEffect.m_EffectCommands.push_back(new SRender(false)); - } - } - } - } - - bool LoadEffectXMLFromSourcePath(const char *inSourcePath, - Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) override - { - std::shared_ptr<IDOMFactory> theFactory( - IDOMFactory::CreateDOMFactory(m_DataCore->GetStringTablePtr())); - qt3dsdm::SDOMElement *theElem = CDOMSerializer::Read(*theFactory, inStream, NULL); - if (theElem != NULL) { - std::shared_ptr<IDOMReader> theReader( - IDOMReader::CreateDOMReader(*theElem, m_DataCore->GetStringTablePtr(), - theFactory)); - LoadEffectXML(*theReader, inInstance, inObjectName, outWarnings, - TCharStr(Intern(inSourcePath))); - return true; - } - return false; - } - - Option<SMetaDataEffect> GetEffectBySourcePath(const char *inSourcePath) override - { - QDir sourcePath = QDir::cleanPath(QString(inSourcePath)); - for (TEffectMap::iterator iter = m_EffectMap.begin(), end = m_EffectMap.end(); iter != end; - ++iter) { - QDir effectPath = QDir::cleanPath(QString::fromWCharArray( - iter->second.m_SourcePath.wide_str())); - if (effectPath == sourcePath) - return iter->second.ToEffect(); - } - return Empty(); - } - - void LoadMaterialInstance(const char *inShaderFile, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) override - { - QString shaderFile(inShaderFile); - if (shaderFile.endsWith(".material") || shaderFile.endsWith(".shader")) { - LoadMaterialClassFromSourcePath(inShaderFile, inInstance, inName, outWarnings, - inStream); - } else { - QT3DS_ASSERT(false); - } - } - - bool IsMaterialClassRegistered(const char *inName) override - { - return m_CustomMaterials.find(Intern(inName)) != m_CustomMaterials.end(); - } - - void LoadMaterialClassXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - const TCharStr &inSourcePath) override - { - using namespace qt3ds::render::dynamic; - - std::pair<TCustomMaterialMap::iterator, bool> theInserter = m_CustomMaterials.insert( - std::make_pair(Intern(inObjectName), SMetaDataCustomMaterialImpl())); - /*if ( inStream.MoveToFirstChild( "Effect" ) == false ) - { - outWarnings.push_back( SMetaDataLoadWarning( MetaDataLoadWarningType::Unknown, - MetaDataLoadWarningMessage::GeneralError, L"File doesn't appear to be an effect xml file, - missing top level Effect tag" ) ); - return; - }*/ - eastl::string shaderPrefix = "#include \"customMaterial.glsllib\"\n"; - - SMetaDataCustomMaterialImpl &theMaterial = theInserter.first->second; - m_ObjectName = inObjectName; - theMaterial.m_Name = inObjectName; - theMaterial.m_SourcePath = inSourcePath; - theMaterial.m_HasTransparency = false; - theMaterial.m_HasRefraction = false; - theMaterial.m_AlwaysDirty = false; - theMaterial.m_ShaderKey = 0; - theMaterial.m_LayerCount = 0; - inStream.Att("always-dirty", theMaterial.m_AlwaysDirty); - LoadDynamicObjectProperties(inStream, theMaterial, inInstance, inObjectName, outWarnings, - shaderPrefix); - LoadDynamicObjectShaders(inStream, theMaterial, shaderPrefix, inObjectName); - - // currently single pass shader only - if (theMaterial.m_Shaders.size()) { - eastl::string theShaderNameStr; - - // in Passes we store additional render commands - IDOMReader::Scope __readerScope(inStream); - if (inStream.MoveToFirstChild("Passes")) { - for (bool success = inStream.MoveToFirstChild(); success; - success = inStream.MoveToNextSibling()) { - IDOMReader::Scope __passScope(inStream); - if (AreEqual("Pass", inStream.GetNarrowElementName())) { - const char8_t *typeStr; - if (!inStream.UnregisteredAtt("type", typeStr)) - typeStr = "render"; - if (AreEqual(typeStr, "render")) { - const char8_t *shader = "", *input = "[source]", *output = "[dest]", - *outputFormat = "rgba", *clear = ""; - bool needsClear = false; - inStream.Att("shader", shader); - inStream.Att("input", input); - inStream.Att("output", output); - // for multi pass materials - inStream.Att("clear", clear); - if (AreEqual("true", clear)) - needsClear = true; - - GetShaderName(inObjectName, shader, theShaderNameStr); - // this is only for the final output of the effect - inStream.Att("format", outputFormat); - qt3ds::render::NVRenderTextureFormats::Enum theOutputFormat = - ConvertTypeAndFormatToTextureFormat("ubyte", outputFormat); - - if (AreEqual(output, "[dest]") || IsTrivial(output)) { - theMaterial.m_CustomerMaterialCommands.push_back( - new SBindTarget(theOutputFormat)); - } else { - theMaterial.m_CustomerMaterialCommands.push_back( - new SBindBuffer( - m_StringTable.GetRenderStringTable().RegisterStr( - output), needsClear)); - } - - // add shader to command stream - qt3ds::render::CRegisteredString theShaderName; - if (!IsTrivial(shader)) { - for (QT3DSU32 idx = 0, end = theMaterial.m_Shaders.size(); - idx < end && theShaderName.IsValid() == false; ++idx) { - qt3ds::render::CRegisteredString thePossibleNameStr = - m_StringTable.GetRenderStringTable().RegisterStr( - theMaterial.m_Shaders[idx].m_Name.c_str()); - if (AreEqual(thePossibleNameStr.c_str(), - theShaderNameStr.c_str())) - theShaderName = thePossibleNameStr; - } - } - if (theShaderName.IsValid() == false - && theMaterial.m_Shaders.empty() == false) - theShaderName = m_StringTable.GetRenderStringTable().RegisterStr( - theMaterial.m_Shaders[0].m_Name.c_str()); - if (theShaderName.IsValid()) { - theMaterial.m_CustomerMaterialCommands.push_back( - new SBindShader(theShaderName)); - // this is a place holder for our input values to the shader - theMaterial.m_CustomerMaterialCommands.push_back( - new SApplyInstanceValue()); - - for (bool bufParam = inStream.MoveToFirstChild(); bufParam; - bufParam = inStream.MoveToNextSibling()) { - if (AreEqual("BufferBlit", inStream.GetNarrowElementName())) { - const char8_t *value = ""; - const char8_t *dest = ""; - const char8_t *source = ""; - inStream.Att("dest", dest); - if (AreEqual("[dest]", dest)) - value = ""; - inStream.Att("source", source); - if (AreEqual("[source]", source)) - value = ""; - - theMaterial.m_CustomerMaterialCommands.push_back( - new SApplyBlitFramebuffer( - m_StringTable.GetRenderStringTable().RegisterStr( - source), - m_StringTable.GetRenderStringTable().RegisterStr( - dest))); - - // note need a better way to pass information from MDL to - // our input - // We use buffer blits to simulate glass refraction - theMaterial.m_HasRefraction = true; - } else if (AreEqual("BufferInput", - inStream.GetNarrowElementName())) { - const char8_t *param = ""; - const char8_t *value = ""; - inStream.Att("param", param); - inStream.Att("value", value); - if (AreEqual("[source]", value)) - value = ""; - theMaterial.m_CustomerMaterialCommands.push_back( - new SApplyBufferValue( - m_StringTable.GetRenderStringTable().RegisterStr( - value), - m_StringTable.GetRenderStringTable().RegisterStr( - param))); - HideEffectProperty(inInstance, param); - } else if (AreEqual("Blending", - inStream.GetNarrowElementName())) { - const char8_t *theSrcBlendFuncStr = "", - *theDestBlendFuncStr = ""; - inStream.Att("source", theSrcBlendFuncStr); - inStream.Att("dest", theDestBlendFuncStr); - - qt3ds::render::NVRenderSrcBlendFunc::Enum theSrcBlendFunc = - ConvertToSrcBlendFunc(theSrcBlendFuncStr); - qt3ds::render::NVRenderDstBlendFunc::Enum theDstBlendFuc = - ConvertToDstBlendFunc(theDestBlendFuncStr); - - // this will setup blending - theMaterial.m_CustomerMaterialCommands.push_back( - new SApplyBlending(theSrcBlendFunc, - theDstBlendFuc)); - // if we have blending we have transparency - theMaterial.m_HasTransparency = true; - } else if (AreEqual("RenderState", - inStream.GetNarrowElementName())) { - // UdoL Todo: add this one - } - } - } - // add the render command as last thing in the pass, it is a render - // pass. - theMaterial.m_CustomerMaterialCommands.push_back(new SRender(false)); - } - } else if (AreEqual("ShaderKey", inStream.GetNarrowElementName())) { - QT3DSU32 theValue = 0; - inStream.Att("value", theValue); - theMaterial.m_ShaderKey = theValue; - } else if (AreEqual("LayerKey", inStream.GetNarrowElementName())) { - QT3DSU32 theValue = 0; - inStream.Att("count", theValue); - theMaterial.m_LayerCount = theValue; - } else if (AreEqual("Buffer", inStream.GetNarrowElementName())) { - SAllocateBufferFlags theFlags; - const char8_t *theLifetimeStr = "", *theType = "", *theFormat = "", - *theFilter = "", *theWrap = "", *theName = ""; - QT3DSF32 theSize = 1.0f; - inStream.Att("name", theName); - inStream.Att("lifetime", theLifetimeStr); - inStream.Att("type", theType); - inStream.Att("format", theFormat); - inStream.Att("filter", theFilter); - inStream.Att("wrap", theWrap); - inStream.Att("size", theSize); - // Clamp the size to valid amounts - if (theSize <= 0) - theSize = 1.0f; - if (theSize > 1.0f) - theSize = 1.0f; - if (AreEqual(theLifetimeStr, "scene")) - theFlags.SetSceneLifetime(true); - qt3ds::render::NVRenderTextureFormats::Enum theTexFormat = - ConvertTypeAndFormatToTextureFormat(theType, theFormat); - qt3ds::render::NVRenderTextureMagnifyingOp::Enum theMagOp = - ConvertFilterToMagOp(theFilter); - qt3ds::render::NVRenderTextureCoordOp::Enum theCoordOp = - ConvertTextureCoordOp(theWrap); - if (*theName == 0) { - QT3DS_ASSERT(false); - // inFoundation.error( QT3DS_INVALID_PARAMETER, "Buffer is missing its - // name" ); - } else { - theMaterial.m_CustomerMaterialCommands.push_back( - new SAllocateBuffer( - m_StringTable.GetRenderStringTable().RegisterStr( - theName), theTexFormat, theMagOp, theCoordOp, - theSize, theFlags)); - } - } - } - } - - if (theMaterial.m_CustomerMaterialCommands.size() == 0) { - // add minimal set - // add shader to command stream - theMaterial.m_CustomerMaterialCommands.push_back( - new SBindShader(m_StringTable.GetRenderStringTable().RegisterStr( - theMaterial.m_Shaders[0].m_Name.c_str()))); - // this is a place holder for our input values to the shader - theMaterial.m_CustomerMaterialCommands.push_back(new SApplyInstanceValue()); - // add the render command as last thing - theMaterial.m_CustomerMaterialCommands.push_back(new SRender(false)); - } - } - } - - bool LoadMaterialClassFromSourcePath(const char *inSourcePath, - Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) override - { - std::shared_ptr<IDOMFactory> theFactory( - IDOMFactory::CreateDOMFactory(m_DataCore->GetStringTablePtr())); - qt3dsdm::SDOMElement *theElem = CDOMSerializer::Read(*theFactory, inStream, NULL); - if (theElem != NULL) { - std::shared_ptr<IDOMReader> theReader( - IDOMReader::CreateDOMReader(*theElem, m_DataCore->GetStringTablePtr(), - theFactory)); - LoadMaterialClassXML(*theReader, inInstance, inObjectName, outWarnings, - TCharStr(Intern(inSourcePath))); - return true; - } - return false; - } - - Option<SMetaDataCustomMaterial> GetMaterialBySourcePath(const char *inSourcePath) override - { - TCharStr theSourcePath(Intern(inSourcePath)); - for (TCustomMaterialMap::iterator iter = m_CustomMaterials.begin(), - end = m_CustomMaterials.end(); - iter != end; ++iter) { - if (iter->second.m_SourcePath == theSourcePath) - return iter->second.ToMaterial(); - } - return Empty(); - } - - //////////////////////////////////////////////////////////////////////////////////// - // Undo/Redo - void SetConsumer(TTransactionConsumerPtr inConsumer) override { m_Consumer = inConsumer; } - - //////////////////////////////////////////////////////////////////////////////////// - // Signals - virtual TSignalConnectionPtr - ConnectInternalCategoryDestroyed(function<void(Qt3DSDMCategoryHandle)> inCallback) - { - return CONNECT(&SNewMetaDataImpl::internalCategoryDestroyed); - } - virtual TSignalConnectionPtr - ConnectInternalPropertyDestroyed(function<void(Qt3DSDMMetaDataPropertyHandle)> inCallback) - { - return CONNECT(&SNewMetaDataImpl::internalMetaDataPropertyDestroyed); - } - virtual TSignalConnectionPtr - ConnectInternalEventDestroyed(function<void(Qt3DSDMEventHandle)> inCallback) - { - return CONNECT(&SNewMetaDataImpl::internalEventDestroyed); - } - virtual TSignalConnectionPtr - ConnectInternalHandlerDestroyed(function<void(Qt3DSDMHandlerHandle)> inCallback) - { - return CONNECT(&SNewMetaDataImpl::internalHandlerDestroyed); - } - virtual TSignalConnectionPtr - ConnectInternalHandlerArgDestroyed(function<void(Qt3DSDMHandlerHandle, QT3DSU32)> inCallback) - { - return CONNECT(&SNewMetaDataImpl::internalHandlerArgDestroyed); - } -}; -} - -std::shared_ptr<IMetaData> IMetaData::CreateNewMetaData(std::shared_ptr<IDataCore> inDataCore) -{ - return std::make_shared<SNewMetaDataImpl>(inDataCore); -} -#ifndef QT3DSDM_META_DATA_NO_SIGNALS -#include "Qt3DSDMMetaData.moc" -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaData.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaData.h deleted file mode 100644 index 67a7fb18..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaData.h +++ /dev/null @@ -1,400 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once - -#include "Qt3DSDMMetaDataTypes.h" -#include "foundation/Qt3DSOption.h" -#include <functional> -#include <memory> -#include "Qt3DSDMActionInfo.h" -#include "Qt3DSDMStringTable.h" -#include "Qt3DSDMValue.h" - -struct SShaderParameters; -namespace qt3ds { -namespace foundation { - class IInStream; -} -} - -namespace qt3dsdm { - -using qt3ds::foundation::Option; -using qt3ds::QT3DSU32; -using std::pair; -using std::vector; - -class ISignalConnection; -class ITransactionConsumer; -class IDOMWriter; -class IDOMReader; -class IDataCore; -class CDataCoreProducer; - -struct MetaDataLoadWarningType -{ - enum Enum { - Unknown = 0, - InvalidProperty, - InvalidEvent, - InvalidHandler, - }; -}; - -struct MetaDataLoadWarningMessage -{ - enum Enum { - Unknown = 0, - GeneralError, - MissingName, - InvalidDefault, - }; -}; - -struct SMetaDataLoadWarning -{ - MetaDataLoadWarningType::Enum m_Type; - MetaDataLoadWarningMessage::Enum m_Message; - TCharStr m_ExtraInfo; - - SMetaDataLoadWarning(MetaDataLoadWarningType::Enum inType, - MetaDataLoadWarningMessage::Enum inMessage, TCharStr inInfo = TCharStr()) - : m_Type(inType) - , m_Message(inMessage) - , m_ExtraInfo(inInfo) - { - } - SMetaDataLoadWarning() - : m_Type(MetaDataLoadWarningType::Unknown) - , m_Message(MetaDataLoadWarningMessage::Unknown) - { - } -}; - -/** - * Meta data class to hold meta data descriptions of the objects used in DataModel. - * A user-visible type in DataModel (things in the timeline) has a specific set of metadata, - * the type can have properties, events, handlers, and references. - * - * Properties are exactly what they sound like. Events are messages the object can send, - * and handlers are functions that are exported from the object. - * - * Events are hooked up to handlers using an ActionCore which takes tuples - * of instance, event, handler and slide and maintains a specific instance of an action. - * - * References allow us to track which properties are being accessed. Properties are stripped - * from the engine portion of the runtime (although they still appear in the scenegraph) - * if they aren't animated nor set in a given slide. - */ -class IMetaData -{ -protected: - virtual ~IMetaData() {} -public: - typedef const TCharStr &TStrType; - - //////////////////////////////////////////////////////////////////////////////////// - // Sharing some utility objects - virtual IStringTable &GetStringTable() = 0; - virtual TStringTablePtr GetStringTablePtr() = 0; - virtual std::shared_ptr<IDataCore> GetDataCore() = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Canonical Instances - // Map an instance to a given type name. The type name is stored, along with the instance - // handle in the file if this object is *not* canonical. - // If this object is canonical, then we expect this mapping setup before loading the - // canonical data, and we will use a type lookup instead of a direct handle lookup - // when loading canonical information. - virtual void SetInstanceAsCanonical(Qt3DSDMInstanceHandle inInstance, TStrType inTypename) = 0; - - virtual Qt3DSDMInstanceHandle GetCanonicalInstanceForType(TStrType inTypename) = 0; - // If this instance wasn't registered as canonical, then we return empty. - virtual Option<TCharStr> GetTypeForCanonicalInstance(Qt3DSDMInstanceHandle inInstance) = 0; - // Gets the type for this instance via derivation - virtual Option<TCharStr> GetTypeForInstance(Qt3DSDMInstanceHandle inInstance) = 0; - // Get group count for instance - virtual QT3DSU32 GetGroupCountForInstance(Qt3DSDMInstanceHandle inInstance) = 0; - // Get all group names - virtual QT3DSU32 GetGroupNamesForInstance(Qt3DSDMInstanceHandle inInstance, - std::vector<TCharStr> &outNames) = 0; - // Get group count for instance - virtual Option<TCharStr> GetGroupFilterNameForInstance(Qt3DSDMInstanceHandle inInstance, - long inIndex) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Categories - // Categories appear in the UI to divide up large lists of events, actions, and properties. - // Returns <handle,true> if a category was created - // else returns <handle,false> - virtual pair<Qt3DSDMCategoryHandle, bool> GetOrCreateCategory(TStrType inName) = 0; - - virtual void SetCategoryInfo(Qt3DSDMCategoryHandle inCategory, TStrType inIcon, - TStrType inHighlight, TStrType inDescription) = 0; - virtual void DestroyCategory(Qt3DSDMCategoryHandle inCategory) = 0; - - virtual Option<SCategoryInfo> GetCategoryInfo(Qt3DSDMCategoryHandle inCategory) = 0; - virtual Qt3DSDMCategoryHandle FindCategoryByName(TStrType inName) = 0; - virtual void GetCategories(vector<Qt3DSDMCategoryHandle> &outCategories) = 0; - virtual Option<SCategoryInfo> GetEventCategory(TStrType inName) = 0; - virtual Option<SCategoryInfo> GetHandlerCategory(TStrType inName) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Properties - // Will create the property on the instance associated with this type name if it doesn't exist. - // Metadata properties can be redifined for child instances and this re-definition will override - // the parent definition. We currently use this to give different formal names and description - // to the sourcepath property (for models it is mesh, for materials it is image). - virtual Qt3DSDMMetaDataPropertyHandle - CreateMetaDataProperty(Qt3DSDMInstanceHandle inInstance) = 0; - - // For properties, you set the default values separately - // This may delete the underlying data model property rebuild it. - virtual void SetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inPropertyHandle, - TStrType inName, TStrType inFormalName, - TStrType inDescription, TStrType inUsage, - CompleteMetaDataType::Enum inDataType, - const SValue &inDefaultValue, - const TMetaDataData &inMetaData, TStrType inGroupName, - bool inIsHidden = false, bool inIsAnimatable = false, - bool inIsControllable = false) = 0; - - // Destroy just this meta data property - // Does not destroy the underlying data core property, so this function isn't a perfect - // reverse of the above system. This *just* destroyed the meta data pointed to by - // this property. - virtual void DestroyMetaDataProperty(Qt3DSDMMetaDataPropertyHandle inProperty) = 0; - - virtual Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance, - TStrType inPropertyName) = 0; - virtual Qt3DSDMMetaDataPropertyHandle GetMetaDataProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual Option<SMetaDataPropertyInfo> - GetMetaDataPropertyInfo(Qt3DSDMMetaDataPropertyHandle inProperty) = 0; - // Get all of the meta data properties defined on this object or its derivation parents - virtual void GetMetaDataProperties(Qt3DSDMInstanceHandle inInstance, - vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) = 0; - - // Get the meta data properties defined on *only* this object, don't search parents - virtual Qt3DSDMMetaDataPropertyHandle - GetOrCreateSpecificMetaDataProperty(Qt3DSDMInstanceHandle inInstance, - TStrType inPropertyName) = 0; - virtual void - GetSpecificMetaDataProperties(Qt3DSDMInstanceHandle inInstance, - vector<Qt3DSDMMetaDataPropertyHandle> &outProperties) = 0; - - virtual TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual AdditionalMetaDataType::Value GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual bool IsCustomProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual SValue GetDefaultValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - - virtual void - SetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty, - qt3ds::foundation::NVConstDataRef<SPropertyFilterInfo> inFilters) = 0; - virtual qt3ds::foundation::NVConstDataRef<SPropertyFilterInfo> - GetMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) = 0; - virtual void RemoveMetaDataPropertyFilters(Qt3DSDMMetaDataPropertyHandle inProperty) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Events - // CreateMetaDataEvent was original named CreateEvent but this collides with - // the microsoft macro CreateEvent which expands to CreateEventA or CreateEventW - virtual Qt3DSDMEventHandle CreateMetaDataEvent(Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SetEventInfo(Qt3DSDMEventHandle inEventHandle, TStrType inName, - TStrType inFormalName, TStrType inCategory, - TStrType inDescription) = 0; - - virtual void DestroyEvent(Qt3DSDMEventHandle inEventHandle) = 0; - - virtual void GetEvents(Qt3DSDMInstanceHandle inInstance, TEventHandleList &outEvents) = 0; - virtual Qt3DSDMEventHandle FindEvent(Qt3DSDMInstanceHandle inInstance, TStrType inName) = 0; - virtual Option<SEventInfo> GetEventInfo(Qt3DSDMEventHandle inEventHandle) = 0; - virtual bool IsCustomEvent(Qt3DSDMEventHandle inEventHandle) = 0; - - // Get/Find an event that occurs on just this instance, don't search parent instances - virtual void GetSpecificEvents(Qt3DSDMInstanceHandle inInstance, - TEventHandleList &outEvents) = 0; - virtual Qt3DSDMEventHandle GetOrCreateSpecificEvent(Qt3DSDMInstanceHandle inInstance, - TStrType inName) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Handlers - virtual Qt3DSDMHandlerHandle CreateHandler(Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SetHandlerInfo(Qt3DSDMHandlerHandle inHandle, TStrType inName, - TStrType inFormalName, TStrType inCategory, - TStrType inDescription) = 0; - virtual void DestroyHandler(Qt3DSDMHandlerHandle inHandlerHandle) = 0; - - virtual Qt3DSDMHandlerHandle FindHandlerByName(Qt3DSDMInstanceHandle inInstance, - TStrType inName) = 0; - virtual Option<SHandlerInfo> GetHandlerInfo(Qt3DSDMHandlerHandle inHandlerHandle) = 0; - virtual void GetHandlers(Qt3DSDMInstanceHandle inInstance, THandlerHandleList &outHandlers) = 0; - virtual bool IsCustomHandler(Qt3DSDMHandlerHandle inEventHandle) = 0; - - virtual void GetSpecificHandlers(Qt3DSDMInstanceHandle inInstance, - THandlerHandleList &outHandlers) = 0; - virtual Qt3DSDMHandlerHandle GetOrCreateSpecificHandler(Qt3DSDMInstanceHandle inInstance, - TStrType inName) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Handler Arguments - virtual QT3DSU32 AddHandlerArgument(Qt3DSDMHandlerHandle inHandler) = 0; - virtual void - SetHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandler, QT3DSU32 inArgIndex, TStrType inName, - TStrType inFormalName, TStrType inDescription, - CompleteMetaDataType::Enum inDataType, const SValue &inDefaultValue, - const TMetaDataData &inMetaData, HandlerArgumentType::Value inArgType) = 0; - - virtual void DestroyHandlerArgument(Qt3DSDMHandlerHandle inHandler, QT3DSU32 inArgIndex) = 0; - - virtual Option<SMetaDataHandlerArgumentInfo> - FindHandlerArgumentByName(Qt3DSDMHandlerHandle inHandler, TStrType inName) = 0; - virtual void GetHandlerArguments(Qt3DSDMHandlerHandle inHandler, - vector<SMetaDataHandlerArgumentInfo> &outArguments) = 0; - virtual Option<SMetaDataHandlerArgumentInfo> - GetHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandle, QT3DSU32 inIndex) = 0; - virtual QT3DSU32 GetNumHandlerArguments(Qt3DSDMHandlerHandle inHandler) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // References - // Duplicate references are removed from this instance - virtual void AddReference(Qt3DSDMInstanceHandle inInstance, TStrType inRefString) = 0; - virtual void DestroyReferences(Qt3DSDMInstanceHandle inInstance) = 0; - - // Does the recursive gather from all the parents. Duplicate references are removed from the - // final list. - virtual void GetReferences(Qt3DSDMInstanceHandle inInstance, - std::vector<TCharStr> &outReferences) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Instance-global functions - // Destroy all meta data that relates to this instance. - // Calling this on a derived instance does nothing, this only works if this specific - // instance was mapped directly to meta data. - virtual void DestroyMetaData(Qt3DSDMInstanceHandle inInstance) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Serialization - // You can either save out in canonical format (and it will only save canonical-instance-related - // information *or* you can save out in normal format where we link directly to instance handle - // instead of to typename - virtual void Save(IDOMWriter &inWriter) = 0; - // Loading expects the canonical instances to be setup already which means that - // it will perform lookups based on - // One huge assumption is that the reader is using the same string table - // that this object was built with - // InIsCanonical tells us whether to mark loaded categories as canonical - // or not. - virtual void Load(IDOMReader &ioStream) = 0; - - // Load meta data and apply it to just this instance - virtual void LoadInstance(IDOMReader &inReader, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inName, - std::vector<SMetaDataLoadWarning> &outWarnings) = 0; - - // Save just this instances meta data out to the writer - virtual void SaveInstance(IDOMWriter &inWriter, Qt3DSDMInstanceHandle inInstance) = 0; - - // Load effect meta data from file and apply it to just this instance - virtual void LoadEffectInstance(const char *inShaderFile, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) = 0; - - virtual bool IsEffectInstanceRegistered(const char *inName) = 0; - virtual void LoadEffectXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - const TCharStr &inSourcePath) = 0; - virtual bool LoadEffectXMLFromSourcePath(const char *inSourcePath, - Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) = 0; - virtual Option<SMetaDataEffect> GetEffectBySourcePath(const char *inName) = 0; - - virtual void LoadMaterialInstance(const char *inShaderFile, - Qt3DSDMInstanceHandle inInstance, - const TCharStr &inName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) = 0; - virtual bool IsMaterialClassRegistered(const char *inName) = 0; - virtual void LoadMaterialClassXML(IDOMReader &inStream, Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - const TCharStr &inSourcePath) = 0; - virtual bool LoadMaterialClassFromSourcePath(const char *inSourcePath, - Qt3DSDMInstanceHandle inInstance, - const TCharStr &inObjectName, - std::vector<SMetaDataLoadWarning> &outWarnings, - qt3ds::foundation::IInStream &inStream) = 0; - virtual Option<SMetaDataCustomMaterial> GetMaterialBySourcePath(const char *inSourcePath) = 0; - - //////////////////////////////////////////////////////////////////////////////////// - // Undo/Redo - virtual void SetConsumer(std::shared_ptr<ITransactionConsumer> inConsumer) = 0; - -#ifndef QT3DSDM_META_DATA_NO_SIGNALS - //////////////////////////////////////////////////////////////////////////////////// - // Signals - // These events are sent out only once, they aren't set into the transaction consumer - // to be sent out upon undo and redo. These events are meant for chaining together side effects - // so other systems don't have references to invalid handler arguments and handles. - // Also, the objects in these messages are still valid so you can query information about them - // at this time. They will be destroyed subsequent to the event. - virtual std::shared_ptr<ISignalConnection> - ConnectInternalCategoryDestroyed(std::function<void(Qt3DSDMCategoryHandle)> inCallback) = 0; - virtual std::shared_ptr<ISignalConnection> ConnectInternalPropertyDestroyed( - std::function<void(Qt3DSDMMetaDataPropertyHandle)> inCallback) = 0; - virtual std::shared_ptr<ISignalConnection> - ConnectInternalEventDestroyed(std::function<void(Qt3DSDMEventHandle)> inCallback) = 0; - virtual std::shared_ptr<ISignalConnection> - ConnectInternalHandlerDestroyed(std::function<void(Qt3DSDMHandlerHandle)> inCallback) = 0; - virtual std::shared_ptr<ISignalConnection> ConnectInternalHandlerArgDestroyed( - std::function<void(Qt3DSDMHandlerHandle, QT3DSU32)> inCallback) = 0; -#endif - - //////////////////////////////////////////////////////////////////////////////////// - // Creation/Lifetime Management - friend class std::shared_ptr<IMetaData>; - // The data core is used to create the properties if they don't exist or - // query their underlying type if they do exist. We also subscribe to - // the datacore's beforeInstanceDelete function in order to ensure - // that we delete our existing meta data for instances that are being deleted. - static std::shared_ptr<IMetaData> CreateNewMetaData(std::shared_ptr<IDataCore> inDataCore); -}; - -typedef std::shared_ptr<IMetaData> TNewMetaDataPtr; -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaDataTypes.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaDataTypes.h deleted file mode 100644 index 5532e0a5..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaDataTypes.h +++ /dev/null @@ -1,350 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#include "Qt3DSDMMetaDataValue.h" - -namespace qt3ds { -namespace render { - namespace dynamic { - struct SCommand; - struct SPropertyDeclaration; - struct SPropertyDefinition; - } -} -} - -namespace qt3dsdm { - -struct HandlerArgumentType { - - enum Value { - None, - Property, // Property reference. Load the Properties of the Target Object. - Dependent, // Property type depends on another property. - Slide, // Slide reference. Load the list of slides of the Target Object if - // applicable. - Event, // Event reference. Load the applicable Events of the Target Object. - Object, // Object reference. Used for dynamic actions with object referenced - // property. - Signal, // Signal reference. Used for emiting signals fired from the trigger - // object. - }; - - Q_ENUM(Value) - Q_GADGET -}; - -struct CompleteMetaDataType -{ - enum Enum { - Unknown = 0, - StringList, - FloatRange, - LongRange, - Float, - Long, - Float2, - Vector, - Scale, - Rotation, - Color, - Boolean, - Slide, - Font, - FontSize, - String, - MultiLineString, - ObjectRef, - Image, - Mesh, - Import, - Texture, - Guid, - StringListOrInt, - Renderable, - Image2D, - Buffer, - PathBuffer, - ShadowMapResolution, - }; - - // Functions defined in UICDMMetaData.cpp - static DataModelDataType::Value ToDataType(Enum inCompleteType); - static AdditionalMetaDataType::Value ToAdditionalType(Enum inCompleteType); - static CompleteMetaDataType::Enum ToCompleteType(DataModelDataType::Value inDataType, - AdditionalMetaDataType::Value inAdditionalType); - Q_ENUM(Enum) - Q_GADGET -}; - -typedef std::pair<DataModelDataType::Value, AdditionalMetaDataType::Value> TDataTypePair; - -inline bool Equals(const TMetaDataData &lhs, const TMetaDataData &rhs) -{ - return rhs == lhs; -} - -inline AdditionalMetaDataType::Value GetMetaDataValueType(const TMetaDataData &inValue) -{ - return inValue.getType(); -} - -// Base class shared between property info -// and handler arguments. -struct SMetaPropertyBase -{ - TCharStr m_Name; - TCharStr m_FormalName; - TCharStr m_Usage; - TCharStr m_Description; - CompleteMetaDataType::Enum m_CompleteType; - TMetaDataData m_MetaDataData; - SValue m_DefaultValue; - - SMetaPropertyBase() - : m_CompleteType(CompleteMetaDataType::Float) - { - } - bool operator==(const SMetaPropertyBase &inOther) const - { - return m_Name == inOther.m_Name && m_FormalName == inOther.m_FormalName - && m_Usage == inOther.m_Usage && m_Description == inOther.m_Description - && m_CompleteType == inOther.m_CompleteType - && Equals(m_DefaultValue.toOldSkool(), inOther.m_DefaultValue.toOldSkool()) - && Equals(m_MetaDataData, inOther.m_MetaDataData); - } - DataModelDataType::Value GetDataType() const - { - return CompleteMetaDataType::ToDataType(m_CompleteType); - } - AdditionalMetaDataType::Value GetAdditionalType() const - { - return CompleteMetaDataType::ToAdditionalType(m_CompleteType); - } -}; - -struct SMetaDataPropertyInfo : SMetaPropertyBase -{ - Qt3DSDMInstanceHandle m_Instance; - Qt3DSDMPropertyHandle m_Property; - bool m_Controllable = false; // Can this property be controlled via data input (default no) - bool m_IsHidden = false; // Is this property hidden in the inspector (default no) - bool m_Animatable = true; // Is this property animatable (default yes) - // Note: all animatables are controllable - - TCharStr m_GroupName; // Name of the group this property belongs to or "default" - - SMetaDataPropertyInfo(Qt3DSDMInstanceHandle inInstance) - : m_Instance(inInstance) - { - } - SMetaDataPropertyInfo() {} - - bool operator==(const SMetaDataPropertyInfo &inOther) const - { - return m_Instance == inOther.m_Instance && m_Property == inOther.m_Property - && m_IsHidden == inOther.m_IsHidden && m_Animatable == inOther.m_Animatable - && m_GroupName == inOther.m_GroupName - && m_Controllable == inOther.m_Controllable - && SMetaPropertyBase::operator==(inOther); - } - - bool operator!=(const SMetaDataPropertyInfo &inOther) const { return !(*this == inOther); } -}; - -struct SMetaDataHandlerArgumentInfo : SMetaPropertyBase -{ - Qt3DSDMHandlerHandle m_Handler; - HandlerArgumentType::Value m_ArgType; - SMetaDataHandlerArgumentInfo(Qt3DSDMHandlerHandle inHandler = Qt3DSDMHandlerHandle()) - : m_Handler(inHandler) - , m_ArgType(HandlerArgumentType::None) - { - } -}; - -struct SCategoryInfo -{ - TCharStr m_Name; - TCharStr m_Description; - TCharStr m_Icon; - TCharStr m_HighlightIcon; - bool m_Canonical; - - SCategoryInfo() - : m_Canonical(false) - { - } - SCategoryInfo(TCharStr inName) - : m_Name(inName) - , m_Canonical(false) - { - } -}; - -struct SEventInfo -{ - bool operator!=(const SEventInfo &inEvent) const - { - return (m_Name != inEvent.m_Name || m_FormalName != inEvent.m_FormalName - || m_Category != inEvent.m_Category || m_Description != inEvent.m_Description); - } - - TCharStr m_Name; - TCharStr m_FormalName; - TCharStr m_Category; - TCharStr m_Description; -}; - -struct SHandlerInfo -{ - TCharStr m_Name; - TCharStr m_FormalName; - TCharStr m_Category; - TCharStr m_Description; - - bool operator!=(const SHandlerInfo &inHandler) const - { - return (m_Name != inHandler.m_Name || m_FormalName != inHandler.m_FormalName - || m_Category != inHandler.m_Category || m_Description != inHandler.m_Description); - } -}; - -struct PropertyFilterTypes -{ - enum Enum { - Unknown, - ShowIfEqual, - HideIfEqual, - }; -}; - -struct SPropertyFilterInfo -{ - PropertyFilterTypes::Enum m_FilterType; - Qt3DSDMPropertyHandle m_FilterProperty; - SValue m_Value; - SPropertyFilterInfo() - : m_FilterType(PropertyFilterTypes::Unknown) - { - } - SPropertyFilterInfo(PropertyFilterTypes::Enum inFilterType, Qt3DSDMPropertyHandle inProp, - const SValue &inValue) - : m_FilterType(inFilterType) - , m_FilterProperty(inProp) - , m_Value(inValue) - { - } -}; -struct SMetaDataShader -{ - TCharStr m_Name; - TCharStr m_Type; ///< shader type (GLSL or HLSL) - TCharStr m_Version; ///< shader version (e.g. 330 vor GLSL) - // Code contains both the vertex and fragment portions separated by #define's. - //#define VERTEX_SHADER, #define FRAGMENT_SHADER - TCharStr m_Code; - bool m_HasGeomShader; - bool m_IsComputeShader; - SMetaDataShader() - : m_HasGeomShader(false) - , m_IsComputeShader(false) - { - } - SMetaDataShader(const TCharStr &inName, const TCharStr &inType, const TCharStr &inVersion, - const TCharStr &inCode, bool hasGeom, bool isCompute) - : m_Name(inName) - , m_Type(inType) - , m_Version(inVersion) - , m_Code(inCode) - , m_HasGeomShader(hasGeom) - , m_IsComputeShader(isCompute) - { - } -}; - -struct SMetaDataDynamicObject -{ - TCharStr m_Name; - qt3ds::foundation::NVConstDataRef<SMetaDataShader> m_Shaders; - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> m_Properties; - SMetaDataDynamicObject() {} - SMetaDataDynamicObject( - const TCharStr &inName, qt3ds::foundation::NVConstDataRef<SMetaDataShader> inShaders, - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties) - : m_Name(inName) - , m_Shaders(inShaders) - , m_Properties(inProperties) - { - } -}; - -struct SMetaDataEffect : public SMetaDataDynamicObject -{ - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> m_EffectCommands; - SMetaDataEffect() {} - SMetaDataEffect( - const TCharStr &inName, qt3ds::foundation::NVConstDataRef<SMetaDataShader> inShaders, - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties, - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> inEffectCommands) - : SMetaDataDynamicObject(inName, inShaders, inProperties) - , m_EffectCommands(inEffectCommands) - { - } -}; - -struct SMetaDataCustomMaterial : public SMetaDataDynamicObject -{ - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> m_CustomMaterialCommands; - bool m_HasTransparency; - bool m_HasRefraction; - bool m_AlwaysDirty; - unsigned int m_ShaderKey; - unsigned int m_LayerCount; - SMetaDataCustomMaterial() {} - SMetaDataCustomMaterial( - const TCharStr &inName, qt3ds::foundation::NVConstDataRef<SMetaDataShader> inShaders, - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SPropertyDefinition> inProperties, - qt3ds::foundation::NVConstDataRef<qt3ds::render::dynamic::SCommand *> inCustomMaterialCommands, - bool inHasTransparency, bool inHasRefraction, bool inIsAlwaysDirty, - unsigned int inShaderKey, unsigned int inLayerCount) - : SMetaDataDynamicObject(inName, inShaders, inProperties) - , m_CustomMaterialCommands(inCustomMaterialCommands) - , m_HasTransparency(inHasTransparency) - , m_HasRefraction(inHasRefraction) - , m_AlwaysDirty(inIsAlwaysDirty) - , m_ShaderKey(inShaderKey) - , m_LayerCount(inLayerCount) - { - } -}; -} - -Q_DECLARE_METATYPE(qt3dsdm::HandlerArgumentType::Value) - diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaDataValue.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaDataValue.h deleted file mode 100644 index eb3433ab..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMMetaDataValue.h +++ /dev/null @@ -1,252 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2008 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#include <EASTL/string.h> -#include <EASTL/vector.h> -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMDataTypes.h" -#include "foundation/Qt3DSDataRef.h" -#include "Qt3DSDMValue.h" - -#include <QStringList> - -namespace qt3dsdm { - -struct AdditionalMetaDataType { - - enum Value { - None, - StringList, - Range, - Image, - Color, - Rotation, - Font, - FontSize, - MultiLine, - ObjectRef, - Mesh, - Import, - Texture, - Renderable, - PathBuffer, - ShadowMapResolution, - String, - }; - - - Q_ENUM(Value) - Q_GADGET -}; - -// List type metadata -typedef eastl::vector<TCharStr> TMetaDataStringList; - -// Float type metadata -struct SMetaDataRange -{ - SMetaDataRange() - : m_Min(0.0f) - , m_Max(0.0f) - { - } - - SMetaDataRange(float inMin, float inMax) - : m_Min(inMin) - , m_Max(inMax) - { - } - - bool operator==(const SMetaDataRange &other) const - { - return m_Min == other.m_Min && m_Max == other.m_Max; - } - - float m_Min; - float m_Max; -}; -} - -namespace qt3ds { -namespace foundation { - - template <> - struct DestructTraits<qt3dsdm::SMetaDataRange> - { - void destruct(qt3dsdm::SMetaDataRange &) {} - }; -} -} - -namespace qt3dsdm { - -template <typename TDataType> -struct SMetaDataTypeToEnumMap -{ -}; -template <> -struct SMetaDataTypeToEnumMap<eastl::vector<TCharStr>> -{ - static AdditionalMetaDataType::Value getType() { return AdditionalMetaDataType::StringList; } -}; -template <> -struct SMetaDataTypeToEnumMap<SMetaDataRange> -{ - static AdditionalMetaDataType::Value getType() { return AdditionalMetaDataType::Range; } -}; - -struct SMetaDataValueTraits -{ - typedef AdditionalMetaDataType::Value TIdType; - - enum { - TBufferSize = sizeof(TMetaDataStringList), - }; - - static TIdType getNoDataId() { return AdditionalMetaDataType::None; } - - template <typename TDataType> - static TIdType getType() - { - return SMetaDataTypeToEnumMap<TDataType>::getType(); - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(char *inData, AdditionalMetaDataType::Value inType, TVisitorType inVisitor) - { - switch (inType) { - case AdditionalMetaDataType::StringList: - return inVisitor(*reinterpret_cast<TMetaDataStringList *>(inData)); - case AdditionalMetaDataType::Range: - return inVisitor(*reinterpret_cast<SMetaDataRange *>(inData)); - default: - QT3DS_ASSERT(false); - case AdditionalMetaDataType::None: - return inVisitor(); - } - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(const char *inData, AdditionalMetaDataType::Value inType, - TVisitorType inVisitor) - { - switch (inType) { - case AdditionalMetaDataType::StringList: - return inVisitor(*reinterpret_cast<const TMetaDataStringList *>(inData)); - case AdditionalMetaDataType::Range: - return inVisitor(*reinterpret_cast<const SMetaDataRange *>(inData)); - default: - QT3DS_ASSERT(false); - case AdditionalMetaDataType::None: - return inVisitor(); - } - } -}; - -struct SMetaDataData - : public qt3ds::foundation:: - DiscriminatedUnion<qt3ds::foundation:: - DiscriminatedUnionGenericBase<SMetaDataValueTraits, - Qt3DSDMDataTypeUnionTraits:: - TBufferSize>, - SMetaDataValueTraits::TBufferSize> -{ - typedef qt3ds::foundation:: - DiscriminatedUnion<qt3ds::foundation::DiscriminatedUnionGenericBase<SMetaDataValueTraits, - Qt3DSDMDataTypeUnionTraits:: - TBufferSize>, - SMetaDataValueTraits::TBufferSize> - TBase; - SMetaDataData() {} - SMetaDataData(const SMetaDataData &inOther) - : TBase(static_cast<const TBase &>(inOther)) - { - } - SMetaDataData &operator=(const SMetaDataData &inOther) - { - TBase::operator=(static_cast<const TBase &>(inOther)); - return *this; - } - SMetaDataData(const TMetaDataStringList &inData) - : TBase(inData) - { - } - SMetaDataData(const SMetaDataRange &inData) - : TBase(inData) - { - } - SMetaDataData &operator=(const TMetaDataStringList &inData) - { - TBase::operator=(inData); - return *this; - } - SMetaDataData &operator=(const SMetaDataRange &inData) - { - TBase::operator=(inData); - return *this; - } - bool empty() const { return getType() == AdditionalMetaDataType::None; } -}; - -template <> -struct Qt3DSDMGetter<SMetaDataData> -{ - template <typename TRetType> - TRetType doGet(const SMetaDataData &inValue) - { - return inValue.getData<TRetType>(); - } -}; - -template <> -struct Qt3DSDMValueTyper<SMetaDataData> -{ - AdditionalMetaDataType::Value Get(const SMetaDataData &inValue) { return inValue.getType(); } -}; - -typedef SMetaDataData TMetaDataData; - - -template <> -inline QStringList get<QStringList>(const qt3dsdm::SMetaDataData &inType) -{ - QStringList result; - if (inType.getType() == qt3dsdm::AdditionalMetaDataType::None) - return result; - - auto list = qt3dsdm::get<qt3dsdm::TMetaDataStringList>(inType); - std::transform(list.begin(), list.end(), std::back_inserter(result), [](const Qt3DSDMStr &s) { - return QString::fromWCharArray(s.wide_str()); - }); - return result; -} -} - -Q_DECLARE_METATYPE(qt3dsdm::AdditionalMetaDataType) - diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMPropertyDefinition.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMPropertyDefinition.h deleted file mode 100644 index d324b539..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMPropertyDefinition.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_PROPERTY_DEFINITION_H -#define QT3DSDM_PROPERTY_DEFINITION_H - -#include "Qt3DSDMDataTypes.h" - -namespace qt3dsdm { - -struct Qt3DSDMPropertyDefinition -{ - TCharStr m_Name; - Qt3DSDMInstanceHandle m_Instance; - DataModelDataType::Value m_Type; - - Qt3DSDMPropertyDefinition() - : m_Type(DataModelDataType::None) - { - } - Qt3DSDMPropertyDefinition(Qt3DSDMInstanceHandle inInstanceHandle, TCharPtr inName, - DataModelDataType::Value inType) - : m_Name(inName) - , m_Instance(inInstanceHandle) - , m_Type(inType) - { - } - Qt3DSDMPropertyDefinition(const Qt3DSDMPropertyDefinition &inOther) - : m_Name(inOther.m_Name) - , m_Instance(inOther.m_Instance) - , m_Type(inOther.m_Type) - { - } - - Qt3DSDMPropertyDefinition &operator=(const Qt3DSDMPropertyDefinition &inOther) - { - if (this != &inOther) { - m_Name = inOther.m_Name; - m_Instance = inOther.m_Instance; - m_Type = inOther.m_Type; - } - return *this; - } -}; - -typedef std::vector<Qt3DSDMPropertyDefinition> TPropertyDefinitionList; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalStructImpl.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalStructImpl.h deleted file mode 100644 index 9664566f..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalStructImpl.h +++ /dev/null @@ -1,305 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SIGNAL_STRUCT_IMPL_H -#define QT3DSDM_SIGNAL_STRUCT_IMPL_H -#include "Qt3DSDMSignalStructs.h" - -namespace qt3dsdm { - -struct SSignalDataStruct0 -{ - typedef SSignalDataStruct0 TThisType; - typedef std::function<void()> TFunType; - static void Send(ISignalSystem &system, void *sender, const char *sigName) - { - system.Signal(sender, sigName, NULL, 0); - } - - static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize, - TFunType inHandler) - { - if (inDataSize == 0) - inHandler(); - else { - QT3DS_ASSERT(false); - } - } - - static TGenericSignalHandlerFunc CreateHandler(std::function<void()> inHandler) - { - return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4, inHandler); - } - - static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender, - const char *inName, TFunType inHandler) - { - return inSystem.AddListener(inSender, inName, CreateHandler(inHandler)); - } -}; - -#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT0(name) \ - std::shared_ptr<ISignalConnection> Sig##name::AddListener( \ - ISignalSystem &inSystem, void *inSender, std::function<void()> inHandler) \ - { \ - typedef SSignalDataStruct0 TBase; \ - return TBase::AddListener(inSystem, inSender, #name, inHandler); \ - } \ - void Sig##name::Send(ISignalSystem &system, void *sender) \ - { \ - typedef SSignalDataStruct0 TBase; \ - TBase::Send(system, sender, #name); \ - } - -template <typename TData1> -struct SSignalDataStruct1 -{ - typedef SSignalDataStruct1<TData1> TThisType; - TData1 m_Data1; - typedef std::function<void(TData1)> TFunType; - SSignalDataStruct1(TData1 d1) - : m_Data1(d1) - { - } - static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1) - { - TThisType theData(d1); - system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType)); - } - - static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize, - TFunType inHandler) - { - if (inDataSize == sizeof(TThisType)) { - const TThisType *theData = reinterpret_cast<const TThisType *>(inData); - inHandler(theData->m_Data1); - } else { - QT3DS_ASSERT(false); - } - } - - static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler) - { - return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4, inHandler); - } - - static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender, - const char *inName, TFunType inHandler) - { - return inSystem.AddListener(inSender, inName, CreateHandler(inHandler)); - } -}; - -#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT1(name, d1) \ - std::shared_ptr<ISignalConnection> Sig##name::AddListener( \ - ISignalSystem &inSystem, void *inSender, std::function<void(d1)> inHandler) \ - { \ - typedef SSignalDataStruct1<d1> TBase; \ - return TBase::AddListener(inSystem, inSender, #name, inHandler); \ - } \ - void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg) \ - { \ - typedef SSignalDataStruct1<d1> TBase; \ - TBase::Send(system, sender, #name, arg); \ - } - -template <typename TData1, typename TData2> -struct SSignalDataStruct2 -{ - typedef SSignalDataStruct2<TData1, TData2> TThisType; - typedef std::function<void(TData1, TData2)> TFunType; - TData1 m_Data1; - TData2 m_Data2; - SSignalDataStruct2(TData1 d1, TData2 d2) - : m_Data1(d1) - , m_Data2(d2) - { - } - static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1, - const TData2 &d2) - { - TThisType theData(d1, d2); - system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType)); - } - - static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize, - TFunType inHandler) - { - if (inDataSize == sizeof(TThisType)) { - const TThisType *theData = reinterpret_cast<const TThisType *>(inData); - inHandler(theData->m_Data1, theData->m_Data2); - } else { - QT3DS_ASSERT(false); - } - } - - static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler) - { - return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4, inHandler); - } - - static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender, - const char *inName, TFunType inHandler) - { - return inSystem.AddListener(inSender, inName, CreateHandler(inHandler)); - } -}; - -#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT2(name, d1, d2) \ - std::shared_ptr<ISignalConnection> Sig##name::AddListener( \ - ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2)> inHandler) \ - { \ - return SSignalDataStruct2<d1, d2>::AddListener(inSystem, inSender, #name, inHandler); \ - } \ - void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2) \ - { \ - SSignalDataStruct2<d1, d2>::Send(system, sender, #name, arg1, arg2); \ - } - -template <typename TData1, typename TData2, typename TData3> -struct SSignalDataStruct3 -{ - typedef SSignalDataStruct3<TData1, TData2, TData3> TThisType; - typedef std::function<void(TData1, TData2, TData3)> TFunType; - TData1 m_Data1; - TData2 m_Data2; - TData3 m_Data3; - SSignalDataStruct3(const TData1 &d1, const TData2 &d2, const TData3 &d3) - : m_Data1(d1) - , m_Data2(d2) - , m_Data3(d3) - { - } - static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1, - const TData2 &d2, const TData3 &d3) - { - TThisType theData(d1, d2, d3); - system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType)); - } - - static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize, - TFunType inHandler) - { - if (inDataSize == sizeof(TThisType)) { - const TThisType *theData = reinterpret_cast<const TThisType *>(inData); - inHandler(theData->m_Data1, theData->m_Data2, theData->m_Data2); - } else { - QT3DS_ASSERT(false); - } - } - - static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler) - { - return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4, inHandler); - } - - static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender, - const char *inName, TFunType inHandler) - { - return inSystem.AddListener(inSender, inName, CreateHandler(inHandler)); - } -}; - -#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT3(name, d1, d2, d3) \ - std::shared_ptr<ISignalConnection> Sig##name::AddListener( \ - ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2, d3)> inHandler) \ - { \ - return SSignalDataStruct3<d1, d2, d3>::AddListener(inSystem, inSender, #name, inHandler); \ - } \ - void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \ - const d3 &arg3) \ - { \ - SSignalDataStruct3<d1, d2, d3>::Send(system, sender, #name, arg1, arg2, arg3); \ - } - -template <typename TData1, typename TData2, typename TData3, typename TData4> -struct SSignalDataStruct4 -{ - typedef SSignalDataStruct4<TData1, TData2, TData3, TData4> TThisType; - typedef std::function<void(TData1, TData2, TData3, TData4)> TFunType; - TData1 m_Data1; - TData2 m_Data2; - TData3 m_Data3; - TData4 m_Data4; - SSignalDataStruct4(const TData1 &d1, const TData2 &d2, const TData3 &d3, const TData4 &d4) - : m_Data1(d1) - , m_Data2(d2) - , m_Data3(d3) - , m_Data4(d4) - { - } - static void Send(ISignalSystem &system, void *sender, const char *sigName, const TData1 &d1, - const TData2 &d2, const TData3 &d3, const TData4 &d4) - { - TThisType theData(d1, d2, d3, d4); - system.Signal(sender, sigName, reinterpret_cast<const char *>(&theData), sizeof(TThisType)); - } - - static void Unpack(void *inSender, const char *inName, const char *inData, size_t inDataSize, - TFunType inHandler) - { - if (inDataSize == sizeof(TThisType)) { - const TThisType *theData = reinterpret_cast<const TThisType *>(inData); - inHandler(theData->m_Data1, theData->m_Data2, theData->m_Data2, theData->m_Data4); - } else { - QT3DS_ASSERT(false); - } - } - - static TGenericSignalHandlerFunc CreateHandler(TFunType inHandler) - { - return std::bind(&TThisType::Unpack, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4, inHandler); - } - - static std::shared_ptr<ISignalConnection> AddListener(ISignalSystem &inSystem, void *inSender, - const char *inName, TFunType inHandler) - { - return inSystem.AddListener(inSender, inName, CreateHandler(inHandler)); - } -}; - -#define QT3DSDM_SIGNALS_DEFINE_SPECIFIC_SIGNAL_STRUCT4(name, d1, d2, d3, d4) \ - std::shared_ptr<ISignalConnection> Sig##name::AddListener( \ - ISignalSystem &inSystem, void *inSender, std::function<void(d1, d2, d3, d4)> inHandler) \ - { \ - return SSignalDataStruct4<d1, d2, d3, d4>::AddListener(inSystem, inSender, #name, \ - inHandler); \ - } \ - void Sig##name::Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \ - const d3 &arg3, const d4 &arg4) \ - { \ - SSignalDataStruct4<d1, d2, d3, d4>::Send(system, sender, #name, arg1, arg2, arg3, arg4); \ - } -} -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalStructs.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalStructs.h deleted file mode 100644 index 86c09fd4..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalStructs.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SIGNAL_STRUCTS_H -#define QT3DSDM_SIGNAL_STRUCTS_H -#include "Qt3DSDMSignalSystem.h" -// Helper structs for signals of different arity. -namespace qt3dsdm { -// Helper defines to create static tables of signals -// Macros with the same number of args but with 'declare' replaced by 'define -// are available in UICDMSignalStructImpl.h. You will need to place these somewhere but -// they rely on std::bind so I don't place them here. -#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT0(name) \ - struct Sig##name \ - { \ - static std::shared_ptr<ISignalConnection> \ - AddListener(ISignalSystem &inSystem, void *inSender, std::function<void()> inHandler); \ - static void Send(ISignalSystem &system, void *sender); \ - }; - -// Helper defines to create static tables of signals -#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT1(name, d1) \ - struct Sig##name \ - { \ - static std::shared_ptr<ISignalConnection> \ - AddListener(ISignalSystem &inSystem, void *inSender, std::function<void(d1)> inHandler); \ - static void Send(ISignalSystem &system, void *sender, const d1 &arg); \ - }; - -// Helper defines to create static tables of signals -#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT2(name, d1, d2) \ - struct Sig##name \ - { \ - static std::shared_ptr<ISignalConnection> \ - AddListener(ISignalSystem &inSystem, void *inSender, \ - std::function<void(d1, d2)> inHandler); \ - static void Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2); \ - }; - -// Helper defines to create static tables of signals -#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT3(name, d1, d2, d3) \ - struct Sig##name \ - { \ - static std::shared_ptr<ISignalConnection> \ - AddListener(ISignalSystem &inSystem, void *inSender, \ - std::function<void(d1, d2, d3)> inHandler); \ - static void Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \ - const d3 &arg3); \ - }; - -// Helper defines to create static tables of signals -#define QT3DSDM_SIGNALS_DECLARE_SPECIFIC_SIGNAL_STRUCT4(name, d1, d2, d3, d4) \ - struct Sig##name \ - { \ - static std::shared_ptr<ISignalConnection> \ - AddListener(ISignalSystem &inSystem, void *inSender, \ - std::function<void(d1, d2, d3, d4)> inHandler); \ - static void Send(ISignalSystem &system, void *sender, const d1 &arg1, const d2 &arg2, \ - const d3 &arg3, const d4 &arg4); \ - }; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalSystem.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalSystem.cpp deleted file mode 100644 index 37d02003..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalSystem.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "Qt3DSDMSignalSystem.h" -#include "EASTL/hash_map.h" - -using namespace qt3dsdm; - -namespace { - -struct SSignalListener; -class ISignalSystemImpl -{ -public: - virtual ~ISignalSystemImpl() {} - virtual void RemoveListener(SSignalListener &inListener) = 0; -}; - -struct SSignalSystemKey -{ - void *m_Sender; - const char *m_SignalName; - SSignalSystemKey(void *inSender, const char *inSigName, IStringTable &inStrTable) - : m_Sender(inSender) - , m_SignalName(inStrTable.GetNarrowStr(inSigName)) - { - } - SSignalSystemKey(const SSignalSystemKey &inOther) - : m_Sender(inOther.m_Sender) - , m_SignalName(inOther.m_SignalName) - { - } - - SSignalSystemKey &operator=(const SSignalSystemKey &inOther) - { - if (this != &inOther) { - m_Sender = inOther.m_Sender; - m_SignalName = inOther.m_SignalName; - } - return *this; - } - - bool operator==(const SSignalSystemKey &inOther) const - { - return m_Sender == inOther.m_Sender && m_SignalName == inOther.m_SignalName; - } -}; - -struct SSignalListener : ISignalConnection -{ - shared_ptr<ISignalSystemImpl> m_SignalSystem; - TGenericSignalHandlerFunc m_Handler; - SSignalSystemKey m_Key; - SSignalListener(shared_ptr<ISignalSystemImpl> inSystem, TGenericSignalHandlerFunc inHandler, - SSignalSystemKey inKey) - : m_SignalSystem(inSystem) - , m_Handler(inHandler) - , m_Key(inKey) - { - } - ~SSignalListener() { m_SignalSystem->RemoveListener(*this); } - void Signal(void *inSender, const char *inName, const char *inData, size_t inDataSize) - { - m_Handler(inSender, inName, inData, inDataSize); - } -}; - -typedef eastl::vector<SSignalListener *> TSignalListenerPtrList; -} - -namespace eastl { -template <> -struct hash<SSignalSystemKey> -{ - size_t operator()(const SSignalSystemKey &inKey) const - { - return hash<void *>()(inKey.m_Sender) ^ hash<const char *>()(inKey.m_SignalName); - } -}; -} - -namespace { -typedef eastl::hash_map<SSignalSystemKey, TSignalListenerPtrList> TSignalHandlerMap; - -struct SSignalSystemImpl : public ISignalSystemImpl -{ - TSignalHandlerMap m_SignalHandlers; - shared_ptr<IStringTable> m_StringTable; - SSignalSystemImpl(shared_ptr<IStringTable> inStrTable) - : m_StringTable(inStrTable) - { - } - - TSignalListenerPtrList *FindListenerList(const SSignalSystemKey &inKey) - { - TSignalHandlerMap::iterator theIter = m_SignalHandlers.find(inKey); - if (theIter != m_SignalHandlers.end()) - return &theIter->second; - return NULL; - } - - void Signal(void *inSender, const char *inName, const char *inData, size_t inDataSize) - { - TSignalListenerPtrList *theSignals = - FindListenerList(SSignalSystemKey(inSender, inName, *m_StringTable)); - if (theSignals) { - for (eastl_size_t idx = 0, end = theSignals->size(); idx < end; ++idx) { - (*theSignals)[idx]->Signal(inSender, inName, inData, inDataSize); - } - } - } - - void RemoveListener(SSignalListener &inListener) override - { - TSignalListenerPtrList *theSignals = FindListenerList(inListener.m_Key); - if (theSignals) { - // If we could allow unordered access then this could potentially be a lot faster. - TSignalListenerPtrList::iterator theFind = - eastl::find(theSignals->begin(), theSignals->end(), &inListener); - if (theFind != theSignals->end()) - theSignals->erase(theFind); - } - } -}; - -struct SSignalSystem : public ISignalSystem -{ - shared_ptr<SSignalSystemImpl> m_System; - SSignalSystem(shared_ptr<IStringTable> inStrTable) - { - m_System = std::make_shared<SSignalSystemImpl>(inStrTable); - } - - shared_ptr<ISignalConnection> AddListener(void *inSender, const char *inName, - TGenericSignalHandlerFunc inFunc) override - { - SSignalSystemKey theKey(inSender, inName, *m_System->m_StringTable); - TSignalHandlerMap::iterator theIter = - m_System->m_SignalHandlers.insert(eastl::make_pair(theKey, TSignalListenerPtrList())) - .first; - TSignalListenerPtrList &theList(theIter->second); - shared_ptr<SSignalListener> theSender = - std::make_shared<SSignalListener>(m_System, inFunc, theKey); - theList.push_back(theSender.get()); - return theSender; - } - - void Signal(void *inSender, const char *inName, const char *inData, size_t inDataSize) override - { - m_System->Signal(inSender, inName, inData, inDataSize); - } -}; -} - -shared_ptr<ISignalSystem> ISignalSystem::CreateSignalSystem(shared_ptr<IStringTable> inStrTable) -{ - return std::make_shared<SSignalSystem>(inStrTable); -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalSystem.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalSystem.h deleted file mode 100644 index cd80010d..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignalSystem.h +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SIGNAL_SYSTEM_H -#define QT3DSDM_SIGNAL_SYSTEM_H -#include <functional> -#include "Qt3DSDMSignals.h" - -namespace qt3dsdm { -typedef std::function<void(void *, const char *, const char *, size_t)> TGenericSignalHandlerFunc; - -class ISignalSystem -{ -protected: - virtual ~ISignalSystem() {} -public: - virtual shared_ptr<ISignalConnection> AddListener(void *inSender, const char *inName, - TGenericSignalHandlerFunc inFunc) = 0; - virtual void Signal(void *inSender, const char *inName, const char *inData, - size_t inDataSize) = 0; - - static shared_ptr<ISignalSystem> CreateSignalSystem(shared_ptr<IStringTable> inStrTable); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignals.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignals.h deleted file mode 100644 index 57b96591..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSignals.h +++ /dev/null @@ -1,611 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SIGNALS_H -#define QT3DSDM_SIGNALS_H -#include "Qt3DSDMDataTypes.h" -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMAnimation.h" -#include "Qt3DSDMActionInfo.h" -#include "Qt3DSDMValue.h" -#include <functional> -#include <string> - -namespace qt3dsdm { - -class ISignalConnection -{ -public: - virtual ~ISignalConnection() {} -}; - -class ISignalItem -{ -public: - virtual ~ISignalItem() {} -}; - -typedef std::shared_ptr<ISignalItem> TSignalItemPtr; - -typedef std::shared_ptr<ISignalConnection> TSignalConnectionPtr; - -class QtSignalConnection : public ISignalConnection -{ - Q_DISABLE_COPY(QtSignalConnection) -private: - QMetaObject::Connection m_connection; -public: - QtSignalConnection(const QMetaObject::Connection &inConnection) - : m_connection(inConnection) - { - } - ~QtSignalConnection() override - { - QObject::disconnect(m_connection); - } -}; - - -class IInstancePropertyCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr ConnectInstancePropertyValue( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)> - &inCallback) = 0; -}; - -class IInstancePropertyCoreSignalSender : public ISignalItem -{ -public: - virtual void SignalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; -}; - -class IDataCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr - ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectBeforeInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstanceDerived( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstanceParentRemoved( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectPropertyAdded(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - TCharPtr, DataModelDataType::Value)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectPropertyRemoved( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr, - DataModelDataType::Value)> &inCallback) = 0; -}; - -class IDataCoreSignalSender : public ISignalItem -{ -public: - virtual void SignalInstanceCreated(Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SignalBeforeInstanceDeleted(Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SignalInstanceDeleted(Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SignalInstanceDerived(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) = 0; - virtual void SignalInstanceParentRemoved(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) = 0; - virtual void SignalPropertyAdded(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, TCharPtr inName, - DataModelDataType::Value inDataType) = 0; - virtual void SignalPropertyRemoved(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, TCharPtr inName, - DataModelDataType::Value inDataType) = 0; -}; - -class ISlideCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr - ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectBeforeSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectSlideDerived( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstancePropertyValueSet( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstancePropertyValueRemoved( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectSlideTimeChanged(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; -}; - -class ISlideCoreSignalSender : public ISignalItem -{ -public: - virtual void SendSlideCreated(Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendBeforeSlideDeleted(Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendSlideDerived(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, - int inIndex) = 0; - virtual void SendPropertyValueSet(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inParent, const SValue &inValue) = 0; - // This gives clients a chance to override a property value the first time it is set on a slide - virtual void SendPropertyValueRemoved(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inParent, const SValue &inValue) = 0; - virtual void SendSlideTimeChanged(Qt3DSDMSlideHandle inSlide) = 0; -}; - -class ISlideGraphCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr ConnectGraphCreated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectGraphDeleted( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstanceAssociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstanceDissociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectGraphActiveSlide( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) = 0; -}; - -class ISlideGraphCoreSignalSender : public ISignalItem -{ -public: - virtual void SendGraphCreated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendGraphDeleted(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendInstanceAssociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SendInstanceDissociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SendGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, - Qt3DSDMSlideHandle inSlide) = 0; -}; - -class IAnimationCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr ConnectAnimationCreated( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectBeforeAnimationDeleted( - const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectAnimationDeleted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectKeyframeInserted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectBeforeKeyframeErased(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectKeyframeErased( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectBeforeAllKeyframesErased( - const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectKeyframeUpdated( - const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectFirstKeyframeDynamicSet( - const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) = 0; -}; - -class IAnimationCoreSignalSender : public ISignalItem -{ -public: - virtual void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType) = 0; - virtual void SendBeforeAnimationDeleted(Qt3DSDMAnimationHandle inAnimation) = 0; - virtual void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType) = 0; - virtual void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0; - virtual void SendBeforeKeyframeErased(Qt3DSDMKeyframeHandle inAnimation) = 0; - virtual void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0; - virtual void SendBeforeAllKeyframesErased(Qt3DSDMAnimationHandle inAnimation) = 0; - virtual void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) = 0; - virtual void SendFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation, - bool inKeyframeDynamic) = 0; -}; - -class IActionCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr ConnectTriggerObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectTargetObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectEventSet( - const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectHandlerSet( - const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectHandlerArgumentAdded( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectHandlerArgumentRemoved( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectHandlerArgumentValueSet( - const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) = 0; -}; - -class IActionCoreSignalSender : public ISignalItem -{ -public: - virtual void SendTriggerObjectSet(Qt3DSDMActionHandle inAction, - SObjectRefType &inTriggerObject) = 0; - virtual void SendTargetObjectSet(Qt3DSDMActionHandle inAction, - SObjectRefType &inTargetObject) = 0; - virtual void SendEventSet(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) = 0; - virtual void SendHandlerSet(Qt3DSDMActionHandle inAction, const wstring &inActionName) = 0; - - virtual void SendHandlerArgumentAdded(Qt3DSDMActionHandle inAction, - Qt3DSDMHandlerArgHandle inHandlerArgument, - const TCharStr &inName, HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) = 0; - virtual void SendHandlerArgumentRemoved(Qt3DSDMActionHandle inAction, - Qt3DSDMHandlerArgHandle inHandlerArgument, - const TCharStr &inName, HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) = 0; - virtual void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument, - const SValue &inValue) = 0; -}; - -class IActionSystemSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr ConnectActionCreated( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectActionDeleted( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) = 0; -}; - -class IActionSystemSignalSender : public ISignalItem -{ -public: - virtual void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) = 0; -}; - -class ICustomPropCoreSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr ConnectCustomPropertyCreated( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomPropertyDeleted( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomPropertyModified( - const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectCustomEventCreated( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomEventDeleted( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectCustomHandlerCreated( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerDeleted( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectCustomHandlerParamCreated( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerParamDeleted( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerParamModified( - const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectCustomReferencesModified( - const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) = 0; -}; - -class ICustomPropCoreSignalSender : public ISignalItem -{ -public: - virtual void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) = 0; - - virtual void SendCustomEventCreated(Qt3DSDMEventHandle inEvent, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomEventModified(Qt3DSDMEventHandle inEvent) = 0; - - virtual void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) = 0; - - virtual void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) = 0; - virtual void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) = 0; - virtual void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) = 0; - - virtual void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner, - const TCharStr &inString) = 0; -}; - -class ISlideSystemSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr - ConnectMasterCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectMasterDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectSlideCreated( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectSlideDeleted( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectSlideRearranged( - const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstanceAssociated( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectInstanceDissociated( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectPropertyLinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectPropertyUnlinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectActiveSlide( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle, Qt3DSDMSlideHandle)> - &inCallback) = 0; -}; - -class ISlideSystemSignalSender : public ISignalItem -{ -public: - virtual void SendMasterCreated(Qt3DSDMSlideHandle inMaster) = 0; - virtual void SendMasterDeleted(Qt3DSDMSlideHandle inMaster) = 0; - virtual void SendSlideCreated(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendSlideDeleted(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex, - int inNewIndex) = 0; - virtual void SendInstanceAssociated(Qt3DSDMSlideHandle inMaster, - Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SendInstanceDissociated(Qt3DSDMSlideHandle inMaster, - Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide) = 0; -}; - -class IStudioFullSystemSignalProvider : public ISignalItem -{ -public: - virtual TSignalConnectionPtr - ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectSlideRearranged( - const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectBeginComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectPropertyLinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectPropertyUnlinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectActiveSlide( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr - ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr - ConnectAnimationCreated(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectKeyframeInserted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectKeyframeErased( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectKeyframeUpdated(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectFirstKeyframeDynamicSet( - const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectInstancePropertyValue( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectActionCreated( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr ConnectActionDeleted( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectTriggerObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectTargetObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectEventSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectHandlerArgumentValueSet( - const std::function<void(Qt3DSDMHandlerArgHandle)> &inCallback) = 0; - - virtual TSignalConnectionPtr ConnectCustomPropertyCreated( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomPropertyDeleted( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomPropertyModified( - const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomEventCreated( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomEventDeleted( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerCreated( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerDeleted( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr - ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerParamCreated( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerParamDeleted( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomHandlerParamModified( - const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectCustomReferencesModified( - const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) = 0; - virtual TSignalConnectionPtr ConnectControlledToggled( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) = 0; -}; - -class IStudioFullSystemSignalSender : public ISignalItem -{ -public: - virtual void SendSlideCreated(Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) = 0; - virtual void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex, - int inNewIndex) = 0; - virtual void SendComponentSeconds(Qt3DSDMSlideHandle inMaster) = 0; - virtual void SendBeginComponentSeconds(Qt3DSDMSlideHandle inMaster) = 0; - virtual void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inSlide) = 0; - - virtual void SendInstanceCreated(Qt3DSDMInstanceHandle inInstance) = 0; - virtual void SendInstanceDeleted(Qt3DSDMInstanceHandle inInstance) = 0; - - virtual void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe) = 0; - virtual void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe) = 0; - virtual void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe) = 0; - virtual void SendConnectFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation, - bool inDynamic) = 0; - - virtual void SendInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - - virtual void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendTriggerObjectSet(Qt3DSDMActionHandle inAction) = 0; - virtual void SendTargetObjectSet(Qt3DSDMActionHandle inAction) = 0; - virtual void SendEventSet(Qt3DSDMActionHandle inAction) = 0; - virtual void SendHandlerSet(Qt3DSDMActionHandle inAction) = 0; - virtual void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument) = 0; - - virtual void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) = 0; - virtual void SendCustomEventCreated(Qt3DSDMEventHandle inEvent, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomEventModified(Qt3DSDMEventHandle inEvent) = 0; - virtual void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) = 0; - virtual void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) = 0; - virtual void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) = 0; - virtual void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) = 0; - virtual void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) = 0; - virtual void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner, - const TCharStr &inString) = 0; - virtual void SendControlledToggled(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; -}; - -// Use this if you want to register for only a specific instance or specific property -template <typename TTransaction> -inline void MaybackCallbackInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - Qt3DSDMInstanceHandle inDesiredInstance, - Qt3DSDMPropertyHandle inDesiredProperty, - TTransaction inCallback) -{ - if ((!inDesiredInstance.Valid() || (inDesiredInstance == inInstance)) - && (!inDesiredProperty.Valid() || (inDesiredProperty == inProperty))) - inCallback(inInstance, inProperty); -} - -void SetDataModelSignalsEnabled(bool inEnabled); -// Defaults to true -bool AreDataModelSignalsEnabled(); -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlideCore.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlideCore.h deleted file mode 100644 index 8216b01d..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlideCore.h +++ /dev/null @@ -1,239 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SLIDE_CORE_H -#define QT3DSDM_SLIDE_CORE_H -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMDataTypes.h" -#include "HandleSystemBase.h" -#include "Qt3DSDMStringTable.h" -#include "Qt3DSDMDataCore.h" - -namespace qt3dsdm { -typedef std::pair<Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle> TInstancePropertyPair; -typedef std::vector<TInstancePropertyPair> TInstancePropertyPairList; - -// instance,property,value -typedef std::tuple<Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, SValue> TSlideEntry; -typedef std::vector<TSlideEntry> TSlideEntryList; - -class ISlideCore : public IHandleBase -{ -public: - virtual ~ISlideCore() {} - virtual TStringTablePtr GetStringTablePtr() const = 0; - virtual IStringTable &GetStringTable() const = 0; - //=============================================================== - // Slide lifetime management - //=============================================================== - /** - * Create a new slide. Slides must have an instance allocated for them. - */ - virtual Qt3DSDMSlideHandle CreateSlide(Qt3DSDMInstanceHandle inInstance) = 0; - /** - * Return the instance that was allocated for this slide. - */ - virtual Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const = 0; - /** - * Reverse lookup into the slide system so you can match slides to instances. - */ - virtual Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const = 0; - /** - * Delete a given slide. This recursively deletes all children. All associated instances - * are returned in the outInstances list so the caller can further delete them. - * The deleted object is removed from the parent's list of children. Child objects are - * also deleted. - */ - virtual void DeleteSlide(Qt3DSDMSlideHandle inSlide, TInstanceHandleList &outInstances) = 0; - /** - * Return all of the slides in the core. - */ - virtual void GetSlides(TSlideHandleList &outSlides) const = 0; - - virtual float GetSlideTime(Qt3DSDMSlideHandle inSlide) const = 0; - - virtual void SetSlideTime(Qt3DSDMSlideHandle inSlide, float inNewTime) = 0; - - //=============================================================== - // Slide derivation - //=============================================================== - /** - * Derive a slide from another slide. This simply provides an alternate path for property - *lookup - * if it isn't found on this slide. OK for parent to be an invalid handle. It is also fine - * for the slide to have a valid parent; all involved parties are notified and updated. - */ - virtual void DeriveSlide(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, - int inIndex = -1) = 0; - /** - * Return the parent slide for this slide. Invalid handle if no parent. - */ - virtual Qt3DSDMSlideHandle GetParentSlide(Qt3DSDMSlideHandle inSlide) const = 0; - /** - * Return a list of derived slides for this slide. - */ - virtual void GetChildSlides(Qt3DSDMSlideHandle inSlide, TSlideHandleList &outChildren) const = 0; - - /** - * Return the index of this child. Exception if child isn't found - */ - virtual int GetChildIndex(Qt3DSDMSlideHandle inParent, Qt3DSDMSlideHandle inChild) const = 0; - //=============================================================== - - //=============================================================== - // Instance Property Access - //=============================================================== - /** - * Get this property from this instance in this slide. Includes lookup into any parent slides. - */ - virtual bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - - /** - * Set this property. If this slide doesn't already contain an entry - *(PushPropertyValueToChildren) - * then this will attempt to set it on the parent slide. If it does not have a parent slide or - *if - * it already has a property entry then it sets the value locally. - */ - virtual void SetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - /** - * Set this property on this slide; do not try to set on parent slide under any circumstances. - *Always adds entry to this slide. - */ - virtual void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - /** - * Set a property value on an instance on all slides. - */ - virtual void forceSetInstancePropertyValueOnAllSlides(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - /** - * Return the value for this property if it exists on this slide. - */ - virtual bool GetSpecificInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - - /** - * Return all of the properties for this instance stored on this slide. - */ - virtual void GetSpecificInstancePropertyValues(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - TPropertyHandleValuePairList &outValues) = 0; - - /** - * Get all of the property entries for the slide. - */ - virtual void GetSlidePropertyEntries(Qt3DSDMSlideHandle inSlide, - TSlideEntryList &outEntries) const = 0; - - /** - * Set this property value on all my child slides. - */ - virtual void PushPropertyValueToChildren(Qt3DSDMSlideHandle inParent, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - /** - * If any property entries in slide1 intersect (have matching instance and property handles) - *with slide 2, - * add said property entry from slide1 to outEntries; - */ - virtual void GetIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - TSlideEntryList &outEntries) const = 0; - - /** - * Take the intersection of the properties of slide1 and slide2 and push values from slide1 to - *destination. - * Used for new slide operations. - */ - virtual void PushIntersectingProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - Qt3DSDMSlideHandle inDestination) = 0; - - /** - * Ensure the children of this parent item do not contain entries for a given property. - */ - virtual void ClearChildrenPropertyValues(Qt3DSDMSlideHandle inParent, - Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) = 0; - - /** - * Delete all property entries related to this instance. - */ - virtual void DeleteAllInstanceEntries(Qt3DSDMInstanceHandle inHandle) = 0; - - /** - * Delete all of the property entries related to this property - */ - virtual void DeleteAllPropertyEntries(Qt3DSDMPropertyHandle inHandle) = 0; - - /** - * Delete all property entries that have an instance in the instances list *and* - * a property in the properties list. - */ - virtual void DeleteAllInstancePropertyEntries(const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) = 0; - - /** - * Does this slide contain this property? - */ - virtual bool ContainsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) const = 0; - - /** - * Copy the properties from the source slide and source instance to the destination slide and - *destination - * instance. - */ - virtual void CopyProperties(Qt3DSDMSlideHandle inSourceSlide, - Qt3DSDMInstanceHandle inSourceInstance, - Qt3DSDMSlideHandle inDestSlide, - Qt3DSDMInstanceHandle inDestInstance) = 0; - - virtual bool IsSlide(Qt3DSDMSlideHandle inSlide) const = 0; -}; - -typedef std::shared_ptr<ISlideCore> TSlideCorePtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlideGraphCore.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlideGraphCore.h deleted file mode 100644 index 34c04e11..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlideGraphCore.h +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SLIDE_GRAPH_CORE_H -#define QT3DSDM_SLIDE_GRAPH_CORE_H - -#include "Qt3DSDMHandles.h" -#include "HandleSystemBase.h" - -namespace qt3dsdm { - -typedef std::pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle> TSlideInstancePair; -typedef std::vector<TSlideInstancePair> TSlideInstancePairList; -typedef std::pair<Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle> TGraphSlidePair; - -/** - * Binding instances to slide graphs. - */ -class ISlideGraphCore : public IHandleBase -{ -public: - virtual ~ISlideGraphCore() {} - - /** - * A slide graph is used to associate a set of instances to a set of slides. - * This allows rapid lookup of properties, as an implementation of these. - * There are a few assumptions here. First is that a given slide can be a member - * of one and only one graph (i.e. it does not derive from another slide outside of the graph). - * Second is that an instance is a member of one and only one graph. - */ - virtual Qt3DSDMSlideGraphHandle CreateSlideGraph(Qt3DSDMSlideHandle inRoot) = 0; - virtual Qt3DSDMSlideHandle GetGraphRoot(Qt3DSDMSlideGraphHandle inGraph) const = 0; - virtual Qt3DSDMSlideGraphHandle GetSlideGraph(Qt3DSDMSlideHandle inSlide) const = 0; - virtual void GetSlideGraphs(TSlideGraphHandleList &outGraphs) const = 0; - virtual void DeleteSlideGraph(Qt3DSDMSlideGraphHandle inHandle) = 0; - - /** - * Associate a given instance handle with a given graph. This will ensure that property - *lookups - * will travel through this graph before they hit the main data core. Instances may be - *associated - * with a sub-slide of a given graph, not just the root. An instance associated with the root - *is - * implicitly associated with any root-derived slides. - */ - virtual void AssociateInstance(Qt3DSDMSlideGraphHandle inSlideGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) = 0; - virtual void GetAssociatedInstances(Qt3DSDMSlideGraphHandle inSlideGraph, - TSlideInstancePairList &outAssociations) const = 0; - virtual TGraphSlidePair GetAssociatedGraph(Qt3DSDMInstanceHandle inInstance) const = 0; - virtual void DissociateInstance(Qt3DSDMInstanceHandle inInstance) = 0; - - /** - * All graphs always have an active slide. This is assumed to be the root right off the bat. - */ - virtual void SetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) = 0; - virtual Qt3DSDMSlideHandle GetGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph) const = 0; -}; - -typedef std::shared_ptr<ISlideGraphCore> TSlideGraphCorePtr; -} - -#endif
\ No newline at end of file diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlides.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlides.h deleted file mode 100644 index aa7c27ce..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMSlides.h +++ /dev/null @@ -1,202 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_SLIDES_H -#define QT3DSDM_SLIDES_H -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMSlideCore.h" - -namespace qt3dsdm { -/** - * Some properties point to instances which act like extended properties. - * An example of this would be the images on materials. If a material has an - * image in one of its slots, that image should be duplicated upon property unlink - * and deleted upon property link. It (and its animations) should be duplicated upon - * create slide and deleted upon slide destruction such that the concept that the image - * is really a property on the material stays sound. - */ -class IPropertyInstanceInfo -{ -public: - virtual ~IPropertyInstanceInfo() {} - - /** - * Return the instance that relates to this property - */ - virtual Qt3DSDMInstanceHandle GetInstanceForProperty(const SValue &inValue) = 0; - - /** - * Duplicate this instance and whichever properties and animations you desire, - * returning a new data model value that will be set on the newly created property. - * Don't forget to associate the instance with a the dest slide. I doubt things - * will work correctly if you do not. - */ - virtual SValue CreateInstanceForProperty(Qt3DSDMSlideHandle inSourceSlide, - Qt3DSDMSlideHandle inDestSlide, - Qt3DSDMInstanceHandle inInstance) = 0; -}; - -typedef std::shared_ptr<IPropertyInstanceInfo> TPropertyInstanceInfoPtr; - -struct SInstanceSlideInformation -{ - // The slide associated with the instance - Qt3DSDMSlideHandle m_AssociatedSlide; - // The master slide of the component. - Qt3DSDMSlideHandle m_MasterSlide; - // The active slide of the component. - Qt3DSDMSlideHandle m_ActiveSlide; - // The current milliseconds of the active slide on the component. - long m_ComponentMilliseconds; - - SInstanceSlideInformation() - : m_ComponentMilliseconds(0) - { - } - SInstanceSlideInformation(Qt3DSDMSlideHandle inAssoc, Qt3DSDMSlideHandle inMaster, - Qt3DSDMSlideHandle inActive, long inMilliseconds) - : m_AssociatedSlide(inAssoc) - , m_MasterSlide(inMaster) - , m_ActiveSlide(inActive) - , m_ComponentMilliseconds(inMilliseconds) - { - } -}; - -class ISlideSystem -{ -public: - virtual ~ISlideSystem() {} - virtual Qt3DSDMSlideHandle CreateMasterSlide() = 0; - virtual Qt3DSDMSlideHandle CreateSlide(Qt3DSDMSlideHandle inMaster, int inIndex = -1) = 0; - // Duplicate this slide and put it into the master's child lists at index. - virtual Qt3DSDMSlideHandle DuplicateSlide(Qt3DSDMSlideHandle inSourceSlide, int inDestIndex) = 0; - virtual Qt3DSDMSlideHandle GetMasterSlide(Qt3DSDMSlideHandle inSlide) const = 0; - virtual bool IsMasterSlide(Qt3DSDMSlideHandle inSlide) const = 0; - virtual Qt3DSDMSlideHandle GetMasterSlideByComponentGuid(SLong4 inGuid) const = 0; - // Indexes are 1 based. Index 0 refers to the master slide; you can't delete this. - virtual void DeleteSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) = 0; - virtual void GetSlideReferencedInstances(Qt3DSDMSlideHandle inMaster, size_t inIndex, - TInstanceHandleList &outReferencedInstances) = 0; - virtual Qt3DSDMSlideHandle GetSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) const = 0; - virtual void SetActiveSlide(Qt3DSDMSlideHandle inMaster, size_t inIndex) = 0; - virtual void RearrangeSlide(Qt3DSDMSlideHandle inMaster, size_t inOldIndex, - size_t inNewIndex) = 0; - /** - * Set the current component time. This object will figure out the component from the slide. - */ - virtual void SetComponentSeconds(Qt3DSDMSlideHandle inSlide, float inSeconds) = 0; - /** - * Return the current time of the component - */ - virtual float GetComponentSeconds(Qt3DSDMSlideHandle inSlide) const = 0; - virtual long GetComponentSecondsLong(Qt3DSDMSlideHandle inSlide) const = 0; - virtual long GetComponentSecondsLong(Qt3DSDMInstanceHandle inInstance) const = 0; - - // The fastest way possible, get all of the slide information for this instance. - virtual SInstanceSlideInformation - GetInstanceSlideInformation(Qt3DSDMInstanceHandle inInstance) const = 0; - /** - * Slide count includes the master slide; - */ - virtual size_t GetSlideCount(Qt3DSDMSlideHandle inMaster) const = 0; - /** - * Use the instance for storing information such as name, or the GUID of the object - * this slide links to. - */ - virtual Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inSlide) const = 0; - /** - * Reverse lookup into the slide system so you can match slides to instances. - */ - virtual Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const = 0; - /** - * Slide may be either a master slide - */ - virtual void AssociateInstanceWithSlide(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) = 0; - virtual Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance) const = 0; - virtual void GetAssociatedInstances( - Qt3DSDMSlideHandle inMaster, - std::vector<std::pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle>> &outAssociations) const = 0; - virtual void GetAssociatedInstances(Qt3DSDMSlideHandle inSlide, - TInstanceHandleList &outAssociations) const = 0; - virtual void LinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) = 0; - virtual void UnlinkProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) = 0; - virtual bool IsPropertyLinked(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - virtual bool CanPropertyBeLinked(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - virtual void GetUnionOfProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide, - TInstancePropertyPairList &outProperties) const = 0; - - virtual bool GetSlidePropertyValue(size_t inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) = 0; - - virtual void SetActiveSlide(Qt3DSDMSlideHandle inSlide) = 0; - virtual Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const = 0; - - virtual bool SlideValid(Qt3DSDMSlideHandle inSlide) const = 0; - virtual int GetSlideIndex(Qt3DSDMSlideHandle inSlide) const = 0; - virtual int GetActiveSlideIndex(Qt3DSDMSlideHandle inMaster) const = 0; - virtual Qt3DSDMSlideHandle GetActiveSlide(Qt3DSDMSlideHandle inMaster) const = 0; - virtual Qt3DSDMInstanceHandle GetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide) const = 0; - virtual void SetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) = 0; - - virtual Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle) = 0; - virtual Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) = 0; - - virtual bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - virtual bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const = 0; - virtual void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) = 0; - - /** - * Let this object know that this property will sometimes reference another property - * and give an outside entity the chance to create new objects and properties when - * the property is unlinked and linked. - */ - virtual void RegisterPropertyInstance(Qt3DSDMPropertyHandle inPropertyHandle, - TPropertyInstanceInfoPtr inPropertyInfo) = 0; -}; - -typedef std::shared_ptr<ISlideSystem> TSlideSystemPtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMStringTable.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMStringTable.cpp deleted file mode 100644 index 58db71c7..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMStringTable.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "Qt3DSDMStringTable.h" -#include "foundation/StringTable.h" -#include "foundation/TrackingAllocator.h" - -using namespace qt3dsdm; -using namespace eastl; -using namespace qt3ds; - -namespace { - -struct StringTableImpl : public IStringTable -{ - qt3ds::foundation::MallocAllocator m_MallocAllocator; - qt3ds::foundation::IStringTable &m_StringTable; - StringTableImpl() - : m_StringTable(qt3ds::foundation::IStringTable::CreateStringTable(m_MallocAllocator)) - { - m_StringTable.addRef(); - } - StringTableImpl(qt3ds::foundation::IStringTable &inStrTable) - : m_StringTable(inStrTable) - { - m_StringTable.addRef(); - } - - virtual ~StringTableImpl() { m_StringTable.release(); } - const wchar_t *RegisterStr(const wchar_t *inStr) override - { - return m_StringTable.GetWideStr(inStr); - } - const char8_t *RegisterStr(const char8_t *inStr) override - { - return m_StringTable.GetNarrowStr(inStr); - } - // Get the utf-8 or utf-(sizeof wchar_t) converted strings - const wchar_t *GetWideStr(const char8_t *inStr) override - { - return m_StringTable.GetWideStr(inStr); - } - const char8_t *GetNarrowStr(const wchar_t *inStr) override - { - return m_StringTable.GetNarrowStr(inStr); - } - qt3ds::foundation::IStringTable &GetRenderStringTable() override { return m_StringTable; } -}; -} - -TStringTablePtr IStringTable::CreateStringTable() -{ - return std::make_shared<StringTableImpl>(); -} - -TStringTablePtr IStringTable::CreateStringTable(qt3ds::foundation::IStringTable &inStrTable) -{ - return std::make_shared<StringTableImpl>(std::ref(inStrTable)); -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMStringTable.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMStringTable.h deleted file mode 100644 index 7f1e9453..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMStringTable.h +++ /dev/null @@ -1,71 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DS_IMPORT_STRINGTABLE_H -#define QT3DS_IMPORT_STRINGTABLE_H - -#include <string> -#include <EABase/eabase.h> -#include "foundation/Qt3DSPreprocessor.h" - -namespace qt3ds { -namespace foundation { - class IStringTable; -} -} - -namespace qt3dsdm { - -class QT3DS_AUTOTEST_EXPORT IStringTable -{ -public: - virtual ~IStringTable() {} - - virtual const wchar_t *RegisterStr(const wchar_t *inStr) = 0; - virtual const char8_t *RegisterStr(const char8_t *inStr) = 0; - // Get the utf-8 or utf-(sizeof wchar_t) converted strings - virtual const wchar_t *GetWideStr(const char8_t *inStr) = 0; - virtual const char8_t *GetNarrowStr(const wchar_t *inStr) = 0; - - const wchar_t *GetWideStr(const wchar_t *inStr) { return RegisterStr(inStr); } - const char8_t *GetNarrowStr(const char8_t *inStr) { return RegisterStr(inStr); } - - const wchar_t *RegisterStr(const std::wstring &inStr) { return RegisterStr(inStr.c_str()); } - const char8_t *RegisterStr(const std::string &inStr) { return RegisterStr(inStr.c_str()); } - - virtual qt3ds::foundation::IStringTable &GetRenderStringTable() = 0; - - static std::shared_ptr<IStringTable> CreateStringTable(); - static std::shared_ptr<IStringTable> - CreateStringTable(qt3ds::foundation::IStringTable &inStrTable); -}; -typedef std::shared_ptr<IStringTable> TStringTablePtr; -}; - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMTestOps.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMTestOps.h deleted file mode 100644 index ac43eaf0..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMTestOps.h +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_OPS_H -#define QT3DSDM_OPS_H - -namespace qt3dsdm { -inline const TCharStr &GetPropertyName(const IDataCore &inModel, Qt3DSDMPropertyHandle inProperty) -{ - return inModel.GetProperty(inProperty).m_Name; -} - -inline bool PropertyNameMatches(const IDataCore &inModel, const TCharStr &inName, - Qt3DSDMPropertyHandle inProperty) -{ - return inName == GetPropertyName(inModel, inProperty); -} - -inline const Qt3DSDMPropertyHandle -GetPropertyByName(const IDataCore &inModel, Qt3DSDMInstanceHandle inInstance, const TCharStr &inName) -{ - using namespace std; - TPropertyHandleList properties; - inModel.GetAggregateInstanceProperties(inInstance, properties); - TPropertyHandleList::iterator theProp = - std::find_if(properties.begin(), properties.end(), - std::bind(PropertyNameMatches, std::ref(inModel), inName, - std::placeholders::_1)); - if (theProp != properties.end()) - return *theProp; - return 0; -} -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMTransactions.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMTransactions.h deleted file mode 100644 index f6ed3da0..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMTransactions.h +++ /dev/null @@ -1,244 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_TRANSACTIONS_H -#define QT3DSDM_TRANSACTIONS_H -#include "Qt3DSDMDataTypes.h" -#include "StandardExtensions.h" -#include <functional> - -namespace qt3dsdm { - -/** - * Transaction is some small entity that changes data. A transaction consumer is expected to - *execute - * a list of these either forward on a "redo" command or backwards on an "undo" command. - * - * Transactions merely change data. There are two other lists on consumers for "do" - *notifications - * and "undo" notifications. These lists control the events sent out to the UI about what - *actually - * changed in the model. Note that undo/do notifications may be more clever than simple - *send-signal - * commands in that they may check if an object is alive or not before sending a notification - *and may - * decline to send a notification if the target object is not currently alive. - * - * Currently the undo/redo system first executes all of the transactions and then sends the - *appropriate - * notifications. This means that when the UI receives any notification, the model is in its - *most-updated - * state. - */ -class ITransaction -{ -public: - const char *m_File; - int m_Line; - - ITransaction(const char *inFile, int inLine) - : m_File(inFile) - , m_Line(inLine) - { - } - virtual ~ITransaction() {} - virtual void Do() = 0; - virtual void Undo() = 0; -}; - -/** - * Merging allows us to efficient handle situations where the users are continuously - * modifying an object (or set of objects). These are referred to as live-update - * scenarios. Dragging an object in the 3d view or dragging keyframes in the timeline - * would be an example of live-update scenarios. - */ -template <typename TValueType> -class IMergeableTransaction -{ -public: - virtual ~IMergeableTransaction() {} - // Called when a new value has arrived and we would rather update - // an existing representation rather than create a new one. - virtual void Update(const TValueType &inValue) = 0; -}; - -/** - * A consumer is an object that records the transaction. This interface keeps the - * base producer objects from binding to how the transaction or the notifications - * are stored. - */ -class ITransactionConsumer -{ -public: - virtual ~ITransactionConsumer() {} - virtual void OnTransaction(std::shared_ptr<ITransaction> inTransaction) = 0; - // Notifications to be sent for undo/redo These are used to - // notify clients that something is different. - virtual void OnDoNotification(std::function<void()> inNotification) = 0; - virtual void OnUndoNotification(std::function<void()> inNotification) = 0; -}; - -/////////////////////////////////////////////////////////////////////////////// -// Implementation of helper objects and functions. -/////////////////////////////////////////////////////////////////////////////// - -typedef std::vector<std::function<void()>> TVoidFunctionList; - -typedef std::shared_ptr<ITransactionConsumer> TTransactionConsumerPtr; - -class ITransactionProducer -{ -public: - virtual ~ITransactionProducer() {} - virtual void SetConsumer(TTransactionConsumerPtr inConsumer) = 0; -}; - -template <typename TDoTransaction, typename TUndoTransaction> -class CGenericTransaction : public ITransaction -{ - Q_DISABLE_COPY(CGenericTransaction) - - TUndoTransaction m_UndoTransaction; - TDoTransaction m_DoTransaction; - -public: - CGenericTransaction(const char *inFile, int inLine, TDoTransaction inDo, - TUndoTransaction inUndo) - : ITransaction(inFile, inLine) - , m_UndoTransaction(inUndo) - , m_DoTransaction(inDo) - { - } - void Do() override { m_DoTransaction(); } - void Undo() override { m_UndoTransaction(); } -}; - -template <typename TDoTransaction, typename TUndoTransaction> -ITransaction *DoCreateGenericTransaction(const char *inFile, int inLine, TDoTransaction inDo, - TUndoTransaction inUndo) -{ - return static_cast<ITransaction *>( - new CGenericTransaction<TDoTransaction, TUndoTransaction>(inFile, inLine, inDo, inUndo)); -} - -#define CREATE_GENERIC_TRANSACTION(inDo, inUndo) \ - DoCreateGenericTransaction(__FILE__, __LINE__, inDo, inUndo) - -typedef std::shared_ptr<ITransaction> TTransactionPtr; -typedef std::vector<TTransactionPtr> TTransactionPtrList; - -struct CTransactionConsumer : public ITransactionConsumer -{ - TTransactionPtrList m_TransactionList; - TVoidFunctionList m_DoNotifications; - TVoidFunctionList m_UndoNotifications; - void OnTransaction(TTransactionPtr inTransaction) override - { - m_TransactionList.push_back(inTransaction); - } - void OnDoNotification(std::function<void()> inNotification) override - { - m_DoNotifications.push_back(inNotification); - } - void OnUndoNotification(std::function<void()> inNotification) override - { - m_UndoNotifications.push_back(inNotification); - } - - // Merge with another CTransactionConsumer - virtual void Merge(const ITransactionConsumer *inConsumer) - { - const CTransactionConsumer *theConsumer = - static_cast<const CTransactionConsumer *>(inConsumer); - m_TransactionList.insert(m_TransactionList.begin(), theConsumer->m_TransactionList.begin(), - theConsumer->m_TransactionList.end()); - } - void Reset() - { - m_TransactionList.clear(); - m_DoNotifications.clear(); - m_UndoNotifications.clear(); - } -}; - -template <typename TTransactionType> -inline void RunWithConsumer(TTransactionConsumerPtr inConsumer, TTransactionType inTransaction) -{ - if (inConsumer) - inTransaction(inConsumer); -} - -template <typename TDoTransaction, typename TUndoTransaction> -inline void CreateGenericTransactionWithConsumer(const char *inFile, int inLine, - TTransactionConsumerPtr inConsumer, - TDoTransaction inDoTransaction, - TUndoTransaction inUndoTransaction) -{ - if (inConsumer) - inConsumer->OnTransaction(TTransactionPtr( - DoCreateGenericTransaction(inFile, inLine, inDoTransaction, inUndoTransaction))); -} - -template <typename TItemType> -inline void DoSetConsumer(TTransactionConsumerPtr inConsumer, - std::shared_ptr<TItemType> inTypePtr) -{ - ITransactionProducer *theProducer = dynamic_cast<ITransactionProducer *>(inTypePtr.get()); - if (theProducer) - theProducer->SetConsumer(inConsumer); -} - -template <typename TContainer> -inline void Undo(TContainer &inTransactions) -{ - std::for_each(inTransactions.rbegin(), inTransactions.rend(), std::bind(&ITransaction::Undo, - std::placeholders::_1)); -} - -template <typename TContainer> -inline void Redo(TContainer &inTransactions) -{ - do_all(inTransactions, std::bind(&ITransaction::Do, std::placeholders::_1)); -} - -template <typename TItemType> -void Notify(std::vector<TItemType> &inNotifications) -{ - do_all(inNotifications, std::bind(&TItemType::operator(), std::placeholders::_1)); -} - -template <typename TItemType> -void NotifyReverse(std::vector<TItemType> &inNotifications) -{ - std::for_each(inNotifications.rbegin(), inNotifications.rend(), - std::bind(&TItemType::operator(), std::placeholders::_1)); -} -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMValue.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMValue.cpp deleted file mode 100644 index 94c5a594..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMValue.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "Qt3DSDMValue.h" - -#include <QColor> -#include <QDebug> -#include <QVariant> - -using namespace qt3dsdm; - -SValue::SValue(const QVariant &inData) -{ - switch (inData.type()) { - case QVariant::Bool: - { - *this = inData.toBool(); - break; - } - case QVariant::Color: - { - const QColor c = inData.value<QColor>(); - *this = qt3dsdm::SFloat4(c.redF(), c.greenF(), c.blueF(), c.alphaF()); - break; - } - case QVariant::String: - { - const QString q = inData.toString(); - const int count = q.size() + 1; -#ifdef __INTEGRITY - wchar_t* tempBuf = reinterpret_cast<wchar_t*>(malloc(count * sizeof(wchar_t))); -#else - wchar_t* tempBuf = reinterpret_cast<wchar_t*>(alloca(count * sizeof(wchar_t))); -#endif - tempBuf[count - 1] = 0; - q.toWCharArray(tempBuf); - *this = std::make_shared<qt3dsdm::CDataStr>(tempBuf); -#ifdef __INTEGRITY - free(tempBuf); -#endif - break; - } - case QVariant::Int: { - *this = inData.toInt(); - break; - } - case QVariant::Double: { - *this = inData.toFloat(); - break; - } - - case QVariant::Vector2D: { - const auto v = inData.value<QVector2D>(); - *this = qt3dsdm::SFloat2(v.x(), v.y()); - break; - } - - case QVariant::Vector3D: { - const auto v = inData.value<QVector3D>(); - *this = qt3dsdm::SFloat3(v.x(), v.y(), v.z()); - break; - } - - default: - qDebug() << "Add a handler for QVariant::type" << inData.type(); - throw std::runtime_error("Cannot transform this QVariant into SValue"); - } -} - -QVariant SValue::toQVariant() const -{ - switch (getType()) { - case DataModelDataType::String: - case DataModelDataType::StringRef: - { - return get<QString>(*this); - } - case DataModelDataType::Float: { - return get<float>(*this); - } - case DataModelDataType::Float2: { - return QVariant::fromValue(get<QVector2D>(*this)); - } - case DataModelDataType::Float3: { - return QVariant::fromValue(get<QVector3D>(*this)); - } - case DataModelDataType::Float4: { - return QVariant::fromValue(get<QVector<float> >(*this)); - } - case DataModelDataType::Long: { - return QVariant::fromValue(get<qt3ds::QT3DSI32>(*this)); - } - case DataModelDataType::Bool: { - return get<bool>(*this); - } - case DataModelDataType::FloatList: { - //KDAB_TODO - qDebug() << "Add a handler for type DataModelDataType::FloatList"; - return {}; - } - case DataModelDataType::Long4: { - return QVariant::fromValue(get<QVector<qt3ds::QT3DSU32> >(*this)); - } - case DataModelDataType::ObjectRef: { - const SObjectRefType &theRef(get<SObjectRefType>(*this)); - switch (theRef.GetReferenceType()) { - case ObjectReferenceType::Absolute: - return SValue(get<SLong4>(theRef.m_Value)).toQVariant(); - break; - case ObjectReferenceType::Relative: - return SValue(get<TDataStrPtr>(theRef.m_Value)).toQVariant(); - break; - case ObjectReferenceType::Unknown: - return QVariant::fromValue(QVector<qt3ds::QT3DSU32>()); - break; - } - } - case DataModelDataType::StringOrInt: { - const SStringOrInt &theData(get<SStringOrInt>(*this)); - if (theData.GetType() == SStringOrIntTypes::Int) { - return QVariant::fromValue(get<qt3ds::QT3DSI32>(theData.m_Value)); - } else if (theData.GetType() == SStringOrIntTypes::String) { - auto wideStr = get<TDataStrPtr>(theData.m_Value)->GetData(); - return QString::fromWCharArray(wideStr); - } else { - return {}; - } - - } - case DataModelDataType::None: - return {}; - default: - break; - } - return {}; -} - -SInternValue::SInternValue(const SValue &inValue, IStringTable &inStringTable) -{ - if (GetValueType(inValue) == DataModelDataType::StringRef) { - const SStringRef ¤t = get<SStringRef>(inValue); - SStringRef newId = inStringTable.RegisterStr(current.m_Id); - m_Value = SValue(newId); - } else { - m_Value = inValue; - } -} - -SInternValue::SInternValue(const SInternValue &inOther) - : m_Value(inOther.m_Value) -{ -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMValue.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMValue.h deleted file mode 100644 index 9e006320..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMValue.h +++ /dev/null @@ -1,341 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_VALUE_H -#define QT3DSDM_VALUE_H -#include "Qt3DSDMDataTypes.h" - -#include <QColor> -#include <QMetaType> -#include <QVariant> -#include <QVector> -#include <QVector2D> -#include <QVector3D> - -namespace qt3dsdm { - -template <typename TDataType> -struct SDataTypeToEnumMap -{ -}; - -template <DataModelDataType::Value TEnumVal> -struct SEnumToDataTypeMap -{ -}; - -#define DEFINE_QT3DSDM_DATA_TYPE_MAP(dtype, enumName) \ - template <> \ - struct SDataTypeToEnumMap<dtype> \ - { \ - static DataModelDataType::Value getType() { return enumName; } \ - }; \ - template <> \ - struct SEnumToDataTypeMap<enumName> \ - { \ - typedef dtype TDataType; \ - }; - -#define ITERATE_QT3DSDM_DATA_TYPES \ - HANDLE_QT3DSDM_DATA_TYPE(float, DataModelDataType::Float); \ - HANDLE_QT3DSDM_DATA_TYPE(SFloat2, DataModelDataType::Float2); \ - HANDLE_QT3DSDM_DATA_TYPE(SFloat3, DataModelDataType::Float3); \ - HANDLE_QT3DSDM_DATA_TYPE(SFloat4, DataModelDataType::Float4); \ - HANDLE_QT3DSDM_DATA_TYPE(qt3ds::QT3DSI32, DataModelDataType::Long); \ - HANDLE_QT3DSDM_DATA_TYPE(TDataStrPtr, DataModelDataType::String); \ - HANDLE_QT3DSDM_DATA_TYPE(bool, DataModelDataType::Bool); \ - HANDLE_QT3DSDM_DATA_TYPE(SLong4, DataModelDataType::Long4); \ - HANDLE_QT3DSDM_DATA_TYPE(SStringRef, DataModelDataType::StringRef); \ - HANDLE_QT3DSDM_DATA_TYPE(SObjectRefType, DataModelDataType::ObjectRef); \ - HANDLE_QT3DSDM_DATA_TYPE(SStringOrInt, DataModelDataType::StringOrInt); \ - HANDLE_QT3DSDM_DATA_TYPE(TFloatList, DataModelDataType::FloatList); - -#define HANDLE_QT3DSDM_DATA_TYPE(a, b) DEFINE_QT3DSDM_DATA_TYPE_MAP(a, b) -ITERATE_QT3DSDM_DATA_TYPES -#undef HANDLE_QT3DSDM_DATA_TYPE - -struct Qt3DSDMDataTypeUnionTraits -{ - typedef DataModelDataType::Value TIdType; - - enum { - TBufferSize = sizeof(SObjectRefType), - }; - - static TIdType getNoDataId() { return DataModelDataType::None; } - - template <typename TDataType> - static TIdType getType() - { - return SDataTypeToEnumMap<TDataType>::getType(); - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(char *inData, DataModelDataType::Value inType, TVisitorType inVisitor) - { - switch (inType) { -#define HANDLE_QT3DSDM_DATA_TYPE(dtype, enumType) \ - case enumType: \ - return inVisitor(*NVUnionCast<dtype *>(inData)); - ITERATE_QT3DSDM_DATA_TYPES -#undef HANDLE_QT3DSDM_DATA_TYPE - - default: - QT3DS_ASSERT(false); - case DataModelDataType::None: - return inVisitor(); - } - } - - template <typename TRetType, typename TVisitorType> - static TRetType visit(const char *inData, DataModelDataType::Value inType, TVisitorType inVisitor) - { - switch (inType) { -#define HANDLE_QT3DSDM_DATA_TYPE(dtype, enumType) \ - case enumType: \ - return inVisitor(*NVUnionCast<const dtype *>(inData)); - ITERATE_QT3DSDM_DATA_TYPES -#undef HANDLE_QT3DSDM_DATA_TYPE - - default: - QT3DS_ASSERT(false); - case DataModelDataType::None: - return inVisitor(); - } - } -}; - -typedef qt3ds::foundation:: - DiscriminatedUnion<qt3ds::foundation:: - DiscriminatedUnionGenericBase<Qt3DSDMDataTypeUnionTraits, - Qt3DSDMDataTypeUnionTraits::TBufferSize>, - Qt3DSDMDataTypeUnionTraits::TBufferSize> - TValue; - -struct SValue : public TValue -{ - SValue() {} - SValue(const SValue &inOther) - : TValue(static_cast<const TValue &>(inOther)) - { - } - SValue(const QVariant &inData); - - template <typename TDataType> - SValue(const TDataType &inData) - : TValue(inData) - { - } - SValue &operator=(const SValue &inOther) - { - TValue::operator=(inOther); - return *this; - } - bool operator==(const SValue &inOther) const { return TValue::operator==(inOther); } - bool operator!=(const SValue &inOther) const { return TValue::operator!=(inOther); } - bool empty() const { return getType() == DataModelDataType::None; } - - // Conversion from this data type into a data model value - const SValue &toOldSkool() const { return *this; } - - QVariant toQVariant() const; -}; - -typedef std::shared_ptr<SValue> SValuePtr; - -template <> -struct Qt3DSDMGetter<SValue> -{ - template <typename TRetType> - TRetType doGet(const SValue &inValue) - { - return inValue.getData<TRetType>(); - } -}; - -template <> -struct Qt3DSDMValueTyper<SValue> -{ - DataModelDataType::Value Get(const SValue &inValue) { return inValue.getType(); } -}; - -inline bool CheckValueType(DataModelDataType::Value inType, const SValue &inValue) -{ - bool retval = inType == inValue.getType(); - if (!retval) - throw ValueTypeError(L""); - return retval; -} - -inline bool Equals(const SValue &lhs, const SValue &rhs) -{ - return lhs == rhs; -} - -class SInternValue -{ - SValue m_Value; - -public: - SInternValue(const SValue &inValue, IStringTable &inTable); - SInternValue() {} - SInternValue(const SInternValue &inOther); - SInternValue &operator=(const SInternValue &inOther) - { - m_Value = inOther.m_Value; - return *this; - } - - static SInternValue ISwearThisHasAlreadyBeenInternalized(const SValue &inValue) - { - SInternValue retval; - retval.m_Value = inValue; - return retval; - } - - const SValue &GetValue() const { return m_Value; } - operator const SValue &() const { return m_Value; } -}; - -template <> -struct SDefaulter<SValue> -{ - inline bool SetDefault(DataModelDataType::Value inDataType, SValue &outValue) - { - switch (inDataType) { - case DataModelDataType::Float: - outValue = SValue(0.f); - break; - case DataModelDataType::Float2: - outValue = SValue(SFloat2()); - break; - case DataModelDataType::Float3: - outValue = SValue(SFloat3()); - break; - case DataModelDataType::Float4: - outValue = SValue(SFloat4()); - break; - case DataModelDataType::Long: - outValue = SValue(0); - break; - case DataModelDataType::String: - outValue = SValue(TDataStrPtr(new CDataStr(L""))); - break; - case DataModelDataType::Bool: - outValue = SValue(false); - break; - case DataModelDataType::Long4: - outValue = SValue(SLong4()); - break; - case DataModelDataType::StringRef: - outValue = SValue(SStringRef()); - break; - case DataModelDataType::ObjectRef: - outValue = SValue(SObjectRefType()); - break; - case DataModelDataType::FloatList: - outValue = SValue(TFloatList()); - break; - case DataModelDataType::StringOrInt: - default: - outValue = SValue(SStringOrInt()); - return false; - } - return true; - } -}; - -inline SObjectRefType ConvertToObjectRef(const SValue &inValue) -{ - using namespace std; - switch (GetValueType(inValue)) { - case DataModelDataType::StringRef: - return SObjectRefType(make_shared<CDataStr>(get<SStringRef>(inValue).m_Id)); - case DataModelDataType::String: - return SObjectRefType(get<TDataStrPtr>(inValue)); - case DataModelDataType::Long4: - return SObjectRefType(get<SLong4>(inValue)); - case DataModelDataType::ObjectRef: - return get<SObjectRefType>(inValue); - default: - break; - } - return SObjectRefType(); -} - - -template <> -inline QColor get<QColor>(const SValue &inType) -{ - auto f = get<qt3dsdm::SFloat4>(inType); - qreal r = qBound<qreal>(0.0, f.m_Floats[0], 1.0); - qreal g = qBound<qreal>(0.0, f.m_Floats[1], 1.0); - qreal b = qBound<qreal>(0.0, f.m_Floats[2], 1.0); - qreal a = qBound<qreal>(0.0, f.m_Floats[3], 1.0); - return QColor::fromRgbF(r, g, b, a); -} - -template <> -inline QString get<QString>(const qt3dsdm::SValue &inType) -{ - return QString::fromWCharArray(qt3dsdm::get<qt3dsdm::TDataStrPtr>(inType)->GetData()); -} - -template <> -inline QVector2D get<QVector2D>(const qt3dsdm::SValue &inType) -{ - auto f = get<qt3dsdm::SFloat2>(inType); - return QVector2D(f.m_Floats[0], f.m_Floats[1]); -} - -template <> -inline QVector3D get<QVector3D>(const qt3dsdm::SValue &inType) -{ - auto f = get<qt3dsdm::SFloat3>(inType); - return QVector3D(f.m_Floats[0], f.m_Floats[1], f.m_Floats[2]); -} - -template <> -inline QVector<float> get<QVector<float> >(const qt3dsdm::SValue &inType) -{ - auto f = get<qt3dsdm::SFloat4>(inType); - return {f.m_Floats[0], f.m_Floats[1], f.m_Floats[2], f.m_Floats[3]}; -} - -// KDAB_TODO Shortcut to not define our own 4 member long structure -template <> -inline QVector<qt3ds::QT3DSU32> get<QVector<qt3ds::QT3DSU32> >(const qt3dsdm::SValue &inType) -{ - auto f = get<qt3dsdm::SLong4>(inType); - return {f.m_Longs[0], f.m_Longs[1], f.m_Longs[2], f.m_Longs[3]}; -} - -} -Q_DECLARE_METATYPE(qt3dsdm::DataModelDataType) -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMWStrOps.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMWStrOps.h deleted file mode 100644 index b1e1fb01..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMWStrOps.h +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_WSTR_OPS_H -#define QT3DSDM_WSTR_OPS_H -namespace qt3dsdm { -// Template base class so that we can convert items to and from wide string -template <typename TDataType> -struct WStrOps -{ - bool force_compile_error; -}; -} -#endif
\ No newline at end of file diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMWStrOpsImpl.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMWStrOpsImpl.h deleted file mode 100644 index d65ac131..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMWStrOpsImpl.h +++ /dev/null @@ -1,761 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DS_IMPORT_WSTR_OPS_IMPL_H -#define QT3DS_IMPORT_WSTR_OPS_IMPL_H -#include "Qt3DSDMDataTypes.h" -#include "Qt3DSDMWStrOps.h" -#include "foundation/Qt3DSMemoryBuffer.h" -#include "foundation/Qt3DSMemoryBuffer.h" -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMAnimation.h" -#include "Qt3DSDMMetaDataTypes.h" -#include "Qt3DSDMXML.h" -#include "EABase/eabase.h" -#include "Qt3DSDMStringTable.h" - -namespace qt3dsdm { -using qt3ds::QT3DSI8; -using qt3ds::QT3DSU8; -using qt3ds::QT3DSI16; -using qt3ds::QT3DSU16; -using qt3ds::QT3DSU32; -using qt3ds::QT3DSI32; -using qt3ds::QT3DSU64; -using qt3ds::QT3DSI64; -using qt3ds::QT3DSF32; -using qt3ds::QT3DSF64; -template <> -struct WStrOps<bool> -{ - QT3DSU32 ToStr(bool item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>( - swprintf(buffer.begin(), buffer.size(), L"%s", item ? L"True" : L"False")); - } - bool StrTo(const wchar_t *buffer, bool &item) - { - if (AreEqual(buffer, L"True")) - item = true; - else - item = false; - return true; - } - QT3DSU32 ToStr(bool item, NVDataRef<char8_t> buffer) - { - return static_cast<QT3DSU32>( - _snprintf(buffer.begin(), buffer.size(), "%s", item ? "True" : "False")); - } - bool StrTo(const char8_t *buffer, bool &item) - { - if (AreEqualCaseless(buffer, "True")) - item = true; - else - item = false; - return true; - } -}; -template <> -struct WStrOps<QT3DSU8> -{ - QT3DSU32 ToStr(QT3DSU8 item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>( - swprintf(buffer.begin(), buffer.size(), L"%hu", static_cast<QT3DSU16>(item))); - } - bool StrTo(const char8_t *buffer, QT3DSU8 &item) - { - item = static_cast<QT3DSU8>(strtoul(buffer, NULL, 10)); - return true; - } -}; -template <> -struct WStrOps<QT3DSI8> -{ - QT3DSU32 ToStr(QT3DSI8 item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>( - swprintf(buffer.begin(), buffer.size(), L"%hd", static_cast<QT3DSI16>(item))); - } - bool StrTo(const char8_t *buffer, QT3DSI8 &item) - { - item = static_cast<QT3DSI8>(strtol(buffer, NULL, 10)); - return true; - } -}; -template <> -struct WStrOps<QT3DSU16> -{ - QT3DSU32 ToStr(QT3DSU16 item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%hu", item)); - } - bool StrTo(const char8_t *buffer, QT3DSU16 &item) - { - item = static_cast<QT3DSU16>(strtoul(buffer, NULL, 10)); - return true; - } -}; -template <> -struct WStrOps<QT3DSI16> -{ - QT3DSU32 ToStr(QT3DSI16 item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%hd", item)); - } - QT3DSU32 ToStr(QT3DSI16 item, NVDataRef<char8_t> buffer) - { - return static_cast<QT3DSU32>(sprintf(buffer.begin(), "%hd", item)); - } - bool StrTo(const char8_t *buffer, QT3DSI16 &item) - { - item = static_cast<QT3DSI16>(strtol(buffer, NULL, 10)); - return true; - } -}; - -template <> -struct WStrOps<QT3DSU32> -{ - QT3DSU32 ToStr(QT3DSU32 item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%lu", item)); - } - QT3DSU32 ToStr(QT3DSU32 item, NVDataRef<char8_t> buffer) - { - // hope the buffer is big enough... - return static_cast<QT3DSU32>(sprintf(buffer.begin(), "%u", item)); - } - bool StrTo(const char8_t *buffer, QT3DSU32 &item) - { - item = strtoul(buffer, NULL, 10); - return true; - } -}; - -template <> -struct WStrOps<QT3DSI32> -{ - QT3DSU32 ToStr(QT3DSI32 item, NVDataRef<wchar_t> buffer) - { - return static_cast<QT3DSU32>(swprintf(buffer.begin(), buffer.size(), L"%ld", item)); - } - bool StrTo(const char8_t *buffer, QT3DSI32 &item) - { - item = strtol(buffer, NULL, 10); - return true; - } -}; -template <> -struct WStrOps<QT3DSF32> -{ - QT3DSU32 ToStr(QT3DSF32 item, NVDataRef<wchar_t> buffer) - { - QString s = QLocale::c().toString(item); - wcsncpy(buffer.begin(), s.toStdWString().c_str(), buffer.size()); - return s.length(); - } - QT3DSU32 ToStr(QT3DSF32 item, NVDataRef<char8_t> buffer) - { - QString s = QLocale::c().toString(item); - strncpy(buffer.begin(), s.toStdString().c_str(), buffer.size()); - return s.length(); - } - bool StrTo(const char8_t *buffer, QT3DSF32 &item) - { - bool ok; - item = QLocale::c().toFloat(buffer, &ok); - return ok; - } -}; - -template <> -struct WStrOps<QT3DSF64> -{ - QT3DSU32 ToStr(QT3DSF64 item, NVDataRef<wchar_t> buffer) - { - QString s = QLocale::c().toString(item); - wcsncpy(buffer.begin(), s.toStdWString().c_str(), buffer.size()); - return s.length(); - } - bool StrTo(const char8_t *buffer, QT3DSF64 &item) - { - bool ok; - item = QLocale::c().toDouble(buffer, &ok); - return ok; - } -}; -#define QT3DS_WCHAR_T_None L"None" -#define QT3DS_WCHAR_T_Float L"Float" -#define QT3DS_WCHAR_T_Float2 L"Float2" -#define QT3DS_WCHAR_T_Float3 L"Float3" -#define QT3DS_WCHAR_T_Float4 L"Float4" -#define QT3DS_WCHAR_T_Long L"Long" -#define QT3DS_WCHAR_T_String L"String" -#define QT3DS_WCHAR_T_Bool L"Bool" -#define QT3DS_WCHAR_T_Long4 L"Long4" -#define QT3DS_WCHAR_T_StringRef L"StringRef" -#define QT3DS_WCHAR_T_ObjectRef L"ObjectRef" -#define QT3DS_WCHAR_T_StringOrInt L"StringOrInt" -#define QT3DS_WCHAR_T_FloatList L"FloatList" - -#define QT3DS_IMPORT_ITERATE_DMTYPE \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::None, None, QT3DSF32) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float, Float, QT3DSF32) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float2, Float2, SFloat2) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float3, Float3, SFloat3) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Float4, Float4, SFloat4) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Long, Long, QT3DSI32) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::String, String, TDataStrPtr) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Bool, Bool, bool) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::Long4, Long4, SLong4) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::StringRef, StringRef, SStringRef) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::ObjectRef, ObjectRef, SObjectRefType) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::StringOrInt, StringOrInt, SStringOrInt) \ - QT3DS_IMPORT_HANDLE_DMTYPE(DataModelDataType::FloatList, FloatList, TFloatList) - -template <> -struct WStrOps<DataModelDataType::Value> -{ - QT3DSU32 ToStr(DataModelDataType::Value item, NVDataRef<wchar_t> buffer) - { - const wchar_t *data = NULL; - switch (item) { -#define QT3DS_IMPORT_HANDLE_DMTYPE(x, y, z) \ - case x: \ - data = QT3DS_WCHAR_T_##y; \ - break; - QT3DS_IMPORT_ITERATE_DMTYPE -#undef QT3DS_IMPORT_HANDLE_DMTYPE - default: - break; - } - if (data == NULL) { - QT3DS_ASSERT(false); - data = L"Unknown"; - } - return (QT3DSU32)swprintf(buffer.begin(), buffer.size(), L"%ls", data); - } - bool StrTo(const wchar_t *buffer, DataModelDataType::Value &item) - { -#define QT3DS_IMPORT_HANDLE_DMTYPE(x, y, z) \ - if (AreEqual(buffer, QT3DS_WCHAR_T_##y)) { \ - item = x; \ - return true; \ - } - QT3DS_IMPORT_ITERATE_DMTYPE -#undef QT3DS_IMPORT_HANDLE_DMTYPE - item = DataModelDataType::None; - return false; - } -}; -template <typename TBufferType> -struct WStrOpsDMWriter -{ - TBufferType &buf; - WStrOpsDMWriter(TBufferType &_buf) - : buf(_buf) - { - } - - void operator()(float val) { buf.Write(val); } - void operator()(const SFloat2 &val) { buf.Write(NVConstDataRef<QT3DSF32>(&val[0], 2)); } - void operator()(const SFloat3 &val) { buf.Write(NVConstDataRef<QT3DSF32>(&val[0], 3)); } - void operator()(const SFloat4 &val) { buf.Write(NVConstDataRef<QT3DSF32>(&val[0], 4)); } - void operator()(QT3DSI32 val) { buf.Write(val); } - void operator()(bool val) { buf.Write(val); } - void operator()(const TDataStrPtr &val) - { - if (val != NULL) - buf.Write(NVConstDataRef<wchar_t>(val->GetData(), (QT3DSU32)val->GetLength())); - } - void operator()(const SLong4 &val) - { - buf.Write(NVConstDataRef<QT3DSU32>(&val.m_Longs[0], 4), 4); - } - void operator()(const SStringRef &val) { buf.Write(val.m_Id, (QT3DSU32)wcslen(val.m_Id) + 1); } - void operator()(const SObjectRefType &val) { val.m_Value.visit<void>(*this); } - void operator()(const SStringOrInt &val) { val.m_Value.visit<void>(*this); } - void operator()(const TFloatList &val) - { - buf.Write(NVConstDataRef<float>(val.data(), (QT3DSU32)val.size())); - } - void operator()() { QT3DS_ASSERT(false); } -}; - -template <> -struct WStrOps<SValue> -{ - template <typename TBufferType> - void ToBuf(const SValue &item, TBufferType &outBuffer) - { - WStrOpsDMWriter<TBufferType> writer(outBuffer); - item.visit<void>(writer); - } - template <typename TBufferType> - SValue BufTo(DataModelDataType::Value type, TBufferType &inReader) - { - switch (type) { -#define QT3DS_IMPORT_HANDLE_DMTYPE(x, y, z) \ - case x: { \ - z retval; \ - Read(inReader, retval); \ - return retval; \ - } - QT3DS_IMPORT_ITERATE_DMTYPE -#undef QT3DS_IMPORT_HANDLE_DMTYPE - default: - break; - } - QT3DS_ASSERT(false); - return SValue(); - } - template <typename TBufferType> - void Read(TBufferType &reader, float &val) - { - reader.Read(val); - } - template <typename TBufferType> - void Read(TBufferType &reader, SFloat2 &val) - { - reader.ReadRef(NVDataRef<QT3DSF32>(&val[0], 2)); - } - template <typename TBufferType> - void Read(TBufferType &reader, SFloat3 &val) - { - reader.ReadRef(NVDataRef<QT3DSF32>(&val[0], 3)); - } - template <typename TBufferType> - void Read(TBufferType &reader, SFloat4 &val) - { - reader.ReadRef(NVDataRef<QT3DSF32>(&val[0], 4)); - } - template <typename TBufferType> - void Read(TBufferType &reader, QT3DSI32 &val) - { - reader.Read(val); - } - template <typename TBufferType> - void Read(TBufferType &reader, bool &val) - { - reader.Read(val); - } - template <typename TBufferType> - void Read(TBufferType &reader, TDataStrPtr &val) - { - NVConstDataRef<wchar_t> buffer; - reader.ReadBuffer(buffer); - val = std::make_shared<CDataStr>(buffer.begin(), buffer.size()); - } - template <typename TBufferType> - void Read(TBufferType &reader, SLong4 &val) - { - reader.ReadRef(NVDataRef<QT3DSU32>(&val.m_Longs[0], 4)); - } - template <typename TBufferType> - void Read(TBufferType &reader, SStringRef &val) - { - NVConstDataRef<wchar_t> buffer; - reader.ReadBuffer(buffer); - val = SStringRef(buffer.begin()); - } - template <typename TBufferType> - void Read(TBufferType &reader, TFloatList &val) - { - NVConstDataRef<QT3DSF32> buffer; - reader.ReadBuffer(buffer); - val.assign(buffer.begin(), buffer.end()); - } - template <typename TBufferType> - void Read(TBufferType &reader, SObjectRefType &val) - { - // Force the read to be as string; callers can always convert to a different - // format later if required. - TDataStrPtr theValue; - Read(reader, theValue); - val.m_Value = theValue; - } - template <typename TBufferType> - void Read(TBufferType &reader, SStringOrInt &val) - { - NVConstDataRef<char8_t> buffer; - reader.ReadBuffer(buffer); - if (buffer.size() == 0) - return; - - if ((buffer[0] >= '0' && buffer[0] <= '9') || buffer[0] == '-') { - QT3DSI32 theVal; - WStrOps<QT3DSI32>().StrTo(buffer.begin(), theVal); - val = SStringOrInt(theVal); - } else { - NVConstDataRef<wchar_t> wideBuffer; - reader.ReadBuffer(wideBuffer); - val = SStringOrInt(std::make_shared<CDataStr>(wideBuffer.begin())); - } - } -}; - -// Write the wchar_t but exlude the null terminator -// Meant to write data model values. -// Memory buffer contains a non-null-terminated -// wchar_t string -struct WCharTWriter -{ - MemoryBuffer<RawAllocator> &m_Buffer; - WCharTWriter(MemoryBuffer<RawAllocator> &buf) - : m_Buffer(buf) - { - } - void Write(const wchar_t *value, QT3DSU32 len = 0) - { - if (IsTrivial(value)) - return; - if (len == 0) - len = (QT3DSU32)wcslen(value); - m_Buffer.write(value, len); - } - void Write(wchar_t value) { m_Buffer.write(value); } - void Write(bool value) { Write(value ? L"True" : L"False"); } - - // Takes care of long and float - template <typename TDataType> - void Write(TDataType value) - { - wchar_t buf[256]; - QT3DSU32 numWritten = WStrOps<TDataType>().ToStr(value, NVDataRef<wchar_t>(buf, 256)); - if (numWritten) - Write((const wchar_t *)buf); - else { - QT3DS_ASSERT(false); - } - } - template <typename TDataType> - void Write(NVConstDataRef<TDataType> values, QT3DSU32 grouping = 6, QT3DSU32 tabCount = 0) - { - for (QT3DSU32 idx = 0; idx < values.size(); ++idx) { - if (idx) { - if ((idx % grouping) == 0) { - Write((wchar_t)'\n'); - for (QT3DSU32 tabIdx = 0; tabIdx < tabCount; ++tabIdx) - Write((wchar_t)'\t'); - } else - Write((wchar_t)' '); - } - Write(values[idx]); - } - } - - void Write(NVConstDataRef<wchar_t> values, QT3DSU32 ignored = 6) - { - (void)ignored; - if (values.size() && values[0] != 0) { - QT3DSU32 lastItem = values.size() - 1; - if (values[lastItem] == 0) - --lastItem; - Write(values.begin(), lastItem + 1); - } - } -}; - -inline bool IsWhite(wchar_t value) -{ - return value == '\n' || value == '\r' || value == ' ' || value == '\t'; -} - -// skip until we find whitespace. -inline wchar_t *FindNextWhitespace(wchar_t *input) -{ - if (input == NULL) - return input; - wchar_t *marker = input; - // Empty loop intentional - for (; *marker && !IsWhite(*marker); ++marker) - ; - return marker; -} - -// skip until we find whitespace. -inline char8_t *FindNextWhitespace(char8_t *input) -{ - if (input == NULL) - return input; - char8_t *marker = input; - // Empty loop intentional - for (; *marker && !IsWhite(*marker); ++marker) - ; - return marker; -} - -// skip until we find something that isn't whitespace. -inline wchar_t *FindNextNonWhitespace(wchar_t *input) -{ - if (input == NULL) - return input; - wchar_t *marker = input; - // Empty loop intentional - for (; *marker && IsWhite(*marker); ++marker) - ; - return marker; -} - -inline char8_t *FindNextNonWhitespace(char8_t *input) -{ - if (input == NULL) - return input; - char8_t *marker = input; - // Empty loop intentional - for (; *marker && IsWhite(*marker); ++marker) - ; - return marker; -} - -// Reading is destructive in the case of floating point lists, so we may -// destroy the incoming string. -// We are assuming the string is null-terminated at end ptr. -struct WCharTReader -{ - char8_t *m_StartPtr; - // Buffer used for temp storage - MemoryBuffer<RawAllocator> &m_Buffer; - IStringTable &m_StringTable; - WCharTReader(char8_t *sp, MemoryBuffer<RawAllocator> &buf, IStringTable &inStringTable) - : m_StartPtr(sp) - , m_Buffer(buf) - , m_StringTable(inStringTable) - { - } - void Read(const char8_t *&outPtr) { outPtr = m_StartPtr; } - void Read(const wchar_t *&outPtr) { outPtr = m_StringTable.GetWideStr(m_StartPtr); } - template <typename TDataType> - void Read(TDataType &data) - { - bool success = WStrOps<TDataType>().StrTo(m_StartPtr, data); - QT3DS_ASSERT(success); - (void)success; - } - // Destructive operation because we can't trust - // strtod to do the right thing. On windows, for long strings, - // it calls strlen every operation thus leading to basically N^2 - // behavior - template <typename TDataType> - void ReadRef(NVDataRef<TDataType> data) - { - QT3DSU32 idx = 0; - m_StartPtr = FindNextNonWhitespace(m_StartPtr); - for (; idx < data.size() && m_StartPtr && *m_StartPtr; ++idx) { - char8_t *nextPtr = FindNextWhitespace(m_StartPtr); - if (nextPtr && *nextPtr) - *nextPtr = 0; - else - nextPtr = NULL; - WStrOps<TDataType>().StrTo(m_StartPtr, data[idx]); - m_StartPtr = nextPtr; - if (m_StartPtr) - m_StartPtr = FindNextNonWhitespace(m_StartPtr + 1); - } - } - - void ReadBuffer(NVConstDataRef<char8_t> &outBuffer) - { - if (m_StartPtr && *m_StartPtr) { - QT3DSU32 len = (QT3DSU32)strlen(m_StartPtr); - outBuffer = NVConstDataRef<char8_t>(m_StartPtr, len + 1); - } - } - void ReadBuffer(NVConstDataRef<wchar_t> &outBuffer) - { - if (m_StartPtr && *m_StartPtr) { - QT3DSU32 len = (QT3DSU32)strlen(m_StartPtr); - outBuffer = NVConstDataRef<wchar_t>(m_StringTable.GetWideStr(m_StartPtr), len + 1); - } - } - - // Destructive operation because we can't trust - // strtod to do the right thing. On windows, for long strings, - // it calls strlen every operation thus leading to basically N^2 - // behavior - template <typename TDataType> - void ReadBuffer(NVConstDataRef<TDataType> &outBuffer) - { - m_Buffer.clear(); - m_StartPtr = FindNextNonWhitespace(m_StartPtr); - while (m_StartPtr && *m_StartPtr) { - char8_t *nextPtr = FindNextWhitespace(m_StartPtr); - if (nextPtr && *nextPtr) - *nextPtr = 0; - else - nextPtr = NULL; - TDataType temp; - WStrOps<TDataType>().StrTo(m_StartPtr, temp); - m_Buffer.write(temp); - m_StartPtr = nextPtr; - if (m_StartPtr) - m_StartPtr = FindNextNonWhitespace(m_StartPtr + 1); - } - QT3DSU32 numItems = m_Buffer.size() / sizeof(TDataType); - if (numItems) - outBuffer = NVConstDataRef<TDataType>((TDataType *)m_Buffer.begin(), numItems); - else - outBuffer = NVConstDataRef<TDataType>(); - } -}; - -template <> -struct WStrOps<CDataModelHandle> -{ - template <typename THandleType> - QT3DSU32 ToStr(THandleType item, NVDataRef<wchar_t> buffer) - { - int theValue(item); - return WStrOps<int>().ToStr(theValue, buffer); - } - template <typename THandleType> - bool StrTo(const char8_t *buffer, THandleType &item) - { - int theValue; - bool retval = WStrOps<int>().StrTo(buffer, theValue); - item = theValue; - return retval; - } -}; - -#define IMPLEMENT_HANDLE_WSTROPS(HandleType) \ - template <> \ - struct WStrOps<HandleType> : public WStrOps<CDataModelHandle> \ - { \ - }; -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMInstanceHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMPropertyHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMSlideHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMSlideGraphHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMAnimationHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMKeyframeHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMActionHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMHandlerArgHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMEventHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMHandlerHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMHandlerParamHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMMetaDataPropertyHandle); -IMPLEMENT_HANDLE_WSTROPS(Qt3DSDMCategoryHandle); -#undef IMPLEMENT_HANDLE_WSTROPS - -template <> -struct WStrOps<EAnimationType> -{ - QT3DSU32 ToStr(EAnimationType value, NVDataRef<wchar_t> buffer) - { - const wchar_t *animType = NULL; - switch (value) { - case EAnimationTypeLinear: - animType = L"Linear"; - break; - case EAnimationTypeBezier: - animType = L"Bezier"; - break; - case EAnimationTypeEaseInOut: - animType = L"EaseInOut"; - break; - default: - QT3DS_ASSERT(false); - break; - } - if (animType != NULL) - return swprintf(buffer.begin(), buffer.size(), L"%ls", animType); - else { - QT3DS_ASSERT(false); - return 0; - } - } - bool StrTo(const wchar_t *buffer, EAnimationType &item) - { - if (AreEqual(L"Linear", buffer)) { - item = EAnimationTypeLinear; - return true; - } - if (AreEqual(L"Bezier", buffer)) { - item = EAnimationTypeBezier; - return true; - } - if (AreEqual(L"EaseInOut", buffer)) { - item = EAnimationTypeEaseInOut; - return true; - } - return false; - } -}; - -// Implemented in UICDMMetaData.h -template <> -struct WStrOps<CompleteMetaDataType::Enum> -{ - QT3DSU32 ToStr(CompleteMetaDataType::Enum item, NVDataRef<wchar_t> buffer); - bool StrTo(const wchar_t *buffer, CompleteMetaDataType::Enum &item); -}; - -template <> -struct WStrOps<HandlerArgumentType::Value> -{ - QT3DSU32 ToStr(HandlerArgumentType::Value item, NVDataRef<wchar_t> buffer); - bool StrTo(const wchar_t *buffer, HandlerArgumentType::Value &item); -}; - -#ifndef __clang__ -#ifndef __INTEGRITY -// IDOMReader implementations -template <typename TDataType> -bool IDOMReader::ValueList(NVDataRef<TDataType> data) -{ - const wchar_t *value; - if (Value(value)) { - WCharTReader reader(const_cast<wchar_t *>(value), m_TempBuf); - reader.ReadRef(data); - } - return true; -} - -// Destructive operation because we can't trust -// strtod to do the right thing. On windows, for long strings, -// it calls strlen every operation thus leading to basically N^2 -// behavior -template <typename TDataType> -NVConstDataRef<TDataType> IDOMReader::ChildValueList(TWideXMLCharPtr listName) -{ - NVConstDataRef<TDataType> retval; - TWideXMLCharPtr childValue = NULL; - if (ChildValue(listName, childValue)) { - WCharTReader reader(const_cast<wchar_t *>(childValue), m_TempBuf); - reader.ReadBuffer(retval); - } - return retval; -} -#endif -#endif -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMWindowsCompatibility.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMWindowsCompatibility.h deleted file mode 100644 index 0a53c71c..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMWindowsCompatibility.h +++ /dev/null @@ -1,182 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DSDM_WINDOWS_COMPATIBILITY_H -#define QT3DSDM_WINDOWS_COMPATIBILITY_H -#include "EABase/config/eaplatform.h" -#include "EABase/eabase.h" -#include <string> -#ifndef __INTEGRITY -#include <memory.h> -#endif -#include <string.h> -#include <stdio.h> - -#if defined QT3DS_PLATFORM_NEEDS_WCHAR_T - -inline size_t wcslen(const wchar_t *inStr) -{ - size_t retval = 0; - while (inStr && *inStr) { - ++retval; - ++inStr; - } - return retval; -} - -inline int wmemcmp(const wchar_t *lhs, const wchar_t *rhs, size_t count) -{ - return memcmp(lhs, rhs, count * sizeof(wchar_t)); -} - -inline wchar_t *wmemcpy(wchar_t *dest, const wchar_t *src, size_t count) -{ - memcpy(dest, src, count * sizeof(wchar_t)); - return dest; -} - -inline const wchar_t *wmemchr(const wchar_t *inFirst, size_t count, const wchar_t val) -{ - size_t idx; - // empty loop intentional - for (idx = 0; idx < count && inFirst[idx] != val; ++idx) { - } - if (idx < count) - return inFirst + idx; - return NULL; -} - -inline wchar_t *wmemmove(wchar_t *dest, const wchar_t *src, size_t count) -{ - memmove(dest, src, count * sizeof(wchar_t)); - return dest; -} - -inline wchar_t *wmemset(wchar_t *dest, size_t count, wchar_t val) -{ - for (size_t idx = 0; idx < count; ++idx) - dest[idx] = val; - return dest; -} - -#endif - -inline size_t WideToNarrow(char *inDest, size_t inDestLen, const wchar_t *inWideStr); -template <unsigned int N> -inline size_t WideToNarrow(char (&inDest)[N], const wchar_t *inWideStr); - -#if !defined EA_PLATFORM_WINDOWS - -inline void wcscpy_s(wchar_t *inDest, size_t destLen, const wchar_t *inMessage) -{ - if (destLen) { - size_t idx = 0; - while (inMessage && *inMessage && idx < destLen) { - inDest[idx] = *inMessage; - ++inMessage; - ++idx; - } - - idx = idx < destLen ? idx : destLen - 1; - inDest[idx] = 0; - } -} - -template <unsigned int N> -inline void wcscpy_s(wchar_t (&inDest)[N], const wchar_t *inMessage) -{ - wcscpy_s(inDest, N, inMessage); -} - -inline FILE *_wfopen(const wchar_t *inFname, const wchar_t *inFlags) -{ - char name[1024] = { 0 }; - WideToNarrow(name, inFname); - char flags[24] = { 0 }; - WideToNarrow(flags, inFlags); - return fopen(name, flags); -} - -inline int _fseeki64(FILE *inFile, int64_t pos, int seekFlags) -{ - return fseek(inFile, (int32_t)pos, seekFlags); -} - -inline int64_t _ftelli64(FILE *inFile) -{ - return ftell(inFile); -} - -#define _snprintf snprintf - -#endif - -template <typename TLHS, typename TRHS> -inline size_t ConvertStr(TLHS *inDest, size_t inDestLen, const TRHS *inWideStr) -{ - if (inDestLen == 0) - return 0; - - size_t nameLen = 0; - - // empty loop intentional. - for (const TRHS *tempPtr = inWideStr; tempPtr && *tempPtr; ++tempPtr, ++nameLen) { - } - - if (nameLen > inDestLen - 1) - nameLen = inDestLen - 1; - for (size_t idx = 0; idx < nameLen; ++idx) - inDest[idx] = (char)inWideStr[idx]; - inDest[nameLen] = 0; - return nameLen; -} - -inline size_t WideToNarrow(char *inDest, size_t inDestLen, const wchar_t *inWideStr) -{ - return ConvertStr(inDest, inDestLen, inWideStr); -} - -template <unsigned int N> -inline size_t WideToNarrow(char (&inDest)[N], const wchar_t *inWideStr) -{ - return WideToNarrow(inDest, N, inWideStr); -} - -inline size_t WideToNarrow(char *inDest, size_t inDestLen, const char16_t *inWideStr) -{ - return ConvertStr(inDest, inDestLen, inWideStr); -} - -template <unsigned int N> -inline size_t WideToNarrow(char (&inDest)[N], const char16_t *inWideStr) -{ - return WideToNarrow(inDest, N, inWideStr); -} - -#endif
\ No newline at end of file diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMXML.cpp b/src/Authoring/QT3DSDM/Systems/Qt3DSDMXML.cpp deleted file mode 100644 index 3d79ca33..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMXML.cpp +++ /dev/null @@ -1,1315 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "Qt3DSDMXML.h" -#include "foundation/Qt3DSPool.h" -#include "foundation/Qt3DSAtomic.h" -#include "foundation/Qt3DSRefCounted.h" -#include "Qt3DSDMStringTable.h" -#include "Qt3DSDMWStrOpsImpl.h" -#include <memory> -#include "foundation/StrConvertUTF.h" -#include "foundation/StringTable.h" -#include "utf8.h" -#ifdef QT3DS_VC -#include <winsock2.h> -#include <windows.h> //output debug string -#endif - -#include <QtCore/qxmlstream.h> - -typedef char XML_Char; -typedef char XML_LChar; - -using namespace qt3dsdm; -using std::shared_ptr; -using namespace qt3ds::foundation; -using qt3ds::foundation::Pool; - -#define QT3DSXML_FOREACH(idxnm, val) \ - for (QT3DSU32 idxnm = 0, __numItems = (QT3DSU32)val; idxnm < __numItems; ++idxnm) - -namespace qt3dsdm { - -// All names are string table values so we can do straight -// pointer comparisons on them, we don't have the compare their -// values. -struct SDOMAttribute -{ - TXMLCharPtr m_Name; - TXMLCharPtr m_Value; - SDOMAttribute *m_NextAttribute; - - SDOMAttribute(TXMLCharPtr nm, TXMLCharPtr val) - : m_Name(nm) - , m_Value(val) - , m_NextAttribute(NULL) - { - } -}; - -struct SDOMElement -{ - TXMLCharPtr m_Name; - SDOMAttribute *m_FirstAttribute; - SDOMAttribute *m_LastAttribute; - SDOMElement *m_Parent; - SDOMElement *m_FirstChild; - SDOMElement *m_LastChild; - SDOMElement *m_NextSibling; - TXMLCharPtr m_Value; - - SDOMElement(TXMLCharPtr nm) - : m_Name(nm) - , m_FirstAttribute(NULL) - , m_LastAttribute(NULL) - , m_Parent(NULL) - , m_FirstChild(NULL) - , m_LastChild(NULL) - , m_NextSibling(NULL) - , m_Value("") - { - } - - void AddAttribute(SDOMAttribute &att) - { - if (m_LastAttribute) { - m_LastAttribute->m_NextAttribute = &att; - m_LastAttribute = &att; - } else { - QT3DS_ASSERT(m_FirstAttribute == NULL); - m_FirstAttribute = m_LastAttribute = &att; - } - } - // Used to ensure duplicate attributes can't happen - void SetAttributeValue(TXMLCharPtr inName, TXMLCharPtr inValue, IDOMFactory &inFactory, - const SDOMFlags &inFlags) - { - inName = inFactory.GetStringTable()->RegisterStr(inName); - SDOMAttribute *att = FindAttribute(inName, inFlags); - if (att) { - att->m_Value = inFactory.RegisterValue(inValue); - } else { - AddAttribute(*inFactory.NextAttribute(inName, inValue)); - } - } - void SetAttributeValue(TWideXMLCharPtr inName, TWideXMLCharPtr inValue, IDOMFactory &inFactory, - const SDOMFlags &inFlags) - { - TXMLCharPtr theName = inFactory.GetStringTable()->GetNarrowStr(inName); - SDOMAttribute *att = FindAttribute(theName, inFlags); - if (att) { - att->m_Value = inFactory.RegisterValue(inValue); - } else { - AddAttribute( - *inFactory.NextAttribute(inFactory.GetStringTable()->GetWideStr(inName), inValue)); - } - } - const SDOMAttribute *FindAttribute(TXMLCharPtr nm, const SDOMFlags &inFlags) const - { - return const_cast<SDOMElement *>(this)->FindAttribute(nm, inFlags); - } - SDOMAttribute *FindAttribute(TXMLCharPtr nm, const SDOMFlags &inFlags) - { - for (SDOMAttribute *att = m_FirstAttribute; att != NULL; att = att->m_NextAttribute) { - if (att->m_Name == nm) - return att; - else if (inFlags.CaselessAttributes() && AreEqualCaseless(nm, att->m_Name)) - return att; - } - return NULL; - } - void RemoveAttribute(TXMLCharPtr nm, const SDOMFlags &inFlags) - { - SDOMAttribute *preatt = m_FirstAttribute; - for (SDOMAttribute *att = m_FirstAttribute; att != NULL; - preatt = att, att = att->m_NextAttribute) { - if (att->m_Name == nm - || (inFlags.CaselessAttributes() && AreEqualCaseless(nm, att->m_Name))) { - if (att == m_FirstAttribute) { - m_FirstAttribute = att->m_NextAttribute; - } else { - preatt->m_NextAttribute = att->m_NextAttribute; - if (att == m_LastAttribute) - m_LastAttribute = preatt; - } - - att->m_NextAttribute = NULL; - } - } - } - TXMLCharPtr GetAttributeValue(TXMLCharPtr nm, SDOMFlags &inFlags) const - { - const SDOMAttribute *att = FindAttribute(nm, inFlags); - if (att) - return att->m_Value; - return NULL; - } - void AddChild(SDOMElement &elem) - { - elem.m_Parent = this; - if (m_LastChild) { - m_LastChild->m_NextSibling = &elem; - m_LastChild = &elem; - } else { - QT3DS_ASSERT(m_FirstChild == NULL); - m_FirstChild = m_LastChild = &elem; - } - } - SDOMElement *FindPreviousChild(SDOMElement &elem) - { - if (&elem == m_FirstChild) - return NULL; - // Find the previous sibling. - SDOMElement *theChild = m_FirstChild; - // Empty loop intentional - for (; theChild && theChild->m_NextSibling != &elem; theChild = theChild->m_NextSibling) { - } - - return theChild; - } - void RemoveChild(SDOMElement &elem) - { - if (elem.m_Parent != this) { - QT3DS_ASSERT(false); - return; - } - elem.m_Parent = NULL; - if (&elem == m_FirstChild) { - m_FirstChild = elem.m_NextSibling; - } else { - SDOMElement *theChild(FindPreviousChild(elem)); - QT3DS_ASSERT(theChild); - if (theChild) { - theChild->m_NextSibling = elem.m_NextSibling; - if (&elem == m_LastChild) - m_LastChild = theChild; - } - } - elem.m_NextSibling = NULL; - } - - void ReplaceChild(SDOMElement &inChild, SDOMElement &inReplacement) - { - inChild.m_Parent = NULL; - if (&inChild == m_FirstChild) - m_FirstChild = &inReplacement; - else { - SDOMElement *theChild(FindPreviousChild(inChild)); - QT3DS_ASSERT(theChild); - if (theChild) { - theChild->m_NextSibling = &inReplacement; - if (&inChild == m_LastChild) - m_LastChild = &inReplacement; - } - } - inReplacement.m_NextSibling = inChild.m_NextSibling; - inReplacement.m_Parent = this; - inChild.m_NextSibling = NULL; - } - - void InsertChildBefore(SDOMElement &elem, SDOMElement &theSibling) - { - // Ensure elem isn't in the graph. - QT3DS_ASSERT(elem.m_Parent == NULL); - QT3DS_ASSERT(elem.m_NextSibling == NULL); - elem.m_Parent = this; - if (&theSibling == m_FirstChild) - m_FirstChild = &elem; - else { - SDOMElement *thePrevious = FindPreviousChild(theSibling); - QT3DS_ASSERT(thePrevious); - if (thePrevious) - thePrevious->m_NextSibling = &elem; - } - - elem.m_NextSibling = &theSibling; - } - QT3DSU32 GetNumChildren(TXMLCharPtr inChildName, const SDOMFlags &inFlags) const - { - QT3DSU32 idx = 0; - for (SDOMElement *elem = m_FirstChild; elem != NULL; elem = elem->m_NextSibling) { - if (elem->m_Name == inChildName) - ++idx; - else if (inFlags.CaselessElements() && AreEqualCaseless(inChildName, elem->m_Name)) - ++idx; - } - return idx; - } - QT3DSU32 GetNumChildren() const - { - QT3DSU32 idx = 0; - for (SDOMElement *elem = m_FirstChild; elem != NULL; elem = elem->m_NextSibling) - ++idx; - return idx; - } - SDOMElement *FindChildByName(TXMLCharPtr nm, const SDOMFlags &inFlags) const - { - for (SDOMElement *elem = m_FirstChild; elem != NULL; elem = elem->m_NextSibling) { - if (elem->m_Name == nm) - return elem; - else if (inFlags.CaselessElements() && AreEqualCaseless(nm, elem->m_Name)) - return elem; - } - return NULL; - } - SDOMElement *FindNextSiblingByName(TXMLCharPtr nm, const SDOMFlags &inFlags) const - { - for (SDOMElement *elem = m_NextSibling; elem != NULL; elem = elem->m_NextSibling) { - if (elem->m_Name == nm) - return elem; - else if (inFlags.CaselessElements() && AreEqualCaseless(nm, elem->m_Name)) - return elem; - } - return NULL; - } -}; -} - -namespace { - -const QT3DSU16 g_BOMMarker = (QT3DSU16)0xFEFF; - -struct SElemPointer : eastl::pair<SDOMElement *, SDOMAttribute *> -{ - SElemPointer(SDOMElement *elem = NULL) - : eastl::pair<SDOMElement *, SDOMAttribute *>(elem, NULL) - { - } - SElemPointer &operator=(SDOMElement *elem) - { - first = elem; - second = NULL; - return *this; - } - SElemPointer &operator=(SDOMAttribute *att) - { - second = att; - return *this; - } - SElemPointer &operator=(const eastl::pair<SDOMElement *, SDOMAttribute *> &other) - { - eastl::pair<SDOMElement *, SDOMAttribute *>::operator=(other); - return *this; - } - operator SDOMElement *() const { return first; } - SDOMElement *operator->() const { return first; } -}; - -// Some DOM parsing operations are destructive. If you need -// them to not be destructive, then we need to modify -// the reader. Specifically parsing lists of floats, due -// to a bug in strtod, is destructive. -struct SDOMReader : public IDOMReader -{ - SElemPointer m_TopElement; - eastl::vector<eastl::pair<SDOMElement *, SDOMAttribute *>> m_ScopeStack; - std::shared_ptr<IDOMFactory> m_Factory; - SDOMFlags m_Flags; - eastl::basic_string<TWCharEASTLConverter::TCharType> m_TempBuffer; - - SDOMReader(SDOMElement &te, std::shared_ptr<qt3dsdm::IStringTable> s, - std::shared_ptr<IDOMFactory> inFactory = std::shared_ptr<IDOMFactory>()) - : IDOMReader(s) - , m_TopElement(&te) - , m_Factory(inFactory) - { - } - - SDOMElement *Current() const { return m_TopElement.first; } - void SetDOMFlags(SDOMFlags inFlags) override { m_Flags = inFlags; } - SDOMFlags GetDOMFlags() const override { return m_Flags; } - - void PushScope() override { m_ScopeStack.push_back(m_TopElement); } - void PopScope() override - { - if (m_ScopeStack.size()) { - m_TopElement = m_ScopeStack.back(); - m_ScopeStack.pop_back(); - } else - m_TopElement = eastl::pair<SDOMElement *, SDOMAttribute *>(NULL, NULL); - } - - void *GetScope() override { return m_TopElement.first; } - - void SetScope(void *inScope) override - { - m_TopElement = - eastl::make_pair(reinterpret_cast<SDOMElement *>(inScope), (SDOMAttribute *)NULL); - } - - TWideXMLCharPtr GetElementName() const override - { - return m_StringTable->GetWideStr(GetNarrowElementName()); - } - - TXMLCharPtr GetNarrowElementName() const override - { - if (!Current()) { - QT3DS_ASSERT(false); - return NULL; - } - return Current()->m_Name; - } - - bool UnregisteredAtt(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) override - { - outValue = L""; - SDOMElement *current(Current()); - if (current) { - TXMLCharPtr theValue = - current->GetAttributeValue(m_StringTable->GetNarrowStr(name), m_Flags); - if (theValue && *theValue) { - qt3ds::foundation::ConvertUTF(theValue, 0, m_TempBuffer); - outValue = reinterpret_cast<const wchar_t *>(m_TempBuffer.c_str()); - return true; - } - } else { - QT3DS_ASSERT(false); - } - return false; - } - - bool UnregisteredAtt(TXMLCharPtr name, TXMLCharPtr &outValue) override - { - outValue = ""; - SDOMElement *current(Current()); - if (current) { - outValue = current->GetAttributeValue(m_StringTable->GetNarrowStr(name), m_Flags); - if (outValue) - return true; - } else { - QT3DS_ASSERT(false); - } - return false; - } - - bool Att(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) override - { - if (UnregisteredAtt(name, outValue)) { - outValue = m_StringTable->RegisterStr(outValue); - return true; - } - return false; - } - bool Att(TXMLCharPtr name, TXMLCharPtr &outValue) override - { - if (UnregisteredAtt(name, outValue)) { - outValue = m_StringTable->RegisterStr(outValue); - return true; - } - return false; - } - - QT3DSU32 CountChildren() override - { - SDOMElement *elem = Current(); - if (elem == NULL) { - QT3DS_ASSERT(false); - return 0; - } - return elem->GetNumChildren(); - } - - QT3DSU32 CountChildren(TWideXMLCharPtr childName) override - { - return CountChildren(m_StringTable->GetNarrowStr(childName)); - } - - QT3DSU32 CountChildren(TXMLCharPtr childName) override - { - SDOMElement *elem = Current(); - if (elem == NULL) { - QT3DS_ASSERT(false); - return 0; - } - return elem->GetNumChildren(m_StringTable->GetNarrowStr(childName), m_Flags); - } - - eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> - ToWide(const eastl::pair<TXMLCharPtr, TXMLCharPtr> &att) - { - return eastl::make_pair(m_StringTable->GetWideStr(att.first), - m_StringTable->GetWideStr(att.second)); - } - eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> CurrentAtt() - { - return ToWide(CurrentAttNarrow()); - } - - eastl::pair<TXMLCharPtr, TXMLCharPtr> CurrentAttNarrow() - { - if (m_TopElement.second) - return eastl::make_pair(m_TopElement.second->m_Name, m_TopElement.second->m_Value); - return eastl::make_pair("", ""); - } - eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowFirstAttribute() override - { - if (m_TopElement.first == NULL) { - QT3DS_ASSERT(false); - eastl::make_pair("", ""); - } - m_TopElement.second = m_TopElement.first->m_FirstAttribute; - return CurrentAttNarrow(); - } - - eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetFirstAttribute() override - { - return ToWide(GetNarrowFirstAttribute()); - } - eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowNextAttribute() override - { - if (m_TopElement.second) - m_TopElement.second = m_TopElement.second->m_NextAttribute; - return CurrentAttNarrow(); - } - - eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetNextAttribute() override - { - return ToWide(GetNarrowNextAttribute()); - } - - bool MoveToFirstChild() override - { - SDOMElement *elem = Current(); - if (elem == NULL) { - QT3DS_ASSERT(false); - return false; - } - if (elem->m_FirstChild) { - m_TopElement = elem->m_FirstChild; - return true; - } - return false; - } - bool MoveToFirstChild(TXMLCharPtr childName) override - { - SDOMElement *elem = Current(); - if (elem == NULL) { - QT3DS_ASSERT(false); - return false; - } - SDOMElement *child = elem->FindChildByName(m_StringTable->RegisterStr(childName), m_Flags); - if (child != NULL) { - m_TopElement = child; - return true; - } - return false; - } - - bool MoveToFirstChild(TWideXMLCharPtr childName) override - { - return MoveToFirstChild(m_StringTable->GetNarrowStr(childName)); - } - - bool MoveToNextSibling() override - { - SDOMElement *elem = Current(); - if (elem == NULL) { - QT3DS_ASSERT(false); - return false; - } - if (elem->m_NextSibling) { - m_TopElement = elem->m_NextSibling; - return true; - } - return false; - } - bool MoveToNextSibling(TXMLCharPtr childName) override - { - SDOMElement *elem = Current(); - if (elem == NULL) { - QT3DS_ASSERT(false); - return false; - } - SDOMElement *nextSibling = - elem->FindNextSiblingByName(m_StringTable->RegisterStr(childName), m_Flags); - if (nextSibling) { - m_TopElement = nextSibling; - return true; - } - return false; - } - bool MoveToNextSibling(TWideXMLCharPtr childName) override - { - return MoveToNextSibling(m_StringTable->GetNarrowStr(childName)); - } - // Leave element means go to its parent. - void Leave() override - { - if (m_TopElement) - m_TopElement = m_TopElement->m_Parent; - - QT3DS_ASSERT(m_TopElement); - } - bool Value(TXMLCharPtr &outValue) override - { - SDOMElement *current(Current()); - if (!current) { - QT3DS_ASSERT(false); - return false; - } - outValue = current->m_Value; - return true; - } - - bool Value(TWideXMLCharPtr &outValue) override - { - outValue = L""; - TXMLCharPtr theValue; - if (Value(theValue)) { - qt3ds::foundation::ConvertUTF(theValue, 0, m_TempBuffer); - outValue = reinterpret_cast<const wchar_t *>(m_TempBuffer.c_str()); - return true; - } - return false; - } - - SDOMElement *GetTopElement() override - { - SDOMElement *current(Current()); - while (current && current->m_Parent) - current = current->m_Parent; - return current; - } - - virtual std::shared_ptr<IDOMFactory> GetFactory() { return m_Factory; } -}; - -struct SDOMWriter : public IDOMWriter, public SDOMReader -{ - std::shared_ptr<IDOMFactory> m_FactoryPtr; - IDOMFactory &m_Factory; - - SDOMWriter(std::shared_ptr<IDOMFactory> inDOMFactory, - std::shared_ptr<qt3dsdm::IStringTable> inStringTable, SDOMElement &inTopElem) - : m_FactoryPtr(inDOMFactory) - , m_Factory(*inDOMFactory) - , SDOMReader(inTopElem, inStringTable) - { - } - void SetDOMFlags(SDOMFlags inFlags) override { m_Flags = inFlags; } - SDOMFlags GetDOMFlags() const override { return m_Flags; } - - void Begin(TXMLCharPtr inElemName) override - { - if (!m_TopElement) { - QT3DS_ASSERT(false); - return; - } - SDOMElement *current(Current()); - SDOMElement *newElement(m_Factory.NextElement(inElemName)); - current->AddChild(*newElement); - m_TopElement = newElement; - } - - void Begin(TWideXMLCharPtr inElemName) override - { - Begin(m_FactoryPtr->GetStringTable()->GetNarrowStr(inElemName)); - } - - void Att(TXMLCharPtr name, TXMLCharPtr value) override - { - if (!m_TopElement) { - QT3DS_ASSERT(false); - return; - } - m_TopElement->SetAttributeValue(name, value, m_Factory, m_Flags); - } - // Attributes. They may be sorted just before write - void Att(TWideXMLCharPtr name, TWideXMLCharPtr value) override - { - if (!m_TopElement) { - QT3DS_ASSERT(false); - return; - } - m_TopElement->SetAttributeValue(name, value, m_Factory, m_Flags); - } - - void Value(TWideXMLCharPtr value) override - { - if (!m_TopElement) { - QT3DS_ASSERT(false); - return; - } - if (value == NULL) - value = L""; - size_t len = wcslen(value); - m_Factory.AppendStrBuf(value, (QT3DSU32)len); - m_TopElement->m_Value = m_Factory.FinalizeStrBuf(); - } - void Value(TXMLCharPtr value) override - { - if (!m_TopElement) { - QT3DS_ASSERT(false); - return; - } - if (value == NULL) - value = ""; - size_t len = strlen(value); - m_Factory.AppendStrBuf(value, (QT3DSU32)len); - m_TopElement->m_Value = m_Factory.FinalizeStrBuf(); - } - - void End() override - { - if (!m_TopElement) { - QT3DS_ASSERT(false); - return; - } - Leave(); - } - void RemoveCurrent() override - { - SDOMElement *current(Current()); - if (!current) { - QT3DS_ASSERT(false); - return; - } - if (current->m_Parent) { - m_TopElement = current->m_Parent; - m_TopElement->RemoveChild(*current); - } - } - void ReplaceCurrent(SDOMElement &inElement) override - { - SDOMElement *current(Current()); - if (!current) { - QT3DS_ASSERT(false); - return; - } - if (current->m_Parent) { - current->m_Parent->ReplaceChild(*current, inElement); - m_TopElement = &inElement; - } else { - m_TopElement = &inElement; - inElement.m_Parent = NULL; - inElement.m_NextSibling = NULL; - } - } - void AppendChildren(SDOMElement &inElement) override - { - SDOMElement *current(Current()); - if (!current) { - QT3DS_ASSERT(false); - return; - } - SDOMElement *theChild = inElement.m_FirstChild; - inElement.m_FirstChild = inElement.m_LastChild = NULL; - while (theChild) { - SDOMElement *theCurrentChild = theChild; - theChild = theChild->m_NextSibling; - - theCurrentChild->m_Parent = NULL; - theCurrentChild->m_NextSibling = NULL; - current->AddChild(*theCurrentChild); - } - } - void RemoveAttribute(TXMLCharPtr inItem) override - { - SDOMElement *current(Current()); - if (!current) { - QT3DS_ASSERT(false); - return; - } - current->RemoveAttribute(m_StringTable->RegisterStr(inItem), m_Flags); - } - void RemoveAttribute(TWideXMLCharPtr inItem) override - { - RemoveAttribute(m_StringTable->GetNarrowStr(inItem)); - } - - void MoveBefore(TXMLCharPtr inItem, TXMLCharPtr inSibling) override - { - SDOMElement *current(Current()); - if (!current) { - QT3DS_ASSERT(false); - return; - } - - SDOMElement *theItem = - current->FindChildByName(m_StringTable->RegisterStr(inItem), m_Flags); - SDOMElement *theSibling = - current->FindChildByName(m_StringTable->RegisterStr(inSibling), m_Flags); - QT3DS_ASSERT(theItem && theSibling); - if (theItem && theSibling) { - current->RemoveChild(*theItem); - current->InsertChildBefore(*theItem, *theSibling); - } - } - - void MoveBefore(TWideXMLCharPtr inItem, TWideXMLCharPtr inSibling) override - { - MoveBefore(m_StringTable->GetNarrowStr(inItem), m_StringTable->GetNarrowStr(inSibling)); - } - - // If current has no parent, then we are at the top - // of the tree and we should return 0. Or if there is no - // current. - // If there is one parent, we should return 1. - QT3DSU32 GetTabs() override - { - QT3DSU32 retval = 0; - SDOMElement *current(Current()); - do { - if (current) - current = current->m_Parent; - if (current) - ++retval; - } while (current); - return retval; - } - - SDOMElement *GetTopElement() override { return SDOMReader::GetTopElement(); } - - std::shared_ptr<IDOMFactory> GetFactory() override { return m_FactoryPtr; } -}; - -struct SimpleXmlWriter -{ - IOutStream &m_Stream; - eastl::vector<eastl::pair<TXMLCharPtr, bool>> m_OpenElements; - bool m_ElementOpen; - wchar_t m_PrintBuf[256]; - QT3DSU32 m_Tabs; - eastl::basic_string<char8_t> m_ConvertBuf; - eastl::basic_string<TWCharEASTLConverter::TCharType> m_WideBuffer; - - SimpleXmlWriter(IOutStream &stream, QT3DSU32 inTabs = 0) - : m_Stream(stream) - , m_ElementOpen(false) - , m_Tabs(inTabs) - { - } - void Write(TWideXMLCharPtr data) - { - if (!IsTrivial(data)) { - qt3ds::foundation::ConvertUTF( - reinterpret_cast<const TWCharEASTLConverter::TCharType *>(data), 0, - m_ConvertBuf); - m_Stream.Write(m_ConvertBuf.begin(), m_ConvertBuf.size()); - } - } - void Write(const char8_t *data) - { - if (!IsTrivial(data)) { - m_Stream.Write(data, (QT3DSU32)strlen(data)); - } - } - void BeginWideWrite() { m_WideBuffer.clear(); } - void WriteTemp(wchar_t data) { m_WideBuffer.append(1, data); } - void WriteTemp(const wchar_t *data) - { - m_WideBuffer.append(reinterpret_cast<const TWCharEASTLConverter::TCharType *>(data)); - } - void EndWideWrite() { Write(reinterpret_cast<const wchar_t *>(m_WideBuffer.c_str())); } - void Write(char8_t data) { m_Stream.Write(data); } - void Tabs() - { - QT3DSXML_FOREACH(idx, (m_OpenElements.size() + m_Tabs)) - Write('\t'); - } - void Close(bool newline) - { - if (m_ElementOpen) { - Write(L" >"); - if (newline) - Write('\n'); - } - m_ElementOpen = false; - } - void Begin(TXMLCharPtr name) - { - Close(true); - Tabs(); - Write('<'); - Write(name); - m_OpenElements.push_back(eastl::pair<TXMLCharPtr, bool>(name, false)); - m_ElementOpen = true; - } - TWideXMLCharPtr ToStr(char8_t val) - { - m_PrintBuf[0] = val; - m_PrintBuf[1] = 0; - return m_PrintBuf; - } - template <typename TDataType> - TWideXMLCharPtr ToStr(TDataType val) - { - WStrOps<TDataType>().ToStr(val, NVDataRef<wchar_t>(m_PrintBuf, 256)); - return m_PrintBuf; - } - void Att(TXMLCharPtr name, TXMLCharPtr value) - { - QT3DS_ASSERT(m_ElementOpen); - Write(' '); - Write(name); - Write("=\""); - size_t valueLen = strlen(NonNull(value)); - TXMLCharPtr start = value; - TXMLCharPtr end = value + valueLen; - TXMLCharPtr last = start; - uint32_t item = 0; - // Write out the data escaping unicode values where necessary - // I am using utf8::internal because it returns an error code and does not through - // exceptions; we don't always know the system we are running on will support or handle - // exceptions gracefully. - for (utf8::internal::utf_error err_code = utf8::internal::validate_next(start, end, item); - last != end && err_code == utf8::internal::UTF8_OK; - err_code = utf8::internal::validate_next(start, end, item)) { - switch (item) { - case '\r': - break; - case '\n': - Write(" "); - break; - case '\t': - Write("	"); - break; - case '<': - Write("<"); - break; - case '>': - Write(">"); - break; - case '"': - Write("""); - break; - case '&': - Write("&"); - break; - default: - m_Stream.Write(NVConstDataRef<QT3DSU8>((const QT3DSU8 *)last, (QT3DSU32)(start - last))); - break; - } - last = start; - } - Write("\""); - } - template <typename TData> - void Att(TXMLCharPtr name, TData value) - { - Att(name, ToStr(value)); - } - - void Value(TXMLCharPtr value) - { - if (!IsTrivial(value)) { - Close(false); - size_t valueLen = strlen(NonNull(value)); - TXMLCharPtr start = value; - TXMLCharPtr end = value + valueLen; - TXMLCharPtr last = start; - uint32_t item = 0; - // Write out the data escaping unicode values where necessary - for (utf8::internal::utf_error err_code = - utf8::internal::validate_next(start, end, item); - last != end && err_code == utf8::internal::UTF8_OK; - err_code = utf8::internal::validate_next(start, end, item)) { - switch (item) { - case '<': - Write("<"); - break; - case '>': - Write(">"); - break; - case '&': - Write("&"); - break; - default: - m_Stream.Write(NVConstDataRef<QT3DSU8>((const QT3DSU8 *)last, (QT3DSU32)(start - last))); - break; - } - last = start; - } - m_OpenElements.back().second = true; - } - } - void ChildValue(TXMLCharPtr name, TXMLCharPtr value) - { - Begin(name); - Value(value); - End(); - } - void End(bool newlineAfterClose = true) - { - QT3DS_ASSERT(m_OpenElements.size()); - eastl::pair<TXMLCharPtr, bool> topElem = m_OpenElements.back(); - m_OpenElements.pop_back(); - if (m_ElementOpen) - Write(" />"); - else { - if (topElem.second == false) - Tabs(); - Write("</"); - Write(topElem.first); - Write(">"); - } - m_ElementOpen = false; - if (newlineAfterClose == true) - Write('\n'); - } -}; - -struct DOMParser -{ - typedef eastl::basic_string<TWCharEASTLConverter::TCharType> TStrType; - IDOMFactory &m_Factory; - SDOMElement *m_TopElement; - SDOMElement *m_FirstElement; - - DOMParser(IDOMFactory &factory) - : m_Factory(factory) - , m_FirstElement(NULL) - { - } - - template <QT3DSU32 THeaderLen> - struct SHeaderInStream : public IInStream - { - QT3DSU8 m_Header[THeaderLen]; - QT3DSU32 m_BytesRead; - IInStream &m_InStream; - SHeaderInStream(IInStream &inStream) - : m_InStream(inStream) - , m_BytesRead(0) - { - } - bool readHeader() - { - QT3DSU32 amountRead = m_InStream.Read(NVDataRef<QT3DSU8>(m_Header, THeaderLen)); - return amountRead == THeaderLen; - } - QT3DSU32 Read(NVDataRef<QT3DSU8> data) override - { - if (data.size() == 0) - return 0; - QT3DSU8 *writePtr(data.begin()); - QT3DSU32 amountToRead(data.size()); - QT3DSU32 amountRead = 0; - if (m_BytesRead < THeaderLen) { - QT3DSU32 headerLeft = qMin(THeaderLen - m_BytesRead, amountToRead); - memCopy(writePtr, m_Header + m_BytesRead, headerLeft); - writePtr += headerLeft; - amountToRead -= headerLeft; - amountRead += headerLeft; - } - if (amountToRead) - amountRead += m_InStream.Read(NVDataRef<QT3DSU8>(writePtr, amountToRead)); - m_BytesRead += amountRead; - return amountRead; - } - }; - - static SDOMElement *ParseXMLFile(IDOMFactory &factory, IInStream &inStream, - CXmlErrorHandler *handler = NULL) - { - QXmlStreamReader sreader; - - DOMParser domParser(factory); - QT3DSU8 dataBuf[2048]; - QT3DSU32 amountRead = 0; - do { - amountRead = inStream.Read(toDataRef(dataBuf, 2048)); - if (amountRead) { - QByteArray tmp = QByteArray::fromRawData((char*)dataBuf,amountRead); - sreader.addData(tmp); - } - } while (amountRead > 0); - - while (!sreader.atEnd()) { - QXmlStreamReader::TokenType token = sreader.readNext(); - - if (token == QXmlStreamReader::StartElement) { - domParser.m_Factory.IgnoreStrBuf(); - SDOMElement *newElem = domParser.m_Factory.NextElement( - (TXMLCharPtr)sreader.name().toUtf8().data()); - if (domParser.m_FirstElement == NULL) { - domParser.m_FirstElement = newElem; - domParser.m_TopElement = newElem; - } else { - domParser.m_TopElement->AddChild(*newElem); - domParser.m_TopElement = newElem; - } - const QXmlStreamAttributes& attributes = sreader.attributes(); - for (auto attrib : attributes) { - SDOMAttribute *att = domParser.m_Factory.NextAttribute( - (TXMLCharPtr)attrib.name().toUtf8().data(), - (TXMLCharPtr)attrib.value().toUtf8().data()); - newElem->AddAttribute(*att); - } - } else if (token == QXmlStreamReader::Characters) { - QByteArray text = sreader.text().toUtf8(); - domParser.m_Factory.AppendStrBuf(text.data(),text.length()); - } else if (token == QXmlStreamReader::EndElement) { - domParser.m_TopElement->m_Value = domParser.m_Factory.FinalizeStrBuf(); - domParser.m_TopElement = domParser.m_TopElement->m_Parent; - } - if (sreader.hasError()) { - if (handler) { - handler->OnXmlError(sreader.errorString(), sreader.lineNumber(), - sreader.columnNumber()); - } else { - qWarning() << "XML parse error:" << sreader.errorString() - << "line:" << sreader.lineNumber() - << "column:" << sreader.columnNumber(); - } - return nullptr; - } - } - return domParser.m_FirstElement; - } -}; - -class SimpleDomFactory : public IDOMFactory -{ - typedef eastl::basic_string<char8_t> TNarrowStr; - Pool<SDOMElement> m_ElementPool; - Pool<SDOMAttribute> m_AttributePool; - eastl::vector<char8_t *> m_BigStrings; - eastl::vector<char8_t> m_StringBuilder; - TNarrowStr m_ConvertBuffer; - std::shared_ptr<qt3dsdm::IStringTable> m_StringTable; - -public: - SimpleDomFactory(std::shared_ptr<qt3dsdm::IStringTable> strt) - : m_StringTable(strt) - { - } - ~SimpleDomFactory() - { - QT3DSXML_FOREACH(idx, m_BigStrings.size()) - free(m_BigStrings[idx]); - } - - TWideXMLCharPtr RegisterStr(TWideXMLCharPtr str) - { - if (str == NULL || *str == 0) - return L""; - return m_StringTable->RegisterStr(str); - } - - TXMLCharPtr RegisterStr(TXMLCharPtr str) - { - if (str == NULL || *str == 0) - return ""; - return m_StringTable->RegisterStr(str); - } - - void Release() override { delete this; } - void AppendStrBuf(TXMLCharPtr str, QT3DSU32 len) override - { - if (len && *str) { - QT3DSU32 offset = m_StringBuilder.size(); - m_StringBuilder.resize(offset + len); - memCopy(&m_StringBuilder[0] + offset, str, len * sizeof(char8_t)); - } - } - // Str does not need to be null terminated. - void AppendStrBuf(TWideXMLCharPtr str, QT3DSU32 len) override - { - if (len && *str) { - const TWCharEASTLConverter::TCharType *bufPtr = - reinterpret_cast<const TWCharEASTLConverter::TCharType *>(str); - qt3ds::foundation::ConvertUTF(bufPtr, len, m_ConvertBuffer); - AppendStrBuf(m_ConvertBuffer.data(), m_ConvertBuffer.size()); - } - } - - // Null terminate what is there and return the buffer. - // This pointer needs to be persistent. - TXMLCharPtr FinalizeStrBuf() override - { - if (m_StringBuilder.size() == 0) - return ""; - m_StringBuilder.push_back(0); - QT3DSU32 len = m_StringBuilder.size(); - QT3DSU32 numBytes = len * sizeof(char8_t); - char8_t *newMem = (char8_t *)malloc(numBytes); - memCopy(newMem, &m_StringBuilder[0], numBytes); - m_BigStrings.push_back(newMem); - m_StringBuilder.clear(); - return newMem; - } - void IgnoreStrBuf() override { m_StringBuilder.clear(); } - - SDOMAttribute *NextAttribute(TXMLCharPtr name, TXMLCharPtr val) override - { - TXMLCharPtr n(m_StringTable->GetNarrowStr(name)); - TXMLCharPtr v(RegisterValue(val)); - return m_AttributePool.construct(n, v, __FILE__, __LINE__); - } - - SDOMAttribute *NextAttribute(TWideXMLCharPtr name, TWideXMLCharPtr val) override - { - TXMLCharPtr n(m_StringTable->GetNarrowStr(name)); - TXMLCharPtr v(RegisterValue(val)); - return m_AttributePool.construct(n, v, __FILE__, __LINE__); - } - - SDOMElement *NextElement(TXMLCharPtr name) override - { - IgnoreStrBuf(); - TXMLCharPtr n(m_StringTable->GetNarrowStr(name)); - return m_ElementPool.construct(n, __FILE__, __LINE__); - } - SDOMElement *NextElement(TWideXMLCharPtr name) override - { - IgnoreStrBuf(); - TXMLCharPtr n(m_StringTable->GetNarrowStr(name)); - return m_ElementPool.construct(n, __FILE__, __LINE__); - } - - std::shared_ptr<qt3dsdm::IStringTable> GetStringTable() override { return m_StringTable; } -}; -} - -bool IDOMReader::Value(DataModelDataType::Value type, SValue &outValue) -{ - TXMLCharPtr value; - if (Value(value)) { - WCharTReader reader(const_cast<char8_t *>(value), m_TempBuf, *GetStringTable()); - outValue = WStrOps<SValue>().BufTo(type, reader); - return true; - } - return false; -} - -std::shared_ptr<IDOMReader> -IDOMReader::CreateDOMReader(SDOMElement &inRootElement, - std::shared_ptr<qt3dsdm::IStringTable> inStringTable, - std::shared_ptr<IDOMFactory> inFactory) -{ - return std::make_shared<SDOMReader>(std::ref(inRootElement), std::ref(inStringTable), - inFactory); -} - -eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>> -IDOMWriter::CreateDOMWriter(std::shared_ptr<IDOMFactory> inFactory, SDOMElement &inRootElement, - std::shared_ptr<qt3dsdm::IStringTable> inStringTable) -{ - std::shared_ptr<SDOMWriter> writer(std::make_shared<SDOMWriter>( - inFactory, std::ref(inStringTable), std::ref(inRootElement))); - return eastl::make_pair(writer, writer); -} - -TXMLCharPtr IDOMFactory::RegisterValue(TWideXMLCharPtr inValue) -{ - if (IsTrivial(inValue)) - return ""; - IgnoreStrBuf(); - AppendStrBuf(inValue, (QT3DSU32)wcslen(inValue)); - return FinalizeStrBuf(); -} - -TXMLCharPtr IDOMFactory::RegisterValue(TXMLCharPtr inValue) -{ - if (IsTrivial(inValue)) - return ""; - IgnoreStrBuf(); - AppendStrBuf(inValue, (QT3DSU32)strlen(inValue)); - return FinalizeStrBuf(); -} - -std::shared_ptr<IDOMFactory> -IDOMFactory::CreateDOMFactory(std::shared_ptr<qt3dsdm::IStringTable> inStrTable) -{ - return std::make_shared<SimpleDomFactory>(std::ref(inStrTable)); -} - -void CDOMSerializer::WriteXMLHeader(IOutStream &inStream) -{ - SimpleXmlWriter writer(inStream); - writer.Write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); -} - -// Lexigraphically sort the attributes. -struct SAttributeComparator -{ - bool operator()(const SDOMAttribute *lhs, const SDOMAttribute *rhs) - { - return strcmp(lhs->m_Name, rhs->m_Name) < 0; - } -}; - -// Write an element with attributes sorted by name so a file diff is effective. -void WriteElement(SDOMElement &inElement, SimpleXmlWriter &inWriter, - std::vector<SDOMAttribute *> &inAttSorter) -{ - inAttSorter.clear(); - for (SDOMAttribute *att = inElement.m_FirstAttribute; att; att = att->m_NextAttribute) - inAttSorter.push_back(att); - // We decided that we don't want attribute sorting; the code that adds attributes needs - // to be consistent. - // std::sort( inAttSorter.begin(), inAttSorter.end(), SAttributeComparator() ); - // This element doesn't add anything to the system in this case. - if (inElement.m_FirstAttribute == NULL && inElement.m_FirstChild == NULL - && IsTrivial(inElement.m_Value)) - return; - - inWriter.Begin(inElement.m_Name); - - const char8_t *theLastAttName = 0; - for (size_t idx = 0, end = inAttSorter.size(); idx < end; ++idx) { - SDOMAttribute *theAtt(inAttSorter[idx]); - if (theAtt->m_Name != theLastAttName) - inWriter.Att(theAtt->m_Name, theAtt->m_Value); - else { - QT3DS_ASSERT(false); - } - theLastAttName = theAtt->m_Name; - } - // Elements can either have children or values but not both at this point. - if (inElement.m_FirstChild) { - for (SDOMElement *theChild = inElement.m_FirstChild; theChild; - theChild = theChild->m_NextSibling) - WriteElement(*theChild, inWriter, inAttSorter); - inWriter.End(); - } else { - if (!IsTrivial(inElement.m_Value)) - inWriter.Value(inElement.m_Value); - - inWriter.End(); - } -} - -void CDOMSerializer::Write(SDOMElement &inElement, IOutStream &inStream, QT3DSU32 inTabs) -{ - // TODO: QXmlStreamWriter here? - std::vector<SDOMAttribute *> theAttributes; - SimpleXmlWriter writer(inStream, inTabs); - std::vector<SDOMAttribute *> theAttSorter; - WriteElement(inElement, writer, theAttSorter); -} - -SDOMElement *CDOMSerializer::Read(IDOMFactory &inFactory, IInStream &inStream, - CXmlErrorHandler *inErrorHandler) -{ - return DOMParser::ParseXMLFile(inFactory, inStream, inErrorHandler); -} diff --git a/src/Authoring/QT3DSDM/Systems/Qt3DSDMXML.h b/src/Authoring/QT3DSDM/Systems/Qt3DSDMXML.h deleted file mode 100644 index 5fe722f9..00000000 --- a/src/Authoring/QT3DSDM/Systems/Qt3DSDMXML.h +++ /dev/null @@ -1,506 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DS_IMPORT_XML_H -#define QT3DS_IMPORT_XML_H -#include "foundation/Qt3DS.h" -#include "foundation/Qt3DSMemoryBuffer.h" -#include "Qt3DSDMDataTypes.h" -#include <string> -#include "Qt3DSDMWStrOps.h" //Conversion between string and various datatypes. -#include "foundation/Qt3DSFlags.h" -#include "EASTL/algorithm.h" -#include "foundation/Qt3DSSimpleTypes.h" -#include "foundation/IOStreams.h" -#include "Qt3DSDMValue.h" -#include <memory> - -namespace qt3dsdm { -using qt3ds::foundation::MemoryBuffer; -using qt3ds::foundation::RawAllocator; -class IStringTable; - -class IDOMFactory; -struct SDOMAttribute; -struct SDOMElement; - -typedef const char8_t *TXMLCharPtr; -typedef const wchar_t *TWideXMLCharPtr; - -typedef TCharStr TXMLWideStr; -typedef eastl::basic_string<char8_t> TXMLStr; - -using qt3ds::QT3DSU32; -using qt3ds::NVFlags; -using qt3ds::foundation::NVDataRef; -using qt3ds::foundation::NVConstDataRef; -using qt3ds::foundation::IOutStream; - -class IDOMFactory -{ -protected: - virtual ~IDOMFactory() {} -public: - friend class std::shared_ptr<IDOMFactory>; - - virtual void Release() = 0; - // Str does not need to be null terminated. - virtual void AppendStrBuf(TXMLCharPtr str, QT3DSU32 len) = 0; - virtual void AppendStrBuf(TWideXMLCharPtr str, QT3DSU32 len) = 0; - // Null terminate what is there and return the buffer. - // This pointer needs to be persistent. - virtual TXMLCharPtr FinalizeStrBuf() = 0; - virtual void IgnoreStrBuf() = 0; - - virtual std::shared_ptr<IStringTable> GetStringTable() = 0; - - virtual SDOMAttribute *NextAttribute(TWideXMLCharPtr name, TWideXMLCharPtr val) = 0; - virtual SDOMElement *NextElement(TWideXMLCharPtr name) = 0; - - virtual SDOMAttribute *NextAttribute(TXMLCharPtr name, TXMLCharPtr val) = 0; - virtual SDOMElement *NextElement(TXMLCharPtr name) = 0; - - TXMLCharPtr RegisterValue(TXMLCharPtr inValue); - TXMLCharPtr RegisterValue(TWideXMLCharPtr inValue); - - static std::shared_ptr<IDOMFactory> - CreateDOMFactory(std::shared_ptr<IStringTable> inStrTable); -}; - -struct DOMFlagValues -{ - enum Enum { - CaselessElementNames = 1 << 0, - CaselessAttributeNames = 1 << 1, - }; -}; - -struct SDOMFlags : NVFlags<DOMFlagValues::Enum, int> -{ - SDOMFlags() - : NVFlags<DOMFlagValues::Enum, int>(DOMFlagValues::CaselessElementNames - | DOMFlagValues::CaselessAttributeNames) - { - } - bool CaselessAttributes() const { return *this & DOMFlagValues::CaselessAttributeNames; } - bool CaselessElements() const { return *this & DOMFlagValues::CaselessElementNames; } -}; - -class IDOMReader -{ -protected: - virtual ~IDOMReader() {} -public: - friend class std::shared_ptr<IDOMReader>; - - // Stack object to save the reader's state. - struct Scope - { - IDOMReader &m_Reader; - Scope(IDOMReader &reader) - : m_Reader(reader) - { - m_Reader.PushScope(); - } - ~Scope() { m_Reader.PopScope(); } - }; - - // Parse buffer - MemoryBuffer<RawAllocator> m_TempBuf; - std::shared_ptr<IStringTable> m_StringTable; - - IDOMReader(std::shared_ptr<IStringTable> inStringTable) - : m_StringTable(inStringTable) - { - } - - std::shared_ptr<IStringTable> GetStringTable() { return m_StringTable; } - - // DOM reader flags change the nature of the DOM reader. - // see DOMFlagValues - // Defaults to caseless comparisons for attributes and for - // element names. - virtual void SetDOMFlags(SDOMFlags inFlags) = 0; - virtual SDOMFlags GetDOMFlags() const = 0; - - // Pushing scope saves your state so no matter where you are when - // you next pop scope, you come back to the same state. - virtual void PushScope() = 0; - virtual void PopScope() = 0; - - // Sometimes pushing and popping scope isn't enough and you need - // somewhat random access to scope. - // This scope does not remember the current attribute. - virtual void *GetScope() = 0; - virtual void SetScope(void *inScope) = 0; - // Return an attribute whose value is *not* registered with the string table. - // You can't hold onto this value for any length of time, but when you need to - // immediately convert to a different value this is the most efficient way. - virtual bool UnregisteredAtt(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) = 0; - virtual bool UnregisteredAtt(TXMLCharPtr name, TXMLCharPtr &outValue) = 0; - // Return an attribute whose value *is* registered with the string table. - virtual bool Att(TWideXMLCharPtr name, TWideXMLCharPtr &outValue) = 0; - virtual bool Att(TXMLCharPtr name, TXMLCharPtr &outValue) = 0; - virtual eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetFirstAttribute() = 0; - virtual eastl::pair<TWideXMLCharPtr, TWideXMLCharPtr> GetNextAttribute() = 0; - virtual eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowFirstAttribute() = 0; - virtual eastl::pair<TXMLCharPtr, TXMLCharPtr> GetNarrowNextAttribute() = 0; - virtual QT3DSU32 CountChildren() = 0; - virtual QT3DSU32 CountChildren(TWideXMLCharPtr childName) = 0; - virtual QT3DSU32 CountChildren(TXMLCharPtr childName) = 0; - virtual bool MoveToFirstChild(TWideXMLCharPtr childName) = 0; - virtual bool MoveToFirstChild(TXMLCharPtr childName) = 0; - virtual bool MoveToFirstChild() = 0; - virtual bool MoveToNextSibling(TWideXMLCharPtr siblingName) = 0; - virtual bool MoveToNextSibling(TXMLCharPtr siblingName) = 0; - virtual bool MoveToNextSibling() = 0; - // Leave element means go to its parent. - virtual void Leave() = 0; - virtual TWideXMLCharPtr GetElementName() const = 0; - virtual TXMLCharPtr GetNarrowElementName() const = 0; - - // Value is the concatentated text node values inside the element - virtual bool Value(TWideXMLCharPtr &outValue) = 0; - virtual bool Value(TXMLCharPtr &outValue) = 0; - - // Get the element this reader was created with - virtual SDOMElement *GetTopElement() = 0; - - bool Att(TWideXMLCharPtr name, TXMLWideStr &outValue) - { - TWideXMLCharPtr temp; - if (UnregisteredAtt(name, temp)) { - outValue.assign(temp); - return true; - } - return false; - } - - bool Att(TXMLCharPtr name, TXMLStr &outValue) - { - TXMLCharPtr temp; - if (UnregisteredAtt(name, temp)) { - outValue.assign(temp); - return true; - } - return false; - } - - // Helpers to help make the parsing a bit easier. - template <typename TDataType> - bool Att(TWideXMLCharPtr name, TDataType &outValue) - { - TWideXMLCharPtr temp; - if (UnregisteredAtt(name, temp)) { - WStrOps<TDataType>().StrTo(temp, outValue); - return true; - } else { - return false; - } - } - template <typename TDataType> - bool Att(TXMLCharPtr name, TDataType &outValue) - { - TXMLCharPtr temp; - if (UnregisteredAtt(name, temp)) { - WStrOps<TDataType>().StrTo(temp, outValue); - return true; - } else { - return false; - } - } - - bool ChildValue(TXMLCharPtr name, TXMLCharPtr &value) - { - if (MoveToFirstChild(name)) { - Value(value); - Leave(); - return true; - } - return false; - } - - bool ChildValue(TWideXMLCharPtr name, TWideXMLCharPtr &value) - { - if (MoveToFirstChild(name)) { - Value(value); - Leave(); - return true; - } - return false; - } - - bool RegisteredChildValue(TWideXMLCharPtr name, TWideXMLCharPtr &value) - { - if (MoveToFirstChild(name)) { - RegisteredValue(value); - Leave(); - return true; - } - return false; - } - bool RegisteredChildValue(TXMLCharPtr name, TXMLCharPtr &value) - { - if (MoveToFirstChild(name)) { - RegisteredValue(value); - Leave(); - return true; - } - return false; - } - bool RegisteredValue(TWideXMLCharPtr &outValue) - { - bool retval = Value(outValue); - if (retval) - outValue = m_StringTable->RegisterStr(outValue); - return retval; - } - bool RegisteredValue(TXMLCharPtr &outValue) - { - bool retval = Value(outValue); - if (retval) - outValue = m_StringTable->RegisterStr(outValue); - return retval; - } - bool Value(DataModelDataType::Value type, SValue &outValue); - - template <typename TDataType> - bool Value(TDataType &outValue) - { - TXMLCharPtr value; - if (Value(value)) { - WStrOps<TDataType>().StrTo(value, outValue); - return true; - } - return false; - } - - // Functions below implemented in WStrOpsImpl - // to avoid circular dependencies - // Returns the number of items read - // Destructive parsing - template <typename TDataType> - bool ValueList(NVDataRef<TDataType> data); - - // Destructive operation because we can't trust - // strtod to do the right thing. On windows, for long strings, - // it calls strlen every operation thus leading to basically N^2 - // behavior - template <typename TDataType> - NVConstDataRef<TDataType> ChildValueList(TWideXMLCharPtr listName); - - template <typename TDataType> - NVConstDataRef<TDataType> ChildValueList(TXMLCharPtr listName); - - template <typename TSerializer> - void Serialize(const wchar_t *elemName, TSerializer &serializer) - { - IDOMReader::Scope __theScope(*this); - if (MoveToFirstChild(elemName)) { - serializer.Serialize(*this); - } - } - // Optionally hold on to the factory to keep our elements in memory as long as we are. - static std::shared_ptr<IDOMReader> - CreateDOMReader(SDOMElement &inRootElement, std::shared_ptr<IStringTable> inStringTable, - std::shared_ptr<IDOMFactory> inFactory = std::shared_ptr<IDOMFactory>()); -}; - -// Write out data in an xml-like fasion without specifying exactly -// where that data is being written. -class IDOMWriter -{ -protected: - virtual ~IDOMWriter() {} -public: - friend class std::shared_ptr<IDOMWriter>; - - // Control the element scope. - struct Scope - { - IDOMWriter &m_Writer; - Scope(IDOMWriter &writer, TWideXMLCharPtr inElemName) - : m_Writer(writer) - { - m_Writer.Begin(inElemName); - } - Scope(IDOMWriter &writer, TXMLCharPtr inElemName) - : m_Writer(writer) - { - m_Writer.Begin(inElemName); - } - ~Scope() { m_Writer.End(); } - }; - - wchar_t m_PrintBuf[256]; - char8_t m_NarrowBuf[256]; - - virtual void SetDOMFlags(SDOMFlags inFlags) = 0; - virtual SDOMFlags GetDOMFlags() const = 0; - // There tend to be two types of elements. - // Containers (<a>\n\t<b/><b/>\n</a>) - // and Values <b>onetwothree</b> - virtual void Begin(TWideXMLCharPtr inElemName) = 0; - virtual void Begin(TXMLCharPtr inElemName) = 0; - // Attributes. They may be sorted just before write - virtual void Att(TWideXMLCharPtr name, TWideXMLCharPtr value) = 0; - virtual void Att(TXMLCharPtr name, TXMLCharPtr value) = 0; - virtual void Value(TWideXMLCharPtr value) = 0; - virtual void Value(TXMLCharPtr value) = 0; - virtual void End() = 0; - virtual void RemoveCurrent() = 0; - virtual void ReplaceCurrent(SDOMElement &inElement) = 0; - // Append all the children of inElement to the child list of the current items. - virtual void AppendChildren(SDOMElement &inElement) = 0; - virtual void RemoveAttribute(TWideXMLCharPtr inItem) = 0; - virtual void RemoveAttribute(TXMLCharPtr inItem) = 0; - // Get the number of tabs required to line up the next line - // with the opening of the previous line - virtual QT3DSU32 GetTabs() = 0; - virtual SDOMElement *GetTopElement() = 0; - virtual std::shared_ptr<IDOMFactory> GetFactory() = 0; - // Move this item before this sibling. Function does not rearrange the - // tree in any major way and will not work if inItem and inSibling aren't - // siblings. - virtual void MoveBefore(TWideXMLCharPtr inItem, TWideXMLCharPtr inSibling) = 0; - virtual void MoveBefore(TXMLCharPtr inItem, TXMLCharPtr inSibling) = 0; - - virtual void ChildValue(TWideXMLCharPtr name, TWideXMLCharPtr value) - { - Begin(name); - Value(value); - End(); - } - - virtual void ChildValue(TXMLCharPtr name, TXMLCharPtr value) - { - Begin(name); - Value(value); - End(); - } - - TWideXMLCharPtr ToStr(wchar_t val) - { - m_PrintBuf[0] = val; - m_PrintBuf[1] = 0; - return m_PrintBuf; - } - TXMLCharPtr ToStr(char8_t val) - { - m_NarrowBuf[0] = val; - m_NarrowBuf[1] = 0; - return m_NarrowBuf; - } - template <typename TDataType> - TWideXMLCharPtr ToStr(TDataType val) - { - WStrOps<TDataType>().ToStr(val, NVDataRef<wchar_t>(m_PrintBuf, 256)); - return m_PrintBuf; - } - - template <typename TDataType> - TXMLCharPtr ToNarrowStr(TDataType val) - { - WStrOps<TDataType>().ToStr(val, NVDataRef<char8_t>(m_NarrowBuf, 256)); - return m_NarrowBuf; - } - - void Att(TWideXMLCharPtr name, const TXMLWideStr &inValue) - { - return Att(name, inValue.wide_str()); - } - - void Att(TXMLCharPtr name, const TXMLStr &inValue) { return Att(name, inValue.c_str()); } - - template <typename TData> - void Att(TWideXMLCharPtr name, TData value) - { - Att(name, ToStr(value)); - } - - template <typename TData> - void Att(TXMLCharPtr name, TData value) - { - Att(name, ToNarrowStr(value)); - } - - template <typename TSerializer> - void Serialize(const wchar_t *elemName, TSerializer &serializer) - { - IDOMWriter::Scope __theScope(*this, elemName); - serializer.Serialize(*this); - } - - template <typename TSerializer> - void Serialize(const char8_t *elemName, TSerializer &serializer) - { - IDOMWriter::Scope __theScope(*this, elemName); - serializer.Serialize(*this); - } - - std::shared_ptr<IDOMReader> CreateDOMReader() - { - std::shared_ptr<IDOMFactory> theFactory(GetFactory()); - return IDOMReader::CreateDOMReader(*GetTopElement(), theFactory->GetStringTable(), - theFactory); - } - - // Note that the default method of creating a writer also creates a reader; they can - // both manipulation the DOM hierarch. - static eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>> - CreateDOMWriter(std::shared_ptr<IDOMFactory> inFactory, SDOMElement &inRootElement, - std::shared_ptr<IStringTable> inStringTable); - - static eastl::pair<std::shared_ptr<IDOMWriter>, std::shared_ptr<IDOMReader>> - CreateDOMWriter(const wchar_t *inTopElemName, std::shared_ptr<IStringTable> inStringTable) - { - std::shared_ptr<IDOMFactory> theFactory(IDOMFactory::CreateDOMFactory(inStringTable)); - SDOMElement *theRoot = theFactory->NextElement(inTopElemName); - return CreateDOMWriter(theFactory, *theRoot, inStringTable); - } -}; - -class CXmlErrorHandler -{ -protected: - virtual ~CXmlErrorHandler() {} -public: - virtual void OnXmlError(const QString &errorName, int line, int column) = 0; -}; - -class CDOMSerializer -{ -public: - static void WriteXMLHeader(IOutStream &inStream); - static void Write(SDOMElement &inElement, IOutStream &inStream, QT3DSU32 inTabs = 0); - static SDOMElement *Read(IDOMFactory &inFactory, qt3ds::foundation::IInStream &inStream, - CXmlErrorHandler *inErrorHandler = NULL); -}; -} -#endif diff --git a/src/Authoring/QT3DSDM/Systems/SignalsImpl.cpp b/src/Authoring/QT3DSDM/Systems/SignalsImpl.cpp deleted file mode 100644 index 6f42516b..00000000 --- a/src/Authoring/QT3DSDM/Systems/SignalsImpl.cpp +++ /dev/null @@ -1,1565 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#ifdef WIN32 -#pragma warning(disable : 4103 4512 4503) -#endif -#include "SignalsImpl.h" - -using namespace std; - -namespace { -bool g_DataModelSignalsEnabled = true; - -#define CHECK_SIGNALS_ENABLED() \ - { \ - if (g_DataModelSignalsEnabled == false) \ - return; \ - } -} - -namespace qt3dsdm { -void SetDataModelSignalsEnabled(bool inEnabled) -{ - g_DataModelSignalsEnabled = inEnabled; -} -// Defaults to true -bool AreDataModelSignalsEnabled() -{ - return g_DataModelSignalsEnabled; -} - -#define CONNECT_QT(x) TSignalConnectionPtr(new QtSignalConnection(x)) -#define CONNECT_SIGNAL_QT(x) CONNECT_QT(QObject::connect(this, x, inCallback)) - -class CPropertyCoreSignaller : public QObject, public IInstancePropertyCoreSignalProvider, - public IInstancePropertyCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void propertySignal(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue); -public: - TSignalConnectionPtr ConnectInstancePropertyValue( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, const SValue &)> - &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CPropertyCoreSignaller::propertySignal, - inCallback)); - } - void SignalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertySignal(inInstance, inProperty, inValue); - } -}; - -TSignalItemPtr CreatePropertyCoreSignaller() -{ - return TSignalItemPtr( - static_cast<IInstancePropertyCoreSignalProvider *>(new CPropertyCoreSignaller())); -} - -class CDataCoreSignaller : public QObject, public IDataCoreSignalProvider, - public IDataCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void instanceCreated(Qt3DSDMInstanceHandle handle); - void beforeInstanceDeleted(Qt3DSDMInstanceHandle handle); - void instanceDeleted(Qt3DSDMInstanceHandle handle); - void instanceDerived(Qt3DSDMInstanceHandle handle, Qt3DSDMInstanceHandle handle2); - void instanceParentRemoved(Qt3DSDMInstanceHandle handle, Qt3DSDMInstanceHandle handle2); - void propertyAdded(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr, - DataModelDataType::Value); - void propertyRemoved(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, TCharPtr, - DataModelDataType::Value); - -public: - virtual TSignalConnectionPtr - ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceCreated, - inCallback)); - } - virtual TSignalConnectionPtr - ConnectBeforeInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::beforeInstanceDeleted, - inCallback)); - } - virtual TSignalConnectionPtr - ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceDeleted, - inCallback)); - } - TSignalConnectionPtr ConnectInstanceDerived( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceDerived, - inCallback)); - } - TSignalConnectionPtr ConnectInstanceParentRemoved( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::instanceParentRemoved, - inCallback)); - } - virtual TSignalConnectionPtr - ConnectPropertyAdded(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - TCharPtr, DataModelDataType::Value)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::propertyAdded, inCallback)); - } - virtual TSignalConnectionPtr - ConnectPropertyRemoved(const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - TCharPtr, DataModelDataType::Value)> &inCallback) override - { - return CONNECT_QT(QObject::connect(this, &CDataCoreSignaller::propertyRemoved, - inCallback)); - } - - void SignalInstanceCreated(Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceCreated(inInstance); - } - void SignalBeforeInstanceDeleted(Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT beforeInstanceDeleted(inInstance); - } - void SignalInstanceDeleted(Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceDeleted(inInstance); - } - void SignalInstanceDerived(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceDerived(inInstance, inParent); - } - void SignalInstanceParentRemoved(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceParentRemoved(inInstance, inParent); - } - void SignalPropertyAdded(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, TCharPtr inName, - DataModelDataType::Value inDataType) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertyAdded(inInstance, inProperty, inName, inDataType); - } - void SignalPropertyRemoved(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, TCharPtr inName, - DataModelDataType::Value inDataType) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertyRemoved(inInstance, inProperty, inName, inDataType); - } -}; - -TSignalItemPtr CreateDataCoreSignaller() -{ - return TSignalItemPtr(static_cast<IDataCoreSignalProvider *>(new CDataCoreSignaller())); -} - -class CSlideCoreSignaller : public QObject, public ISlideCoreSignalProvider, - public ISlideCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - - void slideCreated(Qt3DSDMSlideHandle); - void beforeSlideDeleted(Qt3DSDMSlideHandle); - void slideDeleted(Qt3DSDMSlideHandle); - void slideDerived(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int); - void instancePropertyValueSet(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &); - qt3dsdm::SValue instancePropertyValueAdded(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, - Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &); - void instancePropertyValueRemoved(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, const SValue &); - void slideTimeChanged(Qt3DSDMSlideHandle); - -public: - virtual TSignalConnectionPtr - ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideCreated); - } - virtual TSignalConnectionPtr - ConnectBeforeSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::beforeSlideDeleted); - } - virtual TSignalConnectionPtr - ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideDeleted); - } - TSignalConnectionPtr ConnectSlideDerived( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, int)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideDerived); - } - TSignalConnectionPtr ConnectInstancePropertyValueSet( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::instancePropertyValueSet); - } - virtual TSignalConnectionPtr ConnectInstancePropertyValueAdded( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, const SValue &)> &inCallback) - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::instancePropertyValueAdded); - } - TSignalConnectionPtr ConnectInstancePropertyValueRemoved( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::instancePropertyValueRemoved); - } - virtual TSignalConnectionPtr - ConnectSlideTimeChanged(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideCoreSignaller::slideTimeChanged); - } - - void SendSlideCreated(Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideCreated(inSlide); - } - void SendBeforeSlideDeleted(Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT beforeSlideDeleted(inSlide); - } - void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideDeleted(inSlide); - } - void SendSlideDerived(Qt3DSDMSlideHandle inSlide, Qt3DSDMSlideHandle inParent, - int inIndex) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideDerived(inSlide, inParent, inIndex); - } - void SendPropertyValueSet(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instancePropertyValueSet(inSlide, inInstance, inProperty, inValue); - } - virtual SValue SendPropertyValueAdded(Qt3DSDMSlideHandle inSource, Qt3DSDMSlideHandle inDest, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) - { - if (!g_DataModelSignalsEnabled) return SValue(); - - // check that we have one and only one slot connected to - // instancePropertyValueAdded signal as it returns a value. - Q_ASSERT( - receivers( - SIGNAL( - instancePropertyValueAdded( - Qt3DSDMSlideHandle, Qt3DSDMSlideHandle, - Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle,const SValue &))) == 1); - // emit instancePropertyValueAdded - return instancePropertyValueAdded(inSource, inDest, inInstance, inProperty, inValue); - } - void SendPropertyValueRemoved(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instancePropertyValueRemoved(inSlide, inInstance, inProperty, inValue); - } - void SendSlideTimeChanged(Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideTimeChanged(inSlide); - } -}; - -TSignalItemPtr CreateSlideCoreSignaller() -{ - return TSignalItemPtr(static_cast<ISlideCoreSignalProvider *>(new CSlideCoreSignaller())); -} - -class CSlideGraphCoreSignaller : public QObject, public ISlideGraphCoreSignalProvider, - public ISlideGraphCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void graphCreated(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle); - void graphDeleted(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle); - void instanceAssociated(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void instanceDissociated(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void graphActiveSlide(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle); - void graphSeconds(Qt3DSDMSlideGraphHandle, float); - -public: - TSignalConnectionPtr ConnectGraphCreated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphCreated); - } - TSignalConnectionPtr ConnectGraphDeleted( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphDeleted); - } - TSignalConnectionPtr ConnectInstanceAssociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::instanceAssociated); - } - TSignalConnectionPtr ConnectInstanceDissociated( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::instanceDissociated); - } - TSignalConnectionPtr ConnectGraphActiveSlide( - const std::function<void(Qt3DSDMSlideGraphHandle, Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphActiveSlide); - } - virtual TSignalConnectionPtr - ConnectGraphSeconds(const std::function<void(Qt3DSDMSlideGraphHandle, float)> &inCallback) - { - return CONNECT_SIGNAL_QT(&CSlideGraphCoreSignaller::graphSeconds); - } - - void SendGraphCreated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT graphCreated(inGraph, inSlide); - } - void SendGraphDeleted(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT graphDeleted(inGraph, inSlide); - } - void SendInstanceAssociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceAssociated(inGraph, inSlide, inInstance); - } - void SendInstanceDissociated(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceDissociated(inGraph, inSlide, inInstance); - } - void SendGraphActiveSlide(Qt3DSDMSlideGraphHandle inGraph, Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT graphActiveSlide(inGraph, inSlide); - } - virtual void SendGraphSeconds(Qt3DSDMSlideGraphHandle inGraph, float inSeconds) - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT graphSeconds(inGraph, inSeconds); - } -}; - -TSignalItemPtr CreateSlideGraphCoreSignaller() -{ - return TSignalItemPtr( - static_cast<ISlideGraphCoreSignalProvider *>(new CSlideGraphCoreSignaller())); -} - -class CAnimationCoreSignaller : public QObject, public IAnimationCoreSignalProvider, - public IAnimationCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void animationCreated(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType); - void beforeAnimationDeleted(Qt3DSDMAnimationHandle); - void animationDeleted(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType); - void keyframeInserted(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &); - void beforeKeyframeErased(Qt3DSDMKeyframeHandle); - void keyframeErased(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &); - void beforeAllKeyframesErased(Qt3DSDMAnimationHandle); - void keyframeUpdated(Qt3DSDMKeyframeHandle, const TKeyframe &); - void firstKeyframeDynamic(Qt3DSDMAnimationHandle, bool); - -public: - TSignalConnectionPtr ConnectAnimationCreated( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::animationCreated); - } - virtual TSignalConnectionPtr - ConnectBeforeAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::beforeAnimationDeleted); - } - TSignalConnectionPtr ConnectAnimationDeleted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, size_t, EAnimationType)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::animationDeleted); - } - TSignalConnectionPtr ConnectKeyframeInserted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::keyframeInserted); - } - virtual TSignalConnectionPtr - ConnectBeforeKeyframeErased(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::beforeKeyframeErased); - } - TSignalConnectionPtr ConnectKeyframeErased( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle, const TKeyframe &)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::keyframeErased); - } - virtual TSignalConnectionPtr - ConnectBeforeAllKeyframesErased(const std::function<void(Qt3DSDMAnimationHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::beforeAllKeyframesErased); - } - TSignalConnectionPtr ConnectKeyframeUpdated( - const std::function<void(Qt3DSDMKeyframeHandle, const TKeyframe &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::keyframeUpdated); - } - TSignalConnectionPtr ConnectFirstKeyframeDynamicSet( - const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CAnimationCoreSignaller::firstKeyframeDynamic); - } - - void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT animationCreated(inAnimation, inSlide, inInstance, inProperty, inIndex, - inAnimationType); - } - void SendBeforeAnimationDeleted(Qt3DSDMAnimationHandle inAnimation) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT beforeAnimationDeleted(inAnimation); - } - void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - EAnimationType inAnimationType) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT animationDeleted(inAnimation, inSlide, inInstance, inProperty, inIndex, - inAnimationType); - } - void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT keyframeInserted(inAnimation, inKeyframe, inData); - } - void SendBeforeKeyframeErased(Qt3DSDMKeyframeHandle inKeyframe) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT beforeKeyframeErased(inKeyframe); - } - void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT keyframeErased(inAnimation, inKeyframe, inData); - } - void SendBeforeAllKeyframesErased(Qt3DSDMAnimationHandle inAnimation) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT beforeAllKeyframesErased(inAnimation); - } - void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe, const TKeyframe &inData) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT keyframeUpdated(inKeyframe, inData); - } - void SendFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation, - bool inKeyframeDynamic) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT firstKeyframeDynamic(inAnimation, inKeyframeDynamic); - } -}; - -TSignalItemPtr CreateAnimationCoreSignaller() -{ - return TSignalItemPtr( - static_cast<IAnimationCoreSignalProvider *>(new CAnimationCoreSignaller())); -} - -class CActionCoreSignaller : public QObject, public IActionCoreSignalProvider, - public IActionCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void triggerObjectSet(Qt3DSDMActionHandle, SObjectRefType &); - void targetObjectSet(Qt3DSDMActionHandle, SObjectRefType &); - void eventHandleSet(Qt3DSDMActionHandle, const wstring &); - void handlerHandleSet(Qt3DSDMActionHandle, const wstring &); - - void handlerArgumentAdded(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value); - void handlerArgumentRemoved(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value); - void handlerArgumentValueSet(Qt3DSDMHandlerArgHandle, const SValue &); - -public: - TSignalConnectionPtr ConnectTriggerObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::triggerObjectSet); - } - TSignalConnectionPtr ConnectTargetObjectSet( - const std::function<void(Qt3DSDMActionHandle, SObjectRefType &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::targetObjectSet); - } - virtual TSignalConnectionPtr - ConnectEventSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::eventHandleSet); - } - virtual TSignalConnectionPtr - ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle, const wstring &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerHandleSet); - } - - TSignalConnectionPtr ConnectHandlerArgumentAdded( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerArgumentAdded); - } - TSignalConnectionPtr ConnectHandlerArgumentRemoved( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMHandlerArgHandle, const TCharStr &, - HandlerArgumentType::Value, DataModelDataType::Value)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerArgumentRemoved); - } - TSignalConnectionPtr ConnectHandlerArgumentValueSet( - const std::function<void(Qt3DSDMHandlerArgHandle, const SValue &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionCoreSignaller::handlerArgumentValueSet); - } - - void SendTriggerObjectSet(Qt3DSDMActionHandle inAction, SObjectRefType &inTriggerObject) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT triggerObjectSet(inAction, inTriggerObject); - } - void SendTargetObjectSet(Qt3DSDMActionHandle inAction, SObjectRefType &inTargetObject) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT targetObjectSet(inAction, inTargetObject); - } - void SendEventSet(Qt3DSDMActionHandle inAction, const wstring &inEventHandle) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT eventHandleSet(inAction, inEventHandle); - } - void SendHandlerSet(Qt3DSDMActionHandle inAction, const wstring &inHandlerHandle) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT handlerHandleSet(inAction, inHandlerHandle); - } - - void SendHandlerArgumentAdded(Qt3DSDMActionHandle inAction, - Qt3DSDMHandlerArgHandle inHandlerArgument, - const TCharStr &inName, HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT handlerArgumentAdded(inAction, inHandlerArgument, inName, inArgType, inValueType); - } - void SendHandlerArgumentRemoved(Qt3DSDMActionHandle inAction, - Qt3DSDMHandlerArgHandle inHandlerArgument, - const TCharStr &inName, HandlerArgumentType::Value inArgType, - DataModelDataType::Value inValueType) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT handlerArgumentRemoved(inAction, inHandlerArgument, inName, inArgType, inValueType); - } - void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument, - const SValue &inValue) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT handlerArgumentValueSet(inHandlerArgument, inValue); - } -}; - -TSignalItemPtr CreateActionCoreSignaller() -{ - return TSignalItemPtr(static_cast<IActionCoreSignalProvider *>(new CActionCoreSignaller())); -} - -class CActionSystemSignaller : public QObject, public IActionSystemSignalProvider, - public IActionSystemSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void actionCreated(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void actionDeleted(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - -public: - TSignalConnectionPtr ConnectActionCreated( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionSystemSignaller::actionCreated); - } - TSignalConnectionPtr ConnectActionDeleted( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CActionSystemSignaller::actionDeleted); - } - - void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT actionCreated(inAction, inSlide, inOwner); - } - void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT actionDeleted(inAction, inSlide, inOwner); - } -}; - -TSignalItemPtr CreateActionSystemSignaller() -{ - return TSignalItemPtr(static_cast<IActionSystemSignalProvider *>(new CActionSystemSignaller())); -} - -class CSlideSystemSignaller : public QObject, public ISlideSystemSignalProvider, - public ISlideSystemSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void masterCreated(Qt3DSDMSlideHandle); - void masterDeleted(Qt3DSDMSlideHandle); - void slideCreated(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle); - void slideDeleted(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle); - void slideRearranged(Qt3DSDMSlideHandle, int, int); - void componentSeconds(Qt3DSDMSlideHandle, float); - void instanceAssociated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void instanceDissociated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void propertyLinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void propertyUnlinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void activeSlide(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle, Qt3DSDMSlideHandle); - - qt3dsdm::SValue valueCreated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue); - void valueDestroyed(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue); - -public: - virtual TSignalConnectionPtr - ConnectMasterCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::masterCreated); - } - virtual TSignalConnectionPtr - ConnectMasterDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::masterDeleted); - } - TSignalConnectionPtr ConnectSlideCreated( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::slideCreated); - } - TSignalConnectionPtr ConnectSlideDeleted( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::slideDeleted); - } - virtual TSignalConnectionPtr - ConnectSlideRearranged(const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::slideRearranged); - } - virtual TSignalConnectionPtr - ConnectComponentSeconds(const std::function<void(Qt3DSDMSlideHandle, float)> &inCallback) - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::componentSeconds); - } - TSignalConnectionPtr ConnectInstanceAssociated( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::instanceAssociated); - } - TSignalConnectionPtr ConnectInstanceDissociated( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::instanceDissociated); - } - TSignalConnectionPtr ConnectPropertyLinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::propertyLinked); - } - TSignalConnectionPtr ConnectPropertyUnlinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::propertyUnlinked); - } - TSignalConnectionPtr ConnectActiveSlide( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle, Qt3DSDMSlideHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::activeSlide); - } - virtual TSignalConnectionPtr ConnectPropertyValueCreated( - const std::function<SValue(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::valueCreated); - } - virtual TSignalConnectionPtr ConnectPropertyValueDestroyed( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, - const SValue &)> &inCallback) - { - return CONNECT_SIGNAL_QT(&CSlideSystemSignaller::valueDestroyed); - } - - void SendMasterCreated(Qt3DSDMSlideHandle inMaster) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT masterCreated(inMaster); - } - void SendMasterDeleted(Qt3DSDMSlideHandle inMaster) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT masterDeleted(inMaster); - } - void SendSlideCreated(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideCreated(inMaster, inIndex, inSlide); - } - void SendSlideDeleted(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideDeleted(inMaster, inIndex, inSlide); - } - void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex, int inNewIndex) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideRearranged(inMaster, inOldIndex, inNewIndex); - } - virtual void SendComponentSeconds(Qt3DSDMSlideHandle inMaster, float inSeconds) - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT componentSeconds(inMaster, inSeconds); - } - void SendInstanceAssociated(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceAssociated(inMaster, inInstance); - } - void SendInstanceDissociated(Qt3DSDMSlideHandle inMaster, - Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceDissociated(inMaster, inInstance); - } - void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertyLinked(inMaster, inInstance, inProperty); - } - void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertyUnlinked(inMaster, inInstance, inProperty); - } - void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex, - Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT activeSlide(inMaster, inIndex, inOldSlide, inNewSlide); - } - - virtual SValue SendPropertyValueCreated(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) - { - if (!g_DataModelSignalsEnabled) return SValue(); - - // check that we have one and only one slot connected to - // valueCreated signal as it returns a value. - Q_ASSERT( - receivers( - SIGNAL( - valueCreated(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle, const SValue &))) == 1); - // emit valueCreated - return valueCreated(inSlide, inInstance, inProperty, inValue); - } - virtual void SendPropertyValueDestroyed(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT valueDestroyed(inSlide, inInstance, inProperty, inValue); - } -}; - -TSignalItemPtr CreateSlideSystemSignaller() -{ - return TSignalItemPtr(static_cast<ISlideSystemSignalProvider *>(new CSlideSystemSignaller())); -} - -class CCustomPropCoreSignaller : public QObject, public ICustomPropCoreSignalProvider, - public ICustomPropCoreSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void customPropertyCreated(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle); - void customPropertyDeleted(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle); - void customPropertyModified(Qt3DSDMPropertyHandle); - void customEventCreated(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle); - void customEventDeleted(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle); - void customEventModified(Qt3DSDMEventHandle); - void customHandlerCreated(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle); - void customHandlerDeleted(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle); - void customHandlerModified(Qt3DSDMHandlerHandle); - void customHandlerParamCreated(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle); - void customHandlerParamDeleted(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle); - void customHandlerParamModified(Qt3DSDMHandlerParamHandle); - void customReferencesModified(Qt3DSDMInstanceHandle, const TCharStr &); - -public: - TSignalConnectionPtr ConnectCustomPropertyCreated( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customPropertyCreated); - } - TSignalConnectionPtr ConnectCustomPropertyDeleted( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customPropertyDeleted); - } - virtual TSignalConnectionPtr - ConnectCustomPropertyModified(const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customPropertyModified); - } - TSignalConnectionPtr ConnectCustomEventCreated( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customEventCreated); - } - TSignalConnectionPtr ConnectCustomEventDeleted( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customEventDeleted); - } - virtual TSignalConnectionPtr - ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customEventModified); - } - TSignalConnectionPtr ConnectCustomHandlerCreated( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerCreated); - } - TSignalConnectionPtr ConnectCustomHandlerDeleted( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerDeleted); - } - virtual TSignalConnectionPtr - ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerModified); - } - TSignalConnectionPtr ConnectCustomHandlerParamCreated( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerParamCreated); - } - TSignalConnectionPtr ConnectCustomHandlerParamDeleted( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerParamDeleted); - } - TSignalConnectionPtr ConnectCustomHandlerParamModified( - const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customHandlerParamModified); - } - TSignalConnectionPtr ConnectCustomReferencesModified( - const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CCustomPropCoreSignaller::customReferencesModified); - } - - void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customPropertyCreated(inProp, inOwner); - } - void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customPropertyDeleted(inProp, inOwner); - } - void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customPropertyModified(inProp); - } - void SendCustomEventCreated(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customEventCreated(inEvent, inOwner); - } - void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customEventDeleted(inEvent, inOwner); - } - void SendCustomEventModified(Qt3DSDMEventHandle inEvent) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customEventModified(inEvent); - } - void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerCreated(inHandler, inOwner); - } - void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerDeleted(inHandler, inOwner); - } - void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerModified(inHandler); - } - void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerParamCreated(inParameter, inHandler); - } - void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerParamDeleted(inParameter, inHandler); - } - void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerParamModified(inParameter); - } - void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner, - const TCharStr &inString) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customReferencesModified(inOwner, inString); - } -}; - -TSignalItemPtr CreateCustomPropCoreSignaller() -{ - return TSignalItemPtr( - static_cast<ICustomPropCoreSignalProvider *>(new CCustomPropCoreSignaller())); -} - -class CStudioFullSystemSignaller : public QObject, public IStudioFullSystemSignalProvider, - public IStudioFullSystemSignalSender -{ - Q_OBJECT -Q_SIGNALS: - void changeSetBegin(); - void changeSetEnd(); - void animationBegin(); - void animationEnd(); - void slideCreated(Qt3DSDMSlideHandle); - void slideDeleted(Qt3DSDMSlideHandle); - void slideRearranged(Qt3DSDMSlideHandle, int, int); - void componentSeconds(Qt3DSDMSlideHandle); - void beginComponentSeconds(Qt3DSDMSlideHandle); - void propertyLinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void propertyUnlinked(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void activeSlide(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle); - void instanceCreated(Qt3DSDMInstanceHandle); - void instanceDeleted(Qt3DSDMInstanceHandle); - void animationCreated(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void animationDeleted(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void controlledToggled(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void keyframeInserted(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle); - void keyframeErased(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle); - void keyframeUpdated(Qt3DSDMKeyframeHandle); - void connectFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle, bool); - void instancePropertyValue(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle); - void actionCreated(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void actionDeleted(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle); - void triggerObjectSet(Qt3DSDMActionHandle); - void targetObjectSet(Qt3DSDMActionHandle); - void eventHandleSet(Qt3DSDMActionHandle); - void handlerHandleSet(Qt3DSDMActionHandle); - void handlerArgumentValueSet(Qt3DSDMHandlerArgHandle); - void customPropertyCreated(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle); - void customPropertyDeleted(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle); - void customPropertyModified(Qt3DSDMPropertyHandle); - void customEventCreated(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle); - void customEventDeleted(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle); - void customEventModified(Qt3DSDMEventHandle); - void customHandlerCreated(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle); - void customHandlerDeleted(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle); - void customHandlerModified(Qt3DSDMHandlerHandle); - void customHandlerParamCreated(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle); - void customHandlerParamDeleted(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle); - void customHandlerParamModified(Qt3DSDMHandlerParamHandle); - void customReferencesModified(Qt3DSDMInstanceHandle, const TCharStr &); -private: - ISlideSystemSignalProvider *m_SlideSystemSignalProvider; - -public: - CStudioFullSystemSignaller(ISlideSystemSignalProvider *inProvider) - : m_SlideSystemSignalProvider(inProvider) - { - } - - virtual TSignalConnectionPtr ConnectChangeSetBegin(const std::function<void()> &inCallback) - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::changeSetBegin); - } - virtual TSignalConnectionPtr ConnectChangeSetEnd(const std::function<void()> &inCallback) - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::changeSetEnd); - } - - // Used when people start to set component times. - virtual TSignalConnectionPtr ConnectAnimationSetBegin(const std::function<void()> &inCallback) - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationBegin); - } - virtual TSignalConnectionPtr ConnectAnimationSetEnd(const std::function<void()> &inCallback) - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationEnd); - } - - virtual TSignalConnectionPtr - ConnectSlideCreated(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::slideCreated); - } - virtual TSignalConnectionPtr - ConnectSlideDeleted(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::slideDeleted); - } - virtual TSignalConnectionPtr - ConnectSlideRearranged(const std::function<void(Qt3DSDMSlideHandle, int, int)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::slideRearranged); - } - virtual TSignalConnectionPtr - ConnectBeginComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::beginComponentSeconds); - } - virtual TSignalConnectionPtr - ConnectComponentSeconds(const std::function<void(Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::componentSeconds); - } - TSignalConnectionPtr ConnectPropertyLinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::propertyLinked); - } - TSignalConnectionPtr ConnectPropertyUnlinked( - const std::function<void(Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::propertyUnlinked); - } - TSignalConnectionPtr ConnectActiveSlide( - const std::function<void(Qt3DSDMSlideHandle, int, Qt3DSDMSlideHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::activeSlide); - } - - virtual TSignalConnectionPtr - ConnectInstanceCreated(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::instanceCreated); - } - virtual TSignalConnectionPtr - ConnectInstanceDeleted(const std::function<void(Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::instanceDeleted); - } - virtual TSignalConnectionPtr - ConnectAnimationCreated(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationCreated); - } - virtual TSignalConnectionPtr - ConnectAnimationDeleted(const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMInstanceHandle, - Qt3DSDMPropertyHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::animationDeleted); - } - TSignalConnectionPtr ConnectKeyframeInserted( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::keyframeInserted); - } - TSignalConnectionPtr ConnectKeyframeErased( - const std::function<void(Qt3DSDMAnimationHandle, Qt3DSDMKeyframeHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::keyframeErased); - } - virtual TSignalConnectionPtr - ConnectKeyframeUpdated(const std::function<void(Qt3DSDMKeyframeHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::keyframeUpdated); - } - TSignalConnectionPtr ConnectInstancePropertyValue( - const std::function<void(Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::instancePropertyValue); - } - TSignalConnectionPtr ConnectFirstKeyframeDynamicSet( - const std::function<void(Qt3DSDMAnimationHandle, bool)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::connectFirstKeyframeDynamicSet); - } - - TSignalConnectionPtr ConnectActionCreated( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::actionCreated); - } - TSignalConnectionPtr ConnectActionDeleted( - const std::function<void(Qt3DSDMActionHandle, Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle)> - &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::actionDeleted); - } - virtual TSignalConnectionPtr - ConnectTriggerObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::triggerObjectSet); - } - virtual TSignalConnectionPtr - ConnectTargetObjectSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::targetObjectSet); - } - virtual TSignalConnectionPtr - ConnectEventSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::eventHandleSet); - } - virtual TSignalConnectionPtr - ConnectHandlerSet(const std::function<void(Qt3DSDMActionHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::handlerHandleSet); - } - virtual TSignalConnectionPtr - ConnectHandlerArgumentValueSet(const std::function<void(Qt3DSDMHandlerArgHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::handlerArgumentValueSet); - } - - TSignalConnectionPtr ConnectCustomPropertyCreated( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customPropertyCreated); - } - TSignalConnectionPtr ConnectCustomPropertyDeleted( - const std::function<void(Qt3DSDMPropertyHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customPropertyDeleted); - } - virtual TSignalConnectionPtr - ConnectCustomPropertyModified(const std::function<void(Qt3DSDMPropertyHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customPropertyModified); - } - TSignalConnectionPtr ConnectCustomEventCreated( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customEventCreated); - } - TSignalConnectionPtr ConnectCustomEventDeleted( - const std::function<void(Qt3DSDMEventHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customEventDeleted); - } - virtual TSignalConnectionPtr - ConnectCustomEventModified(const std::function<void(Qt3DSDMEventHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customEventModified); - } - TSignalConnectionPtr ConnectCustomHandlerCreated( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerCreated); - } - TSignalConnectionPtr ConnectCustomHandlerDeleted( - const std::function<void(Qt3DSDMHandlerHandle, Qt3DSDMInstanceHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerDeleted); - } - virtual TSignalConnectionPtr - ConnectCustomHandlerModified(const std::function<void(Qt3DSDMHandlerHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerModified); - } - TSignalConnectionPtr ConnectCustomHandlerParamCreated( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerParamCreated); - } - TSignalConnectionPtr ConnectCustomHandlerParamDeleted( - const std::function<void(Qt3DSDMHandlerParamHandle, Qt3DSDMHandlerHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerParamDeleted); - } - TSignalConnectionPtr ConnectCustomHandlerParamModified( - const std::function<void(Qt3DSDMHandlerParamHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customHandlerParamModified); - } - TSignalConnectionPtr ConnectCustomReferencesModified( - const std::function<void(Qt3DSDMInstanceHandle, const TCharStr &)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::customReferencesModified); - } - TSignalConnectionPtr ConnectControlledToggled( - const std::function<void( - Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle)> &inCallback) override - { - return CONNECT_SIGNAL_QT(&CStudioFullSystemSignaller::controlledToggled); - } - - virtual void SendChangeSetBegin() - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT changeSetBegin(); - } - virtual void SendChangeSetEnd() - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT changeSetEnd(); - } - - virtual void SendAnimationSetBegin() - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT animationBegin(); - } - virtual void SendAnimationSetEnd() - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT animationEnd(); - } - - void SendSlideCreated(Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideCreated(inSlide); - } - void SendSlideDeleted(Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideDeleted(inSlide); - } - void SendSlideRearranged(Qt3DSDMSlideHandle inMaster, int inOldIndex, int inNewIndex) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT slideRearranged(inMaster, inOldIndex, inNewIndex); - } - void SendBeginComponentSeconds(Qt3DSDMSlideHandle inMaster) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT beginComponentSeconds(inMaster); - } - void SendComponentSeconds(Qt3DSDMSlideHandle inMaster) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT componentSeconds(inMaster); - } - void SendPropertyLinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertyLinked(inMaster, inInstance, inProperty); - } - void SendPropertyUnlinked(Qt3DSDMSlideHandle inMaster, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT propertyUnlinked(inMaster, inInstance, inProperty); - } - void SendActiveSlide(Qt3DSDMSlideHandle inMaster, int inIndex, Qt3DSDMSlideHandle inSlide) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT activeSlide(inMaster, inIndex, inSlide); - } - - void SendInstanceCreated(Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceCreated(inInstance); - } - void SendInstanceDeleted(Qt3DSDMInstanceHandle inInstance) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instanceDeleted(inInstance); - } - - void SendAnimationCreated(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT animationCreated(inAnimation, inInstance, inProperty); - } - void SendAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT animationDeleted(inAnimation, inInstance, inProperty); - } - void SendKeyframeInserted(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT keyframeInserted(inAnimation, inKeyframe); - } - void SendKeyframeErased(Qt3DSDMAnimationHandle inAnimation, - Qt3DSDMKeyframeHandle inKeyframe) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT keyframeErased(inAnimation, inKeyframe); - } - void SendKeyframeUpdated(Qt3DSDMKeyframeHandle inKeyframe) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT keyframeUpdated(inKeyframe); - } - void SendConnectFirstKeyframeDynamicSet(Qt3DSDMAnimationHandle inAnimation, - bool inDynamic) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT connectFirstKeyframeDynamicSet(inAnimation, inDynamic); - } - - void SendInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT instancePropertyValue(inInstance, inProperty); - } - - void SendActionCreated(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT actionCreated(inAction, inSlide, inOwner); - } - void SendActionDeleted(Qt3DSDMActionHandle inAction, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT actionDeleted(inAction, inSlide, inOwner); - } - void SendTriggerObjectSet(Qt3DSDMActionHandle inAction) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT triggerObjectSet(inAction); - } - void SendTargetObjectSet(Qt3DSDMActionHandle inAction) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT targetObjectSet(inAction); - } - void SendEventSet(Qt3DSDMActionHandle inAction) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT eventHandleSet(inAction); - } - void SendHandlerSet(Qt3DSDMActionHandle inAction) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT handlerHandleSet(inAction); - } - void SendHandlerArgumentValueSet(Qt3DSDMHandlerArgHandle inHandlerArgument) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT handlerArgumentValueSet(inHandlerArgument); - } - - void SendCustomPropertyCreated(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customPropertyCreated(inProp, inOwner); - } - void SendCustomPropertyDeleted(Qt3DSDMPropertyHandle inProp, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customPropertyDeleted(inProp, inOwner); - } - void SendCustomPropertyModified(Qt3DSDMPropertyHandle inProp) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customPropertyModified(inProp); - } - void SendCustomEventCreated(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customEventCreated(inEvent, inOwner); - } - void SendCustomEventDeleted(Qt3DSDMEventHandle inEvent, Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customEventDeleted(inEvent, inOwner); - } - void SendCustomEventModified(Qt3DSDMEventHandle inEvent) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customEventModified(inEvent); - } - void SendCustomHandlerCreated(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerCreated(inHandler, inOwner); - } - void SendCustomHandlerDeleted(Qt3DSDMHandlerHandle inHandler, - Qt3DSDMInstanceHandle inOwner) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerDeleted(inHandler, inOwner); - } - void SendCustomHandlerModified(Qt3DSDMHandlerHandle inHandler) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerModified(inHandler); - } - void SendCustomHandlerParamCreated(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerParamCreated(inParameter, inHandler); - } - void SendCustomHandlerParamDeleted(Qt3DSDMHandlerParamHandle inParameter, - Qt3DSDMHandlerHandle inHandler) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerParamDeleted(inParameter, inHandler); - } - void SendCustomHandlerParamModified(Qt3DSDMHandlerParamHandle inParameter) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customHandlerParamModified(inParameter); - } - void SendCustomReferencesModified(Qt3DSDMInstanceHandle inOwner, - const TCharStr &inString) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT customReferencesModified(inOwner, inString); - } - - void SendControlledToggled(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) override - { - CHECK_SIGNALS_ENABLED(); - Q_EMIT controlledToggled(inInstance, inProperty); - } -}; - -TSignalItemPtr -CreateStudioFullSystemSignaller(ISlideSystemSignalProvider *inSlideSystemSignalProvider) -{ - return TSignalItemPtr(static_cast<IStudioFullSystemSignalProvider *>( - new CStudioFullSystemSignaller(inSlideSystemSignalProvider))); -} -} - -#include "SignalsImpl.moc" diff --git a/src/Authoring/QT3DSDM/Systems/SignalsImpl.h b/src/Authoring/QT3DSDM/Systems/SignalsImpl.h deleted file mode 100644 index 988270e8..00000000 --- a/src/Authoring/QT3DSDM/Systems/SignalsImpl.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef SIGNALSIMPLH -#define SIGNALSIMPLH -#include "Qt3DSDMSignals.h" - -namespace qt3dsdm { -class ISlideSystemSignalProvider; - -TSignalItemPtr CreatePropertyCoreSignaller(); -TSignalItemPtr CreateDataCoreSignaller(); -TSignalItemPtr CreateSlideCoreSignaller(); -TSignalItemPtr CreateSlideGraphCoreSignaller(); -TSignalItemPtr CreateAnimationCoreSignaller(); -TSignalItemPtr CreateActionCoreSignaller(); -TSignalItemPtr CreateActionSystemSignaller(); -TSignalItemPtr CreateSlideSystemSignaller(); -TSignalItemPtr CreateCustomPropCoreSignaller(); -TSignalItemPtr -CreateStudioFullSystemSignaller(ISlideSystemSignalProvider *inSlideSystemSignalProvider); -} - -#endif
\ No newline at end of file diff --git a/src/Authoring/QT3DSDM/Systems/SlideSystem.cpp b/src/Authoring/QT3DSDM/Systems/SlideSystem.cpp deleted file mode 100644 index d6d88932..00000000 --- a/src/Authoring/QT3DSDM/Systems/SlideSystem.cpp +++ /dev/null @@ -1,867 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#ifdef WIN32 -#pragma warning(disable : 4503) -#endif -#include "SlideSystem.h" -#include "SimpleSlideCore.h" - -using namespace std; - -namespace qt3dsdm { - -SSlideSystem::SSlideSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore, - TSlideGraphCorePtr inSlideGraphCore, TAnimationCorePtr inAnimationCore, - Qt3DSDMInstanceHandle inSlideInstance, - Qt3DSDMPropertyHandle inComponentGuidProperty) - : m_DataCore(inDataCore) - , m_SlideCore(inSlideCore) - , m_SlideGraphCore(inSlideGraphCore) - , m_AnimationCore(inAnimationCore) - , m_SlideInstance(inSlideInstance) - , m_ComponentGuid(inComponentGuidProperty) -{ - m_Signaller = CreateSlideSystemSignaller(); -} -void SSlideSystem::SetPropertySystem(TPropertySystemPtr inPropertySystem) -{ - m_PropertySystem = inPropertySystem; -} - -Qt3DSDMSlideHandle SSlideSystem::CreateMasterSlide() -{ - Qt3DSDMInstanceHandle theSlideInstance = m_DataCore->CreateInstance(); - m_DataCore->DeriveInstance(theSlideInstance, m_SlideInstance); - Qt3DSDMSlideHandle retval = m_SlideCore->CreateSlide(theSlideInstance); - m_SlideGraphCore->CreateSlideGraph(retval); - GetSignalSender()->SendMasterCreated(retval); - return retval; -} - -inline bool PropertyHandlePairEquals(const TPropertyHandlePropertyInfoPair &inPair, - Qt3DSDMPropertyHandle inProperty) -{ - return (inProperty == inPair.first); -} - -void AddReferencedInstance(const TSlideEntry &inEntry, - const TPropertyHandlePropertyInfoPairList &inInfoPairList, - Qt3DSDMSlideHandle inSourceSlide, Qt3DSDMSlideHandle inDestSlide, - TInstanceHandleList &outInstances, TSlideEntryList &outReferencedEntries) -{ - TPropertyHandlePropertyInfoPairList::const_iterator theFind = - find_if<TPropertyHandlePropertyInfoPairList::const_iterator>( - inInfoPairList, std::bind(PropertyHandlePairEquals, - std::placeholders::_1, get<1>(inEntry))); - if (theFind != inInfoPairList.end()) { - TPropertyInstanceInfoPtr theInfo(theFind->second); - Qt3DSDMInstanceHandle theReferenced(theInfo->GetInstanceForProperty(get<2>(inEntry))); - if (theReferenced.Valid() - && !exists(outInstances, std::bind(equal_to<int>(), theReferenced, - std::placeholders::_1))) { - insert_unique(outInstances, theReferenced); - SValue theNewValue( - theInfo->CreateInstanceForProperty(inSourceSlide, inDestSlide, theReferenced)); - outReferencedEntries.push_back( - make_tuple(get<0>(inEntry), get<1>(inEntry), theNewValue)); - } - } -} - -void CopySpecificAnimation(Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inTarget, - TInstancePropertyPair inPropertyPair, TAnimationCorePtr inAnimationCore, - size_t inIndex) -{ - Qt3DSDMAnimationHandle theAnimation = inAnimationCore->GetAnimation( - inMaster, inPropertyPair.first, inPropertyPair.second, inIndex); - if (theAnimation.Valid()) - CopyAnimation(inAnimationCore, theAnimation, inTarget, inPropertyPair.first, - inPropertyPair.second, inIndex); -} - -void CopyAnimationIfExist(Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inTarget, - TInstancePropertyPair inPropertyPair, TPropertySystemPtr inPropertySystem, - TAnimationCorePtr inAnimationCore) -{ - DataModelDataType::Value thePropertyType = inPropertySystem->GetDataType(inPropertyPair.second); - std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(thePropertyType); - if (std::get<0>(theArity)) - do_times(std::get<1>(theArity), std::bind(CopySpecificAnimation, inMaster, inTarget, - inPropertyPair, inAnimationCore, - std::placeholders::_1)); -} - -void SetEntryValueIfNotReferenced(const TSlideEntry &inEntry, - const TInstanceHandleList &inReferencedInstances, - const TSlideEntryList &inReferencedEntries, - Qt3DSDMSlideHandle inSource, Qt3DSDMSlideHandle inDestSlide, - TPropertySystemPtr inPropertySystem, TSlideCorePtr inDestCore, - TAnimationCorePtr inAnimationCore) -{ - // Don't copy referenced instance properties. - if (exists(inReferencedInstances, std::bind(equal_to<int>(), get<0>(inEntry), - std::placeholders::_1))) - return; - TSlideEntryList::const_iterator theFind = find_if<TSlideEntryList::const_iterator>( - inReferencedEntries, - std::bind(CSimpleSlideCore::PropertyFound, get<0>(inEntry), get<1>(inEntry), - std::placeholders::_1)); - if (theFind != inReferencedEntries.end()) - inDestCore->ForceSetInstancePropertyValue(inDestSlide, get<0>(inEntry), get<1>(inEntry), - get<2>(*theFind)); - else - inDestCore->ForceSetInstancePropertyValue(inDestSlide, get<0>(inEntry), get<1>(inEntry), - get<2>(inEntry)); - CopyAnimationIfExist(inSource, inDestSlide, make_pair(get<0>(inEntry), get<1>(inEntry)), - inPropertySystem, inAnimationCore); -} - -Qt3DSDMSlideHandle SSlideSystem::CreateSlide(Qt3DSDMSlideHandle inMaster, int inIndex) -{ - return DuplicateSlide(inMaster, inIndex); -} - -Qt3DSDMSlideHandle SSlideSystem::DuplicateSlide(Qt3DSDMSlideHandle inSourceSlide, int inIndex) -{ - Qt3DSDMSlideHandle theMaster = GetMasterSlide(inSourceSlide); - Qt3DSDMInstanceHandle theSlideInstance = m_DataCore->CreateInstance(); - m_DataCore->DeriveInstance(theSlideInstance, m_SlideInstance); - Qt3DSDMSlideHandle retval = m_SlideCore->CreateSlide(theSlideInstance); - - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(theMaster, theChildren); - m_SlideCore->DeriveSlide(retval, theMaster, inIndex - 1); - int finalIndex = m_SlideCore->GetChildIndex(theMaster, retval) + 1; - if (!theChildren.empty()) { - // If the master was passed in, we get the intersecting properties - // of the master and first child. - // if another slide was passed in, we again do the intersection but we - // take the values from the source slide instead of the master. - TSlideEntryList theIntersectingEntries; - if (inSourceSlide == theMaster) - m_SlideCore->GetIntersectingProperties(theMaster, theChildren.at(0), - theIntersectingEntries); - else - m_SlideCore->GetIntersectingProperties(inSourceSlide, theMaster, - theIntersectingEntries); - - // duplicates the instance properties, from source slide (could be master (a new slide - // command) or another other slides (duplicate slide) to the newly created slide - m_DataCore->CopyInstanceProperties(this->GetSlideInstance(inSourceSlide), theSlideInstance); - - TInstanceHandleList theReferencedInstances; - TSlideEntryList theReferencedEntries; - do_all(theIntersectingEntries, - std::bind(AddReferencedInstance, std::placeholders::_1, - std::cref(m_PropertyInfoPairList), - inSourceSlide, retval, std::ref(theReferencedInstances), - std::ref(theReferencedEntries))); - do_all(theIntersectingEntries, - std::bind(SetEntryValueIfNotReferenced, std::placeholders::_1, - std::cref(theReferencedInstances), - std::cref(theReferencedEntries), inSourceSlide, retval, - m_PropertySystem, m_SlideCore, m_AnimationCore)); - } - GetSignalSender()->SendSlideCreated(theMaster, finalIndex, retval); - return retval; -} - -Qt3DSDMSlideHandle SSlideSystem::GetMasterSlide(Qt3DSDMSlideHandle inSlide) const -{ - if (inSlide.Valid() && m_SlideCore->IsSlide(inSlide)) { - Qt3DSDMSlideHandle theParent = m_SlideCore->GetParentSlide(inSlide); - if (theParent.Valid()) - return theParent; - return inSlide; - } - return 0; -} - -bool SSlideSystem::IsMasterSlide(Qt3DSDMSlideHandle inSlide) const -{ - Qt3DSDMSlideHandle theParent = m_SlideCore->GetParentSlide(inSlide); - if (!theParent.Valid()) - return true; - else - return false; -} - -inline bool GraphGuidMatches(Qt3DSDMSlideGraphHandle inGraph, TSlideGraphCorePtr inSlideGraph, - TSlideCorePtr inSlideCore, TDataCorePtr inDataCore, - Qt3DSDMPropertyHandle inProperty, SValue inValue) -{ - Qt3DSDMSlideHandle theMaster = inSlideGraph->GetGraphRoot(inGraph); - Qt3DSDMInstanceHandle theInstance = inSlideCore->GetSlideInstance(theMaster); - SValue theValue; - if (inDataCore->GetInstancePropertyValue(theInstance, inProperty, theValue) - && Equals(inValue, theValue.toOldSkool())) - return true; - return false; -} - -Qt3DSDMSlideHandle SSlideSystem::GetMasterSlideByComponentGuid(SLong4 inGuid) const -{ - TSlideGraphHandleList theGraphs; - m_SlideGraphCore->GetSlideGraphs(theGraphs); - TSlideGraphHandleList::iterator theFind = find_if<TSlideGraphHandleList::iterator>( - theGraphs, std::bind(GraphGuidMatches, - std::placeholders::_1, m_SlideGraphCore, m_SlideCore, m_DataCore, - m_ComponentGuid, inGuid)); - if (theFind != theGraphs.end()) - return m_SlideGraphCore->GetGraphRoot(*theFind); - return 0; -} - -void InsertIfReferencedProperty(const TSlideEntry &inEntry, - const TPropertyHandlePropertyInfoPairList &inRefProperties, - TInstanceHandleList &inInstances) -{ - TPropertyHandlePropertyInfoPairList::const_iterator theFind = - find_if<TPropertyHandlePropertyInfoPairList::const_iterator>( - inRefProperties, std::bind(PropertyHandlePairEquals, std::placeholders::_1, get<1>(inEntry))); - if (theFind != inRefProperties.end()) { - Qt3DSDMInstanceHandle theInstance(theFind->second->GetInstanceForProperty(get<2>(inEntry))); - if (theInstance.Valid()) - inInstances.push_back(theInstance); - } -} - -void SSlideSystem::InsertEntryAndPropertyInstance(const TSlideEntry &inEntry, - TInstanceHandleList &inInstances, - Qt3DSDMSlideHandle inSlide) -{ - Qt3DSDMInstanceHandle theEntryInstance = get<0>(inEntry); - if (find(inInstances.begin(), inInstances.end(), theEntryInstance) == inInstances.end()) { - TGraphSlidePair thePair = m_SlideGraphCore->GetAssociatedGraph(theEntryInstance); - if (thePair.second == inSlide) // if this instance belongs to this slide - { - // get all references belong to this instance (ex: image instances that belong to this - // material instance) - qt3dsdm::SValue theValue; - for (TPropertyHandlePropertyInfoPairList::iterator theIter = - m_PropertyInfoPairList.begin(); - theIter != m_PropertyInfoPairList.end(); ++theIter) { - if (m_DataCore->HasAggregateInstanceProperty( - theEntryInstance, - theIter->first) // check if the property exists before querying the value - && m_DataCore->GetInstancePropertyValue( - theEntryInstance, theIter->first, - theValue)) // this function may throw error if the property doesn't exist - { - Qt3DSDMInstanceHandle theInstance( - theIter->second->GetInstanceForProperty(theValue.toOldSkool())); - if (theInstance.Valid()) - inInstances.push_back(theInstance); - } - } - // get this instance as well - inInstances.push_back(theEntryInstance); - } - } -} - -// Delete the referenced instances of this slide -// This function is very similar to GetReferencedInstances -// You change one function, you need to change the other function -void SSlideSystem::DeleteReferencedInstances(Qt3DSDMSlideHandle inSlide) -{ - // Recursively delete the children of this slide - // Usually the slide has children if it is a Master slide (for example when deleting a - // Component) - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(inSlide, theChildren); - do_all(theChildren, std::bind(&SSlideSystem::DeleteReferencedInstances, this, - std::placeholders::_1)); - - // Delete the referenced instances from this slide - TSlideEntryList theEntries; - m_SlideCore->GetSlidePropertyEntries(inSlide, theEntries); - - // Run through all entries, if you find a reference property delete the associated instance. - // This is for properties that are set on this slide (because you can set property on slide or - // on instance) - TInstanceHandleList theReferencedInstances; - do_all(theEntries, - std::bind(InsertIfReferencedProperty, std::placeholders::_1, - std::cref(m_PropertyInfoPairList), - std::ref(theReferencedInstances))); - do_all(theReferencedInstances, std::bind(&IDataCore::DeleteInstance, m_DataCore, - std::placeholders::_1)); - - // Run through all entries, delete all instances that belong to this slide and its reference - // property instances - // This is for properties that are set on instance - theReferencedInstances.clear(); - do_all(theEntries, std::bind(&SSlideSystem::InsertEntryAndPropertyInstance, this, - std::placeholders::_1, - std::ref(theReferencedInstances), inSlide)); - do_all(theReferencedInstances, std::bind(&IDataCore::DeleteInstance, m_DataCore, - std::placeholders::_1)); -} - -// Get the referenced instances of this slide -// This function is very similar to DeleteReferencedInstances -// You change one function, you need to change the other function -void SSlideSystem::GetReferencedInstances(Qt3DSDMSlideHandle inSlide, - TInstanceHandleList &outReferencedInstances) -{ - // Recursively get the children of this slide - // Usually the slide has children if it is a Master slide (for example Component) - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(inSlide, theChildren); - do_all(theChildren, std::bind(&SSlideSystem::GetReferencedInstances, this, - std::placeholders::_1, - std::ref(outReferencedInstances))); - - // Get the referenced instances from this slide - TSlideEntryList theEntries; - m_SlideCore->GetSlidePropertyEntries(inSlide, theEntries); - - // Run through all entries, if you find a reference property get the associated instance. - // This is for properties that are set on this slide (because you can set property on slide or - // on instance) - do_all(theEntries, - std::bind(InsertIfReferencedProperty, std::placeholders::_1, - std::cref(m_PropertyInfoPairList), - std::ref(outReferencedInstances))); - - // Run through all entries, get all instances that belong to this slide and its reference - // property instances - // This is for properties that are set on instance - do_all(theEntries, std::bind(&SSlideSystem::InsertEntryAndPropertyInstance, this, - std::placeholders::_1, - std::ref(outReferencedInstances), inSlide)); -} - -void SSlideSystem::DeleteSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) -{ - Qt3DSDMSlideHandle theChild = GetSlideByIndex(inMaster, inIndex); - TInstanceHandleList theInstances; - if (theChild.Valid()) { - DeleteReferencedInstances(theChild); - m_SlideCore->DeleteSlide(theChild, theInstances); - do_all(theInstances, std::bind(&IDataCore::DeleteInstance, m_DataCore, - std::placeholders::_1)); - } - if (inIndex == 0) - GetSignalSender()->SendMasterDeleted(inMaster); - else - GetSignalSender()->SendSlideDeleted(inMaster, (int)inIndex, theChild); -} - -void SSlideSystem::GetSlideReferencedInstances(Qt3DSDMSlideHandle inMaster, size_t inIndex, - TInstanceHandleList &outReferencedInstances) -{ - outReferencedInstances.clear(); - Qt3DSDMSlideHandle theChild = GetSlideByIndex(inMaster, inIndex); - if (theChild.Valid()) { - GetReferencedInstances(theChild, outReferencedInstances); - } -} - -Qt3DSDMSlideHandle SSlideSystem::GetSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) const -{ - if (inIndex == 0) - return inMaster; - --inIndex; - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(inMaster, theChildren); - if (inIndex < theChildren.size()) - return theChildren[inIndex]; - return Qt3DSDMSlideHandle(); -} - -void SSlideSystem::SetActiveSlide(Qt3DSDMSlideHandle inMaster, size_t inIndex) -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(inMaster); - Qt3DSDMSlideHandle theActiveSlide = inMaster; - if (inIndex > 0) - theActiveSlide = GetSlideByIndex(inMaster, inIndex); - Qt3DSDMSlideHandle theOldSlide = m_SlideGraphCore->GetGraphActiveSlide(theGraph); - m_SlideGraphCore->SetGraphActiveSlide(theGraph, theActiveSlide); - GetSignalSender()->SendActiveSlide(inMaster, (int)inIndex, theOldSlide, theActiveSlide); -} - -size_t SSlideSystem::GetSlideCount(Qt3DSDMSlideHandle inMaster) const -{ - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(inMaster, theChildren); - return 1 + theChildren.size(); -} - -void SSlideSystem::RearrangeSlide(Qt3DSDMSlideHandle inMaster, size_t inOldIndex, size_t inNewIndex) -{ - if (inOldIndex == 0) - throw RearrangeSlideArgumentsMustNotBeZero(L""); - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(inMaster, theChildren); - Qt3DSDMSlideHandle theChild = theChildren.at(inOldIndex - 1); - m_SlideCore->DeriveSlide(theChild, inMaster, (int)inNewIndex - 1); - GetSignalSender()->SendSlideRearranged(inMaster, (int)inOldIndex, (int)inNewIndex); -} - -void SSlideSystem::SetComponentSeconds(Qt3DSDMSlideHandle inSlide, float inSeconds) -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inSlide)); - m_SlideCore->SetSlideTime(m_SlideGraphCore->GetGraphActiveSlide(theGraph), inSeconds); -} - -float SSlideSystem::GetComponentSeconds(Qt3DSDMSlideHandle inSlide) const -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inSlide)); - return m_SlideCore->GetSlideTime(m_SlideGraphCore->GetGraphActiveSlide(theGraph)); -} - -long SSlideSystem::GetComponentSecondsLong(Qt3DSDMSlideHandle inSlide) const -{ - float seconds(GetComponentSeconds(inSlide)); - return static_cast<long>((seconds * 1000) + .5f); -} - -long SSlideSystem::GetComponentSecondsLong(Qt3DSDMInstanceHandle inInstance) const -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetAssociatedGraph(inInstance).first; - float seconds = m_SlideCore->GetSlideTime(m_SlideGraphCore->GetGraphActiveSlide(theGraph)); - return static_cast<long>((seconds * 1000) + .5f); -} - -SInstanceSlideInformation -SSlideSystem::GetInstanceSlideInformation(Qt3DSDMInstanceHandle inInstance) const -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - Qt3DSDMSlideHandle theAssociatedSlide(theGraphSlidePair.second); - if (theAssociatedSlide.Valid() == false) - return SInstanceSlideInformation(); - Qt3DSDMSlideHandle theMasterSlide(GetMasterSlide(theGraphSlidePair.second)); - Qt3DSDMSlideHandle theActiveSlide( - m_SlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first)); - float seconds = m_SlideCore->GetSlideTime(theActiveSlide); - long theMilliseconds = static_cast<long>((seconds * 1000) + .5f); - return SInstanceSlideInformation(theAssociatedSlide, theMasterSlide, theActiveSlide, - theMilliseconds); -} - -/** - * Use the instance for storing information such as name, or the GUID of the object - * this slide links to. - */ -Qt3DSDMInstanceHandle SSlideSystem::GetSlideInstance(Qt3DSDMSlideHandle inSlide) const -{ - return m_SlideCore->GetSlideInstance(inSlide); -} -/** - * Reverse lookup into the slide system so you can match slides to instances. - */ -Qt3DSDMSlideHandle SSlideSystem::GetSlideByInstance(Qt3DSDMInstanceHandle inSlide) const -{ - return m_SlideCore->GetSlideByInstance(inSlide); -} - -/** - * Slide may be either a master slide - */ -void SSlideSystem::AssociateInstanceWithSlide(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inSlide)); - m_SlideGraphCore->AssociateInstance(theGraph, inSlide, inInstance); - GetSignalSender()->SendInstanceAssociated(inSlide, inInstance); -} - -Qt3DSDMSlideHandle SSlideSystem::GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance) const -{ - return m_SlideGraphCore->GetAssociatedGraph(inInstance).second; -} - -/** - * This gets the instances that resides int the SlideGraph, i.e. all the instances in all the - *slides for this component/scene - * TODO rename this to make it more clear - */ -void SSlideSystem::GetAssociatedInstances(Qt3DSDMSlideHandle inMaster, - TSlideInstancePairList &outAssociations) const -{ - m_SlideGraphCore->GetAssociatedInstances( - m_SlideGraphCore->GetSlideGraph(GetMasterSlide(inMaster)), outAssociations); -} - -/** - * Gets all the instances in this slide - */ -void SSlideSystem::GetAssociatedInstances(Qt3DSDMSlideHandle inSlide, - TInstanceHandleList &outAssociations) const -{ - Qt3DSDMSlideHandle theMasterSlide = GetMasterSlide(inSlide); - TSlideInstancePairList theGraphInstances; - m_SlideGraphCore->GetAssociatedInstances(m_SlideGraphCore->GetSlideGraph(theMasterSlide), - theGraphInstances); - for (TSlideInstancePairList::const_iterator theIter = theGraphInstances.begin(); - theIter != theGraphInstances.end(); ++theIter) { - if (theIter->first == inSlide || theIter->first == theMasterSlide) { - // in the current slide or master slide - outAssociations.push_back(theIter->second); - } - } -} - -void DeleteInstanceIfExistsAsProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, TSlideCorePtr inSlideCore, - TPropertyInstanceInfoPtr inPropertyInfoPtr, - TDataCorePtr inDataCore) -{ - SValue theValue; - if (inSlideCore->GetSpecificInstancePropertyValue(inSlide, inInstance, inProperty, theValue)) { - Qt3DSDMInstanceHandle theInstance(inPropertyInfoPtr->GetInstanceForProperty(theValue)); - if (theInstance.Valid()) - inDataCore->DeleteInstance(theInstance); - } -} - -void SSlideSystem::LinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetAssociatedGraph(inInstance).first; - Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphRoot(theGraph); - TPropertyHandlePropertyInfoPairList::const_iterator theFind = - find_if<TPropertyHandlePropertyInfoPairList::const_iterator>( - m_PropertyInfoPairList, std::bind(PropertyHandlePairEquals, - std::placeholders::_1, inProperty)); - if (theFind != m_PropertyInfoPairList.end()) { - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(theSlide, theChildren); - do_all(theChildren, std::bind(DeleteInstanceIfExistsAsProperty, std::placeholders::_1, inInstance, - inProperty, m_SlideCore, theFind->second, m_DataCore)); - } - m_SlideCore->ClearChildrenPropertyValues(theSlide, inInstance, inProperty); - GetSignalSender()->SendPropertyLinked(theSlide, inInstance, inProperty); -} - -void ClearPropertyValueIfLinked(Qt3DSDMSlideHandle inMaster, const TSlideHandleList &inChildren, - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - TSlideCorePtr inSlideCore) -{ - if (inChildren.empty()) - return; - - if (inSlideCore->ContainsProperty(inChildren.at(0), inInstance, - inProperty)) // if property is linked, - inSlideCore->ClearChildrenPropertyValues(inMaster, inInstance, - inProperty); // get it off non-master slides -} - -void SetReferencedEntryValue(Qt3DSDMSlideHandle inMaster, Qt3DSDMSlideHandle inDestSlide, - TPropertyInstanceInfoPtr inInfo, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - Qt3DSDMInstanceHandle inReferencedInstance, TSlideCorePtr inSlideCore) -{ - SValue theNewValue( - inInfo->CreateInstanceForProperty(inMaster, inDestSlide, inReferencedInstance)); - inSlideCore->ForceSetInstancePropertyValue(inDestSlide, inInstance, inProperty, theNewValue); -} - -void SSlideSystem::UnlinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetAssociatedGraph(inInstance).first; - Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphRoot(theGraph); - SValue theValue; - SValue theTempValue; - if (!m_SlideCore->GetInstancePropertyValue(theSlide, inInstance, inProperty, theValue)) { - if (!m_PropertySystem->GetInstancePropertyValue(inInstance, inProperty, theTempValue)) - throw PropertyLinkError(L""); - theValue = theTempValue.toOldSkool(); - } - - m_SlideCore->ForceSetInstancePropertyValue(theSlide, inInstance, inProperty, theValue); - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(theSlide, theChildren); - - Qt3DSDMInstanceHandle theReferenced; - TPropertyHandlePropertyInfoPairList::const_iterator theFind = - find_if<TPropertyHandlePropertyInfoPairList::const_iterator>( - m_PropertyInfoPairList, std::bind(PropertyHandlePairEquals, - std::placeholders::_1, inProperty)); - TPropertyInstanceInfoPtr theInfo; - if (theFind != m_PropertyInfoPairList.end()) { - theInfo = theFind->second; - theReferenced = theInfo->GetInstanceForProperty(theValue); - } - if (theReferenced.Valid()) { - TPropertyHandleList theProperties; - m_PropertySystem->GetAggregateInstanceProperties( - theReferenced, - theProperties); // TODO: We should make the method return the custom properties. - // Remove the property instance's unlinked properties from non-master slides. - do_all(theProperties, - std::bind(ClearPropertyValueIfLinked, theSlide, std::cref(theChildren), - theReferenced, std::placeholders::_1, m_SlideCore)); - // Remove all property values from the children from that instance. - do_all(theChildren, std::bind(SetReferencedEntryValue, theSlide, - std::placeholders::_1, theInfo, inInstance, - inProperty, theReferenced, m_SlideCore)); - } else { - do_all(theChildren, std::bind(&ISlideCore::ForceSetInstancePropertyValue, m_SlideCore, - std::placeholders::_1, - inInstance, inProperty, theValue)); - do_all(theChildren, - std::bind(CopyAnimationIfExist, theSlide, std::placeholders::_1, make_pair(inInstance, inProperty), - m_PropertySystem, m_AnimationCore)); - } - GetSignalSender()->SendPropertyUnlinked(theSlide, inInstance, inProperty); -} - -bool SSlideSystem::IsPropertyLinked(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - Qt3DSDMSlideGraphHandle theGraph = theGraphSlidePair.first; - if (!theGraph.Valid()) - return false; - - Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphRoot(theGraph); - if (theGraphSlidePair.second != theSlide) - return false; - - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(theSlide, theChildren); - bool containsProperty = false; - for (TSlideHandleList::iterator theIter = theChildren.begin(); - theIter != theChildren.end() && !containsProperty; ++theIter) { - containsProperty = - containsProperty || m_SlideCore->ContainsProperty(*theIter, inInstance, inProperty); - } - - return !containsProperty; -} - -bool SSlideSystem::CanPropertyBeLinked(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - if (theGraphSlidePair.first.Valid() - && theGraphSlidePair.second == m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first)) - return true; - return false; -} - -bool SSlideSystem::GetSlidePropertyValue(size_t inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - Qt3DSDMSlideGraphHandle theGraph = theGraphSlidePair.first; - if (!theGraph.Valid()) - return false; - Qt3DSDMSlideHandle theSlide = GetSlideByIndex(m_SlideGraphCore->GetGraphRoot(theGraph), inSlide); - if (!theSlide.Valid()) - return false; - return m_SlideCore->GetSpecificInstancePropertyValue(theSlide, inInstance, inProperty, - outValue); -} - -void AddEntriesToHash(const TSlideEntryList &theSlideEntries, TSlideEntryHash &theEntryHash, - TInstancePropertyPairList &outProperties) -{ - for (size_t idx = 0, end = theSlideEntries.size(); idx < end; ++idx) { - const TSlideEntry &theEntry(theSlideEntries[idx]); - pair<TSlideEntryHash::iterator, bool> insertRecord(theEntryHash.insert( - make_pair(TSlideInstancePropertyPair(get<0>(theEntry), get<1>(theEntry)), - SInternValue::ISwearThisHasAlreadyBeenInternalized(get<2>(theEntry))))); - if (insertRecord.second) - outProperties.push_back(insertRecord.first->first); - } -} - -void SSlideSystem::GetUnionOfProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide2, - TInstancePropertyPairList &outProperties) const -{ - TSlideEntryHash theEntryHash; - TSlideEntryList theSlideEntries; - if (m_SlideCore->IsSlide(inSlide1)) { - m_SlideCore->GetSlidePropertyEntries(inSlide1, theSlideEntries); - AddEntriesToHash(theSlideEntries, theEntryHash, outProperties); - } - if (m_SlideCore->IsSlide(inSlide2)) { - m_SlideCore->GetSlidePropertyEntries(inSlide2, theSlideEntries); - AddEntriesToHash(theSlideEntries, theEntryHash, outProperties); - } -} - -void SSlideSystem::SetActiveSlide(Qt3DSDMSlideHandle inSlide) -{ - Qt3DSDMSlideHandle theMaster = GetMasterSlide(inSlide); - int theIndex = GetSlideIndex(inSlide); - SetActiveSlide(theMaster, theIndex); -} - -Qt3DSDMSlideHandle SSlideSystem::GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - Qt3DSDMSlideGraphHandle theGraph = theGraphSlidePair.first; - if (!theGraph.Valid()) - return 0; - Qt3DSDMSlideHandle theSlide = m_SlideGraphCore->GetGraphActiveSlide(theGraph); - if (theSlide.Valid()) { - if (m_SlideCore->ContainsProperty(theSlide, inInstance, inProperty)) - return theSlide; - theSlide = m_SlideCore->GetParentSlide(theSlide); - if (theSlide.Valid() && m_SlideCore->ContainsProperty(theSlide, inInstance, inProperty)) - return theSlide; - return theGraphSlidePair.second; - } - return 0; -} - -bool SSlideSystem::SlideValid(Qt3DSDMSlideHandle inSlide) const -{ - return m_SlideCore->HandleValid(inSlide); -} - -int SSlideSystem::GetSlideIndex(Qt3DSDMSlideHandle inSlide) const -{ - Qt3DSDMSlideHandle theMaster = GetMasterSlide(inSlide); - if (inSlide.Valid() && inSlide != theMaster) - return m_SlideCore->GetChildIndex(theMaster, inSlide) + 1; - return 0; -} - -int SSlideSystem::GetActiveSlideIndex(Qt3DSDMSlideHandle inMaster) const -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(inMaster); - Qt3DSDMSlideHandle theActiveSlide = m_SlideGraphCore->GetGraphActiveSlide(theGraph); - if (theActiveSlide == inMaster) - return 0; - return GetSlideIndex(theActiveSlide); -} - -Qt3DSDMSlideHandle SSlideSystem::GetActiveSlide(Qt3DSDMSlideHandle inMaster) const -{ - Qt3DSDMSlideGraphHandle theGraph = m_SlideGraphCore->GetSlideGraph(inMaster); - return m_SlideGraphCore->GetGraphActiveSlide(theGraph); -} - -Qt3DSDMInstanceHandle SSlideSystem::GetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide) const -{ - TIntIntMap::const_iterator theIter = m_SlideSelectedInstances.find(inSlide); - if (theIter != m_SlideSelectedInstances.end() && m_DataCore->IsInstance(theIter->second)) - return theIter->second; - return 0; -} - -void SSlideSystem::SetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) -{ - m_SlideSelectedInstances[inSlide] = inInstance; -} - -void SSlideSystem::RegisterPropertyInstance(Qt3DSDMPropertyHandle inPropertyHandle, - TPropertyInstanceInfoPtr inPropertyInfo) -{ - m_PropertyInfoPairList.push_back(make_pair(inPropertyHandle, inPropertyInfo)); -} - -ISlideSystemSignalProvider *SSlideSystem::GetSignalProvider() -{ - return dynamic_cast<ISlideSystemSignalProvider *>(m_Signaller.get()); -} - -ISlideSystemSignalSender *SSlideSystem::GetSignalSender() -{ - return dynamic_cast<ISlideSystemSignalSender *>(m_Signaller.get()); -} - -qt3dsdm::Qt3DSDMSlideHandle SSlideSystem::GetApplicableSlide(Qt3DSDMInstanceHandle inHandle) -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inHandle); - if (!theGraphSlidePair.first.Valid()) - return Qt3DSDMSlideHandle(); - - Qt3DSDMSlideHandle theMaster = m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first); - if (theGraphSlidePair.second != theMaster) - return theGraphSlidePair.second; - - return theMaster; -} - -qt3dsdm::Qt3DSDMSlideHandle SSlideSystem::GetApplicableSlide(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inHandle); - if (!theGraphSlidePair.first.Valid()) - return Qt3DSDMSlideHandle(); - - Qt3DSDMSlideHandle theMaster = m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first); - if (theGraphSlidePair.second != theMaster) - return theGraphSlidePair.second; - - Qt3DSDMSlideHandle theActive = m_SlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first); - if (m_SlideCore->ContainsProperty(theActive, inHandle, inProperty)) - return theActive; - - return theMaster; -} - -bool SSlideSystem::GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const -{ - return m_SlideCore->GetInstancePropertyValue(inSlide, inInstance, inProperty, outValue); -} - -bool SSlideSystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - if (theGraphSlidePair.first.Valid()) { - // Check to see if the object is on the master slide; - if (theGraphSlidePair.second == m_SlideGraphCore->GetGraphRoot(theGraphSlidePair.first)) { - TSlideHandleList theChildren; - m_SlideCore->GetChildSlides(theGraphSlidePair.second, theChildren); - // See if the value exists on slide 1. - if (!theChildren.empty() - && m_SlideCore->GetSpecificInstancePropertyValue(theChildren.at(0), inInstance, - inProperty, outValue)) - return true; - } - - if (m_SlideCore->GetSpecificInstancePropertyValue(theGraphSlidePair.second, inInstance, - inProperty, outValue)) - return true; - } - return false; -} - -void SSlideSystem::ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - m_SlideCore->ForceSetInstancePropertyValue(inSlide, inInstance, inProperty, inValue); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/SlideSystem.h b/src/Authoring/QT3DSDM/Systems/SlideSystem.h deleted file mode 100644 index 1ea3f816..00000000 --- a/src/Authoring/QT3DSDM/Systems/SlideSystem.h +++ /dev/null @@ -1,179 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef SLIDESYSTEMH -#define SLIDESYSTEMH -#include "Qt3DSDMDataCore.h" -#include "Qt3DSDMSlideCore.h" -#include "Qt3DSDMSlideGraphCore.h" -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMSlides.h" -#include "Qt3DSDMAnimation.h" -#include "StudioPropertySystem.h" -#include "SignalsImpl.h" - -/** - * The systems aggregate the various cores and provide further information or - * integrity checking taking the various cores into account. - */ - -namespace qt3dsdm { - -typedef std::pair<Qt3DSDMPropertyHandle, TPropertyInstanceInfoPtr> TPropertyHandlePropertyInfoPair; -typedef std::vector<TPropertyHandlePropertyInfoPair> TPropertyHandlePropertyInfoPairList; -/** - * Provides more thorough checking and will return an appropriate - * slide graph when calling GetSlideGraph - */ -struct SSlideSystem : public ISlideSystem -{ - Q_DISABLE_COPY(SSlideSystem) - - TDataCorePtr m_DataCore; // TODO: We might want to throw this away and use the PropertySystem, - // unless we have a clean seperate of IPropertySystem and IDataCore - TPropertySystemPtr m_PropertySystem; - TSlideCorePtr m_SlideCore; - TSlideGraphCorePtr m_SlideGraphCore; - TAnimationCorePtr m_AnimationCore; - Qt3DSDMInstanceHandle m_SlideInstance; - Qt3DSDMPropertyHandle m_ComponentGuid; - std::shared_ptr<ISignalItem> m_Signaller; - TPropertyHandlePropertyInfoPairList m_PropertyInfoPairList; - typedef std::unordered_map<int, int> TIntIntMap; - TIntIntMap m_SlideSelectedInstances; - - SSlideSystem(TDataCorePtr inDataCore, TSlideCorePtr inSlideCore, - TSlideGraphCorePtr inSlideGraphCore, TAnimationCorePtr inAnimationCore, - Qt3DSDMInstanceHandle inSlideInstance, - Qt3DSDMPropertyHandle inComponentGuidProperty); - - void SetPropertySystem(TPropertySystemPtr inPropertySystem); - - Qt3DSDMSlideHandle CreateMasterSlide() override; - Qt3DSDMSlideHandle CreateSlide(Qt3DSDMSlideHandle inMaster, int inIndex = -1) override; - Qt3DSDMSlideHandle DuplicateSlide(Qt3DSDMSlideHandle inSourceSlide, int inDestIndex = -1) override; - Qt3DSDMSlideHandle GetMasterSlide(Qt3DSDMSlideHandle inSlide) const override; - bool IsMasterSlide(Qt3DSDMSlideHandle inSlide) const override; - Qt3DSDMSlideHandle GetMasterSlideByComponentGuid(SLong4 inGuid) const override; - // Indexes are 1 based. Index 0 refers to the master slide; you can't delete this. - void DeleteSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) override; - void GetSlideReferencedInstances(Qt3DSDMSlideHandle inMaster, size_t inIndex, - TInstanceHandleList &outReferencedInstances) override; - Qt3DSDMSlideHandle GetSlideByIndex(Qt3DSDMSlideHandle inMaster, size_t inIndex) const override; - void SetActiveSlide(Qt3DSDMSlideHandle inMaster, size_t inIndex) override; - size_t GetSlideCount(Qt3DSDMSlideHandle inMaster) const override; - void RearrangeSlide(Qt3DSDMSlideHandle inMaster, size_t inOldIndex, size_t inNewIndex) override; - - void SetComponentSeconds(Qt3DSDMSlideHandle inSlide, float inSeconds) override; - float GetComponentSeconds(Qt3DSDMSlideHandle inSlide) const override; - long GetComponentSecondsLong(Qt3DSDMSlideHandle inSlide) const override; - // For any given instance, find the current seconds via backtracking to the graph, finding the - // active - // slide, and return. - long GetComponentSecondsLong(Qt3DSDMInstanceHandle inInstance) const override; - virtual SInstanceSlideInformation - GetInstanceSlideInformation(Qt3DSDMInstanceHandle inInstance) const override; - /** - * Use the instance for storing information such as name, or the GUID of the object - * this slide links to. - */ - Qt3DSDMInstanceHandle GetSlideInstance(Qt3DSDMSlideHandle inInstance) const override; - /** - * Reverse lookup into the slide system so you can match slides to instances. - */ - Qt3DSDMSlideHandle GetSlideByInstance(Qt3DSDMInstanceHandle inInstance) const override; - - /** - * Slide may be either a master slide or a normal slide. This will associate this instance - * with this set of slides. Property lookups (using the above IInstancePropertyCore interface) - * will now run through the slide set before hitting the main data core database. - */ - void AssociateInstanceWithSlide(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance) override; - Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance) const override; - void GetAssociatedInstances( - Qt3DSDMSlideHandle inMaster, - std::vector<std::pair<Qt3DSDMSlideHandle, Qt3DSDMInstanceHandle>> &outAssociations) const override; - void GetAssociatedInstances(Qt3DSDMSlideHandle inSlide, - TInstanceHandleList &outAssociations) const override; - void LinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override; - void UnlinkProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override; - bool IsPropertyLinked(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - bool CanPropertyBeLinked(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - bool GetSlidePropertyValue(size_t inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) override; - void GetUnionOfProperties(Qt3DSDMSlideHandle inSlide1, Qt3DSDMSlideHandle inSlide, - TInstancePropertyPairList &outProperties) const override; - - void SetActiveSlide(Qt3DSDMSlideHandle inSlide) override; - Qt3DSDMSlideHandle GetAssociatedSlide(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - - bool SlideValid(Qt3DSDMSlideHandle inSlide) const override; - int GetSlideIndex(Qt3DSDMSlideHandle inSlide) const override; - int GetActiveSlideIndex(Qt3DSDMSlideHandle inMaster) const override; - Qt3DSDMSlideHandle GetActiveSlide(Qt3DSDMSlideHandle inMaster) const override; - Qt3DSDMInstanceHandle GetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide) const override; - void SetSlideSelectedInstance(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance) override; - - Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle) override; - Qt3DSDMSlideHandle GetApplicableSlide(Qt3DSDMInstanceHandle inHandle, - Qt3DSDMPropertyHandle inProperty) override; - - bool GetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const override; - void ForceSetInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) override; - - void RegisterPropertyInstance(Qt3DSDMPropertyHandle inPropertyHandle, - TPropertyInstanceInfoPtr inPropertyInfo) override; - - virtual ISlideSystemSignalProvider *GetSignalProvider(); - -private: - virtual ISlideSystemSignalSender *GetSignalSender(); - // helper method - void InsertEntryAndPropertyInstance(const TSlideEntry &inEntry, - TInstanceHandleList &inInstances, - Qt3DSDMSlideHandle inSlide); - void DeleteReferencedInstances(Qt3DSDMSlideHandle inSlide); - void GetReferencedInstances(Qt3DSDMSlideHandle inSlide, - TInstanceHandleList &outReferencedInstances); -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/StandardExtensions.h b/src/Authoring/QT3DSDM/Systems/StandardExtensions.h deleted file mode 100644 index a9946002..00000000 --- a/src/Authoring/QT3DSDM/Systems/StandardExtensions.h +++ /dev/null @@ -1,196 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef STANDARDEXTENSIONSH -#define STANDARDEXTENSIONSH -#include <algorithm> - -namespace qt3dsdm { -template <typename TContainer, typename TPred> -inline void erase_if(TContainer &inContainer, TPred inPred) -{ - inContainer.erase(std::remove_if(inContainer.begin(), inContainer.end(), inPred), - inContainer.end()); -} - -template <typename TRetType, typename TContainerType, typename TPred> -inline TRetType find_if(TContainerType &inContainer, TPred inPred) -{ - return std::find_if(inContainer.begin(), inContainer.end(), inPred); -} - -template <typename TContainer, typename TTransaction> -inline void do_all(TContainer &inContainer, TTransaction inTransaction) -{ - std::for_each(inContainer.begin(), inContainer.end(), inTransaction); -} - -template <typename TNumType, typename TTransaction> -inline void do_times(TNumType numberOfTimes, TTransaction inTransaction) -{ - for (TNumType index = 0; index < numberOfTimes; ++index) - inTransaction(index); -} - -template <typename TCountFunc, typename TItemByIndexFunc, typename TTransaction> -inline void for_each_item(TCountFunc inCountFunc, TItemByIndexFunc inItemByIndex, - TTransaction inTransaction) -{ - int theEnd = static_cast<int>(inCountFunc()); - for (int index = 0; index < theEnd; ++index) - inTransaction(inItemByIndex(index)); -} - -template <typename TContainerType, typename TItemType> -inline void insert_unique(TContainerType &inContainer, const TItemType &inItem) -{ - if (find(inContainer.begin(), inContainer.end(), inItem) == inContainer.end()) - inContainer.insert(inContainer.end(), inItem); -} - -template <typename TContainerType, typename TItemType, typename TPred> -inline void insert_unique_if(TContainerType &inContainer, const TItemType &inItem, TPred inPred) -{ - if (find_if(inContainer.begin(), inContainer.end(), inPred) == inContainer.end()) - inContainer.insert(inContainer.end(), inItem); -} - -template <typename TItemType> -inline TItemType identity(const TItemType &inValue) -{ - return inValue; -} - -template <typename TItemType, typename TOutContainerType> -inline void transformv_all(const std::vector<TItemType> &inSource, TOutContainerType &outDest) -{ - outDest.resize(inSource.size()); - std::transform(inSource.begin(), inSource.end(), outDest.begin(), identity<TItemType>); -} - -template <typename TContainerType, typename Pred> -inline bool exists(TContainerType &inContainer, Pred inPredicate) -{ - return std::find_if(inContainer.begin(), inContainer.end(), inPredicate) != inContainer.end(); -} - -// Always return a default value (useful for default true for false) -template <typename TRetType> -inline TRetType always(TRetType inValue) -{ - return inValue; -} - -template <typename TRetType, typename TIgnoreType> -inline TRetType always_ignore(TIgnoreType, TRetType inValue) -{ - return inValue; -} - -template <typename TArgument, typename TTransaction, typename TPredicate> -inline void predicate_apply(TArgument inArgument, TTransaction inTransaction, - TPredicate inPredicate) -{ - if (inPredicate(inArgument)) - inTransaction(inArgument); -} - -template <typename TItemType> -inline void assign_to(const TItemType &inSource, TItemType &inDest) -{ - inDest = inSource; -} - -template <typename TPredType, typename TArgType> -bool complement(TPredType inPredicate, TArgType inArgument) -{ - return !(inPredicate(inArgument)); -} - -template <typename TItemType, typename TPredicate> -void insert_or_update(const TItemType &inItem, std::vector<TItemType> &inItems, - TPredicate inPredicate) -{ - typename std::vector<TItemType>::iterator theIter = - find_if<typename std::vector<TItemType>::iterator>(inItems, inPredicate); - if (theIter == inItems.end()) - inItems.push_back(inItem); - else - *theIter = inItem; -} - -template <typename TItemType> -typename std::vector<TItemType>::iterator binary_sort_find(std::vector<TItemType> &inItems, - const TItemType &inItem) -{ - typedef typename std::vector<TItemType>::iterator TIterType; - TIterType insertPos = std::lower_bound(inItems.begin(), inItems.end(), inItem); - if (insertPos != inItems.end() && *insertPos == inItem) - return insertPos; - return inItems.end(); -} - -template <typename TItemType, typename TPredicate> -std::pair<typename std::vector<TItemType>::iterator, bool> -binary_sort_insert_unique(std::vector<TItemType> &inItems, const TItemType &inItem, - TPredicate inPredicate) -{ - typedef typename std::vector<TItemType>::iterator TIterType; - TIterType insertPos = std::lower_bound(inItems.begin(), inItems.end(), inItem, inPredicate); - // OK, insertPos can equal begin, it can equal end, or somewhere in between. - // If it doesn't equal end, then we may be pointing at the object and we let - // the caller figure out what to do. Else we insert - if (insertPos != inItems.end() && *insertPos == inItem) - return std::make_pair(insertPos, false); - size_t diff = insertPos - inItems.begin(); - inItems.insert(insertPos, inItem); - return std::make_pair(inItems.begin() + diff, true); -} - -template <typename TItemType> -std::pair<typename std::vector<TItemType>::iterator, bool> -binary_sort_insert_unique(std::vector<TItemType> &inItems, const TItemType &inItem) -{ - return binary_sort_insert_unique(inItems, inItem, std::less<TItemType>()); -} - -template <typename TItemType> -bool binary_sort_erase(std::vector<TItemType> &inItems, const TItemType &inItem) -{ - typedef typename std::vector<TItemType>::iterator TIterType; - TIterType insertPos = binary_sort_find(inItems, inItem); - if (insertPos != inItems.end()) { - inItems.erase(insertPos); - return true; - } - return false; -} -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/StudioAnimationSystem.cpp b/src/Authoring/QT3DSDM/Systems/StudioAnimationSystem.cpp deleted file mode 100644 index 2b788880..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioAnimationSystem.cpp +++ /dev/null @@ -1,610 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "StudioAnimationSystem.h" -#include "StudioPropertySystem.h" - -using namespace std; - -namespace qt3dsdm { - -bool AnimationFloatPairContainsAnimation(Qt3DSDMAnimationHandle inAnimation, - const TAnimationFloatPair &inPair) -{ - return inAnimation == inPair.first; -} - -CStudioAnimationSystem::CStudioAnimationSystem(TPropertySystemPtr inPropertySystem, - TSlideSystemPtr inSlideSystem, - TSlideCorePtr inSlideCore, - TSlideGraphCorePtr inSlideGraphCore, - TAnimationCorePtr inAnimationCore) - : m_PropertySystem(inPropertySystem) - , m_SlideSystem(inSlideSystem) - , m_SlideCore(inSlideCore) - , m_SlideGraphCore(inSlideGraphCore) - , m_AnimationCore(inAnimationCore) - , m_AutoKeyframe(false) - , m_SmoothInterpolation(false) -{ - IAnimationCoreSignalProvider *theAnimationSignals = - dynamic_cast<IAnimationCoreSignalProvider *>(m_AnimationCore.get()); - m_Connections.push_back(theAnimationSignals->ConnectAnimationDeleted( - std::bind(&CStudioAnimationSystem::OnAnimationDeleted, this, std::placeholders::_1))); -} - -void CStudioAnimationSystem::OnAnimationDeleted(Qt3DSDMAnimationHandle inAnimation) -{ - ClearTemporaryAnimationValues(inAnimation); -} - -void CStudioAnimationSystem::ClearTemporaryAnimationValues() -{ - m_AnimationFloatPairs.clear(); -} - -void CStudioAnimationSystem::ClearTemporaryAnimationValues(Qt3DSDMAnimationHandle inAnimation) -{ - erase_if(m_AnimationFloatPairs, - std::bind(AnimationFloatPairContainsAnimation, inAnimation, std::placeholders::_1)); -} - -inline bool IsAnimationInfoEqual(const SAnimationInfo &inInfo, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) -{ - if (inInfo.m_Slide == inSlide && inInfo.m_Instance == inInstance - && inInfo.m_Property == inProperty) - return true; - return false; -} -inline bool IsAnimationInfoEqual(const SAnimationInfo &inInfo, Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - size_t inIndex) -{ - if (IsAnimationInfoEqual(inInfo, inSlide, inInstance, inProperty) && inInfo.m_Index == inIndex) - return true; - return false; -} - -inline bool ApplyIfAnimationMatches(TAnimationFloatPair inAnimationFloatPair, - Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - TAnimationCorePtr inAnimationCore, SValue &outValue) -{ - SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimationFloatPair.first); - if (IsAnimationInfoEqual(theInfo, inSlide, inInstance, inProperty)) { - SetAnimationValue(inAnimationFloatPair.second, theInfo.m_Index, outValue); - return true; - } - return false; -} - -void CStudioAnimationSystem::OverrideChannelIfAnimated(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - size_t inIndex, float inSeconds, - bool &ioAnimated, SValue &outValue) const -{ - Qt3DSDMAnimationHandle theAnimation = - m_AnimationCore->GetAnimation(inSlide, inInstance, inProperty, inIndex); - if (theAnimation.Valid() && m_AnimationCore->GetKeyframeCount(theAnimation)) { - float theValue = m_AnimationCore->EvaluateAnimation(theAnimation, inSeconds); - SetAnimationValue(theValue, inIndex, outValue); - ioAnimated |= true; - } -} - -// Value must be *primed* first. -bool CStudioAnimationSystem::GetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - bool retval = false; - - tuple<bool, size_t> arity = GetVariantAnimatableAndArity(outValue); - if (get<0>(arity)) { - for (size_t index = 0; index < m_AnimationFloatPairs.size(); ++index) - retval |= ApplyIfAnimationMatches(m_AnimationFloatPairs.at(index), inSlide, inInstance, - inProperty, m_AnimationCore, outValue); - } - - if (!retval) { - bool animatable; - size_t numChannels; - bool animated = false; - - std::tie(animatable, numChannels) = GetVariantAnimatableAndArity(outValue); - if (animatable) { - TGraphSlidePair theGraphSlidePair = m_SlideGraphCore->GetAssociatedGraph(inInstance); - float theSeconds = m_SlideCore->GetSlideTime( - m_SlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first)); - - do_times(numChannels, std::bind(&CStudioAnimationSystem::OverrideChannelIfAnimated, - this, inSlide, inInstance, inProperty, - std::placeholders::_1, theSeconds, - std::ref(animated), std::ref(outValue))); - } - - if (animated) - retval = true; - } - - return retval; -} - -bool KeyframeNear(const TKeyframe &inKeyframe, float inSeconds) -{ - return fabs(KeyframeTime(inKeyframe) - inSeconds) < .01; -} -Qt3DSDMKeyframeHandle CreateKeyframeExplicit(Qt3DSDMAnimationHandle inAnimation, float inValue, - float inSeconds, TAnimationCorePtr inAnimationCore, - float inEaseIn, float inEaseOut) -{ - TKeyframeHandleList theKeyframes; - float theValue = inValue; - inAnimationCore->GetKeyframes(inAnimation, theKeyframes); - function<TKeyframe(Qt3DSDMKeyframeHandle)> theConverter( - std::bind(&IAnimationCore::GetKeyframeData, inAnimationCore, std::placeholders::_1)); - - TKeyframeHandleList::iterator theFind = - std::find_if(theKeyframes.begin(), theKeyframes.end(), - [theConverter, inSeconds](const Qt3DSDMKeyframeHandle &handle) - { return KeyframeNear(theConverter(handle), inSeconds); }); - - float theEaseIn = inEaseIn; - float theEaseOut = inEaseOut; - Qt3DSDMKeyframeHandle theKeyframe; - if (theFind != theKeyframes.end()) { - theKeyframe = *theFind; - - inAnimationCore->SetKeyframeData( - theKeyframe, CreateEaseInEaseOutKeyframe(inSeconds, theValue, theEaseIn, theEaseOut)); - } else { - theKeyframe = inAnimationCore->InsertKeyframe( - inAnimation, CreateEaseInEaseOutKeyframe(inSeconds, theValue, theEaseIn, theEaseOut)); - } - return theKeyframe; -} - -Qt3DSDMKeyframeHandle CreateKeyframe(Qt3DSDMAnimationHandle inAnimation, const SValue &inValue, - float inSeconds, TAnimationCorePtr inAnimationCore, - float inEaseIn, float inEaseOut) -{ - SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); - return CreateKeyframeExplicit(inAnimation, GetAnimationValue(theInfo.m_Index, inValue), - inSeconds, inAnimationCore, inEaseIn, inEaseOut); -} - -void MaybeAddAnimation(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, TAnimationHandleList &outAnimations) -{ - SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); - if (IsAnimationInfoEqual(theInfo, inSlide, inInstance, inProperty)) - outAnimations.push_back(inAnimation); -} - -bool SortAnimationHandlesByIndex(Qt3DSDMAnimationHandle lhs, Qt3DSDMAnimationHandle rhs, - TAnimationCorePtr inCore) -{ - return inCore->GetAnimationInfo(lhs).m_Index < inCore->GetAnimationInfo(rhs).m_Index; -} - -void GetPresentAnimations(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const TAnimationFloatPairList &inAnimationPairs, - TAnimationCorePtr inAnimationCore, TAnimationHandleList &outAnimations) -{ - function<void(Qt3DSDMAnimationHandle)> theOperation( - std::bind(MaybeAddAnimation, inSlide, inInstance, inProperty, - std::placeholders::_1, inAnimationCore, - std::ref(outAnimations))); - - for (auto animation : inAnimationPairs) { - MaybeAddAnimation(inSlide, inInstance, inProperty, animation.first, inAnimationCore, - std::ref(outAnimations)); - } - - if (outAnimations.empty()) { - TAnimationHandleList theAnimationHandles; - inAnimationCore->GetAnimations(theAnimationHandles); - do_all(theAnimationHandles, theOperation); - } - std::sort(outAnimations.begin(), outAnimations.end(), - std::bind(SortAnimationHandlesByIndex, - std::placeholders::_1, std::placeholders::_2, inAnimationCore)); -} - -void CreateAnimationAndAdd(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, - TAnimationCorePtr inAnimationCore, TAnimationHandleList &outAnimations) -{ - outAnimations.push_back(inAnimationCore->CreateAnimation( - inSlide, inInstance, inProperty, inIndex, EAnimationTypeEaseInOut, false)); -} - -bool AnimationValueDiffers(Qt3DSDMAnimationHandle inAnimation, const SValue &inValue, - float inSeconds, TAnimationCorePtr inAnimationCore) -{ - SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); - if (inAnimationCore->GetKeyframeCount(inAnimation) == 0) - return true; // currently there is no keyframe, so return true - float theValue = GetAnimationValue(theInfo.m_Index, inValue); - float theAnimatedValue = inAnimationCore->EvaluateAnimation(inAnimation, inSeconds); - return fabs(theValue - theAnimatedValue) > .001; -} - -bool AnimationExistsInPresentAnimations(const TAnimationFloatPair &inAnimation, - TAnimationHandleList &inPresentAnimations) -{ - return exists(inPresentAnimations, - std::bind(equal_to<Qt3DSDMAnimationHandle>(), inAnimation.first, - std::placeholders::_1)); -} - -void DoKeyframeProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue, float inTimeInSecs, - bool inDoDiffValue, TAnimationCorePtr inAnimationCore, - TAnimationFloatPairList &inAnimationFloatPairs, float inEaseIn, - float inEaseOut) -{ - tuple<bool, size_t> arity = GetVariantAnimatableAndArity(inValue); - TAnimationHandleList thePresentAnimations; - GetPresentAnimations(inSlide, inInstance, inProperty, std::cref(inAnimationFloatPairs), - inAnimationCore, thePresentAnimations); - if (thePresentAnimations.empty()) - do_times(get<1>(arity), std::bind(CreateAnimationAndAdd, inSlide, inInstance, inProperty, - std::placeholders::_1, - inAnimationCore, std::ref(thePresentAnimations))); - if (!inDoDiffValue - || find_if(thePresentAnimations.begin(), thePresentAnimations.end(), - std::bind(AnimationValueDiffers, - std::placeholders::_1, inValue, inTimeInSecs, inAnimationCore)) - != thePresentAnimations.end()) { - do_all(thePresentAnimations, - std::bind(CreateKeyframe, std::placeholders::_1, - std::cref(inValue), inTimeInSecs, inAnimationCore, - inEaseIn, inEaseOut)); - erase_if(inAnimationFloatPairs, std::bind(AnimationExistsInPresentAnimations, - std::placeholders::_1, - std::ref(thePresentAnimations))); - } -} - -void DoKeyframeProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue, bool inDoDiffValue, - TAnimationCorePtr inAnimationCore, TSlideGraphCorePtr inSlideGraphCore, - TSlideCorePtr inSlideCore, TAnimationFloatPairList &inAnimationFloatPairs, - float inEaseIn, float inEaseOut) -{ - TGraphSlidePair theGraphSlidePair = inSlideGraphCore->GetAssociatedGraph(inInstance); - float theCurrentTime = - inSlideCore->GetSlideTime(inSlideGraphCore->GetGraphActiveSlide(theGraphSlidePair.first)); - DoKeyframeProperty(inSlide, inInstance, inProperty, inValue, theCurrentTime, inDoDiffValue, - inAnimationCore, inAnimationFloatPairs, inEaseIn, inEaseOut); -} - -void DoKeyframeProperty(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue, bool inDoDiffValue, - TAnimationCorePtr inAnimationCore, TSlideGraphCorePtr inSlideGraphCore, - TSlideCorePtr inSlideCore, TAnimationFloatPairList &inAnimationFloatPairs, - bool inSmoothInterpolation) -{ - float theEaseIn = 0.0f, theEaseOut = 0.0f; - if (inSmoothInterpolation) - theEaseIn = theEaseOut = 100.f; - DoKeyframeProperty(inSlide, inInstance, inProperty, inValue, inDoDiffValue, inAnimationCore, - inSlideGraphCore, inSlideCore, inAnimationFloatPairs, theEaseIn, theEaseOut); -} - -TAnimationFloatPair CreateAnimationFloatPair(Qt3DSDMAnimationHandle inAnimation, - const SValue &inValue, - TAnimationCorePtr inAnimationCore) -{ - SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); - float theValue = GetAnimationValue(theInfo.m_Index, inValue); - return make_pair(inAnimation, theValue); -} - -void InsertUniqueAnimationFloatPair(Qt3DSDMAnimationHandle inAnimation, - TAnimationFloatPairList &inList, const SValue &inValue, - TAnimationCorePtr inAnimationCore) -{ - TAnimationFloatPair thePair = CreateAnimationFloatPair(inAnimation, inValue, inAnimationCore); - insert_or_update(thePair, inList, - std::bind(AnimationFloatPairContainsAnimation, inAnimation, std::placeholders::_1)); -} - -bool CStudioAnimationSystem::SetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - tuple<bool, size_t> arity = GetVariantAnimatableAndArity(inValue); - if (get<0>(arity)) { - if (m_AutoKeyframe && IsPropertyAnimated(inInstance, inProperty)) // prerequisite for - // autoset-keyframes is - // that the property is - // already animated. - { - DoKeyframeProperty(inSlide, inInstance, inProperty, inValue, true, m_AnimationCore, - m_SlideGraphCore, m_SlideCore, m_AnimationFloatPairs, - m_SmoothInterpolation); - return true; - } - - TAnimationHandleList thePresentAnimations; - GetPresentAnimations(inSlide, inInstance, inProperty, std::cref(m_AnimationFloatPairs), - m_AnimationCore, thePresentAnimations); - if (!thePresentAnimations.empty()) { - TAnimationFloatPairList thePreList(m_AnimationFloatPairs); - do_all(thePresentAnimations, std::bind(InsertUniqueAnimationFloatPair, std::placeholders::_1, - std::ref(m_AnimationFloatPairs), - std::cref(inValue), m_AnimationCore)); - - - if (m_Consumer && m_refreshCallback) { - // Only create a single refresh per transaction stack - if (((CTransactionConsumer *)m_Consumer.get())->m_TransactionList.size() == 0) { - CreateGenericTransactionWithConsumer( - __FILE__, __LINE__, m_Consumer, - std::bind(m_refreshCallback, inInstance), - std::bind(m_refreshCallback, inInstance)); - } - } - - CreateGenericTransactionWithConsumer( - __FILE__, __LINE__, m_Consumer, - std::bind(assign_to<TAnimationFloatPairList>, m_AnimationFloatPairs, - std::ref(m_AnimationFloatPairs)), - std::bind(assign_to<TAnimationFloatPairList>, thePreList, - std::ref(m_AnimationFloatPairs))); - return true; - } - } - return false; -} - -void CStudioAnimationSystem::SetAutoKeyframe(bool inAutoKeyframe) -{ - m_AutoKeyframe = inAutoKeyframe; -} -bool CStudioAnimationSystem::GetAutoKeyframe() const -{ - return m_AutoKeyframe; -} - -Qt3DSDMSlideHandle CStudioAnimationSystem::GetApplicableGraphAndSlide( - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, const SValue &inValue) -{ - Qt3DSDMSlideHandle theApplicableSlide; - tuple<bool, size_t> arity = GetVariantAnimatableAndArity(inValue); - if (get<0>(arity)) - theApplicableSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty); - return theApplicableSlide; -} - -void InsertUniqueAnimationKeyframesPair(TAnimationKeyframesPairList &ioList, SAnimationInfo &inInfo, - TKeyframeList &inKeyframes) -{ - bool theFound = false; - for (TAnimationKeyframesPairList::iterator theAnimationKeyframeIter = ioList.begin(); - theAnimationKeyframeIter < ioList.end(); ++theAnimationKeyframeIter) { - if (IsAnimationInfoEqual(theAnimationKeyframeIter->first, inInfo.m_Slide, inInfo.m_Instance, - inInfo.m_Property, inInfo.m_Index)) { - theFound = true; - // Overwrite the existing value - SAnimationInfo &theInfo = theAnimationKeyframeIter->first; - theInfo.m_AnimationType = inInfo.m_AnimationType; - theInfo.m_DynamicFirstKeyframe = inInfo.m_DynamicFirstKeyframe; - theAnimationKeyframeIter->second = inKeyframes; - break; - } - } - if (!theFound) { - ioList.push_back(std::make_pair(inInfo, inKeyframes)); - } -} - -void CStudioAnimationSystem::Animate(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - SValue theValue; - m_PropertySystem->GetInstancePropertyValue(inInstance, inProperty, theValue); - Qt3DSDMSlideHandle theApplicableSlide = - GetApplicableGraphAndSlide(inInstance, inProperty, theValue.toOldSkool()); - if (theApplicableSlide.Valid()) { - // Check if previously we have set animation & keyframes - DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty); - std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType); - bool theFound = false; - for (size_t i = 0; i < std::get<1>(theArity); ++i) { - TAnimationKeyframesPairList::iterator theAnimationKeyframeIter = - m_DeletedAnimationData.begin(); - for (; theAnimationKeyframeIter < m_DeletedAnimationData.end(); - ++theAnimationKeyframeIter) { - if (IsAnimationInfoEqual(theAnimationKeyframeIter->first, theApplicableSlide, - inInstance, inProperty, i)) { - theFound = true; - - // We use previously set animation & keyframes to create new animation & - // keyframe - SAnimationInfo &theInfo = theAnimationKeyframeIter->first; - Qt3DSDMAnimationHandle theAnimation = m_AnimationCore->CreateAnimation( - theInfo.m_Slide, theInfo.m_Instance, theInfo.m_Property, theInfo.m_Index, - theInfo.m_AnimationType, theInfo.m_DynamicFirstKeyframe); - - TKeyframeList theKeyframes = theAnimationKeyframeIter->second; - for (TKeyframeList::const_iterator theKeyframeIter = theKeyframes.begin(); - theKeyframeIter < theKeyframes.end(); ++theKeyframeIter) - m_AnimationCore->InsertKeyframe(theAnimation, *theKeyframeIter); - - break; - } - } - } - - if (!theFound) - DoKeyframeProperty(theApplicableSlide, inInstance, inProperty, theValue.toOldSkool(), - true, m_AnimationCore, m_SlideGraphCore, m_SlideCore, - m_AnimationFloatPairs, m_SmoothInterpolation); - } -} - -void CStudioAnimationSystem::Deanimate(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty); - std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType); - for (size_t i = 0; i < std::get<1>(theArity); ++i) { - Qt3DSDMAnimationHandle theAnimationHandle = - GetControllingAnimation(inInstance, inProperty, i); - - if (theAnimationHandle.Valid()) { - // Get animation & keyframe data and save it - SAnimationInfo theInfo(m_AnimationCore->GetAnimationInfo(theAnimationHandle)); - TKeyframeHandleList theKeyframeHandles; - m_AnimationCore->GetKeyframes(theAnimationHandle, theKeyframeHandles); - TKeyframeList theKeyframeList; - for (TKeyframeHandleList::const_iterator theKeyframeIter = theKeyframeHandles.begin(); - theKeyframeIter < theKeyframeHandles.end(); ++theKeyframeIter) - theKeyframeList.push_back(m_AnimationCore->GetKeyframeData(*theKeyframeIter)); - InsertUniqueAnimationKeyframesPair(m_DeletedAnimationData, theInfo, theKeyframeList); - - // Delete the animation - m_AnimationCore->DeleteAnimation(theAnimationHandle); - } - } -} - -void CStudioAnimationSystem::KeyframeProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, bool inDoDiffValue) -{ - SValue theValue; - m_PropertySystem->GetInstancePropertyValue(inInstance, inProperty, theValue); - Qt3DSDMSlideHandle theApplicableSlide = - GetApplicableGraphAndSlide(inInstance, inProperty, theValue.toOldSkool()); - if (theApplicableSlide.Valid()) - DoKeyframeProperty(theApplicableSlide, inInstance, inProperty, theValue.toOldSkool(), - inDoDiffValue, m_AnimationCore, m_SlideGraphCore, m_SlideCore, - m_AnimationFloatPairs, m_SmoothInterpolation); -} -void CStudioAnimationSystem::SetOrCreateKeyframe(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - float inTimeInSeconds, - SGetOrSetKeyframeInfo *inKeyframeInfo, - size_t inNumInfos) -{ - qt3dsdm::DataModelDataType::Value thePropertyType = m_PropertySystem->GetDataType(inProperty); - Qt3DSDMSlideHandle theApplicableSlide; - std::tuple<bool, size_t> arity = GetDatatypeAnimatableAndArity(thePropertyType); - if (std::get<0>(arity)) { - theApplicableSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty); - if (theApplicableSlide.Valid()) { - - TAnimationHandleList thePresentAnimations; - GetPresentAnimations(theApplicableSlide, inInstance, inProperty, - std::cref(m_AnimationFloatPairs), m_AnimationCore, - thePresentAnimations); - size_t numIterations = std::min(inNumInfos, get<1>(arity)); - if (thePresentAnimations.empty()) { - for (size_t idx = 0, end = numIterations; idx < end; ++idx) { - CreateAnimationAndAdd(theApplicableSlide, inInstance, inProperty, idx, - m_AnimationCore, thePresentAnimations); - } - } - for (size_t idx = 0, end = numIterations; idx < end; ++idx) { - CreateKeyframeExplicit(thePresentAnimations[idx], inKeyframeInfo[idx].m_Value, - inTimeInSeconds, m_AnimationCore, - inKeyframeInfo[idx].m_EaseIn, inKeyframeInfo[idx].m_EaseOut); - if (inKeyframeInfo[idx].m_AnimationTrackIsDynamic) - m_AnimationCore->SetFirstKeyframeDynamic(thePresentAnimations[idx], true); - } - erase_if(m_AnimationFloatPairs, std::bind(AnimationExistsInPresentAnimations, - std::placeholders::_1, - std::ref(thePresentAnimations))); - } - } -} - -inline bool FindMatchingAnimation(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, size_t inIndex) -{ - return inAnimationCore->GetAnimationInfo(inAnimation).m_Index == inIndex; -} - -Qt3DSDMAnimationHandle CStudioAnimationSystem::GetControllingAnimation( - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, size_t inIndex) const -{ - Qt3DSDMSlideHandle theApplicableSlide = - m_SlideSystem->GetApplicableSlide(inInstance, inProperty); - // first check our anim float pairs - for (size_t idx = 0, end = m_AnimationFloatPairs.size(); idx < end; ++idx) { - const SAnimationInfo &theInfo = - m_AnimationCore->GetAnimationInfo(m_AnimationFloatPairs[idx].first); - if (IsAnimationInfoEqual(theInfo, theApplicableSlide, inInstance, inProperty, inIndex)) - return m_AnimationFloatPairs[idx].first; - } - // Use the cache lookup instead of linear search algorithm - return m_AnimationCore->GetAnimation(theApplicableSlide, inInstance, inProperty, inIndex); -} - -bool CStudioAnimationSystem::IsPropertyAnimatable(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty); - std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType); - if (std::get<0>(theArity)) - return m_SlideGraphCore->GetAssociatedGraph(inInstance).first.Valid(); - return false; -} - -bool CStudioAnimationSystem::IsPropertyAnimated(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - DataModelDataType::Value theDataType = m_PropertySystem->GetDataType(inProperty); - std::tuple<bool, size_t> theArity = GetDatatypeAnimatableAndArity(theDataType); - for (size_t i = 0; i < std::get<1>(theArity); ++i) { - if (GetControllingAnimation(inInstance, inProperty, i).Valid()) - return true; - } - return false; -} - -void CStudioAnimationSystem::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_Consumer = inConsumer; -} - -void CStudioAnimationSystem::setRefreshCallback(TRefreshCallbackFunc func) -{ - m_refreshCallback = func; -} -} diff --git a/src/Authoring/QT3DSDM/Systems/StudioAnimationSystem.h b/src/Authoring/QT3DSDM/Systems/StudioAnimationSystem.h deleted file mode 100644 index e6fdf755..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioAnimationSystem.h +++ /dev/null @@ -1,134 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef STUDIOANIMATIONSYSTEMIMPLH -#define STUDIOANIMATIONSYSTEMIMPLH - -#include "Qt3DSDMAnimation.h" -#include "Qt3DSDMSlides.h" -#include "Qt3DSDMSlideCore.h" -#include "Qt3DSDMSlideGraphCore.h" -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMDataCore.h" -#include "Qt3DSDMSignals.h" - -namespace qt3dsdm { - -typedef std::pair<Qt3DSDMAnimationHandle, float> TAnimationFloatPair; -typedef std::vector<TAnimationFloatPair> TAnimationFloatPairList; - -class CStudioAnimationSystem : public IStudioAnimationSystem, - public ITransactionProducer -{ - Q_DISABLE_COPY(CStudioAnimationSystem) - - TPropertySystemPtr m_PropertySystem; - TSlideSystemPtr m_SlideSystem; - TSlideCorePtr m_SlideCore; - TSlideGraphCorePtr m_SlideGraphCore; - TAnimationCorePtr m_AnimationCore; - TRefreshCallbackFunc m_refreshCallback = nullptr; - - bool m_AutoKeyframe; - // When a property has an animation associated with it, then writes - // do not go all the way down to the db. They stay on this object. - TAnimationFloatPairList m_AnimationFloatPairs; - bool m_SmoothInterpolation; - - TAnimationKeyframesPairList m_DeletedAnimationData; // list to store deanimated animation & - // keyframe data. This will be use if user - // wants to animate the same property again - - TTransactionConsumerPtr m_Consumer; - - std::vector<std::shared_ptr<ISignalConnection>> m_Connections; - -public: - CStudioAnimationSystem(TPropertySystemPtr inPropertySystem, TSlideSystemPtr inSlideSystem, - TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore, - TAnimationCorePtr inAnimationCore); - - void ClearTemporaryAnimationValues(); - void ClearTemporaryAnimationValues(Qt3DSDMAnimationHandle inAnimation); - - void SetPropertySystem(TPropertySystemPtr inPropertySystem) - { - m_PropertySystem = inPropertySystem; - } // HACK: TODO: We should really consider having all the subsytem know everyone else without - // passing in so many things in the constructor - - //==================================================================== - // IStudioAnimationSystem implementation - //==================================================================== - void SetAutoKeyframe(bool inAutoKeyframe) override; - bool GetAutoKeyframe() const override; - void Animate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override; - void Deanimate(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty) override; - void KeyframeProperty(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - bool inDoDiffValue) override; - void SetOrCreateKeyframe(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, float inTimeInSeconds, - SGetOrSetKeyframeInfo *inKeyframeInfo, size_t inNumInfos) override; - Qt3DSDMAnimationHandle GetControllingAnimation(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - size_t inIndex) const override; - bool IsPropertyAnimatable(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - bool IsPropertyAnimated(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - void SetInterpolation(bool inSmooth) override { m_SmoothInterpolation = inSmooth; } - - bool GetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const override; - bool SetAnimatedInstancePropertyValue(Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) override; - //==================================================================== - - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - - void setRefreshCallback(TRefreshCallbackFunc func) override; - -private: - void OnAnimationDeleted(Qt3DSDMAnimationHandle inAnimation); - - Qt3DSDMSlideHandle GetApplicableGraphAndSlide(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue); - - void OverrideChannelIfAnimated(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, size_t inIndex, float inSeconds, - bool &ioAnimated, SValue &outValue) const; -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/StudioCoreSystem.cpp b/src/Authoring/QT3DSDM/Systems/StudioCoreSystem.cpp deleted file mode 100644 index f9f0e2c8..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioCoreSystem.cpp +++ /dev/null @@ -1,409 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "StudioCoreSystem.h" -#include "SlideCoreProducer.h" -#include "SlideGraphCoreProducer.h" -#include "DataCoreProducer.h" -#include "AnimationCoreProducer.h" -#include "ActionCoreProducer.h" -#include "Qt3DSDMSignals.h" -#include "Qt3DSDMMetaData.h" -#include "Qt3DSDMGuides.h" - -using namespace std; - -namespace qt3dsdm { - -inline bool AnimationInstanceMatches(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, - Qt3DSDMInstanceHandle inInstance) -{ - return inInstance == inAnimationCore->GetAnimationInfo(inAnimation).m_Instance; -} - -inline bool AnimationPropertyMatches(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, - Qt3DSDMPropertyHandle inProperty) -{ - return inProperty == inAnimationCore->GetAnimationInfo(inAnimation).m_Property; -} - -inline bool AnimationSlideMatches(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, Qt3DSDMSlideHandle inSlide) -{ - return inSlide == inAnimationCore->GetAnimationInfo(inAnimation).m_Slide; -} - -inline bool AnimationSlideInstancePropertyMatch(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, - Qt3DSDMSlideHandle inSlide, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimation); - return theInfo.m_Slide == inSlide && theInfo.m_Instance == inInstance - && theInfo.m_Property == inProperty; -} - -inline bool AnimationInstancesPropertiesMatch(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, - const TInstanceHandleList &inInstances, - const TPropertyHandleList &inProperties) -{ - SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimation); - return exists(inInstances, std::bind(equal_to<int>(), theInfo.m_Instance, - std::placeholders::_1)) - && exists(inProperties, std::bind(equal_to<int>(), theInfo.m_Property, - std::placeholders::_1)); -} - -void EraseAnimationsThatMatch(TAnimationCorePtr inAnimationCore, - function<bool(Qt3DSDMAnimationHandle)> inPredicate) -{ - TAnimationHandleList theAnimations; - inAnimationCore->GetAnimations(theAnimations); - function<bool(Qt3DSDMAnimationHandle)> theComp(std::bind( - complement<function<bool(Qt3DSDMAnimationHandle)>, Qt3DSDMAnimationHandle>, inPredicate, - std::placeholders::_1)); - TAnimationHandleList::iterator theRemovals = - remove_if(theAnimations.begin(), theAnimations.end(), theComp); - for_each(theAnimations.begin(), theRemovals, - std::bind(&IAnimationCore::DeleteAnimation, inAnimationCore, std::placeholders::_1)); -} - -void EraseActions(TDataCorePtr inDataCore, TActionCorePtr inActionCore, - const TActionHandleList &inActions) -{ - for (TActionHandleList::const_iterator theActionIter = inActions.begin(); - theActionIter != inActions.end(); ++theActionIter) { - Qt3DSDMInstanceHandle theActionInstance; - inActionCore->DeleteAction(*theActionIter, theActionInstance); - inDataCore->DeleteInstance(theActionInstance); - } -} - -void CascadeInstanceDelete(Qt3DSDMInstanceHandle inInstance, TDataCorePtr inDataCore, - TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore, - TAnimationCorePtr inAnimationCore, TActionCorePtr inActionCore) -{ - inSlideCore->DeleteAllInstanceEntries(inInstance); - - inSlideGraphCore->DissociateInstance(inInstance); - - function<bool(Qt3DSDMAnimationHandle)> thePredicate( - std::bind(AnimationInstanceMatches, std::placeholders::_1, inAnimationCore, inInstance)); - EraseAnimationsThatMatch(inAnimationCore, thePredicate); - - TActionHandleList theActions; - inActionCore->GetActions(inInstance, theActions); - EraseActions(inDataCore, inActionCore, theActions); -} - -void CascadePropertyRemove(Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore, - TAnimationCorePtr inAnimationCore) -{ - inSlideCore->DeleteAllPropertyEntries(inProperty); - function<bool(Qt3DSDMAnimationHandle)> thePredicate( - std::bind(AnimationPropertyMatches, std::placeholders::_1, inAnimationCore, inProperty)); - EraseAnimationsThatMatch(inAnimationCore, thePredicate); -} - -void CascadeSlideDelete(Qt3DSDMSlideHandle inSlide, TDataCorePtr inDataCore, - TSlideCorePtr inSlideCore, TSlideGraphCorePtr inSlideGraphCore, - TAnimationCorePtr inAnimationCore, TActionCorePtr inActionCore) -{ - Qt3DSDMSlideGraphHandle theGraph = inSlideGraphCore->GetSlideGraph(inSlide); - if (theGraph.Valid()) { - TSlideHandleList theChildren; - inSlideCore->GetChildSlides(inSlide, theChildren); - TInstanceHandleList instances; - for (size_t idx = 0, end = theChildren.size(); idx < end; ++idx) { - instances.clear(); - inSlideCore->DeleteSlide(theChildren[idx], instances); - for (size_t instIdx = 0, instEnd = instances.size(); instIdx < instEnd; ++instIdx) - inDataCore->DeleteInstance(instances[instIdx]); - } - inSlideGraphCore->DeleteSlideGraph(theGraph); - } - - else { - Qt3DSDMSlideHandle theMaster(inSlideCore->GetParentSlide(inSlide)); - if (theMaster.Valid()) { - Qt3DSDMSlideGraphHandle theGraph = inSlideGraphCore->GetSlideGraph(theMaster); - if (theGraph.Valid()) { - /* - tricky stuff. The slide change was recorded in the transaction system when the - slide was created. But since there didn't *have* to be a slide change when the - slide was destroyed there was no slide change recorded at that point. - - Then on the first redo, the system quietly switched the active slide to the new - slide. On the second redo the system crashed due to attempting to access the - new slide after it had been deleted (as nothing switched the system back to the - current slide). - - So the correct answer is that the cascading system needs to *always* set the - active slide, even if it seems like it would be, at the moment, unnecessary - because the slide getting deleted is not currently active. This is the mirror - of the fact that new slide *always* sets the active slide so it does make - logical sense.*/ - Qt3DSDMSlideHandle theNewActiveSlide = - inSlideGraphCore->GetGraphActiveSlide(theGraph); - if (theNewActiveSlide == inSlide) { - TSlideHandleList theChildren; - inSlideCore->GetChildSlides(theMaster, theChildren); - size_t idx = 0; - for (size_t end = theChildren.size(); idx < end; ++idx) { - if (theChildren[idx] != inSlide) { - theNewActiveSlide = theChildren[idx]; - break; - } - } - if (theNewActiveSlide == inSlide) - theNewActiveSlide = theMaster; - } - inSlideGraphCore->SetGraphActiveSlide(theGraph, theNewActiveSlide); - } - } - } - EraseAnimationsThatMatch(inAnimationCore, - std::bind(AnimationSlideMatches, - std::placeholders::_1, inAnimationCore, inSlide)); - - TActionHandleList theActions; - inActionCore->GetActions(inSlide, theActions); - EraseActions(inDataCore, inActionCore, theActions); -} - -void CascadeSlidePropertyRemove(Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, TAnimationCorePtr inAnimationCore) -{ - EraseAnimationsThatMatch(inAnimationCore, - std::bind(AnimationSlideInstancePropertyMatch, - std::placeholders::_1, inAnimationCore, - inSlide, inInstance, inProperty)); -} - -void CascadeInstanceParentRemoved(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent, - TDataCorePtr inDataCore, TSlideCorePtr inSlideCore, - TAnimationCorePtr inAnimationCore) -{ - TPropertyHandleList theProperties; - inDataCore->GetInstanceProperties(inParent, theProperties); - TInstanceHandleList allInstances; - inDataCore->GetInstances(allInstances); - function<bool(Qt3DSDMInstanceHandle)> InstanceOrDerived( - std::bind(&IDataCore::IsInstanceOrDerivedFrom, inDataCore, - std::placeholders::_1, inInstance)); - function<bool(Qt3DSDMInstanceHandle)> DerivedComplement( - std::bind(complement<function<bool(Qt3DSDMInstanceHandle)>, Qt3DSDMInstanceHandle>, - InstanceOrDerived, std::placeholders::_1)); - TInstanceHandleList::iterator all_derived = - remove_if(allInstances.begin(), allInstances.end(), DerivedComplement); - TInstanceHandleList derivedInstances(allInstances.begin(), all_derived); - inSlideCore->DeleteAllInstancePropertyEntries(derivedInstances, theProperties); - EraseAnimationsThatMatch( - inAnimationCore, std::bind(AnimationInstancesPropertiesMatch, - std::placeholders::_1, inAnimationCore, - std::cref(derivedInstances), std::cref(theProperties))); -} - -void CascadeBeforeAnimationDeleted(Qt3DSDMAnimationHandle inAnimation, - TAnimationCorePtr inAnimationCore, TDataCorePtr inDataCore, - TSlideCorePtr inSlideCore) -{ - SAnimationInfo theInfo = inAnimationCore->GetAnimationInfo(inAnimation); - SValue theSlideValue; - if (inDataCore->IsInstance(theInfo.m_Instance) && inSlideCore->IsSlide(theInfo.m_Slide) - && inSlideCore->GetSpecificInstancePropertyValue(theInfo.m_Slide, theInfo.m_Instance, - theInfo.m_Property, theSlideValue) - && inAnimationCore->GetKeyframeCount(inAnimation)) { - float theTime = inSlideCore->GetSlideTime(theInfo.m_Slide); - float theValue = inAnimationCore->EvaluateAnimation(inAnimation, theTime); - SetAnimationValue(theValue, theInfo.m_Index, theSlideValue); - inSlideCore->ForceSetInstancePropertyValue(theInfo.m_Slide, theInfo.m_Instance, - theInfo.m_Property, theSlideValue); - } -} - -void CascadeBeforeKeyframeErased(Qt3DSDMKeyframeHandle inKeyframe, TAnimationCorePtr inAnimationCore, - TDataCorePtr inDataCore, TSlideCorePtr inSlideCore) -{ - Qt3DSDMAnimationHandle theAnimation = inAnimationCore->GetAnimationForKeyframe(inKeyframe); - if (inAnimationCore->GetKeyframeCount(theAnimation) == 1) - CascadeBeforeAnimationDeleted(theAnimation, inAnimationCore, inDataCore, inSlideCore); -} - -CStudioCoreSystem::CStudioCoreSystem(TStringTablePtr strTable) - : m_StringTable(strTable.get() != NULL ? strTable : IStringTable::CreateStringTable()) - , m_DataCore(new CDataCoreProducer(m_StringTable)) - , m_SlideCore(new CSlideCoreProducer(m_StringTable)) - , m_SlideGraphCore(new CSlideGraphCoreProducer()) - , m_AnimationCore(new CAnimationCoreProducer()) - , m_ActionCore(new CActionCoreProducer(m_StringTable)) - , m_NewMetaData( - IMetaData::CreateNewMetaData(dynamic_pointer_cast<CDataCoreProducer>(m_DataCore))) - , m_GuideSystem(IGuideSystem::CreateGuideSystem()) -{ - IDataCoreSignalProvider *theProvider = - dynamic_cast<IDataCoreSignalProvider *>(m_DataCore.get()); - m_Connections.push_back(theProvider->ConnectInstanceDeleted( - std::bind(CascadeInstanceDelete, std::placeholders::_1, m_DataCore, m_SlideCore, - m_SlideGraphCore, m_AnimationCore, m_ActionCore))); - m_Connections.push_back(theProvider->ConnectPropertyRemoved(std::bind( - CascadePropertyRemove, std::placeholders::_1, - std::placeholders::_2, m_SlideCore, m_SlideGraphCore, m_AnimationCore))); - m_Connections.push_back(theProvider->ConnectInstanceParentRemoved(std::bind( - CascadeInstanceParentRemoved, std::placeholders::_1, - std::placeholders::_2, m_DataCore, m_SlideCore, m_AnimationCore))); - ISlideCoreSignalProvider *theSlideCoreSignalProvider = - dynamic_cast<ISlideCoreSignalProvider *>(m_SlideCore.get()); - m_Connections.push_back(theSlideCoreSignalProvider->ConnectBeforeSlideDeleted( - std::bind(CascadeSlideDelete, std::placeholders::_1, m_DataCore, m_SlideCore, - m_SlideGraphCore, m_AnimationCore, m_ActionCore))); - m_Connections.push_back(theSlideCoreSignalProvider->ConnectInstancePropertyValueRemoved( - std::bind(CascadeSlidePropertyRemove, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, m_AnimationCore))); - IAnimationCoreSignalProvider *theAnimProvider = - dynamic_cast<IAnimationCoreSignalProvider *>(m_AnimationCore.get()); - m_Connections.push_back(theAnimProvider->ConnectBeforeAnimationDeleted( - std::bind(CascadeBeforeAnimationDeleted, std::placeholders::_1, - m_AnimationCore, m_DataCore, m_SlideCore))); - m_Connections.push_back(theAnimProvider->ConnectBeforeKeyframeErased( - std::bind(CascadeBeforeKeyframeErased, std::placeholders::_1, - m_AnimationCore, m_DataCore, m_SlideCore))); - m_Connections.push_back(theAnimProvider->ConnectBeforeAllKeyframesErased( - std::bind(CascadeBeforeAnimationDeleted, std::placeholders::_1, - m_AnimationCore, m_DataCore, m_SlideCore))); -} - -CStudioCoreSystem::~CStudioCoreSystem() -{ -} - -std::shared_ptr<IDataCore> CStudioCoreSystem::GetDataCore() -{ - return m_DataCore; -} -std::shared_ptr<ISlideCore> CStudioCoreSystem::GetSlideCore() -{ - return m_SlideCore; -} -std::shared_ptr<ISlideGraphCore> CStudioCoreSystem::GetSlideGraphCore() -{ - return m_SlideGraphCore; -} -std::shared_ptr<IAnimationCore> CStudioCoreSystem::GetAnimationCore() -{ - return m_AnimationCore; -} -std::shared_ptr<IActionCore> CStudioCoreSystem::GetActionCore() -{ - return m_ActionCore; -} -std::shared_ptr<ICustomPropCore> CStudioCoreSystem::GetCustomPropCore() -{ - return m_CustomPropCore; -} -std::shared_ptr<IMetaData> CStudioCoreSystem::GetNewMetaData() -{ - return m_NewMetaData; -} -std::shared_ptr<IGuideSystem> CStudioCoreSystem::GetGuideSystem() -{ - return m_GuideSystem; -} - -std::shared_ptr<IDataCore> CStudioCoreSystem::GetTransactionlessDataCore() -{ - return dynamic_cast<CDataCoreProducer *>(m_DataCore.get())->GetTransactionlessDataCore(); -} -std::shared_ptr<ISlideCore> CStudioCoreSystem::GetTransactionlessSlideCore() -{ - return dynamic_cast<CSlideCoreProducer *>(m_SlideCore.get())->GetTransactionlessSlideCore(); -} -std::shared_ptr<ISlideGraphCore> CStudioCoreSystem::GetTransactionlessSlideGraphCore() -{ - return dynamic_cast<CSlideGraphCoreProducer *>(m_SlideGraphCore.get()) - ->GetTransactionlessSlideGraphCore(); -} -std::shared_ptr<IAnimationCore> CStudioCoreSystem::GetTransactionlessAnimationCore() -{ - return dynamic_cast<CAnimationCoreProducer *>(m_AnimationCore.get()) - ->GetTransactionlessAnimationCore(); -} -std::shared_ptr<IActionCore> CStudioCoreSystem::GetTransactionlessActionCore() -{ - return dynamic_cast<CActionCoreProducer *>(m_ActionCore.get())->GetTransactionlessActionCore(); -} - -inline bool InstanceSpecificNameMatches(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const TCharStr &inName, - const CSimpleDataCore &inData) -{ - TPropertyHandleList theProperties; - inData.GetAggregateInstanceProperties(inInstance, theProperties); - SValue theValue; - if (exists(theProperties, std::bind(equal_to<int>(), inProperty, std::placeholders::_1)) - && inData.GetSpecificInstancePropertyValue(inInstance, inProperty, theValue)) { - return inName == get<TDataStrPtr>(theValue)->GetData(); - } - return false; -} - -Qt3DSDMInstanceHandle CStudioCoreSystem::FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty, - const TCharStr &inName) const -{ - TInstanceHandleList theInstances; - m_DataCore->GetInstances(theInstances); - TInstanceHandleList::iterator theFind = find_if<TInstanceHandleList::iterator>( - theInstances, - std::bind(InstanceSpecificNameMatches, std::placeholders::_1, inNameProperty, std::cref(inName), - std::cref(*dynamic_cast<CDataCoreProducer *>(m_DataCore.get()) - ->GetTransactionlessDataCore()))); - if (theFind != theInstances.end()) - return *theFind; - return 0; -} - -void CStudioCoreSystem::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - DoSetConsumer(inConsumer, m_DataCore); - DoSetConsumer(inConsumer, m_SlideCore); - DoSetConsumer(inConsumer, m_SlideGraphCore); - DoSetConsumer(inConsumer, m_AnimationCore); - DoSetConsumer(inConsumer, m_ActionCore); - DoSetConsumer(inConsumer, m_GuideSystem); - // In general the meta data doesn't participate in the undo/redo system except - // in special cases. - if (!inConsumer) - DoSetConsumer(inConsumer, m_NewMetaData); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/StudioCoreSystem.h b/src/Authoring/QT3DSDM/Systems/StudioCoreSystem.h deleted file mode 100644 index 18f1dad6..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioCoreSystem.h +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef STUDIOCORESYSTEMH -#define STUDIOCORESYSTEMH -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMHandles.h" - -namespace qt3dsdm { -class IDataCore; -class ISlideCore; -class ISlideGraphCore; -class IAnimationCore; -class IActionCore; -class ICustomPropCore; -class ISignalConnection; -class IMetaData; -class IGuideSystem; - -// Manages cascading operations between cores so that the entire group of -// cores stays up to date. -class CStudioCoreSystem : public ITransactionProducer -{ - Q_DISABLE_COPY(CStudioCoreSystem) - - TStringTablePtr m_StringTable; - std::shared_ptr<IDataCore> m_DataCore; - std::shared_ptr<ISlideCore> m_SlideCore; - std::shared_ptr<ISlideGraphCore> m_SlideGraphCore; - std::shared_ptr<IAnimationCore> m_AnimationCore; - std::shared_ptr<IActionCore> m_ActionCore; - std::shared_ptr<ICustomPropCore> m_CustomPropCore; - std::shared_ptr<IMetaData> m_NewMetaData; - std::shared_ptr<IGuideSystem> m_GuideSystem; - - std::vector<std::shared_ptr<ISignalConnection>> m_Connections; - -public: - CStudioCoreSystem(TStringTablePtr strTable = TStringTablePtr()); - virtual ~CStudioCoreSystem(); - TStringTablePtr GetStringTablePtr() const { return m_StringTable; } - - std::shared_ptr<IDataCore> GetDataCore(); - std::shared_ptr<ISlideCore> GetSlideCore(); - std::shared_ptr<ISlideGraphCore> GetSlideGraphCore(); - std::shared_ptr<IAnimationCore> GetAnimationCore(); - std::shared_ptr<IActionCore> GetActionCore(); - std::shared_ptr<ICustomPropCore> GetCustomPropCore(); - std::shared_ptr<IMetaData> GetNewMetaData(); - std::shared_ptr<IGuideSystem> GetGuideSystem(); - - std::shared_ptr<IDataCore> GetTransactionlessDataCore(); - std::shared_ptr<ISlideCore> GetTransactionlessSlideCore(); - std::shared_ptr<ISlideGraphCore> GetTransactionlessSlideGraphCore(); - std::shared_ptr<IAnimationCore> GetTransactionlessAnimationCore(); - std::shared_ptr<IActionCore> GetTransactionlessActionCore(); - std::shared_ptr<ICustomPropCore> GetTransactionlessCustomPropCore(); - - Qt3DSDMInstanceHandle FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty, - const TCharStr &inName) const; - - void SetConsumer(TTransactionConsumerPtr inConsumer) override; -}; - -typedef std::shared_ptr<CStudioCoreSystem> TStudioCoreSystemPtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/StudioFullSystem.cpp b/src/Authoring/QT3DSDM/Systems/StudioFullSystem.cpp deleted file mode 100644 index c98f8a81..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioFullSystem.cpp +++ /dev/null @@ -1,647 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSDMPrefix.h" -#include "StudioFullSystem.h" -#include "StudioCoreSystem.h" -#include "StudioPropertySystem.h" -#include "SlideSystem.h" -#include "StudioAnimationSystem.h" -#include "ActionSystem.h" -#include "SignalsImpl.h" -#include "SimpleDataCore.h" -#include "SimpleSlideCore.h" -#include "SimpleSlideGraphCore.h" -#include "SimpleAnimationCore.h" -#include "DataCoreProducer.h" -#include "SlideCoreProducer.h" -#include "SlideGraphCoreProducer.h" -#include "ActionCoreProducer.h" - -using namespace std; - -namespace qt3dsdm { - -template <typename TDoTransaction, typename TUndoTransaction> -inline void NotifyConsumer(TTransactionConsumerPtr inConsumer, TDoTransaction inDoNotification, - TUndoTransaction inUndoNotification) -{ - if (inConsumer) { - inConsumer->OnDoNotification(inDoNotification); - inConsumer->OnUndoNotification(inUndoNotification); - } else { - inDoNotification(); // No consumer, send notification right away - } -} - -void NotifySlideCreated(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide) -{ - NotifyConsumer(inConsumer, - bind(&IStudioFullSystemSignalSender::SendSlideCreated, inSender, inSlide), - bind(&IStudioFullSystemSignalSender::SendSlideDeleted, inSender, inSlide)); -} - -void NotifySlideDeleted(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide) -{ - NotifyConsumer(inConsumer, - bind(&IStudioFullSystemSignalSender::SendSlideDeleted, inSender, inSlide), - bind(&IStudioFullSystemSignalSender::SendSlideCreated, inSender, inSlide)); -} - -void NotifySlideRearranged(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide, - int inOldIndex, int inNewIndex) -{ - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendSlideRearranged, inSender, - inSlide, inOldIndex, inNewIndex), - bind(&IStudioFullSystemSignalSender::SendSlideRearranged, inSender, inSlide, - inNewIndex, inOldIndex)); -} - -void SendInstancePropertyValueChanged(TDataCorePtr inCore, IStudioFullSystemSignalSender *inSender, - Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - // Ignore when the instance is not an instance (undoing an add operation may create this, as - // transactions are run first and notifications second). - if (inCore->IsInstance(inInstance)) - inSender->SendInstancePropertyValue(inInstance, inProperty); -} - -void NotifyInstancePropertyChanged(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - bool inIsAggregate) -{ - if (inConsumer) { - if (inIsAggregate == false) { - NotifyConsumer( - inConsumer, - bind(SendInstancePropertyValueChanged, inCore, inSender, inInstance, inProperty), - bind(SendInstancePropertyValueChanged, inCore, inSender, inInstance, inProperty)); - } - } else { - SendInstancePropertyValueChanged(inCore, inSender, inInstance, inProperty); - } -} - -void RunAnimations(IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, - Qt3DSDMSlideHandle inSlide, TAnimationCorePtr inAnimationCore, - TDataCorePtr inDataCore, TTransactionConsumerPtr &inConsumer) -{ - TAnimationInfoList theAnimations; - inAnimationCore->GetAnimations(theAnimations, inMaster, inSlide); - size_t theEnd = theAnimations.size(); - for (size_t theIndex = 0; theIndex < theEnd; ++theIndex) { - SAnimationInfo &theInfo(theAnimations[theIndex]); - NotifyInstancePropertyChanged(inConsumer, inDataCore, inSender, theInfo.m_Instance, - theInfo.m_Property, false); - } -} - -void NotifyComponentSeconds(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inSlide, - TDataCorePtr inCore, TAnimationCorePtr inAnimationCore, - TStudioAnimationSystemPtr inAnimationSystem, - TSlideSystemPtr inSlideSystem) -{ - Qt3DSDMSlideHandle theMaster = inSlideSystem->GetMasterSlide(inSlide); - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendBeginComponentSeconds, - inSender, theMaster), - bind(&IStudioFullSystemSignalSender::SendComponentSeconds, inSender, theMaster)); - RunAnimations(inSender, theMaster, inSlide, inAnimationCore, inCore, inConsumer); - dynamic_cast<CStudioAnimationSystem *>(inAnimationSystem.get()) - ->ClearTemporaryAnimationValues(); - NotifyConsumer( - inConsumer, bind(&IStudioFullSystemSignalSender::SendComponentSeconds, inSender, theMaster), - bind(&IStudioFullSystemSignalSender::SendBeginComponentSeconds, inSender, theMaster)); -} - -void NotifyPropertyLinked(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - bool inAggregate) -{ - if (inAggregate == false) { - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendPropertyLinked, - inSender, inMaster, inInstance, inProperty), - bind(&IStudioFullSystemSignalSender::SendPropertyUnlinked, inSender, - inMaster, inInstance, inProperty)); - NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, - inAggregate); - } -} - -void NotifyPropertyUnlinked(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, - Qt3DSDMInstanceHandle inInstance, Qt3DSDMPropertyHandle inProperty, - bool inAggregate) -{ - if (inAggregate == false) { - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendPropertyUnlinked, - inSender, inMaster, inInstance, inProperty), - bind(&IStudioFullSystemSignalSender::SendPropertyLinked, inSender, inMaster, - inInstance, inProperty)); - NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, - inAggregate); - } -} - -void NotifyActiveSlide(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, Qt3DSDMSlideHandle inMaster, - int /*inIndex*/, Qt3DSDMSlideHandle inOldSlide, Qt3DSDMSlideHandle inNewSlide, - TAnimationCorePtr inAnimationCore, TSlideSystemPtr inSlideSystem) -{ - TInstancePropertyPairList thePropertyList; - inSlideSystem->GetUnionOfProperties(inOldSlide, inNewSlide, thePropertyList); - for (size_t idx = 0, end = thePropertyList.size(); idx < end; ++idx) - NotifyInstancePropertyChanged(inConsumer, inCore, inSender, thePropertyList[idx].first, - thePropertyList[idx].second, false); - - RunAnimations(inSender, inMaster, inNewSlide, inAnimationCore, inCore, inConsumer); -} - -void NotifyAnimationCreated(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMAnimationHandle inAnimation, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, bool inIsAggregate) -{ - if (!inIsAggregate) { - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendAnimationCreated, - inSender, inAnimation, inInstance, inProperty), - bind(&IStudioFullSystemSignalSender::SendAnimationDeleted, inSender, - inAnimation, inInstance, inProperty)); - } -} - -void NotifyAnimationDeleted(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMAnimationHandle inAnimation, Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) -{ - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendAnimationDeleted, inSender, - inAnimation, inInstance, inProperty), - bind(&IStudioFullSystemSignalSender::SendAnimationCreated, inSender, inAnimation, - inInstance, inProperty)); - NotifyInstancePropertyChanged(inConsumer, inCore, inSender, inInstance, inProperty, false); -} - -void NotifyAnimationChanged(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMAnimationHandle inAnimation, TAnimationCorePtr inAnimationCore, - bool inIsAggregate) -{ - if (!inIsAggregate) { - SAnimationInfo theInfo(inAnimationCore->GetAnimationInfo(inAnimation)); - NotifyInstancePropertyChanged(inConsumer, inCore, inSender, theInfo.m_Instance, - theInfo.m_Property, inIsAggregate); - } -} - -void NotifyKeyframeInserted(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe, - TAnimationCorePtr inAnimationCore, bool inIsAggregate) -{ - if (!inIsAggregate) { - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, - inSender, inAnimation, inKeyframe), - bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender, - inAnimation, inKeyframe)); - NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false); - } -} - -void NotifyKeyframeErased(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMAnimationHandle inAnimation, Qt3DSDMKeyframeHandle inKeyframe, - TAnimationCorePtr inAnimationCore) -{ - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendKeyframeErased, inSender, - inAnimation, inKeyframe), - bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation, - inKeyframe)); - NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false); -} - -void NotifyKeyframeUpdated(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, Qt3DSDMKeyframeHandle inKeyframe, - TAnimationCorePtr inAnimationCore) -{ - NotifyConsumer(inConsumer, - bind(&IStudioFullSystemSignalSender::SendKeyframeUpdated, inSender, inKeyframe), - bind(&IStudioFullSystemSignalSender::SendKeyframeUpdated, inSender, inKeyframe)); - Qt3DSDMAnimationHandle theAnimation(inAnimationCore->GetAnimationForKeyframe(inKeyframe)); - NotifyAnimationChanged(inConsumer, inCore, inSender, theAnimation, inAnimationCore, false); -} - -void NotifyConnectFirstKeyframeDynamicSet(TTransactionConsumerPtr &inConsumer, TDataCorePtr inCore, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMAnimationHandle inAnimation, bool inDynamic, - TAnimationCorePtr inAnimationCore) -{ - NotifyConsumer(inConsumer, - bind(&IStudioFullSystemSignalSender::SendConnectFirstKeyframeDynamicSet, - inSender, inAnimation, inDynamic), - bind(&IStudioFullSystemSignalSender::SendConnectFirstKeyframeDynamicSet, - inSender, inAnimation, inDynamic)); - NotifyAnimationChanged(inConsumer, inCore, inSender, inAnimation, inAnimationCore, false); -} - -inline ISlideCoreSignalProvider *GetSlideSignaller(TSlideCorePtr inSlideCore) -{ - return dynamic_cast<CSlideCoreProducer *>(inSlideCore.get()); -} - -void NotifyInstanceCreated(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle instance) -{ - NotifyConsumer(inConsumer, - bind(&IStudioFullSystemSignalSender::SendInstanceCreated, inSender, instance), - bind(&IStudioFullSystemSignalSender::SendInstanceDeleted, inSender, instance)); -} - -void NotifyInstanceDeleted(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMInstanceHandle instance) -{ - NotifyConsumer(inConsumer, - bind(&IStudioFullSystemSignalSender::SendInstanceDeleted, inSender, instance), - bind(&IStudioFullSystemSignalSender::SendInstanceCreated, inSender, instance)); -} - -void NotifyActionCreated(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, - Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance) -{ - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendActionCreated, inSender, - inAction, inSlide, inInstance), - bind(&IStudioFullSystemSignalSender::SendActionDeleted, inSender, inAction, - inSlide, inInstance)); -} - -void NotifyActionDestroyed(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, - Qt3DSDMSlideHandle inSlide, Qt3DSDMInstanceHandle inInstance) -{ - NotifyConsumer(inConsumer, bind(&IStudioFullSystemSignalSender::SendActionDeleted, inSender, - inAction, inSlide, inInstance), - bind(&IStudioFullSystemSignalSender::SendActionCreated, inSender, inAction, - inSlide, inInstance)); -} - -void SendActionEvent(Qt3DSDMActionHandle inAction, TActionCorePtr inCore, - function<void()> inFunction) -{ - if (inCore->HandleValid(inAction)) - inFunction(); -} - -void NotifyTriggerObjectSet(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, - TActionCorePtr inCore) -{ - function<void()> theFunc( - bind(&IStudioFullSystemSignalSender::SendTriggerObjectSet, inSender, inAction)); - NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), - bind(SendActionEvent, inAction, inCore, theFunc)); -} - -void NotifyTargetObjectSet(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, Qt3DSDMActionHandle inAction, - TActionCorePtr inCore) -{ - function<void()> theFunc( - bind(&IStudioFullSystemSignalSender::SendTargetObjectSet, inSender, inAction)); - NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), - bind(SendActionEvent, inAction, inCore, theFunc)); -} - -void NotifyEventSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, - Qt3DSDMActionHandle inAction, TActionCorePtr inCore) -{ - function<void()> theFunc( - bind(&IStudioFullSystemSignalSender::SendEventSet, inSender, inAction)); - NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), - bind(SendActionEvent, inAction, inCore, theFunc)); -} - -void NotifyHandlerSet(TTransactionConsumerPtr &inConsumer, IStudioFullSystemSignalSender *inSender, - Qt3DSDMActionHandle inAction, TActionCorePtr inCore) -{ - function<void()> theFunc( - bind(&IStudioFullSystemSignalSender::SendHandlerSet, inSender, inAction)); - NotifyConsumer(inConsumer, bind(SendActionEvent, inAction, inCore, theFunc), - bind(SendActionEvent, inAction, inCore, theFunc)); -} - -void NotifyHandlerArgumentValueSet(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, - Qt3DSDMHandlerArgHandle inAction, TActionCorePtr inCore) -{ - function<void()> theFunc( - bind(&IStudioFullSystemSignalSender::SendHandlerArgumentValueSet, inSender, inAction)); - Qt3DSDMActionHandle theActionHdl(inCore->GetHandlerArgumentInfo(inAction).m_Action); - NotifyConsumer(inConsumer, bind(SendActionEvent, theActionHdl, inCore, theFunc), - bind(SendActionEvent, theActionHdl, inCore, theFunc)); -} - -void NotifyAllKeyframesErased(TTransactionConsumerPtr &inConsumer, - IStudioFullSystemSignalSender *inSender, - TAnimationCorePtr inAnimationCore, Qt3DSDMAnimationHandle inAnimation) -{ - if (inConsumer) { - TKeyframeHandleList theKeyframes; - inAnimationCore->GetKeyframes(inAnimation, theKeyframes); - for (size_t idx = 0, end = theKeyframes.size(); idx < end; ++idx) { - inConsumer->OnDoNotification(bind(&IStudioFullSystemSignalSender::SendKeyframeErased, - inSender, inAnimation, theKeyframes[idx])); - inConsumer->OnUndoNotification( - bind(&IStudioFullSystemSignalSender::SendKeyframeInserted, inSender, inAnimation, - theKeyframes[idx])); - } - } -} - -CStudioFullSystem::CStudioFullSystem(std::shared_ptr<CStudioCoreSystem> inCoreSystem, - Qt3DSDMInstanceHandle inSlideInstance, - Qt3DSDMPropertyHandle inComponentGuidProperty, - Qt3DSDMInstanceHandle inActionInstance, - Qt3DSDMPropertyHandle inActionEyeball) - : m_CoreSystem(inCoreSystem) - , m_SlideSystem(new SSlideSystem(m_CoreSystem->GetDataCore(), m_CoreSystem->GetSlideCore(), - m_CoreSystem->GetSlideGraphCore(), - m_CoreSystem->GetAnimationCore(), inSlideInstance, - inComponentGuidProperty)) - , m_ActionSystem(new CActionSystem(m_CoreSystem->GetDataCore(), m_CoreSystem->GetSlideCore(), - m_CoreSystem->GetSlideGraphCore(), - m_CoreSystem->GetActionCore(), m_SlideSystem, - inActionInstance, inActionEyeball)) - , m_AggregateOperation(false) -{ - // TODO: Too many parameters passed in to the subsystem. Just make them know about FullSystem so - // they can get whatever they want - CStudioAnimationSystem *theAnimationSystem = new CStudioAnimationSystem( - m_PropertySystem, m_SlideSystem, m_CoreSystem->GetSlideCore(), - m_CoreSystem->GetSlideGraphCore(), m_CoreSystem->GetAnimationCore()); - m_AnimationSystem = std::shared_ptr<qt3dsdm::IStudioAnimationSystem>(theAnimationSystem); - - m_PropertySystem = std::shared_ptr<qt3dsdm::IPropertySystem>( - new CStudioPropertySystem(m_CoreSystem->GetNewMetaData(), m_CoreSystem->GetDataCore(), - m_SlideSystem, m_AnimationSystem)); - theAnimationSystem->SetPropertySystem(m_PropertySystem); - - TDataCorePtr dataCore(m_CoreSystem->GetDataCore()); - - static_cast<SSlideSystem *>(m_SlideSystem.get())->SetPropertySystem(m_PropertySystem); - - ISlideSystemSignalProvider *theSlideSignaller = - dynamic_cast<SSlideSystem *>(m_SlideSystem.get())->GetSignalProvider(); - m_Signaller = CreateStudioFullSystemSignaller(theSlideSignaller); - IStudioFullSystemSignalSender *theSystemSender = - dynamic_cast<IStudioFullSystemSignalSender *>(m_Signaller.get()); - m_Connections.push_back(theSlideSignaller->ConnectSlideRearranged( - bind(NotifySlideRearranged, ref(m_Consumer), theSystemSender, - std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3))); - m_Connections.push_back(theSlideSignaller->ConnectPropertyLinked( - bind(NotifyPropertyLinked, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, - std::cref(m_AggregateOperation)))); - m_Connections.push_back(theSlideSignaller->ConnectPropertyUnlinked( - bind(NotifyPropertyUnlinked, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, - std::cref(m_AggregateOperation)))); - - m_Connections.push_back(theSlideSignaller->ConnectActiveSlide( - bind(NotifyActiveSlide, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, - GetAnimationCore(), GetSlideSystem()))); - - IDataCoreSignalProvider *theDataSignals = - dynamic_cast<IDataCoreSignalProvider *>(m_CoreSystem->GetDataCore().get()); - m_Connections.push_back(theDataSignals->ConnectInstanceCreated( - bind(NotifyInstanceCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1))); - m_Connections.push_back(theDataSignals->ConnectInstanceDeleted( - bind(NotifyInstanceDeleted, ref(m_Consumer), theSystemSender, std::placeholders::_1))); - - ISlideCoreSignalProvider *theSlideCoreSignaller = - dynamic_cast<ISlideCoreSignalProvider *>(m_CoreSystem->GetSlideCore().get()); - m_Connections.push_back(theSlideCoreSignaller->ConnectInstancePropertyValueSet( - bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_2, std::placeholders::_3, - std::cref(m_AggregateOperation)))); - m_Connections.push_back(theSlideCoreSignaller->ConnectSlideTimeChanged( - bind(NotifyComponentSeconds, ref(m_Consumer), theSystemSender, std::placeholders::_1, - dataCore, GetAnimationCore(), GetAnimationSystem(), GetSlideSystem()))); - m_Connections.push_back(theSlideCoreSignaller->ConnectSlideCreated( - bind(NotifySlideCreated, ref(m_Consumer), theSystemSender, std::placeholders::_1))); - m_Connections.push_back(theSlideCoreSignaller->ConnectSlideDeleted( - bind(NotifySlideDeleted, ref(m_Consumer), theSystemSender, std::placeholders::_1))); - - IAnimationCoreSignalProvider *theAnimationSignals = - dynamic_cast<IAnimationCoreSignalProvider *>(GetAnimationCore().get()); - m_Connections.push_back(theAnimationSignals->ConnectAnimationCreated( - bind(NotifyAnimationCreated, ref(m_Consumer), theSystemSender, - std::placeholders::_1, std::placeholders::_3, std::placeholders::_4, - std::cref(m_AggregateOperation)))); - m_Connections.push_back(theAnimationSignals->ConnectAnimationDeleted( - bind(NotifyAnimationDeleted, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, std::placeholders::_3, std::placeholders::_4))); - m_Connections.push_back(theAnimationSignals->ConnectKeyframeInserted( - bind(NotifyKeyframeInserted, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, std::placeholders::_2, - GetAnimationCore(), std::cref(m_AggregateOperation)))); - m_Connections.push_back(theAnimationSignals->ConnectKeyframeErased( - bind(NotifyKeyframeErased, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, std::placeholders::_2, - GetAnimationCore()))); - m_Connections.push_back(theAnimationSignals->ConnectKeyframeUpdated( - bind(NotifyKeyframeUpdated, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, GetAnimationCore()))); - m_Connections.push_back(theAnimationSignals->ConnectFirstKeyframeDynamicSet( - bind(NotifyConnectFirstKeyframeDynamicSet, ref(m_Consumer), dataCore, - theSystemSender, std::placeholders::_1, - std::placeholders::_2, GetAnimationCore()))); - m_Connections.push_back(theAnimationSignals->ConnectBeforeAllKeyframesErased( - bind(NotifyAllKeyframesErased, ref(m_Consumer), theSystemSender, - GetAnimationCore(), std::placeholders::_1))); - - IInstancePropertyCoreSignalProvider *thePropertyCoreSignaller = - dynamic_cast<CStudioPropertySystem *>(m_PropertySystem.get()) - ->GetPropertyCoreSignalProvider(); - m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue( - bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, std::placeholders::_2, std::cref(m_AggregateOperation)))); - - thePropertyCoreSignaller = dynamic_cast<CStudioPropertySystem *>(m_PropertySystem.get()) - ->GetImmediatePropertyCoreSignalProvider(); - m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue( - bind(&IStudioFullSystemSignalSender::SendInstancePropertyValue, theSystemSender, - std::placeholders::_1, std::placeholders::_2))); - - thePropertyCoreSignaller = - dynamic_cast<IInstancePropertyCoreSignalProvider *>(m_CoreSystem->GetDataCore().get()); - m_Connections.push_back(thePropertyCoreSignaller->ConnectInstancePropertyValue( - bind(NotifyInstancePropertyChanged, ref(m_Consumer), dataCore, theSystemSender, - std::placeholders::_1, std::placeholders::_2, std::cref(m_AggregateOperation)))); - - IActionCoreSignalProvider *theActionSignals = - dynamic_cast<IActionCoreSignalProvider *>(m_CoreSystem->GetActionCore().get()); - m_Connections.push_back(theActionSignals->ConnectTriggerObjectSet( - bind(NotifyTriggerObjectSet, ref(m_Consumer), theSystemSender, - std::placeholders::_1, GetActionCore()))); - m_Connections.push_back(theActionSignals->ConnectTargetObjectSet( - bind(NotifyTargetObjectSet, ref(m_Consumer), theSystemSender, - std::placeholders::_1, GetActionCore()))); - m_Connections.push_back(theActionSignals->ConnectEventSet( - bind(NotifyEventSet, ref(m_Consumer), theSystemSender, - std::placeholders::_1, GetActionCore()))); - m_Connections.push_back(theActionSignals->ConnectHandlerSet( - bind(NotifyHandlerSet, ref(m_Consumer), theSystemSender, - std::placeholders::_1, GetActionCore()))); - m_Connections.push_back(theActionSignals->ConnectHandlerArgumentValueSet(bind( - NotifyHandlerArgumentValueSet, ref(m_Consumer), theSystemSender, - std::placeholders::_1, GetActionCore()))); - - IActionSystemSignalProvider *theActionSystemSignals = - dynamic_cast<CActionSystem *>(m_ActionSystem.get())->GetSignalProvider(); - m_Connections.push_back(theActionSystemSignals->ConnectActionCreated( - bind(NotifyActionCreated, ref(m_Consumer), theSystemSender, - std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))); - m_Connections.push_back(theActionSystemSignals->ConnectActionDeleted( - bind(NotifyActionDestroyed, ref(m_Consumer), theSystemSender, - std::placeholders::_1, std::placeholders::_2, std::placeholders::_3))); -} - -CStudioFullSystem::~CStudioFullSystem() -{ -} - -std::shared_ptr<IPropertySystem> CStudioFullSystem::GetPropertySystem() -{ - return m_PropertySystem; -} -std::shared_ptr<ISlideSystem> CStudioFullSystem::GetSlideSystem() -{ - return m_SlideSystem; -} -std::shared_ptr<ISlideCore> CStudioFullSystem::GetSlideCore() -{ - return m_CoreSystem->GetSlideCore(); -} -std::shared_ptr<IAnimationCore> CStudioFullSystem::GetAnimationCore() -{ - return m_CoreSystem->GetAnimationCore(); -} -std::shared_ptr<IStudioAnimationSystem> CStudioFullSystem::GetAnimationSystem() -{ - return m_AnimationSystem; -} -std::shared_ptr<IActionCore> CStudioFullSystem::GetActionCore() -{ - return m_CoreSystem->GetActionCore(); -} -std::shared_ptr<IActionSystem> CStudioFullSystem::GetActionSystem() -{ - return m_ActionSystem; -} - -std::shared_ptr<IPropertySystem> CStudioFullSystem::GetPropertySystem() const -{ - return m_PropertySystem; -} -std::shared_ptr<ISlideSystem> CStudioFullSystem::GetSlideSystem() const -{ - return m_SlideSystem; -} -std::shared_ptr<ISlideCore> CStudioFullSystem::GetSlideCore() const -{ - return m_CoreSystem->GetSlideCore(); -} -std::shared_ptr<IAnimationCore> CStudioFullSystem::GetAnimationCore() const -{ - return m_CoreSystem->GetAnimationCore(); -} -std::shared_ptr<IStudioAnimationSystem> CStudioFullSystem::GetAnimationSystem() const -{ - return m_AnimationSystem; -} -std::shared_ptr<IActionCore> CStudioFullSystem::GetActionCore() const -{ - return m_CoreSystem->GetActionCore(); -} -std::shared_ptr<IActionSystem> CStudioFullSystem::GetActionSystem() const -{ - return m_ActionSystem; -} - -std::shared_ptr<CStudioCoreSystem> CStudioFullSystem::GetCoreSystem() -{ - return m_CoreSystem; -} - -bool CStudioFullSystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - SValue theTemp; - bool retval = dynamic_cast<const CStudioPropertySystem *>(m_PropertySystem.get()) - ->GetCanonicalInstancePropertyValue(inInstance, inProperty, theTemp); - if (retval) - outValue = theTemp.toOldSkool(); - return retval; -} - -Qt3DSDMInstanceHandle CStudioFullSystem::FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty, - const TCharStr &inName) const -{ - return m_CoreSystem->FindInstanceByName(inNameProperty, inName); -} - -void CStudioFullSystem::SetConsumer(TTransactionConsumerPtr inConsumer) -{ - m_CoreSystem->SetConsumer(inConsumer); - DoSetConsumer(inConsumer, m_AnimationSystem); - m_Consumer = inConsumer; -} - -IStudioFullSystemSignalProvider *CStudioFullSystem::GetSignalProvider() -{ - return dynamic_cast<IStudioFullSystemSignalProvider *>(m_Signaller.get()); -} - -IStudioFullSystemSignalSender *CStudioFullSystem::GetSignalSender() -{ - return dynamic_cast<IStudioFullSystemSignalSender *>(m_Signaller.get()); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/StudioFullSystem.h b/src/Authoring/QT3DSDM/Systems/StudioFullSystem.h deleted file mode 100644 index 9411e783..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioFullSystem.h +++ /dev/null @@ -1,164 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef STUDIOFULLSYSTEMH -#define STUDIOFULLSYSTEMH -#include "Qt3DSDMTransactions.h" -#include "Qt3DSDMHandles.h" -#include "Qt3DSDMSignals.h" -#include "Qt3DSDMDataTypes.h" - -namespace qt3dsdm { -class IPropertySystem; -class ISlideSystem; -class IStudioAnimationSystem; -class CStudioCoreSystem; -class IInstancePropertyCore; -class INotificationEngine; -class IAnimationCore; -class IActionCore; -class ISlideCore; -class IActionSystem; -class ISignalConnection; - -class IStudioFullSystemSerializeHelper -{ -public: - virtual ~IStudioFullSystemSerializeHelper() {} - /** - * Given an instance, set the name if possible. Called for parents of existing instances - * so we can find instances by name later. There is an implicit assumption for partial - * serialization that none of the instances that are serialized out are base instances - * for other serialized instances. There is another implicit assumption that the system - * can name any instances used a base. - */ - virtual bool GetInstanceName(Qt3DSDMInstanceHandle inInstance, TCharStr &outName) = 0; -}; - -typedef std::shared_ptr<IStudioFullSystemSerializeHelper> TStudioFullSystemSerializeHelperPtr; - -// The full studio system needs extra information in the deserialize stage. This information -// requires knowledge of the larger studio universe in order to work and thus clients need to -// pass in an interface. -class IStudioFullSystemDeserializeHelper -{ -public: - virtual ~IStudioFullSystemDeserializeHelper() {} - /** - * Return an instance by name. Whatever method was used above to name instances - * should be used to find a given instance by name. - */ - virtual Qt3DSDMInstanceHandle FindInstanceByName(const TCharStr &inName) = 0; - /** - * Translate a given guid. For pass 1, you should only translate ids and just return identity - * for anything that isn't an id. - */ - virtual void TranslateGuidPass1(Qt3DSDMPropertyHandle inProperty, SLong4 inValue) = 0; - /** - * Now translate guids that are used as data variables. These are links to other objects and - *the GUID - * information should come from what was created in pass 1. - */ - virtual SLong4 TranslateGuidPass2(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SLong4 inValue) = 0; -}; - -typedef std::shared_ptr<IStudioFullSystemDeserializeHelper> TStudioFullSystemDeserializeHelperPtr; - -class CStudioFullSystem : public ITransactionProducer -{ - Q_DISABLE_COPY(CStudioFullSystem) - - // Base that the other types are built upon - std::shared_ptr<CStudioCoreSystem> m_CoreSystem; - - // The data model exposed to studio - std::shared_ptr<IPropertySystem> m_PropertySystem; - std::shared_ptr<ISlideSystem> m_SlideSystem; - std::shared_ptr<IStudioAnimationSystem> m_AnimationSystem; - std::shared_ptr<IActionSystem> m_ActionSystem; - - std::vector<std::shared_ptr<ISignalConnection>> m_Connections; - - TTransactionConsumerPtr m_Consumer; - TSignalItemPtr m_Signaller; - bool m_AggregateOperation; - -public: - CStudioFullSystem(std::shared_ptr<CStudioCoreSystem> inCoreSystem, - Qt3DSDMInstanceHandle inSlideInstance, - Qt3DSDMPropertyHandle inComponentGuidProperty, - Qt3DSDMInstanceHandle inActionInstance, Qt3DSDMPropertyHandle inActionEyeball); - virtual ~CStudioFullSystem(); - - void BeginAggregateOperation() { m_AggregateOperation = true; } - void EndAggregateOperation() { m_AggregateOperation = false; } - - std::shared_ptr<IPropertySystem> GetPropertySystem(); - std::shared_ptr<ISlideSystem> GetSlideSystem(); - std::shared_ptr<ISlideCore> GetSlideCore(); - std::shared_ptr<IAnimationCore> GetAnimationCore(); - std::shared_ptr<IStudioAnimationSystem> GetAnimationSystem(); - std::shared_ptr<IActionCore> GetActionCore(); - std::shared_ptr<IActionSystem> GetActionSystem(); - - std::shared_ptr<IPropertySystem> GetPropertySystem() const; - std::shared_ptr<ISlideSystem> GetSlideSystem() const; - std::shared_ptr<ISlideCore> GetSlideCore() const; - std::shared_ptr<IAnimationCore> GetAnimationCore() const; - std::shared_ptr<IStudioAnimationSystem> GetAnimationSystem() const; - std::shared_ptr<IActionCore> GetActionCore() const; - std::shared_ptr<IActionSystem> GetActionSystem() const; - - // Don't use this unless you are a test harness or some other more-knowledgeable-than-ordinary - // entity. - std::shared_ptr<CStudioCoreSystem> GetCoreSystem(); - - // Ignoring animation and the currently active slide, get the canonical instance property value - // for this instance. - bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const; - Qt3DSDMInstanceHandle FindInstanceByName(Qt3DSDMPropertyHandle inNameProperty, - const TCharStr &inName) const; - - void SetConsumer(TTransactionConsumerPtr inConsumer) override; - TTransactionConsumerPtr GetConsumer() { return m_Consumer; } - - // This signal provider sends signals during undo/redo and during - // animation runs. - IStudioFullSystemSignalProvider *GetSignalProvider(); - - // Return the signal sender so that we can activate/deactivate signals - IStudioFullSystemSignalSender *GetSignalSender(); -}; - -typedef std::shared_ptr<CStudioFullSystem> TStudioFullSystemPtr; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/StudioPropertySystem.cpp b/src/Authoring/QT3DSDM/Systems/StudioPropertySystem.cpp deleted file mode 100644 index 78fabc6b..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioPropertySystem.cpp +++ /dev/null @@ -1,233 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "Qt3DSDMPrefix.h" -#include "StudioPropertySystem.h" -#include "StudioAnimationSystem.h" -#include "SignalsImpl.h" - -using namespace std; - -namespace qt3dsdm { - -CStudioPropertySystem::CStudioPropertySystem(std::shared_ptr<IMetaData> inMetaData, - TDataCorePtr inDataCore, TSlideSystemPtr inSlideSystem, - TStudioAnimationSystemPtr inStudioAnimationSystem) - : m_MetaData(inMetaData) - , m_DataCore(inDataCore) - , m_SlideSystem(inSlideSystem) - , m_StudioAnimationSystem(inStudioAnimationSystem) -{ - m_PropertyCoreSignaller = CreatePropertyCoreSignaller(); - m_ImmediateModePropertyCoreSignaller = CreatePropertyCoreSignaller(); -} - -DataModelDataType::Value CStudioPropertySystem::GetDataType(Qt3DSDMPropertyHandle inProperty) const -{ - if (m_DataCore->IsProperty(inProperty)) - return m_DataCore->GetProperty(inProperty).m_Type; - return DataModelDataType::None; -} - -TCharStr CStudioPropertySystem::GetName(Qt3DSDMPropertyHandle inProperty) const -{ - if (m_DataCore->IsProperty(inProperty)) - return m_DataCore->GetProperty(inProperty).m_Name; - return TCharStr(); -} - -TCharStr CStudioPropertySystem::GetFormalName(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - if (inInstance.Valid() && inProperty.Valid()) - return m_MetaData->GetFormalName(inInstance, inProperty); - return TCharStr(); -} - -AdditionalMetaDataType::Value -CStudioPropertySystem::GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - return m_MetaData->GetAdditionalMetaDataType(inInstance, inProperty); -} - -TMetaDataData -CStudioPropertySystem::GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - return m_MetaData->GetAdditionalMetaDataData(inInstance, inProperty); -} - -Qt3DSDMInstanceHandle CStudioPropertySystem::GetPropertyOwner(Qt3DSDMPropertyHandle inProperty) const -{ - - qt3dsdm::Qt3DSDMPropertyDefinition thePropDef = m_DataCore->GetProperty(inProperty); - return thePropDef.m_Instance; -} - -Qt3DSDMPropertyHandle -CStudioPropertySystem::GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const -{ - return m_DataCore->GetAggregateInstancePropertyByName(inInstance, inStr); -} - -void CStudioPropertySystem::GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const -{ - m_DataCore->GetAggregateInstanceProperties(inInstance, outProperties); -} - -bool CStudioPropertySystem::HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const -{ - return m_DataCore->HasAggregateInstanceProperty(inInstance, inProperty); -} - -bool ApplyValueAndReturnTrue(const SValue &inValue, SValue &outValue) -{ - outValue = inValue; - return true; -} - -bool CStudioPropertySystem::GetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - if (!m_DataCore->IsInstance(inInstance)) - return false; - if (!m_DataCore->IsProperty(inProperty)) - return false; - - Qt3DSDMSlideHandle theAnimationSlide; - theAnimationSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty); - SValue theTemp; - bool retval = SetDefault(GetDataType(inProperty), theTemp); - if (retval && theAnimationSlide.Valid() - && m_StudioAnimationSystem->GetAnimatedInstancePropertyValue(theAnimationSlide, inInstance, - inProperty, theTemp)) - return ApplyValueAndReturnTrue(theTemp, outValue); - if (theAnimationSlide.Valid() - && m_SlideSystem->GetInstancePropertyValue(theAnimationSlide, inInstance, inProperty, - theTemp)) - return ApplyValueAndReturnTrue(theTemp, outValue); - return m_DataCore->GetInstancePropertyValue(inInstance, inProperty, outValue); -} - -void CStudioPropertySystem::SetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - const SValue &inValue) -{ - m_DataCore->CheckValue(inInstance, inProperty, inValue); - - Qt3DSDMSlideHandle theApplicableSlide; - theApplicableSlide = m_SlideSystem->GetApplicableSlide(inInstance, inProperty); - if (theApplicableSlide.Valid()) { - if (!m_StudioAnimationSystem->SetAnimatedInstancePropertyValue( - theApplicableSlide, inInstance, inProperty, inValue.toOldSkool())) { - // Force set on slide where item exists as it doesn't exist on the root. - m_SlideSystem->ForceSetInstancePropertyValue(theApplicableSlide, inInstance, inProperty, - inValue.toOldSkool()); - } - } else { - m_DataCore->SetInstancePropertyValue(inInstance, inProperty, inValue); - } -} - -Qt3DSDMInstanceHandle CStudioPropertySystem::CreateInstance() -{ - return m_DataCore->CreateInstance(); -} - -void CStudioPropertySystem::GetInstances(TInstanceHandleList &outInstances) const -{ - m_DataCore->GetInstances(outInstances); -} - -void CStudioPropertySystem::DeleteInstance(Qt3DSDMInstanceHandle inHandle) -{ - m_DataCore->DeleteInstance(inHandle); -} - -void CStudioPropertySystem::DeriveInstance(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) -{ - m_DataCore->DeriveInstance(inInstance, inParent); -} - -bool CStudioPropertySystem::IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const -{ - return m_DataCore->IsInstanceOrDerivedFrom(inInstance, inParent); -} - -QVector<Qt3DSDMPropertyHandle> -CStudioPropertySystem::GetControllableProperties(Qt3DSDMInstanceHandle inInst) const -{ - vector<Qt3DSDMMetaDataPropertyHandle> propList; - QVector<Qt3DSDMPropertyHandle> outList; - m_MetaData->GetMetaDataProperties(inInst, propList); - - for (const auto it : qAsConst(propList)) { - auto metadata = m_MetaData->GetMetaDataPropertyInfo(it).getValue(); - - if ((metadata.m_Controllable - || (metadata.m_Animatable - && m_StudioAnimationSystem->IsPropertyAnimatable(inInst, metadata.m_Property))) - && !metadata.m_IsHidden) { - outList.append(metadata.m_Property); - } - } - return outList; -} - -Qt3DSDMPropertyHandle CStudioPropertySystem::AddProperty(Qt3DSDMInstanceHandle inInstance, - TCharPtr inName, - DataModelDataType::Value inPropType) -{ - return m_DataCore->AddProperty(inInstance, inName, inPropType); -} - -bool CStudioPropertySystem::HandleValid(int inHandle) const -{ - return m_DataCore->HandleValid(inHandle); -} - -bool CStudioPropertySystem::GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, - SValue &outValue) const -{ - SValue theTempValue; - if (m_SlideSystem->GetCanonicalInstancePropertyValue(inInstance, inProperty, theTempValue)) { - outValue = SValue(theTempValue); - return true; - } - return m_DataCore->GetInstancePropertyValue(inInstance, inProperty, outValue); -} -} diff --git a/src/Authoring/QT3DSDM/Systems/StudioPropertySystem.h b/src/Authoring/QT3DSDM/Systems/StudioPropertySystem.h deleted file mode 100644 index 67abcf98..00000000 --- a/src/Authoring/QT3DSDM/Systems/StudioPropertySystem.h +++ /dev/null @@ -1,132 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef INSTANCEPROPERTYCORESYSTEMH -#define INSTANCEPROPERTYCORESYSTEMH - -#include "Qt3DSDMSlides.h" -#include "Qt3DSDMAnimation.h" -#include "Qt3DSDMSignals.h" -#include "Qt3DSDMDataCore.h" - -namespace qt3dsdm { - -typedef std::tuple<Qt3DSDMInstanceHandle, Qt3DSDMPropertyHandle, SValue> TTemporaryPropertyValue; -typedef std::vector<TTemporaryPropertyValue> TTemporaryPropertyValueList; - -/** - * Get/set instance properties taking the slide and slide graph, and animation systems into - *account. - * Also takes care of notifying external entities when a property changes. - */ -class CStudioPropertySystem : public IPropertySystem -{ - std::shared_ptr<IMetaData> m_MetaData; - TDataCorePtr m_DataCore; - - TSlideSystemPtr m_SlideSystem; - TStudioAnimationSystemPtr m_StudioAnimationSystem; - - TSignalItemPtr m_PropertyCoreSignaller; - TSignalItemPtr m_ImmediateModePropertyCoreSignaller; - -public: - CStudioPropertySystem(std::shared_ptr<IMetaData> inMetaData, TDataCorePtr inDataCore, - TSlideSystemPtr inSlideSystem, - TStudioAnimationSystemPtr inStudioAnimationSystem); - - IInstancePropertyCoreSignalProvider *GetPropertyCoreSignalProvider() - { - return dynamic_cast<IInstancePropertyCoreSignalProvider *>(m_PropertyCoreSignaller.get()); - } - // The immediate signaller is used before changes have been committed for very live feedback. - IInstancePropertyCoreSignalProvider *GetImmediatePropertyCoreSignalProvider() - { - return dynamic_cast<IInstancePropertyCoreSignalProvider *>( - m_ImmediateModePropertyCoreSignaller.get()); - } - - IInstancePropertyCoreSignalSender *GetPropertyCoreSignalSender() - { - return dynamic_cast<IInstancePropertyCoreSignalSender *>(m_PropertyCoreSignaller.get()); - } - - DataModelDataType::Value GetDataType(Qt3DSDMPropertyHandle inProperty) const override; - TCharStr GetName(Qt3DSDMPropertyHandle inProperty) const override; - TCharStr GetFormalName(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - virtual AdditionalMetaDataType::Value - GetAdditionalMetaDataType(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - TMetaDataData GetAdditionalMetaDataData(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - Qt3DSDMInstanceHandle GetPropertyOwner(Qt3DSDMPropertyHandle inProperty) const override; - - Qt3DSDMPropertyHandle GetAggregateInstancePropertyByName(Qt3DSDMInstanceHandle inInstance, - const TCharStr &inStr) const override; - void GetAggregateInstanceProperties(Qt3DSDMInstanceHandle inInstance, - TPropertyHandleList &outProperties) const override; - bool HasAggregateInstanceProperty(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty) const override; - - bool GetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const override; - void SetInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, const SValue &inValue) override; - - Qt3DSDMInstanceHandle CreateInstance() override; - void GetInstances(TInstanceHandleList &outInstances) const override; - void DeleteInstance(Qt3DSDMInstanceHandle inHandle) override; - - void DeriveInstance(Qt3DSDMInstanceHandle inInstance, Qt3DSDMInstanceHandle inParent) override; - bool IsInstanceOrDerivedFrom(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMInstanceHandle inParent) const override; - - Qt3DSDMPropertyHandle AddProperty(Qt3DSDMInstanceHandle inInstance, TCharPtr inName, - DataModelDataType::Value inPropType) override; - bool HandleValid(int inHandle) const override; - - // Get the instance property value from the slide that owns the instance or the data core if the - // slide doesn't have the value - bool GetCanonicalInstancePropertyValue(Qt3DSDMInstanceHandle inInstance, - Qt3DSDMPropertyHandle inProperty, SValue &outValue) const; - - QVector<Qt3DSDMPropertyHandle> GetControllableProperties( - Qt3DSDMInstanceHandle inInst) const override; - -private: - static bool DerivedGuidMatches(qt3dsdm::IDataCore &inDataCore, - qt3dsdm::Qt3DSDMInstanceHandle inInstance, - qt3dsdm::Qt3DSDMPropertyHandle inProperty, qt3dsdm::SLong4 inGuid); - CStudioPropertySystem(const CStudioPropertySystem&) = delete; - CStudioPropertySystem& operator=(const CStudioPropertySystem&) = delete; -}; -} - -#endif diff --git a/src/Authoring/QT3DSDM/Systems/VectorTransactions.h b/src/Authoring/QT3DSDM/Systems/VectorTransactions.h deleted file mode 100644 index ff1fe2e2..00000000 --- a/src/Authoring/QT3DSDM/Systems/VectorTransactions.h +++ /dev/null @@ -1,235 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef VECTORTRANSACTIONSH -#define VECTORTRANSACTIONSH - -namespace qt3dsdm { -template <typename TItemType> -inline void VecInsert(std::vector<TItemType> &inItems, const TItemType &inItem, size_t inIndex) -{ - inItems.insert(inItems.begin() + inIndex, inItem); -} - -template <typename TItemType> -inline void VecErase(std::vector<TItemType> &inItems, const TItemType &inItem) -{ - erase_if(inItems, std::bind(std::equal_to<TItemType>(), inItem, std::placeholders::_1)); -} - -template <typename TItemType> -inline void VecInsertTransaction(const char *inFile, int inLine, std::vector<TItemType> &inItems, - size_t inIndex, TTransactionConsumerPtr &inConsumer) -{ - TItemType theItem = inItems.at(inIndex); - TTransactionPtr theTransaction(DoCreateGenericTransaction( - inFile, inLine, std::bind(VecInsert<TItemType>, std::ref(inItems), theItem, inIndex), - std::bind(VecErase<TItemType>, std::ref(inItems), theItem))); - inConsumer->OnTransaction(theTransaction); -} - -template <typename TItemType> -inline void VecEraseTransaction(const char *inFile, int inLine, std::vector<TItemType> &inItems, - size_t inIndex, const TItemType &inItem, - TTransactionConsumerPtr &inConsumer) -{ - TTransactionPtr theTransaction(DoCreateGenericTransaction( - inFile, inLine, std::bind(VecErase<TItemType>, std::ref(inItems), inItem), - std::bind(VecInsert<TItemType>, std::ref(inItems), inItem, inIndex))); - inConsumer->OnTransaction(theTransaction); -} - -template <typename TItemType> -inline void CreateVecInsertTransaction(const char *inFile, int inLine, - TTransactionConsumerPtr inConsumer, const TItemType &inItem, - std::vector<TItemType> &inItems) -{ - using namespace std; - size_t theDistance = distance(inItems.begin(), find(inItems.begin(), inItems.end(), inItem)); - RunWithConsumer(inConsumer, std::bind(VecInsertTransaction<TItemType>, inFile, inLine, - std::ref(inItems), theDistance, std::placeholders::_1)); -} - -template <typename TItemType> -inline void CreateVecEraseTransaction(const char *inFile, int inLine, - TTransactionConsumerPtr inConsumer, const TItemType &inItem, - std::vector<TItemType> &inItems) -{ - using namespace std; - size_t theDistance = distance(inItems.begin(), find(inItems.begin(), inItems.end(), inItem)); - RunWithConsumer(inConsumer, - std::bind(VecEraseTransaction<TItemType>, inFile, inLine, std::ref(inItems), - theDistance, std::ref(inItem), std::placeholders::_1)); -} - -template <typename TKeyType, typename TValueType, typename THashType> -struct HashMapAction -{ - std::unordered_map<TKeyType, TValueType, THashType> &m_HashMap; - std::pair<TKeyType, TValueType> m_Value; - - HashMapAction(std::unordered_map<TKeyType, TValueType, THashType> &map, - const std::pair<TKeyType, TValueType> &val) - : m_HashMap(map) - , m_Value(val) - { - } - bool Exists() { return m_HashMap.find(m_Value.first) != m_HashMap.end(); } - void Add() - { - Q_ASSERT(!Exists()); - m_HashMap.insert(m_Value); - } - void Remove() - { - Q_ASSERT(Exists()); - m_HashMap.erase(m_HashMap.find(m_Value.first)); - } -}; - -template <typename TKeyType, typename TValueType, typename THashType> -struct HashMapInsertTransaction : public HashMapAction<TKeyType, TValueType, THashType>, - public ITransaction, - public IMergeableTransaction<TValueType> -{ - typedef HashMapAction<TKeyType, TValueType, THashType> base; - HashMapInsertTransaction(const char *inFile, int inLine, - std::unordered_map<TKeyType, TValueType, THashType> &map, - const std::pair<TKeyType, TValueType> &val) - : HashMapAction<TKeyType, TValueType, THashType>(map, val) - , ITransaction(inFile, inLine) - { - } - void Do() override { base::Add(); } - void Undo() override { base::Remove(); } - void Update(const TValueType &inValue) override { base::m_Value.second = inValue; } -}; - -template <typename TKeyType, typename TValueType, typename THashType> -struct HashMapEraseTransaction : public HashMapAction<TKeyType, TValueType, THashType>, - public ITransaction -{ - typedef HashMapAction<TKeyType, TValueType, THashType> base; - HashMapEraseTransaction(const char *inFile, int inLine, - std::unordered_map<TKeyType, TValueType, THashType> &map, - const std::pair<TKeyType, TValueType> &val) - : HashMapAction<TKeyType, TValueType, THashType>(map, val) - , ITransaction(inFile, inLine) - { - } - void Do() override { base::Remove(); } - void Undo() override { base::Add(); } -}; - -template <typename TKeyType, typename TValueType, typename THashType> -inline std::shared_ptr<IMergeableTransaction<TValueType>> -CreateHashMapInsertTransaction(const char *inFile, int inLine, TTransactionConsumerPtr inConsumer, - const std::pair<TKeyType, TValueType> &inItem, - std::unordered_map<TKeyType, TValueType, THashType> &inItems) -{ - using namespace std; - std::shared_ptr<IMergeableTransaction<TValueType>> retval; - if (inConsumer) { - std::shared_ptr<HashMapInsertTransaction<TKeyType, TValueType, THashType>> transaction( - std::make_shared<HashMapInsertTransaction<TKeyType, TValueType, THashType>>( - inFile, inLine, std::ref(inItems), std::cref(inItem))); - retval = static_pointer_cast<IMergeableTransaction<TValueType>>(transaction); - inConsumer->OnTransaction(static_pointer_cast<ITransaction>(transaction)); - } - return retval; -} - -template <typename TKeyType, typename TValueType, typename THashType> -inline void -CreateHashMapEraseTransaction(const char *inFile, int inLine, TTransactionConsumerPtr inConsumer, - const std::pair<TKeyType, TValueType> &inItem, - std::unordered_map<TKeyType, TValueType, THashType> &inItems) -{ - using namespace std; - if (inConsumer) - inConsumer->OnTransaction(static_pointer_cast<ITransaction>( - std::make_shared<HashMapEraseTransaction<TKeyType, TValueType, THashType>>( - inFile, inLine, std::ref(inItems), std::cref(inItem)))); -} - -template <typename TKeyType, typename TValueType, typename THashType> -struct HashMapSwapTransaction : public ITransaction, public IMergeableTransaction<TValueType> -{ - typedef std::unordered_map<TKeyType, TValueType, THashType> TMapType; - - TMapType &m_HashMap; - TKeyType m_Key; - TValueType m_OldValue; - TValueType m_NewValue; - - HashMapSwapTransaction(const char *inFile, int inLine, TMapType &inMap, const TKeyType &inKey, - const TValueType &inOldVal, const TValueType &inNewVal) - : ITransaction(inFile, inLine) - , m_HashMap(inMap) - , m_Key(inKey) - , m_OldValue(inOldVal) - , m_NewValue(inNewVal) - { - } - - bool Exists() { return m_HashMap.find(m_Key) != m_HashMap.end(); } - void SetValue(const TValueType &inVal) - { - typename TMapType::iterator find(m_HashMap.find(m_Key)); - if (find != m_HashMap.end()) - find->second = inVal; - else - m_HashMap.insert(std::make_pair(m_Key, inVal)); - } - void Do() override { SetValue(m_NewValue); } - void Undo() override { SetValue(m_OldValue); } - void Update(const TValueType &inValue) override { m_NewValue = inValue; } -}; - -template <typename TKeyType, typename TValueType, typename THashType> -inline std::shared_ptr<IMergeableTransaction<TValueType>> -CreateHashMapSwapTransaction(const char *inFile, int inLine, TTransactionConsumerPtr inConsumer, - const TKeyType &inKey, const TValueType &inOldValue, - const TValueType &inNewValue, - std::unordered_map<TKeyType, TValueType, THashType> &inItems) -{ - using namespace std; - std::shared_ptr<IMergeableTransaction<TValueType>> retval; - if (inConsumer) { - std::shared_ptr<HashMapSwapTransaction<TKeyType, TValueType, THashType>> transaction = - std::make_shared<HashMapSwapTransaction<TKeyType, TValueType, THashType>>( - inFile, inLine, std::ref(inItems), inKey, inOldValue, inNewValue); - retval = static_pointer_cast<IMergeableTransaction<TValueType>>(transaction); - inConsumer->OnTransaction(static_pointer_cast<ITransaction>(transaction)); - } - return retval; -} -} - -#endif diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportContainers.h b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportContainers.h deleted file mode 100644 index 2f2a72ee..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportContainers.h +++ /dev/null @@ -1,88 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DS_IMPORT_CONTAINERS_H -#define QT3DS_IMPORT_CONTAINERS_H - -#include "EASTL/hash_map.h" -#include "EASTL/hash_set.h" -#include "EASTL/vector.h" -#include "foundation/Qt3DSDataRef.h" -#include "Qt3DSDMWStrOps.h" - -namespace qt3dsimp { - -#define QT3DSIMP_FOREACH(idxnm, val) \ - for (QT3DSU32 idxnm = 0, __numItems = (QT3DSU32)val; idxnm < __numItems; ++idxnm) - -template <typename TKey, typename TValue, typename THash = eastl::hash<TKey>, - typename TPredicate = eastl::equal_to<TKey>> -struct ImportHashMap : public eastl::hash_map<TKey, TValue, THash, TPredicate> -{ - using base_type = eastl::hash_map<TKey, TValue, THash, TPredicate>; - - ImportHashMap() {} - - - - bool contains(const TKey &key) const { return find(key) != base_type::end(); } -}; -template <typename TKey> -struct ImportHashSet : public eastl::hash_set<TKey, eastl::hash<TKey>, eastl::equal_to<TKey>> -{ - using base_type = eastl::hash_set<TKey, eastl::hash<TKey>, eastl::equal_to<TKey>>; - ImportHashSet() {} - bool contains(const TKey &key) const { return base_type::find(key) != base_type::end(); } -}; -template <typename TValue> -struct ImportArray : public eastl::vector<TValue> -{ - using base_type = eastl::vector<TValue>; - - ImportArray() {} - operator NVConstDataRef<TValue>() const - { - return NVConstDataRef<TValue>(base_type::data(), (QT3DSU32) base_type::size()); - } - - operator NVDataRef<TValue>() { - return NVDataRef<TValue>(base_type::data(), (QT3DSU32) base_type::size()); - } -}; - -inline NVConstDataRef<wchar_t> toRef(const wchar_t *data, QT3DSU32 len = 0) -{ - if (IsTrivial(data)) - return NVConstDataRef<wchar_t>(L"", 0); - len = len ? len : (QT3DSU32)wcslen(data); - return NVConstDataRef<wchar_t>(data, len); -} -} - -#endif diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportLibPrecompile.h b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportLibPrecompile.h deleted file mode 100644 index 34da79d0..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportLibPrecompile.h +++ /dev/null @@ -1,56 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#pragma once - -#include "foundation/Qt3DS.h" -#include "foundation/Qt3DSDataRef.h" -#include "foundation/Qt3DSOption.h" -#include "render/Qt3DSRenderBaseTypes.h" -#include <map> -#include <vector> -#include <string> -#include <exception> -#include <set> -#include <iostream> -#include <sstream> -#include <fstream> -#include "Qt3DSDMDataTypes.h" -#include "foundation/Qt3DSIntrinsics.h" -#include "foundation/Qt3DSBasicTemplates.h" - -namespace qt3dsimp { -using namespace qt3ds; -using namespace qt3ds::foundation; -using namespace qt3ds::render; -using namespace qt3dsdm; -using namespace std; -} - -// TODO: reference additional headers your program requires here diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.cpp b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.cpp deleted file mode 100644 index 1535b911..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.cpp +++ /dev/null @@ -1,829 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#ifdef WIN32 -#pragma warning(disable : 4100) -#endif -#include "Qt3DSImportLibPrecompile.h" -#include "Qt3DSImportMesh.h" - -using namespace qt3dsimp; - -#ifdef QT3DS_X86 - -// Ensure our objects are of expected sizes. This keeps us honest -// And ensures that we can load the datastructures we expect to by simply -// mapping the memory. -QT3DS_COMPILE_TIME_ASSERT(sizeof(NVRenderComponentTypes::Enum) == 4); -QT3DS_COMPILE_TIME_ASSERT(sizeof(NVRenderDrawMode::Enum) == 4); -QT3DS_COMPILE_TIME_ASSERT(sizeof(NVRenderVertexBufferEntry) == 20); -QT3DS_COMPILE_TIME_ASSERT(sizeof(VertexBuffer) == 20); -QT3DS_COMPILE_TIME_ASSERT(sizeof(IndexBuffer) == 12); -QT3DS_COMPILE_TIME_ASSERT(sizeof(MeshSubset) == 40); -QT3DS_COMPILE_TIME_ASSERT(sizeof(MeshDataHeader) == 12); -QT3DS_COMPILE_TIME_ASSERT(sizeof(Mesh) == 56); - -#endif - -#define QT3DSIMP_FOREACH(idxnm, val) \ - for (QT3DSU32 idxnm = 0, __numItems = (QT3DSU32)val; idxnm < __numItems; ++idxnm) - -namespace { - -struct MeshSubsetV1 -{ - // See description of a logical vertex buffer below - QT3DSU32 m_LogicalVbufIndex; - // QT3DS_MAX_U32 means use all available items - QT3DSU32 m_Count; - // Offset is in item size, not bytes. - QT3DSU32 m_Offset; - // Bounds of this subset. This is filled in by the builder - // see AddMeshSubset - NVBounds3 m_Bounds; -}; - -struct LogicalVertexBuffer -{ - QT3DSU32 m_ByteOffset; - QT3DSU32 m_ByteSize; - LogicalVertexBuffer(QT3DSU32 byteOff, QT3DSU32 byteSize) - : m_ByteOffset(byteOff) - , m_ByteSize(byteSize) - { - } - LogicalVertexBuffer() - : m_ByteOffset(0) - , m_ByteSize(0) - { - } -}; - -struct MeshV1 -{ - VertexBuffer m_VertexBuffer; - IndexBuffer m_IndexBuffer; - SOffsetDataRef<LogicalVertexBuffer> m_LogicalVertexBuffers; // may be empty - SOffsetDataRef<MeshSubsetV1> m_Subsets; - NVRenderDrawMode::Enum m_DrawMode; - NVRenderWinding::Enum m_Winding; - typedef MeshSubsetV1 TSubsetType; -}; - -template <typename TSerializer> -void Serialize(TSerializer &serializer, MeshV1 &mesh) -{ - QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(&mesh); - serializer.streamify(mesh.m_VertexBuffer.m_Entries); - serializer.align(); - QT3DSIMP_FOREACH(entry, mesh.m_VertexBuffer.m_Entries.size()) - { - MeshVertexBufferEntry &entryData = const_cast<MeshVertexBufferEntry &>( - mesh.m_VertexBuffer.m_Entries.index(baseAddr, entry)); - serializer.streamifyCharPointerOffset(entryData.m_NameOffset); - serializer.align(); - } - serializer.streamify(mesh.m_VertexBuffer.m_Data); - serializer.align(); - serializer.streamify(mesh.m_IndexBuffer.m_Data); - serializer.align(); - serializer.streamify(mesh.m_LogicalVertexBuffers); - serializer.align(); - serializer.streamify(mesh.m_Subsets); - serializer.align(); -} - -struct MeshSubsetV2 -{ - QT3DSU32 m_LogicalVbufIndex; - QT3DSU32 m_Count; - QT3DSU32 m_Offset; - NVBounds3 m_Bounds; - SOffsetDataRef<char16_t> m_Name; -}; - -struct MeshV2 -{ - static const char16_t *s_DefaultName; - - VertexBuffer m_VertexBuffer; - IndexBuffer m_IndexBuffer; - SOffsetDataRef<LogicalVertexBuffer> m_LogicalVertexBuffers; // may be empty - SOffsetDataRef<MeshSubsetV2> m_Subsets; - NVRenderDrawMode::Enum m_DrawMode; - NVRenderWinding::Enum m_Winding; - typedef MeshSubsetV2 TSubsetType; -}; - -template <typename TSerializer> -void Serialize(TSerializer &serializer, MeshV2 &mesh) -{ - QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(&mesh); - serializer.streamify(mesh.m_VertexBuffer.m_Entries); - serializer.align(); - QT3DSIMP_FOREACH(entry, mesh.m_VertexBuffer.m_Entries.size()) - { - MeshVertexBufferEntry &entryData = const_cast<MeshVertexBufferEntry &>( - mesh.m_VertexBuffer.m_Entries.index(baseAddr, entry)); - serializer.streamifyCharPointerOffset(entryData.m_NameOffset); - serializer.align(); - } - serializer.streamify(mesh.m_VertexBuffer.m_Data); - serializer.align(); - serializer.streamify(mesh.m_IndexBuffer.m_Data); - serializer.align(); - serializer.streamify(mesh.m_LogicalVertexBuffers); - serializer.align(); - serializer.streamify(mesh.m_Subsets); - serializer.align(); - QT3DSIMP_FOREACH(entry, mesh.m_Subsets.size()) - { - MeshSubsetV2 &theSubset = const_cast<MeshSubsetV2 &>(mesh.m_Subsets.index(baseAddr, entry)); - serializer.streamify(theSubset.m_Name); - serializer.align(); - } -} - -// Localize the knowledge required to read/write a mesh into one function -// written in such a way that you can both read and write by passing -// in one serializer type or another. -// This function needs to be careful to request alignment after every write of a -// buffer that may leave us unaligned. The easiest way to be correct is to request -// alignment a lot. The hardest way is to use knowledge of the datatypes and -// only request alignment when necessary. -template <typename TSerializer> -void Serialize(TSerializer &serializer, Mesh &mesh) -{ - QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(&mesh); - serializer.streamify(mesh.m_VertexBuffer.m_Entries); - serializer.align(); - QT3DSIMP_FOREACH(entry, mesh.m_VertexBuffer.m_Entries.size()) - { - MeshVertexBufferEntry &entryData = mesh.m_VertexBuffer.m_Entries.index(baseAddr, entry); - serializer.streamifyCharPointerOffset(entryData.m_NameOffset); - serializer.align(); - } - serializer.streamify(mesh.m_VertexBuffer.m_Data); - serializer.align(); - serializer.streamify(mesh.m_IndexBuffer.m_Data); - serializer.align(); - serializer.streamify(mesh.m_Subsets); - serializer.align(); - QT3DSIMP_FOREACH(entry, mesh.m_Subsets.size()) - { - MeshSubset &theSubset = const_cast<MeshSubset &>(mesh.m_Subsets.index(baseAddr, entry)); - serializer.streamify(theSubset.m_Name); - serializer.align(); - } - serializer.streamify(mesh.m_Joints); - serializer.align(); -} - -struct TotallingSerializer -{ - QT3DSU32 m_NumBytes; - QT3DSU8 *m_BaseAddress; - TotallingSerializer(QT3DSU8 *inBaseAddr) - : m_NumBytes(0) - , m_BaseAddress(inBaseAddr) - { - } - template <typename TDataType> - void streamify(const SOffsetDataRef<TDataType> &data) - { - m_NumBytes += data.size() * sizeof(TDataType); - } - void streamify(const char *data) - { - if (data == NULL) - data = ""; - QT3DSU32 len = (QT3DSU32)strlen(data) + 1; - m_NumBytes += 4; - m_NumBytes += len; - } - void streamifyCharPointerOffset(QT3DSU32 inOffset) - { - if (inOffset) { - const char *dataPtr = (const char *)(inOffset + m_BaseAddress); - streamify(dataPtr); - } else - streamify(""); - } - bool needsAlignment() const { return getAlignmentAmount() > 0; } - QT3DSU32 getAlignmentAmount() const { return 4 - (m_NumBytes % 4); } - void align() - { - if (needsAlignment()) - m_NumBytes += getAlignmentAmount(); - } -}; - -struct ByteWritingSerializer -{ - IOutStream &m_Stream; - TotallingSerializer m_ByteCounter; - QT3DSU8 *m_BaseAddress; - ByteWritingSerializer(IOutStream &str, QT3DSU8 *inBaseAddress) - : m_Stream(str) - , m_ByteCounter(inBaseAddress) - , m_BaseAddress(inBaseAddress) - { - } - - template <typename TDataType> - void streamify(const SOffsetDataRef<TDataType> &data) - { - m_ByteCounter.streamify(data); - m_Stream.Write(data.begin(m_BaseAddress), data.size()); - } - void streamify(const char *data) - { - m_ByteCounter.streamify(data); - if (data == NULL) - data = ""; - QT3DSU32 len = (QT3DSU32)strlen(data) + 1; - m_Stream.Write(len); - m_Stream.Write(data, len); - } - void streamifyCharPointerOffset(QT3DSU32 inOffset) - { - const char *dataPtr = (const char *)(inOffset + m_BaseAddress); - streamify(dataPtr); - } - - void align() - { - if (m_ByteCounter.needsAlignment()) { - QT3DSU8 buffer[] = { 0, 0, 0, 0 }; - m_Stream.Write(buffer, m_ByteCounter.getAlignmentAmount()); - m_ByteCounter.align(); - } - } -}; - -struct MemoryAssigningSerializer -{ - QT3DSU8 *m_Memory; - QT3DSU8 *m_BaseAddress; - QT3DSU32 m_Size; - TotallingSerializer m_ByteCounter; - bool m_Failure; - MemoryAssigningSerializer(QT3DSU8 *data, QT3DSU32 size, QT3DSU32 startOffset) - : m_Memory(data + startOffset) - , m_BaseAddress(data) - , m_Size(size) - , m_ByteCounter(data) - , m_Failure(false) - { - // We expect 4 byte aligned memory to begin with - QT3DS_ASSERT((((size_t)m_Memory) % 4) == 0); - } - - template <typename TDataType> - void streamify(const SOffsetDataRef<TDataType> &_data) - { - SOffsetDataRef<TDataType> &data = const_cast<SOffsetDataRef<TDataType> &>(_data); - if (m_Failure) { - data.m_Size = 0; - data.m_Offset = 0; - return; - } - QT3DSU32 current = m_ByteCounter.m_NumBytes; - m_ByteCounter.streamify(_data); - if (m_ByteCounter.m_NumBytes > m_Size) { - data.m_Size = 0; - data.m_Offset = 0; - m_Failure = true; - return; - } - QT3DSU32 numBytes = m_ByteCounter.m_NumBytes - current; - if (numBytes) { - data.m_Offset = (QT3DSU32)(m_Memory - m_BaseAddress); - updateMemoryBuffer(numBytes); - } else { - data.m_Offset = 0; - data.m_Size = 0; - } - } - void streamify(const char *&_data) - { - QT3DSU32 len; - m_ByteCounter.m_NumBytes += 4; - if (m_ByteCounter.m_NumBytes > m_Size) { - _data = ""; - m_Failure = true; - return; - } - qt3ds::intrinsics::memCopy(&len, m_Memory, 4); - updateMemoryBuffer(4); - m_ByteCounter.m_NumBytes += len; - if (m_ByteCounter.m_NumBytes > m_Size) { - _data = ""; - m_Failure = true; - return; - } - _data = (const char *)m_Memory; - updateMemoryBuffer(len); - } - void streamifyCharPointerOffset(QT3DSU32 &inOffset) - { - const char *dataPtr; - streamify(dataPtr); - inOffset = (QT3DSU32)(dataPtr - (const char *)m_BaseAddress); - } - void align() - { - if (m_ByteCounter.needsAlignment()) { - QT3DSU32 numBytes = m_ByteCounter.getAlignmentAmount(); - m_ByteCounter.align(); - updateMemoryBuffer(numBytes); - } - } - void updateMemoryBuffer(QT3DSU32 numBytes) { m_Memory += numBytes; } -}; - -inline QT3DSU32 GetMeshDataSize(Mesh &mesh) -{ - TotallingSerializer s(reinterpret_cast<QT3DSU8 *>(&mesh)); - Serialize(s, mesh); - return s.m_NumBytes; -} - -template <typename TDataType> -QT3DSU32 NextIndex(const QT3DSU8 *inBaseAddress, const SOffsetDataRef<QT3DSU8> data, QT3DSU32 idx) -{ - QT3DSU32 numItems = data.size() / sizeof(TDataType); - if (idx < numItems) { - const TDataType *dataPtr(reinterpret_cast<const TDataType *>(data.begin(inBaseAddress))); - return dataPtr[idx]; - } else { - QT3DS_ASSERT(false); - return 0; - } -} - -template <typename TDataType> -QT3DSU32 NextIndex(NVConstDataRef<QT3DSU8> data, QT3DSU32 idx) -{ - QT3DSU32 numItems = data.size() / sizeof(TDataType); - if (idx < numItems) { - const TDataType *dataPtr(reinterpret_cast<const TDataType *>(data.begin())); - return dataPtr[idx]; - } else { - QT3DS_ASSERT(false); - return 0; - } -} - -inline QT3DSU32 NextIndex(NVConstDataRef<QT3DSU8> inData, - qt3ds::render::NVRenderComponentTypes::Enum inCompType, QT3DSU32 idx) -{ - if (inData.size() == 0) - return idx; - switch (inCompType) { - case NVRenderComponentTypes::QT3DSU8: - return NextIndex<QT3DSU8>(inData, idx); - case NVRenderComponentTypes::QT3DSI8: - return NextIndex<QT3DSI8>(inData, idx); - case NVRenderComponentTypes::QT3DSU16: - return NextIndex<QT3DSU16>(inData, idx); - case NVRenderComponentTypes::QT3DSI16: - return NextIndex<QT3DSI16>(inData, idx); - case NVRenderComponentTypes::QT3DSU32: - return NextIndex<QT3DSU32>(inData, idx); - case NVRenderComponentTypes::QT3DSI32: - return NextIndex<QT3DSI32>(inData, idx); - default: - break; - } - - // Invalid index buffer index type. - QT3DS_ASSERT(false); - return 0; -} - -template <typename TMeshType> -// Not exposed to the outside world -TMeshType *DoInitialize(MeshBufHeaderFlags /*meshFlags*/, NVDataRef<QT3DSU8> data) -{ - QT3DSU8 *newMem = data.begin(); - QT3DSU32 amountLeft = data.size() - sizeof(TMeshType); - MemoryAssigningSerializer s(newMem, amountLeft, sizeof(TMeshType)); - TMeshType *retval = (TMeshType *)newMem; - Serialize(s, *retval); - if (s.m_Failure) - return NULL; - return retval; -} -} - -NVBounds3 Mesh::CalculateSubsetBounds(const NVRenderVertexBufferEntry &inEntry, - NVConstDataRef<QT3DSU8> inVertxData, QT3DSU32 inStride, - NVConstDataRef<QT3DSU8> inIndexData, - qt3ds::render::NVRenderComponentTypes::Enum inIndexCompType, - QT3DSU32 inSubsetCount, QT3DSU32 inSubsetOffset) -{ - NVBounds3 retval(NVBounds3::empty()); - const NVRenderVertexBufferEntry &entry(inEntry); - if (entry.m_ComponentType != NVRenderComponentTypes::QT3DSF32 || entry.m_NumComponents != 3) { - QT3DS_ASSERT(false); - return retval; - } - - const QT3DSU8 *beginPtr = inVertxData.begin(); - QT3DSU32 numBytes = inVertxData.size(); - QT3DSU32 dataStride = inStride; - QT3DSU32 posOffset = entry.m_FirstItemOffset; - // The loop below could be template specialized *if* we wanted to do this. - // and the perf of the existing loop was determined to be a problem. - // Else I would rather stay way from the template specialization. - QT3DSIMP_FOREACH(idx, inSubsetCount) - { - QT3DSU32 dataIdx = NextIndex(inIndexData, inIndexCompType, idx + inSubsetOffset); - QT3DSU32 finalOffset = (dataIdx * dataStride) + posOffset; - if (finalOffset + sizeof(QT3DSVec3) <= numBytes) { - const QT3DSU8 *dataPtr = beginPtr + finalOffset; - retval.include(*reinterpret_cast<const QT3DSVec3 *>(dataPtr)); - } else { - QT3DS_ASSERT(false); - } - } - - return retval; -} - -void Mesh::Save(IOutStream &outStream) const -{ - Mesh &mesh(const_cast<Mesh &>(*this)); - QT3DSU8 *baseAddress = reinterpret_cast<QT3DSU8 *>(&mesh); - QT3DSU32 numBytes = sizeof(Mesh) + GetMeshDataSize(mesh); - MeshDataHeader header(numBytes); - outStream.Write(header); - outStream.Write(*this); - ByteWritingSerializer writer(outStream, baseAddress); - Serialize(writer, mesh); -} - -wchar_t g_DefaultName[] = { 0 }; - -const wchar_t *Mesh::s_DefaultName = g_DefaultName; - -template <typename TMeshType> -struct SubsetNameHandler -{ -}; - -template <> -struct SubsetNameHandler<MeshV1> -{ - void AssignName(const QT3DSU8 * /*v1BaseAddress*/, const MeshSubsetV1 & /*mesh*/, - QT3DSU8 * /*baseAddress*/, QT3DSU8 *& /*nameBuffer*/, MeshSubset &outDest) - { - outDest.m_Name = SOffsetDataRef<char16_t>(); - } - QT3DSU32 NameLength(const MeshSubsetV1 &) { return 0; } -}; - -using qt3ds::intrinsics::memCopy; - -template <> -struct SubsetNameHandler<MeshV2> -{ - void AssignName(const QT3DSU8 *v2BaseAddress, const MeshSubsetV2 &mesh, QT3DSU8 *baseAddress, - QT3DSU8 *&nameBuffer, MeshSubset &outDest) - { - outDest.m_Name.m_Size = mesh.m_Name.m_Size; - outDest.m_Name.m_Offset = (QT3DSU32)(nameBuffer - baseAddress); - QT3DSU32 dtypeSize = mesh.m_Name.m_Size * 2; - memCopy(nameBuffer, mesh.m_Name.begin(v2BaseAddress), dtypeSize); - nameBuffer += dtypeSize; - } - QT3DSU32 NameLength(const MeshSubsetV2 &mesh) { return (mesh.m_Name.size() + 1) * 2; } -}; - -QT3DSU32 GetAlignedOffset(QT3DSU32 offset, QT3DSU32 align) -{ - QT3DSU32 leftover = offset % align; - if (leftover) - return offset + (align - leftover); - return offset; -} - -template <typename TPreviousMeshType> -Mesh *CreateMeshFromPreviousMesh(TPreviousMeshType *temp, NVAllocatorCallback &alloc) -{ - QT3DSU32 newMeshSize = sizeof(Mesh); - QT3DSU8 *tempBaseAddress = reinterpret_cast<QT3DSU8 *>(temp); - QT3DSU32 alignment = sizeof(void *); - - QT3DSU32 vertBufferSize = GetAlignedOffset(temp->m_VertexBuffer.m_Data.size(), alignment); - newMeshSize += vertBufferSize; - QT3DSU32 entryDataSize = temp->m_VertexBuffer.m_Entries.size() * sizeof(MeshVertexBufferEntry); - newMeshSize += entryDataSize; - QT3DSU32 indexBufferSize = GetAlignedOffset(temp->m_IndexBuffer.m_Data.size(), alignment); - newMeshSize += indexBufferSize; - QT3DSU32 entryNameSize = 0; - for (QT3DSU32 entryIdx = 0, entryEnd = temp->m_VertexBuffer.m_Entries.size(); entryIdx < entryEnd; - ++entryIdx) { - const qt3ds::render::NVRenderVertexBufferEntry theEntry = - temp->m_VertexBuffer.m_Entries.index(tempBaseAddress, entryIdx) - .ToVertexBufferEntry(tempBaseAddress); - const char *namePtr = theEntry.m_Name; - if (namePtr == NULL) - namePtr = ""; - - entryNameSize += (QT3DSU32)strlen(theEntry.m_Name) + 1; - } - entryNameSize = GetAlignedOffset(entryNameSize, alignment); - - newMeshSize += entryNameSize; - QT3DSU32 subsetBufferSize = temp->m_Subsets.size() * sizeof(MeshSubset); - newMeshSize += subsetBufferSize; - QT3DSU32 nameLength = 0; - for (QT3DSU32 subsetIdx = 0, subsetEnd = temp->m_Subsets.size(); subsetIdx < subsetEnd; - ++subsetIdx) { - nameLength += SubsetNameHandler<TPreviousMeshType>().NameLength( - temp->m_Subsets.index(tempBaseAddress, subsetIdx)); - } - nameLength = GetAlignedOffset(nameLength, alignment); - - newMeshSize += nameLength; - - Mesh *retval = (Mesh *)alloc.allocate(newMeshSize, "TempData", __FILE__, __LINE__); - new (retval) Mesh(); - QT3DSU8 *baseOffset = reinterpret_cast<QT3DSU8 *>(retval); - QT3DSU8 *vertBufferData = baseOffset + sizeof(Mesh); - QT3DSU8 *entryBufferData = vertBufferData + vertBufferSize; - QT3DSU8 *entryNameBuffer = entryBufferData + entryDataSize; - QT3DSU8 *indexBufferData = entryNameBuffer + entryNameSize; - QT3DSU8 *subsetBufferData = indexBufferData + indexBufferSize; - QT3DSU8 *nameData = subsetBufferData + subsetBufferSize; - - retval->m_DrawMode = temp->m_DrawMode; - retval->m_Winding = temp->m_Winding; - retval->m_VertexBuffer = temp->m_VertexBuffer; - retval->m_VertexBuffer.m_Data.m_Offset = (QT3DSU32)(vertBufferData - baseOffset); - retval->m_VertexBuffer.m_Entries.m_Offset = (QT3DSU32)(entryBufferData - baseOffset); - memCopy(vertBufferData, temp->m_VertexBuffer.m_Data.begin(tempBaseAddress), - temp->m_VertexBuffer.m_Data.size()); - memCopy(entryBufferData, temp->m_VertexBuffer.m_Entries.begin(tempBaseAddress), entryDataSize); - QT3DSIMP_FOREACH(idx, temp->m_VertexBuffer.m_Entries.size()) - { - const MeshVertexBufferEntry &src = - temp->m_VertexBuffer.m_Entries.index(tempBaseAddress, idx); - MeshVertexBufferEntry &dest = retval->m_VertexBuffer.m_Entries.index(baseOffset, idx); - - const char *targetName = reinterpret_cast<const char *>(src.m_NameOffset + tempBaseAddress); - if (src.m_NameOffset == 0) - targetName = ""; - QT3DSU32 nameLen = (QT3DSU32)strlen(targetName) + 1; - dest.m_NameOffset = (QT3DSU32)(entryNameBuffer - baseOffset); - memCopy(entryNameBuffer, targetName, nameLen); - entryNameBuffer += nameLen; - } - - retval->m_IndexBuffer = temp->m_IndexBuffer; - retval->m_IndexBuffer.m_Data.m_Offset = (QT3DSU32)(indexBufferData - baseOffset); - memCopy(indexBufferData, temp->m_IndexBuffer.m_Data.begin(tempBaseAddress), - temp->m_IndexBuffer.m_Data.size()); - - retval->m_Subsets.m_Size = temp->m_Subsets.m_Size; - retval->m_Subsets.m_Offset = (QT3DSU32)(subsetBufferData - baseOffset); - QT3DSIMP_FOREACH(idx, temp->m_Subsets.size()) - { - MeshSubset &dest = const_cast<MeshSubset &>(retval->m_Subsets.index(baseOffset, idx)); - const typename TPreviousMeshType::TSubsetType &src = - temp->m_Subsets.index(tempBaseAddress, idx); - dest.m_Count = src.m_Count; - dest.m_Offset = src.m_Offset; - dest.m_Bounds = src.m_Bounds; - SubsetNameHandler<TPreviousMeshType>().AssignName(tempBaseAddress, src, baseOffset, - nameData, dest); - } - alloc.deallocate(temp); - return retval; -} - -Mesh *Mesh::Load(NVAllocatorCallback &alloc, IInStream &inStream) -{ - MeshDataHeader header; - inStream.Read(header); - QT3DS_ASSERT(header.m_FileId == MeshDataHeader::GetFileId()); - if (header.m_FileId != MeshDataHeader::GetFileId()) - return NULL; - if (header.m_FileVersion < 1 || header.m_FileVersion > MeshDataHeader::GetCurrentFileVersion()) - return NULL; - if (header.m_SizeInBytes < sizeof(Mesh)) - return NULL; - QT3DSU8 *newMem = (QT3DSU8 *)alloc.allocate(header.m_SizeInBytes, "Mesh", __FILE__, __LINE__); - QT3DSU32 amountRead = inStream.Read(NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes)); - if (amountRead != header.m_SizeInBytes) - goto failure; - - if (header.m_FileVersion == 1) { - MeshV1 *temp = DoInitialize<MeshV1>(header.m_HeaderFlags, - NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes)); - if (temp == NULL) - goto failure; - return CreateMeshFromPreviousMesh(temp, alloc); - - } else if (header.m_FileVersion == 2) { - MeshV2 *temp = DoInitialize<MeshV2>(header.m_HeaderFlags, - NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes)); - if (temp == NULL) - goto failure; - return CreateMeshFromPreviousMesh(temp, alloc); - } else { - Mesh *retval = Initialize(header.m_FileVersion, header.m_HeaderFlags, - NVDataRef<QT3DSU8>(newMem, header.m_SizeInBytes)); - if (retval == NULL) - goto failure; - return retval; - } - -failure: - QT3DS_ASSERT(false); - alloc.deallocate(newMem); - return NULL; -} - -Mesh *Mesh::Initialize(QT3DSU16 meshVersion, MeshBufHeaderFlags meshFlags, NVDataRef<QT3DSU8> data) -{ - if (meshVersion != MeshDataHeader::GetCurrentFileVersion()) - return NULL; - return DoInitialize<Mesh>(meshFlags, data); -} - -// Multimesh support where you have multiple meshes in a single file. -// Save multi where you have overridden the allocator. -QT3DSU32 Mesh::SaveMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream, QT3DSU32 inId) const -{ - QT3DSU32 nextId = 1; - MeshMultiHeader tempHeader; - MeshMultiHeader *theHeader = NULL; - MeshMultiHeader *theWriteHeader = NULL; - - QT3DSI64 newMeshStartPos = 0; - if (inStream.GetLength() != 0) { - theHeader = LoadMultiHeader(alloc, inStream); - if (theHeader == NULL) { - QT3DS_ASSERT(false); - return 0; - } - QT3DSU8 *headerBaseAddr = reinterpret_cast<QT3DSU8 *>(theHeader); - for (QT3DSU32 idx = 0, end = theHeader->m_Entries.size(); idx < end; ++idx) { - if (inId != 0) { - QT3DS_ASSERT(inId != theHeader->m_Entries.index(headerBaseAddr, idx).m_MeshId); - } - nextId = qMax(nextId, theHeader->m_Entries.index(headerBaseAddr, idx).m_MeshId + 1); - } - newMeshStartPos = - sizeof(MeshMultiHeader) + theHeader->m_Entries.size() * sizeof(MeshMultiEntry); - theWriteHeader = theHeader; - } else - theWriteHeader = &tempHeader; - - inStream.SetPosition(-newMeshStartPos, SeekPosition::End); - QT3DSI64 meshOffset = inStream.GetPosition(); - - Save(inStream); - - if (inId != 0) - nextId = inId; - QT3DSU8 *theWriteBaseAddr = reinterpret_cast<QT3DSU8 *>(theWriteHeader); - // Now write a new header out. - inStream.Write(theWriteHeader->m_Entries.begin(theWriteBaseAddr), - theWriteHeader->m_Entries.size()); - MeshMultiEntry newEntry(static_cast<QT3DSI64>(meshOffset), nextId); - inStream.Write(newEntry); - theWriteHeader->m_Entries.m_Size++; - inStream.Write(*theWriteHeader); - - if (theHeader != NULL) { - alloc.deallocate(theHeader); - } - return static_cast<QT3DSU32>(nextId); -} - -// Load a single mesh directly from a multi file with the provided overridden items -SMultiLoadResult Mesh::LoadMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream, - QT3DSU32 inId) -{ - MeshMultiHeader *theHeader(LoadMultiHeader(alloc, inStream)); - if (theHeader == NULL) { - return SMultiLoadResult(); - } - QT3DSU64 fileOffset = (QT3DSU64)-1; - QT3DSU32 theId = inId; - QT3DSU8 *theHeaderBaseAddr = reinterpret_cast<QT3DSU8 *>(theHeader); - bool foundMesh = false; - for (QT3DSU32 idx = 0, end = theHeader->m_Entries.size(); idx < end && !foundMesh; ++idx) { - const MeshMultiEntry &theEntry(theHeader->m_Entries.index(theHeaderBaseAddr, idx)); - if (theEntry.m_MeshId == inId || (inId == 0 && theEntry.m_MeshId > theId)) { - if (theEntry.m_MeshId == inId) - foundMesh = true; - theId = qMax(theId, (QT3DSU32)theEntry.m_MeshId); - fileOffset = theEntry.m_MeshOffset; - } - } - Mesh *retval = NULL; - if (fileOffset == (QT3DSU64)-1) { - goto endFunction; - } - - inStream.SetPosition(static_cast<QT3DSI64>(fileOffset), SeekPosition::Begin); - retval = Load(alloc, inStream); -endFunction: - if (theHeader != NULL) - alloc.deallocate(theHeader); - return SMultiLoadResult(retval, theId); -} - -// Returns true if this is a multimesh (several meshes in one file). -bool Mesh::IsMulti(ISeekableIOStream &inStream) -{ - MeshMultiHeader theHeader; - inStream.SetPosition(-((QT3DSI64)(sizeof(MeshMultiHeader))), SeekPosition::End); - QT3DSU32 numBytes = inStream.Read(theHeader); - if (numBytes != sizeof(MeshMultiHeader)) - return false; - return theHeader.m_Version == MeshMultiHeader::GetMultiStaticFileId(); -} -// Load a multi header from a stream. -MeshMultiHeader *Mesh::LoadMultiHeader(NVAllocatorCallback &alloc, ISeekableIOStream &inStream) -{ - MeshMultiHeader theHeader; - inStream.SetPosition(-((QT3DSI64)sizeof(MeshMultiHeader)), SeekPosition::End); - QT3DSU32 numBytes = inStream.Read(theHeader); - if (numBytes != sizeof(MeshMultiHeader) - || theHeader.m_FileId != MeshMultiHeader::GetMultiStaticFileId() - || theHeader.m_Version > MeshMultiHeader::GetMultiStaticVersion()) { - return NULL; - } - size_t allocSize = - sizeof(MeshMultiHeader) + theHeader.m_Entries.m_Size * sizeof(MeshMultiEntry); - MeshMultiHeader *retval = - (MeshMultiHeader *)alloc.allocate(allocSize, "MeshMultiHeader", __FILE__, __LINE__); - if (retval == NULL) { - QT3DS_ASSERT(false); - return NULL; - } - QT3DSU8 *baseAddr = reinterpret_cast<QT3DSU8 *>(retval); - QT3DSU8 *entryData = baseAddr + sizeof(MeshMultiHeader); - *retval = theHeader; - retval->m_Entries.m_Offset = (QT3DSU32)(entryData - baseAddr); - inStream.SetPosition(-((QT3DSI64)allocSize), SeekPosition::End); - - numBytes = - inStream.Read(reinterpret_cast<MeshMultiEntry *>(entryData), retval->m_Entries.m_Size); - if (numBytes != retval->m_Entries.m_Size * sizeof(MeshMultiEntry)) { - QT3DS_ASSERT(false); - alloc.deallocate(retval); - retval = NULL; - } - return retval; -} - -QT3DSU32 GetHighestId(NVAllocatorCallback &inAlloc, MeshMultiHeader *inHeader) -{ - if (inHeader == NULL) { - QT3DS_ASSERT(false); - return 0; - } - QT3DSU8 *baseHeaderAddr = reinterpret_cast<QT3DSU8 *>(inHeader); - QT3DSU32 highestId = 0; - for (QT3DSU32 idx = 0, end = inHeader->m_Entries.size(); idx < end; ++idx) - highestId = qMax(highestId, inHeader->m_Entries.index(baseHeaderAddr, idx).m_MeshId); - inAlloc.deallocate(inHeader); - return highestId; -} - -QT3DSU32 Mesh::GetHighestMultiVersion(NVAllocatorCallback &alloc, ISeekableIOStream &inStream) -{ - return GetHighestId(alloc, LoadMultiHeader(alloc, inStream)); -} diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.h b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.h deleted file mode 100644 index 36b7a841..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMesh.h +++ /dev/null @@ -1,530 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DS_IMPORT_MESH_H -#define QT3DS_IMPORT_MESH_H -#include "foundation/Qt3DS.h" -#include "foundation/Qt3DSDataRef.h" -#include "render/Qt3DSRenderBaseTypes.h" -#include "foundation/Qt3DSBounds3.h" -#include "foundation/Qt3DSAllocatorCallback.h" -#include "foundation/IOStreams.h" - -namespace qt3dsimp { -using namespace qt3ds; -using namespace qt3ds::foundation; -using namespace qt3ds::render; -template <typename TDataType> -struct SOffsetDataRef -{ - QT3DSU32 m_Offset; - QT3DSU32 m_Size; - SOffsetDataRef() - : m_Offset(0) - , m_Size(0) - { - } - TDataType *begin(QT3DSU8 *inBase) { return reinterpret_cast<TDataType *>(inBase + m_Offset); } - TDataType *end(QT3DSU8 *inBase) { return begin(inBase) + m_Size; } - const TDataType *begin(const QT3DSU8 *inBase) const - { - return reinterpret_cast<const TDataType *>(inBase + m_Offset); - } - const TDataType *end(const QT3DSU8 *inBase) const { return begin(inBase) + m_Size; } - QT3DSU32 size() const { return m_Size; } - bool empty() const { return m_Size == 0; } - TDataType &index(QT3DSU8 *inBase, QT3DSU32 idx) - { - QT3DS_ASSERT(idx < m_Size); - return begin(inBase)[idx]; - } - const TDataType &index(const QT3DSU8 *inBase, QT3DSU32 idx) const - { - QT3DS_ASSERT(idx < m_Size); - return begin(inBase)[idx]; - } -}; - -struct MeshVertexBufferEntry -{ - QT3DSU32 m_NameOffset; - /** Datatype of the this entry points to in the buffer */ - NVRenderComponentTypes::Enum m_ComponentType; - /** Number of components of each data member. 1,2,3, or 4. Don't be stupid.*/ - QT3DSU32 m_NumComponents; - /** Offset from the beginning of the buffer of the first item */ - QT3DSU32 m_FirstItemOffset; - MeshVertexBufferEntry() - : m_NameOffset(0) - , m_ComponentType(NVRenderComponentTypes::QT3DSF32) - , m_NumComponents(3) - , m_FirstItemOffset(0) - { - } - NVRenderVertexBufferEntry ToVertexBufferEntry(QT3DSU8 *inBaseAddress) - { - const char *nameBuffer = ""; - if (m_NameOffset) - nameBuffer = reinterpret_cast<const char *>(inBaseAddress + m_NameOffset); - return NVRenderVertexBufferEntry(nameBuffer, m_ComponentType, m_NumComponents, - m_FirstItemOffset); - } -}; - -struct VertexBuffer -{ - SOffsetDataRef<MeshVertexBufferEntry> m_Entries; - QT3DSU32 m_Stride; - SOffsetDataRef<QT3DSU8> m_Data; - VertexBuffer(SOffsetDataRef<MeshVertexBufferEntry> entries, QT3DSU32 stride, - SOffsetDataRef<QT3DSU8> data) - : m_Entries(entries) - , m_Stride(stride) - , m_Data(data) - { - } - VertexBuffer() - : m_Stride(0) - { - } -}; - -struct IndexBuffer -{ - // Component types must be either QT3DSU16 or QT3DSU8 in order for the - // graphics hardware to deal with the buffer correctly. - NVRenderComponentTypes::Enum m_ComponentType; - SOffsetDataRef<QT3DSU8> m_Data; - // Either QT3DSU8 or QT3DSU16 component types are allowed by the underlying rendering - // system, so you would be wise to stick with those. - IndexBuffer(NVRenderComponentTypes::Enum compType, SOffsetDataRef<QT3DSU8> data) - : m_ComponentType(compType) - , m_Data(data) - { - } - IndexBuffer() - : m_ComponentType(NVRenderComponentTypes::Unknown) - { - } -}; - -template <QT3DSU32 TNumBytes> -struct MeshPadding -{ - QT3DSU8 m_Padding[TNumBytes]; - MeshPadding() { memZero(m_Padding, TNumBytes); } -}; - -struct MeshSubset -{ - // QT3DS_MAX_U32 means use all available items - QT3DSU32 m_Count; - // Offset is in item size, not bytes. - QT3DSU32 m_Offset; - // Bounds of this subset. This is filled in by the builder - // see AddMeshSubset - NVBounds3 m_Bounds; - - // Subsets have to be named else artists will be unable to use - // a mesh with multiple subsets as they won't have any idea - // while part of the model a given mesh actually maps to. - SOffsetDataRef<char16_t> m_Name; - - MeshSubset(QT3DSU32 count, QT3DSU32 off, const NVBounds3 &bounds, SOffsetDataRef<char16_t> inName) - : m_Count(count) - , m_Offset(off) - , m_Bounds(bounds) - , m_Name(inName) - { - } - MeshSubset() - : m_Count((QT3DSU32)-1) - , m_Offset(0) - , m_Bounds(NVBounds3::empty()) - { - } - bool HasCount() const { return m_Count != QT3DS_MAX_U32; } -}; - -// Placeholder for bitflags in the mesh header. -struct MeshBufHeaderFlagValues -{ - enum Enum {}; -}; - -struct MeshBufHeaderFlags : NVFlags<MeshBufHeaderFlagValues::Enum, QT3DSU16> -{ - MeshBufHeaderFlags() {} - MeshBufHeaderFlags(QT3DSU16 value) - : NVFlags<MeshBufHeaderFlagValues::Enum, QT3DSU16>(value) - { - } - // Binary or creates an integer. - MeshBufHeaderFlags(int value) - : NVFlags<MeshBufHeaderFlagValues::Enum, QT3DSU16>((QT3DSU16)value) - { - } -}; - -struct MeshDataHeader -{ - static QT3DSU32 GetFileId() { return (QT3DSU32)-929005747; } - static QT3DSU16 GetCurrentFileVersion() { return 3; } - QT3DSU32 m_FileId; - QT3DSU16 m_FileVersion; - MeshBufHeaderFlags m_HeaderFlags; - QT3DSU32 m_SizeInBytes; - MeshDataHeader(QT3DSU32 size = 0) - : m_FileId(GetFileId()) - , m_FileVersion(GetCurrentFileVersion()) - , m_SizeInBytes(size) - { - } -}; - -struct Joint -{ - QT3DSI32 m_JointID; - QT3DSI32 m_ParentID; - QT3DSF32 m_invBindPose[16]; - QT3DSF32 m_localToGlobalBoneSpace[16]; - - Joint(QT3DSI32 jointID, QT3DSI32 parentID, const QT3DSF32 *invBindPose, - const QT3DSF32 *localToGlobalBoneSpace) - : m_JointID(jointID) - , m_ParentID(parentID) - { - ::memcpy(m_invBindPose, invBindPose, sizeof(float) * 16); - ::memcpy(m_localToGlobalBoneSpace, localToGlobalBoneSpace, sizeof(float) * 16); - } - Joint() - : m_JointID(-1) - , m_ParentID(-1) - { - ::memset(m_invBindPose, 0, sizeof(float) * 16); - ::memset(m_localToGlobalBoneSpace, 0, sizeof(float) * 16); - } -}; - -// Tells us what offset a mesh with this ID starts. -struct MeshMultiEntry -{ - QT3DSU64 m_MeshOffset; - QT3DSU32 m_MeshId; - QT3DSU32 m_Padding; - MeshMultiEntry() - : m_MeshOffset(0) - , m_MeshId(0) - , m_Padding(0) - { - } - MeshMultiEntry(QT3DSU64 mo, QT3DSU32 meshId) - : m_MeshOffset(mo) - , m_MeshId(meshId) - , m_Padding(0) - { - } -}; - -// The multi headers are actually saved at the end of the file. -// Thus when you append to the file we overwrite the last header -// then write out a new header structure. -// The last 8 bytes of the file contain the multi header. -// The previous N*8 bytes contain the mesh entries. -struct MeshMultiHeader -{ - QT3DSU32 m_FileId; - QT3DSU32 m_Version; - SOffsetDataRef<MeshMultiEntry> m_Entries; - static QT3DSU32 GetMultiStaticFileId() { return (QT3DSU32)555777497; } - static QT3DSU32 GetMultiStaticVersion() { return 1; } - - MeshMultiHeader() - : m_FileId(GetMultiStaticFileId()) - , m_Version(GetMultiStaticVersion()) - { - } -}; - -struct Mesh; - -// Result of a multi-load operation. This returns both the mesh -// and the id of the mesh that was loaded. -struct SMultiLoadResult -{ - Mesh *m_Mesh; - QT3DSU32 m_Id; - SMultiLoadResult(Mesh *inMesh, QT3DSU32 inId) - : m_Mesh(inMesh) - , m_Id(inId) - { - } - SMultiLoadResult() - : m_Mesh(NULL) - , m_Id(0) - { - } - operator Mesh *() { return m_Mesh; } -}; - -/** -* A Mesh defines one vertex buffer layout, one or more logical vertex buffers -* one index buffer, and a set of defined draw calls (subsets). -* -* The vertex buffer data is held together continguously and the layout cannot -* change. There can be several actual vertex buffers on the card, however, in order -* to facilitate using index buffer components of smaller component sizes than there -* are actual vertex buffer data entries. For instance, you may have a very large vertex -* buffer, larger than 64 K but openglES has a restriction on the size of the index buffer -*component -* that it cannot be larger than two bytes per entry. So you would need to split the vertex -*buffer -* into multiple logical vertex buffers and adjust your indexes such that you indexed into -* only one logical vertex buffer per draw call. -* -* No logical vertex buffers means that the vertex buffer index on a mesh subset will be -*ignored. -*/ -struct Mesh -{ - static const wchar_t *s_DefaultName; - - VertexBuffer m_VertexBuffer; - IndexBuffer m_IndexBuffer; - SOffsetDataRef<MeshSubset> m_Subsets; - SOffsetDataRef<Joint> m_Joints; - NVRenderDrawMode::Enum m_DrawMode; - NVRenderWinding::Enum m_Winding; - - Mesh() - : m_DrawMode(NVRenderDrawMode::Triangles) - , m_Winding(NVRenderWinding::CounterClockwise) - { - } - Mesh(VertexBuffer vbuf, IndexBuffer ibuf, const SOffsetDataRef<MeshSubset> &insts, - const SOffsetDataRef<Joint> &joints, - NVRenderDrawMode::Enum drawMode = NVRenderDrawMode::Triangles, - NVRenderWinding::Enum winding = NVRenderWinding::CounterClockwise) - : m_VertexBuffer(vbuf) - , m_IndexBuffer(ibuf) - , m_Subsets(insts) - , m_Joints(joints) - , m_DrawMode(drawMode) - , m_Winding(winding) - { - } - - QT3DSU8 *GetBaseAddress() { return reinterpret_cast<QT3DSU8 *>(this); } - const QT3DSU8 *GetBaseAddress() const { return reinterpret_cast<const QT3DSU8 *>(this); } - - static const char *GetPositionAttrName() { return "attr_pos"; } - static const char *GetNormalAttrName() { return "attr_norm"; } - static const char *GetUVAttrName() { return "attr_uv0"; } - static const char *GetUV2AttrName() { return "attr_uv1"; } - static const char *GetTexTanAttrName() { return "attr_textan"; } - static const char *GetTexBinormalAttrName() { return "attr_binormal"; } - static const char *GetWeightAttrName() { return "attr_weight"; } - static const char *GetBoneIndexAttrName() { return "attr_boneid"; } - static const char *GetColorAttrName() { return "attr_color"; } - - // Run through the vertex buffer items indicated by subset - // Assume vbuf entry[posEntryIndex] is the position entry - // This entry has to be QT3DSF32 and 3 components. - // Using this entry and the (possibly empty) index buffer - // along with the (possibly emtpy) logical vbuf data - // return a bounds of the given vertex buffer. - static NVBounds3 CalculateSubsetBounds(const NVRenderVertexBufferEntry &inEntry, - NVConstDataRef<QT3DSU8> inVertxData, QT3DSU32 inStride, - NVConstDataRef<QT3DSU8> inIndexData, - qt3ds::render::NVRenderComponentTypes::Enum inIndexCompType, - QT3DSU32 inSubsetCount, QT3DSU32 inSubsetOffset); - - // Format is: - // MeshDataHeader - // mesh data. - void Save(IOutStream &outStream) const; - - // Save a mesh using fopen and fwrite - bool Save(const char *inFilePath) const; - - // read the header, then read the object. - // Object data is written in LE format for now. - // Free the new mesh by calling: - // alloc.deallocate( mesh ); - // All the memory is allocated once and then pointers are back - // filled, so this will work. - static Mesh *Load(NVAllocatorCallback &alloc, IInStream &inStream); - - // Load a mesh using fopen and fread - // Mesh needs to be freed by the caller using free - static Mesh *Load(const char *inFilePath); - - // Create a mesh given this header, and that data. data.size() must match - // header.SizeInBytes. The mesh returned starts a data[0], so however data - // was allocated is how the mesh should be deallocated. - static Mesh *Initialize(QT3DSU16 meshVersion, MeshBufHeaderFlags meshFlags, NVDataRef<QT3DSU8> data); - - // Multimesh support where you have multiple meshes in a single file. - // Save multi where you have overridden the allocator. - QT3DSU32 SaveMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream, QT3DSU32 inId = 0) const; - // You can save multiple meshes in a file. Each mesh returns an incrementing - // integer for the multi file. The original meshes aren't changed, and the file - // is appended to. - QT3DSU32 SaveMulti(const char *inFilePath) const; - - // Load a single mesh directly from a multi file with the provided overridden items - // Loading a multimesh with id == 0 indicates to just load the mesh with the highest id. - static SMultiLoadResult LoadMulti(NVAllocatorCallback &alloc, ISeekableIOStream &inStream, - QT3DSU32 inId = 0); - // Load a single mesh using c file API and malloc/free. - static SMultiLoadResult LoadMulti(const char *inFilePath, QT3DSU32 inId); - // Returns true if this is a multimesh (several meshes in one file). - static bool IsMulti(ISeekableIOStream &inStream); - // Load a multi header from a stream. - static MeshMultiHeader *LoadMultiHeader(NVAllocatorCallback &alloc, - ISeekableIOStream &inStream); - // Load a multi header from a file using malloc. Header needs to be freed using free. - static MeshMultiHeader *LoadMultiHeader(const char *inFilePath); - - // Get the highest mesh version from a stream. - static QT3DSU32 GetHighestMultiVersion(NVAllocatorCallback &alloc, ISeekableIOStream &inStream); - // Get the highest mesh version from a file. - static QT3DSU32 GetHighestMultiVersion(const char *inFilePath); -}; - -struct ScopedMesh -{ - Mesh *m_Mesh; - NVAllocatorCallback *m_Callback; - ScopedMesh(Mesh *m, NVAllocatorCallback *cback = NULL) - : m_Mesh(m) - , m_Callback(cback) - { - } - ~ScopedMesh() - { - if (m_Mesh) { - if (m_Callback) - m_Callback->deallocate(m_Mesh); - else - free(m_Mesh); - } - } - Mesh *operator->() { return m_Mesh; } - operator Mesh *() { return m_Mesh; } -}; - -struct MeshBuilderVBufEntry -{ - const char *m_Name; - NVConstDataRef<QT3DSU8> m_Data; - NVRenderComponentTypes::Enum m_ComponentType; - QT3DSU32 m_NumComponents; - MeshBuilderVBufEntry() - : m_Name(NULL) - , m_ComponentType(NVRenderComponentTypes::Unknown) - , m_NumComponents(0) - { - } - MeshBuilderVBufEntry(const char *name, NVConstDataRef<QT3DSU8> data, - NVRenderComponentTypes::Enum componentType, QT3DSU32 numComponents) - : m_Name(name) - , m_Data(data) - , m_ComponentType(componentType) - , m_NumComponents(numComponents) - { - } -}; - -// Useful class to build up a mesh. Necessary since meshes don't include that -// sort of utility. -class MeshBuilder -{ -protected: - virtual ~MeshBuilder() {} -public: - virtual void Release() = 0; - virtual void Reset() = 0; - // Set the draw parameters for any subsets. Defaults to triangles and counter clockwise - virtual void SetDrawParameters(NVRenderDrawMode::Enum drawMode, - NVRenderWinding::Enum winding) = 0; - // Set the vertex buffer and have the mesh builder interleave the data for you - virtual bool SetVertexBuffer(NVConstDataRef<MeshBuilderVBufEntry> entries) = 0; - // Set the vertex buffer from interleaved data. - virtual void SetVertexBuffer(NVConstDataRef<NVRenderVertexBufferEntry> entries, QT3DSU32 stride, - NVConstDataRef<QT3DSU8> data) = 0; - // The builder (and the majority of the rest of the product) only supports unsigned 16 bit - // indexes - virtual void SetIndexBuffer(NVConstDataRef<QT3DSU8> data, NVRenderComponentTypes::Enum comp) = 0; - // Assets if the supplied parameters are out of range. - virtual void AddJoint(QT3DSI32 jointID, QT3DSI32 parentID, const QT3DSF32 *invBindPose, - const QT3DSF32 *localToGlobalBoneSpace) = 0; - /** - * Add a subset, which equates roughly to a draw call. - * A logical vertex buffer allows you to have more that 64K vertexes but still - * use u16 index buffers. In any case, if the mesh has an index buffer then this subset - * refers to that index buffer, else it is assumed to index into the vertex buffer. - * count and offset do exactly what they seem to do, while boundsPositionEntryIndex, if set to - * something other than QT3DS_MAX_U32, drives the calculation of the aa-bounds of the subset - * using mesh::CalculateSubsetBounds - */ - virtual void AddMeshSubset(const wchar_t *inSubsetName = Mesh::s_DefaultName, - QT3DSU32 count = QT3DS_MAX_U32, QT3DSU32 offset = 0, - QT3DSU32 boundsPositionEntryIndex = QT3DS_MAX_U32) = 0; - - virtual void AddMeshSubset(const wchar_t *inSubsetName, QT3DSU32 count, QT3DSU32 offset, - const NVBounds3 &inBounds) = 0; - - // Call to optimize the index and vertex buffers. This doesn't change the subset information, - // each triangle is rendered precisely the same. - // It just orders the vertex data so we iterate through it as linearly as possible. - // This *only* works if the *entire* builder is using triangles as the draw mode. This will be - // a disaster if that - // condition is not met. - virtual void OptimizeMesh() = 0; - - /** - * @brief This functions stitches together sub-meshes with the same material. - * This re-writes the index buffer - * - * @return no return. - */ - virtual void ConnectSubMeshes() = 0; - - // Return the current mesh. This is only good for this function call, item may change or be - // released - // due to any further function calls. - virtual Mesh &GetMesh() = 0; - - // Uses new/delete. - static MeshBuilder &CreateMeshBuilder(); -}; -} - -#endif diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMeshBuilder.cpp b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMeshBuilder.cpp deleted file mode 100644 index e8c6d92e..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportMeshBuilder.cpp +++ /dev/null @@ -1,598 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSImportLibPrecompile.h" -#include "Qt3DSImportMesh.h" -#include "foundation/Qt3DSMemoryBuffer.h" -#include "Qt3DSImportContainers.h" - -using namespace qt3dsimp; - -// Disable mesh optimization. TODO: After removing NvTriStrip need -// to implement mesh optimization. -//#define DISABLE_MESH_OPTIMIZATION 1 - -// It turns out we can't enable vertex remapping because it would break -// mesh morphing. -#define DISABLE_VERTEX_REMAP 1 - -namespace { -template <typename TDataType> -NVConstDataRef<TDataType> toRefBuf(QT3DSU8 *bufData, QT3DSU32 off, QT3DSU32 size) -{ - QT3DS_ASSERT(size % sizeof(TDataType) == 0); - if (size) - return NVConstDataRef<TDataType>((TDataType *)(bufData + off), size / sizeof(TDataType)); - return NVConstDataRef<TDataType>(); -} -struct DynamicVBuf -{ - QT3DSU32 m_Stride; - ImportArray<NVRenderVertexBufferEntry> m_VertexBufferEntries; - MemoryBuffer<RawAllocator> m_VertexData; - - void clear() - { - m_Stride = 0; - m_VertexBufferEntries.clear(); - m_VertexData.clear(); - } -}; -struct DynamicIndexBuf -{ - NVRenderComponentTypes::Enum m_CompType; - MemoryBuffer<RawAllocator> m_IndexData; - DynamicIndexBuf() {} - - void clear() { m_IndexData.clear(); } -}; - -struct SubsetDesc -{ - QT3DSU32 m_Count; - QT3DSU32 m_Offset; - - NVBounds3 m_Bounds; - QString m_Name; - SubsetDesc(QT3DSU32 c, QT3DSU32 off) - : m_Count(c) - , m_Offset(off) - { - } - SubsetDesc() - : m_Count(0) - , m_Offset(0) - { - } -}; - -QT3DSU32 GetAlignedOffset(QT3DSU32 offset, QT3DSU32 align) -{ - QT3DSU32 leftover = offset % align; - if (leftover) - return offset + (align - leftover); - return offset; -} - -class MeshBuilderImpl : public MeshBuilder -{ - DynamicVBuf m_VertexBuffer; - DynamicIndexBuf m_IndexBuffer; - ImportArray<Joint> m_Joints; - ImportArray<SubsetDesc> m_MeshSubsetDescs; - NVRenderDrawMode::Enum m_DrawMode; - NVRenderWinding::Enum m_Winding; - MemoryBuffer<RawAllocator> m_RemappedVertexData; - MemoryBuffer<RawAllocator> m_NewIndexBuffer; - ImportArray<QT3DSU8> m_MeshBuffer; - -public: - MeshBuilderImpl() { Reset(); } - virtual ~MeshBuilderImpl() { Reset(); } - void Release() override { delete this; } - void Reset() override - { - m_VertexBuffer.clear(); - m_IndexBuffer.clear(); - m_Joints.clear(); - m_MeshSubsetDescs.clear(); - m_DrawMode = NVRenderDrawMode::Triangles; - m_Winding = NVRenderWinding::CounterClockwise; - m_MeshBuffer.clear(); - } - - void SetDrawParameters(NVRenderDrawMode::Enum drawMode, NVRenderWinding::Enum winding) override - { - m_DrawMode = drawMode; - m_Winding = winding; - } - - // Somewhat burly method to interleave the data as tightly as possible - // while taking alignment into account. - bool SetVertexBuffer(NVConstDataRef<MeshBuilderVBufEntry> entries) override - { - QT3DSU32 currentOffset = 0; - QT3DSU32 bufferAlignment = 0; - QT3DSU32 numItems = 0; - bool retval = true; - QT3DSIMP_FOREACH(idx, entries.size()) - { - const MeshBuilderVBufEntry &entry(entries[idx]); - // Ignore entries with no data. - if (entry.m_Data.begin() == NULL || entry.m_Data.size() == 0) - continue; - - QT3DSU32 alignment = NVRenderComponentTypes::getSizeofType(entry.m_ComponentType); - bufferAlignment = qMax(bufferAlignment, alignment); - QT3DSU32 byteSize = alignment * entry.m_NumComponents; - - if (entry.m_Data.size() % alignment != 0) { - QT3DS_ASSERT(false); - retval = false; - } - - QT3DSU32 localNumItems = entry.m_Data.size() / byteSize; - if (numItems == 0) { - numItems = localNumItems; - } else if (numItems != localNumItems) { - QT3DS_ASSERT(false); - retval = false; - numItems = qMin(numItems, localNumItems); - } - // Lots of platforms can't handle non-aligned data. - // so ensure we are aligned. - currentOffset = GetAlignedOffset(currentOffset, alignment); - NVRenderVertexBufferEntry vbufEntry(entry.m_Name, entry.m_ComponentType, - entry.m_NumComponents, currentOffset); - m_VertexBuffer.m_VertexBufferEntries.push_back(vbufEntry); - currentOffset += byteSize; - } - m_VertexBuffer.m_Stride = GetAlignedOffset(currentOffset, bufferAlignment); - - // Packed interleave the data - QT3DSIMP_FOREACH(idx, numItems) - { - QT3DSU32 dataOffset = 0; - QT3DSIMP_FOREACH(entryIdx, entries.size()) - { - const MeshBuilderVBufEntry &entry(entries[entryIdx]); - // Ignore entries with no data. - if (entry.m_Data.begin() == NULL || entry.m_Data.size() == 0) - continue; - - QT3DSU32 alignment = NVRenderComponentTypes::getSizeofType(entry.m_ComponentType); - QT3DSU32 byteSize = alignment * entry.m_NumComponents; - QT3DSU32 offset = byteSize * idx; - QT3DSU32 newOffset = GetAlignedOffset(dataOffset, alignment); - if (newOffset != dataOffset) - m_VertexBuffer.m_VertexData.writeZeros(newOffset - dataOffset); - m_VertexBuffer.m_VertexData.write(entry.m_Data.begin() + offset, byteSize); - dataOffset = newOffset + byteSize; - } - QT3DS_ASSERT(dataOffset == m_VertexBuffer.m_Stride); - } - return retval; - } - - void SetVertexBuffer(NVConstDataRef<NVRenderVertexBufferEntry> entries, QT3DSU32 stride, - NVConstDataRef<QT3DSU8> data) override - { - QT3DSIMP_FOREACH(idx, (QT3DSU32)entries.size()) - { - m_VertexBuffer.m_VertexBufferEntries.push_back(entries[idx]); - } - m_VertexBuffer.m_VertexData.write(data.begin(), data.size()); - if (stride == 0) { - // Calculate the stride of the buffer using the vbuf entries - QT3DSIMP_FOREACH(idx, entries.size()) - { - const NVRenderVertexBufferEntry &entry(entries[idx]); - stride = qMax(stride, entry.m_FirstItemOffset - + (entry.m_NumComponents * NVRenderComponentTypes::getSizeofType( - entry.m_ComponentType))); - } - } - m_VertexBuffer.m_Stride = stride; - } - - void SetIndexBuffer(NVConstDataRef<QT3DSU8> data, NVRenderComponentTypes::Enum comp) override - { - m_IndexBuffer.m_CompType = comp; - m_IndexBuffer.m_IndexData.write(data.begin(), data.size()); - } - - void AddJoint(QT3DSI32 jointID, QT3DSI32 parentID, const QT3DSF32 *invBindPose, - const QT3DSF32 *localToGlobalBoneSpace) override - { - m_Joints.push_back(Joint(jointID, parentID, invBindPose, localToGlobalBoneSpace)); - } - - SubsetDesc CreateSubset(const wchar_t *inName, QT3DSU32 count, QT3DSU32 offset) - { - if (inName == NULL) - inName = L""; - SubsetDesc retval(count, offset); - retval.m_Name = QString::fromWCharArray(inName); - return retval; - } - - // indexBuffer QT3DS_MAX_U32 means no index buffer. - // count of QT3DS_MAX_U32 means use all available items - // offset means exactly what you would think. Offset is in item size, not bytes. - void AddMeshSubset(const wchar_t *inName, QT3DSU32 count, QT3DSU32 offset, - QT3DSU32 boundsPositionEntryIndex) override - { - SubsetDesc retval = CreateSubset(inName, count, offset); - if (boundsPositionEntryIndex != QT3DS_MAX_U32) { - retval.m_Bounds = Mesh::CalculateSubsetBounds( - m_VertexBuffer.m_VertexBufferEntries[boundsPositionEntryIndex], - m_VertexBuffer.m_VertexData, m_VertexBuffer.m_Stride, m_IndexBuffer.m_IndexData, - m_IndexBuffer.m_CompType, count, offset); - } - m_MeshSubsetDescs.push_back(retval); - } - - void AddMeshSubset(const wchar_t *inName, QT3DSU32 count, QT3DSU32 offset, - const NVBounds3 &inBounds) override - { - SubsetDesc retval = CreateSubset(inName, count, offset); - retval.m_Bounds = inBounds; - m_MeshSubsetDescs.push_back(retval); - } -#ifndef DISABLE_MESH_OPTIMIZATION - void DeletePrimitiveGroup(PrimitiveGroup *&inGroup) - { - if (inGroup) - delete[] inGroup; - inGroup = NULL; - } -#endif - // We connect sub meshes which habe the same material - void ConnectSubMeshes() override - { - if (m_MeshSubsetDescs.size() < 2) { - // nothing to do - return; - } - - QT3DSU32 matDuplicates = 0; - - // as a pre-step we check if we have duplicate material at all - for (QT3DSU32 i = 0, subsetEnd = m_MeshSubsetDescs.size(); i < subsetEnd && !matDuplicates; - ++i) { - SubsetDesc ¤tSubset = m_MeshSubsetDescs[i]; - - for (QT3DSU32 j = 0, subsetEnd = m_MeshSubsetDescs.size(); j < subsetEnd; ++j) { - SubsetDesc &theSubset = m_MeshSubsetDescs[j]; - - if (i == j) - continue; - - if (currentSubset.m_Name == theSubset.m_Name) { - matDuplicates++; - break; // found a duplicate bail out - } - } - } - - // did we find some duplicates? - if (matDuplicates) { - ImportArray<SubsetDesc> newMeshSubsetDescs; - ImportArray<SubsetDesc>::iterator theIter; - QString curMatName; - m_NewIndexBuffer.clear(); - - for (theIter = m_MeshSubsetDescs.begin(); theIter != m_MeshSubsetDescs.end(); - ++theIter) { - bool bProcessed = false; - - for (ImportArray<SubsetDesc>::iterator iter = newMeshSubsetDescs.begin(); - iter != newMeshSubsetDescs.end(); ++iter) { - if (theIter->m_Name == iter->m_Name) { - bProcessed = true; - break; - } - } - - if (bProcessed) - continue; - - curMatName = theIter->m_Name; - - QT3DSU32 theIndexCompSize = - NVRenderComponentTypes::getSizeofType(m_IndexBuffer.m_CompType); - // get pointer to indices - QT3DSU8 *theIndices = - (m_IndexBuffer.m_IndexData.begin()) + (theIter->m_Offset * theIndexCompSize); - // write new offset - theIter->m_Offset = m_NewIndexBuffer.size() / theIndexCompSize; - // store indices - m_NewIndexBuffer.write(theIndices, theIter->m_Count * theIndexCompSize); - - for (QT3DSU32 j = 0, subsetEnd = m_MeshSubsetDescs.size(); j < subsetEnd; ++j) { - if (theIter == &m_MeshSubsetDescs[j]) - continue; - - SubsetDesc &theSubset = m_MeshSubsetDescs[j]; - - if (curMatName == theSubset.m_Name) { - // get pointer to indices - QT3DSU8 *theIndices = (m_IndexBuffer.m_IndexData.begin()) - + (theSubset.m_Offset * theIndexCompSize); - // store indices - m_NewIndexBuffer.write(theIndices, theSubset.m_Count * theIndexCompSize); - // increment indices count - theIter->m_Count += theSubset.m_Count; - } - } - - newMeshSubsetDescs.push_back(*theIter); - } - - m_MeshSubsetDescs.clear(); - m_MeshSubsetDescs = newMeshSubsetDescs; - m_IndexBuffer.m_IndexData.clear(); - m_IndexBuffer.m_IndexData.write(m_NewIndexBuffer.begin(), m_NewIndexBuffer.size()); - - // compute new bounding box - for (theIter = m_MeshSubsetDescs.begin(); theIter != m_MeshSubsetDescs.end(); - ++theIter) { - theIter->m_Bounds = Mesh::CalculateSubsetBounds( - m_VertexBuffer.m_VertexBufferEntries[0], m_VertexBuffer.m_VertexData, - m_VertexBuffer.m_Stride, m_IndexBuffer.m_IndexData, m_IndexBuffer.m_CompType, - theIter->m_Count, theIter->m_Offset); - } - } - } - - // Here is the NVTriStrip magic. - void OptimizeMesh() override - { - if (NVRenderComponentTypes::getSizeofType(m_IndexBuffer.m_CompType) != 2) { - // we currently re-arrange unsigned int indices. - // this is because NvTriStrip only supports short indices - QT3DS_ASSERT(NVRenderComponentTypes::getSizeofType(m_IndexBuffer.m_CompType) == 4); - return; - } -#ifndef DISABLE_MESH_OPTIMIZATION - SetCacheSize(CACHESIZE_GEFORCE3); - SetStitchStrips(true); - SetMinStripSize(0); - // Create the optimized list indices - SetListsOnly(true); - // Optimize the indices using NvTriStrip - - // First, nv-tri-strip all of the indexes. They shouldn't be interleaved, meaning - // there is an assumption here that mesh subset1 doesn't uses indexes from mesh subset 2. - // They may share vertexes, however, which means that we need to be careful when remapping - // them. - // Have to go subset by subset in order for the tri-strip to avoid stepping on subsets. - m_NewIndexBuffer.clear(); - for (QT3DSU32 subsetIdx = 0, subsetEnd = m_MeshSubsetDescs.size(); subsetIdx < subsetEnd; - ++subsetIdx) { - SubsetDesc &theSubset = m_MeshSubsetDescs[subsetIdx]; - QT3DSU16 *theIndices = - reinterpret_cast<QT3DSU16 *>(m_IndexBuffer.m_IndexData.begin()) + theSubset.m_Offset; - QT3DSU32 theIndexCount = theSubset.m_Count; - QT3DSU16 theNumGroups = 0; - PrimitiveGroup *thePrimitiveGroupsList = NULL; - theSubset.m_Offset = m_NewIndexBuffer.size() / sizeof(QT3DSU16); - theSubset.m_Count = 0; - - // We don't support larger vertex buffers. That requires splitting the buffer, - // an operation we haven't implemented (yet). - if (GenerateStrips(theIndices, theIndexCount, &thePrimitiveGroupsList, &theNumGroups)) { - if (theNumGroups) { - QT3DS_ASSERT(theNumGroups == 1); - PrimitiveGroup &srcGroup(thePrimitiveGroupsList[0]); - QT3DS_ASSERT(srcGroup.type == PT_LIST); - m_NewIndexBuffer.write(srcGroup.indices, srcGroup.numIndices); - theSubset.m_Count = srcGroup.numIndices; - } - } - - DeletePrimitiveGroup(thePrimitiveGroupsList); - } - m_IndexBuffer.m_IndexData.clear(); - m_IndexBuffer.m_IndexData.write(m_NewIndexBuffer.begin(), m_NewIndexBuffer.size()); - -#ifndef DISABLE_VERTEX_REMAP - // This operation does not go subset by subset - // by rather remaps the entire vertex buffer in one shot - // once all of the index buffers are setup. - QT3DSU16 *theIndices = reinterpret_cast<QT3DSU16 *>(m_IndexBuffer.m_IndexData.begin()); - QT3DSU32 theIndexCount = m_IndexBuffer.m_IndexData.size() / sizeof(QT3DSU16); - - // Setup input to the remap system - QT3DSU16 theNumGroups = 1; - PrimitiveGroup thePrimitiveGroup; - thePrimitiveGroup.type = PT_LIST; - thePrimitiveGroup.numIndices = theIndexCount; - thePrimitiveGroup.indices = new QT3DSU16[theIndexCount]; - memCopy(thePrimitiveGroup.indices, theIndices, theIndexCount * sizeof(QT3DSU16)); - - PrimitiveGroup *theRemappedGroup = NULL; - QT3DSU32 vertBufByteSize = m_VertexBuffer.m_VertexData.size(); - QT3DSU32 numVertexIndices = vertBufByteSize / m_VertexBuffer.m_Stride; - QT3DS_ASSERT(numVertexIndices < QT3DS_MAX_U16); - QT3DSU32 vertBufStride = m_VertexBuffer.m_Stride; - // This remaps the vertexes - RemapIndices(&thePrimitiveGroup, theNumGroups, static_cast<QT3DSU16>(numVertexIndices), - &theRemappedGroup); - m_RemappedVertexData.reserve(vertBufByteSize); - const QT3DSU8 *srcVertexPtr(m_VertexBuffer.m_VertexData.begin()); - QT3DSU8 *dstVertexPtr(m_RemappedVertexData.begin()); - QT3DS_ASSERT(theNumGroups == 1); - for (QT3DSU32 theGroupIdx = 0; theGroupIdx < 1; ++theGroupIdx) { - PrimitiveGroup &srcGroup(thePrimitiveGroup); - PrimitiveGroup &dstGroup(theRemappedGroup[theGroupIdx]); - QT3DS_ASSERT(srcGroup.type == PT_LIST); - - for (QT3DSU32 theIndexIdx = 0; theIndexIdx < srcGroup.numIndices; ++theIndexIdx) { - QT3DSU16 srcIndex = srcGroup.indices[theIndexIdx]; - QT3DSU16 dstIndex = dstGroup.indices[theIndexIdx]; - QT3DS_ASSERT(dstIndex * m_VertexBuffer.m_Stride < vertBufByteSize); - QT3DS_ASSERT(srcIndex * m_VertexBuffer.m_Stride < vertBufByteSize); - // Maybe add in a check to see if we possibly already copied this information - // That would of course be only an optimization. - memCopy(dstVertexPtr + dstIndex * vertBufStride, - srcVertexPtr + srcIndex * vertBufStride, vertBufStride); - theIndices[theIndexIdx] = dstIndex; - } - memCopy(m_VertexBuffer.m_VertexData.begin(), m_RemappedVertexData.begin(), - vertBufByteSize); - } - - DeletePrimitiveGroup(theRemappedGroup); -#endif // DISABLE_VERTEX_REMAP -#endif // DISABLE_MESH_OPTIMIZATION - } - - template <typename TDataType> - static void Assign(QT3DSU8 *inBaseAddress, QT3DSU8 *inDataAddress, - SOffsetDataRef<TDataType> &inBuffer, const TDataType *inDestData, - QT3DSU32 inDestSize) - { - inBuffer.m_Offset = (QT3DSU32)(inDataAddress - inBaseAddress); - inBuffer.m_Size = inDestSize; - memCopy(inDataAddress, inDestData, inDestSize * sizeof(TDataType)); - } - template <typename TDataType> - static void Assign(QT3DSU8 *inBaseAddress, QT3DSU8 *inDataAddress, - SOffsetDataRef<TDataType> &inBuffer, QT3DSU32 inDestSize) - { - inBuffer.m_Offset = (QT3DSU32)(inDataAddress - inBaseAddress); - inBuffer.m_Size = inDestSize; - } - // Return the current mesh. This is only good for this function call, item may change or be - // released - // due to any further function calls. - Mesh &GetMesh() override - { - QT3DSU32 meshSize = sizeof(Mesh); - QT3DSU32 alignment = sizeof(void *); - QT3DSU32 vertDataSize = GetAlignedOffset(m_VertexBuffer.m_VertexData.size(), alignment); - meshSize += vertDataSize; - QT3DSU32 entrySize = m_VertexBuffer.m_VertexBufferEntries.size() - * sizeof(qt3ds::render::NVRenderVertexBufferEntry); - meshSize += entrySize; - QT3DSU32 entryNameSize = 0; - for (QT3DSU32 idx = 0, end = m_VertexBuffer.m_VertexBufferEntries.size(); idx < end; ++idx) { - const qt3ds::render::NVRenderVertexBufferEntry &theEntry( - m_VertexBuffer.m_VertexBufferEntries[idx]); - const char *entryName = theEntry.m_Name; - if (entryName == NULL) - entryName = ""; - entryNameSize += (QT3DSU32)(strlen(theEntry.m_Name)) + 1; - } - entryNameSize = GetAlignedOffset(entryNameSize, alignment); - meshSize += entryNameSize; - QT3DSU32 indexBufferSize = GetAlignedOffset(m_IndexBuffer.m_IndexData.size(), alignment); - meshSize += indexBufferSize; - QT3DSU32 subsetSize = m_MeshSubsetDescs.size() * sizeof(MeshSubset); - QT3DSU32 nameSize = 0; - for (QT3DSU32 idx = 0, end = m_MeshSubsetDescs.size(); idx < end; ++idx) { - if (!m_MeshSubsetDescs[idx].m_Name.isEmpty()) - nameSize += m_MeshSubsetDescs[idx].m_Name.size() + 1; - } - nameSize *= sizeof(char16_t); - nameSize = GetAlignedOffset(nameSize, alignment); - - meshSize += subsetSize + nameSize; - QT3DSU32 jointsSize = m_Joints.size() * sizeof(qt3dsimp::Joint); - meshSize += jointsSize; - m_MeshBuffer.resize(meshSize); - QT3DSU8 *baseAddress = m_MeshBuffer.data(); - Mesh *retval = reinterpret_cast<Mesh *>(baseAddress); - retval->m_DrawMode = m_DrawMode; - retval->m_Winding = m_Winding; - QT3DSU8 *vertBufferData = baseAddress + sizeof(Mesh); - QT3DSU8 *vertEntryData = vertBufferData + vertDataSize; - QT3DSU8 *vertEntryNameData = vertEntryData + entrySize; - QT3DSU8 *indexBufferData = vertEntryNameData + entryNameSize; - QT3DSU8 *subsetBufferData = indexBufferData + indexBufferSize; - QT3DSU8 *nameBufferData = subsetBufferData + subsetSize; - QT3DSU8 *jointBufferData = nameBufferData + nameSize; - - retval->m_VertexBuffer.m_Stride = m_VertexBuffer.m_Stride; - Assign(baseAddress, vertBufferData, retval->m_VertexBuffer.m_Data, - m_VertexBuffer.m_VertexData.begin(), m_VertexBuffer.m_VertexData.size()); - retval->m_VertexBuffer.m_Entries.m_Size = m_VertexBuffer.m_VertexBufferEntries.size(); - retval->m_VertexBuffer.m_Entries.m_Offset = (QT3DSU32)(vertEntryData - baseAddress); - for (QT3DSU32 idx = 0, end = m_VertexBuffer.m_VertexBufferEntries.size(); idx < end; ++idx) { - const qt3ds::render::NVRenderVertexBufferEntry &theEntry( - m_VertexBuffer.m_VertexBufferEntries[idx]); - MeshVertexBufferEntry &theDestEntry( - retval->m_VertexBuffer.m_Entries.index(baseAddress, idx)); - theDestEntry.m_ComponentType = theEntry.m_ComponentType; - theDestEntry.m_FirstItemOffset = theEntry.m_FirstItemOffset; - theDestEntry.m_NumComponents = theEntry.m_NumComponents; - const char *targetName = theEntry.m_Name; - if (targetName == NULL) - targetName = ""; - - QT3DSU32 entryNameLen = (QT3DSU32)(strlen(targetName)) + 1; - theDestEntry.m_NameOffset = (QT3DSU32)(vertEntryNameData - baseAddress); - memCopy(vertEntryNameData, theEntry.m_Name, entryNameLen); - vertEntryNameData += entryNameLen; - } - - retval->m_IndexBuffer.m_ComponentType = m_IndexBuffer.m_CompType; - Assign(baseAddress, indexBufferData, retval->m_IndexBuffer.m_Data, - m_IndexBuffer.m_IndexData.begin(), m_IndexBuffer.m_IndexData.size()); - Assign(baseAddress, subsetBufferData, retval->m_Subsets, m_MeshSubsetDescs.size()); - for (QT3DSU32 idx = 0, end = m_MeshSubsetDescs.size(); idx < end; ++idx) { - SubsetDesc &theDesc = m_MeshSubsetDescs[idx]; - MeshSubset &theSubset = reinterpret_cast<MeshSubset *>(subsetBufferData)[idx]; - theSubset.m_Bounds = theDesc.m_Bounds; - theSubset.m_Count = theDesc.m_Count; - theSubset.m_Offset = theDesc.m_Offset; - if (!theDesc.m_Name.isEmpty()) { - theSubset.m_Name.m_Size = theDesc.m_Name.size() + 1; - theSubset.m_Name.m_Offset = (QT3DSU32)(nameBufferData - baseAddress); - std::transform(theDesc.m_Name.begin(), theDesc.m_Name.end(), - reinterpret_cast<char16_t *>(nameBufferData), - [](QChar c) { return static_cast<char16_t>(c.unicode()); }); - reinterpret_cast<char16_t *>(nameBufferData)[theDesc.m_Name.size()] = 0; - nameBufferData += (theDesc.m_Name.size() + 1) * sizeof(char16_t); - } else { - theSubset.m_Name.m_Size = 0; - theSubset.m_Name.m_Offset = 0; - } - } - Assign(baseAddress, jointBufferData, retval->m_Joints, m_Joints.data(), m_Joints.size()); - return *retval; - } -}; -} - -// Uses new/delete. -MeshBuilder &MeshBuilder::CreateMeshBuilder() -{ - return *(new MeshBuilderImpl()); -} diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.cpp b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.cpp deleted file mode 100644 index 3523ef59..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#include "Qt3DSImportLibPrecompile.h" -#include "Qt3DSImportPath.h" -#include "foundation/Qt3DSBroadcastingAllocator.h" -#include "foundation/Qt3DSAtomic.h" - -using namespace qt3dsimp; - -void SPathBuffer::Save(IOutStream &outStream) const -{ - outStream.Write(GetFileTag()); - outStream.Write(GetFileVersion()); - outStream.Write((QT3DSU32)m_Commands.size()); - outStream.Write((QT3DSU32)m_Data.size()); - outStream.Write(toU8ConstDataRef((PathCommand::Enum *)m_Commands.begin(), m_Commands.size())); - outStream.Write(toU8ConstDataRef((QT3DSF32 *)m_Data.begin(), m_Data.size())); -} - -SPathBuffer *SPathBuffer::Load(IInStream &inStream, NVFoundationBase &inFoundation) -{ - QT3DSU64 fileTag; - QT3DSU32 version, numCommands, numData; - inStream.Read(fileTag); - inStream.Read(version); - inStream.Read(numCommands); - inStream.Read(numData); - if (fileTag != GetFileTag()) { - qCCritical(INVALID_OPERATION, "Invalid file, not a path file"); - return NULL; - } - if (version > GetFileVersion()) { - qCCritical(INVALID_OPERATION, "Version number out of range."); - return NULL; - } - QT3DSU32 commandSize = numCommands * sizeof(QT3DSU32); - QT3DSU32 dataSize = numData * sizeof(QT3DSF32); - QT3DSU32 objectSize = sizeof(SPathBuffer); - QT3DSU32 allocSize = objectSize + commandSize + dataSize; - QT3DSU8 *rawData = - (QT3DSU8 *)inFoundation.getAllocator().allocate(allocSize, "SPathBuffer", __FILE__, __LINE__); - SPathBuffer *retval = new (rawData) SPathBuffer(); - QT3DSU8 *commandBuffer = rawData + sizeof(SPathBuffer); - QT3DSU8 *dataBuffer = commandBuffer + commandSize; - inStream.Read(commandBuffer, commandSize); - inStream.Read(dataBuffer, dataSize); - retval->m_Commands = toDataRef((PathCommand::Enum *)commandBuffer, numCommands); - retval->m_Data = toDataRef((QT3DSF32 *)dataBuffer, numData); - return retval; -} - -void SPathBuffer::Free(NVAllocatorCallback &inAllocator) -{ - inAllocator.deallocate(this); -} - -namespace { -struct SBuilder : public IPathBufferBuilder -{ - NVFoundationBase &m_Foundation; - nvvector<PathCommand::Enum> m_Commands; - nvvector<QT3DSF32> m_Data; - QT3DSI32 m_RefCount; - - SBuilder(NVFoundationBase &inFoundation) - : m_Foundation(inFoundation) - , m_Commands(inFoundation.getAllocator(), "m_Commands") - , m_Data(inFoundation.getAllocator(), "m_Data") - , m_RefCount(0) - { - } - - void addRef() override { atomicIncrement(&m_RefCount); } - - void release() override - { - atomicDecrement(&m_RefCount); - if (m_RefCount <= 0) { - NVAllocatorCallback &theAlloc(m_Foundation.getAllocator()); - NVDelete(theAlloc, this); - } - } - - void Clear() override - { - m_Commands.clear(); - m_Data.clear(); - } - - void Push(const QT3DSVec2 inPos) - { - m_Data.push_back(inPos.x); - m_Data.push_back(inPos.y); - } - - void MoveTo(const QT3DSVec2 &inPos) override - { - m_Commands.push_back(PathCommand::MoveTo); - Push(inPos); - } - - void CubicCurveTo(const QT3DSVec2 &inC1, const QT3DSVec2 &inC2, const QT3DSVec2 &inP2) override - { - m_Commands.push_back(PathCommand::CubicCurveTo); - Push(inC1); - Push(inC2); - Push(inP2); - } - - void Close() override { m_Commands.push_back(PathCommand::Close); } - - // Points back to internal data structures, must use or copy. - SPathBuffer GetPathBuffer() override - { - SPathBuffer retval; - retval.m_Data = m_Data; - retval.m_Commands = m_Commands; - return retval; - } -}; -} - -IPathBufferBuilder &IPathBufferBuilder::CreateBuilder(NVFoundationBase &inFoundation) -{ - return *QT3DS_NEW(inFoundation.getAllocator(), SBuilder)(inFoundation); -} diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.h b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.h deleted file mode 100644 index 3b52c8ce..00000000 --- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImportPath.h +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 1993-2009 NVIDIA Corporation. -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt 3D Studio. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ -#pragma once -#ifndef QT3DS_IMPORT_PATH_H -#define QT3DS_IMPORT_PATH_H -#include "foundation/Qt3DS.h" -#include "foundation/Qt3DSDataRef.h" -#include "render/Qt3DSRenderBaseTypes.h" -#include "foundation/Qt3DSBounds3.h" -#include "foundation/Qt3DSAllocatorCallback.h" -#include "foundation/IOStreams.h" -#include "foundation/Qt3DSFoundation.h" -#include "foundation/Qt3DSRefCounted.h" -#include "foundation/Qt3DSVec2.h" - -namespace qt3dsimp { -using namespace qt3ds; -using namespace qt3ds::foundation; -using namespace qt3ds::render; -struct PathCommand -{ - enum Enum { - Noner = 0, - MoveTo, // 2 floats - CubicCurveTo, // 6 floats, c1, c2, p2. p1 is existing location - Close, // 0 floats - }; -}; - -struct SPathBuffer -{ - // 64 bit random number to uniquely identify this file type. - static QT3DSU64 GetFileTag() { return 0x7b1a41633c43a6afULL; } - static QT3DSU32 GetFileVersion() { return 1; } - NVConstDataRef<PathCommand::Enum> m_Commands; - NVConstDataRef<QT3DSF32> m_Data; - SPathBuffer() {} - void Save(IOutStream &outStream) const; - static SPathBuffer *Load(IInStream &inStream, NVFoundationBase &inFoundation); - - // Object is unused after this call. Anything created with Load must use this function. - void Free(NVAllocatorCallback &inAllocator); - SPathBuffer *Copy(NVAllocatorCallback &inAllocator) const; -}; - -class IPathBufferBuilder : public NVRefCounted -{ -public: - virtual void Clear() = 0; - - virtual void MoveTo(const QT3DSVec2 &inPos) = 0; - virtual void CubicCurveTo(const QT3DSVec2 &inC1, const QT3DSVec2 &inC2, const QT3DSVec2 &inP2) = 0; - virtual void Close() = 0; - // Points back to internal data structures, must use or copy. - virtual SPathBuffer GetPathBuffer() = 0; - - static IPathBufferBuilder &CreateBuilder(NVFoundationBase &inFoundation); -}; -} - -#endif
\ No newline at end of file diff --git a/src/Authoring/Studio/Palettes/Action/HandlerPropertyBaseSlider.qml b/src/Authoring/Studio/Palettes/Action/HandlerPropertyBaseSlider.qml index 13e36516..7019dff2 100644 --- a/src/Authoring/Studio/Palettes/Action/HandlerPropertyBaseSlider.qml +++ b/src/Authoring/Studio/Palettes/Action/HandlerPropertyBaseSlider.qml @@ -43,8 +43,10 @@ Row { property alias desiredValue: slider.value // This is value adjusted by user property alias sliderMin: slider.from property alias sliderMax: slider.to + property real sliderDecimals: -1 property bool intSlider: false - property int decimalSlider: Math.min(precision(slider.stepSize), 3) + property int decimalSlider: sliderDecimals >= 0 ? sliderDecimals + : Math.min(precision(slider.stepSize), 3) property Item tabItem1: textField signal previewValue // Indicates desiredValue contains a preview value @@ -226,7 +228,6 @@ Row { text = sliderMin slider.value = text root.doCommitValue(); - } function setTextFieldValue() { diff --git a/src/Authoring/Studio/Palettes/Action/PropertyModel.cpp b/src/Authoring/Studio/Palettes/Action/PropertyModel.cpp index b19e2117..8024204d 100644 --- a/src/Authoring/Studio/Palettes/Action/PropertyModel.cpp +++ b/src/Authoring/Studio/Palettes/Action/PropertyModel.cpp @@ -89,8 +89,8 @@ void PropertyModel::setAction(const qt3dsdm::Qt3DSDMActionHandle &action) property.m_handle); qt3dsdm::SMetaDataRange minMax = qt3dsdm::get<qt3dsdm::SMetaDataRange>(metaDataData); - property.m_min = minMax.m_Min; - property.m_max = minMax.m_Max; + property.m_min = minMax.m_min; + property.m_max = minMax.m_max; break; } case qt3dsdm::AdditionalMetaDataType::StringList: { diff --git a/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.cpp b/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.cpp index 7fb01bc2..53519573 100644 --- a/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.cpp +++ b/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.cpp @@ -52,6 +52,7 @@ #include "Dispatch.h" #include "VariantsGroupModel.h" #include "StudioProjectSettings.h" +#include "Literals.h" #include <QtCore/qfileinfo.h> @@ -92,8 +93,8 @@ static std::pair<bool, bool> getSlideCharacteristics(qt3dsdm::Qt3DSDMInstanceHan // Get the slide from the instance. qt3dsdm::Qt3DSDMSlideHandle slide = slideCore.GetSlideByInstance(instance); qt3dsdm::Qt3DSDMSlideHandle master = slideSystem.GetMasterSlide(slide); - int index = (int)slideSystem.GetSlideIndex(slide); - int count = (int)slideSystem.GetSlideCount(master); + int index = int(slideSystem.GetSlideIndex(slide)); + int count = int(slideSystem.GetSlideCount(master)); bool hasNextSlide = index > 0 && index < count - 1; bool hasPreviousSlide = index > 1; return std::make_pair(hasNextSlide, hasPreviousSlide); @@ -127,27 +128,15 @@ CInspectableBase *InspectorControlModel::inspectable() const return m_inspectableBase; } -qt3dsdm::Qt3DSDMInstanceHandle getReferenceMaterial(CInspectableBase *inspectable) +qt3dsdm::Qt3DSDMInstanceHandle InspectorControlModel::getReferenceMaterial( + CInspectableBase *inspectable) const { - const auto bridge = g_StudioApp.GetCore()->GetDoc()->GetStudioSystem() - ->GetClientDataModelBridge(); - if (inspectable) - return bridge->getMaterialReference(inspectable->getInstance()); + return getBridge()->getMaterialReference(inspectable->getInstance()); return 0; } -CInspectableBase *getReferenceMaterialInspectable(CInspectableBase *inspectable) -{ - auto refMaterial = getReferenceMaterial(inspectable); - - if (refMaterial.Valid()) - return g_StudioApp.getInspectableFromInstance(refMaterial); - - return nullptr; -} - void InspectorControlModel::notifyPropertyChanged(qt3dsdm::Qt3DSDMInstanceHandle inInstance, qt3dsdm::Qt3DSDMPropertyHandle inProperty) { @@ -1136,7 +1125,9 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c } element->m_value = stringValue; - } // intentional fall-through for other String-derived datatypes + } + Q_FALLTHROUGH(); // fall-through for other String-derived datatypes + case qt3dsdm::DataModelDataType::StringOrInt: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::StringList) { QStringList stringlist; @@ -1186,7 +1177,7 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c // Add the slide names (exclude the master slide) auto slideHandle = slideSystem->GetSlideByInstance(instance); auto masterSlide = slideSystem->GetMasterSlide(slideHandle); - long slideCount = (long)slideSystem->GetSlideCount(masterSlide); + long slideCount = long(slideSystem->GetSlideCount(masterSlide)); for (long slideIndex = 1; slideIndex < slideCount; ++slideIndex) { auto currentSlide = slideSystem->GetSlideByIndex(masterSlide, slideIndex); auto currentInstance = slideSystem->GetSlideInstance(currentSlide); @@ -1219,14 +1210,8 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c updateFontValues(element); skipEmits = true; // updateFontValues handles emits in correct order } else if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Mesh) { - QString meshValue = qt3dsdm::get<QString>(value); - Q3DStudio::CFilePath theSelectionItem(Q3DStudio::CString::fromQString(meshValue)); - Q3DStudio::CFilePath theSelectionWithoutId(theSelectionItem.filePath()); - QString theSelectionWithoutIdName = theSelectionWithoutId.GetFileName().toQString(); - if (theSelectionWithoutIdName.size()) - element->m_value = theSelectionWithoutIdName; - else - element->m_value = theSelectionItem.GetIdentifier().toQString(); + QString meshValue = QFileInfo(qt3dsdm::get<QString>(value)).fileName(); + element->m_value = meshValue.startsWith('#'_L1) ? meshValue.mid(1) : meshValue; } else if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Texture) { QFileInfo fileInfo(qt3dsdm::get<QString>(value)); element->m_value = fileInfo.fileName(); @@ -1241,14 +1226,17 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c << element->m_propertyType; } break; + case qt3dsdm::DataModelDataType::StringRef: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::None) { element->m_value = qt3dsdm::get<QString>(value); } break; + case qt3dsdm::DataModelDataType::Bool: element->m_value = qt3dsdm::get<bool>(value); break; + case qt3dsdm::DataModelDataType::Long4: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Image) { qt3dsdm::Option<qt3dsdm::SLong4> guid = qt3dsdm::get<qt3dsdm::SLong4>(value); @@ -1266,6 +1254,7 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c << element->m_dataType << " " << element->m_title; } break; + case qt3dsdm::DataModelDataType::Long: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Range) { element->m_value = qt3dsdm::get<int>(value); @@ -1273,12 +1262,12 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c if (m_guideInspectable) { const auto prop = m_guideInspectable->properties() [handleToGuidePropIndex(element->m_property)]; - ranges.m_Min = prop->GetInspectableMin(); - ranges.m_Max = prop->GetInspectableMax(); + ranges.m_min = prop->GetInspectableMin(); + ranges.m_max = prop->GetInspectableMax(); } else { ranges = qt3dsdm::get<qt3dsdm::SMetaDataRange>(info->m_MetaDataData); } - const QList<double> rangesValues{ranges.m_Min, ranges.m_Max}; + const QList<double> rangesValues{ranges.m_min, ranges.m_max, double(ranges.m_decimals)}; element->m_values = QVariant::fromValue<QList<double> >(rangesValues); } else if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::ShadowMapResolution) { @@ -1288,6 +1277,7 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c << element->m_dataType; } break; + case qt3dsdm::DataModelDataType::Float3: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Color) { element->m_value = qt3dsdm::get<QColor>(value); @@ -1301,11 +1291,13 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c element->m_values = QVariant::fromValue<QList<double> >(float3Values); } break; + case qt3dsdm::DataModelDataType::Float4: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Color) { element->m_value = qt3dsdm::get<QColor>(value); } break; + case qt3dsdm::DataModelDataType::Float2: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::None) { const QVector2D theFloat2 = qt3dsdm::get<QVector2D>(value); @@ -1316,18 +1308,20 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c << element->m_dataType << element->m_propertyType; } break; + case qt3dsdm::DataModelDataType::Float: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::None) { element->m_value = qt3dsdm::get<float>(value); } else if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::Range) { element->m_value = qt3dsdm::get<float>(value); const qt3dsdm::SMetaDataRange ranges = qt3dsdm::get<qt3dsdm::SMetaDataRange>(info->m_MetaDataData); - const QList<double> rangesValues{ranges.m_Min, ranges.m_Max}; + const QList<double> rangesValues{ranges.m_min, ranges.m_max, double(ranges.m_decimals)}; element->m_values = QVariant::fromValue<QList<double> >(rangesValues); } else if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::FontSize) { element->m_value = qt3dsdm::get<float>(value); } break; + case qt3dsdm::DataModelDataType::ObjectRef: if (element->m_propertyType == qt3dsdm::AdditionalMetaDataType::ObjectRef) { IObjectReferenceHelper *objRefHelper = doc->GetDataModelObjectReferenceHelper(); @@ -1347,6 +1341,7 @@ void InspectorControlModel::updatePropertyValue(InspectorControlBase *element) c } } break; + default: qWarning() << "TODO: InspectorControlModel::updatePropertyValue: I've no idea how to handle this datatype" << element->m_dataType; diff --git a/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.h b/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.h index e2f12831..3063f047 100644 --- a/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.h +++ b/src/Authoring/Studio/Palettes/Inspector/InspectorControlModel.h @@ -219,6 +219,7 @@ private: bool isBasicMaterial(CInspectableBase *inspectable) const; void updateMaterialValues(const QStringList &values, int elementIndex, bool updatingShaders = false); + qt3dsdm::Qt3DSDMInstanceHandle getReferenceMaterial(CInspectableBase *inspectable) const; void updateShaderValues(); void updateMatDataValues(); void updatePropertyValue(InspectorControlBase *element) const; diff --git a/src/Authoring/Studio/Palettes/Inspector/InspectorControlView.qml b/src/Authoring/Studio/Palettes/Inspector/InspectorControlView.qml index ebb56023..c291de7b 100644 --- a/src/Authoring/Studio/Palettes/Inspector/InspectorControlView.qml +++ b/src/Authoring/Studio/Palettes/Inspector/InspectorControlView.qml @@ -777,6 +777,7 @@ Rectangle { value: parent.modelData.value sliderMin: values[0] sliderMax: values[1] + sliderDecimals: values[2] onCommitValue: _inspectorModel.setPropertyValue(instance, handle, desiredValue, true) onPreviewValue: _inspectorModel.setPropertyValue(instance, handle, desiredValue, false) diff --git a/src/Authoring/Studio/Qt3DStudio.pro b/src/Authoring/Studio/Qt3DStudio.pro index 160647c9..3a80df6d 100644 --- a/src/Authoring/Studio/Qt3DStudio.pro +++ b/src/Authoring/Studio/Qt3DStudio.pro @@ -54,7 +54,6 @@ INCLUDEPATH += \ .. \ ../QT3DSIMP/Qt3DSImportLib \ ../QT3DSIMP/Qt3DSImportSGTranslation \ - ../QT3DSDM/Systems \ ../Common/Code/Thread \ ../Common/Code/IO \ ../Common/Code \ @@ -73,15 +72,17 @@ INCLUDEPATH += \ ../Client/Code/Core/Doc/ClientDataModelBridge \ ../Client/Code/Shared \ ../Client/Code/Shared/Log \ - ../../Runtime/Source/render \ - ../../Runtime/Source/foundation \ - ../../Runtime/Source/runtimerender \ - ../../Runtime/Source/runtimerender/graphobjects \ - ../../Runtime/Source/runtimerender/resourcemanager \ - ../../Runtime/Source/event \ - ../../3rdparty/EASTL/UnknownVersion/include \ - ../../3rdparty/color \ - ../../QtExtras/qmlstreamer + ../../Runtime/ogl-runtime/src/importlib \ + ../../Runtime/ogl-runtime/src/dm/systems \ + ../../Runtime/ogl-runtime/src/render \ + ../../Runtime/ogl-runtime/src/foundation \ + ../../Runtime/ogl-runtime/src/runtimerender \ + ../../Runtime/ogl-runtime/src/runtimerender/graphobjects \ + ../../Runtime/ogl-runtime/src/runtimerender/resourcemanager \ + ../../Runtime/ogl-runtime/src/event \ + ../../Runtime/ogl-runtime/src/3rdparty/EASTL/UnknownVersion/include \ + ../../Runtime/ogl-runtime/src/3rdparty/color \ + ../../Runtime/ogl-runtime/src/qmlstreamer linux { BEGIN_ARCHIVE = -Wl,--whole-archive @@ -176,7 +177,6 @@ HEADERS += \ Palettes/TimelineGraphicsView/KeyframeManager.h \ Palettes/TimelineGraphicsView/RowManager.h \ Palettes/TimelineGraphicsView/RowMover.h \ - Palettes/TimelineGraphicsView/rowtypes.h \ Palettes/TimelineGraphicsView/SelectionRect.h \ Palettes/TimelineGraphicsView/TimelineConstants.h \ Palettes/TimelineGraphicsView/TimelineControl.h \ @@ -470,6 +470,13 @@ CONFIG += exceptions target.path = $$[QT_INSTALL_BINS] INSTALLS += target +# Install FBX SDK library for Linux +linux:!isEmpty(QMAKE_LIBS_FBX) { + fbxsdk.files = $$str_member($$last(QMAKE_LIBS_FBX), 2, -1)/libfbxsdk.so + fbxsdk.path = $$[QT_INSTALL_LIBS] + INSTALLS += fbxsdk +} + RC_ICONS = images/3D-studio.ico ICON = images/studio.icns diff --git a/src/Authoring/Studio/Render/StudioSubPresentationRenderer.cpp b/src/Authoring/Studio/Render/StudioSubPresentationRenderer.cpp index 4e09dbf9..76e5f3c3 100644 --- a/src/Authoring/Studio/Render/StudioSubPresentationRenderer.cpp +++ b/src/Authoring/Studio/Render/StudioSubPresentationRenderer.cpp @@ -115,11 +115,7 @@ public: m_surfaceViewer->setUpdateInterval(-1); m_surfaceViewer->presentation()->setSource(QUrl::fromLocalFile(info.absoluteFilePath())); m_surfaceViewer->settings()->setMatteColor(Qt::transparent); -#ifdef Q3DS_PREVIEW_SUBPRESENTATION_RT2 m_surfaceViewer->create(m_surface.data(), m_context.data(), m_fbo->handle()); -#else - m_surfaceViewer->initialize(m_surface.data(), m_context.data(), m_fbo->handle()); -#endif m_running = true; m_semaphore.release(); @@ -157,11 +153,7 @@ public: m_context->doneCurrent(); m_context.reset(); #endif -#ifdef Q3DS_PREVIEW_SUBPRESENTATION_RT2 m_surfaceViewer->destroy(); -#else - m_surfaceViewer->shutdown(); -#endif m_surfaceViewer.reset(); m_surface->moveToThread(m_mainThread); m_semaphore.release(); diff --git a/src/Authoring/commoninclude.pri b/src/Authoring/commoninclude.pri index 889deb49..5eba100c 100644 --- a/src/Authoring/commoninclude.pri +++ b/src/Authoring/commoninclude.pri @@ -17,31 +17,31 @@ mingw:win32 { DEFINES += WIN32 } -INCLUDEPATH += $$PWD/../Runtime/Source +INCLUDEPATH += $$PWD/../Runtime/ogl-runtime/src win32 { INCLUDEPATH += \ - $$PWD/../Runtime/Source/platformspecific/windows/libs \ - $$PWD/../3rdparty/RuntimePlatformSpecific/Windows/PlatformLibs \ - $$PWD/../3rdparty/RuntimePlatformSpecific/Windows/Qt3DSLibs + $$PWD/../Runtime/ogl-runtime/src/platformspecific/windows/libs \ + $$PWD/../Runtime/ogl-runtime/src/3rdparty/platformspecific/Windows/PlatformLibs \ + $$PWD/../Runtime/ogl-runtime/src/3rdparty/platformspecific/Windows/Qt3DSLibs } linux { INCLUDEPATH += \ - $$PWD/../3rdparty/RuntimePlatformSpecific/Linux/PlatformLibs \ - $$PWD/../Runtime/Source/platformspecific/Linux/libs \ - $$PWD/../3rdparty/RuntimePlatformSpecific/Linux/Qt3DSLibs + $$PWD/../Runtime/ogl-runtime/src/3rdparty/platformspecific/Linux/PlatformLibs \ + $$PWD/../Runtime/ogl-runtime/src/platformspecific/Linux/libs \ + $$PWD/../Runtime/ogl-runtime/src/3rdparty/platformspecific/Linux/Qt3DSLibs } macos { INCLUDEPATH += \ - $$PWD/../3rdparty/RuntimePlatformSpecific/Macos/PlatformLibs \ - $$PWD/../Runtime/Source/platformspecific/macos/libs \ - $$PWD/../3rdparty/RuntimePlatformSpecific/Macos/Qt3DSLibs + $$PWD/../Runtime/ogl-runtime/src/3rdparty/platformspecific/Macos/PlatformLibs \ + $$PWD/../Runtime/ogl-runtime/src/platformspecific/macos/libs \ + $$PWD/../Runtime/ogl-runtime/src/3rdparty/platformspecific/Macos/Qt3DSLibs } android { INCLUDEPATH += \ - $$PWD/../Runtime/Source/platformspecific/Android/jni/libs - $$PWD/../Runtime/Source/platformspecific/Android/jni/libs/nv_thread + $$PWD/../Runtime/ogl-runtime/src/platformspecific/Android/jni/libs + $$PWD/../Runtime/ogl-runtime/src/platformspecific/Android/jni/libs/nv_thread } |