dreamwell-engine 1.0.0

Dreamwell pure-logic engine library — transforms, hierarchy, canon pipeline, spatial math, hashing, tile rules, validation, waymark schema, material/lighting descriptors. No SpacetimeDB dependency.
Documentation
// GPU-uploadable physics types — #[repr(C)] structs for CPU↔GPU contract.
// Gated behind `physics-gpu-types` feature (bytemuck derive).
// All structs are 32 bytes for uniform buffer alignment.

/// Physics simulation config for GPU upload (32 bytes).
#[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],
}

/// Collision profile for GPU upload (32 bytes).
#[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],
}

/// Observer context for GPU upload (32 bytes).
#[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],
}

/// Particle spawn configuration for GPU upload (32 bytes).
#[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, // Area
            _pad: [0; 3],
        };
        assert_eq!(config.topology_layer, 6);
    }
}