use crate::data::Color;
use crate::shader::{Shader, ShaderProgram, ShaderType};
use crate::vertex::VertexBuffer;
#[expect(
clippy::unwrap_used,
reason = "This should never panic as it is compile-time included. However, it is possible, see the doc-comment."
)]
#[inline]
#[must_use]
pub fn shader_2d() -> ShaderProgram {
ShaderProgram::new(vec![
Shader::load_str(
ShaderType::Vertex,
include_str!("builtin_shaders/shape2d.vert.glsl"),
)
.unwrap(),
Shader::load_str(
ShaderType::Fragment,
include_str!("builtin_shaders/shape2d.frag.glsl"),
)
.unwrap(),
])
.unwrap()
}
#[non_exhaustive]
pub struct Triangle {
vertex_buffer: VertexBuffer,
}
impl Triangle {
#[inline]
#[must_use]
pub fn new(vertices: &[f32; 15]) -> Triangle {
let vertex_buffer = VertexBuffer::new(vertices, &[0, 1, 2]);
vertex_buffer.set_layout(&[2_i32, 3_i32]);
Triangle { vertex_buffer }
}
#[inline]
#[must_use]
#[rustfmt::skip]
pub fn new_solid(vertices: &[f32; 6], color: &Color) -> Triangle {
let (r, g, b, _) = color.gl();
Triangle::new(&[
vertices[0], vertices[1], r, g, b,
vertices[2], vertices[3], r, g, b,
vertices[4], vertices[5], r, g, b,
])
}
#[inline]
#[must_use]
pub fn new_flat_isosceles(x: f32, y: f32, width: f32, height: f32, color: &Color) -> Triangle {
Triangle::new_solid(
&[x, y, x + width, y, width.mul_add(0.5, x), y + height],
color,
)
}
#[inline]
pub fn draw(&self, shader_program: &ShaderProgram) {
self.vertex_buffer.draw(shader_program);
}
}
#[non_exhaustive]
pub struct Rectangle {
vertex_buffer: VertexBuffer,
}
impl Rectangle {
#[inline]
#[must_use]
pub fn new(vertices: &[f32; 20]) -> Rectangle {
let vertex_buffer = VertexBuffer::new(vertices, &[0, 1, 2, 2, 3, 0]);
vertex_buffer.set_layout(&[2_i32, 3_i32]);
Rectangle { vertex_buffer }
}
#[inline]
#[must_use]
#[rustfmt::skip]
pub fn new_solid(vertices: &[f32; 8], color: &Color) -> Rectangle {
let (r, g, b, _) = color.gl();
Rectangle::new(&[
vertices[0], vertices[1], r, g, b,
vertices[2], vertices[3], r, g, b,
vertices[4], vertices[5], r, g, b,
vertices[6], vertices[7], r, g, b,
])
}
#[inline]
#[must_use]
pub fn new_flat(x: f32, y: f32, width: f32, height: f32, color: &Color) -> Rectangle {
Rectangle::new_solid(
&[x, y, x + width, y, x + width, y + height, x, y + height],
color,
)
}
#[inline]
pub fn draw(&self, shader_program: &ShaderProgram) {
self.vertex_buffer.draw(shader_program);
}
}