From 0ecd655f78046ea7680c1bace8d88b35a2d1e44a Mon Sep 17 00:00:00 2001
From: Sebastian Pape <Sebastian.Pape@rwth-aachen.de>
Date: Thu, 1 Aug 2019 17:40:50 +0200
Subject: [PATCH] Moved dynamic material init into post initialize method

---
 .../Private/CAVEOverlayController.cpp         | 41 +++++++++++++------
 .../Public/CAVEOverlayController.h            |  3 +-
 2 files changed, 30 insertions(+), 14 deletions(-)

diff --git a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
index 79d45af..d10d2db 100644
--- a/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
+++ b/Source/CAVEOverlay/Private/CAVEOverlayController.cpp
@@ -12,10 +12,9 @@ template<std::size_t SIZE> bool containsFString(const std::array<FString, SIZE>
 	return false;
 }
 
-UStaticMeshComponent* ACAVEOverlayController::createMeshComponent(const FName &name, UMaterialInterface* material, UStaticMesh* mesh, USceneComponent* parent) {
+UStaticMeshComponent* ACAVEOverlayController::createMeshComponent(const FName &name, UStaticMesh* mesh, USceneComponent* parent) {
 	UStaticMeshComponent* result = CreateDefaultSubobject<UStaticMeshComponent>(name);
 	result->SetStaticMesh(mesh);
-	result->SetMaterial(0, material);
 	result->SetupAttachment(parent);
 	result->SetVisibility(false);
 	return result;
@@ -56,18 +55,15 @@ ACAVEOverlayController::ACAVEOverlayController()
 	loadAsset("/CAVEOverlay/StopMaterial", sign_material_);
 	loadAsset("/CAVEOverlay/Plane", plane_mesh_);
 
-	tape_material_dynamic_ = UMaterialInstanceDynamic::Create(tape_material_, NULL);
-	sign_material_dynamic_ = UMaterialInstanceDynamic::Create(sign_material_, NULL);
+	tape_negative_y = createMeshComponent("TapeNegY", plane_mesh_, tape_root);
+	tape_negative_x = createMeshComponent("TapeNegX", plane_mesh_, tape_root);
+	tape_positive_y = createMeshComponent("TapePosY", plane_mesh_, tape_root);
+	tape_positive_x = createMeshComponent("TapePosX", plane_mesh_, tape_root);
 
-	tape_negative_y = createMeshComponent("TapeNegY", tape_material_dynamic_, plane_mesh_, tape_root);
-	tape_negative_x = createMeshComponent("TapeNegX", tape_material_dynamic_, plane_mesh_, tape_root);
-	tape_positive_y = createMeshComponent("TapePosY", tape_material_dynamic_, plane_mesh_, tape_root);
-	tape_positive_x = createMeshComponent("TapePosX", tape_material_dynamic_, plane_mesh_, tape_root);
-
-	sign_negative_y = createMeshComponent("SignNegY", sign_material_dynamic_, plane_mesh_, sign_root);
-	sign_negative_x = createMeshComponent("SignNegX", sign_material_dynamic_, plane_mesh_, sign_root);
-	sign_positive_y = createMeshComponent("SignPosY", sign_material_dynamic_, plane_mesh_, sign_root);
-	sign_positive_x = createMeshComponent("SignPosX", sign_material_dynamic_, plane_mesh_, sign_root);
+	sign_negative_y = createMeshComponent("SignNegY", plane_mesh_, sign_root);
+	sign_negative_x = createMeshComponent("SignNegX", plane_mesh_, sign_root);
+	sign_positive_y = createMeshComponent("SignPosY", plane_mesh_, sign_root);
+	sign_positive_x = createMeshComponent("SignPosX", plane_mesh_, sign_root);
 
 	//Set initial Position, Rotation and Scale of Tape
 	tape_negative_y->SetRelativeLocationAndRotation(FVector(0, -wall_distance_, 0), FRotator(0, 0, 90));
@@ -92,6 +88,25 @@ ACAVEOverlayController::ACAVEOverlayController()
 	sign_positive_x->SetRelativeScale3D(FVector(0.5f));
 }
 
+void ACAVEOverlayController::PostInitializeComponents()
+{
+	Super::PostInitializeComponents();
+
+	//Create dynamic materials in runtime
+	tape_material_dynamic_ = UMaterialInstanceDynamic::Create(tape_material_, tape_root);
+	sign_material_dynamic_ = UMaterialInstanceDynamic::Create(sign_material_, sign_root);
+
+	tape_negative_y->SetMaterial(0, tape_material_dynamic_);
+	tape_negative_x->SetMaterial(0, tape_material_dynamic_);
+	tape_positive_y->SetMaterial(0, tape_material_dynamic_);
+	tape_positive_x->SetMaterial(0, tape_material_dynamic_);
+
+	sign_negative_y->SetMaterial(0, sign_material_dynamic_);
+	sign_negative_x->SetMaterial(0, sign_material_dynamic_);
+	sign_positive_y->SetMaterial(0, sign_material_dynamic_);
+	sign_positive_x->SetMaterial(0, sign_material_dynamic_);
+}
+
 void ACAVEOverlayController::CycleDoorType()
 {
 	door_current_mode_ = static_cast<DOOR_MODE>((door_current_mode_ + 1) % DOOR_NUM_MODES);
diff --git a/Source/CAVEOverlay/Public/CAVEOverlayController.h b/Source/CAVEOverlay/Public/CAVEOverlayController.h
index dabd850..89679d1 100644
--- a/Source/CAVEOverlay/Public/CAVEOverlayController.h
+++ b/Source/CAVEOverlay/Public/CAVEOverlayController.h
@@ -34,6 +34,7 @@ public:
 protected:
 	// Called when the game starts or when spawned
 	virtual void BeginPlay() override;
+	virtual void PostInitializeComponents() override;
 
 private:
     //Execution Modes
@@ -64,7 +65,7 @@ private:
 	UDoorOverlayData* overlay_;
 
 	//Geometry and Material
-	UStaticMeshComponent* createMeshComponent(const FName &name, UMaterialInterface* material, UStaticMesh* mesh, USceneComponent* parent);
+	UStaticMeshComponent* createMeshComponent(const FName &name, UStaticMesh* mesh, USceneComponent* parent);
 	UMaterial* tape_material_ = nullptr;
 	UMaterial* sign_material_ = nullptr;
 	float calculateOpacityFromPosition(FVector position);
-- 
GitLab