ralpha-assets/Plugins/CesiumForUnreal/Source/CesiumRuntime/Private/CesiumGltfLinesSceneProxy.cpp

102 lines
3.5 KiB
C++

// Copyright 2020-2024 CesiumGS, Inc. and Contributors
#include "CesiumGltfLinesSceneProxy.h"
#include "CesiumGltfLinesComponent.h"
#include "DataDrivenShaderPlatformInfo.h"
#include "Engine/StaticMesh.h"
#include "RHIResources.h"
#include "Runtime/Launch/Resources/Version.h"
#include "SceneInterface.h"
#include "SceneView.h"
SIZE_T FCesiumGltfLinesSceneProxy::GetTypeHash() const {
static size_t UniquePointer;
return reinterpret_cast<size_t>(&UniquePointer);
}
FCesiumGltfLinesSceneProxy::FCesiumGltfLinesSceneProxy(
UCesiumGltfLinesComponent* InComponent,
FSceneInterfaceWrapper InSceneInterfaceParams)
: FPrimitiveSceneProxy(InComponent),
RenderData(InComponent->GetStaticMesh()->GetRenderData()),
NumLines(RenderData->LODResources[0].IndexBuffer.GetNumIndices() / 2),
Material(InComponent->GetMaterial(0)),
MaterialRelevance(
InSceneInterfaceParams.GetMaterialRelevance(InComponent)) {}
FCesiumGltfLinesSceneProxy::~FCesiumGltfLinesSceneProxy() {}
void FCesiumGltfLinesSceneProxy::DrawStaticElements(
FStaticPrimitiveDrawInterface* PDI) {
if (!HasViewDependentDPG()) {
FMeshBatch Mesh;
CreateMesh(Mesh);
PDI->DrawMesh(Mesh, FLT_MAX);
}
}
void FCesiumGltfLinesSceneProxy::GetDynamicMeshElements(
const TArray<const FSceneView*>& Views,
const FSceneViewFamily& ViewFamily,
uint32 VisibilityMap,
FMeshElementCollector& Collector) const {
QUICK_SCOPE_CYCLE_COUNTER(STAT_GltfLinesSceneProxy_GetDynamicMeshElements);
for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ViewIndex++) {
if (VisibilityMap & (1 << ViewIndex)) {
const FSceneView* View = Views[ViewIndex];
FMeshBatch& Mesh = Collector.AllocateMesh();
CreateMesh(Mesh);
Collector.AddMesh(ViewIndex, Mesh);
}
}
}
FPrimitiveViewRelevance
FCesiumGltfLinesSceneProxy::GetViewRelevance(const FSceneView* View) const {
FPrimitiveViewRelevance Result;
Result.bDrawRelevance = IsShown(View);
if (HasViewDependentDPG()) {
Result.bDynamicRelevance = true;
} else {
Result.bStaticRelevance = true;
}
Result.bRenderCustomDepth = ShouldRenderCustomDepth();
Result.bRenderInMainPass = ShouldRenderInMainPass();
Result.bRenderInDepthPass = ShouldRenderInDepthPass();
Result.bUsesLightingChannels =
GetLightingChannelMask() != GetDefaultLightingChannelMask();
Result.bShadowRelevance = IsShadowCast(View);
Result.bVelocityRelevance =
IsMovable() & Result.bOpaque & Result.bRenderInMainPass;
MaterialRelevance.SetPrimitiveViewRelevance(Result);
return Result;
}
uint32 FCesiumGltfLinesSceneProxy::GetMemoryFootprint(void) const {
return (sizeof(*this) + GetAllocatedSize());
}
void FCesiumGltfLinesSceneProxy::CreateMesh(FMeshBatch& Mesh) const {
Mesh.VertexFactory = &RenderData->LODVertexFactories[0].VertexFactory;
Mesh.MaterialRenderProxy = Material->GetRenderProxy();
Mesh.ReverseCulling = IsLocalToWorldDeterminantNegative();
Mesh.Type = PT_LineList;
Mesh.DepthPriorityGroup = SDPG_World;
Mesh.LODIndex = 0;
Mesh.bCanApplyViewModeOverrides = false;
Mesh.bUseAsOccluder = false;
Mesh.bWireframe = false;
FMeshBatchElement& BatchElement = Mesh.Elements[0];
BatchElement.IndexBuffer = &RenderData->LODResources[0].IndexBuffer;
BatchElement.NumPrimitives = NumLines;
BatchElement.FirstIndex = 0;
BatchElement.MinVertexIndex = 0;
BatchElement.MaxVertexIndex = BatchElement.NumPrimitives;
}