use {
crate::{
camera::{IntoProjection, View},
canvas::CanvasEvent,
mesh::MeshData,
render::{InstanceHandle, MeshHandle, Render, TextureHandle, ViewHandle},
size::Size,
texture::{FrameFilter, TextureData},
transform::{IntoQuat, IntoTransform},
vertex::Vertex,
Error,
},
winit::{event_loop::EventLoopProxy, window::Window},
};
pub struct Context {
pub(crate) window: Window,
pub(crate) proxy: EventLoopProxy<CanvasEvent>,
pub(crate) render: Render,
pub(crate) limits: Limits,
}
impl Context {
pub fn window(&self) -> &Window {
&self.window
}
pub fn plan_to_close(&self) {
_ = self.proxy.send_event(CanvasEvent::Close);
}
pub fn size(&self) -> (u32, u32) {
self.render.size().as_virtual()
}
pub fn set_limits(&mut self, limits: Limits) {
self.limits = limits;
}
pub fn set_frame_parameters(&mut self, params: FrameParameters) {
if params.pixel_size == 0 {
return;
}
self.render.resize(Some(Size {
pixel_size: params.pixel_size.try_into().expect("non zero"),
filter: params.filter,
..self.render.size()
}));
}
pub fn create_texture(&mut self, data: TextureData) -> TextureHandle {
self.render.create_texture(data)
}
pub fn update_texture(
&mut self,
handle: TextureHandle,
data: TextureData,
) -> Result<(), Error> {
self.render.update_texture(handle, data)
}
pub fn delete_texture(&mut self, handle: TextureHandle) -> Result<(), Error> {
self.render.delete_texture(handle)
}
pub fn create_instances<I>(&mut self, data: I) -> InstanceHandle
where
I: IntoIterator,
I::Item: IntoTransform,
<I::Item as IntoTransform>::IntoQuat: IntoQuat,
{
let models: Vec<_> = data
.into_iter()
.map(|transform| transform.into_transform().into_model())
.collect();
self.render.create_instances(&models)
}
pub fn update_instances<I>(&mut self, handle: InstanceHandle, data: I) -> Result<(), Error>
where
I: IntoIterator,
I::Item: IntoTransform,
<I::Item as IntoTransform>::IntoQuat: IntoQuat,
{
let models: Vec<_> = data
.into_iter()
.map(|transform| transform.into_transform().into_model())
.collect();
self.render.update_instances(handle, &models)
}
pub fn delete_instances(&mut self, handle: InstanceHandle) -> Result<(), Error> {
self.render.delete_instances(handle)
}
pub fn create_mesh<V>(&mut self, data: MeshData<V>) -> MeshHandle<V>
where
V: Vertex,
{
self.render.create_mesh(data)
}
pub fn update_mesh<V>(&mut self, handle: MeshHandle<V>, data: MeshData<V>) -> Result<(), Error>
where
V: Vertex,
{
self.render.update_mesh(handle, data)
}
pub fn delete_mesh<V>(&mut self, handle: MeshHandle<V>) -> Result<(), Error> {
self.render.delete_mesh(handle)
}
pub fn create_view<P>(&mut self, view: View<P>) -> ViewHandle
where
P: IntoProjection,
{
self.render.create_view(view.into_projection_view())
}
pub fn update_view<P>(&mut self, handle: ViewHandle, view: View<P>) -> Result<(), Error>
where
P: IntoProjection,
{
self.render.update_view(handle, view.into_projection_view())
}
pub fn delete_view(&mut self, handle: ViewHandle) -> Result<(), Error> {
self.render.delete_view(handle)
}
}
#[derive(Clone, Copy, Default)]
pub struct Limits {
pub min_frame_delta_time: Option<f32>,
}
#[derive(Clone, Copy)]
pub struct FrameParameters {
pub pixel_size: u8,
pub filter: FrameFilter,
}
impl Default for FrameParameters {
fn default() -> Self {
Self {
pixel_size: 1,
filter: FrameFilter::Nearest,
}
}
}