25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

179 satır
4.1 KiB

  1. #![allow(dead_code)]
  2. use std::ops::{Deref, DerefMut};
  3. use hibitset::BitSetLike;
  4. use shrev::{Event, EventChannel, ReaderId};
  5. use specs::{
  6. storage::{DistinctStorage, MaskedStorage, Storage, TryDefault, UnprotectedStorage},
  7. world::Index,
  8. Component, DenseVecStorage,
  9. };
  10. /* FlaggedStorage */
  11. pub struct FlaggedStorage<C, T = DenseVecStorage<C>>
  12. where
  13. C: Event,
  14. {
  15. event_emission: bool,
  16. channel: EventChannel<ComponentEvent<C>>,
  17. storage: T,
  18. }
  19. pub enum ComponentEvent<C>
  20. where
  21. C: Event,
  22. {
  23. Inserted(Index, C),
  24. Modified(Index, C),
  25. Removed(Index, C),
  26. }
  27. impl<C, T> Default for FlaggedStorage<C, T>
  28. where
  29. C: Event,
  30. T: TryDefault,
  31. {
  32. fn default() -> Self {
  33. FlaggedStorage {
  34. event_emission: true,
  35. channel: EventChannel::new(),
  36. storage: T::unwrap_default(),
  37. }
  38. }
  39. }
  40. impl<C, T> UnprotectedStorage<C> for FlaggedStorage<C, T>
  41. where
  42. C: Component + Event + Clone,
  43. T: UnprotectedStorage<C>,
  44. {
  45. unsafe fn clean<B>(&mut self, has: B)
  46. where
  47. B: BitSetLike,
  48. {
  49. self.storage.clean(has);
  50. }
  51. unsafe fn get(&self, id: Index) -> &C {
  52. self.storage.get(id)
  53. }
  54. unsafe fn get_mut(&mut self, id: Index) -> &mut C {
  55. let component = self.storage.get_mut(id);
  56. if self.event_emission {
  57. self.channel
  58. .single_write(ComponentEvent::Modified(id, component.clone()));
  59. }
  60. component
  61. }
  62. unsafe fn insert(&mut self, id: Index, component: C) {
  63. self.storage.insert(id, component.clone());
  64. if self.event_emission {
  65. self.channel
  66. .single_write(ComponentEvent::Inserted(id, component));
  67. }
  68. }
  69. unsafe fn remove(&mut self, id: Index) -> C {
  70. let component = self.storage.remove(id);
  71. if self.event_emission {
  72. self.channel
  73. .single_write(ComponentEvent::Removed(id, component.clone()));
  74. }
  75. component
  76. }
  77. }
  78. unsafe impl<C, T> DistinctStorage for FlaggedStorage<C, T>
  79. where
  80. C: Component + Event + Clone,
  81. T: DistinctStorage,
  82. {
  83. }
  84. /* Tracked */
  85. pub trait Tracked<C: Event> {
  86. fn channel(&self) -> &EventChannel<ComponentEvent<C>>;
  87. fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent<C>>;
  88. fn event_emission(&self) -> bool;
  89. fn set_event_emission(&mut self, value: bool);
  90. }
  91. impl<C, T> Tracked<C> for FlaggedStorage<C, T>
  92. where
  93. C: Component + Event,
  94. {
  95. fn channel(&self) -> &EventChannel<ComponentEvent<C>> {
  96. &self.channel
  97. }
  98. fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent<C>> {
  99. &mut self.channel
  100. }
  101. fn event_emission(&self) -> bool {
  102. self.event_emission
  103. }
  104. fn set_event_emission(&mut self, value: bool) {
  105. self.event_emission = value;
  106. }
  107. }
  108. /* StorageHelper */
  109. pub trait StorageHelper<C: Event> {
  110. fn event_emission(&self) -> bool;
  111. fn channel(&self) -> &EventChannel<ComponentEvent<C>>;
  112. }
  113. pub trait StorageHelperMut<C: Event> {
  114. fn set_event_emission(&mut self, value: bool);
  115. fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent<C>>;
  116. fn register_event_reader(&mut self) -> ReaderId<ComponentEvent<C>>;
  117. }
  118. impl<'e, T, D> StorageHelper<T> for Storage<'e, T, D>
  119. where
  120. T: Component + Event,
  121. T::Storage: Tracked<T>,
  122. D: Deref<Target = MaskedStorage<T>>,
  123. {
  124. fn event_emission(&self) -> bool {
  125. self.unprotected_storage().event_emission()
  126. }
  127. fn channel(&self) -> &EventChannel<ComponentEvent<T>> {
  128. self.unprotected_storage().channel()
  129. }
  130. }
  131. impl<'e, T, D> StorageHelperMut<T> for Storage<'e, T, D>
  132. where
  133. T: Component + Event,
  134. T::Storage: Tracked<T>,
  135. D: DerefMut<Target = MaskedStorage<T>>,
  136. {
  137. fn set_event_emission(&mut self, value: bool) {
  138. unsafe { self.unprotected_storage_mut().set_event_emission(value) };
  139. }
  140. fn channel_mut(&mut self) -> &mut EventChannel<ComponentEvent<T>> {
  141. unsafe { self.unprotected_storage_mut().channel_mut() }
  142. }
  143. fn register_event_reader(&mut self) -> ReaderId<ComponentEvent<T>> {
  144. self.channel_mut().register_reader()
  145. }
  146. }