📄 program.cpp
字号:
/*
* Copyright (c) 2008 Lauming chen, Soochow University.
* All right reserved.
*
*
*/
#ifdef WIN32
#include <windows.h>
#endif
#include <iostream>
#include <GL/glut.h> /* Header File For The GLUT Library */
#include <GL/gl.h> /* Header File For The OpenGL32 Library */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "global.h"
#include "MyTree.h"
#define LIGHTING_MENU_ITEM 0x01
#define TEXTURE_MENU_ITEM 0x02
#define LAND_MENU_ITEM 0x03
#define SKY_MENU_ITEM 0x04
#define ENGLISH_MENU_ITEM 0x11
#define CHINESE_SIMPLE_MENU_ITEM 0x12
#define CHINESE_TRADITION_MENU_ITEM 0x13
#define ESCAPE 27 /* ascii code for the escape key */
#define SPACE 32 /* ascii code for the space key */
int isFullScreen = 0;
int isDrawLand = 1;
int isDrawSky = 1;
int startX = 0, startY = 0, endX = 0, endY = 0;
float rotateX = 0, rotateY = 0;
float translateX = 0.0f, translateY = 0.0f, translateZ = 0.0f;
float changeStep = 0.0f;
int mouseButtons[5] = { GLUT_UP, GLUT_UP, GLUT_UP, GLUT_UP, GLUT_UP };
void createMenus();
int totalNode = 0;
void initParameter( void ) {
setWindowSize( 0, 0, 800, 600 );
isFullScreen = 0;
translateZ = -12.0f;
changeStep = 0.1f;
window.left = ( glutGet( GLUT_SCREEN_WIDTH ) - window.width ) / 2;
window.top = ( glutGet( GLUT_SCREEN_HEIGHT ) - window.height ) / 2;
}
void initGL() {
float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
float light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
float light_position[] = { 1.0, 1.0, 1.0, 0.0 };
glShadeModel( GL_SMOOTH );
glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClearDepth( 1.0f );
glEnable( GL_TEXTURE_2D ); /* Enable Texture Mapping */
glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); /* Pixel Storage Mode To Byte Alignment */
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
glLightfv( GL_LIGHT0, GL_AMBIENT, light_ambient );
glLightfv( GL_LIGHT0, GL_DIFFUSE, light_diffuse );
glLightfv( GL_LIGHT0, GL_SPECULAR, light_specular );
glLightfv( GL_LIGHT0, GL_POSITION, light_position );
glEnable( GL_LIGHTING );
glEnable( GL_LIGHT0 );
glEnable( GL_COLOR_MATERIAL );
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
//glEnable(GL_LINE_SMOOTH); // 启用反走样
}
void display( void ) {
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glTranslatef( 0.0f, -4.0f, 0.0f );
glTranslatef( translateX, translateY, translateZ );
glRotatef( rotateY, 1.0f, 0.0f, 0.0f );
glRotatef( rotateX, 0.0f, 1.0f, 0.0f );
//if ( isDrawSky == 1 ) {
// drawSky( textrue.sky );
//}
//if ( isDrawLand == 1 ) {
// drawLand( 50.0f, textrue.ground );
//}
// drawMyTree( textrue.bark, textrue.leaf );
//Branch br = Branch( 10, 1.0f, 70.0f, 25.0f, 0.1f, "bark.bmp" );
MyTree tr = MyTree( 11, 1.0f, 0.1f );
tr.draw();
//br.draw();
glutSwapBuffers();
}
void reshape( int width, int height ) {
if ( height == 0 ) {
height = 1;
}
glViewport( 0, 0 , width, height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0f, ( GLfloat )width / ( GLfloat )height, 0.1f, 100.0f );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void mouseMove( int x, int y ) {
if ( mouseButtons[ GLUT_LEFT_BUTTON ] == GLUT_DOWN ) {
rotateX = x - startX;
rotateY = y - startY;
}
}
void mouse( int button, int state, int x, int y ) {
mouseButtons[ button ] = state;
switch( button )
{
case GLUT_LEFT_BUTTON :
if ( state == GLUT_DOWN ) {
startX = x - rotateX;
startY = y - rotateY;
}
break;
case GLUT_MIDDLE_BUTTON :
if ( state == GLUT_DOWN ) {
}
break;
case GLUT_RIGHT_BUTTON :
if ( state == GLUT_DOWN ) {
//
}
break;
default:
break;
}
}
void keyboard( unsigned char key, int x, int y ) {
switch ( key ) {
case ESCAPE:
break;
case SPACE :
break;
case 'w' :
case 'W' :
translateZ += 0.1;
break;
case 's' :
case 'S' :
translateZ -= 0.1;
break;
case 'a' :
case 'A' :
rotateX += 3;
break;
case 'd' :
case 'D' :
rotateX -= 3;
break;
case 'l' :
case 'L' :
if ( glIsEnabled( GL_LIGHTING ) == GL_FALSE ) {
glEnable( GL_LIGHTING );
} else {
glDisable( GL_LIGHTING );
}
break;
case 't' :
case 'T' :
if ( glIsEnabled( GL_TEXTURE_2D ) == GL_FALSE ) {
glEnable( GL_TEXTURE_2D );
} else {
glDisable( GL_TEXTURE_2D );
}
break;
default:
break;
}
}
void special_keys( int a_keys, int x, int y ) {
switch ( a_keys ) {
case GLUT_KEY_F1 :
isFullScreen = !isFullScreen;
if ( isFullScreen ) {
window.left = glutGet( GLUT_WINDOW_X );
window.top = glutGet( GLUT_WINDOW_Y );
window.width = glutGet( GLUT_WINDOW_WIDTH );
window.height = glutGet( GLUT_WINDOW_HEIGHT );
glutFullScreen();
} else {
glutReshapeWindow( window.width, window.height );
glutPositionWindow( window.left, window.top );
}
break;
case GLUT_KEY_UP :
translateY -= changeStep;
break;
case GLUT_KEY_DOWN :
translateY += changeStep;
break;
case GLUT_KEY_LEFT :
translateX += changeStep;
break;
case GLUT_KEY_RIGHT :
translateX -= changeStep;
break;
default:
break;
}
}
void setFullScreen( int isFullScreen ) {
if ( isFullScreen != 0 ) {
glutFullScreen();
} else {
glutInitWindowSize( window.width, window.height );
glutInitWindowPosition( window.left, window.top );
}
}
void processMenuEvents( int option ) {
switch ( option ) {
case LIGHTING_MENU_ITEM :
if ( glIsEnabled( GL_LIGHTING ) == GL_FALSE ) {
glEnable( GL_LIGHTING );
} else {
glDisable( GL_LIGHTING );
}
break;
case TEXTURE_MENU_ITEM :
if ( glIsEnabled( GL_TEXTURE_2D ) == GL_FALSE ) {
glEnable( GL_TEXTURE_2D );
} else {
glDisable( GL_TEXTURE_2D );
}
break;
case LAND_MENU_ITEM :
isDrawLand = -isDrawLand;
break;
case SKY_MENU_ITEM :
isDrawSky = -isDrawSky;
break;
case ENGLISH_MENU_ITEM :
createMenus();
break;
case CHINESE_SIMPLE_MENU_ITEM :
createMenus();
break;
case CHINESE_TRADITION_MENU_ITEM :
createMenus();
break;
default:
break;
}
}
int mainMenu = 0, langugeMenu = 0;
void createSubMenus( void ) {
langugeMenu = glutCreateMenu( processMenuEvents );
glutAddMenuEntry( "English", ENGLISH_MENU_ITEM );
glutAddMenuEntry( "简体中文", CHINESE_SIMPLE_MENU_ITEM );
glutAddMenuEntry( "繁體中文", CHINESE_TRADITION_MENU_ITEM );
}
void createMenus( void ) {
createSubMenus();
mainMenu = glutCreateMenu( processMenuEvents );
glutAddMenuEntry( language.lightingMenuItem, LIGHTING_MENU_ITEM );
glutAddMenuEntry( language.textureMenuItem, TEXTURE_MENU_ITEM );
glutAddMenuEntry( language.landMenuItem, LAND_MENU_ITEM );
glutAddMenuEntry( language.skyMenuItem, SKY_MENU_ITEM );
glutAddSubMenu( language.langugeMenu, langugeMenu );
glutAttachMenu( GLUT_RIGHT_BUTTON );
}
int main( int argc, char** argv ) {
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_DEPTH | GLUT_RGBA | GLUT_DOUBLE );
initParameter();
setFullScreen( isFullScreen );
glutCreateWindow( "3D-MyTree" );
initGL();
glutDisplayFunc( display );
glutIdleFunc( display );
glutReshapeFunc( reshape );
glutKeyboardFunc( keyboard );
glutSpecialFunc( special_keys );
glutMouseFunc( mouse );
glutMotionFunc( mouseMove );
createMenus();
glutMainLoop();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -