void PhysicsSystem::simulated_rigid_body_changed(SimulatedRigidBody &body)
{
- if(!body.physics_body)
+ if(body.body && body.shape && !body.physics_body && !body.pending_create)
{
- auto i = lower_bound(pending, body.entity);
- if(i==pending.end() || *i!=body.entity)
- pending.insert(i, body.entity);
+ pending.push_back(body.entity);
+ body.pending_create = true;
}
- else if(!body.body)
+ else if(body.physics_body && !body.body)
{
auto i = lower_bound_member(collider_lookup, body.physics_body.get(), &Collider::physics_body);
if(i!=collider_lookup.end() && i->physics_body==body.physics_body.get())
{
for(Handle<Entity> e: pending)
if(SimulatedRigidBody *srb = lookup_member(rigid_bodies, e, &SimulatedRigidBody::entity))
+ {
if(srb->body && srb->shape && !srb->physics_body)
{
Handle<Transform> transform = srb->entity->get_transform();
auto j = lower_bound_member(collider_lookup, srb->physics_body.get(), &Collider::physics_body);
collider_lookup.emplace(j, srb->physics_body.get(), srb->shape);
}
+
+ srb->pending_create = false;
+ }
pending.clear();
}
uint8_t transform_generation = 0;
uint8_t motion_generation = 0;
uint8_t body_generation = 0;
+ bool pending_create = false;
using Components = ArchetypeComponents<&SimulatedRigidBody::body, &SimulatedRigidBody::shape, &SimulatedRigidBody::motion>;