Modify Skeleton Mesh Vertex Position Runtime

Ok, I have just worked it out.Here is the code, it do jobs that change vertex position in skeleton mesh file forever.

Make sure the Skeletalmesh1 is what is using in the custom skeletonmesh component.

I delete something unuserful but it still seems Redundant。

.h

UCLASS(meta = (BlueprintSpawnableComponent))
class MYPROJECT37_API AModelTransformSM : public ASkeletalMeshActor
{
GENERATED_BODY()

UFUNCTION(BlueprintCallable, Category = "My Test Library")
USkeletalMesh *  TestGetSkeletalMeshData4(USkeletalMesh * SkeletalMesh1);

};

.cpp

USkeletalMesh * AModelTransformSM::TestGetSkeletalMeshData4(USkeletalMesh * SkeletalMesh1) {

FStaticLODModel& LODModel = SkeletalMesh1->GetImportedResource()->LODModels[0];

for (uint32 i = 0; i < LODModel.VertexBufferGPUSkin.GetNumVertices() / 2; i++)
{
	FVector TempVec = LODModel.VertexBufferGPUSkin.GetVertexPositionFast(i);

	if (LODModel.VertexBufferGPUSkin.GetUseFullPrecisionUVs())
	{
		FVector position1 = ((TGPUSkinVertexFloat16Uvs<MAX_TEXCOORDS>*)(LODModel.VertexBufferGPUSkin.GetVertexPtr(i)))->Position;
		position1.X += 20;
		position1.Y += 30;
		position1.Z += 30;
		((TGPUSkinVertexFloat16Uvs<MAX_TEXCOORDS>*)(LODModel.VertexBufferGPUSkin.GetVertexPtr(i)))->Position = position1;
	}
	else
	{
		FVector position1 = ((TGPUSkinVertexFloat32Uvs<MAX_TEXCOORDS>*)(LODModel.VertexBufferGPUSkin.GetVertexPtr(i)))->Position;
		position1.X += 20;
		position1.Y += 30;
		position1.Z += 30;
		((TGPUSkinVertexFloat32Uvs<MAX_TEXCOORDS>*)(LODModel.VertexBufferGPUSkin.GetVertexPtr(i)))->Position = position1;
	}
}

LODModel.VertexBufferGPUSkin.InitRHI();
SkeletalMesh1->PostEditChange();
GetSkeletalMeshComponent()->PostEditChange();

GetSkeletalMeshComponent()->MarkRenderStateDirty();
GetSkeletalMeshComponent()->MarkRenderDynamicDataDirty();
GetSkeletalMeshComponent()->MarkRenderTransformDirty();

return SkeletalMesh1;
}

bp

2 Likes