texture
This commit is contained in:
parent
0a58032400
commit
46055a073b
Binary file not shown.
Before Width: | Height: | Size: 186 B After Width: | Height: | Size: 462 B |
BIN
assets/texture.pxi
Normal file
BIN
assets/texture.pxi
Normal file
Binary file not shown.
@ -7,20 +7,19 @@ use winit::{event::{Event, WindowEvent}, window::Window};
|
|||||||
use crate::{state::State, App};
|
use crate::{state::State, App};
|
||||||
|
|
||||||
mod texture;
|
mod texture;
|
||||||
use texture::Texture;
|
use texture::{Texture, TEXTURE_DIMENSIONS};
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Clone, Copy, Zeroable, Pod, Debug)]
|
#[derive(Clone, Copy, Zeroable, Pod, Debug)]
|
||||||
pub struct Vertex {
|
pub struct Vertex {
|
||||||
pub pos: [f32; 2],
|
pub pos: [f32; 2],
|
||||||
pub color: [f32; 4],
|
pub color: [f32; 4],
|
||||||
pub tex_coords: [f32; 2],
|
pub tex_pos: [f32; 2],
|
||||||
/// Each bit is used as a flag :
|
/// Each bit is used as a flag :
|
||||||
/// 1: Scaled and moved according to camera
|
/// 1: Scaled and moved according to camera
|
||||||
/// 2: Grayscale
|
/// 2: Grayscale
|
||||||
/// 4: Whiter
|
|
||||||
///
|
///
|
||||||
/// For exemple 0b011 corresponds to Scaled and Grayscale
|
/// For exemple 0b01 corresponds to Scaled and 0b11 to Scaled and Grayscale
|
||||||
pub effect: u32,
|
pub effect: u32,
|
||||||
}
|
}
|
||||||
impl Vertex {
|
impl Vertex {
|
||||||
@ -29,6 +28,23 @@ impl Vertex {
|
|||||||
step_mode: wgpu::VertexStepMode::Vertex,
|
step_mode: wgpu::VertexStepMode::Vertex,
|
||||||
attributes: &wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x4, 2 => Float32x2, 3 => Uint32],
|
attributes: &wgpu::vertex_attr_array![0 => Float32x2, 1 => Float32x4, 2 => Float32x2, 3 => Uint32],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub fn new_col(pos: [f32; 2], color: [f32; 4], effect: u32) -> Self {
|
||||||
|
Self {
|
||||||
|
pos,
|
||||||
|
color,
|
||||||
|
tex_pos: [0.; 2],
|
||||||
|
effect
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn new_tex(pos: [f32; 2], tex_pos: [u16; 2], effect: u32) -> Self {
|
||||||
|
Self {
|
||||||
|
pos,
|
||||||
|
color: [0.; 4],
|
||||||
|
tex_pos: [tex_pos[0] as f32/TEXTURE_DIMENSIONS[0] as f32, tex_pos[1] as f32/TEXTURE_DIMENSIONS[1] as f32],
|
||||||
|
effect
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@ -58,7 +74,6 @@ pub struct Graphics<'a> {
|
|||||||
uniforms_buf: Buffer,
|
uniforms_buf: Buffer,
|
||||||
uniforms_bind_group: BindGroup,
|
uniforms_bind_group: BindGroup,
|
||||||
diffuse_bind_group: BindGroup,
|
diffuse_bind_group: BindGroup,
|
||||||
diffuse_texture: Texture
|
|
||||||
}
|
}
|
||||||
impl<'a> Graphics<'a> {
|
impl<'a> Graphics<'a> {
|
||||||
pub async fn init(state: &State, window: Arc<Window>) -> Self {
|
pub async fn init(state: &State, window: Arc<Window>) -> Self {
|
||||||
@ -204,8 +219,6 @@ impl<'a> Graphics<'a> {
|
|||||||
.get_default_config(&adapter, 1, 1)
|
.get_default_config(&adapter, 1, 1)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
surface.configure(&device, &surface_config);
|
surface.configure(&device, &surface_config);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let diffuse_bytes = include_bytes!("../assets/texture.png");
|
let diffuse_bytes = include_bytes!("../assets/texture.png");
|
||||||
let diffuse_texture = Texture::from_bytes(&device, &queue, diffuse_bytes, "happy-tree.png");
|
let diffuse_texture = Texture::from_bytes(&device, &queue, diffuse_bytes, "happy-tree.png");
|
||||||
@ -215,11 +228,11 @@ impl<'a> Graphics<'a> {
|
|||||||
entries: &[
|
entries: &[
|
||||||
wgpu::BindGroupEntry {
|
wgpu::BindGroupEntry {
|
||||||
binding: 0,
|
binding: 0,
|
||||||
resource: wgpu::BindingResource::TextureView(&diffuse_texture.view), // CHANGED!
|
resource: wgpu::BindingResource::TextureView(&diffuse_texture.view),
|
||||||
},
|
},
|
||||||
wgpu::BindGroupEntry {
|
wgpu::BindGroupEntry {
|
||||||
binding: 1,
|
binding: 1,
|
||||||
resource: wgpu::BindingResource::Sampler(&diffuse_texture.sampler), // CHANGED!
|
resource: wgpu::BindingResource::Sampler(&diffuse_texture.sampler),
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
label: Some("diffuse_bind_group"),
|
label: Some("diffuse_bind_group"),
|
||||||
@ -237,8 +250,7 @@ impl<'a> Graphics<'a> {
|
|||||||
index_buf,
|
index_buf,
|
||||||
uniforms_buf,
|
uniforms_buf,
|
||||||
uniforms_bind_group,
|
uniforms_bind_group,
|
||||||
diffuse_bind_group,
|
diffuse_bind_group
|
||||||
diffuse_texture
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn window_event(&mut self, event: &WindowEvent, window: &Window) {
|
pub fn window_event(&mut self, event: &WindowEvent, window: &Window) {
|
||||||
|
@ -1,19 +1,6 @@
|
|||||||
use image::GenericImageView;
|
use image::GenericImageView;
|
||||||
|
|
||||||
const TEXTURE_DIMENSIONS: [usize; 2] = [16, 16];
|
pub const TEXTURE_DIMENSIONS: [usize; 2] = [64, 64];
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
|
||||||
pub enum Color {
|
|
||||||
Void = 0,
|
|
||||||
Forest = 1,
|
|
||||||
Beach = 2,
|
|
||||||
Grass = 3
|
|
||||||
}
|
|
||||||
impl Into<[f32; 2]> for Color {
|
|
||||||
fn into(self) -> [f32; 2] {
|
|
||||||
[(self as usize % TEXTURE_DIMENSIONS[0]) as f32 / TEXTURE_DIMENSIONS[0] as f32, (self as usize / TEXTURE_DIMENSIONS[1]) as f32 / TEXTURE_DIMENSIONS[1] as f32]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Texture {
|
pub struct Texture {
|
||||||
pub texture: wgpu::Texture,
|
pub texture: wgpu::Texture,
|
||||||
|
@ -5,7 +5,7 @@ struct Uniforms {
|
|||||||
@group(0) @binding(0) var<uniform> uniforms : Uniforms;
|
@group(0) @binding(0) var<uniform> uniforms : Uniforms;
|
||||||
|
|
||||||
struct VertexOutput {
|
struct VertexOutput {
|
||||||
@location(0) tex_coords: vec2f,
|
@location(0) tex_pos: vec2f,
|
||||||
@location(1) color: vec4f,
|
@location(1) color: vec4f,
|
||||||
@location(2) effect: u32,
|
@location(2) effect: u32,
|
||||||
@builtin(position) pos: vec4f
|
@builtin(position) pos: vec4f
|
||||||
@ -15,7 +15,7 @@ struct VertexOutput {
|
|||||||
fn vs_main(
|
fn vs_main(
|
||||||
@location(0) pos: vec2f,
|
@location(0) pos: vec2f,
|
||||||
@location(1) color: vec4f,
|
@location(1) color: vec4f,
|
||||||
@location(2) tex_coords: vec2f,
|
@location(2) tex_pos: vec2f,
|
||||||
@location(3) effect: u32
|
@location(3) effect: u32
|
||||||
) -> VertexOutput {
|
) -> VertexOutput {
|
||||||
var screen_pos: vec4f;
|
var screen_pos: vec4f;
|
||||||
@ -25,7 +25,7 @@ fn vs_main(
|
|||||||
screen_pos = vec4f((pos - uniforms.camera) * uniforms.zooms, 0, 1);
|
screen_pos = vec4f((pos - uniforms.camera) * uniforms.zooms, 0, 1);
|
||||||
}
|
}
|
||||||
var out = VertexOutput(
|
var out = VertexOutput(
|
||||||
tex_coords,
|
tex_pos,
|
||||||
color,
|
color,
|
||||||
effect,
|
effect,
|
||||||
screen_pos
|
screen_pos
|
||||||
@ -40,18 +40,12 @@ var s_diffuse: sampler;
|
|||||||
|
|
||||||
@fragment
|
@fragment
|
||||||
fn fs_main(in: VertexOutput) -> @location(0) vec4f {
|
fn fs_main(in: VertexOutput) -> @location(0) vec4f {
|
||||||
var tex_col = textureSample(t_diffuse, s_diffuse, in.tex_coords);
|
var tex_col = textureSample(t_diffuse, s_diffuse, in.tex_pos);
|
||||||
var color = vec4f((tex_col.rgb * tex_col.a) + (in.color.rgb * in.color.a), tex_col.a + in.color.a);
|
var color = vec4f((tex_col.rgb * tex_col.a) + (in.color.rgb * in.color.a), tex_col.a + in.color.a);
|
||||||
// Grayscale
|
// Grayscale
|
||||||
if (in.effect & 2) != 0 {
|
if (in.effect & 2) != 0 {
|
||||||
var v = (color.r*0.299) + (color.g*0.587) + (color.b*0.114);
|
var v = (color.r*0.299) + (color.g*0.587) + (color.b*0.114);
|
||||||
color = vec4f(v, v, v, color.a);
|
color = vec4f(v, v, v, color.a);
|
||||||
}
|
}
|
||||||
// Whiter
|
|
||||||
if (in.effect & 4) != 0 {
|
|
||||||
color.r += 0.4;
|
|
||||||
color.g += 0.4;
|
|
||||||
color.b += 0.4;
|
|
||||||
}
|
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ impl State {
|
|||||||
self.indices = Vec::new();
|
self.indices = Vec::new();
|
||||||
|
|
||||||
for (c, cd) in self.map.voronoi.iter_cells().zip(self.map.cells_data.iter()).filter(|(_,cd)| cd.kind != CellKind::Forest) {
|
for (c, cd) in self.map.voronoi.iter_cells().zip(self.map.cells_data.iter()).filter(|(_,cd)| cd.kind != CellKind::Forest) {
|
||||||
let mut tex_coords = cd.color();
|
let mut color = cd.color();
|
||||||
if c.site() == self.selected_tile {
|
if c.site() == self.selected_tile {
|
||||||
color[0] = (color[0]+0.4).clamp(0., 1.);
|
color[0] = (color[0]+0.4).clamp(0., 1.);
|
||||||
color[1] = (color[1]+0.4).clamp(0., 1.);
|
color[1] = (color[1]+0.4).clamp(0., 1.);
|
||||||
@ -204,7 +204,7 @@ impl State {
|
|||||||
let vs = c.iter_vertices().collect::<Vec<_>>();
|
let vs = c.iter_vertices().collect::<Vec<_>>();
|
||||||
let i = self.vertices.len() as u32;
|
let i = self.vertices.len() as u32;
|
||||||
for v in vs.iter() {
|
for v in vs.iter() {
|
||||||
self.vertices.push(Vertex { pos: [v.x as f32, v.y as f32], tex_coords, effect:2 });
|
self.vertices.push(Vertex::new_col([v.x as f32, v.y as f32], color, 1));
|
||||||
}
|
}
|
||||||
for v in 1..(vs.len()-1) as u32 {
|
for v in 1..(vs.len()-1) as u32 {
|
||||||
self.indices.push(i);
|
self.indices.push(i);
|
||||||
@ -227,7 +227,7 @@ impl State {
|
|||||||
let vs = c.iter_vertices().collect::<Vec<_>>();
|
let vs = c.iter_vertices().collect::<Vec<_>>();
|
||||||
let i = self.vertices.len() as u32;
|
let i = self.vertices.len() as u32;
|
||||||
for v in vs.iter() {
|
for v in vs.iter() {
|
||||||
self.vertices.push(Vertex { pos: [v.x as f32, v.y as f32], color, effect:2 });
|
self.vertices.push(Vertex::new_col([v.x as f32, v.y as f32], color, 1));
|
||||||
}
|
}
|
||||||
for v in 1..(vs.len()-1) as u32 {
|
for v in 1..(vs.len()-1) as u32 {
|
||||||
self.indices.push(i);
|
self.indices.push(i);
|
||||||
|
@ -63,31 +63,31 @@ impl Entity {
|
|||||||
(
|
(
|
||||||
[
|
[
|
||||||
// back left leg
|
// back left leg
|
||||||
Vertex { pos: [-0.5, 0.3], color: dark, effect:2 },
|
Vertex::new_col([-0.5, 0.3], dark, 1),
|
||||||
Vertex { pos: [-0.4 + (now.sin()*0.1), -0.7 + (now.cos().max(-0.5)*0.1)], color: dark, effect:2 },
|
Vertex::new_col([-0.4 + (now.sin()*0.1), -0.7 + (now.cos().max(-0.5)*0.1)], dark, 1),
|
||||||
Vertex { pos: [-0.25, 0.1], color: dark, effect:2 },
|
Vertex::new_col([-0.25, 0.1], dark, 1),
|
||||||
|
|
||||||
// back right leg
|
// back right leg
|
||||||
Vertex { pos: [-0.5, 0.3], color, effect:2 },
|
Vertex::new_col([-0.5, 0.3], color, 1),
|
||||||
Vertex { pos: [-0.4 + ((now + 1.).sin()*0.1), -0.7 + ((now + 1.).cos().max(-0.5)*0.1)], color, effect:2 },
|
Vertex::new_col([-0.4 + ((now + 1.).sin()*0.1), -0.7 + ((now + 1.).cos().max(-0.5)*0.1)], color, 1),
|
||||||
Vertex { pos: [-0.25, 0.1], color, effect:2 },
|
Vertex::new_col([-0.25, 0.1], color, 1),
|
||||||
|
|
||||||
// front left leg
|
// front left leg
|
||||||
Vertex { pos: [0.3, 0.2], color: dark, effect:2 },
|
Vertex::new_col([0.3, 0.2], dark, 1),
|
||||||
Vertex { pos: [0.4 + ((now-1.).sin()*0.1), -0.7 + ((now-1.).cos().max(-0.5)*0.1)], color: dark, effect:2 },
|
Vertex::new_col([0.4 + ((now-1.).sin()*0.1), -0.7 + ((now-1.).cos().max(-0.5)*0.1)], dark, 1),
|
||||||
Vertex { pos: [0.5, 0.3], color: dark, effect:2 },
|
Vertex::new_col([0.5, 0.3], dark, 1),
|
||||||
|
|
||||||
// front right leg
|
// front right leg
|
||||||
Vertex { pos: [0.3, 0.2], color, effect:2 },
|
Vertex::new_col([0.3, 0.2], color, 1),
|
||||||
Vertex { pos: [0.4 + ((now-2.).sin()*0.1), -0.7 + ((now-2.).cos().max(-0.5)*0.1)], color, effect:2 },
|
Vertex::new_col([0.4 + ((now-2.).sin()*0.1), -0.7 + ((now-2.).cos().max(-0.5)*0.1)], color, 1),
|
||||||
Vertex { pos: [0.5, 0.3], color, effect:2 },
|
Vertex::new_col([0.5, 0.3], color, 1),
|
||||||
|
|
||||||
// body
|
// body
|
||||||
// 3
|
// 3
|
||||||
Vertex { pos: [-0.3, 0.], color, effect:2 },
|
Vertex::new_col([-0.3, 0.], color, 1),
|
||||||
Vertex { pos: [0.4, -0.1], color, effect:2 },
|
Vertex::new_col([0.4, -0.1], color, 1),
|
||||||
// 11
|
// 11
|
||||||
Vertex { pos: [0.3, 0.4], color, effect:2 },
|
Vertex::new_col([0.3, 0.4], color, 1),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
0,1,2,
|
0,1,2,
|
||||||
@ -104,31 +104,31 @@ impl Entity {
|
|||||||
(
|
(
|
||||||
[
|
[
|
||||||
// back left leg
|
// back left leg
|
||||||
Vertex { pos: [-0.5, 0.3], color: dark, effect:2 },
|
Vertex::new_col([-0.5, 0.3], dark, 1),
|
||||||
Vertex { pos: [-0.4, -0.75], color: dark, effect:2 },
|
Vertex::new_col([-0.4, -0.75], dark, 1),
|
||||||
Vertex { pos: [-0.25, 0.1], color: dark, effect:2 },
|
Vertex::new_col([-0.25, 0.1], dark, 1),
|
||||||
|
|
||||||
// back right leg
|
// back right leg
|
||||||
Vertex { pos: [-0.5, 0.3], color, effect:2 },
|
Vertex::new_col([-0.5, 0.3], color, 1),
|
||||||
Vertex { pos: [-0.4, -0.75], color, effect:2 },
|
Vertex::new_col([-0.4, -0.75], color, 1),
|
||||||
Vertex { pos: [-0.25, 0.1], color, effect:2 },
|
Vertex::new_col([-0.25, 0.1], color, 1),
|
||||||
|
|
||||||
// front left leg
|
// front left leg
|
||||||
Vertex { pos: [0.3, 0.2], color: dark, effect:2 },
|
Vertex::new_col([0.3, 0.2], dark, 1),
|
||||||
Vertex { pos: [0.4, -0.75], color: dark, effect:2 },
|
Vertex::new_col([0.4, -0.75], dark, 1),
|
||||||
Vertex { pos: [0.5, 0.3], color: dark, effect:2 },
|
Vertex::new_col([0.5, 0.3], dark, 1),
|
||||||
|
|
||||||
// front right leg
|
// front right leg
|
||||||
Vertex { pos: [0.3, 0.2], color, effect:2 },
|
Vertex::new_col([0.3, 0.2], color, 1),
|
||||||
Vertex { pos: [0.4, -0.75], color, effect:2 },
|
Vertex::new_col([0.4, -0.75], color, 1),
|
||||||
Vertex { pos: [0.5, 0.3], color, effect:2 },
|
Vertex::new_col([0.5, 0.3], color, 1),
|
||||||
|
|
||||||
// body
|
// body
|
||||||
// 3
|
// 3
|
||||||
Vertex { pos: [-0.3, 0.], color, effect:2 },
|
Vertex::new_col([-0.3, 0.], color, 1),
|
||||||
Vertex { pos: [0.4, -0.1], color, effect:2 },
|
Vertex::new_col([0.4, -0.1], color, 1),
|
||||||
// 11
|
// 11
|
||||||
Vertex { pos: [0.3, 0.4], color, effect:2 },
|
Vertex::new_col([0.3, 0.4], color, 1),
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
0,1,2,
|
0,1,2,
|
||||||
|
@ -67,22 +67,22 @@ impl UI {
|
|||||||
pub fn render(&self, vertices: &mut Vec<Vertex>, indices: &mut Vec<u32>) {
|
pub fn render(&self, vertices: &mut Vec<Vertex>, indices: &mut Vec<u32>) {
|
||||||
let vs = [
|
let vs = [
|
||||||
// Terrain
|
// Terrain
|
||||||
Vertex { color: SECONDARY_COLOR, pos: [-1., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], effect: 0 },
|
Vertex::new_tex([-1., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], [0, 1], 0),
|
||||||
Vertex { color: SECONDARY_COLOR, pos: [-1., -1.], effect: 0 },
|
Vertex::new_tex([-1., -1.], [0, 12], 0),
|
||||||
Vertex { color: SECONDARY_COLOR, pos: [0., -1.], effect: 0 },
|
Vertex::new_tex([0., -1.], [11, 12], 0),
|
||||||
Vertex { color: SECONDARY_COLOR, pos: [0., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], effect: 0 },
|
Vertex::new_tex([0., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], [11, 1], 0),
|
||||||
|
|
||||||
// Entities
|
// Entities
|
||||||
// 3,
|
// Vertex::new_tex([0., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], [12, 1], 0),
|
||||||
// 2,
|
// Vertex::new_tex([0., -1.], [11, 12], 0),
|
||||||
Vertex { color: SECONDARY_COLOR, pos: [1., -1.], effect: 0 },
|
// Vertex::new_tex([1., -1.], [] 0),
|
||||||
Vertex { color: SECONDARY_COLOR, pos: [1., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], effect: 0 }
|
// Vertex::new_tex([1., -1.+(BOTTOM_TAB_BAR_HEIGHT*2.)], 0)
|
||||||
];
|
];
|
||||||
let ids = [
|
let ids = [
|
||||||
0,1,2,
|
0,1,2,
|
||||||
2,3,0,
|
2,3,0,
|
||||||
3,2,4,
|
// 3,2,4,
|
||||||
4,5,3
|
// 4,5,3
|
||||||
];
|
];
|
||||||
let i = vertices.len() as u32;
|
let i = vertices.len() as u32;
|
||||||
vertices.extend_from_slice(&vs);
|
vertices.extend_from_slice(&vs);
|
||||||
|
Loading…
Reference in New Issue
Block a user