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

GIS编程

开发平台:

Visual C++

  1. /* trdemo.c */
  2. /*
  3.  * Test/demonstration of tile rendering utility library.
  4.  * See tr.h for more info.
  5.  *
  6.  * Brian Paul
  7.  * April 1997
  8.  */
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include "GL/glut.h"
  12. #include "tr.h"
  13. #define TILESIZE 100
  14. #define NUMBALLS 30
  15. static GLfloat BallPos[NUMBALLS][3];
  16. static GLfloat BallSize[NUMBALLS];
  17. static GLfloat BallColor[NUMBALLS][4];
  18. static GLboolean Perspective = GL_TRUE;
  19. static int WindowWidth, WindowHeight;
  20. /* Return random float in [0,1] */
  21. static float Random(void)
  22. {
  23.    int i = rand();
  24.    return (float) (i % 1000) / 1000.0;
  25. }
  26. /* Draw my stuff */
  27. static void DrawScene(void)
  28. {
  29.    int i;
  30.    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  31.    for (i=0;i<NUMBALLS;i++) {
  32.       int t;
  33.       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, BallColor[i]);
  34.       glPushMatrix();
  35.       glTranslatef(BallPos[i][0], BallPos[i][1], BallPos[i][2]);
  36.       t = 12 + (int) (BallSize[i] * 12);
  37.       glutSolidSphere(BallSize[i], t, t);
  38.       glPopMatrix();
  39.    }
  40. }
  41. /* Do a demonstration of tiled rendering */
  42. static void Display(void)
  43. {
  44.    GLubyte *image;
  45.    int tile = 0;
  46.    TRcontext *tr;
  47.    int i;
  48.    /* Generate random balls */
  49.    for (i=0;i<NUMBALLS;i++) {
  50.       BallPos[i][0] = -2.0 + 4.0 * Random();
  51.       BallPos[i][1] = -2.0 + 4.0 * Random();
  52.       BallPos[i][2] = -2.0 + 4.0 * Random();
  53.       BallSize[i] = Random();
  54.       BallColor[i][0] = Random();
  55.       BallColor[i][1] = Random();
  56.       BallColor[i][2] = Random();
  57.       BallColor[i][3] = 1.0;
  58.    }
  59.    /* allocate final image buffer */
  60.    image = malloc(WindowWidth * WindowHeight * 4 * sizeof(GLubyte));
  61.    if (!image) {
  62.       printf("Malloc failed!n");
  63.       return;
  64.    }
  65.    /* Setup tiled rendering.  Each tile is TILESIZE x TILESIZE pixels. */
  66.    tr = trNew();
  67.    trSetup(tr, WindowWidth, WindowHeight, (GLubyte *) image,
  68.    TILESIZE, TILESIZE);
  69.    if (Perspective)
  70.       trFrustum(tr, -1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
  71.    else
  72.       trOrtho(tr, -3.0, 3.0, -3.0, 3.0, -3.0, 3.0);
  73.    /* Draw tiles */
  74.    do {
  75.       trBeginTile(tr);
  76.       DrawScene();
  77.       tile++;
  78.    } while (trEndTile(tr));
  79.    printf("%d tiles drawnn", tile);
  80.    trDelete(tr);
  81.    /* show final image, might otherwise write it to a file */
  82.    glDrawPixels(WindowWidth, WindowHeight, GL_RGBA, GL_UNSIGNED_BYTE, image);
  83.    glFlush();
  84.    free(image);
  85. }
  86. static void Reshape( int width, int height )
  87. {
  88.    WindowWidth = width;
  89.    WindowHeight = height;
  90.    glViewport( 0, 0, width, height );
  91.    glMatrixMode( GL_PROJECTION );
  92.    glLoadIdentity();
  93.    if (Perspective)
  94.       glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
  95.    else
  96.       glOrtho( -3.0, 3.0, -3.0, 3.0, -3.0, 3.0);
  97.    glMatrixMode( GL_MODELVIEW );
  98.    glLoadIdentity();
  99.    if (Perspective)
  100.       glTranslatef( 0.0, 0.0, -15.0 );
  101. }
  102. /* ARGSUSED1 */
  103. static void Key( unsigned char key, int x, int y )
  104. {
  105.    switch (key) {
  106.       case 27:
  107.          exit(0);
  108.          break;
  109.    }
  110.    glutPostRedisplay();
  111. }
  112. static void Init( void )
  113. {
  114.    static GLfloat pos[4] = {0.0, 0.0, 10.0, 0.0};
  115.    glEnable(GL_LIGHTING);
  116.    glEnable(GL_LIGHT0);
  117.    glLightfv(GL_LIGHT0, GL_POSITION, pos);
  118.    glEnable(GL_NORMALIZE);
  119.    glEnable(GL_DEPTH_TEST);
  120. }
  121. int main( int argc, char *argv[] )
  122. {
  123.    glutInit( &argc, argv );
  124.    glutInitWindowPosition(0, 0);
  125.    glutInitWindowSize( 500, 500 );
  126.    glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH );
  127.    glutCreateWindow( "tile rendering" );
  128.    Init();
  129.    glutReshapeFunc( Reshape );
  130.    glutKeyboardFunc( Key );
  131.    glutDisplayFunc( Display );
  132.    glutMainLoop();
  133.    return 0;             /* ANSI C requires main to return int. */
  134. }