PxVehicleDrive.h

Go to the documentation of this file.
00001 //
00002 // Redistribution and use in source and binary forms, with or without
00003 // modification, are permitted provided that the following conditions
00004 // are met:
00005 //  * Redistributions of source code must retain the above copyright
00006 //    notice, this list of conditions and the following disclaimer.
00007 //  * Redistributions in binary form must reproduce the above copyright
00008 //    notice, this list of conditions and the following disclaimer in the
00009 //    documentation and/or other materials provided with the distribution.
00010 //  * Neither the name of NVIDIA CORPORATION nor the names of its
00011 //    contributors may be used to endorse or promote products derived
00012 //    from this software without specific prior written permission.
00013 //
00014 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
00015 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00016 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00017 // PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
00018 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00019 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00020 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00021 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
00022 // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00023 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00024 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025 //
00026 // Copyright (c) 2008-2018 NVIDIA Corporation. All rights reserved.
00027 // Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
00028 // Copyright (c) 2001-2004 NovodeX AG. All rights reserved.  
00029 
00030 #ifndef PX_VEHICLE_DRIVE_H
00031 #define PX_VEHICLE_DRIVE_H
00032 
00036 #include "vehicle/PxVehicleWheels.h"
00037 #include "vehicle/PxVehicleComponents.h"
00038 
00039 #if !PX_DOXYGEN
00040 namespace physx
00041 {
00042 #endif
00043 
00044 struct PxFilterData;
00045 class PxGeometry;
00046 class PxPhysics;
00047 class PxBatchQuery;
00048 class PxVehicleDrivableSurfaceToTireFrictionPairs;
00049 class PxShape;
00050 class PxMaterial;
00051 class PxRigidDynamic;
00052 
00057 class PxVehicleDriveSimData
00058 {
00059 //= ATTENTION! =====================================================================================
00060 // Changing the data layout of this class breaks the binary serialization format.  See comments for 
00061 // PX_BINARY_SERIAL_VERSION.  If a modification is required, please adjust the getBinaryMetaData 
00062 // function.  If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION
00063 // accordingly.
00064 //==================================================================================================
00065 public:
00066 
00067     friend class PxVehicleDriveTank;
00068 
00072     PX_FORCE_INLINE const PxVehicleEngineData& getEngineData() const 
00073     {
00074         return mEngine;
00075     }
00076     
00081     void setEngineData(const PxVehicleEngineData& engine);
00082 
00086     PX_FORCE_INLINE const PxVehicleGearsData& getGearsData() const 
00087     {
00088         return mGears;
00089     }
00090     
00095     void setGearsData(const PxVehicleGearsData& gears);
00096 
00100     PX_FORCE_INLINE const PxVehicleClutchData& getClutchData() const 
00101     {
00102         return mClutch;
00103     }
00104     
00109     void setClutchData(const PxVehicleClutchData& clutch);
00110 
00114     PX_FORCE_INLINE const PxVehicleAutoBoxData& getAutoBoxData() const 
00115     {
00116         return mAutoBox;
00117     }
00118 
00123     void setAutoBoxData(const PxVehicleAutoBoxData& autobox);
00124 
00125 protected:
00126     /*
00127     \brief Engine simulation data
00128     @see setEngineData, getEngineData
00129     */
00130     PxVehicleEngineData             mEngine;
00131 
00132     /*
00133     \brief Gear simulation data
00134     @see setGearsData, getGearsData
00135     */
00136     PxVehicleGearsData              mGears;
00137 
00138     /*
00139     \brief Clutch simulation data
00140     @see setClutchData, getClutchData
00141     */
00142     PxVehicleClutchData             mClutch;
00143 
00144     /*
00145     \brief Autobox simulation data
00146     @see setAutoboxData, getAutoboxData
00147     */
00148     PxVehicleAutoBoxData            mAutoBox;
00149 
00155     bool isValid() const;
00156 
00157 
00158 //serialization
00159 public:
00160     PxVehicleDriveSimData() {}
00161     PxVehicleDriveSimData(const PxEMPTY) :  mEngine(PxEmpty), mGears(PxEmpty), mClutch(PxEmpty), mAutoBox(PxEmpty) {}
00162     static void getBinaryMetaData(PxOutputStream& stream);
00163 //~serialization
00164 };
00165 PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveSimData) & 15));
00166 
00167 
00172 class PxVehicleDriveDynData
00173 {
00174 public:
00175     
00176     enum
00177     {
00178         eMAX_NB_ANALOG_INPUTS=16
00179     };
00180 
00181     friend class PxVehicleDrive;
00182 
00186     void setToRestState();
00187 
00194     void setAnalogInput(const PxU32 type, const PxReal analogVal);
00195 
00201     PxReal getAnalogInput(const PxU32 type) const;
00202 
00212     void setGearUp(const bool digitalVal) 
00213     {
00214         mGearUpPressed = digitalVal;
00215     }
00216 
00226     void setGearDown(const bool digitalVal) 
00227     {
00228         mGearDownPressed = digitalVal;
00229     }
00230 
00235     bool getGearUp() const 
00236     {
00237         return mGearUpPressed;
00238     }
00239 
00244     bool getGearDown() const 
00245     {
00246         return mGearDownPressed;
00247     }
00248 
00254     PX_FORCE_INLINE void setUseAutoGears(const bool useAutoGears)
00255     {
00256         mUseAutoGears=useAutoGears;
00257     }
00258 
00263     PX_FORCE_INLINE bool getUseAutoGears() const
00264     {
00265         return mUseAutoGears;
00266     }
00267 
00272     PX_FORCE_INLINE void toggleAutoGears() 
00273     {
00274         mUseAutoGears = !mUseAutoGears;
00275     }
00276 
00288     PX_FORCE_INLINE void setCurrentGear(PxU32 currentGear) 
00289     {
00290         mCurrentGear = currentGear;
00291     }
00292 
00300     PX_FORCE_INLINE PxU32 getCurrentGear() const
00301     {
00302         return mCurrentGear;
00303     }
00304 
00316     PX_FORCE_INLINE void setTargetGear(PxU32 targetGear) 
00317     {
00318         mTargetGear = targetGear;
00319     }
00320 
00328     PX_FORCE_INLINE PxU32 getTargetGear() const
00329     {
00330         return mTargetGear;
00331     }
00332     
00342     PX_FORCE_INLINE void startGearChange(const PxU32 targetGear)
00343     {
00344         mTargetGear=targetGear;
00345     }
00346 
00354     PX_FORCE_INLINE void forceGearChange(const PxU32 targetGear)
00355     {
00356         mTargetGear=targetGear;
00357         mCurrentGear=targetGear;
00358     }
00359 
00365     PX_FORCE_INLINE void setEngineRotationSpeed(const PxF32 speed)
00366     {
00367         mEnginespeed = speed;
00368     }
00369 
00375     PX_FORCE_INLINE PxReal getEngineRotationSpeed() const
00376     {
00377         return mEnginespeed;
00378     }
00379 
00389     PX_FORCE_INLINE PxReal getGearSwitchTime() const
00390     {
00391         return mGearSwitchTime;
00392     }
00393 
00401     PX_FORCE_INLINE PxReal getAutoBoxSwitchTime() const
00402     {
00403         return mAutoBoxSwitchTime;
00404     }
00405 
00415     PxReal mControlAnalogVals[eMAX_NB_ANALOG_INPUTS];
00416 
00421     bool mUseAutoGears;
00422 
00430     bool mGearUpPressed;
00431 
00439     bool mGearDownPressed;
00440 
00445     PxU32 mCurrentGear;
00446 
00451     PxU32 mTargetGear;
00452 
00457     PxReal mEnginespeed;
00458 
00463     PxReal mGearSwitchTime;
00464 
00469     PxReal mAutoBoxSwitchTime;
00470 
00471 private:
00472     PxU32 mPad[2];
00473 
00478     bool isValid() const;
00479 
00480 //serialization
00481 public:
00482     PxVehicleDriveDynData();
00483     PxVehicleDriveDynData(const PxEMPTY)  {}
00484     PxU32 getNbAnalogInput() const { return eMAX_NB_ANALOG_INPUTS; }
00485     PX_FORCE_INLINE void setGearChange(const PxU32 gearChange) { mTargetGear= gearChange; }
00486     PX_FORCE_INLINE PxU32 getGearChange() const { return mTargetGear; }
00487     PX_FORCE_INLINE void setGearSwitchTime(const PxReal switchTime) { mGearSwitchTime = switchTime; }
00488     PX_FORCE_INLINE void setAutoBoxSwitchTime(const PxReal autoBoxSwitchTime) { mAutoBoxSwitchTime = autoBoxSwitchTime; }
00489 //~serialization
00490 };
00491 PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDriveDynData) & 15));
00492 
00497 class PxVehicleDrive : public PxVehicleWheels
00498 {
00499 //= ATTENTION! =====================================================================================
00500 // Changing the data layout of this class breaks the binary serialization format.  See comments for 
00501 // PX_BINARY_SERIAL_VERSION.  If a modification is required, please adjust the getBinaryMetaData 
00502 // function.  If the modification is made on a custom branch, please change PX_BINARY_SERIAL_VERSION
00503 // accordingly.
00504 //==================================================================================================
00505 public:
00506 
00507     friend class PxVehicleUpdate;
00508 
00513     PxVehicleDriveDynData mDriveDynData;
00514 
00515 protected:
00516     
00520     bool isValid() const;
00521 
00525     void setToRestState();
00526 
00530     static PxU32 computeByteSize(const PxU32 numWheels);
00531     static PxU8* patchupPointers(const PxU32 nbWheels, PxVehicleDrive* vehDrive, PxU8* ptr);
00532     virtual void init(const PxU32 numWheels);
00533 
00538     void free();
00539 
00543     void setup
00544         (PxPhysics* physics, PxRigidDynamic* vehActor, 
00545          const PxVehicleWheelsSimData& wheelsData,
00546          const PxU32 nbDrivenWheels, const PxU32 nbNonDrivenWheels);
00547 
00548 //serialization
00549 public:
00550     static void getBinaryMetaData(PxOutputStream& stream);
00551     PxVehicleDrive(PxBaseFlags baseFlags) : PxVehicleWheels(baseFlags), mDriveDynData(PxEmpty) {}
00552     virtual const char* getConcreteTypeName() const { return "PxVehicleDrive"; }
00553 protected:
00554     PxVehicleDrive(PxType concreteType, PxBaseFlags baseFlags) : PxVehicleWheels(concreteType, baseFlags) {}    
00555     ~PxVehicleDrive() {}
00556     virtual bool isKindOf(const char* name) const { return !::strcmp("PxVehicleDrive", name) || PxBase::isKindOf(name); }
00557 //~serialization
00558 };
00559 PX_COMPILE_TIME_ASSERT(0==(sizeof(PxVehicleDrive) & 15));
00560 
00561 #if !PX_DOXYGEN
00562 } // namespace physx
00563 #endif
00564 
00566 #endif //PX_VEHICLE_DRIVE_H


Copyright © 2008-2018 NVIDIA Corporation, 2701 San Tomas Expressway, Santa Clara, CA 95050 U.S.A. All rights reserved. www.nvidia.com