Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tgl.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tconvert.h"
Toshihiro Shimizu 890ddd
#include "tofflinegl.h"
Toshihiro Shimizu 890ddd
#include "trop.h"
Toshihiro Shimizu 890ddd
#include "timage_io.h"
Toshihiro Shimizu 890ddd
#include "tcurves.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef __sgi
Toshihiro Shimizu 890ddd
#ifdef WIN32
Toshihiro Shimizu 890ddd
#include <gl glut.h=""></gl>
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#include <glut glut.h=""></glut>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifdef MACOSX
Toshihiro Shimizu 890ddd
#include <qglcontext></qglcontext>
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#include "tthread.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef SCALE_BY_GLU
Toshihiro Shimizu 890ddd
//#undef NEW_DRAW_TEXT
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// GLUquadric*  localDisk=0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*
Toshihiro Shimizu 890ddd
  Find the number of slices in function of radius size.
Toshihiro Shimizu 890ddd
  \par radius of circle 
Toshihiro Shimizu 890ddd
  \par size of pixel
Toshihiro Shimizu 890ddd
  \ret number of division to obtain a circle
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
int computeSlices(double radius, double pixelSize = 1.0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (radius < 0)
Toshihiro Shimizu 890ddd
		return 2;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double thetaStep;
Toshihiro Shimizu 890ddd
	double temp = pixelSize * 0.5 / radius;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (fabs(1.0 - temp) <= 1)
Toshihiro Shimizu 890ddd
		thetaStep = acos(1.0 - temp);
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		thetaStep = TConsts::pi_2 * 0.5;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	assert(thetaStep != 0.0);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int numberOfSlices = (int)(2.0 * TConsts::pi / thetaStep);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return numberOfSlices != 0 ? numberOfSlices : 2;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
} // end of unnamed namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double tglGetPixelSize2()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double mat[16];
Toshihiro Shimizu 890ddd
	glMatrixMode(GL_MODELVIEW);
Toshihiro Shimizu 890ddd
	glGetDoublev(GL_MODELVIEW_MATRIX, mat);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double det = fabs(mat[0] * mat[5] - mat[1] * mat[4]);
Toshihiro Shimizu 890ddd
	if (det < TConsts::epsilon)
Toshihiro Shimizu 890ddd
		det = TConsts::epsilon;
Toshihiro Shimizu 890ddd
	return 1.0 / det;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
double tglGetTextWidth(const string &s, void *font)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double factor = 0.07;
Toshihiro Shimizu 890ddd
	double w = 0;
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)s.length(); i++)
Toshihiro Shimizu 890ddd
		w += glutStrokeWidth(font, s[i]);
Toshihiro Shimizu 890ddd
	return w * factor;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDrawText(const TPointD &p, const string &s, void *character)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifndef __sgi
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glTranslated(p.x, p.y, 0);
Toshihiro Shimizu 890ddd
	double factor = 0.07;
Toshihiro Shimizu 890ddd
	glScaled(factor, factor, factor);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)s.size(); i++)
Toshihiro Shimizu 890ddd
		glutStrokeCharacter(character, s[i]);
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	assert("Not Yet Implemented" && 0);
Toshihiro Shimizu 890ddd
	std::cout << s << std::endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDrawText(const TPointD &p, const wstring &s, void *character)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
#ifndef __sgi
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glTranslated(p.x, p.y, 0);
Toshihiro Shimizu 890ddd
	double factor = 0.07;
Toshihiro Shimizu 890ddd
	glScaled(factor, factor, factor);
Toshihiro Shimizu 890ddd
	for (int i = 0; i < (int)s.size(); i++)
Toshihiro Shimizu 890ddd
		glutStrokeCharacter(character, s[i]);
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	assert("Not Yet Implemented" && 0);
Toshihiro Shimizu 890ddd
	std::cout << s << std::endl;
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDrawSegment(const TPointD &p1, const TPointD &p2)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
	tglVertex(p1);
