diff options
Diffstat (limited to 'game/vehicles')
| -rw-r--r-- | game/vehicles/railloco.cpp | 34 | ||||
| -rw-r--r-- | game/vehicles/railloco.h | 21 | 
2 files changed, 55 insertions, 0 deletions
| diff --git a/game/vehicles/railloco.cpp b/game/vehicles/railloco.cpp index a1add29..d61b882 100644 --- a/game/vehicles/railloco.cpp +++ b/game/vehicles/railloco.cpp @@ -39,10 +39,44 @@ RailLoco::tick(TickDuration dur)  	const auto diff = glm::normalize(b2pos.GetPos() - b1pos.GetPos());  	location.GetRot().x = -vector_pitch(diff);  	location.GetRot().y = vector_yaw(diff); +	updateWagons();  } +void +RailLoco::updateWagons() const +{ +	// Drag wagons +	float trailBy {wheelBase + ((length - wheelBase)) / 2}; +	for (const auto & wagon : wagons) { +		const auto w {wagon.lock()}; +		auto wTrailBy {trailBy + ((w->length - w->wheelBase) / 2)}; +		float b1linkDist {}; +		const auto b1Link = linkHist.getAt(wTrailBy - linkDist, &b1linkDist); +		const auto b1Pos = b1Link.first->positionAt(b1linkDist, b1Link.second); +		wTrailBy += w->wheelBase; +		float b2linkDist {}; +		const auto b2Link = linkHist.getAt(wTrailBy - linkDist, &b2linkDist); +		const auto b2Pos = b2Link.first->positionAt(b2linkDist, b2Link.second); +		w->location.GetPos() = (b1Pos.GetPos() + b2Pos.GetPos()) / 2.F; +		const auto diff = glm::normalize(b2Pos.GetPos() - b1Pos.GetPos()); +		w->location.GetRot().x = -vector_pitch(diff); +		w->location.GetRot().y = vector_yaw(diff); +		trailBy += w->length; +	} +} + +void RailWagon::tick(TickDuration) { } +  Brush47::Brush47(const LinkPtr & l) : RailLoco(l, "brush47.obj", "brush47.png")  {  	wheelBase = 15.7F; +	length = 19.38F; +	linkDist = wheelBase; +} + +Brush47Wagon::Brush47Wagon(const LinkPtr & l) : RailWagon(l, "brush47.obj", "brush47.png") +{ +	wheelBase = 15.7F; +	length = 19.38F;  	linkDist = wheelBase;  } diff --git a/game/vehicles/railloco.h b/game/vehicles/railloco.h index ff8871b..537d448 100644 --- a/game/vehicles/railloco.h +++ b/game/vehicles/railloco.h @@ -1,21 +1,42 @@  #include "game/network/link.h"  #include "game/vehicles/vehicle.h"  #include "game/worldobject.h" +#include <memory>  #include <string> +#include <vector>  class RailVehicle : public Vehicle {  public:  	using Vehicle::Vehicle;  	float wheelBase; +	float length;  }; +class RailWagon : public RailVehicle { +public: +	using RailVehicle::RailVehicle; +	void tick(TickDuration elapsed) override; +	friend class RailLoco; +}; +using RailWagonPtr = std::weak_ptr<RailWagon>; +  class RailLoco : public RailVehicle {  public:  	using RailVehicle::RailVehicle;  	void tick(TickDuration elapsed) override; + +	std::vector<RailWagonPtr> wagons; + +private: +	void updateWagons() const;  };  class Brush47 : public RailLoco {  public:  	explicit Brush47(const LinkPtr & p);  }; + +class Brush47Wagon : public RailWagon { +public: +	explicit Brush47Wagon(const LinkPtr & p); +}; | 
