122 lines
2.5 KiB
C++
Executable File

#pragma once
#include "Deer/Tools/Memory.h"
#include <string>
#include <vector>
namespace Deer {
enum class ShaderDataType {
None = 0,
FloatingPoint,
NormalizedFloatingPoint,
Integer
};
enum class DataType {
None = 0,
Half,
Half2,
Half3,
Half4,
Float,
Float2,
Float3,
Float4,
Byte,
Byte2,
Byte3,
Byte4,
Short,
Short2,
Short3,
Short4,
Int,
Int2,
Int3,
Int4,
Unsigned_Byte,
Unsigned_Byte2,
Unsigned_Byte3,
Unsigned_Byte4,
Unsigned_Short,
Unsigned_Short2,
Unsigned_Short3,
Unsigned_Short4,
Unsigned_Int,
Unsigned_Int2,
Unsigned_Int3,
Unsigned_Int4
};
enum class IndexDataType {
None = 0,
Unsigned_Byte,
Unsigned_Short,
Unsigned_Int,
};
unsigned int dataTypeSize(DataType type);
unsigned int dataTypeCount(DataType type);
unsigned int indexDataTypeSize(IndexDataType type);
struct BufferElement {
std::string name;
DataType type;
ShaderDataType shaderType;
int offset;
BufferElement(std::string _name, DataType _type, ShaderDataType _shaderType = ShaderDataType::FloatingPoint,
int _offset = -1)
: name(_name), type(_type), shaderType(_shaderType), offset(_offset) {
}
};
class BufferLayout {
public:
BufferLayout() {}
BufferLayout(const std::initializer_list<BufferElement>& elements, int _stride = -1)
: m_bufferElements(elements), m_stride(_stride) {
calculateOffsetAndStride();
}
BufferLayout(const std::vector<BufferElement> elements)
: m_bufferElements(elements) {
calculateOffsetAndStride();
}
inline std::vector<BufferElement>::iterator begin() { return m_bufferElements.begin(); }
inline std::vector<BufferElement>::iterator end() { return m_bufferElements.end(); }
inline std::vector<BufferElement> getElements() { return m_bufferElements; }
inline int getStride() { return m_stride; }
private:
void calculateOffsetAndStride();
std::vector<BufferElement> m_bufferElements;
int m_stride;
};
class VertexBuffer {
public:
virtual ~VertexBuffer() = default;
virtual void bind() const = 0;
virtual void setLayout(BufferLayout& layout) = 0;
virtual BufferLayout& getLayout() = 0;
static Ref<VertexBuffer> create(void* data, unsigned int size);
};
class IndexBuffer {
public:
virtual ~IndexBuffer() = default;
virtual void bind() const = 0;
virtual unsigned int getCount() const = 0;
virtual IndexDataType getIndexDataType() const = 0;
static Ref<IndexBuffer> create(void* data, unsigned int size, IndexDataType indexDataType);
};
} // namespace Deer