Edit

kc3-lang/angle/samples/gles2_book/Common/esShapes.c

Branch :

  • Show log

    Commit

  • Author : alokp@chromium.org
    Date : 2010-03-22 19:34:05
    Hash : 5539a34f
    Message : Added a few samples from GLES 2.0 book. git-svn-id: https://angleproject.googlecode.com/svn/trunk@63 736b8ea6-26fd-11df-bfd4-992fa37f6226

  • samples/gles2_book/Common/esShapes.c
  • //
    // Book:      OpenGL(R) ES 2.0 Programming Guide
    // Authors:   Aaftab Munshi, Dan Ginsburg, Dave Shreiner
    // ISBN-10:   0321502795
    // ISBN-13:   9780321502797
    // Publisher: Addison-Wesley Professional
    // URLs:      http://safari.informit.com/9780321563835
    //            http://www.opengles-book.com
    //
    
    // ESShapes.c
    //
    //    Utility functions for generating shapes
    //
    
    ///
    //  Includes
    //
    #include "esUtil.h"
    #include <stdlib.h>
    #include <math.h>
    
    ///
    // Defines
    //
    #define ES_PI  (3.14159265f)
    
    //////////////////////////////////////////////////////////////////
    //
    //  Private Functions
    //
    //
    
    
    
    //////////////////////////////////////////////////////////////////
    //
    //  Public Functions
    //
    //
    
    //
    /// \brief Generates geometry for a sphere.  Allocates memory for the vertex data and stores 
    ///        the results in the arrays.  Generate index list for a TRIANGLE_STRIP
    /// \param numSlices The number of slices in the sphere
    /// \param vertices If not NULL, will contain array of float3 positions
    /// \param normals If not NULL, will contain array of float3 normals
    /// \param texCoords If not NULL, will contain array of float2 texCoords
    /// \param indices If not NULL, will contain the array of indices for the triangle strip
    /// \return The number of indices required for rendering the buffers (the number of indices stored in the indices array
    ///         if it is not NULL ) as a GL_TRIANGLE_STRIP
    //
    int ESUTIL_API esGenSphere ( int numSlices, float radius, GLfloat **vertices, GLfloat **normals, 
                                 GLfloat **texCoords, GLushort **indices )
    {
       int i;
       int j;
       int numParallels = numSlices / 2;
       int numVertices = ( numParallels + 1 ) * ( numSlices + 1 );
       int numIndices = numParallels * numSlices * 6;
       float angleStep = (2.0f * ES_PI) / ((float) numSlices);
    
       // Allocate memory for buffers
       if ( vertices != NULL )
          *vertices = malloc ( sizeof(GLfloat) * 3 * numVertices );
       
       if ( normals != NULL )
          *normals = malloc ( sizeof(GLfloat) * 3 * numVertices );
    
       if ( texCoords != NULL )
          *texCoords = malloc ( sizeof(GLfloat) * 2 * numVertices );
    
       if ( indices != NULL )
          *indices = malloc ( sizeof(GLushort) * numIndices );
    
       for ( i = 0; i < numParallels + 1; i++ )
       {
          for ( j = 0; j < numSlices + 1; j++ )
          {
             int vertex = ( i * (numSlices + 1) + j ) * 3; 
    
             if ( vertices )
             {
                (*vertices)[vertex + 0] = radius * sinf ( angleStep * (float)i ) *
                                                   sinf ( angleStep * (float)j );
                (*vertices)[vertex + 1] = radius * cosf ( angleStep * (float)i );
                (*vertices)[vertex + 2] = radius * sinf ( angleStep * (float)i ) *
                                                   cosf ( angleStep * (float)j );
             }
    
             if ( normals )
             {
                (*normals)[vertex + 0] = (*vertices)[vertex + 0] / radius;
                (*normals)[vertex + 1] = (*vertices)[vertex + 1] / radius;
                (*normals)[vertex + 2] = (*vertices)[vertex + 2] / radius;
             }
    
             if ( texCoords )
             {
                int texIndex = ( i * (numSlices + 1) + j ) * 2;
                (*texCoords)[texIndex + 0] = (float) j / (float) numSlices;
                (*texCoords)[texIndex + 1] = ( 1.0f - (float) i ) / (float) (numParallels - 1 );
             }
          }
       }
    
       // Generate the indices
       if ( indices != NULL )
       {
          GLushort *indexBuf = (*indices);
          for ( i = 0; i < numParallels ; i++ ) 
          {
             for ( j = 0; j < numSlices; j++ )
             {
                *indexBuf++  = i * ( numSlices + 1 ) + j;
                *indexBuf++ = ( i + 1 ) * ( numSlices + 1 ) + j;
                *indexBuf++ = ( i + 1 ) * ( numSlices + 1 ) + ( j + 1 );
    
                *indexBuf++ = i * ( numSlices + 1 ) + j;
                *indexBuf++ = ( i + 1 ) * ( numSlices + 1 ) + ( j + 1 );
                *indexBuf++ = i * ( numSlices + 1 ) + ( j + 1 );
             }
          }
       }
    
       return numIndices;
    }
    
    //
    /// \brief Generates geometry for a cube.  Allocates memory for the vertex data and stores 
    ///        the results in the arrays.  Generate index list for a TRIANGLES
    /// \param scale The size of the cube, use 1.0 for a unit cube.
    /// \param vertices If not NULL, will contain array of float3 positions
    /// \param normals If not NULL, will contain array of float3 normals
    /// \param texCoords If not NULL, will contain array of float2 texCoords
    /// \param indices If not NULL, will contain the array of indices for the triangle strip
    /// \return The number of indices required for rendering the buffers (the number of indices stored in the indices array
    ///         if it is not NULL ) as a GL_TRIANGLE_STRIP
    //
    int ESUTIL_API esGenCube ( float scale, GLfloat **vertices, GLfloat **normals, 
                               GLfloat **texCoords, GLushort **indices )
    {
       int i;
       int numVertices = 24;
       int numIndices = 36;
       
       GLfloat cubeVerts[] =
       {
          -0.5f, -0.5f, -0.5f,
          -0.5f, -0.5f,  0.5f,
          0.5f, -0.5f,  0.5f,
          0.5f, -0.5f, -0.5f,
          -0.5f,  0.5f, -0.5f,
          -0.5f,  0.5f,  0.5f,
          0.5f,  0.5f,  0.5f,
          0.5f,  0.5f, -0.5f,
          -0.5f, -0.5f, -0.5f,
          -0.5f,  0.5f, -0.5f,
          0.5f,  0.5f, -0.5f,
          0.5f, -0.5f, -0.5f,
          -0.5f, -0.5f, 0.5f,
          -0.5f,  0.5f, 0.5f,
          0.5f,  0.5f, 0.5f, 
          0.5f, -0.5f, 0.5f,
          -0.5f, -0.5f, -0.5f,
          -0.5f, -0.5f,  0.5f,
          -0.5f,  0.5f,  0.5f,
          -0.5f,  0.5f, -0.5f,
          0.5f, -0.5f, -0.5f,
          0.5f, -0.5f,  0.5f,
          0.5f,  0.5f,  0.5f,
          0.5f,  0.5f, -0.5f,
       };
    
       GLfloat cubeNormals[] =
       {
          0.0f, -1.0f, 0.0f,
          0.0f, -1.0f, 0.0f,
          0.0f, -1.0f, 0.0f,
          0.0f, -1.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
          0.0f, 1.0f, 0.0f,
          0.0f, 0.0f, -1.0f,
          0.0f, 0.0f, -1.0f,
          0.0f, 0.0f, -1.0f,
          0.0f, 0.0f, -1.0f,
          0.0f, 0.0f, 1.0f,
          0.0f, 0.0f, 1.0f,
          0.0f, 0.0f, 1.0f,
          0.0f, 0.0f, 1.0f,
          -1.0f, 0.0f, 0.0f,
          -1.0f, 0.0f, 0.0f,
          -1.0f, 0.0f, 0.0f,
          -1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
          1.0f, 0.0f, 0.0f,
       };
    
       GLfloat cubeTex[] =
       {
          0.0f, 0.0f,
          0.0f, 1.0f,
          1.0f, 1.0f,
          1.0f, 0.0f,
          1.0f, 0.0f,
          1.0f, 1.0f,
          0.0f, 1.0f,
          0.0f, 0.0f,
          0.0f, 0.0f,
          0.0f, 1.0f,
          1.0f, 1.0f,
          1.0f, 0.0f,
          0.0f, 0.0f,
          0.0f, 1.0f,
          1.0f, 1.0f,
          1.0f, 0.0f,
          0.0f, 0.0f,
          0.0f, 1.0f,
          1.0f, 1.0f,
          1.0f, 0.0f,
          0.0f, 0.0f,
          0.0f, 1.0f,
          1.0f, 1.0f,
          1.0f, 0.0f,
       };
       
       // Allocate memory for buffers
       if ( vertices != NULL )
       {
          *vertices = malloc ( sizeof(GLfloat) * 3 * numVertices );
          memcpy( *vertices, cubeVerts, sizeof( cubeVerts ) );
          for ( i = 0; i < numVertices; i++ )
          {
             (*vertices)[i] *= scale;
          }
       }
    
       if ( normals != NULL )
       {
          *normals = malloc ( sizeof(GLfloat) * 3 * numVertices );
          memcpy( *normals, cubeNormals, sizeof( cubeNormals ) );
       }
    
       if ( texCoords != NULL )
       {
          *texCoords = malloc ( sizeof(GLfloat) * 2 * numVertices );
          memcpy( *texCoords, cubeTex, sizeof( cubeTex ) ) ;
       }
    
    
       // Generate the indices
       if ( indices != NULL )
       {
          GLushort cubeIndices[] =
          {
             0, 2, 1,
             0, 3, 2, 
             4, 5, 6,
             4, 6, 7,
             8, 9, 10,
             8, 10, 11, 
             12, 15, 14,
             12, 14, 13, 
             16, 17, 18,
             16, 18, 19, 
             20, 23, 22,
             20, 22, 21
          };
    
          *indices = malloc ( sizeof(GLushort) * numIndices );
          memcpy( *indices, cubeIndices, sizeof( cubeIndices ) );
       }
    
       return numIndices;
    }