mirror of
https://github.com/Linloir/SceneEditor.git
synced 2025-12-16 23:18:12 +08:00
112 lines
3.3 KiB
C++
112 lines
3.3 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
|
|
#include "vbo.h"
|
|
#include "ebo.h"
|
|
#include "utils.h"
|
|
#include "logger.h"
|
|
|
|
class VertexArrayObject {
|
|
public:
|
|
static VertexArrayObject empty() {
|
|
return VertexArrayObject();
|
|
}
|
|
|
|
private:
|
|
unsigned int _id = 0;
|
|
|
|
private:
|
|
VertexArrayObject();
|
|
|
|
public:
|
|
VertexArrayObject(const VertexBufferObject& vbo);
|
|
VertexArrayObject(const VertexBufferObject& vbo, const ElementBufferObject& ebo);
|
|
|
|
inline unsigned int id() const { return _id; }
|
|
|
|
inline void bind() const;
|
|
inline void unbind() const;
|
|
inline void dispose();
|
|
inline void ensureInitialized();
|
|
|
|
inline void bindVertexBufferObject(const VertexBufferObject& vbo);
|
|
inline void bindElementBufferObject(const ElementBufferObject& ebo);
|
|
|
|
inline void setVertexAttributePointer(unsigned int index, int size, unsigned int type, bool normalized, unsigned int stride, const void* pointer) const;
|
|
inline void enableVertexAttribute(unsigned int index) const;
|
|
inline void disableVertexAttribute(unsigned int index) const;
|
|
};
|
|
|
|
inline void VertexArrayObject::bind() const {
|
|
// Check is id is valid
|
|
if (_id == 0) {
|
|
Logger::error("Binding an invalid VertexArrayObject");
|
|
return;
|
|
}
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(_id);
|
|
}
|
|
|
|
inline void VertexArrayObject::unbind() const {
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(0);
|
|
}
|
|
|
|
inline void VertexArrayObject::dispose() {
|
|
if (_id == 0) return;
|
|
OPENGL_EXTRA_FUNCTIONS->glDeleteVertexArrays(1, &_id);
|
|
_id = 0;
|
|
}
|
|
|
|
inline void VertexArrayObject::ensureInitialized() {
|
|
if (_id == 0) {
|
|
OPENGL_EXTRA_FUNCTIONS->glGenVertexArrays(1, &_id);
|
|
if (_id == 0) {
|
|
Logger::error("Failed to create VertexArrayObject");
|
|
}
|
|
}
|
|
}
|
|
|
|
inline void VertexArrayObject::bindVertexBufferObject(const VertexBufferObject& vbo) {
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(_id);
|
|
OPENGL_EXTRA_FUNCTIONS->glBindBuffer(GL_ARRAY_BUFFER, vbo.id());
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(0);
|
|
}
|
|
|
|
inline void VertexArrayObject::bindElementBufferObject(const ElementBufferObject& ebo) {
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(_id);
|
|
OPENGL_EXTRA_FUNCTIONS->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo.id());
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(0);
|
|
}
|
|
|
|
inline void VertexArrayObject::setVertexAttributePointer(
|
|
unsigned int index,
|
|
int size,
|
|
unsigned int type,
|
|
bool normalized,
|
|
unsigned int stride,
|
|
const void* pointer
|
|
) const {
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(_id);
|
|
OPENGL_EXTRA_FUNCTIONS->glVertexAttribPointer(
|
|
index,
|
|
size,
|
|
type,
|
|
normalized,
|
|
stride,
|
|
pointer
|
|
);
|
|
OPENGL_EXTRA_FUNCTIONS->glEnableVertexAttribArray(index);
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(0);
|
|
}
|
|
|
|
inline void VertexArrayObject::enableVertexAttribute(unsigned int index) const {
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(_id);
|
|
OPENGL_EXTRA_FUNCTIONS->glEnableVertexAttribArray(index);
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(0);
|
|
}
|
|
|
|
inline void VertexArrayObject::disableVertexAttribute(unsigned int index) const {
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(_id);
|
|
OPENGL_EXTRA_FUNCTIONS->glDisableVertexAttribArray(index);
|
|
OPENGL_EXTRA_FUNCTIONS->glBindVertexArray(0);
|
|
} |