Program Listing for File Node.h#
↰ Return to documentation for file (include/Karana/SOADyn/Node.h)
/*
*Copyright(c)2024-2026KaranaDynamicsPtyLtd.Allrightsreserved.
*
*NOTICETOUSER:
*
*Thissourcecodeand/ordocumentation(the"LicensedMaterials")is
*theconfidentialandproprietaryinformationofKaranaDynamicsInc.
*UseoftheseLicensedMaterialsisgovernedbythetermsandconditions
*ofaseparatesoftwarelicenseagreementbetweenKaranaDynamicsandthe
*Licensee("LicenseAgreement").Unlessexpresslypermittedunderthat
*agreement,anyreproduction,modification,distribution,ordisclosure
*oftheLicensedMaterials,inwholeorinpart,toanythirdparty
*withoutthepriorwrittenconsentofKaranaDynamicsisstrictlyprohibited.
*
*THELICENSEDMATERIALSAREPROVIDED"ASIS"WITHOUTWARRANTYOFANYKIND.
*KARANADYNAMICSDISCLAIMSALLWARRANTIES,EXPRESSORIMPLIED,INCLUDING
*BUTNOTLIMITEDTOWARRANTIESOFMERCHANTABILITY,NON-INFRINGEMENT,AND
*FITNESSFORAPARTICULARPURPOSE.
*
*INNOEVENTSHALLKARANADYNAMICSBELIABLEFORANYDAMAGESWHATSOEVER,
*INCLUDINGBUTNOTLIMITEDTOLOSSOFPROFITS,DATA,ORUSE,EVENIF
*ADVISEDOFTHEPOSSIBILITYOFSUCHDAMAGES,WHETHERINCONTRACT,TORT,
*OROTHERWISEARISINGOUTOFORINCONNECTIONWITHTHELICENSEDMATERIALS.
*
*U.S.GovernmentEndUsers:TheLicensedMaterialsarea"commercialitem"
*asdefinedat48C.F.R.2.101,andareprovidedtotheU.S.Government
*onlyasacommercialenditemunderthetermsofthislicense.
*
*AnyuseoftheLicensedMaterialsinindividualorcommercialsoftwaremust
*include,intheuserdocumentationandinternalsourcecodecomments,
*thisNotice,Disclaimer,andU.S.GovernmentUseProvision.
*/
#pragmaonce
#include"Karana/Frame/Frame.h"
#include"Karana/KCore/DataCache.h"
#include"Karana/Math/HomTran.h"
#include"Karana/ProxyScene/ProxyScene.h"
namespaceKarana::Dynamics{
namespacekc=Karana::Core;
namespacekf=Karana::Frame;
namespacekm=Karana::Math;
namespaceks=Karana::Scene;
classPhysicalBody;
classPinSubhinge;
classSubhingeBase;
classNode;
classMultibody;
classLoopConstraintBase;
structStickPartsConfig;
classNodeDeformationProvider:publickc::Base{
//foraccessto_getParams,_setParams
friendclassPhysicalBody;
public:
NodeDeformationProvider(std::string_viewname,kc::ks_ptr<Node>node)
:Base(name)
,_nd(node){}
~NodeDeformationProvider(){_nd.reset();}
protected:
structDeformationParams{
km::HomTran
body_to_node_transform;
DeformationParams()=default;
DeformationParams&operator=(constDeformationParams*p){
if(this!=p){
body_to_node_transform=p->body_to_node_transform;
}
return*this;
}
};
protected:
virtualkc::ks_ptr<DeformationParams>_getParams()const=0;
virtualvoid_setParams(constDeformationParams¶ms)=0;
protected:
kc::ks_ptr<Node>_nd=nullptr;
};
classNode:publickf::Frame{
//foraccessto_parent_body
friendclassPhysicalBody;
//foraccessto_deformation_provider
friendclassPhysicalModalBody;
//foraccessto_newtonian2node_f2f
friendclassCompoundSubhinge;
friendclassMultibody;
friendclassSubGraph;
friendclassPhysicalSubhinge;
//foraccesstoexternal_force_cache
friendclassHingePnode;
public:
statickc::ks_ptr<Node>
lookupOrCreate(std::string_viewname,kc::ks_ptr<PhysicalBody>bd,boolforce_node=false);
statickc::ks_ptr<Node>lookupOrCreateContact(constkc::ks_ptr<PhysicalBody>&bd,
constkm::HomTran&T,
std::string_viewname="");
virtualvoiddetach();
Node(std::string_viewname,constkc::ks_ptr<PhysicalBody>&bd);
virtual~Node();
constkc::ks_ptr<PhysicalBody>&parentBody()const{return_parent_body;}
boolisReady()constoverride;
voidsetBodyToNodeTransform(constkm::HomTran&t);
km::HomTrangetBodyToNodeTransform()const;
boolisExternalForceNode()const;
km::SpatialVectornodeObservedSpatialAccel()const;
constkm::SpatialVector&getSpForce()const{return_external_force_cache->get();}
virtualvoidsetExternalSpForce(constkm::SpatialVector&spforce,
constkc::ks_ptr<kf::Frame>&ref_frame=nullptr);
virtualvoidaccumExternalSpForce(constkm::SpatialVector&spforce,
constkc::ks_ptr<kf::Frame>&ref_frame=nullptr);
constkc::ks_ptr<NodeDeformationProvider>&deformationProvider()const{
return_deformation_provider;
}
std::stringdumpString(std::string_viewprefix,
constKarana::Core::Base::DumpOptions*options)constoverride;
kc::ks_ptr<kf::OrientedChainedFrameToFrame>newtonianToNodeFrameToFrame()const;
protected:
void_clearExternals();
void_discard(kc::ks_ptr<kc::Base>&base)override;
void_createStickParts(kc::ks_ptr<ks::ProxyScene>&scene,
constStickPartsConfig&c,
booladd_sphere);
protected:
kc::ks_ptr<PhysicalBody>_parent_body=nullptr;
km::SpatialVector_node_frame_spforce;
kc::ks_ptr<kc::DataCache<km::SpatialVector>>_external_force_cache=nullptr;
kc::ks_ptr<kf::OrientedChainedFrameToFrame>_newtonian2node_f2f=nullptr;
kc::ks_ptr<kf::OrientedChainedFrameToFrame>_pnode2node_f2f=nullptr;
kc::ks_ptr<NodeDeformationProvider>_deformation_provider=nullptr;
kc::ks_ptr<Multibody>_multibody=nullptr;
};
classConstraintNode:publicNode{
//foraccesstosetExternalSpForce
friendclassLoopConstraintBase;
friendclassCECompoundBody;
//foraccesstosetExternalSpForceT
friendclassLoopConstraintCutJoint;
friendclassLoopConstraintConVel;
friendclassAlgorithms;
public:
statickc::ks_ptr<ConstraintNode>lookupOrCreate(std::string_viewname,
kc::ks_ptr<PhysicalBody>bd);
ConstraintNode(std::string_viewname,kc::ks_ptr<PhysicalBody>bd)
:Node(name,bd){};
kc::ks_ptr<LoopConstraintBase>loopConstraint()const;
protected:
voiddetach()override;
voidsetExternalSpForce(constkm::SpatialVector&spforce,
constkc::ks_ptr<kf::Frame>&ref_frame=nullptr)override;
void_discard(kc::ks_ptr<kc::Base>&base)override;
protected:
kc::ks_ptr<LoopConstraintBase>_loop_constraint=nullptr;
};
}//namespaceKarana::Dynamics