mirror of https://github.com/CGAL/cgal
187 lines
8.6 KiB
C++
187 lines
8.6 KiB
C++
// Copyright (c) 2012-2015 GeometryFactory Sarl (France)
|
|
// All rights reserved.
|
|
//
|
|
// This file is part of CGAL (www.cgal.org).
|
|
// You can redistribute it and/or modify it under the terms of the GNU
|
|
// General Public License as published by the Free Software Foundation,
|
|
// either version 3 of the License, or (at your option) any later version.
|
|
//
|
|
// Licensees holding a valid commercial license may use this file in
|
|
// accordance with the commercial license agreement provided with the software.
|
|
//
|
|
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
//
|
|
// $URL$
|
|
// $Id$
|
|
//
|
|
//
|
|
// Author(s) : Laurent RINEAU, Maxime Gimeno
|
|
|
|
#ifndef VIEWER_INTERFACE_H
|
|
#define VIEWER_INTERFACE_H
|
|
|
|
#include <QGLViewer/qglviewer.h>
|
|
#include <QWidget>
|
|
#include <QPoint>
|
|
#include <QOpenGLFunctions_2_1>
|
|
#include <CGAL/Qt/CreateOpenGLContext.h>
|
|
// forward declarations
|
|
class QWidget;
|
|
class QMouseEvent;
|
|
class QKeyEvent;
|
|
class QOpenGLShaderProgram;
|
|
class TextRenderer;
|
|
class TextListItem;
|
|
|
|
//! \file Viewer_interface.h
|
|
#include <CGAL/Three/Viewer_config.h> // for VIEWER_EXPORT
|
|
namespace CGAL{
|
|
namespace Three{
|
|
class Scene_draw_interface;
|
|
//! Base class to interact with the viewer from the plugins, the items and the scene.
|
|
class VIEWER_EXPORT Viewer_interface : public QGLViewer, public QOpenGLFunctions_2_1 {
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
/*!
|
|
* \brief The OpenGL_program_IDs enum
|
|
* This enum holds the OpenGL programs IDs that are given to getShaderProgram() and attribBuffers().
|
|
*@see getShaderProgram
|
|
* @see attribBuffers
|
|
*/
|
|
enum OpenGL_program_IDs
|
|
{
|
|
PROGRAM_WITH_LIGHT = 0, /** Used to render a surface or edge affected by the light. It uses a per fragment lighting model, and renders brighter the selected item.*/
|
|
PROGRAM_WITHOUT_LIGHT, /** Used to render a polygon edge or points. It renders in a uniform color and is not affected by light. It renders the selected item in black.*/
|
|
PROGRAM_NO_SELECTION, /** Used to render a polyline or a surface that is not affected by light, like a cutting plane. It renders in a uniform color that does not change with selection.*/
|
|
PROGRAM_WITH_TEXTURE, /** Used to render a textured polyhedron. Affected by light.*/
|
|
PROGRAM_PLANE_TWO_FACES, /** Used to render a two-faced plane. The two faces have a different color. Not affected by light.*/
|
|
PROGRAM_WITH_TEXTURED_EDGES, /** Used to render the edges of a textured polyhedorn. Not affected by light.*/
|
|
PROGRAM_INSTANCED, /** Used to display instanced rendered spheres.Affected by light.*/
|
|
PROGRAM_INSTANCED_WIRE, /** Used to display instanced rendered wired spheres. Not affected by light.*/
|
|
PROGRAM_C3T3, /** Used to render a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Affected by light.*/
|
|
PROGRAM_C3T3_EDGES, /** Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light.*/
|
|
PROGRAM_CUTPLANE_SPHERES, /** Used to render the spheres of an item with a cut plane.*/
|
|
PROGRAM_SPHERES, /** Used to render one or several spheres.*/
|
|
NB_OF_PROGRAMS /** Holds the number of different programs in this enum.*/
|
|
};
|
|
|
|
//!Returns the viewer's QPainter
|
|
virtual QPainter *getPainter() =0;
|
|
|
|
/*!
|
|
* \brief textRenderer is used to display text on the screen.
|
|
* The textRenderer uses the painter tu display 2D text over the 3D Scene. It has a list containing the TextItems to display.
|
|
*/
|
|
TextRenderer *textRenderer;
|
|
/*!
|
|
* \brief testDisplayId checks if the id at position (x,y,z) is visible or not.
|
|
* \param x the X coordinate of the id's position.
|
|
* \param y the Y coordinate of the id's position.
|
|
* \param z the Z coordinate of the id's position.
|
|
* \return true if the ID is visible. */
|
|
virtual bool testDisplayId(double x, double y, double z) = 0;
|
|
//!Returns true if the primitive ids are displayed
|
|
virtual bool hasText() const { return false; }
|
|
|
|
Viewer_interface(QWidget* parent) : QGLViewer(CGAL::Qt::createOpenGLContext(), parent) {}
|
|
virtual ~Viewer_interface() {}
|
|
|
|
//! Sets the scene for the viewer.
|
|
virtual void setScene(CGAL::Three::Scene_draw_interface* scene) = 0;
|
|
//! @returns the antialiasing state.
|
|
virtual bool antiAliasing() const = 0;
|
|
|
|
// Those two functions are defined in Viewer.cpp
|
|
//!Sets the position and orientation of a frame using a QString.
|
|
//!@returns true if it worked.
|
|
static bool readFrame(QString, qglviewer::Frame&);
|
|
//!@returns a QString contining the position and orientation of a frame.
|
|
static QString dumpFrame(const qglviewer::Frame&);
|
|
//! @returns the fastDrawing state.
|
|
virtual bool inFastDrawing() const = 0;
|
|
//! @returns if the viewer is in `drawWithNames()`
|
|
virtual bool inDrawWithNames() const = 0;
|
|
|
|
/*! Passes all the uniform data to the shaders.
|
|
* According to program_name, this data may change.
|
|
* @see OpenGL_program_IDs
|
|
*/
|
|
virtual void attribBuffers(int program_name) const = 0;
|
|
|
|
/*! Returns a program according to name.
|
|
* If the program does not exist yet, it is created and stored in shader_programs.
|
|
* @see OpenGL_program_IDs
|
|
* @returns a pointer to the corresponding program.*/
|
|
virtual QOpenGLShaderProgram* getShaderProgram(int name) const = 0;
|
|
|
|
//!Allows OpenGL 2.1 context to get access to glDrawArraysInstanced.
|
|
typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
|
|
//!Allows OpenGL 2.1 context to get access to glVertexAttribDivisor.
|
|
typedef void (APIENTRYP PFNGLVERTEXATTRIBDIVISORARBPROC) (GLuint index, GLuint divisor);
|
|
//!Allows OpenGL 2.1 context to get access to glVertexAttribDivisor.
|
|
typedef void (APIENTRYP PFNGLFRAMEBUFFERTEXTURE2DEXTPROC) (GLuint target, GLuint attachment, GLuint textarget, GLuint texture, GLint level);
|
|
//!Allows OpenGL 2.1 context to get access to gkFrameBufferTexture2D.
|
|
PFNGLDRAWARRAYSINSTANCEDARBPROC glDrawArraysInstanced;
|
|
//!Allows OpenGL 2.1 context to get access to glVertexAttribDivisor.
|
|
PFNGLVERTEXATTRIBDIVISORARBPROC glVertexAttribDivisor;
|
|
//!Allows OpenGL 2.1 context to get access to gkFrameBufferTexture2D.
|
|
PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2D;
|
|
//!@returns true if glVertexAttribDivisor, and glDrawArraysInstanced are found.
|
|
//! Used by the items to avoid SEGFAULT.
|
|
bool extension_is_found;
|
|
//!The matrix used for the picking.
|
|
mutable GLfloat pickMatrix_[16];
|
|
//!Sets the binding for SHIFT+LEFT CLICK to SELECT (initially used in Scene_polyhedron_selection_item.h)
|
|
void setBindingSelect()
|
|
{
|
|
#if QGLVIEWER_VERSION >= 0x020501
|
|
setMouseBinding(::Qt::ShiftModifier, ::Qt::LeftButton, SELECT);
|
|
#else
|
|
setMouseBinding(::Qt::SHIFT + ::Qt::LeftButton, SELECT);
|
|
#endif
|
|
}
|
|
//!Sets the binding for SHIFT+LEFT CLICK to NO_CLICK_ACTION (initially used in Scene_polyhedron_selection_item.h)
|
|
void setNoBinding()
|
|
{
|
|
#if QGLVIEWER_VERSION >= 0x020501
|
|
setMouseBinding(::Qt::ShiftModifier, ::Qt::LeftButton, NO_CLICK_ACTION);
|
|
#else
|
|
setMouseBinding(::Qt::SHIFT + ::Qt::LeftButton, NO_CLICK_ACTION);
|
|
#endif
|
|
}
|
|
|
|
Q_SIGNALS:
|
|
//!Is emitted after an item is picked.
|
|
void selected(int);
|
|
//!Is emitted to require a contextual menu to appear at global_pos.
|
|
void requestContextMenu(QPoint global_pos);
|
|
//!Is emitted after a point is selected.
|
|
void selectedPoint(double, double, double);
|
|
//!Is emitted to request the currently selected item to perform a selection based on an AABB_Tree and a raycasting.
|
|
void selectionRay(double, double, double, double, double, double);
|
|
|
|
public Q_SLOTS:
|
|
//! Sets the antialiasing to true or false.
|
|
virtual void setAntiAliasing(bool b) = 0;
|
|
//! If b is true, facets will be ligted from both internal and external sides.
|
|
//! If b is false, only the side that is exposed to the light source will be lighted.
|
|
virtual void setTwoSides(bool b) = 0;
|
|
//! If b is true, some items are displayed in a simplified version when moving the camera.
|
|
//! If b is false, items display is never altered, even when moving.
|
|
virtual void setFastDrawing(bool b) = 0;
|
|
//! Make the camera turn around.
|
|
virtual void turnCameraBy180Degres() = 0;
|
|
//! @returns a QString containing the position and orientation of the camera.
|
|
virtual QString dumpCameraCoordinates() = 0;
|
|
//!Moves the camera to the new coordinates (position and orientation) through an animation.
|
|
virtual bool moveCameraToCoordinates(QString,
|
|
float animation_duration = 0.5f) = 0;
|
|
|
|
}; // end class Viewer_interface
|
|
}
|
|
}
|
|
#endif // VIEWER_INTERFACE_H
|