2021-06-02 17:20:15 +04:30
|
|
|
#include "ltpch.h"
|
|
|
|
#include "dxVertexLayout.h"
|
2021-07-01 19:25:46 +04:30
|
|
|
#include "dxSharedContext.h"
|
2021-06-02 17:20:15 +04:30
|
|
|
|
|
|
|
#include "dxShader.h"
|
|
|
|
|
|
|
|
namespace Light {
|
|
|
|
|
2021-07-26 11:43:37 +04:30
|
|
|
dxVertexLayout::dxVertexLayout(Ref<Shader> shader, const std::vector<std::pair<std::string, VertexElementType>>& elements, Ref<dxSharedContext> sharedContext)
|
2021-06-19 15:12:42 +04:30
|
|
|
: m_Context(sharedContext)
|
2021-06-02 17:20:15 +04:30
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
// occupy space for input elements
|
2021-06-02 17:20:15 +04:30
|
|
|
std::vector<D3D11_INPUT_ELEMENT_DESC> inputElementsDesc;
|
|
|
|
inputElementsDesc.reserve(elements.size());
|
|
|
|
|
2021-06-19 15:12:42 +04:30
|
|
|
// extract elements desc
|
2021-06-02 17:20:15 +04:30
|
|
|
for (const auto& element : elements)
|
|
|
|
{
|
|
|
|
inputElementsDesc.emplace_back(D3D11_INPUT_ELEMENT_DESC{
|
2021-06-19 15:12:42 +04:30
|
|
|
element.first.c_str(),
|
|
|
|
0u,
|
|
|
|
GetDxgiFormat(element.second),
|
|
|
|
0u,
|
|
|
|
D3D11_APPEND_ALIGNED_ELEMENT,
|
|
|
|
D3D11_INPUT_PER_VERTEX_DATA,
|
2021-07-05 14:36:36 +04:30
|
|
|
0u });
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
|
2021-07-26 11:43:37 +04:30
|
|
|
Ref<dxShader> dxpShader = std::dynamic_pointer_cast<dxShader>(shader);
|
2021-07-01 19:25:46 +04:30
|
|
|
LT_ENGINE_ASSERT(dxpShader, "dxVertexLayout::dxVertexLayout: failed to cast 'Shader' to 'dxShader'");
|
2021-06-02 17:20:15 +04:30
|
|
|
|
2021-06-21 18:08:25 +04:30
|
|
|
// create input layout (vertex layout)
|
2021-06-19 15:12:42 +04:30
|
|
|
HRESULT hr;
|
2021-07-01 19:25:46 +04:30
|
|
|
DXC(m_Context->GetDevice()->CreateInputLayout(&inputElementsDesc[0], inputElementsDesc.size(), dxpShader->GetVertexBlob().Get()->GetBufferPointer(), dxpShader->GetVertexBlob().Get()->GetBufferSize(), &m_InputLayout));
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
|
|
|
|
dxVertexLayout::~dxVertexLayout()
|
|
|
|
{
|
2021-06-19 15:12:42 +04:30
|
|
|
UnBind();
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
|
|
|
|
void dxVertexLayout::Bind()
|
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
m_Context->GetDeviceContext()->IASetInputLayout(m_InputLayout.Get());
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
|
|
|
|
void dxVertexLayout::UnBind()
|
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
m_Context->GetDeviceContext()->IASetInputLayout(nullptr);
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
|
|
|
|
DXGI_FORMAT dxVertexLayout::GetDxgiFormat(VertexElementType type)
|
|
|
|
{
|
|
|
|
switch (type)
|
|
|
|
{
|
2021-07-01 19:25:46 +04:30
|
|
|
// #todo: add char
|
2021-06-19 15:12:42 +04:30
|
|
|
// int
|
2021-06-02 17:20:15 +04:30
|
|
|
case Light::VertexElementType::Int1: return DXGI_FORMAT_R32_SINT;
|
|
|
|
case Light::VertexElementType::Int2: return DXGI_FORMAT_R32G32_SINT;
|
|
|
|
case Light::VertexElementType::Int3: return DXGI_FORMAT_R32G32B32_SINT;
|
|
|
|
case Light::VertexElementType::Int4: return DXGI_FORMAT_R32G32B32A32_SINT;
|
2021-06-19 15:12:42 +04:30
|
|
|
|
|
|
|
// uint
|
2021-06-02 17:20:15 +04:30
|
|
|
case Light::VertexElementType::UInt1: return DXGI_FORMAT_R32_UINT;
|
|
|
|
case Light::VertexElementType::UInt2: return DXGI_FORMAT_R32G32_UINT;
|
|
|
|
case Light::VertexElementType::UInt3: return DXGI_FORMAT_R32G32B32_UINT;
|
|
|
|
case Light::VertexElementType::UInt4: return DXGI_FORMAT_R32G32B32A32_UINT;
|
2021-06-19 15:12:42 +04:30
|
|
|
|
|
|
|
// float
|
2021-06-02 17:20:15 +04:30
|
|
|
case Light::VertexElementType::Float1: return DXGI_FORMAT_R32_FLOAT;
|
|
|
|
case Light::VertexElementType::Float2: return DXGI_FORMAT_R32G32_FLOAT;
|
|
|
|
case Light::VertexElementType::Float3: return DXGI_FORMAT_R32G32B32_FLOAT;
|
|
|
|
case Light::VertexElementType::Float4: return DXGI_FORMAT_R32G32B32A32_FLOAT;
|
|
|
|
|
2021-06-19 15:12:42 +04:30
|
|
|
// #todo:
|
2021-06-02 17:20:15 +04:30
|
|
|
case Light::VertexElementType::Double1:
|
|
|
|
case Light::VertexElementType::Double2:
|
|
|
|
case Light::VertexElementType::Double3:
|
|
|
|
case Light::VertexElementType::Double4:
|
|
|
|
|
2021-07-01 19:25:46 +04:30
|
|
|
default: LT_ENGINE_ASSERT(false, "dxVertexLayout::GetDxgiFormat: invalid 'VertexElementType'");
|
2021-06-02 17:20:15 +04:30
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|