2019-12-27 09:26:59 -05:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
2019-10-01 20:41:42 -04:00
|
|
|
|
2021-06-12 14:30:22 -04:00
|
|
|
#include "Components/BaseDynamicMeshComponent.h"
|
2021-06-17 19:18:41 -04:00
|
|
|
#include "Components/BaseDynamicMeshSceneProxy.h"
|
2019-10-01 20:41:42 -04:00
|
|
|
|
2021-03-09 19:33:56 -04:00
|
|
|
using namespace UE::Geometry;
|
2019-10-01 20:41:42 -04:00
|
|
|
|
|
|
|
|
UBaseDynamicMeshComponent::UBaseDynamicMeshComponent(const FObjectInitializer& ObjectInitializer)
|
|
|
|
|
: Super(ObjectInitializer)
|
|
|
|
|
{
|
|
|
|
|
}
|
2019-12-19 18:07:47 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-06-17 19:18:41 -04:00
|
|
|
void UBaseDynamicMeshComponent::SetShadowsEnabled(bool bEnabled)
|
|
|
|
|
{
|
|
|
|
|
// finish any drawing so that we can be certain our SceneProxy is no longer in use before we rebuild it below
|
|
|
|
|
FlushRenderingCommands();
|
|
|
|
|
|
|
|
|
|
SetCastShadow(bEnabled);
|
|
|
|
|
//bCastDynamicShadow = bEnabled;
|
|
|
|
|
|
|
|
|
|
// apparently SceneProxy has to be fully rebuilt to change shadow state
|
|
|
|
|
|
|
|
|
|
// this marks the SceneProxy for rebuild, but not immediately, and possibly allows bad things to happen
|
|
|
|
|
// before the end of the frame
|
|
|
|
|
//MarkRenderStateDirty();
|
|
|
|
|
|
|
|
|
|
// force immediate rebuild of the SceneProxy
|
|
|
|
|
if (IsRegistered())
|
|
|
|
|
{
|
|
|
|
|
ReregisterComponent();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2019-12-19 18:07:47 -05:00
|
|
|
void UBaseDynamicMeshComponent::SetOverrideRenderMaterial(UMaterialInterface* Material)
|
|
|
|
|
{
|
|
|
|
|
if (OverrideRenderMaterial != Material)
|
|
|
|
|
{
|
|
|
|
|
OverrideRenderMaterial = Material;
|
|
|
|
|
NotifyMaterialSetUpdated();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UBaseDynamicMeshComponent::ClearOverrideRenderMaterial()
|
|
|
|
|
{
|
|
|
|
|
if (OverrideRenderMaterial != nullptr)
|
|
|
|
|
{
|
|
|
|
|
OverrideRenderMaterial = nullptr;
|
|
|
|
|
NotifyMaterialSetUpdated();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void UBaseDynamicMeshComponent::SetSecondaryRenderMaterial(UMaterialInterface* Material)
|
|
|
|
|
{
|
|
|
|
|
if (SecondaryRenderMaterial != Material)
|
|
|
|
|
{
|
|
|
|
|
SecondaryRenderMaterial = Material;
|
|
|
|
|
NotifyMaterialSetUpdated();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UBaseDynamicMeshComponent::ClearSecondaryRenderMaterial()
|
|
|
|
|
{
|
|
|
|
|
if (SecondaryRenderMaterial != nullptr)
|
|
|
|
|
{
|
|
|
|
|
SecondaryRenderMaterial = nullptr;
|
|
|
|
|
NotifyMaterialSetUpdated();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-01-27 20:11:15 -05:00
|
|
|
void UBaseDynamicMeshComponent::SetSecondaryBuffersVisibility(bool bSecondaryVisibility)
|
|
|
|
|
{
|
|
|
|
|
bDrawSecondaryBuffers = bSecondaryVisibility;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool UBaseDynamicMeshComponent::GetSecondaryBuffersVisibility() const
|
|
|
|
|
{
|
|
|
|
|
return bDrawSecondaryBuffers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-12-19 18:07:47 -05:00
|
|
|
|
|
|
|
|
int32 UBaseDynamicMeshComponent::GetNumMaterials() const
|
|
|
|
|
{
|
|
|
|
|
return BaseMaterials.Num();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UMaterialInterface* UBaseDynamicMeshComponent::GetMaterial(int32 ElementIndex) const
|
|
|
|
|
{
|
|
|
|
|
return (ElementIndex >= 0 && ElementIndex < BaseMaterials.Num()) ? BaseMaterials[ElementIndex] : nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2021-04-01 17:33:33 -04:00
|
|
|
FMaterialRelevance UBaseDynamicMeshComponent::GetMaterialRelevance(ERHIFeatureLevel::Type InFeatureLevel) const
|
|
|
|
|
{
|
|
|
|
|
FMaterialRelevance Result = UMeshComponent::GetMaterialRelevance(InFeatureLevel);
|
|
|
|
|
if (OverrideRenderMaterial)
|
|
|
|
|
{
|
|
|
|
|
Result |= OverrideRenderMaterial->GetRelevance_Concurrent(InFeatureLevel);
|
|
|
|
|
}
|
|
|
|
|
if (SecondaryRenderMaterial)
|
|
|
|
|
{
|
|
|
|
|
Result |= SecondaryRenderMaterial->GetRelevance_Concurrent(InFeatureLevel);
|
|
|
|
|
}
|
|
|
|
|
return Result;
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-19 18:07:47 -05:00
|
|
|
void UBaseDynamicMeshComponent::SetMaterial(int32 ElementIndex, UMaterialInterface* Material)
|
|
|
|
|
{
|
|
|
|
|
check(ElementIndex >= 0);
|
|
|
|
|
if (ElementIndex >= BaseMaterials.Num())
|
|
|
|
|
{
|
|
|
|
|
BaseMaterials.SetNum(ElementIndex + 1, false);
|
|
|
|
|
}
|
|
|
|
|
BaseMaterials[ElementIndex] = Material;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void UBaseDynamicMeshComponent::GetUsedMaterials(TArray<UMaterialInterface*>& OutMaterials, bool bGetDebugMaterials) const
|
|
|
|
|
{
|
|
|
|
|
UMeshComponent::GetUsedMaterials(OutMaterials, bGetDebugMaterials);
|
|
|
|
|
if (OverrideRenderMaterial != nullptr)
|
|
|
|
|
{
|
|
|
|
|
OutMaterials.Add(OverrideRenderMaterial);
|
|
|
|
|
}
|
|
|
|
|
if (SecondaryRenderMaterial != nullptr)
|
|
|
|
|
{
|
|
|
|
|
OutMaterials.Add(SecondaryRenderMaterial);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|