1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::{
c::{spSkeletonData, spSkin, spSkin_getAttachments},
c_interface::{CTmpMut, CTmpRef, NewFromPtr, SyncPtr},
Attachment, Skeleton, SkeletonData,
};
#[derive(Debug)]
pub struct Skin {
c_skin: SyncPtr<spSkin>,
}
impl NewFromPtr<spSkin> for Skin {
unsafe fn new_from_ptr(c_skin: *const spSkin) -> Self {
Self {
c_skin: SyncPtr(c_skin as *mut spSkin),
}
}
}
impl Skin {
pub fn attachments(&self) -> Vec<AttachmentEntry> {
let mut attachments = vec![];
unsafe {
let mut entry = spSkin_getAttachments(self.c_ptr());
while !entry.is_null() {
attachments.push(AttachmentEntry {
slot_index: (*entry).slotIndex,
attachment: Attachment::new_from_ptr((*entry).attachment),
});
entry = (*entry).next;
}
}
attachments
}
c_accessor_string!(name, name);
c_ptr!(c_skin, spSkin);
}
c_handle_decl!(SkinHandle, Skin, SkeletonData, spSkin, spSkeletonData);
impl<'a> CTmpRef<'a, SkeletonData, Skin> {
pub fn handle(&self) -> SkinHandle {
SkinHandle::new(self.c_ptr(), self.parent.c_ptr())
}
}
impl<'a> CTmpMut<'a, SkeletonData, Skin> {
pub fn handle(&self) -> SkinHandle {
SkinHandle::new(self.c_ptr(), self.parent.c_ptr())
}
}
impl<'a> CTmpRef<'a, Skeleton, Skin> {
pub fn handle(&self) -> SkinHandle {
SkinHandle::new(self.c_ptr(), unsafe { self.parent.c_ptr_mut().data })
}
}
impl<'a> CTmpMut<'a, Skeleton, Skin> {
pub fn handle(&self) -> SkinHandle {
SkinHandle::new(self.c_ptr(), unsafe { self.parent.c_ptr_mut().data })
}
}
pub struct AttachmentEntry {
pub slot_index: i32,
pub attachment: Attachment,
}