Newer
Older
Import / research / 3d-z-maps / mview-0.3.3 / mview / glmesh.h
//
//    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