Polyhedron demo: do not use the OpenGL API directly

This commit is contained in:
Laurent Rineau 2017-11-28 16:32:13 +01:00
parent f5b5aead66
commit 3466eb83f0
21 changed files with 129 additions and 127 deletions

View File

@ -47,7 +47,33 @@ CGAL_QT_EXPORT void traverse_resources(const QString& name,
/**
* Call this in the end of an OpenGL implementation to check if it returns errors.
*/
CGAL_QT_EXPORT void opengl_check_errors(unsigned int line);
template <typename QtOpenGLFunctions>
void opengl_check_errors(QtOpenGLFunctions* gl,
unsigned int line) {
GLenum error = gl->glGetError();
while (error != GL_NO_ERROR)
{
if(error == GL_INVALID_ENUM)
std::cerr << "An unacceptable value is specified for an enumerated argument." << "@" << line << std::endl;
if(error == GL_INVALID_VALUE)
std::cerr << "A numeric argument is out of range." << "@" << line << std::endl;
if(error == GL_INVALID_OPERATION)
std::cerr << "The specified operation is not allowed in the current state." << "@" << line << std::endl;
if(error == GL_INVALID_FRAMEBUFFER_OPERATION)
std::cerr << "The framebuffer object is not complete." << "@" << line << std::endl;
if(error == GL_OUT_OF_MEMORY)
std::cerr << "There is not enough memory left to execute the command." << "@" << line << std::endl;
#ifdef GL_STACK_UNDERFLOW
if(error == GL_STACK_UNDERFLOW)
std::cerr << "An attempt has been made to perform an operation that would cause an internal stack to underflow." << "@" << line << std::endl;
#endif
#ifdef GL_STACK_OVERFLOW
if(error == GL_STACK_OVERFLOW)
std::cerr << "An attempt has been made to perform an operation that would cause an internal stack to overflow." << "@" << line << std::endl;
#endif
error = gl->glGetError();
}
}
} // namespace Qt
} // namespace CGAL

View File

@ -59,32 +59,5 @@ void traverse_resources(const QString& name, const QString& dirname, int indent)
}
}
CGAL_INLINE_FUNCTION
void opengl_check_errors(unsigned int line)
{
GLenum error = ::glGetError();
while (error != GL_NO_ERROR)
{
if(error == GL_INVALID_ENUM)
std::cerr << "An unacceptable value is specified for an enumerated argument." << "@" << line << std::endl;
if(error == GL_INVALID_VALUE)
std::cerr << "A numeric argument is out of range." << "@" << line << std::endl;
if(error == GL_INVALID_OPERATION)
std::cerr << "The specified operation is not allowed in the current state." << "@" << line << std::endl;
if(error == GL_INVALID_FRAMEBUFFER_OPERATION)
std::cerr << "The framebuffer object is not complete." << "@" << line << std::endl;
if(error == GL_OUT_OF_MEMORY)
std::cerr << "There is not enough memory left to execute the command." << "@" << line << std::endl;
#ifdef GL_STACK_UNDERFLOW
if(error == GL_STACK_UNDERFLOW)
std::cerr << "An attempt has been made to perform an operation that would cause an internal stack to underflow." << "@" << line << std::endl;
#endif
#ifdef GL_STACK_OVERFLOW
if(error == GL_STACK_OVERFLOW)
std::cerr << "An attempt has been made to perform an operation that would cause an internal stack to overflow." << "@" << line << std::endl;
#endif
error = ::glGetError();
}
}
} // namesapce Qt
} // namespace CGAL

View File

