Compare commits
6 Commits
lunex
...
texture-in
| Author | SHA1 | Date | |
|---|---|---|---|
| cdc3522773 | |||
| e8cf54a578 | |||
| 9131f68624 | |||
| 8d109a359a | |||
| a3163684c7 | |||
| b644da1f56 |
@@ -61,6 +61,7 @@ pub fn generate_chunk_mesh(
|
||||
let mut uvs = Vec::with_capacity(vertex_count);
|
||||
let mut indices = Vec::with_capacity(vertex_count);
|
||||
let mut normals = 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 {
|
||||
@@ -84,6 +85,7 @@ pub fn generate_chunk_mesh(
|
||||
&mut uvs,
|
||||
&mut indices,
|
||||
&mut normals,
|
||||
&mut texture_indicies,
|
||||
// &mut tex,
|
||||
tile.texture_id,
|
||||
tile.side_texture_id,
|
||||
@@ -97,12 +99,12 @@ 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_attribute(Mesh::ATTRIBUTE_NORMAL, normals)
|
||||
.with_inserted_indices(Indices::U32(indices));
|
||||
return mesh;
|
||||
}
|
||||
|
||||
const TEX_MULTI: Vec2 = Vec2::new(1000., 1.);
|
||||
fn create_tile(
|
||||
pos: Vec3,
|
||||
neighbors: &[Option<f32>; 6],
|
||||
@@ -110,26 +112,28 @@ fn create_tile(
|
||||
uvs: &mut Vec<Vec2>,
|
||||
indices: &mut Vec<u32>,
|
||||
normals: &mut Vec<Vec3>,
|
||||
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_MULTI) + tex_off);
|
||||
texture_indices.push(texture_index);
|
||||
uvs.push(uv_offset);
|
||||
verts.push(pos);
|
||||
normals.push(Vec3::Y);
|
||||
|
||||
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_MULTI) + tex_off);
|
||||
uvs.push(uv);
|
||||
indices.push(idx);
|
||||
indices.push(idx + 1 + i as u32);
|
||||
indices.push(idx + 1 + ((i as u32 + 1) % 6));
|
||||
normals.push(Vec3::Y);
|
||||
texture_indices.push(texture_index);
|
||||
}
|
||||
|
||||
for i in 0..neighbors.len() {
|
||||
@@ -137,7 +141,17 @@ fn create_tile(
|
||||
match cur_n {
|
||||
Some(n_height) => {
|
||||
if n_height < pos.y {
|
||||
create_tile_wall(pos, i, n_height, verts, uvs, indices, normals, side_tex_off);
|
||||
create_tile_wall(
|
||||
pos,
|
||||
i,
|
||||
n_height,
|
||||
verts,
|
||||
uvs,
|
||||
indices,
|
||||
normals,
|
||||
texture_indices,
|
||||
side_texture_index,
|
||||
);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
@@ -153,7 +167,8 @@ fn create_tile_wall(
|
||||
uvs: &mut Vec<Vec2>,
|
||||
indices: &mut Vec<u32>,
|
||||
normals: &mut Vec<Vec3>,
|
||||
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;
|
||||
@@ -167,6 +182,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);
|
||||
|
||||
let n = HEX_NORMALS[dir].normalize();
|
||||
normals.push(n);
|
||||
normals.push(n);
|
||||
@@ -181,8 +201,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_MULTI) + tex_off);
|
||||
uvs.push((Vec2::new(0., pos.y - height) / TEX_MULTI) + tex_off);
|
||||
uvs.push((Vec2::new(1., pos.y - height) / TEX_MULTI) + 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));
|
||||
}
|
||||
|
||||
Submodule game/main/assets updated: 256b49cc29...830f846764
@@ -11,24 +11,26 @@ use phos::PhosGamePlugin;
|
||||
fn main() {
|
||||
App::new()
|
||||
.add_plugins((
|
||||
DefaultPlugins.set(WindowPlugin {
|
||||
primary_window: Some(Window {
|
||||
title: "Phos".into(),
|
||||
name: Some("phos".into()),
|
||||
resolution: (1920.0, 1080.0).into(),
|
||||
resizable: true,
|
||||
present_mode: PresentMode::AutoNoVsync,
|
||||
DefaultPlugins
|
||||
.set(WindowPlugin {
|
||||
primary_window: Some(Window {
|
||||
title: "Phos".into(),
|
||||
name: Some("phos".into()),
|
||||
resolution: (1920.0, 1080.0).into(),
|
||||
resizable: true,
|
||||
present_mode: PresentMode::AutoNoVsync,
|
||||
..default()
|
||||
}),
|
||||
..default()
|
||||
})
|
||||
.set(ImagePlugin {
|
||||
default_sampler: ImageSamplerDescriptor {
|
||||
address_mode_u: ImageAddressMode::Repeat,
|
||||
address_mode_v: ImageAddressMode::Repeat,
|
||||
mag_filter: ImageFilterMode::Nearest,
|
||||
..default()
|
||||
},
|
||||
}),
|
||||
..default()
|
||||
}).set(ImagePlugin {
|
||||
default_sampler: ImageSamplerDescriptor {
|
||||
address_mode_u: ImageAddressMode::Repeat,
|
||||
address_mode_v: ImageAddressMode::Repeat,
|
||||
mag_filter: ImageFilterMode::Nearest,
|
||||
..default()
|
||||
}
|
||||
}),
|
||||
WorldInspectorPlugin::new(),
|
||||
PhosGamePlugin,
|
||||
))
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
use bevy::asset::Handle;
|
||||
|
||||
use bevy::prelude::{Component, Image, Resource};
|
||||
|
||||
#[derive(Resource)]
|
||||
|
||||
43
game/main/src/shaders/chunk.rs
Normal file
43
game/main/src/shaders/chunk.rs
Normal file
@@ -0,0 +1,43 @@
|
||||
use bevy::{
|
||||
asset::{Asset, Handle},
|
||||
pbr::{MaterialExtension, MaterialExtensionKey, MaterialExtensionPipeline},
|
||||
prelude::*,
|
||||
reflect::TypePath,
|
||||
render::{
|
||||
mesh::MeshVertexBufferLayout,
|
||||
render_resource::{
|
||||
AsBindGroup, RenderPipelineDescriptor, ShaderRef, SpecializedMeshPipelineError,
|
||||
},
|
||||
texture::Image,
|
||||
},
|
||||
};
|
||||
use world_generation::prelude::ATTRIBUTE_TEXTURE_INDEX;
|
||||
|
||||
#[derive(Asset, TypePath, AsBindGroup, Debug, Clone)]
|
||||
pub struct ChunkMaterial {
|
||||
#[texture(100, dimension = "2d_array")]
|
||||
#[sampler(101)]
|
||||
pub array_texture: Handle<Image>,
|
||||
}
|
||||
|
||||
impl MaterialExtension for ChunkMaterial {
|
||||
fn fragment_shader() -> ShaderRef {
|
||||
"shaders/world/chunk.wgsl".into()
|
||||
}
|
||||
|
||||
fn specialize(
|
||||
_pipeline: &MaterialExtensionPipeline,
|
||||
descriptor: &mut RenderPipelineDescriptor,
|
||||
layout: &MeshVertexBufferLayout,
|
||||
_key: MaterialExtensionKey<Self>,
|
||||
) -> Result<(), SpecializedMeshPipelineError> {
|
||||
let vertex_layout = layout.get_layout(&[
|
||||
Mesh::ATTRIBUTE_POSITION.at_shader_location(0),
|
||||
Mesh::ATTRIBUTE_UV_0.at_shader_location(1),
|
||||
Mesh::ATTRIBUTE_NORMAL.at_shader_location(2),
|
||||
ATTRIBUTE_TEXTURE_INDEX.at_shader_location(7),
|
||||
])?;
|
||||
descriptor.vertex.buffers = vec![vertex_layout];
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
1
game/main/src/shaders/mod.rs
Normal file
1
game/main/src/shaders/mod.rs
Normal file
@@ -0,0 +1 @@
|
||||
pub mod chunk;
|
||||
Reference in New Issue
Block a user