30 auto elementQuery = std::make_shared<NeighborElementQuery<TDataType>>();
31 elementQuery->varSelfCollision()->setValue(
false);
32 this->stateTopology()->connect(elementQuery->inDiscreteElements());
33 this->stateCollisionMask()->connect(elementQuery->inCollisionMask());
34 this->stateAttribute()->connect(elementQuery->inAttribute());
37 auto cdBV = std::make_shared<CollistionDetectionTriangleSet<TDataType>>();
38 this->stateTopology()->connect(cdBV->inDiscreteElements());
39 this->inTriangleSet()->connect(cdBV->inTriangleSet());
42 auto merge = std::make_shared<ContactsUnion<TDataType>>();
43 elementQuery->outContacts()->connect(merge->inContactsA());
44 cdBV->outContacts()->connect(merge->inContactsB());
47 auto iterSolver = std::make_shared<TJSoftConstraintSolver<TDataType>>();
48 this->stateTimeStep()->connect(iterSolver->inTimeStep());
49 this->varFrictionEnabled()->connect(iterSolver->varFrictionEnabled());
50 this->varGravityEnabled()->connect(iterSolver->varGravityEnabled());
51 this->varGravityValue()->connect(iterSolver->varGravityValue());
52 this->varFrictionCoefficient()->setValue(20.0f);
53 this->varSlop()->connect(iterSolver->varSlop());
54 this->stateMass()->connect(iterSolver->inMass());
55 this->stateCenter()->connect(iterSolver->inCenter());
56 this->stateVelocity()->connect(iterSolver->inVelocity());
57 this->stateAngularVelocity()->connect(iterSolver->inAngularVelocity());
58 this->stateRotationMatrix()->connect(iterSolver->inRotationMatrix());
59 this->stateInertia()->connect(iterSolver->inInertia());
60 this->stateQuaternion()->connect(iterSolver->inQuaternion());
61 this->stateInitialInertia()->connect(iterSolver->inInitialInertia());
62 this->stateAttribute()->connect(iterSolver->inAttribute());
63 this->stateFrictionCoefficients()->connect(iterSolver->inFrictionCoefficients());
65 this->stateTopology()->connect(iterSolver->inDiscreteElements());
67 merge->outContacts()->connect(iterSolver->inContacts());
71 this->inTriangleSet()->tagOptional(
true);
85 auto vehicles = this->getVehicles();
87 if (vehicles.size() > 0)
91 uint sizeOfRigidBodies = 0;
92 for (
uint i = 0; i < vehicles.size(); i++)
94 auto vehicle = vehicles[i];
96 auto inTopo = vehicle->stateTopology()->getDataPtr();
98 topos.pushBack(inTopo);
100 sizeOfRigidBodies += vehicle->stateMass()->size();
103 auto curTopo = this->stateTopology()->getDataPtr();
105 curTopo->merge(topos);
109 this->stateMass()->resize(sizeOfRigidBodies);
110 this->stateCenter()->resize(sizeOfRigidBodies);
111 this->stateVelocity()->resize(sizeOfRigidBodies);
112 this->stateAngularVelocity()->resize(sizeOfRigidBodies);
113 this->stateRotationMatrix()->resize(sizeOfRigidBodies);
114 this->stateInertia()->resize(sizeOfRigidBodies);
115 this->stateInitialInertia()->resize(sizeOfRigidBodies);
116 this->stateQuaternion()->resize(sizeOfRigidBodies);
117 this->stateCollisionMask()->resize(sizeOfRigidBodies);
118 this->stateAttribute()->resize(sizeOfRigidBodies);
119 this->stateFrictionCoefficients()->resize(sizeOfRigidBodies);
121 auto& stateMass = this->stateMass()->getData();
122 auto& stateCenter = this->stateCenter()->getData();
123 auto& stateVelocity = this->stateVelocity()->getData();
124 auto& stateAngularVelocity = this->stateAngularVelocity()->getData();
125 auto& stateRotationMatrix = this->stateRotationMatrix()->getData();
126 auto& stateInertia = this->stateInertia()->getData();
127 auto& stateInitialInertia = this->stateInitialInertia()->getData();
128 auto& stateQuaternion = this->stateQuaternion()->getData();
129 auto& stateCollisionMask = this->stateCollisionMask()->getData();
130 auto& stateAttribute = this->stateAttribute()->getData();
131 auto& stateFrictionCoefficients = this->stateFrictionCoefficients()->getData();
134 for (
uint i = 0; i < vehicles.size(); i++)
136 auto vehicle = vehicles[i];
138 uint num = vehicle->stateMass()->size();
140 stateMass.assign(vehicle->stateMass()->constData(), vehicle->stateMass()->size(), offset, 0);
141 stateCenter.assign(vehicle->stateCenter()->constData(), vehicle->stateCenter()->size(), offset, 0);
142 stateVelocity.assign(vehicle->stateVelocity()->constData(), vehicle->stateVelocity()->size(), offset, 0);
143 stateAngularVelocity.assign(vehicle->stateAngularVelocity()->constData(), vehicle->stateAngularVelocity()->size(), offset, 0);
144 stateRotationMatrix.assign(vehicle->stateRotationMatrix()->constData(), vehicle->stateRotationMatrix()->size(), offset, 0);
145 stateInertia.assign(vehicle->stateInertia()->constData(), vehicle->stateInertia()->size(), offset, 0);
146 stateInitialInertia.assign(vehicle->stateInitialInertia()->constData(), vehicle->stateInitialInertia()->size(), offset, 0);
147 stateQuaternion.assign(vehicle->stateQuaternion()->constData(), vehicle->stateQuaternion()->size(), offset, 0);
148 stateCollisionMask.assign(vehicle->stateCollisionMask()->constData(), vehicle->stateCollisionMask()->size(), offset, 0);
149 stateAttribute.assign(vehicle->stateAttribute()->constData(), vehicle->stateAttribute()->size(), offset, 0);
150 stateFrictionCoefficients.assign(vehicle->stateFrictionCoefficients()->constData(), vehicle->stateFrictionCoefficients()->size(), offset, 0);
156 hAttributes.assign(stateAttribute);
158 uint offsetBodyId = 0;
159 uint offsetOfRigidBody = 0;
160 for (
uint i = 0; i < vehicles.size(); i++)
162 auto vehicle = vehicles[i];
164 uint num = vehicle->stateMass()->size();
167 for (
uint j = 0; j < num; j++)
169 Attribute att = hAttributes[offsetOfRigidBody + j];
172 hAttributes[offsetOfRigidBody + j] = att;
174 maxBodyId = std::max(maxBodyId, att.
objectId());
177 offsetOfRigidBody += num;
178 offsetBodyId += (maxBodyId + 1);
181 stateAttribute.assign(hAttributes);
189 auto& vehicles = this->getVehicles();
191 if (vehicles.size() > 0)
194 for (
uint i = 0; i < vehicles.size(); i++)
196 auto vehicle = vehicles[i];
198 uint sizeOfInput = vehicle->stateMass()->size();
200 auto& stateMass = vehicle->stateMass()->getData();
201 auto& stateCenter = vehicle->stateCenter()->getData();
202 auto& stateVelocity = vehicle->stateVelocity()->getData();
203 auto& stateAngularVelocity = vehicle->stateAngularVelocity()->getData();
204 auto& stateRotationMatrix = vehicle->stateRotationMatrix()->getData();
205 auto& stateInertia = vehicle->stateInertia()->getData();
206 auto& stateInitialInertia = vehicle->stateInitialInertia()->getData();
207 auto& stateQuaternion = vehicle->stateQuaternion()->getData();
208 auto& stateCollisionMask = vehicle->stateCollisionMask()->getData();
209 auto& stateAttribute = vehicle->stateAttribute()->getData();
210 auto& stateFrictionCoefficients = vehicle->stateFrictionCoefficients()->getData();
213 stateMass.assign(this->stateMass()->constData(), sizeOfInput, 0, offset);
214 stateCenter.assign(this->stateCenter()->constData(), sizeOfInput, 0, offset);
215 stateVelocity.assign(this->stateVelocity()->constData(), sizeOfInput, 0, offset);
216 stateAngularVelocity.assign(this->stateAngularVelocity()->constData(), sizeOfInput, 0, offset);
217 stateRotationMatrix.assign(this->stateRotationMatrix()->constData(), sizeOfInput, 0, offset);
218 stateInertia.assign(this->stateInertia()->constData(), sizeOfInput, 0, offset);
219 stateInitialInertia.assign(this->stateInitialInertia()->constData(), sizeOfInput, 0, offset);
220 stateQuaternion.assign(this->stateQuaternion()->constData(), sizeOfInput, 0, offset);
221 stateCollisionMask.assign(this->stateCollisionMask()->constData(), sizeOfInput, 0, offset);
222 stateAttribute.assign(this->stateAttribute()->constData(), sizeOfInput, 0, offset);
223 stateFrictionCoefficients.assign(this->stateFrictionCoefficients()->constData(), sizeOfInput, 0, offset);
225 auto topo = vehicle->stateTopology()->getDataPtr();
227 auto& topoPos = topo->position();
228 auto& topoRot = topo->rotation();
230 topoPos.assign(this->stateCenter()->constData(), sizeOfInput, 0, offset);
231 topoRot.assign(this->stateRotationMatrix()->constData(), sizeOfInput, 0, offset);
234 offset += sizeOfInput;