mirror of
https://github.com/lucaspalomodevelop/meshlab.git
synced 2026-03-20 11:26:11 +00:00
First steps toward vbo rendering...
This commit is contained in:
parent
f07daac67a
commit
ccb5e68309
@ -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<CMeshO>::CompactEveryVector(mm);
|
||||
tri::UpdateNormal<CMeshO>::PerVertexNormalizedPerFace(mm);
|
||||
// prepear
|
||||
QTime aa; aa.start();
|
||||
std::vector<float> vv(mm.vn *3);
|
||||
std::vector<float> nv(mm.vn *3);
|
||||
vn = mm.vn;
|
||||
for(size_t i=0;i<vn;++i)
|
||||
{
|
||||
|
||||
return true;
|
||||
mm.vert[i].N().Normalize();
|
||||
vv[i*3+0] = mm.vert[i].P()[0];
|
||||
vv[i*3+1] = mm.vert[i].P()[1];
|
||||
vv[i*3+2] = mm.vert[i].P()[2];
|
||||
nv[i*3+0] = mm.vert[i].N()[0];
|
||||
nv[i*3+1] = mm.vert[i].N()[1];
|
||||
nv[i*3+2] = mm.vert[i].N()[2];
|
||||
}
|
||||
tn = mm.fn;
|
||||
std::vector<unsigned int> ti(tn *3);
|
||||
for(size_t i=0;i<tn;++i)
|
||||
{
|
||||
ti[i*3+0] = tri::Index(mm,mm.face[i].V(0));
|
||||
ti[i*3+1] = tri::Index(mm,mm.face[i].V(1));
|
||||
ti[i*3+2] = tri::Index(mm,mm.face[i].V(2));
|
||||
}
|
||||
|
||||
if (updateattributesmask & MeshModel::MM_VERTCOLOR)
|
||||
{
|
||||
/*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).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
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user