Graphics/3D/3D_Both_Screens/source/template.c

//-------------------------------------------------------
//
//      3D on both screens
//      Jason Rogers  (aka Dovoto)
//
//-------------------------------------------------------
 
#include <nds.h>
 
//-------------------------------------------------------
void renderCube(int angle){
//-------------------------------------------------------
 
        glPushMatrix();
        glTranslatef(0, 0, -4);
        glRotatef32i(degreesToAngle(angle), inttof32(1), inttof32(1), inttof32(1)); 
        
        glBegin(GL_QUADS);
                glColor3b(255,0,0);             glVertex3f(-1.0f,  1.0f,  1.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f,  1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f,  1.0f);                                        
                glColor3b(255,255,0);   glVertex3f(-1.0f, -1.0f,  1.0f);                                        

                glColor3b(255,0,0);             glVertex3f(-1.0f,  1.0f, -1.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f,  1.0f, -1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f, -1.0f);                                        
                glColor3b(255,255,0);   glVertex3f(-1.0f, -1.0f, -1.0f);                                        

                glColor3b(255,0,0);             glVertex3f(-1.0f,  1.0f,  1.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f,  1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f,  1.0f, -1.0f);                                        
                glColor3b(255,255,0);   glVertex3f(-1.0f,  1.0f, -1.0f);                                        

                glColor3b(255,0,0);             glVertex3f(-1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f, -1.0f);                                        
                glColor3b(255,255,0);   glVertex3f(-1.0f, -1.0f, -1.0f);                                        

                glColor3b(255,0,0);             glVertex3f( 1.0f, 1.0f,  -1.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f, 1.0f,   1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f,-1.0f,   1.0f);                                        
                glColor3b(255,255,0);   glVertex3f( 1.0f,-1.0f,  -1.0f);                                        

                glColor3b(255,0,0);             glVertex3f(-1.0f, 1.0f,  -1.0f);                                        
                glColor3b(0,255,0);             glVertex3f(-1.0f, 1.0f,   1.0f);                                        
                glColor3b(0,0,255);             glVertex3f(-1.0f,-1.0f,   1.0f);                                        
                glColor3b(255,255,0);   glVertex3f(-1.0f,-1.0f,  -1.0f);                                        

        glEnd();
 
        glPopMatrix(1);
}
 
 
//-------------------------------------------------------
void renderPyramid(int angle){
//-------------------------------------------------------
 
        glPushMatrix();
        glTranslatef(0, 0, -4);
        glRotatef32i(degreesToAngle(angle), inttof32(1),inttof32(1),inttof32(1)); 
        
        glBegin(GL_QUADS);
                glColor3b(255,0,0);             glVertex3f(-1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f, -1.0f);                                        
                glColor3b(255,255,0);   glVertex3f(-1.0f, -1.0f, -1.0f);                                        
        glEnd();

        glBegin(GL_TRIANGLES);
                glColor3b(255,0,0);             glVertex3f( 0.0f,  1.0f,  0.0f);                                        
                glColor3b(0,255,0);             glVertex3f(-1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f,  1.0f);                                        

                glColor3b(255,0,0);             glVertex3f( 0.0f,  1.0f,  0.0f);                                        
                glColor3b(0,255,0);             glVertex3f(-1.0f, -1.0f, -1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f, -1.0f);                                        

                glColor3b(255,0,0);             glVertex3f( 0.0f,  1.0f,  0.0f);                                        
                glColor3b(0,255,0);             glVertex3f(-1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f(-1.0f, -1.0f, -1.0f);                                        

                glColor3b(255,0,0);             glVertex3f( 0.0f,  1.0f,  0.0f);                                        
                glColor3b(0,255,0);             glVertex3f( 1.0f, -1.0f,  1.0f);                                        
                glColor3b(0,0,255);             glVertex3f( 1.0f, -1.0f, -1.0f);                                        
        glEnd();
 
        glPopMatrix(1);
}
 
//-------------------------------------------------------
void renderScene(bool top){
//-------------------------------------------------------
        static short angle = 0;
 
        if(top)
                renderCube(angle);
        else
                renderPyramid(angle);

        angle++;
}
 
 
//-------------------------------------------------------
// set up a 2D layer construced of bitmap sprites
// this holds the image when rendering to the top screen
//-------------------------------------------------------
void initSubSprites(void){
//-------------------------------------------------------
 
        oamInit(&oamSub, SpriteMapping_Bmp_2D_256, false);
 
        int x = 0;
        int y = 0;
 
        //set up a 4x3 grid of 64x64 sprites to cover the screen
        for(y = 0; y < 3; y++)
        for(x = 0; x < 4; x++)
        {
                u16 *offset = &SPRITE_GFX_SUB[(x * 64) + (y * 64 * 256)];
 
                oamSet(&oamSub, x + y * 4, x * 64, y * 64, 0, 15, SpriteSize_64x64, 
                        SpriteColorFormat_Bmp, offset, -1, false,false,false,false,false);
        }
 
        swiWaitForVBlank();
 
        oamUpdate(&oamSub);
}
//-------------------------------------------------------
int main() {            
//-------------------------------------------------------
 
        videoSetMode(MODE_0_3D);
        videoSetModeSub(MODE_5_2D);
 
        glInit();
 
        // sub sprites hold the bottom image when 3D directed to top
        initSubSprites();
 
        // sub background holds the top image when 3D directed to bottom
        bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0);
 
//-------------------------------------------------------
//       Setup gl
//-------------------------------------------------------
        glEnable(GL_ANTIALIAS);
 
        glClearColor(0,0,0,31); 
        glClearPolyID(63);
        glClearDepth(0x7FFF);
 
        glViewport(0,0,255,191);
 
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(70, 256.0 / 192.0, 0.1, 100);
 
        glPolyFmt(POLY_ALPHA(31) | POLY_CULL_NONE);
 
//-------------------------------------------------------
//       main loop
//-------------------------------------------------------
        bool top = true;
 
        while (true) 
        {
                // wait for capture unit to be ready
                while(REG_DISPCAPCNT & DCAP_ENABLE);
 
                //-------------------------------------------------------
                //       Switch render targets
                //-------------------------------------------------------
                top = !top;
 
                if(top)
                {
                        lcdMainOnBottom();
                        vramSetBankC(VRAM_C_LCD);
                        vramSetBankD(VRAM_D_SUB_SPRITE);
                        REG_DISPCAPCNT = DCAP_BANK(2) | DCAP_ENABLE | DCAP_SIZE(3);
                }
                else
                {
                        lcdMainOnTop();
                        vramSetBankD(VRAM_D_LCD);
                        vramSetBankC(VRAM_C_SUB_BG);
                        REG_DISPCAPCNT = DCAP_BANK(3) | DCAP_ENABLE | DCAP_SIZE(3);
                }
 
                //-------------------------------------------------------
                //       Render the scene
                //-------------------------------------------------------
                glMatrixMode(GL_MODELVIEW);
 
                renderScene(top);
 
                glFlush(0);
        }
 
        return 0;
}
 全て クラス ファイル 関数 変数 型定義 列挙型 列挙型の値 マクロ定義
libndsに対してMon Apr 26 23:39:49 2010に生成されました。  doxygen 1.6.3