dynamis-state 0.7.0

Shared world state streams for bodies, colliders, constraints, and shapes
Documentation
use crate::StateDomain;
use dynamis_abi::{
    BodyDescriptorRecord, BodyEditRecord, BodyEditRunRecord, BodyStateRecord,
    BrokenConstraintRecord, BvhNodeRecord, COUNTER_DEVICE_COUNT, COUNTER_STRIDE, ColliderRecord,
    ConstraintDescriptorRecord, ConstraintRuntimeRecord, QueryRecord, QueryResultRecord,
    RowMoveRecord, ShapeSourceRecord, StepParamsRecord, TriangleRecord,
};
use dynamis_domain::Domain;
use dynamis_domain::streams;
use dynamis_gpu::Contents;
use dynamis_gpu::EVENT_SLOTS;
use std::mem::size_of;

pub const VERTEX_BYTES: u64 = size_of::<[f32; 4]>() as u64;
pub const TRIANGLE_BYTES: u64 = size_of::<TriangleRecord>() as u64;
pub const QUERY_RESULT_BYTES: u64 = size_of::<QueryResultRecord>() as u64;

streams! {
    StateStreams, StateStream, StateDemand, StateDomain::ID, demand,
    demand {
        bodies: u32,
        body_ids: u32,
        colliders: u32,
        constraints: u32,
        body_commands: u32,
        constraint_commands: u32,
        queries: u32,
        shapes: crate::ShapeCapacity,
        observed: u32,
    }
    streams {
        params, Params: "step params", StepParamsRecord, 1, Contents::Scratch, 1, dynamis_gpu::UNIFORM;
        body_states, BodyStates: "body states", BodyStateRecord, 1, Contents::Durable, demand.bodies;
        body_row_of_id, BodyRowOfId: "body row of id", u32, 1, Contents::Durable, demand.body_ids;
        body_descriptors, BodyDescriptors: "body descriptors", BodyDescriptorRecord, 1, Contents::Durable, demand.bodies;
        colliders, Colliders: "colliders", ColliderRecord, 1, Contents::Durable, demand.colliders;
        collider_owners, ColliderOwners: "collider owners", u32, 1, Contents::Durable, demand.colliders;
        body_edits, BodyEdits: "body edits", BodyEditRecord, 1, Contents::Scratch, demand.body_commands;
        body_edit_runs, BodyEditRuns: "body edit runs", BodyEditRunRecord, 1, Contents::Scratch, demand.body_commands;
        body_row_moves, BodyRowMoves: "body row moves", RowMoveRecord, 1, Contents::Scratch, demand.body_moves();
        body_fresh_rows, BodyFreshRows: "fresh body rows", BodyStateRecord, 1, Contents::Scratch, demand.body_commands;
        constraint_descriptors, ConstraintDescriptors: "constraint descriptors", ConstraintDescriptorRecord, 1, Contents::Durable, demand.constraints;
        constraint_runtime, ConstraintRuntime: "constraint runtime", ConstraintRuntimeRecord, 1, Contents::Durable, demand.constraints;
        wake_flags, WakeFlags: "body wake flags", u32, 1, Contents::Scratch, demand.bodies;
        constraint_row_moves, ConstraintRowMoves: "constraint row moves", RowMoveRecord, 1, Contents::Scratch, demand.constraint_moves();
        constraint_fresh_rows, ConstraintFreshRows: "fresh constraint rows", ConstraintRuntimeRecord, 1, Contents::Scratch, demand.constraint_commands;
        constraint_breaks, ConstraintBreaks: "constraint breaks", BrokenConstraintRecord, 1, Contents::Scratch, demand.constraints.saturating_mul(EVENT_SLOTS);
        shape_sources, ShapeSources: "shape sources", ShapeSourceRecord, 1, Contents::Durable, demand.shapes.sources;
        shape_vertices, ShapeVertices: "shape vertices", [f32; 4], 1, Contents::Durable, demand.shapes.vertices;
        shape_triangles, ShapeTriangles: "shape triangles", TriangleRecord, 1, Contents::Durable, demand.shapes.triangles;
        shape_nodes, ShapeNodes: "shape bvh nodes", BvhNodeRecord, 1, Contents::Durable, demand.shapes.nodes;
        query_records, QueryRecords: "queries", QueryRecord, 1, Contents::Scratch, demand.queries;
        query_results, QueryResults: "query results", QueryResultRecord, 1, Contents::Scratch, demand.queries;
        observed_ids, ObservedIds: "observed body ids", u32, 1, Contents::Durable, demand.observed;
        observed_states, ObservedStates: "observed body states", BodyStateRecord, 1, Contents::Scratch, demand.observed;
        counters, Counters: "world counters", u32, COUNTER_STRIDE / 4, Contents::Durable, COUNTER_DEVICE_COUNT as u32;
    }
}

impl StateDemand {
    pub fn body_moves(&self) -> u32 {
        self.body_commands
            .saturating_mul(crate::MOVE_ENTRIES_PER_COMMAND)
    }

    pub fn constraint_moves(&self) -> u32 {
        self.constraint_commands
            .saturating_mul(crate::MOVE_ENTRIES_PER_COMMAND)
    }
}