Files
UnrealEngineUWP/Engine/Source/Runtime/Experimental/GeometryCollectionEngine/Private/GeometryCollection/GeometryCollectionRenderData.h
robomerge 2e34b6a655 Make geometry collection convert vertex colors to sRGB when converting from FLinearColor to the render buffer FColor for new geometry collections.
For old geometry collections, keep the old behavior so that vertex colors are not changed unexpectedly on existing assets.  Add a bool on the UGeometryCollection asset object to let user control whether the conversion is performed.

#rb brice.criswell

[CL 25934820 by robomerge in ue5-main branch]
2023-06-12 15:24:20 -04:00

151 lines
4.4 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "RawIndexBuffer.h"
#include "Rendering/ColorVertexBuffer.h"
#include "Rendering/NaniteResources.h"
#include "Rendering/PositionVertexBuffer.h"
#include "Rendering/StaticMeshVertexBuffer.h"
class FGeometryCollection;
class UGeometryCollection;
/** Vertex Buffer for Bone Map. */
class FBoneMapVertexBuffer : public FVertexBuffer
{
public:
~FBoneMapVertexBuffer();
void Init(TArray<uint16> const& InBoneMap, bool bInNeedsCPUAccess = true);
void Serialize(FArchive& Ar, bool bInNeedsCPUAccess);
FRHIShaderResourceView* GetSRV() const { return VertexBufferSRV; }
FORCEINLINE uint16& BoneIndex(uint32 VertexIndex) const
{
checkSlow(VertexIndex < NumVertices);
return *(uint16*)(Data + VertexIndex * PixelFormatStride);
}
SIZE_T GetAllocatedSize() const { return (BoneMapData != nullptr) ? BoneMapData->GetResourceSize() : 0; }
protected:
void CleanUp();
void AllocateData(bool bInNeedsCPUAccess = true);
void ResizeBuffer(uint32 InNumVertices);
void InitRHI() override;
void ReleaseRHI() override;
static const EPixelFormat PixelFormat = PF_R16_UINT;
static const uint32 PixelFormatStride = 2;
private:
uint32 NumVertices = 0;
bool bNeedsCPUAccess = true;
FShaderResourceViewRHIRef VertexBufferSRV = nullptr;
FStaticMeshVertexDataInterface* BoneMapData = nullptr;
uint8* Data = nullptr;
};
/** Set of GPU vertex and index buffers required to render a geometry collection. */
struct FGeometryCollectionMeshResources
{
FRawStaticIndexBuffer IndexBuffer;
FPositionVertexBuffer PositionVertexBuffer;
FStaticMeshVertexBuffer StaticMeshVertexBuffer;
FColorVertexBuffer ColorVertexBuffer;
FBoneMapVertexBuffer BoneMapVertexBuffer;
/** Initialize the render resources. */
void InitResources(UGeometryCollection const& Owner);
/** Release the render resources. */
void ReleaseResources();
/** Serialization. */
void Serialize(FArchive& Ar);
};
/** Description of a single mesh element within a set of vertex and vertex buffers. */
struct FGeometryCollectionMeshElement
{
int16 TransformIndex;
uint8 MaterialIndex;
uint8 bIsInternal;
uint32 TriangleStart;
uint32 TriangleCount;
uint32 VertexStart;
uint32 VertexEnd;
/** Serialization. */
friend FArchive& operator<<(FArchive& Ar, FGeometryCollectionMeshElement& Item)
{
Ar << Item.TransformIndex << Item.MaterialIndex << Item.bIsInternal << Item.TriangleStart << Item.TriangleCount << Item.VertexStart << Item.VertexEnd;
return Ar;
}
};
/** CPU side data required to render a geometry collection. */
struct FGeometryCollectionMeshDescription
{
uint32 NumVertices = 0;
uint32 NumTriangles = 0;
// Bounds before any movement or skinning ever happens.
FBoxSphereBounds PreSkinnedBounds;
// Info on grouped material sections within vertex buffers.
// A section has a uniform material index and can contain multiple per-bone subsections.
TArray<FGeometryCollectionMeshElement> Sections;
// Info on grouped material sections within vertex buffers but with internal faces added by the fracture tool removed.
TArray<FGeometryCollectionMeshElement> SectionsNoInternal;
// Info on individual subsections within vertex buffers.
// A subsection has a uniform bone and material index.
TArray<FGeometryCollectionMeshElement> SubSections;
/** Serialization. */
void Serialize(FArchive& Ar);
};
/** Built render data compiled and ready for use by the geometry collection scene proxy. */
class FGeometryCollectionRenderData
{
public:
FGeometryCollectionRenderData() = default;
~FGeometryCollectionRenderData();
#if WITH_EDITOR
static TUniquePtr<FGeometryCollectionRenderData> Create(FGeometryCollection& InCollection, bool bInEnableNanite, bool bInUseFullPrecisionUVs, bool bConvertVertexColorsToSRGB);
#endif
bool IsInitialized()
{
return bIsInitialized;
}
/** Serialization. */
void Serialize(FArchive& Ar, UGeometryCollection& Owner);
/** Initialize the render resources. */
void InitResources(UGeometryCollection const& Owner);
/** Releases the render resources. */
void ReleaseResources();
bool bHasMeshData = false;
bool bHasNaniteData = false;
/** Mesh GPU resources. */
FGeometryCollectionMeshResources MeshResource;
/** Mesh CPU description. */
FGeometryCollectionMeshDescription MeshDescription;
/** Nanite resources. */
TPimplPtr<Nanite::FResources> NaniteResourcesPtr;
private:
bool bIsInitialized = false;
};