//
// File: glmesh.h
//
// (C) 2000-2008 Helmut Cantzler
//
// Licensed under the terms of the Lesser General Public License.
//
#ifndef _GLMESH_H
#define _GLMESH_H
#include <QGLWidget>
#include "mesh.h"
#include "texture.h"
enum DisplayType {VERTICES=0, EDGES, TEXTURE, SOLID, WIRE,
FRONTLINES, FEATURES, NOTHING};
class CoordinatesWindow;
class GLMeshSettings
{
public:
GLMeshSettings();
void init(void);
void clear(void);
void clearFeatures(void);
void resetViewpoint();
void setViewpoint(GLMeshSettings &s);
Mesh *mesh, *features;
// Viewpoint data (Trackball, Translation, Zoom, Clipping)
GLfloat tbTransform[4][4];
GLfloat xShift, yShift, zShift;
GLfloat clipping;
bool pickRendering;
int pickX, pickY;
float pickSizeX, pickSizeY;
CoordinatesWindow *pickOutputWindow;
// Viewmode
enum DisplayType meshDisplayMode, featuresDisplayMode;
// Light intensity
GLfloat lightBrightness, pointSize, lineSize;
// Background colour
GLfloat red, green, blue;
// Flags
bool displayNormals, displayShapeColors, displayFeatures, displayPolygons;
bool enableTextureFilter, enableCutBackFaces, enableLighting;
bool enablePicking, enableAspectRatio, displayBoundingBox;
};
class GLMesh : public QGLWidget
{
Q_OBJECT
public:
GLMesh(QWidget *parent, GLMeshSettings *s, bool perspective, int face);
~GLMesh();
void newMesh(void);
void newFeatures(void);
void resetViewpoint(void);
void setViewpoint(GLMeshSettings &vp);
void setPick(bool p, CoordinatesWindow *cw);
float getFps(void);
void setShapeTexture(int i);
void clearSelection(void);
public slots:
void setDisplayMode(QAction *a);
void setLightIntensity(int l);
void setPointSize(int l);
void setLineSize(int l);
void setClipping(int c);
void setLight(bool l);
void setPolygons(bool p);
void setShapeColors(bool sc);
void setNormals(bool n);
void setBoundingBox(bool b);
void setBackFaces(bool bf);
void setTextureFiltering(bool tf);
void setFeatures(bool f);
void setAspectRatio(bool a);
void setBackgroundColor(QColor c);
protected:
void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent *e);
void wheelEvent(QWheelEvent *e);
void mouseReleaseEvent(QMouseEvent *e);
void initializeGL();
void paintGL();
void resizeGL(int width, int height);
private:
QWidget *parent;
enum ActionType {NONE, TRANSLATE, ROTATE, ZOOM};
enum COLOR {BLACK=0, BLUE, GREEN, RED, YELLOW, PURPLE, CYAN, WHITE};
void pickObject(int x, int y);
void setMaterialColor(GLenum face, GLenum pname, int color);
void setMaterialColorGrey(GLenum face, GLenum pname, int b);
void checkForTraps(const char *string, int value);
void tbPointToVector(int x, int y, float v[3]);
void initMesh(void);
void initFeatures(void);
void initLighting(void);
void initTexture(void);
void displayNormals(void);
void displayBoundingBox(void);
void displayPoints(list<Vertex*> *vertices);
void displayEdges(list<Edge*> *edges);
void displayFeatures(void);
void displayShapePoints(void);
void displayMesh(void);
void displayMeshWithStencil(void);
void displayPickObjects(void);
GLMeshSettings *settings;
float fps, surfaceNormalLength;
int numberOfShapes;
// Texture
GLuint *textureList;
// Trackball data
GLfloat tbLastPosition[3], tbAxis[3];
enum ActionType actionMode;
int lastMouseX, lastMouseY;
bool perspective;
int face;
};
#endif