@ -10,6 +10,10 @@ endif()
if(POLICY CMP0071)
cmake_policy(SET CMP0071 NEW)
endif()
if(POLICY CMP0072)
# About the use of OpenGL
cmake_policy(SET CMP0072 NEW)
endif()
# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)
@ -139,7 +143,7 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND)
add_library(gl_splat SHARED
GlSplat/GlSplat.cpp GlSplat/Shader.cpp ${gl_splat_rc})
target_link_libraries(gl_splat PUBLIC ${QGLVIEWER_LIBRARIES} Qt5::OpenGL Qt5::Gui)
target_link_libraries(gl_splat PRIVATE ${OPENGL_gl_LIBRARY} ${QGLVIEWER_LIBRARIES})
target_link_libraries(gl_splat PRIVATE ${OPENGL_LIBRARIES} ${QGLVIEWER_LIBRARIES})
find_path(CGAL_THREE_HEADERS_PATH
NAME CGAL/Three/Scene_item.h
@ -185,8 +189,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND)
target_link_libraries(demo_framework
PUBLIC Qt5::OpenGL Qt5::Widgets Qt5::Gui Qt5::Script
${QGLVIEWER_LIBRARIES}
${OPENGL_gl_LIBRARY}
${OPENGL_glu_LIBRARY}
gl_splat
)
if(CGAL_HEADER_ONLY)
@ -202,8 +204,6 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND)
demo_framework
${CGAL_LIBRARIES}
${QGLVIEWER_LIBRARIES}
${OPENGL_gl_LIBRARY}
${OPENGL_glu_LIBRARY}
gl_splat
Qt5::OpenGL Qt5::Gui Qt5::Script Qt5::Widgets)
add_library(scene_color_ramp SHARED Color_ramp.cpp)
@ -344,8 +344,8 @@ if(CGAL_Qt5_FOUND AND Qt5_FOUND AND OPENGL_FOUND AND QGLVIEWER_FOUND)
# Link with CGAL
target_link_libraries( Polyhedron_3 PUBLIC ${CGAL_LIBRARIES} ${CGAL_3RD_PARTY_LIBRARIES} )
# Link with libQGLViewer, OpenGL
target_link_libraries( Polyhedron_3 PUBLIC ${QGLVIEWER_LIBRARIES} ${OPENGL_gl_LIBRARY})
# Link with libQGLViewer
target_link_libraries( Polyhedron_3 PUBLIC ${QGLVIEWER_LIBRARIES})
add_to_cached_list( CGAL_EXECUTABLE_TARGETS Polyhedron_3 )

View File

