77 lines
2.6 KiB
Rust
77 lines
2.6 KiB
Rust
use std::sync::Arc;
|
|
use winit::event_loop::EventLoop;
|
|
use winit::window::WindowBuilder;
|
|
use wsg_lib::context::Context;
|
|
use wsg_lib::material::Material;
|
|
use wsg_lib::mesh::Mesh;
|
|
use wsg_lib::pipeline_cache::PipelineCache;
|
|
use wsg_lib::renderer::Renderer;
|
|
|
|
fn main() {
|
|
let event_loop = EventLoop::new().unwrap();
|
|
let window = Arc::new(WindowBuilder::new().build(&event_loop).unwrap());
|
|
|
|
// Initialisation contexte matériel (device, queue, surface) Utilisation de pollster pour le bloc async
|
|
let context = pollster::block_on(Context::new(window.clone()));
|
|
|
|
// Initialisation des briques de rendu
|
|
let mut cache = PipelineCache::new();
|
|
cache
|
|
.register_shader("basic", "assets/shaders/basic.wgsl")
|
|
.unwrap();
|
|
let renderer = Renderer::new(&context, &cache);
|
|
|
|
// Creation d'un material (charge le basic shader via le cache)
|
|
let material = Material::new(&context.device, context.config.format, "basic", &mut cache);
|
|
// Creation d'un mesh
|
|
// 1. Définition des sommets (avec position et couleur pour l'interpolation)
|
|
let vertices = [
|
|
Vertex {
|
|
position: [-0.5, 0.5, 0.0],
|
|
color: [1.0, 0.0, 0.0],
|
|
}, // Haut-Gauche (Rouge)
|
|
Vertex {
|
|
position: [0.5, 0.5, 0.0],
|
|
color: [0.0, 1.0, 0.0],
|
|
}, // Haut-Droite (Vert)
|
|
Vertex {
|
|
position: [0.5, -0.5, 0.0],
|
|
color: [0.0, 0.0, 1.0],
|
|
}, // Bas-Droite (Bleu)
|
|
Vertex {
|
|
position: [-0.5, -0.5, 0.0],
|
|
color: [1.0, 1.0, 1.0],
|
|
}, // Bas-Gauche (Blanc)
|
|
];
|
|
let indices: [u16; 6] = [0, 1, 2, 0, 2, 3];
|
|
let mesh = Mesh::new(&context.device, &vertices, Some(&indices));
|
|
|
|
// Render loop
|
|
event_loop
|
|
.run(|event, elwt| {
|
|
match event {
|
|
winit::event::Event::AboutToWait => {
|
|
window.request_redraw();
|
|
}
|
|
winit::event::Event::WindowEvent {
|
|
event: winit::event::WindowEvent::RedrawRequested,
|
|
..
|
|
} => {
|
|
// Acquisition de la cible de rendu
|
|
let frame = context.surface.get_current_texture().unwrap();
|
|
let view = frame
|
|
.texture
|
|
.create_view(&wgpu::TextureViewDescriptor::default());
|
|
|
|
// Orchestration du rendu
|
|
renderer.render(&context.device, &context.queue, &view, &mesh, &material);
|
|
|
|
// Presentation de l'image
|
|
frame.present();
|
|
}
|
|
_ => (),
|
|
}
|
|
})
|
|
.unwrap();
|
|
}
|