pub mod core;
pub mod gl;
pub mod draw2d;
use yog_abi::YogGfxApi;
#[derive(Copy, Clone)]
pub struct GfxContext(*const YogGfxApi);
unsafe impl Send for GfxContext {}
unsafe impl Sync for GfxContext {}
impl GfxContext {
#[doc(hidden)]
pub unsafe fn from_raw(raw: *const YogGfxApi) -> Self { Self(raw) }
#[inline]
fn api(&self) -> &YogGfxApi { unsafe { &*self.0 } }
pub fn screen_size(&self) -> (i32, i32) {
let a = self.api();
(a.screen_w, a.screen_h)
}
pub fn delta_tick(&self) -> f32 { self.api().delta_tick }
pub fn view_proj(&self) -> [f32; 16] { self.api().view_proj }
pub fn camera_pos(&self) -> [f32; 3] { self.api().camera_pos }
pub fn player_pos(&self) -> [f32; 3] { self.api().player_pos }
pub fn create_buffer(&self) -> gl::Buffer {
gl::Buffer { handle: unsafe { (self.api().buf_create)() } }
}
pub fn delete_buffer(&self, buf: gl::Buffer) {
unsafe { (self.api().buf_delete)(buf.handle) }
}
pub fn create_vao(&self) -> gl::VertexArray {
gl::VertexArray { handle: unsafe { (self.api().vao_create)() } }
}
pub fn delete_vao(&self, vao: gl::VertexArray) {
unsafe { (self.api().vao_delete)(vao.handle) }
}
pub fn create_shader(&self, vert_src: &str, frag_src: &str) -> Result<gl::ShaderProgram, ()> {
use yog_abi::YogStr;
let mut handle = 0u32;
let ok = unsafe {
(self.api().prog_create)(
YogStr::from_str(vert_src),
YogStr::from_str(frag_src),
&mut handle,
)
};
if ok && handle != 0 { Ok(gl::ShaderProgram { handle }) } else { Err(()) }
}
pub fn delete_shader(&self, prog: gl::ShaderProgram) {
unsafe { (self.api().prog_delete)(prog.handle) }
}
pub fn create_texture_rgba(&self, w: u32, h: u32, pixels: &[u8], linear: bool) -> gl::Texture {
gl::Texture { handle: unsafe { (self.api().tex_create)(w, h, pixels.as_ptr(), linear) } }
}
pub fn texture_from_mc(&self, id: &str) -> gl::Texture {
use yog_abi::YogStr;
gl::Texture { handle: unsafe { (self.api().tex_from_mc)(YogStr::from_str(id)) } }
}
pub fn delete_texture(&self, tex: gl::Texture) {
unsafe { (self.api().tex_delete)(tex.handle) }
}
pub fn bind_texture(&self, unit: u32, tex: &gl::Texture) {
unsafe { (self.api().tex_bind)(unit, tex.handle) }
}
pub fn draw_arrays(
&self, vao: &gl::VertexArray, prog: &gl::ShaderProgram,
mode: core::DrawMode, first: u32, count: u32,
) {
unsafe { (self.api().draw_arrays)(vao.handle, prog.handle, mode as u8, first, count) }
}
pub fn draw_elements(
&self, vao: &gl::VertexArray, ebo: &gl::Buffer, prog: &gl::ShaderProgram,
mode: core::DrawMode, count: u32, u32_indices: bool,
) {
unsafe {
(self.api().draw_elements)(vao.handle, ebo.handle, prog.handle, mode as u8, count, u32_indices)
}
}
pub fn set_blend(&self, enabled: bool, src: u32, dst: u32) {
unsafe { (self.api().set_blend)(enabled, src, dst) }
}
pub fn set_depth(&self, test: bool, write: bool) {
unsafe { (self.api().set_depth)(test, write) }
}
pub fn set_scissor(&self, x: i32, y: i32, w: i32, h: i32) {
unsafe { (self.api().set_scissor)(x, y, w, h) }
}
pub fn clear_scissor(&self) {
unsafe { (self.api().clear_scissor)() }
}
pub fn set_viewport(&self, x: i32, y: i32, w: i32, h: i32) {
unsafe { (self.api().set_viewport)(x, y, w, h) }
}
pub fn draw2d(&self) -> draw2d::Draw2D<'_> { draw2d::Draw2D::new(self) }
}