basketball_code / softgym /PyFlex /bindings /d3d12 /meshRendererD3D12.h
youqiwong's picture
Upload folder using huggingface_hub
0c51b93 verified
#ifndef MESH_RENDERER_D3D12_H
#define MESH_RENDERER_D3D12_H
#include "bufferD3D12.h"
#include "renderStateD3D12.h"
#include "meshRenderer.h"
// Predeclare so all use the same
struct ShadowMap;
namespace FlexSample {
using namespace nvidia;
struct MeshRendererD3D12;
struct RenderMeshD3D12: public RenderMesh
{
//NV_CO_DECLARE_POLYMORPHIC_CLASS(RenderMeshD3D12, RenderMesh);
public:
typedef RenderMesh Parent;
friend struct MeshRendererD3D12;
RenderMeshD3D12();
int initialize(const RenderStateD3D12& state, const MeshData& meshData);
int initialize(const RenderStateD3D12& state, const MeshData2& meshData);
protected:
void _setBufferNames();
VertexBufferD3D12 m_positionBuffer;
VertexBufferD3D12 m_normalBuffer;
VertexBufferD3D12 m_texcoordBuffer;
VertexBufferD3D12 m_colorBuffer;
IndexBufferD3D12 m_indexBuffer;
ptrdiff_t m_numVertices;
ptrdiff_t m_numFaces;
};
struct PointRenderAllocationD3D12: public RenderAllocation
{
typedef RenderAllocation Parent;
enum VertexViewType
{
// NOTE! Do not change order without fixing pipelines that use it!
VERTEX_VIEW_POSITION,
VERTEX_VIEW_DENSITY,
VERTEX_VIEW_PHASE,
VERTEX_VIEW_ANISOTROPY1,
VERTEX_VIEW_ANISOTROPY2,
VERTEX_VIEW_ANISOTROPY3,
VERTEX_VIEW_COUNT_OF,
};
enum
{
// For typical point rendering we don't need anisotropy, so typically just bind the first 3
NUM_DEFAULT_VERTEX_VIEWS = VERTEX_VIEW_PHASE + 1
};
/// Initialize state
void init(PrimitiveType primitiveType)
{
Parent::init(primitiveType);
D3D12_VERTEX_BUFFER_VIEW nullView = {};
for (int i = 0; i < _countof(m_vertexBufferViews); i++)
{
m_vertexBufferViews[i] = nullView;
}
D3D12_INDEX_BUFFER_VIEW nullIndexView = {};
m_indexBufferView = nullIndexView;
}
D3D12_VERTEX_BUFFER_VIEW m_vertexBufferViews[VERTEX_VIEW_COUNT_OF];
D3D12_INDEX_BUFFER_VIEW m_indexBufferView;
};
struct MeshRenderAllocationD3D12:public RenderAllocation
{
typedef RenderAllocation Parent;
// Vertex buffer viewer are in the order to be set
enum VertexViewType
{
// NOTE! Do not change order without fixing pipelines that use it!
VERTEX_VIEW_POSITION,
VERTEX_VIEW_NORMAL,
VERTEX_VIEW_TEX_COORDS,
VERTEX_VIEW_COLOR,
VERTEX_VIEW_COUNT_OF,
};
void init(PrimitiveType primType)
{
Parent::init(primType);
D3D12_VERTEX_BUFFER_VIEW nullView = {};
for (int i = 0; i < _countof(m_vertexBufferViews); i++)
{
m_vertexBufferViews[i] = nullView;
}
D3D12_INDEX_BUFFER_VIEW nullIndexView = {};
m_indexBufferView = nullIndexView;
}
D3D12_VERTEX_BUFFER_VIEW m_vertexBufferViews[VERTEX_VIEW_COUNT_OF];
D3D12_INDEX_BUFFER_VIEW m_indexBufferView;
};
struct LineRenderAllocationD3D12 :public RenderAllocation
{
typedef RenderAllocation Parent;
void init(PrimitiveType primType)
{
Parent::init(primType);
const D3D12_VERTEX_BUFFER_VIEW nullView = {};
m_vertexBufferView = nullView;
const D3D12_INDEX_BUFFER_VIEW nullIndexView = {};
m_indexBufferView = nullIndexView;
}
D3D12_VERTEX_BUFFER_VIEW m_vertexBufferView;
D3D12_INDEX_BUFFER_VIEW m_indexBufferView;
};
struct MeshRendererD3D12: public MeshRenderer
{
//NV_CO_DECLARE_POLYMORPHIC_CLASS(MeshRendererD3D12, MeshRenderer);
public:
typedef MeshRenderer Parent;
/// MeshRenderer
virtual int draw(RenderMesh* mesh, RenderPipeline* pipeline, const void* params) override;
virtual int drawImmediate(const MeshData& mesh, RenderPipeline* pipeline, const void* params) override;
virtual int drawImmediate(const MeshData2& meshData, RenderPipeline* pipeline, const void* params) override;
virtual int drawImmediate(const PointData& pointData, RenderPipeline* pipeline, const void* params) override;
virtual int drawImmediate(const LineData& lineData, RenderPipeline* pipeline, const void* params) override;
virtual RenderMesh* createMesh(const MeshData& meshData) override;
virtual RenderMesh* createMesh(const MeshData2& meshData) override;
virtual int allocateTransitory(const PointData& pointData, RenderAllocation& allocation, size_t sizeOfAlloc) override;
virtual int allocateTransitory(const MeshData& meshData, RenderAllocation& allocIn, size_t sizeofAlloc) override;
virtual int allocateTransitory(const MeshData2& meshData, RenderAllocation& allocation, size_t sizeofAlloc) override;
virtual int allocateTransitory(const LineData& lineData, RenderAllocation& allocation, size_t sizeOfAlloc) override;
virtual int drawTransitory(RenderAllocation& allocation, size_t sizeOfAlloc, RenderPipeline* pipeline, const void* params) override;
int initialize(const RenderStateD3D12& state);
MeshRendererD3D12();
/// Default drawing impls, can be used in pipelines
static int defaultDraw(const RenderAllocation& allocIn, size_t sizeOfAlloc, const void* platformState);
/// The input desc layout used
static const D3D12_INPUT_ELEMENT_DESC MeshInputElementDescs[4];
/// Layout for points
static const D3D12_INPUT_ELEMENT_DESC PointInputElementDescs[3];
protected:
D3D12_VERTEX_BUFFER_VIEW _newImmediateVertexBuffer(const void* data, int stride, ptrdiff_t numVertices);
D3D12_VERTEX_BUFFER_VIEW _newStridedImmediateVertexBuffer(const void* data, int srcStride, int dstStride, ptrdiff_t numElements);
D3D12_INDEX_BUFFER_VIEW _newImmediateIndexBuffer(const void* data, int stride, ptrdiff_t numIndices);
RenderStateD3D12 m_renderState;
};
} // namespace FlexSample
#endif