1#include "ConstraintSystem.h"
3#include "Systems/Core/TransformSystem.h"
5#include "ExtensionRegistry.h"
7#include "Services/Services.h"
9#include "PhysicsManager.h"
10#include "RigidBodySystem.h"
12#include "Foundation/ComponentModel/Entity.h"
18 template<
typename ComponentType,
typename SystemType>
19 void removeConstraint(
Context * context, SystemType * system, ComponentType * component)
23 auto & data = system->getData(component);
25 if (data.constraint) {
26 manager->removeConstraint(data.constraint.get());
32 auto rigidBodySystem = ExtensionRegistry::getExtensionSystem<RigidBodySystem>(context);
37 if (!rigidA || !rigidB)
return;
39 auto & dataA = rigidBodySystem->getData(rigidA);
40 auto & dataB = rigidBodySystem->getData(rigidB);
42 data.rigidBody = dataA.rigidBody.get();
43 data.targetRigidBody = dataB.rigidBody.get();
45 if (dataA.rigidBody && dataB.rigidBody) {
46 dataA.rigidBody->setActivationState(DISABLE_DEACTIVATION);
47 dataB.rigidBody->setActivationState(DISABLE_DEACTIVATION);
49 if (updateTransform) {
53 context->transformSystem->updateLocalToWorldTransform(*transformComponentA,
true);
54 data.transform = context->transformSystem->getLocalToWorld(transformComponentA);
56 context->transformSystem->updateLocalToWorldTransform(*transformComponentB,
true);
57 data.targetTransform = context->transformSystem->getLocalToWorld(transformComponentB);
67 for (
auto & component :
pool) {
68 auto & data = getData(&component);
70 if (!data.constraint || component.
hasChanged()) {
71 updateConstraintData(
context, &component, data);
73 if (!data.rigidBody || !data.targetRigidBody)
continue;
75 auto positionA = glm::vec4(data.transform[3]);
76 auto positionB = glm::vec4(data.targetTransform[3]);
78 btTransform tA = btTransform(btQuaternion(0, 0, 0));
79 btTransform tB = btTransform(btQuaternion(0, 0, 0), toBullet(positionA - positionB));
80 auto constraint = data.createConstraint<btFixedConstraint>(*data.rigidBody, *data.targetRigidBody, tA, tB);
82 manager->addConstraint(constraint);
98 for (
auto & component : pool) {
99 auto & data = getData(&component);
101 if (!data.constraint || component.
hasChanged()) {
102 updateConstraintData(context, &component, data);
104 if (!data.rigidBody || !data.targetRigidBody)
continue;
106 auto constraint = data.createConstraint<btHingeConstraint>(
108 *data.targetRigidBody,
109 toBullet(component.anchor),
110 toBullet(component.targetAnchor),
111 toBullet(component.axis),
112 toBullet(component.targetAxis),
115 manager->addConstraint(constraint);
131 for (
auto & component : pool) {
132 auto & data = getData(&component);
134 if (!data.constraint || component.
hasChanged()) {
135 updateConstraintData(context, &component, data);
137 if (!data.rigidBody || !data.targetRigidBody)
continue;
139 auto positionA = glm::vec3(data.transform[3]);
140 auto positionB = glm::vec3(data.targetTransform[3]);
142 btTransform tA = btTransform(btQuaternion(0, 0, 0));
143 btTransform tB = btTransform(btQuaternion(0, 0, 0), toBullet((positionA + component.anchor) - (positionB + component.targetAnchor)));
145 auto constraint = data.createConstraint<btGeneric6DofSpring2Constraint>(*data.rigidBody, *data.targetRigidBody, tA, tB);
147 for (
int i = 0; i < 6; ++i) {
148 constraint->enableSpring(i,
true);
149 constraint->setLimit(i, -10, 10);
150 constraint->setStiffness(i, component.stiffness);
151 constraint->setDamping(i, component.damping);
152 constraint->setEquilibriumPoint(i, 0);
155 manager->addConstraint(constraint);
171 for (
auto & component : pool) {
172 auto & data = getData(&component);
174 if (!data.constraint || component.
hasChanged()) {
175 updateConstraintData(context, &component, data);
177 if (!data.rigidBody || !data.targetRigidBody)
continue;
179 auto positionA = glm::vec3(data.transform[3]);
180 auto positionB = glm::vec3(data.targetTransform[3]);
182 btTransform tA = btTransform(btQuaternion(0, 0, 0));
183 btTransform tB = btTransform(btQuaternion(0, 0, 0), toBullet((positionA + component.anchor) - (positionB + component.targetAnchor)));
185 auto constraint = data.createConstraint<btGeneric6DofSpring2Constraint>(*data.rigidBody, *data.targetRigidBody, tA, tB);
187 manager->addConstraint(constraint);
ComponentType * getComponent() const
Context * context
Pointer to the Context instance the system lives in.
virtual void destroyComponent(ComponentHandle)
Destroy the component held by the given handle.
void update()
Updates the system state to that of the current frame.
ComponentPool< ComponentType > pool
Pool of components managed by the system.
EntityPtr target
Target entity. Constraint is created between owner of this component and target.
A Context instance contains all the services, systems and runtime components needed to use Cogs.
std::unique_ptr< class Services > services
Services.
void destroyComponent(ComponentHandle component) final
Destroy the component held by the given handle.
void destroyComponent(ComponentHandle component) final
Destroy the component held by the given handle.
void destroyComponent(ComponentHandle component) final
Destroy the component held by the given handle.
void destroyComponent(ComponentHandle component) final
Destroy the component held by the given handle.
Contains the Engine, Renderer, resource managers and other systems needed to run Cogs....
Handle to a Component instance.
ComponentType * resolveComponent() const