Skip to main content

dynamis_broadphase/
domain.rs

1use crate::{Broadphase, BroadphaseDemand, BroadphaseFrame, BroadphaseInputs, BroadphasePasses};
2use crate::{BroadphaseCapacity, BroadphaseStreams, Capacity};
3use dynamis_abi::Counters;
4use dynamis_domain::{Domain, Run, StepFacts};
5use dynamis_gpu::GpuContext;
6use dynamis_gpu::Resources;
7use dynamis_pass::{PassGroup, Pipeline, Schedule};
8use wgpu::CommandEncoder;
9
10pub struct BroadphaseDomain;
11
12impl Domain for BroadphaseDomain {
13    const ID: u32 = 1;
14
15    const SIMULATES: bool = false;
16
17    const PASS_EDGES: dynamis_pass::PassEdges = &[BroadphasePasses::EDGES];
18
19    type Demand = BroadphaseDemand;
20    type Inputs = BroadphaseInputs;
21    type Work = ();
22    type Streams = BroadphaseStreams;
23    type Planner = Capacity;
24    type Passes = BroadphasePasses;
25    type Runtime = Broadphase;
26    type Frame = BroadphaseFrame;
27    type Capacity = BroadphaseCapacity;
28
29    fn minimum() -> BroadphaseDemand {
30        Capacity::floor()
31    }
32
33    fn occupied(inputs: &BroadphaseInputs) -> bool {
34        inputs.colliders > 0 || inputs.particles > 0
35    }
36
37    fn pending(_: &()) -> bool {
38        false
39    }
40
41    fn active(_: &Counters) -> bool {
42        false
43    }
44
45    fn pass_groups() -> &'static [PassGroup] {
46        &[BroadphasePasses::GROUP]
47    }
48
49    fn resolve(pipeline: &Pipeline) -> BroadphasePasses {
50        BroadphasePasses::resolve(pipeline)
51    }
52
53    fn build(
54        context: &GpuContext,
55        streams: &impl Resources,
56        passes: BroadphasePasses,
57    ) -> Broadphase {
58        Broadphase::new(context, streams, passes)
59    }
60
61    fn frame(_: &StepFacts, _: &BroadphaseInputs, run: Run) -> BroadphaseFrame {
62        BroadphaseFrame {
63            indexing: run.indexing,
64        }
65    }
66
67    fn capacity(streams: &BroadphaseStreams) -> BroadphaseCapacity {
68        crate::capacity(streams)
69    }
70
71    fn record(
72        runtime: &Broadphase,
73        pass: u32,
74        schedule: &mut Schedule,
75        encoder: &mut CommandEncoder,
76        streams: &impl Resources,
77        frame: &BroadphaseFrame,
78    ) {
79        runtime.record(pass, schedule, encoder, streams, *frame);
80    }
81}