?? fractals.cxx
字號:
/* * draw and build display list for tree */void CreateTree(void){ srand48(TreeSeed); glNewList(TREE, GL_COMPILE); glPushMatrix(); glPushAttrib(GL_LIGHTING_BIT); glCallList(TREE_MAT); glTranslatef(0, -1, 0); FractalTree(0); glPopAttrib(); glPopMatrix(); glEndList(); } /* * new seed for a new tree (groan) */void NewTree(void){ TreeSeed = time(NULL);}/***************************************************************//*********************** FRACTAL PLANET ************************//***************************************************************/void CreateIsland(void){ cutoff = .06; CreateMountain(); cutoff = -1; glNewList(ISLAND, GL_COMPILE); glPushAttrib(GL_LIGHTING_BIT); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glCallList(WATER_MAT); glBegin(GL_QUADS); glNormal3f(0, 1, 0); glVertex3f(10, 0.01, 10); glVertex3f(10, 0.01, -10); glVertex3f(-10, 0.01, -10); glVertex3f(-10, 0.01, 10); glEnd(); glPushMatrix(); glTranslatef(0, -0.1, 0); glCallList(MOUNTAIN); glPopMatrix(); glPushMatrix(); glRotatef(135, 0, 1, 0); glTranslatef(0.2, -0.15, -0.4); glCallList(MOUNTAIN); glPopMatrix(); glPushMatrix(); glRotatef(-60, 0, 1, 0); glTranslatef(0.7, -0.07, 0.5); glCallList(MOUNTAIN); glPopMatrix(); glPushMatrix(); glRotatef(-175, 0, 1, 0); glTranslatef(-0.7, -0.05, -0.5); glCallList(MOUNTAIN); glPopMatrix(); glPushMatrix(); glRotatef(165, 0, 1, 0); glTranslatef(-0.9, -0.12, 0.0); glCallList(MOUNTAIN); glPopMatrix(); glPopMatrix(); glPopAttrib(); glEndList(); }void NewFractals(void){ NewMountain(); NewTree();}void Create(int fract){ switch(fract) { case MOUNTAIN: CreateMountain(); break; case TREE: CreateTree(); break; case ISLAND: CreateIsland(); break; }}/***************************************************************//**************************** OPENGL ***************************//***************************************************************/void SetupMaterials(void){ GLfloat mtn_ambuse[] = { 0.426, 0.256, 0.108, 1.0 }; GLfloat mtn_specular[] = { 0.394, 0.272, 0.167, 1.0 }; GLfloat mtn_shininess[] = { 10 }; GLfloat water_ambuse[] = { 0.0, 0.1, 0.5, 1.0 }; GLfloat water_specular[] = { 0.0, 0.1, 0.5, 1.0 }; GLfloat water_shininess[] = { 10 }; GLfloat tree_ambuse[] = { 0.4, 0.25, 0.1, 1.0 }; GLfloat tree_specular[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat tree_shininess[] = { 0 }; GLfloat leaf_ambuse[] = { 0.0, 0.8, 0.0, 1.0 }; GLfloat leaf_specular[] = { 0.0, 0.8, 0.0, 1.0 }; GLfloat leaf_shininess[] = { 10 }; glNewList(MOUNTAIN_MAT, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mtn_ambuse); glMaterialfv(GL_FRONT, GL_SPECULAR, mtn_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mtn_shininess); glEndList(); glNewList(WATER_MAT, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, water_ambuse); glMaterialfv(GL_FRONT, GL_SPECULAR, water_specular); glMaterialfv(GL_FRONT, GL_SHININESS, water_shininess); glEndList(); glNewList(TREE_MAT, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, tree_ambuse); glMaterialfv(GL_FRONT, GL_SPECULAR, tree_specular); glMaterialfv(GL_FRONT, GL_SHININESS, tree_shininess); glEndList(); glNewList(LEAF_MAT, GL_COMPILE); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, leaf_ambuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, leaf_specular); glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, leaf_shininess); glEndList();}void myGLInit(void){ GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat light_position[] = { 0.0, 0.3, 0.3, 0.0 }; GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 }; 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); glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE);#if 0 glEnable(GL_CULL_FACE); glCullFace(GL_BACK);#endif glShadeModel(GL_SMOOTH);#if 0 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);#endif SetupMaterials(); CreateTreeLists(); glFlush();} /***************************************************************//************************ GLUT STUFF ***************************//***************************************************************/void reshape(int w, int h){ glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(60.0, (GLdouble)w/h, 0.01, 100); glPushMatrix(); glMatrixMode(GL_MODELVIEW); glFlush();}void display(void){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glFlush(); glMatrixMode(GL_PROJECTION); glPopMatrix(); glPushMatrix(); /* clear of last viewing xform, leaving perspective */ agvViewTransform(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); if (Rebuild) { Create(Fract); Rebuild = 0; } glCallList(Fract); if (DrawAxes) glCallList(AXES); glutSwapBuffers(); glFlush();}void visible(int v){ if (v == GLUT_VISIBLE) agvSetAllowIdle(1); else { glutIdleFunc(NULL); agvSetAllowIdle(0); }}void menuuse(int v){ if (v == GLUT_MENU_NOT_IN_USE) agvSetAllowIdle(1); else { glutIdleFunc(NULL); agvSetAllowIdle(0); }}/***************************************************************//******************* MENU SETUP & HANDLING *********************//***************************************************************/typedef enum { MENU_QUIT, MENU_RAND, MENU_MOVE, MENU_AXES } MenuChoices;void setlevel(int value){ Level = value; Rebuild = 1; glutPostRedisplay();}void choosefract(int value){ Fract = value; Rebuild = 1; glutPostRedisplay();}void handlemenu(int value){ switch (value) { case MENU_QUIT: exit(0); break; case MENU_RAND: NewFractals(); Rebuild = 1; glutPostRedisplay(); break; case MENU_AXES: DrawAxes = !DrawAxes; glutPostRedisplay(); break; }}void MenuInit(void){ int submenu3, submenu2, submenu1; submenu1 = glutCreateMenu(setlevel); glutAddMenuEntry("0", 0); glutAddMenuEntry("1", 1); glutAddMenuEntry("2", 2); glutAddMenuEntry("3", 3); glutAddMenuEntry("4", 4); glutAddMenuEntry("5", 5); glutAddMenuEntry("6", 6); glutAddMenuEntry("7", 7); glutAddMenuEntry("8", 8); submenu2 = glutCreateMenu(choosefract); glutAddMenuEntry("Moutain", MOUNTAIN); glutAddMenuEntry("Tree", TREE); glutAddMenuEntry("Island", ISLAND); submenu3 = glutCreateMenu(agvSwitchMoveMode); glutAddMenuEntry("Flying", FLYING); glutAddMenuEntry("Polar", POLAR); glutCreateMenu(handlemenu); glutAddSubMenu("Level", submenu1); glutAddSubMenu("Fractal", submenu2); glutAddSubMenu("Movement", submenu3); glutAddMenuEntry("New Fractal", MENU_RAND); glutAddMenuEntry("Toggle Axes", MENU_AXES); glutAddMenuEntry("Quit", MENU_QUIT); glutAttachMenu(GLUT_RIGHT_BUTTON);}/***************************************************************//**************************** MAIN *****************************//***************************************************************/// fltk-style callbacks to Glut menu callback translators:void setlevel(Fl_Widget*, void *value) {setlevel(long(value));}void choosefract(Fl_Widget*, void *value) {choosefract(long(value));}void handlemenu(Fl_Widget*, void *value) {handlemenu(long(value));}#include <FL/Fl_Button.H>#include <FL/Fl_Group.H>#include <FL/Fl_Window.H>int main(int argc, char** argv){// glutInit(&argc, argv); // this line removed for fltk // create fltk window: Fl_Window window(512+20, 512+100); window.resizable(window); // create a bunch of buttons: Fl_Group *g = new Fl_Group(110,50,400-110,30,"Level:"); g->align(FL_ALIGN_LEFT); g->begin(); Fl_Button *b; b = new Fl_Button(110,50,30,30,"0"); b->callback(setlevel,(void*)0); b = new Fl_Button(140,50,30,30,"1"); b->callback(setlevel,(void*)1); b = new Fl_Button(170,50,30,30,"2"); b->callback(setlevel,(void*)2); b = new Fl_Button(200,50,30,30,"3"); b->callback(setlevel,(void*)3); b = new Fl_Button(230,50,30,30,"4"); b->callback(setlevel,(void*)4); b = new Fl_Button(260,50,30,30,"5"); b->callback(setlevel,(void*)5); b = new Fl_Button(290,50,30,30,"6"); b->callback(setlevel,(void*)6); b = new Fl_Button(320,50,30,30,"7"); b->callback(setlevel,(void*)7); b = new Fl_Button(350,50,30,30,"8"); b->callback(setlevel,(void*)8); g->end(); b = new Fl_Button(400,50,100,30,"New Fractal"); b->callback(handlemenu,(void*)MENU_RAND); b = new Fl_Button( 10,10,100,30,"Mountain"); b->callback(choosefract,(void*)MOUNTAIN); b = new Fl_Button(110,10,100,30,"Tree"); b->callback(choosefract,(void*)TREE); b = new Fl_Button(210,10,100,30,"Island"); b->callback(choosefract,(void*)ISLAND); b = new Fl_Button(400,10,100,30,"Quit"); b->callback(handlemenu,(void*)MENU_QUIT); window.show(argc,argv); // glut will die unless parent window visible window.begin(); // this will cause Glut window to be a child glutInitWindowSize(512, 512); glutInitWindowPosition(10,90); // place it inside parent window glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_MULTISAMPLE); glutCreateWindow("Fractal Planet?"); window.end(); window.resizable(glut_window); agvInit(1); /* 1 cause we don't have our own idle */ glutReshapeFunc(reshape); glutDisplayFunc(display); glutVisibilityFunc(visible); glutMenuStateFunc(menuuse); NewFractals(); agvMakeAxesList(AXES); myGLInit(); MenuInit(); glutMainLoop(); // you could use Fl::run() instead return 0;}#endif//// End of "$Id: fractals.cxx,v 1.1.1.1 2003/08/07 21:18:42 jasonk Exp $".//
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -