Files
2025-05-18 13:04:45 +08:00

131 lines
2.3 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "Misc/EnumClassFlags.h"
#include "Sampling/MeshImageBaker.h"
#include "Sampling/MeshImageBakingCache.h"
#include "Image/ImageBuilder.h"
#include "DynamicMesh/MeshTangents.h"
namespace UE
{
namespace Geometry
{
enum class EOcclusionMapType : uint8
{
None = 0,
AmbientOcclusion = 1,
BentNormal = 2,
All = 3
};
ENUM_CLASS_FLAGS(EOcclusionMapType);
class FMeshOcclusionMapBaker : public FMeshImageBaker
{
public:
virtual ~FMeshOcclusionMapBaker() {}
//
// Inputs
//
const TMeshTangents<double>* BaseMeshTangents = nullptr;
//
// Options
//
enum class EDistribution
{
Uniform,
Cosine
};
enum class ESpace
{
Tangent,
Object
};
EOcclusionMapType OcclusionType = EOcclusionMapType::All;
int32 NumOcclusionRays = 32;
double MaxDistance = TNumericLimits<double>::Max();
double SpreadAngle = 180.0;
EDistribution Distribution = EDistribution::Cosine;
// Ambient Occlusion
double BiasAngleDeg = 15.0;
double BlurRadius = 0.0;
// Bent Normal
ESpace NormalSpace = ESpace::Tangent;
//
// Compute functions
//
DYNAMICMESH_API virtual void Bake() override;
//
// Output
//
enum class EResult
{
AmbientOcclusion,
BentNormal
};
const TUniquePtr<TImageBuilder<FVector3f>>& GetResult(EResult Result) const
{
switch (Result)
{
case EResult::AmbientOcclusion:
return OcclusionBuilder;
case EResult::BentNormal:
return NormalBuilder;
default:
check(false);
return OcclusionBuilder;
}
}
TUniquePtr<TImageBuilder<FVector3f>> TakeResult(EResult Result)
{
switch (Result)
{
case EResult::AmbientOcclusion:
return MoveTemp(OcclusionBuilder);
case EResult::BentNormal:
return MoveTemp(NormalBuilder);
default:
check(false);
return MoveTemp(OcclusionBuilder);
}
}
//
// Utility
//
inline bool WantAmbientOcclusion() const
{
return ((OcclusionType & EOcclusionMapType::AmbientOcclusion) == EOcclusionMapType::AmbientOcclusion);
}
inline bool WantBentNormal() const
{
return ((OcclusionType & EOcclusionMapType::BentNormal) == EOcclusionMapType::BentNormal);
}
protected:
TUniquePtr<TImageBuilder<FVector3f>> OcclusionBuilder;
TUniquePtr<TImageBuilder<FVector3f>> NormalBuilder;
};
} // end namespace UE::Geometry
} // end namespace UE