nvidia_logo.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:7k
源码类别:

GIS编程

开发平台:

Visual C++

  1. /* Copyright (c) Mark J. Kilgard, 1998.  */
  2. /* This program is freely distributable without licensing fees and is
  3.    provided without guarantee or warrantee expressed or implied.  This
  4.    program is -not- in the public domain. */
  5. #include <math.h>
  6. #include <stdlib.h>
  7. #include <GL/glut.h>
  8. GLfloat nvlogo0[][2] = {
  9.   { -0.474465, -1.259490 },
  10.   { 0.115919, -1.113297 },
  11.   { 0.588227, -0.899634 },
  12.   { 0.942455, -0.652235 },
  13.   { 1.296687, -0.348609 },
  14.   { 1.690275, -0.033738 },
  15.   { 1.926431, 0.269888 },
  16.   { 2.123226, 0.494796 },
  17.   { 1.847713, 0.832160 },
  18.   { 1.532842, 1.124540 },
  19.   { 1.178611, 1.394430 },
  20.   { 0.706303, 1.709300 },
  21.   { 0.076562, 1.967940 },
  22.   { -0.395747, 2.080400 },
  23.   { -1.064784, 2.058940 },
  24.   { -1.064847, 2.811350 },
  25.   { 3.973113, 2.811350 },
  26.   { 3.973113, -2.811350 },
  27.   { -1.025490, -2.811350 },
  28.   { -1.025490, -2.159120 },
  29.   { -0.474465, -2.159120 },
  30.   { 0.155277, -2.102890 },
  31.   { 0.706303, -1.979190 },
  32.   { 1.178611, -1.833000 },
  33.   { 1.690275, -1.653080 },
  34.   { 2.201941, -1.450660 },
  35.   { 2.674248, -1.214510 },
  36.   { 3.107212, -0.955861 },
  37.   { 3.343357, -0.719707 },
  38.   { 2.438097, -0.179928 },
  39.   { 2.005147, -0.517290 },
  40.   { 1.690275, -0.820916 },
  41.   { 1.296687, -1.079560 },
  42.   { 0.863740, -1.338200 },
  43.   { 0.273356, -1.585600 },
  44.   { -0.198952, -1.709300 },
  45.   { -1.025490, -1.731790 },
  46.   { -1.025490, -1.248240 },
  47. };
  48. GLfloat nvlogo1[][2] = {
  49.   { -0.493508, 0.560265 },
  50.   { -0.233835, 0.218981 },
  51.   { -0.078033, -0.107463 },
  52.   { 0.545180, 0.441557 },
  53.   { 0.285509, 0.753164 },
  54.   { -0.129966, 1.005420 },
  55.   { -0.545442, 1.153800 },
  56.   { -1.034999, 1.167860 },
  57.   { -1.064784, 1.658310 },
  58.   { -0.233835, 1.598950 },
  59.   { 0.233576, 1.361540 },
  60.   { 0.649050, 1.094450 },
  61.   { 1.012591, 0.753164 },
  62.   { 1.324197, 0.426719 },
  63.   { 1.064524, 0.189305 },
  64.   { 0.804852, -0.166817 },
  65.   { 0.389378, -0.508100 },
  66.   { -0.078033, -0.745515 },
  67.   { -0.441573, -0.879060 },
  68.   { -1.013530, -0.889070 },
  69.   { -1.012851, 0.723487 },
  70. };
  71. GLfloat nvlogo2[][2] = {
  72.   { -1.025490, -2.159120 },
  73.   { -1.843800, -1.962260 },
  74.   { -2.415081, -1.635820 },
  75.   { -2.934425, -1.205510 },
  76.   { -3.297966, -0.760353 },
  77.   { -3.609571, -0.315201 },
  78.   { -3.869244, 0.204143 },
  79.   { -3.973113, 0.545426 },
  80.   { -3.505702, 0.960900 },
  81.   { -2.830556, 1.435730 },
  82.   { -2.051539, 1.851210 },
  83.   { -1.064784, 2.058940 },
  84.   { -1.064784, 1.658310 },
  85.   { -1.791868, 1.495080 },
  86.   { -2.363145, 1.183480 },
  87.   { -2.830556, 0.842190 },
  88.   { -3.194097, 0.471234 },
  89.   { -3.090228, 0.055759 },
  90.   { -2.830556, -0.315201 },
  91.   { -2.570884, -0.760353 },
  92.   { -2.103473, -1.220340 },
  93.   { -1.584129, -1.531950 },
  94.   { -1.025490, -1.731790 },
  95. };
  96. GLfloat nvlogo3[][2] = {
  97.   { -1.025490, -1.248240 },
  98.   { -1.472016, -1.099371 },
  99.   { -1.794030, -0.875934 },
  100.   { -2.047038, -0.606495 },
  101.   { -2.254046, -0.337056 },
  102.   { -2.415053, -0.047902 },
  103.   { -2.530060, 0.260968 },
  104.   { -2.392054, 0.536978 },
  105.   { -2.047038, 0.806418 },
  106.   { -1.633023, 1.016710 },
  107.   { -1.034999, 1.167860 },
  108.   { -1.012851, 0.723487 },
  109.   { -1.380012, 0.681555 },
  110.   { -1.610022, 0.530407 },
  111.   { -1.863033, 0.326685 },
  112.   { -1.909033, 0.076960 },
  113.   { -1.748027, -0.159620 },
  114.   { -1.541019, -0.448774 },
  115.   { -1.311010, -0.685355 },
  116.   { -1.013530, -0.889070 },
  117. };
  118. #define SIZE(a) (sizeof(a)/sizeof(a[0]))
  119. void
  120. extrudeSolidFromPolygon(GLfloat data[][2], unsigned int dataSize,
  121.   GLdouble thickness, GLuint side, GLuint edge, GLuint whole,
  122.   float breakAngle)
  123. {
  124.   static GLUtriangulatorObj *tobj = NULL;
  125.   GLdouble vertex[3], dx, dy, len;
  126.   GLdouble ndx, ndy, ondx, ondy, dot;
  127.   int i;
  128.   int count = (int) (dataSize / (2 * sizeof(GLfloat)));
  129.   if (tobj == NULL) {
  130.     tobj = gluNewTess();  /* create and initialize a GLU
  131.                              polygon tesselation object */
  132.     gluTessCallback(tobj, GLU_BEGIN, glBegin);
  133.     gluTessCallback(tobj, GLU_VERTEX, glVertex2fv);  /* semi-tricky */
  134.     gluTessCallback(tobj, GLU_END, glEnd);
  135.   }
  136.   glNewList(side, GL_COMPILE);
  137.   gluBeginPolygon(tobj);
  138.   for (i = 0; i < count; i++) {
  139.     vertex[0] = data[i][0];
  140.     vertex[1] = data[i][1];
  141.     vertex[2] = 0;
  142.     gluTessVertex(tobj, vertex, data[i]);
  143.   }
  144.   gluEndPolygon(tobj);
  145.   glEndList();
  146.   glNewList(edge, GL_COMPILE);
  147.   glBegin(GL_QUAD_STRIP);
  148.   dx = data[0][1] - data[-1 % count][1];
  149.   dy = data[-1 % count][0] - data[0][0];
  150.   len = sqrt(dx * dx + dy * dy);
  151.   ondx = dx / len;
  152.   ondy = dy / len;
  153.   for (i = 0; i <= count; i++) {
  154.     /* mod function handles closing the edge */
  155.     /* Calculate a unit normal by dividing by Euclidean
  156.        distance. We could be lazy and use
  157.        glEnable(GL_NORMALIZE) so we could pass in arbitrary
  158.        normals for a very slight performance hit. */
  159.     dx = data[(i + 1) % count][1] - data[i % count][1];
  160.     dy = data[i % count][0] - data[(i +1) % count][0];
  161.     len = sqrt(dx * dx + dy * dy);
  162.     ndx = dx / len;
  163.     ndy = dy / len;
  164.     dot = fabs(acos(ndx * ondx + ndy * ondy) * 180.0/3.14159);
  165.     if (dot > breakAngle) {
  166.       glVertex3f(data[i % count][0], data[i % count][1], thickness);
  167.       glVertex3f(data[i % count][0], data[i % count][1], 0.0);
  168.       glNormal3f(ndx, ndy, 0.0);
  169.     } else {
  170.       GLdouble adx, ady, nadx, nady;
  171.       adx = ndx + ondx;
  172.       ady = ndy + ondy;
  173.       len = sqrt(adx*adx + ady*ady);
  174.       nadx = adx / len;
  175.       nady = ady / len;
  176.       glNormal3f(nadx, nady, 0.0);
  177.     }
  178.     glVertex3f(data[i % count][0], data[i % count][1], thickness);
  179.     glVertex3f(data[i % count][0], data[i % count][1], 0.0);    
  180.     ondx = ndx;
  181.     ondy = ndy;
  182.   }
  183.   glEnd();
  184.   glEndList();
  185.   glNewList(whole, GL_COMPILE);
  186.   glFrontFace(GL_CW);
  187.   glCallList(edge);
  188.   glPushMatrix();
  189.   glTranslatef(0.0, 0.0, thickness);
  190.   glFrontFace(GL_CW);
  191.   glNormal3f(0.0, 0.0, 1.0);  /* opposite normal for other side */
  192.   glCallList(side);
  193.   glPopMatrix();
  194.   glFrontFace(GL_CCW);
  195.   glNormal3f(0.0, 0.0, -1.0);  /* constant normal for side */
  196.   glCallList(side);
  197.   glEndList();
  198. }
  199. GLuint
  200. makeNVidiaLogo(GLuint dlistBase)
  201. {
  202.   const float extrudeWidth = 1.0;
  203.   const float breakAngle = 30.0;
  204.   extrudeSolidFromPolygon(nvlogo0, sizeof(nvlogo0), extrudeWidth,
  205.       dlistBase+1, dlistBase+2, dlistBase+3, breakAngle);
  206.   extrudeSolidFromPolygon(nvlogo1, sizeof(nvlogo1), extrudeWidth,
  207.       dlistBase+4, dlistBase+5, dlistBase+6, breakAngle);
  208.   extrudeSolidFromPolygon(nvlogo2, sizeof(nvlogo2), extrudeWidth,
  209.       dlistBase+7, dlistBase+8, dlistBase+9, breakAngle);
  210.   extrudeSolidFromPolygon(nvlogo3, sizeof(nvlogo3), extrudeWidth,
  211.       dlistBase+10, dlistBase+11, dlistBase+12, breakAngle);
  212.   glNewList(dlistBase, GL_COMPILE);
  213.   glCallList(dlistBase+3);
  214.   glCallList(dlistBase+6);
  215.   glCallList(dlistBase+9);
  216.   glCallList(dlistBase+12);
  217.   glEndList();
  218.   return dlistBase;
  219. }