- added support for contemporary maintaining per face/per vertex bos of the same attribute
This commit is contained in:
parent
bc9c61a92e
commit
786cd1d850
|
@ -642,10 +642,21 @@ protected:
|
||||||
size_t facechunk = std::min(size_t(tn),_perbatchprim);
|
size_t facechunk = std::min(size_t(tn),_perbatchprim);
|
||||||
size_t vertexchunk = std::min(size_t(vn),_perbatchprim);
|
size_t vertexchunk = std::min(size_t(vn),_perbatchprim);
|
||||||
|
|
||||||
std::vector<vcg::Point3f> pv(vertexchunk);
|
std::vector<vcg::Point3f> pv; //position vector
|
||||||
std::vector<vcg::Point3f> nv(vertexchunk);
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTPOSITION])
|
||||||
std::vector<vcg::Color4b> cv(vertexchunk); // Per vertex Colors
|
pv.resize(vertexchunk);
|
||||||
std::vector<float> tv(vertexchunk * 2);
|
|
||||||
|
std::vector<vcg::Point3f> nv; //per vertex normal vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL])
|
||||||
|
nv.resize(vertexchunk);
|
||||||
|
|
||||||
|
std::vector<vcg::Color4b> cv; // Per vertex color vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR])
|
||||||
|
cv.resize(vertexchunk);
|
||||||
|
|
||||||
|
std::vector<float> tv; // per vertex texture coord vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE])
|
||||||
|
tv.resize(vertexchunk * 2);
|
||||||
|
|
||||||
size_t chunckingpu = 0;
|
size_t chunckingpu = 0;
|
||||||
|
|
||||||
|
@ -747,10 +758,33 @@ protected:
|
||||||
|
|
||||||
size_t facechunk = std::min(size_t(tn),_perbatchprim);
|
size_t facechunk = std::min(size_t(tn),_perbatchprim);
|
||||||
|
|
||||||
std::vector<vcg::Point3f> rpv(facechunk * 3);
|
std::vector<vcg::Point3f> rpv; //position vector
|
||||||
std::vector<vcg::Point3f> rnv(facechunk * 3);
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTPOSITION])
|
||||||
std::vector<vcg::Color4b> rcv(facechunk * 3);
|
rpv.resize(facechunk * 3);
|
||||||
std::vector<float> rtv(facechunk * 3 * 2);
|
|
||||||
|
std::vector<vcg::Point3f> rnv; //per vertex normal vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL])
|
||||||
|
rnv.resize(facechunk * 3);
|
||||||
|
|
||||||
|
std::vector<vcg::Point3f> rfnv; //per face normal vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_FACENORMAL])
|
||||||
|
rfnv.resize(facechunk * 3);
|
||||||
|
|
||||||
|
std::vector<vcg::Color4b> rcv; // Per vertex color vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR])
|
||||||
|
rcv.resize(facechunk * 3);
|
||||||
|
|
||||||
|
std::vector<vcg::Color4b> rfcv; // Per vertex color vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_FACECOLOR])
|
||||||
|
rfcv.resize(facechunk * 3);
|
||||||
|
|
||||||
|
std::vector<float> rtv; // per vertex texture coord vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE])
|
||||||
|
rtv.resize(facechunk * 3 * 2);
|
||||||
|
|
||||||
|
std::vector<float> rwtv; // per wedge texture coord vector
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_WEDGETEXTURE])
|
||||||
|
rwtv.resize(facechunk * 3 * 2);
|
||||||
|
|
||||||
size_t chunckingpu = 0;
|
size_t chunckingpu = 0;
|
||||||
|
|
||||||
|
@ -814,11 +848,12 @@ protected:
|
||||||
rnv[chunkindex*3+1].Import(_mesh.face[indf].V(1)->N().Normalize());
|
rnv[chunkindex*3+1].Import(_mesh.face[indf].V(1)->N().Normalize());
|
||||||
rnv[chunkindex*3+2].Import(_mesh.face[indf].V(2)->N().Normalize());
|
rnv[chunkindex*3+2].Import(_mesh.face[indf].V(2)->N().Normalize());
|
||||||
}
|
}
|
||||||
else if (attributestobeupdated[GLFeederInfo::ATT_FACENORMAL])
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_FACENORMAL])
|
||||||
{
|
{
|
||||||
rnv[chunkindex*3+0].Import(_mesh.face[indf].N().Normalize());
|
rfnv[chunkindex*3+0].Import(_mesh.face[indf].N().Normalize());
|
||||||
rnv[chunkindex*3+1].Import(_mesh.face[indf].N().Normalize());
|
rfnv[chunkindex*3+1].Import(_mesh.face[indf].N().Normalize());
|
||||||
rnv[chunkindex*3+2].Import(_mesh.face[indf].N().Normalize());
|
rfnv[chunkindex*3+2].Import(_mesh.face[indf].N().Normalize());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR]))
|
if ((attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR]))
|
||||||
|
@ -827,23 +862,15 @@ protected:
|
||||||
rcv[chunkindex*3+1] = _mesh.face[indf].V(1)->C();
|
rcv[chunkindex*3+1] = _mesh.face[indf].V(1)->C();
|
||||||
rcv[chunkindex*3+2] = _mesh.face[indf].V(2)->C();
|
rcv[chunkindex*3+2] = _mesh.face[indf].V(2)->C();
|
||||||
}
|
}
|
||||||
else if ((attributestobeupdated[GLFeederInfo::ATT_FACECOLOR]))
|
|
||||||
|
if ((attributestobeupdated[GLFeederInfo::ATT_FACECOLOR]))
|
||||||
{
|
{
|
||||||
rcv[chunkindex*3+0] = _mesh.face[indf].C();
|
rfcv[chunkindex*3+0] = _mesh.face[indf].C();
|
||||||
rcv[chunkindex*3+1] = _mesh.face[indf].C();
|
rfcv[chunkindex*3+1] = _mesh.face[indf].C();
|
||||||
rcv[chunkindex*3+2] = _mesh.face[indf].C();
|
rfcv[chunkindex*3+2] = _mesh.face[indf].C();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_WEDGETEXTURE])
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE])
|
||||||
{
|
|
||||||
rtv[chunkindex*6+0]=float(_mesh.face[indf].WT(0).U());
|
|
||||||
rtv[chunkindex*6+1]=float(_mesh.face[indf].WT(0).V());
|
|
||||||
rtv[chunkindex*6+2]=float(_mesh.face[indf].WT(1).U());
|
|
||||||
rtv[chunkindex*6+3]=float(_mesh.face[indf].WT(1).V());
|
|
||||||
rtv[chunkindex*6+4]=float(_mesh.face[indf].WT(2).U());
|
|
||||||
rtv[chunkindex*6+5]=float(_mesh.face[indf].WT(2).V());
|
|
||||||
}
|
|
||||||
else if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE])
|
|
||||||
{
|
{
|
||||||
rtv[chunkindex*6+0]=float(_mesh.face[indf].V(0)->T().U());
|
rtv[chunkindex*6+0]=float(_mesh.face[indf].V(0)->T().U());
|
||||||
rtv[chunkindex*6+1]=float(_mesh.face[indf].V(0)->T().V());
|
rtv[chunkindex*6+1]=float(_mesh.face[indf].V(0)->T().V());
|
||||||
|
@ -853,6 +880,16 @@ protected:
|
||||||
rtv[chunkindex*6+5]=float(_mesh.face[indf].V(2)->T().V());
|
rtv[chunkindex*6+5]=float(_mesh.face[indf].V(2)->T().V());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_WEDGETEXTURE])
|
||||||
|
{
|
||||||
|
rwtv[chunkindex*6+0]=float(_mesh.face[indf].WT(0).U());
|
||||||
|
rwtv[chunkindex*6+1]=float(_mesh.face[indf].WT(0).V());
|
||||||
|
rwtv[chunkindex*6+2]=float(_mesh.face[indf].WT(1).U());
|
||||||
|
rwtv[chunkindex*6+3]=float(_mesh.face[indf].WT(1).V());
|
||||||
|
rwtv[chunkindex*6+4]=float(_mesh.face[indf].WT(2).U());
|
||||||
|
rwtv[chunkindex*6+5]=float(_mesh.face[indf].WT(2).V());
|
||||||
|
}
|
||||||
|
|
||||||
if((i == tn - 1) || (chunkindex == facechunk - 1))
|
if((i == tn - 1) || (chunkindex == facechunk - 1))
|
||||||
{
|
{
|
||||||
size_t chunksize = facechunk;
|
size_t chunksize = facechunk;
|
||||||
|
@ -866,40 +903,55 @@ protected:
|
||||||
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 * buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rpv[0]);
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 * buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rpv[0]);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
}
|
}
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL] || attributestobeupdated[GLFeederInfo::ATT_FACENORMAL])
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL])
|
||||||
{
|
{
|
||||||
GLBufferObject* buffobj;
|
GLBufferObject* buffobj = _bo[GLFeederInfo::ATT_VERTNORMAL];
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_VERTNORMAL])
|
|
||||||
buffobj = _bo[GLFeederInfo::ATT_VERTNORMAL];
|
|
||||||
else
|
|
||||||
buffobj = _bo[GLFeederInfo::ATT_FACENORMAL];
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
||||||
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 * buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rnv[0]);
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 * buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rnv[0]);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
}
|
}
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR] || attributestobeupdated[GLFeederInfo::ATT_FACECOLOR])
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_FACENORMAL])
|
||||||
|
{
|
||||||
|
GLBufferObject* buffobj = _bo[GLFeederInfo::ATT_FACENORMAL];
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
||||||
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 * buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rfnv[0]);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR])
|
||||||
{
|
{
|
||||||
GLBufferObject* buffobj;
|
GLBufferObject* buffobj = _bo[GLFeederInfo::ATT_VERTCOLOR];
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_VERTCOLOR])
|
|
||||||
buffobj = _bo[GLFeederInfo::ATT_VERTCOLOR];
|
|
||||||
else
|
|
||||||
buffobj = _bo[GLFeederInfo::ATT_FACECOLOR];
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
||||||
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 *buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rcv[0]);
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 *buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rcv[0]);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
}
|
}
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE] || attributestobeupdated[GLFeederInfo::ATT_WEDGETEXTURE])
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_FACECOLOR])
|
||||||
|
{
|
||||||
|
GLBufferObject* buffobj = _bo[GLFeederInfo::ATT_FACECOLOR];
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
||||||
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 *buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rfcv[0]);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE])
|
||||||
{
|
{
|
||||||
GLBufferObject* buffobj;
|
GLBufferObject* buffobj = _bo[GLFeederInfo::ATT_VERTTEXTURE];
|
||||||
if (attributestobeupdated[GLFeederInfo::ATT_VERTTEXTURE])
|
|
||||||
buffobj = _bo[GLFeederInfo::ATT_VERTTEXTURE];
|
|
||||||
else
|
|
||||||
buffobj = _bo[GLFeederInfo::ATT_WEDGETEXTURE];
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
||||||
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 *buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rtv[0]);
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 *buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rtv[0]);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (attributestobeupdated[GLFeederInfo::ATT_WEDGETEXTURE])
|
||||||
|
{
|
||||||
|
GLBufferObject* buffobj = _bo[GLFeederInfo::ATT_WEDGETEXTURE];
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, buffobj->_bohandle);
|
||||||
|
glBufferSubData(GL_ARRAY_BUFFER,chunckingpu * facechunk * 3 *buffobj->_components * buffobj->getSizeOfGLType(),3 * buffobj->_components * buffobj->getSizeOfGLType() * chunksize,&rwtv[0]);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
++chunckingpu;
|
++chunckingpu;
|
||||||
}
|
}
|
||||||
++i;
|
++i;
|
||||||
|
@ -1090,9 +1142,13 @@ protected:
|
||||||
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);
|
size_t pointsnum = _mesh.vn;
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
if (isReplicatedPipeline(_currallocatedboatt))
|
||||||
|
pointsnum = _mesh.fn * 3;
|
||||||
|
|
||||||
|
glDrawArrays(GL_POINTS,0,pointsnum);
|
||||||
|
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
/*disable all client state buffers*/
|
/*disable all client state buffers*/
|
||||||
ReqAtts tmp;
|
ReqAtts tmp;
|
||||||
|
|
Loading…
Reference in New Issue