Files
PhysX4.1/physx/samples/samplevehicle/SampleVehicle.h
2025-11-28 23:13:44 +05:30

199 lines
7.3 KiB
C++

//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of NVIDIA CORPORATION nor the names of its
// contributors may be used to endorse or promote products derived
// from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
#ifndef SAMPLE_VEHICLE_H
#define SAMPLE_VEHICLE_H
#include "PhysXSample.h"
#include "SampleVehicle_ControlInputs.h"
#include "SampleVehicle_CameraController.h"
#include "SampleVehicle_VehicleController.h"
#include "SampleVehicle_VehicleManager.h"
#include "SampleVehicle_GameLogic.h"
#include "vehicle/PxVehicleTireFriction.h"
class SampleVehicle : public PhysXSample
{
public:
SampleVehicle(PhysXSampleApplication& app);
virtual ~SampleVehicle();
///////////////////////////////////////////////////////////////////////////////
// Implements RAWImportCallback
virtual void newMesh(const RAWMesh&);
///////////////////////////////////////////////////////////////////////////////
// Implements SampleApplication
virtual void onInit();
virtual void onInit(bool restart) { onInit(); }
virtual void onShutdown();
virtual void onTickPreRender(PxF32 dtime);
virtual void onTickPostRender(PxF32 dtime);
virtual void onDigitalInputEvent(const SampleFramework::InputEvent& , bool val);
virtual void onAnalogInputEvent(const SampleFramework::InputEvent& , float val);
///////////////////////////////////////////////////////////////////////////////
// Implements PhysXSampleApplication
virtual void helpRender(PxU32 x, PxU32 y, PxU8 textAlpha);
virtual void descriptionRender(PxU32 x, PxU32 y, PxU8 textAlpha);
virtual void customizeSample(SampleSetup&);
virtual void customizeSceneDesc(PxSceneDesc&);
virtual void customizeRender();
virtual void onSubstep(PxF32 dtime);
virtual void collectInputEvents(std::vector<const SampleFramework::InputEvent*>& inputEvents);
private:
SampleVehicle_ControlInputs mControlInputs;
SampleVehicle_CameraController mCameraController;
SampleVehicle_VehicleController mVehicleController;
//Terrain
PxF32* mTerrainVB;
PxU32 mNbTerrainVerts;
enum
{
MAX_NUM_INDEX_BUFFERS = 16
};
PxU32 mNbIB;
PxU32* mIB[MAX_NUM_INDEX_BUFFERS];
PxU32 mNbTriangles[MAX_NUM_INDEX_BUFFERS];
PxU32 mRenderMaterial[MAX_NUM_INDEX_BUFFERS];
//Materials
PxVehicleDrivableSurfaceType mVehicleDrivableSurfaceTypes[MAX_NUM_INDEX_BUFFERS];
PxMaterial* mStandardMaterials[MAX_NUM_INDEX_BUFFERS];
PxMaterial* mChassisMaterialDrivable;
PxMaterial* mChassisMaterialNonDrivable;
RenderMaterial* mTerrainMaterial;
RenderMaterial* mRoadMaterial;
RenderMaterial* mRoadIceMaterial;
RenderMaterial* mRoadGravelMaterial;
void createStandardMaterials();
enum eFocusVehicleType
{
ePLAYER_VEHICLE_TYPE_VEHICLE4W=0,
ePLAYER_VEHICLE_TYPE_VEHICLE6W,
ePLAYER_VEHICLE_TYPE_TANK4W,
ePLAYER_VEHICLE_TYPE_TANK6W,
eMAX_NUM_FOCUS_VEHICLE_TYPES
};
// Vehicles
SampleVehicle_VehicleManager mVehicleManager;
std::vector<RenderMeshActor*> mVehicleGraphics;
PxU32 mPlayerVehicle;
eFocusVehicleType mPlayerVehicleType;
PxVehicleDriveTankControlModel::Enum mTankDriveModel;
const char* getFocusVehicleName();
void createVehicles();
PxU32 mTerrainSize;
PxF32 mTerrainWidth;
PxRigidActor* mHFActor;
void createTrack(PxU32 size, PxF32 width, PxF32 chaos);
void createTerrain(PxU32 size, PxF32 width, PxF32 chaos);
void addRenderMesh(PxF32* verts, PxU32 nVerts, PxU32* indices, PxU32 mIndices, PxU32 matID);
void addMesh(PxRigidActor* actor, PxF32* verts, PxU32 nVerts, PxU32* indices, PxU32 mIndices, PxU32 materialIndex, const char* filename);
void createLandscapeMesh();
//Obstacles
void createObstacles();
PxRigidStatic* addStaticObstacle(const PxTransform& transform, const PxU32 numShapes, PxTransform* shapeTransforms, PxGeometry** shapeGeometries, PxMaterial** shapeMaterials);
PxRigidDynamic* addDynamicObstacle(const PxTransform& transform, const PxF32 mass, const PxU32 numShapes, PxTransform* transforms, PxGeometry** geometries, PxMaterial** materials);
PxRigidDynamic* addDynamicDrivableObstacle(const PxTransform& transform, const PxF32 mass, const PxU32 numShapes, PxTransform* transforms, PxGeometry** geometries, PxMaterial** materials);
void createStack(PxU32 size, PxF32 boxSize, const PxVec3& pos, const PxQuat& quat);
void createWall(const PxU32 numHorizontalBoxes, const PxU32 numVerticalBoxes, const PxF32 boxSize, const PxVec3& pos, const PxQuat& quat);
//Debug render
bool mHideScreenText;
bool mDebugRenderFlag;
#if PX_DEBUG_VEHICLE_ON
PxU32 mDebugRenderActiveGraphChannelWheel;
PxU32 mDebugRenderActiveGraphChannelEngine;
PxVehicleTelemetryData* mTelemetryData4W;
PxVehicleTelemetryData* mTelemetryData6W;
#endif
void setupTelemetryData();
void clearTelemetryData();
void drawWheels();
void drawVehicleDebug();
void drawHud();
void drawGraphsAndPrintTireSurfaceTypes(const PxVehicleWheels& focusVehicle, const PxVehicleWheelQueryResult& focusVehicleWheelQueryResults);
void drawFocusVehicleGraphsAndPrintTireSurfaces();
//Waypoints
SampleVehicleWayPoints mWayPoints;
bool mFixCar;
bool mBackToStart;
//3W and 4W modes
bool m3WModeIncremented;
PxU32 m3WMode;
PxF32 mForwardSpeedHud;
#if defined(SERIALIZE_VEHICLE_BINARY)
void* mMemory;
#endif
void updateCameraController(const PxF32 dtime, PxScene& scene);
void updateVehicleController(const PxF32 dtime);
void updateVehicleManager(const PxF32 dtime, const PxVec3& gravity);
void resetFocusVehicleAtWaypoint();
PxRigidDynamic* getFocusVehicleRigidDynamicActor();
bool getFocusVehicleUsesAutoGears();
char mVehicleFilePath[256];
};
#endif