- cleaned up a little the class function members

- switched from private functions to protected ones
This commit is contained in:
granzuglia 2015-06-14 09:39:42 +00:00
parent dca2488ac4
commit 8842cea2b3
1 changed files with 114 additions and 87 deletions

View File

@ -40,7 +40,7 @@
namespace vcg namespace vcg
{ {
//WARNING: All the classes derived from MemoryInfo has been intended to be instantiated as a singleton in the host application //WARNING: All the classes derived from MemoryInfo has been intended to be instantiated as a singleton in the host application
//(i.e. in every application using it just an instance of a class derived from MemoryInfo should be declared). //(i.e. in every application using it just an instance of a class derived from MemoryInfo should be declared).
class MemoryInfo class MemoryInfo
@ -168,16 +168,16 @@ namespace vcg
{ {
public: public:
GLMeshAttributesFeeder(/*const*/ MESHTYPE& mesh,MemoryInfo& meminfo, size_t perbatchtriangles) GLMeshAttributesFeeder(/*const*/ MESHTYPE& mesh,MemoryInfo& meminfo, size_t perbatchtriangles)
:_mesh(mesh),_gpumeminfo(meminfo),_bo(8,NULL)/*,vaohandle(0)*/,_lastfeedingusedreplicatedpipeline(false),_perbatchsimplex(perbatchtriangles),_chunkmap(),_borendering(false) :_mesh(mesh),_gpumeminfo(meminfo),_bo(8,NULL)/*,vaohandle(0)*/,_lastfeedingusedreplicatedpipeline(false),_perbatchsimplex(perbatchtriangles),_chunkmap(),_borendering(false)
{ {
_bo[VERTPOSITIONBO] = new GLBufferObject(3,GL_FLOAT); _bo[VERTPOSITIONBO] = new GLBufferObject(3,GL_FLOAT,GL_ARRAY_BUFFER);
_bo[VERTNORMALBO] = new GLBufferObject(3,GL_FLOAT); _bo[VERTNORMALBO] = new GLBufferObject(3,GL_FLOAT,GL_ARRAY_BUFFER);
_bo[FACENORMALBO] = new GLBufferObject(3,GL_FLOAT); _bo[FACENORMALBO] = new GLBufferObject(3,GL_FLOAT,GL_ARRAY_BUFFER);
_bo[VERTCOLORBO] = new GLBufferObject(4,GL_UNSIGNED_BYTE); _bo[VERTCOLORBO] = new GLBufferObject(4,GL_UNSIGNED_BYTE,GL_ARRAY_BUFFER);
_bo[FACECOLORBO] = new GLBufferObject(4,GL_UNSIGNED_BYTE); _bo[FACECOLORBO] = new GLBufferObject(4,GL_UNSIGNED_BYTE,GL_ARRAY_BUFFER);
_bo[VERTTEXTUREBO] = new GLBufferObject(2,GL_FLOAT); _bo[VERTTEXTUREBO] = new GLBufferObject(2,GL_FLOAT,GL_ARRAY_BUFFER);
_bo[WEDGETEXTUREBO] = new GLBufferObject(2,GL_FLOAT); _bo[WEDGETEXTUREBO] = new GLBufferObject(2,GL_FLOAT,GL_ARRAY_BUFFER);
_bo[VERTINDEXBO] = new GLBufferObject(3,GL_UNSIGNED_INT); _bo[VERTINDEXBO] = new GLBufferObject(3,GL_UNSIGNED_INT,GL_ELEMENT_ARRAY_BUFFER);
} }
~GLMeshAttributesFeeder() ~GLMeshAttributesFeeder()
@ -244,65 +244,37 @@ namespace vcg
textureindex contained the texture OpenGL ids loaded in the gpu memory by the main application*/ textureindex contained the texture OpenGL ids loaded in the gpu memory by the main application*/
void passTrianglesToOpenGL(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,const std::vector<GLuint>& textureindex = std::vector<GLuint>()) void passTrianglesToOpenGL(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,const std::vector<GLuint>& textureindex = std::vector<GLuint>())
{ {
std::vector<bool> importattribute(_bo.size()); if (tryToAllocatePerTriangleAttributesInBO(vaohandlespecificperopenglcontext,nm,cm,tm))
std::vector<bool> attributestobeupdated;
attributesToBeImportedInTriangleBasedPipeline(importattribute, nm, cm, tm);
bool replicated = !importattribute[VERTINDEXBO];
bool immediatemode = !(buffersAllocationFunction(vaohandlespecificperopenglcontext,nm,cm,tm,importattribute,attributestobeupdated));
if (immediatemode)
immediateMode(nm,cm,tm,textureindex);
else
{
bool somethingtoupdate = false;
for(size_t hh = 0;hh < attributestobeupdated.size();++hh)
somethingtoupdate = somethingtoupdate || attributestobeupdated[hh];
if (somethingtoupdate)
{
if (replicated)
{
//WARNING!In case we have to update the wedgetexture bo maybe (not always!) we must update also the other buffer already in memory
//cause the wedgetexture pipeline force a change in the order of the triangles in GPU.
//they are now ordered by the texture seam and not more by the triangle index!
if (attributestobeupdated[WEDGETEXTUREBO])
{
for(size_t jj = 0;jj < attributestobeupdated.size();++jj)
attributestobeupdated[jj] = importattribute[jj] || attributestobeupdated[jj];
}
updateBuffersReplicatedPipeline(attributestobeupdated,tm);
}
else
updateBuffersIndexedPipeline(attributestobeupdated);
}
drawTriangles(vaohandlespecificperopenglcontext,nm,cm,tm,textureindex); drawTriangles(vaohandlespecificperopenglcontext,nm,cm,tm,textureindex);
} else
immediateMode(nm,cm,tm,textureindex);
} }
void passPointsToOpenGL(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm) void passPointsToOpenGL(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm)
{ {
std::vector<bool> importattribute(_bo.size()); if (tryToAllocatePerPointAttributesInBO(vaohandlespecificperopenglcontext,nm,cm))
std::vector<bool> attributestobeupdated;
attributesToBeImportedInPointBasedPipeline(importattribute, nm, cm);
bool immediatemode = !(buffersAllocationFunction(vaohandlespecificperopenglcontext,nm,cm,TX_NONE,importattribute,attributestobeupdated));
std::vector<GLuint> textureindex;
if (immediatemode)
immediateMode(nm,cm,TX_NONE,textureindex);
else
{
bool somethingtoupdate = false;
for(size_t hh = 0;hh < attributestobeupdated.size();++hh)
somethingtoupdate = somethingtoupdate || attributestobeupdated[hh];
if (somethingtoupdate)
updateBuffersIndexedPipeline(attributestobeupdated);
drawPoints(vaohandlespecificperopenglcontext); drawPoints(vaohandlespecificperopenglcontext);
} else
immediateMode(nm,cm,TX_NONE);
} }
private: enum BO_NAMES
{
VERTPOSITIONBO = 0,
VERTNORMALBO = 1,
FACENORMALBO = 2,
VERTCOLORBO = 3,
FACECOLORBO = 4,
VERTTEXTUREBO = 5,
WEDGETEXTUREBO = 6,
VERTINDEXBO = 7
};
protected:
struct GLBufferObject struct GLBufferObject
{ {
GLBufferObject(size_t components,GLenum gltype) GLBufferObject(size_t components,GLenum gltype,GLenum target)
:_size(0),_components(components),_isvalid(false),_gltype(gltype),_bohandle(0) :_size(0),_components(components),_isvalid(false),_gltype(gltype),_target(target),_bohandle(0)
{ {
} }
@ -326,20 +298,14 @@ namespace vcg
const size_t _components; const size_t _components;
bool _isvalid; bool _isvalid;
const GLenum _gltype; const GLenum _gltype;
const GLenum _target;
GLuint _bohandle; GLuint _bohandle;
}; };
enum BO_NAMES const GLBufferObject& getBufferObjectInfo(BO_NAMES boname) const
{ {
VERTPOSITIONBO = 0, return _bo[boname];
VERTNORMALBO = 1, }
FACENORMALBO = 2,
VERTCOLORBO = 3,
FACECOLORBO = 4,
VERTTEXTUREBO = 5,
WEDGETEXTUREBO = 6,
VERTINDEXBO = 7
};
long long unsigned int bufferObjectsMemoryRequired(NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,bool generateindex) const long long unsigned int bufferObjectsMemoryRequired(NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,bool generateindex) const
{ {
@ -363,7 +329,7 @@ namespace vcg
return result; return result;
} }
void attributesToBeImportedInTriangleBasedPipeline( std::vector<bool> &importattribute, NORMAL_MODALITY nm, COLOR_MODALITY cm, TEXTURE_MODALITY tm ) void attributesToBeImportedInTriangleBasedPipeline( std::vector<bool> &importattribute, NORMAL_MODALITY nm, COLOR_MODALITY cm, TEXTURE_MODALITY tm ) const
{ {
importattribute[VERTPOSITIONBO] = true; importattribute[VERTPOSITIONBO] = true;
importattribute[VERTNORMALBO] = vcg::tri::HasPerVertexNormal(_mesh) && (nm == NR_PERVERT); importattribute[VERTNORMALBO] = vcg::tri::HasPerVertexNormal(_mesh) && (nm == NR_PERVERT);
@ -388,7 +354,7 @@ namespace vcg
importattribute[VERTINDEXBO] = !replicated; importattribute[VERTINDEXBO] = !replicated;
} }
void attributesToBeImportedInPointBasedPipeline( std::vector<bool> &importattribute, NORMAL_MODALITY nm, COLOR_MODALITY cm) void attributesToBeImportedInPointBasedPipeline( std::vector<bool> &importattribute, NORMAL_MODALITY nm, COLOR_MODALITY cm) const
{ {
importattribute[VERTPOSITIONBO] = true; importattribute[VERTPOSITIONBO] = true;
importattribute[VERTNORMALBO] = vcg::tri::HasPerVertexNormal(_mesh) && (nm == NR_PERVERT); importattribute[VERTNORMALBO] = vcg::tri::HasPerVertexNormal(_mesh) && (nm == NR_PERVERT);
@ -402,7 +368,7 @@ namespace vcg
bool buffersAllocationFunction(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,const std::vector<bool>& importattribute,std::vector<bool>& attributestobeupdated) bool buffersAllocationFunction(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,const std::vector<bool>& importattribute,std::vector<bool>& attributestobeupdated)
{ {
if (vaohandlespecificperopenglcontext == 0) if (vaohandlespecificperopenglcontext == 0)
//glGenVertexArrays(1,&vaohandle); //glGenVertexArrays(1,&vaohandle);
return false; return false;
bool replicated = (importattribute[FACENORMALBO] || importattribute[FACECOLORBO] || importattribute[WEDGETEXTUREBO]); bool replicated = (importattribute[FACENORMALBO] || importattribute[FACECOLORBO] || importattribute[WEDGETEXTUREBO]);
@ -480,7 +446,7 @@ namespace vcg
return false; return false;
} }
else else
{ {
unsigned int ii = 0; unsigned int ii = 0;
//I have to update the invalid buffers requested to be imported //I have to update the invalid buffers requested to be imported
attributestobeupdated = importattribute; attributestobeupdated = importattribute;
@ -489,9 +455,6 @@ namespace vcg
BO_NAMES boname = static_cast<BO_NAMES>(ii); BO_NAMES boname = static_cast<BO_NAMES>(ii);
GLBufferObject* cbo = _bo.at(boname); GLBufferObject* cbo = _bo.at(boname);
bool importatt = importattribute.at(boname); bool importatt = importattribute.at(boname);
GLenum target = GL_ARRAY_BUFFER;
if (boname == VERTINDEXBO)
target = GL_ELEMENT_ARRAY_BUFFER;
glBindVertexArray(vaohandlespecificperopenglcontext); glBindVertexArray(vaohandlespecificperopenglcontext);
bool notvalidbuttoberegenerated = (cbo != NULL) && (!cbo->_isvalid) && (importatt); bool notvalidbuttoberegenerated = (cbo != NULL) && (!cbo->_isvalid) && (importatt);
if (notvalidbuttoberegenerated) if (notvalidbuttoberegenerated)
@ -499,11 +462,11 @@ namespace vcg
cbo->_size = boExpectedSize(boname,replicated,importattribute[VERTINDEXBO]); cbo->_size = boExpectedSize(boname,replicated,importattribute[VERTINDEXBO]);
long long unsigned int dim = boExpectedDimension(boname,replicated,importattribute[VERTINDEXBO]); long long unsigned int dim = boExpectedDimension(boname,replicated,importattribute[VERTINDEXBO]);
glGenBuffers(1, &cbo->_bohandle); glGenBuffers(1, &cbo->_bohandle);
glBindBuffer(target, cbo->_bohandle); glBindBuffer(cbo->_target, cbo->_bohandle);
glBufferData(target, dim, NULL, GL_STATIC_DRAW); glBufferData(cbo->_target, dim, NULL, GL_STATIC_DRAW);
setBufferPointerEnableClientState(boname); setBufferPointerEnableClientState(boname);
glBindBuffer(target, 0); glBindBuffer(cbo->_target, 0);
_gpumeminfo.acquiredMemory(dim); _gpumeminfo.acquiredMemory(dim);
attributestobeupdated[boname] = true; attributestobeupdated[boname] = true;
cbo->_isvalid = true; cbo->_isvalid = true;
} }
@ -529,6 +492,57 @@ namespace vcg
} }
} }
bool tryToAllocatePerTriangleAttributesInBO(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm)
{
std::vector<bool> importattribute(_bo.size());
std::vector<bool> attributestobeupdated;
attributesToBeImportedInTriangleBasedPipeline(importattribute, nm, cm, tm);
bool replicated = !importattribute[VERTINDEXBO];
bool immediatemode = !(buffersAllocationFunction(vaohandlespecificperopenglcontext,nm,cm,tm,importattribute,attributestobeupdated));
if (immediatemode)
return false;
bool somethingtoupdate = false;
for(size_t hh = 0;hh < attributestobeupdated.size();++hh)
somethingtoupdate = somethingtoupdate || attributestobeupdated[hh];
if (somethingtoupdate)
{
if (replicated)
{
//WARNING!In case we have to update the wedgetexture bo maybe (not always!) we must update also the other buffer already in memory
//cause the wedgetexture pipeline force a change in the order of the triangles in GPU.
//they are now ordered by the texture seam and not more by the triangle index!
if (attributestobeupdated[WEDGETEXTUREBO])
{
for(size_t jj = 0;jj < attributestobeupdated.size();++jj)
attributestobeupdated[jj] = importattribute[jj] || attributestobeupdated[jj];
}
updateBuffersReplicatedPipeline(attributestobeupdated,tm);
}
else
updateBuffersIndexedPipeline(attributestobeupdated);
}
return true;
}
bool tryToAllocatePerPointAttributesInBO(GLuint& vaohandlespecificperopenglcontext,NORMAL_MODALITY nm,COLOR_MODALITY cm)
{
std::vector<bool> importattribute(_bo.size());
std::vector<bool> attributestobeupdated;
attributesToBeImportedInPointBasedPipeline(importattribute, nm, cm);
bool immediatemode = !(buffersAllocationFunction(vaohandlespecificperopenglcontext,nm,cm,TX_NONE,importattribute,attributestobeupdated));
if (immediatemode)
return false;
bool somethingtoupdate = false;
for(size_t hh = 0;hh < attributestobeupdated.size();++hh)
somethingtoupdate = somethingtoupdate || attributestobeupdated[hh];
if (somethingtoupdate)
updateBuffersIndexedPipeline(attributestobeupdated);
return true;
}
bool updateBuffersIndexedPipeline(const std::vector<bool>& attributestobeupdated) bool updateBuffersIndexedPipeline(const std::vector<bool>& attributestobeupdated)
{ {
_chunkmap.clear(); _chunkmap.clear();
@ -813,7 +827,7 @@ namespace vcg
return true; return true;
} }
bool immediateMode(NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,const std::vector<GLuint>& textureindex) bool immediateMode(NORMAL_MODALITY nm,COLOR_MODALITY cm,TEXTURE_MODALITY tm,const std::vector<GLuint>& textureindex = std::vector<GLuint>())
{ {
glPushAttrib(GL_ALL_ATTRIB_BITS); glPushAttrib(GL_ALL_ATTRIB_BITS);
if(_mesh.fn==0) if(_mesh.fn==0)
@ -912,7 +926,11 @@ namespace vcg
std::vector<bool> att(_bo.size(),false); std::vector<bool> att(_bo.size(),false);
attributesToBeImportedInTriangleBasedPipeline(att,nm,cm,tm); attributesToBeImportedInTriangleBasedPipeline(att,nm,cm,tm);
bool replicated = !att[VERTINDEXBO]; bool replicated = !att[VERTINDEXBO];
GLenum err = glGetError();
assert(err == GL_NO_ERROR);
glBindVertexArray(vaohandlespecificperopenglcontext); glBindVertexArray(vaohandlespecificperopenglcontext);
err = glGetError();
assert(err == GL_NO_ERROR);
if (replicated) if (replicated)
{ {
@ -956,9 +974,18 @@ namespace vcg
if (_bo[VERTINDEXBO]->_isvalid) if (_bo[VERTINDEXBO]->_isvalid)
{ {
err = glGetError();
assert(err == GL_NO_ERROR);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,_bo[VERTINDEXBO]->_bohandle); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,_bo[VERTINDEXBO]->_bohandle);
glDrawElements( GL_TRIANGLES, _mesh.fn * _bo[VERTINDEXBO]->_components,GL_UNSIGNED_INT ,NULL); err = glGetError();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); assert(err == GL_NO_ERROR);
glDrawElements( GL_TRIANGLES, _mesh.fn * _bo[VERTINDEXBO]->_components,GL_UNSIGNED_INT ,NULL);
err = glGetError();
printf("errore (%s)\n",gluErrorString(err));
assert(err == GL_NO_ERROR);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
err = glGetError();
assert(err == GL_NO_ERROR);
} }
glBindTexture(GL_TEXTURE_2D,0); glBindTexture(GL_TEXTURE_2D,0);
@ -982,7 +1009,7 @@ namespace vcg
glBindVertexArray(0); glBindVertexArray(0);
} }
void setBufferPointerEnableClientState( BO_NAMES boname) void setBufferPointerEnableClientState( BO_NAMES boname) const
{ {
if ((boname < VERTPOSITIONBO) || (boname > VERTINDEXBO)) if ((boname < VERTPOSITIONBO) || (boname > VERTINDEXBO))
return; return;
@ -1021,12 +1048,12 @@ namespace vcg
} }
case(VERTINDEXBO): case(VERTINDEXBO):
{ {
break; break;
} }
} }
} }
void disableClientState( BO_NAMES boname,const std::vector<bool>& importatt) void disableClientState( BO_NAMES boname,const std::vector<bool>& importatt) const
{ {
if ((boname < VERTPOSITIONBO) || (boname > VERTINDEXBO)) if ((boname < VERTPOSITIONBO) || (boname > VERTINDEXBO))
return; return;
@ -1180,7 +1207,7 @@ namespace vcg
std::vector<GLBufferObject*> _bo; std::vector<GLBufferObject*> _bo;
//GLuint vaohandle; //GLuint vaohandle;
std::vector< std::pair<short,GLuint> > _texindnumtriangles; std::vector< std::pair<short,GLuint> > _texindnumtriangles;
bool _lastfeedingusedreplicatedpipeline; bool _lastfeedingusedreplicatedpipeline;