Toshihiro Shimizu 890ddd
	tglVertex(p2);
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDrawCircle(const TPointD ¢er, double radius)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (radius <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double pixelSize = 1;
Toshihiro Shimizu 890ddd
	int slices = 60;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (slices <= 0)
Toshihiro Shimizu 890ddd
		slices = computeSlices(radius, pixelSize) >> 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double step = TConsts::pi / slices;
Toshihiro Shimizu 890ddd
	double step2 = 2.0 * step;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double
Toshihiro Shimizu 890ddd
		cos_t,
Toshihiro Shimizu 890ddd
		sin_t,
Toshihiro Shimizu 890ddd
		cos_ts, sin_ts, t;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glTranslated(center.x, center.y, 0.0);
Toshihiro Shimizu 890ddd
	glBegin(GL_LINES);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	cos_t = radius /* *1.0*/;
Toshihiro Shimizu 890ddd
	sin_t = 0.0;
Toshihiro Shimizu 890ddd
	for (t = 0; t + step < TConsts::pi_2; t += step2) {
Toshihiro Shimizu 890ddd
		cos_ts = radius * cos(t + step);
Toshihiro Shimizu 890ddd
		sin_ts = radius * sin(t + step);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glVertex2f(cos_t, sin_t);
Toshihiro Shimizu 890ddd
		glVertex2f(cos_ts, sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glVertex2f(-cos_t, sin_t);
Toshihiro Shimizu 890ddd
		glVertex2f(-cos_ts, sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glVertex2f(-cos_t, -sin_t);
Toshihiro Shimizu 890ddd
		glVertex2f(-cos_ts, -sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glVertex2f(cos_t, -sin_t);
Toshihiro Shimizu 890ddd
		glVertex2f(cos_ts, -sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		cos_t = cos_ts;
Toshihiro Shimizu 890ddd
		sin_t = sin_ts;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	cos_ts = 0.0;
Toshihiro Shimizu 890ddd
	sin_ts = radius /* *1.0*/;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertex2f(cos_t, sin_t);
Toshihiro Shimizu 890ddd
	glVertex2f(cos_ts, sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertex2f(-cos_t, sin_t);
Toshihiro Shimizu 890ddd
	glVertex2f(-cos_ts, sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertex2f(-cos_t, -sin_t);
Toshihiro Shimizu 890ddd
	glVertex2f(-cos_ts, -sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glVertex2f(cos_t, -sin_t);
Toshihiro Shimizu 890ddd
	glVertex2f(cos_ts, -sin_ts);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDrawDisk(const TPointD &c, double r)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (r <= 0)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double pixelSize = 1;
Toshihiro Shimizu 890ddd
	int slices = 60;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (slices <= 0)
Toshihiro Shimizu 890ddd
		slices = computeSlices(r, pixelSize) >> 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
	glTranslated(c.x, c.y, 0.0);
Toshihiro Shimizu 890ddd
	GLUquadric *quadric = gluNewQuadric();
Toshihiro Shimizu 890ddd
	gluDisk(quadric, 0, r, slices, 1);
Toshihiro Shimizu 890ddd
	gluDeleteQuadric(quadric);
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDrawRect(const TRectD &rect)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glBegin(GL_LINE_LOOP);
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP00());
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP10());
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP11());
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP01());
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglFillRect(const TRectD &rect)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glBegin(GL_POLYGON);
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP00());
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP10());
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP11());
Toshihiro Shimizu 890ddd
	tglVertex(rect.getP01());
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglRgbOnlyColorMask()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tglMultColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
Toshihiro Shimizu 890ddd
	tglEnableBlending(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglAlphaOnlyColorMask()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	tglMultColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
Toshihiro Shimizu 890ddd
	tglEnableBlending(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglEnableBlending(GLenum src, GLenum dst)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	glBlendFunc(src, dst);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglEnableLineSmooth(bool enable, double lineSize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (enable) {
Toshihiro Shimizu 890ddd
		glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
Toshihiro Shimizu 890ddd
		glEnable(GL_LINE_SMOOTH);
Toshihiro Shimizu 890ddd
		glLineWidth(lineSize);
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		glDisable(GL_LINE_SMOOTH);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglEnablePointSmooth(double pointSize)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
	glPointSize(pointSize);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglGetColorMask(GLboolean &red, GLboolean &green, GLboolean &blue, GLboolean &alpha)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	GLboolean channels[4];
Toshihiro Shimizu 890ddd
	glGetBooleanv(GL_COLOR_WRITEMASK, &channels[0]);
Toshihiro Shimizu 890ddd
	red = channels[0], green = channels[1], blue = channels[2], alpha = channels[3];
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglMultColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	GLboolean channels[4];
Toshihiro Shimizu 890ddd
	glGetBooleanv(GL_COLOR_WRITEMASK, &channels[0]);
Toshihiro Shimizu 890ddd
	glColorMask(red && channels[0],
Toshihiro Shimizu 890ddd
				green && channels[1],
Toshihiro Shimizu 890ddd
				blue && channels[2],
Toshihiro Shimizu 890ddd
				alpha && channels[3]);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
namespace
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
//============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class GlFontManager
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	GlFontManager();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	~GlFontManager();
Toshihiro Shimizu 890ddd
	static GlFontManager *instance();
Toshihiro Shimizu 890ddd
	bool setFont(void *font = GLUT_BITMAP_TIMES_ROMAN_10);
Toshihiro Shimizu 890ddd
	void drawText(/*const TRectD bBox,*/
Toshihiro Shimizu 890ddd
				  wstring wtext /*,
Toshihiro Shimizu 890ddd
                TDimensionD scale = TDimensionD(1.0, 1.0)*/);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
private:
Toshihiro Shimizu 890ddd
	static GlFontManager *m_instance;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	//       font    font_height
Toshihiro Shimizu 890ddd
	//         |       |
Toshihiro Shimizu 890ddd
	std::map<void *,="" double=""> m_fonts;</void>
Toshihiro Shimizu 890ddd
	std::vector<trectd> m_charsBBox;</trectd>
Toshihiro Shimizu 890ddd
	void *m_currentFont;
Toshihiro Shimizu 890ddd
	TRaster32P m_fontTexture;
Toshihiro Shimizu 890ddd
	GLuint m_base;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
GlFontManager *GlFontManager::m_instance = 0L;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
GlFontManager::GlFontManager()
Toshihiro Shimizu 890ddd
	: m_currentFont(0L), m_base(0)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_8_BY_13, 13.0));
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_9_BY_15, 15.0));
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_TIMES_ROMAN_10, 10.0));
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_TIMES_ROMAN_24, 24.0));
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_HELVETICA_10, 10.0));
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_HELVETICA_12, 12.0));
Toshihiro Shimizu 890ddd
	m_fonts.insert(std::make_pair(GLUT_BITMAP_HELVETICA_18, 18.0));
