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 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(), node.handle.0, part, name.as_ptr(), info.ptr().cast_mut(), data.as_mut_ptr(), i64_to_i32_clamped(info.total_array_elements()), sizes.as_mut_ptr(), 0, info.count(), &raw mut job_id, )
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}