Revision control
++ // Copyright (C) 2008-2012 NVIDIA Corporation.
++ // Copyright (C) 2023 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++
++ #ifndef QSSG_RENDER_GRAPH_OBJECT_H
++ #define QSSG_RENDER_GRAPH_OBJECT_H
++
++ //
++ // W A R N I N G
++ // -------------
++ //
++ // This file is part of the QtQuick3D API, with limited compatibility guarantees.
++ // Usage of this API may make your code source and binary incompatible with
++ // future versions of Qt.
++ //
++
++ #include <QtQuick3DRuntimeRender/qtquick3druntimerenderexports.h>
++ #include <QtCore/QDebug>
++ #include <QtCore/qtconfigmacros.h>
++ #include <QtQuick/qtquickglobal.h>
++
++ QT_BEGIN_NAMESPACE
++
++ // NOTE: Duplicat to avoid pulling in private headers
++ #ifndef Q_QUICK3D_PROFILE_ID
++ # if QT_CONFIG(qml_debug)
++ # define Q_QUICK3D_PROFILE_ID_ qint32 profilingId = -1;
++ # else
++ # define Q_QUICK3D_PROFILE_ID_
++ # endif
++ #else
++ # define Q_QUICK3D_PROFILE_ID_ Q_QUICK3D_PROFILE_ID
++ #endif
++
++
++ class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRenderGraphObject
++ {
++ Q_DISABLE_COPY_MOVE(QSSGRenderGraphObject)
++ public:
++ // Types should be setup on construction. Change the type
++ // at your own risk as the type is used for RTTI purposes.
++ // See QSSGRenderGraphObject, QQuick3DObject and QSSceneDesc (asset useage).
++
++ enum BaseType : quint32 {
++ // Internal types
++ Node = 0x1000,
++ Light = 0x2000,
++ Camera = 0x4000,
++ Renderable = 0x8000,
++ Resource = 0x10000,
++ Material = 0x20000,
++ Texture = 0x40000,
++ Extension = 0x80000,
++ User = 0x80000000,
++ };
++
++ enum class Type : quint32 {
++ Unknown = 0,
++ // Nodes
++ Node = BaseType::Node,
++ Root, // Node
++ Layer, // Node
++ Joint, // Node
++ Skeleton, // Node (A resource to the model node)
++ ImportScene, // Node
++ ReflectionProbe,
++ SceneRoot, // Node
++ // Light nodes
++ DirectionalLight = BaseType::Light | BaseType::Node,
++ PointLight,
++ SpotLight,
++ // Camera nodes
++ OrthographicCamera = BaseType::Camera | BaseType::Node,
++ PerspectiveCamera,
++ CustomFrustumCamera, // Perspective camera with user specified frustum bounds.
++ CustomCamera,
++ // Renderable nodes
++ Model = BaseType::Renderable | BaseType::Node, // Renderable Node
++ Item2D, // Renderable Node
++ Particles, // Renderable Node
++ // Resources
++ SceneEnvironment = BaseType::Resource, // Resource
++ Effect, // Resource
++ Geometry, // Resource
++ TextureData, // Resource
++ MorphTarget, // Resource
++ ModelInstance, // Resource
++ ModelBlendParticle, // Resource
++ ResourceLoader, // Resource [meta]
++ RenderPass, // Resource
++ SkyMaterial, // Resource
++ Skin, // Resource
++ // Materials
++ DefaultMaterial = BaseType::Material | BaseType::Resource, // Resource
++ PrincipledMaterial, // Resource
++ CustomMaterial, // Resource
++ SpecularGlossyMaterial, //Resource
++ LegacySkin, // Reserved; Type::Skin had this value before Qt 6.13. Never construct an object with it.
++ // Textures
++ Image2D = BaseType::Texture | BaseType::Resource, // Resource
++ ImageCube, // Resource
++ RenderExtension = BaseType::Extension, // Extension
++ TextureProvider, // Extension
++ // User types E.g.: (User | Node) + 1)
++ };
++ using TypeT = std::underlying_type_t<Type>;
++
++ enum class Flags : quint32 {
++ HasGraphicsResources = 0x1,
++ InternallyReserved = 0xffff0000,
++ };
++ using FlagT = std::underlying_type_t<Flags>;
++
++ [[nodiscard]] static constexpr bool isNodeType(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Node);
++ }
++
++ [[nodiscard]] static constexpr bool isLight(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Light);
++ }
++
++ [[nodiscard]] static constexpr bool isCamera(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Camera);
++ }
++
++ [[nodiscard]] static constexpr bool isMaterial(Type type) noexcept
++ {
++ // Type::Skin had the LegacySkin value, in the material range, before
++ // Qt 6.13. Keep rejecting it here in case it reaches us from code
++ // built against the older headers, where the value was inlined.
++ return (TypeT(type) & BaseType::Material) && (type != Type::LegacySkin);
++ }
++
++ [[nodiscard]] static constexpr bool isTexture(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Texture);
++ }
++
++ [[nodiscard]] static constexpr bool isRenderable(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Renderable);
++ }
++
++ [[nodiscard]] static constexpr bool isResource(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Resource);
++ }
++
++ [[nodiscard]] static constexpr bool isExtension(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::Extension);
++ }
++
++ // Note: This could have been a non-static member, as we never create or use
++ // user types we do the built-in types; In any case just follow the existing pattern.
++ [[nodiscard]] static constexpr bool isUserType(Type type) noexcept
++ {
++ return (TypeT(type) & BaseType::User);
++ }
++
++ // Objects tagged with HasGraphicsResources get special handling and will be queued for release
++ // on the render thread after the frame has been submitted. See cleanupNodes() in the scene manager.
++ [[nodiscard]] inline bool hasGraphicsResources() const noexcept
++ {
++ return ((flags & FlagT(Flags::HasGraphicsResources)) != 0);
++ }
++
++ const Type type;
++ FlagT flags { 0 };
++ Q_QUICK3D_PROFILE_ID_
++
++ virtual ~QSSGRenderGraphObject();
++
++ #ifndef QT_NO_DEBUG_STREAM
++ friend Q_QUICK3DRUNTIMERENDER_EXPORT QDebug operator<<(QDebug stream, QSSGRenderGraphObject::Type type);
++ #endif
++
++ protected:
++ explicit QSSGRenderGraphObject(QSSGRenderGraphObject::Type inType);
++ explicit QSSGRenderGraphObject(QSSGRenderGraphObject::Type inType, FlagT inFlags) : type(inType), flags(inFlags) {}
++ };
++
++ #ifndef QT_NO_DEBUG_STREAM
++ Q_QUICK3DRUNTIMERENDER_EXPORT QDebug operator<<(QDebug, QSSGRenderGraphObject::Type type);
++ #endif
++
++ QT_END_NAMESPACE
++
++ #endif // QSSG_RENDER_GRAPH_OBJECT_H