Issue adding a material to programmatically made staticmesh (UE4.25)

Hi all,

I’m trying to add a material to my mesh that i have created at runtime, using BuildFromMeshDescriptions. I’m using 4.25, and can’t seem to find and code examples from this version of the engine. The mesh is showing correctly upon Play, but the material isn’t showing. I’ve tried everything i can think of. Any help would be greatly received… here is my latest iteration of the code…

void AStaticTest::BuildIt()
{
	//UStaticMeshComponent* staticMeshComponent = NewObject<UStaticMeshComponent>(this);

	//staticMeshComponent->RegisterComponent();
	//staticMeshComponent->AttachToComponent( RootComponent,FAttachmentTransformRules::KeepRelativeTransform);

	//_smComp->RegisterComponent();
	//_smComp->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);

	// Build a simple pyramid after play has begun
	// Mesh description will hold all the geometry, uv, normals going into the static mesh
	MeshDescription.Empty();
	
	FStaticMeshAttributes Attributes( MeshDescription );
	Attributes.Register();

	FMeshDescriptionBuilder meshDescBuilder;
	meshDescBuilder.SetMeshDescription( &MeshDescription );
	meshDescBuilder.EnablePolyGroups();
	meshDescBuilder.SetNumUVLayers( 1 );

	// Create the 5 vertices needed for the shape
	TArray<FVertexID> vertexIDs;
	vertexIDs.SetNum( 5 );
	vertexIDs[ 0 ] = meshDescBuilder.AppendVertex( FVector( 0.0, 0.0, 100.0 ) );   // Apex
	vertexIDs[ 1 ] = meshDescBuilder.AppendVertex( FVector( -50.0, 50.0, 0.0 ) );  // Corner 1
	vertexIDs[ 2 ] = meshDescBuilder.AppendVertex( FVector( -50.0, -50.0, 0.0 ) ); // Corner 2
	vertexIDs[ 3 ] = meshDescBuilder.AppendVertex( FVector( 50.0, -50.0, 0.0 ) );  // Corner 3
	vertexIDs[ 4 ] = meshDescBuilder.AppendVertex( FVector( 50.0, 50.0, 0.0 ) );   // Corner 4

	// 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.7071, 0, 0.7071 ) );
	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.7071, 0, 0.7071 ) );
	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.7071, 0, 0.7071 ) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );

	// Face 2 (Faces -Y) vertex instances
	instance = meshDescBuilder.AppendInstance( vertexIDs[ 0 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0, -0.7071, 0.7071 ) );
	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[ 2 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0, -0.7071, 0.7071 ) );
	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[ 3 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0, -0.7071, 0.7071 ) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );

	// Face 3 (Faces towards +X) vertex instances
	instance = meshDescBuilder.AppendInstance( vertexIDs[ 0 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0.7071, 0, 0.7071 ) );
	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[ 3 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0.7071, 0, 0.7071 ) );
	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[ 4 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0.7071, 0, 0.7071 ) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );

	// Face 4 (Faces +Y) vertex instances
	instance = meshDescBuilder.AppendInstance( vertexIDs[ 0 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0, 0.7071, 0.7071 ) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 0.0, 1.0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );

	instance = meshDescBuilder.AppendInstance( vertexIDs[ 4 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0, 0.7071, 0.7071 ) );
	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[ 1 ] );
	meshDescBuilder.SetInstanceNormal( instance, FVector( 0, 0.7071, 0.7071 ) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );


	// flat bottom
	instance = meshDescBuilder.AppendInstance( vertexIDs[1]);
	meshDescBuilder.SetInstanceNormal( instance, FVector(0,0,-1) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 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,0,-1) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );

	instance = meshDescBuilder.AppendInstance( vertexIDs[3]);
	meshDescBuilder.SetInstanceNormal( instance, FVector(0,0,-1) );
	meshDescBuilder.SetInstanceUV( instance, FVector2D( 1, 0 ), 0 );
	meshDescBuilder.SetInstanceColor( instance, FVector4f( 1.0f, 1.0f, 1.0f, 1.0f ) );
	vertexInsts.Add( instance );

	instance = meshDescBuilder.AppendInstance( vertexIDs[4]);
	meshDescBuilder.SetInstanceNormal( instance, FVector(0,0,-1) );
	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
	// Face 1 Triangle
	meshDescBuilder.AppendTriangle( vertexInsts[ 2 ], vertexInsts[ 1 ], vertexInsts[ 0 ], polygonGroup );
	// Face 2 Triangle
	meshDescBuilder.AppendTriangle( vertexInsts[ 5 ], vertexInsts[ 4 ], vertexInsts[ 3 ], polygonGroup );
	// Face 3 Triangle
	meshDescBuilder.AppendTriangle( vertexInsts[ 8 ], vertexInsts[ 7 ], vertexInsts[ 6 ], polygonGroup );
	// Face 4 Triangle
	meshDescBuilder.AppendTriangle( vertexInsts[ 11 ], vertexInsts[ 10 ], vertexInsts[ 9 ], polygonGroup );

	// and two more
	meshDescBuilder.AppendTriangle( vertexInsts[12],vertexInsts[13],vertexInsts[14], polygonGroup );
	meshDescBuilder.AppendTriangle( vertexInsts[14],vertexInsts[15],vertexInsts[12], polygonGroup );
	
	UStaticMesh* staticMesh = NewObject<UStaticMesh>( this );
	FStaticMaterial Material(MattsMaterial);
	staticMesh->StaticMaterials.AddUnique(Material);
	//Materials.AddUnique(FStaticMaterial(Material)
	TArray<const FMeshDescription*> meshDescPtrs;
	meshDescPtrs.Emplace( &MeshDescription );
	staticMesh->BuildFromMeshDescriptions( meshDescPtrs );
	
	_smComp->SetStaticMesh(staticMesh);

	//UMaterialInstanceDynamic* DynMaterial = UMaterialInstanceDynamic::Create(MattsMaterial, this);

	for (int32 i = 0; i < _smComp->GetStaticMesh()->StaticMaterials.Num(); i++)
	{
		if (_smComp->GetStaticMesh()->GetMaterial(i))
		{
			_smComp->SetMaterial(i, MattsMaterial);
			UE_LOG(LogTemp, Warning, TEXT("We found a material"));
		}
	}
	
}```