From a86a143ac5640fa4771539fc47d30662b65ff8ca Mon Sep 17 00:00:00 2001 From: AnyOldName3 Date: Tue, 2 Dec 2025 18:33:33 +0000 Subject: [PATCH] Allow specialisation of vsg::Inherit for sublasses, alternative implementation. Like e07a87fd67b5f6e9990aa105fa625bba6c45358c / https://github.com/vsg-dev/VulkanSceneGraph/pull/1609, but a bit simpler and easier to use --- include/vsg/core/Inherit.h | 21 ++++++++-- include/vsg/state/ArrayState.h | 42 ++++++++++--------- src/vsg/state/ArrayState.cpp | 65 +---------------------------- src/vsg/text/CpuLayoutTechnique.cpp | 5 +-- src/vsg/text/GpuLayoutTechnique.cpp | 5 +-- 5 files changed, 44 insertions(+), 94 deletions(-) diff --git a/include/vsg/core/Inherit.h b/include/vsg/core/Inherit.h index 1278a5f17e..9f67bc3933 100644 --- a/include/vsg/core/Inherit.h +++ b/include/vsg/core/Inherit.h @@ -20,16 +20,29 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI namespace vsg { + template + struct InheritHelper + { + using Type = ParentClass; + }; + + template + struct InheritHelper> + { + using Type = typename ParentClass::template InheritExtras; + }; /// Inherit<> uses the Curiously Recurring Template Pattern /// to provide the classes versions of create, accept(..), RTTI and sizeofObject() template - class Inherit : public ParentClass + class Inherit : public InheritHelper::Type { public: + using BaseClass = typename InheritHelper::Type; + template Inherit(Args&&... args) : - ParentClass(std::forward(args)...) {} + BaseClass(std::forward(args)...) {} template static ref_ptr create(Args&&... args) @@ -47,11 +60,11 @@ namespace vsg std::size_t sizeofObject() const noexcept override { return sizeof(Subclass); } const char* className() const noexcept override { return type_name(); } const std::type_info& type_info() const noexcept override { return typeid(Subclass); } - bool is_compatible(const std::type_info& type) const noexcept override { return typeid(Subclass) == type || ParentClass::is_compatible(type); } + bool is_compatible(const std::type_info& type) const noexcept override { return typeid(Subclass) == type || BaseClass::is_compatible(type); } int compare(const Object& rhs) const override { - int result = ParentClass::compare(rhs); + int result = BaseClass::compare(rhs); if (result != 0) return result; size_t startOfSubclass = sizeof(ParentClass); diff --git a/include/vsg/state/ArrayState.h b/include/vsg/state/ArrayState.h index 4c4897495c..f201ba714a 100644 --- a/include/vsg/state/ArrayState.h +++ b/include/vsg/state/ArrayState.h @@ -27,6 +27,28 @@ namespace vsg class VSG_DECLSPEC ArrayState : public Inherit { public: + template + class InheritExtras : public ParentClass + { + public: + using ParentClass::ParentClass; + + explicit InheritExtras(const ArrayState& rhs, const CopyOp& copyop = {}) : + ParentClass(rhs, copyop) + { + } + + ref_ptr cloneArrayState() override + { + return Subclass::create(static_cast(*this)); + } + + ref_ptr cloneArrayState(ref_ptr arrayState) override + { + return Subclass::create(static_cast(*arrayState)); + } + }; + ArrayState() = default; ArrayState(const ArrayState& rhs, const CopyOp& copyop = {}); @@ -106,9 +128,6 @@ namespace vsg NullArrayState(); explicit NullArrayState(const ArrayState& as); - ref_ptr cloneArrayState() override; - ref_ptr cloneArrayState(ref_ptr arrayState) override; - using ArrayState::apply; void apply(const vec3Array&) override; @@ -124,9 +143,6 @@ namespace vsg TranslationArrayState(const TranslationArrayState& rhs); explicit TranslationArrayState(const ArrayState& rhs); - ref_ptr cloneArrayState() override; - ref_ptr cloneArrayState(ref_ptr arrayState) override; - uint32_t translation_attribute_location = 7; AttributeDetails translationAttribute; @@ -145,9 +161,6 @@ namespace vsg TranslationRotationScaleArrayState(const TranslationRotationScaleArrayState& rhs); explicit TranslationRotationScaleArrayState(const ArrayState& rhs); - ref_ptr cloneArrayState() override; - ref_ptr cloneArrayState(ref_ptr arrayState) override; - uint32_t translation_attribute_location = 7; uint32_t rotation_attribute_location = 8; uint32_t scale_attribute_location = 9; @@ -168,10 +181,7 @@ namespace vsg public: DisplacementMapArrayState(); DisplacementMapArrayState(const DisplacementMapArrayState& rhs); - explicit DisplacementMapArrayState(const ArrayState& rhs); - - ref_ptr cloneArrayState() override; - ref_ptr cloneArrayState(ref_ptr arrayState) override; + explicit DisplacementMapArrayState(const ArrayState& rhs, const CopyOp& copyop = {}); // binding of displacement map uint32_t normal_attribute_location = 1; @@ -207,9 +217,6 @@ namespace vsg uint32_t translation_attribute_location = 7; AttributeDetails translationAttribute; - ref_ptr cloneArrayState() override; - ref_ptr cloneArrayState(ref_ptr arrayState) override; - void apply(const VertexInputState& vas) override; ref_ptr vertexArray(uint32_t instanceIndex) override; }; @@ -223,9 +230,6 @@ namespace vsg BillboardArrayState(const BillboardArrayState& rhs); explicit BillboardArrayState(const ArrayState& rhs); - ref_ptr cloneArrayState() override; - ref_ptr cloneArrayState(ref_ptr arrayState) override; - uint32_t translation_attribute_location = 7; AttributeDetails translationAttribute; diff --git a/src/vsg/state/ArrayState.cpp b/src/vsg/state/ArrayState.cpp index 1a08fe9dba..aa973b9f06 100644 --- a/src/vsg/state/ArrayState.cpp +++ b/src/vsg/state/ArrayState.cpp @@ -219,17 +219,6 @@ NullArrayState::NullArrayState(const ArrayState& as) : vertices = {}; } -ref_ptr NullArrayState::cloneArrayState() -{ - return NullArrayState::create(*this); -} - -// clone the specified ArrayState -ref_ptr NullArrayState::cloneArrayState(ref_ptr arrayState) -{ - return NullArrayState::create(*arrayState); -} - void NullArrayState::apply(const vsg::vec3Array&) { vertices = {}; @@ -260,16 +249,6 @@ TranslationArrayState::TranslationArrayState(const ArrayState& rhs) : { } -ref_ptr TranslationArrayState::cloneArrayState() -{ - return TranslationArrayState::create(*this); -} - -ref_ptr TranslationArrayState::cloneArrayState(ref_ptr arrayState) -{ - return TranslationArrayState::create(*arrayState); -} - void TranslationArrayState::apply(const VertexInputState& vas) { getAttributeDetails(vas, vertex_attribute_location, vertexAttribute); @@ -315,16 +294,6 @@ TranslationRotationScaleArrayState::TranslationRotationScaleArrayState(const Arr { } -ref_ptr TranslationRotationScaleArrayState::cloneArrayState() -{ - return TranslationRotationScaleArrayState::create(*this); -} - -ref_ptr TranslationRotationScaleArrayState::cloneArrayState(ref_ptr arrayState) -{ - return TranslationRotationScaleArrayState::create(*arrayState); -} - void TranslationRotationScaleArrayState::apply(const VertexInputState& vas) { getAttributeDetails(vas, vertex_attribute_location, vertexAttribute); @@ -373,21 +342,11 @@ DisplacementMapArrayState::DisplacementMapArrayState(const DisplacementMapArrayS { } -DisplacementMapArrayState::DisplacementMapArrayState(const ArrayState& rhs) : - Inherit(rhs) +DisplacementMapArrayState::DisplacementMapArrayState(const ArrayState& rhs, const CopyOp& copyop) : + Inherit(rhs, copyop) { } -ref_ptr DisplacementMapArrayState::cloneArrayState() -{ - return DisplacementMapArrayState::create(*this); -} - -ref_ptr DisplacementMapArrayState::cloneArrayState(ref_ptr arrayState) -{ - return DisplacementMapArrayState::create(*arrayState); -} - void DisplacementMapArrayState::apply(const DescriptorImage& di) { if (!di.imageInfoList.empty()) @@ -485,16 +444,6 @@ TranslationAndDisplacementMapArrayState::TranslationAndDisplacementMapArrayState { } -ref_ptr TranslationAndDisplacementMapArrayState::cloneArrayState() -{ - return TranslationAndDisplacementMapArrayState::create(*this); -} - -ref_ptr TranslationAndDisplacementMapArrayState::cloneArrayState(ref_ptr arrayState) -{ - return TranslationAndDisplacementMapArrayState::create(*arrayState); -} - void TranslationAndDisplacementMapArrayState::apply(const VertexInputState& vas) { getAttributeDetails(vas, vertex_attribute_location, vertexAttribute); @@ -562,16 +511,6 @@ BillboardArrayState::BillboardArrayState(const ArrayState& rhs) : { } -ref_ptr BillboardArrayState::cloneArrayState() -{ - return BillboardArrayState::create(*this); -} - -ref_ptr BillboardArrayState::cloneArrayState(ref_ptr arrayState) -{ - return BillboardArrayState::create(*arrayState); -} - void BillboardArrayState::apply(const VertexInputState& vas) { getAttributeDetails(vas, vertex_attribute_location, vertexAttribute); diff --git a/src/vsg/text/CpuLayoutTechnique.cpp b/src/vsg/text/CpuLayoutTechnique.cpp index 09db212c5a..975b4f4fa3 100644 --- a/src/vsg/text/CpuLayoutTechnique.cpp +++ b/src/vsg/text/CpuLayoutTechnique.cpp @@ -47,10 +47,7 @@ class VSG_DECLSPEC CpuLayoutTechniqueArrayState : public Inherit cloneArrayState() override - { - return CpuLayoutTechniqueArrayState::create(*this); - } + using Inherit::cloneArrayState; ref_ptr cloneArrayState(ref_ptr arrayState) override { diff --git a/src/vsg/text/GpuLayoutTechnique.cpp b/src/vsg/text/GpuLayoutTechnique.cpp index 387ac72de2..378b5a4a66 100644 --- a/src/vsg/text/GpuLayoutTechnique.cpp +++ b/src/vsg/text/GpuLayoutTechnique.cpp @@ -51,10 +51,7 @@ class VSG_DECLSPEC GpuLayoutTechniqueArrayState : public Inherit cloneArrayState() override - { - return GpuLayoutTechniqueArrayState::create(*this); - } + using Inherit::cloneArrayState; ref_ptr cloneArrayState(ref_ptr arrayState) override {