Per prima cosa si deve impostare il compilatore scaricabile da qui
nel pacchetto e' disponibile un cartella di esempi con vari target (tra cui 3ds)...io ho modificato il programma in 3ds_examples/graphics/bitmap/24bit-color/ in cui e' mostrato in modo semplice come usare il framebuffer per creare immagini grafiche
una volta compilato il programma, invece di copiarlo sulla SD e metterlo in esecuzione sulla consolle, ho usato l'emulatore Citra che permette l'esecuzione dei file 3dsx ovvero l'output del compilatore
-----------------------------------------------------------------
#include <3ds.h>
#include <stdio.h>
#include <string.h>
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
double iterazioni = 15;
double r;
float a = -2.0;
float b = -1.2;
float im = -1.2;
float dre = 3.0/SCREEN_WIDTH;
float dim = 2.4/SCREEN_HEIGHT;
float x,y,x_new,y_new;
int k,j,i;
void setPixel(u8 *fb, u16 x, u16 y, u8 red, u8 green, u8 blue) {
fb[3 * (240 - y + (x - 1) * 240)] = blue;
fb[3 * (240 - y + (x - 1) * 240) + 1] = green;
fb[3 * (240 - y + (x - 1) * 240) + 2] = red;
}
int main(int argc, char **argv)
{
gfxInitDefault();
consoleInit(GFX_TOP, NULL);
printf("3DS Mandelbrot");
printf("\x1b[21;16HPress Start to exit.");
gfxSetDoubleBuffering(GFX_BOTTOM, false);
u8* fb = gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL);
for (int i=1;i<=SCREEN_WIDTH;i++)
{
a=a+dre;
b=im;
for (int j=1;j<=SCREEN_HEIGHT;j++)
{
b = b+dim;
x = 0;
y = 0;
for (k=0;k<=iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
r = k%2;
if (r == 0) setPixel(fb, i, j, 255, 255, 255);
break;
}
x = x_new;
y = y_new;
}
}
}
// Main loop
while (aptMainLoop())
{
hidScanInput();
u32 kDown = hidKeysDown();
if (kDown & KEY_START) break; /
gfxFlushBuffers();
gfxSwapBuffers();
gspWaitForVBlank();
}
gfxExit();
return 0;
}
Nessun commento:
Posta un commento