use vulkanalia::prelude::v1_0::*;

// The Vulkan handles and associated properties used by our Vulkan app.
#[derive(Clone, Debug, Default)]
pub struct AppData {
    pub surface: vk::SurfaceKHR,
    pub messenger: vk::DebugUtilsMessengerEXT,
    pub physical_device: vk::PhysicalDevice,
    pub graphics_queue: vk::Queue,
    pub present_queue: vk::Queue,

    pub swapchain_format: vk::Format,
    pub swapchain_extent: vk::Extent2D,
    pub swapchain: vk::SwapchainKHR,
    pub swapchain_images: Vec<vk::Image>,

    pub swapchain_image_views: Vec<vk::ImageView>,

    pub descriptor_set_layout: vk::DescriptorSetLayout,
    pub pipeline_layout: vk::PipelineLayout,
    pub render_pass: vk::RenderPass,
    pub pipeline_cube: vk::Pipeline,
    pub pipeline_cuboid: vk::Pipeline,
    pub pipeline_quad: vk::Pipeline,

    pub pipeline_compute: vk::Pipeline,

    pub framebuffers: Vec<vk::Framebuffer>,
    pub command_pool: vk::CommandPool,
    pub command_buffers: Vec<vk::CommandBuffer>,

    pub image_available_semaphores: Vec<vk::Semaphore>,
    pub render_finished_semaphores: Vec<vk::Semaphore>,

    pub in_flight_fences: Vec<vk::Fence>,
    pub images_in_flight: Vec<vk::Fence>,
    
    pub uniform_buffers: Vec<vk::Buffer>,
    pub uniform_buffers_memory: Vec<vk::DeviceMemory>,

    pub render_storage_buffers: Vec<vk::Buffer>,
    pub render_storage_buffers_memory: Vec<vk::DeviceMemory>,

    pub compute_in_storage_buffers: Vec<vk::Buffer>,
    pub compute_in_storage_buffers_memory: Vec<vk::DeviceMemory>,

    pub compute_out_storage_buffers: Vec<vk::Buffer>,
    pub compute_out_storage_buffers_memory: Vec<vk::DeviceMemory>,

    pub descriptor_pool: vk::DescriptorPool,
    pub descriptor_sets: Vec<vk::DescriptorSet>,

    pub mip_levels: u32,
    pub texture_image: vk::Image,
    pub texture_image_memory: vk::DeviceMemory,
    pub texture_image_view: vk::ImageView,
    pub texture_sampler: vk::Sampler,

    pub depth_image: vk::Image,
    pub depth_image_memory: vk::DeviceMemory,
    pub depth_image_view: vk::ImageView,

    pub msaa_samples: vk::SampleCountFlags,
    pub color_image: vk::Image,
    pub color_image_memory: vk::DeviceMemory,
    pub color_image_view: vk::ImageView,
    pub use_geometry_shader: bool,

    pub topology: vk::PrimitiveTopology,

    pub scene_rt_memory_size: u64,
    pub scene_rt_volumetric_size: u64,
    pub compute_task_one_size: usize,
    // values passed to shader
    pub num_lights_per_volume: u32,
    pub min_light_weight: f32,
    pub max_iterations_per_light: u32,
    pub diffuse_raster_steps: u32,
    pub diffuse_raster_size: f32,
    pub max_recursive_rays: u32,
    pub diffuse_rays_per_hit: u32,
}