mirror of
https://github.com/rwengine/openrw.git
synced 2024-11-07 03:12:36 +01:00
Add new structures for renderer data
This commit is contained in:
parent
0773829dfc
commit
975c7a5c32
24
rwengine/include/render/DrawBuffer.hpp
Normal file
24
rwengine/include/render/DrawBuffer.hpp
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef _DRAWBUFFER_HPP_
|
||||||
|
#define _DRAWBUFFER_HPP_
|
||||||
|
#include <GL/glew.h>
|
||||||
|
|
||||||
|
class GeometryBuffer;
|
||||||
|
class DrawBuffer {
|
||||||
|
GLuint vao;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
DrawBuffer();
|
||||||
|
~DrawBuffer();
|
||||||
|
|
||||||
|
GLuint getVAOName() const
|
||||||
|
{ return vao; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Adds a Geometry Buffer to the Draw Buffer.
|
||||||
|
*/
|
||||||
|
void addGeometry(GeometryBuffer* gbuff);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
61
rwengine/include/render/GeometryBuffer.hpp
Normal file
61
rwengine/include/render/GeometryBuffer.hpp
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
#pragma once
|
||||||
|
#ifndef _GEOMETRYBUFFER_HPP_
|
||||||
|
#define _GEOMETRYBUFFER_HPP_
|
||||||
|
#include <GL/glew.h>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enum used to determine which shader input an attribute maps to
|
||||||
|
*/
|
||||||
|
enum AttributeSemantic {
|
||||||
|
ATRS_Position,
|
||||||
|
ATRS_Normal,
|
||||||
|
ATRS_Colour,
|
||||||
|
ATRS_TexCoord
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stores Vertex Attribute data
|
||||||
|
*/
|
||||||
|
struct AttributeIndex {
|
||||||
|
AttributeSemantic sem;
|
||||||
|
GLsizei size;
|
||||||
|
/*GLenum type*/
|
||||||
|
GLsizei stride;
|
||||||
|
GLsizei offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<AttributeIndex> AttributeList;
|
||||||
|
|
||||||
|
class GeometryBuffer {
|
||||||
|
GLuint vbo;
|
||||||
|
GLsizei num;
|
||||||
|
|
||||||
|
AttributeList attributes;
|
||||||
|
public:
|
||||||
|
|
||||||
|
GeometryBuffer();
|
||||||
|
~GeometryBuffer();
|
||||||
|
|
||||||
|
GLuint getVBOName() const
|
||||||
|
{ return vbo; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads Vertex Buffer data from an STL vector
|
||||||
|
*/
|
||||||
|
template<class T> void uploadVertices(const std::vector<T>& data) {
|
||||||
|
uploadVertices(data.size(), data.size()*sizeof(T), data.data());
|
||||||
|
// Assume T has a static method for attributes;
|
||||||
|
attributes = T::vertex_attributes();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uploads raw memory into the buffer.
|
||||||
|
*/
|
||||||
|
void uploadVertices(GLsizei num, GLsizeiptr size, const GLvoid* mem);
|
||||||
|
|
||||||
|
const AttributeList& getDataAttributes() const
|
||||||
|
{ return attributes; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
40
rwengine/src/render/DrawBuffer.cpp
Normal file
40
rwengine/src/render/DrawBuffer.cpp
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#include <render/DrawBuffer.hpp>
|
||||||
|
#include <render/GeometryBuffer.hpp>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
/* TODO: Come up with a more elegant solution to "WHICH ARRAY IS IT?" */
|
||||||
|
std::map<AttributeSemantic, GLuint> semantic_to_attrib_array = {
|
||||||
|
{ATRS_Position, 0},
|
||||||
|
{ATRS_Normal, 4},
|
||||||
|
{ATRS_Colour, 8},
|
||||||
|
{ATRS_TexCoord, 12}
|
||||||
|
};
|
||||||
|
|
||||||
|
DrawBuffer::DrawBuffer()
|
||||||
|
: vao(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
DrawBuffer::~DrawBuffer()
|
||||||
|
{
|
||||||
|
if(vao) {
|
||||||
|
glDeleteVertexArrays(1, &vao);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawBuffer::addGeometry(GeometryBuffer* gbuff)
|
||||||
|
{
|
||||||
|
if(vao == 0) {
|
||||||
|
glGenVertexArrays(1, &vao);
|
||||||
|
}
|
||||||
|
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, gbuff->getVBOName());
|
||||||
|
// Iterate the attributes present in the gbuff
|
||||||
|
for(const AttributeIndex& at : gbuff->getDataAttributes()) {
|
||||||
|
GLuint vaoindex = semantic_to_attrib_array[at.sem];
|
||||||
|
glEnableVertexAttribArray(vaoindex);
|
||||||
|
glVertexAttribPointer(vaoindex, at.size, GL_FLOAT, GL_FALSE, at.stride, reinterpret_cast<GLvoid*>(at.offset));
|
||||||
|
}
|
||||||
|
}
|
17
rwengine/src/render/GeometryBuffer.cpp
Normal file
17
rwengine/src/render/GeometryBuffer.cpp
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#include <render/GeometryBuffer.hpp>
|
||||||
|
|
||||||
|
GeometryBuffer::GeometryBuffer()
|
||||||
|
: vbo(0), num(0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GeometryBuffer::uploadVertices(GLsizei num, GLsizeiptr size, const GLvoid* mem)
|
||||||
|
{
|
||||||
|
if(vbo == 0) {
|
||||||
|
glGenBuffers(1, &vbo);
|
||||||
|
}
|
||||||
|
this->num = num;
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, size, mem, GL_STATIC_DRAW);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user