aboutsummaryrefslogtreecommitdiff
path: root/PhysX_3.4/Source/LowLevelParticles/src/PtSpatialHashHelper.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /PhysX_3.4/Source/LowLevelParticles/src/PtSpatialHashHelper.h
downloadphysx-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/Source/LowLevelParticles/src/PtSpatialHashHelper.h')
-rw-r--r--PhysX_3.4/Source/LowLevelParticles/src/PtSpatialHashHelper.h162
1 files changed, 162 insertions, 0 deletions
diff --git a/PhysX_3.4/Source/LowLevelParticles/src/PtSpatialHashHelper.h b/PhysX_3.4/Source/LowLevelParticles/src/PtSpatialHashHelper.h
new file mode 100644
index 00000000..ac4845ba
--- /dev/null
+++ b/PhysX_3.4/Source/LowLevelParticles/src/PtSpatialHashHelper.h
@@ -0,0 +1,162 @@
+// 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 PT_SPATIAL_HASH_HELPER_H
+#define PT_SPATIAL_HASH_HELPER_H
+
+#include "PxPhysXConfig.h"
+#if PX_USE_PARTICLE_SYSTEM_API
+
+#include "PtParticleCell.h"
+
+namespace physx
+{
+
+namespace Pt
+{
+
+PX_FORCE_INLINE PxU32 hashFunction(const GridCellVector& coord, PxU32 numHashBuckets)
+{
+ PX_ASSERT((((numHashBuckets - 1) ^ numHashBuckets) + 1) == (2 * numHashBuckets));
+
+ return ((static_cast<PxU32>(coord.x) + 101 * static_cast<PxU32>(coord.y) + 7919 * static_cast<PxU32>(coord.z)) &
+ (numHashBuckets - 1));
+ // sschirm: weird! The version that spreads all the coordinates is slower! Is the reason the additional
+ // multiplication?
+ // return ( (101*static_cast<PxU32>(coord.x) + 7919*static_cast<PxU32>(coord.y) +
+ // 73856093*static_cast<PxU32>(coord.z)) & (numHashBuckets - 1) );
+}
+
+PX_FORCE_INLINE PxU32 getCellIndex(const GridCellVector& coord, const ParticleCell* cells, PxU32 numHashBuckets)
+{
+#if PX_DEBUG
+ PxU32 tries = 0;
+#endif
+
+ PxU32 key = hashFunction(coord, numHashBuckets);
+ const ParticleCell* cell = &cells[key];
+
+ while((cell->numParticles != PX_INVALID_U32) && (coord != cell->coords))
+ {
+ key = (key + 1) & (numHashBuckets - 1);
+ cell = &cells[key];
+
+#if PX_DEBUG
+ tries++;
+#endif
+ PX_ASSERT(tries < numHashBuckets);
+ }
+
+ return key;
+}
+
+/*
+Compute packet section index for given cell coordinate. The packet sections are indexed as follows.
+
+Left packet boundary Front packet boundary Top packet boundary
+__________________ __________________ __________________
+| 3 | 5 | 4 | | 4 | 22 |13 | | 3 | 21 |12 |
+|___|________|___| |___|________|___| |___|________|___|
+| | | | | | | | | | | |
+| 6 | 8 | 7 | | 7 | 25 |16 | | 5 | 23 |14 |
+| | | | | | | | | | | |
+|___|________|___| |___|________|___| |___|________|___|
+| 0 | 2 | 1 | | 1 | 19 |10 | | 4 | 22 |13 |
+|___|________|___| |___|________|___| |___|________|___|
+
+Right packet boundary Rear packet boundary Bottom packet boundary
+__________________ __________________ __________________
+|13 | 14 |12 | |12 | 21 | 3 | | 1 | 19 |10 |
+|___|________|___| |___|________|___| |___|________|___|
+| | | | | | | | | | | |
+|16 | 17 |15 | |15 | 24 | 6 | | 2 | 20 |11 |
+| | | | | | | | | | | |
+|___|________|___| |___|________|___| |___|________|___|
+|10 | 11 | 9 | |9 | 18 | 0 | | 0 | 18 | 9 |
+|___|________|___| |___|________|___| |___|________|___|
+
+Note: One section is missing in this illustration. Section 26 is in the middle of the packet and
+ enclosed by the other sections. For particles in section 26 we know for sure that no interaction
+ with particles of neighboring packets occur.
+*/
+PX_FORCE_INLINE PxU32
+getPacketSectionIndex(const GridCellVector& cellCoords, const GridCellVector& packetMinCellCoords, PxU32 packetMult)
+{
+ PxU32 sectionIndex = 0;
+
+ // Translate cell coordinates such that the minimal cell coordinate of the packet is at the origin (0,0,0)
+ GridCellVector coord(cellCoords);
+ coord -= packetMinCellCoords;
+
+ // Find section the particle cell belongs to.
+
+ if(PxU32(coord.x + 1) == packetMult)
+ {
+ // Right side boundary of packet
+ sectionIndex = 9;
+ }
+ else if(coord.x != 0)
+ {
+ sectionIndex = 18;
+ }
+ // else: Left side boundary of packet
+
+ //-----------
+
+ if(PxU32(coord.y + 1) == packetMult)
+ {
+ // Top boundary of packet
+ sectionIndex += 3;
+ }
+ else if(coord.y != 0)
+ {
+ sectionIndex += 6;
+ }
+ // else: Bottom boundary of packet
+
+ //-----------
+
+ if(PxU32(coord.z + 1) == packetMult)
+ {
+ // Front boundary of packet
+ sectionIndex += 1;
+ }
+ else if(coord.z != 0)
+ {
+ sectionIndex += 2;
+ }
+ // else: Rear boundary of packet
+
+ return sectionIndex;
+}
+
+} // namespace Pt
+} // namespace physx
+
+#endif // PX_USE_PARTICLE_SYSTEM_API
+#endif // PT_SPATIAL_HASH_HELPER_H