/****************************************
* Display Capture Test
* Author: eli
* (basically just one the DrunkenCoders demos by Dovoto)
****************************************/
#define REG_CAPTURE (*(vu32*)0x04000064)
#include <nds.h>
#include "teapot_bin.h"
#include "cafe_bin.h"
void SetRegCapture(bool enable, uint8 srcBlend, uint8 destBlend, uint8 bank, uint8 offset, uint8 size, uint8 source, uint8 srcOffset);
int LoadGLTextures();
int DrawTeapot();
int cafe_texid;
int texture[1];
int teapotX,teapotY;
int main()
{
powerON(POWER_ALL);
irqInit();
irqSet(IRQ_VBLANK, 0);
videoSetMode(MODE_0_3D);
videoSetModeSub(MODE_5_2D | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE);
vramSetBankA(VRAM_A_TEXTURE);
vramSetBankC(VRAM_C_SUB_BG);
SUB_BG2_CR = BG_BMP16_256x256;
SUB_BG2_XDX = 256;
SUB_BG2_XDY = 0;
SUB_BG2_YDX = 0;
SUB_BG2_YDY = 256;
SUB_BG2_CY = 0;
SUB_BG2_CX = 0;
SUB_BG3_CR = BG_BMP16_256x256;
SUB_BG3_XDX = 256;
SUB_BG3_XDY = 0;
SUB_BG3_YDX = 0;
SUB_BG3_YDY = 256;
SUB_BG3_CY = 0;
SUB_BG3_CX = 0;
glViewPort(0,0,255,191);
glClearColor(0,0,0);
glClearDepth(0x7FFF);
LoadGLTextures();
uint32 frameCount = 0;
while (1)
{
glReset();
scanKeys();
if (frameCount & 1)
{
vramSetBankC(VRAM_C_LCD);
SetRegCapture(true, 0, 15, 2, 0, 3, 0, 0);
DrawTeapot();
}
else
{
vramSetBankC(VRAM_C_SUB_BG);
DrawTeapot();
}
glFlush();
frameCount++;
lcdSwap();
swiWaitForVBlank();
}
return 0;
}
//------------------------------------------------------------------------------------------
// START OF FUCTIONS
//------------------------------------------------------------------------------------------
int DrawTeapot()
{
gluPerspective(35, 256.0 / 192.0, 0.1, 40);
glMatrixMode(GL_TEXTURE);
glIdentity();
vector tex_scale = { 64<<16, -64<<16, 1<<16 };
glScalev( &tex_scale );
glRotateXi(teapotX);
glRotateYi(teapotX);
glMatrixMode(GL_MODELVIEW);
glIdentity();
glTranslate3f32(0, 0, floatof32(-3));
glRotateXi(teapotX);
glRotateYi(teapotY);glColor3f(1,1,1);
glLight(0, RGB15(31,31,31),0,floatov10(-3.0),0);
glLight(1, RGB15(31,31,31),0,0,floatov10(-3.0));
glLight(2, RGB15(31,31,31),0,0,floatov10(3.0));
glMaterialf(GL_AMBIENT, RGB15(16,16,16));
glMaterialf(GL_DIFFUSE, RGB15(16,16,16));
glMaterialf(GL_SPECULAR, BIT(15) | RGB15(8,8,8));
glMaterialf(GL_EMISSION, RGB15(16,16,16));
glMaterialf(GL_EMISSION, RGB15(31,31,31));
if(!(keysHeld() & KEY_R))
{
glPolyFmt(POLY_ALPHA(31) | POLY_CULL_BACK | POLY_FORMAT_LIGHT0| POLY_FORMAT_LIGHT1| POLY_FORMAT_LIGHT2);
}
else
{
glPolyFmt(POLY_ALPHA(31) | POLY_CULL_BACK | POLY_FORMAT_LIGHT0| POLY_FORMAT_LIGHT1| POLY_FORMAT_LIGHT2);
}
teapotX -= 1;
teapotY += 1;
glBindTexture( 0, cafe_texid );
glCallList((u32*)teapot_bin);
return TRUE;
}
void SetRegCapture(bool enable, uint8 srcBlend, uint8 destBlend, uint8 bank, uint8 offset, uint8 size, uint8 source, uint8 srcOffset)
{
uint32 value = 0;
if (enable)
value |= 1 << 31;
value |= 3 << 29;
value |= (srcOffset & 0x3) << 26;
value |= (source & 0x3) << 24;
value |= (size & 0x3) << 20;
value |= (offset & 0x3) << 18;
value |= (bank & 0x3) << 16;
value |= (srcBlend & 0xF) << 8;
value |= (destBlend & 0xF) << 0;
REG_CAPTURE = value;
}
int LoadGLTextures()
{
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 );
return TRUE;
}
//-----------------------------------------
|