[ue] Update renderers for sequence attachments and refresh sample assets

This commit is contained in:
Mario Zechner 2026-03-14 15:10:11 +01:00
parent 9b969202e8
commit 55cc604baa
11 changed files with 28 additions and 18 deletions

1
.gitignore vendored
View File

@ -264,3 +264,4 @@ spine-c/.docker-built
.cache/
spine-godot/class_info.txt
spine-godot/class_meta.json
spine-ue/DerivedDataCache

View File

@ -286,12 +286,13 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
float *attachmentUvs = nullptr;
Slot *slot = Skeleton->getDrawOrder()[i];
SlotPose &slotPose = slot->getAppliedPose();
if (!slot->getBone().isActive()) {
clipper.clipEnd(*slot);
continue;
}
Attachment *attachment = slot->getAppliedPose().getAttachment();
Attachment *attachment = slotPose.getAttachment();
if (!attachment) {
clipper.clipEnd(*slot);
continue;
@ -304,22 +305,26 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList &OutDrawEle
if (attachment->getRTTI().isExactly(RegionAttachment::rtti)) {
RegionAttachment *regionAttachment = (RegionAttachment *) attachment;
Sequence &sequence = regionAttachment->getSequence();
int sequenceIndex = sequence.resolveIndex(slotPose);
attachmentColor.set(regionAttachment->getColor());
attachmentVertices->setSize(8, 0);
regionAttachment->computeWorldVertices(*slot, *attachmentVertices, 0, 2);
attachmentAtlasRegion = (AtlasRegion *) regionAttachment->getRegion();
regionAttachment->computeWorldVertices(*slot, regionAttachment->getOffsets(slotPose), *attachmentVertices, 0, 2);
attachmentAtlasRegion = (AtlasRegion *) sequence.getRegion(sequenceIndex);
attachmentIndices = quadIndices;
attachmentUvs = regionAttachment->getUVs().buffer();
attachmentUvs = sequence.getUVs(sequenceIndex).buffer();
numVertices = 4;
numIndices = 6;
} else if (attachment->getRTTI().isExactly(MeshAttachment::rtti)) {
MeshAttachment *mesh = (MeshAttachment *) attachment;
Sequence &sequence = mesh->getSequence();
int sequenceIndex = sequence.resolveIndex(slotPose);
attachmentColor.set(mesh->getColor());
attachmentVertices->setSize(mesh->getWorldVerticesLength(), 0);
mesh->computeWorldVertices(*Skeleton, *slot, 0, mesh->getWorldVerticesLength(), attachmentVertices->buffer(), 0, 2);
attachmentAtlasRegion = (AtlasRegion *) mesh->getRegion();
attachmentAtlasRegion = (AtlasRegion *) sequence.getRegion(sequenceIndex);
attachmentIndices = mesh->getTriangles().buffer();
attachmentUvs = mesh->getUVs().buffer();
attachmentUvs = sequence.getUVs(sequenceIndex).buffer();
numVertices = mesh->getWorldVerticesLength() >> 1;
numIndices = mesh->getTriangles().size();
} else /* clipping */ {

View File

@ -113,11 +113,11 @@ void USpineSkeletonDataAsset::BeginDestroy() {
class SP_API NullAttachmentLoader : public AttachmentLoader {
public:
virtual RegionAttachment *newRegionAttachment(Skin &skin, const String &name, const String &path, Sequence *sequence) {
return new (__FILE__, __LINE__) RegionAttachment(name);
return new (__FILE__, __LINE__) RegionAttachment(name, sequence);
}
virtual MeshAttachment *newMeshAttachment(Skin &skin, const String &name, const String &path, Sequence *sequence) {
return new (__FILE__, __LINE__) MeshAttachment(name);
return new (__FILE__, __LINE__) MeshAttachment(name, sequence);
}
virtual BoundingBoxAttachment *newBoundingBoxAttachment(Skin &skin, const String &name) {

View File

@ -197,9 +197,10 @@ void USpineSkeletonRendererComponent::UpdateMesh(USpineSkeletonComponent *compon
float *attachmentUvs = nullptr;
Slot *slot = Skeleton->getDrawOrder()[i];
Attachment *attachment = slot->getAppliedPose().getAttachment();
SlotPose &slotPose = slot->getAppliedPose();
Attachment *attachment = slotPose.getAttachment();
if (slot->getAppliedPose().getColor().a == 0 || !slot->getBone().isActive()) {
if (slotPose.getColor().a == 0 || !slot->getBone().isActive()) {
clipper.clipEnd(*slot);
continue;
}
@ -223,12 +224,14 @@ void USpineSkeletonRendererComponent::UpdateMesh(USpineSkeletonComponent *compon
continue;
}
Sequence &sequence = regionAttachment->getSequence();
int sequenceIndex = sequence.resolveIndex(slotPose);
attachmentColor.set(regionAttachment->getColor());
attachmentVertices->setSize(8, 0);
regionAttachment->computeWorldVertices(*slot, *attachmentVertices, 0, 2);
attachmentAtlasRegion = (AtlasRegion *) regionAttachment->getRegion();
regionAttachment->computeWorldVertices(*slot, regionAttachment->getOffsets(slotPose), *attachmentVertices, 0, 2);
attachmentAtlasRegion = (AtlasRegion *) sequence.getRegion(sequenceIndex);
attachmentIndices = quadIndices;
attachmentUvs = regionAttachment->getUVs().buffer();
attachmentUvs = sequence.getUVs(sequenceIndex).buffer();
numVertices = 4;
numIndices = 6;
} else if (attachment->getRTTI().isExactly(MeshAttachment::rtti)) {
@ -240,12 +243,14 @@ void USpineSkeletonRendererComponent::UpdateMesh(USpineSkeletonComponent *compon
continue;
}
Sequence &sequence = mesh->getSequence();
int sequenceIndex = sequence.resolveIndex(slotPose);
attachmentColor.set(mesh->getColor());
attachmentVertices->setSize(mesh->getWorldVerticesLength(), 0);
mesh->computeWorldVertices(*Skeleton, *slot, 0, mesh->getWorldVerticesLength(), attachmentVertices->buffer(), 0, 2);
attachmentAtlasRegion = (AtlasRegion *) mesh->getRegion();
attachmentAtlasRegion = (AtlasRegion *) sequence.getRegion(sequenceIndex);
attachmentIndices = mesh->getTriangles().buffer();
attachmentUvs = mesh->getUVs().buffer();
attachmentUvs = sequence.getUVs(sequenceIndex).buffer();
numVertices = mesh->getWorldVerticesLength() >> 1;
numIndices = mesh->getTriangles().size();
} else /* clipping */ {

View File

@ -33,7 +33,6 @@ public class SpineUE : ModuleRules
{
public SpineUE(ReadOnlyTargetRules Target) : base(Target)
{
PrivatePCHHeaderFile = "SpineUE.h";
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "SpinePlugin", "ProceduralMeshComponent" });
PrivateDependencyModuleNames.AddRange(new string[] { });
}

View File

@ -1,6 +1,6 @@
{
"FileVersion": 3,
"EngineAssociation": "5.5",
"EngineAssociation": "5.7",
"Category": "",
"Description": "",
"Modules": [
@ -13,4 +13,4 @@
]
}
]
}
}