hapi_rs/attribute/bindings/
numeric.rs

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        // buffer capacity mut be of an appropriate size
161        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(),                 // 	const HAPI_Session * 	session,
327                node.handle.0,                      // HAPI_NodeId 	node_id,
328                part,                               // HAPI_PartId 	part_id,
329                name.as_ptr(),                      // const char * 	attr_name,
330                info.ptr() as *mut _,               // HAPI_AttributeInfo * 	attr_info,
331                data.as_mut_ptr(),                  // HAPI_UInt8 * 	data_fixed_array,
332                info.total_array_elements() as i32, // int 	data_fixed_length,
333                sizes.as_mut_ptr(),                 // int * 	sizes_fixed_array,
334                0,                                  // int 	start,
335                info.count(),                       // int 	sizes_fixed_length,
336                &mut job_id as *mut _,              // int * 	job_id
337            )
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}