aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorAndre Weissflog <floooh@gmail.com>2022-09-27 19:19:01 +0200
committerAndre Weissflog <floooh@gmail.com>2022-09-27 19:19:01 +0200
commit3bcb8f43fa2ec52772cd595ba4482ee2d8d7513b (patch)
treeab41805909fc597c5e8f9d2a4962289d36b24525 /util
parentddf9aa88652dec934ba3a37bd9d2028d2fdeebc2 (diff)
sokol_spine.h: add sspine_set_skin() function
Diffstat (limited to 'util')
-rw-r--r--util/sokol_spine.h22
1 files changed, 21 insertions, 1 deletions
diff --git a/util/sokol_spine.h b/util/sokol_spine.h
index ffb8571a..56427164 100644
--- a/util/sokol_spine.h
+++ b/util/sokol_spine.h
@@ -432,6 +432,7 @@ SOKOL_SPINE_API_DECL int sspine_find_skin_index(sspine_skeleton skeleton, const
SOKOL_SPINE_API_DECL bool sspine_skin_index_valid(sspine_skeleton skeleton, int skin_index);
SOKOL_SPINE_API_DECL int sspine_num_skins(sspine_skeleton skeleton);
SOKOL_SPINE_API_DECL sspine_skin_info sspine_get_skin_info(sspine_skeleton skeleton, int skin_index);
+SOKOL_SPINE_API_DECL void sspine_set_skin(sspine_instance instance, int skin_index);
#ifdef __cplusplus
} // extern "C"
@@ -1607,7 +1608,7 @@ typedef struct {
_sspine_slot_t slot;
_sspine_atlas_ref_t atlas;
_sspine_skeleton_ref_t skel;
- _sspine_skinset_ref_t skin;
+ _sspine_skinset_ref_t skinset;
spSkeleton* sp_skel;
spAnimationState* sp_anim_state;
spSkeletonClipping* sp_clip;
@@ -4269,5 +4270,24 @@ SOKOL_API_IMPL sspine_skin_info sspine_get_skin_info(sspine_skeleton skeleton_id
return res;
}
+SOKOL_SPINE_API_DECL void sspine_set_skin(sspine_instance instance_id, int skin_index) {
+ SOKOL_ASSERT(_SSPINE_INIT_COOKIE == _sspine.init_cookie);
+ _sspine_instance_t* instance = _sspine_lookup_instance(instance_id.id);
+ if (_sspine_instance_and_deps_valid(instance)) {
+ SOKOL_ASSERT(instance->sp_skel);
+ SOKOL_ASSERT(instance->sp_anim_state);
+ // clear any currently set skinset
+ instance->skinset.id = SSPINE_INVALID_ID;
+ instance->skinset.ptr = 0;
+ spSkin* sp_skin = _sspine_lookup_skin(instance->skel.id, skin_index);
+ if (sp_skin) {
+ spSkeleton_setSkin(instance->sp_skel, 0);
+ spSkeleton_setSkin(instance->sp_skel, sp_skin);
+ spSkeleton_setSlotsToSetupPose(instance->sp_skel);
+ spAnimationState_apply(instance->sp_anim_state, instance->sp_skel);
+ }
+ }
+}
+
#endif // SOKOL_SPINE_IMPL
#endif // SOKOL_SPINE_INCLUDED