summaryrefslogtreecommitdiffstats
path: root/src/runtime/Qt3DSPresentation.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/Qt3DSPresentation.h')
-rw-r--r--src/runtime/Qt3DSPresentation.h231
1 files changed, 231 insertions, 0 deletions
diff --git a/src/runtime/Qt3DSPresentation.h b/src/runtime/Qt3DSPresentation.h
new file mode 100644
index 0000000..76b0a6e
--- /dev/null
+++ b/src/runtime/Qt3DSPresentation.h
@@ -0,0 +1,231 @@
+/****************************************************************************
+**
+** 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$
+** 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 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** 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 "RuntimePrefix.h"
+#include "Qt3DSIPresentation.h"
+#include "Qt3DSPresentationFrameData.h"
+#include "Qt3DSAnimationSystem.h"
+#include "Qt3DSCircularArray.h"
+#include "Qt3DSEventCallbacks.h"
+#include "Qt3DSTimePolicy.h"
+#include "EASTL/hash_map.h"
+#include "foundation/StringTable.h"
+#include "Qt3DSComponentManager.h"
+
+#include <QObject>
+
+class QPresentationSignalProxy : public QObject
+{
+ Q_OBJECT
+Q_SIGNALS:
+ void SigSlideEntered(const QString &elementPath, unsigned int index, const QString &name);
+ void SigSlideExited(const QString &elementPath, unsigned int index, const QString &name);
+ void SigCustomSignal(const QString &elementPath, const QString &name);
+ void SigPresentationReady();
+ void SigElementsCreated(const QStringList &elementPaths, const QString &error);
+ void SigMaterialsCreated(const QStringList &materialNames, const QString &error);
+ void SigDataOutputValueUpdated(const QString &name, const QVariant &value);
+};
+
+namespace qt3ds {
+namespace runtime {
+ class IApplication;
+ class IActivityZone;
+ struct DataOutputDef;
+}
+}
+
+namespace qt3ds {
+namespace render {
+ class ILoadedBuffer;
+}
+}
+
+namespace Q3DStudio {
+
+/**
+ * Intelligent representation of a Studio presentation.
+ */
+class CPresentation : public IPresentation
+{
+protected:
+ QString m_Name; // Name of this presentation
+ QString m_FilePath; // Absolute path to this presentation
+ QString m_projectPath; // Absolute path to the project root
+ qt3ds::runtime::IApplication *m_Application; // Runtime object
+ IScene *m_Scene; // Connection to the associated scene (render) for this presentation
+ qt3ds::runtime::IActivityZone *m_ActivityZone; // Controls element active status
+ TElement *m_RootElement;
+
+ CPresentationFrameData m_FrameData; // Storage of data of the current frame
+ CCircularArray<SEventCommand> m_EventCommandQueue; // The Event/Command integrated queue
+ bool m_IsProcessingEventCommandQueue;
+ CEventCallbacks m_EventCallbacks; // Handles event callbacks on registered elements
+ SPresentationSize m_Size; // Native width, height and mode exported from Studio
+
+ qt3ds::foundation::NVScopedRefCounted<qt3ds::render::ILoadedBuffer>
+ m_LoadedBuffer; // Reference to loaded data when loading from binary
+
+ CComponentManager m_ComponentManager;
+ qt3ds::foundation::NVScopedRefCounted<ISlideSystem>
+ m_SlideSystem; // Container and factory of all slides
+ qt3ds::foundation::NVScopedRefCounted<ILogicSystem>
+ m_LogicSystem; // Container and factory of all logics
+ qt3ds::foundation::NVScopedRefCounted<IAnimationSystem>
+ m_AnimationSystem; // Container and factory of all animation tracks
+ qt3ds::foundation::NVScopedRefCounted<IParametersSystem>
+ m_ParametersSystem; // Container and factory of all custom actions
+
+ TTimeUnit m_Offset;
+ TTimeUnit m_LocalTime;
+ TTimeUnit m_PreviousGlobalTime;
+ bool m_Paused;
+ bool m_OffsetInvalid;
+ bool m_Active;
+ bool m_presentationReady = false;
+
+ typedef eastl::hash_map<TElement *, qt3ds::foundation::CRegisteredString> TElemStringMap;
+ TElemStringMap m_ElementPathMap;
+
+public: // Construction
+ CPresentation(const QString &inName, const QString &projectPath,
+ qt3ds::runtime::IApplication *inRuntime);
+ virtual ~CPresentation() override;
+
+public: // Execution
+ void Initialize();
+ // Clear dirty elements
+ void ClearDirtyList() override;
+ // Run events
+ void PreUpdate(const TTimeUnit inGlobalTime) override;
+ // update element graph
+ void BeginUpdate() override;
+ // end update element graph
+ void EndUpdate() override;
+ // Run behaviors.
+ void PostUpdate(const TTimeUnit inGlobalTime) override;
+ // Notify DataUpdates if any are registered to this presentation
+ void NotifyDataOutputs();
+
+public: // Bridge Control
+ IScene *GetScene() const override;
+ IScriptBridge *GetScriptBridgeQml() override;
+ void SetScene(IScene *inScene) override;
+
+ void SetActivityZone(qt3ds::runtime::IActivityZone *inZone);
+ qt3ds::runtime::IActivityZone *GetActivityZone() override { return m_ActivityZone; }
+ void SetActive(bool inValue);
+ bool GetActive() const;
+ TElement *GetRoot() override { return m_RootElement; }
+ void SetRoot(TElement &inRoot) override { m_RootElement = &inRoot; }
+
+public: // Commands and Events
+ void FireEvent(const SEventCommand &inEvent);
+ void FireEvent(const TEventCommandHash inEventType, TElement *inTarget,
+ const UVariant *inArg1 = nullptr, const UVariant *inArg2 = nullptr,
+ const EAttributeType inType1 = ATTRIBUTETYPE_NONE,
+ const EAttributeType inType2 = ATTRIBUTETYPE_NONE) override;
+ void FireCommand(const TEventCommandHash inCommandType, TElement *inTarget,
+ const UVariant *inArg1 = nullptr, const UVariant *inArg2 = nullptr,
+ const EAttributeType inType1 = ATTRIBUTETYPE_NONE,
+ const EAttributeType inType2 = ATTRIBUTETYPE_NONE) override;
+ void FlushEventCommandQueue(void) override;
+ void ProcessEvent(SEventCommand &inEvent) override;
+
+ QPresentationSignalProxy *signalProxy();
+
+public: // Data Output
+ void AddToDataOutputMap(const QHash<qt3ds::foundation::CRegisteredString,
+ qt3ds::runtime::DataOutputDef> &doMap);
+
+public: // Event Callbacks
+ void RegisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData) override;
+ BOOL UnregisterEventCallback(TElement *inElement, const TEventCommandHash inEventHash,
+ const TEventCallback inCallback, void *inContextData) override;
+
+protected: // Execution Helper Methods
+ void ProcessAllCallbacks();
+ BOOL ProcessEventCommandQueue();
+ void ProcessEvent(SEventCommand &ioEvent, INT32 &ioEventCount);
+ void ProcessEventBubbling(SEventCommand &ioEvent, INT32 &ioEventCount);
+ void ProcessCommand(const SEventCommand &inCommand);
+
+public: // Managers
+ IComponentManager &GetComponentManager() override;
+ ISlideSystem &GetSlideSystem() override;
+ IAnimationSystem &GetAnimationSystem() override;
+ ILogicSystem &GetLogicSystem() override;
+ IParametersSystem &GetParametersSystem() override;
+ qt3ds::foundation::IStringTable &GetStringTable() override;
+ qt3ds::runtime::IApplication &GetApplication() override
+ {
+ QT3DS_ASSERT(m_Application);
+ return *m_Application;
+ }
+ void SetLoadedBuffer(qt3ds::render::ILoadedBuffer &inBuffer);
+
+ void SetElementPath(TElement &inElement, const char8_t *inPath) override;
+ qt3ds::foundation::CRegisteredString GetElementPath(TElement &inElement) override;
+
+public: // Helpers
+ CPresentationFrameData &GetFrameData() override;
+ TTimeUnit GetTime() { return m_LocalTime; }
+
+public: // Hooks and callbacks
+ void OnPresentationLoaded() override;
+
+public: // Configuration access
+ SPresentationSize GetSize() const override;
+ BOOL GetPause() const;
+ const QByteArray GetName() const;
+
+ void SetSize(const SPresentationSize &inSize) override;
+ void SetPause(const BOOL inPause);
+ void SetHide(const BOOL inHide);
+ void SetUpdateLock(const BOOL inLockUpdate);
+ void SetVCAA(const BOOL inVCAA);
+
+public: // Full file paths
+ void SetFilePath(const CHAR *inPath) override;
+ QString GetFilePath() const override;
+ QString getProjectPath() const override;
+
+private: // Disabled Copy Construction
+ CPresentation(CPresentation &);
+ CPresentation &operator=(const CPresentation &);
+private:
+ QPresentationSignalProxy m_SignalProxy;
+ QHash<qt3ds::foundation::CRegisteredString, qt3ds::runtime::DataOutputDef> m_pathToDataOutMap;
+};
+
+} // namespace Q3DStudio