cuboid and cube pipeline working
This commit is contained in:
parent
4494b68c26
commit
912659bb52
13 changed files with 230 additions and 162 deletions
2
build.rs
2
build.rs
|
@ -17,12 +17,14 @@ fn main() {
|
||||||
println!("cargo::rerun-if-changed=shaders/frag_cuboid.spv");
|
println!("cargo::rerun-if-changed=shaders/frag_cuboid.spv");
|
||||||
println!("cargo::rerun-if-changed=shaders/vert_cuboid.spv");
|
println!("cargo::rerun-if-changed=shaders/vert_cuboid.spv");
|
||||||
|
|
||||||
|
#[allow(unused_must_use)]
|
||||||
std::fs::remove_file("shaders/geo_cube.spv");
|
std::fs::remove_file("shaders/geo_cube.spv");
|
||||||
std::fs::remove_file("shaders/frag_cube.spv");
|
std::fs::remove_file("shaders/frag_cube.spv");
|
||||||
std::fs::remove_file("shaders/vert_cube.spv");
|
std::fs::remove_file("shaders/vert_cube.spv");
|
||||||
std::fs::remove_file("shaders/geo_cuboid.spv");
|
std::fs::remove_file("shaders/geo_cuboid.spv");
|
||||||
std::fs::remove_file("shaders/frag_cuboid.spv");
|
std::fs::remove_file("shaders/frag_cuboid.spv");
|
||||||
std::fs::remove_file("shaders/vert_cuboid.spv");
|
std::fs::remove_file("shaders/vert_cuboid.spv");
|
||||||
|
#[warn(unused_must_use)]
|
||||||
// probably need to check the os and have different versions
|
// probably need to check the os and have different versions
|
||||||
let mut command = Command::new("./shaders/compile.bat");
|
let mut command = Command::new("./shaders/compile.bat");
|
||||||
let output = command.output().expect("Failed to execute command");
|
let output = command.output().expect("Failed to execute command");
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
layout(location = 0) in vec3 fragColor;
|
layout(location = 0) in vec3 fragColor;
|
||||||
layout(location = 1) in vec2 fragTexCoord;
|
layout(location = 1) in vec2 fragTexCoord;
|
||||||
|
layout(location = 2) in vec3 fragSize;
|
||||||
|
|
||||||
layout(location = 0) out vec4 outColor;
|
layout(location = 0) out vec4 outColor;
|
||||||
layout(binding = 1) uniform sampler2D texSampler;
|
layout(binding = 1) uniform sampler2D texSampler;
|
||||||
|
|
|
@ -27,22 +27,22 @@ void main () {
|
||||||
float scalar_back = dot(normal_back, vec4(1, 0, 0, 0));
|
float scalar_back = dot(normal_back, vec4(1, 0, 0, 0));
|
||||||
|
|
||||||
if (scalar_back <= 0 || ignore_scalars){
|
if (scalar_back <= 0 || ignore_scalars){
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
@ -53,22 +53,22 @@ void main () {
|
||||||
vec4 normal_front = geom_rotation * vec4(0, 0, 1, 0);
|
vec4 normal_front = geom_rotation * vec4(0, 0, 1, 0);
|
||||||
float scalar_front = dot(normal_front, vec4(1, 0, 0, 0));
|
float scalar_front = dot(normal_front, vec4(1, 0, 0, 0));
|
||||||
if (scalar_front <= 0 || ignore_scalars) {
|
if (scalar_front <= 0 || ignore_scalars) {
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
@ -79,22 +79,22 @@ void main () {
|
||||||
float scalar_up = dot(normal_up, vec4(1, 0, 0, 0));
|
float scalar_up = dot(normal_up, vec4(1, 0, 0, 0));
|
||||||
|
|
||||||
if (scalar_up <= 0 || ignore_scalars) {
|
if (scalar_up <= 0 || ignore_scalars) {
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
@ -105,22 +105,22 @@ void main () {
|
||||||
float scalar_down = dot(normal_down, vec4(1, 0, 0, 0));
|
float scalar_down = dot(normal_down, vec4(1, 0, 0, 0));
|
||||||
|
|
||||||
if (scalar_down <= 0 || ignore_scalars) {
|
if (scalar_down <= 0 || ignore_scalars) {
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
@ -131,22 +131,22 @@ void main () {
|
||||||
float scalar_left = dot(normal_left, vec4(1, 0, 0, 0));
|
float scalar_left = dot(normal_left, vec4(1, 0, 0, 0));
|
||||||
|
|
||||||
if (scalar_left <= 0 || ignore_scalars) {
|
if (scalar_left <= 0 || ignore_scalars) {
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(-geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(-geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
@ -157,22 +157,22 @@ void main () {
|
||||||
float scalar_right = dot(normal_right, vec4(1, 0, 0, 0));
|
float scalar_right = dot(normal_right, vec4(1, 0, 0, 0));
|
||||||
|
|
||||||
if (scalar_right <= 0 || ignore_scalars) {
|
if (scalar_right <= 0 || ignore_scalars) {
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, -geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, -geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, geoSize[0].y, geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
||||||
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * vec4(geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
gl_Position = ubo.proj * ubo.view * (gl_in[0].gl_Position + geom_rotation * 0.5 * vec4(geoSize[0].x, geoSize[0].y, -geoSize[0].z, 0));
|
||||||
fragColor = geoColor[0];
|
fragColor = geoColor[0];
|
||||||
fragTexCoord = geoTexCoord[0];
|
fragTexCoord = geoTexCoord[0];
|
||||||
EmitVertex();
|
EmitVertex();
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -8,8 +8,8 @@ use std::ptr::copy_nonoverlapping as memcpy;
|
||||||
pub type Mat4 = cgmath::Matrix4<f32>;
|
pub type Mat4 = cgmath::Matrix4<f32>;
|
||||||
|
|
||||||
use crate::app_data;
|
use crate::app_data;
|
||||||
use crate::vertex;
|
|
||||||
use crate::command_buffer;
|
use crate::command_buffer;
|
||||||
|
use crate::vertex::VertexContainer;
|
||||||
|
|
||||||
pub unsafe fn create_buffer(
|
pub unsafe fn create_buffer(
|
||||||
instance: &Instance,
|
instance: &Instance,
|
||||||
|
@ -44,13 +44,13 @@ pub unsafe fn create_buffer(
|
||||||
Ok((buffer, buffer_memory))
|
Ok((buffer, buffer_memory))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn create_vertex_buffer(
|
pub unsafe fn create_vertex_buffer<const COUNT: usize, T: VertexContainer<COUNT>>(
|
||||||
instance: &Instance,
|
instance: &Instance,
|
||||||
device: &Device,
|
device: &Device,
|
||||||
data: &app_data::AppData,
|
data: &app_data::AppData,
|
||||||
vertices: &Vec<vertex::Vertex>
|
vertices: &Vec<T>
|
||||||
) -> Result<(vk::Buffer, vk::DeviceMemory)> {
|
) -> Result<(vk::Buffer, vk::DeviceMemory)> {
|
||||||
let size = (size_of::<vertex::Vertex>() * vertices.len()) as u64;
|
let size = (size_of::<T>() * vertices.len()) as u64;
|
||||||
|
|
||||||
let (staging_buffer, staging_buffer_memory) = create_buffer(
|
let (staging_buffer, staging_buffer_memory) = create_buffer(
|
||||||
instance,
|
instance,
|
||||||
|
|
|
@ -67,11 +67,13 @@ pub unsafe fn create_command_buffers(device: &Device, data: &mut app_data::AppDa
|
||||||
device.cmd_begin_render_pass(
|
device.cmd_begin_render_pass(
|
||||||
*command_buffer, &info, vk::SubpassContents::INLINE);
|
*command_buffer, &info, vk::SubpassContents::INLINE);
|
||||||
|
|
||||||
|
if scene_handler.vertices.len() != 0 {
|
||||||
device.cmd_bind_pipeline(
|
device.cmd_bind_pipeline(
|
||||||
*command_buffer, vk::PipelineBindPoint::GRAPHICS, data.pipeline_cube);
|
*command_buffer, vk::PipelineBindPoint::GRAPHICS, data.pipeline_cube);
|
||||||
|
|
||||||
device.cmd_bind_vertex_buffers(*command_buffer, 0, &[scene_handler.vertex_buffer], &[0]);
|
device.cmd_bind_vertex_buffers(*command_buffer, 0, &[scene_handler.vertex_buffer_cube], &[0]);
|
||||||
device.cmd_bind_index_buffer(*command_buffer, scene_handler.index_buffer, 0, vk::IndexType::UINT32);
|
device.cmd_bind_index_buffer(*command_buffer, scene_handler.index_buffer_cube, 0, vk::IndexType::UINT32);
|
||||||
|
|
||||||
|
|
||||||
device.cmd_bind_descriptor_sets(
|
device.cmd_bind_descriptor_sets(
|
||||||
*command_buffer,
|
*command_buffer,
|
||||||
|
@ -82,7 +84,28 @@ pub unsafe fn create_command_buffers(device: &Device, data: &mut app_data::AppDa
|
||||||
&[],
|
&[],
|
||||||
);
|
);
|
||||||
|
|
||||||
device.cmd_draw_indexed(*command_buffer, scene_handler.indices.len() as u32, 1, 0, 0, 0);
|
device.cmd_draw_indexed(*command_buffer, scene_handler.indices_cube.len() as u32, 1, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if scene_handler.sized_vertices.len() != 0 {
|
||||||
|
device.cmd_bind_pipeline(
|
||||||
|
*command_buffer, vk::PipelineBindPoint::GRAPHICS, data.pipeline_cuboid);
|
||||||
|
|
||||||
|
device.cmd_bind_vertex_buffers(*command_buffer, 0, &[scene_handler.vertex_buffer_cuboid], &[0]);
|
||||||
|
device.cmd_bind_index_buffer(*command_buffer, scene_handler.index_buffer_cuboid, 0, vk::IndexType::UINT32);
|
||||||
|
|
||||||
|
|
||||||
|
device.cmd_bind_descriptor_sets(
|
||||||
|
*command_buffer,
|
||||||
|
vk::PipelineBindPoint::GRAPHICS,
|
||||||
|
data.pipeline_layout,
|
||||||
|
0,
|
||||||
|
&[data.descriptor_sets[i]],
|
||||||
|
&[],
|
||||||
|
);
|
||||||
|
|
||||||
|
device.cmd_draw_indexed(*command_buffer, scene_handler.indices_cuboid.len() as u32, 1, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
device.cmd_end_render_pass(*command_buffer);
|
device.cmd_end_render_pass(*command_buffer);
|
||||||
|
|
||||||
|
|
|
@ -47,12 +47,12 @@ pub fn load_model(data: &mut app_data::AppData, scene_handler: &mut scene::Scene
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(index) = unique_vertices.get(&vertex) {
|
if let Some(index) = unique_vertices.get(&vertex) {
|
||||||
scene_handler.indices.push(*index as u32);
|
scene_handler.indices_cube.push(*index as u32);
|
||||||
} else {
|
} else {
|
||||||
let index = scene_handler.vertices.len();
|
let index = scene_handler.vertices.len();
|
||||||
unique_vertices.insert(vertex, index);
|
unique_vertices.insert(vertex, index);
|
||||||
scene_handler.vertices.push(vertex);
|
scene_handler.vertices.push(vertex);
|
||||||
scene_handler.indices.push(index as u32);
|
scene_handler.indices_cube.push(index as u32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ use std::mem::size_of;
|
||||||
use std::ptr::copy_nonoverlapping as memcpy;
|
use std::ptr::copy_nonoverlapping as memcpy;
|
||||||
|
|
||||||
use std::time::Instant;
|
use std::time::Instant;
|
||||||
|
use crate::vertex::VertexContainer;
|
||||||
|
|
||||||
pub mod app_data;
|
pub mod app_data;
|
||||||
pub mod errors;
|
pub mod errors;
|
||||||
|
|
|
@ -66,58 +66,58 @@ impl Drawable for Cube {
|
||||||
|
|
||||||
|
|
||||||
// top
|
// top
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cube.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cube.push(start_index as u32 + 0);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cube.push(start_index as u32 + 2);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cube.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cube.push(start_index as u32 + 1);
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cube.push(start_index as u32 + 0);
|
||||||
|
|
||||||
// bottom
|
// bottom
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cube.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cube.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cube.push(start_index as u32 + 7);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cube.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cube.push(start_index as u32 + 5);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cube.push(start_index as u32 + 7);
|
||||||
|
|
||||||
// left
|
// left
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cube.push(start_index as u32 + 0);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cube.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cube.push(start_index as u32 + 2);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cube.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cube.push(start_index as u32 + 2);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cube.push(start_index as u32 + 4);
|
||||||
|
|
||||||
// right
|
// right
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cube.push(start_index as u32 + 1);
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cube.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cube.push(start_index as u32 + 5);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cube.push(start_index as u32 + 5);
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cube.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cube.push(start_index as u32 + 7);
|
||||||
|
|
||||||
// near
|
// near
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cube.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cube.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cube.push(start_index as u32 + 2);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cube.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cube.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cube.push(start_index as u32 + 7);
|
||||||
|
|
||||||
// far
|
// far
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cube.push(start_index as u32 + 0);
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cube.push(start_index as u32 + 1);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cube.push(start_index as u32 + 4);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cube.push(start_index as u32 + 5);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cube.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cube.push(start_index as u32 + 1);
|
||||||
}
|
}
|
||||||
if *topology == vk::PrimitiveTopology::POINT_LIST {
|
if *topology == vk::PrimitiveTopology::POINT_LIST {
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.vertices.push(vertex::Vertex::new(
|
||||||
|
@ -125,7 +125,7 @@ impl Drawable for Cube {
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord
|
||||||
));
|
));
|
||||||
scene.indices.push(start_index as u32);
|
scene.indices_cube.push(start_index as u32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -16,109 +16,117 @@ impl Drawable for Cuboid {
|
||||||
fn draw(& self, topology: &vk::PrimitiveTopology, start_index: usize, scene: &mut Scene) {
|
fn draw(& self, topology: &vk::PrimitiveTopology, start_index: usize, scene: &mut Scene) {
|
||||||
if *topology == vk::PrimitiveTopology::TRIANGLE_LIST {
|
if *topology == vk::PrimitiveTopology::TRIANGLE_LIST {
|
||||||
// 0 top left far
|
// 0 top left far
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
// 1 top right far
|
// 1 top right far
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
// 2 top left near
|
// 2 top left near
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
// 3 top right near
|
// 3 top right near
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 + 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
|
|
||||||
// 4 bottom left far
|
// 4 bottom left far
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
// 5 bottom right far
|
// 5 bottom right far
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 + 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
// 6 bottom left near
|
// 6 bottom left near
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
vec3(self.pos.x as f32 - 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
// 7 bottom right near
|
// 7 bottom right near
|
||||||
scene.vertices.push(vertex::Vertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
vec3(self.pos.x as f32 + 0.5 * self.size.x, self.pos.y as f32 - 0.5 * self.size.y, self.pos.z as f32 - 0.5 * self.size.z),
|
||||||
self.color,
|
self.color,
|
||||||
self.tex_coord
|
self.tex_coord,
|
||||||
|
self.size,
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
||||||
// top
|
// top
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cuboid.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cuboid.push(start_index as u32 + 0);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cuboid.push(start_index as u32 + 2);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cuboid.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cuboid.push(start_index as u32 + 1);
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cuboid.push(start_index as u32 + 0);
|
||||||
|
|
||||||
// bottom
|
// bottom
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cuboid.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cuboid.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cuboid.push(start_index as u32 + 7);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cuboid.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cuboid.push(start_index as u32 + 5);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cuboid.push(start_index as u32 + 7);
|
||||||
|
|
||||||
// left
|
// left
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cuboid.push(start_index as u32 + 0);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cuboid.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cuboid.push(start_index as u32 + 2);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cuboid.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cuboid.push(start_index as u32 + 2);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cuboid.push(start_index as u32 + 4);
|
||||||
|
|
||||||
// right
|
// right
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cuboid.push(start_index as u32 + 1);
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cuboid.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cuboid.push(start_index as u32 + 5);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cuboid.push(start_index as u32 + 5);
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cuboid.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cuboid.push(start_index as u32 + 7);
|
||||||
|
|
||||||
// near
|
// near
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cuboid.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cuboid.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 2);
|
scene.indices_cuboid.push(start_index as u32 + 2);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 3);
|
scene.indices_cuboid.push(start_index as u32 + 3);
|
||||||
scene.indices.push(start_index as u32 + 6);
|
scene.indices_cuboid.push(start_index as u32 + 6);
|
||||||
scene.indices.push(start_index as u32 + 7);
|
scene.indices_cuboid.push(start_index as u32 + 7);
|
||||||
|
|
||||||
// far
|
// far
|
||||||
scene.indices.push(start_index as u32 + 0);
|
scene.indices_cuboid.push(start_index as u32 + 0);
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cuboid.push(start_index as u32 + 1);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cuboid.push(start_index as u32 + 4);
|
||||||
|
|
||||||
scene.indices.push(start_index as u32 + 5);
|
scene.indices_cuboid.push(start_index as u32 + 5);
|
||||||
scene.indices.push(start_index as u32 + 4);
|
scene.indices_cuboid.push(start_index as u32 + 4);
|
||||||
scene.indices.push(start_index as u32 + 1);
|
scene.indices_cuboid.push(start_index as u32 + 1);
|
||||||
}
|
}
|
||||||
if *topology == vk::PrimitiveTopology::POINT_LIST {
|
if *topology == vk::PrimitiveTopology::POINT_LIST {
|
||||||
scene.sized_vertices.push(vertex::SizedVertex::new(
|
scene.sized_vertices.push(vertex::SizedVertex::new(
|
||||||
|
@ -127,7 +135,7 @@ impl Drawable for Cuboid {
|
||||||
self.tex_coord,
|
self.tex_coord,
|
||||||
self.size,
|
self.size,
|
||||||
));
|
));
|
||||||
scene.indices.push(start_index as u32);
|
scene.indices_cuboid.push(start_index as u32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
59
src/scene.rs
59
src/scene.rs
|
@ -5,9 +5,7 @@ use anyhow::Result;
|
||||||
use cgmath::{vec2, vec3, Vector3};
|
use cgmath::{vec2, vec3, Vector3};
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::collections::HashMap;
|
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use rustc_hash::FxHashMap;
|
|
||||||
|
|
||||||
use crate::app_data::AppData;
|
use crate::app_data::AppData;
|
||||||
use crate::buffer;
|
use crate::buffer;
|
||||||
|
@ -28,19 +26,26 @@ const MIN_CHUNK_SIZE: usize = CHUNK_SIZE / (2 as usize).pow(MAX_TREE_DEPTH as u3
|
||||||
pub struct Scene {
|
pub struct Scene {
|
||||||
pub vertices: Vec<vertex::Vertex>,
|
pub vertices: Vec<vertex::Vertex>,
|
||||||
pub sized_vertices: Vec<vertex::SizedVertex>,
|
pub sized_vertices: Vec<vertex::SizedVertex>,
|
||||||
pub indices: Vec<u32>,
|
pub indices_cube: Vec<u32>,
|
||||||
|
pub indices_cuboid: Vec<u32>,
|
||||||
|
|
||||||
pub vertex_buffer: vk::Buffer,
|
pub vertex_buffer_cube: vk::Buffer,
|
||||||
pub vertex_buffer_memory: vk::DeviceMemory,
|
pub vertex_buffer_memory_cube: vk::DeviceMemory,
|
||||||
|
|
||||||
pub index_buffer: vk::Buffer,
|
pub index_buffer_cube: vk::Buffer,
|
||||||
pub index_buffer_memory: vk::DeviceMemory,
|
pub index_buffer_memory_cube: vk::DeviceMemory,
|
||||||
|
|
||||||
|
pub vertex_buffer_cuboid: vk::Buffer,
|
||||||
|
pub vertex_buffer_memory_cuboid: vk::DeviceMemory,
|
||||||
|
|
||||||
|
pub index_buffer_cuboid: vk::Buffer,
|
||||||
|
pub index_buffer_memory_cuboid: vk::DeviceMemory,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Scene {
|
impl Scene {
|
||||||
pub unsafe fn prepare_data(&mut self, instance: &vulkanalia::Instance, device: &vulkanalia::Device, data: &AppData) -> Result<()> {
|
pub unsafe fn prepare_data(&mut self, instance: &vulkanalia::Instance, device: &vulkanalia::Device, data: &AppData) -> Result<()> {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let grid_size = CHUNK_SIZE as i32;
|
let grid_size = 50; //CHUNK_SIZE as i32;
|
||||||
|
|
||||||
// todo store the chunks somewhere (or only use them as intermediary for neighbouthood calculation idc)
|
// todo store the chunks somewhere (or only use them as intermediary for neighbouthood calculation idc)
|
||||||
let mut oct_tree = OctTree::create(CHUNK_SIZE)?;
|
let mut oct_tree = OctTree::create(CHUNK_SIZE)?;
|
||||||
|
@ -62,40 +67,59 @@ impl Scene {
|
||||||
|
|
||||||
let oct_tree_iter = OctTreeIter::create(&oct_tree)?;
|
let oct_tree_iter = OctTreeIter::create(&oct_tree)?;
|
||||||
for item in oct_tree_iter {
|
for item in oct_tree_iter {
|
||||||
|
let sized_index = self.sized_vertices.len();
|
||||||
let index = self.vertices.len();
|
let index = self.vertices.len();
|
||||||
match item {
|
match item {
|
||||||
Some(cube) => {
|
Some(cube) => {
|
||||||
/*let cuboid = Cuboid {
|
if (cube.pos.x + cube.pos.y) as usize % 2 == 0{
|
||||||
|
/**/
|
||||||
|
let cuboid = Cuboid {
|
||||||
pos: cube.pos,
|
pos: cube.pos,
|
||||||
color: cube.color,
|
color: cube.color,
|
||||||
tex_coord: cube.tex_coord,
|
tex_coord: cube.tex_coord,
|
||||||
size: Vector3 {x: 1.0, y: 1.0, z: 1.0},
|
size: Vector3 {x: 1.0, y: 1.0, z: 1.0},
|
||||||
};
|
};
|
||||||
cuboid.draw(&data.topology, index, self);*/
|
cuboid.draw(&data.topology, sized_index, self);
|
||||||
|
}
|
||||||
|
else {
|
||||||
cube.draw(&data.topology, index, self);
|
cube.draw(&data.topology, index, self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None => {}
|
None => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(self.vertex_buffer, self.vertex_buffer_memory) = buffer::create_vertex_buffer(instance, device, &data, &self.vertices)?;
|
if self.vertices.len() != 0 {
|
||||||
(self.index_buffer, self.index_buffer_memory) = buffer::create_index_buffer(&instance, &device, &data, &self.indices)?;
|
(self.vertex_buffer_cube, self.vertex_buffer_memory_cube) = buffer::create_vertex_buffer(instance, device, &data, &self.vertices)?;
|
||||||
|
(self.index_buffer_cube, self.index_buffer_memory_cube) = buffer::create_index_buffer(&instance, &device, &data, &self.indices_cube)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.sized_vertices.len() != 0 {
|
||||||
|
(self.vertex_buffer_cuboid, self.vertex_buffer_memory_cuboid) = buffer::create_vertex_buffer(instance, device, &data, &self.sized_vertices)?;
|
||||||
|
(self.index_buffer_cuboid, self.index_buffer_memory_cuboid) = buffer::create_index_buffer(&instance, &device, &data, &self.indices_cuboid)?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub unsafe fn destroy(&mut self, device: &vulkanalia::Device) {
|
pub unsafe fn destroy(&mut self, device: &vulkanalia::Device) {
|
||||||
device.destroy_buffer(self.index_buffer, None);
|
device.destroy_buffer(self.index_buffer_cube, None);
|
||||||
device.free_memory(self.index_buffer_memory, None);
|
device.free_memory(self.index_buffer_memory_cube, None);
|
||||||
|
|
||||||
device.destroy_buffer(self.vertex_buffer, None);
|
device.destroy_buffer(self.vertex_buffer_cube, None);
|
||||||
device.free_memory(self.vertex_buffer_memory, None);
|
device.free_memory(self.vertex_buffer_memory_cube, None);
|
||||||
|
|
||||||
|
device.destroy_buffer(self.index_buffer_cuboid, None);
|
||||||
|
device.free_memory(self.index_buffer_memory_cuboid, None);
|
||||||
|
|
||||||
|
device.destroy_buffer(self.vertex_buffer_cuboid, None);
|
||||||
|
device.free_memory(self.vertex_buffer_memory_cuboid, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
#[allow(non_snake_case)]
|
||||||
struct OctTree {
|
struct OctTree {
|
||||||
pub child_XYZ: Option<Rc<RefCell<Self>>>,
|
pub child_XYZ: Option<Rc<RefCell<Self>>>,
|
||||||
pub child_xYZ: Option<Rc<RefCell<Self>>>,
|
pub child_xYZ: Option<Rc<RefCell<Self>>>,
|
||||||
|
@ -110,6 +134,7 @@ struct OctTree {
|
||||||
|
|
||||||
size: usize,
|
size: usize,
|
||||||
}
|
}
|
||||||
|
#[warn(non_snake_case)]
|
||||||
|
|
||||||
impl OctTree {
|
impl OctTree {
|
||||||
pub fn create(size: usize) -> Result<Self> {
|
pub fn create(size: usize) -> Result<Self> {
|
||||||
|
|
|
@ -8,6 +8,11 @@ use cgmath;
|
||||||
pub type Vec2 = cgmath::Vector2<f32>;
|
pub type Vec2 = cgmath::Vector2<f32>;
|
||||||
pub type Vec3 = cgmath::Vector3<f32>;
|
pub type Vec3 = cgmath::Vector3<f32>;
|
||||||
|
|
||||||
|
pub trait VertexContainer<const COUNT: usize> {
|
||||||
|
fn binding_description() -> vk::VertexInputBindingDescription;
|
||||||
|
fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; COUNT];
|
||||||
|
}
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
pub struct Vertex {
|
pub struct Vertex {
|
||||||
|
@ -20,8 +25,10 @@ impl Vertex {
|
||||||
pub const fn new(pos: Vec3, color: Vec3, tex_coord: Vec2) -> Self {
|
pub const fn new(pos: Vec3, color: Vec3, tex_coord: Vec2) -> Self {
|
||||||
Self { pos, color, tex_coord }
|
Self { pos, color, tex_coord }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn binding_description() -> vk::VertexInputBindingDescription {
|
impl VertexContainer<3> for Vertex {
|
||||||
|
fn binding_description() -> vk::VertexInputBindingDescription {
|
||||||
vk::VertexInputBindingDescription::builder()
|
vk::VertexInputBindingDescription::builder()
|
||||||
.binding(0)
|
.binding(0)
|
||||||
.stride(size_of::<Vertex>() as u32)
|
.stride(size_of::<Vertex>() as u32)
|
||||||
|
@ -29,7 +36,7 @@ impl Vertex {
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 3] {
|
fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 3] {
|
||||||
let pos = vk::VertexInputAttributeDescription::builder()
|
let pos = vk::VertexInputAttributeDescription::builder()
|
||||||
.binding(0)
|
.binding(0)
|
||||||
.location(0)
|
.location(0)
|
||||||
|
@ -91,16 +98,17 @@ impl SizedVertex {
|
||||||
pub const fn new(pos: Vec3, color: Vec3, tex_coord: Vec2, size: Vec3) -> Self {
|
pub const fn new(pos: Vec3, color: Vec3, tex_coord: Vec2, size: Vec3) -> Self {
|
||||||
Self { pos, color, tex_coord, size }
|
Self { pos, color, tex_coord, size }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
pub fn binding_description() -> vk::VertexInputBindingDescription {
|
impl VertexContainer<4> for SizedVertex {
|
||||||
|
fn binding_description() -> vk::VertexInputBindingDescription {
|
||||||
vk::VertexInputBindingDescription::builder()
|
vk::VertexInputBindingDescription::builder()
|
||||||
.binding(0)
|
.binding(0)
|
||||||
.stride(size_of::<Vertex>() as u32)
|
.stride(size_of::<SizedVertex>() as u32)
|
||||||
.input_rate(vk::VertexInputRate::VERTEX)
|
.input_rate(vk::VertexInputRate::VERTEX)
|
||||||
.build()
|
.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 4] {
|
fn attribute_descriptions() -> [vk::VertexInputAttributeDescription; 4] {
|
||||||
let pos = vk::VertexInputAttributeDescription::builder()
|
let pos = vk::VertexInputAttributeDescription::builder()
|
||||||
.binding(0)
|
.binding(0)
|
||||||
.location(0)
|
.location(0)
|
||||||
|
|
Loading…
Reference in a new issue