#![allow(dead_code)]
use winapi::shared::d3d9::IDirect3DVertexDeclaration9;
use winapi::um::unknwnbase::IUnknown;
use crate::*;
use crate::d3d9::*;
use std::ptr::null_mut;
#[derive(Clone)] #[repr(transparent)]
pub struct VertexDeclaration(pub(crate) mcom::Rc<IDirect3DVertexDeclaration9>);
unsafe impl AsSafe<IUnknown > for VertexDeclaration { fn as_safe(&self) -> &IUnknown { &**self.0 } }
unsafe impl AsSafe<IDirect3DVertexDeclaration9 > for VertexDeclaration { fn as_safe(&self) -> &IDirect3DVertexDeclaration9 { &*self.0 } }
pub trait IDirect3DVertexDeclaration9Ext : AsSafe<IDirect3DVertexDeclaration9> {
fn get_declaration_size(&self) -> Result<u32, MethodError> {
let mut num_elements = 0;
let hr = unsafe { self.as_winapi().GetDeclaration(null_mut(), &mut num_elements) };
MethodError::check("IDirect3DVertexDeclaration9::GetDeclaration", hr)?;
Ok(num_elements)
}
fn get_declaration_inplace<'e>(&self, elements: &'e mut [VertexElement]) -> Result<&'e [VertexElement], MethodError> {
let mut num_elements = self.get_declaration_size()?;
if num_elements as usize > elements.len() { return Err(MethodError("VertexDeclaration::get_declaration_inplace", D3DERR::INVALIDCALL)); }
let hr = unsafe { self.as_winapi().GetDeclaration(null_mut(), &mut num_elements) };
MethodError::check("IDirect3DVertexDeclaration9::GetDeclaration", hr)?;
Ok(&elements[0..(num_elements as usize)])
}
fn get_declaration(&self) -> Result<Vec<VertexElement>, MethodError> {
let mut num_elements = self.get_declaration_size()?;
let mut v = vec![VertexElement::default(); num_elements as usize];
let hr = unsafe { self.as_winapi().GetDeclaration(v.as_mut_ptr().cast(), &mut num_elements) };
debug_assert!(v.len() == num_elements as usize); MethodError::check("IDirect3DVertexDeclaration9::GetDeclaration", hr)?;
Ok(v)
}
fn get_device(&self) -> Result<Device, MethodError> {
let mut device = null_mut();
let hr = unsafe { self.as_winapi().GetDevice(&mut device) };
MethodError::check("IDirect3DVertexDeclaration9::GetDevice", hr)?;
Ok(unsafe { Device::from_raw(device) })
}
}
impl<T: AsSafe<IDirect3DVertexDeclaration9>> IDirect3DVertexDeclaration9Ext for T {}