pub mod imports;
pub mod uniform_buffer;
pub use imports::*;
pub use uniform_buffer::*;
use downcast::{downcast, Any};
macro_rules! impl_deref {
($struct:ty,$type:ty) => {
impl std::ops::Deref for $struct {
type Target = $type;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl std::ops::DerefMut for $struct {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
};
}
#[repr(C)]
#[derive(Copy, Clone, Debug, bytemuck::Pod, bytemuck::Zeroable)]
pub struct Vertex {
pub position: [f32; 3],
pub uv: [f32; 2],
pub normal: [f32; 3],
}
impl Vertex {
pub(crate) fn desc<'a>() -> wgpu::VertexBufferLayout<'a> {
wgpu::VertexBufferLayout {
array_stride: std::mem::size_of::<Vertex>() as wgpu::BufferAddress,
step_mode: wgpu::VertexStepMode::Vertex,
attributes: &[
wgpu::VertexAttribute {
offset: 0,
shader_location: 0,
format: wgpu::VertexFormat::Float32x3,
},
wgpu::VertexAttribute {
offset: std::mem::size_of::<[f32; 3]>() as wgpu::BufferAddress,
shader_location: 1,
format: wgpu::VertexFormat::Float32x2,
},
wgpu::VertexAttribute {
offset: std::mem::size_of::<[f32; 5]>() as wgpu::BufferAddress,
shader_location: 2,
format: wgpu::VertexFormat::Float32x3,
},
],
}
}
}
unsafe impl Send for Vertex {}
unsafe impl Sync for Vertex {}
#[derive(Debug)]
pub struct Object {
pub name: String,
pub vertices: Vec<Vertex>,
pub indices: Vec<u16>,
pub uniform_layout: wgpu::BindGroupLayout,
pub pipeline: Pipeline,
pub instances: Vec<Instance>,
pub instance_buffer: wgpu::Buffer,
pub size: glm::Vec3,
pub scale: glm::Vec3,
pub position: glm::Vec3,
pub rotation: glm::Vec3,
pub(crate) changed: bool,
pub position_matrix: nalgebra_glm::Mat4,
pub scale_matrix: nalgebra_glm::Mat4,
pub rotation_matrix: nalgebra_glm::Mat4,
pub inverse_transformation_matrix: crate::uniform_type::Matrix,
pub uniform_color: crate::uniform_type::Array4,
pub color: crate::uniform_type::Array4,
pub shader_builder: crate::objects::ShaderBuilder,
pub shader_settings: ShaderSettings,
pub camera_effect: bool,
pub uniform_buffers: Vec<wgpu::Buffer>,
pub is_visible: bool,
pub render_order: usize,
}
unsafe impl Send for Object {}
unsafe impl Sync for Object {}
#[derive(Debug, Clone, Copy)]
pub struct ObjectSettings {
pub camera_effect: bool,
pub shader_settings: ShaderSettings,
}
impl Default for ObjectSettings {
fn default() -> Self {
Self {
camera_effect: true,
shader_settings: ShaderSettings::default(),
}
}
}
unsafe impl Send for ObjectSettings {}
unsafe impl Sync for ObjectSettings {}
pub struct Engine {
pub renderer: Renderer,
pub event_loop: winit::event_loop::EventLoop<()>,
pub window: winit::window::Window,
pub objects: ObjectStorage,
pub camera: Camera,
pub plugins: Vec<Box<dyn crate::EnginePlugin>>,
}
unsafe impl Send for Engine {}
unsafe impl Sync for Engine {}
#[derive(Debug)]
pub struct Pipeline {
pub shader: PipelineData<crate::Shaders>,
pub vertex_buffer: PipelineData<VertexBuffers>,
pub texture: PipelineData<crate::Textures>,
pub uniform: PipelineData<Option<crate::UniformBuffers>>,
}
unsafe impl Send for Pipeline {}
unsafe impl Sync for Pipeline {}
#[derive(Debug)]
pub enum PipelineData<T> {
Copy(String),
Data(T),
}
#[derive(Debug)]
pub struct VertexBuffers {
pub vertex_buffer: wgpu::Buffer,
pub index_buffer: wgpu::Buffer,
pub length: u32,
}
unsafe impl Send for VertexBuffers {}
unsafe impl Sync for VertexBuffers {}
#[derive(Debug)]
pub struct Renderer {
pub surface: Option<wgpu::Surface>,
#[cfg(feature = "android")]
pub instance: wgpu::Instance,
#[allow(unused)]
pub adapter: wgpu::Adapter,
pub device: wgpu::Device,
pub queue: wgpu::Queue,
pub config: wgpu::SurfaceConfiguration,
pub size: winit::dpi::PhysicalSize<u32>,
pub texture_bind_group_layout: wgpu::BindGroupLayout,
pub default_uniform_bind_group_layout: wgpu::BindGroupLayout,
pub depth_buffer: (wgpu::Texture, wgpu::TextureView, wgpu::Sampler),
pub default_data: Option<(crate::Textures, crate::Shaders, crate::UniformBuffers)>,
pub camera: Option<crate::UniformBuffers>,
}
unsafe impl Sync for Renderer {}
unsafe impl Send for Renderer {}
#[derive(Debug, Clone, Copy)]
pub struct WindowDescriptor {
pub width: u32,
pub height: u32,
pub title: &'static str,
pub decorations: bool,
pub resizable: bool,
pub power_preference: crate::PowerPreference,
pub backends: crate::Backends,
}
impl std::default::Default for WindowDescriptor {
fn default() -> Self {
Self {
width: 800,
height: 600,
title: "Blue Engine",
decorations: true,
resizable: true,
power_preference: crate::PowerPreference::LowPower,
backends: crate::Backends::all(),
}
}
}
unsafe impl Send for WindowDescriptor {}
unsafe impl Sync for WindowDescriptor {}
#[derive(Debug)]
pub enum Projection {
Perspective {
fov: f32,
},
Orthographic {
zoom: f32,
},
}
#[derive(Debug)]
pub struct Camera {
pub position: nalgebra_glm::Vec3,
pub target: nalgebra_glm::Vec3,
pub up: nalgebra_glm::Vec3,
pub resolution: (f32, f32),
pub projection: Projection,
pub near: f32,
pub far: f32,
pub view_data: nalgebra_glm::Mat4,
pub(crate) changed: bool,
pub uniform_data: crate::UniformBuffers,
pub(crate) add_position_and_target: bool,
}
unsafe impl Send for Camera {}
unsafe impl Sync for Camera {}
#[derive(Debug, Clone, Copy)]
pub struct ShaderSettings {
pub topology: crate::ShaderPrimitive,
pub strip_index_format: Option<crate::IndexFormat>,
pub front_face: crate::FrontFace,
pub cull_mode: Option<crate::CullMode>,
pub polygon_mode: crate::PolygonMode,
pub clamp_depth: bool,
pub conservative: bool,
pub count: u32,
pub mask: u64,
pub alpha_to_coverage_enabled: bool,
}
impl Default for ShaderSettings {
fn default() -> Self {
Self {
topology: wgpu::PrimitiveTopology::TriangleList,
strip_index_format: None,
front_face: wgpu::FrontFace::Ccw,
cull_mode: Some(wgpu::Face::Back),
polygon_mode: wgpu::PolygonMode::Fill,
clamp_depth: false,
conservative: false,
count: 1,
mask: !0,
alpha_to_coverage_enabled: true,
}
}
}
unsafe impl Send for ShaderSettings {}
unsafe impl Sync for ShaderSettings {}
#[repr(C)]
#[derive(Debug, Clone, Copy, bytemuck::Pod, bytemuck::Zeroable)]
pub struct InstanceRaw {
pub model: uniform_type::Matrix,
}
#[derive(Debug, Clone, Copy)]
pub struct Instance {
pub position: nalgebra_glm::Vec3,
pub rotation: nalgebra_glm::Vec3,
pub scale: nalgebra_glm::Vec3,
}
pub trait EnginePlugin: Any {
fn update_events(
&mut self,
_renderer: &mut crate::Renderer,
_window: &crate::Window,
_objects: &mut ObjectStorage,
_events: &crate::Event<()>,
_input: &crate::InputHelper,
_camera: &mut crate::Camera,
);
fn update(
&mut self,
_renderer: &mut crate::Renderer,
_window: &crate::Window,
_objects: &mut ObjectStorage,
_camera: &mut crate::Camera,
_input: &crate::InputHelper,
_encoder: &mut crate::CommandEncoder,
_view: &crate::TextureView,
);
}
downcast!(dyn EnginePlugin);
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RotateAxis {
#[doc(hidden)]
X,
#[doc(hidden)]
Y,
#[doc(hidden)]
Z,
}
unsafe impl Send for RotateAxis {}
unsafe impl Sync for RotateAxis {}
#[derive(Debug, Clone)]
pub enum TextureData {
Bytes(Vec<u8>),
Image(image::DynamicImage),
Path(String),
}
unsafe impl Send for TextureData {}
unsafe impl Sync for TextureData {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TextureMode {
Clamp,
Repeat,
MirrorRepeat,
}
unsafe impl Send for TextureMode {}
unsafe impl Sync for TextureMode {}
pub fn pixel_to_cartesian(value: f32, max: u32) -> f32 {
let mut result = value / max as f32;
if value == max as f32 {
result = 0.0;
} else if result < max as f32 / 2.0 {
}
if result > -1.0 {
return result as f32;
} else {
return -1.0;
}
}
pub trait StringBuffer: StringBufferTrait + Clone {}
pub trait StringBufferTrait {
fn as_str(&self) -> &str;
fn as_string(&self) -> String;
}
impl StringBufferTrait for String {
fn as_str(&self) -> &str {
self.as_ref()
}
fn as_string(&self) -> String {
self.clone()
}
}
impl StringBuffer for String {}
impl StringBufferTrait for &str {
fn as_str(&self) -> &str {
self
}
fn as_string(&self) -> String {
self.to_string()
}
}
impl StringBuffer for &str {}
#[derive(Debug)]
pub struct ObjectStorage(std::collections::HashMap<String, Object>);
impl ObjectStorage {
pub fn new() -> Self {
ObjectStorage(std::collections::HashMap::new())
}
}
unsafe impl Send for ObjectStorage {}
unsafe impl Sync for ObjectStorage {}
impl_deref!(ObjectStorage, std::collections::HashMap<String, Object>);
pub const DEPTH_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Depth32Float;