Annotation of OpenXM/src/cfep/glicosa.c, Revision 1.1
1.1 ! takayama 1: #include <stdio.h>
! 2: #include <math.h>
! 3: #include "myenv.h"
! 4: #include "mygl.h"
! 5:
! 6: #ifdef COCOA
! 7: #import <OpenGL/OpenGL.h>
! 8: #import <OpenGL/gl.h>
! 9: #import <OpenGL/glu.h>
! 10: #else
! 11: #include <GL/gl.h>
! 12: #include <GL/glu.h>
! 13: #include <GL/glut.h>
! 14: #endif
! 15:
! 16:
! 17: #ifdef MYTEST
! 18: main(int argc,char **argv) {
! 19: test_main(argc,argv);
! 20: }
! 21: void ourDisplay() {
! 22: glib3_std_scene0(0.0, 0.0, 3.0);
! 23: glib3_icosahedron(0.0, 0.0, -3.0, 1.0);
! 24: printf("ourDisplay is called.\n");
! 25: }
! 26: int test_main(int argc,char **argv) {
! 27: glutInit(&argc, argv);
! 28: glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
! 29: glutInitWindowSize(400,400);
! 30: glutInitWindowPosition(100,100);
! 31: glutCreateWindow("glicosahedron");
! 32:
! 33: glib3_std_scene0(0.0, 0.0, 3.0);
! 34: glutDisplayFunc(ourDisplay);
! 35: glutReshapeFunc(ourDisplay);
! 36: glutMainLoop();
! 37: return 0;
! 38: }
! 39: #endif
! 40:
! 41: void glib3_std_scene0_aux(int frustum, int usebox,
! 42: float xnear, float ynear, float znear,
! 43: float left,float right,float bottom,float top,float near,float far) {
! 44: GLfloat light_position0[] = { 10.0, 10.0, 10.0, 1.0 };
! 45: GLfloat light_position1[] = { -10.0, 10.0, 10.0, 1.0 };
! 46: GLfloat ambient[] = { 0.2, 0.2, 0.2, 1.0 };
! 47: GLfloat diffuse[] = { 0.1, 0.8, 0.8, 1.0 };
! 48: GLfloat specular[] = { 0.9, 0.9, 0.9, 1.0 };
! 49: GLfloat shininess[] = { 70.0 };
! 50: GLfloat std_light_param0[] = { 1.0, 1.0, 1.0, 1.0 };
! 51: GLfloat std_light_param[] = { 0.5, 0.5, 0.5, 1.0 };
! 52:
! 53: glShadeModel(GL_SMOOTH); // GL_SMOOTH or GL_FLAT
! 54: glDepthFunc(GL_LEQUAL);
! 55: glEnable(GL_DEPTH_TEST);
! 56:
! 57: glClearColor(1.0, 1.0, 1.0, 1.0);
! 58: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
! 59: glMatrixMode(GL_PROJECTION);
! 60: glLoadIdentity();
! 61: if (frustum) {
! 62: if (znear >= 2.0) gluPerspective(40.0,1.0,1.0,200.0);
! 63: else gluPerspective(40.0,1.0,znear/2,20.0);
! 64: }else{
! 65: glOrtho(left,right,bottom,top,near,far);
! 66: }
! 67:
! 68: glMatrixMode(GL_MODELVIEW);
! 69: glLoadIdentity();
! 70: gluLookAt(xnear,ynear,znear,0.0,0.0,0.0,0.0,1.0,0.0);
! 71:
! 72:
! 73: glLightfv( GL_LIGHT0, GL_AMBIENT, ambient );
! 74: /* glLightfv( GL_LIGHT0, GL_AMBIENT, std_light_param ); */
! 75: glLightfv( GL_LIGHT0, GL_DIFFUSE, std_light_param );
! 76: glLightfv( GL_LIGHT0, GL_SPECULAR, std_light_param );
! 77: glLightfv( GL_LIGHT0, GL_POSITION, light_position0 );
! 78:
! 79: glLightfv( GL_LIGHT1, GL_DIFFUSE, std_light_param );
! 80: glLightfv( GL_LIGHT1, GL_SPECULAR, std_light_param );
! 81:
! 82: glLightfv( GL_LIGHT1, GL_POSITION, light_position1 );
! 83: glMaterialfv( GL_FRONT, GL_DIFFUSE, diffuse );
! 84: glMaterialfv( GL_FRONT, GL_SPECULAR, specular );
! 85: glMaterialfv( GL_FRONT, GL_SHININESS, shininess );
! 86:
! 87: glEnable( GL_LIGHTING );
! 88: glEnable( GL_LIGHT0 );
! 89: glEnable( GL_LIGHT1 );
! 90:
! 91: glEnable(GL_COLOR_MATERIAL);
! 92:
! 93: if (usebox > 0) glib3_bounding_box((float) usebox);
! 94:
! 95: }
! 96: void glib3_std_scene0(float xnear, float ynear, float znear) {
! 97: glib3_std_scene0_aux(1,0,xnear, ynear, znear, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
! 98: }
! 99: void glib3_std_scene0_ortho(float xnear, float ynear,float znear,float size) {
! 100: glib3_std_scene0_aux(0,0, xnear, ynear, znear,
! 101: (-1.0+xnear)*size, (1.0+xnear)*size,
! 102: (-1.0+ynear)*size, (1.0+ynear)*size, -100.0*size, 100.0*size);
! 103: }
! 104:
! 105: #define X 0.525731112119133606
! 106: #define Z 0.850650808352039932
! 107: static void normalize(float v[3]) {
! 108: float norm;
! 109: norm = sqrt((double) (v[0]*v[0]+v[1]*v[1]+v[2]*v[2]));
! 110: if (norm > 0.0) {
! 111: v[0] = v[0]/norm;
! 112: v[1] = v[1]/norm;
! 113: v[2] = v[2]/norm;
! 114: }
! 115: }
! 116: static void outerProd(float v1[3], float v2[3], float ans[3]) {
! 117: ans[0] = v1[1]*v2[2]-v1[2]*v2[1];
! 118: ans[1] = v1[2]*v2[0]-v1[0]*v2[2];
! 119: ans[2] = v1[0]*v2[1]-v1[1]*v2[0];
! 120: normalize(ans);
! 121: }
! 122: static int icosaFace[20][3] = {
! 123: {0,4,1},{0,9,4}, {9,5,4},{4,5,8}, {4,8,1},
! 124: {8,10,1}, {8,3,10}, {5,3,8}, {5,2,3}, {2,7,3},
! 125: {7,10,3}, {7,6,10}, {7,11,6}, {11,0,6}, {0,1,6},
! 126: {6,1,10},{9,0,11}, {9,11,2}, {9,2,5}, {7,2,11}
! 127: };
! 128: void glib3_icosahedron(float x,float y,float z, float size) {
! 129: float vv[12][3];
! 130: int i,j;
! 131: float e1[3], e2[3], normal[3];
! 132: static int nnn=0;
! 133: nnn++; if (nnn > 20) nnn=1;
! 134: for (i=0; i<12; i++) {vv[i][0] = x; vv[i][1] = y; vv[i][2] = z; }
! 135: vv[0][0] += -X*size, vv[0][1] += 0.0; vv[0][2] += Z*size;
! 136: vv[1][0] += X*size, vv[1][1] += 0.0; vv[1][2] += Z*size;
! 137: vv[2][0] += -X*size, vv[2][1] += 0.0; vv[2][2] += -Z*size;
! 138: vv[3][0] += X*size, vv[3][1] += 0.0; vv[3][2] += -Z*size;
! 139: vv[4][0] += 0.0, vv[4][1] += Z*size; vv[4][2] += X*size;
! 140: vv[5][0] += 0.0, vv[5][1] += Z*size; vv[5][2] += -X*size;
! 141: vv[6][0] += 0.0, vv[6][1] += -Z*size; vv[6][2] += X*size;
! 142: vv[7][0] += 0.0, vv[7][1] += -Z*size; vv[7][2] += -X*size;
! 143: vv[8][0] += Z*size, vv[8][1] += X*size; vv[8][2] += 0.0;
! 144: vv[9][0] += -Z*size, vv[9][1] += X*size; vv[9][2] += 0.0;
! 145: vv[10][0] += Z*size, vv[10][1] += -X*size; vv[10][2] += 0.0;
! 146: vv[11][0] += -Z*size, vv[11][1] += -X*size; vv[11][2] += 0.0;
! 147:
! 148: // glMaterialf(GL_FRONT,GL_SHININESS,80.0);
! 149: glColor3f(1.0,0.0,0.0);
! 150: // glEnable(GL_AUTO_NORMAL);
! 151: for (i=0; i<20; i++) { // use 20 or use "nnn"
! 152: if (i%3 == 0) glColor3f(1.0,0.0,0.0);
! 153: else if (i%3 == 1) glColor3f((i%10)/10.0,1.0,0.0);
! 154: else glColor3f((i%10)/10.0, 0.0, 1.0);
! 155: for (j=0; j<3; j++) {
! 156: e1[j] = vv[icosaFace[i][0]][j] - vv[icosaFace[i][1]][j];
! 157: e2[j] = vv[icosaFace[i][1]][j] - vv[icosaFace[i][2]][j];
! 158: }
! 159: outerProd(e1,e2,normal);
! 160: glNormal3fv(normal);
! 161:
! 162: // NSLog(@"icosaface=(%d,%d,%d)\n",icosaFace[i][0],icosaFace[i][1],icosaFace[i][2]);
! 163: glBegin(GL_TRIANGLES);
! 164: glVertex3fv(&(vv[icosaFace[i][0]][0]));
! 165: glVertex3fv(&(vv[icosaFace[i][1]][0]));
! 166: glVertex3fv(&(vv[icosaFace[i][2]][0]));
! 167: glEnd();
! 168: }
! 169:
! 170: }
! 171: // Draw a wireflame of [-box,box]^3.
! 172: void glib3_bounding_box(float box) {
! 173: glPolygonMode(GL_FRONT,GL_LINE);
! 174: glPolygonMode(GL_BACK,GL_LINE);
! 175:
! 176: // fix z back
! 177: glBegin(GL_POLYGON);
! 178: glColor3f(0,1.0,0);
! 179: glNormal3f(0,0,1);
! 180: glVertex3f(-box,-box,-box); glVertex3f(box,-box,-box); glVertex3f(box,box,-box);
! 181: glVertex3f(-box,box,-box); glVertex3f(-box,-box,-box);
! 182: glEnd();
! 183:
! 184: // fix z, front
! 185: glBegin(GL_POLYGON);
! 186: glNormal3f(0,0,1); // 0,0,-1 : invisible
! 187: glVertex3f(-box,-box,box); glVertex3f(box,-box,box); glVertex3f(box,box,box);
! 188: glVertex3f(-box,box,box); glVertex3f(-box,-box,box);
! 189: glEnd();
! 190:
! 191: // fix x left box
! 192: glBegin(GL_POLYGON);
! 193: glNormal3f(1,0,0);
! 194: glVertex3f(-box,-box,-box); glVertex3f(-box,box,-box); glVertex3f(-box,box,box);
! 195: glVertex3f(-box,-box,box); glVertex3f(-box,-box,-box);
! 196: glEnd();
! 197:
! 198: // right box
! 199: glBegin(GL_POLYGON);
! 200: glNormal3f(1,0,0);
! 201: glVertex3f(box,-box,-box); glVertex3f(box,box,-box); glVertex3f(box,box,box);
! 202: glVertex3f(box,-box,box); glVertex3f(box,-box,-box);
! 203: glEnd();
! 204:
! 205: glPolygonMode(GL_FRONT,GL_FILL);
! 206: glPolygonMode(GL_BACK,GL_FILL);
! 207:
! 208: }
! 209:
! 210: void glib3_test_depth() {
! 211: int i,j;
! 212: float vv0[3];
! 213: float vv1[3];
! 214: float vv2[3];
! 215:
! 216: vv0[0] = 0.0; vv0[1] = 0.0; vv0[2] = 0.0;
! 217: vv1[0] = 0.0; vv1[1] = 1.0; vv1[2] = 0.0;
! 218: vv2[0] = 1.0; vv2[1] = 0.0; vv2[2] = 0.0;
! 219: for (i=0; i<20; i++) { // use 20 or use "nnn"
! 220: if (i%3 == 0) glColor3f(1.0,0.0,0.0);
! 221: else if (i%3 == 1) glColor3f(0.0,1.0,0.0);
! 222: else glColor3f(0.0, 0.0, 1.0);
! 223:
! 224: vv1[1] += i/10.0;
! 225: vv0[2] = vv1[2] = vv2[2] = -i/10.0;
! 226: glBegin(GL_TRIANGLES);
! 227: glVertex3fv(vv0);
! 228: glVertex3fv(vv1);
! 229: glVertex3fv(vv2);
! 230: glEnd();
! 231: }
! 232: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>