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}