use fmod_sys::*;
use std::ffi::{c_float, c_int, c_void};
use crate::{FmodResultExt, Result};
use crate::{Geometry, Vector};
impl Geometry {
pub fn add_polygon(
&self,
direct_occlusion: c_float,
reverb_occlusion: c_float,
double_sided: bool,
vertices: &[Vector],
) -> Result<c_int> {
let mut index = 0;
unsafe {
FMOD_Geometry_AddPolygon(
self.inner.as_ptr(),
direct_occlusion,
reverb_occlusion,
double_sided.into(),
vertices.len() as c_int,
vertices.as_ptr().cast(),
&raw mut index,
)
.to_result()?;
}
Ok(index)
}
pub fn set_active(&self, active: bool) -> Result<()> {
unsafe { FMOD_Geometry_SetActive(self.inner.as_ptr(), active.into()).to_result() }
}
pub fn get_active(&self) -> Result<bool> {
let mut active = FMOD_BOOL::FALSE;
unsafe {
FMOD_Geometry_GetActive(self.inner.as_ptr(), &raw mut active).to_result()?;
}
Ok(active.into())
}
pub fn get_max_polygons(&self) -> Result<(c_int, c_int)> {
let mut max_polygons = 0;
let mut max_vertices = 0;
unsafe {
FMOD_Geometry_GetMaxPolygons(
self.inner.as_ptr(),
&raw mut max_polygons,
&raw mut max_vertices,
)
.to_result()?;
}
Ok((max_polygons, max_vertices))
}
pub fn get_polygon_count(&self) -> Result<c_int> {
let mut count = 0;
unsafe {
FMOD_Geometry_GetNumPolygons(self.inner.as_ptr(), &raw mut count).to_result()?;
}
Ok(count)
}
#[allow(clippy::not_unsafe_ptr_arg_deref)] pub fn set_userdata(&self, userdata: *mut c_void) -> Result<()> {
unsafe { FMOD_Geometry_SetUserData(self.inner.as_ptr(), userdata).to_result() }
}
pub fn get_userdata(&self) -> Result<*mut c_void> {
let mut userdata = std::ptr::null_mut();
unsafe {
FMOD_Geometry_GetUserData(self.inner.as_ptr(), &raw mut userdata).to_result()?;
}
Ok(userdata)
}
pub fn release(&self) -> Result<()> {
unsafe { FMOD_Geometry_Release(self.inner.as_ptr()).to_result() }
}
pub fn save(&self) -> Result<Vec<u8>> {
let mut data_size = 0;
unsafe {
FMOD_Geometry_Save(
self.inner.as_ptr(),
std::ptr::null_mut(),
&raw mut data_size,
)
.to_result()?;
}
let mut data = vec![0; data_size as usize];
unsafe {
FMOD_Geometry_Save(
self.inner.as_ptr(),
data.as_mut_ptr().cast(),
&raw mut data_size,
)
.to_result()?;
}
Ok(data)
}
}