I am trying to draw text on my material dynamically through code however my mesh is always all black, I guess there must be some problem on my code, any clues what I am missing?
My class is a simple AActor with the following code:
#include "GameCube.h"
#include "Engine/StaticMesh.h"
#include "Materials/MaterialInstanceDynamic.h"
#include "UObject/Object.h"
#include "MaterialsEnum.h"
#include "Materials/Material.h"
#include "Math/UnrealMathUtility.h"
#include "Engine/Canvas.h"
#include "Engine/CanvasRenderTarget2D.h"
#include "Internationalization/Text.h"
// Sets default values
AGameCube::AGameCube()
{
// 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;
UStaticMesh* cubeMesh = nullptr;
static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeMeshAsset(TEXT("/Game/Meshes/GameCube"));
if (CubeMeshAsset.Succeeded()) {
cubeMesh = CubeMeshAsset.Object;
}
CubeMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("GameCube"), false);
if(CubeMesh && cubeMesh) {
CubeMesh->SetStaticMesh(cubeMesh);
}
CubeMesh->SetSimulatePhysics(true);
CubeMesh->SetCollisionObjectType(ECollisionChannel::ECC_PhysicsBody);
CubeMesh->SetWorldScale3D(FVector(2.f,2.f,2.f));
SetRootComponent(CubeMesh);
UFont* font = nullptr;
static ConstructorHelpers::FObjectFinder<UFont> Font(TEXT("/Game/Fonts/MyFont"));
if (Font.Succeeded()) {
font = Font.Object;
}
MyFont = font;
}
void AGameCube::DrawToCanvasRenderTarget(UCanvas* Canvas, int32 Width, int32 Height)
{
//Drawing code with UCanvas goes here...
Canvas->DrawText(MyFont, FText::FromString("This is a test"), 0, 0);
UE_LOG(LogTemp, Warning, TEXT("Coming here"));
}
void AGameCube::Init(TMap<int32, FMaterials> MaterialsMap)
{
CanvasRenderTarget = Cast<UCanvasRenderTarget2D>(UCanvasRenderTarget2D::CreateCanvasRenderTarget2D(GetWorld(), UCanvasRenderTarget2D::StaticClass(), 1024, 1024));
CanvasRenderTarget->OnCanvasRenderTargetUpdate.AddDynamic(this, &AGameCube::DrawToCanvasRenderTarget);
CanvasRenderTarget->UpdateResource();
UMaterialInstanceDynamic* MaterialInstance = UMaterialInstanceDynamic::Create(MaterialsMap[0].MaterialEntries[0], CubeMesh);
MaterialInstance->SetTextureParameterValue(FName("TextureMaterial"), CanvasRenderTarget);
CubeMesh->SetMaterial(0, MaterialInstance);
CubeMesh->SetMaterial(1, MaterialInstance);
CubeMesh->SetMaterial(2, MaterialInstance);
CubeMesh->SetMaterial(3, MaterialInstance);
CubeMesh->SetMaterial(4, MaterialInstance);
CubeMesh->SetMaterial(5, MaterialInstance);
CanvasRenderTarget->UpdateResource();
}
And here is my material definition on the editor , where I have a TextureSampleParameter2D with the same name I am using on SetTextureParameterValue: