You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: light_uniforms.rs
    path of file: ./repos/noxfutura/src/modes/playgame/render/passes/lighting_pass
    
    the code of the file until where you have to start completion: use bengine::gpu::util::DeviceExt;
use bengine::uv::Vec3;
use bengine::*;
use legion::*;
use nox_components::*;
use nox_planet::Region;
use rayon::prelude::*;

#[repr(C)]
#[derive(Copy, Clone)]
pub struct LightUniforms {
    pub screen_info: [f32; 4],
    pub camera_position: [f32; 4],
    pub lights: [LightInfo; 32],
}

unsafe impl bytemuck::Pod for LightUniforms {}
unsafe impl bytemuck::Zeroable for LightUniforms {}

#[repr(C)]
#[derive(Copy, Clone, Debug)]
pub struct LightInfo {
    pub pos: [f32; 4],
    pub color: [f32; 4],
}

impl LightInfo {
    fn new() -> Self {
        Self {
            pos: [0.0, 0.0, 0.0, 0.0],
            color: [0.0, 0.0, 0.0, 0.0],
       
    
    pub fn update(&mut self, ecs: &World, light_bits: &mut [u32], mouse_position: &[f32]) {
        self.update_partial(ecs, mouse_position);

        self.lights.iter_mut().skip(1).for_each(|l| {
            l.pos = [0.0, 0.0, 0.0, 0.0];
            l.color = [0.0, 0.0, 0.0, 0.0];
        });

        // Clear and set outdoors
        let region = crate::modes::playgame::systems::REGION.read();
        light_bits.par_iter_mut().enumerate().for_each(|(idx, l)| {
            if region.flag(idx, Region::OUTSIDE) {
                *l = 1;
            } else {
                *l = 0;
            }
        });

        // Index the lights
        const LIGHT_BOOST: f32 = 1.0;
        let mut index = 1;
        let mut light_query = <(Read<Position>, Read<Light>, Read<FieldOfView>)>::query();
        light_query.iter(ecs).for_each(|(pos, light, fov)| {
            let pt = pos.as_point3();
            if index < 32 && light.enabled {
                // pt.z <= camera_pos.y ?
                self.lights[index].color = [
                    light.color.0 * LIGHT_BOOST,
                    light.color.1 * LIGHT_BOOST,
                    light.color.2 * LIGHT_BOOST,
                    0.0,
                ];
                self.lights[index].pos = [
                    pt.x as f32 + 0.5,
                    pt.z as f32 + 0.5,
                    pt.y as f32 + 0.5,
                    light.radius as f32,
                ];
                let bit = 1 << index;

                for idx in fov.visible_tiles.iter() {
                    //println!("Setting visible tile for light {} at {}", index, idx);
                    light_bits[*idx] = light_bits[*idx] | bit;
                }
                index += 1;
            }
        });
        //println!("{:#?}", self.lights);
    }