verus/Verus/src/Scene/Mesh.h

95 lines
2.5 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,
PIPE_DEPTH_ROBOTIC,
PIPE_DEPTH_SKINNED,
PIPE_INSTANCED,
PIPE_ROBOTIC,
PIPE_SKINNED,
PIPE_MAX
};
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:
2019-12-01 00:09:41 +01:00
static CGI::ShaderPwn s_shader;
static CGI::PipelinePwns<PIPE_MAX> 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;
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
{
CSZ _url = nullptr;
2020-04-01 22:21:16 +02:00
CSZ _warpUrl = nullptr;
2020-01-02 20:23:47 +01:00
int _instanceCapacity = 1;
2019-08-01 22:38:55 +02:00
Desc(CSZ url = nullptr) : _url(url) {}
};
VERUS_TYPEDEFS(Desc);
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();
2019-12-01 00:09:41 +01:00
void BindPipeline(PIPE pipe, CGI::CommandBufferPtr cb);
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; }
2019-09-01 13:49:15 +02:00
void UpdateUniformBufferPerFrame();
2019-11-03 09:31:18 +01:00
void UpdateUniformBufferPerMaterialFS();
void UpdateUniformBufferPerMeshVS();
void UpdateUniformBufferSkeletonVS();
2019-12-01 00:09:41 +01:00
void UpdateUniformBufferPerObject(RcTransform3 tr);
2019-08-01 22:38:55 +02:00
void UpdateUniformBufferPerObject(Point3 pos);
2019-07-01 20:39:32 +02:00
CGI::GeometryPtr GetGeometry() const { return _geo; }
virtual void CreateDeviceBuffers() override;
virtual void BufferDataVB(const void* p, int binding) override;
2019-08-01 22:38:55 +02:00
// Instancing:
void PushInstance(RcTransform3 matW, RcVector4 instData);
bool IsInstanceBufferFull();
bool IsInstanceBufferEmpty();
2020-03-09 20:45:55 +01:00
void ResetInstanceCount();
2019-08-01 22:38:55 +02:00
void UpdateInstanceBuffer();
2020-01-02 20:23:47 +01:00
int GetInstanceCount() const { return _instanceCount; }
int GetInstanceCapacity() const { return _instanceCapacity; }
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
}
}