Graphics/3D/Env_Mapping/source/main.cpp
#include <nds.h>
#include "teapot_bin.h"
#include "cafe_bin.h"
static void get_pen_delta( int *dx, int *dy )
{
static int prev_pen[2] = { 0x7FFFFFFF, 0x7FFFFFFF };
touchPosition touchXY;
u32 keys = keysHeld();
if( keys & KEY_TOUCH )
{
touchRead(&touchXY);
if( prev_pen[0] != 0x7FFFFFFF )
{
*dx = (prev_pen[0] - touchXY.rawx);
*dy = (prev_pen[1] - touchXY.rawy);
}
prev_pen[0] = touchXY.rawx;
prev_pen[1] = touchXY.rawy;
}
else
{
prev_pen[0] = prev_pen[1] = 0x7FFFFFFF;
*dx = *dy = 0;
}
}
int main()
{
int rotateX = 0;
int rotateY = 0;
videoSetMode(MODE_0_3D);
glInit();
glEnable(GL_ANTIALIAS);
glClearColor(0,0,0,31);
glClearPolyID(63);
glClearDepth(0x7FFF);
glViewport(0,0,255,191);
vramSetBankA(VRAM_A_TEXTURE);
glEnable(GL_TEXTURE_2D);
int cafe_texid;
glGenTextures( 1, &cafe_texid );
glBindTexture( 0, cafe_texid );
glTexImage2D( 0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, GL_TEXTURE_WRAP_S|GL_TEXTURE_WRAP_T|TEXGEN_NORMAL, (u8*)cafe_bin );
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70, 256.0 / 192.0, 0.1, 40);
while(1)
{
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
GLvector tex_scale = { 64<<16, -64<<16, 1<<16 };
glScalev( &tex_scale );
glRotateXi(rotateX);
glRotateYi(rotateY);
glMatrixMode(GL_POSITION);
glLoadIdentity();
glTranslatef32(0, 0, floattof32(-3));
glRotateXi(rotateX);
glRotateYi(rotateY);
glMaterialf(GL_EMISSION, RGB15(31,31,31));
glPolyFmt(POLY_ALPHA(31) | POLY_CULL_BACK );
scanKeys();
u32 keys = keysHeld();
if( keys & KEY_UP ) rotateX += 3<<3;
if( keys & KEY_DOWN ) rotateX -= 3<<3;
if( keys & KEY_LEFT ) rotateY += 3<<3;
if( keys & KEY_RIGHT ) rotateY -= 3<<3;
int pen_delta[2];
get_pen_delta( &pen_delta[0], &pen_delta[1] );
rotateY -= pen_delta[0];
rotateX -= pen_delta[1];
glBindTexture( 0, cafe_texid );
glCallList((u32*)teapot_bin);
glFlush(0);
}
return 0;
}