Skip to main content

dynamis_state/
streams.rs

1use crate::StateDomain;
2use dynamis_abi::{
3    BodyDescriptorRecord, BodyEditRecord, BodyEditRunRecord, BodyStateRecord,
4    BrokenConstraintRecord, BvhNodeRecord, COUNTER_DEVICE_COUNT, COUNTER_STRIDE, ColliderRecord,
5    ConstraintDescriptorRecord, ConstraintRuntimeRecord, QueryRecord, QueryResultRecord,
6    RowMoveRecord, ShapeSourceRecord, StepParamsRecord, TriangleRecord,
7};
8use dynamis_domain::Domain;
9use dynamis_domain::streams;
10use dynamis_gpu::Contents;
11use dynamis_gpu::EVENT_SLOTS;
12use std::mem::size_of;
13
14pub const VERTEX_BYTES: u64 = size_of::<[f32; 4]>() as u64;
15pub const TRIANGLE_BYTES: u64 = size_of::<TriangleRecord>() as u64;
16pub const QUERY_RESULT_BYTES: u64 = size_of::<QueryResultRecord>() as u64;
17
18streams! {
19    StateStreams, StateStream, StateDemand, StateDomain::ID, demand,
20    demand {
21        bodies: u32,
22        body_ids: u32,
23        colliders: u32,
24        constraints: u32,
25        body_commands: u32,
26        constraint_commands: u32,
27        queries: u32,
28        shapes: crate::ShapeCapacity,
29        observed: u32,
30    }
31    streams {
32        params, Params: "step params", StepParamsRecord, 1, Contents::Scratch, 1, dynamis_gpu::UNIFORM;
33        body_states, BodyStates: "body states", BodyStateRecord, 1, Contents::Durable, demand.bodies;
34        body_row_of_id, BodyRowOfId: "body row of id", u32, 1, Contents::Durable, demand.body_ids;
35        body_descriptors, BodyDescriptors: "body descriptors", BodyDescriptorRecord, 1, Contents::Durable, demand.bodies;
36        colliders, Colliders: "colliders", ColliderRecord, 1, Contents::Durable, demand.colliders;
37        collider_owners, ColliderOwners: "collider owners", u32, 1, Contents::Durable, demand.colliders;
38        body_edits, BodyEdits: "body edits", BodyEditRecord, 1, Contents::Scratch, demand.body_commands;
39        body_edit_runs, BodyEditRuns: "body edit runs", BodyEditRunRecord, 1, Contents::Scratch, demand.body_commands;
40        body_row_moves, BodyRowMoves: "body row moves", RowMoveRecord, 1, Contents::Scratch, demand.body_moves();
41        body_fresh_rows, BodyFreshRows: "fresh body rows", BodyStateRecord, 1, Contents::Scratch, demand.body_commands;
42        constraint_descriptors, ConstraintDescriptors: "constraint descriptors", ConstraintDescriptorRecord, 1, Contents::Durable, demand.constraints;
43        constraint_runtime, ConstraintRuntime: "constraint runtime", ConstraintRuntimeRecord, 1, Contents::Durable, demand.constraints;
44        wake_flags, WakeFlags: "body wake flags", u32, 1, Contents::Scratch, demand.bodies;
45        constraint_row_moves, ConstraintRowMoves: "constraint row moves", RowMoveRecord, 1, Contents::Scratch, demand.constraint_moves();
46        constraint_fresh_rows, ConstraintFreshRows: "fresh constraint rows", ConstraintRuntimeRecord, 1, Contents::Scratch, demand.constraint_commands;
47        constraint_breaks, ConstraintBreaks: "constraint breaks", BrokenConstraintRecord, 1, Contents::Scratch, demand.constraints.saturating_mul(EVENT_SLOTS);
48        shape_sources, ShapeSources: "shape sources", ShapeSourceRecord, 1, Contents::Durable, demand.shapes.sources;
49        shape_vertices, ShapeVertices: "shape vertices", [f32; 4], 1, Contents::Durable, demand.shapes.vertices;
50        shape_triangles, ShapeTriangles: "shape triangles", TriangleRecord, 1, Contents::Durable, demand.shapes.triangles;
51        shape_nodes, ShapeNodes: "shape bvh nodes", BvhNodeRecord, 1, Contents::Durable, demand.shapes.nodes;
52        query_records, QueryRecords: "queries", QueryRecord, 1, Contents::Scratch, demand.queries;
53        query_results, QueryResults: "query results", QueryResultRecord, 1, Contents::Scratch, demand.queries;
54        observed_ids, ObservedIds: "observed body ids", u32, 1, Contents::Durable, demand.observed;
55        observed_states, ObservedStates: "observed body states", BodyStateRecord, 1, Contents::Scratch, demand.observed;
56        counters, Counters: "world counters", u32, COUNTER_STRIDE / 4, Contents::Durable, COUNTER_DEVICE_COUNT as u32;
57    }
58}
59
60impl StateDemand {
61    pub fn body_moves(&self) -> u32 {
62        self.body_commands
63            .saturating_mul(crate::MOVE_ENTRIES_PER_COMMAND)
64    }
65
66    pub fn constraint_moves(&self) -> u32 {
67        self.constraint_commands
68            .saturating_mul(crate::MOVE_ENTRIES_PER_COMMAND)
69    }
70}