1use ffi;
26use types::*;
27use vector;
28use libc::{c_int, c_void};
29use fmod_sys;
30use fmod_sys::MemoryUsageDetails;
31use std::mem::transmute;
32use std::default::Default;
33
34pub struct Geometry {
36 geometry: *mut ffi::FMOD_GEOMETRY
37}
38
39impl ffi::FFI<ffi::FMOD_GEOMETRY> for Geometry {
40 fn wrap(g: *mut ffi::FMOD_GEOMETRY) -> Geometry {
41 Geometry {geometry: g}
42 }
43
44 fn unwrap(g: &Geometry) -> *mut ffi::FMOD_GEOMETRY {
45 g.geometry
46 }
47}
48
49impl Drop for Geometry {
50 fn drop(&mut self) {
51 self.release();
52 }
53}
54
55impl Geometry {
56 pub fn release(&mut self) -> ::Status {
57 if self.geometry !=::std::ptr::null_mut() {
58 match unsafe { ffi::FMOD_Geometry_Release(self.geometry) } {
59 ::Status::Ok => {
60 self.geometry = ::std::ptr::null_mut();
61 ::Status::Ok
62 }
63 e => e,
64 }
65 } else {
66 ::Status::Ok
67 }
68 }
69
70 pub fn add_polygon(&self, direct_occlusion: f32, reverb_occlusion: f32, double_sided: bool,
71 vertices: Vec<vector::Vector>) -> Result<i32, ::Status> {
72 let t_double_sided = if double_sided == true {
73 1
74 } else {
75 0
76 };
77 let mut index = 0i32;
78 let t_vertices = Vec::with_capacity(vertices.len());
79
80 for tmp in vertices.iter() {
81 vector::get_ffi(tmp);
82 }
83
84 match unsafe { ffi::FMOD_Geometry_AddPolygon(self.geometry, direct_occlusion,
85 reverb_occlusion, t_double_sided,
86 vertices.len() as c_int, t_vertices.as_ptr(),
87 &mut index) } {
88 ::Status::Ok => Ok(index),
89 e => Err(e),
90 }
91 }
92
93 pub fn get_num_polygons(&self) -> Result<i32, ::Status> {
94 let mut num = 0i32;
95
96 match unsafe { ffi::FMOD_Geometry_GetNumPolygons(self.geometry, &mut num) } {
97 ::Status::Ok => Ok(num),
98 e => Err(e)
99 }
100 }
101
102 pub fn get_max_polygons(&self) -> Result<(i32, i32), ::Status> {
103 let mut max_polygons = 0i32;
104 let mut max_vertices = 0i32;
105
106 match unsafe { ffi::FMOD_Geometry_GetMaxPolygons(self.geometry, &mut max_polygons,
107 &mut max_vertices) } {
108 ::Status::Ok => Ok((max_polygons, max_vertices)),
109 e => Err(e),
110 }
111 }
112
113 pub fn get_polygon_num_vertices(&self, index: i32) -> Result<i32, ::Status> {
114 let mut num = 0i32;
115
116 match unsafe { ffi::FMOD_Geometry_GetPolygonNumVertices(self.geometry, index, &mut num) } {
117 ::Status::Ok => Ok(num),
118 e => Err(e),
119 }
120 }
121
122 pub fn set_polygon_vertex(&self, index: i32, vertex_index: i32,
123 vertex: vector::Vector) -> ::Status {
124 let t_vertex = vector::get_ffi(&vertex);
125
126 unsafe { ffi::FMOD_Geometry_SetPolygonVertex(self.geometry, index, vertex_index,
127 &t_vertex) }
128 }
129
130 pub fn get_polygon_vertex(&self, index: i32,
131 vertex_index: i32) -> Result<vector::Vector, ::Status> {
132 let mut vertex = vector::get_ffi(&vector::Vector::new());
133
134 match unsafe { ffi::FMOD_Geometry_GetPolygonVertex(self.geometry, index, vertex_index,
135 &mut vertex) } {
136 ::Status::Ok => Ok(vector::from_ptr(vertex)),
137 e => Err(e),
138 }
139 }
140
141 pub fn set_polygon_attributes(&self, index: i32, direct_occlusion: f32, reverb_occlusion: f32,
142 double_sided: bool) -> ::Status {
143 let t_double_sided = if double_sided == true {
144 1
145 } else {
146 0
147 };
148
149 unsafe { ffi::FMOD_Geometry_SetPolygonAttributes(self.geometry, index, direct_occlusion,
150 reverb_occlusion, t_double_sided) }
151 }
152
153 pub fn get_polygon_attributes(&self, index: i32) -> Result<(f32, f32, bool), ::Status> {
157 let mut direct_occlusion = 0f32;
158 let mut reverb_occlusion = 0f32;
159 let mut double_sided = 0;
160
161 match unsafe { ffi::FMOD_Geometry_GetPolygonAttributes(self.geometry, index,
162 &mut direct_occlusion,
163 &mut reverb_occlusion,
164 &mut double_sided) } {
165 ::Status::Ok => Ok((direct_occlusion, reverb_occlusion, double_sided == 1)),
166 e => Err(e),
167 }
168 }
169
170 pub fn set_active(&self, active: bool) -> ::Status {
171 let t_active = if active == true {
172 1
173 } else {
174 0
175 };
176
177 unsafe { ffi::FMOD_Geometry_SetActive(self.geometry, t_active) }
178 }
179
180 pub fn get_active(&self) -> Result<bool, ::Status> {
181 let mut active = 0;
182
183 match unsafe { ffi::FMOD_Geometry_GetActive(self.geometry, &mut active) } {
184 ::Status::Ok => Ok(active == 1),
185 e => Err(e)
186 }
187 }
188
189 pub fn set_rotation(&self, forward: vector::Vector, up: vector::Vector) -> ::Status {
190 let t_forward = vector::get_ffi(&forward);
191 let t_up = vector::get_ffi(&up);
192
193 unsafe { ffi::FMOD_Geometry_SetRotation(self.geometry, &t_forward, &t_up) }
194 }
195
196 pub fn get_rotation(&self) -> Result<(vector::Vector, vector::Vector), ::Status> {
200 let mut forward = vector::get_ffi(&vector::Vector::new());
201 let mut up = vector::get_ffi(&vector::Vector::new());
202
203 match unsafe { ffi::FMOD_Geometry_GetRotation(self.geometry, &mut forward, &mut up) } {
204 ::Status::Ok => Ok((vector::from_ptr(forward), vector::from_ptr(up))),
205 e => Err(e)
206 }
207 }
208
209 pub fn set_position(&self, position: vector::Vector) -> ::Status {
210 let t_position = vector::get_ffi(&position);
211
212 unsafe { ffi::FMOD_Geometry_SetPosition(self.geometry, &t_position) }
213 }
214
215 pub fn get_position(&self) -> Result<vector::Vector, ::Status> {
216 let mut position = vector::get_ffi(&vector::Vector::new());
217
218 match unsafe { ffi::FMOD_Geometry_GetPosition(self.geometry, &mut position) } {
219 ::Status::Ok => Ok(vector::from_ptr(position)),
220 e => Err(e)
221 }
222 }
223
224 pub fn set_scale(&self, scale: vector::Vector) -> ::Status {
225 let t_scale = vector::get_ffi(&scale);
226
227 unsafe { ffi::FMOD_Geometry_SetScale(self.geometry, &t_scale) }
228 }
229
230 pub fn get_scale(&self) -> Result<vector::Vector, ::Status> {
231 let mut scale = vector::get_ffi(&vector::Vector::new());
232
233 match unsafe { ffi::FMOD_Geometry_GetScale(self.geometry, &mut scale) } {
234 ::Status::Ok => Ok(vector::from_ptr(scale)),
235 e => Err(e)
236 }
237 }
238
239 pub fn get_memory_info(&self, MemoryBits(memory_bits): MemoryBits,
243 EventMemoryBits(event_memory_bits): EventMemoryBits)
244 -> Result<(u32, MemoryUsageDetails), ::Status> {
245 let mut details = fmod_sys::get_memory_usage_details_ffi(Default::default());
246 let mut memory_used = 0u32;
247
248 match unsafe { ffi::FMOD_Geometry_GetMemoryInfo(self.geometry, memory_bits, event_memory_bits, &mut memory_used, &mut details) } {
249 ::Status::Ok => Ok((memory_used, fmod_sys::from_memory_usage_details_ptr(details))),
250 e => Err(e)
251 }
252 }
253
254 pub fn set_user_data<'r, T>(&'r self, user_data: &'r mut T) -> ::Status {
255 unsafe { ffi::FMOD_Geometry_SetUserData(self.geometry, transmute(user_data)) }
256 }
257
258 pub fn get_user_data<'r, T>(&'r self) -> Result<&'r mut T, ::Status> {
259 unsafe {
260 let mut user_data : *mut c_void = ::std::ptr::null_mut();
261
262 match ffi::FMOD_Geometry_GetUserData(self.geometry, &mut user_data) {
263 ::Status::Ok => {
264 let tmp : &mut T = transmute::<*mut c_void, &mut T>(user_data);
265
266 Ok(tmp)
267 },
268 e => Err(e)
269 }
270 }
271 }
272}