git-svn-id: svn://db.shs.com.ru/libs@663 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -28,10 +28,7 @@ static int _count = 0;
|
||||
|
||||
Mesh::Mesh(GLenum geom_type_): geom_type(geom_type_),
|
||||
buffer_geom(GL_ARRAY_BUFFER, GL_STATIC_DRAW),
|
||||
buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW),
|
||||
buffer_obj (GL_ARRAY_BUFFER, GL_STREAM_DRAW),
|
||||
buffer_sel (GL_ARRAY_BUFFER, GL_STREAM_DRAW) {
|
||||
vao = 0;
|
||||
buffer_ind (GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW) {
|
||||
hash_ = 0;
|
||||
changed = hash_changed = objects_changed = selected_changed = true;
|
||||
//qDebug() << "Mesh, now" << ++_count;
|
||||
@@ -60,26 +57,17 @@ Mesh * Mesh::clone() {
|
||||
|
||||
|
||||
void Mesh::init(QOpenGLExtraFunctions * f) {
|
||||
if (!isInit()) {
|
||||
buffer_geom.init(f);
|
||||
buffer_ind .init(f);
|
||||
buffer_obj .init(f);
|
||||
buffer_sel .init(f);
|
||||
f->glGenVertexArrays(1, &vao);
|
||||
}
|
||||
buffer_geom.init(f);
|
||||
buffer_ind .init(f);
|
||||
vao.bindBuffers(f, buffer_geom, buffer_ind);
|
||||
changed = true;
|
||||
}
|
||||
|
||||
|
||||
void Mesh::destroy(QOpenGLExtraFunctions * f) {
|
||||
if (vao != 0) {
|
||||
f->glDeleteVertexArrays(1, &vao);
|
||||
buffer_geom.destroy(f);
|
||||
buffer_ind .destroy(f);
|
||||
buffer_obj .destroy(f);
|
||||
buffer_sel .destroy(f);
|
||||
}
|
||||
vao = 0;
|
||||
buffer_geom.destroy(f);
|
||||
buffer_ind .destroy(f);
|
||||
vao.destroy(f);
|
||||
}
|
||||
|
||||
|
||||
@@ -131,21 +119,6 @@ void Mesh::calculateTangents() {
|
||||
}
|
||||
|
||||
|
||||
void Mesh::loadBuffer(QOpenGLExtraFunctions * f, Buffer & buf, const void * data, int size) {
|
||||
if (!isInit()) init(f);
|
||||
if (!buf.isInit() || !data) return;
|
||||
buf.bind(f);
|
||||
buf.resize(f, size);
|
||||
buf.load(f, data, size);
|
||||
//qDebug() << "loadBuffer" << size << "bytes";
|
||||
/*void * map = buf.map(f, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
|
||||
qDebug() << map;
|
||||
if (map)
|
||||
memcpy(map, objects_.constData(), osize);
|
||||
buf.unmap(f);*/
|
||||
}
|
||||
|
||||
|
||||
bool Mesh::rebuffer(QOpenGLExtraFunctions * f) {
|
||||
changed = false;
|
||||
if (vertices_.isEmpty()) return true;
|
||||
@@ -168,12 +141,10 @@ bool Mesh::rebuffer(QOpenGLExtraFunctions * f) {
|
||||
int gsize = data_.size() * sizeof(Vertex);
|
||||
int tsize = triangles_.size() * sizeof(Vector3i);
|
||||
int lsize = lines_.size() * sizeof(Vector2i);
|
||||
f->glBindVertexArray(vao);
|
||||
|
||||
buffer_geom.bind(f);
|
||||
buffer_geom.resize(f, gsize);
|
||||
buffer_geom.load(f, data_.constData(), gsize);
|
||||
prepareDrawGeom(f);
|
||||
|
||||
buffer_ind.bind(f);
|
||||
if (geom_type == GL_TRIANGLES) {
|
||||
@@ -184,86 +155,19 @@ bool Mesh::rebuffer(QOpenGLExtraFunctions * f) {
|
||||
buffer_ind.load(f, lines_.constData(), lsize);
|
||||
}
|
||||
|
||||
buffer_obj.bind(f);
|
||||
prepareDrawObj(f);
|
||||
|
||||
buffer_sel.bind(f);
|
||||
prepareDrawSel(f);
|
||||
|
||||
f->glBindVertexArray(0);
|
||||
return !isEmpty();
|
||||
}
|
||||
|
||||
|
||||
void Mesh::prepareDrawGeom(QOpenGLExtraFunctions * f) {
|
||||
//qDebug() << "prepareDrawGeom";
|
||||
|
||||
f->glEnableVertexAttribArray(pos_loc );
|
||||
f->glEnableVertexAttribArray(normal_loc );
|
||||
f->glEnableVertexAttribArray(tangent_loc );
|
||||
f->glEnableVertexAttribArray(bitangent_loc);
|
||||
f->glEnableVertexAttribArray(tex_loc );
|
||||
|
||||
int size = sizeof(Vertex);
|
||||
f->glVertexAttribPointer(pos_loc , 3, GL_FLOAT, GL_FALSE, size, (const void *)pos_offset );
|
||||
f->glVertexAttribPointer(normal_loc , 3, GL_FLOAT, GL_FALSE, size, (const void *)normal_offset );
|
||||
f->glVertexAttribPointer(tangent_loc , 3, GL_FLOAT, GL_FALSE, size, (const void *)tangent_offset );
|
||||
f->glVertexAttribPointer(bitangent_loc, 3, GL_FLOAT, GL_FALSE, size, (const void *)bitangent_offset);
|
||||
f->glVertexAttribPointer(tex_loc , 2, GL_FLOAT, GL_FALSE, size, (const void *)tex_offset );
|
||||
}
|
||||
|
||||
|
||||
void Mesh::prepareDrawObj(QOpenGLExtraFunctions * f) {
|
||||
//qDebug() << "prepareDrawObj";
|
||||
|
||||
f->glEnableVertexAttribArray(material_loc );
|
||||
f->glEnableVertexAttribArray(object_id_loc);
|
||||
f->glEnableVertexAttribArray(color_loc );
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
f->glEnableVertexAttribArray(modelmatrix_loc + i);
|
||||
}
|
||||
|
||||
GLsizei size = sizeof(Object);
|
||||
f->glVertexAttribIPointer(material_loc , 1, GL_UNSIGNED_INT , size, (const void *)material_offset );
|
||||
f->glVertexAttribIPointer(object_id_loc, 1, GL_UNSIGNED_INT , size, (const void *)object_id_offset);
|
||||
f->glVertexAttribPointer (color_loc , 4, GL_FLOAT, GL_FALSE, size, (const void *)color_offset );
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
f->glVertexAttribPointer(modelmatrix_loc + i, 4, GL_FLOAT, GL_FALSE, size, (const void *)(modelmatrix_offset + sizeof(QVector4D)*i));
|
||||
}
|
||||
|
||||
f->glVertexAttribDivisor(material_loc , 1);
|
||||
f->glVertexAttribDivisor(object_id_loc, 1);
|
||||
f->glVertexAttribDivisor(color_loc , 1);
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
f->glVertexAttribDivisor(modelmatrix_loc + i, 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Mesh::prepareDrawSel(QOpenGLExtraFunctions * f) {
|
||||
//qDebug() << "prepareDrawObj";
|
||||
|
||||
f->glEnableVertexAttribArray(is_selected_loc);
|
||||
GLsizei size = 1;
|
||||
f->glVertexAttribIPointer(is_selected_loc, 1, GL_UNSIGNED_BYTE, size, (const void *)is_selected_offset);
|
||||
f->glVertexAttribDivisor(is_selected_loc, 1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void Mesh::draw(QOpenGLExtraFunctions * f, int count) {
|
||||
if (isEmpty()) return;
|
||||
if (!isInit()) init(f);
|
||||
if (changed) rebuffer(f);
|
||||
//qDebug() << "draw" << geom_type << vert_count << count;
|
||||
|
||||
f->glBindVertexArray(vao);
|
||||
if (geom_type == GL_TRIANGLES)
|
||||
f->glDrawElementsInstanced(geom_type, triangles_.size() * 3, GL_UNSIGNED_INT, 0, count);
|
||||
vao.draw(f, geom_type, triangles_.size() * 3, count);
|
||||
else
|
||||
f->glDrawElementsInstanced(geom_type, lines_.size() * 2, GL_UNSIGNED_INT, 0, count);
|
||||
f->glBindVertexArray(0);
|
||||
vao.draw(f, geom_type, lines_.size() * 2, count);
|
||||
}
|
||||
|
||||
|
||||
@@ -281,18 +185,18 @@ void Mesh::clear() {
|
||||
|
||||
|
||||
void Mesh::loadObject(QOpenGLExtraFunctions * f, const Object & object) {
|
||||
loadBuffer(f, buffer_obj, &object, sizeof(Object));
|
||||
vao.loadObject(f, object);
|
||||
}
|
||||
|
||||
|
||||
void Mesh::loadObjects(QOpenGLExtraFunctions * f, const QVector<Object> & objects) {
|
||||
loadBuffer(f, buffer_obj, objects.constData(), objects.size() * sizeof(Object));
|
||||
vao.loadObjects(f, objects);
|
||||
}
|
||||
|
||||
|
||||
void Mesh::loadSelections(QOpenGLExtraFunctions * f, const QVector<uchar> & sels) {
|
||||
//qDebug() << "loadSelections" << sels;
|
||||
loadBuffer(f, buffer_sel, sels.constData(), sels.size());
|
||||
vao.loadSelections(f, sels);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user