En el emulador Sí en la DS No

Después de mucho trabajar he terminado mi primer proyecto en 3D.

Voy todo contendo a probarlo en la DS, pero no funciona. En cambio, en el no$gba va perfecto. [mamaaaaa]

No sé si es por problemas de texturas (los modelos pueden llegar a ocupar junto con las texturas, en un momento determinado, 200 kb; añadir a mayores un fondo y un sprite) o por el EFS. Como no quería precisamente tener problemas con la memoria usé EFS para cargar los modelos 3D.

La situación en que me encuentro es que, o bien me funciona todo perfectamente usando las EFS en el emulador, pero no en la DS (ni siquiera carga); o bien, no uso las EFS teniendo que prescindir de algunos modelos, y aún así hay problemas con algunas texturas, las cuales no se ven (esto pasa tanto en el emulador como en la DS).

¿Problema con las EFS?. ¿Problemas con la gestión de la memoria de vídeo?

¿Puede alguien ayudarme?
Igual es problema de la flashcart que usas, pon aquí el homebrew y lo probamos.
Quizás tu flashcart no autoparchea dldi. Pueden ir por ahí los tiros!
He probado en 2 flashcart, una acekard 2 y una itouchds.
Probaré un poco y sino lo subo para que lo miréis.


Gracias
EFS da bastantes problemas según el flashcart. Además, es una librería que está abandonada... Lo suyo sería usar nitroFS, que vienen con devkitpro (libfilesystem).
Ya he utilizado nitroFS y sigue haciendo lo mismo
mikethunder escribió:Ya he utilizado nitroFS y sigue haciendo lo mismo

De todos modos, usar EFS no va a ayudar. Si nitroFS no funciona, es que el flashcart tal vez no soporta el protocolo argv. Akaio lo soporta, y además está el homebrew menu:
http://wiki.devkitpro.org/index.php/Homebrew_Menu
Ya he probado con Akaio 1.6 que sí lo soporta, pero no va.
Al final he hecho una 2ª versión sin nitroFS ni EFS, que aunque me limita para poder usar más modelos, por lo menos funciona :)
Curiosamente con Akaio no funciona esta 2ª versión, he tenido que instalar el firmware oficial :-?
Pronto postearé el juego. Decir que es un simulador de ............... tachán, ¡aeromodelismo! (muy sencillo eso sí [risita] ).
Me encanta el aeromodelismo y pensé que puestos a hacer algo en 3D, pues que sea original.
Pues no se, simplemente estarán tocándote las narices...

En el emulador, las librerías detectan que están en un emulador y usan un sistema alternativo para no tener problemas, por eso funciona.
Aquí va un ejemplo parecido al juego que he echo pero usando EFS (con nitrofs falla igual)

En el emulador funciona, pero en en la DS con la acekard ó la itouchds NO

He visto que si no inicializo las PA9, es decir,que si quito la línea PA_Init() funciona; pero así tendría que cambiar

toooooodo el juego y usar libnds.

¿Alguien puede ayudarme?

P.D.: También os pongo un enlace con todo el programa para que hagáis experimentos ;)

http://www.megaupload.com/?d=LS8TUYKV




#include "PA9.h"
#include "efs_lib.h"
#include "stdlib.h" //Librería para funciones de ficheros

float rotateX = 0.0;
float rotateY = 0.0;
float moverz = 0.0;
u32* pespada = NULL;
int textureID;

