summaryrefslogtreecommitdiffstats
path: root/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderPlugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderPlugin.cpp')
m---------src/Runtime/ogl-runtime0
-rw-r--r--src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderPlugin.cpp936
2 files changed, 0 insertions, 936 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime
new file mode 160000
+Subproject 427fddb50d43aa21a90fc7356ee3cdd8a908df5
diff --git a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderPlugin.cpp b/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderPlugin.cpp
deleted file mode 100644
index e4e821f8..00000000
--- a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderPlugin.cpp
+++ /dev/null
@@ -1,936 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2008-2012 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$
-**
-****************************************************************************/
-#include "Qt3DSRenderPlugin.h"
-#include "foundation/Qt3DSAtomic.h"
-#include "foundation/Qt3DSFoundation.h"
-#include "foundation/Qt3DSBroadcastingAllocator.h"
-#include "foundation/SerializationTypes.h"
-#include "foundation/IOStreams.h"
-#include "foundation/Qt3DSSystem.h"
-#include "foundation/FileTools.h"
-#include "render/Qt3DSRenderContext.h"
-#include "StringTools.h"
-#include "Qt3DSRenderPluginPropertyValue.h"
-#include "Qt3DSRenderInputStreamFactory.h"
-
-#if defined(QT3DS_WINDOWS)
-#include "windows/DynamicLibLoader.h"
-#elif defined(QT3DS_ANDROID)
-#include "android/DynamicLibLoader.h"
-#elif defined(QT3DS_LINUX)
-#include "linux/DynamicLibLoader.h"
-#elif defined(QT3DS_APPLE)
-#include "macos/DynamicLibLoader.h"
-#elif defined(QT3DS_QNX)
-#include "qnx/DynamicLibLoader.h"
-#else
-#error "Must define an operating system type (QT3DS_WINDOWS, QT3DS_ANDROID, QT3DS_LINUX, QT3DS_APPLE, QT3DS_QNX)"
-#endif
-
-using namespace qt3ds::render;
-
-namespace {
-// Legacy definitions...
-// API version 1 definitions
-typedef struct _RenderPluginSurfaceDescriptionV1
-{
- long m_Width;
- long m_Height;
- enum QT3DSRenderPluginDepthTypes m_DepthBuffer;
- enum QT3DSRenderPluginTextureTypes m_ColorBuffer;
- TBool m_HasStencilBuffer;
-} TRenderPluginSurfaceDescriptionV1;
-
-typedef TNeedsRenderResult (*TNeedsRenderFunctionV1)(TRenderPluginClassPtr cls,
- TRenderPluginInstancePtr instance,
- TRenderPluginSurfaceDescriptionV1 surface,
- TVec2 presScaleFactor);
-
-typedef void (*TRenderFunctionV1)(TRenderPluginClassPtr cls, TRenderPluginInstancePtr instance,
- TRenderPluginSurfaceDescriptionV1 surface,
- TVec2 presScaleFactor,
- QT3DSRenderPluginColorClearState inClearColorBuffer);
-
-// End API version 1 definitions
-
-TRenderPluginSurfaceDescription ToCInterface(const SOffscreenRendererEnvironment &env)
-{
- TRenderPluginSurfaceDescription retval;
- retval.m_Width = (long)env.m_Width;
- retval.m_Height = (long)env.m_Height;
- retval.m_ColorBuffer = static_cast<QT3DSRenderPluginTextureTypes>(env.m_Format);
- retval.m_DepthBuffer = static_cast<QT3DSRenderPluginDepthTypes>(env.m_Depth);
- retval.m_HasStencilBuffer = env.m_Stencil ? TTRUE : TFALSE;
- retval.m_MSAALevel = QT3DSRenderPluginMSAALevelNoMSAA;
- // note no supersampling AA support for plugins
- // we fall back to 4xMSAA
- switch (env.m_MSAAMode) {
- case AAModeValues::X2:
- retval.m_MSAALevel = QT3DSRenderPluginMSAALevelTwo;
- break;
- case AAModeValues::SSAA:
- case AAModeValues::X4:
- retval.m_MSAALevel = QT3DSRenderPluginMSAALevelFour;
- break;
- case AAModeValues::X8:
- retval.m_MSAALevel = QT3DSRenderPluginMSAALevelEight;
- break;
- default:
- QT3DS_ASSERT(false);
- // fallthrough intentional.
- case AAModeValues::NoAA:
- break;
- };
- return retval;
-}
-
-TRenderPluginSurfaceDescriptionV1 ToCInterfaceV1(const SOffscreenRendererEnvironment &env)
-{
- TRenderPluginSurfaceDescriptionV1 retval;
- retval.m_Width = (long)env.m_Width;
- retval.m_Height = (long)env.m_Height;
- retval.m_ColorBuffer = static_cast<QT3DSRenderPluginTextureTypes>(env.m_Format);
- retval.m_DepthBuffer = static_cast<QT3DSRenderPluginDepthTypes>(env.m_Depth);
- retval.m_HasStencilBuffer = env.m_Stencil ? TTRUE : TFALSE;
- return retval;
-}
-
-TVec2 ToCInterface(const QT3DSVec2 &item)
-{
- TVec2 retval = { item.x, item.y };
- return retval;
-}
-
-QT3DSRenderPluginColorClearState ToCInterface(SScene::RenderClearCommand inClearCommand)
-{
- switch (inClearCommand) {
- case SScene::DoNotClear:
- return QT3DSRenderPluginColorClearStateDoNotClear;
- case SScene::AlwaysClear:
- return QT3DSRenderPluginColorClearStateAlwaysClear;
- default:
- QT3DS_ASSERT(false); // fallthrough intentional
- case SScene::ClearIsOptional:
- return QT3DSRenderPluginColorClearStateClearIsOptional;
- };
-}
-
-class SRenderPluginPropertyData
-{
- SRenderPluginPropertyValue m_Value;
- bool m_Dirty;
-
-public:
- SRenderPluginPropertyData()
- : m_Dirty(false)
- {
- }
- SRenderPluginPropertyData(const SRenderPluginPropertyData &other)
- : m_Value(other.m_Value)
- , m_Dirty(other.m_Dirty)
- {
- }
- SRenderPluginPropertyData &operator=(const SRenderPluginPropertyData &other)
- {
- m_Value = other.m_Value;
- m_Dirty = other.m_Dirty;
- return *this;
- }
-
- bool IsDirty() const
- {
- return m_Value.getType() != RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue
- && m_Dirty;
- }
- void SetValue(const SRenderPluginPropertyValue &value)
- {
- m_Value = value;
- m_Dirty = true;
- }
-
- TRenderPluginPropertyUpdate ClearDirty(CRegisteredString inPropName)
- {
- m_Dirty = false;
- TRenderPluginPropertyUpdate retval;
- memset(&retval, 0, sizeof(TRenderPluginPropertyUpdate));
- retval.m_PropName = inPropName.c_str();
- switch (m_Value.getType()) {
- case RenderPluginPropertyValueTypes::Long: {
- retval.m_PropertyType = QT3DSRenderPluginPropertyTypeLong;
- long temp = (long)m_Value.getData<QT3DSI32>();
- retval.m_PropertyValue = *reinterpret_cast<void **>(&temp);
- } break;
- case RenderPluginPropertyValueTypes::Float: {
- retval.m_PropertyType = QT3DSRenderPluginPropertyTypeFloat;
- float temp = m_Value.getData<QT3DSF32>();
- retval.m_PropertyValue = *reinterpret_cast<void **>(&temp);
- } break;
- case RenderPluginPropertyValueTypes::Boolean: {
- retval.m_PropertyType = QT3DSRenderPluginPropertyTypeLong;
- long temp = m_Value.getData<bool>() ? TTRUE : TFALSE;
- retval.m_PropertyValue = *reinterpret_cast<void **>(&temp);
- } break;
- case RenderPluginPropertyValueTypes::String: {
- retval.m_PropertyType = QT3DSRenderPluginPropertyTypeCharPtr;
- const char *temp = m_Value.getData<CRegisteredString>().c_str();
- retval.m_PropertyValue = reinterpret_cast<void *>(const_cast<char *>(temp));
- } break;
- default:
- QT3DS_ASSERT(false);
- }
- return retval;
- }
-};
-
-typedef nvvector<SRenderPluginPropertyData> TPropertyValueList;
-
-struct IInternalPluginClass : public IRenderPluginClass
-{
- virtual void PushUpdates(TRenderPluginInstancePtr instance,
- TPropertyValueList &propertyValues) = 0;
- virtual void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer,
- TPropertyValueList &propertyValues) = 0;
- virtual QT3DSI32 GetAPIVersion() = 0;
-};
-
-static NVRenderTextureFormats::Enum ToTextureFormat(QT3DSRenderPluginTextureTypes inTextureType)
-{
- switch (inTextureType) {
- default:
- case QT3DSRenderPluginTextureTypeRGBA8:
- return NVRenderTextureFormats::RGBA8;
- case QT3DSRenderPluginTextureTypeRGB8:
- return NVRenderTextureFormats::RGB8;
- case QT3DSRenderPluginTextureTypeRGB565:
- return NVRenderTextureFormats::RGB565;
- case QT3DSRenderPluginTextureTypeRGBA5551:
- return NVRenderTextureFormats::RGBA5551;
- }
-}
-
-static OffscreenRendererDepthValues::Enum ToDepthValue(QT3DSRenderPluginDepthTypes inType)
-{
- switch (inType) {
- default:
- case QT3DSRenderPluginDepthTypeDepth16:
- return OffscreenRendererDepthValues::Depth16;
- case QT3DSRenderPluginDepthTypeDepth24:
- return OffscreenRendererDepthValues::Depth24;
- case QT3DSRenderPluginDepthTypeDepth32:
- return OffscreenRendererDepthValues::Depth32;
- }
-}
-
-static AAModeValues::Enum ToAAMode(QT3DSRenderPluginMSAALevel inMode)
-{
- switch (inMode) {
- case QT3DSRenderPluginMSAALevelTwo:
- return AAModeValues::X2;
- case QT3DSRenderPluginMSAALevelFour:
- return AAModeValues::X4;
- case QT3DSRenderPluginMSAALevelEight:
- return AAModeValues::X8;
- default:
- QT3DS_ASSERT(false); // fallthrough intentional
- case QT3DSRenderPluginMSAALevelNoMSAA:
- return AAModeValues::NoAA;
- }
-}
-
-struct InstanceImpl : public IRenderPluginInstance
-{
- NVFoundationBase &m_Foundation;
- TRenderPluginInstancePtr m_Instance;
- TRenderPluginClass m_Class;
- NVScopedRefCounted<IInternalPluginClass> m_Owner;
- CRegisteredString m_RendererType;
- // Backing store of property values
- nvvector<SRenderPluginPropertyData> m_PropertyValues;
- bool m_Dirty;
- NVRenderContext *m_RenderContext;
- QT3DSI32 mRefCount;
-
- InstanceImpl(NVFoundationBase &fnd, TRenderPluginInstancePtr instance, TRenderPluginClass cls,
- IInternalPluginClass &owner, IStringTable &strTable)
- : m_Foundation(fnd)
- , m_Instance(instance)
- , m_Class(cls)
- , m_Owner(owner)
- , m_RendererType(
- strTable.RegisterStr(IRenderPluginInstance::IRenderPluginOffscreenRendererType()))
- , m_PropertyValues(m_Foundation.getAllocator(), "InstanceImpl::m_PropertyValues")
- , m_Dirty(false)
- , m_RenderContext(NULL)
- , mRefCount(0)
- {
- }
-
- virtual ~InstanceImpl() { m_Class.ReleaseInstance(m_Class.m_Class, m_Instance); }
-
- QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
-
- void addCallback(IOffscreenRendererCallback *cb) override
- {
-
- }
- void CreateScriptProxy(script_State *state) override
- {
- if (m_Class.CreateInstanceScriptProxy)
- m_Class.CreateInstanceScriptProxy(m_Class.m_Class, m_Instance, state);
- }
-
- // Arbitrary const char* returned to indicate the type of this renderer
- // Can be overloaded to form the basis of an RTTI type system.
- // Not currently used by the rendering system.
- CRegisteredString GetOffscreenRendererType() override { return m_RendererType; }
-
- SOffscreenRendererEnvironment GetDesiredEnvironment(QT3DSVec2 inPresentationScaleFactor) override
- {
- if (m_Class.QueryInstanceRenderSurface) {
- QT3DSRenderPluginMSAALevel theLevel = QT3DSRenderPluginMSAALevelNoMSAA;
- TRenderPluginSurfaceDescription desc = m_Class.QueryInstanceRenderSurface(
- m_Class.m_Class, m_Instance, ToCInterface(inPresentationScaleFactor));
- if (m_Owner->GetAPIVersion() > 1)
- theLevel = desc.m_MSAALevel;
-
- return SOffscreenRendererEnvironment(
- (QT3DSU32)desc.m_Width, (QT3DSU32)desc.m_Height, ToTextureFormat(desc.m_ColorBuffer),
- ToDepthValue(desc.m_DepthBuffer), desc.m_HasStencilBuffer ? true : false,
- ToAAMode(theLevel));
- } else {
- QT3DS_ASSERT(false);
- }
- return SOffscreenRendererEnvironment();
- }
-
- // Returns true of this object needs to be rendered, false if this object is not dirty
- SOffscreenRenderFlags NeedsRender(const SOffscreenRendererEnvironment &inEnvironment,
- QT3DSVec2 inPresentationScaleFactor,
- const SRenderInstanceId instanceId) override
- {
- if (m_Dirty) {
- m_Dirty = false;
- m_Owner->PushUpdates(m_Instance, m_PropertyValues);
- }
- if (m_Class.NeedsRenderFunction) {
- if (m_Owner->GetAPIVersion() > 1) {
- TNeedsRenderResult result = m_Class.NeedsRenderFunction(
- m_Class.m_Class, m_Instance, ToCInterface(inEnvironment),
- ToCInterface(inPresentationScaleFactor));
- return SOffscreenRenderFlags(result.HasTransparency ? true : false,
- result.HasChangedSinceLastFrame ? true : false);
- } else {
- TNeedsRenderFunctionV1 theV1Function =
- reinterpret_cast<TNeedsRenderFunctionV1>(m_Class.NeedsRenderFunction);
-
- TNeedsRenderResult result =
- theV1Function(m_Class.m_Class, m_Instance, ToCInterfaceV1(inEnvironment),
- ToCInterface(inPresentationScaleFactor));
- return SOffscreenRenderFlags(result.HasTransparency ? true : false,
- result.HasChangedSinceLastFrame ? true : false);
- }
- }
- return SOffscreenRenderFlags(true, true);
- }
- // Returns true if the rendered result image has transparency, or false
- // if it should be treated as a completely opaque image.
- // It is the IOffscreenRenderer's job to clear any buffers (color, depth, stencil) that it
- // needs to. It should not assume that it's buffers are clear;
- // Sometimes we scale the width and height of the main presentation in order to fit a window.
- // If we do so, the scale factor tells the subpresentation renderer how much the system has
- // scaled.
- void Render(const SOffscreenRendererEnvironment &inEnvironment,
- NVRenderContext &inRenderContext, QT3DSVec2 inPresentationScaleFactor,
- SScene::RenderClearCommand inColorBufferNeedsClear,
- const SRenderInstanceId instanceId) override
- {
- m_RenderContext = &inRenderContext;
- if (m_Class.RenderInstance) {
- inRenderContext.PushPropertySet();
- if (m_Owner->GetAPIVersion() > 1) {
- m_Class.RenderInstance(m_Class.m_Class, m_Instance, ToCInterface(inEnvironment),
- ToCInterface(inPresentationScaleFactor),
- ToCInterface(inColorBufferNeedsClear));
- } else {
- TRenderFunctionV1 theV1Function =
- reinterpret_cast<TRenderFunctionV1>(m_Class.RenderInstance);
- theV1Function(m_Class.m_Class, m_Instance, ToCInterfaceV1(inEnvironment),
- ToCInterface(inPresentationScaleFactor),
- ToCInterface(inColorBufferNeedsClear));
- }
-
- inRenderContext.PopPropertySet(true);
- }
- }
-
- void RenderWithClear(const SOffscreenRendererEnvironment &inEnvironment,
- NVRenderContext &inRenderContext, QT3DSVec2 inPresScale,
- SScene::RenderClearCommand inClearBuffer, QT3DSVec4 inClearColor,
- const SRenderInstanceId id)
- {
- Q_ASSERT(false);
- }
-
- // Implementors should implement one of the two interfaces below.
-
- // If this renderer supports picking that can return graph objects
- // then return an interface here.
- IGraphObjectPickQuery *GetGraphObjectPickQuery(const SRenderInstanceId) override { return NULL; }
-
- // If you *don't* support the GraphObjectPickIterator interface, then you should implement this
- // interface
- // The system will just ask you to pick.
- // If you return true, then we will assume that you swallowed the pick and will continue no
- // further.
- // else we will assume you did not and will continue the picking algorithm.
- bool Pick(const QT3DSVec2 &inMouseCoords, const QT3DSVec2 &inViewportDimensions,
- const SRenderInstanceId instanceId) override
- {
- if (m_Class.Pick) {
- if (m_RenderContext) {
- m_RenderContext->PushPropertySet();
- bool retval = m_Class.Pick(m_Class.m_Class, m_Instance, ToCInterface(inMouseCoords),
- ToCInterface(inViewportDimensions))
- ? true
- : false;
- m_RenderContext->PopPropertySet(true);
- return retval;
- }
- }
- return false;
- }
-
- TRenderPluginInstancePtr GetRenderPluginInstance() override { return m_Instance; }
- void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer) override
- {
- m_Dirty = true;
- m_Owner->Update(updateBuffer, m_PropertyValues);
- }
- IRenderPluginClass &GetPluginClass() override { return *m_Owner; }
-};
-
-typedef eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum> TStringTypePair;
-
-struct PluginClassImpl : public IInternalPluginClass
-{
- typedef nvhash_map<CRegisteredString, QT3DSU32> TStringIndexMap;
- NVFoundationBase &m_Foundation;
- IStringTable &m_StringTable;
- TRenderPluginClass m_Class;
- CRegisteredString m_Type;
- CLoadedDynamicLibrary *m_DynamicLibrary;
- nvvector<SRenderPluginPropertyDeclaration> m_RegisteredProperties;
- TStringIndexMap m_ComponentNameToComponentIndexMap;
- nvvector<TStringTypePair> m_FullPropertyList;
- nvvector<TRenderPluginPropertyUpdate> m_UpdateBuffer;
- Qt3DSString m_TempString;
- QT3DSI32 m_APIVersion;
-
- QT3DSI32 mRefCount;
-
- PluginClassImpl(NVFoundationBase &fnd, IStringTable &strTable, TRenderPluginClass inClass,
- CRegisteredString inType, CLoadedDynamicLibrary *inLibrary)
- : m_Foundation(fnd)
- , m_StringTable(strTable)
- , m_Class(inClass)
- , m_Type(inType)
- , m_DynamicLibrary(inLibrary)
- , m_RegisteredProperties(m_Foundation.getAllocator(),
- "PluginClassImpl::m_RegisteredProperties")
- , m_ComponentNameToComponentIndexMap(m_Foundation.getAllocator(),
- "PluginClassImpl::m_ComponentNameToComponentIndexMap")
- , m_FullPropertyList(m_Foundation.getAllocator(), "PluginClassImpl::m_FullPropertyList")
- , m_UpdateBuffer(m_Foundation.getAllocator(), "PluginClassImpl::m_UpdateBuffer")
- , m_APIVersion(m_Class.GetRenderPluginAPIVersion(m_Class.m_Class))
- , mRefCount(0)
- {
- }
- ~PluginClassImpl()
- {
- if (m_Class.ReleaseClass)
- m_Class.ReleaseClass(m_Class.m_Class);
- if (m_DynamicLibrary)
- NVDelete(m_Foundation.getAllocator(), m_DynamicLibrary);
- }
-
- QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
-
- NVScopedRefCounted<IRenderPluginInstance> CreateInstance() override
- {
- if (m_Class.CreateInstance) {
- TRenderPluginInstancePtr instance =
- m_Class.CreateInstance(m_Class.m_Class, m_Type.c_str());
- if (instance) {
- InstanceImpl *retval = QT3DS_NEW(m_Foundation.getAllocator(), InstanceImpl)(
- m_Foundation, instance, m_Class, *this, m_StringTable);
- return retval;
- }
- }
- return NVScopedRefCounted<IRenderPluginInstance>();
- }
-
- QT3DSI32 GetAPIVersion() override { return m_APIVersion; }
-
- void AddFullPropertyType(const char *name, RenderPluginPropertyValueTypes::Enum inType)
- {
- QT3DSU32 itemIndex = (QT3DSU32)m_FullPropertyList.size();
- CRegisteredString regName = m_StringTable.RegisterStr(name);
- bool inserted =
- m_ComponentNameToComponentIndexMap.insert(eastl::make_pair(regName, itemIndex)).second;
- if (inserted) {
- m_FullPropertyList.push_back(eastl::make_pair(regName, inType));
- } else {
- // Duplicate property declaration.
- QT3DS_ASSERT(false);
- }
- }
-
- void AddFullPropertyType(const char *name, const char *extension,
- RenderPluginPropertyValueTypes::Enum inType)
- {
- m_TempString.assign(name);
- if (!isTrivial(extension)) {
- m_TempString.append(".");
- m_TempString.append(extension);
- }
- AddFullPropertyType(m_TempString.c_str(), inType);
- }
-
- void RegisterProperty(const SRenderPluginPropertyDeclaration &dec) override
- {
- QT3DSU32 startOffset = (QT3DSU32)m_FullPropertyList.size();
-
- switch (dec.m_Type) {
-
- case SRenderPluginPropertyTypes::Vector2:
- AddFullPropertyType(dec.m_Name, "x", RenderPluginPropertyValueTypes::Float);
- AddFullPropertyType(dec.m_Name, "y", RenderPluginPropertyValueTypes::Float);
- break;
- case SRenderPluginPropertyTypes::Color:
- AddFullPropertyType(dec.m_Name, "r", RenderPluginPropertyValueTypes::Float);
- AddFullPropertyType(dec.m_Name, "g", RenderPluginPropertyValueTypes::Float);
- AddFullPropertyType(dec.m_Name, "b", RenderPluginPropertyValueTypes::Float);
- break;
- case SRenderPluginPropertyTypes::Vector3:
- AddFullPropertyType(dec.m_Name, "x", RenderPluginPropertyValueTypes::Float);
- AddFullPropertyType(dec.m_Name, "y", RenderPluginPropertyValueTypes::Float);
- AddFullPropertyType(dec.m_Name, "z", RenderPluginPropertyValueTypes::Float);
- break;
- case SRenderPluginPropertyTypes::Boolean:
- AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::Boolean);
- break;
- case SRenderPluginPropertyTypes::Float:
- AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::Float);
- break;
- case SRenderPluginPropertyTypes::Long:
- AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::Long);
- break;
- case SRenderPluginPropertyTypes::String:
- AddFullPropertyType(dec.m_Name, RenderPluginPropertyValueTypes::String);
- break;
- default:
- QT3DS_ASSERT(false);
- break;
- }
- m_RegisteredProperties.push_back(dec);
- m_RegisteredProperties.back().m_StartOffset = startOffset;
- }
-
- NVConstDataRef<SRenderPluginPropertyDeclaration> GetRegisteredProperties() override
- {
- return m_RegisteredProperties;
- }
-
- SRenderPluginPropertyDeclaration GetPropertyDeclaration(CRegisteredString inPropName) override
- {
- for (QT3DSU32 idx = 0, end = m_RegisteredProperties.size(); idx < end; ++idx) {
- if (m_RegisteredProperties[idx].m_Name == inPropName)
- return m_RegisteredProperties[idx];
- }
- QT3DS_ASSERT(false);
- return SRenderPluginPropertyDeclaration();
- }
-
- // From which you can get the property name breakdown
- virtual eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum>
- GetPropertyValueInfo(QT3DSU32 inIndex) override
- {
- if (inIndex < m_FullPropertyList.size())
- return m_FullPropertyList[inIndex];
- QT3DS_ASSERT(false);
- return eastl::pair<CRegisteredString, RenderPluginPropertyValueTypes::Enum>(
- CRegisteredString(), RenderPluginPropertyValueTypes::NoRenderPluginPropertyValue);
- }
-
- void PushUpdates(TRenderPluginInstancePtr instance, TPropertyValueList &propertyValues) override
- {
- m_UpdateBuffer.clear();
- for (QT3DSU32 idx = 0, end = propertyValues.size(); idx < end; ++idx) {
- SRenderPluginPropertyData &theData(propertyValues[idx]);
- if (theData.IsDirty())
- m_UpdateBuffer.push_back(theData.ClearDirty(m_FullPropertyList[idx].first));
- }
- if (m_Class.UpdateInstance)
- m_Class.UpdateInstance(m_Class.m_Class, instance, m_UpdateBuffer.data(),
- (long)m_UpdateBuffer.size());
- }
-
- void Update(NVConstDataRef<SRenderPropertyValueUpdate> updateBuffer,
- TPropertyValueList &propertyValues) override
- {
- for (QT3DSU32 idx = 0, end = updateBuffer.size(); idx < end; ++idx) {
- const SRenderPropertyValueUpdate &update = updateBuffer[idx];
- TStringIndexMap::iterator iter =
- m_ComponentNameToComponentIndexMap.find(update.m_PropertyName);
- if (iter == m_ComponentNameToComponentIndexMap.end()) {
- QT3DS_ASSERT(false);
- continue;
- }
-
- QT3DSU32 propIndex = iter->second;
- if (update.m_Value.getType() != m_FullPropertyList[propIndex].second) {
- QT3DS_ASSERT(false);
- continue;
- }
- if (propIndex >= propertyValues.size())
- propertyValues.resize(propIndex + 1);
- propertyValues[propIndex].SetValue(update.m_Value);
- }
- }
-};
-
-struct PluginInstanceKey
-{
- CRegisteredString m_Path;
- void *m_InstanceKey;
- PluginInstanceKey(CRegisteredString p, void *ik)
- : m_Path(p)
- , m_InstanceKey(ik)
- {
- }
- bool operator==(const PluginInstanceKey &rhs) const
- {
- return m_Path == rhs.m_Path && m_InstanceKey == rhs.m_InstanceKey;
- }
-};
-}
-
-namespace eastl {
-template <>
-struct hash<PluginInstanceKey>
-{
- size_t operator()(const PluginInstanceKey &k) const
- {
- return hash<CRegisteredString>()(k.m_Path)
- ^ hash<size_t>()(reinterpret_cast<size_t>(k.m_InstanceKey));
- }
- bool operator()(const PluginInstanceKey &lhs, const PluginInstanceKey &rhs) const
- {
- return lhs.m_Path == rhs.m_Path && lhs.m_InstanceKey == rhs.m_InstanceKey;
- }
-};
-}
-
-namespace {
-
-struct SLoadedPluginData
-{
- CRegisteredString m_PluginPath;
- eastl::vector<SRenderPluginPropertyDeclaration> m_Properties;
-};
-
-typedef eastl::vector<SLoadedPluginData> TLoadedPluginDataList;
-
-struct PluginManagerImpl : public IRenderPluginManager, public IRenderPluginManagerCore
-{
- typedef nvhash_map<CRegisteredString, NVScopedRefCounted<IRenderPluginClass>> TLoadedClassMap;
- typedef nvhash_map<PluginInstanceKey, NVScopedRefCounted<IRenderPluginInstance>> TInstanceMap;
- NVFoundationBase &m_Foundation;
- IStringTable &m_StringTable;
- TLoadedClassMap m_LoadedClasses;
- TInstanceMap m_Instances;
- NVScopedRefCounted<NVRenderContext> m_RenderContext;
- IInputStreamFactory &m_InputStreamFactory;
- QT3DSI32 mRefCount;
- TStr m_DllDir;
- TLoadedPluginDataList m_LoadedPluginData;
-
- PluginManagerImpl(NVFoundationBase &fnd, IStringTable &st, IInputStreamFactory &inFactory)
- : m_Foundation(fnd)
- , m_StringTable(st)
- , m_LoadedClasses(fnd.getAllocator(), "PluginManagerImpl::m_LoadedClasses")
- , m_Instances(fnd.getAllocator(), "PluginManagerImpl::m_Instances")
- , m_InputStreamFactory(inFactory)
- , mRefCount(0)
- , m_DllDir(ForwardingAllocator(fnd.getAllocator(), "PluginManagerImpl::m_DllDir"))
- {
- }
-
- QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE(m_Foundation.getAllocator())
-
- IRenderPluginClass *GetRenderPlugin(CRegisteredString inRelativePath) override
- {
- TLoadedClassMap::iterator iter = m_LoadedClasses.find(inRelativePath);
- if (iter != m_LoadedClasses.end())
- return iter->second;
-
- return NVScopedRefCounted<IRenderPluginClass>();
- }
-
- IRenderPluginClass *GetOrCreateRenderPlugin(CRegisteredString inRelativePath) override
- {
- TLoadedClassMap::iterator iter = m_LoadedClasses.find(inRelativePath);
- if (iter != m_LoadedClasses.end()) {
- return iter->second;
- }
-
- // We insert right here to keep us from going down this path potentially for every instance.
- iter =
- m_LoadedClasses
- .insert(eastl::make_pair(inRelativePath, NVScopedRefCounted<IRenderPluginClass>()))
- .first;
- eastl::string xmlDir, fname, extension;
-
- CFileTools::Split(inRelativePath.c_str(), xmlDir, fname, extension);
-
- eastl::string sharedLibrary(xmlDir);
- eastl::string subdir(qt3ds::foundation::System::getPlatformGLStr());
- eastl::string libdir;
- eastl::string libpath;
-
- CFileTools::CombineBaseAndRelative(xmlDir.c_str(), subdir.c_str(), libdir);
- CFileTools::CombineBaseAndRelative(libdir.c_str(), fname.c_str(), libpath);
-#ifdef _DEBUG
- libpath.append("d");
-#endif
- libpath.append(qt3ds::foundation::System::g_DLLExtension);
- eastl::string loadPath;
- if (m_DllDir.size()) {
- // Then we have to copy the dll to the dll directory before loading because the
- // filesystem
- // the plugin is on may not be executable.
- eastl::string targetFile;
- CFileTools::CombineBaseAndRelative(m_DllDir.c_str(), fname.c_str(), targetFile);
-#ifdef _DEBUG
- targetFile.append("d");
-#endif
- targetFile.append(qt3ds::foundation::System::g_DLLExtension);
-
- qCInfo(TRACE_INFO, "Copying plugin shared library from %s to %s",
- libpath.c_str(), targetFile.c_str());
-
- // try to open the library.
- NVScopedRefCounted<IRefCountedInputStream> theStream =
- m_InputStreamFactory.GetStreamForFile(libpath.c_str());
- if (!theStream) {
- qCCritical(INVALID_OPERATION, "Failed to load render plugin %s",
- libpath.c_str());
- return NULL;
- }
- CFileSeekableIOStream outStream(targetFile.c_str(), FileWriteFlags());
- if (!outStream.IsOpen()) {
- qCCritical(INVALID_OPERATION, "Failed to load render plugin %s",
- targetFile.c_str());
- return NULL;
- }
-
- QT3DSU8 buf[1024] = { 0 };
- for (QT3DSU32 len = theStream->Read(toDataRef(buf, 1024)); len;
- len = theStream->Read(toDataRef(buf, 1024))) {
- outStream.Write(toDataRef(buf, len));
- }
- loadPath = targetFile;
- } else {
- QString path;
- m_InputStreamFactory.GetPathForFile(libpath.c_str(), path);
- loadPath = path.toUtf8().data();
- }
- CLoadedDynamicLibrary *library = NULL;
- TRenderPluginClass newPluginClass;
- memSet(&newPluginClass, 0, sizeof(newPluginClass));
-
- // Do not load plugin dlls during compilation steps or when we don't have a valid render
- // context.
- // They may try opengl access at some point and that would end in disaster during binary
- // save steps.
- if ((QT3DSU32)m_RenderContext->GetRenderContextType() != NVRenderContextValues::NullContext) {
- library = CLoadedDynamicLibrary::Create(loadPath.c_str(), m_Foundation);
- if (!library) {
- // try loading it from the system instead of from this specific path. This means do
- // not use any extensions or any special
- // sauce.
- loadPath = fname;
-#ifdef _DEBUG
- loadPath.append("d");
-#endif
- library = CLoadedDynamicLibrary::Create(loadPath.c_str(), m_Foundation);
- }
- }
-
- if (library) {
- TCreateRenderPluginClassFunction CreateClass =
- reinterpret_cast<TCreateRenderPluginClassFunction>(
- library->FindFunction("CreateRenderPlugin"));
- if (CreateClass) {
- newPluginClass = CreateClass(fname.c_str());
- if (newPluginClass.m_Class) {
- // Check that the required functions are there.
- if (newPluginClass.CreateInstance == NULL
- || newPluginClass.QueryInstanceRenderSurface == NULL
- || newPluginClass.RenderInstance == NULL
- || newPluginClass.ReleaseInstance == NULL
- || newPluginClass.ReleaseClass == NULL) {
- if (newPluginClass.ReleaseClass)
- newPluginClass.ReleaseClass(newPluginClass.m_Class);
- qCCritical(INVALID_OPERATION,
- "Failed to load render plugin: %s, required functions "
- "missing. Required functions are:"
- "CreateInstance, QueryInstanceRenderSurface, "
- "RenderInstance, ReleaseInstance, ReleaseClass",
- inRelativePath.c_str());
- NVDelete(m_Foundation.getAllocator(), library);
- memSet(&newPluginClass, 0, sizeof(newPluginClass));
- }
- }
- }
- }
- if (newPluginClass.m_Class) {
- PluginClassImpl *retval = QT3DS_NEW(m_Foundation.getAllocator(), PluginClassImpl)(
- m_Foundation, m_StringTable, newPluginClass,
- m_StringTable.RegisterStr(fname.c_str()), library);
-
- iter->second = retval;
- if (newPluginClass.InitializeClassGLResources) {
- m_RenderContext->PushPropertySet();
- newPluginClass.InitializeClassGLResources(newPluginClass.m_Class, loadPath.c_str());
- m_RenderContext->PopPropertySet(true);
- }
- return iter->second;
- }
- return NULL;
- }
-
- void SetDllDir(const char *inDllDir) override { m_DllDir.assign(nonNull(inDllDir)); }
-
- IRenderPluginInstance *GetOrCreateRenderPluginInstance(CRegisteredString inRelativePath,
- void *inKey) override
- {
- PluginInstanceKey theKey(inRelativePath, inKey);
- TInstanceMap::iterator iter = m_Instances.find(theKey);
- if (iter == m_Instances.end()) {
- IRenderPluginClass *theClass = GetOrCreateRenderPlugin(inRelativePath);
- NVScopedRefCounted<IRenderPluginInstance> theInstance;
- if (theClass)
- theInstance = theClass->CreateInstance();
-
- iter = m_Instances.insert(eastl::make_pair(theKey, theInstance)).first;
- }
- return iter->second.mPtr;
- }
-
- void Save(qt3ds::render::SWriteBuffer &ioBuffer,
- const qt3ds::render::SStrRemapMap &inRemapMap,
- const char8_t * /*inProjectDir*/) const override
- {
- QT3DSU32 numClasses = m_LoadedClasses.size();
- ioBuffer.write(numClasses);
- for (TLoadedClassMap::const_iterator iter = m_LoadedClasses.begin(),
- end = m_LoadedClasses.end();
- iter != end; ++iter) {
- CRegisteredString saveStr = iter->first;
- saveStr.Remap(inRemapMap);
- ioBuffer.write(saveStr);
- if (iter->second) {
- NVConstDataRef<SRenderPluginPropertyDeclaration> theProperties =
- const_cast<IRenderPluginClass &>((*iter->second)).GetRegisteredProperties();
- ioBuffer.write(theProperties.size());
- for (QT3DSU32 idx = 0, end = theProperties.size(); idx < end; ++idx) {
- SRenderPluginPropertyDeclaration theDec(theProperties[idx]);
- theDec.m_Name.Remap(inRemapMap);
- ioBuffer.write(theDec);
- }
- } else
- ioBuffer.write((QT3DSU32)0);
- }
- }
-
- void Load(NVDataRef<QT3DSU8> inData, CStrTableOrDataRef inStrDataBlock,
- const char8_t * /*inProjectDir*/) override
- {
- qt3ds::render::SDataReader theReader(inData.begin(), inData.end());
- QT3DSU32 numClasses = theReader.LoadRef<QT3DSU32>();
- ForwardingAllocator alloc(m_Foundation.getAllocator(), "tempstrings");
- qt3ds::foundation::TStr workStr(alloc);
- nvvector<SRenderPluginPropertyDeclaration> propertyBuffer(m_Foundation.getAllocator(),
- "tempprops");
- for (QT3DSU32 classIdx = 0; classIdx < numClasses; ++classIdx) {
- CRegisteredString classPath = theReader.LoadRef<CRegisteredString>();
- classPath.Remap(inStrDataBlock);
- QT3DSU32 numProperties = theReader.LoadRef<QT3DSU32>();
- propertyBuffer.clear();
- for (QT3DSU32 propIdx = 0; propIdx < numProperties; ++propIdx) {
- propertyBuffer.push_back(theReader.LoadRef<SRenderPluginPropertyDeclaration>());
- propertyBuffer.back().m_Name.Remap(inStrDataBlock);
- }
- m_LoadedPluginData.push_back(SLoadedPluginData());
- m_LoadedPluginData.back().m_PluginPath = classPath;
- m_LoadedPluginData.back().m_Properties.assign(propertyBuffer.begin(),
- propertyBuffer.end());
- }
- }
- IRenderPluginManager &GetRenderPluginManager(NVRenderContext &rc) override
- {
- m_RenderContext = rc;
- for (QT3DSU32 idx = 0, end = m_LoadedPluginData.size(); idx < end; ++idx) {
- // Now we can attempt to load the class.
- IRenderPluginClass *theClass =
- GetOrCreateRenderPlugin(m_LoadedPluginData[idx].m_PluginPath);
- if (theClass) {
- eastl::vector<SRenderPluginPropertyDeclaration> &propertyBuffer(
- m_LoadedPluginData[idx].m_Properties);
- for (QT3DSU32 propIdx = 0, propEnd = propertyBuffer.size(); propIdx < propEnd;
- ++propIdx) {
- theClass->RegisterProperty(propertyBuffer[propIdx]);
- }
- }
- }
- m_LoadedPluginData.clear();
- return *this;
- }
-};
-}
-
-IRenderPluginManagerCore &IRenderPluginManagerCore::Create(NVFoundationBase &inFoundation,
- IStringTable &strTable,
- IInputStreamFactory &inFactory)
-{
- return *QT3DS_NEW(inFoundation.getAllocator(), PluginManagerImpl)(inFoundation, strTable,
- inFactory);
-}