Files
UnrealEngine/Engine/Source/Runtime/Experimental/GeometryCollectionEngine/Public/GeometryCollection/GeometryCollectionRenderLevelSetActor.h
2025-05-18 13:04:45 +08:00

109 lines
3.8 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "GeometryCollection/GeometryCollection.h"
#include "Engine/VolumeTexture.h"
#include "Chaos/Levelset.h"
#include "Engine/StaticMesh.h"
#include "Components/PostProcessComponent.h"
#include "Materials/MaterialInstanceDynamic.h"
#include "GeometryCollectionRenderLevelSetActor.generated.h"
/**
* AGeometryCollectionRenderLevelSetActor
* An actor representing the collection of data necessary to
* render volumes. This references a ray marching material, which
* is used internally by a post process component blendable. This
* is a workflow that can be improved with a deeper implementation
* in the future if we decide to. Note that behavior with multiple
* render level set actors isn't currently supported very well,
* but could be improved in the future
*/
UCLASS(MinimalAPI)
class AGeometryCollectionRenderLevelSetActor : public AActor
{
GENERATED_UCLASS_BODY()
public:
static GEOMETRYCOLLECTIONENGINE_API int InstanceCount;
// Volume texture to fill
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Volume")
TObjectPtr<UVolumeTexture> TargetVolumeTexture;
// Material that performs ray marching. Note this must have certain parameters in order
// to work correctly
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rendering")
TObjectPtr<UMaterial> RayMarchMaterial;
// Surface tolerance used for rendering. When surface reconstruction is noisy,
// try tweaking this value
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rendering")
float SurfaceTolerance;
// Isovalue of the level set to use for surface reconstruction. Generally you want
// this to be zero, but it can be useful for exploring the distance values to make
// this negative to see the interior structure of the levelset
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rendering")
float Isovalue;
// Enable or disable rendering
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rendering")
bool Enabled;
// Enable or disable rendering
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rendering")
bool RenderVolumeBoundingBox;
// Find/create the level set renderer singleton actor as required. Return whether the found or created actor.
static GEOMETRYCOLLECTIONENGINE_API AGeometryCollectionRenderLevelSetActor* FindOrCreate(UWorld* World);
// Load a new level set to render
GEOMETRYCOLLECTIONENGINE_API bool SetLevelSetToRender(const Chaos::FLevelSet &LevelSet, const FTransform &LocalToWorld);
// Sync level set transform to the render material
GEOMETRYCOLLECTIONENGINE_API void SyncLevelSetTransform(const FTransform &LocalToWorld);
// Some initialization happens in here
GEOMETRYCOLLECTIONENGINE_API virtual void BeginPlay() override;
#if WITH_EDITOR
// Allowed for live updates to parameters from inside the editor when ejected
GEOMETRYCOLLECTIONENGINE_API virtual void PostEditChangeProperty(struct FPropertyChangedEvent& e) override;
#endif
// set and sync enabled
void SetEnabled(bool enabled)
{
Enabled = enabled;
PostProcessComponent->bEnabled = Enabled;
}
private:
FVector MinBBoxCorner;
FVector MaxBBoxCorner;
FMatrix WorldToLocal;
float VoxelSize;
UPostProcessComponent *PostProcessComponent;
// Dynamic material instance so we can update parameters based on volume changes
UMaterialInstanceDynamic* DynRayMarchMaterial;
// Synchronizes the state of this actor class with the post process render material
GEOMETRYCOLLECTIONENGINE_API void SyncMaterialParameters();
// Private for now since step size mult might not be super useful due to the current
// rendering algorithms employed in the shaders
// @todo: expose this in a meaningful way in the future if necessary
// UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Rendering")
float StepSizeMult;
};