[ue] Port to new spine-cpp API

This commit is contained in:
Mario Zechner 2025-09-10 12:45:17 +02:00
parent b5d6f1e427
commit b33e13f985
6 changed files with 88 additions and 89 deletions

View File

@ -81,11 +81,10 @@ void SSpineWidget::SetData(USpineWidget *Widget) {
this->widget = Widget;
if (widget && widget->skeleton && widget->Atlas) {
Skeleton *skeleton = widget->skeleton;
skeleton->setToSetupPose();
skeleton->setupPose();
skeleton->updateWorldTransform(Physics_None);
Vector<float> scratchBuffer;
float x, y, w, h;
skeleton->getBounds(x, y, w, h, scratchBuffer);
skeleton->getBounds(x, y, w, h);
boundsMin.X = x;
boundsMin.Y = y;
boundsSize.X = w;
@ -271,13 +270,13 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
UMaterialInstanceDynamic *lastMaterial = nullptr;
SkeletonClipping &clipper = widget->clipper;
Vector<float> &worldVertices = widget->worldVertices;
Array<float> &worldVertices = widget->worldVertices;
float depthOffset = 0;
unsigned short quadIndices[] = {0, 1, 2, 0, 2, 3};
for (int i = 0; i < (int) Skeleton->getSlots().size(); ++i) {
Vector<float> *attachmentVertices = &worldVertices;
Array<float> *attachmentVertices = &worldVertices;
unsigned short *attachmentIndices = nullptr;
int numVertices;
int numIndices;
@ -292,7 +291,7 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
continue;
}
Attachment *attachment = slot->getAttachment();
Attachment *attachment = slot->getAppliedPose().getAttachment();
if (!attachment) {
clipper.clipEnd(*slot);
continue;
@ -317,7 +316,7 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
MeshAttachment *mesh = (MeshAttachment *) attachment;
attachmentColor.set(mesh->getColor());
attachmentVertices->setSize(mesh->getWorldVerticesLength(), 0);
mesh->computeWorldVertices(*slot, 0, mesh->getWorldVerticesLength(), attachmentVertices->buffer(), 0, 2);
mesh->computeWorldVertices(*Skeleton, *slot, 0, mesh->getWorldVerticesLength(), attachmentVertices->buffer(), 0, 2);
attachmentAtlasRegion = (AtlasRegion *) mesh->getRegion();
attachmentIndices = mesh->getTriangles().buffer();
attachmentUvs = mesh->getUVs().buffer();
@ -325,7 +324,7 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
numIndices = mesh->getTriangles().size();
} else /* clipping */ {
ClippingAttachment *clip = (ClippingAttachment *) attachment;
clipper.clipStart(*slot, clip);
clipper.clipStart(*Skeleton, *slot, clip);
continue;
}
@ -335,39 +334,39 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
UMaterialInstanceDynamic *material = nullptr;
switch (slot->getData().getBlendMode()) {
case BlendMode_Normal:
if (!widget->pageToNormalBlendMaterial.Contains(attachmentAtlasRegion->page)) {
if (!widget->pageToNormalBlendMaterial.Contains(attachmentAtlasRegion->getPage())) {
clipper.clipEnd(*slot);
continue;
}
material = widget->pageToNormalBlendMaterial[attachmentAtlasRegion->page];
material = widget->pageToNormalBlendMaterial[attachmentAtlasRegion->getPage()];
break;
case BlendMode_Additive:
if (!widget->pageToAdditiveBlendMaterial.Contains(attachmentAtlasRegion->page)) {
if (!widget->pageToAdditiveBlendMaterial.Contains(attachmentAtlasRegion->getPage())) {
clipper.clipEnd(*slot);
continue;
}
material = widget->pageToAdditiveBlendMaterial[attachmentAtlasRegion->page];
material = widget->pageToAdditiveBlendMaterial[attachmentAtlasRegion->getPage()];
break;
case BlendMode_Multiply:
if (!widget->pageToMultiplyBlendMaterial.Contains(attachmentAtlasRegion->page)) {
if (!widget->pageToMultiplyBlendMaterial.Contains(attachmentAtlasRegion->getPage())) {
clipper.clipEnd(*slot);
continue;
}
material = widget->pageToMultiplyBlendMaterial[attachmentAtlasRegion->page];
material = widget->pageToMultiplyBlendMaterial[attachmentAtlasRegion->getPage()];
break;
case BlendMode_Screen:
if (!widget->pageToScreenBlendMaterial.Contains(attachmentAtlasRegion->page)) {
if (!widget->pageToScreenBlendMaterial.Contains(attachmentAtlasRegion->getPage())) {
clipper.clipEnd(*slot);
continue;
}
material = widget->pageToScreenBlendMaterial[attachmentAtlasRegion->page];
material = widget->pageToScreenBlendMaterial[attachmentAtlasRegion->getPage()];
break;
default:
if (!widget->pageToNormalBlendMaterial.Contains(attachmentAtlasRegion->page)) {
if (!widget->pageToNormalBlendMaterial.Contains(attachmentAtlasRegion->getPage())) {
clipper.clipEnd(*slot);
continue;
}
material = widget->pageToNormalBlendMaterial[attachmentAtlasRegion->page];
material = widget->pageToNormalBlendMaterial[attachmentAtlasRegion->getPage()];
}
if (clipper.isClipping()) {
@ -389,14 +388,14 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
idx = 0;
}
uint8 r = static_cast<uint8>(Skeleton->getColor().r * slot->getColor().r * attachmentColor.r * 255);
uint8 g = static_cast<uint8>(Skeleton->getColor().g * slot->getColor().g * attachmentColor.g * 255);
uint8 b = static_cast<uint8>(Skeleton->getColor().b * slot->getColor().b * attachmentColor.b * 255);
uint8 a = static_cast<uint8>(Skeleton->getColor().a * slot->getColor().a * attachmentColor.a * 255);
uint8 r = static_cast<uint8>(Skeleton->getColor().r * slot->getAppliedPose().getColor().r * attachmentColor.r * 255);
uint8 g = static_cast<uint8>(Skeleton->getColor().g * slot->getAppliedPose().getColor().g * attachmentColor.g * 255);
uint8 b = static_cast<uint8>(Skeleton->getColor().b * slot->getAppliedPose().getColor().b * attachmentColor.b * 255);
uint8 a = static_cast<uint8>(Skeleton->getColor().a * slot->getAppliedPose().getColor().a * attachmentColor.a * 255);
float dr = slot->hasDarkColor() ? slot->getDarkColor().r : 0.0f;
float dg = slot->hasDarkColor() ? slot->getDarkColor().g : 0.0f;
float db = slot->hasDarkColor() ? slot->getDarkColor().b : 0.0f;
float dr = slot->getAppliedPose().hasDarkColor() ? slot->getAppliedPose().getDarkColor().r : 0.0f;
float dg = slot->getAppliedPose().hasDarkColor() ? slot->getAppliedPose().getDarkColor().g : 0.0f;
float db = slot->getAppliedPose().hasDarkColor() ? slot->getAppliedPose().getDarkColor().b : 0.0f;
float *verticesPtr = attachmentVertices->buffer();
for (int j = 0; j < numVertices << 1; j += 2) {

View File

@ -156,7 +156,7 @@ void USpineSkeletonAnimationComponent::CheckState() {
AnimationStateData *stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas());
state = new (__FILE__, __LINE__) AnimationState(*stateData);
state->setRendererObject((void *) this);
state->setListener(callback);
state->setListener(callback, nullptr);
trackEntries.Empty();
}
}
@ -227,7 +227,7 @@ UTrackEntry *USpineSkeletonAnimationComponent::SetAnimation(int trackIndex, FStr
CheckState();
if (state && skeleton->getData().findAnimation(TCHAR_TO_UTF8(*animationName))) {
state->disableQueue();
TrackEntry &entry = &state->setAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop);
TrackEntry &entry = state->setAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop);
state->enableQueue();
UTrackEntry *uEntry = NewObject<UTrackEntry>();
uEntry->SetTrackEntry(&entry);
@ -239,7 +239,7 @@ UTrackEntry *USpineSkeletonAnimationComponent::SetAnimation(int trackIndex, FStr
UTrackEntry *USpineSkeletonAnimationComponent::AddAnimation(int trackIndex, FString animationName, bool loop, float delay) {
CheckState();
if (state && skeleton->getData()->findAnimation(TCHAR_TO_UTF8(*animationName))) {
if (state && skeleton->getData().findAnimation(TCHAR_TO_UTF8(*animationName))) {
state->disableQueue();
TrackEntry &entry = state->addAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop, delay);
state->enableQueue();
@ -268,7 +268,7 @@ UTrackEntry *USpineSkeletonAnimationComponent::AddEmptyAnimation(int trackIndex,
if (state) {
TrackEntry &entry = state->addEmptyAnimation(trackIndex, mixDuration, delay);
UTrackEntry *uEntry = NewObject<UTrackEntry>();
uEntry->SetTrackEntry(entry);
uEntry->SetTrackEntry(&entry);
trackEntries.Add(uEntry);
return uEntry;
} else

View File

@ -194,7 +194,7 @@ void USpineSkeletonComponent::SetupPoseBones() {
void USpineSkeletonComponent::SetupPoseSlots() {
CheckState();
if (skeleton) skeleton->SetupPoseSlots();
if (skeleton) skeleton->setupPoseSlots();
}
void USpineSkeletonComponent::SetScaleX(float scaleX) {
@ -231,7 +231,7 @@ void USpineSkeletonComponent::GetBones(TArray<FString> &Bones) {
bool USpineSkeletonComponent::HasBone(const FString BoneName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findBone(TCHAR_TO_UTF8(*BoneName)) != nullptr;
return skeleton->getData().findBone(TCHAR_TO_UTF8(*BoneName)) != nullptr;
}
return false;
}
@ -248,7 +248,7 @@ void USpineSkeletonComponent::GetSlots(TArray<FString> &Slots) {
bool USpineSkeletonComponent::HasSlot(const FString SlotName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findSlot(TCHAR_TO_UTF8(*SlotName)) != nullptr;
return skeleton->getData().findSlot(TCHAR_TO_UTF8(*SlotName)) != nullptr;
}
return false;
}
@ -258,7 +258,7 @@ void USpineSkeletonComponent::SetSlotColor(const FString SlotName, const FColor
if (skeleton) {
Slot *slot = skeleton->findSlot(TCHAR_TO_UTF8(*SlotName));
if (slot) {
slot->getColor().set(color.R / 255.f, color.G / 255.f, color.B / 255.f, color.A / 255.f);
slot->getPose().getColor().set(color.R / 255.f, color.G / 255.f, color.B / 255.f, color.A / 255.f);
}
}
}
@ -275,7 +275,7 @@ void USpineSkeletonComponent::GetAnimations(TArray<FString> &Animations) {
bool USpineSkeletonComponent::HasAnimation(FString AnimationName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findAnimation(TCHAR_TO_UTF8(*AnimationName)) != nullptr;
return skeleton->getData().findAnimation(TCHAR_TO_UTF8(*AnimationName)) != nullptr;
}
return false;
}
@ -309,9 +309,9 @@ void USpineSkeletonComponent::PhysicsRotate(float x, float y, float degrees) {
void USpineSkeletonComponent::ResetPhysicsConstraints() {
CheckState();
if (skeleton) {
Vector<PhysicsConstraint *> &constraints = skeleton->getPhysicsConstraints();
Array<PhysicsConstraint *> &constraints = skeleton->getPhysicsConstraints();
for (int i = 0, n = (int) constraints.size(); i < n; i++) {
constraints[i]->reset();
constraints[i]->reset(*skeleton);
}
}
}
@ -346,7 +346,7 @@ void USpineSkeletonComponent::CheckState() {
if (lastSpineAtlas != atlas) {
needsUpdate = true;
}
if (skeleton && skeleton->getData() != SkeletonData->GetSkeletonData(atlas)) {
if (skeleton && &skeleton->getData() != SkeletonData->GetSkeletonData(atlas)) {
needsUpdate = true;
}
}
@ -357,7 +357,7 @@ void USpineSkeletonComponent::CheckState() {
if (Atlas && SkeletonData) {
spine::SkeletonData *data = SkeletonData->GetSkeletonData(Atlas->GetAtlas());
skeleton = new (__FILE__, __LINE__) Skeleton(data);
skeleton = new (__FILE__, __LINE__) Skeleton(*data);
}
lastAtlas = Atlas;

View File

@ -230,7 +230,7 @@ void USpineSkeletonDataAsset::LoadInfo() {
NullAttachmentLoader loader;
SkeletonData *skeletonData = nullptr;
if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) {
SkeletonJson *json = new (__FILE__, __LINE__) SkeletonJson(&loader);
SkeletonJson *json = new (__FILE__, __LINE__) SkeletonJson(loader);
if (checkJson((const char *) rawData.GetData())) skeletonData = json->readSkeletonData((const char *) rawData.GetData());
if (!skeletonData) {
FMessageDialog::Debugf(FText::FromString(FString("Couldn't load skeleton data and/or atlas. Please ensure the "
@ -242,7 +242,7 @@ void USpineSkeletonDataAsset::LoadInfo() {
}
delete json;
} else {
SkeletonBinary *binary = new (__FILE__, __LINE__) SkeletonBinary(&loader);
SkeletonBinary *binary = new (__FILE__, __LINE__) SkeletonBinary(loader);
if (checkBinary((const char *) rawData.GetData(), (int) rawData.Num()))
skeletonData = binary->readSkeletonData((const unsigned char *) rawData.GetData(), (int) rawData.Num());
if (!skeletonData) {
@ -283,7 +283,7 @@ SkeletonData *USpineSkeletonDataAsset::GetSkeletonData(Atlas *Atlas) {
if (!skeletonData) {
int dataLen = rawData.Num();
if (skeletonDataFileName.GetPlainNameString().Contains(TEXT(".json"))) {
SkeletonJson *json = new (__FILE__, __LINE__) SkeletonJson(Atlas);
SkeletonJson *json = new (__FILE__, __LINE__) SkeletonJson(*Atlas);
if (checkJson((const char *) rawData.GetData())) skeletonData = json->readSkeletonData((const char *) rawData.GetData());
if (!skeletonData) {
#if WITH_EDITORONLY_DATA
@ -297,7 +297,7 @@ SkeletonData *USpineSkeletonDataAsset::GetSkeletonData(Atlas *Atlas) {
}
delete json;
} else {
SkeletonBinary *binary = new (__FILE__, __LINE__) SkeletonBinary(Atlas);
SkeletonBinary *binary = new (__FILE__, __LINE__) SkeletonBinary(*Atlas);
if (checkBinary((const char *) rawData.GetData(), (int) rawData.Num()))
skeletonData = binary->readSkeletonData((const unsigned char *) rawData.GetData(), (int) rawData.Num());
if (!skeletonData) {
@ -314,7 +314,7 @@ SkeletonData *USpineSkeletonDataAsset::GetSkeletonData(Atlas *Atlas) {
}
if (skeletonData) {
animationStateData = new (__FILE__, __LINE__) AnimationStateData(skeletonData);
animationStateData = new (__FILE__, __LINE__) AnimationStateData(*skeletonData);
SetMixes(animationStateData);
atlasToNativeData.Add(Atlas, {skeletonData, animationStateData});
}

View File

@ -197,9 +197,9 @@ void USpineSkeletonRendererComponent::UpdateMesh(USpineSkeletonComponent *compon
float *attachmentUvs = nullptr;
Slot *slot = Skeleton->getDrawOrder()[i];
Attachment *attachment = slot->getPose().getAttachment();
Attachment *attachment = slot->getAppliedPose().getAttachment();
if (slot->getPose().getColor().a == 0 || !slot->getBone().isActive()) {
if (slot->getAppliedPose().getColor().a == 0 || !slot->getBone().isActive()) {
clipper.clipEnd(*slot);
continue;
}
@ -271,7 +271,7 @@ void USpineSkeletonRendererComponent::UpdateMesh(USpineSkeletonComponent *compon
// to the correct skeleton data yet, we won't find any regions.
// ignore regions for which we can't find a material
UMaterialInstanceDynamic *material = nullptr;
int foundPageIndex = (int) (intptr_t) attachmentAtlasRegion->getPageIndex();
int foundPageIndex = attachmentAtlasRegion->getPage() ? attachmentAtlasRegion->getPage()->index : -1;
if (foundPageIndex == -1) {
clipper.clipEnd(*slot);
continue;
@ -316,10 +316,10 @@ void USpineSkeletonRendererComponent::UpdateMesh(USpineSkeletonComponent *compon
SetMaterial(meshSection, material);
uint8 r = static_cast<uint8>(Skeleton->getColor().r * slot->getPose().getColor().r * attachmentColor.r * 255);
uint8 g = static_cast<uint8>(Skeleton->getColor().g * slot->getPose().getColor().g * attachmentColor.g * 255);
uint8 b = static_cast<uint8>(Skeleton->getColor().b * slot->getPose().getColor().b * attachmentColor.b * 255);
uint8 a = static_cast<uint8>(Skeleton->getColor().a * slot->getPose().getColor().a * attachmentColor.a * 255);
uint8 r = static_cast<uint8>(Skeleton->getColor().r * slot->getAppliedPose().getColor().r * attachmentColor.r * 255);
uint8 g = static_cast<uint8>(Skeleton->getColor().g * slot->getAppliedPose().getColor().g * attachmentColor.g * 255);
uint8 b = static_cast<uint8>(Skeleton->getColor().b * slot->getAppliedPose().getColor().b * attachmentColor.b * 255);
uint8 a = static_cast<uint8>(Skeleton->getColor().a * slot->getAppliedPose().getColor().a * attachmentColor.a * 255);
float *verticesPtr = attachmentVertices->buffer();
for (int j = 0; j < numVertices << 1; j += 2) {

View File

@ -36,7 +36,7 @@
using namespace spine;
void callbackWidget(AnimationState *state, spine::EventType type, TrackEntry *entry, Event *event) {
void callbackWidget(AnimationState *state, spine::EventType type, TrackEntry *entry, Event *event, void *userData) {
USpineWidget *component = (USpineWidget *) state->getRendererObject();
if (entry->getRendererObject()) {
@ -157,7 +157,7 @@ void USpineWidget::CheckState() {
if (lastSpineAtlas != atlas) {
needsUpdate = true;
}
if (skeleton && skeleton->getData() != SkeletonData->GetSkeletonData(atlas)) {
if (skeleton && &skeleton->getData() != SkeletonData->GetSkeletonData(atlas)) {
needsUpdate = true;
}
}
@ -169,13 +169,13 @@ void USpineWidget::CheckState() {
if (Atlas && SkeletonData) {
spine::SkeletonData *data = SkeletonData->GetSkeletonData(Atlas->GetAtlas());
if (data) {
skeleton = new (__FILE__, __LINE__) Skeleton(data);
skeleton = new (__FILE__, __LINE__) Skeleton(*data);
AnimationStateData *stateData = SkeletonData->GetAnimationStateData(Atlas->GetAtlas());
state = new (__FILE__, __LINE__) AnimationState(stateData);
state = new (__FILE__, __LINE__) AnimationState(*stateData);
state->setRendererObject((void *) this);
state->setListener(callbackWidget);
state->setListener(callbackWidget, nullptr);
trackEntries.Empty();
skeleton->setToSetupPose();
skeleton->setupPose();
skeleton->updateWorldTransform(Physics_Update);
slateWidget->SetData(this);
}
@ -214,7 +214,7 @@ void USpineWidget::FinishDestroy() {
bool USpineWidget::SetSkin(const FString skinName) {
CheckState();
if (skeleton) {
spine::Skin *skin = skeleton->getData()->findSkin(TCHAR_TO_UTF8(*skinName));
spine::Skin *skin = skeleton->getData().findSkin(TCHAR_TO_UTF8(*skinName));
if (!skin) return false;
skeleton->setSkin(skin);
bSkinInitialized = true;
@ -228,12 +228,12 @@ bool USpineWidget::SetSkins(UPARAM(ref) TArray<FString> &SkinNames) {
if (skeleton) {
spine::Skin *newSkin = new spine::Skin("__spine-ue3_custom_skin");
for (auto &skinName : SkinNames) {
spine::Skin *skin = skeleton->getData()->findSkin(TCHAR_TO_UTF8(*skinName));
spine::Skin *skin = skeleton->getData().findSkin(TCHAR_TO_UTF8(*skinName));
if (!skin) {
delete newSkin;
return false;
}
newSkin->addSkin(skin);
newSkin->addSkin(*skin);
}
skeleton->setSkin(newSkin);
bSkinInitialized = true;
@ -249,8 +249,8 @@ bool USpineWidget::SetSkins(UPARAM(ref) TArray<FString> &SkinNames) {
void USpineWidget::GetSkins(TArray<FString> &Skins) {
CheckState();
if (skeleton) {
for (size_t i = 0, n = skeleton->getData()->getSkins().size(); i < n; i++) {
Skins.Add(skeleton->getData()->getSkins()[i]->getName().buffer());
for (size_t i = 0, n = skeleton->getData().getSkins().size(); i < n; i++) {
Skins.Add(skeleton->getData().getSkins()[i]->getName().buffer());
}
}
}
@ -258,7 +258,7 @@ void USpineWidget::GetSkins(TArray<FString> &Skins) {
bool USpineWidget::HasSkin(const FString skinName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findSkin(TCHAR_TO_UTF8(*skinName)) != nullptr;
return skeleton->getData().findSkin(TCHAR_TO_UTF8(*skinName)) != nullptr;
}
return false;
}
@ -286,17 +286,17 @@ void USpineWidget::UpdateWorldTransform() {
void USpineWidget::SetToSetupPose() {
CheckState();
if (skeleton) skeleton->setToSetupPose();
if (skeleton) skeleton->setupPose();
}
void USpineWidget::SetBonesToSetupPose() {
CheckState();
if (skeleton) skeleton->setBonesToSetupPose();
if (skeleton) skeleton->setupPoseBones();
}
void USpineWidget::SetSlotsToSetupPose() {
CheckState();
if (skeleton) skeleton->setSlotsToSetupPose();
if (skeleton) skeleton->setupPoseSlots();
}
void USpineWidget::SetScaleX(float scaleX) {
@ -333,7 +333,7 @@ void USpineWidget::GetBones(TArray<FString> &Bones) {
bool USpineWidget::HasBone(const FString BoneName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findBone(TCHAR_TO_UTF8(*BoneName)) != nullptr;
return skeleton->getData().findBone(TCHAR_TO_UTF8(*BoneName)) != nullptr;
}
return false;
}
@ -346,9 +346,9 @@ FTransform USpineWidget::GetBoneTransform(const FString &BoneName) {
FMatrix localTransform;
localTransform.SetIdentity();
localTransform.SetAxis(2, FVector(bone->getA(), 0, bone->getC()));
localTransform.SetAxis(0, FVector(bone->getB(), 0, bone->getD()));
localTransform.SetOrigin(FVector(bone->getWorldX(), 0, bone->getWorldY()));
localTransform.SetAxis(2, FVector(bone->getAppliedPose().getA(), 0, bone->getAppliedPose().getC()));
localTransform.SetAxis(0, FVector(bone->getAppliedPose().getB(), 0, bone->getAppliedPose().getD()));
localTransform.SetOrigin(FVector(bone->getAppliedPose().getWorldX(), 0, bone->getAppliedPose().getWorldY()));
FTransform result;
result.SetFromMatrix(localTransform);
@ -369,7 +369,7 @@ void USpineWidget::GetSlots(TArray<FString> &Slots) {
bool USpineWidget::HasSlot(const FString SlotName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findSlot(TCHAR_TO_UTF8(*SlotName)) != nullptr;
return skeleton->getData().findSlot(TCHAR_TO_UTF8(*SlotName)) != nullptr;
}
return false;
}
@ -379,7 +379,7 @@ void USpineWidget::SetSlotColor(const FString SlotName, const FColor SlotColor)
if (skeleton) {
spine::Slot *slot = skeleton->findSlot(TCHAR_TO_UTF8(*SlotName));
if (slot) {
slot->getColor().set(SlotColor.R / 255.f, SlotColor.G / 255.f, SlotColor.B / 255.f, SlotColor.A / 255.f);
slot->getPose().getColor().set(SlotColor.R / 255.f, SlotColor.G / 255.f, SlotColor.B / 255.f, SlotColor.A / 255.f);
}
}
}
@ -387,8 +387,8 @@ void USpineWidget::SetSlotColor(const FString SlotName, const FColor SlotColor)
void USpineWidget::GetAnimations(TArray<FString> &Animations) {
CheckState();
if (skeleton) {
for (size_t i = 0, n = skeleton->getData()->getAnimations().size(); i < n; i++) {
Animations.Add(skeleton->getData()->getAnimations()[i]->getName().buffer());
for (size_t i = 0, n = skeleton->getData().getAnimations().size(); i < n; i++) {
Animations.Add(skeleton->getData().getAnimations()[i]->getName().buffer());
}
}
}
@ -396,7 +396,7 @@ void USpineWidget::GetAnimations(TArray<FString> &Animations) {
bool USpineWidget::HasAnimation(FString AnimationName) {
CheckState();
if (skeleton) {
return skeleton->getData()->findAnimation(TCHAR_TO_UTF8(*AnimationName)) != nullptr;
return skeleton->getData().findAnimation(TCHAR_TO_UTF8(*AnimationName)) != nullptr;
}
return false;
}
@ -404,7 +404,7 @@ bool USpineWidget::HasAnimation(FString AnimationName) {
float USpineWidget::GetAnimationDuration(FString AnimationName) {
CheckState();
if (skeleton) {
spine::Animation *animation = skeleton->getData()->findAnimation(TCHAR_TO_UTF8(*AnimationName));
spine::Animation *animation = skeleton->getData().findAnimation(TCHAR_TO_UTF8(*AnimationName));
if (animation == nullptr)
return 0;
else
@ -421,9 +421,9 @@ void USpineWidget::SetPlaybackTime(float InPlaybackTime, bool bCallDelegates) {
CheckState();
if (state && state->getCurrent(0)) {
spine::Animation *CurrentAnimation = state->getCurrent(0)->getAnimation();
spine::Animation &CurrentAnimation = state->getCurrent(0)->getAnimation();
const float CurrentTime = state->getCurrent(0)->getTrackTime();
InPlaybackTime = FMath::Clamp(InPlaybackTime, 0.0f, CurrentAnimation->getDuration());
InPlaybackTime = FMath::Clamp(InPlaybackTime, 0.0f, CurrentAnimation.getDuration());
const float DeltaTime = InPlaybackTime - CurrentTime;
state->update(DeltaTime);
state->apply(*skeleton);
@ -452,12 +452,12 @@ float USpineWidget::GetTimeScale() {
UTrackEntry *USpineWidget::SetAnimation(int trackIndex, FString animationName, bool loop) {
CheckState();
if (state && skeleton->getData()->findAnimation(TCHAR_TO_UTF8(*animationName))) {
if (state && skeleton->getData().findAnimation(TCHAR_TO_UTF8(*animationName))) {
state->disableQueue();
TrackEntry *entry = state->setAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop);
TrackEntry &entry = state->setAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop);
state->enableQueue();
UTrackEntry *uEntry = NewObject<UTrackEntry>();
uEntry->SetTrackEntry(entry);
uEntry->SetTrackEntry(&entry);
trackEntries.Add(uEntry);
return uEntry;
} else
@ -466,12 +466,12 @@ UTrackEntry *USpineWidget::SetAnimation(int trackIndex, FString animationName, b
UTrackEntry *USpineWidget::AddAnimation(int trackIndex, FString animationName, bool loop, float delay) {
CheckState();
if (state && skeleton->getData()->findAnimation(TCHAR_TO_UTF8(*animationName))) {
if (state && skeleton->getData().findAnimation(TCHAR_TO_UTF8(*animationName))) {
state->disableQueue();
TrackEntry *entry = state->addAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop, delay);
TrackEntry &entry = state->addAnimation(trackIndex, TCHAR_TO_UTF8(*animationName), loop, delay);
state->enableQueue();
UTrackEntry *uEntry = NewObject<UTrackEntry>();
uEntry->SetTrackEntry(entry);
uEntry->SetTrackEntry(&entry);
trackEntries.Add(uEntry);
return uEntry;
} else
@ -481,9 +481,9 @@ UTrackEntry *USpineWidget::AddAnimation(int trackIndex, FString animationName, b
UTrackEntry *USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration) {
CheckState();
if (state) {
TrackEntry *entry = state->setEmptyAnimation(trackIndex, mixDuration);
TrackEntry &entry = state->setEmptyAnimation(trackIndex, mixDuration);
UTrackEntry *uEntry = NewObject<UTrackEntry>();
uEntry->SetTrackEntry(entry);
uEntry->SetTrackEntry(&entry);
trackEntries.Add(uEntry);
return uEntry;
} else
@ -493,9 +493,9 @@ UTrackEntry *USpineWidget::SetEmptyAnimation(int trackIndex, float mixDuration)
UTrackEntry *USpineWidget::AddEmptyAnimation(int trackIndex, float mixDuration, float delay) {
CheckState();
if (state) {
TrackEntry *entry = state->addEmptyAnimation(trackIndex, mixDuration, delay);
TrackEntry &entry = state->addEmptyAnimation(trackIndex, mixDuration, delay);
UTrackEntry *uEntry = NewObject<UTrackEntry>();
uEntry->SetTrackEntry(entry);
uEntry->SetTrackEntry(&entry);
trackEntries.Add(uEntry);
return uEntry;
} else
@ -549,9 +549,9 @@ void USpineWidget::PhysicsRotate(float x, float y, float degrees) {
void USpineWidget::ResetPhysicsConstraints() {
CheckState();
if (skeleton) {
Vector<PhysicsConstraint *> &constraints = skeleton->getPhysicsConstraints();
Array<PhysicsConstraint *> &constraints = skeleton->getPhysicsConstraints();
for (int i = 0, n = (int) constraints.size(); i < n; i++) {
constraints[i]->reset();
constraints[i]->reset(*skeleton);
}
}
}