00001 #include "Craft.h"
00002 #include "Application.h"
00003 #include "Shapes/OgreBulletCollisionsStaticPlaneShape.h"
00004 #include "Shapes/OgreBulletCollisionsBoxShape.h"
00005 #include "Shapes/OgreBulletCollisionsTrimeshShape.h"
00006 #include "Shapes/OgreBulletCollisionsConvexHullShape.h"
00007 #include "Shapes/OgreBulletCollisionsCapsuleShape.h"
00008 #include "Shapes/OgreBulletCollisionsCompoundShape.h"
00009 #include "Utils/OgreBulletCollisionsMeshToShapeConverter.h"
00010
00011 Craft::Craft()
00012 {
00013 setID();
00014 setName("Craft" + Ogre::StringConverter::toString(getID()));
00015
00016 Ogre::SceneNode* sceneNode = Application::getSingleton()->getViewerManager()->getRootSceneNode()->createChildSceneNode(m_name + "SceneNode");
00017 setSceneNode(sceneNode);
00018
00019 sceneNode->setPosition(Ogre::Vector3(5,3,0));
00020
00021
00022 sceneNode->setDirection(Ogre::Vector3(1,0,0));
00023
00024 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00025
00026 sceneNode->showBoundingBox(false);
00027
00028 Ogre::Vector3 size = Ogre::Vector3::ZERO;
00029 Ogre::Entity *entity = Application::getSingleton()->getViewerManager()->createEntity(m_name,"craft.mesh");
00030 entity->setCastShadows(true);
00031 entity->setMaterialName("craft");
00032 setEntity(entity);
00033
00034 m_restitution = 0.3f;
00035 m_friction = 0.1f;
00036 m_mass = 1000.0f;
00037 m_vector = Ogre::Vector3::ZERO;
00038
00039
00040
00041 m_engineThrustForward = m_engineThrustForwardDefault = 5000.0f;
00042 m_thrustForward = m_thrustForwardDefault = 20.0f;
00043
00044 m_engineThrustBackward = m_engineThrustBackwardDefault = 1000.0f;
00045 m_thrustBackward = m_thrustBackwardDefault = 10.0f;
00046
00047 m_engineTurnForce = m_engineTurnForceDefault = 10.0f;
00048 m_turnForce = m_turnForceDefault = 2.0f;
00049 m_turnForcePosition = Ogre::Vector3(0.0f,-3.5f,-5.5f);
00050
00051 m_falseFriction = m_falseFrictionDefault = 7.5f;
00052
00053 m_heightDesired = m_heightCurrent = m_heightLast = 3.0f;
00054 m_heightSpring = 0.1f;
00055 m_heightDamp = 0.5f;
00056 m_heightLoseContact = 10.0f;
00057
00058 m_selfRightRate = 0.1f;
00059
00060 m_turnCompensation = 0.0f;
00061 m_upVector = Ogre::Vector3::UNIT_Y;
00062 m_trackRelativeUp = Ogre::Vector3::UNIT_Y;
00063 m_frontVector = Ogre::Vector3::NEGATIVE_UNIT_Z;
00064
00065 #ifdef CRAFT_DEBUG_DRAW
00066 m_rayCast = Application::getSingleton()->getViewerManager()->createManualObject(getName() + "rayLine");
00067 m_rayCast->setDynamic(true);
00068
00069 getSceneNode()->attachObject(m_rayCast);
00070
00071 m_rayCast->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST);
00072 m_rayCast->position(Ogre::Vector3::ZERO);
00073 m_rayCast->position(Ogre::Vector3::NEGATIVE_UNIT_Y * m_heightLoseContact);
00074 m_rayCast->end();
00075 #endif
00076
00077 #ifdef USE_OGRE_RAY
00078 m_trackSeekRay = Application::getSingleton()->getViewerManager()->createRayQuery(Ogre::Ray());
00079 #endif
00080
00081 m_currentTrackSection = 0;
00082 m_constraintUpright = 0;
00083
00084 m_trackProjectFrustum = new Ogre::Frustum();
00085 m_wallProjectFrustum = new Ogre::Frustum();
00086
00087 m_trackDecalName = "trackGrid.png";
00088 m_wallDecalName = "trackWall.png";
00089
00090 m_trackMaterialName = "track";
00091 m_wallMaterialName = "trackSideBarrier";
00092
00093 m_trackDecalColour = Ogre::ColourValue(1,1,1,1);
00094 m_wallDecalColour = Ogre::ColourValue(1,1,1,1);
00095
00096
00097 m_trackProjectFrustum->setProjectionType(Ogre::PT_ORTHOGRAPHIC);
00098 m_trackProjectFrustum->setOrthoWindowHeight(5);
00099
00100 m_trackProjectNode = getSceneNode()->createChildSceneNode(m_name + "TrackProjectionNode");
00101
00102 m_trackProjectNode->setDirection(Ogre::Vector3::NEGATIVE_UNIT_Y);
00103
00104 m_trackProjectNode->attachObject(m_trackProjectFrustum);
00105
00106
00107 m_trackProjectNode->setInheritOrientation(false);
00108
00109 m_wallProjectNode = getSceneNode()->createChildSceneNode(m_name + "WallProjectionNode");
00110
00111 m_wallProjectFrustum->setProjectionType(Ogre::PT_ORTHOGRAPHIC);
00112 m_wallProjectFrustum->setOrthoWindowHeight(10);
00113
00114 m_wallProjectNode->setDirection(Ogre::Vector3::UNIT_X);
00115
00116 m_wallProjectNode->attachObject(m_wallProjectFrustum);
00117
00118
00119 projectDecal();
00120
00121 makePhysical();
00122
00123 Application::getSingleton()->setCraftPositionPtr(&getSceneNode()->getPosition());
00124
00125 }
00126
00127 bool Craft::move(Ogre::Real _time)
00128 {
00129
00130 #ifdef USE_SPRING
00131
00132
00133 getRigidBody()->applyForce(-Application::getSingleton()->getPhysicsManager()->getGravity() * getMass(), Ogre::Vector3::ZERO);
00134 #endif
00135
00136
00137
00138
00139
00140
00141
00142 TrackPhysicalObject* trackObject = 0;
00143 btVector3 normal;
00144
00145 #ifdef USE_OGRE_RAY
00146
00147 m_trackSeekRay->setRay(Ogre::Ray(getSceneNode()->getPosition(),-m_trackRelativeUp));
00148
00149 m_trackSeekRay->setSortByDistance(true);
00150
00151
00152
00153
00154 Ogre::RaySceneQueryResult &result = m_trackSeekRay->execute();
00155
00156 Ogre::RaySceneQueryResult::iterator iterator;
00157
00158
00159
00160 Ogre::Real height = 0;
00161 for (iterator = result.begin(); iterator != result.end(); iterator++)
00162 {
00163 if (iterator->movable)
00164 {
00165 try
00166 {
00167 if (Ogre::any_cast<TrackPhysicalObject*>(&iterator->movable->getUserAny()))
00168 {
00169
00170 trackObject = Ogre::any_cast<TrackPhysicalObject*>(iterator->movable->getUserAny());
00171 height = iterator->distance;
00172 break;
00173 }
00174 }
00175 catch (...)
00176 {
00177
00178 }
00179 }
00180 }
00181 #endif
00182 #ifdef USE_BULLET_RAY
00183
00184
00185 Ogre::Vector3 ogreRayDir = -m_trackRelativeUp.normalisedCopy();
00186
00187
00188
00189
00190 ogreRayDir = ogreRayDir * 100;
00191
00192 btVector3 rayDir = OgreBulletCollisions::OgreBtConverter::to(ogreRayDir);
00193
00194 btVector3 worldPos = OgreBulletCollisions::OgreBtConverter::to(m_rigidBody->getCenterOfMassPosition());
00195 btCollisionWorld::ClosestRayResultCallback resultCallback(worldPos,rayDir);
00196
00197 btDynamicsWorld* world = Application::getSingleton()->getPhysicsManager()->getDynamicsWorld()->getBulletDynamicsWorld();
00198 world->rayTest(worldPos,rayDir,resultCallback);
00199
00200 #ifdef CRAFT_DEBUG_DRAW
00201 m_rayCast->beginUpdate(0);
00202 m_rayCast->position(Ogre::Vector3::ZERO);
00203 m_rayCast->position(-m_trackRelativeUp.normalisedCopy() * m_heightLoseContact);
00204 m_rayCast->end();
00205 #endif
00206
00207 btScalar distance = 0;
00208
00209 if (resultCallback.hasHit())
00210 {
00211 try
00212 {
00213 trackObject = static_cast<TrackPhysicalObject*>(resultCallback.m_collisionObject->getUserPointer());
00214
00215
00216
00217 if (trackObject != 0)
00218 {
00219 if (trackObject->getType() == 5)
00220 {
00221
00222 distance = rayDir.length() * resultCallback.m_closestHitFraction;
00223
00224 btVector3 hitPoint = worldPos + rayDir.normalized() * distance;
00225
00226 normal = resultCallback.m_hitNormalWorld;
00227 normal.normalize();
00228
00229
00230 }
00231 }
00232 }
00233 catch (...)
00234 {
00235
00236 }
00237
00238 }
00239
00240 #endif
00241
00242
00243
00244
00245 if (trackObject == 0)
00246 {
00247
00248
00249 m_trackRelativeUp = Ogre::Vector3::UNIT_Y;
00250 distance = 1000;
00251
00252
00253
00254 }
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 else
00280 {
00281 if (trackObject->getType() == 5)
00282 {
00283
00284
00285
00286
00287
00288 m_trackRelativeUp = trackObject->getTrackAvUp();
00289
00290
00291
00292
00293
00294
00295
00296 trackObject->tellTrackOfContact();
00297 }
00298 }
00299
00300 if (trackObject != m_currentTrackSection)
00301 {
00302
00303
00304 btTransform transform = m_balancer->getBulletRigidBody()->getWorldTransform();
00305 btMatrix3x3 basis = transform.getBasis();
00306
00307 btVector3 vector;
00308 vector.setX(m_trackRelativeUp.x);
00309 vector.setY(m_trackRelativeUp.y);
00310 vector.setZ(m_trackRelativeUp.z);
00311
00312
00313
00314 basis.setValue(vector.getX(), basis.getColumn(1).getX(), basis.getColumn(2).getX(),
00315 vector.getY(), basis.getColumn(1).getY(), basis.getColumn(2).getY(),
00316 vector.getZ(), basis.getColumn(1).getZ(), basis.getColumn(2).getZ());
00317 transform.setBasis(basis);
00318
00319
00320 m_balancer->getBulletRigidBody()->setWorldTransform(transform);
00321 }
00322
00323
00324 if (trackObject != 0)
00325 {
00326 if (trackObject->getType() == 5)
00327 {
00328 m_currentTrackSection = trackObject;
00329 }
00330 }
00331
00332 #ifdef USE_SPRING
00333
00334
00335 if (trackObject == 0)
00336 {
00337 getRigidBody()->applyForce(Application::getSingleton()->getPhysicsManager()->getGravity() * getMass(), Ogre::Vector3::ZERO);
00338 }
00339 else
00340 {
00341
00342
00343 Ogre::Vector3 newGravity = m_trackRelativeUp * Application::getSingleton()->getPhysicsManager()->getGravity().y;
00344
00345
00346
00347
00348 }
00349
00350
00351
00352
00353
00354
00355 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00356 Ogre::Vector3 facing = quat * Ogre::Vector3::NEGATIVE_UNIT_Z;
00357 if (m_vector.x < 0.0)
00358 {
00359 getRigidBody()->applyForce(Ogre::Vector3(-m_turnForce * getMass(),0.0,0.0), Ogre::Vector3(0.0f,-0.5f,-2.0f));
00360 m_turnCompensation = m_turnForce;
00361
00362 }
00363 else if (m_vector.x > 0.0)
00364 {
00365 getRigidBody()->applyForce(Ogre::Vector3(m_turnForce * getMass(),0.0,0.0), Ogre::Vector3(0.0f,-0.5f,-2.0f));
00366 m_turnCompensation = -m_turnForce;
00367 }
00368
00369
00370
00371
00372
00373
00374
00375 if (fabs(m_turnCompensation) > 0.0 && fabs(m_vector.x) < 0.001)
00376 {
00377 getRigidBody()->applyForce(Ogre::Vector3(m_turnCompensation * getMass(),0.0,0.0), Ogre::Vector3(0.0f,-0.5f,-2.0f));
00378 m_turnCompensation = 0.0f;
00379 }
00380
00381
00382
00383
00384
00385 if (m_vector.z < 0.0)
00386 {
00387 getRigidBody()->applyForce(facing * m_thrustForward * getMass(), Ogre::Vector3::ZERO);
00388 }
00389 else if (m_vector.z > 0.0)
00390 {
00391 getRigidBody()->applyForce(facing * -m_thrustBackward * getMass(), Ogre::Vector3::ZERO);
00392 }
00393 #endif
00394 #ifdef USE_BULLET_VEHICLE
00395
00396
00397 m_vehicle->setSteeringValue(btScalar(0), 0);
00398 m_vehicle->setSteeringValue(btScalar(0), 1);
00399 m_vehicle->applyEngineForce(0,2);
00400 m_vehicle->applyEngineForce(0,3);
00401 m_vehicle->setBrake(0, 2);
00402 m_vehicle->setBrake(0, 3);
00403
00404 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00405 Ogre::Vector3 facing = quat * Ogre::Vector3::NEGATIVE_UNIT_Z;
00406
00407 if (m_vector.x < 0.0)
00408 {
00409
00410 getRigidBody()->applyForce(Ogre::Vector3(-m_turnForce * getMass(),0.0,0.0), m_turnForcePosition);
00411
00412
00413
00414
00415 m_turnCompensation = -m_turnForce;
00416
00417
00418 }
00419 else if (m_vector.x > 0.0)
00420 {
00421
00422 getRigidBody()->applyForce(Ogre::Vector3(m_turnForce * getMass(),0.0,0.0), m_turnForcePosition);
00423
00424 m_turnCompensation = m_turnForce;
00425
00426
00427
00428 }
00429
00430
00431
00432
00433
00434
00435
00436
00437 if (fabs(m_turnCompensation) > 0.0 && fabs(m_vector.x) < 0.001)
00438 {
00439 getRigidBody()->applyForce(Ogre::Vector3(m_turnCompensation * getMass(),0.0,0.0), m_turnForcePosition);
00440 m_turnCompensation = 0.0f;
00441 }
00442
00443
00444
00445
00446
00447 if (getRigidBody()->getLinearVelocity().squaredLength() > 1.0f)
00448 {
00449
00450 Ogre::Vector3 linearDirection = getRigidBody()->getLinearVelocity();
00451
00452 if (linearDirection.angleBetween(facing).valueDegrees() > 10.0f)
00453 {
00454
00455 linearDirection.y = 0.0f;
00456 getRigidBody()->applyForce(-linearDirection.normalisedCopy() * (m_falseFriction * getMass()), Ogre::Vector3::ZERO);
00457
00458 }
00459 }
00460
00461 if (m_vector.z < 0.0)
00462 {
00463
00464
00465
00466
00467
00468
00469
00470
00471 if (distance < m_heightLoseContact)
00472 {
00473 getRigidBody()->applyForce(facing * m_thrustForward * getMass(), Ogre::Vector3::ZERO);
00474 }
00475 else
00476 {
00477 getRigidBody()->applyForce(facing * m_thrustBackward * getMass(), Ogre::Vector3::ZERO);
00478 }
00479
00480 }
00481 else if (m_vector.z > 0.0)
00482 {
00483
00484
00485 Ogre::Vector3 linearDirection = getRigidBody()->getLinearVelocity();
00486 linearDirection.y = 0.0f;
00487
00488
00489 getRigidBody()->applyForce(-facing * m_thrustBackward * getMass(), Ogre::Vector3::ZERO);
00490
00491
00492
00493
00494 }
00495
00496
00497 #endif
00498
00499 m_lastMotion = m_vector;
00500 m_vector = Ogre::Vector3::ZERO;
00501
00502 if ((Application::getSingleton()->getGameState() == RACING) || (Application::getSingleton()->getGameState() == RACE_START))
00503 {
00504 Application::getSingleton()->getGUI()->updateKPH((int)fabs(m_vehicle->getCurrentSpeedKmHour()));
00505 }
00506
00507 return true;
00508
00509 }
00510
00511 bool Craft::makePhysical()
00512 {
00513 m_physical = false;
00514 if (getEntity() != 0)
00515 {
00516 #ifdef USE_BULLET_VEHICLE
00517
00518 float wheelRadius = 0.7f;
00519 float wheelWidth = 1.2f;
00520 float wheelFriction = 0.2f;
00521
00522 float suspensionStiffness = 90.0f;
00523 float suspensionDamping = 0.3 * 2.0 * btSqrt(suspensionStiffness);
00524 float suspensionCompression = 0.2 * 2.0 * btSqrt(suspensionStiffness);
00525 float suspensionTravel = 15.0f;
00526 float suspensionForce = 9000.0f;
00527 float rollInfluence = 0.01f;
00528
00529 btScalar suspensionRestLength(0.4);
00530
00531
00532
00533 OgreBulletCollisions::StaticMeshToShapeConverter* converter = new OgreBulletCollisions::StaticMeshToShapeConverter(getEntity());
00534
00535
00536 OgreBulletCollisions::ConvexHullCollisionShape* meshShape = converter->createConvex();
00537
00538 delete converter;
00539
00540 OgreBulletCollisions::CompoundCollisionShape* compoundShape = new OgreBulletCollisions::CompoundCollisionShape();
00541
00542 compoundShape->addChildShape(meshShape);
00543
00544 m_collisionShape = compoundShape;
00545
00546 m_rigidBody = Application::getSingleton()->getPhysicsManager()->createRigidBody(getName() + "rigidBody");
00547
00548
00549
00550
00551 Ogre::Vector3 pos = getSceneNode()->getPosition();
00552 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00553
00554 m_rigidBody->setShape(getSceneNode(), m_collisionShape, m_restitution ,m_friction, m_mass, pos, quat);
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574 Application::getSingleton()->getPhysicsManager()->addPair(m_rigidBody, m_collisionShape);
00575
00576 m_vehicleRayCaster = new btDefaultVehicleRaycaster(Application::getSingleton()->getPhysicsManager()->getDynamicsWorld()->getBulletDynamicsWorld());
00577 m_vehicle = new btRaycastVehicle(m_vehicleTuning,m_rigidBody->getBulletRigidBody(),m_vehicleRayCaster);
00578
00579 Application::getSingleton()->getPhysicsManager()->getDynamicsWorld()->getBulletDynamicsWorld()->addVehicle(m_vehicle);
00580
00581 m_vehicleTuning.m_suspensionStiffness = suspensionStiffness;
00582 m_vehicleTuning.m_suspensionCompression = suspensionCompression;
00583 m_vehicleTuning.m_suspensionDamping = suspensionDamping;
00584 m_vehicleTuning.m_maxSuspensionTravelCm = suspensionTravel;
00585 m_vehicleTuning.m_frictionSlip = wheelFriction;
00586 m_vehicleTuning.m_maxSuspensionForce = suspensionForce;
00587
00588
00589
00590
00591 m_vehicle->setCoordinateSystem(0,1,2);
00592
00593 btVector3 wheelDirectionL(0,-1,0);
00594 btVector3 wheelDirectionLD(-1,-1,0);
00595 btVector3 wheelDirectionR(0,-1,0);
00596 btVector3 wheelDirectionRD(1,-1,0);
00597 btVector3 wheelAxis(1,0,0);
00598
00599 float forwardWheelDist = 1.7f;
00600 float sideWheelDist = 0.75f;
00601 float backWheelDist = 1.8f;
00602 float wheelHeight = 0.3f;
00603
00604 btVector3 wheelFR(sideWheelDist,-wheelHeight,-forwardWheelDist);
00605 btVector3 wheelFL(-sideWheelDist,-wheelHeight,-forwardWheelDist);
00606 btVector3 wheelBR(sideWheelDist,-wheelHeight,backWheelDist);
00607 btVector3 wheelBL(-sideWheelDist,-wheelHeight,backWheelDist);
00608 btVector3 wheelBottom(0,-wheelHeight,0);
00609
00610 m_vehicle->addWheel(wheelFR,wheelDirectionR,wheelAxis,suspensionRestLength,wheelRadius,m_vehicleTuning,true);
00611 m_vehicle->addWheel(wheelFL,wheelDirectionL,wheelAxis,suspensionRestLength,wheelRadius,m_vehicleTuning,true);
00612 m_vehicle->addWheel(wheelBR,wheelDirectionR,wheelAxis,suspensionRestLength,wheelRadius,m_vehicleTuning,false);
00613 m_vehicle->addWheel(wheelBL,wheelDirectionL,wheelAxis,suspensionRestLength,wheelRadius,m_vehicleTuning,false);
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 for (int i=0;i<m_vehicle->getNumWheels();i++)
00649 {
00650 btWheelInfo& wheel = m_vehicle->getWheelInfo(i);
00651 wheel.m_suspensionStiffness = suspensionStiffness;
00652 wheel.m_wheelsDampingRelaxation = suspensionDamping;
00653 wheel.m_wheelsDampingCompression = suspensionCompression;
00654 wheel.m_frictionSlip = wheelFriction;
00655 wheel.m_rollInfluence = rollInfluence;
00656 }
00657
00658 #ifdef CRAFT_DEBUG_DRAW
00659
00660 Ogre::ManualObject* wheelRay;
00661 wheelRay = Application::getSingleton()->getViewerManager()->createManualObject(getName() + "wheelFR");
00662
00663 getSceneNode()->attachObject(wheelRay);
00664
00665 wheelRay->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST);
00666 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelFR));
00667 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelFR + wheelDirectionR * (suspensionRestLength + (wheelRadius * 2.0f))));
00668 wheelRay->end();
00669
00670 wheelRay = Application::getSingleton()->getViewerManager()->createManualObject(getName() + "wheelFL");
00671
00672 getSceneNode()->attachObject(wheelRay);
00673
00674 wheelRay->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST);
00675 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelFL));
00676 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelFL + wheelDirectionL * (suspensionRestLength + (wheelRadius * 2.0f))));
00677 wheelRay->end();
00678
00679 wheelRay = Application::getSingleton()->getViewerManager()->createManualObject(getName() + "wheelBR");
00680
00681 getSceneNode()->attachObject(wheelRay);
00682
00683 wheelRay->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST);
00684 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelBR));
00685 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelBR + wheelDirectionR * (suspensionRestLength + wheelRadius * 2.0f)));
00686 wheelRay->end();
00687
00688 wheelRay = Application::getSingleton()->getViewerManager()->createManualObject(getName() + "wheelBL");
00689
00690 getSceneNode()->attachObject(wheelRay);
00691
00692 wheelRay->begin("BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_LIST);
00693 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelBL));
00694 wheelRay->position(OgreBulletCollisions::BtOgreConverter::to(wheelBL + wheelDirectionL * (suspensionRestLength + wheelRadius * 2.0f)));
00695 wheelRay->end();
00696
00697 #endif
00698
00699
00700 #endif
00701
00702 #ifdef USE_SPRING
00703
00704 m_collisionShape = Application::getSingleton()->getPhysicsManager()->createCollisionShape(1.25f,1.75f,Ogre::Vector3::UNIT_Z);
00705
00706 m_rigidBody = Application::getSingleton()->getPhysicsManager()->createRigidBody(getName() + "rigidBody");
00707 m_balancer = Application::getSingleton()->getPhysicsManager()->createRigidBody(getName() + "balancerBody");
00708
00709 Ogre::Vector3 pos = getSceneNode()->getPosition();
00710 Ogre::Quaternion quat = getSceneNode()->getOrientation();
00711
00712 m_rigidBody->setShape(getSceneNode(), m_collisionShape, m_restitution ,m_friction, m_mass, pos, quat);
00713
00714 Application::getSingleton()->getPhysicsManager()->addPair(m_rigidBody, m_collisionShape);
00715
00716
00717 #endif
00718
00719 getRigidBody()->getBulletRigidBody()->setActivationState(DISABLE_DEACTIVATION);
00720
00721
00722 m_balancer = Application::getSingleton()->getPhysicsManager()->createRigidBody(getName() + "balancerBody");
00723
00724
00725
00726 OgreBulletCollisions::CollisionShape* nullBox = new OgreBulletCollisions::BoxCollisionShape(Ogre::Vector3::ZERO);
00727
00728 m_balancer->setShape(getSceneNode(), nullBox, 0 , 0, 0, Ogre::Vector3::ZERO, Ogre::Quaternion::IDENTITY);
00729
00730
00731 btTransform frameA( btTransform::getIdentity() );
00732 btTransform frameB( btTransform::getIdentity() );
00733 frameA.getBasis().setEulerZYX(0, 0, SIMD_HALF_PI);
00734
00735 m_balancer->getBulletRigidBody()->getWorldTransform().getBasis().setEulerZYX(0, 0, SIMD_HALF_PI);
00736
00737 m_constraintUpright = new btGeneric6DofConstraint(*getRigidBody()->getBulletRigidBody(), *m_balancer->getBulletRigidBody(), frameA, frameB, true );
00738 m_constraintUpright->setLimit( 0, -SIMD_INFINITY, SIMD_INFINITY );
00739 m_constraintUpright->setLimit( 1, -SIMD_INFINITY, SIMD_INFINITY );
00740 m_constraintUpright->setLimit( 2, -SIMD_INFINITY, SIMD_INFINITY );
00741 m_constraintUpright->setLimit( 3, -SIMD_PI, SIMD_PI );
00742 m_constraintUpright->setLimit( 4, -0.5, 0.5 );
00743 m_constraintUpright->setLimit( 5, -0.75, 0.75 );
00744
00745
00746 Application::getSingleton()->getPhysicsManager()->addConstraint(m_constraintUpright);
00747
00748
00749
00750
00751
00752
00753 m_rigidBody->getBulletRigidBody()->setUserPointer((void*)this);
00754 m_balancer->getBulletRigidBody()->setUserPointer((void*)this);
00755
00756 getRigidBody()->setDamping(0.1f,0.7f);
00757
00758 m_physical = true;
00759
00760 }
00761 return m_physical;
00762 }
00763
00764
00765 void Craft::projectDecal()
00766 {
00767
00768
00769
00770
00771
00772 Ogre::MaterialPtr material = (Ogre::MaterialPtr)Ogre::MaterialManager::getSingleton().getByName(m_trackMaterialName);
00773
00774 Ogre::Pass* renderPass = material->getTechnique(0)->createPass();
00775
00776
00777 renderPass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
00778
00779 renderPass->setDepthBias(1);
00780
00781 renderPass->setLightingEnabled(false);
00782
00783 renderPass->setSelfIllumination(m_trackDecalColour);
00784 renderPass->setDiffuse(0,0,0,1);
00785 renderPass->setAmbient(0,0,0);
00786
00787
00788 Ogre::TextureUnitState* textureState = renderPass->createTextureUnitState(m_trackDecalName);
00789
00790 textureState->setProjectiveTexturing(true, m_trackProjectFrustum);
00791
00792 textureState->setTextureAddressingMode(Ogre::TextureUnitState::TAM_BORDER);
00793
00794
00795 textureState->setTextureBorderColour(Ogre::ColourValue(0,0,0,0));
00796
00797 textureState->setTextureFiltering(Ogre::FO_POINT, Ogre::FO_LINEAR, Ogre::FO_NONE);
00798
00799 #ifdef USE_EDGE_IMAGE
00800
00801 material = (Ogre::MaterialPtr)Ogre::MaterialManager::getSingleton().getByName(m_wallMaterialName);
00802
00803 renderPass = material->getTechnique(0)->createPass();
00804
00805
00806 renderPass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
00807
00808 renderPass->setDepthBias(1);
00809
00810 renderPass->setLightingEnabled(false);
00811
00812 renderPass->setFragmentProgram("trackFragment");
00813
00814 textureState = renderPass->createTextureUnitState(m_wallDecalName);
00815
00816 textureState->setProjectiveTexturing(true, m_wallProjectFrustum);
00817
00818 textureState->setTextureAddressingMode(Ogre::TextureUnitState::TAM_BORDER);
00819
00820
00821 textureState->setTextureBorderColour(Ogre::ColourValue(0,0,0,0));
00822
00823 textureState->setTextureFiltering(Ogre::FO_POINT, Ogre::FO_LINEAR, Ogre::FO_NONE);
00824 #endif
00825 }
00826
00827 Ogre::Real Craft::getThrustForward()
00828 {
00829 return m_thrustForward;
00830 }
00831
00832 Ogre::Real Craft::getThrustBackward()
00833 {
00834 return m_thrustBackward;
00835 }
00836
00837 Ogre::Real Craft::getTurnForce()
00838 {
00839 return m_turnForce;
00840 }
00841
00842 Ogre::Real Craft::getEngineThrustForward()
00843 {
00844 return m_engineThrustForward;
00845 }
00846
00847 Ogre::Real Craft::getEngineThrustBackward()
00848 {
00849 return m_engineThrustBackward;
00850 }
00851
00852 Ogre::Real Craft::getEngineTurnForce()
00853 {
00854 return m_engineTurnForce;
00855 }
00856
00857 Ogre::Real Craft::getFalseFriction()
00858 {
00859 return m_falseFriction;
00860 }
00861
00862 void Craft::setThrustForward(Ogre::Real& _val)
00863 {
00864 m_thrustForward = _val;
00865 }
00866 void Craft::setThrustBackward(Ogre::Real& _val)
00867 {
00868 m_thrustBackward = _val;
00869 }
00870 void Craft::setTurnForce(Ogre::Real& _val)
00871 {
00872 m_turnForce = _val;
00873 }
00874
00875 void Craft::setEngineThrustForward(Ogre::Real& _val)
00876 {
00877 m_engineThrustForward = _val;
00878 }
00879 void Craft::setEngineThrustBackward(Ogre::Real& _val)
00880 {
00881 m_engineThrustForward = _val;
00882 }
00883 void Craft::setEngineTurnForce(Ogre::Real& _val)
00884 {
00885 m_engineTurnForce = _val;
00886 }
00887
00888 void Craft::setFalseFriction(Ogre::Real& _val)
00889 {
00890 m_falseFriction = _val;
00891 }
00892
00894 void Craft::tryResetPosition()
00895 {
00896 m_rigidBody->setLinearVelocity(Ogre::Vector3::ZERO);
00897 Ogre::Vector3 tempPos = getSceneNode()->getPosition() + Ogre::Vector3::UNIT_Y;
00898 Ogre::Quaternion tempOrientation = getSceneNode()->getOrientation();
00899 Ogre::Vector3 position;
00900 btTransform transform;
00901 transform.setIdentity();
00902 transform.setOrigin(OgreBulletCollisions::OgreBtConverter::to(tempPos));
00903 transform.setRotation(OgreBulletCollisions::OgreBtConverter::to(tempOrientation));
00904 m_rigidBody->getBulletRigidBody()->setWorldTransform(transform);
00905
00906 }