Graphics/3D/nehe/lesson11/source/nehe11.cpp

/****************************************
 *      NDS NeHe Lesson 11              *
 *      Author: Dovoto                  *
 ****************************************/

// include your ndslib
#include <nds.h>
#include <malloc.h>
#include <stdio.h>

//needed to load pcx files
#include <nds/arm9/image.h>
#include <nds/arm9/trig_lut.h>


#include "drunkenlogo_pcx.h"



int DrawGLScene();

v16 points[64][32][3];    // The Array For The Points On The Grid Of Our "Wave"
int wiggle_count = 0;       // Counter Used To Control How Fast Flag Waves

float   xrot;               // X Rotation ( NEW )
float   yrot;               // Y Rotation ( NEW )
float   zrot;               // Z Rotation ( NEW )
v16 hold;               // Temporarily Holds A Floating Point Value

int texture[1];         // Storage For 3 Textures (only going to use 1 on the DS for this demo)



float sin(float angle)
{
    int32 s = sinLerp((int)((angle * DEGREES_IN_CIRCLE) / 360.0));

    return f32tofloat(s);
}

float cos(float angle)
{
    int32 c = cosLerp((int)((angle * DEGREES_IN_CIRCLE) / 360.0));

    return f32tofloat(c);
}
 
 
int LoadGLTextures()                                    // Load PCX files And Convert To Textures
{
    sImage pcx;                

    //load our texture
    loadPCX((u8*)drunkenlogo_pcx, &pcx);
    
    image8to16(&pcx);

    glGenTextures(1, &texture[0]);
    glBindTexture(0, texture[0]);
    glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, TEXGEN_TEXCOORD, pcx.image.data8);

    return TRUE;
}
void InitGL(void) {
    
    // Setup the Main screen for 3D 
    videoSetMode(MODE_0_3D);
    vramSetBankA(VRAM_A_TEXTURE);                        //NEW  must set up some memory for textures
    
    // initialize the geometry engine
    glInit();
    
    // enable textures
    glEnable(GL_TEXTURE_2D);
    
    // Set our viewport to be the same size as the screen
    glViewport(0,0,255,191);
    
    // enable antialiasing
    glEnable(GL_ANTIALIAS);
    
    // setup the rear plane
    glClearColor(0,0,0,31); // BG must be opaque for AA to work
    glClearPolyID(63); // BG must have a unique polygon ID for AA to work
    glClearDepth(0x7FFF);
    
    LoadGLTextures();
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(70, 256.0 / 192.0, 0.1, 100);
    
    //need to set up some material properties since DS does not have them set by default
    glMaterialf(GL_AMBIENT, RGB15(31,31,31));
    glMaterialf(GL_DIFFUSE, RGB15(31,31,31));
    glMaterialf(GL_SPECULAR, BIT(15) | RGB15(16,16,16));
    glMaterialf(GL_EMISSION, RGB15(31,31,31));
    
    //ds uses a table for shinyness..this generates a half-ass one
    glMaterialShinyness();
    
    //ds specific, several attributes can be set here   
    glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE );
    
    for(int x=0; x<32; x++)
    {
        for(int y=0; y<32; y++)
        {
            points[x][y][0]= (inttov16(x)/4);
            points[x][y][1]= (inttov16(y)/4);
            points[x][y][2]= sinLerp(x * (DEGREES_IN_CIRCLE / 32));
        }
    }
    
    return;
}
int main()
{   
    InitGL();
    
    glMatrixMode(GL_MODELVIEW);
    
    while (1) 
    {
        DrawGLScene();
        
        // flush to screen  
        glFlush(0);
        
        // wait for the screen to refresh
        swiWaitForVBlank();
    }
    
    return 0;
}

int DrawGLScene()                                           // Here's Where We Do All The Drawing
{
    int x, y;
    t16 float_x, float_y, float_xb, float_yb;
    
    glColor3b(255,255,255);    // set the vertex color
    
    glLoadIdentity();                                   // Reset The View

    glTranslatef(0.0f,0.0f,-12.0f);
      
    glRotatef(xrot,1.0f,0.0f,0.0f);
    glRotatef(yrot,0.0f,1.0f,0.0f);  
    glRotatef(zrot,0.0f,0.0f,1.0f);

    glBindTexture(GL_TEXTURE_2D, texture[0]);

    glBegin(GL_QUADS);
    for( x = 0; x < 31; x++ )
    {
        for( y = 0; y < 31; y++ )
        {
            float_x = inttot16(x) << 2;
            float_y = inttot16(y) << 2;
            float_xb = inttot16(x+1) << 2;
            float_yb = inttot16(y+1) << 2;

            glTexCoord2t16( float_x, float_y);
            glVertex3v16( points[x][y][0], points[x][y][1], points[x][y][2] );

            glTexCoord2t16( float_x, float_yb );
            glVertex3v16( points[x][y+1][0], points[x][y+1][1], points[x][y+1][2] );

            glTexCoord2t16( float_xb, float_yb );
            glVertex3v16( points[x+1][y+1][0], points[x+1][y+1][1], points[x+1][y+1][2] );

            glTexCoord2t16( float_xb, float_y );
            glVertex3v16( points[x+1][y][0], points[x+1][y][1], points[x+1][y][2] );
        }
    }
    glEnd();

    if( wiggle_count == 2 )
    {
        for( y = 0; y < 32; y++ )
        {
            hold=points[0][y][2];
            for( x = 0; x < 32; x++)
            {
                points[x][y][2] = points[x+1][y][2];
            }
            points[31][y][2]=hold;
        }
        wiggle_count = 0;
    }

    wiggle_count++;

    xrot+=0.3f;
    yrot+=0.2f;
    zrot+=0.4f;

    return TRUE;                                            // Everything Went OK

}
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Defines
Generated on Sat Oct 2 12:55:11 2010 for libnds by  doxygen 1.6.3