12class World3DSoftBodyAdapter final :
public softbody::ISoftBodyCollisionWorld {
14 explicit World3DSoftBodyAdapter(World3D*
world) : world_(
world) {}
16 [[nodiscard]]
bool softBodyCollisionAvailable() const noexcept
override {
17 return world_ && world_->isValid();
21 float x,
float y,
float z,
float radius, softbody::SoftBodyContact& contact)
const override {
26 ClothContact3D rigidContact;
27 if (!world_->pointProbe(
x,
y,
z,
radius, &rigidContact) || !rigidContact.hit ||
28 !rigidContact.body || !rigidContact.body->isValid())
31 lastBody_ = rigidContact.body;
33 contact.nx = rigidContact.nx;
34 contact.ny = rigidContact.ny;
35 contact.nz = rigidContact.nz;
36 contact.depth = rigidContact.depth;
37 contact.bodyId = lastBody_->getId();
38 contact.dynamicBody = lastBody_->getType() ==
"dynamic";
42 void applySoftBodyImpulse(
int bodyId,
float x,
float y,
float z)
override {
43 if (!lastBody_ || !lastBody_->isValid() || lastBody_->getId() != bodyId ||
44 lastBody_->getType() !=
"dynamic")
46 lastBody_->applyLinearImpulse(
x,
y,
z);
51 mutable Body3D* lastBody_ =
nullptr;
66#pragma warning(disable : 4273)
71 ownedCollisionWorld_ =
world ? std::make_unique<World3DSoftBodyAdapter>(
world) :
nullptr;
72 collisionWorld_ = ownedCollisionWorld_.get();
World3D * getCollideWorld() const
Returns the collide world.
void setCollideWorld(World3D *world)
Borrows a rigid-body world used for particle contacts.
Box3D rigid-body world. Script coordinates are meters (Box3D native), unlike 2D World which uses pixe...
SoftBodyContactState
Strong result of a particle contact probe.
Optional physics backend for vehicle mobility and body attach.