if(!result.body)
return {};
- auto i = lower_bound_member(collider_lookup, result.body, &Collider::physics_body);
- if(i==collider_lookup.end() || i->physics_body!=result.body)
- return {};
+ if(const Collider *c = lookup_member(collider_lookup, result.body, &Collider::physics_body))
+ return { c->shape, result.distance, result.position };
- return { i->shape, result.distance, result.position };
+ return {};
}
void PhysicsSystem::simulated_rigid_body_changed(SimulatedRigidBody &body)
}
}
+
void PhysicsSystem::early_tick()
{
for(Handle<Entity> e: pending)
- {
- auto i = lower_bound_member(rigid_bodies, e, &SimulatedRigidBody::entity);
- if(i==rigid_bodies.end() || i->entity!=e)
- continue;
-
- if(i->body && i->shape && !i->physics_body)
- {
- Handle<Transform> transform = i->entity->get_transform();
- Physics::MotionType motion = (i->motion ? Physics::DYNAMIC : Physics::STATIC);
- i->physics_body = make_unique<Physics::RigidBody>(world, i->shape->get_shape(), transform->get_position(), transform->get_rotation(), motion);
- unsigned layer = (motion==Physics::STATIC ? CollisionLayer::STATIC : CollisionLayer::MOVING);
- uint32_t collision_mask = (1<<CollisionLayer::STATIC) | (1<<CollisionLayer::MOVING);
- if(i->shape->is_raycast_target())
- collision_mask |= 1<<CollisionLayer::RAYCAST;
- i->physics_body->set_collisions(layer, collision_mask);
- auto j = lower_bound_member(collider_lookup, i->physics_body.get(), &Collider::physics_body);
- collider_lookup.emplace(j, i->physics_body.get(), i->shape);
- }
- }
+ 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();
+ Physics::MotionType motion = (srb->motion ? Physics::DYNAMIC : Physics::STATIC);
+ srb->physics_body = make_unique<Physics::RigidBody>(world, srb->shape->get_shape(), transform->get_position(), transform->get_rotation(), motion);
+
+ unsigned layer = (motion==Physics::STATIC ? CollisionLayer::STATIC : CollisionLayer::MOVING);
+ uint32_t collision_mask = (1<<CollisionLayer::STATIC) | (1<<CollisionLayer::MOVING);
+ if(srb->shape->is_raycast_target())
+ collision_mask |= 1<<CollisionLayer::RAYCAST;
+ srb->physics_body->set_collisions(layer, collision_mask);
+
+ auto j = lower_bound_member(collider_lookup, srb->physics_body.get(), &Collider::physics_body);
+ collider_lookup.emplace(j, srb->physics_body.get(), srb->shape);
+ }
pending.clear();
}
stage.iterate_objects<Possessed>([this](Possessed &p){
if(p.has_changed())
{
- auto i = lower_bound_member(entities, p.get_entity()->get_transform(), &ReplicatedEntity::transform);
- if(i!=entities.end() && i->possessed.get()==&p)
+ if(ReplicatedEntity *e = lookup_member(entities, p.get_entity()->get_transform(), &ReplicatedEntity::transform))
{
- event_source.emit<Events::PossessionChanged>(i->entity, p.get_player_id());
- if(i->visible_to_players && is_server())
- send_possession(*i, 0);
+ event_source.emit<Events::PossessionChanged>(e->entity, p.get_player_id());
+ if(e->visible_to_players && is_server())
+ send_possession(*e, 0);
}
p.clear_changed();
}
else if(auto possessed = dynamic_handle_cast<Possessed>(event.component))
{
Handle<Transform> transform = possessed->get_entity()->get_transform();
- auto i = lower_bound_member(entities, transform, &ReplicatedEntity::transform);
- if(i!=entities.end() && i->transform==transform)
- i->possessed = possessed;
+ if(ReplicatedEntity *e = lookup_member(entities, transform, &ReplicatedEntity::transform))
+ e->possessed = possessed;
}
}
void Renderer::component_destroyed(const Game::Events::ComponentDestroyed &event)
{
Game::Handle<Game::Entity> entity = event.component->get_entity();
- auto i = lower_bound_member(entities, entity, &RenderedEntity::entity);
- if(i!=entities.end() && i->entity==entity)
+ if(RenderedEntity *e = lookup_member(entities, entity, &RenderedEntity::entity))
{
if(dynamic_handle_cast<Game::Shape>(event.component))
- i->generated_mesh = nullptr;
+ e->generated_mesh = nullptr;
if(dynamic_handle_cast<Game::MeshSource>(event.component) || dynamic_handle_cast<DynamicMeshSource>(event.component))
- i->mesh_renderer = nullptr;
+ e->mesh_renderer = nullptr;
if(auto light = dynamic_handle_cast<Game::Light>(event.component))
{
- i->light_emitter = nullptr;
+ e->light_emitter = nullptr;
if(light->casts_shadows())
shadows_changed = true;
}