📄 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);
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);
//
// Use glFinish() instead of glFlush() to avoid getting many frames
// ahead of the display (problem with some Linux OpenGL implementations...)
//
glFinish();
}
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/06/03 22:25:47 agno Exp $".
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -