[ue4] Fixed scaling and rendering of widget. SpineWidget has an additional field Scale that can be used to size a skeleton in a widget in a addition to the default sizing based on the setup pose bounds.

This commit is contained in:
badlogic 2019-04-12 17:11:46 +02:00
parent bf0999e202
commit 64542d92cc
4 changed files with 19 additions and 30 deletions

View File

@ -51,6 +51,13 @@ void SSpineWidget::Construct(const FArguments& args) {
void SSpineWidget::SetData(USpineWidget* Widget) {
this->widget = Widget;
if (widget && widget->skeleton && widget->Atlas) {
Skeleton *skeleton = widget->skeleton;
skeleton->setToSetupPose();
skeleton->updateWorldTransform();
Vector<float> scratchBuffer;
skeleton->getBounds(this->boundsMin.X, this->boundsMin.Y, this->boundsSize.X, this->boundsSize.Y, scratchBuffer);
}
}
static void setVertex(FSlateVertex* vertex, float x, float y, float u, float v, const FColor& color, const FVector2D& offset) {
@ -163,6 +170,12 @@ int32 SSpineWidget::OnPaint(const FPaintArgs& Args, const FGeometry& AllottedGeo
void SSpineWidget::Flush(int32 LayerId, FSlateWindowElementList& OutDrawElements, const FGeometry& AllottedGeometry, int &Idx, TArray<FVector> &Vertices, TArray<int32> &Indices, TArray<FVector2D> &Uvs, TArray<FColor> &Colors, TArray<FVector>& Colors2, UMaterialInstanceDynamic* Material) {
if (Vertices.Num() == 0) return;
SSpineWidget* self = (SSpineWidget*)this;
const FVector2D widgetSize = AllottedGeometry.GetDrawSize();
const float setupScale = (widgetSize / FVector2D(boundsSize.X, boundsSize.Y)).GetMin();
for (int i = 0; i < Vertices.Num(); i++) {
Vertices[i] = (Vertices[i] - FVector(boundsMin.X, -(boundsMin.Y + boundsSize.Y), 0)) * setupScale * widget->Scale;
}
self->renderData.IndexData.SetNumUninitialized(Indices.Num());
uint32* indexData = (uint32*)renderData.IndexData.GetData();
@ -293,18 +306,6 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList& OutDrawEle
}
if (lastMaterial != material) {
FBox VerticeBounds = FBox();
for (int i = 0; i < vertices.Num(); i++) {
VerticeBounds += vertices[i];
}
const FVector2D DrawSize = AllottedGeometry.GetDrawSize();
const FVector BoundMin = VerticeBounds.Min;
const FVector BoundSize = VerticeBounds.GetSize();
const float Scale = (DrawSize / FVector2D(BoundSize.X, BoundSize.Y)).GetMin();
for (int i = 0; i < vertices.Num(); i++) {
vertices[i] = (vertices[i] - BoundMin) * Scale;
}
Flush(LayerId, OutDrawElements, AllottedGeometry, meshSection, vertices, indices, uvs, colors, darkColors, lastMaterial);
lastMaterial = material;
idx = 0;
@ -335,22 +336,7 @@ void SSpineWidget::UpdateMesh(int32 LayerId, FSlateWindowElementList& OutDrawEle
clipper.clipEnd(*slot);
}
FBox VerticeBounds = FBox();
for (int i = 0; i < vertices.Num(); i++)
{
VerticeBounds += vertices[i];
}
const FVector2D DrawSize = AllottedGeometry.GetDrawSize();
const FVector BoundMin = VerticeBounds.Min;
const FVector BoundSize = VerticeBounds.GetSize();
const float Scale = (DrawSize / FVector2D(BoundSize.X, BoundSize.Y)).GetMin();
for (int i = 0; i < vertices.Num(); i++)
{
vertices[i] = (vertices[i] - BoundMin)*Scale;
}
Flush(LayerId, OutDrawElements, AllottedGeometry, meshSection, vertices, indices, uvs, colors, darkColors, lastMaterial);
clipper.clipEnd();
}

View File

@ -55,7 +55,8 @@ protected:
void Flush(int32 LayerId, FSlateWindowElementList& OutDrawElements, const FGeometry& AllottedGeometry, int &Idx, TArray<FVector> &Vertices, TArray<int32> &Indices, TArray<FVector2D> &Uvs, TArray<FColor> &Colors, TArray<FVector> &Colors2, UMaterialInstanceDynamic* Material);
USpineWidget* widget;
USpineWidget* widget;
FRenderData renderData;
FVector boundsMin;
FVector boundsSize;
};

View File

@ -52,6 +52,8 @@ public:
#if WITH_EDITOR
virtual const FText GetPaletteCategory() override;
#endif
UPROPERTY(Category = Spine, EditAnywhere, BlueprintReadWrite)
float Scale = 1;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Spine)
USpineAtlasAsset* Atlas;