replace visual ground with custom ground model!
This commit is contained in:
parent
cdf695ee6e
commit
d16485ae6d
65
src/main.rs
65
src/main.rs
@ -119,7 +119,6 @@ pub struct Skybox {
|
|||||||
physics: strafe_client::body::PhysicsState,
|
physics: strafe_client::body::PhysicsState,
|
||||||
sky_pipeline: wgpu::RenderPipeline,
|
sky_pipeline: wgpu::RenderPipeline,
|
||||||
entity_pipeline: wgpu::RenderPipeline,
|
entity_pipeline: wgpu::RenderPipeline,
|
||||||
ground_pipeline: wgpu::RenderPipeline,
|
|
||||||
main_bind_group: wgpu::BindGroup,
|
main_bind_group: wgpu::BindGroup,
|
||||||
camera_buf: wgpu::Buffer,
|
camera_buf: wgpu::Buffer,
|
||||||
models: Vec<ModelGraphics>,
|
models: Vec<ModelGraphics>,
|
||||||
@ -159,8 +158,7 @@ fn get_transform_uniform_data(transform:&glam::Mat4) -> [f32; 4*4] {
|
|||||||
raw
|
raw
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec<ModelData>,source:&[u8]){
|
fn add_obj(device:&wgpu::Device,modeldatas:& mut Vec<ModelData>,data:obj::ObjData){
|
||||||
let data = obj::ObjData::load_buf(&source[..]).unwrap();
|
|
||||||
let mut vertices = Vec::new();
|
let mut vertices = Vec::new();
|
||||||
let mut vertex_index = std::collections::HashMap::<obj::IndexTuple,u16>::new();
|
let mut vertex_index = std::collections::HashMap::<obj::IndexTuple,u16>::new();
|
||||||
for object in data.objects {
|
for object in data.objects {
|
||||||
@ -223,12 +221,34 @@ impl strafe_client::framework::Example for Skybox {
|
|||||||
queue: &wgpu::Queue,
|
queue: &wgpu::Queue,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let mut modeldatas = Vec::<ModelData>::new();
|
let mut modeldatas = Vec::<ModelData>::new();
|
||||||
add_obj(device,& mut modeldatas,include_bytes!("../models/teslacyberv3.0.obj"));
|
let ground=obj::ObjData{
|
||||||
add_obj(device,& mut modeldatas,include_bytes!("../models/suzanne.obj"));
|
position: vec![[-1.0,0.0,-1.0],[1.0,0.0,-1.0],[1.0,0.0,1.0],[-1.0,0.0,1.0]],
|
||||||
add_obj(device,& mut modeldatas,include_bytes!("../models/teapot.obj"));
|
texture: vec![[-1.0,-1.0],[1.0,-1.0],[1.0,1.0],[-1.0,1.0]],
|
||||||
|
normal: vec![[0.0,1.0,0.0]],
|
||||||
|
objects: vec![obj::Object{
|
||||||
|
name: "Ground Object".to_owned(),
|
||||||
|
groups: vec![obj::Group{
|
||||||
|
name: "Ground Group".to_owned(),
|
||||||
|
index: 0,
|
||||||
|
material: None,
|
||||||
|
polys: vec![obj::SimplePolygon(vec![
|
||||||
|
obj::IndexTuple(0,Some(0),Some(0)),
|
||||||
|
obj::IndexTuple(1,Some(1),Some(0)),
|
||||||
|
obj::IndexTuple(2,Some(2),Some(0)),
|
||||||
|
obj::IndexTuple(3,Some(3),Some(0)),
|
||||||
|
])]
|
||||||
|
}]
|
||||||
|
}],
|
||||||
|
material_libs: Vec::new(),
|
||||||
|
};
|
||||||
|
add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teslacyberv3.0.obj")[..]).unwrap());
|
||||||
|
add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/suzanne.obj")[..]).unwrap());
|
||||||
|
add_obj(device,& mut modeldatas,obj::ObjData::load_buf(&include_bytes!("../models/teapot.obj")[..]).unwrap());
|
||||||
|
add_obj(device,& mut modeldatas,ground);
|
||||||
println!("models.len = {:?}", modeldatas.len());
|
println!("models.len = {:?}", modeldatas.len());
|
||||||
modeldatas[1].transform=glam::Mat4::from_translation(glam::vec3(10.,5.,10.));
|
modeldatas[1].transform=glam::Mat4::from_translation(glam::vec3(10.,5.,10.));
|
||||||
modeldatas[2].transform=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.));
|
modeldatas[2].transform=glam::Mat4::from_translation(glam::vec3(-10.,5.,10.));
|
||||||
|
modeldatas[3].transform=glam::Mat4::from_translation(glam::vec3(0.,-10.,0.))*glam::Mat4::from_scale(glam::vec3(160.0, 1.0, 160.0));
|
||||||
|
|
||||||
let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
let main_bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor {
|
||||||
label: None,
|
label: None,
|
||||||
@ -412,33 +432,6 @@ impl strafe_client::framework::Example for Skybox {
|
|||||||
multisample: wgpu::MultisampleState::default(),
|
multisample: wgpu::MultisampleState::default(),
|
||||||
multiview: None,
|
multiview: None,
|
||||||
});
|
});
|
||||||
let ground_pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor {
|
|
||||||
label: Some("Ground"),
|
|
||||||
layout: Some(&pipeline_layout),
|
|
||||||
vertex: wgpu::VertexState {
|
|
||||||
module: &shader,
|
|
||||||
entry_point: "vs_ground",
|
|
||||||
buffers: &[],
|
|
||||||
},
|
|
||||||
fragment: Some(wgpu::FragmentState {
|
|
||||||
module: &shader,
|
|
||||||
entry_point: "fs_ground",
|
|
||||||
targets: &[Some(config.view_formats[0].into())],
|
|
||||||
}),
|
|
||||||
primitive: wgpu::PrimitiveState {
|
|
||||||
front_face: wgpu::FrontFace::Cw,
|
|
||||||
..Default::default()
|
|
||||||
},
|
|
||||||
depth_stencil: Some(wgpu::DepthStencilState {
|
|
||||||
format: Self::DEPTH_FORMAT,
|
|
||||||
depth_write_enabled: true,
|
|
||||||
depth_compare: wgpu::CompareFunction::LessEqual,
|
|
||||||
stencil: wgpu::StencilState::default(),
|
|
||||||
bias: wgpu::DepthBiasState::default(),
|
|
||||||
}),
|
|
||||||
multisample: wgpu::MultisampleState::default(),
|
|
||||||
multiview: None,
|
|
||||||
});
|
|
||||||
|
|
||||||
let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
|
let sampler = device.create_sampler(&wgpu::SamplerDescriptor {
|
||||||
label: None,
|
label: None,
|
||||||
@ -550,7 +543,6 @@ impl strafe_client::framework::Example for Skybox {
|
|||||||
physics,
|
physics,
|
||||||
sky_pipeline,
|
sky_pipeline,
|
||||||
entity_pipeline,
|
entity_pipeline,
|
||||||
ground_pipeline,
|
|
||||||
main_bind_group,
|
main_bind_group,
|
||||||
camera_buf,
|
camera_buf,
|
||||||
models,
|
models,
|
||||||
@ -735,11 +727,6 @@ impl strafe_client::framework::Example for Skybox {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rpass.set_pipeline(&self.ground_pipeline);
|
|
||||||
//rpass.set_index_buffer(&[0u16,1,2,1,2,3][..] as wgpu::BufferSlice, wgpu::IndexFormat::Uint16);
|
|
||||||
//rpass.draw_indexed(0..4, 0, 0..1);
|
|
||||||
rpass.draw(0..6, 0..1);
|
|
||||||
|
|
||||||
rpass.set_pipeline(&self.sky_pipeline);
|
rpass.set_pipeline(&self.sky_pipeline);
|
||||||
rpass.draw(0..3, 0..1);
|
rpass.draw(0..3, 0..1);
|
||||||
}
|
}
|
||||||
|
@ -39,28 +39,6 @@ fn vs_sky(@builtin(vertex_index) vertex_index: u32) -> SkyOutput {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct GroundOutput {
|
|
||||||
@builtin(position) position: vec4<f32>,
|
|
||||||
@location(4) pos: vec3<f32>,
|
|
||||||
};
|
|
||||||
|
|
||||||
@vertex
|
|
||||||
fn vs_ground(@builtin(vertex_index) vertex_index: u32) -> GroundOutput {
|
|
||||||
// hacky way to draw two triangles that make a square
|
|
||||||
let tmp1 = i32(vertex_index)/2-i32(vertex_index)/3;
|
|
||||||
let tmp2 = i32(vertex_index)&1;
|
|
||||||
let pos = vec3<f32>(
|
|
||||||
f32(tmp1) * 2.0 - 1.0,
|
|
||||||
0.0,
|
|
||||||
f32(tmp2) * 2.0 - 1.0
|
|
||||||
) * 160.0;
|
|
||||||
|
|
||||||
var result: GroundOutput;
|
|
||||||
result.pos = pos;
|
|
||||||
result.position = r_data.proj * r_data.view * vec4<f32>(pos, 1.0);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct EntityOutput {
|
struct EntityOutput {
|
||||||
@builtin(position) position: vec4<f32>,
|
@builtin(position) position: vec4<f32>,
|
||||||
@location(1) texture: vec2<f32>,
|
@location(1) texture: vec2<f32>,
|
||||||
@ -111,21 +89,3 @@ fn fs_entity(vertex: EntityOutput) -> @location(0) vec4<f32> {
|
|||||||
let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb;
|
let reflected_color = textureSample(r_texture, r_sampler, reflected).rgb;
|
||||||
return vec4<f32>(mix(vec3<f32>(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0);
|
return vec4<f32>(mix(vec3<f32>(0.1) + 0.5 * reflected_color,texture_color,1.0-pow(1.0-abs(d),2.0)), 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn modulo_euclidean (a: f32, b: f32) -> f32 {
|
|
||||||
var m = a % b;
|
|
||||||
if (m < 0.0) {
|
|
||||||
if (b < 0.0) {
|
|
||||||
m -= b;
|
|
||||||
} else {
|
|
||||||
m += b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return m;
|
|
||||||
}
|
|
||||||
|
|
||||||
@fragment
|
|
||||||
fn fs_ground(vertex: GroundOutput) -> @location(0) vec4<f32> {
|
|
||||||
let dir = vec3<f32>(-1.0)+vec3<f32>(modulo_euclidean(vertex.pos.x/16.,1.0),0.0,modulo_euclidean(vertex.pos.z/16.,1.0))*2.0;
|
|
||||||
return vec4<f32>(textureSample(r_texture, r_sampler, dir).rgb, 1.0);
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user