I was following Vebski and Rama’s
Accessing mesh triangles and vertex positions in build Tutorial, trying to do the same with a Skeletal Mesh, but i’m new en c++ and do not understand how can i have access to BodyInstance ( trying to Target->BodyInstance.IsValidBodyInstance() return’s falls). Please somebody explain me how it does works.
Build.cs
using UnrealBuildTool;
public class AProject : ModuleRules
{
public AProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "RHI", "RenderCore", "PhysX", "APEX", "HeadMountedDisplay" });
}
}
OvSkeletalMeshActor.h
#pragma once
#include "CoreMinimal.h"
#include "Engine.h"
#include "Animation/SkeletalMeshActor.h"
#include "OvSkeletalMeshActor.generated.h"
UCLASS()
class APROJECT_API AOvSkeletalMeshActor : public ASkeletalMeshActor
{
GENERATED_UCLASS_BODY()
UFUNCTION(BlueprintPure, Category = "Advanced Library")
static bool GetSkeletalMeshPhysXProps(USkeletalMeshComponent* Target, TArray<FVector>& Vertices, TArray<int32>& Indices, bool &Result);
};
OvSkeletalMeshActor.cpp
#include "OvSkeletalMeshActor.h"
//~~~~~~~~~~~~~~~~~~~~~~~~
#include "PhysicsEngine/BodySetup.h" // Body Setup
//~~~~~~~~~~~~~~~~~~~~~~~~
// PhysX
#include "PhysXIncludes.h" // Px vars
#include "PhysicsPublic.h" // FPhysScene
#include "PhysXPublic.h" // PtoU conversions
//~~~~~~~~~~~~~~~~~~~~~~~~
AOvSkeletalMeshActor::AOvSkeletalMeshActor(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
}
bool AOvSkeletalMeshActor::GetSkeletalMeshPhysXProps(USkeletalMeshComponent* Target, TArray<FVector>& Vertices, TArray<int32>& Indices)
{
Vertices.Empty();
Indices.Empty();
#if WITH_PHYSX
PxTriangleMesh* TempTriMesh = Target->BodyInstance.BodySetup.Get()->TriMeshes[0];
check(TempTriMesh);
int32 TriNumber = TempTriMesh->getNbTriangles();
const PxVec3* PVertices = TempTriMesh->getVertices();
const void* Triangles = TempTriMesh->getTriangles();
for (int32 TriIndex = 0; TriIndex < TriNumber; ++TriIndex)
{
if (TempTriMesh->getTriangleMeshFlags() & PxTriangleMeshFlag::e16_BIT_INDICES)
{
PxU16* P16BitIndices = (PxU16*)Triangles;
Indices.Add(P16BitIndices[TriIndex * 3]);
Indices.Add(P16BitIndices[(TriIndex * 3) + 1]);
Indices.Add(P16BitIndices[(TriIndex * 3) + 2]);
}
else
{
PxU32* P32BitIndices = (PxU32*)Triangles;
Indices.Add(P32BitIndices[TriIndex * 3]);
Indices.Add(P32BitIndices[(TriIndex * 3) + 1]);
Indices.Add(P32BitIndices[(TriIndex * 3) + 2]);
}
Vertices.Add(P2UVector(PVertices[Indices[TriIndex * 3]]));
Vertices.Add(P2UVector(PVertices[Indices[(TriIndex * 3) + 1]]));
Vertices.Add(P2UVector(PVertices[Indices[(TriIndex * 3) + 2]]));
}
#endif // WITH_PHYSX
return true;
}