📄 example2.cpp
字号:
/****************************************************************************
example2.cpp
A simple GLUT program using the GLUI User Interface Library
-----------------------------------------------------------------------
9/9/98 Paul Rademacher (rademach@cs.unc.edu)
****************************************************************************/
#include <string.h>
#include <GL/glut.h>
#include "glui.h"
float xy_aspect;
int last_x, last_y;
float rotationX = 0.0, rotationY = 0.0;
int main_window;
/** These are the live variables passed into GLUI ***/
int wireframe = 0;
int obj = 0;
int segments = 8;
char text[200] = {"Hello World!"};
GLUI_Checkbox *checkbox;
GLUI_Spinner *spinner;
GLUI_RadioGroup *radio;
GLUI_EditText *edittext;
/**************************************** control_cb() *******************/
/* GLUI control callback */
void control_cb( int control )
{
/********************************************************************
Here we'll print the user id of the control that generated the
callback, and we'll also explicitly get the values of each control.
Note that we really didn't have to explicitly get the values, since
they are already all contained within the live variables:
'wireframe', 'segments', 'obj', and 'text'
********************************************************************/
printf( "callback: %d\n", control );
printf( " checkbox: %d\n", checkbox->get_int_val() );
printf( " spinner: %d\n", spinner->get_int_val() );
printf( " radio group: %d\n", radio->get_int_val() );
printf( " text: %s\n", edittext->get_text() );
}
/**************************************** myGlutKeyboard() **********/
void myGlutKeyboard(unsigned char Key, int x, int y)
{
switch(Key)
{
case 27:
case 'q':
exit(0);
break;
};
glutPostRedisplay();
}
/***************************************** myGlutMenu() ***********/
void myGlutMenu( int value )
{
myGlutKeyboard( value, 0, 0 );
}
/***************************************** myGlutIdle() ***********/
void myGlutIdle( void )
{
/* According to the GLUT specification, the current window is
undefined during an idle callback. So we need to explicitly change
it if necessary */
if ( glutGetWindow() != main_window)
glutSetWindow(main_window);
glutPostRedisplay();
}
/***************************************** myGlutMouse() **********/
void myGlutMouse(int button, int button_state, int x, int y )
{
if ( button == GLUT_LEFT_BUTTON && button_state == GLUT_DOWN ) {
last_x = x;
last_y = y;
}
}
/***************************************** myGlutMotion() **********/
void myGlutMotion(int x, int y )
{
rotationX += (float) (y - last_y);
rotationY += (float) (x - last_x);
last_x = x;
last_y = y;
glutPostRedisplay();
}
/**************************************** myGlutReshape() *************/
void myGlutReshape( int x, int y )
{
xy_aspect = (float)x / (float)y;
glViewport( 0, 0, x, y );
glutPostRedisplay();
}
/***************************************** myGlutDisplay() *****************/
void myGlutDisplay( void )
{
glClearColor( .9f, .9f, .9f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glFrustum( -xy_aspect*.08, xy_aspect*.08, -.08, .08, .1, 15.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glTranslatef( 0.0f, 0.0f, -1.6f );
glRotatef( rotationY, 0.0, 1.0, 0.0 );
glRotatef( rotationX, 1.0, 0.0, 0.0 );
/*** Now we render object, using the variables 'obj', 'segments', and
'wireframe'. These are _live_ variables, which are transparently
updated by GLUI ***/
if ( obj == 0 ) {
if ( wireframe )
glutWireSphere( .6, segments, segments );
else
glutSolidSphere( .6, segments, segments );
}
else if ( obj == 1 ) {
if ( wireframe )
glutWireTorus( .2,.5,16,segments );
else
glutSolidTorus( .2,.5,16,segments );
}
glDisable( GL_LIGHTING ); /* Disable lighting while we render text */
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluOrtho2D( 0.0, 100.0, 0.0, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glColor3ub( 0, 0, 0 );
glRasterPos2i( 10, 10 );
// printf( "text: %s\n", text );
/*** Render the live character array 'text' ***/
int i;
for( i=0; i<(int)strlen( text ); i++ )
glutBitmapCharacter( GLUT_BITMAP_HELVETICA_18, text[i] );
glEnable( GL_LIGHTING );
glutSwapBuffers();
}
/**************************************** main() ********************/
void main(int argc, char* argv[])
{
/****************************************/
/* Initialize GLUT and create window */
/****************************************/
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
glutInitWindowPosition( 50, 50 );
glutInitWindowSize( 300, 300 );
main_window = glutCreateWindow( "GLUI Example 2" );
glutDisplayFunc( myGlutDisplay );
glutReshapeFunc( myGlutReshape );
glutKeyboardFunc( myGlutKeyboard );
glutMotionFunc( myGlutMotion );
glutMouseFunc( myGlutMouse );
/****************************************/
/* Set up OpenGL lights */
/****************************************/
GLfloat light0_ambient[] = {0.1f, 0.1f, 0.3f, 1.0f};
GLfloat light0_diffuse[] = {.6f, .6f, 1.0f, 1.0f};
GLfloat light0_position[] = {1.0f, 1.0f, 1.0f, 0.0f};
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
/****************************************/
/* Enable z-buferring */
/****************************************/
glEnable(GL_DEPTH_TEST);
/****************************************/
/* Here's the GLUI code */
/****************************************/
GLUI *glui = GLUI_Master.create_glui( "GLUI", 0, 400, 50 ); /* name, flags,
x, and y */
glui->add_statictext( "GLUI Example 2" );
glui->add_separator();
checkbox = glui->add_checkbox( "Wireframe", &wireframe, 1, control_cb );
spinner = glui->add_spinner( "Segments:",GLUI_SPINNER_INT, &segments,
2, control_cb );
spinner->set_int_limits( 3, 60 );
edittext = glui->add_edittext( "Text:", GLUI_EDITTEXT_TEXT, text,
3, control_cb );
GLUI_Panel *obj_panel = glui->add_panel( "Object Type" );
radio = glui->add_radiogroup_to_panel(obj_panel,&obj,4,control_cb);
glui->add_radiobutton_to_group( radio, "Sphere" );
glui->add_radiobutton_to_group( radio, "Torus" );
glui->add_button( "Quit", 0,(GLUI_Update_CB)exit );
glui->set_main_gfx_window( main_window );
/* We register the idle callback with GLUI, *not* with GLUT */
GLUI_Master.set_glutIdleFunc( myGlutIdle );
glutMainLoop();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -