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}