From ccb5e683091cee62583c0f2e74e23ef73108ce70 Mon Sep 17 00:00:00 2001 From: Paolo Cignoni cignoni Date: Sun, 16 Nov 2014 01:33:59 +0000 Subject: [PATCH] First steps toward vbo rendering... --- src/common/meshmodel.cpp | 191 ++++++++++++++++----------------------- src/common/meshmodel.h | 19 ++-- 2 files changed, 92 insertions(+), 118 deletions(-) diff --git a/src/common/meshmodel.cpp b/src/common/meshmodel.cpp index f7852284e..f6eb01098 100644 --- a/src/common/meshmodel.cpp +++ b/src/common/meshmodel.cpp @@ -750,7 +750,7 @@ BufferObjectsRendering::BufferObjectsRendering() } -BufferObjectsRendering::BufferObjectsRendering( const CMeshO& m ) +BufferObjectsRendering::BufferObjectsRendering( CMeshO& m ) :vcg::GLW(),_lock(QReadWriteLock::Recursive) { update(m,MeshModel::MM_ALL); @@ -763,9 +763,48 @@ BufferObjectsRendering::~BufferObjectsRendering() clearState(); } +void BufferObjectsRendering::DrawPoints() +{ + glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); + glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr + glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array + + glBindBuffer(GL_ARRAY_BUFFER, normalBufferObject); + glNormalPointer(GL_FLOAT, 0, 0); // last param is offset, not ptr + glEnableClientState(GL_NORMAL_ARRAY); // activate vertex coords array + + glDrawArrays(GL_POINTS, 0, vn*3); + glBindBuffer(GL_ARRAY_BUFFER, 0); + +} + +void BufferObjectsRendering::DrawTriangles() +{ + glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); + glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array + glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr + + glBindBuffer(GL_ARRAY_BUFFER, normalBufferObject); + glNormalPointer(GL_FLOAT, 0, 0); // last param is offset, not ptr + glEnableClientState(GL_NORMAL_ARRAY); // activate vertex coords array + + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject); + glDrawElements( GL_TRIANGLES, tn*3, GL_UNSIGNED_INT,0); + glDisableClientState(GL_VERTEX_ARRAY); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); +} + void BufferObjectsRendering::render(vcg::GLW::DrawMode dm,vcg::GLW::ColorMode colm,vcg::GLW::TextureMode tm ) { QReadLocker locker(&_lock); + +// glUseProgram(theProgram); + +if(dm== GLW::DMPoints) DrawPoints(); +else DrawTriangles(); + + /*if (glw.m != NULL) { glPushAttrib(GL_ALL_ATTRIB_BITS); @@ -786,133 +825,61 @@ void BufferObjectsRendering::render(vcg::GLW::DrawMode dm,vcg::GLW::ColorMode co }*/ } -bool BufferObjectsRendering::update(const CMeshO& mm,const int updateattributesmask) +bool BufferObjectsRendering::update(CMeshO& mm,const int updateattributesmask) { if (updateattributesmask == MeshModel::MM_NONE) return false; - + QWriteLocker locker(&_lock); - - if (!(updateattributesmask & MeshModel::MM_VERTCOLOR) & - !(updateattributesmask & MeshModel::MM_VERTCOORD) & - !(updateattributesmask & MeshModel::MM_VERTQUALITY) & - !(updateattributesmask & MeshModel::MM_VERTNORMAL) & - !(updateattributesmask & MeshModel::MM_FACEFLAGSELECT) & - !(updateattributesmask & MeshModel::MM_VERTFLAGSELECT) & - !(updateattributesmask & MeshModel::MM_TRANSFMATRIX) & - !(updateattributesmask & MeshModel::MM_CAMERA)) + tri::Allocator::CompactEveryVector(mm); + tri::UpdateNormal::PerVertexNormalizedPerFace(mm); + // prepear + QTime aa; aa.start(); + std::vector vv(mm.vn *3); + std::vector nv(mm.vn *3); + vn = mm.vn; + for(size_t i=0;i ti(tn *3); + for(size_t i=0;icm.vert.size())) - { - return false; - } - - CMeshO::VertexIterator rmvi = rm->cm.vert.begin(); - for(CMeshO::ConstVertexIterator mmvi = mm.vert.begin(); mmvi != mm.vert.end(); ++mmvi, ++rmvi) - if(!(*mmvi).IsD()) - (*rmvi).C()=(*mmvi).cC();*/ - - } + qDebug("Buffer prepared in %i",aa.elapsed()); + glGenBuffers(1, &positionBufferObject); + glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); + glBufferData(GL_ARRAY_BUFFER, vn *3 *sizeof(GLfloat), &vv[0], GL_STATIC_DRAW); - if (updateattributesmask & MeshModel::MM_VERTCOORD) - { - /*if(mm.vert.size() != (rm->cm.vert.size())) - { - return false; - } - - CMeshO::VertexIterator rmvi = rm->cm.vert.begin(); - for(CMeshO::ConstVertexIterator mmvi = mm.vert.begin(); mmvi != mm.vert.end(); ++mmvi, ++rmvi) - if(!(*mmvi).IsD()) - (*rmvi).P()=(*mmvi).cP(); - */ - } + glGenBuffers(1, &normalBufferObject); + glBindBuffer(GL_ARRAY_BUFFER, normalBufferObject); + glBufferData(GL_ARRAY_BUFFER, vn *3 *sizeof(GLfloat), &nv[0], GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); - if (updateattributesmask & MeshModel::MM_VERTQUALITY) - { - /*if(mm.vert.size() != (rm->cm.vert.size())) - { - return false; - } - - CMeshO::VertexIterator rmvi = rm->cm.vert.begin(); - for(CMeshO::ConstVertexIterator mmvi = mm.vert.begin(); mmvi != mm.vert.end(); ++mmvi, ++rmvi) - if(!(*mmvi).IsD()) - (*rmvi).Q()=(*mmvi).cQ();*/ - - } + glGenBuffers(1, &indexBufferObject); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, tn *3 *sizeof(GLuint), &ti[0], GL_STATIC_DRAW); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - if (updateattributesmask & MeshModel::MM_VERTNORMAL) - { - /*if(mm.vert.size() != (rm->cm.vert.size())) - { - return false; - } - - CMeshO::VertexIterator rmvi = rm->cm.vert.begin(); - for(CMeshO::ConstVertexIterator mmvi = mm.vert.begin(); mmvi != mm.vert.end(); ++mmvi, ++rmvi) - if(!(*mmvi).IsD()) - (*rmvi).N()=(*mmvi).cN();*/ - - } - - if(updateattributesmask & MeshModel::MM_FACEFLAGSELECT) - { - /*if(mm.face.size() != rm->cm.face.size()) - { - return false; - } - CMeshO::FaceIterator rmfi = rm->cm.face.begin(); - for(CMeshO::ConstFaceIterator mmfi = mm.face.begin(); mmfi != mm.face.end(); ++mmfi, ++rmfi) - { - if ((!(*mmfi).IsD()) && ((*mmfi).IsS())) - (*rmfi).SetS(); - else - if (!(*mmfi).IsS()) - (*rmfi).ClearS(); - }*/ - } - - if(updateattributesmask & MeshModel::MM_VERTFLAGSELECT) - { - /*if(mm.vert.size() != (rm->cm.vert.size())) - { - return false; - } - - CMeshO::VertexIterator rmvi = rm->cm.vert.begin(); - for(CMeshO::ConstVertexIterator mmvi = mm.vert.begin(); mmvi != mm.vert.end(); ++mmvi, ++rmvi) - { - if ((!(*mmvi).IsD()) && ((*mmvi).IsS())) - (*rmvi).SetS(); - else - if (!(*mmvi).IsS()) - (*rmvi).ClearS(); - }*/ - - } - - if(updateattributesmask & MeshModel::MM_TRANSFMATRIX) - { - //rm->cm.Tr = mm.Tr; - } - if(updateattributesmask & MeshModel::MM_CAMERA) - { - //rm->cm.shot = mm.shot; - } + qDebug("Buffer feed in %i",aa.elapsed()); return true; } void BufferObjectsRendering::clearState() { QWriteLocker locker(&_lock); - + //TODO: delete frame objects } diff --git a/src/common/meshmodel.h b/src/common/meshmodel.h index 55af6e561..89a7e3eef 100644 --- a/src/common/meshmodel.h +++ b/src/common/meshmodel.h @@ -187,20 +187,27 @@ class BufferObjectsRendering : public vcg::GLW { public: BufferObjectsRendering(); - //constructor for the buffer objects initializing. - BufferObjectsRendering(const CMeshO& m); + //constructor for the buffer objects initializing. + BufferObjectsRendering(CMeshO &m); ~BufferObjectsRendering(); - + void DrawPoints(); + void DrawTriangles(); //buffer objects update function. Info are collected from the mm and inserted inside the correspondent buffer objects - bool update(const CMeshO& mm,const int updateattributesmask); + bool update(CMeshO& mm,const int updateattributesmask); //render function for invoking buffer objects based rendering - void render(vcg::GLW::DrawMode dm,vcg::GLW::ColorMode cm,vcg::GLW::TextureMode tm ); + void render(vcg::GLW::DrawMode dm,vcg::GLW::ColorMode cm,vcg::GLW::TextureMode tm ); //function to clear/deallocate the buffer objects memory space void clearState(); private: + GLuint positionBufferObject; + GLuint normalBufferObject; + GLuint indexBufferObject; + int vn; + int tn; + QReadWriteLock _lock; }; @@ -602,7 +609,7 @@ public: return nextVisibleMesh(newM); } - MeshModel *nextMesh(MeshModel *_m = NULL) + MeshModel *nextMesh(MeshModel *_m = NULL) { if(_m==0 && meshList.size()>0) return meshList.at(0);