mod immediate;
mod matrix;
pub use immediate::{DrawMode, RlImmediate};
pub use matrix::{MatrixMode, RlMatrix};
use crate::core::drawing::RaylibDraw;
use crate::ffi;
use crate::math::Matrix;
pub trait RaylibRlgl: RaylibDraw + Sized {
#[inline]
fn rl_push_matrix(&mut self) -> RlMatrix<'_, Self> {
unsafe { ffi::rlPushMatrix() };
RlMatrix::new(self)
}
#[inline]
fn rl_load_identity(&mut self) {
unsafe { ffi::rlLoadIdentity() }
}
#[inline]
fn rl_translatef(&mut self, x: f32, y: f32, z: f32) {
unsafe { ffi::rlTranslatef(x, y, z) }
}
#[inline]
fn rl_rotatef(&mut self, angle: f32, x: f32, y: f32, z: f32) {
unsafe { ffi::rlRotatef(angle, x, y, z) }
}
#[inline]
fn rl_scalef(&mut self, x: f32, y: f32, z: f32) {
unsafe { ffi::rlScalef(x, y, z) }
}
#[inline]
fn rl_mult_matrixf(&mut self, mat: Matrix) {
unsafe { ffi::rlMultMatrixf(&mat as *const Matrix as *const f32) }
}
#[inline]
fn rl_matrix_mode(&mut self, mode: MatrixMode) {
unsafe { ffi::rlMatrixMode(mode as i32) }
}
#[inline]
fn rl_ortho(&mut self, left: f64, right: f64, bottom: f64, top: f64, near: f64, far: f64) {
unsafe { ffi::rlOrtho(left, right, bottom, top, near, far) }
}
#[inline]
fn rl_set_matrix_projection(&mut self, proj: Matrix) {
unsafe { ffi::rlSetMatrixProjection(proj) }
}
#[inline]
fn rl_set_matrix_modelview(&mut self, view: Matrix) {
unsafe { ffi::rlSetMatrixModelview(view) }
}
#[inline]
fn rl_begin(&mut self, mode: DrawMode) -> RlImmediate<'_, Self> {
unsafe { ffi::rlBegin(mode as i32) };
RlImmediate::new(self)
}
#[inline]
fn rl_draw(&mut self, mode: DrawMode, body: impl FnOnce(&mut RlImmediate<'_, Self>)) {
let mut v = self.rl_begin(mode);
body(&mut v);
}
#[inline]
fn rl_enable_depth_test(&mut self) {
unsafe { ffi::rlEnableDepthTest() }
}
#[inline]
fn rl_disable_depth_test(&mut self) {
unsafe { ffi::rlDisableDepthTest() }
}
#[inline]
fn rl_enable_backface_culling(&mut self) {
unsafe { ffi::rlEnableBackfaceCulling() }
}
#[inline]
fn rl_disable_backface_culling(&mut self) {
unsafe { ffi::rlDisableBackfaceCulling() }
}
#[inline]
fn rl_set_texture(&mut self, texture: &crate::core::texture::Texture2D) {
unsafe { ffi::rlSetTexture(texture.id) }
}
#[inline]
fn rl_enable_texture(&mut self, texture: &crate::core::texture::Texture2D) {
unsafe { ffi::rlEnableTexture(texture.id) }
}
#[inline]
fn rl_disable_texture(&mut self) {
unsafe { ffi::rlDisableTexture() }
}
#[inline]
fn rl_active_texture_slot(&mut self, slot: i32) {
unsafe { ffi::rlActiveTextureSlot(slot) }
}
#[inline]
fn rl_enable_shader(&mut self, shader: &crate::core::shaders::Shader) {
unsafe { ffi::rlEnableShader(shader.id) }
}
#[inline]
fn rl_set_shader(&mut self, shader: &crate::core::shaders::Shader) {
unsafe { ffi::rlSetShader(shader.id, shader.locs) }
}
}
impl<D: RaylibDraw> RaylibRlgl for D {}