ncollide3d/pipeline/object/
collision_object_set.rs
1use simba::scalar::RealField;
2
3use crate::pipeline::object::{CollisionObject, CollisionObjectRef, CollisionObjectSlabHandle};
4use slab::{Iter, IterMut, Slab};
5use std::hash::Hash;
6use std::ops::{Index, IndexMut};
7
8pub trait CollisionObjectHandle: Copy + Hash + PartialEq + Eq + 'static + Send + Sync {}
10
11impl<T: Copy + Hash + PartialEq + Eq + 'static + Send + Sync> CollisionObjectHandle for T {}
12
13pub trait CollisionObjectSet<N: RealField + Copy> {
18 type CollisionObject: CollisionObjectRef<N>;
20 type CollisionObjectHandle: CollisionObjectHandle;
22
23 fn collision_object(
25 &self,
26 handle: Self::CollisionObjectHandle,
27 ) -> Option<&Self::CollisionObject>;
28 fn foreach(&self, f: impl FnMut(Self::CollisionObjectHandle, &Self::CollisionObject));
30}
31
32impl<N: RealField + Copy, T> CollisionObjectSet<N> for CollisionObjectSlab<N, T> {
33 type CollisionObject = CollisionObject<N, T>;
34 type CollisionObjectHandle = CollisionObjectSlabHandle;
35
36 fn collision_object(
37 &self,
38 handle: Self::CollisionObjectHandle,
39 ) -> Option<&Self::CollisionObject> {
40 self.get(handle)
41 }
42
43 fn foreach(&self, mut f: impl FnMut(Self::CollisionObjectHandle, &Self::CollisionObject)) {
44 for co in self.objects.iter() {
45 f(CollisionObjectSlabHandle(co.0), co.1)
46 }
47 }
48}
49
50pub struct CollisionObjectSlab<N: RealField + Copy, T> {
52 pub(crate) objects: Slab<CollisionObject<N, T>>,
53}
54
55impl<N: RealField + Copy, T> CollisionObjectSlab<N, T> {
56 pub fn new() -> CollisionObjectSlab<N, T> {
58 CollisionObjectSlab {
59 objects: Slab::new(),
60 }
61 }
62
63 pub fn with_capacity(capacity: usize) -> CollisionObjectSlab<N, T> {
65 CollisionObjectSlab {
66 objects: Slab::with_capacity(capacity),
67 }
68 }
69
70 #[inline]
72 pub fn insert(&mut self, co: CollisionObject<N, T>) -> CollisionObjectSlabHandle {
73 CollisionObjectSlabHandle(self.objects.insert(co))
74 }
75
76 #[inline]
80 pub fn remove(&mut self, handle: CollisionObjectSlabHandle) -> CollisionObject<N, T> {
81 self.objects.remove(handle.0)
82 }
83
84 #[inline]
86 pub fn get(&self, handle: CollisionObjectSlabHandle) -> Option<&CollisionObject<N, T>> {
87 self.objects.get(handle.0)
88 }
89
90 #[inline]
92 pub fn get_mut(
93 &mut self,
94 handle: CollisionObjectSlabHandle,
95 ) -> Option<&mut CollisionObject<N, T>> {
96 self.objects.get_mut(handle.0)
97 }
98
99 #[inline]
103 pub fn get_pair_mut(
104 &mut self,
105 handle1: CollisionObjectSlabHandle,
106 handle2: CollisionObjectSlabHandle,
107 ) -> (
108 Option<&mut CollisionObject<N, T>>,
109 Option<&mut CollisionObject<N, T>>,
110 ) {
111 assert_ne!(handle1, handle2, "The two handles must not be the same.");
112 let a = self.objects.get_mut(handle1.0).map(|o| o as *mut _);
113 (
114 a.map(|a| unsafe { std::mem::transmute(a) }),
115 self.objects.get_mut(handle2.0),
116 )
117 }
118
119 #[inline]
121 pub fn contains(&self, handle: CollisionObjectSlabHandle) -> bool {
122 self.objects.contains(handle.0)
123 }
124
125 #[inline]
127 pub fn iter(&self) -> CollisionObjects<N, T> {
128 CollisionObjects {
129 iter: self.objects.iter(),
130 }
131 }
132
133 #[inline]
135 pub fn iter_mut(&mut self) -> CollisionObjectsMut<N, T> {
136 CollisionObjectsMut {
137 iter_mut: self.objects.iter_mut(),
138 }
139 }
140
141 #[inline]
143 pub fn len(&self) -> usize {
144 self.objects.len()
145 }
146
147 #[inline]
149 pub fn capacity(&self) -> usize {
150 self.objects.capacity()
151 }
152
153 #[inline]
156 pub fn reserve(&mut self, additional: usize) {
157 self.objects.reserve(additional);
158 }
159
160 #[inline]
163 pub fn reserve_exact(&mut self, additional: usize) {
164 self.objects.reserve_exact(additional);
165 }
166}
167
168impl<N: RealField + Copy, T> Index<CollisionObjectSlabHandle> for CollisionObjectSlab<N, T> {
169 type Output = CollisionObject<N, T>;
170
171 #[inline]
172 fn index(&self, handle: CollisionObjectSlabHandle) -> &Self::Output {
173 &self.objects[handle.0]
174 }
175}
176
177impl<N: RealField + Copy, T> IndexMut<CollisionObjectSlabHandle> for CollisionObjectSlab<N, T> {
178 #[inline]
179 fn index_mut(&mut self, handle: CollisionObjectSlabHandle) -> &mut Self::Output {
180 &mut self.objects[handle.0]
181 }
182}
183
184pub struct CollisionObjects<'a, N: 'a + RealField + Copy, T: 'a> {
186 iter: Iter<'a, CollisionObject<N, T>>,
187}
188
189impl<'a, N: 'a + RealField + Copy, T: 'a> Iterator for CollisionObjects<'a, N, T> {
190 type Item = (CollisionObjectSlabHandle, &'a CollisionObject<N, T>);
191
192 #[inline]
193 fn next(&mut self) -> Option<Self::Item> {
194 self.iter
195 .next()
196 .map(|obj| ((CollisionObjectSlabHandle(obj.0), obj.1)))
197 }
198}
199
200pub struct CollisionObjectsMut<'a, N: 'a + RealField + Copy, T: 'a> {
202 iter_mut: IterMut<'a, CollisionObject<N, T>>,
203}
204
205impl<'a, N: 'a + RealField + Copy, T: 'a> Iterator for CollisionObjectsMut<'a, N, T> {
206 type Item = (CollisionObjectSlabHandle, &'a mut CollisionObject<N, T>);
207
208 #[inline]
209 fn next(&mut self) -> Option<Self::Item> {
210 self.iter_mut
211 .next()
212 .map(|obj| ((CollisionObjectSlabHandle(obj.0), obj.1)))
213 }
214}