Commit 86b3bc0f authored by Pierre Kraemer's avatar Pierre Kraemer

add vboRender / allow VBO update from given vector

parent 278d906f
......@@ -113,7 +113,6 @@ void Viewer::cb_initGL()
m_simpleColorShader->setColor(c) ;
m_pointSprite = new Utils::PointSprite() ;
m_pointSprite->setAttributePosition(m_positionVBO) ;
registerShader(m_phongShader) ;
registerShader(m_flatShader) ;
......@@ -127,6 +126,7 @@ void Viewer::cb_redraw()
if(m_drawVertices)
{
float size = vertexScaleFactor ;
m_pointSprite->setAttributePosition(m_positionVBO) ;
m_pointSprite->setSize(size) ;
m_pointSprite->predraw(Geom::Vec3f(0.0f, 0.0f, 1.0f)) ;
m_render->draw(m_pointSprite, Algo::Render::GL2::POINTS) ;
......@@ -191,6 +191,18 @@ void Viewer::cb_Save()
exportMesh(filename) ;
}
void Viewer::cb_keyPress(int keycode)
{
switch(keycode)
{
case 'c' :
myMap.check();
break;
default:
break;
}
}
void Viewer::importMesh(std::string& filename)
{
myMap.clear(true) ;
......@@ -311,21 +323,6 @@ void Viewer::slot_normalsSize(int i)
updateGL() ;
}
void Viewer::cb_keyPress(int keycode)
{
switch(keycode)
{
case 'c' :
myMap.check();
break;
default:
break;
}
updateGLMatrices() ;
updateGL();
}
/**********************************************************************************************
* MAIN FUNCTION *
**********************************************************************************************/
......@@ -334,6 +331,8 @@ int main(int argc, char **argv)
{
QApplication app(argc, argv) ;
srand(123) ;
Viewer sqt ;
sqt.setGeometry(0, 0, 1000, 800) ;
sqt.show() ;
......
......@@ -46,6 +46,8 @@
#include "Utils/Shaders/shaderVectorPerVertex.h"
#include "Utils/pointSprite.h"
#include "Utils/text3d.h"
#include "Utils/vboRender.h"
#include "Utils/Qt/qtInputs.h"
#include "Algo/Geometry/boundingbox.h"
......
......@@ -79,7 +79,7 @@ void drawerVertices(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>
* @param k shrinking factor
*/
template<typename PFP>
void drawerEdges(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& vd, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerEdges(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& vd, const VertexAttribute<typename PFP::VEC3>& positions, float k);
/**
* add a set of faces to a drawer
......@@ -90,7 +90,7 @@ void drawerEdges(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& v
* @param k shrinking factor
*/
template<typename PFP>
void drawerFaces(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& vd, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerFaces(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& vd, const VertexAttribute<typename PFP::VEC3>& positions, float k);
/**
* add a set of volumes to a drawer
......@@ -101,7 +101,7 @@ void drawerFaces(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& v
* @param k shrinking factor
*/
template<typename PFP>
void drawerVolumes(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& vd, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerVolumes(Utils::Drawer& dr, typename PFP::MAP& map, std::vector<Dart>& vd, const VertexAttribute<typename PFP::VEC3>& positions, float k);
/**
* add a vertex to a drawer
......@@ -121,7 +121,7 @@ void drawerVertex(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const Verte
* @param positions attribute of positions
*/
template<typename PFP>
void drawerEdge(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerEdge(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions, float k);
/**
* add a face to a drawer
......@@ -132,7 +132,7 @@ void drawerEdge(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const Vertex
* @param k shrinking factor
*/
template<typename PFP>
void drawerFace(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerFace(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions, float k);
/**
* add a volume to a drawer
......@@ -143,7 +143,7 @@ void drawerFace(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexA
* @param k shrinking factor
*/
template<typename PFP>
void drawerVolume(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerVolume(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions, float k);
/**
* add an edge to a drawer, use between begin / end
......@@ -188,13 +188,13 @@ void drawerAddFace(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const Vert
* @param k shrinking factor
*/
template<typename PFP>
void drawerAddVolume(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions,float k);
void drawerAddVolume(Utils::Drawer& dr, typename PFP::MAP& map, Dart d, const VertexAttribute<typename PFP::VEC3>& positions, float k);
}
} // namespace Render
}
} // namespace Algo
}
} // namespace CGoGN
#include "Algo/Render/GL2/drawerCells.hpp"
......
......@@ -100,7 +100,7 @@ protected:
static bool cmpVP(VertexPoly* lhs, VertexPoly* rhs);
// multiset typedef for simple writing
typedef std::multiset< VertexPoly*,bool(*)(VertexPoly*,VertexPoly*)> VPMS;
typedef std::multiset<VertexPoly*, bool(*)(VertexPoly*,VertexPoly*)> VPMS;
class VertexPoly
{
......@@ -112,9 +112,9 @@ protected:
VertexPoly* next;
VPMS::iterator ear;
VertexPoly(int i, float v, float l, VertexPoly* p=NULL): id(i),value(v), length(l), prev(p), next(NULL)
VertexPoly(int i, float v, float l, VertexPoly* p = NULL) : id(i), value(v), length(l), prev(p), next(NULL)
{
if (prev!=NULL)
if (prev != NULL)
prev->next = this;
}
......@@ -132,7 +132,6 @@ protected:
delete vp;
return tmp;
}
};
public:
......
......@@ -288,7 +288,6 @@ public:
virtual void updateClippingUniforms() {CGoGNerr << "Warning updateClippingUniforms not implemented"<< CGoGNendl;}
/**
*
*/
......@@ -341,7 +340,6 @@ public:
*/
void addPathFileSeach(const std::string& path);
/**
* remove VBO index from binding
*/
......@@ -374,7 +372,7 @@ public:
* bind, enable, and set all vertex attrib pointers
* @param stride: the stride parameter, number osf byte between two consecutive attributes
*/
void enableVertexAttribs(unsigned int stride=0, unsigned int begin=0) const;
void enableVertexAttribs(unsigned int stride = 0, unsigned int begin = 0) const;
/**
* disenable all vertex attribs
......@@ -394,8 +392,6 @@ public:
static void pushTransfo() {s_current_matrices->pushTransfo();}
/// pop transformation matrix
static void popTransfo() {s_current_matrices->popTransfo();}
};
......
......@@ -32,6 +32,7 @@ namespace CGoGN { namespace Utils { class VBO; } }
namespace CGoGN
{
namespace Utils
{
......@@ -63,7 +64,7 @@ public:
/**
* init shaders, texture and variables
*/
PointSprite(float radius=1.0f);
PointSprite(float radius = 1.0f);
/**
* clean shaders, texture and variables
......@@ -90,9 +91,10 @@ public:
* set position attribute
*/
unsigned int setAttributePosition(VBO* vbo);
};
} // namespace Utils
} // namespace CGoGN
};
}
}
#endif
......@@ -92,12 +92,12 @@ public:
/**
* get nb element in vbo (vertices, colors ...)
*/
unsigned int nbElts() {return m_nbElts;}
unsigned int nbElts() { return m_nbElts; }
/**
* bind array vbo
*/
void bind() const { glBindBuffer(GL_ARRAY_BUFFER,m_id); }
void bind() const { glBindBuffer(GL_ARRAY_BUFFER, m_id); }
/**
* alloc buffer of same size than parameter
......@@ -116,6 +116,12 @@ public:
template <typename ATTR_HANDLER>
void updateData(const ATTR_HANDLER& attrib, ConvertAttrib* conv);
/**
* update data from given data vector
*/
template <typename T>
void updateData(std::vector<T>& data);
void* lockPtr();
const void* lockPtr() const;
......@@ -124,8 +130,6 @@ public:
void copyData(void *ptr) const;
void allocate(unsigned int nbElts);
};
......
......@@ -33,7 +33,7 @@ void VBO::updateData(const ATTR_HANDLER& attrib)
{
if (m_lock)
{
CGoGNerr <<" Error locked VBO"<< CGoGNendl;
CGoGNerr << "Error locked VBO" << CGoGNendl;
return;
}
m_data_size = sizeof(typename ATTR_HANDLER::DATA_TYPE) / sizeof(float);
......@@ -62,7 +62,7 @@ void VBO::updateData(const ATTR_HANDLER& attrib, ConvertAttrib* conv)
{
if (m_lock)
{
CGoGNerr <<" Error locked VBO"<< CGoGNendl;
CGoGNerr << "Error locked VBO" << CGoGNendl;
return;
}
m_data_size = conv->sizeElt();
......@@ -97,6 +97,21 @@ void VBO::updateData(const ATTR_HANDLER& attrib, ConvertAttrib* conv)
conv->release();
}
template <typename T>
void VBO::updateData(std::vector<T>& data)
{
if (m_lock)
{
CGoGNerr << "Error locked VBO" << CGoGNendl;
return;
}
m_data_size = sizeof(T) / sizeof(float);
m_nbElts = data.size();
glBindBuffer(GL_ARRAY_BUFFER, m_id);
glBufferData(GL_ARRAY_BUFFER, m_nbElts * sizeof(T), &(data[0]), GL_STREAM_DRAW);
}
} // namespace Utils
} // namespace CGoGN
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps *
* version 0.1 *
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg *
* *
* This library is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your *
* option) any later version. *
* *
* This library is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this library; if not, write to the Free Software Foundation, *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
* *
* Web site: http://cgogn.unistra.fr/ *
* Contact information: cgogn@unistra.fr *
* *
*******************************************************************************/
#ifndef _VBO_RENDER_
#define _VBO_RENDER_
#include <GL/glew.h>
namespace CGoGN
{
namespace Utils
{
// forward definition
class GLSLShader;
class VBORender
{
protected:
GLuint m_indexBuffer ;
GLuint m_nbIndices ;
int m_primitiveType ;
public:
enum primitiveTypes
{
POINTS = 0,
LINES = 1,
TRIANGLES = 2
} ;
VBORender() ;
~VBORender() ;
void setConnectivity(std::vector<GLuint>& tableIndices, int primitiveType) ;
void draw(Utils::GLSLShader* sh) ;
};
} // namespace Utils
} // namespace CGoGN
#endif
......@@ -53,33 +53,38 @@ void MapRender::initPrimitives(int prim, std::vector<GLuint>& tableIndices)
{
// indice du VBO a utiliser
int vbo_ind = 0;
int size = 0;
switch(prim)
{
case POINTS:
m_nbIndices[POINT_INDICES] = tableIndices.size();
vbo_ind = m_indexBuffers[POINT_INDICES];
size = m_nbIndices[POINT_INDICES];
break;
case LINES:
m_nbIndices[LINE_INDICES] = tableIndices.size();
vbo_ind = m_indexBuffers[LINE_INDICES];
size = m_nbIndices[LINE_INDICES];
break;
case TRIANGLES:
m_nbIndices[TRIANGLE_INDICES] = tableIndices.size();
vbo_ind = m_indexBuffers[TRIANGLE_INDICES];
size = m_nbIndices[TRIANGLE_INDICES];
break;
case BOUNDARY:
m_nbIndices[BOUNDARY_INDICES] = tableIndices.size();
vbo_ind = m_indexBuffers[BOUNDARY_INDICES];
size = m_nbIndices[BOUNDARY_INDICES];
break;
default:
CGoGNerr << "problem initializing VBO indices" << CGoGNendl;
break;
}
int size = tableIndices.size();
// setup du buffer d'indices
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, vbo_ind);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, size*sizeof(GLuint), &(tableIndices[0]), GL_STREAM_DRAW);
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, size * sizeof(GLuint), &(tableIndices[0]), GL_STREAM_DRAW);
}
void MapRender::draw(Utils::GLSLShader* sh, int prim)
......@@ -112,10 +117,10 @@ void MapRender::draw(Utils::GLSLShader* sh, int prim)
sh->disableVertexAttribs();
}
unsigned int MapRender::drawSub(Utils::GLSLShader* sh, int prim, unsigned int nb_elm)
{
sh->enableVertexAttribs();
switch(prim)
{
case POINTS:
......@@ -145,7 +150,6 @@ unsigned int MapRender::drawSub(Utils::GLSLShader* sh, int prim, unsigned int nb
return nb_elm;
}
} // namespace GL2
} // namespace Render
......
......@@ -885,7 +885,7 @@ bool GLSLShader::checkShader(int shaderType)
id = m_geom_shader_object;
break;
default:
CGoGNerr << "Error unkown shader type"<< CGoGNendl;
CGoGNerr << "Error unkown shader type" << CGoGNendl;
return false;
break;
}
......@@ -946,12 +946,12 @@ void GLSLShader::unbindVA(const std::string& name)
//valid ?
if (idVA < 0)
{
CGoGNerr << "GLSLShader: Attribute "<<name<< " does not exist in shader, not unbinded"<< CGoGNendl;
CGoGNerr << "GLSLShader: Attribute " << name << " does not exist in shader, not unbinded" << CGoGNendl;
return;
}
// search if name already exist
unsigned int nb = m_va_vbo_binding.size();
for (unsigned int i =0; i<nb; ++i)
for (unsigned int i = 0; i < nb; ++i)
{
if (m_va_vbo_binding[i].va_id == idVA)
{
......@@ -1000,7 +1000,7 @@ void GLSLShader::updateMatrices(const glm::mat4& projection, const glm::mat4& mo
void GLSLShader::enableVertexAttribs(unsigned int stride, unsigned int begin) const
{
this->bind();
for (std::vector<Utils::GLSLShader::VAStr>::const_iterator it= m_va_vbo_binding.begin(); it != m_va_vbo_binding.end(); ++it)
for (std::vector<Utils::GLSLShader::VAStr>::const_iterator it = m_va_vbo_binding.begin(); it != m_va_vbo_binding.end(); ++it)
{
glBindBuffer(GL_ARRAY_BUFFER, it->vbo_ptr->id());
glEnableVertexAttribArray(it->va_id);
......@@ -1011,7 +1011,7 @@ void GLSLShader::enableVertexAttribs(unsigned int stride, unsigned int begin) co
void GLSLShader::disableVertexAttribs() const
{
this->bind();
for (std::vector<Utils::GLSLShader::VAStr>::const_iterator it= m_va_vbo_binding.begin(); it != m_va_vbo_binding.end(); ++it)
for (std::vector<Utils::GLSLShader::VAStr>::const_iterator it = m_va_vbo_binding.begin(); it != m_va_vbo_binding.end(); ++it)
glDisableVertexAttribArray(it->va_id);
this->unbind();
}
......@@ -1021,8 +1021,8 @@ void GLSLShader::updateCurrentMatrices()
glm::mat4 model(currentModelView());
model *= currentTransfo();
for(std::set< std::pair<void*, GLSLShader*> >::iterator it = m_registeredShaders.begin();it != m_registeredShaders.end();++it)
it->second->updateMatrices(currentProjection(), model);
for(std::set< std::pair<void*, GLSLShader*> >::iterator it = m_registeredShaders.begin(); it != m_registeredShaders.end(); ++it)
it->second->updateMatrices(currentProjection(), model);
}
} // namespace Utils
......
......@@ -65,8 +65,6 @@ VBO::~VBO()
glDeleteBuffers(1, &m_id);
}
void VBO::sameAllocSameBufferSize(const VBO& vbo)
{
m_data_size = vbo.m_data_size;
......@@ -80,7 +78,7 @@ void* VBO::lockPtr()
{
if (m_lock)
{
CGoGNerr <<" Error already locked VBO"<< CGoGNendl;
CGoGNerr << "Error already locked VBO" << CGoGNendl;
return NULL;
}
......@@ -93,7 +91,7 @@ const void* VBO::lockPtr() const
{
if (m_lock)
{
CGoGNerr <<" Error already locked VBO"<< CGoGNendl;
CGoGNerr << "Error already locked VBO" << CGoGNendl;
return NULL;
}
......@@ -112,17 +110,16 @@ void VBO::releasePtr() const
void VBO::copyData(void *ptr) const
{
glBindBuffer(GL_ARRAY_BUFFER, m_id);
glGetBufferSubData(GL_ARRAY_BUFFER,0,m_nbElts*m_data_size*sizeof(float), ptr);
glGetBufferSubData(GL_ARRAY_BUFFER, 0, m_nbElts * m_data_size * sizeof(float), ptr);
}
void VBO::allocate(unsigned int nbElts)
{
m_nbElts = nbElts;
glBindBuffer(GL_ARRAY_BUFFER, m_id);
glBufferData(GL_ARRAY_BUFFER, nbElts * m_data_size*sizeof(float), 0, GL_STREAM_DRAW);
glBufferData(GL_ARRAY_BUFFER, nbElts * m_data_size * sizeof(float), 0, GL_STREAM_DRAW);
}
} // namespace Utils
} // namespace CGoGN
/*******************************************************************************
* CGoGN: Combinatorial and Geometric modeling with Generic N-dimensional Maps *
* version 0.1 *
* Copyright (C) 2009-2012, IGG Team, LSIIT, University of Strasbourg *
* *
* This library is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by the *
* Free Software Foundation; either version 2.1 of the License, or (at your *
* option) any later version. *
* *
* This library is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this library; if not, write to the Free Software Foundation, *
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. *
* *
* Web site: http://cgogn.unistra.fr/ *
* Contact information: cgogn@unistra.fr *
* *
*******************************************************************************/
#include "vector"
#include "Utils/vboRender.h"
#include "Utils/GLSLShader.h"
namespace CGoGN
{
namespace Utils
{
VBORender::VBORender()
{
glGenBuffersARB(1, &m_indexBuffer) ;
m_nbIndices = 0 ;
m_primitiveType = POINTS;
}
VBORender::~VBORender()
{
glDeleteBuffersARB(1, &m_indexBuffer) ;
}
void VBORender::setConnectivity(std::vector<GLuint>& tableIndices, int primitiveType)
{
m_primitiveType = primitiveType ;
m_nbIndices = tableIndices.size() ;
glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer) ;
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER, m_nbIndices * sizeof(GLuint), &(tableIndices[0]), GL_STREAM_DRAW) ;
}
void VBORender::draw(Utils::GLSLShader* sh)
{
sh->enableVertexAttribs() ;
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indexBuffer) ;
switch(m_primitiveType)
{
case POINTS:
glDrawElements(GL_POINTS, m_nbIndices, GL_UNSIGNED_INT, 0) ;
break;
case LINES:
glDrawElements(GL_LINES, m_nbIndices, GL_UNSIGNED_INT, 0);
break;
case TRIANGLES:
glDrawElements(GL_TRIANGLES, m_nbIndices, GL_UNSIGNED_INT, 0);
break;
default:
break;
}
sh->disableVertexAttribs() ;
}
} // namespace Utils
} // namespace CGoGN
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment