Skip to main content

dynamis_soft/
streams.rs

1use crate::SoftDomain;
2use dynamis_abi::{
3    ELEMENT_PARTICLES, SoftAttachmentRecord, SoftBodyRecord, SoftContactRecord, SoftElementRecord,
4    SoftParticleRecord,
5};
6use dynamis_domain::Domain;
7use dynamis_domain::streams;
8use dynamis_gpu::Contents;
9
10pub const REACTION_WORDS: u32 = 8;
11
12streams! {
13    SoftStreams, SoftStream, SoftDemand, SoftDomain::ID, demand,
14    demand {
15        particles: u32,
16        elements: u32,
17        attachments: u32,
18        adjacency: u32,
19        soft_bodies: u32,
20        rigid_bodies: u32,
21    }
22    streams {
23        particles, Particles: "soft particles", SoftParticleRecord, 1, Contents::Durable, demand.particles;
24        elements, Elements: "soft elements", SoftElementRecord, 1, Contents::Durable, demand.elements;
25        attachments, Attachments: "soft attachments", SoftAttachmentRecord, 1, Contents::Durable, demand.attachments;
26        adjacency, Adjacency: "soft adjacency", u32, 1, Contents::Durable, demand.adjacency;
27        bodies, BodyStates: "soft body states", SoftBodyRecord, 1, Contents::Durable, demand.soft_bodies;
28        contributions, Contributions: "soft element contributions", [f32; 4], 1, Contents::Scratch, demand.element_contributions();
29        contacts, Contacts: "soft particle contacts", SoftContactRecord, 1, Contents::Scratch, demand.particles;
30        pressure, Pressure: "soft particle pressure", [f32; 4], 1, Contents::Scratch, demand.particles;
31        reactions, Reactions: "soft reactions", u32, 1, Contents::Durable, demand.reaction_words();
32    }
33}
34
35impl SoftDemand {
36    pub const fn reaction_words(&self) -> u32 {
37        self.rigid_bodies * REACTION_WORDS
38    }
39
40    pub const fn element_contributions(&self) -> u32 {
41        self.elements * ELEMENT_PARTICLES
42    }
43}