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"));
}
}
}```