Skyscraper 2.0
vehicle.cpp
Go to the documentation of this file.
1/*
2 Scalable Building Simulator - Vehicle Object
3 The Skyscraper Project - Version 2.0
4 Copyright (C)2004-2024 Ryan Thoryk
5 https://www.skyscrapersim.net
6 https://sourceforge.net/projects/skyscraper/
7 Contact - ryan@skyscrapersim.net
8
9 This program is free software; you can redistribute it and/or
10 modify it under the terms of the GNU General Public License
11 as published by the Free Software Foundation; either version 2
12 of the License, or (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22*/
23
24/***************************************************************************
25
26This source file is part of OGREBULLET
27(Object-oriented Graphics Rendering Engine Bullet Wrapper)
28For the latest info, see http://www.ogre3d.org/phpBB2addons/viewforum.php?f=10
29
30Copyright (c) 2007 tuan.kuranes@gmail.com (Use it Freely, even Statically, but have to contribute any changes)
31
32
33
34This source file is not LGPL, it's public source code that you can reuse.
35-----------------------------------------------------------------------------*/
36
37#include <OgreBulletDynamicsRigidBody.h>
38#include <OgreBulletDynamicsRaycastVehicle.h>
39#include <OgreBulletCollisionsBoxShape.h>
40#include <OgreBulletCollisionsCompoundShape.h>
41#include "globals.h"
42#include "sbs.h"
43#include "scenenode.h"
44#include "manager.h"
45#include "mesh.h"
46#include "camera.h"
47#include "vehicle.h"
48
49#undef EPSILON
50#define EPSILON 0.001f
51
52namespace SBS {
53
54Vehicle::Vehicle(Object *parent, const int number) : Object(parent)
55{
56 //set up SBS object
57 SetValues("Vehicle", "", false);
58 Number = number;
59 Enabled(true);
60
61 //initialize main values
62 mCarChassis = 0;
63 mTuning = 0;
65 mVehicle = 0;
66 mChassis = 0;
67 WheelCount = 0;
68 mEngineForce = 0;
69 mSteering = 0;
70 mSteeringLeft = false;
71 mSteeringRight = false;
72 ChassisShift = Vector3::ZERO;
73 ChassisScale = 1;
74 WheelScale = 1;
75 vehicle = 0;
76 CameraPoint = Vector3::ZERO;
77 camera_attached = false;
78 Created = false;
79
80 //initialize car tunables
81 MaxEngineForce = 3000.f;
82 SteeringIncrement = 0.04f;
83 SteeringClamp = 0.8f;
84 WheelFriction = 1e30f;//1000;//1e30f;
86 SuspensionDamping = 2.3f;
88 RollInfluence = 0.1f;//1.0f;
91 FrictionSlip = 10.5;
92
93 //set name
94 std::string name = "Vehicle " + ToString(Number);
95 SetName(name);
96}
97
99{
100 //detach camera
101 AttachCamera(false);
102
103 if (mChassis)
104 delete mChassis;
105 mChassis = 0;
106
107 for (size_t i = 0; i < mWheels.size(); i++)
108 {
109 delete mWheels[i];
110 }
111 mWheels.clear();
112
113 if (mCarChassis)
114 {
115 mCarChassis->removeFromWorld();
116 delete mCarChassis;
117 }
118 mCarChassis = 0;
119
120 if (mTuning)
121 delete mTuning;
122 mTuning = 0;
123
125 delete mVehicleRayCaster;
127
128 if (mVehicle)
129 delete mVehicle;
130 mVehicle = 0;
131
132 if (vehicle)
133 {
134 vehicle->parent_deleting = true;
135 delete vehicle;
136 }
137 vehicle = 0;
138
139 //unregister from parent
140 if (sbs->FastDelete == false && parent_deleting == false)
141 sbs->GetVehicleManager()->Remove(this);
142}
143
144bool Vehicle::Create(const Vector3 &position)
145{
146 if (Created == true)
147 return ReportError("Vehicle already created");
148
149 if (!vehicle)
150 return ReportError("Chassis not created yet");
151
152 Move(position);
153
154 Created = true;
155
156 return true;
157}
158
159bool Vehicle::CreateChassis(Real restitution, Real friction, Real mass, Real linear_dampening, Real angular_dampening)
160{
161 if (vehicle)
162 return ReportError("Chassis already created");
163
164 vehicle = new Object(this);
165 vehicle->SetValues("SceneNode", "Vehicle Chassis", true, true);
166
167 mChassis = new MeshObject(vehicle, GetName() + " Chassis", 0, ChassisMesh, "", 0.0, ChassisScale, false);
169
170 //initialize collider shape
171 Real scale = mChassis->GetSceneNode()->GetScale();
173
174 if (mChassis->Bounds->isNull() == true)
175 return false;
176
177 Vector3 bounds = mChassis->Bounds->getHalfSize() * scale;
178
179 OgreBulletCollisions::BoxCollisionShape* chassisShape = new OgreBulletCollisions::BoxCollisionShape(bounds);
180 OgreBulletCollisions::CompoundCollisionShape* compound = new OgreBulletCollisions::CompoundCollisionShape();
181 compound->addChildShape(chassisShape, sbs->ToRemote(ChassisShift), Quaternion::IDENTITY);
182
183 mCarChassis = new OgreBulletDynamics::WheeledRigidBody(GetName() + " Chassis", sbs->mWorld);
184
185 mCarChassis->setShape(vehicle->GetSceneNode()->GetRawSceneNode(), compound, restitution, friction, mass, true);
186 mCarChassis->setDamping(linear_dampening, angular_dampening);
187
188 mCarChassis->disableDeactivation();
189 mTuning = new OgreBulletDynamics::VehicleTuning(SuspensionStiffness,
194
195 mVehicleRayCaster = new OgreBulletDynamics::VehicleRayCaster(sbs->mWorld);
196 mVehicle = new OgreBulletDynamics::RaycastVehicle(mCarChassis, mTuning, mVehicleRayCaster);
197
198 int rightIndex = 0;
199 int upIndex = 1;
200 int forwardIndex = 2;
201
202 mVehicle->setCoordinateSystem(rightIndex, upIndex, forwardIndex);
203
204 return true;
205}
206
207bool Vehicle::AddWheel(bool engine, bool steerable, bool IsFrontWheel, Real radius, const Vector3 &ConnectionPoint, const Vector3 &Direction, const Vector3 &Axle)
208{
209 if (!mVehicle)
210 return ReportError("Chassis not created yet");
211
212 if (engine == true)
213 mWheelsEngine.emplace_back(WheelCount);
214 if (steerable == true)
215 mWheelsSteerable.emplace_back(WheelCount);
216 WheelCount++;
217
218 MeshObject *mesh = new MeshObject(this, GetName() + " Wheel " + ToString(WheelCount), 0, WheelMesh, "", 0.0, WheelScale, false);
219 mWheels.emplace_back(mesh);
220
221 mVehicle->addWheel(
222 mesh->GetSceneNode()->GetRawSceneNode(),
223 sbs->ToRemote(ConnectionPoint),
224 Direction,
225 Axle,
227 sbs->ToRemote(radius),
228 IsFrontWheel, WheelFriction, RollInfluence);
229
230 //mVehicle->setWheelsAttached();
231
232 return true;
233}
234
235void Vehicle::KeyPressed(bool left, bool right, bool down, bool up)
236{
237 if (left == true)
238 mSteeringLeft = true;
239 if (right == true)
240 mSteeringRight = true;
241 if (down == true)
243 if (up == true)
245}
246
247void Vehicle::KeyReleased(bool left, bool right, bool down, bool up)
248{
249 if (left == true)
250 mSteeringLeft = false;
251 if (right == true)
252 mSteeringRight = false;
253 if (down == true || up == true)
254 mEngineForce = 0;
255}
256
258{
259 if (!mVehicle)
260 return;
261
262 // apply engine force on relevant wheels
263 for (size_t i = 0; i < mWheelsEngine.size(); i++)
264 {
265 mVehicle->applyEngineForce(mEngineForce, mWheelsEngine[i]);
266 }
267
268 if (mSteeringLeft)
269 {
273 }
274 else if (mSteeringRight)
275 {
279 }
280 else if (mSteering != 0)
281 {
282 if (mSteering < 0)
284 else
286 if (std::abs(mSteering) < EPSILON)
287 mSteering = 0;
288 }
289
290 // apply steering on relevant wheels
291 for (size_t i = 0; i < mWheelsSteerable.size(); i++)
292 {
293 if (i < 2)
294 mVehicle->setSteeringValue(mSteering, mWheelsSteerable[i]);
295 else
296 mVehicle->setSteeringValue(-mSteering, mWheelsSteerable[i]);
297 }
298
299 //if camera is attached, sync it's position to this vehicle
300 if (camera_attached == true)
301 {
304 }
305}
306
307void Vehicle::Enabled(bool value)
308{
309 EnableLoop(value);
310}
311
312void Vehicle::OnMove(bool parent)
313{
314 if (mCarChassis)
315 mCarChassis->updateTransform(true, true, true);
316}
317
318void Vehicle::AttachCamera(bool value)
319{
320 if (camera_attached == value)
321 return;
322
323 CameraPoint = Vector3(0, 5, 0);
324 camera_attached = value;
325
326 if (value == true)
327 Report("Camera attached");
328 else
329 Report("Camera detached");
330}
331
333{
334 if (!mChassis)
335 return 0.0;
336
337 Vector3 size = mChassis->Bounds->getSize();
338 if (size.x > size.z)
339 return size.z;
340 else
341 return size.x;
342}
343
344void Vehicle::Report(const std::string &message)
345{
346 //general reporting function
347 Object::Report(GetName() + ": " + message);
348}
349
350bool Vehicle::ReportError(const std::string &message)
351{
352 //general reporting function
353 return Object::ReportError(GetName() + ": " + message);
354}
355
356}
void SetPosition(const Vector3 &position)
Definition camera.cpp:179
void SetOrientation(const Quaternion &orientation)
Definition camera.cpp:1543
void GetBounds()
Definition mesh.cpp:149
Ogre::AxisAlignedBox * Bounds
Definition mesh.h:102
friend class Object
Definition object.h:34
const std::string & GetName()
Definition object.cpp:53
virtual bool ReportError(const std::string &message)
Definition object.cpp:84
virtual void Report(const std::string &message)
Definition object.cpp:78
void SetName(const std::string &name)
Definition object.cpp:72
bool parent_deleting
Definition object.h:64
virtual void Move(const Vector3 &vector, Real speed=1.0)
Definition object.cpp:253
virtual Vector3 GetPosition(bool relative=false)
Definition object.cpp:321
SceneNode * GetSceneNode()
Definition object.cpp:240
void SetValues(const std::string &type, const std::string &name, bool is_permanent, bool is_movable=true)
Definition object.cpp:144
Quaternion GetOrientation(bool relative=false)
Definition object.cpp:377
void EnableLoop(bool value)
Definition object.cpp:521
virtual void SetPosition(const Vector3 &position)
Definition object.cpp:274
VehicleManager * GetVehicleManager()
Definition sbs.cpp:4568
bool FastDelete
Definition sbs.h:188
Camera * camera
Definition sbs.h:160
OgreBulletDynamics::DynamicsWorld * mWorld
Definition sbs.h:153
Real ToRemote(Real local_value)
Definition sbs.cpp:2407
Ogre::SceneNode * GetRawSceneNode()
Definition scenenode.h:35
void Remove(Vehicle *elevator)
Definition manager.cpp:967
Real ChassisScale
Definition vehicle.h:46
Real SuspensionStiffness
Definition vehicle.h:54
Real mSteering
Definition vehicle.h:93
bool CreateChassis(Real restitution, Real friction, Real mass, Real linear_dampening, Real angular_dampening)
Definition vehicle.cpp:159
Real FrictionSlip
Definition vehicle.h:60
void KeyReleased(bool left, bool right, bool down, bool up)
Definition vehicle.cpp:247
Real WheelFriction
Definition vehicle.h:53
std::string WheelMesh
Definition vehicle.h:45
Object * vehicle
Definition vehicle.h:84
void AttachCamera(bool value)
Definition vehicle.cpp:318
Real SuspensionRestLength
Definition vehicle.h:58
Real WheelScale
Definition vehicle.h:47
void Enabled(bool value)
Definition vehicle.cpp:307
Real SuspensionDamping
Definition vehicle.h:55
bool mSteeringRight
Definition vehicle.h:96
Real mEngineForce
Definition vehicle.h:92
OgreBulletDynamics::VehicleTuning * mTuning
Definition vehicle.h:80
OgreBulletDynamics::WheeledRigidBody * mCarChassis
Definition vehicle.h:79
void OnMove(bool parent)
Definition vehicle.cpp:312
std::string ChassisMesh
Definition vehicle.h:44
int WheelCount
Definition vehicle.h:88
Real MaxSuspensionTravelCm
Definition vehicle.h:59
Vector3 CameraPoint
Definition vehicle.h:48
bool camera_attached
Definition vehicle.h:98
bool mSteeringLeft
Definition vehicle.h:95
Vehicle(Object *parent, const int number)
Definition vehicle.cpp:54
OgreBulletDynamics::RaycastVehicle * mVehicle
Definition vehicle.h:82
Real SuspensionCompression
Definition vehicle.h:56
void KeyPressed(bool left, bool right, bool down, bool up)
Definition vehicle.cpp:235
Real RollInfluence
Definition vehicle.h:57
Real MaxEngineForce
Definition vehicle.h:50
std::vector< int > mWheelsSteerable
Definition vehicle.h:90
std::vector< int > mWheelsEngine
Definition vehicle.h:89
bool ReportError(const std::string &message)
Definition vehicle.cpp:350
bool AddWheel(bool engine, bool steerable, bool IsFrontWheel, Real radius, const Vector3 &ConnectionPoint, const Vector3 &Direction=Vector3(0, -1, 0), const Vector3 &Axle=Vector3(-1, 0, 0))
Definition vehicle.cpp:207
bool Create(const Vector3 &position)
Definition vehicle.cpp:144
void Report(const std::string &message)
Definition vehicle.cpp:344
OgreBulletDynamics::VehicleRayCaster * mVehicleRayCaster
Definition vehicle.h:81
MeshObject * mChassis
Definition vehicle.h:85
Real SteeringIncrement
Definition vehicle.h:51
std::vector< MeshObject * > mWheels
Definition vehicle.h:86
bool Created
Definition vehicle.h:41
Real SteeringClamp
Definition vehicle.h:52
Real GetWidth()
Definition vehicle.cpp:332
Vector3 ChassisShift
Definition vehicle.h:43
void Loop()
Definition vehicle.cpp:257
Ogre::Vector3 Vector3
Definition globals.h:58
Ogre::Real Real
Definition globals.h:57
std::string ToString(int number)
Definition globals.cpp:279
#define EPSILON
Definition texmap.cpp:32