@ -373,7 +373,7 @@ public Q_SLOTS:
void addVP(Volume_plane_thread* thread) {
Volume_plane_interface* plane = thread->getItem();
plane->init();
plane->init(static_cast<CGAL::Three::Viewer_interface*>(QGLViewer::QGLViewerPool().first()));
// add the interface for this Volume_plane
int id = scene->addItem(plane);
scene->changeGroup(plane, group);

View File

@ -22,12 +22,12 @@ using namespace CGAL::Three;
#if !defined(NDEBUG)
inline
void printGlError(unsigned int line) {
CGAL::Qt::opengl_check_errors(line);
void printGlError(CGAL::Three::Viewer_interface* viewer, unsigned int line) {
CGAL::Qt::opengl_check_errors(viewer, line);
}
#else
inline
void printGlError(unsigned int) {
void printGlError(CGAL::Three::Viewer_interface*, unsigned int) {
}
#endif
@ -121,7 +121,7 @@ public:
// uses a public init function to enable construction in
// threads without gl-context
void init();
void init(Viewer_interface* viewer);
private:
bool is_grabbing;
@ -438,11 +438,11 @@ void Volume_plane<T>::draw(Viewer_interface *viewer) const {
program_bordures.setUniformValue("f_matrix", f);
program_bordures.release();
GLint renderMode;
glGetIntegerv(GL_RENDER_MODE, &renderMode);
printGlError(__LINE__);
viewer->glGetIntegerv(GL_RENDER_MODE, &renderMode);
printGlError(viewer, __LINE__);
glLineWidth(4.0f);
viewer->glLineWidth(4.0f);
v_rec.resize(0);
drawRectangle(*this);
@ -453,10 +453,10 @@ void Volume_plane<T>::draw(Viewer_interface *viewer) const {
program_bordures.setAttributeBuffer("vertex",GL_FLOAT,0,3);
program_bordures.enableAttributeArray("vertex");
program_bordures.setUniformValue("color",this->color());
glDrawArrays(GL_LINE_LOOP, 0, static_cast<GLsizei>(v_rec.size()/3));
viewer->glDrawArrays(GL_LINE_LOOP, 0, static_cast<GLsizei>(v_rec.size()/3));
rectBuffer.release();
program_bordures.release();
glLineWidth(1.0f);
viewer->glLineWidth(1.0f);
program.bind();
int mvpLoc = program.uniformLocation("mvp_matrix");
@ -477,20 +477,20 @@ void Volume_plane<T>::draw(Viewer_interface *viewer) const {
printGlError(__LINE__);
printGlError(viewer, __LINE__);
for(unsigned int i = 0; i < ebos.size(); ++i)
{
ebos[i].first.bind();
glDrawElements(GL_TRIANGLES, ebos[i].second, GL_UNSIGNED_INT, 0);
viewer->glDrawElements(GL_TRIANGLES, ebos[i].second, GL_UNSIGNED_INT, 0);
ebos[i].first.release();
}
cbuffer.release();
printGlError(__LINE__);
printGlError(viewer, __LINE__);
program.release();
printGlError(__LINE__);
printGlError(viewer, __LINE__);
if(!are_buffers_filled)
initializeBuffers(viewer);
@ -512,7 +512,7 @@ void Volume_plane<T>::draw(Viewer_interface *viewer) const {
}
template<typename T>
void Volume_plane<T>::init() {
void Volume_plane<T>::init(Viewer_interface* viewer) {
is_grabbing = false;
initShaders();
@ -530,14 +530,14 @@ void Volume_plane<T>::init() {
assert(vertices.size() == (3 * adim_ * bdim_));
int maxi, maxv;
glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &maxi);
glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &maxv);
viewer->glGetIntegerv(GL_MAX_ELEMENTS_INDICES, &maxi);
viewer->glGetIntegerv(GL_MAX_ELEMENTS_VERTICES, &maxv);
assert((vertices.size( ) / 3) < (unsigned int)maxi);
vVBO.create();
vVBO.bind();
vVBO.allocate(vertices.data(),static_cast<int>(sizeof(float) * vertices.size()));
vVBO.release();
printGlError(__LINE__);
printGlError(viewer, __LINE__);
// for each patch
std::vector<unsigned int> indices;
@ -589,7 +589,7 @@ void Volume_plane<T>::init() {
cbuffer.allocate(colors_.data(),static_cast<int>(colors_.size()*sizeof(float)));
cbuffer.release();
printGlError(__LINE__);
printGlError(viewer, __LINE__);
}
template<typename T>

View File

@ -8,6 +8,7 @@
#include <QWidgetAction>
#include <QGLViewer/qglviewer.h>
#include <CGAL/Three/Scene_item.h>
#include <CGAL/Three/Viewer_interface.h>
#include <iostream>
#include <QGLViewer/manipulatedFrame.h>
using namespace CGAL::Three;
@ -22,7 +23,7 @@ public:
delete mFrame_;
}
virtual void init() = 0;
virtual void init(CGAL::Three::Viewer_interface*) = 0;
virtual void setData(unsigned int adim, unsigned int bdim, unsigned int cdim, float xscale, float yscale, float zscale, std::vector<float> &colors) =0;
virtual unsigned int aDim() const = 0;

View File

@ -118,7 +118,7 @@ void Volume_plane_intersection::draw(Viewer_interface* viewer) const {
d->initializeBuffers(viewer);
}
attribBuffers(viewer, PROGRAM_NO_SELECTION);
glDepthRange(0.0,0.9999);
viewer->glDepthRange(0.0,0.9999);
if(d->b && d->c) {
vaos[Volume_plane_intersection_priv::AArray]->bind();
@ -186,7 +186,7 @@ void Volume_plane_intersection::draw(Viewer_interface* viewer) const {
vaos[Volume_plane_intersection_priv::CArray]->release();
}
viewer->glLineWidth(1.0f);
glDepthRange(0.00001,1.0);
viewer->glDepthRange(0.00001,1.0);
}
Volume_plane_intersection::Volume_plane_intersection(float x, float y, float z)

View File

@ -1279,8 +1279,8 @@ void Scene_edit_box_item_priv::picking(int& type, int& id, Viewer_interface *vie
int deviceHeight = viewer->camera()->screenHeight();
QOpenGLFramebufferObject* fbo = new QOpenGLFramebufferObject(deviceWidth, deviceHeight,QOpenGLFramebufferObject::Depth);
fbo->bind();
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
viewer->glEnable(GL_DEPTH_TEST);
viewer->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QColor bgColor(viewer->backgroundColor());
//draws the image in the fbo
viewer->setBackgroundColor(::Qt::white);
@ -1290,7 +1290,7 @@ void Scene_edit_box_item_priv::picking(int& type, int& id, Viewer_interface *vie
const static int dataLength = rowLength * deviceHeight;
GLubyte* buffer = new GLubyte[dataLength];
// Qt uses upper corner for its origin while GL uses the lower corner.
glReadPixels(picked_pixel.x(), deviceHeight-1-picked_pixel.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
viewer->glReadPixels(picked_pixel.x(), deviceHeight-1-picked_pixel.y(), 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
//decode ID and pick (don't forget the case nothing is picked
if(!(buffer[0]==buffer[1] && buffer[1]==buffer[2]))
{
@ -1392,8 +1392,8 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const
{
viewer->glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &offset_factor);
viewer->glGetFloatv(GL_POLYGON_OFFSET_UNITS, &offset_units);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
viewer->glEnable(GL_BLEND);
viewer->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
vaos[Scene_edit_box_item_priv::S_Faces]->bind();
d->program = &d->transparent_face_program;
d->program->bind();
@ -1409,8 +1409,8 @@ void Scene_edit_box_item::drawHl(Viewer_interface* viewer)const
viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(d->hl_vertex.size()/3));
vaos[Scene_edit_box_item_priv::S_Faces]->release();
d->program->release();
glPolygonOffset(offset_factor, offset_units);
glDisable(GL_BLEND);
viewer->glPolygonOffset(offset_factor, offset_units);
viewer->glDisable(GL_BLEND);
}
}
@ -1445,8 +1445,8 @@ void Scene_edit_box_item::drawTransparent(CGAL::Three::Viewer_interface*viewer)c
// Specular
QVector4D specular(0.0f, 0.0f, 0.0f, 1.0f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
viewer->glEnable(GL_BLEND);
viewer->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
vaos[Scene_edit_box_item_priv::Faces]->bind();
d->program = &d->transparent_face_program;
d->program->bind();
@ -1462,5 +1462,5 @@ void Scene_edit_box_item::drawTransparent(CGAL::Three::Viewer_interface*viewer)c
viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(d->vertex_faces.size()/3));
vaos[Scene_edit_box_item_priv::Faces]->release();
d->program->release();
glDisable(GL_BLEND);
viewer->glDisable(GL_BLEND);
}

View File

@ -363,8 +363,8 @@ void Scene_alpha_shape_item::draw(CGAL::Three::Viewer_interface* viewer) const
vaos[0]->bind();
program->setAttributeValue("colors", this->color());
glDrawElements(GL_TRIANGLES, static_cast<GLuint>(indices.size()),
GL_UNSIGNED_INT, indices.data());
viewer->glDrawElements(GL_TRIANGLES, static_cast<GLuint>(indices.size()),
GL_UNSIGNED_INT, indices.data());
program->release();
vaos[0]->release();

View File

@ -186,7 +186,7 @@ void Scene_polyhedron_shortest_path_item::drawPoints(CGAL::Three::Viewer_interfa
{
d->initialize_buffers(viewer);
}
glPointSize(4.0f);
viewer->glPointSize(4.0f);
d->program = getShaderProgram(PROGRAM_NO_SELECTION);
attribBuffers(viewer, PROGRAM_NO_SELECTION);
vaos[Scene_polyhedron_shortest_path_item_priv::Selected_Edges]->bind();
@ -195,7 +195,7 @@ void Scene_polyhedron_shortest_path_item::drawPoints(CGAL::Three::Viewer_interfa
viewer->glDrawArrays(GL_POINTS, 0, static_cast<GLsizei>(d->vertices.size() / 3));
d->program->release();
vaos[Scene_polyhedron_shortest_path_item_priv::Selected_Edges]->release();
glPointSize(1.0f);
viewer->glPointSize(1.0f);
}
Scene_polyhedron_shortest_path_item* Scene_polyhedron_shortest_path_item::clone() const

View File

@ -1456,8 +1456,8 @@ void Scene_edit_polyhedron_item::drawTransparent(Viewer_interface *viewer) const
viewer->camera()->getModelViewProjectionMatrix(d_mat);
for (int i=0; i<16; ++i)
mvp_mat.data()[i] = GLfloat(d_mat[i]);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
viewer->glEnable(GL_BLEND);
viewer->glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
vaos[Scene_edit_polyhedron_item_priv::Frame_plane]->bind();
d->program = &d->transparent_plane_program;
d->program->bind();
@ -1468,7 +1468,7 @@ void Scene_edit_polyhedron_item::drawTransparent(Viewer_interface *viewer) const
viewer->glDrawElements(GL_TRIANGLES, (GLsizei) d->plane_idx.size(), GL_UNSIGNED_INT, d->plane_idx.data());
d->program->release();
vaos[Scene_edit_polyhedron_item_priv::Frame_plane]->release();
glDisable(GL_BLEND);
viewer->glDisable(GL_BLEND);
}
}
@ -1572,7 +1572,7 @@ void Scene_edit_polyhedron_item_priv::draw_ROI_and_control_vertices(CGAL::Three:
}
void Scene_edit_polyhedron_item::draw_ROI_and_control_vertices(CGAL::Three::Viewer_interface* viewer) const {
CGAL::GL::Point_size point_size; point_size.set_point_size(5);
CGAL::GL::Point_size point_size(viewer); point_size.set_point_size(5);
//Draw the points
if(d->ui_widget->ShowROICheckBox->isChecked()) {

View File

@ -312,7 +312,7 @@ Scene::duplicate(Item_id index)
return -1;
}
void Scene::initializeGL()
void Scene::initializeGL(CGAL::Three::Viewer_interface* viewer)
{
ms_splatting->init();
@ -325,10 +325,10 @@ void Scene::initializeGL()
GLfloat position[] = { 0.0f, 0.0f, 1.0f, 1.0f };
// Assign created components to GL_LIGHT0
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT0, GL_POSITION, position);
viewer->glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
viewer->glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
viewer->glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
viewer->glLightfv(GL_LIGHT0, GL_POSITION, position);
gl_init = true;
}
@ -380,11 +380,11 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
{
QMap<float, int> picked_item_IDs;
if(with_names)
glEnable(GL_DEPTH_TEST);
viewer->glEnable(GL_DEPTH_TEST);
if(!ms_splatting->viewer_is_set)
ms_splatting->setViewer(viewer);
if(!gl_init)
initializeGL();
initializeGL(viewer);
// Flat/Gouraud OpenGL drawing
for(int index = 0; index < m_entries.size(); ++index)
{
@ -404,8 +404,8 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
if(item.renderingMode() == Flat || item.renderingMode() == FlatPlusEdges || item.renderingMode() == Gouraud)
{
if(with_names) {
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
viewer->glClearDepth(1.0);
viewer->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
viewer->glEnable(GL_LIGHTING);
viewer->glPointSize(2.f);
@ -423,7 +423,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
// read depth buffer at pick location;
float depth = 1.0;
glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
viewer->glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
if (depth != 1.0)
{
//add object to list of picked objects;
@ -433,7 +433,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
}
}
}
glDepthFunc(GL_LEQUAL);
viewer->glDepthFunc(GL_LEQUAL);
// Wireframe OpenGL drawing
for(int index = 0; index < m_entries.size(); ++index)
{
@ -453,8 +453,8 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
if((item.renderingMode() == Wireframe || item.renderingMode() == PointsPlusNormals )
&& with_names)
{
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
viewer->glClearDepth(1.0);
viewer->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
if((!with_names && item.renderingMode() == FlatPlusEdges )
|| item.renderingMode() == Wireframe)
@ -495,7 +495,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
// read depth buffer at pick location;
float depth = 1.0;
glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
viewer->glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
if (depth != 1.0)
{
//add object to list of picked objects;
@ -512,8 +512,8 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
if(item.visible())
{
if(item.renderingMode() == Points && with_names) {
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
viewer->glClearDepth(1.0);
viewer->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
if(item.renderingMode() == Points ||
(!with_names && item.renderingMode() == PointsPlusNormals) ||
@ -531,7 +531,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
if(item.renderingMode() == Points && with_names) {
// read depth buffer at pick location;
float depth = 1.0;
glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
viewer->glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
if (depth != 1.0)
{
//add object to list of picked objects;
@ -541,7 +541,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
if(!with_names)
{
glDepthFunc(GL_LESS);
viewer->glDepthFunc(GL_LESS);
// Splatting
if(!with_names && ms_splatting->isSupported())
{
@ -594,8 +594,8 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
if(item.visible())
{
if(with_names) {
glClearDepth(1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
viewer->glClearDepth(1.0);
viewer->glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
viewer->glEnable(GL_LIGHTING);
viewer->glPointSize(2.f);
@ -612,7 +612,7 @@ Scene::draw_aux(bool with_names, CGAL::Three::Viewer_interface* viewer)
// read depth buffer at pick location;
float depth = 1.0;
glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
viewer->glReadPixels(picked_pixel.x(),viewer->camera()->screenHeight()-1-picked_pixel.y(),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, &depth);
if (depth != 1.0)
{
//add object to list of picked objects;

View File

@ -78,7 +78,7 @@ public:
QList<int> selectionIndices() const Q_DECL_OVERRIDE;
int selectionAindex() const Q_DECL_OVERRIDE;
int selectionBindex() const Q_DECL_OVERRIDE;
void initializeGL() Q_DECL_OVERRIDE;
void initializeGL(CGAL::Three::Viewer_interface*) Q_DECL_OVERRIDE;
void setPickedPixel(const QPoint &p) Q_DECL_OVERRIDE {picked_pixel = p;}
void draw(CGAL::Three::Viewer_interface*) Q_DECL_OVERRIDE;
void drawWithNames(CGAL::Three::Viewer_interface*) Q_DECL_OVERRIDE;

View File

@ -957,7 +957,7 @@ void Scene_c3t3_item::drawEdges(CGAL::Three::Viewer_interface* viewer) const {
if(renderingMode() == FlatPlusEdges)
{
GLint renderMode;
glGetIntegerv(GL_RENDER_MODE, &renderMode);
viewer->glGetIntegerv(GL_RENDER_MODE, &renderMode);
if(renderMode == GL_SELECT) return;
}
Scene_c3t3_item* ncthis = const_cast<Scene_c3t3_item*>(this);

View File

@ -1267,8 +1267,8 @@ void Scene_polyhedron_item::draw(CGAL::Three::Viewer_interface* viewer) const {
d->program->setUniformValue("is_selected", true);
else
d->program->setUniformValue("is_selected", false);
glDrawElements(GL_TRIANGLES, static_cast<GLuint>(d->idx_faces.size()),
GL_UNSIGNED_INT, d->idx_faces.data());
viewer->glDrawElements(GL_TRIANGLES, static_cast<GLuint>(d->idx_faces.size()),
GL_UNSIGNED_INT, d->idx_faces.data());
d->program->release();
vaos[Scene_polyhedron_item_priv::Gouraud_Facets]->release();
}
@ -1314,8 +1314,8 @@ void Scene_polyhedron_item::draw(CGAL::Three::Viewer_interface* viewer) const {
else
d->program->setUniformValue("is_selected", false);
glDrawElements(GL_TRIANGLES, static_cast<GLuint>(d->idx_faces.size()),
GL_UNSIGNED_INT, d->idx_faces.data());
viewer->glDrawElements(GL_TRIANGLES, static_cast<GLuint>(d->idx_faces.size()),
GL_UNSIGNED_INT, d->idx_faces.data());
d->program->release();
vaos[Scene_polyhedron_item_priv::Gouraud_Facets]->release();
}
@ -1345,8 +1345,8 @@ void Scene_polyhedron_item::drawEdges(CGAL::Three::Viewer_interface* viewer) con
d->program->setUniformValue("is_selected", true);
else
d->program->setUniformValue("is_selected", false);
glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_lines.size()),
GL_UNSIGNED_INT, d->idx_lines.data());
viewer->glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_lines.size()),
GL_UNSIGNED_INT, d->idx_lines.data());
d->program->release();
vaos[Scene_polyhedron_item_priv::Edges]->release();
}
@ -1365,8 +1365,8 @@ void Scene_polyhedron_item::drawEdges(CGAL::Three::Viewer_interface* viewer) con
else
d->program->setAttributeValue("colors",QColor(0,0,0));
}
glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_feature_lines.size()),
GL_UNSIGNED_INT, d->idx_feature_lines.data());
viewer->glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_feature_lines.size()),
GL_UNSIGNED_INT, d->idx_feature_lines.data());
d->program->release();
vaos[Scene_polyhedron_item_priv::Feature_edges]->release();
}

View File

@ -640,7 +640,7 @@ void Scene_polyhedron_selection_item::draw(CGAL::Three::Viewer_interface* viewer
viewer->glGetFloatv(GL_POLYGON_OFFSET_FACTOR, &offset_factor);
viewer->glGetFloatv(GL_POLYGON_OFFSET_UNITS, &offset_units);
glPolygonOffset(0.5f, 0.9f);
viewer->glPolygonOffset(0.5f, 0.9f);
vaos[Scene_polyhedron_selection_item_priv::HLFacets]->bind();
d->program = getShaderProgram(PROGRAM_WITH_LIGHT);
attribBuffers(viewer,PROGRAM_WITH_LIGHT);
@ -693,13 +693,13 @@ void Scene_polyhedron_selection_item::draw(CGAL::Three::Viewer_interface* viewer
d->program->release();
vaos[Scene_polyhedron_selection_item_priv::Facets]->release();
glEnable(GL_POLYGON_OFFSET_LINE);
viewer->glEnable(GL_POLYGON_OFFSET_LINE);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glPolygonOffset(0.0f, 1.5f);
viewer->glPolygonOffset(0.0f, 1.5f);
drawEdges(viewer);
glDisable(GL_POLYGON_OFFSET_LINE);
viewer->glDisable(GL_POLYGON_OFFSET_LINE);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
glPolygonOffset(offset_factor, offset_units);
viewer->glPolygonOffset(offset_factor, offset_units);
drawPoints(viewer);
viewer->glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
}

View File

@ -654,7 +654,7 @@ void Scene_surface_mesh_item_priv::initializeBuffers(CGAL::Three::Viewer_interfa
void Scene_surface_mesh_item::draw(CGAL::Three::Viewer_interface *viewer) const
{
glShadeModel(GL_SMOOTH);
viewer->glShadeModel(GL_SMOOTH);
if(!are_buffers_filled)
{
d->compute_elements();
@ -673,8 +673,8 @@ void Scene_surface_mesh_item::draw(CGAL::Three::Viewer_interface *viewer) const
d->program->setAttributeValue("is_selected", false);
if(!d->has_vcolors)
d->program->setAttributeValue("colors", this->color());
glDrawElements(GL_TRIANGLES, static_cast<GLuint>(d->idx_data_.size()),
GL_UNSIGNED_INT, d->idx_data_.data());
viewer->glDrawElements(GL_TRIANGLES, static_cast<GLuint>(d->idx_data_.size()),
GL_UNSIGNED_INT, d->idx_data_.data());
vaos[Scene_surface_mesh_item_priv::Smooth_facets]->release();
}
else
@ -686,7 +686,7 @@ void Scene_surface_mesh_item::draw(CGAL::Three::Viewer_interface *viewer) const
d->program->setAttributeValue("is_selected", false);
if(!d->has_fcolors)
d->program->setAttributeValue("colors", this->color());
glDrawArrays(GL_TRIANGLES,0,static_cast<GLsizei>(d->nb_flat/3));
viewer->glDrawArrays(GL_TRIANGLES,0,static_cast<GLsizei>(d->nb_flat/3));
vaos[Scene_surface_mesh_item_priv::Flat_facets]->release();
}
@ -709,15 +709,15 @@ void Scene_surface_mesh_item::drawEdges(CGAL::Three::Viewer_interface *viewer) c
d->program->setUniformValue("is_selected", true);
else
d->program->setUniformValue("is_selected", false);
glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_edge_data_.size()),
GL_UNSIGNED_INT, d->idx_edge_data_.data());
viewer->glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_edge_data_.size()),
GL_UNSIGNED_INT, d->idx_edge_data_.data());
if(d->has_feature_edges)
{
d->program->setAttributeValue("colors", Qt::red);
d->program->setUniformValue("is_selected", false);
glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_feature_edge_data_.size()),
GL_UNSIGNED_INT, d->idx_feature_edge_data_.data());
viewer->glDrawElements(GL_LINES, static_cast<GLuint>(d->idx_feature_edge_data_.size()),
GL_UNSIGNED_INT, d->idx_feature_edge_data_.data());
}
vaos[Scene_surface_mesh_item_priv::Edges]->release();
d->program->release();
@ -739,8 +739,8 @@ void Scene_surface_mesh_item::drawPoints(CGAL::Three::Viewer_interface *viewer)
d->program->setAttributeValue("is_selected", true);
else
d->program->setAttributeValue("is_selected", false);
glDrawElements(GL_POINTS, static_cast<GLuint>(d->idx_edge_data_.size()),
GL_UNSIGNED_INT, d->idx_edge_data_.data());
viewer->glDrawElements(GL_POINTS, static_cast<GLuint>(d->idx_edge_data_.size()),
GL_UNSIGNED_INT, d->idx_edge_data_.data());
vaos[Scene_surface_mesh_item_priv::Edges]->release();
d->program->release();
}

View File

@ -155,7 +155,7 @@ void Scene_textured_polyhedron_item_priv::initializeBuffers(CGAL::Three::Viewer_
viewer->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
viewer->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
viewer->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
viewer->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
nb_facets = positions_facets.size();
positions_facets.resize(0);

View File

@ -134,7 +134,7 @@ void Scene_textured_surface_mesh_item_priv::initializeBuffers(CGAL::Three::Viewe
viewer->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
viewer->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
viewer->glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
viewer->glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
item->are_buffers_filled = true;
}

View File

@ -26,6 +26,7 @@
#define CGAL_OPENGL_TOOLS_H
# include <CGAL/gl.h>
#include <CGAL/Three/Viewer_interface.h>
namespace CGAL {
namespace GL {
@ -46,15 +47,16 @@ public:
class Point_size {
GLfloat ps;
CGAL::Three::Viewer_interface* viewer;
public:
Point_size() {
::glGetFloatv(GL_POINT_SIZE, &ps);
Point_size(CGAL::Three::Viewer_interface* viewer) : viewer(viewer) {
viewer->glGetFloatv(GL_POINT_SIZE, &ps);
}
~Point_size() {
set_point_size(ps);
}
void set_point_size(GLfloat v) {
::glPointSize(v);
viewer->glPointSize(v);
}
}; // end class Point_size

View File

@ -41,7 +41,7 @@ public:
/*! Is called by Viewer::initializeGL(). Allows all the initialization
* of OpenGL code that needs a context.
*/
virtual void initializeGL() = 0;
virtual void initializeGL(CGAL::Three::Viewer_interface*) = 0;
//! \brief Draws the items.
//! It is called by Viewer::draw().