dis_rs/common/collision/
model.rs1use crate::common::collision::builder::CollisionBuilder;
2use crate::common::model::{EntityId, EventId, PduBody, VectorF32};
3use crate::common::{BodyInfo, Interaction};
4use crate::enumerations::{CollisionType, PduType};
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8const COLLISION_BODY_LENGTH: u16 = 48;
9
10#[derive(Clone, Debug, Default, PartialEq)]
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12pub struct Collision {
13    pub issuing_entity_id: EntityId,
14    pub colliding_entity_id: EntityId,
15    pub event_id: EventId,
16    pub collision_type: CollisionType,
17    pub velocity: VectorF32,
18    pub mass: f32,
19    pub location: VectorF32,
20}
21
22impl Collision {
23    #[must_use]
24    pub fn builder() -> CollisionBuilder {
25        CollisionBuilder::new()
26    }
27
28    #[must_use]
29    pub fn into_builder(self) -> CollisionBuilder {
30        CollisionBuilder::new_from_body(self)
31    }
32
33    #[must_use]
34    pub fn into_pdu_body(self) -> PduBody {
35        PduBody::Collision(self)
36    }
37}
38
39impl BodyInfo for Collision {
40    fn body_length(&self) -> u16 {
41        COLLISION_BODY_LENGTH
42    }
43
44    fn body_type(&self) -> PduType {
45        PduType::Collision
46    }
47}
48
49impl Interaction for Collision {
50    fn originator(&self) -> Option<&EntityId> {
51        Some(&self.issuing_entity_id)
52    }
53
54    fn receiver(&self) -> Option<&EntityId> {
55        Some(&self.colliding_entity_id)
56    }
57}