diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Samples/SampleLargeWorld/ChunkLoader.h | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'PhysX_3.4/Samples/SampleLargeWorld/ChunkLoader.h')
| -rw-r--r-- | PhysX_3.4/Samples/SampleLargeWorld/ChunkLoader.h | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/PhysX_3.4/Samples/SampleLargeWorld/ChunkLoader.h b/PhysX_3.4/Samples/SampleLargeWorld/ChunkLoader.h new file mode 100644 index 00000000..b6edbe3f --- /dev/null +++ b/PhysX_3.4/Samples/SampleLargeWorld/ChunkLoader.h @@ -0,0 +1,242 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and related documentation and +// any modifications thereto. Any use, reproduction, disclosure, or +// distribution of this software and related documentation without an express +// license agreement from NVIDIA Corporation is strictly prohibited. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2008-2016 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 CHUNKLOADER_H +#define CHUNKLOADER_H + +#include "PsMutex.h" +#include "PsThread.h" +#include "PhysXSample.h" + +#include "PsTime.h" + +#define ENABLE_PROGRESS_BAR 1 + +typedef PxU16 CoordType; +typedef PxU32 IDType; + +#define N1 7 +//The terrain has 16*16 grids +#define N2 256 + +//The width of each terrain chunk, this is the hardcoded number accroding to Terrain.bin +#define CHUNK_WIDTH 256.0f + +#define MATERIAL_ROAD_GRASS 1003 +#define MATERIAL_BRICKS 1004 +#define MATERIAL_BUILDING 1005 +#define MATERIAL_FARM 1006 +#define MATERIAL_TREE 1007 + +PX_FORCE_INLINE PxShape* getShape(const PxRigidActor& actor) +{ + PX_ASSERT(actor.getNbShapes() >= 1); + PxShape* shape = NULL; + actor.getShapes(&shape, 1); + return shape; +} + +typedef union +{ + struct{ + CoordType x, y; + } coord; + IDType id; + +}ChunkID; + +static PX_INLINE bool operator < (const ChunkID& _Left, const ChunkID& _Right) +{ + return _Left.id < _Right.id; +} +static PX_INLINE bool operator == (const ChunkID& _Left, PxU32 _Right) +{ + return _Left.id == _Right; +} + +static PX_INLINE bool operator == (const ChunkID& _Left, ChunkID _Right) +{ + return _Left.id == _Right.id; +} + +struct ChunkCommandType +{ + enum Enum + { + eAdd, + eRemove + }; +}; + +struct ChunkCommand +{ + ChunkCommand(ChunkCommandType::Enum _type, const ChunkID& _id) + { + type = _type; + id = _id; + } + + ChunkCommandType::Enum type; + ChunkID id; +}; + +struct DynamicObjects +{ + DynamicObjects(PxRigidDynamic* _actor, bool _isImportant) + { + actor = _actor; + isImportant = _isImportant; + id.id = 0; + } + + PxRigidDynamic* actor; + bool isImportant; + ChunkID id; +}; + +class SampleLargeWorld; +class BackgroundLoader : public SampleAllocateable +{ +public: + struct DeferredLoadedRenderData : public RAWMesh + { + DeferredLoadedRenderData():shape(NULL){} + //the shape to link with + PxShape* shape; + }; +public: + + BackgroundLoader(SampleLargeWorld& sample, CoordType halfRange, CoordType terrainRange, PxF32 chunkWidth); + ~BackgroundLoader(); + + void addDynamicObject(PxRigidDynamic* inActor, bool inIsImportant) + { + mDyncActors.push_back(new DynamicObjects(inActor, inIsImportant)); + updateDynamicChunkId(); + } + + void onTick(); + void updateChunk(const PxVec3& cameraPos); + + //The lock for accessing streaming progress and timing status + Ps::ReadWriteLock mLoaderStatusLock; + + +#ifdef ENABLE_PROGRESS_BAR + volatile PxU32 mQueryLength; + volatile PxF32 mQueryProgress; +#endif + + volatile Ps::Time::Second mDiskIOTime; + volatile Ps::Time::Second mPhyXStreamTime; + volatile Ps::Time::Second mGraphicStreamTime; + +private: + const char* getPathname( ChunkID id ); + + void serialize(PxCollection* collection, ChunkID id); + + void addReadyChunkToScene(ChunkID id); + void destroyChunk(ChunkID id); + + void updateDynamicChunkId(); + + //Return NULL means already loaded or cannot load + PxCollection* loadChunk(ChunkID id); + + void createRenderObjectsFromCollection(PxCollection* collection); + void deleteLoadedRenderQueue(); + void deleteCollections(); + + void* loaderThread(); + static void* loaderThread(void* loader); + + DeferredLoadedRenderData* createRawMeshFromObjMesh(const char* name, const PxTransform& pos, DeferredLoadedRenderData& rawMesh); + +private: + + struct CollectionMemory + { + CollectionMemory() + : collection(NULL) + , memory(NULL) + , addToScene(false) + { + + } + + PxCollection* collection; + void* memory; + bool addToScene; + }; + + typedef std::map<ChunkID, CollectionMemory> CollectionIdMap; + CollectionIdMap mCollectionIdMap; + + std::vector<ChunkID> mRequestQueue; + std::vector<DynamicObjects*> mDyncActors; + std::vector<PxActor*> mRemovingActors; + + //We calculate terrain's normals and store here + std::vector<DeferredLoadedRenderData> mLoadedRenderDataQueue; + + physx::shdfnd::Thread* mLoaderThread; + + //The lock to access ChunkQueue arrays + physx::shdfnd::Mutex mQueueLock; + + //The lock to access mCollectionIdMap + physx::shdfnd::Mutex mCollectionLock; + + //A signal to inform background thread new jobs + shdfnd::Sync mRequestReady; + + SampleLargeWorld* mSampleLargeWorld; + PxPhysics& mPhysics; + PxScene& mScene; + PxMaterial& mMaterial; + + ChunkID mCurChunkId; + CoordType mHalfRange; + CoordType mTerrainRange; + PxF32 mChunkWidth; + + //Internal Timing varialbe + Ps::Time::Second mDiskIOTimeCounter; + Ps::Time::Second mPhyXStreamTimeCounter; + Ps::Time::Second mGraphicStreamTimeCounter; + PxBounds3 mLocalBounds; + + PxSerializationRegistry* mSr; + std::vector<ChunkCommand> mChunkCmds; +}; + +#endif + |