#![feature(core, libc, unsafe_destructor)]
#[macro_use]
extern crate bitflags;
#[macro_use]
extern crate log;
extern crate libc;
pub use render::{Renderer, DrawError};
pub use render::batch;
pub use render::device_ext::{DeviceExt, ShaderSource, ProgramError};
pub use render::mesh::{Attribute, Mesh, VertexFormat};
pub use render::mesh::Error as MeshError;
pub use render::mesh::{Slice, ToSlice, SliceKind};
pub use render::state::{BlendPreset, DrawState};
pub use render::shade;
pub use render::target::{Frame, Plane};
pub use device::{Device, Resources};
pub use device::{attrib, state, tex};
pub use device::as_byte_slice;
pub use device::{BufferHandle, BufferInfo, RawBufferHandle, ShaderHandle};
pub use device::{ProgramHandle, SurfaceHandle, TextureHandle, SamplerHandle};
pub use device::BufferUsage;
pub use device::{VertexCount, InstanceCount};
pub use device::PrimitiveType;
pub use device::draw::CommandBuffer;
pub use device::shade::{ProgramInfo, UniformValue};
pub use device::target::*;
#[path = "../render/lib.rs"] pub mod render;
#[path = "../device/lib.rs"] pub mod device;
pub struct Graphics<D: device::Device> {
pub device: D,
pub renderer: Renderer<D::CommandBuffer>,
context: batch::Context<D::Resources>,
}
impl<D: device::Device> Graphics<D> {
pub fn new(mut device: D) -> Graphics<D> {
let rend = device.create_renderer();
Graphics {
device: device,
renderer: rend,
context: batch::Context::new(),
}
}
pub fn make_batch<T: shade::ShaderParam<Resources = D::Resources>>(&mut self,
program: &ProgramHandle<D::Resources>,
mesh: &Mesh<D::Resources>,
slice: Slice<D::Resources>,
state: &DrawState)
-> Result<batch::RefBatch<T>, batch::Error> {
self.context.make_batch(program, mesh, slice, state)
}
pub fn clear(&mut self, data: ClearData, mask: Mask, frame: &Frame<D::Resources>) {
self.renderer.clear(data, mask, frame)
}
pub fn draw<'a, T: shade::ShaderParam<Resources = D::Resources>>(&'a mut self,
batch: &'a batch::RefBatch<T>, data: &'a T, frame: &Frame<D::Resources>)
-> Result<(), DrawError<batch::OutOfBounds>> {
self.renderer.draw(&self.context.bind(batch, data), frame)
}
pub fn end_frame(&mut self) {
self.device.submit(self.renderer.as_buffer());
self.renderer.reset();
}
}