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
|
|
|
}
|
|
|
|
}
|