Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
VehicleBuilder.hpp
Go to the documentation of this file.
1#pragma once
2
10#include "core/Core.hpp"
11#include "entity/Entity.hpp"
13
14#include "Object.hpp"
15
16#include <array>
17#include <fmt/format.h>
18#include <glm/glm.hpp>
19#include <glm/gtc/quaternion.hpp>
20#include <memory>
21
23
40template <size_t N> class VehicleBuilder {
41 static_assert(N == 4, "VehicleBuilder currently only supports 4-wheel vehicles (N=4). "
42 "Support for other wheel counts may be added in future versions.");
43};
44
48template <> class VehicleBuilder<4> {
49 public:
59 const glm::vec3 &position = glm::vec3(0.0f),
60 const glm::quat &rotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f),
61 const glm::vec3 &scale = glm::vec3(1.0f))
62 {
63 _chassisMesh = chassisMesh;
64 _chassisPosition = position;
65 _chassisRotation = rotation;
66 _chassisScale = scale;
67 _hasChassisSet = true;
68 return *this;
69 }
70
78 {
79 _wheelMeshes[static_cast<size_t>(index)] = wheelMesh;
80 _hasWheelMesh[static_cast<size_t>(index)] = true;
81 return *this;
82 }
83
91 {
92 _vehicle.wheels[static_cast<size_t>(index)] = settings;
93 return *this;
94 }
95
103 {
104 _vehicle.wheels[static_cast<size_t>(index)].maxBrakeTorque = torque;
105 return *this;
106 }
107
117 {
118 _vehicle.wheels[static_cast<size_t>(index)].maxHandBrakeTorque = torque;
119 return *this;
120 }
121
126 {
127 _vehicle.drivetrain = drivetrain;
128 return *this;
129 }
130
135 {
136 _vehicle.engine = engine;
137 return *this;
138 }
139
144 {
145 _vehicle.gearbox = gearbox;
146 return *this;
147 }
148
153 {
154 _vehicle.rollbar = rollbar;
155 return *this;
156 }
157
171 VehicleBuilder &SetWheelPositions(const glm::vec3 &frontLeft, const glm::vec3 &frontRight,
172 const glm::vec3 &rearLeft, const glm::vec3 &rearRight)
173 {
174 using enum Component::WheelIndex;
175
176 _wheelPositions[static_cast<size_t>(FrontLeft)] = frontLeft;
177 _wheelPositions[static_cast<size_t>(FrontRight)] = frontRight;
178 _wheelPositions[static_cast<size_t>(RearLeft)] = rearLeft;
179 _wheelPositions[static_cast<size_t>(RearRight)] = rearRight;
180 return *this;
181 }
182
197 {
198 if (!_hasChassisSet)
199 {
200 throw Exception::VehicleBuilderError("Chassis mesh not set");
201 }
202
203 for (size_t i = 0; i < 4; ++i)
204 {
205 if (!_hasWheelMesh[i])
206 {
207 throw Exception::VehicleBuilderError(fmt::format("Wheel mesh not set for wheel {}", i));
208 }
209 }
210
211 if (_vehicle.gearbox.forwardGearRatios.empty())
212 {
213 throw Exception::VehicleBuilderError("Gearbox must have at least one forward gear");
214 }
215
216 auto chassis = core.CreateEntity();
219 chassis.AddComponent<Object::Component::Mesh>(_chassisMesh);
220
221 std::array<Engine::EntityId, 4> wheelEntities;
222 for (size_t i = 0; i < 4; ++i)
223 {
224 wheelEntities[i] = core.CreateEntity();
225
226 glm::vec3 worldWheelPos = _chassisPosition + _chassisRotation * _wheelPositions[i];
227 glm::quat wheelRotation =
228 _chassisRotation * glm::angleAxis(glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
229
230 wheelEntities[i].AddComponent<Object::Component::Transform>(
231 core, Object::Component::Transform(worldWheelPos, glm::vec3(1.0f), wheelRotation));
232 wheelEntities[i].AddComponent<Object::Component::Mesh>(core, _wheelMeshes[i]);
233 }
234
235 auto chassisRigidBody = Component::RigidBody::CreateDynamic(_chassisMass);
236 chassisRigidBody.friction = 0.5f;
237 chassisRigidBody.restitution = 0.1f;
238 chassis.AddComponent<Component::ConvexHullMeshCollider>();
239 chassis.AddComponent<Component::RigidBody>(chassisRigidBody);
240
241 _vehicle.wheelEntities = wheelEntities;
242 _vehicle.wheelPositions = _wheelPositions;
243
244 chassis.AddComponent<Component::Vehicle>(_vehicle);
245
246 chassis.AddComponent<Component::VehicleController>();
247
248 return chassis;
249 }
250
255 {
256 _chassisMass = mass;
257 return *this;
258 }
259
264 {
265 _vehicle.collisionTesterType = type;
266 return *this;
267 }
268
275 {
276 if (fraction < 0.0f || fraction > 1.0f)
277 {
278 throw Exception::VehicleBuilderError("Convex radius fraction must be between 0.0 and 1.0");
279 }
280 _vehicle.convexRadiusFraction = fraction;
281 return *this;
282 }
283
284 private:
286
288 glm::vec3 _chassisPosition = glm::vec3(0.0f);
289 glm::quat _chassisRotation = glm::quat(1.0f, 0.0f, 0.0f, 0.0f);
290 glm::vec3 _chassisScale = glm::vec3(1.0f);
291 float _chassisMass = 1500.0f;
292
293 std::array<Object::Component::Mesh, 4> _wheelMeshes;
295
296 bool _hasChassisSet = false;
297 std::array<bool, 4> _hasWheelMesh = {false, false, false, false};
298};
299
300} // namespace Physics::Builder
The core is the place where all the data of the engine is stored. It contains the registry (entities)...
Definition Core.hpp:33
Entity CreateEntity()
Create an entity in the context of the registry.
Definition Core.cpp:44
Wrapper class providing a convenient interface for entity manipulation with the Core....
Definition Entity.hpp:20
decltype(auto) AddComponent(TComponent &&component)
Add a component to an entity.
Definition Entity.hpp:55
VehicleBuilder & SetRollbar(const Component::RollbarSettings &rollbar)
Set rollbar configuration.
Definition VehicleBuilder.hpp:152
VehicleBuilder & SetGearbox(const Component::GearboxSettings &gearbox)
Set gearbox configuration.
Definition VehicleBuilder.hpp:143
VehicleBuilder & SetChassisMesh(const Object::Component::Mesh &chassisMesh, const glm::vec3 &position=glm::vec3(0.0f), const glm::quat &rotation=glm::quat(1.0f, 0.0f, 0.0f, 0.0f), const glm::vec3 &scale=glm::vec3(1.0f))
Set the chassis mesh and initial transform.
Definition VehicleBuilder.hpp:58
VehicleBuilder & SetMaxHandBrakeTorque(Component::WheelIndex index, float torque)
Set maximum handbrake torque for a specific wheel.
Definition VehicleBuilder.hpp:116
bool _hasChassisSet
Definition VehicleBuilder.hpp:296
glm::quat _chassisRotation
Definition VehicleBuilder.hpp:289
VehicleBuilder & SetEngine(const Component::EngineSettings &engine)
Set engine configuration.
Definition VehicleBuilder.hpp:134
VehicleBuilder & SetWheelMesh(Component::WheelIndex index, const Object::Component::Mesh &wheelMesh)
Set mesh for a specific wheel.
Definition VehicleBuilder.hpp:77
Engine::Entity Build(Engine::Core &core)
Build the vehicle and create all entities.
Definition VehicleBuilder.hpp:196
VehicleBuilder & SetWheelPositions(const glm::vec3 &frontLeft, const glm::vec3 &frontRight, const glm::vec3 &rearLeft, const glm::vec3 &rearRight)
Set wheel offset positions relative to chassis center.
Definition VehicleBuilder.hpp:171
Component::Vehicle _vehicle
Definition VehicleBuilder.hpp:285
VehicleBuilder & SetMaxBrakeTorque(Component::WheelIndex index, float torque)
Set maximum brake torque for a specific wheel.
Definition VehicleBuilder.hpp:102
VehicleBuilder & SetChassisMass(float mass)
Set chassis mass in kilograms.
Definition VehicleBuilder.hpp:254
VehicleBuilder & SetCollisionTesterType(Component::CollisionTesterType type)
Set the collision tester type for wheel-ground detection.
Definition VehicleBuilder.hpp:263
std::array< Object::Component::Mesh, 4 > _wheelMeshes
Definition VehicleBuilder.hpp:293
std::array< bool, 4 > _hasWheelMesh
Definition VehicleBuilder.hpp:297
std::array< glm::vec3, 4 > _wheelPositions
Definition VehicleBuilder.hpp:294
VehicleBuilder & SetConvexRadiusFraction(float fraction)
Set the convex radius fraction for CastCylinder tester.
Definition VehicleBuilder.hpp:274
VehicleBuilder & SetWheelSettings(Component::WheelIndex index, const Component::WheelSettings &settings)
Set wheel settings for a specific wheel.
Definition VehicleBuilder.hpp:90
float _chassisMass
Definition VehicleBuilder.hpp:291
VehicleBuilder & SetDrivetrain(Component::DrivetrainType drivetrain)
Set drivetrain type (AWD, FWD, RWD).
Definition VehicleBuilder.hpp:125
glm::vec3 _chassisPosition
Definition VehicleBuilder.hpp:288
glm::vec3 _chassisScale
Definition VehicleBuilder.hpp:290
Object::Component::Mesh _chassisMesh
Definition VehicleBuilder.hpp:287
Builder for creating vehicles with N wheels.
Definition VehicleBuilder.hpp:40
Definition VehicleBuilderError.hpp:7
Definition VehicleBuilder.hpp:22
WheelIndex
Enum for identifying wheel positions in a 4-wheel vehicle.
Definition WheelSettings.hpp:11
DrivetrainType
Drivetrain configuration for vehicle.
Definition Vehicle.hpp:15
CollisionTesterType
Collision tester type for vehicle wheel collision detection.
Definition Vehicle.hpp:31
Mesh structure.
Definition Mesh.hpp:40
Definition Transform.hpp:18
Convex hull mesh collider.
Definition ConvexHullMeshCollider.hpp:48
Engine configuration.
Definition Vehicle.hpp:107
Gearbox configuration for vehicle transmission.
Definition Vehicle.hpp:65
Definition RigidBody.hpp:64
static RigidBody CreateDynamic(float bodyMass=1.0f)
Create a dynamic rigid body.
Definition RigidBody.hpp:150
Rollbar (anti-roll bar) configuration.
Definition Vehicle.hpp:138
Vehicle input controller component.
Definition VehicleController.hpp:14
Main vehicle component containing all configuration.
Definition Vehicle.hpp:152
static std::array< glm::vec3, 4 > GetDefaultWheelPositions()
Get default wheel positions relative to chassis center.
Definition Vehicle.hpp:191
static Vehicle CreateDefaultCar()
Create a default RWD sports car configuration.
Definition Vehicle.hpp:204
Settings for an individual wheel in a vehicle.
Definition WheelSettings.hpp:37