diff --git a/include/vsg/core/Inherit.h b/include/vsg/core/Inherit.h index 1278a5f17..7008c88f8 100644 --- a/include/vsg/core/Inherit.h +++ b/include/vsg/core/Inherit.h @@ -23,13 +23,12 @@ namespace vsg /// Inherit<> uses the Curiously Recurring Template Pattern /// to provide the classes versions of create, accept(..), RTTI and sizeofObject() + /// There's a layer of indirection to allow subclass-specific specialisation without copying and pasting everything template - class Inherit : public ParentClass + class InheritBase : public ParentClass { public: - template - Inherit(Args&&... args) : - ParentClass(std::forward(args)...) {} + using ParentClass::ParentClass; template static ref_ptr create(Args&&... args) @@ -72,4 +71,10 @@ namespace vsg void accept(RecordTraversal& visitor) const override { visitor.apply(static_cast(*this)); } }; + template + class Inherit : public InheritBase + { + using InheritBase::InheritBase; + }; + } // namespace vsg diff --git a/include/vsg/state/ArrayState.h b/include/vsg/state/ArrayState.h index 4c4897495..86daa4d4b 100644 --- a/include/vsg/state/ArrayState.h +++ b/include/vsg/state/ArrayState.h @@ -96,6 +96,27 @@ namespace vsg }; VSG_type_name(vsg::ArrayState); + template + class Inherit>> : public InheritBase + { + public: + using InheritBase::InheritBase; + + explicit Inherit(const ArrayState& rhs, const CopyOp& copyop = {}) : + InheritBase(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)); + } + }; + /// NullArrayState provides a mechanism for geometry in a subgraph to be ignored by traversals that use ArrayState such as ComputeBounds/Intersector/LineSegmentIntersector /// this is useful for subgraphs that have custom shaders that move the final rendered geometry to a different place that would be naively interpreted by a straight forward vec3Array vertex array in local coordinates. /// To disable the handling of geometry in a subgraph simply assign a NullArrayState to the StateGroup::prototypeArrayState, i.e. @@ -106,9 +127,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 +142,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 +160,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 +180,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 +216,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 +229,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 1a08fe9db..c9dc405b2 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 09db212c5..975b4f4fa 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 387ac72de..378b5a4a6 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 {