summaryrefslogtreecommitdiff
path: root/Runtime/Utilities/SpatialHash.h
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Utilities/SpatialHash.h
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Utilities/SpatialHash.h')
-rw-r--r--Runtime/Utilities/SpatialHash.h50
1 files changed, 50 insertions, 0 deletions
diff --git a/Runtime/Utilities/SpatialHash.h b/Runtime/Utilities/SpatialHash.h
new file mode 100644
index 0000000..74dd01e
--- /dev/null
+++ b/Runtime/Utilities/SpatialHash.h
@@ -0,0 +1,50 @@
+#pragma once
+
+#include "Runtime/Geometry/Plane.h"
+#include "Runtime/Utilities/dynamic_array.h"
+#include "Runtime/Utilities/dense_hash_map.h"
+#include <algorithm>
+
+static const float kVoxelHeightMultiplier = 4.f;
+
+struct PlaneData
+{
+ PlaneData () {}
+ PlaneData (const Plane& plane, int colliderInstanceID, int rigidBodyOrColliderInstanceID)
+ : m_Plane (plane)
+ , m_ColliderInstanceID (colliderInstanceID)
+ , m_RigidBodyOrColliderInstanceID (rigidBodyOrColliderInstanceID)
+ {}
+ Plane m_Plane;
+ int m_ColliderInstanceID;
+ int m_RigidBodyOrColliderInstanceID;
+};
+
+// Collision plane cache using the google dense hashmap
+class PlaneColliderCache_dense_hashmap
+{
+public:
+ PlaneColliderCache_dense_hashmap ();
+ ~PlaneColliderCache_dense_hashmap () {Clear();}
+ int Size () const { return m_PlaneHashMap.size(); };
+ bool Find (const Vector3f& pos, const Vector3f& dir, Plane& plane, int& colliderInstanceID, int& rigidBodyOrColliderInstanceID, float voxelSize) const;
+ bool Replace (const Vector3f& pos, const Vector3f& dir, const Plane& plane, int colliderInstanceID, int rigidBodyOrColliderInstanceID, float voxelSize);
+ void Clear ()
+ {
+ m_PlaneHashMap.clear ();
+ }
+private:
+ // Hash map for cached planes
+ struct UInt64HashFunctor
+ {
+ inline size_t operator ()(UInt64 x) const
+ {
+ return int(x >> 32);
+ }
+ };
+ typedef std::pair<const UInt64, PlaneData> KeyToPlanePair;
+ typedef dense_hash_map<UInt64, PlaneData, UInt64HashFunctor, std::equal_to<UInt64>, STL_ALLOCATOR (kMemSTL, KeyToPlanePair) > PlaneHashMap;
+ PlaneHashMap m_PlaneHashMap;
+};
+
+typedef PlaneColliderCache_dense_hashmap PlaneColliderCache;