diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.h index 0ed5e57fbd9..e655dd2f9c0 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.h @@ -79,15 +79,19 @@ class BarycentricPenalityContact : public core::collision::Contact public: void cleanup() override; - std::pair getCollisionModels() override { return std::make_pair(model1,model2); } + void draw(const core::visual::VisualParams* vparams) override; - void setDetectionOutputs(OutputVector* outputs) override; +protected: + std::pair doGetCollisionModels() override + { + return std::make_pair(model1,model2); + } - void createResponse(core::objectmodel::BaseContext* group) override; + void doSetDetectionOutputs(OutputVector* outputs) override; - void removeResponse() override; + void doCreateResponse(core::objectmodel::BaseContext* group) override; - void draw(const core::visual::VisualParams* vparams) override; + void doRemoveResponse() override; }; diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.inl index 1652a782b3e..97b4258043e 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.inl +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricPenalityContact.inl @@ -66,7 +66,7 @@ void BarycentricPenalityContact -void BarycentricPenalityContact::setDetectionOutputs(OutputVector* o) +void BarycentricPenalityContact::doSetDetectionOutputs(OutputVector* o) { TOutputVector& outputs = *static_cast(o); if (ff==nullptr) @@ -188,7 +188,7 @@ void BarycentricPenalityContact -void BarycentricPenalityContact::createResponse(core::objectmodel::BaseContext* group) +void BarycentricPenalityContact::doCreateResponse(core::objectmodel::BaseContext* group) { if (ff!=nullptr) { @@ -207,7 +207,7 @@ void BarycentricPenalityContact -void BarycentricPenalityContact::removeResponse() +void BarycentricPenalityContact::doRemoveResponse() { if (ff!=nullptr) { diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h index 07da452b284..beadb24f438 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.h @@ -74,14 +74,6 @@ class BarycentricStickContact : public core::collision::Contact void cleanup() override; - std::pair getCollisionModels() override { return std::make_pair(model1,model2); } - - void setDetectionOutputs(OutputVector* outputs) override; - - void createResponse(core::objectmodel::BaseContext* group) override; - - void removeResponse() override; - /// Return true if this contact should be kept alive, even if objects are no longer in collision bool keepAlive() override { return d_keepAlive.getValue(); } @@ -89,6 +81,18 @@ class BarycentricStickContact : public core::collision::Contact void setKeepAlive(bool val) override { d_keepAlive.setValue(val); } void draw(const core::visual::VisualParams* vparams) override; + +protected: + std::pair doGetCollisionModels() override + { + return std::make_pair(model1,model2); + } + + void doSetDetectionOutputs(OutputVector* outputs) override; + + void doCreateResponse(core::objectmodel::BaseContext* group) override; + + void doRemoveResponse() override; }; } // namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.inl index 5a7aa8f3aec..1fd89e38a56 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.inl +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BarycentricStickContact.inl @@ -57,7 +57,7 @@ void BarycentricStickContact -void BarycentricStickContact::setDetectionOutputs(OutputVector* o) +void BarycentricStickContact::doSetDetectionOutputs(OutputVector* o) { if (o==nullptr) return; TOutputVector& outputs = *static_cast(o); @@ -184,7 +184,7 @@ void BarycentricStickContact -void BarycentricStickContact::createResponse(core::objectmodel::BaseContext* group) +void BarycentricStickContact::doCreateResponse(core::objectmodel::BaseContext* group) { if (ff!=nullptr) { @@ -203,7 +203,7 @@ void BarycentricStickContact -void BarycentricStickContact::removeResponse() +void BarycentricStickContact::doRemoveResponse() { if (ff!=nullptr) { diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h index 514add26c00..9176169a426 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.h @@ -75,19 +75,26 @@ class BaseUnilateralContactResponse : public core::collision::Contact, public Co BaseUnilateralContactResponse(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod); ~BaseUnilateralContactResponse() override; + public: void cleanup() override; - std::pair getCollisionModels() override { return std::make_pair(model1,model2); } + virtual ConstraintParameters getParameterFromDatas() const = 0; - void setDetectionOutputs(OutputVector* outputs) override; + virtual void setupConstraint(MechanicalState1 *,MechanicalState2 *) = 0; - void createResponse(core::objectmodel::BaseContext* group) override; +protected: + std::pair doGetCollisionModels() override + { + return std::make_pair(model1,model2); + } - void removeResponse() override; + void doSetDetectionOutputs(OutputVector* outputs) override; - virtual ConstraintParameters getParameterFromDatas() const = 0; - virtual void setupConstraint(MechanicalState1 *,MechanicalState2 *) = 0; + void doCreateResponse(core::objectmodel::BaseContext* group) override; + + void doRemoveResponse() override; + }; } // namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl index 57c1ef6eccb..8c13dc3821d 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/BaseUnilateralContactResponse.inl @@ -85,7 +85,7 @@ void BaseUnilateralContactResponse -void BaseUnilateralContactResponse::setDetectionOutputs(OutputVector* o) +void BaseUnilateralContactResponse::doSetDetectionOutputs(OutputVector* o) { TOutputVector& outputs = *static_cast(o); // We need to remove duplicate contacts @@ -198,7 +198,7 @@ void BaseUnilateralContactResponse -void BaseUnilateralContactResponse::createResponse(core::objectmodel::BaseContext* group) +void BaseUnilateralContactResponse::doCreateResponse(core::objectmodel::BaseContext* group) { activateMappers(); @@ -238,7 +238,7 @@ void BaseUnilateralContactResponse -void BaseUnilateralContactResponse::removeResponse() +void BaseUnilateralContactResponse::doRemoveResponse() { if (m_constraint) { diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RayContact.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RayContact.h index 293b324f83e..fb252642719 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RayContact.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/RayContact.h @@ -36,6 +36,11 @@ class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseRayContact : public core public: typedef collision::geometry::RayCollisionModel CollisionModel1; + const sofa::type::vector& getDetectionOutputs() const + { + return collisions; + } + protected: CollisionModel1* model1; sofa::type::vector collisions; @@ -44,14 +49,12 @@ class SOFA_COMPONENT_COLLISION_RESPONSE_CONTACT_API BaseRayContact : public core BaseRayContact(CollisionModel1* model1, core::collision::Intersection* instersectionMethod); ~BaseRayContact() override; -public: - const sofa::type::vector& getDetectionOutputs() const { return collisions; } - void createResponse(core::objectmodel::BaseContext* /*group*/) override + void doCreateResponse(core::objectmodel::BaseContext* /*group*/) override { } - void removeResponse() override + void doRemoveResponse() override { } @@ -68,13 +71,15 @@ class RayContact : public BaseRayContact protected: CollisionModel2* model2; core::objectmodel::BaseContext* parent; + public: RayContact(CollisionModel1* model1, CollisionModel2* model2, Intersection* intersectionMethod) : BaseRayContact(model1, intersectionMethod), model2(model2) { } - void setDetectionOutputs(core::collision::DetectionOutputVector* outputs) override +protected: + void doSetDetectionOutputs(core::collision::DetectionOutputVector* outputs) override { OutputVector* o = static_cast(outputs); //collisions = outputs; @@ -83,7 +88,11 @@ class RayContact : public BaseRayContact collisions[i] = &(*o)[i]; } - std::pair getCollisionModels() override { return std::make_pair(model1,model2); } + std::pair doGetCollisionModels() override + { + return std::make_pair(model1,model2); + } + }; } //namespace sofa::component::collision::response::contact diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h index c61561238a0..eb0551d05c9 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.h @@ -81,13 +81,17 @@ class StickContactConstraint : public core::collision::Contact, public ContactId void cleanup() override; - std::pair getCollisionModels() override { return std::make_pair(model1,model2); } +protected: + std::pair doGetCollisionModels() override + { + return std::make_pair(model1,model2); + } - void setDetectionOutputs(OutputVector* outputs) override; + void doSetDetectionOutputs(OutputVector* outputs) override; - void createResponse(core::objectmodel::BaseContext* group) override; + void doCreateResponse(core::objectmodel::BaseContext* group) override; - void removeResponse() override; + void doRemoveResponse() override; }; diff --git a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.inl b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.inl index 4a4582f2df6..d03c3234026 100644 --- a/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.inl +++ b/Sofa/Component/Collision/Response/Contact/src/sofa/component/collision/response/contact/StickContactConstraint.inl @@ -79,7 +79,7 @@ void StickContactConstraint::cleanup() template < class TCollisionModel1, class TCollisionModel2 > -void StickContactConstraint::setDetectionOutputs(OutputVector* o) +void StickContactConstraint::doSetDetectionOutputs(OutputVector* o) { this->f_printLog.setValue(true); msg_info() << "setDetectionOutputs(" << (o == nullptr ? -1 : (int)static_cast(o)->size()) << ")"; @@ -178,7 +178,7 @@ void StickContactConstraint::activateMappers( } template < class TCollisionModel1, class TCollisionModel2 > -void StickContactConstraint::createResponse(core::objectmodel::BaseContext* group) +void StickContactConstraint::doCreateResponse(core::objectmodel::BaseContext* group) { msg_info() << "->createResponse(" << group->getName() << ")"; if (!contacts.empty() || !keepAlive()) @@ -217,7 +217,7 @@ void StickContactConstraint::createResponse(c } template < class TCollisionModel1, class TCollisionModel2 > -void StickContactConstraint::removeResponse() +void StickContactConstraint::doRemoveResponse() { msg_info() << "->removeResponse()"; if (m_constraint) diff --git a/Sofa/framework/Core/src/sofa/core/collision/Contact.h b/Sofa/framework/Core/src/sofa/core/collision/Contact.h index 8e380b36a92..4d6513f2f27 100644 --- a/Sofa/framework/Core/src/sofa/core/collision/Contact.h +++ b/Sofa/framework/Core/src/sofa/core/collision/Contact.h @@ -59,15 +59,65 @@ class SOFA_CORE_API Contact : public virtual objectmodel::BaseObject Contact& operator=(const Contact& n) = delete; public: - /// Get the pair of collision models which are in contact - virtual std::pair< core::CollisionModel*, core::CollisionModel* > getCollisionModels() = 0; + /** + * !!! WARNING since v25.12 !!! + * + * The template method pattern has been applied to this part of the API. + * This method calls the newly introduced method "doGetCollisionModels" internally, + * which is the method to override from now on. + * + * Get the pair of collision models which are in contact + * + **/ + virtual std::pair< core::CollisionModel*, core::CollisionModel* > getCollisionModels() final + { + //TODO (SPRINT SED 2025): Component state mechamism + return this->doGetCollisionModels(); + }; - /// Set the generic description of a contact point - virtual void setDetectionOutputs(DetectionOutputVector* outputs) = 0; + /** + * !!! WARNING since v25.12 !!! + * + * The template method pattern has been applied to this part of the API. + * This method calls the newly introduced method "doSetDetectionOuputs" internally, + * which is the method to override from now on. + * + * Set the generic description of a contact point + * + **/ + virtual void setDetectionOutputs(DetectionOutputVector* outputs) final + { + //TODO (SPRINT SED 2025): Component state mechamism + this->doSetDetectionOutputs(outputs); + }; - virtual void createResponse(objectmodel::BaseContext* group) = 0; + /** + * !!! WARNING since v25.12 !!! + * + * The template method pattern has been applied to this part of the API. + * This method calls the newly introduced method "doCreateResponse" internally, + * which is the method to override from now on. + * + **/ + virtual void createResponse(objectmodel::BaseContext* group) final + { + //TODO (SPRINT SED 2025): Component state mechamism + this->doCreateResponse(group); + }; - virtual void removeResponse() = 0; + /** + * !!! WARNING since v25.12 !!! + * + * The template method pattern has been applied to this part of the API. + * This method calls the newly introduced method "doRemoveResponse" internally, + * which is the method to override from now on. + * + **/ + virtual void removeResponse() final + { + //TODO (SPRINT SED 2025): Component state mechamism + this->doRemoveResponse(); + }; /// Return true if this contact should be kept alive, even if objects are no longer in collision virtual bool keepAlive() { return false; } @@ -108,5 +158,17 @@ class SOFA_CORE_API Contact : public virtual objectmodel::BaseObject return sofa::core::objectmodel::New(model1, model2, inter); } +protected: + /// Get the pair of collision models which are in contact + virtual std::pair< core::CollisionModel*, core::CollisionModel* > doGetCollisionModels() = 0; + + /// Set the generic description of a contact point + virtual void doSetDetectionOutputs(DetectionOutputVector* outputs) = 0; + + virtual void doCreateResponse(objectmodel::BaseContext* group) = 0; + + virtual void doRemoveResponse() = 0; + + }; } // namespace sofa::core::collision diff --git a/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.h b/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.h index 6eaf25d9bc3..e55a9dbbb32 100644 --- a/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.h +++ b/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.h @@ -133,20 +133,21 @@ class PersistentFrictionContact : public response::contact::FrictionContact findMappingOrUseMapper(); diff --git a/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.inl b/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.inl index a9a219b805a..19e07fe5e60 100644 --- a/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.inl +++ b/applications/plugins/PersistentContact/src/PersistentContact/PersistentFrictionContact.inl @@ -307,7 +307,7 @@ void PersistentFrictionContact::resetConstrai template < class TCollisionModel1, class TCollisionModel2 > -void PersistentFrictionContact::setDetectionOutputs(OutputVector* o) +void PersistentFrictionContact::doSetDetectionOutputs(OutputVector* o) { DetectionOutputVector filteredOutputs; @@ -628,7 +628,7 @@ void PersistentFrictionContact::activateConst template < class TCollisionModel1, class TCollisionModel2 > -void PersistentFrictionContact::createResponse(core::objectmodel::BaseContext* group) +void PersistentFrictionContact::doCreateResponse(core::objectmodel::BaseContext* group) { use_mapper_for_state1 = !findMappingOrUseMapper(mstate1, constraintModel1, map1); use_mapper_for_state2 = !findMappingOrUseMapper(mstate2, constraintModel2, map2); @@ -713,7 +713,7 @@ void PersistentFrictionContact::createRespons template < class TCollisionModel1, class TCollisionModel2 > -void PersistentFrictionContact::removeResponse() +void PersistentFrictionContact::doRemoveResponse() { if (this->m_constraint) { diff --git a/applications/plugins/SofaDistanceGrid/extensions/CUDA/src/SofaDistanceGrid/CUDA/CudaCollisionDistanceGrid.cpp b/applications/plugins/SofaDistanceGrid/extensions/CUDA/src/SofaDistanceGrid/CUDA/CudaCollisionDistanceGrid.cpp index de319b296d6..8a8b2de74b7 100644 --- a/applications/plugins/SofaDistanceGrid/extensions/CUDA/src/SofaDistanceGrid/CUDA/CudaCollisionDistanceGrid.cpp +++ b/applications/plugins/SofaDistanceGrid/extensions/CUDA/src/SofaDistanceGrid/CUDA/CudaCollisionDistanceGrid.cpp @@ -49,7 +49,7 @@ namespace sofa::component::collision::response::contact using namespace sofa::gpu::cuda; template <> -void BarycentricPenalityContact::setDetectionOutputs(OutputVector* o) +void BarycentricPenalityContact::doSetDetectionOutputs(OutputVector* o) { GPUDetectionOutputVector& outputs = *dynamic_cast(o); //const bool printLog = this->f_printLog.getValue(); @@ -101,7 +101,7 @@ void BarycentricPenalityContact -void BarycentricPenalityContact::setDetectionOutputs(OutputVector* o) +void BarycentricPenalityContact::doSetDetectionOutputs(OutputVector* o) { GPUDetectionOutputVector& outputs = *dynamic_cast(o);