- cleaned up the GLMeshAttributesFeeder class removing the per view internal map

This commit is contained in:
granzuglia 2015-07-13 06:03:27 +00:00
parent 06040acbb0
commit 4b3b1da6b1
1 changed files with 93 additions and 89 deletions

View File

@ -159,7 +159,7 @@ class GLMeshAttributesFeeder : public GLFeederInfo
{ {
public: public:
GLMeshAttributesFeeder(/*const*/ MESHTYPE& mesh,MemoryInfo& meminfo, size_t perbatchprimitives) GLMeshAttributesFeeder(/*const*/ MESHTYPE& mesh,MemoryInfo& meminfo, size_t perbatchprimitives)
:_mesh(mesh),_gpumeminfo(meminfo),_bo(ATT_NAMES_ARITY,NULL),_currboatt(),_allreqattsmap(),_lastfeedingusedreplicatedpipeline(false),_perbatchprim(perbatchprimitives),_chunkmap(),_borendering(false),_rendermodinitialized(false) :_mesh(mesh),_gpumeminfo(meminfo),_bo(ATT_NAMES_ARITY,NULL),_currallocatedboatt(),_lastfeedingusedreplicatedpipeline(false),_perbatchprim(perbatchprimitives),_chunkmap(),_borendering(false),_rendermodinitialized(false)
{ {
_bo[GLFeederInfo::ATT_VERTPOSITION] = new GLBufferObject(3,GL_FLOAT,GL_VERTEX_ARRAY,GL_ARRAY_BUFFER); _bo[GLFeederInfo::ATT_VERTPOSITION] = new GLBufferObject(3,GL_FLOAT,GL_VERTEX_ARRAY,GL_ARRAY_BUFFER);
_bo[GLFeederInfo::ATT_VERTNORMAL] = new GLBufferObject(3,GL_FLOAT,GL_NORMAL_ARRAY,GL_ARRAY_BUFFER); _bo[GLFeederInfo::ATT_VERTNORMAL] = new GLBufferObject(3,GL_FLOAT,GL_NORMAL_ARRAY,GL_ARRAY_BUFFER);
@ -195,44 +195,44 @@ public:
} }
bool boupdatedrequired = false; bool boupdatedrequired = false;
if (((mask & attBitMask(GLFeederInfo::ATT_VERTPOSITION)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_VERTPOSITION])) if (((mask & attBitMask(GLFeederInfo::ATT_VERTPOSITION)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_VERTPOSITION]))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_VERTPOSITION]->_isvalid = false; _bo[GLFeederInfo::ATT_VERTPOSITION]->_isvalid = false;
} }
if (((mask & attBitMask(GLFeederInfo::ATT_VERTNORMAL)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_VERTNORMAL] && vcg::tri::HasPerVertexNormal(_mesh))) if (((mask & attBitMask(GLFeederInfo::ATT_VERTNORMAL)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_VERTNORMAL] && vcg::tri::HasPerVertexNormal(_mesh)))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_VERTNORMAL]->_isvalid = false; _bo[GLFeederInfo::ATT_VERTNORMAL]->_isvalid = false;
} }
if (((mask & attBitMask(GLFeederInfo::ATT_FACENORMAL)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_FACENORMAL] && vcg::tri::HasPerFaceNormal(_mesh))) if (((mask & attBitMask(GLFeederInfo::ATT_FACENORMAL)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_FACENORMAL] && vcg::tri::HasPerFaceNormal(_mesh)))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_FACENORMAL]->_isvalid = false; _bo[GLFeederInfo::ATT_FACENORMAL]->_isvalid = false;
} }
if (((mask & attBitMask(GLFeederInfo::ATT_VERTCOLOR)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_VERTCOLOR] && vcg::tri::HasPerVertexColor(_mesh))) if (((mask & attBitMask(GLFeederInfo::ATT_VERTCOLOR)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_VERTCOLOR] && vcg::tri::HasPerVertexColor(_mesh)))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_VERTCOLOR]->_isvalid = false; _bo[GLFeederInfo::ATT_VERTCOLOR]->_isvalid = false;
} }
if (((mask & attBitMask(GLFeederInfo::ATT_FACECOLOR)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_FACECOLOR] && vcg::tri::HasPerFaceColor(_mesh))) if (((mask & attBitMask(GLFeederInfo::ATT_FACECOLOR)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_FACECOLOR] && vcg::tri::HasPerFaceColor(_mesh)))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_FACECOLOR]->_isvalid = false; _bo[GLFeederInfo::ATT_FACECOLOR]->_isvalid = false;
} }
if (((mask & attBitMask(GLFeederInfo::ATT_VERTTEXTURE)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_VERTTEXTURE] && vcg::tri::HasPerVertexTexCoord(_mesh))) if (((mask & attBitMask(GLFeederInfo::ATT_VERTTEXTURE)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_VERTTEXTURE] && vcg::tri::HasPerVertexTexCoord(_mesh)))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_VERTTEXTURE]->_isvalid = false; _bo[GLFeederInfo::ATT_VERTTEXTURE]->_isvalid = false;
} }
if (((mask & attBitMask(GLFeederInfo::ATT_WEDGETEXTURE)) || (mask & attBitMask(ATT_ALL))) && (_currboatt[ATT_WEDGETEXTURE] && vcg::tri::HasPerWedgeTexCoord(_mesh))) if (((mask & attBitMask(GLFeederInfo::ATT_WEDGETEXTURE)) || (mask & attBitMask(ATT_ALL))) && (_currallocatedboatt[ATT_WEDGETEXTURE] && vcg::tri::HasPerWedgeTexCoord(_mesh)))
{ {
boupdatedrequired = true; boupdatedrequired = true;
_bo[GLFeederInfo::ATT_WEDGETEXTURE]->_isvalid = false; _bo[GLFeederInfo::ATT_WEDGETEXTURE]->_isvalid = false;
@ -248,37 +248,27 @@ public:
tryToAllocateAttributesInBO(); tryToAllocateAttributesInBO();
} }
bool setupRequestedAttributes(unsigned int viewid,const ReqAtts& rq) ReqAtts setupRequestedAttributes(const ReqAtts& rq,bool& allocated)
{ {
if (!_rendermodinitialized) if (!_rendermodinitialized)
_rendermodinitialized = true; _rendermodinitialized = true;
try try
{ {
/*if there is not already an entry for this viewid insert it*/ ReqAtts tmp = rq;
std::pair< std::map<unsigned int,ReqAtts>::iterator,bool> inserted = _allreqattsmap.insert(std::make_pair(viewid,rq));
/*there is already an entry. update it*/
if (!inserted.second)
inserted.first->second = rq;
ReqAtts& tmp = inserted.first->second;
computeARequestedAttributesSetCompatibleWithMesh(tmp,_mesh); computeARequestedAttributesSetCompatibleWithMesh(tmp,_mesh);
mergeReqAtts(tmp,_currboatt); mergeReqAtts(tmp,_currallocatedboatt);
return tryToAllocateAttributesInBO(); allocated = tryToAllocateAttributesInBO();
if (allocated)
return tmp;
else
return ReqAtts();
} }
catch (GLFeederException& e) catch (GLFeederException& e)
{ {
return false; return ReqAtts();
} }
return false; return ReqAtts();
}
bool getRequestedAttributes(unsigned int viewid,ReqAtts& rq)
{
std::map<unsigned int,ReqAtts>::iterator it = _allreqattsmap.find(viewid);
if (it == _allreqattsmap.end())
return false;
rq = it->second;
return true;
} }
void buffersDeAllocationRequested() void buffersDeAllocationRequested()
@ -294,14 +284,28 @@ public:
} }
} }
void draw(unsigned int viewid,const std::vector<GLuint> textid = std::vector<GLuint>()) void draw(const ReqAtts& rq,const std::vector<GLuint> textid = std::vector<GLuint>())
{ {
std::map<unsigned int,ReqAtts>::iterator viewiter = _allreqattsmap.find(viewid); if (isPossibleToUseBORendering())
if (viewiter == _allreqattsmap.end()) {
return; switch(rq.primitiveModality())
draw(viewiter->second,textid); {
} case(PR_TRIANGLES):
drawTriangles(rq,textid);
break;
case(PR_POINTS):
drawPoints(rq);
break;
case (PR_QUADS):
break;
default:
break;
}
}
else
immediateModeRendering(rq,textid);
}
void setPerBatchPrimitives(size_t perbatchprimitives) void setPerBatchPrimitives(size_t perbatchprimitives)
{ {
@ -411,11 +415,11 @@ protected:
bool buffersAllocationFunction(std::vector<bool>& attributestobeupdated) bool buffersAllocationFunction(std::vector<bool>& attributestobeupdated)
{ {
bool replicated = isReplicatedPipeline(_currboatt); bool replicated = isReplicatedPipeline(_currallocatedboatt);
attributestobeupdated.clear(); attributestobeupdated.clear();
attributestobeupdated.resize(_bo.size()); attributestobeupdated.resize(_bo.size());
long long unsigned int bomemoryrequiredbymesh = bufferObjectsMemoryRequired(_currboatt); long long unsigned int bomemoryrequiredbymesh = bufferObjectsMemoryRequired(_currallocatedboatt);
bool generateindex = isVertexIndexingRequired(_currboatt); bool generateindex = isVertexIndexingRequired(_currallocatedboatt);
unsigned int ii = 0; unsigned int ii = 0;
for(typename std::vector<GLBufferObject*>::iterator it = _bo.begin();it != _bo.end();++it) for(typename std::vector<GLBufferObject*>::iterator it = _bo.begin();it != _bo.end();++it)
@ -433,9 +437,11 @@ protected:
/*we switched back from the replicated pipeline to the normal one. All the bos have to be regenerated*/ /*we switched back from the replicated pipeline to the normal one. All the bos have to be regenerated*/
(!replicated && _lastfeedingusedreplicatedpipeline) || (!replicated && _lastfeedingusedreplicatedpipeline) ||
/*the buffer object is valid but for same reason the number of cells of the bo don't suit anymore the required size. we have to reallocate the buffer object*/ /*the buffer object is valid but for same reason the number of cells of the bo don't suit anymore the required size. we have to reallocate the buffer object*/
(((*it)->_isvalid) && (sz != (*it)->_size)) || (((*it)->_isvalid) && (sz != (*it)->_size))
//||
//the buffer is valid, but the attribute is not required to be displayed //the buffer is valid, but the attribute is not required to be displayed
(((*it)->_isvalid) && !isAttributeRequiredToBeDisplayed(boname)))) /*(((*it)->_isvalid) && !isAttributeRequiredToBeDisplayed(boname)))*/
))
{ {
//disableClientState(boname,importattribute); //disableClientState(boname,importattribute);
@ -470,7 +476,7 @@ protected:
//we have to deallocate the previously allocated mesh attributes //we have to deallocate the previously allocated mesh attributes
if ((*it != NULL) && ((sz == (*it)->_size))) if ((*it != NULL) && ((sz == (*it)->_size)))
{ {
long long unsigned int dim(boExpectedDimension(boname,replicated,_currboatt[GLFeederInfo::ATT_VERTINDEX])); long long unsigned int dim(boExpectedDimension(boname,replicated,_currallocatedboatt[GLFeederInfo::ATT_VERTINDEX]));
//disableClientState(boname,importattribute); //disableClientState(boname,importattribute);
if ((*it)->_size > 0) if ((*it)->_size > 0)
{ {
@ -497,26 +503,25 @@ protected:
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
for(size_t kk = 0;kk < attributestobeupdated.size();++kk) for(size_t kk = 0;kk < attributestobeupdated.size();++kk)
attributestobeupdated[kk] = _currboatt[static_cast<ATT_NAMES>(kk)]; attributestobeupdated[kk] = _currallocatedboatt[static_cast<ATT_NAMES>(kk)];
bool failedallocation = false; bool failedallocation = false;
typename std::vector<GLBufferObject*>::iterator it = _bo.begin(); typename std::vector<GLBufferObject*>::iterator it = _bo.begin();
while((it != _bo.end()) && (!failedallocation)) while((it != _bo.end()) && (!failedallocation))
{ {
ATT_NAMES boname = static_cast<ATT_NAMES>(ii); ATT_NAMES boname = static_cast<ATT_NAMES>(ii);
GLBufferObject* cbo = _bo.at(boname); GLBufferObject* cbo = _bo.at(boname);
bool importatt = _currboatt[boname]; bool importatt = _currallocatedboatt[boname];
//glBindVertexArray(vaohandlespecificperopenglcontext); //glBindVertexArray(vaohandlespecificperopenglcontext);
/*if a bo is not valid but at this point has a valid handle means that attribute values have been updated but the arity of the vertices/faces didn't change. i can use the already allocated space*/ /*if a bo is not valid but at this point has a valid handle means that attribute values have been updated but the arity of the vertices/faces didn't change. i can use the already allocated space*/
bool notvalidbuttoberegenerated = (cbo != NULL) && (!cbo->_isvalid) && (cbo->_bohandle == 0) && (importatt); bool notvalidbuttoberegenerated = (cbo != NULL) && (!cbo->_isvalid) && (cbo->_bohandle == 0) && (importatt);
if (notvalidbuttoberegenerated) if (notvalidbuttoberegenerated)
{ {
cbo->_size = boExpectedSize(boname,replicated,_currboatt[GLFeederInfo::ATT_VERTINDEX]); cbo->_size = boExpectedSize(boname,replicated,_currallocatedboatt[GLFeederInfo::ATT_VERTINDEX]);
long long unsigned int dim = boExpectedDimension(boname,replicated,_currboatt[GLFeederInfo::ATT_VERTINDEX]); long long unsigned int dim = boExpectedDimension(boname,replicated,_currallocatedboatt[GLFeederInfo::ATT_VERTINDEX]);
glGenBuffers(1, &cbo->_bohandle); glGenBuffers(1, &cbo->_bohandle);
glBindBuffer(cbo->_target, cbo->_bohandle); glBindBuffer(cbo->_target, cbo->_bohandle);
//we call glGetError BEFORE the glBufferData function in order to clean the error flag //we call glGetError BEFORE the glBufferData function in order to clean the error flag
GLenum err = glGetError(); GLenum err = glGetError();
glBufferData(cbo->_target, dim, NULL, GL_STATIC_DRAW); glBufferData(cbo->_target, dim, NULL, GL_STATIC_DRAW);
@ -579,7 +584,7 @@ protected:
bool tryToAllocateAttributesInBO() bool tryToAllocateAttributesInBO()
{ {
std::vector<bool> attributestobeupdated; std::vector<bool> attributestobeupdated;
bool replicated = isReplicatedPipeline(_currboatt); bool replicated = isReplicatedPipeline(_currallocatedboatt);
bool immediatemode = !(buffersAllocationFunction(attributestobeupdated)); bool immediatemode = !(buffersAllocationFunction(attributestobeupdated));
if (immediatemode) if (immediatemode)
@ -600,7 +605,7 @@ protected:
for(size_t jj = 0;jj < attributestobeupdated.size();++jj) for(size_t jj = 0;jj < attributestobeupdated.size();++jj)
{ {
ATT_NAMES att = static_cast<ATT_NAMES>(jj); ATT_NAMES att = static_cast<ATT_NAMES>(jj);
attributestobeupdated[jj] = _currboatt[att] || attributestobeupdated[jj]; attributestobeupdated[jj] = _currallocatedboatt[att] || attributestobeupdated[jj];
} }
} }
updateBuffersReplicatedPipeline(attributestobeupdated); updateBuffersReplicatedPipeline(attributestobeupdated);
@ -728,7 +733,7 @@ protected:
{ {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _bo[GLFeederInfo::ATT_VERTINDEX]->_bohandle); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _bo[GLFeederInfo::ATT_VERTINDEX]->_bohandle);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,chunckingpu * facechunk * _bo[GLFeederInfo::ATT_VERTINDEX]->_components * _bo[GLFeederInfo::ATT_VERTINDEX]->getSizeOfGLType(),_bo[GLFeederInfo::ATT_VERTINDEX]->_components * _bo[GLFeederInfo::ATT_VERTINDEX]->getSizeOfGLType() * chunksize,&ti[0]); glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,chunckingpu * facechunk * _bo[GLFeederInfo::ATT_VERTINDEX]->_components * _bo[GLFeederInfo::ATT_VERTINDEX]->getSizeOfGLType(),_bo[GLFeederInfo::ATT_VERTINDEX]->_components * _bo[GLFeederInfo::ATT_VERTINDEX]->getSizeOfGLType() * chunksize,&ti[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
} }
++chunckingpu; ++chunckingpu;
} }
@ -772,7 +777,7 @@ protected:
//default case: no texture is required to be rendered but a non texture attribute has to be updated //default case: no texture is required to be rendered but a non texture attribute has to be updated
//we have to init the _chunkmap with just one entry (-1...that means no texture) referring all the triangles in the mesh //we have to init the _chunkmap with just one entry (-1...that means no texture) referring all the triangles in the mesh
if ((!_currboatt[ATT_VERTTEXTURE] && !_currboatt[ATT_WEDGETEXTURE]) && if ((!_currallocatedboatt[ATT_VERTTEXTURE] && !_currallocatedboatt[ATT_WEDGETEXTURE]) &&
(attributestobeupdated[GLFeederInfo::ATT_VERTPOSITION] || (attributestobeupdated[GLFeederInfo::ATT_VERTPOSITION] ||
attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL] || attributestobeupdated[GLFeederInfo::ATT_FACENORMAL] || attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL] || attributestobeupdated[GLFeederInfo::ATT_FACENORMAL] ||
attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR] || attributestobeupdated[GLFeederInfo::ATT_FACECOLOR])) attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR] || attributestobeupdated[GLFeederInfo::ATT_FACECOLOR]))
@ -912,28 +917,6 @@ protected:
return true; return true;
} }
void draw(const ReqAtts& req,const std::vector<GLuint> textid = std::vector<GLuint>())
{
if (isPossibleToUseBORendering())
{
switch(req.primitiveModality())
{
case(PR_TRIANGLES):
drawTriangles(req,textid);
break;
case(PR_POINTS):
drawPoints(req);
break;
case (PR_QUADS):
break;
default:
break;
}
}
else
immediateModeRendering(req,textid);
}
bool immediateModeRendering(const ReqAtts& req,const std::vector<GLuint>& textureindex = std::vector<GLuint>()) bool immediateModeRendering(const ReqAtts& req,const std::vector<GLuint>& textureindex = std::vector<GLuint>())
{ {
glPushAttrib(GL_ALL_ATTRIB_BITS); glPushAttrib(GL_ALL_ATTRIB_BITS);
@ -1030,10 +1013,10 @@ protected:
void drawTriangles(const ReqAtts& req,const std::vector<GLuint>& textureindex = std::vector<GLuint>()) void drawTriangles(const ReqAtts& req,const std::vector<GLuint>& textureindex = std::vector<GLuint>())
{ {
//isBORenderingPossible( //isBORenderingPossible(
if(!isPossibleToUseBORendering()) if((!isPossibleToUseBORendering()) || (_mesh.VN() == 0))
return; return;
updateClientState(req); updateClientState(req);
bool replicated = isReplicatedPipeline(_currboatt); bool replicated = isReplicatedPipeline(_currallocatedboatt);
if (replicated) if (replicated)
{ {
@ -1087,17 +1070,33 @@ protected:
} }
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
glBindBuffer(GL_ARRAY_BUFFER,0); glBindBuffer(GL_ARRAY_BUFFER,0);
int ii = 0;
for(typename std::vector<GLBufferObject*>::const_iterator it = _bo.begin();it != _bo.end();++it)
{
ATT_NAMES boname = static_cast<ATT_NAMES>(ii);
if ((boname != GLFeederInfo::ATT_VERTINDEX) && (boname != GLFeederInfo::ATT_MESHCOLOR))
disableClientState(boname,req);
++ii;
}
/*disable all client state buffers*/
ReqAtts tmp;
updateClientState(tmp);
} }
void drawPoints(const ReqAtts& req) void drawPoints(const ReqAtts& req)
{ {
if(!isPossibleToUseBORendering()) if ((!isPossibleToUseBORendering()) || (_mesh.VN() == 0))
return; return;
updateClientState(req); updateClientState(req);
glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE_2D);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _bo[GLFeederInfo::ATT_VERTINDEX]->_bohandle); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _bo[GLFeederInfo::ATT_VERTINDEX]->_bohandle);
glDrawArrays(GL_POINTS,0,_mesh.vn); glDrawArrays(GL_POINTS,0,_mesh.vn);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
/*disable all client state buffers*/
ReqAtts tmp;
updateClientState(tmp);
} }
void updateClientState(const ReqAtts& req) void updateClientState(const ReqAtts& req)
@ -1106,10 +1105,15 @@ protected:
for(typename std::vector<GLBufferObject*>::const_iterator it = _bo.begin();it != _bo.end();++it) for(typename std::vector<GLBufferObject*>::const_iterator it = _bo.begin();it != _bo.end();++it)
{ {
ATT_NAMES boname = static_cast<ATT_NAMES>(ii); ATT_NAMES boname = static_cast<ATT_NAMES>(ii);
if(boname != GLFeederInfo::ATT_VERTINDEX) if ((boname != GLFeederInfo::ATT_VERTINDEX) && (boname != GLFeederInfo::ATT_MESHCOLOR))
{ {
if (req[boname] && _currboatt[boname] && (*it != NULL)) if (req[boname] && _currallocatedboatt[boname] && (*it != NULL))
glEnableClientState((*it)->_clientstatetag); {
glBindBuffer((*it)->_target, (*it)->_bohandle);
setBufferPointer(boname);
glEnableClientState((*it)->_clientstatetag);
glBindBuffer((*it)->_target, 0);
}
else else
disableClientState(boname,req); disableClientState(boname,req);
} }
@ -1117,13 +1121,13 @@ protected:
} }
} }
bool isAttributeRequiredToBeDisplayed(ATT_NAMES att) //bool isAttributeRequiredToBeDisplayed(ATT_NAMES att)
{ //{
bool res = false; // bool res = false;
for(std::map<unsigned int,ReqAtts>::const_iterator it = _allreqattsmap.begin();it != _allreqattsmap.end();++it) // for(std::map<unsigned int,ReqAtts>::const_iterator it = _allreqattsmap.begin();it != _allreqattsmap.end();++it)
res |= it->second[att]; // res |= it->second[att];
return res; // return res;
} //}
void setBufferPointer( ATT_NAMES boname) const void setBufferPointer( ATT_NAMES boname) const
{ {
@ -1339,9 +1343,9 @@ protected:
std::vector<GLBufferObject*> _bo; std::vector<GLBufferObject*> _bo;
/*_currboatt contains the union of all the requested attributes by each single view on the scene. At the end it represents the BOs allocated in the GPU memory*/ /*_currboatt contains the union of all the requested attributes by each single view on the scene. At the end it represents the BOs allocated in the GPU memory*/
ReqAtts _currboatt; ReqAtts _currallocatedboatt;
/*_allreqattmap contains a map of the requested atts by each single view. it's maintained for the actual rendering step*/ ///*_allreqattmap contains a map of the requested atts by each single view. it's maintained for the actual rendering step*/
std::map<unsigned int,ReqAtts> _allreqattsmap; //std::map<unsigned int,ReqAtts> _allreqattsmap;
std::vector< std::pair<short,GLuint> > _texindnumtriangles; std::vector< std::pair<short,GLuint> > _texindnumtriangles;