mirror of https://github.com/CGAL/cgal
Move context creation to qglviewer. Replace initializeGL() by init()in demo viewer
This commit is contained in:
parent
4c6546a558
commit
50c471253a
|
|
@ -965,7 +965,7 @@ public Q_SLOTS:
|
||||||
void setSelectedName(int id) { selectedObjectId_ = id; }
|
void setSelectedName(int id) { selectedObjectId_ = id; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void beginSelection(const QPoint &);
|
virtual void beginSelection(const QPoint &point);
|
||||||
/*! This method is called by select() and should draw selectable entities.
|
/*! This method is called by select() and should draw selectable entities.
|
||||||
|
|
||||||
Default implementation is empty. Overload and draw the different elements of
|
Default implementation is empty. Overload and draw the different elements of
|
||||||
|
|
@ -1477,7 +1477,7 @@ private:
|
||||||
QString snapshotFileName_, snapshotFormat_;
|
QString snapshotFileName_, snapshotFormat_;
|
||||||
int snapshotCounter_, snapshotQuality_;
|
int snapshotCounter_, snapshotQuality_;
|
||||||
TileRegion *tileRegion_;
|
TileRegion *tileRegion_;
|
||||||
|
|
||||||
// Q G L V i e w e r p o o l
|
// Q G L V i e w e r p o o l
|
||||||
static QList<QGLViewer *> QGLViewerPool_;
|
static QList<QGLViewer *> QGLViewerPool_;
|
||||||
|
|
||||||
|
|
@ -1515,6 +1515,14 @@ private:
|
||||||
// O f f s e t
|
// O f f s e t
|
||||||
qglviewer::Vec _offset;
|
qglviewer::Vec _offset;
|
||||||
|
|
||||||
|
//C o n t e x t
|
||||||
|
bool is_ogl_4_3;
|
||||||
|
public:
|
||||||
|
//! Is used to know if the openGL context is 4.3 or 2.1.
|
||||||
|
//! @returns `true` if the context is 4.3.
|
||||||
|
//! @returns `false` if the context is 2.1.
|
||||||
|
bool isOpenGL_4_3()const {return is_ogl_4_3; }
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // QGLVIEWER_QGLVIEWER_H
|
#endif // QGLVIEWER_QGLVIEWER_H
|
||||||
|
|
|
||||||
|
|
@ -220,39 +220,42 @@ static Qt::MouseButton mouseButtonFromState(unsigned int state) {
|
||||||
|
|
||||||
This method is automatically called once, before the first call to paintGL().
|
This method is automatically called once, before the first call to paintGL().
|
||||||
|
|
||||||
Overload init() instead of this method to modify viewer specific OpenGL state or
|
Overload init() instead of this method to modify viewer specific OpenGL state.
|
||||||
to create display lists.
|
|
||||||
|
|
||||||
To make beginners' life easier and to simplify the examples, this method
|
If a 4.3 context could not be set, a 2.1 context will be used instead.
|
||||||
slightly modifies the standard OpenGL state: \code glEnable(GL_LIGHT0);
|
\see `isOpenGL_4_3()`
|
||||||
glEnable(GL_LIGHTING);
|
*/
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glEnable(GL_COLOR_MATERIAL);
|
|
||||||
\endcode
|
|
||||||
|
|
||||||
If you port an existing application to QGLViewer and your display changes, you
|
|
||||||
probably want to disable these flags in init() to get back to a standard OpenGL
|
|
||||||
state. */
|
|
||||||
void QGLViewer::initializeGL() {
|
void QGLViewer::initializeGL() {
|
||||||
|
QSurfaceFormat format;
|
||||||
|
format.setDepthBufferSize(24);
|
||||||
|
format.setStencilBufferSize(8);
|
||||||
|
format.setVersion(4,3);
|
||||||
|
format.setProfile(QSurfaceFormat::CompatibilityProfile);
|
||||||
|
format.setSamples(0);
|
||||||
|
context()->setFormat(format);
|
||||||
|
bool created = context()->create();
|
||||||
|
if(!created || context()->format().profile() != QSurfaceFormat::CompatibilityProfile) {
|
||||||
|
// impossible to get a 4.3 compatibility profile, retry with 2.0
|
||||||
|
format.setVersion(2,1);
|
||||||
|
context()->setFormat(format);
|
||||||
|
created = context()->create();
|
||||||
|
is_ogl_4_3 = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
is_ogl_4_3 = true;
|
||||||
|
}
|
||||||
|
makeCurrent();
|
||||||
QOpenGLFunctions_2_1::initializeOpenGLFunctions();
|
QOpenGLFunctions_2_1::initializeOpenGLFunctions();
|
||||||
glEnable(GL_LIGHT0);
|
|
||||||
glEnable(GL_LIGHTING);
|
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
glEnable(GL_COLOR_MATERIAL);
|
|
||||||
|
|
||||||
// Default colors
|
// Default colors
|
||||||
setForegroundColor(QColor(180, 180, 180));
|
setForegroundColor(QColor(180, 180, 180));
|
||||||
setBackgroundColor(QColor(51, 51, 51));
|
setBackgroundColor(QColor(51, 51, 51));
|
||||||
|
|
||||||
// Clear the buffer where we're going to draw
|
// Clear the buffer where we're going to draw
|
||||||
if (format().stereo()) {
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glDrawBuffer(GL_BACK_RIGHT);
|
// Calls user defined method. Default emits a signal.
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
init();
|
||||||
glDrawBuffer(GL_BACK_LEFT);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
} else
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
//OpenGL buffers and programs initialization
|
//OpenGL buffers and programs initialization
|
||||||
for(int i=0; i<VAO_size; ++i)
|
for(int i=0; i<VAO_size; ++i)
|
||||||
{
|
{
|
||||||
|
|
@ -400,9 +403,6 @@ void QGLViewer::initializeGL() {
|
||||||
qDebug() << rendering_program_light.log();
|
qDebug() << rendering_program_light.log();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calls user defined method. Default emits a signal.
|
|
||||||
init();
|
|
||||||
|
|
||||||
// Give time to glInit to finish and then call setFullScreen().
|
// Give time to glInit to finish and then call setFullScreen().
|
||||||
if (isFullScreen())
|
if (isFullScreen())
|
||||||
|
|
@ -1111,80 +1111,20 @@ void QGLViewer::select(const QPoint &point) {
|
||||||
|
|
||||||
/*! This method should prepare the selection. It is called by select() before
|
/*! This method should prepare the selection. It is called by select() before
|
||||||
drawWithNames().
|
drawWithNames().
|
||||||
The default function is empty.
|
|
||||||
*/
|
*/
|
||||||
void QGLViewer::beginSelection(const QPoint &)
|
void QGLViewer::beginSelection(const QPoint &point)
|
||||||
{
|
{
|
||||||
|
makeCurrent();
|
||||||
|
glEnable(GL_SCISSOR_TEST);
|
||||||
|
glScissor(point.x(), camera()->screenHeight()-1-point.y(), 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! This method is called by select() after scene elements were drawn by
|
/*! This method is called by select() after scene elements were drawn by
|
||||||
drawWithNames(). It should analyze the selection result to determine which
|
drawWithNames().
|
||||||
object is actually selected.
|
It clears the OpenGL state set by beginSelection*/
|
||||||
|
|
||||||
The default implementation relies on \c GL_SELECT mode (see beginSelection()).
|
|
||||||
It assumes that names were pushed and popped in drawWithNames(), and analyzes
|
|
||||||
the selectBuffer() to find the name that corresponds to the closer (z min)
|
|
||||||
object. It then setSelectedName() to this value, or to -1 if the selectBuffer()
|
|
||||||
is empty (no object drawn in selection region). Use selectedName() (probably in
|
|
||||||
the postSelection() method) to retrieve this value and update your data
|
|
||||||
structure accordingly.
|
|
||||||
|
|
||||||
This default implementation, although sufficient for many cases is however
|
|
||||||
limited and you may have to overload this method. This will be the case if
|
|
||||||
drawWithNames() uses several push levels in the name heap. A more precise depth
|
|
||||||
selection, for instance privileging points over edges and triangles to avoid z
|
|
||||||
precision problems, will also require an overloading. A typical implementation
|
|
||||||
will look like:
|
|
||||||
\code
|
|
||||||
glFlush();
|
|
||||||
|
|
||||||
// Get the number of objects that were seen through the pick matrix frustum.
|
|
||||||
// Resets GL_RENDER mode.
|
|
||||||
GLint nbHits = glRenderMode(GL_RENDER);
|
|
||||||
|
|
||||||
if (nbHits <= 0)
|
|
||||||
setSelectedName(-1);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Interpret results: each object created values in the selectBuffer().
|
|
||||||
// See the glSelectBuffer() man page for details on the buffer structure.
|
|
||||||
// The following code depends on your selectBuffer() structure.
|
|
||||||
for (int i=0; i<nbHits; ++i)
|
|
||||||
if ((selectBuffer())[i*4+1] < zMin)
|
|
||||||
setSelectedName((selectBuffer())[i*4+3])
|
|
||||||
}
|
|
||||||
\endcode
|
|
||||||
|
|
||||||
See the <a href="../examples/multiSelect.html">multiSelect example</a> for
|
|
||||||
a multi-object selection implementation of this method. */
|
|
||||||
void QGLViewer::endSelection(const QPoint &point) {
|
void QGLViewer::endSelection(const QPoint &point) {
|
||||||
Q_UNUSED(point);
|
Q_UNUSED(point);
|
||||||
|
glDisable(GL_SCISSOR_TEST);
|
||||||
// Flush GL buffers
|
|
||||||
glFlush();
|
|
||||||
|
|
||||||
// Get the number of objects that were seen through the pick matrix frustum.
|
|
||||||
// Reset GL_RENDER mode.
|
|
||||||
GLint nbHits = glRenderMode(GL_RENDER);
|
|
||||||
|
|
||||||
if (nbHits <= 0)
|
|
||||||
setSelectedName(-1);
|
|
||||||
else {
|
|
||||||
// Interpret results: each object created 4 values in the selectBuffer().
|
|
||||||
// selectBuffer[4*i+1] is the object minimum depth value, while
|
|
||||||
// selectBuffer[4*i+3] is the id pushed on the stack. Of all the objects
|
|
||||||
// that were projected in the pick region, we select the closest one (zMin
|
|
||||||
// comparison). This code needs to be modified if you use several stack
|
|
||||||
// levels. See glSelectBuffer() man page.
|
|
||||||
GLuint zMin = (selectBuffer())[1];
|
|
||||||
setSelectedName(int((selectBuffer())[3]));
|
|
||||||
for (int i = 1; i < nbHits; ++i)
|
|
||||||
if ((selectBuffer())[4 * i + 1] < zMin) {
|
|
||||||
zMin = (selectBuffer())[4 * i + 1];
|
|
||||||
setSelectedName(int((selectBuffer())[4 * i + 3]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Sets the selectBufferSize().
|
/*! Sets the selectBufferSize().
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,6 @@ public:
|
||||||
bool _displayMessage;
|
bool _displayMessage;
|
||||||
QTimer messageTimer;
|
QTimer messageTimer;
|
||||||
QOpenGLFunctions_4_3_Compatibility* _recentFunctions;
|
QOpenGLFunctions_4_3_Compatibility* _recentFunctions;
|
||||||
bool is_ogl_4_3;
|
|
||||||
bool is_2d_selection_mode;
|
bool is_2d_selection_mode;
|
||||||
|
|
||||||
//! The buffers used to draw the axis system
|
//! The buffers used to draw the axis system
|
||||||
|
|
@ -195,36 +194,17 @@ void Viewer::fastDraw()
|
||||||
d->draw_aux(false, this);
|
d->draw_aux(false, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::initializeGL()
|
void Viewer::init()
|
||||||
{
|
{
|
||||||
QSurfaceFormat format;
|
if(!isOpenGL_4_3())
|
||||||
format.setDepthBufferSize(24);
|
{
|
||||||
format.setStencilBufferSize(8);
|
std::cerr<<"The openGL context initialization failed "
|
||||||
format.setVersion(4,3);
|
"and the default context (2.1) will be used" <<std::endl;
|
||||||
format.setProfile(QSurfaceFormat::CompatibilityProfile);
|
|
||||||
format.setSamples(0);
|
|
||||||
context()->setFormat(format);
|
|
||||||
bool created = context()->create();
|
|
||||||
if(!created || context()->format().profile() != QSurfaceFormat::CompatibilityProfile) {
|
|
||||||
// impossible to get a 4.3 compatibility profile, retry with 2.0
|
|
||||||
format.setVersion(2,1);
|
|
||||||
context()->setFormat(format);
|
|
||||||
created = context()->create();
|
|
||||||
d->is_ogl_4_3 = false;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d->is_ogl_4_3 = true;
|
|
||||||
d->_recentFunctions = new QOpenGLFunctions_4_3_Compatibility();
|
d->_recentFunctions = new QOpenGLFunctions_4_3_Compatibility();
|
||||||
}
|
d->_recentFunctions->initializeOpenGLFunctions();
|
||||||
CGAL_warning_msg(created && context()->isValid(), "The openGL context initialization failed "
|
|
||||||
"and the default context (2.0) will be used" );
|
|
||||||
makeCurrent();
|
|
||||||
QGLViewer::initializeGL();
|
|
||||||
initializeOpenGLFunctions();
|
|
||||||
if(isOpenGL_4_3())
|
|
||||||
{
|
|
||||||
d->_recentFunctions->initializeOpenGLFunctions();
|
|
||||||
}
|
}
|
||||||
glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDARBPROC)this->context()->getProcAddress("glDrawArraysInstancedARB");
|
glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDARBPROC)this->context()->getProcAddress("glDrawArraysInstancedARB");
|
||||||
if(!glDrawArraysInstanced)
|
if(!glDrawArraysInstanced)
|
||||||
|
|
@ -247,14 +227,12 @@ void Viewer::initializeGL()
|
||||||
|
|
||||||
setBackgroundColor(::Qt::white);
|
setBackgroundColor(::Qt::white);
|
||||||
d->vao.create();
|
d->vao.create();
|
||||||
d->buffer.create();
|
d->buffer.create();
|
||||||
|
|
||||||
QOpenGLShader *vertex_shader, *fragment_shader;
|
QOpenGLShader *vertex_shader, *fragment_shader;
|
||||||
|
|
||||||
//setting the program used for the distance
|
//setting the program used for the distance
|
||||||
{
|
{
|
||||||
d->vao.create();
|
|
||||||
d->buffer.create();
|
|
||||||
//Vertex source code
|
//Vertex source code
|
||||||
const char vertex_source_dist[] =
|
const char vertex_source_dist[] =
|
||||||
{
|
{
|
||||||
|
|
@ -680,14 +658,12 @@ void Viewer::attribBuffers(int program_name) const {
|
||||||
|
|
||||||
void Viewer::beginSelection(const QPoint &point)
|
void Viewer::beginSelection(const QPoint &point)
|
||||||
{
|
{
|
||||||
makeCurrent();
|
QGLViewer::beginSelection(point);
|
||||||
glEnable(GL_SCISSOR_TEST);
|
d->scene->setPickedPixel(point);
|
||||||
glScissor(point.x(), camera()->screenHeight()-1-point.y(), 1, 1);
|
|
||||||
d->scene->setPickedPixel(point);
|
|
||||||
}
|
}
|
||||||
void Viewer::endSelection(const QPoint&)
|
void Viewer::endSelection(const QPoint& point)
|
||||||
{
|
{
|
||||||
glDisable(GL_SCISSOR_TEST);
|
QGLViewer::endSelection(point);
|
||||||
//redraw the true scene for the glReadPixel in postSelection();
|
//redraw the true scene for the glReadPixel in postSelection();
|
||||||
d->draw_aux(false, this);
|
d->draw_aux(false, this);
|
||||||
}
|
}
|
||||||
|
|
@ -745,10 +721,6 @@ void Viewer::drawVisualHints()
|
||||||
d->textRenderer->removeText(message_text);
|
d->textRenderer->removeText(message_text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Viewer::resizeGL(int w, int h)
|
|
||||||
{
|
|
||||||
QGLViewer::resizeGL(w,h);
|
|
||||||
}
|
|
||||||
QOpenGLShaderProgram* Viewer::declare_program(int name,
|
QOpenGLShaderProgram* Viewer::declare_program(int name,
|
||||||
const char* v_shader,
|
const char* v_shader,
|
||||||
const char* f_shader) const
|
const char* f_shader) const
|
||||||
|
|
@ -1249,9 +1221,6 @@ void Viewer::enableClippingBox(QVector4D box[6])
|
||||||
d->clipbox[i] = box[i];
|
d->clipbox[i] = box[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Viewer::isOpenGL_4_3() const { return d->is_ogl_4_3; }
|
|
||||||
|
|
||||||
QOpenGLFunctions_4_3_Compatibility* Viewer::openGL_4_3_functions() { return d->_recentFunctions; }
|
QOpenGLFunctions_4_3_Compatibility* Viewer::openGL_4_3_functions() { return d->_recentFunctions; }
|
||||||
|
|
||||||
void Viewer::set2DSelectionMode(bool b) { d->is_2d_selection_mode = b; }
|
void Viewer::set2DSelectionMode(bool b) { d->is_2d_selection_mode = b; }
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ public:
|
||||||
void fastDraw()Q_DECL_OVERRIDE;
|
void fastDraw()Q_DECL_OVERRIDE;
|
||||||
bool isExtensionFound()Q_DECL_OVERRIDE;
|
bool isExtensionFound()Q_DECL_OVERRIDE;
|
||||||
//! Initializes the OpenGL functions and sets the backGround color.
|
//! Initializes the OpenGL functions and sets the backGround color.
|
||||||
void initializeGL()Q_DECL_OVERRIDE;
|
void init()Q_DECL_OVERRIDE;
|
||||||
//! Draws the scene "with names" to allow picking.
|
//! Draws the scene "with names" to allow picking.
|
||||||
void drawWithNames()Q_DECL_OVERRIDE;
|
void drawWithNames()Q_DECL_OVERRIDE;
|
||||||
/*! Uses the parameter pixel's coordinates to get the corresponding point
|
/*! Uses the parameter pixel's coordinates to get the corresponding point
|
||||||
|
|
@ -142,15 +142,12 @@ protected:
|
||||||
//!Defines the behaviour for the key release events
|
//!Defines the behaviour for the key release events
|
||||||
void keyReleaseEvent(QKeyEvent *)Q_DECL_OVERRIDE;
|
void keyReleaseEvent(QKeyEvent *)Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
void resizeGL(int w, int h)Q_DECL_OVERRIDE;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class Viewer_impl;
|
friend class Viewer_impl;
|
||||||
Viewer_impl* d;
|
Viewer_impl* d;
|
||||||
double prev_radius;
|
double prev_radius;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool isOpenGL_4_3() const Q_DECL_OVERRIDE;
|
|
||||||
QOpenGLFunctions_4_3_Compatibility* openGL_4_3_functions() Q_DECL_OVERRIDE;
|
QOpenGLFunctions_4_3_Compatibility* openGL_4_3_functions() Q_DECL_OVERRIDE;
|
||||||
|
|
||||||
}; // end class Viewer
|
}; // end class Viewer
|
||||||
|
|
|
||||||
|
|
@ -249,10 +249,7 @@ public Q_SLOTS:
|
||||||
virtual bool moveCameraToCoordinates(QString target,
|
virtual bool moveCameraToCoordinates(QString target,
|
||||||
float animation_duration = 0.5f) = 0;
|
float animation_duration = 0.5f) = 0;
|
||||||
public:
|
public:
|
||||||
//! Is used to know if the openGL context is 4.3 or 2.1.
|
|
||||||
//! @returns `true` if the context is 4.3.
|
|
||||||
//! @returns `false` if the context is 2.1.
|
|
||||||
virtual bool isOpenGL_4_3() const = 0;
|
|
||||||
//! Gives acces to recent openGL(4.3) features, allowing use of things like
|
//! Gives acces to recent openGL(4.3) features, allowing use of things like
|
||||||
//! Geometry Shaders or Depth Textures.
|
//! Geometry Shaders or Depth Textures.
|
||||||
//! @returns a pointer to an initialized QOpenGLFunctions_4_3_Compatibility if `isOpenGL_4_3()` is `true`
|
//! @returns a pointer to an initialized QOpenGLFunctions_4_3_Compatibility if `isOpenGL_4_3()` is `true`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue