use std::rc::Rc;
use std::cell::RefCell;
use std::ptr;
use traits::Wrappable;
use graphics::{BlendMode, Texture, rc, Transform};
use ffi::graphics::render_states as ffi;
pub struct RenderStates {
sf_render_states: ffi::sfRenderStates,
pub blend_mode: BlendMode,
pub transform: Transform,
pub texture: Option<Rc<RefCell<Texture>>>,
pub shader: Option<Rc<RefCell<rc::Shader>>>
}
impl RenderStates {
pub fn new(blend_mode: BlendMode,
transform: Transform,
texture: Option<Rc<RefCell<Texture>>>,
shader: Option<Rc<RefCell<rc::Shader>>>) -> RenderStates {
RenderStates {
sf_render_states: ffi::sfRenderStates {
blendMode: blend_mode as i32,
transform: transform,
texture: ptr::null_mut(),
shader: ptr::null_mut()
},
blend_mode: blend_mode,
transform: transform,
texture: texture,
shader: shader
}
}
pub fn default() -> RenderStates {
RenderStates {
sf_render_states: ffi::sfRenderStates {
blendMode: BlendMode::Alpha as i32,
transform: Transform::new_identity(),
texture: ptr::null_mut(),
shader: ptr::null_mut()
},
blend_mode: BlendMode::Alpha,
transform: Transform::new_identity(),
texture: None,
shader: None
}
}
#[doc(hidden)]
pub fn unwrap(&mut self) -> *mut ffi::sfRenderStates {
self.sf_render_states.blendMode = self.blend_mode as i32;
self.sf_render_states.transform = self.transform;
self.sf_render_states.texture = if !self.texture.is_none() {
self.texture.as_ref().unwrap().borrow().unwrap()
} else {
ptr::null_mut()
};
self.sf_render_states.shader = if !self.shader.is_none() {
self.shader.as_ref().unwrap().borrow().unwrap()
} else {
ptr::null_mut()
};
&mut self.sf_render_states as *mut ffi::sfRenderStates
}
}