PA_md2

Hola peña.

Acabo de portar un loader de ficheros md2 a la libreria PA_lib.
Para el que no lo sepa es el formato de los modelos 3D del quake II.

Podeis bajaros el source y una demo (que cargar un modelo de un evangelion que tiene diferentes animaciones, podeis cambiar de animacion apretando A o B)

PA_md2

Aqui os dejo un codigo de ejemplo.

// PA_md2 Loader by jandujar
// Based on Webez md2 loader  (gbadev)



#include <PA9.h>       // Include for PA_Lib

#include "tris_md2.h"

#include "eva_pcx.h"

#include "PA_md2.hpp"

// Estructura un punto en 3D
typedef struct{
      float x;
      float y;
      float z;
}miVector;

miVector camara;
miVector mira;

// Function: main()
int main(int argc, char ** argv)
{
   u8 animation=9;
   PA_Init();    // Initializes PA_Lib
   PA_InitVBL(); // Initializes a standard VBL
   PA_InitText(1,0);
   PA_Init3D(); 
   PA_md2* eva;
   eva=new PA_md2();
   u16 frame=0;
   u16 nframe=0;
   mira.x=0.0;
   mira.y=0.0;
   mira.z=0.0;
   camara.x=7.0;
   camara.z=0.0;
   camara.y=0.0;
   eva->PA_md2_load(tris_md2,eva_pcx);
   eva->PA_md2_set_animation(animation);  //Set up the animation
   PA_OutputText(1,0,0,"Animation %d     ",animation);
   // Infinite loop to keep the program running
   while (1)
   {
      PA_Init3DDrawing(camara.x,camara.y,camara.z,mira.x,mira.y,mira.z);
            
      eva->PA_md2_animate(1); // Animate the frame
      if(Pad.Released.A){animation++; PA_OutputText(1,0,0,"Animation %d    ",animation);eva->PA_md2_set_animation(animation);}
      if(Pad.Released.B){animation--;PA_OutputText(1,0,0,"Animation %d     ",animation);eva->PA_md2_set_animation(animation);}

      glColor3b(255,255,255); //If I not put colors the texture does not show
      eva->PA_md2_draw();
      
      glFlush();   
      
      PA_WaitForVBL();
   }
   
   return 0;
} // End of main()
Excelente trabajo!

yo toy empezando con las pa_lib, cdo tenga más tiempo lo pruebo...

sigue así campeón!!!
Dios que rápido has sido :D, si ayer sólo tenías el original ¿no? Esto confirma mi teoría de que soy un paquete XD. ¿Has quedado en algo con Webez respecto a los otros cargadores? ¿Mollusk tiene que adaptarlo ahora todo para que puedan emplearlo los que usan C?

Le echo un ojo y edito ;) .

[tadoramo] Eres mi fan jandujar [jaja]

Edito:
Wa, que gozada :D. Este era un punto en el que el homebrew estaba muy flojito, que sepas que esto va a suponer un paso grandísimo para la calidad del homebrew a partir de ahora mismo, no me quiero imaginar lo que puede llegar a ser esto en verano.
Ahora queda solucionar el tema del sonido, que también es muy deficiente :-(.

Hace ya tiempo que no ando con OpenGL y en DS ni lo he mirado pero ¿se pueden usar CallLists para no usar tanta memoria? -> Pues lo he mirado y no están implementados los métodos ¿con ndslib se puede?

Saludos [bye].
La funcion de loadLevel la puedes quitar porque es para cargar niveles de un editor que estoy haciendo y las 2 read tambien porque son para esa funcion.

Sobre las display list lo que ya dije, con interpolación está chungo, porque hay que cambiar obtener los vértices de dentro de las listas. De todos modos si no se usa interpolación se puede usar esta funcion

void DS_3DObject::createDisplayList(){
     displayList.push_back(2+mesh->polIndex.size()*11);
     displayList.push_back(FIFO_COMMAND_PACK(FIFO_NOP, FIFO_NOP, FIFO_NOP, FIFO_BEGIN));
     displayList.push_back(GL_TRIANGLE);
     for(unsigned int i = 0; i < mesh->polIndex.size(); i++){
displayList.push_back(FIFO_COMMAND_PACK(FIFO_NORMAL,FIFO_COLOR,FIFO_TEX_COORD,FIFO_VERTEX16));
        displayList.push_back(NORMAL_PACK( 0, 1<<9, 0));
        displayList.push_back(RGB15(colors[i]->red>>3,colors[i]->green>>3,colors[i]->blue>>3));
        displayList.push_back(TEXTURE_PACK(mesh->maps[mesh->mapIndex[i]->indexA]->u,mesh->maps[mesh->mapIndex[i]->indexA]->v));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexA]->x,mesh->vertex[mesh->polIndex[i]->indexA]->y));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexA]->z,0));
        displayList.push_back(FIFO_COMMAND_PACK(FIFO_TEX_COORD,FIFO_VERTEX16,FIFO_TEX_COORD,FIFO_VERTEX16));
        displayList.push_back(TEXTURE_PACK(mesh->maps[mesh->mapIndex[i]->indexB]->u,mesh->maps[mesh->mapIndex[i]->indexB]->v));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexB]->x,mesh->vertex[mesh->polIndex[i]->indexB]->y));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexB]->z,0));
        displayList.push_back(TEXTURE_PACK(mesh->maps[mesh->mapIndex[i]->indexC]->u,mesh->maps[mesh->mapIndex[i]->indexC]->v));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexC]->x,mesh->vertex[mesh->polIndex[i]->indexC]->y));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexC]->z,0));
     }
   displayList.push_back(FIFO_COMMAND_PACK(FIFO_NOP, FIFO_NOP, FIFO_NOP, FIFO_END));
  }


