1use crate::attribute::{array::DataArray, AttribAccess, JobId};
2use crate::ffi::raw;
3use crate::ffi::raw::StorageType;
4use crate::ffi::AttributeInfo;
5use crate::{node::HoudiniNode, Result};
6use duplicate::duplicate_item;
7use std::ffi::CStr;
8
9#[duplicate_item(
10[
11_val_type [u8]
12_storage [StorageType::Uint8]
13_storage_array [StorageType::Uint8Array]
14_get [HAPI_GetAttributeUInt8Data]
15_get_async [HAPI_GetAttributeUInt8DataAsync]
16_get_array [HAPI_GetAttributeUInt8ArrayData]
17_get_array_async [HAPI_GetAttributeUInt8ArrayDataAsync]
18_set [HAPI_SetAttributeUInt8Data]
19_set_async [HAPI_SetAttributeUInt8DataAsync]
20_set_unique [HAPI_SetAttributeUInt8UniqueData]
21_set_unique_async [HAPI_SetAttributeUInt8UniqueDataAsync]
22_set_array [HAPI_SetAttributeUInt8ArrayData]
23_set_array_async [HAPI_SetAttributeUInt8ArrayDataAsync]
24]
25[
26_val_type [i8]
27_storage [StorageType::Int8]
28_storage_array [StorageType::Int8Array]
29_get [HAPI_GetAttributeInt8Data]
30_get_async [HAPI_GetAttributeInt8DataAsync]
31_get_array [HAPI_GetAttributeInt8ArrayData]
32_get_array_async [HAPI_GetAttributeInt8ArrayDataAsync]
33_set [HAPI_SetAttributeInt8Data]
34_set_async [HAPI_SetAttributeInt8DataAsync]
35_set_unique [HAPI_SetAttributeInt8UniqueData]
36_set_unique_async [HAPI_SetAttributeInt8UniqueDataAsync]
37_set_array [HAPI_SetAttributeInt8ArrayData]
38_set_array_async [HAPI_SetAttributeInt8ArrayDataAsync]
39]
40[
41_val_type [i16]
42_storage [StorageType::Int16]
43_storage_array [StorageType::Int16Array]
44_get [HAPI_GetAttributeInt16Data]
45_get_async [HAPI_GetAttributeInt16DataAsync]
46_get_array [HAPI_GetAttributeInt16ArrayData]
47_get_array_async [HAPI_GetAttributeInt16ArrayDataAsync]
48
49_set [HAPI_SetAttributeInt16Data]
50_set_async [HAPI_SetAttributeInt16DataAsync]
51_set_unique [HAPI_SetAttributeInt16UniqueData]
52_set_unique_async [HAPI_SetAttributeInt16UniqueDataAsync]
53_set_array [HAPI_SetAttributeInt16ArrayData]
54_set_array_async [HAPI_SetAttributeInt16ArrayDataAsync]
55]
56[
57_val_type [i32]
58_storage [StorageType::Int]
59_storage_array [StorageType::IntArray]
60_get [HAPI_GetAttributeIntData]
61_get_async [HAPI_GetAttributeIntDataAsync]
62_get_array [HAPI_GetAttributeIntArrayData]
63_get_array_async [HAPI_GetAttributeIntArrayDataAsync]
64
65_set [HAPI_SetAttributeIntData]
66_set_async [HAPI_SetAttributeIntDataAsync]
67_set_unique [HAPI_SetAttributeIntUniqueData]
68_set_unique_async [HAPI_SetAttributeIntUniqueDataAsync]
69_set_array [HAPI_SetAttributeIntArrayData]
70_set_array_async [HAPI_SetAttributeIntArrayDataAsync]
71]
72[
73_val_type [i64]
74_storage [StorageType::Int64]
75_storage_array [StorageType::Int64Array]
76_get [HAPI_GetAttributeInt64Data]
77_get_async [HAPI_GetAttributeInt64DataAsync]
78_get_array [HAPI_GetAttributeInt64ArrayData]
79_get_array_async [HAPI_GetAttributeInt64ArrayDataAsync]
80_set [HAPI_SetAttributeInt64Data]
81_set_async [HAPI_SetAttributeInt64DataAsync]
82_set_unique [HAPI_SetAttributeInt64UniqueData]
83_set_unique_async [HAPI_SetAttributeInt64UniqueDataAsync]
84_set_array [HAPI_SetAttributeInt64ArrayData]
85_set_array_async [HAPI_SetAttributeInt64ArrayDataAsync]
86]
87[
88_val_type [f32]
89_storage [StorageType::Float]
90_storage_array [StorageType::FloatArray]
91_get [HAPI_GetAttributeFloatData]
92_get_async [HAPI_GetAttributeFloatDataAsync]
93_get_array [HAPI_GetAttributeFloatArrayData]
94_get_array_async [HAPI_GetAttributeFloatArrayDataAsync]
95_set [HAPI_SetAttributeFloatData]
96_set_async [HAPI_SetAttributeFloatDataAsync]
97_set_unique [HAPI_SetAttributeFloatUniqueData]
98_set_unique_async [HAPI_SetAttributeFloatUniqueDataAsync]
99_set_array [HAPI_SetAttributeFloatArrayData]
100_set_array_async [HAPI_SetAttributeFloatArrayDataAsync]
101]
102[
103_val_type [f64]
104_storage [StorageType::Float64]
105_storage_array [StorageType::Float64Array]
106_get [HAPI_GetAttributeFloat64Data]
107_get_async [HAPI_GetAttributeFloat64DataAsync]
108_get_array [HAPI_GetAttributeFloat64ArrayData]
109_get_array_async [HAPI_GetAttributeFloat64ArrayDataAsync]
110_set [HAPI_SetAttributeFloat64Data]
111_set_async [HAPI_SetAttributeFloat64DataAsync]
112_set_unique [HAPI_SetAttributeFloat64UniqueData]
113_set_unique_async [HAPI_SetAttributeFloat64UniqueDataAsync]
114_set_array [HAPI_SetAttributeFloat64ArrayData]
115_set_array_async [HAPI_SetAttributeFloat64ArrayDataAsync]
116]
117)]
118impl AttribAccess for _val_type {
119 fn storage() -> StorageType {
120 _storage
121 }
122 fn storage_array() -> StorageType {
123 _storage_array
124 }
125 fn get(
126 name: &CStr,
127 node: &HoudiniNode,
128 info: &AttributeInfo,
129 part: i32,
130 buffer: &mut Vec<Self>,
131 ) -> Result<()> {
132 debug_assert!(node.is_valid()?);
133 buffer.resize(
134 (info.0.count * info.0.tupleSize) as usize,
135 _val_type::default(),
136 );
137 unsafe {
138 raw::_get(
139 node.session.ptr(),
140 node.handle.0,
141 part,
142 name.as_ptr(),
143 info.ptr() as *mut _,
144 -1,
145 buffer.as_mut_ptr(),
146 0,
147 info.0.count,
148 )
149 .check_err(&node.session, || stringify!(Calling _get))
150 }
151 }
152 fn get_async(
153 name: &CStr,
154 node: &HoudiniNode,
155 info: &AttributeInfo,
156 part: i32,
157 buffer: &mut Vec<Self>,
158 ) -> Result<JobId> {
159 debug_assert!(node.is_valid()?);
160 debug_assert!(buffer.capacity() >= (info.0.count * info.0.tupleSize) as usize);
162 let mut job_id: i32 = -1;
163 unsafe {
164 raw::_get_async(
165 node.session.ptr(),
166 node.handle.0,
167 part,
168 name.as_ptr(),
169 info.ptr() as *mut _,
170 -1,
171 buffer.as_mut_ptr(),
172 0,
173 info.0.count,
174 &mut job_id as *mut _,
175 )
176 .check_err(&node.session, || stringify!(Calling _get_async))?;
177 Ok(job_id)
178 }
179 }
180 fn set(
181 name: &CStr,
182 node: &HoudiniNode,
183 info: &AttributeInfo,
184 part: i32,
185 data: &[_val_type],
186 start: i32,
187 len: i32,
188 ) -> Result<()> {
189 unsafe {
190 debug_assert!(node.is_valid()?);
191 raw::_set(
192 node.session.ptr(),
193 node.handle.0,
194 part,
195 name.as_ptr(),
196 info.ptr(),
197 data.as_ptr(),
198 start,
199 len,
200 )
201 .check_err(&node.session, || stringify!(Calling _set))
202 }
203 }
204
205 fn set_async(
206 name: &CStr,
207 node: &HoudiniNode,
208 info: &AttributeInfo,
209 part: i32,
210 data: &[_val_type],
211 start: i32,
212 len: i32,
213 ) -> Result<JobId> {
214 debug_assert!(node.is_valid()?);
215 let mut job_id: i32 = -1;
216 unsafe {
217 raw::_set_async(
218 node.session.ptr(),
219 node.handle.0,
220 part,
221 name.as_ptr(),
222 info.ptr(),
223 data.as_ptr(),
224 start,
225 len,
226 &mut job_id as *mut _,
227 )
228 .check_err(&node.session, || stringify!(Calling _set_async))?;
229 }
230 Ok(job_id)
231 }
232
233 fn set_unique(
234 name: &CStr,
235 node: &HoudiniNode,
236 info: &AttributeInfo,
237 part_id: i32,
238 data: &[_val_type],
239 start: i32,
240 ) -> Result<()> {
241 unsafe {
242 raw::_set_unique(
243 node.session.ptr(),
244 node.handle.0,
245 part_id,
246 name.as_ptr(),
247 info.ptr(),
248 data.as_ptr(),
249 info.0.tupleSize,
250 start,
251 info.0.count,
252 )
253 .check_err(&node.session, || stringify!(Calling _set_unique))
254 }
255 }
256
257 fn set_unique_async(
258 name: &CStr,
259 node: &HoudiniNode,
260 info: &AttributeInfo,
261 part_id: i32,
262 data: &[_val_type],
263 start: i32,
264 ) -> Result<JobId> {
265 let mut job_id: i32 = -1;
266 unsafe {
267 raw::_set_unique_async(
268 node.session.ptr(),
269 node.handle.0,
270 part_id,
271 name.as_ptr(),
272 info.ptr(),
273 data.as_ptr(),
274 info.0.tupleSize,
275 start,
276 info.0.count,
277 &mut job_id as *mut _,
278 )
279 .check_err(&node.session, || stringify!(Calling _set_unique_async))?;
280 }
281
282 Ok(job_id)
283 }
284 fn get_array(
285 name: &CStr,
286 node: &HoudiniNode,
287 info: &AttributeInfo,
288 part: i32,
289 ) -> Result<DataArray<'static, Self>>
290 where
291 [Self]: ToOwned<Owned = Vec<Self>>,
292 {
293 debug_assert!(node.is_valid()?);
294 let mut data = vec![_val_type::default(); info.0.totalArrayElements as usize];
295 let mut sizes = vec![0; info.0.count as usize];
296 unsafe {
297 raw::_get_array(
298 node.session.ptr(),
299 node.handle.0,
300 part,
301 name.as_ptr(),
302 &info.0 as *const _ as *mut _,
303 data.as_mut_ptr(),
304 info.0.totalArrayElements as i32,
305 sizes.as_mut_ptr(),
306 0,
307 info.0.count,
308 )
309 .check_err(&node.session, || stringify!(Calling _get_array))?;
310 }
311
312 Ok(DataArray::new_owned(data, sizes))
313 }
314
315 fn get_array_async(
316 name: &CStr,
317 node: &HoudiniNode,
318 info: &AttributeInfo,
319 data: &mut [Self],
320 sizes: &mut [i32],
321 part: i32,
322 ) -> Result<JobId> {
323 let mut job_id: i32 = -1;
324 unsafe {
325 raw::_get_array_async(
326 node.session.ptr(), node.handle.0, part, name.as_ptr(), info.ptr() as *mut _, data.as_mut_ptr(), info.total_array_elements() as i32, sizes.as_mut_ptr(), 0, info.count(), &mut job_id as *mut _, )
338 .check_err(&node.session, || stringify!(Calling _get_array_async))?;
339 }
340 Ok(job_id)
341 }
342 fn set_array(
343 name: &CStr,
344 node: &HoudiniNode,
345 info: &AttributeInfo,
346 part: i32,
347 data: &[_val_type],
348 sizes: &[i32],
349 ) -> Result<()>
350 where
351 [Self]: ToOwned<Owned = Vec<Self>>,
352 {
353 debug_assert!(node.is_valid()?);
354 unsafe {
355 raw::_set_array(
356 node.session.ptr(),
357 node.handle.0,
358 part,
359 name.as_ptr(),
360 &info.0,
361 data.as_ptr(),
362 info.0.totalArrayElements as i32,
363 sizes.as_ptr(),
364 0,
365 info.0.count,
366 )
367 .check_err(&node.session, || stringify!(Calling _set_array))?;
368 }
369
370 Ok(())
371 }
372
373 fn set_array_async(
374 name: &CStr,
375 node: &HoudiniNode,
376 info: &AttributeInfo,
377 part: i32,
378 data: &[_val_type],
379 sizes: &[i32],
380 ) -> Result<JobId> {
381 let mut job_id: i32 = -1;
382 unsafe {
383 raw::_set_array_async(
384 node.session.ptr(),
385 node.handle.0,
386 part,
387 name.as_ptr(),
388 &info.0,
389 data.as_ptr(),
390 info.0.totalArrayElements as i32,
391 sizes.as_ptr(),
392 0,
393 info.0.count,
394 &mut job_id as *mut _,
395 )
396 .check_err(&node.session, || stringify!(Calling set_array_async))?;
397 }
398
399 Ok(job_id)
400 }
401}