#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "physics-gpu-types", derive(bytemuck::Pod, bytemuck::Zeroable))]
pub struct GpuPhysicsConfig {
pub gravity: [f32; 3],
pub damping: f32,
pub max_speed: f32,
pub restitution: f32,
pub _pad: [f32; 2],
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "physics-gpu-types", derive(bytemuck::Pod, bytemuck::Zeroable))]
pub struct GpuCollisionProfile {
pub center_offset: [f32; 3],
pub radius: f32,
pub layer_mask: u32,
pub _pad: [u32; 3],
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "physics-gpu-types", derive(bytemuck::Pod, bytemuck::Zeroable))]
pub struct GpuObserverConfig {
pub position: [f32; 3],
pub fov_radius_cells: f32,
pub topology_layer: u32,
pub _pad: [u32; 3],
}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq)]
#[cfg_attr(feature = "physics-gpu-types", derive(bytemuck::Pod, bytemuck::Zeroable))]
pub struct GpuParticleSpawnConfig {
pub emission_rate: f32,
pub lifetime_min: f32,
pub lifetime_max: f32,
pub speed_min: f32,
pub speed_max: f32,
pub _pad: [f32; 3],
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn gpu_physics_config_size() {
assert_eq!(std::mem::size_of::<GpuPhysicsConfig>(), 32);
}
#[test]
fn gpu_collision_profile_size() {
assert_eq!(std::mem::size_of::<GpuCollisionProfile>(), 32);
}
#[test]
fn gpu_observer_config_size() {
assert_eq!(std::mem::size_of::<GpuObserverConfig>(), 32);
}
#[test]
fn gpu_particle_spawn_config_size() {
assert_eq!(std::mem::size_of::<GpuParticleSpawnConfig>(), 32);
}
#[test]
fn gpu_physics_config_default_values() {
let config = GpuPhysicsConfig {
gravity: [0.0, -9.81, 0.0],
damping: 0.99,
max_speed: 100.0,
restitution: 0.5,
_pad: [0.0; 2],
};
assert_eq!(config.gravity[1], -9.81);
}
#[test]
fn gpu_observer_config_layer_index() {
let config = GpuObserverConfig {
position: [0.0; 3],
fov_radius_cells: 10.0,
topology_layer: 6, _pad: [0; 3],
};
assert_eq!(config.topology_layer, 6);
}
}