dynamis_broadphase/
domain.rs1use 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}