Files
bullet3/Extras/CUDA/paramgl.cpp
2008-09-04 23:24:11 +00:00

210 lines
4.9 KiB
C++

/*
ParamListGL
- class derived from ParamList to do simple OpenGL rendering of a parameter list
sgg 8/2001
*/
#include <param.h>
#include <paramgl.h>
void beginWinCoords(void)
{
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslatef(0.0, glutGet(GLUT_WINDOW_HEIGHT) - 1, 0.0);
glScalef(1.0, -1.0, 1.0);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), 0, glutGet(GLUT_WINDOW_HEIGHT), -1, 1);
glMatrixMode(GL_MODELVIEW);
}
void endWinCoords(void)
{
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
}
void glPrint(int x, int y, const char *s, void *font)
{
int i, len;
glRasterPos2f(x, y);
len = (int) strlen(s);
for (i = 0; i < len; i++) {
glutBitmapCharacter(font, s[i]);
}
}
void glPrintShadowed(int x, int y, const char *s, void *font, float *color)
{
glColor3f(0.0, 0.0, 0.0);
glPrint(x-1, y-1, s, font);
glColor3fv((GLfloat *) color);
glPrint(x, y, s, font);
}
ParamListGL::ParamListGL(char *name) : ParamList(name)
{
font = (void *) GLUT_BITMAP_9_BY_15;
// font = (void *) GLUT_BITMAP_8_BY_13;
bar_x = 250;
bar_w = 250;
bar_h = 10;
bar_offset = 5;
text_x = 5;
separation = 15;
value_x = 200;
font_h = 15;
start_x = 0;
start_y = 0;
text_col_selected[0] = 1.0;
text_col_selected[1] = 1.0;
text_col_selected[2] = 1.0;
text_col_unselected[0] = 0.75;
text_col_unselected[1] = 0.75;
text_col_unselected[2] = 0.75;
bar_col_outer[0] = 0.0;
bar_col_outer[1] = 0.0;
bar_col_outer[2] = 0.0;
bar_col_inner[0] = 0.0;
bar_col_inner[1] = 0.0;
bar_col_inner[2] = 0.0;
text_col_shadow[0] = 0.0;
text_col_shadow[1] = 0.0;
text_col_shadow[2] = 0.0;
}
void
ParamListGL::Render(int x, int y, bool shadow)
{
beginWinCoords();
start_x = x; start_y = y;
for(std::vector<ParamBase *>::const_iterator p = m_params.begin(); p != m_params.end(); ++p) {
if ((*p)->IsList()) {
ParamListGL *list = (ParamListGL *) (*p);
list->Render(x+10, y);
y += separation*list->GetSize();
} else {
if (p == m_current)
glColor3fv(text_col_selected);
else
glColor3fv(text_col_unselected);
if (shadow) {
glPrintShadowed(x + text_x, y + font_h, (*p)->GetName()->c_str(), font, (p == m_current) ? text_col_selected : text_col_unselected);
glPrintShadowed(x + value_x, y + font_h, (*p)->GetValueString().c_str(), font, (p == m_current) ? text_col_selected : text_col_unselected);
}
else {
glPrint(x + text_x, y + font_h, (*p)->GetName()->c_str(), font);
glPrint(x + value_x, y + font_h, (*p)->GetValueString().c_str(), font);
}
// glColor3fv((GLfloat *) &bar_col_outer);
glBegin(GL_LINE_LOOP);
glVertex2f(x + bar_x, y + bar_offset);
glVertex2f(x + bar_x + bar_w, y + bar_offset);
glVertex2f(x + bar_x + bar_w, y + bar_offset + bar_h);
glVertex2f(x + bar_x, y + bar_offset + bar_h);
glEnd();
// glColor3fv((GLfloat *) &bar_col_inner);
glRectf(x + bar_x, y + bar_offset + bar_h, x + bar_x + (bar_w*(*p)->GetPercentage()), y + bar_offset);
y += separation;
}
}
endWinCoords();
}
bool
ParamListGL::Mouse(int x, int y, int button, int state)
{
if ((y < start_y) || (y > (int)(start_y + (separation * m_params.size()) - 1)))
return false;
int i = (y - start_y) / separation;
if ((button==GLUT_LEFT_BUTTON) && (state==GLUT_DOWN)) {
#if defined(__GNUC__) && (__GNUC__ < 3)
m_current = &m_params[i];
#else
// MJH: workaround since the version of vector::at used here is non-standard
for (m_current = m_params.begin(); m_current != m_params.end() && i > 0; m_current++, i--);
//m_current = (std::vector<ParamBase *>::const_iterator)&m_params.at(i);
#endif
if ((x > bar_x) && (x < bar_x + bar_w)) {
Motion(x, y);
}
}
return true;
}
bool
ParamListGL::Motion(int x, int y)
{
if ((y < start_y) || (y > start_y + (separation * (int)m_params.size()) - 1) )
return false;
if (x < bar_x) {
(*m_current)->SetPercentage(0.0);
return true;
}
if (x > bar_x + bar_w) {
(*m_current)->SetPercentage(1.0);
return true;
}
(*m_current)->SetPercentage((x-bar_x) / (float) bar_w);
return true;
}
void
ParamListGL::Special(int key, int /*x*/, int /*y*/)
{
switch(key) {
case GLUT_KEY_DOWN:
Increment();
break;
case GLUT_KEY_UP:
Decrement();
break;
case GLUT_KEY_RIGHT:
GetCurrent()->Increment();
break;
case GLUT_KEY_LEFT:
GetCurrent()->Decrement();
break;
case GLUT_KEY_HOME:
GetCurrent()->Reset();
break;
case GLUT_KEY_END:
GetCurrent()->SetPercentage(1.0);
break;
}
glutPostRedisplay();
}