50 lines
1.2 KiB
C++
50 lines
1.2 KiB
C++
// -*- C++ -*-
|
|
|
|
#include "escalator.h"
|
|
#include "material.h"
|
|
#include "model.h"
|
|
#include "physics/particle.h"
|
|
#include "physics/shape.h"
|
|
#include "physics/vector.h"
|
|
|
|
using namespace mbostock;
|
|
|
|
Escalator::Escalator(const Vector& min, const Vector& max, const Vector& v)
|
|
: box_(min, max), velocity_(v * ParticleSimulator::timeStep()),
|
|
model_(box_) {
|
|
model_.setTexOrientation((fabsf(v.x) > fabsf(v.z))
|
|
? ((v.x > 0) ? AxisAlignedBoxModel::POSITIVE_X
|
|
: AxisAlignedBoxModel::NEGATIVE_X)
|
|
: ((v.z > 0) ? AxisAlignedBoxModel::POSITIVE_Z
|
|
: AxisAlignedBoxModel::NEGATIVE_Z));
|
|
}
|
|
|
|
Model& Escalator::model() {
|
|
return model_;
|
|
}
|
|
|
|
const Shape& Escalator::shape() const {
|
|
return box_;
|
|
}
|
|
|
|
void Escalator::step(const ParticleSimulator& s) {
|
|
offset_.x = fmodf(offset_.x + velocity_.x, 1.f);
|
|
offset_.z = fmodf(offset_.z + velocity_.z, 1.f);
|
|
model_.setTexOffset(-offset_.x, -offset_.z);
|
|
}
|
|
|
|
Vector Escalator::velocity(const Vector& x) const {
|
|
return velocity_;
|
|
}
|
|
|
|
void Escalator::setMaterial(const Material& m) {
|
|
model_.setMaterial(m);
|
|
}
|
|
|
|
void Escalator::setTopMaterial(const Material& m) {
|
|
model_.setTopMaterial(m);
|
|
}
|
|
|
|
float Escalator::slip() const {
|
|
return model_.material().slip();
|
|
}
|