collections::HashMap,
ffi::CString,
os::raw::{c_char, c_int},
- path::Path,
+ path::{Path, PathBuf},
rc::Rc,
+ str::FromStr,
};
use crate::{
pub fn get_shader_id(&self) -> ::std::os::raw::c_uint {
self.shader.id as ::std::os::raw::c_uint
}
-}
-
-#[derive(Clone, Debug)]
-struct RaylibShaderHandler {
- shader: Rc<RefCell<RaylibShader>>,
-}
-impl ShaderInterface for RaylibShaderHandler {
fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String> {
let transform_cstr = CString::new("transform")
.map_err(|_| String::from("Failed to create \"transform\" CString!"))?;
- let attr_loc = get_attrib_location(&self.shader.borrow(), &transform_cstr);
+ let attr_loc = get_attrib_location(self, &transform_cstr);
set_transform_3f(attr_loc, transform);
Ok(())
}
fn begin_draw_shader(&self) -> Result<(), String> {
unsafe {
- ffi::BeginShaderMode(self.shader.borrow().shader);
+ ffi::BeginShaderMode(self.shader);
}
Ok(())
}
fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String> {
let origin_cstr = CString::new("origin")
.map_err(|_| String::from("Failed to create \"origin\" CString!"))?;
- let attr_loc = get_attrib_location(&self.shader.borrow(), &origin_cstr);
+ let attr_loc = get_attrib_location(self, &origin_cstr);
set_origin_2f(attr_loc, origin);
Ok(())
}
}
+#[derive(Clone, Debug)]
+struct RaylibShaderHandler {
+ shader: Rc<RefCell<RaylibShader>>,
+}
+
+impl ShaderInterface for RaylibShaderHandler {
+ fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String> {
+ self.shader.borrow_mut().set_transform_attrib(transform)
+ }
+
+ fn begin_draw_shader(&self) -> Result<(), String> {
+ self.shader.borrow().begin_draw_shader()
+ }
+
+ fn end_draw_shader(&self) -> Result<(), String> {
+ self.shader.borrow().end_draw_shader()
+ }
+
+ fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String> {
+ self.shader.borrow_mut().set_origin_attrib(origin)
+ }
+}
+
impl RaylibShaderHandler {
pub fn load_shader(vs: &Path, fs: &Path) -> Result<Self, String> {
unsafe {
#[derive(Clone, Debug)]
struct RaylibImageHandler {
image: Rc<RefCell<RaylibImage>>,
+ shader: Rc<RefCell<Option<RaylibShaderHandler>>>,
}
impl RaylibImageHandler {
transform: crate::faux_quicksilver::Transform,
origin: Vector,
) -> Result<(), String> {
- todo!()
+ self.image_to_texture()?;
+ if let Some(shader) = self.shader.borrow_mut().as_mut() {
+ shader.set_origin_attrib(origin)?;
+ shader.set_transform_attrib(transform)?;
+ shader.begin_draw_shader()?;
+ unsafe {
+ ffi::DrawTexture(
+ *self
+ .image
+ .borrow()
+ .texture
+ .as_ref()
+ .ok_or_else(|| String::from("RaylibImage has no Texture!"))?,
+ x.round() as i32,
+ y.round() as i32,
+ fqcolor_to_color(color),
+ );
+ }
+ shader.end_draw_shader()?;
+ } else {
+ unsafe {
+ ffi::DrawTexture(
+ *self
+ .image
+ .borrow()
+ .texture
+ .as_ref()
+ .ok_or_else(|| String::from("RaylibImage has no Texture!"))?,
+ x.round() as i32,
+ y.round() as i32,
+ fqcolor_to_color(color),
+ );
+ }
+ }
+ Ok(())
}
fn draw_sub_transform(
transform: crate::faux_quicksilver::Transform,
origin: Vector,
) -> Result<(), String> {
- todo!()
+ self.image_to_texture()?;
+ if let Some(shader) = self.shader.borrow_mut().as_mut() {
+ shader.set_origin_attrib(origin)?;
+ shader.set_transform_attrib(transform)?;
+ shader.begin_draw_shader()?;
+ unsafe {
+ ffi::DrawTexturePro(
+ *self
+ .image
+ .borrow()
+ .texture
+ .as_ref()
+ .ok_or_else(|| String::from("RaylibImage has no Texture!"))?,
+ fqrect_to_rect(sub_rect),
+ fqrect_to_rect(dest_rect),
+ ffi::Vector2 { x: 0.0, y: 0.0 },
+ 0.0,
+ fqcolor_to_color(color),
+ );
+ }
+ shader.end_draw_shader()?;
+ } else {
+ unsafe {
+ ffi::DrawTexturePro(
+ *self
+ .image
+ .borrow()
+ .texture
+ .as_ref()
+ .ok_or_else(|| String::from("RaylibImage has no Texture!"))?,
+ fqrect_to_rect(sub_rect),
+ fqrect_to_rect(dest_rect),
+ ffi::Vector2 { x: 0.0, y: 0.0 },
+ 0.0,
+ fqcolor_to_color(color),
+ );
+ }
+ }
+ Ok(())
}
fn get_w(&self) -> usize {
impl SoundInterface for RaylibSoundHandler {
fn play(&mut self, vol: f32) -> Result<(), String> {
unsafe {
+ ffi::SetSoundVolume(self.sound.sound, vol);
ffi::PlaySound(self.sound.sound);
}
Ok(())
transform: crate::faux_quicksilver::Transform,
origin: Vector,
) -> Result<(), String> {
- todo!()
+ if let Some(shader) = self.shaders.get_mut("transform_origin") {
+ shader.borrow_mut().set_origin_attrib(origin)?;
+ shader.borrow_mut().set_transform_attrib(transform)?;
+ shader.borrow().begin_draw_shader()?;
+ unsafe {
+ ffi::DrawCircle(
+ circle.x.round() as i32,
+ circle.y.round() as i32,
+ circle.r,
+ fqcolor_to_color(color),
+ );
+ }
+ shader.borrow().end_draw_shader()?;
+ } else {
+ unsafe {
+ ffi::DrawCircle(
+ circle.x.round() as i32,
+ circle.y.round() as i32,
+ circle.r,
+ fqcolor_to_color(color),
+ );
+ }
+ }
+ Ok(())
}
fn draw_rect(
transform: crate::faux_quicksilver::Transform,
origin: Vector,
) -> Result<(), String> {
- todo!()
+ if let Some(shader) = self.shaders.get_mut("transform_origin") {
+ shader.borrow_mut().set_origin_attrib(origin)?;
+ shader.borrow_mut().set_transform_attrib(transform)?;
+ shader.borrow().begin_draw_shader()?;
+ unsafe {
+ ffi::DrawRectangle(
+ rect.x.round() as i32,
+ rect.y.round() as i32,
+ rect.w.round() as i32,
+ rect.h.round() as i32,
+ fqcolor_to_color(color),
+ );
+ }
+ shader.borrow().end_draw_shader()?;
+ } else {
+ unsafe {
+ ffi::DrawRectangle(
+ rect.x.round() as i32,
+ rect.y.round() as i32,
+ rect.w.round() as i32,
+ rect.h.round() as i32,
+ fqcolor_to_color(color),
+ );
+ }
+ }
+ Ok(())
}
fn load_image(
let path_buf: Vec<u8> = path_str.as_bytes().into();
let cstring: CString = CString::from_vec_unchecked(path_buf);
let image = ffi::LoadImage(cstring.as_ptr());
+ let shader: Option<RaylibShaderHandler> =
+ if let Some(shader) = self.shaders.get("transform_origin") {
+ Some(RaylibShaderHandler {
+ shader: shader.clone(),
+ })
+ } else {
+ None
+ };
let raylib_image_handler = RaylibImageHandler {
image: Rc::new(RefCell::new(RaylibImage {
image,
texture: None,
})),
+ shader: Rc::new(RefCell::new(shader)),
};
self.images
.insert(path_str.to_owned(), raylib_image_handler.image.clone());
todo!()
}
}
+
+impl RaylibGame {
+ pub fn load_transform_origin_shader(&mut self) -> Result<Box<dyn ShaderInterface>, String> {
+ self.load_shader(
+ String::from("transform_origin"),
+ &PathBuf::from_str("static/transform.vs")
+ .map_err(|_| String::from("Failed to convert \"static/transform.vs\" to path!"))?,
+ &PathBuf::from_str("static/simple.fs")
+ .map_err(|_| String::from("Failed to convert \"static/simple.fs\" to path!"))?,
+ )
+ }
+}