Files
UnrealEngine/Engine/Source/ThirdParty/nvtesslib/src/nvtess.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

138 lines
4.4 KiB
C++

#ifndef NVTESS_H
#define NVTESS_H
namespace nv {
enum DestBufferMode
{
/**
This buffer contains dominant Edge and Corner Information for each vertex,
suitable for performing crack-free displacement mapping on top of flat tessellation.
*/
DBM_DominantEdgeAndCorner = 0,
/**
This buffer contains indices needed to use with PN-AEN, but does not contain
information to support crack-free displacement mapping.
*/
DBM_PnAenOnly = 1,
/**
This buffer contains PN-AEN information along with dominant corner information. This
information is sufficient to perform crack-free displacement mapping
*/
DBM_PnAenDominantCorner = 2,
/**
This buffer contains PN-AEN information along with dominant corner and edge information.
Although dominant edges can be inferred from PN-AEN information alone (making this mode
somewhat bloated compared to DBM_PnAenDominantCorner), it does remove the need for some
computation in the Hull Shader.
*/
DBM_PnAenDominantEdgeAndCorner = 3,
DestBufferMode_MAX
};
enum IndexBufferType
{
IBT_U16, // 16-bit indices
IBT_U32, // 32-bit indices
IndexBufferType_MAX
};
struct Vector3
{
float x, y, z;
inline bool operator==(const Vector3& rhs) const { return x == rhs.x && y == rhs.y && z == rhs.z; }
inline bool operator<(const Vector3& rhs) const { return x < rhs.x || y < rhs.y || z < rhs.z; }
};
struct Vector2
{
float x, y;
inline bool operator==(const Vector2& rhs) const { return x == rhs.x && y == rhs.y; }
inline bool operator<(const Vector2& rhs) const { return x < rhs.x || (x == rhs.x && y < rhs.y); }
};
struct Vertex
{
nv::Vector3 pos;
nv::Vector2 uv;
inline bool operator==(const Vertex& rhs) const { return pos == rhs.pos; }
inline bool operator<(const Vertex& rhs) const { return pos < rhs.pos; }
};
/**
This is a simple wrapper class around an index buffer. The index buffer must contain triangle lists,
strips are not currently supported. This class will be used to pass index buffers into the library
as well as be used for the mechanism to return the created indices back to the application.
The IndexBuffer class can either own the specified void* pointer (it will be freed by calling delete),
or the application can indicate that it will retain ownership.
*/
class IndexBuffer
{
private:
void* mBufferContents;
IndexBufferType mIbType;
unsigned int mLength;
bool mBufferOwner;
public:
IndexBuffer(void* bufferContents, IndexBufferType ibtype, unsigned int length, bool bufferOwner);
~IndexBuffer();
inline IndexBufferType getType() const { return mIbType; }
inline unsigned int getLength() const { return mLength; }
unsigned int operator[](unsigned int index) const;
};
class RenderBuffer
{
protected:
IndexBuffer* mIb;
public:
inline virtual ~RenderBuffer() { delete mIb; }
/** Return the vertex information at the specified index. */
virtual nv::Vertex getVertex(unsigned int index) const = 0;
const IndexBuffer* getIb() const { return mIb; }
};
namespace tess {
inline unsigned int getIndicesPerPatch(DestBufferMode destBufferMode)
{
switch (destBufferMode) {
case DBM_DominantEdgeAndCorner: return 12;
case DBM_PnAenOnly: return 9;
case DBM_PnAenDominantCorner: return 12;
case DBM_PnAenDominantEdgeAndCorner: return 18;
default: // todo: Error
break;
}
return 3;
}
/**
Returns an index buffer suitable for the technique specified by destBufferMode.
Ownership of the return buffer belongs to the application and will need to be freed using
delete.
@destBufferMode - One of the modes specified in DestBufferMode.
@completeBuffer - Whether the buffer returned should have all indices. If true, all
*/
IndexBuffer* buildTessellationBuffer(const RenderBuffer* inputBuffer, DestBufferMode destBufferMode, bool completeBuffer);
};
};
#endif /* NVTESS_H */