52 struct BufferElement {
59 BufferElement() =
default;
61 BufferElement(ShaderDataType type,
const std::string &name,
bool isNormalized =
false)
62 : name(name), type(type), size(ShaderDataTypeSize(type)), offset(0),
63 isNormalized(isNormalized) {}
65 uint32_t GetComponentCount()
const {
67 case ShaderDataType::Float:
69 case ShaderDataType::Float2:
71 case ShaderDataType::Float3:
73 case ShaderDataType::Float4:
75 case ShaderDataType::Mat3:
77 case ShaderDataType::Mat4:
79 case ShaderDataType::Int:
81 case ShaderDataType::Int2:
83 case ShaderDataType::Int3:
85 case ShaderDataType::Int4:
87 case ShaderDataType::Bool:
91 ZEN_LOG_ERROR(
"Unknown ShaderDataType");
100 BufferLayout(
const std::initializer_list<BufferElement> &elements) : m_elements(elements) {
101 _calculateOffsetAndStride();
104 uint32_t getStride()
const {
return m_stride; }
105 inline const std::vector<BufferElement> &getElements()
const {
return m_elements; }
107 std::vector<BufferElement>::iterator begin() {
return m_elements.begin(); }
108 std::vector<BufferElement>::iterator end() {
return m_elements.end(); }
109 std::vector<BufferElement>::const_iterator begin()
const {
return m_elements.begin(); }
110 std::vector<BufferElement>::const_iterator end()
const {
return m_elements.end(); }
113 void _calculateOffsetAndStride() {
116 for (
auto &element : m_elements) {
117 element.offset = offset;
118 offset += element.size;
119 m_stride += element.size;
124 std::vector<BufferElement> m_elements;
125 uint32_t m_stride = 0;