Toshihiro Shimizu 890ddd
	bool ok = setFont();
Toshihiro Shimizu 890ddd
	assert(ok);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
GlFontManager::~GlFontManager()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	m_instance = 0L;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
GlFontManager *GlFontManager::instance()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_instance)
Toshihiro Shimizu 890ddd
		m_instance = new GlFontManager();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	return m_instance;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
bool GlFontManager::setFont(void *font)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	// cerca il font scelto nella mappa dei fonts conosciuti
Toshihiro Shimizu 890ddd
	std::map<void *,="" double="">::iterator it =</void>
Toshihiro Shimizu 890ddd
		m_fonts.find(font);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// se e' stato trovato
Toshihiro Shimizu 890ddd
	if (it != m_fonts.end()) {
Toshihiro Shimizu 890ddd
		m_currentFont = font;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
		glPushAttrib(GL_ALL_ATTRIB_BITS);
Toshihiro Shimizu 890ddd
		glPushMatrix();
Toshihiro Shimizu 890ddd
		m_base = glGenLists(256);
Toshihiro Shimizu 890ddd
		glListBase(m_base);
Toshihiro Shimizu 890ddd
		int i = 0;
Toshihiro Shimizu 890ddd
		for (; i < 256; ++i) {
Toshihiro Shimizu 890ddd
			glNewList(m_base + i, GL_COMPILE);
Toshihiro Shimizu 890ddd
			glutStrokeCharacter(GLUT_STROKE_ROMAN, i);
Toshihiro Shimizu 890ddd
			//glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, i);
Toshihiro Shimizu 890ddd
			glEndList();
Toshihiro Shimizu 890ddd
		}
Toshihiro Shimizu 890ddd
		glPopAttrib();
Toshihiro Shimizu 890ddd
		glPopMatrix();
Toshihiro Shimizu 890ddd
		return true;
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
	return false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void GlFontManager::drawText(/*const TRectD bBox,*/
Toshihiro Shimizu 890ddd
							 wstring wtext /*,
Toshihiro Shimizu 890ddd
                             TDimensionD scale*/)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (!m_currentFont)
Toshihiro Shimizu 890ddd
		return;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	string text = toString(wtext);
Toshihiro Shimizu 890ddd
	const char *textString = text.c_str();
Toshihiro Shimizu 890ddd
	glListBase(m_base);
Toshihiro Shimizu 890ddd
	/*
Toshihiro Shimizu 890ddd
  glPushMatrix();
Toshihiro Shimizu 890ddd
  glTranslated(bBox.x0, bBox.y0, 0.0);
Toshihiro Shimizu 890ddd
  glScaled(scale.lx*0.07, scale.ly*0.07, 1.0);
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
	glCallLists((GLuint)strlen(textString), GL_BYTE, textString);
Toshihiro Shimizu 890ddd
	/*glPopMatrix();*/
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
} // anonymous namespace
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDraw(const TCubic &cubic, int precision, GLenum pointOrLine)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
	assert(pointOrLine == GL_POINT || pointOrLine == GL_LINE);
