use crate::b2_math::{B2Transform, B2vec2};
use std::cell::RefCell;
use std::rc::Rc;
use bitflags::bitflags;
#[derive(Copy, Clone, Debug)]
pub struct B2color {
pub r: f32,
pub g: f32,
pub b: f32,
pub a: f32,
}
impl B2color {
pub fn new(r_in: f32, g_in: f32, b_in: f32) -> B2color {
return B2color {
r: r_in,
g: g_in,
b: b_in,
a: 1.0,
};
}
pub fn new_with_alpha(r_in: f32, g_in: f32, b_in: f32, a_in: f32) -> B2color {
return B2color {
r: r_in,
g: g_in,
b: b_in,
a: a_in,
};
}
pub fn set(&mut self, r_in: f32, g_in: f32, b_in: f32) {
self.r = r_in;
self.g = g_in;
self.b = b_in;
}
pub fn set_with_alpha(&mut self, r_in: f32, g_in: f32, b_in: f32, a_in: f32) {
self.r = r_in;
self.g = g_in;
self.b = b_in;
self.a = a_in;
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct B2draw {
m_draw_flags: B2drawShapeFlags,
}
bitflags! {
#[derive(Debug, Clone, Copy, Default)]
pub struct B2drawShapeFlags: u16 {
const SHAPE_BIT = 0x0001;
const JOINT_BIT = 0x0002;
const AABB_BIT = 0x0004;
const PAIR_BIT = 0x0008;
const CENTER_OF_MASS_BIT = 0x0010;
}
}
impl B2draw {
pub fn set_flags(&mut self, flags: B2drawShapeFlags) {
self.m_draw_flags = flags;
}
pub fn get_flags(self) -> B2drawShapeFlags {
return self.m_draw_flags;
}
pub fn append_flags(&mut self, flags: B2drawShapeFlags) {
self.m_draw_flags.insert(flags);
}
pub fn clear_flags(&mut self, flags: B2drawShapeFlags) {
self.m_draw_flags.remove(flags);
}
}
pub type B2drawTraitPtr = Rc<RefCell<dyn B2drawTrait>>;
pub trait B2drawTrait {
fn get_base(&self) -> &B2draw;
fn get_base_mut(&mut self) -> &mut B2draw;
fn draw_polygon(&mut self, vertices: &[B2vec2], color: B2color);
fn draw_solid_polygon(&mut self, vertices: &[B2vec2], color: B2color);
fn draw_circle(&mut self, center: B2vec2, radius: f32, color: B2color);
fn draw_solid_circle(&mut self, center: B2vec2, radius: f32, axis: B2vec2, color: B2color);
fn draw_segment(&mut self, p1: B2vec2, p2: B2vec2, color: B2color);
fn draw_transform(&mut self, xf: B2Transform);
fn draw_point(&mut self, p: B2vec2, size: f32, color: B2color);
}