Aunque está sólo probada con los modelos de 3dstudio que no les pongo texturas.
displaList es un vector de u32. De todos modos igual falta alguna cosilla de las nuevas clases. En posteriores versiones también quitaré la clase DS_3D pues aunque quería conseguir indepencia entre implementación y estructura no lo veo factible.

Una pena que con lo bien que quedan tengan una utilidad tan limitada. ¿Alguien se anima a poner las normales? (es que me da un palo trastear con la luz...)

Un saludo.

PD: No consigo que se vea mejor la función
webez escribió:La funcion de loadLevel la puedes quitar porque es para cargar niveles de un editor que estoy haciendo y las 2 read tambien porque son para esa funcion.

Sobre las display list lo que ya dije, con interpolación está chungo, porque hay que cambiar obtener los vértices de dentro de las listas. De todos modos si no se usa interpolación se puede usar esta funcion

void DS_3DObject::createDisplayList(){
     displayList.push_back(2+mesh->polIndex.size()*11);
     displayList.push_back(FIFO_COMMAND_PACK(FIFO_NOP, FIFO_NOP, FIFO_NOP, FIFO_BEGIN));
     displayList.push_back(GL_TRIANGLE);
     for(unsigned int i = 0; i < mesh->polIndex.size(); i++){
displayList.push_back(FIFO_COMMAND_PACK(FIFO_NORMAL,FIFO_COLOR,FIFO_TEX_COORD,FIFO_VERTEX16));
        displayList.push_back(NORMAL_PACK( 0, 1<<9, 0));
        displayList.push_back(RGB15(colors[i]->red>>3,colors[i]->green>>3,colors[i]->blue>>3));
        displayList.push_back(TEXTURE_PACK(mesh->maps[mesh->mapIndex[i]->indexA]->u,mesh->maps[mesh->mapIndex[i]->indexA]->v));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexA]->x,mesh->vertex[mesh->polIndex[i]->indexA]->y));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexA]->z,0));
        displayList.push_back(FIFO_COMMAND_PACK(FIFO_TEX_COORD,FIFO_VERTEX16,FIFO_TEX_COORD,FIFO_VERTEX16));
        displayList.push_back(TEXTURE_PACK(mesh->maps[mesh->mapIndex[i]->indexB]->u,mesh->maps[mesh->mapIndex[i]->indexB]->v));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexB]->x,mesh->vertex[mesh->polIndex[i]->indexB]->y));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexB]->z,0));
        displayList.push_back(TEXTURE_PACK(mesh->maps[mesh->mapIndex[i]->indexC]->u,mesh->maps[mesh->mapIndex[i]->indexC]->v));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexC]->x,mesh->vertex[mesh->polIndex[i]->indexC]->y));
        displayList.push_back(VERTEX_PACK(mesh->vertex[mesh->polIndex[i]->indexC]->z,0));
     }
   displayList.push_back(FIFO_COMMAND_PACK(FIFO_NOP, FIFO_NOP, FIFO_NOP, FIFO_END));
  }


Aunque está sólo probada con los modelos de 3dstudio que no les pongo texturas.
displaList es un vector de u32. De todos modos igual falta alguna cosilla de las nuevas clases. En posteriores versiones también quitaré la clase DS_3D pues aunque quería conseguir indepencia entre implementación y estructura no lo veo factible.

Una pena que con lo bien que quedan tengan una utilidad tan limitada. ¿Alguien se anima a poner las normales? (es que me da un palo trastear con la luz...)

Un saludo.

PD: No consigo que se vea mejor la función


Yo tengo por ahi un loader de 3ds con normales, (precalculadas con otro programa). Si lo encuentro lo subo, aunque no usa las PA, solo libnds.
Yo todavía estoy aprendiendo a hacer cosas con el openGL, miraré de modificar un poco mas el código para que sea más óptimo y facil de utilizar.

Gracias webez por tu "Gran" aportacion (casi todo el código era tuyo, yo solo lo he modificado para que funcione en las PA_lib)

Por cierto. ¿Porque no os animais a poner el loader de 3ds en la libreria PAlib?

Seguro que le servirá a mucha gente. PAlib es una gran libreria para principiantes, y una vez la empiezas a utilizar ya no la puedes dejar, intentas mejorar cosas, añadir funcionalidades, etc...

Si todos los del foro escene de DS aportaramos algo a la libreria seguro que ya tendríamos un motor básico en 3D o un motor en 2D.


Se empieza con el cargador de modelos.
Luego con el cargador de mapas (sería la ostia poder cargar mapas BSP)
Luego Colisiones, después IA, etc...

Echar un cable y mucha gente os lo agradecerá (yo el primero) . [oki]

Por cierto Webez, ando un poco perro, voy a modificar el código de tu clase "Camara" para que funcione con las PAlib, espero que no te importe. (no tengo ganas de comerme la cabeza con algo que ya has echo tu mismo)
jandujar


No me importa que se modifique el código(pues para eso lo puse). Pero si me ha sorprendido un poco el "based" on webez loader y que luego sea el código tal cual a pelo.

Respecto a la PAlib me parece una buena librería, pero no la uso, asi que no voy a dedicarle tiempo dándole soporte.
la verdad es que casi todo el código es tuyo, pero he puesto "based" porque he realizado y haré mas modificaciones.

Espero que no te lo hayas tomado a mal.

Si quieres que te ponga otros créditos, házmelo saber, y los modifico.
7 respuestas