vera_core/
lib.rs

1//! This crate is where Vulkan is set up (`Vera::create()`) and core actions are handled (`show()`, `save()`, etc.)
2
3// pub mod elements;
4// pub use elements::*;
5
6/// Buffers which will be sent to the GPU, and rely on the vulkano crate to be compiled
7pub mod buffers;
8pub use buffers::*;
9/// Matrices, which interpret the input transformations from vera, on which transformations are applied, and which are sent in buffers.
10pub mod matrix;
11pub use matrix::*;
12/// Colors, which interpret the input "colorizations" (color transformations) from vera, for the color of vertices, and are sent in a buffer.
13pub mod color;
14pub use color::*;
15/// "Transformers", update buffers of matrices and colors according to vera input transformations and colorizations: start/end time, speed evolution
16pub mod transformer;
17pub use transformer::*;
18
19use vera::{Input, Model, Tf, Vertex as ModelVertex, View, Projection};
20use vulkano::descriptor_set::layout::DescriptorSetLayout;
21use vulkano::pipeline::graphics::depth_stencil::{DepthStencilState, DepthState};
22
23use std::sync::Arc;
24use std::time::Instant;
25
26use vulkano::descriptor_set::allocator::StandardDescriptorSetAllocator;
27use vulkano::descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet};
28use vulkano::pipeline::graphics::color_blend::{
29    AttachmentBlend, ColorBlendAttachmentState, ColorBlendState,
30};
31use vulkano::pipeline::graphics::multisample::MultisampleState;
32use vulkano::pipeline::graphics::rasterization::RasterizationState;
33use vulkano::pipeline::graphics::GraphicsPipelineCreateInfo;
34use vulkano::pipeline::layout::PipelineDescriptorSetLayoutCreateInfo;
35
36use vulkano::buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer};
37use vulkano::command_buffer::allocator::StandardCommandBufferAllocator;
38use vulkano::command_buffer::{
39    AutoCommandBufferBuilder, CommandBufferExecFuture, CommandBufferUsage, CopyBufferInfo,
40    PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, RenderPassBeginInfo,
41};
42use vulkano::device::physical::{PhysicalDevice, PhysicalDeviceType};
43use vulkano::device::{
44    Device, DeviceCreateInfo, DeviceExtensions, Queue, QueueCreateInfo, QueueFlags,
45};
46use vulkano::image::view::ImageView;
47use vulkano::image::{Image, ImageUsage, ImageCreateInfo, ImageType};
48use vulkano::instance::{Instance, InstanceCreateFlags, InstanceCreateInfo};
49use vulkano::memory::allocator::{
50    AllocationCreateInfo, FreeListAllocator, GenericMemoryAllocator, MemoryTypeFilter,
51    StandardMemoryAllocator,
52};
53use vulkano::format::Format;
54use vulkano::pipeline::graphics::input_assembly::InputAssemblyState;
55use vulkano::pipeline::graphics::vertex_input::{Vertex, VertexDefinition};
56use vulkano::pipeline::graphics::viewport::{Viewport, ViewportState};
57use vulkano::pipeline::{
58    GraphicsPipeline, Pipeline, PipelineBindPoint, PipelineLayout,
59    PipelineShaderStageCreateInfo,
60};
61use vulkano::render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass, Subpass};
62use vulkano::shader::EntryPoint;
63use vulkano::swapchain::{
64    acquire_next_image, PresentFuture, Surface, Swapchain, SwapchainAcquireFuture,
65    SwapchainCreateInfo, SwapchainPresentInfo,
66};
67use vulkano::sync::future::{FenceSignalFuture, JoinFuture};
68use vulkano::sync::{self, GpuFuture};
69use vulkano::{Validated, Version, VulkanError};
70
71use winit::dpi::LogicalSize;
72use winit::event::{Event, WindowEvent};
73use winit::event_loop::{ControlFlow, EventLoop};
74use winit::platform::run_return::EventLoopExtRunReturn;
75use winit::window::{Window, WindowBuilder};
76
77/// The struct the user interacts with.
78pub struct Vera {
79    event_loop: EventLoop<()>,
80    vk: Vk,
81}
82
83/// The underlying base with executes specific tasks.
84struct Vk {
85    // ----- Created on initialization
86    library: Arc<vulkano::VulkanLibrary>,
87    required_extensions: vulkano::instance::InstanceExtensions,
88    instance: Arc<Instance>,
89    surface: Arc<Surface>,
90    window: Arc<Window>,
91
92    device_extensions: DeviceExtensions,
93    physical_device: Arc<PhysicalDevice>,
94    queue_family_index: u32,
95    device: Arc<Device>,
96    queue: Arc<Queue>,
97
98    swapchain: Arc<Swapchain>,
99    images: Vec<Arc<Image>>,
100    render_pass: Arc<RenderPass>,
101    framebuffers: Vec<Arc<Framebuffer>>,
102
103    
104    memory_allocator: Arc<GenericMemoryAllocator<FreeListAllocator>>,
105    command_buffer_allocator: StandardCommandBufferAllocator,
106    descriptor_set_allocator: StandardDescriptorSetAllocator,
107
108    
109    max_uniform_buffer_size: u32,
110    max_storage_buffer_size: u32,
111
112
113    previous_frame_end: Option<Box<dyn GpuFuture>>,
114    recreate_swapchain: bool,
115    show_count: u32,
116    time: f32,
117
118    
119    // -----
120    position_vertex_data: Vec<VertexData>,
121    vertex_len: u64,
122
123    vertex_buffer: Subbuffer<[VertexData]>,
124    staging_vertex_buffer: Subbuffer<[VertexData]>,
125    vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
126    vertex_copy_fence:
127        Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
128
129
130    color_vertex_data: Vec<ColorVertexData>,
131    color_vertex_colorizer: Vec<Colorizer>,
132    
133    color_vertex_buffer: Subbuffer<[ColorVertexData]>,
134    staging_color_vertex_buffer: Subbuffer<[ColorVertexData]>,
135    color_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
136    color_vertex_copy_fence:
137        Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
138
139
140    transform_vertex_data: Vec<TransformVertexData>,
141    transform_vertex_transformer: Vec<Transformer>,
142
143    transform_vertex_buffer: Subbuffer<[TransformVertexData]>,
144    staging_transform_vertex_buffer: Subbuffer<[TransformVertexData]>,
145    transform_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
146    transform_vertex_copy_fence:
147        Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
148
149    // -----
150    general_uniform_data: GeneralData,
151    general_uniform_transformer: (Transformer, Transformer),
152    
153    general_uniform_buffer: Subbuffer<GeneralData>,
154    general_staging_uniform_buffer: Subbuffer<GeneralData>,
155    general_uniform_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
156    general_uniform_copy_fence:
157        Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
158
159    // -----
160    entities_uniform_data: Vec<EntityData>,
161    entities_uniform_len: u64,
162    entities_uniform_transformer: Vec<Transformer>,
163
164    entities_uniform_buffer: Subbuffer<[EntityData]>,
165    entities_staging_uniform_buffer: Subbuffer<[EntityData]>,
166    entities_uniform_copy_command_buffer: Arc<PrimaryAutoCommandBuffer>,
167    entities_uniform_copy_fence:
168        Option<Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>>,
169
170    // -----
171    // uniform_update_cs: Arc<ShaderModule>,
172    // uniform_update_pipeline: Arc<ComputePipeline>,
173    // uniform_update_command_buffer: Arc<PrimaryAutoCommandBuffer>,
174
175    // -----
176    drawing_vs: EntryPoint,
177    drawing_fs: EntryPoint,
178    drawing_pipeline: Arc<GraphicsPipeline>,
179    descriptor_set: Arc<PersistentDescriptorSet>,
180    descriptor_set_layout: Arc<DescriptorSetLayout>,
181    descriptor_set_layout_index: usize,
182
183    frames_in_flight: usize,
184    drawing_fences: Vec<
185        Option<
186            Arc<
187                FenceSignalFuture<
188                    PresentFuture<
189                        CommandBufferExecFuture<
190                            JoinFuture<Box<dyn GpuFuture>, SwapchainAcquireFuture>,
191                        >,
192                    >,
193                >,
194            >,
195        >,
196    >,
197    previous_drawing_fence_i: u32,
198
199
200    background_color: [f32; 4],
201    start_time: f32,
202    end_time: f32,
203}
204
205mod vs {
206    vulkano_shaders::shader! {
207        ty: "vertex",
208        src: r"
209            #version 460
210
211            struct uGeneralData {
212                mat4 projection_matrix;
213                mat4 view_matrix;
214                vec2 resolution;
215                float time;
216            };
217
218            struct uEntityData {
219                mat4 model_matrix;
220            };
221            
222            layout(set = 0, binding = 0) buffer GeneralData {
223                uGeneralData data;
224            } general_buf;
225            
226            layout(set = 0, binding = 1) buffer EntityData {
227                uEntityData data[];
228            } entities_buf;
229
230            layout(location = 0) in uint entity_id;
231            layout(location = 1) in vec3 position;
232            layout(location = 2) in vec4 color;
233            layout(location = 3) in vec4 vertex_matrix0;
234            layout(location = 4) in vec4 vertex_matrix1;
235            layout(location = 5) in vec4 vertex_matrix2;
236            layout(location = 6) in vec4 vertex_matrix3;
237
238            layout(location = 0) out vec4 out_color;
239
240            void main() {
241                out_color = color;
242
243                mat4 transform = mat4(vertex_matrix0, vertex_matrix1, vertex_matrix2, vertex_matrix3);
244                vec4 uv = vec4(position, 1.0) * transform * entities_buf.data[entity_id].model_matrix * general_buf.data.view_matrix * general_buf.data.projection_matrix;
245
246                                if (general_buf.data.resolution.x > general_buf.data.resolution.y) {
247                    uv.x *= general_buf.data.resolution.y/general_buf.data.resolution.x;
248                                    } else {
249                    uv.y *= general_buf.data.resolution.x/general_buf.data.resolution.y;
250                }
251
252                gl_Position = uv;
253            }
254        ",
255    }
256}
257
258mod fs {
259    vulkano_shaders::shader! {
260        ty: "fragment",
261        src: r"
262            #version 460
263
264            layout(location = 0) out vec4 f_color;
265
266            layout(location = 0) in vec4 in_color;
267
268            void main() {
269                f_color = in_color;
270            }
271        ",
272    }
273}
274
275// TODOCOMPUTEUPDATE
276// mod cs {
277//     vulkano_shaders::shader! {
278//         ty: "compute",
279//         src: r"
280//             #version 460
281//
282//             layout(local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
283//
284//             struct uData {
285//                 mat3 model_matrix;
286//             };
287//
288//             layout(set = 0, binding = 0) buffer EntityData {
289//                 uData data[];
290//             } buf;
291//
292//             void main() {
293//                 uint idx = gl_GlobalInvocationID.x;
294//                 buf.model_matrix[idx] *= 12;
295//             }
296//         ",
297//     }
298// }
299
300impl Vera {
301    /// Sets up Vera with Vulkan
302    /// - `input` define all Shapes
303    pub fn create(input: Input) -> Self {
304        // Event_loop/extensions/instance/surface/window/physical_device/queue_family/device/queue/swapchain/images/render_pass/framebuffers
305        // ---------------------------------------------------------------------------------------------------------------------------------
306        let event_loop = EventLoop::new();
307        let library = vulkano::VulkanLibrary::new().expect("no local Vulkan library/DLL");
308        let required_extensions = Surface::required_extensions(&event_loop);
309        let instance = Instance::new(
310            library.clone(),
311            InstanceCreateInfo {
312                application_name: Some("Vera".to_owned()),
313                application_version: Version::major_minor(0, 2),
314                enabled_extensions: required_extensions,
315                flags: InstanceCreateFlags::ENUMERATE_PORTABILITY,
316                ..Default::default()
317            },
318        )
319        .expect("failed to create instance");
320
321        let window = Arc::new(
322            WindowBuilder::new()
323                .with_inner_size(LogicalSize {
324                    width: 800,
325                    height: 600,
326                })
327                .with_resizable(true)
328                .with_title("Vera")
329                .with_transparent(false)
330                .build(&event_loop)
331                .unwrap(),
332        );
333        let surface = Surface::from_window(instance.clone(), window.clone()).unwrap();
334        let device_extensions = DeviceExtensions {
335            khr_swapchain: true,
336            ..DeviceExtensions::empty()
337        };
338
339        let (physical_device, queue_family_index) = instance
340            .enumerate_physical_devices()
341            .expect("failed to enumerate physical devices")
342            .filter(|p| p.supported_extensions().contains(&device_extensions))
343            .filter_map(|p| {
344                p.queue_family_properties()
345                    .iter()
346                    .enumerate()
347                    .position(|(i, q)| {
348                        q.queue_flags.contains(QueueFlags::GRAPHICS)
349                            && q.queue_flags.contains(QueueFlags::COMPUTE)
350                            && q.queue_flags.contains(QueueFlags::TRANSFER)
351                            && p.surface_support(i as u32, &surface).unwrap_or(false)
352                    })
353                    .map(|q| (p, q as u32))
354            })
355            .min_by_key(|(p, _)| match p.properties().device_type {
356                PhysicalDeviceType::DiscreteGpu => 0,
357                PhysicalDeviceType::IntegratedGpu => 1,
358                PhysicalDeviceType::VirtualGpu => 2,
359                PhysicalDeviceType::Cpu => 3,
360                _ => 4,
361            })
362            .expect("no device available");
363
364        println!(
365            "Using device: {} (type: {:?})",
366            physical_device.properties().device_name,
367            physical_device.properties().device_type,
368        );
369
370        let (device, mut queues) = Device::new(
371            physical_device.clone(),
372            DeviceCreateInfo {
373                queue_create_infos: vec![QueueCreateInfo {
374                    queue_family_index,
375                    ..Default::default()
376                }],
377                enabled_extensions: device_extensions,
378                ..Default::default()
379            },
380        )
381        .expect("failed to create device");
382        let queue = queues.next().unwrap();
383
384        // Allocators
385        // ----------
386        let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone()));
387        let command_buffer_allocator =
388            StandardCommandBufferAllocator::new(device.clone(), Default::default());
389        let descriptor_set_allocator =
390            StandardDescriptorSetAllocator::new(device.clone(), Default::default());
391
392        // ----------
393
394        let (swapchain, images) = {
395            let caps = physical_device
396                .surface_capabilities(&surface, Default::default())
397                .expect("failed to get surface capabilities");
398
399            let dimensions = window.inner_size();
400            let composite_alpha = caps.supported_composite_alpha.into_iter().next().unwrap();
401            let image_format = physical_device
402                .clone()
403                .surface_formats(&surface, Default::default())
404                .unwrap()[0]
405                .0;
406
407            Swapchain::new(
408                device.clone(),
409                surface.clone(),
410                SwapchainCreateInfo {
411                    min_image_count: caps.min_image_count.max(2),
412                    image_format,
413                    image_extent: dimensions.into(),
414                    image_usage: ImageUsage::COLOR_ATTACHMENT,
415                    composite_alpha,
416                    ..Default::default()
417                },
418            )
419            .unwrap()
420        };
421
422        let render_pass = vulkano::single_pass_renderpass!(
423            device.clone(),
424            attachments: {
425                color: {
426                    format: swapchain.image_format(), // set the format the same as the swapchain
427                    samples: 1, // TODOSAMPLES
428                    load_op: Clear,
429                    store_op: Store,
430                },
431                depth_stencil: {
432                    format: Format::D16_UNORM,
433                    samples: 1,
434                    load_op: Clear,
435                    store_op: DontCare,
436                },
437            },
438            pass: {
439                color: [color],
440                depth_stencil: {depth_stencil},
441            },
442        )
443        .unwrap();
444    
445
446        let depth_attachment = ImageView::new_default(
447            Image::new(
448                memory_allocator.clone(),
449                ImageCreateInfo {
450                    image_type: ImageType::Dim2d,
451                    format: Format::D16_UNORM,
452                    extent: images[0].extent(),
453                    usage: ImageUsage::DEPTH_STENCIL_ATTACHMENT | ImageUsage::TRANSIENT_ATTACHMENT,
454                    ..Default::default()
455                },
456                AllocationCreateInfo::default(),
457            )
458            .unwrap(),
459        )
460        .unwrap();
461
462        let framebuffers: Vec<Arc<Framebuffer>> = images
463            .iter()
464            .map(|image| {
465                let view = ImageView::new_default(image.clone()).unwrap();
466                Framebuffer::new(
467                    render_pass.clone(),
468                    FramebufferCreateInfo {
469                        attachments: vec![view, depth_attachment.clone()],
470                        ..Default::default()
471                    },
472                )
473                .unwrap()
474            })
475            .collect::<Vec<Arc<Framebuffer>>>();
476
477        // ---------------------------------------------------------------------------------------------------------------------------------
478
479        // Max buffer sizes
480        // ----------------
481        // // If the entities fit (inlcuding the other uniforms), use UBO, otherwise use SSBO
482        let max_uniform_buffer_size: u32 = physical_device.properties().max_uniform_buffer_range;
483        let max_storage_buffer_size: u32 = physical_device.properties().max_storage_buffer_range;
484        println!(
485            "max_uniform_buffer_size: {}\nmax_storage_buffer_size: {}\n",
486            max_uniform_buffer_size, max_storage_buffer_size
487        );
488
489        // ----------------
490
491        // Initial buffer data, len and transform.
492        // ---------------------------------------
493
494        let (
495            (general_uniform_data, general_uniform_transformer), 
496            (entities_uniform_len, entities_uniform_data, entities_uniform_transformer), 
497            (transform_vertex_data, transform_vertex_transformer), 
498            (color_vertex_data, color_vertex_colorizer), 
499            (vertex_len, position_vertex_data),
500            (background_color, start_time, end_time)
501        ) = from_input(input);
502        // ---------------------------------------
503
504        // Staging & Device-local vertex buffers, and their copy & update command buffers  // TODOCOMPUTEUPDATE
505        // ------------------------------------------------------------------------------
506        let staging_vertex_buffer: Subbuffer<[VertexData]> = Buffer::from_iter(
507            memory_allocator.clone(),
508            BufferCreateInfo {
509                usage: BufferUsage::TRANSFER_SRC,
510                ..Default::default()
511            },
512            AllocationCreateInfo {
513                memory_type_filter: MemoryTypeFilter::PREFER_HOST
514                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
515                ..Default::default()
516            },
517            position_vertex_data,
518        )
519        .expect("failed to create staging_vertex_buffer");
520
521        let vertex_buffer: Subbuffer<[VertexData]> = Buffer::new_slice::<VertexData>(
522            memory_allocator.clone(),
523            BufferCreateInfo {
524                usage: BufferUsage::STORAGE_BUFFER
525                    | BufferUsage::TRANSFER_DST
526                    | BufferUsage::VERTEX_BUFFER,
527                ..Default::default()
528            },
529            AllocationCreateInfo {
530                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
531                ..Default::default()
532            },
533            vertex_len,
534        )
535        .expect("failed to create vertex_buffer");
536
537        let mut vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
538            AutoCommandBufferBuilder::primary(
539                &command_buffer_allocator,
540                queue.queue_family_index(),
541                CommandBufferUsage::MultipleSubmit,
542            )
543            .expect("failed to create vertex_cbb");
544
545        vertex_cbb
546            .copy_buffer(CopyBufferInfo::buffers(
547                staging_vertex_buffer.clone(),
548                vertex_buffer.clone(),
549            ))
550            .unwrap();
551
552        let vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer> = vertex_cbb.build().unwrap();
553
554        vertex_copy_command_buffer
555            .clone()
556            .execute(queue.clone())
557            .unwrap()
558            .then_signal_fence_and_flush()
559            .unwrap()
560            .wait(None /* timeout */)
561            .unwrap();
562
563        let vertex_copy_fence: Option<
564            Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
565        > = None;
566
567        
568// -----------------------------------------
569
570        let staging_color_vertex_buffer: Subbuffer<[ColorVertexData]> = Buffer::from_iter(
571            memory_allocator.clone(),
572            BufferCreateInfo {
573                usage: BufferUsage::TRANSFER_SRC,
574                ..Default::default()
575            },
576            AllocationCreateInfo {
577                memory_type_filter: MemoryTypeFilter::PREFER_HOST
578                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
579                ..Default::default()
580            },
581            color_vertex_data,
582        )
583        .expect("failed to create staging_color_vertex_buffer");
584
585        let color_vertex_buffer: Subbuffer<[ColorVertexData]> = Buffer::new_slice::<ColorVertexData>(
586            memory_allocator.clone(),
587            BufferCreateInfo {
588                usage: BufferUsage::STORAGE_BUFFER
589                    | BufferUsage::TRANSFER_DST
590                    | BufferUsage::VERTEX_BUFFER,
591                ..Default::default()
592            },
593            AllocationCreateInfo {
594                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
595                ..Default::default()
596            },
597            vertex_len,
598        )
599        .expect("failed to create color_vertex_buffer");
600
601        let mut color_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
602            AutoCommandBufferBuilder::primary(
603                &command_buffer_allocator,
604                queue.queue_family_index(),
605                CommandBufferUsage::MultipleSubmit,
606            )
607            .expect("failed to create color_vertex_cbb");
608        
609        color_vertex_cbb
610            .copy_buffer(CopyBufferInfo::buffers(
611                staging_color_vertex_buffer.clone(),
612                color_vertex_buffer.clone(),
613            ))
614            .unwrap();
615        
616        let color_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer> = color_vertex_cbb.build().unwrap();
617        
618        color_vertex_copy_command_buffer
619            .clone()
620            .execute(queue.clone())
621            .unwrap()
622            .then_signal_fence_and_flush()
623            .unwrap()
624            .wait(None /* timeout */)
625            .unwrap();
626        
627        let color_vertex_copy_fence: Option<
628            Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
629        > = None;
630
631// -----------------------------------------
632
633
634        let staging_transform_vertex_buffer: Subbuffer<[TransformVertexData]> = Buffer::from_iter(
635            memory_allocator.clone(),
636            BufferCreateInfo {
637                usage: BufferUsage::TRANSFER_SRC,
638                ..Default::default()
639            },
640            AllocationCreateInfo {
641                memory_type_filter: MemoryTypeFilter::PREFER_HOST
642                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
643                ..Default::default()
644            },
645            transform_vertex_data,
646        )
647        .expect("failed to create staging_transform_vertex_buffer");
648
649        let transform_vertex_buffer: Subbuffer<[TransformVertexData]> = Buffer::new_slice::<TransformVertexData>(
650            memory_allocator.clone(),
651            BufferCreateInfo {
652                usage: BufferUsage::STORAGE_BUFFER
653                    | BufferUsage::TRANSFER_DST
654                    | BufferUsage::VERTEX_BUFFER,
655                ..Default::default()
656            },
657            AllocationCreateInfo {
658                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
659                ..Default::default()
660            },
661            vertex_len,
662        )
663        .expect("failed to create transform_vertex_buffer");
664
665        let mut transform_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
666            AutoCommandBufferBuilder::primary(
667                &command_buffer_allocator,
668                queue.queue_family_index(),
669                CommandBufferUsage::MultipleSubmit,
670            )
671            .expect("failed to create transform_vertex_cbb");
672
673        transform_vertex_cbb
674            .copy_buffer(CopyBufferInfo::buffers(
675                staging_transform_vertex_buffer.clone(),
676                transform_vertex_buffer.clone(),
677            ))
678            .unwrap();
679
680        let transform_vertex_copy_command_buffer: Arc<PrimaryAutoCommandBuffer> = transform_vertex_cbb.build().unwrap();
681
682        transform_vertex_copy_command_buffer
683            .clone()
684            .execute(queue.clone())
685            .unwrap()
686            .then_signal_fence_and_flush()
687            .unwrap()
688            .wait(None /* timeout */)
689            .unwrap();
690
691        let transform_vertex_copy_fence: Option<
692            Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
693        > = None;
694
695        // ------------------------------------------------------------------------------
696
697        // Staging & Device-local uniform buffers for general data, and their copy command buffers
698        // ---------------------------------------------------------------------------------------
699        let general_staging_uniform_buffer = Buffer::from_data(
700            memory_allocator.clone(),
701            BufferCreateInfo {
702                usage: BufferUsage::TRANSFER_SRC,
703                ..Default::default()
704            },
705            AllocationCreateInfo {
706                memory_type_filter: MemoryTypeFilter::PREFER_HOST
707                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
708                ..Default::default()
709            },
710            general_uniform_data.clone(),
711        )
712        .expect("failed to create staging_uniform_buffer");
713
714        let general_uniform_buffer = Buffer::new_sized::<GeneralData>(
715            memory_allocator.clone(),
716            BufferCreateInfo {
717                usage: BufferUsage::STORAGE_BUFFER
718                    | BufferUsage::UNIFORM_BUFFER
719                    | BufferUsage::TRANSFER_DST,
720                ..Default::default()
721            },
722            AllocationCreateInfo {
723                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
724                ..Default::default()
725            },
726        )
727        .expect("failed to create uniform_buffer");
728
729        let mut general_uniform_copy_cbb = AutoCommandBufferBuilder::primary(
730            &command_buffer_allocator,
731            queue.queue_family_index(),
732            CommandBufferUsage::MultipleSubmit,
733        )
734        .expect("failed to create uniform_copy_cbb");
735
736        general_uniform_copy_cbb
737            .copy_buffer(CopyBufferInfo::buffers(
738                general_staging_uniform_buffer.clone(),
739                general_uniform_buffer.clone(),
740            ))
741            .unwrap();
742
743        let general_uniform_copy_command_buffer = general_uniform_copy_cbb.build().unwrap();
744
745        general_uniform_copy_command_buffer
746            .clone()
747            .execute(queue.clone())
748            .unwrap()
749            .then_signal_fence_and_flush()
750            .unwrap()
751            .wait(None /* timeout */)
752            .unwrap();
753
754        let general_uniform_copy_fence: Option<
755            Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
756        > = None;
757
758        // ---------------------------------------------------------------------------------------
759
760        // Staging & Device-local uniform buffers for entities, and their copy & update command buffers  // TODOCOMPUTEUPDATE
761        // --------------------------------------------------------------------------------------------
762
763        let entities_staging_uniform_buffer = Buffer::from_iter(
764            memory_allocator.clone(),
765            BufferCreateInfo {
766                usage: BufferUsage::TRANSFER_SRC,
767                ..Default::default()
768            },
769            AllocationCreateInfo {
770                memory_type_filter: MemoryTypeFilter::PREFER_HOST
771                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
772                ..Default::default()
773            },
774            entities_uniform_data,
775        )
776        .expect("failed to create staging_uniform_buffer");
777
778        let entities_uniform_buffer = Buffer::new_slice::<EntityData>(
779            memory_allocator.clone(),
780            BufferCreateInfo {
781                usage: BufferUsage::STORAGE_BUFFER
782                    | BufferUsage::UNIFORM_BUFFER
783                    | BufferUsage::TRANSFER_DST,
784                ..Default::default()
785            },
786            AllocationCreateInfo {
787                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
788                ..Default::default()
789            },
790            entities_uniform_len,
791        )
792        .expect("failed to create uniform_buffer");
793
794        let mut entities_uniform_copy_cbb = AutoCommandBufferBuilder::primary(
795            &command_buffer_allocator,
796            queue.queue_family_index(),
797            CommandBufferUsage::MultipleSubmit,
798        )
799        .expect("failed to create uniform_copy_cbb");
800
801        entities_uniform_copy_cbb
802            .copy_buffer(CopyBufferInfo::buffers(
803                entities_staging_uniform_buffer.clone(),
804                entities_uniform_buffer.clone(),
805            ))
806            .unwrap();
807
808        let entities_uniform_copy_command_buffer = entities_uniform_copy_cbb.build().unwrap();
809
810        entities_uniform_copy_command_buffer
811            .clone()
812            .execute(queue.clone())
813            .unwrap()
814            .then_signal_fence_and_flush()
815            .unwrap()
816            .wait(None /* timeout */)
817            .unwrap();
818
819        let entities_uniform_copy_fence: Option<
820            Arc<FenceSignalFuture<CommandBufferExecFuture<sync::future::NowFuture>>>,
821        > = None;
822
823        /*
824                let uniform_update_cs =
825                    cs::load(device.clone()).expect("failed to create compute shader module");
826
827                let uniform_update_pipeline = ComputePipeline::new(
828                    device.clone(),
829                    uniform_update_cs.entry_point("main").unwrap(),
830                    &(),
831                    None,
832                    |_| {},
833                )
834                .expect("failed to create compute pipeline");
835
836                let mut uniform_update_cbb = AutoCommandBufferBuilder::primary(
837                    &command_buffer_allocator,
838                    queue.queue_family_index(),
839                    CommandBufferUsage::OneTimeSubmit,
840                )
841                .expect("failed to create uniform_update_cbb");
842
843                // let descriptor_set_allocator = StandardDescriptorSetAllocator::new(device.clone());
844                // let pipeline_layout = uniform_update_pipeline.layout();
845                // let descriptor_set_layouts = pipeline_layout.set_layouts();
846                //
847                // let descriptor_set_layout_index = 0;
848                // let descriptor_set_layout = descriptor_set_layouts
849                //     .get(descriptor_set_layout_index)
850                //     .unwrap();
851                // let descriptor_set = PersistentDescriptorSet::new(
852                //     &descriptor_set_allocator,
853                //     descriptor_set_layout.clone(),
854                //     [WriteDescriptorSet::buffer(
855                //         0,
856                //         staging_uniform_buffer.clone(),
857                //     )], // 0 is the binding
858                // )
859                // .unwrap();
860
861                uniform_update_cbb
862                    .copy_buffer(CopyBufferInfo::buffers(
863                        staging_uniform_buffer,
864                        uniform_buffer.clone(),
865                    ))
866                    .unwrap();
867
868                let uniform_update_command_buffer = Arc::new(uniform_update_cbb.build().unwrap());
869                uniform_update_command_buffer
870                    .execute(queue.clone())
871                    .unwrap()
872                    .then_signal_fence_and_flush()
873                    .unwrap()
874                    .wait(None /* timeout */)
875                    .unwrap();
876
877        */
878
879        // --------------------------------------------------------------------------------------------
880
881        // Graphics pipeline & Drawing command buffer
882        // ------------------------------------------
883        let drawing_vs = vs::load(device.clone())
884            .unwrap()
885            .entry_point("main")
886            .expect("failed to create vertex shader module");
887        let drawing_fs = fs::load(device.clone())
888            .unwrap()
889            .entry_point("main")
890            .expect("failed to create fragment shader module");
891
892        let drawing_pipeline: Arc<GraphicsPipeline> = {
893            let vertex_input_state = [VertexData::per_vertex(), ColorVertexData::per_vertex(), TransformVertexData::per_vertex()]
894                .definition(&drawing_vs.info().input_interface)
895                .unwrap();
896
897            let stages = [
898                PipelineShaderStageCreateInfo::new(drawing_vs.clone()),
899                PipelineShaderStageCreateInfo::new(drawing_fs.clone()),
900            ];
901
902            let pipeline_layout = PipelineLayout::new(
903                device.clone(),
904                PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages)
905                    .into_pipeline_layout_create_info(device.clone())
906                    .unwrap(),
907            )
908            .unwrap();
909
910            let subpass = Subpass::from(render_pass.clone(), 0).unwrap();
911
912            GraphicsPipeline::new(
913                device.clone(),
914                None,
915                GraphicsPipelineCreateInfo {
916                    stages: stages.into_iter().collect(),
917                    // How vertex data is read from the vertex buffers into the vertex shader.
918                    vertex_input_state: Some(vertex_input_state),
919                    // How vertices are arranged into primitive shapes.
920                    // The default primitive shape is a triangle.
921                    input_assembly_state: Some(InputAssemblyState::default()),
922                    // How primitives are transformed and clipped to fit the framebuffer.
923                    // We use a resizable viewport, set to draw over the entire window.
924                    viewport_state: Some(ViewportState::default()),
925                    // How polygons are culled and converted into a raster of pixels.
926                    // The default value does not perform any culling.
927                    rasterization_state: Some(RasterizationState::default()),
928                    // How multiple fragment shader samples are converted to a single pixel value.
929                    // The default value does not perform any multisampling.
930                    multisample_state: Some(MultisampleState::default()),
931                    // How pixel values are combined with the values already present in the framebuffer.
932                    // The default value overwrites the old value with the new one, without any blending.
933                    color_blend_state: Some(ColorBlendState::with_attachment_states(
934                        subpass.num_color_attachments(),
935                        ColorBlendAttachmentState {
936                            blend: Some(AttachmentBlend::alpha()),
937                            ..Default::default()
938                        },
939                    )),
940                    subpass: Some(subpass.into()),
941                    depth_stencil_state: Some(DepthStencilState {
942                        depth: Some(DepthState::simple()),
943                        ..Default::default()
944                    }),
945                    ..GraphicsPipelineCreateInfo::layout(pipeline_layout)
946                },
947            )
948            .unwrap()
949        };
950
951        let pipeline_layout: &Arc<vulkano::pipeline::PipelineLayout> = drawing_pipeline.layout();
952        let descriptor_set_layouts: &[Arc<vulkano::descriptor_set::layout::DescriptorSetLayout>] =
953            pipeline_layout.set_layouts();
954
955        let descriptor_set_layout_index: usize = 0;
956        let descriptor_set_layout: Arc<vulkano::descriptor_set::layout::DescriptorSetLayout> =
957            descriptor_set_layouts
958                .get(descriptor_set_layout_index)
959                .unwrap()
960                .clone();
961        let descriptor_set: Arc<PersistentDescriptorSet> = PersistentDescriptorSet::new(
962            &descriptor_set_allocator,
963            descriptor_set_layout.clone(),
964            [
965                WriteDescriptorSet::buffer(0, general_uniform_buffer.clone()),
966                WriteDescriptorSet::buffer(1, entities_uniform_buffer.clone()),
967            ],
968            [],
969        )
970        .unwrap();
971
972        // Command buffers:
973        // 1. Compute update staging_uniform_buffer,                                     //
974        // 1. Draw graphics pipeline using vertex_buffer and final_uniform_buffer,       //
975        // 2. Copy data from staging_uniform_buffer to final_uniform_buffer,             //
976        // 2. Swap swapchain images,                                                     // Done
977
978        // let drawing_command_buffers: Vec<Arc<PrimaryAutoCommandBuffer>> = framebuffers
979        //     .iter()
980        //     .map(|framebuffer| {
981        //         let mut builder = AutoCommandBufferBuilder::primary(
982        //             &command_buffer_allocator,
983        //             queue.queue_family_index(),
984        //             CommandBufferUsage::MultipleSubmit,
985        //         )
986        //         .unwrap();
987        //
988        //         builder
989        //             .begin_render_pass(
990        //                 RenderPassBeginInfo {
991        //                     clear_values: vec![Some([0.0, 0.0, 0.0, 0.0].into())],
992        //                     ..RenderPassBeginInfo::framebuffer(framebuffer.clone())
993        //                 },
994        //                 vulkano::command_buffer::SubpassBeginInfo { contents: SubpassContents::Inline, ..Default::default() },
995        //             )
996        //             .unwrap()
997        //             .set_viewport(0, [drawing_viewport.clone()].into_iter().collect())
998        //             .unwrap()
999        //             .bind_pipeline_graphics(drawing_pipeline.clone())
1000        //             .unwrap()
1001        //             .bind_descriptor_sets(
1002        //                 PipelineBindPoint::Graphics,
1003        //                 pipeline_layout.clone(),
1004        //                 descriptor_set_layout_index as u32,
1005        //                 descriptor_set.clone(),
1006        //             )
1007        //             .unwrap()
1008        //             .bind_vertex_buffers(0, vertex_buffer.clone())
1009        //             .unwrap()
1010        //             .draw(vertex_buffer.len() as u32, 1, 0, 0)
1011        //             .unwrap()
1012        //             .end_render_pass(Default::default())
1013        //             .unwrap();
1014        //
1015        //         builder.build().unwrap()
1016        //     })
1017        //     .collect();
1018
1019        let frames_in_flight: usize = images.len();
1020        let drawing_fences: Vec<Option<Arc<FenceSignalFuture<_>>>> = vec![None; frames_in_flight];
1021        let previous_drawing_fence_i: u32 = 0;
1022
1023        // ------------------------------------------
1024
1025        // Window-related updates
1026        // ----------------------
1027        let previous_frame_end: Option<Box<dyn GpuFuture>> =
1028            Some(sync::now(device.clone()).boxed());
1029        let recreate_swapchain: bool = false;
1030        let show_count: u32 = 0;
1031        let time: f32 = 0.0;
1032
1033        // ----------------------
1034
1035        Vera {
1036            event_loop,
1037            vk: Vk {
1038                //
1039                library,
1040                required_extensions,
1041                instance,
1042                surface,
1043                window,
1044
1045                device_extensions,
1046                physical_device,
1047                queue_family_index,
1048                device,
1049                queue,
1050
1051                swapchain,
1052                images,
1053                render_pass,
1054                framebuffers,
1055
1056                // -----
1057                memory_allocator,
1058                command_buffer_allocator,
1059                descriptor_set_allocator,
1060
1061                // -----
1062                max_uniform_buffer_size,
1063                max_storage_buffer_size,
1064
1065                // -----
1066                vertex_buffer,
1067                staging_vertex_buffer,
1068                vertex_copy_command_buffer,
1069                vertex_copy_fence,
1070
1071                // -----
1072                general_uniform_buffer,
1073                general_staging_uniform_buffer,
1074                general_uniform_copy_command_buffer,
1075                general_uniform_copy_fence,
1076
1077                // -----
1078                entities_uniform_buffer,
1079                entities_staging_uniform_buffer,
1080                entities_uniform_copy_command_buffer,
1081                entities_uniform_copy_fence,
1082
1083                // -----
1084
1085                // -----
1086                // uniform_update_cs,
1087                // uniform_update_pipeline,
1088                // uniform_update_command_buffer,
1089
1090                // -----
1091                drawing_vs,
1092                drawing_fs,
1093                descriptor_set,
1094                descriptor_set_layout,
1095                descriptor_set_layout_index,
1096                drawing_pipeline,
1097                frames_in_flight,
1098                drawing_fences,
1099                previous_drawing_fence_i,
1100
1101                // -----
1102                previous_frame_end,
1103                recreate_swapchain,
1104                show_count,
1105                time,
1106
1107                // -----
1108                position_vertex_data: vec![],
1109                vertex_len,
1110                general_uniform_data,
1111                general_uniform_transformer,
1112                entities_uniform_data: vec![],
1113                entities_uniform_transformer,
1114                entities_uniform_len,
1115                transform_vertex_data: vec![],
1116                transform_vertex_transformer,
1117                transform_vertex_buffer,
1118                staging_transform_vertex_buffer,
1119                transform_vertex_copy_command_buffer,
1120                transform_vertex_copy_fence,
1121                color_vertex_data: vec![],
1122                color_vertex_colorizer,
1123                color_vertex_buffer,
1124                staging_color_vertex_buffer,
1125                color_vertex_copy_command_buffer,
1126                color_vertex_copy_fence,
1127
1128                background_color,
1129                start_time,
1130                end_time,
1131            },
1132        }
1133    }
1134
1135    /// Resets vertex and uniform data from input, which is consumed.
1136    /// 
1137    /// In heavy animations, resetting is useful for reducing the CPU/GPU usage if you split you animations in several parts.
1138    /// Also useful if called from a loop for hot-reloading.
1139    pub fn reset(&mut self, input: Input) {
1140        self.vk.source(input);
1141    }
1142
1143    /// Shows the animation form start to end once.
1144    /// - Panics if there was an unexpected exit code from the event loop
1145    /// - Returns `false` if the window was closed while showing.
1146    /// - Returns true otherwise.
1147    pub fn show(&mut self) -> bool {
1148        match self.vk.show(&mut self.event_loop) {
1149            0 => {
1150                // Successfully finished.
1151                true
1152            }
1153            1 => {
1154                // Window closed
1155                println!("\nℹ Window closed.");
1156                false
1157            }
1158            n => {
1159                println!("🛑 Unexpected return code \"{}\" when running the main loop", n);
1160                false
1161            }
1162        }
1163    }
1164
1165    pub fn save(&mut self, width: u32, height: u32) {
1166        match self.vk.show(&mut self.event_loop) { // , (width, height)
1167            0 => {
1168                // Successfully finished
1169                println!("✨ Saved video!");
1170            }
1171            1 => {
1172                // Window closed
1173                println!("⁉ Window closed. Stopping encoding now.");
1174            }
1175            _ => {
1176                panic!("🛑 Unexpected return code when running the main loop");
1177            }
1178        }
1179    }
1180}
1181
1182/// Treats `input`, and returns related data, transformers and lengths.
1183fn from_input(input: Input) -> ((GeneralData, (Transformer, Transformer)), (u64, Vec<EntityData>, Vec<Transformer>), (Vec<TransformVertexData>, Vec<Transformer>), (Vec<ColorVertexData>, Vec<Colorizer>), (u64, Vec<VertexData>), ([f32; 4], f32, f32))  {
1184    let Input {
1185        meta,
1186        m,
1187        v: View {
1188            t: view_t,
1189        },
1190        p: Projection {
1191            t: projection_t,
1192        },
1193    } = input;
1194
1195    let general_uniform_transformer: (Transformer, Transformer) = (Transformer::from_t(view_t), Transformer::from_t(projection_t)); // (View, Projection)
1196    let general_uniform_data: GeneralData = GeneralData::from_resolution([1.0, 1.0]);
1197
1198    let mut position_vertex_data: Vec<VertexData> = vec![];
1199    let mut color_vertex_data: Vec<ColorVertexData> = vec![];
1200    let mut color_vertex_colorizer: Vec<Colorizer> = vec![];
1201    let mut transform_vertex_transformer: Vec<Transformer> = vec![];
1202    let mut entities_uniform_transformer: Vec<Transformer> = vec![];
1203
1204    for (entity_id, model) in m.into_iter().enumerate() {
1205        for v in model.vertices.into_iter() {
1206            position_vertex_data.push(VertexData { entity_id: entity_id as u32, position: v.position });
1207            color_vertex_data.push(ColorVertexData { color: v.color });
1208            color_vertex_colorizer.push(Colorizer::from_c(v.color, v.c));
1209            transform_vertex_transformer.push(Transformer::from_t(v.t));
1210        }
1211        entities_uniform_transformer.push(Transformer::from_t(model.t));
1212    }
1213
1214    let entities_uniform_len = entities_uniform_transformer.len() as u64;
1215    let entities_uniform_data: Vec<EntityData> = vec![EntityData::new(); entities_uniform_len as usize];
1216    let vertex_len = position_vertex_data.len() as u64;
1217
1218    let transform_vertex_data: Vec<TransformVertexData> = vec![TransformVertexData::new(); vertex_len as usize];
1219
1220    (
1221        (general_uniform_data, general_uniform_transformer), 
1222        (entities_uniform_len, entities_uniform_data, entities_uniform_transformer), 
1223        (transform_vertex_data, transform_vertex_transformer), 
1224        (color_vertex_data, color_vertex_colorizer), 
1225        (vertex_len, position_vertex_data),
1226        (meta.bg, meta.start, meta.end)
1227    )
1228}
1229
1230impl Vk {
1231    /// Resets all content to `input`.
1232    fn source(&mut self, input: Input) {
1233        (
1234            (self.general_uniform_data, self.general_uniform_transformer), 
1235            (self.entities_uniform_len, self.entities_uniform_data, self.entities_uniform_transformer), 
1236            (self.transform_vertex_data, self.transform_vertex_transformer), 
1237            (self.color_vertex_data, self.color_vertex_colorizer), 
1238            (self.vertex_len, self.position_vertex_data),
1239            (self.background_color, self.start_time, self.end_time)
1240        ) = from_input(input);
1241
1242        self.recreate_vertex_buffer();
1243        self.recreate_color_vertex_buffer();
1244        self.recreate_transform_vertex_buffer();
1245        self.recreate_entities_uniform_buffer();
1246        self.recreate_general_uniform_buffer();
1247
1248        self.descriptor_set = PersistentDescriptorSet::new(
1249            &self.descriptor_set_allocator,
1250            self.descriptor_set_layout.clone(),
1251            [
1252                WriteDescriptorSet::buffer(0, self.general_uniform_buffer.clone()),
1253                WriteDescriptorSet::buffer(1, self.entities_uniform_buffer.clone()),
1254            ],
1255            [],
1256        )
1257        .unwrap();
1258
1259        self.copy_vertex_buffer();
1260        self.copy_color_vertex_buffer();
1261        self.copy_transform_vertex_buffer();
1262        self.copy_entities_uniform_buffer();
1263        self.copy_general_uniform_buffer();
1264    }
1265
1266    // Buffer recreation
1267
1268    fn recreate_vertex_buffer(&mut self) {
1269        self.staging_vertex_buffer = Buffer::from_iter(
1270            self.memory_allocator.clone(),
1271            BufferCreateInfo {
1272                usage: BufferUsage::TRANSFER_SRC,
1273                ..Default::default()
1274            },
1275            AllocationCreateInfo {
1276                memory_type_filter: MemoryTypeFilter::PREFER_HOST
1277                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1278                ..Default::default()
1279            },
1280            std::mem::take(&mut self.position_vertex_data),
1281        )
1282        .expect("failed to create staging_vertex_buffer");
1283
1284        self.vertex_buffer = Buffer::new_slice::<VertexData>(
1285            self.memory_allocator.clone(),
1286            BufferCreateInfo {
1287                usage: BufferUsage::STORAGE_BUFFER
1288                    | BufferUsage::TRANSFER_DST
1289                    | BufferUsage::VERTEX_BUFFER,
1290                ..Default::default()
1291            },
1292            AllocationCreateInfo {
1293                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1294                ..Default::default()
1295            },
1296            self.vertex_len,
1297        )
1298        .expect("failed to create vertex_buffer");
1299
1300        let mut vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1301            AutoCommandBufferBuilder::primary(
1302                &self.command_buffer_allocator,
1303                self.queue.queue_family_index(),
1304                CommandBufferUsage::MultipleSubmit,
1305            )
1306            .expect("failed to create vertex_cbb");
1307
1308        vertex_cbb
1309            .copy_buffer(CopyBufferInfo::buffers(
1310                self.staging_vertex_buffer.clone(),
1311                self.vertex_buffer.clone(),
1312            ))
1313            .unwrap();
1314
1315        self.vertex_copy_command_buffer = vertex_cbb.build().unwrap();
1316    }
1317
1318    fn recreate_color_vertex_buffer(&mut self) {
1319        self.staging_color_vertex_buffer = Buffer::from_iter(
1320            self.memory_allocator.clone(),
1321            BufferCreateInfo {
1322                usage: BufferUsage::TRANSFER_SRC,
1323                ..Default::default()
1324            },
1325            AllocationCreateInfo {
1326                memory_type_filter: MemoryTypeFilter::PREFER_HOST
1327                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1328                ..Default::default()
1329            },
1330            std::mem::take(&mut self.color_vertex_data),
1331        )
1332        .expect("failed to create staging_color_vertex_buffer");
1333
1334        self.color_vertex_buffer = Buffer::new_slice::<ColorVertexData>(
1335            self.memory_allocator.clone(),
1336            BufferCreateInfo {
1337                usage: BufferUsage::STORAGE_BUFFER
1338                    | BufferUsage::TRANSFER_DST
1339                    | BufferUsage::VERTEX_BUFFER,
1340                ..Default::default()
1341            },
1342            AllocationCreateInfo {
1343                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1344                ..Default::default()
1345            },
1346            self.vertex_len,
1347        )
1348        .expect("failed to create color_vertex_buffer");
1349
1350        let mut color_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1351            AutoCommandBufferBuilder::primary(
1352                &self.command_buffer_allocator,
1353                self.queue.queue_family_index(),
1354                CommandBufferUsage::MultipleSubmit,
1355            )
1356            .expect("failed to create color_vertex_cbb");
1357        
1358        color_vertex_cbb
1359            .copy_buffer(CopyBufferInfo::buffers(
1360                self.staging_color_vertex_buffer.clone(),
1361                self.color_vertex_buffer.clone(),
1362            ))
1363            .unwrap();
1364        
1365        self.color_vertex_copy_command_buffer = color_vertex_cbb.build().unwrap();
1366    }
1367
1368    fn recreate_transform_vertex_buffer(&mut self) {
1369        self.staging_transform_vertex_buffer = Buffer::from_iter(
1370            self.memory_allocator.clone(),
1371            BufferCreateInfo {
1372                usage: BufferUsage::TRANSFER_SRC,
1373                ..Default::default()
1374            },
1375            AllocationCreateInfo {
1376                memory_type_filter: MemoryTypeFilter::PREFER_HOST
1377                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1378                ..Default::default()
1379            },
1380            std::mem::take(&mut self.transform_vertex_data),
1381        )
1382        .expect("failed to create staging_vertex_buffer");
1383
1384        self.transform_vertex_buffer = Buffer::new_slice::<TransformVertexData>(
1385            self.memory_allocator.clone(),
1386            BufferCreateInfo {
1387                usage: BufferUsage::STORAGE_BUFFER
1388                    | BufferUsage::TRANSFER_DST
1389                    | BufferUsage::VERTEX_BUFFER,
1390                ..Default::default()
1391            },
1392            AllocationCreateInfo {
1393                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1394                ..Default::default()
1395            },
1396            self.vertex_len,
1397        )
1398        .expect("failed to create vertex_buffer");
1399
1400        let mut transform_vertex_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1401            AutoCommandBufferBuilder::primary(
1402                &self.command_buffer_allocator,
1403                self.queue.queue_family_index(),
1404                CommandBufferUsage::MultipleSubmit,
1405            )
1406            .expect("failed to create transform_vertex_cbb");
1407
1408        transform_vertex_cbb
1409            .copy_buffer(CopyBufferInfo::buffers(
1410                self.staging_transform_vertex_buffer.clone(),
1411                self.transform_vertex_buffer.clone(),
1412            ))
1413            .unwrap();
1414
1415        self.transform_vertex_copy_command_buffer = transform_vertex_cbb.build().unwrap();
1416    }
1417
1418    fn recreate_general_uniform_buffer(&mut self) {
1419        self.general_staging_uniform_buffer = Buffer::from_data(
1420            self.memory_allocator.clone(),
1421            BufferCreateInfo {
1422                usage: BufferUsage::TRANSFER_SRC,
1423                ..Default::default()
1424            },
1425            AllocationCreateInfo {
1426                memory_type_filter: MemoryTypeFilter::PREFER_HOST
1427                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1428                ..Default::default()
1429            },
1430            self.general_uniform_data.clone(),
1431        )
1432        .expect("failed to create staging_uniform_buffer");
1433
1434        self.general_uniform_buffer = Buffer::new_sized::<GeneralData>(
1435            self.memory_allocator.clone(),
1436            BufferCreateInfo {
1437                usage: BufferUsage::STORAGE_BUFFER
1438                    | BufferUsage::UNIFORM_BUFFER
1439                    | BufferUsage::TRANSFER_DST,
1440                ..Default::default()
1441            },
1442            AllocationCreateInfo {
1443                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1444                ..Default::default()
1445            },
1446        )
1447        .expect("failed to create uniform_buffer");
1448
1449        let mut general_uniform_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1450            AutoCommandBufferBuilder::primary(
1451                &self.command_buffer_allocator,
1452                self.queue.queue_family_index(),
1453                CommandBufferUsage::MultipleSubmit,
1454            )
1455            .expect("failed to create general_uniform_cbb");
1456
1457        general_uniform_cbb
1458            .copy_buffer(CopyBufferInfo::buffers(
1459                self.general_staging_uniform_buffer.clone(),
1460                self.general_uniform_buffer.clone(),
1461            ))
1462            .unwrap();
1463
1464        self.general_uniform_copy_command_buffer = general_uniform_cbb.build().unwrap();
1465    }
1466
1467    fn recreate_entities_uniform_buffer(&mut self) {
1468        self.entities_staging_uniform_buffer = Buffer::from_iter(
1469            self.memory_allocator.clone(),
1470            BufferCreateInfo {
1471                usage: BufferUsage::TRANSFER_SRC,
1472                ..Default::default()
1473            },
1474            AllocationCreateInfo {
1475                memory_type_filter: MemoryTypeFilter::PREFER_HOST
1476                    | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE,
1477                ..Default::default()
1478            },
1479            std::mem::take(&mut self.entities_uniform_data),
1480        )
1481        .expect("failed to create staging_uniform_buffer");
1482
1483        self.entities_uniform_buffer = Buffer::new_slice::<EntityData>(
1484            self.memory_allocator.clone(),
1485            BufferCreateInfo {
1486                usage: BufferUsage::STORAGE_BUFFER
1487                    | BufferUsage::UNIFORM_BUFFER
1488                    | BufferUsage::TRANSFER_DST,
1489                ..Default::default()
1490            },
1491            AllocationCreateInfo {
1492                memory_type_filter: MemoryTypeFilter::PREFER_DEVICE,
1493                ..Default::default()
1494            },
1495            self.entities_uniform_len,
1496        )
1497        .expect("failed to create uniform_buffer");
1498
1499        let mut entities_uniform_cbb: AutoCommandBufferBuilder<PrimaryAutoCommandBuffer> =
1500            AutoCommandBufferBuilder::primary(
1501                &self.command_buffer_allocator,
1502                self.queue.queue_family_index(),
1503                CommandBufferUsage::MultipleSubmit,
1504            )
1505            .expect("failed to create entities_uniform_cbb");
1506
1507        entities_uniform_cbb
1508            .copy_buffer(CopyBufferInfo::buffers(
1509                self.entities_staging_uniform_buffer.clone(),
1510                self.entities_uniform_buffer.clone(),
1511            ))
1512            .unwrap();
1513
1514        self.entities_uniform_copy_command_buffer = entities_uniform_cbb.build().unwrap();
1515    }
1516
1517    // Staging buffer update & copy to device-local memory
1518
1519    // fn update_vertex_buffer(&mut self) {} // Set once
1520
1521    fn update_color_vertex_buffer(&mut self) {
1522        for (o, i) in self.staging_color_vertex_buffer.write().unwrap().iter_mut()
1523            .zip(self.color_vertex_colorizer.iter_mut()) {
1524                (*o).color = i.update(self.time).0;
1525        }
1526
1527        self.copy_color_vertex_buffer();
1528    }
1529
1530    fn update_transform_vertex_buffer(&mut self) {
1531        for (o, i) in self.staging_transform_vertex_buffer.write().unwrap().iter_mut()
1532            .zip(self.transform_vertex_transformer.iter_mut()) {
1533                let mat = i.update_vm(self.time).0;
1534                ((*o).vertex_matrix0, (*o).vertex_matrix1, (*o).vertex_matrix2, (*o).vertex_matrix3) = (
1535                    [mat[0], mat[1], mat[2], mat[3]],
1536                    [mat[4], mat[5], mat[6], mat[7]],
1537                    [mat[8], mat[9], mat[10], mat[11]],
1538                    [mat[12], mat[13], mat[14], mat[15]],
1539                );
1540        }
1541
1542        self.copy_transform_vertex_buffer();
1543    }
1544
1545    fn update_general_uniform_buffer(&mut self) {
1546        let image_extent: [u32; 2] = self.window.inner_size().into();
1547        {
1548            let mut buf = self.general_staging_uniform_buffer.write().unwrap();
1549            buf.time = self.time;
1550            buf.resolution = [image_extent[0] as f32, image_extent[1] as f32];
1551            buf.view_matrix = self.general_uniform_transformer.0.update_vp(self.time).0;
1552            buf.projection_matrix = self.general_uniform_transformer.1.update_vp(self.time).0;
1553        }
1554        
1555        self.copy_general_uniform_buffer();
1556    }
1557
1558    fn update_entities_uniform_buffer(&mut self) {
1559        for (o, i) in self.entities_staging_uniform_buffer.write().unwrap().iter_mut()
1560            .zip(self.entities_uniform_transformer.iter_mut()) {
1561            (*o).model_matrix = i.update_vm(self.time).0;
1562        }
1563
1564        self.copy_entities_uniform_buffer();
1565    }
1566
1567    // Buffer copy
1568
1569    fn copy_vertex_buffer(&mut self) {
1570        self.vertex_copy_command_buffer
1571            .clone()
1572            .execute(self.queue.clone())
1573            .unwrap()
1574            .then_signal_fence_and_flush()
1575            .unwrap()
1576            .wait(None /* timeout */)
1577            .unwrap();
1578    }
1579
1580    fn copy_color_vertex_buffer(&mut self) {
1581        self.color_vertex_copy_command_buffer
1582            .clone()
1583            .execute(self.queue.clone())
1584            .unwrap()
1585            .then_signal_fence_and_flush()
1586            .unwrap()
1587            .wait(None /* timeout */)
1588            .unwrap();
1589    }
1590
1591    fn copy_transform_vertex_buffer(&mut self) { // Add fences to these methods
1592        self.transform_vertex_copy_command_buffer
1593            .clone()
1594            .execute(self.queue.clone())
1595            .unwrap()
1596            .then_signal_fence_and_flush()
1597            .unwrap()
1598            .wait(None /* timeout */)
1599            .unwrap();
1600    }
1601
1602    fn copy_general_uniform_buffer(&mut self) {
1603        self.general_uniform_copy_command_buffer
1604            .clone()
1605            .execute(self.queue.clone())
1606            .unwrap()
1607            .then_signal_fence_and_flush()
1608            .unwrap()
1609            .wait(None /* timeout */)
1610            .unwrap();
1611    }
1612
1613    fn copy_entities_uniform_buffer(&mut self) {
1614        self.entities_uniform_copy_command_buffer
1615            .clone()
1616            .execute(self.queue.clone())
1617            .unwrap()
1618            .then_signal_fence_and_flush()
1619            .unwrap()
1620            .wait(None /* timeout */)
1621            .unwrap();
1622    }
1623
1624    /// Updates the staging buffers and copies their data to the device-local buffers
1625    fn update(&mut self) {
1626        self.update_color_vertex_buffer();
1627        self.update_transform_vertex_buffer();
1628        self.update_general_uniform_buffer();
1629        self.update_entities_uniform_buffer();
1630    }
1631
1632    /// Draws a frame
1633    fn draw(&mut self) {
1634        let image_extent: [u32; 2] = self.window.inner_size().into();
1635
1636        if image_extent.contains(&0) {
1637            return;
1638        }
1639
1640        self.previous_frame_end.as_mut().unwrap().cleanup_finished();
1641
1642        if self.recreate_swapchain {
1643            self.recreate_swapchain = false;
1644
1645            (self.swapchain, self.images) = self
1646                .swapchain
1647                .recreate(SwapchainCreateInfo {
1648                    image_extent,
1649                    ..self.swapchain.create_info()
1650                })
1651                .expect("failed to recreate swapchain");
1652
1653            let extent = self.images[0].extent();
1654            
1655
1656            let depth_attachment = ImageView::new_default(
1657                Image::new(
1658                    self.memory_allocator.clone(),
1659                    ImageCreateInfo {
1660                        image_type: ImageType::Dim2d,
1661                        format: Format::D16_UNORM,
1662                        extent: self.images[0].extent(),
1663                        usage: ImageUsage::DEPTH_STENCIL_ATTACHMENT | ImageUsage::TRANSIENT_ATTACHMENT,
1664                        ..Default::default()
1665                    },
1666                    AllocationCreateInfo::default(),
1667                )
1668                .unwrap(),
1669            )
1670            .unwrap();
1671
1672            self.framebuffers = self
1673                .images
1674                .iter()
1675                .map(|image| {
1676                    let view = ImageView::new_default(image.clone()).unwrap();
1677                    Framebuffer::new(
1678                        self.render_pass.clone(),
1679                        FramebufferCreateInfo {
1680                            attachments: vec![view, depth_attachment.clone()],
1681                            ..Default::default()
1682                        },
1683                    )
1684                    .unwrap()
1685                })
1686                .collect::<Vec<_>>();
1687
1688            // In the triangle example we use a dynamic viewport, as its a simple example. However in the
1689            // teapot example, we recreate the pipelines with a hardcoded viewport instead. This allows the
1690            // driver to optimize things, at the cost of slower window resizes.
1691            // https://computergraphics.stackexchange.com/questions/5742/vulkan-best-way-of-updating-pipeline-viewport
1692            self.drawing_pipeline = {
1693                let vertex_input_state = [VertexData::per_vertex(), ColorVertexData::per_vertex(), TransformVertexData::per_vertex()]
1694                    .definition(&self.drawing_vs.info().input_interface)
1695                    .unwrap();
1696                let stages = [
1697                    PipelineShaderStageCreateInfo::new(self.drawing_vs.clone()),
1698                    PipelineShaderStageCreateInfo::new(self.drawing_fs.clone()),
1699                ];
1700                let layout = PipelineLayout::new(
1701                    self.device.clone(),
1702                    PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages)
1703                        .into_pipeline_layout_create_info(self.device.clone())
1704                        .unwrap(),
1705                )
1706                .unwrap();
1707                let subpass = Subpass::from(self.render_pass.clone(), 0).unwrap();
1708
1709                GraphicsPipeline::new(
1710                    self.device.clone(),
1711                    None,
1712                    GraphicsPipelineCreateInfo {
1713                        stages: stages.into_iter().collect(),
1714                        vertex_input_state: Some(vertex_input_state),
1715                        input_assembly_state: Some(InputAssemblyState::default()),
1716                        viewport_state: Some(ViewportState {
1717                            viewports: [Viewport {
1718                                offset: [0.0, 0.0],
1719                                extent: [extent[0] as f32, extent[1] as f32],
1720                                depth_range: 0.0..=1.0,
1721                            }]
1722                            .into_iter()
1723                            .collect(),
1724                            ..Default::default()
1725                        }),
1726                        rasterization_state: Some(RasterizationState::default()),
1727                        multisample_state: Some(MultisampleState::default()),
1728                        color_blend_state: Some(ColorBlendState::with_attachment_states(
1729                            subpass.num_color_attachments(),
1730                            ColorBlendAttachmentState {
1731                                blend: Some(AttachmentBlend::alpha()),
1732                                ..Default::default()
1733                            },
1734                        )),
1735                        subpass: Some(subpass.into()),
1736                        depth_stencil_state: Some(DepthStencilState {
1737                            depth: Some(DepthState::simple()),
1738                            ..Default::default()
1739                        }),
1740                        ..GraphicsPipelineCreateInfo::layout(layout)
1741                    },
1742                )
1743                .unwrap()
1744            };
1745        }
1746
1747        let (image_i, suboptimal, acquire_future) =
1748            match acquire_next_image(self.swapchain.clone(), None).map_err(Validated::unwrap) {
1749                Ok(r) => r,
1750                Err(VulkanError::OutOfDate) => {
1751                    self.recreate_swapchain = true;
1752                    return;
1753                }
1754                Err(e) => panic!("failed to acquire next image: {e}"),
1755            };
1756
1757        if suboptimal {
1758            self.recreate_swapchain = true;
1759        }
1760
1761        let mut builder = AutoCommandBufferBuilder::primary(
1762            &self.command_buffer_allocator,
1763            self.queue.queue_family_index(),
1764            CommandBufferUsage::MultipleSubmit,
1765        )
1766        .unwrap();
1767
1768        builder
1769            .begin_render_pass(
1770                RenderPassBeginInfo {
1771                    clear_values: vec![
1772                        Some(self.background_color.into()),
1773                        Some(1.0.into())
1774                    ],
1775                    ..RenderPassBeginInfo::framebuffer(self.framebuffers[image_i as usize].clone())
1776                },
1777                Default::default(), //vulkano::command_buffer::SubpassBeginInfo { contents: SubpassContents::Inline, ..Default::default() },
1778            )
1779            .unwrap()
1780            .bind_pipeline_graphics(self.drawing_pipeline.clone())
1781            .unwrap()
1782            .bind_descriptor_sets(
1783                PipelineBindPoint::Graphics,
1784                self.drawing_pipeline.layout().clone(),
1785                self.descriptor_set_layout_index as u32,
1786                self.descriptor_set.clone(),
1787            )
1788            .unwrap()
1789            .bind_vertex_buffers(0, self.vertex_buffer.clone())
1790            .unwrap()
1791            .bind_vertex_buffers(1, self.color_vertex_buffer.clone())
1792            .unwrap()
1793            .bind_vertex_buffers(2, self.transform_vertex_buffer.clone())
1794            .unwrap()
1795            .draw(self.vertex_buffer.len() as u32, 1, 0, 0)
1796            .unwrap()
1797            .end_render_pass(Default::default())
1798            .unwrap();
1799
1800        let drawing_command_buffer = builder.build().unwrap();
1801
1802        // self.uniform_copy_command_buffer.clone().execute(
1803        //     self.queue.clone(),
1804        // )
1805        // .unwrap()
1806        // .then_signal_fence_and_flush().unwrap();
1807
1808        let future = self
1809            .previous_frame_end
1810            .take()
1811            .unwrap()
1812            .join(acquire_future)
1813            .then_execute(self.queue.clone(), drawing_command_buffer)
1814            .unwrap()
1815            .then_swapchain_present(
1816                self.queue.clone(),
1817                SwapchainPresentInfo::swapchain_image_index(self.swapchain.clone(), image_i),
1818            )
1819            .then_signal_fence_and_flush();
1820
1821        match future.map_err(Validated::unwrap) {
1822            Ok(future) => {
1823                self.previous_frame_end = Some(future.boxed());
1824            }
1825            Err(VulkanError::OutOfDate) => {
1826                self.recreate_swapchain = true;
1827                self.previous_frame_end = Some(sync::now(self.device.clone()).boxed());
1828            }
1829            Err(e) => {
1830                panic!("failed to flush future: {e}");
1831                // self.previous_frame_end = Some(sync::now(self.device.clone()).boxed());
1832            }
1833        }
1834    }
1835
1836    /// Runs the animation in the window in real-time.
1837    fn show(
1838        &mut self,
1839        event_loop: &mut EventLoop<()>,
1840        // save: (u32, u32),
1841    ) -> i32 {
1842        println!("♻ --- {}: Showing with updated data.", self.show_count);
1843        let start = Instant::now();
1844        let mut max_elapsed: bool = true;
1845        event_loop.run_return(move |event, _, control_flow| match event {
1846            Event::WindowEvent {
1847                event: WindowEvent::CloseRequested,
1848                ..
1849            } => {
1850                *control_flow = ControlFlow::ExitWithCode(1);
1851            }
1852            Event::WindowEvent {
1853                event: WindowEvent::Resized(_),
1854                ..
1855            } => {
1856                self.recreate_swapchain = true;
1857            }
1858            Event::MainEventsCleared => {
1859                self.time = start.elapsed().as_secs_f32() + self.start_time;
1860                // if elements.ended() {
1861                //     *control_flow = ControlFlow::ExitWithCode(0);
1862                // }
1863                if self.time > self.end_time {
1864                    if max_elapsed {
1865                        max_elapsed = false;
1866                        self.show_count += 1;
1867                    }
1868                    *control_flow = ControlFlow::ExitWithCode(0);
1869                }
1870                self.update();
1871                self.draw();
1872                // if save.0 > 0 && save.0 > 0 { self.encode(); }
1873            }
1874            _ => (),
1875        })
1876    }
1877
1878    // /// Encodes a frame to the output video, for saving.
1879    // fn encode(&mut self) {
1880    //     unimplemented!("Cannot encode yet!");
1881    // }
1882}