verus/Verus/src/Scene/Mesh.h

134 lines
3.7 KiB
C
Raw Normal View History

2018-03-03 09:17:09 +01:00
#pragma once
namespace verus
{
namespace Scene
{
class Mesh : public BaseMesh
{
2019-07-01 20:39:32 +02:00
public:
#include "../Shaders/DS_Mesh.inc.hlsl"
2019-12-01 00:09:41 +01:00
enum PIPE
{
PIPE_MAIN,
2020-07-01 21:14:17 +02:00
PIPE_INSTANCED,
2020-08-02 01:00:00 +02:00
PIPE_PLANT,
2019-12-01 00:09:41 +01:00
PIPE_ROBOTIC,
PIPE_SKINNED,
2020-05-01 20:50:55 +02:00
2020-08-02 01:00:00 +02:00
PIPE_TESS,
PIPE_TESS_INSTANCED,
PIPE_TESS_PLANT,
PIPE_TESS_ROBOTIC,
PIPE_TESS_SKINNED,
2020-05-01 20:50:55 +02:00
PIPE_DEPTH,
2020-07-01 21:14:17 +02:00
PIPE_DEPTH_INSTANCED,
2020-08-02 01:00:00 +02:00
PIPE_DEPTH_PLANT,
2020-05-01 20:50:55 +02:00
PIPE_DEPTH_ROBOTIC,
PIPE_DEPTH_SKINNED,
2020-08-02 01:00:00 +02:00
PIPE_DEPTH_TESS,
PIPE_DEPTH_TESS_INSTANCED,
PIPE_DEPTH_TESS_PLANT,
PIPE_DEPTH_TESS_ROBOTIC,
PIPE_DEPTH_TESS_SKINNED,
2020-05-01 20:50:55 +02:00
PIPE_WIREFRAME,
2020-07-01 21:14:17 +02:00
PIPE_WIREFRAME_INSTANCED,
2020-05-01 20:50:55 +02:00
PIPE_WIREFRAME_ROBOTIC,
PIPE_WIREFRAME_SKINNED,
PIPE_COUNT
2019-12-01 00:09:41 +01:00
};
2019-07-01 20:39:32 +02:00
struct PerInstanceData
{
Vector4 _matPart0 = Vector4(0);
Vector4 _matPart1 = Vector4(0);
Vector4 _matPart2 = Vector4(0);
Vector4 _instData = Vector4(0);
};
private:
2020-05-01 20:50:55 +02:00
static CGI::ShaderPwn s_shader;
static CGI::PipelinePwns<PIPE_COUNT> s_pipe;
static UB_PerFrame s_ubPerFrame;
static UB_PerMaterialFS s_ubPerMaterialFS;
static UB_PerMeshVS s_ubPerMeshVS;
static UB_SkeletonVS s_ubSkeletonVS;
static UB_PerObject s_ubPerObject;
2019-07-01 20:39:32 +02:00
2019-08-01 22:38:55 +02:00
CGI::GeometryPwn _geo;
Vector<PerInstanceData> _vInstanceBuffer;
2020-01-02 20:23:47 +01:00
int _instanceCapacity = 0;
int _instanceCount = 0;
2020-07-01 21:14:17 +02:00
int _firstInstance = 0;
2019-08-01 22:38:55 +02:00
UINT32 _bindingsMask = 0;
2019-07-01 20:39:32 +02:00
public:
2019-08-01 22:38:55 +02:00
struct Desc
{
2020-08-02 01:00:00 +02:00
CSZ _url = nullptr;
CSZ _warpUrl = nullptr;
int _instanceCapacity = 0;
bool _initShape = false;
2019-08-01 22:38:55 +02:00
Desc(CSZ url = nullptr) : _url(url) {}
};
VERUS_TYPEDEFS(Desc);
2020-06-01 18:25:41 +02:00
struct DrawDesc
{
Transform3 _matW = Transform3::identity();
CGI::CSHandle _cshMaterial;
bool _allowTess = true;
};
VERUS_TYPEDEFS(DrawDesc);
2019-07-01 20:39:32 +02:00
Mesh();
virtual ~Mesh();
static void InitStatic();
static void DoneStatic();
2019-08-01 22:38:55 +02:00
void Init(RcDesc desc = Desc());
2019-07-01 20:39:32 +02:00
void Done();
2020-06-01 18:25:41 +02:00
void Draw(RcDrawDesc dd, CGI::CommandBufferPtr cb);
2019-12-01 00:09:41 +01:00
void BindPipeline(PIPE pipe, CGI::CommandBufferPtr cb);
2020-05-01 20:50:55 +02:00
void BindPipeline(CGI::CommandBufferPtr cb, bool allowTess = true);
2020-08-02 01:00:00 +02:00
void BindPipelineInstanced(CGI::CommandBufferPtr cb, bool allowTess = true, bool plant = false);
2019-12-01 00:09:41 +01:00
void BindGeo(CGI::CommandBufferPtr cb);
void BindGeo(CGI::CommandBufferPtr cb, UINT32 bindingsFilter);
2019-07-01 20:39:32 +02:00
static CGI::ShaderPtr GetShader() { return s_shader; }
2019-11-03 09:31:18 +01:00
static UB_PerMaterialFS& GetUbPerMaterialFS() { return s_ubPerMaterialFS; }
2020-08-02 01:00:00 +02:00
void UpdateUniformBufferPerFrame(float invTessDist = 0);
2019-11-03 09:31:18 +01:00
void UpdateUniformBufferPerMeshVS();
void UpdateUniformBufferSkeletonVS();
2020-05-01 20:50:55 +02:00
void UpdateUniformBufferPerObject(RcTransform3 tr, RcVector4 color = Vector4(0.5f, 0.5f, 0.5f, 1));
void UpdateUniformBufferPerObject(Point3 pos, RcVector4 color = Vector4(0.5f, 0.5f, 0.5f, 1));
2019-07-01 20:39:32 +02:00
CGI::GeometryPtr GetGeometry() const { return _geo; }
virtual void CreateDeviceBuffers() override;
2020-05-01 20:50:55 +02:00
virtual void UpdateVertexBuffer(const void* p, int binding) override;
2019-08-01 22:38:55 +02:00
// Instancing:
2020-08-02 01:00:00 +02:00
void ResetInstanceCount();
void MarkFirstInstance() { _firstInstance = _instanceCount; }
2019-08-01 22:38:55 +02:00
void PushInstance(RcTransform3 matW, RcVector4 instData);
bool IsInstanceBufferFull();
2020-07-01 21:14:17 +02:00
bool IsInstanceBufferEmpty(bool fromFirstInstance = false);
2020-08-02 01:00:00 +02:00
2019-08-01 22:38:55 +02:00
void UpdateInstanceBuffer();
2020-07-01 21:14:17 +02:00
int GetInstanceCount(bool fromFirstInstance = false) const { return fromFirstInstance ? _instanceCount - _firstInstance : _instanceCount; }
2020-01-02 20:23:47 +01:00
int GetInstanceCapacity() const { return _instanceCapacity; }
2020-07-01 21:14:17 +02:00
int GetFirstInstance() const { return _firstInstance; }
2018-03-03 09:17:09 +01:00
};
2019-08-01 22:38:55 +02:00
VERUS_TYPEDEFS(Mesh);
2018-03-03 09:17:09 +01:00
}
}