Toshihiro Shimizu 890ddd
	float(*ctrlPts)[3];
Toshihiro Shimizu 890ddd
	ctrlPts = new float[4][3];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ctrlPts[0][0] = cubic.getP0().x;
Toshihiro Shimizu 890ddd
	ctrlPts[0][1] = cubic.getP0().y;
Toshihiro Shimizu 890ddd
	ctrlPts[0][2] = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ctrlPts[1][0] = cubic.getP1().x;
Toshihiro Shimizu 890ddd
	ctrlPts[1][1] = cubic.getP1().y;
Toshihiro Shimizu 890ddd
	ctrlPts[1][2] = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ctrlPts[2][0] = cubic.getP2().x;
Toshihiro Shimizu 890ddd
	ctrlPts[2][1] = cubic.getP2().y;
Toshihiro Shimizu 890ddd
	ctrlPts[2][2] = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	ctrlPts[3][0] = cubic.getP3().x;
Toshihiro Shimizu 890ddd
	ctrlPts[3][1] = cubic.getP3().y;
Toshihiro Shimizu 890ddd
	ctrlPts[3][2] = 0.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
	glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlPts[0][0]);
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
	glEnable(GL_MAP1_VERTEX_3);
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
	glMapGrid1f(precision, 0.0, 1.0);
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
	glEvalMesh1(pointOrLine, 0, precision);
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	delete[] ctrlPts;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDraw(const TRectD &rect,
Toshihiro Shimizu 890ddd
			 const std::vector<traster32p> &textures,</traster32p>
Toshihiro Shimizu 890ddd
			 bool blending)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	double pixelSize2 = tglGetPixelSize2();
Toshihiro Shimizu 890ddd
	// level e' la minore potenza di 2 maggiore di sqrt(pixelSize2)
Toshihiro Shimizu 890ddd
	unsigned int level = 1;
Toshihiro Shimizu 890ddd
	while (pixelSize2 * level * level <= 1.0)
Toshihiro Shimizu 890ddd
		level <<= 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	unsigned int texturesCount = (int)textures.size();
Toshihiro Shimizu 890ddd
	if (level > texturesCount)
Toshihiro Shimizu 890ddd
		level = texturesCount;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	level = texturesCount - level;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglDraw(rect, textures[level], blending);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDraw(const TRectD &rect, const TRaster32P &tex, bool blending)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	CHECK_ERRORS_BY_GL;
Toshihiro Shimizu 890ddd
	glPushAttrib(GL_ALL_ATTRIB_BITS);
