Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions client/src/graphics/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,25 @@ impl Window {
self.window.set_cursor_visible(true);
self.input.mouse_captured = false;
}
KeyCode::Minus => {
if state == ElementState::Pressed
&& let Some(sim) = self.sim.as_mut()
{
sim.prev_material();
}
}
KeyCode::Equal => {
if state == ElementState::Pressed
&& let Some(sim) = self.sim.as_mut()
{
sim.next_material();
}
}
KeyCode::KeyG => {
if let Some(sim) = self.sim.as_mut() {
sim.pick_material();
}
}
_ => {
if let Some(material_idx) = number_key_to_index(key)
&& state == ElementState::Pressed
Expand Down
57 changes: 43 additions & 14 deletions client/src/sim.rs
Copy link
Copy Markdown
Owner

@Ralith Ralith Mar 8, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: prefer to include changes to code introduced in the same PR in the commit that introduced the revised code. This makes for easier review.

Original file line number Diff line number Diff line change
Expand Up @@ -162,10 +162,52 @@ impl Sim {
self.place_block_pressed = true;
}

/// Returns the block the player is looking at, if any. Also includes distance and face
pub fn looking_at(&self) -> Option<graph_ray_casting::GraphCastHit> {
let view_position = self.view();
let ray_casting_result = graph_ray_casting::ray_cast(
&self.graph,
&view_position,
&Ray::new(MPoint::w(), -MDirection::z()),
self.cfg.character.block_reach,
);
if let Ok(ray_casting_result) = ray_casting_result {
ray_casting_result
} else {
tracing::warn!("Tried to run a raycast beyond generated terrain.");
None
}
}

/// Selects the material from a preset palette.
pub fn select_material(&mut self, idx: usize) {
self.selected_material = *MATERIAL_PALETTE.get(idx).unwrap_or(&MATERIAL_PALETTE[0]);
}

/// Cycles the selected material through all materials.
pub fn next_material(&mut self) {
self.selected_material =
Material::VALUES[(self.selected_material as usize + 1) % Material::COUNT];
}

pub fn prev_material(&mut self) {
self.selected_material = Material::VALUES
[(self.selected_material as usize + Material::COUNT - 1) % Material::COUNT];
}

/// selects the material of the block the player is looking at. Will never select void.
pub fn pick_material(&mut self) {
let Some(hit) = self.looking_at() else {
return;
};

let mat = self.graph.get_material(hit.chunk, hit.voxel_coords);
let Some(mat) = mat else {
return;
};
self.selected_material = mat;
}

pub fn selected_material(&self) -> Material {
self.selected_material
}
Expand Down Expand Up @@ -555,20 +597,7 @@ impl Sim {
return None;
};

let view_position = self.view();
let ray_casing_result = graph_ray_casting::ray_cast(
&self.graph,
&view_position,
&Ray::new(MPoint::w(), -MDirection::z()),
self.cfg.character.block_reach,
);

let Ok(ray_casting_result) = ray_casing_result else {
tracing::warn!("Tried to run a raycast beyond generated terrain.");
return None;
};

let hit = ray_casting_result?;
let hit = self.looking_at()?;
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice refactor!


let block_pos = if placing {
self.graph.get_block_neighbor(
Expand Down