I create a static mesh as a sub component to an actor and want the mesh to be visible in editor as well as in play
This is my test routine i have copied from the internet
void UCSWScene::test(bool inPlay)
{
// Build a simple pyramid after play has begun
// Mesh description will hold all the geometry, uv, normals going into the static mesh
FMeshDescription meshDesc;
FStaticMeshAttributes Attributes(meshDesc);
Attributes.Register();
FMeshDescriptionBuilder meshDescBuilder;
meshDescBuilder.SetMeshDescription(&meshDesc);
meshDescBuilder.EnablePolyGroups();
meshDescBuilder.SetNumUVLayers(1);
// Create the 5 vertices needed for the shape
TArray< FVertexID > vertexIDs; vertexIDs.SetNum(3);
vertexIDs[0] = meshDescBuilder.AppendVertex(FVector(0.0, 0.0, 0.0)); // Apex
vertexIDs[1] = meshDescBuilder.AppendVertex(FVector(100.0, 0.0, 0.0)); // Corner 1
vertexIDs[2] = meshDescBuilder.AppendVertex(FVector(100.0, 0.0, -100.0)); // Corner 2
// Array to store all the vertex instances (3 per face)
TArray< FVertexInstanceID > vertexInsts;
// Face 1 (Faces towards -X) vertex instances
FVertexInstanceID instance = meshDescBuilder.AppendInstance(vertexIDs[0]);
meshDescBuilder.SetInstanceNormal(instance, FVector(0, 1, 0));
meshDescBuilder.SetInstanceUV(instance, FVector2D(0, 1), 0);
meshDescBuilder.SetInstanceColor(instance, FVector4f(1.0f, 1.0f, 1.0f, 1.0f));
vertexInsts.Add(instance);
instance = meshDescBuilder.AppendInstance(vertexIDs[1]);
meshDescBuilder.SetInstanceNormal(instance, FVector(0, 1, 0));
meshDescBuilder.SetInstanceUV(instance, FVector2D(0, 0), 0);
meshDescBuilder.SetInstanceColor(instance, FVector4f(1.0f, 1.0f, 1.0f, 1.0f));
vertexInsts.Add(instance);
instance = meshDescBuilder.AppendInstance(vertexIDs[2]);
meshDescBuilder.SetInstanceNormal(instance, FVector(0, 1, 0));
meshDescBuilder.SetInstanceUV(instance, FVector2D(1, 0), 0);
meshDescBuilder.SetInstanceColor(instance, FVector4f(1.0f, 1.0f, 1.0f, 1.0f));
vertexInsts.Add(instance);
// Allocate a polygon group
FPolygonGroupID polygonGroup = meshDescBuilder.AppendPolygonGroup();
// Add triangles to mesh description
meshDescBuilder.AppendTriangle(vertexInsts[2], vertexInsts[1], vertexInsts[0], polygonGroup);
// At least one material must be added
TObjectPtr<UStaticMesh> staticMesh;
if(inPlay)
staticMesh = NewObject<UStaticMesh>(this);
else
staticMesh = CreateDefaultSubobject<UStaticMesh>(TEXT("Oahh"),true);
staticMesh->GetStaticMaterials().Add(FStaticMaterial());
UStaticMesh::FBuildMeshDescriptionsParams mdParams;
mdParams.bBuildSimpleCollision = true;
mdParams.bFastBuild = true;
// Build static mesh
TArray<const FMeshDescription*> meshDescPtrs;
meshDescPtrs.Emplace(&meshDesc);
staticMesh->BuildFromMeshDescriptions(meshDescPtrs, mdParams);
// Assign new static mesh to the static mesh component
_smComp->SetStaticMesh(staticMesh);
}
This is the constructor
UCSWScene::UCSWScene(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer)
{
PrimaryComponentTick.bCanEverTick = true;
// Register callbacks
registerPropertyUpdate("MapUrls", &UCSWScene::onMapUrlsPropertyUpdate);
initSceneManager();
//SetMobility(EComponentMobility::Static);
_smComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("smComp"), true);
_smComp->SetupAttachment(this);
}
I generate this from a parent actor
ACSWWorld::ACSWWorld()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
cswInitializeUnrealGlue();
Scene = CreateDefaultSubobject<UCSWScene>(TEXT("Scene"));
SetRootComponent(Scene);
//Scene->test(true);
FTransform m;
m.SetFromMatrix(cswMatrix4<double>::UEMatrix4(cswMatrix4<double>::GZ_2_UE()));
Scene->SetWorldTransform(m);
DefaultCamera = CreateDefaultSubobject<UCSWCamera>(TEXT("Camera"));
}
And this is the BeginPlay
// Called when the game starts or when spawned
void ACSWWorld::BeginPlay()
{
Super::BeginPlay();
Scene->test(true);
}
Now if I call the “test(true)” method from begin play the geometry is created on play and shuts down ok. multple instances of cswWorld can be created/destroyed
If I call the “test(true)” method from actor constructor the geometry is created in editor and shuts down ok when closed/removed multiple times. Actor destructor is executed ok BUT it crashes on press play ?
Error Message is “A FRenderResource was deleted without being released first!”