Add instances support

This commit is contained in:
Florian RICHER 2025-05-29 17:13:01 +02:00
parent f8b81f3269
commit 77c717f90b
Signed by: florian.richer
GPG key ID: C73D37CBED7BFC77
7 changed files with 158 additions and 31 deletions

View file

@ -1,11 +1,14 @@
use std::{error::Error, sync::Arc};
use crate::core::render::primitives::camera::Camera3D;
use crate::core::render::primitives::transform::Transform;
use crate::core::render::texture::Texture;
use crate::core::scene::Scene;
use crate::core::scene::SceneContext;
use egui_winit_vulkano::{Gui, egui};
use glam::Mat4;
use glam::EulerRot;
use glam::Quat;
use glam::Vec3;
use vulkano::{
command_buffer::{
AutoCommandBufferBuilder, CommandBufferUsage, PrimaryCommandBufferAbstract,
@ -21,6 +24,7 @@ use super::assets::square::Square;
pub struct MainSceneState {
square: Square,
instances: Vec<Transform>,
camera: Camera3D,
texture: Texture,
speed: f32,
@ -43,6 +47,27 @@ impl Scene for MainScene {
scene_context.swapchain_format,
)?;
let num_instances = 100;
let instance_size = 10.0;
let instance_spacing = 10.0;
let num_instances_per_row = (num_instances as f32 / instance_spacing as f32).ceil() as u32;
let instances: Vec<Transform> = (0..num_instances)
.map(|i| Transform {
position: Vec3::new(
(i % num_instances_per_row) as f32 * (instance_spacing + instance_size),
0.0,
(i / num_instances_per_row) as f32 * (instance_spacing + instance_size),
),
rotation: Quat::from_euler(
EulerRot::XYZ,
0.0,
rand::random_range(0.0..=360.0),
0.0,
),
scale: Vec3::new(instance_size, instance_size, instance_size),
})
.collect();
let camera = Camera3D::new(
scene_context.aspect_ratio,
std::f32::consts::FRAC_PI_2,
@ -69,6 +94,7 @@ impl Scene for MainScene {
self.state = Some(MainSceneState {
square,
instances,
camera,
texture,
speed: 50.0,
@ -129,12 +155,16 @@ impl Scene for MainScene {
.camera
.create_buffer(&scene_context.memory_allocator)?;
let transform_uniform =
Transform::create_buffer(&scene_context.memory_allocator, &state.instances)?;
state
.square
.render(
&mut builder,
&scene_context.descriptor_set_allocator,
&camera_uniform,
&transform_uniform,
&state.texture,
)
.unwrap();