dynamis-world 0.6.0

GPU-driven physics engine
Documentation
use super::dispatch::CCD_SWEEP;
use super::stage::{GEOMETRY, RO, RW, Stage, UNIFORM, shape_resources, whole};
use crate::dynamics::buffers::WorldBuffers;
use dynamis_gpu::{ComputeRecorder, GpuContext};
use dynamis_layout::COUNTER_PAIRS;

pub(super) struct Ccd {
    ccd_sweep: Stage,
}

impl Ccd {
    pub(super) fn build(context: &GpuContext, buffers: &WorldBuffers, per_row: u32) -> Self {
        Self {
            ccd_sweep: Stage::build(
                context,
                "ccd_sweep",
                include_str!("shaders/ccd_sweep.wgsl"),
                per_row,
                GEOMETRY,
                &[
                    (UNIFORM, whole(&buffers.params)),
                    (RW, whole(&buffers.bodies.states)),
                    (RO, whole(&buffers.bodies.descriptors)),
                    (RO, whole(&buffers.bodies.colliders)),
                    (RO, whole(&buffers.contacts.pairs.major)),
                    (RO, whole(&buffers.contacts.pairs.minor)),
                    (RW, buffers.counter(COUNTER_PAIRS)),
                ],
                &shape_resources(buffers),
            ),
        }
    }

    pub(super) fn record(&self, recorder: &mut ComputeRecorder, buffers: &WorldBuffers) {
        self.ccd_sweep
            .record_indirect(recorder, &buffers.dispatch, CCD_SWEEP);
    }
}