cells differencied update
This commit is contained in:
		
							parent
							
								
									e5b2e51a29
								
							
						
					
					
						commit
						18ca080175
					
				
							
								
								
									
										107
									
								
								src/map.rs
									
									
									
									
									
								
							
							
						
						
									
										107
									
								
								src/map.rs
									
									
									
									
									
								
							@ -7,7 +7,8 @@ pub struct Plugin;
 | 
				
			|||||||
impl bevy::prelude::Plugin for Plugin {
 | 
					impl bevy::prelude::Plugin for Plugin {
 | 
				
			||||||
    fn build(&self, app: &mut App) {
 | 
					    fn build(&self, app: &mut App) {
 | 
				
			||||||
        app.add_systems(Startup, setup)
 | 
					        app.add_systems(Startup, setup)
 | 
				
			||||||
            .add_systems(Update, update)
 | 
					            .insert_resource(Time::<Fixed>::from_seconds(0.25)) // Time for a day
 | 
				
			||||||
 | 
					            .add_systems(FixedUpdate, update_cells)
 | 
				
			||||||
            .insert_resource(ClearColor(Color::srgb(0., 0., 1.)));
 | 
					            .insert_resource(ClearColor(Color::srgb(0., 0., 1.)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -69,7 +70,7 @@ fn setup(
 | 
				
			|||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            CellKind::Stone
 | 
					            CellKind::Stone
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        cells_data.push(CellData::new(k, i, z as f32, m, 1., vec![]));
 | 
					        cells_data.push(CellData::new(k, i, (z*255.) as u8, (m*255.) as u8, 0, vec![]));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -95,7 +96,11 @@ fn setup(
 | 
				
			|||||||
            indices.extend_from_slice(&[i as u32, (i+v) as u32, (i+v+1) as u32]);
 | 
					            indices.extend_from_slice(&[i as u32, (i+v) as u32, (i+v+1) as u32]);
 | 
				
			||||||
            cd.vertices.extend_from_slice(&[i, i+v, i+v+1]);
 | 
					            cd.vertices.extend_from_slice(&[i, i+v, i+v+1]);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        cmds.spawn(cd);
 | 
					        match cd.kind {
 | 
				
			||||||
 | 
					            CellKind::Forest | CellKind::Grass => cmds.spawn((cd, LastUpdate(0))),
 | 
				
			||||||
 | 
					            _ => cmds.spawn(cd)
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mesh = Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default())
 | 
					    let mesh = Mesh::new(PrimitiveTopology::TriangleList, RenderAssetUsages::default())
 | 
				
			||||||
@ -121,26 +126,37 @@ fn setup(
 | 
				
			|||||||
    ));
 | 
					    ));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn update(
 | 
					fn update_cells(
 | 
				
			||||||
    mut cells: Query<&mut CellData>,
 | 
					    mut cells: Query<(&mut CellData, &mut LastUpdate)>,
 | 
				
			||||||
    mut map: Query<(&Mesh2d, &mut MapColors), With<MapMarker>>,
 | 
					    mut map: Query<(&Mesh2d, &mut MapColors), With<MapMarker>>,
 | 
				
			||||||
    mut meshes: ResMut<Assets<Mesh>>
 | 
					    mut meshes: ResMut<Assets<Mesh>>
 | 
				
			||||||
) {
 | 
					) {
 | 
				
			||||||
    let (mesh, mut cols) = map.single_mut();
 | 
					    let (mesh, mut cols) = map.single_mut();
 | 
				
			||||||
    if let Some(mesh) = meshes.get_mut(mesh) {
 | 
					    if let Some(mesh) = meshes.get_mut(mesh) {
 | 
				
			||||||
        // let cols = mesh.attribute_mut(Mesh::ATTRIBUTE_COLOR).unwrap();
 | 
					        // let cols = mesh.attribute_mut(Mesh::ATTRIBUTE_COLOR).unwrap();
 | 
				
			||||||
        for mut cd in cells.iter_mut() {
 | 
					        let mut modified = false;
 | 
				
			||||||
            // info!(cd.resource);
 | 
					        for (mut cd, mut lu) in cells.iter_mut() {
 | 
				
			||||||
            cd.update();
 | 
					            lu.0 += 1;
 | 
				
			||||||
            // dbg!(cd.resource);
 | 
					            if lu.0 > match cd.kind {
 | 
				
			||||||
 | 
					                CellKind::Void | CellKind::Sea | CellKind::Beach | CellKind::Dirt | CellKind::Stone => usize::MAX,
 | 
				
			||||||
 | 
					                CellKind::Forest => 100*365/4, // Let's say that a forest takes 100 years to mature
 | 
				
			||||||
 | 
					                CellKind::Grass => 7*7/4 // Let's say that grass takes 7 weaks to reach its max
 | 
				
			||||||
 | 
					            } {
 | 
				
			||||||
 | 
					                lu.0 = 0;
 | 
				
			||||||
 | 
					                cd.resource = (cd.resource + 1).clamp(0, 4);
 | 
				
			||||||
 | 
					                modified = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // cd.update();
 | 
				
			||||||
            let col = cd.color();
 | 
					            let col = cd.color();
 | 
				
			||||||
            for id in cd.vertices.iter() {
 | 
					            for id in cd.vertices.iter() {
 | 
				
			||||||
                cols.0[*id] = col.clone();
 | 
					                cols.0[*id] = col.clone();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        if modified {
 | 
				
			||||||
            mesh.insert_attribute(Mesh::ATTRIBUTE_COLOR, cols.0.clone());
 | 
					            mesh.insert_attribute(Mesh::ATTRIBUTE_COLOR, cols.0.clone());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
					#[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | 
				
			||||||
@ -154,17 +170,20 @@ pub enum CellKind {
 | 
				
			|||||||
    Grass
 | 
					    Grass
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#[derive(Component)]
 | 
				
			||||||
 | 
					pub struct LastUpdate(usize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Debug, Component)]
 | 
					#[derive(Debug, Component)]
 | 
				
			||||||
pub struct CellData {
 | 
					pub struct CellData {
 | 
				
			||||||
    pub kind: CellKind,
 | 
					    pub kind: CellKind,
 | 
				
			||||||
    pub cid: usize,
 | 
					    pub cid: usize,
 | 
				
			||||||
    z: f32,
 | 
					    z: u8,
 | 
				
			||||||
    pub moisture: f32,
 | 
					    pub moisture: u8,
 | 
				
			||||||
    pub resource: f32, // How much resource there is (between 0 and 1)
 | 
					    pub resource: u8, // How much resource there is (between 0 and 4)
 | 
				
			||||||
    pub vertices: Vec<usize>
 | 
					    pub vertices: Vec<usize>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
impl CellData {
 | 
					impl CellData {
 | 
				
			||||||
    pub fn new(kind: CellKind, cell: usize, z: f32, moisture: f32, resource: f32, vertices: Vec<usize>) -> Self {
 | 
					    pub fn new(kind: CellKind, cell: usize, z: u8, moisture: u8, resource: u8, vertices: Vec<usize>) -> Self {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            kind,
 | 
					            kind,
 | 
				
			||||||
            cid: cell,
 | 
					            cid: cell,
 | 
				
			||||||
@ -184,40 +203,40 @@ impl CellData {
 | 
				
			|||||||
            CellKind::Void => [0.; 4],
 | 
					            CellKind::Void => [0.; 4],
 | 
				
			||||||
            CellKind::Sea => [0., 0., 1., 1.],
 | 
					            CellKind::Sea => [0., 0., 1., 1.],
 | 
				
			||||||
            CellKind::Beach => [0.82, 0.84, 0.51, 1.],
 | 
					            CellKind::Beach => [0.82, 0.84, 0.51, 1.],
 | 
				
			||||||
            CellKind::Forest => [0., 0.5 - (self.resource*0.4), 0., 1.],
 | 
					            CellKind::Forest => [0., 0.5 - (self.resource as f32/4.*0.4), 0., 1.],
 | 
				
			||||||
            CellKind::Dirt => [0.53 - (self.resource*0.4), 0.38-(self.resource*0.4), 0.29-(self.resource*0.4), 1.],
 | 
					            CellKind::Dirt => [0.53 - (self.resource as f32/4.*0.4), 0.38-(self.resource as f32/4.*0.4), 0.29-(self.resource as f32/4.*0.4), 1.],
 | 
				
			||||||
            CellKind::Stone => [0.5, 0.5, 0.5, 1.],
 | 
					            CellKind::Stone => [0.5, 0.5, 0.5, 1.],
 | 
				
			||||||
            CellKind::Grass => [(136./255.) - (self.resource*0.4), (204./255.) - (self.resource*0.4), (59./255.) - (self.resource*0.4), 1.]
 | 
					            CellKind::Grass => [(136./255.) - (self.resource as f32/4.*0.4), (204./255.) - (self.resource as f32/4.*0.4), (59./255.) - (self.resource as f32/4.*0.4), 1.]
 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    pub fn update(&mut self) {
 | 
					 | 
				
			||||||
        // How much it get by day
 | 
					 | 
				
			||||||
        let recuperation_rate = match self.kind {
 | 
					 | 
				
			||||||
            CellKind::Void | CellKind::Sea | CellKind::Beach | CellKind::Dirt | CellKind::Stone => 0.,
 | 
					 | 
				
			||||||
            CellKind::Forest => 1. / (100. * 365.25), // Let's say that a forest takes 100 years to mature
 | 
					 | 
				
			||||||
            CellKind::Grass => 1. / (7. * 7.) // Let's say that grass takes 7 weaks to reach its max
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
        self.resource = (self.resource + recuperation_rate).clamp(0., 1.);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    pub fn set_resource(&mut self, val: f32, t: usize) {
 | 
					 | 
				
			||||||
        self.resource = val.clamp(0., 1.);
 | 
					 | 
				
			||||||
        if self.resource == 0. {
 | 
					 | 
				
			||||||
            match self.kind {
 | 
					 | 
				
			||||||
                CellKind::Forest => {
 | 
					 | 
				
			||||||
                    self.kind = CellKind::Grass;
 | 
					 | 
				
			||||||
                    self.resource = 1.;
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                CellKind::Grass => {
 | 
					 | 
				
			||||||
                    self.kind = CellKind::Dirt;
 | 
					 | 
				
			||||||
                    self.resource = 0.5;
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                CellKind::Beach => {
 | 
					 | 
				
			||||||
                    self.kind = CellKind::Sea;
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
                _  => {}
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    // pub fn update(&mut self) {
 | 
				
			||||||
 | 
					    //     // How much it get by day
 | 
				
			||||||
 | 
					    //     let recuperation_rate = match self.kind {
 | 
				
			||||||
 | 
					    //         CellKind::Void | CellKind::Sea | CellKind::Beach | CellKind::Dirt | CellKind::Stone => 0.,
 | 
				
			||||||
 | 
					    //         CellKind::Forest => 1. / (100. * 365.25), // Let's say that a forest takes 100 years to mature
 | 
				
			||||||
 | 
					    //         CellKind::Grass => 1. / (7. * 7.) // Let's say that grass takes 7 weaks to reach its max
 | 
				
			||||||
 | 
					    //     };
 | 
				
			||||||
 | 
					    //     self.resource = (self.resource + recuperation_rate).clamp(0., 1.);
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
 | 
					    // pub fn set_resource(&mut self, val: f32, t: usize) {
 | 
				
			||||||
 | 
					    //     self.resource = val.clamp(0., 1.);
 | 
				
			||||||
 | 
					    //     if self.resource == 0. {
 | 
				
			||||||
 | 
					    //         match self.kind {
 | 
				
			||||||
 | 
					    //             CellKind::Forest => {
 | 
				
			||||||
 | 
					    //                 self.kind = CellKind::Grass;
 | 
				
			||||||
 | 
					    //                 self.resource = 1.;
 | 
				
			||||||
 | 
					    //             },
 | 
				
			||||||
 | 
					    //             CellKind::Grass => {
 | 
				
			||||||
 | 
					    //                 self.kind = CellKind::Dirt;
 | 
				
			||||||
 | 
					    //                 self.resource = 0.5;
 | 
				
			||||||
 | 
					    //             },
 | 
				
			||||||
 | 
					    //             CellKind::Beach => {
 | 
				
			||||||
 | 
					    //                 self.kind = CellKind::Sea;
 | 
				
			||||||
 | 
					    //             },
 | 
				
			||||||
 | 
					    //             _  => {}
 | 
				
			||||||
 | 
					    //         }
 | 
				
			||||||
 | 
					    //     }
 | 
				
			||||||
 | 
					    // }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// pub struct Map {
 | 
					// pub struct Map {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user