void ADraggableMoveTile::UpdateIndicator()
{
	auto indicatorBody = indicatorParticle->EmitterInstances[0];
	auto Z_offset = FVector(0.0f, 0.0f, 30.0f);
	auto sourcePoint = GetActorLocation() + Z_offset;
	auto targetPoint = newGoalPos;
	targetPoint += Z_offset;

	if (isSelected)
	{
		arrowMeshComponent->SetHiddenInGame(false);
		indicatorBody->SetBeamSourcePoint(sourcePoint, 0);
		indicatorBody->SetBeamTargetPoint(targetPoint, 0);
		arrowMeshComponent->SetWorldLocation(targetPoint);
		auto rot = FRotationMatrix::MakeFromX(targetPoint - sourcePoint);
		arrowMeshComponent->SetWorldRotation(rot.Rotator());
	}
	else
	{
		indicatorBody->SetBeamSourcePoint(GetActorLocation(), 0);
		indicatorBody->SetBeamTargetPoint(GetActorLocation(), 0);
		arrowMeshComponent->SetWorldLocation(GetActorLocation());
		arrowMeshComponent->SetWorldRotation(FRotationMatrix::Identity.Rotator());
		arrowMeshComponent->SetHiddenInGame(true);
	}

	auto indicatorBodyMaterial = indicatorParticle->CreateDynamicMaterialInstance(0);
	indicatorBodyMaterial->SetScalarParameterValue(TEXT("IsDestinationValid"), canSnap && !destinationOccupied ? 1.0f : 0.0f);

	auto arrowMaterial = arrowMeshComponent->CreateDynamicMaterialInstance(0);
	arrowMaterial->SetScalarParameterValue(TEXT("IsDestinationValid"), canSnap && !destinationOccupied ? 1.0f : 0.0f);
}
void UMaterialInstanceDynamic::K2_InterpolateMaterialInstanceParams(UMaterialInstance* MaterialA, UMaterialInstance* MaterialB, float Alpha)
{
	if (MaterialA != NULL && MaterialB != NULL)
	{
		// Interpolate the scalar parameters common to both materials
		for( int32 ParamIdx = 0; ParamIdx < MaterialA->ScalarParameterValues.Num(); ParamIdx++ )
		{
			FScalarParameterValue* MaterialAParam = &MaterialA->ScalarParameterValues[ParamIdx];
			FScalarParameterValue* MaterialBParam = GameThread_FindParameterByName(MaterialB->ScalarParameterValues, MaterialAParam->ParameterName);

			// Found a parameter common to both...
			if( MaterialBParam )
			{
				SetScalarParameterValue(MaterialAParam->ParameterName, FMath::Lerp(MaterialAParam->ParameterValue, MaterialBParam->ParameterValue, Alpha));
			}
		}

		// Interpolate the vector parameters common to both
		for( int32 ParamIdx = 0; ParamIdx < MaterialA->VectorParameterValues.Num(); ParamIdx++ )
		{
			FVectorParameterValue* MaterialAParam = &MaterialA->VectorParameterValues[ParamIdx];
			FVectorParameterValue* MaterialBParam = GameThread_FindParameterByName(MaterialB->VectorParameterValues, MaterialAParam->ParameterName);

			// Found a parameter common to both...
			if( MaterialBParam )
			{
				SetVectorParameterValue(MaterialAParam->ParameterName, FMath::Lerp(MaterialAParam->ParameterValue, MaterialBParam->ParameterValue, Alpha));
			}
		}
	}
}