You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
2.7 KiB
131 lines
2.7 KiB
#ifndef __openglhelper_2003_06_06_15_49__
|
|
#define __openglhelper_2003_06_06_15_49__
|
|
|
|
#include "qglobal.h"
|
|
#if QT_VERSION < 0x040000
|
|
#include <qgl.h>
|
|
#else
|
|
#include <QtOpenGL/qgl.h>
|
|
#endif
|
|
|
|
namespace Qwt3D
|
|
{
|
|
|
|
#ifndef QWT3D_NOT_FOR_DOXYGEN
|
|
|
|
class GLStateBewarer
|
|
{
|
|
public:
|
|
|
|
GLStateBewarer(GLenum what, bool on, bool persist=false)
|
|
{
|
|
state_ = what;
|
|
stateval_ = glIsEnabled(what);
|
|
if (on)
|
|
turnOn(persist);
|
|
else
|
|
turnOff(persist);
|
|
}
|
|
|
|
~GLStateBewarer()
|
|
{
|
|
if (stateval_)
|
|
glEnable(state_);
|
|
else
|
|
glDisable(state_);
|
|
}
|
|
|
|
void turnOn(bool persist = false)
|
|
{
|
|
glEnable(state_);
|
|
if (persist)
|
|
stateval_ = true;
|
|
}
|
|
|
|
void turnOff(bool persist = false)
|
|
{
|
|
glDisable(state_);
|
|
if (persist)
|
|
stateval_ = false;
|
|
}
|
|
|
|
|
|
private:
|
|
|
|
GLenum state_;
|
|
bool stateval_;
|
|
|
|
};
|
|
|
|
inline const GLubyte* gl_error()
|
|
{
|
|
GLenum errcode;
|
|
const GLubyte* err = 0;
|
|
|
|
if ((errcode = glGetError()) != GL_NO_ERROR)
|
|
{
|
|
err = gluErrorString(errcode);
|
|
}
|
|
return err;
|
|
}
|
|
|
|
inline void SaveGlDeleteLists(GLuint& lstidx, GLsizei range)
|
|
{
|
|
if (glIsList(lstidx))
|
|
glDeleteLists(lstidx, range);
|
|
lstidx = 0;
|
|
}
|
|
|
|
//! get OpenGL transformation matrices
|
|
/**
|
|
Don't rely on (use) this in display lists !
|
|
\param modelMatrix should be a GLdouble[16]
|
|
\param projMatrix should be a GLdouble[16]
|
|
\param viewport should be a GLint[4]
|
|
*/
|
|
inline void getMatrices(GLdouble* modelMatrix, GLdouble* projMatrix, GLint* viewport)
|
|
{
|
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
|
glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
|
|
glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
|
|
}
|
|
|
|
//! simplified glut routine (glUnProject): windows coordinates_p --> object coordinates_p
|
|
/**
|
|
Don't rely on (use) this in display lists !
|
|
*/
|
|
inline bool ViewPort2World(double& objx, double& objy, double& objz, double winx, double winy, double winz)
|
|
{
|
|
GLdouble modelMatrix[16];
|
|
GLdouble projMatrix[16];
|
|
GLint viewport[4];
|
|
|
|
getMatrices(modelMatrix, projMatrix, viewport);
|
|
int res = gluUnProject(winx, winy, winz, modelMatrix, projMatrix, viewport, &objx, &objy, &objz);
|
|
|
|
return (res == GL_FALSE) ? false : true;
|
|
}
|
|
|
|
//! simplified glut routine (glProject): object coordinates_p --> windows coordinates_p
|
|
/**
|
|
Don't rely on (use) this in display lists !
|
|
*/
|
|
inline bool World2ViewPort(double& winx, double& winy, double& winz, double objx, double objy, double objz )
|
|
{
|
|
GLdouble modelMatrix[16];
|
|
GLdouble projMatrix[16];
|
|
GLint viewport[4];
|
|
|
|
getMatrices(modelMatrix, projMatrix, viewport);
|
|
int res = gluProject(objx, objy, objz, modelMatrix, projMatrix, viewport, &winx, &winy, &winz);
|
|
|
|
return (res == GL_FALSE) ? false : true;
|
|
}
|
|
|
|
|
|
#endif // QWT3D_NOT_FOR_DOXYGEN
|
|
|
|
} // ns
|
|
|
|
#endif
|