// -*- C++ -*- #include #include #include "lighting.h" #include "physics/transform.h" #include "physics/vector.h" #include "portal.h" #include "room.h" #include "room_force.h" #include "room_object.h" #include "sound.h" #include "trail.h" #include "world.h" using namespace mbostock; class RoomStaticModel : public Model { public: RoomStaticModel(const Room& room) : room_(room) {} virtual void initialize() { staticObjects_.clear(); std::vector::const_iterator i; for (i = room_.objects().begin(); i != room_.objects().end(); i++) { RoomObject* o = *i; if (!o->dynamic()) { o->model().initialize(); staticObjects_.push_back(o); } } } virtual void display() { std::vector::const_iterator i; for (i = staticObjects_.begin(); i != staticObjects_.end(); i++) { (*i)->model().display(); } } private: const Room& room_; std::vector staticObjects_; }; RoomModel::RoomModel(const Room& room) : room_(room), staticModel_(Models::compile(new RoomStaticModel(room))) { } RoomModel::~RoomModel() { delete staticModel_; } void RoomModel::initialize() { room_.lighting().initialize(); staticModel_->initialize(); dynamicObjects_.clear(); std::vector::const_iterator i; for (i = room_.objects().begin(); i != room_.objects().end(); i++) { RoomObject* o = *i; if (o->dynamic()) { o->model().initialize(); dynamicObjects_.push_back(o); } } } void RoomModel::display() { if (World::world()->paused()) { World::world()->pauseLighting().display(); } else { room_.lighting().display(); } staticModel_->display(); std::vector::const_iterator i; for (i = dynamicObjects_.begin(); i != dynamicObjects_.end(); i++) { (*i)->model().display(); } } Room::Room() : lighting_(&(Lightings::standard())), music_(NULL), cameraBounds_(-Vector::INF(), Vector::INF()), model_(*this), trail_(NULL) { } Room::~Room() { std::vector::const_iterator io; for (io = objects_.begin(); io != objects_.end(); io++) { delete (*io); } std::vector::const_iterator ir; for (ir = origins_.begin(); ir != origins_.end(); ir++) { delete (*ir); } std::vector::const_iterator ip; for (ip = portals_.begin(); ip != portals_.end(); ip++) { delete (*ip); } std::vector::const_iterator ii; for (ii = forces_.begin(); ii != forces_.end(); ii++) { delete (*ii); } std::vector::const_iterator iz; for (iz = transforms_.begin(); iz != transforms_.end(); iz++) { delete (*iz); } std::vector::const_iterator it; for (it = trails_.begin(); it != trails_.end(); it++) { delete (*it); } if (trail_ != NULL) { delete trail_; } } void Room::nextTrail(const Vector& origin) { if (trail_ != NULL) { trails_.push_back(trail_); } trail_ = new Trail(origin); } void Room::setMusic(const Sound& music) { music_ = &music; } void Room::setLighting(const Lighting& lighting) { lighting_ = &lighting; } void Room::setCameraBounds(const Vector& min, const Vector& max) { cameraBounds_ = AxisAlignedBox(min, max); } void Room::resetForces() { std::vector::const_iterator i; for (i = objects_.begin(); i != objects_.end(); i++) { (*i)->resetForces(); } } void Room::applyForce(UnaryForce& force) { std::vector::const_iterator i; for (i = objects_.begin(); i != objects_.end(); i++) { (*i)->applyForce(force); } } void Room::step(const ParticleSimulator& s) { std::vector::const_iterator ir; for (ir = transforms_.begin(); ir != transforms_.end(); ir++) { (*ir)->step(); } std::vector::const_iterator i; for (i = objects_.begin(); i != objects_.end(); i++) { (*i)->step(s); } } void Room::reset() { std::vector::const_iterator i; for (i = objects_.begin(); i != objects_.end(); i++) { (*i)->reset(); } std::vector::const_iterator iz; for (iz = transforms_.begin(); iz != transforms_.end(); iz++) { (*iz)->reset(); } } RoomOrigin::RoomOrigin(const Vector& position, const Vector& velocity) : position_(position), velocity_(velocity) { }