Toshihiro Shimizu 890ddd
	if (blending) {
Toshihiro Shimizu 890ddd
		glEnable(GL_BLEND);
Toshihiro Shimizu 890ddd
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	unsigned int texWidth = 1;
Toshihiro Shimizu 890ddd
	unsigned int texHeight = 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (texWidth < (unsigned int)tex->getLx())
Toshihiro Shimizu 890ddd
		texWidth = texWidth << 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	while (texHeight < (unsigned int)tex->getLy())
Toshihiro Shimizu 890ddd
		texHeight = texHeight << 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double lwTex = 1.0;
Toshihiro Shimizu 890ddd
	double lhTex = 1.0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRaster32P texture;
Toshihiro Shimizu 890ddd
	unsigned int texLx = (unsigned int)tex->getLx();
Toshihiro Shimizu 890ddd
	unsigned int texLy = (unsigned int)tex->getLy();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	if (texWidth != texLx ||
Toshihiro Shimizu 890ddd
		texHeight != texLy) {
Toshihiro Shimizu 890ddd
		texture = TRaster32P(texWidth, texHeight);
Toshihiro Shimizu 890ddd
		texture->fill(TPixel32(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
		texture->copy(tex);
Toshihiro Shimizu 890ddd
		lwTex = (texLx) / (double)(texWidth);
Toshihiro Shimizu 890ddd
		lhTex = (texLy) / (double)(texHeight);
Toshihiro Shimizu 890ddd
		if (lwTex > 1.0)
Toshihiro Shimizu 890ddd
			lwTex = 1.0;
Toshihiro Shimizu 890ddd
		if (lhTex > 1.0)
Toshihiro Shimizu 890ddd
			lhTex = 1.0;
Toshihiro Shimizu 890ddd
	} else
Toshihiro Shimizu 890ddd
		texture = tex;
Toshihiro Shimizu 890ddd
	GLenum fmt =
Toshihiro Shimizu 890ddd
#ifdef TNZ_MACHINE_CHANNEL_ORDER_BGRM
Toshihiro Shimizu 890ddd
		GL_BGRA_EXT;
Toshihiro Shimizu 890ddd
#elif TNZ_MACHINE_CHANNEL_ORDER_MBGR
Toshihiro Shimizu 890ddd
		GL_ABGR_EXT;
Toshihiro Shimizu 890ddd
#elif TNZ_MACHINE_CHANNEL_ORDER_RGBM
Toshihiro Shimizu 890ddd
		GL_RGBA;
Toshihiro Shimizu 890ddd
#elif TNZ_MACHINE_CHANNEL_ORDER_MRGB
Toshihiro Shimizu 890ddd
		GL_BGRA;
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		@unknow channel order
Toshihiro Shimizu 890ddd
//   Error  PLATFORM NOT SUPPORTED
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Generate a texture id and bind it.
Toshihiro Shimizu 890ddd
	GLuint texId;
Toshihiro Shimizu 890ddd
	glGenTextures(1, &texId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glBindTexture(GL_TEXTURE_2D, texId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPixelStorei(GL_UNPACK_ROW_LENGTH, texture->getWrap());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	texture->lock();
Toshihiro Shimizu 890ddd
	glTexImage2D(GL_TEXTURE_2D,
Toshihiro Shimizu 890ddd
				 0,
Toshihiro Shimizu 890ddd
				 4,
Toshihiro Shimizu 890ddd
				 texWidth,
Toshihiro Shimizu 890ddd
				 texHeight,
Toshihiro Shimizu 890ddd
				 0,
Toshihiro Shimizu 890ddd
				 fmt,
Toshihiro Shimizu 890ddd
#ifdef TNZ_MACHINE_CHANNEL_ORDER_MRGB
Toshihiro Shimizu 890ddd
				 GL_UNSIGNED_INT_8_8_8_8_REV,
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
				 GL_UNSIGNED_BYTE,
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
				 texture->getRawData());
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
Toshihiro Shimizu 890ddd
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
Toshihiro Shimizu 890ddd
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
Toshihiro Shimizu 890ddd
	glEnable(GL_TEXTURE_2D);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	double rectLx = rect.getLx();
Toshihiro Shimizu 890ddd
	double rectLy = rect.getLy();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	tglColor(TPixel32(0, 0, 0, 0));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPushMatrix();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTranslated(rect.x0, rect.y0, 0.0);
Toshihiro Shimizu 890ddd
	glBegin(GL_POLYGON);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexCoord2d(0, 0);
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(0.0, 0.0));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexCoord2d(lwTex, 0);
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(rectLx, 0.0));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexCoord2d(lwTex, lhTex);
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(rectLx, rectLy));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glTexCoord2d(0, lhTex);
Toshihiro Shimizu 890ddd
	tglVertex(TPointD(0.0, rectLy));
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glEnd();
Toshihiro Shimizu 890ddd
	glDisable(GL_TEXTURE_2D);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	glPopMatrix();
Toshihiro Shimizu 890ddd
	glPopAttrib();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// Delete texture
Toshihiro Shimizu 890ddd
	glDeleteTextures(1, &texId);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	texture->unlock();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglBuildMipmaps(std::vector<traster32p> &rasters,</traster32p>
Toshihiro Shimizu 890ddd
					 const TFilePath &filepath)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	assert(rasters.size() > 0);
Toshihiro Shimizu 890ddd
	TRop::ResampleFilterType resampleFilter = TRop::ClosestPixel;
Toshihiro Shimizu 890ddd
	TRasterP ras;
Toshihiro Shimizu 890ddd
	TImageReader::load(filepath, ras);
Toshihiro Shimizu 890ddd
	int rasLx = ras->getLx();
Toshihiro Shimizu 890ddd
	int rasLy = ras->getLy();
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int lx = 1;
Toshihiro Shimizu 890ddd
	while (lx < rasLx)
Toshihiro Shimizu 890ddd
		lx <<= 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	int ly = 1;
Toshihiro Shimizu 890ddd
	while (ly < rasLy)
Toshihiro Shimizu 890ddd
		ly <<= 1;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	TRaster32P ras2(lx, ly);
Toshihiro Shimizu 890ddd
	double sx = (double)lx / (double)ras->getLx();
Toshihiro Shimizu 890ddd
	double sy = (double)ly / (double)ras->getLy();
Toshihiro Shimizu 890ddd
#ifndef SCALE_BY_GLU
Toshihiro Shimizu 890ddd
	TRop::resample(ras2, ras, TScale(sx, sy), resampleFilter);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
	ras->lock();
Toshihiro Shimizu 890ddd
	gluScaleImage(GL_RGBA, ras->getLx(), ras->getLy(), GL_UNSIGNED_BYTE, ras->getRawData(),
Toshihiro Shimizu 890ddd
				  lx, ly, GL_UNSIGNED_BYTE, ras2->getRawData());
Toshihiro Shimizu 890ddd
	ras->unlock();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	rasters[0] = ras2;
Toshihiro Shimizu 890ddd
	int ras2Lx = ras2->getLx();
Toshihiro Shimizu 890ddd
	int ras2Ly = ras2->getLy();
Toshihiro Shimizu 890ddd
	for (int i = 1; i < (int)rasters.size(); ++i) {
Toshihiro Shimizu 890ddd
		lx >>= 1;
Toshihiro Shimizu 890ddd
		ly >>= 1;
Toshihiro Shimizu 890ddd
		if (lx < 1)
Toshihiro Shimizu 890ddd
			lx = 1;
Toshihiro Shimizu 890ddd
		if (ly < 1)
Toshihiro Shimizu 890ddd
			ly = 1;
Toshihiro Shimizu 890ddd
		rasters[i] = TRaster32P(lx, ly);
Toshihiro Shimizu 890ddd
		sx = (double)lx / (double)ras2Lx;
Toshihiro Shimizu 890ddd
		sy = (double)ly / (double)ras2Ly;
Toshihiro Shimizu 890ddd
		rasters[i] = TRaster32P(lx, ly);
Toshihiro Shimizu 890ddd
#ifndef SCALE_BY_GLU
Toshihiro Shimizu 890ddd
		TRop::resample(rasters[i], ras2, TScale(sx, sy), resampleFilter);
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
		ras2->lock();
Toshihiro Shimizu 890ddd
		gluScaleImage(GL_RGBA, ras->getLx(), ras->getLy(), GL_UNSIGNED_BYTE, ras2->getRawData(),
Toshihiro Shimizu 890ddd
					  lx, ly, GL_UNSIGNED_BYTE, rasters[i]->getRawData());
Toshihiro Shimizu 890ddd
		ras2->unlock();
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//Forse si potrebbe togliere l'ifdef ed usare QT
Toshihiro Shimizu 890ddd
#if defined(WIN32)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TGlContext tglGetCurrentContext()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return std::make_pair(wglGetCurrentDC(), wglGetCurrentContext());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglMakeCurrent(TGlContext context)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	wglMakeCurrent(context.first, context.second);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDoneCurrent(TGlContext)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	wglMakeCurrent(NULL, NULL);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#elif defined(LINUX) || defined(__sgi) || defined(MACOSX)
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
TGlContext tglGetCurrentContext()
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	return reinterpret_cast<tglcontext>(</tglcontext>
Toshihiro Shimizu 890ddd
		const_cast<qglcontext *="">(QGLContext::currentContext()));</qglcontext>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	// (Daniele) I'm not sure why QGLContext::currentContext() returns
Toshihiro Shimizu 890ddd
	// const. I think it shouldn't, and guess (hope) this is safe...
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglMakeCurrent(TGlContext context)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (context)
Toshihiro Shimizu 890ddd
		reinterpret_cast<qglcontext *="">(context)->makeCurrent();</qglcontext>
Toshihiro Shimizu 890ddd
	else
Toshihiro Shimizu 890ddd
		tglDoneCurrent(tglGetCurrentContext());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
void tglDoneCurrent(TGlContext context)
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	if (context)
Toshihiro Shimizu 890ddd
		reinterpret_cast<qglcontext *="">(context)->doneCurrent();</qglcontext>
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#elif @unknow platform !
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
//  End Of File
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------