polly-b-gone/room.cpp
2012-12-14 09:47:48 -08:00

175 lines
4.2 KiB
C++

// -*- C++ -*-
#include <algorithm>
#include <iostream>
#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<RoomObject*>::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<RoomObject*>::const_iterator i;
for (i = staticObjects_.begin(); i != staticObjects_.end(); i++) {
(*i)->model().display();
}
}
private:
const Room& room_;
std::vector<RoomObject*> 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<RoomObject*>::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<RoomObject*>::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<RoomObject*>::const_iterator io;
for (io = objects_.begin(); io != objects_.end(); io++) {
delete (*io);
}
std::vector<RoomOrigin*>::const_iterator ir;
for (ir = origins_.begin(); ir != origins_.end(); ir++) {
delete (*ir);
}
std::vector<Portal*>::const_iterator ip;
for (ip = portals_.begin(); ip != portals_.end(); ip++) {
delete (*ip);
}
std::vector<RoomForce*>::const_iterator ii;
for (ii = forces_.begin(); ii != forces_.end(); ii++) {
delete (*ii);
}
std::vector<Transform*>::const_iterator iz;
for (iz = transforms_.begin(); iz != transforms_.end(); iz++) {
delete (*iz);
}
std::vector<Trail*>::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<RoomObject*>::const_iterator i;
for (i = objects_.begin(); i != objects_.end(); i++) {
(*i)->resetForces();
}
}
void Room::applyForce(UnaryForce& force) {
std::vector<RoomObject*>::const_iterator i;
for (i = objects_.begin(); i != objects_.end(); i++) {
(*i)->applyForce(force);
}
}
void Room::step(const ParticleSimulator& s) {
std::vector<Transform*>::const_iterator ir;
for (ir = transforms_.begin(); ir != transforms_.end(); ir++) {
(*ir)->step();
}
std::vector<RoomObject*>::const_iterator i;
for (i = objects_.begin(); i != objects_.end(); i++) {
(*i)->step(s);
}
}
void Room::reset() {
std::vector<RoomObject*>::const_iterator i;
for (i = objects_.begin(); i != objects_.end(); i++) {
(*i)->reset();
}
std::vector<Transform*>::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) {
}