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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use std::sync::Arc;
use crate::{
animation::Animation,
bone::BoneData,
c::{spAnimation, spBoneData, spSkeletonData, spSkeletonData_dispose, spSkin, spSlotData},
c_interface::{NewFromPtr, SyncPtr},
skin::Skin,
slot::SlotData,
Atlas,
};
#[derive(Debug)]
pub struct SkeletonData {
c_skeleton_data: SyncPtr<spSkeletonData>,
owns_memory: bool,
_atlas: Option<Arc<Atlas>>,
}
impl NewFromPtr<spSkeletonData> for SkeletonData {
unsafe fn new_from_ptr(c_skeleton_data: *const spSkeletonData) -> Self {
Self {
c_skeleton_data: SyncPtr(c_skeleton_data as *mut spSkeletonData),
owns_memory: false,
_atlas: None,
}
}
}
impl SkeletonData {
pub(crate) fn new(c_skeleton_data: *mut spSkeletonData, atlas: Option<Arc<Atlas>>) -> Self {
Self {
c_skeleton_data: SyncPtr(c_skeleton_data),
owns_memory: true,
_atlas: atlas,
}
}
c_accessor_string!(version, version);
c_accessor_string!(hash, hash);
c_accessor_string!(images_path, imagesPath);
c_accessor_string!(audio_path, audioPath);
c_accessor!(x, x, f32);
c_accessor!(y, y, f32);
c_accessor!(width, width, f32);
c_accessor!(height, height, f32);
c_accessor!(bones_count, bonesCount, i32);
c_accessor!(slots_count, slotsCount, i32);
c_accessor!(skins_count, skinsCount, i32);
c_accessor!(events_count, eventsCount, i32);
c_accessor!(animations_count, animationsCount, i32);
c_accessor!(ik_constraints_count, ikConstraintsCount, i32);
c_accessor!(transform_constraints_count, transformConstraintsCount, i32);
c_accessor!(path_constraints_count, pathConstraintsCount, i32);
c_accessor_array!(
bones,
bones_mut,
bone_at_index,
bone_at_index_mut,
SkeletonData,
BoneData,
spBoneData,
bones,
bones_count
);
c_accessor_array!(
slots,
slots_mut,
slot_at_index,
slot_at_index_mut,
SkeletonData,
SlotData,
spSlotData,
slots,
slots_count
);
c_accessor_array!(
skins,
skins_mut,
skin_at_index,
skin_at_index_mut,
SkeletonData,
Skin,
spSkin,
skins,
skins_count
);
c_accessor_tmp_ptr!(default_skin, default_skin_mut, defaultSkin, Skin, spSkin);
c_accessor_array!(
animations,
animations_mut,
animation_at_index,
animation_at_index_mut,
SkeletonData,
Animation,
spAnimation,
animations,
animations_count
);
c_ptr!(c_skeleton_data, spSkeletonData);
}
impl Drop for SkeletonData {
fn drop(&mut self) {
if self.owns_memory {
unsafe {
spSkeletonData_dispose(self.c_skeleton_data.0);
}
}
}
}