#![warn(
missing_docs,
missing_debug_implementations,
trivial_casts,
trivial_numeric_casts,
unsafe_code,
unstable_features,
unused_import_braces,
unused_qualifications
)]
extern crate truck_modeling;
extern crate truck_platform;
extern crate truck_polymesh;
use bytemuck::{Pod, Zeroable};
use image::DynamicImage;
use std::sync::{Arc, Mutex};
use truck_platform::{wgpu::*, *};
pub mod modeling {
pub use truck_modeling::*;
}
pub use modeling::*;
pub mod polymesh {
pub use truck_polymesh::*;
}
pub use polymesh::*;
#[derive(Debug, Clone, Copy)]
pub struct Material {
pub albedo: Vector4,
pub roughness: f64,
pub reflectance: f64,
pub ambient_ratio: f64,
}
#[derive(Clone, Debug)]
pub struct InstanceState {
pub matrix: Matrix4,
pub material: Material,
pub texture: Option<Arc<Texture>>,
pub backface_culling: bool,
}
#[derive(Clone, Debug)]
pub struct WireFrameState {
pub matrix: Matrix4,
pub color: Vector4,
}
#[derive(Clone, Debug, Default)]
pub struct PolygonInstanceDescriptor {
pub instance_state: InstanceState,
}
#[derive(Clone, Debug)]
pub struct ShapeInstanceDescriptor {
pub instance_state: InstanceState,
pub mesh_precision: f64,
}
#[derive(Clone, Debug)]
pub struct WireFrameInstanceDescriptor {
pub wireframe_state: WireFrameState,
pub polyline_precision: f64,
}
#[derive(Debug)]
struct PolygonShaders {
vertex: ShaderModule,
fragment: ShaderModule,
tex_fragment: ShaderModule,
}
#[derive(Debug)]
struct ShapeShaders {
vertex: ShaderModule,
fragment: ShaderModule,
tex_fragment: ShaderModule,
}
#[derive(Debug)]
struct WireShaders {
vertex: ShaderModule,
fragment: ShaderModule,
}
#[derive(Debug)]
pub struct PolygonInstance {
polygon: Arc<Mutex<(Arc<BufferHandler>, Arc<BufferHandler>)>>,
state: InstanceState,
shaders: Arc<PolygonShaders>,
id: RenderID,
}
#[derive(Debug)]
pub struct WireFrameInstance {
vertices: Arc<BufferHandler>,
strips: Arc<BufferHandler>,
state: WireFrameState,
shaders: Arc<WireShaders>,
id: RenderID,
}
#[derive(Debug)]
pub struct ShapeInstance {
polygon: (Arc<BufferHandler>, Arc<BufferHandler>),
boundary: Arc<BufferHandler>,
state: InstanceState,
shaders: Arc<ShapeShaders>,
id: RenderID,
}
#[derive(Debug, Clone)]
pub struct InstanceCreator {
handler: DeviceHandler,
polygon_shaders: Arc<PolygonShaders>,
shape_shaders: Arc<ShapeShaders>,
wire_shaders: Arc<WireShaders>,
}
pub trait CreatorCreator {
fn instance_creator(&self) -> InstanceCreator;
}
pub trait Polygon {
fn buffers(
&self,
vertex_usage: BufferUsage,
index_usage: BufferUsage,
device: &Device,
) -> (BufferHandler, BufferHandler);
#[doc(hidden)]
fn into_instance(
&self,
creator: &InstanceCreator,
desc: &PolygonInstanceDescriptor,
) -> PolygonInstance;
}
pub trait Shape {
#[doc(hidden)]
fn try_into_instance(
&self,
creator: &InstanceCreator,
desc: &ShapeInstanceDescriptor,
) -> Option<ShapeInstance>;
#[doc(hidden)]
fn into_instance(
&self,
creator: &InstanceCreator,
desc: &ShapeInstanceDescriptor,
) -> ShapeInstance;
#[doc(hidden)]
fn into_wire_frame(
&self,
creator: &InstanceCreator,
state: &WireFrameInstanceDescriptor,
) -> WireFrameInstance;
}
#[derive(Debug, Clone)]
struct ExpandedPolygon<V> {
vertices: Vec<V>,
indices: Vec<u32>,
}
mod expanded;
pub mod image2texture;
mod instance_creator;
mod instance_descriptor;
mod polyrend;
mod shaperend;
mod wireframe;