ultimatepp/bazaar/GLPainter/Mesh.cpp
cxl bebec2bced bazaar: GLPainter fixes
git-svn-id: svn://ultimatepp.org/upp/trunk@12372 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2018-10-16 14:59:56 +00:00

91 lines
No EOL
2.1 KiB
C++

#include "GLPainter.h"
namespace Upp {
GLMesh::GLMesh() {}
void GLMesh::Make()
{
if(!VAO) {
glGenVertexArrays(1, &VAO);
glGenBuffers(1, &EBO);
}
}
void GLMesh::Clear()
{
glDeleteVertexArrays(1, &VAO);
glDeleteBuffers(1, &EBO);
for(auto h : VBO)
glDeleteBuffers(1, &h);
VAO = EBO = 0;
VBO.Clear();
}
GLMesh::~GLMesh()
{
Clear();
}
GLMesh& GLMesh::Add(const void *data, int type, int ntuple, int count)
{
Make();
glBindVertexArray(VAO);
int ii = VBO.GetCount();
GLuint& vbo = VBO.Add();
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
int sz = (int)decode(type, GL_FLOAT, sizeof(float),
GL_BYTE, sizeof(byte),
GL_UNSIGNED_BYTE, sizeof(byte),
GL_SHORT, sizeof(int16),
GL_UNSIGNED_SHORT, sizeof(uint16),
GL_INT, sizeof(int32),
GL_UNSIGNED_INT, sizeof(uint32),
sizeof(double));
glBufferData(GL_ARRAY_BUFFER, sz * ntuple * count, data, GL_STATIC_DRAW);
glVertexAttribPointer(ii, ntuple, type, GL_FALSE, ntuple * sz, (void*)0);
glEnableVertexAttribArray(ii);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
return *this;
}
GLMesh& GLMesh::Index(const int *indices, int count)
{
Make();
glBindVertexArray(VAO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * count, indices, GL_STATIC_DRAW);
glBindVertexArray(0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
elements = count;
return *this;
}
void GLMesh::Draw(int mode) const
{
if(VAO)
glBindVertexArray(VAO);
glDrawElements(mode, elements, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
void GLMesh::Draw(GLCode& shaders, int mode) const
{
shaders.Use();
Draw(mode);
}
GLMesh& GLMesh::Add(const Vector<Pointf>& pt)
{
Buffer<float> f(2 * pt.GetCount());
float *t = f;
for(const Pointf& p : pt) {
*t++ = (float)p.x;
*t++ = (float)p.y;
}
return Add(f, GL_FLOAT, 2, pt.GetCount());
}
};