u32* carga_md2(char* ruta)
{
FILE* fichero; //Creamos dos variables que apuntan a los ficheros
u32* archivo; //Creamos una variable puntero tipo u32
char rutacompleta[256];

int size;
struct stat st; //Creamos una variable st para el fichero

sprintf(rutacompleta,"/%s_md2.bin",ruta); //Completa la ruta añadiéndole '_md2.bin'
fichero = fopen(rutacompleta,"rb"); //Abrimos el fichero en modo lectura binaria
if (fichero != NULL) //Comprobamos que el fichero existe
{
stat(rutacompleta,&st); //Función que vuelca los datos del fichero sobre la estructura st
size = st.st_size; //Almacena el tamaño (en bytes) del fichero en la variable size
archivo = (u32*)malloc(size); //Devuelve un puntero del tipo u8 que 'apunta' al inicio en memoria de una porción de tamaño size
fread(archivo,1,size,fichero);
fclose(fichero);
return archivo;
}
else
{
PA_OutputText(1,0,0,"¡Error al abrir el fichero %s!",rutacompleta);
return 0;
}
}

u8* carga_bmp(char* ruta)
{
FILE* fichero; //variable que apunta a los ficheros
u8* archivo; //Creamos una variable puntero tipo u8
char rutacompleta[256];

int size;
struct stat st; //Creamos una variable st para el fichero

sprintf(rutacompleta,"/%s_bmp.bin",ruta); //Completa la ruta añadiéndole '_bmp.bin'
fichero = fopen(rutacompleta,"rb"); //Abrimos el fichero en modo lectura binaria
if (fichero != NULL) //Comprobamos que el fichero existe
{
stat(rutacompleta,&st); //Función que vuelca los datos del fichero sobre la estructura st
size = st.st_size; //Almacena el tamaño (en bytes) del fichero en la variable size
archivo = (u8*)malloc(size); //Devuelve un puntero del tipo u8 que 'apunta' al inicio en memoria de una porción de tamaño size
fread(archivo,1,size,fichero);
fclose(fichero);
return archivo;
}
else
{
PA_OutputText(1,0,0,"¡Error al abrir el fichero %s!",rutacompleta);
return 0;
}
}

int main()
{

if(EFS_Init(EFS_AND_FAT | EFS_DEFAULT_DEVICE, NULL))
{
PA_OutputSimpleText(1, 0, 0, "EFS init ok");
PA_OutputText(1, 0, 1, "found NDS path: %s", efs_path);
}
PA_Init();
//set mode 0, enable BG0 and set it to 3D
videoSetMode(MODE_0_3D);
PA_SwitchScreens(); //Hace que el motor 3D se activa en la pantalla superior y no por defecto en la táctil
// inicializa gl
glInit();
vramSetBankA(VRAM_A_TEXTURE);
glGenTextures(1, &textureID); // reservamos sitio para las textura
glBindTexture(0, textureID); // activamos la textura
glTexImage2D(0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, TEXGEN_TEXCOORD,carga_bmp("espada"));
glEnable(GL_TEXTURE_2D | GL_ANTIALIAS); // Activa texturas y 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);

//this should work the same as the normal gl call
glViewport(0,0,255,191);

//any floating point gl call is being converted to fixed prior to being implemented
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70, 256.0 / 192.0, 0.1, 100);

gluLookAt( 0.0, 0.0, 3.5, //posición cámara
0.0, 0.0, 0.0, //a dónde mira la cámara
0.0, 1.0, 0.0); //up


//Atributos de los polígonos. (POLY_ALPHA(31) desactiva las transparencias y POLY_CULL_NONE no renderiza los polígonos que están detrás de la cámara
glPolyFmt(POLY_ALPHA(31) | POLY_CULL_FRONT);

pespada=carga_md2("espada");
while(1)
{
glPushMatrix();

glRotateX(rotateX); //rota figura en eje x
glRotateY(rotateY); //rota figura en eje y
glTranslatef(0,0,moverz);

scanKeys();
u16 keys = keysHeld();
if(!(keys & KEY_UP)) rotateX += 3;
if(!(keys & KEY_DOWN)) rotateX -= 3;
if(!(keys & KEY_LEFT)) rotateY += 3;
if(!(keys & KEY_RIGHT)) rotateY -= 3;
glBindTexture(0, textureID);
glCallList(pespada);
glPopMatrix(1);
glFlush(0);
}

return 0;
}//end main
9 respuestas