use texture index
This commit is contained in:
@@ -23,6 +23,14 @@ const HEX_CORNERS: [Vec3; 6] = [
|
||||
Vec3::new(-INNER_RADIUS, 0., -0.5 * OUTER_RADIUS),
|
||||
Vec3::new(-INNER_RADIUS, 0., 0.5 * OUTER_RADIUS),
|
||||
];
|
||||
const HEX_NORMALS: [Vec3; 6] = [
|
||||
Vec3::new(0., 0., OUTER_RADIUS),
|
||||
Vec3::new(INNER_RADIUS, 0., 0.5 * OUTER_RADIUS),
|
||||
Vec3::new(INNER_RADIUS, 0., -0.5 * OUTER_RADIUS),
|
||||
Vec3::new(0., 0., -OUTER_RADIUS),
|
||||
Vec3::new(-INNER_RADIUS, 0., -0.5 * OUTER_RADIUS),
|
||||
Vec3::new(-INNER_RADIUS, 0., 0.5 * OUTER_RADIUS),
|
||||
];
|
||||
|
||||
pub fn generate_chunk_mesh(
|
||||
chunk: &Chunk,
|
||||
@@ -35,6 +43,7 @@ pub fn generate_chunk_mesh(
|
||||
let mut verts = Vec::with_capacity(vertex_count);
|
||||
let mut uvs = Vec::with_capacity(vertex_count);
|
||||
let mut indices = Vec::with_capacity(vertex_count);
|
||||
let mut texture_indicies = Vec::with_capacity(vertex_count);
|
||||
|
||||
for z in 0..Chunk::SIZE {
|
||||
for x in 0..Chunk::SIZE {
|
||||
@@ -57,6 +66,7 @@ pub fn generate_chunk_mesh(
|
||||
&mut verts,
|
||||
&mut uvs,
|
||||
&mut indices,
|
||||
&mut texture_indicies,
|
||||
// &mut tex,
|
||||
tile.texture_id,
|
||||
tile.side_texture_id,
|
||||
@@ -70,6 +80,7 @@ pub fn generate_chunk_mesh(
|
||||
)
|
||||
.with_inserted_attribute(Mesh::ATTRIBUTE_POSITION, verts)
|
||||
.with_inserted_attribute(Mesh::ATTRIBUTE_UV_0, uvs)
|
||||
.with_inserted_attribute(ATTRIBUTE_TEXTURE_INDEX, texture_indicies)
|
||||
.with_inserted_indices(Indices::U32(indices))
|
||||
.with_duplicated_vertices()
|
||||
.with_computed_flat_normals();
|
||||
@@ -82,24 +93,25 @@ fn create_tile(
|
||||
verts: &mut Vec<Vec3>,
|
||||
uvs: &mut Vec<Vec2>,
|
||||
indices: &mut Vec<u32>,
|
||||
texture_indices: &mut Vec<u32>,
|
||||
texture_index: u32,
|
||||
side_texture_index: u32,
|
||||
) {
|
||||
let uv_offset = Vec2::splat(0.5);
|
||||
let tex_off = Vec2::new(texture_index as f32, 0.);
|
||||
let side_tex_off = Vec2::new(side_texture_index as f32, 0.);
|
||||
|
||||
let idx = verts.len() as u32;
|
||||
uvs.push(uv_offset + tex_off);
|
||||
uvs.push(uv_offset);
|
||||
texture_indices.push(texture_index);
|
||||
verts.push(pos);
|
||||
for i in 0..6 {
|
||||
let p = pos + HEX_CORNERS[i];
|
||||
verts.push(p);
|
||||
let uv = (HEX_CORNERS[i].xz() / 2.) + uv_offset;
|
||||
uvs.push(uv + tex_off);
|
||||
uvs.push(uv);
|
||||
indices.push(idx);
|
||||
indices.push(idx + 1 + i as u32);
|
||||
indices.push(idx + 1 + ((i as u32 + 1) % 6));
|
||||
texture_indices.push(texture_index);
|
||||
}
|
||||
|
||||
for i in 0..neighbors.len() {
|
||||
@@ -107,7 +119,16 @@ fn create_tile(
|
||||
match cur_n {
|
||||
Some(n_height) => {
|
||||
if n_height < pos.y {
|
||||
create_tile_wall(pos, i, n_height, verts, uvs, indices, side_tex_off);
|
||||
create_tile_wall(
|
||||
pos,
|
||||
i,
|
||||
n_height,
|
||||
verts,
|
||||
uvs,
|
||||
indices,
|
||||
texture_indices,
|
||||
side_texture_index,
|
||||
);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
@@ -122,7 +143,8 @@ fn create_tile_wall(
|
||||
verts: &mut Vec<Vec3>,
|
||||
uvs: &mut Vec<Vec2>,
|
||||
indices: &mut Vec<u32>,
|
||||
tex_off: Vec2,
|
||||
texture_indices: &mut Vec<u32>,
|
||||
texture_index: u32,
|
||||
) {
|
||||
let p1 = HEX_CORNERS[(dir) % 6] + pos;
|
||||
let p2 = HEX_CORNERS[(dir + 1) % 6] + pos;
|
||||
@@ -136,6 +158,11 @@ fn create_tile_wall(
|
||||
verts.push(p3);
|
||||
verts.push(p4);
|
||||
|
||||
texture_indices.push(texture_index);
|
||||
texture_indices.push(texture_index);
|
||||
texture_indices.push(texture_index);
|
||||
texture_indices.push(texture_index);
|
||||
|
||||
indices.push(idx);
|
||||
indices.push(idx + 2);
|
||||
indices.push(idx + 1);
|
||||
@@ -144,8 +171,8 @@ fn create_tile_wall(
|
||||
indices.push(idx + 2);
|
||||
indices.push(idx + 3);
|
||||
|
||||
uvs.push(Vec2::ZERO + tex_off);
|
||||
uvs.push(Vec2::new(1., 0.) + tex_off);
|
||||
uvs.push(Vec2::new(0., pos.y - height) + tex_off);
|
||||
uvs.push(Vec2::new(1., pos.y - height) + tex_off);
|
||||
uvs.push(Vec2::ZERO);
|
||||
uvs.push(Vec2::new(1., 0.));
|
||||
uvs.push(Vec2::new(0., pos.y - height));
|
||||
uvs.push(Vec2::new(1., pos.y - height));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user