Skip to main content

hapi_rs/attribute/bindings/
numeric.rs

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