diff --git a/include/3d.h b/include/3d.h index b7e73ba..1c9b482 100755 --- a/include/3d.h +++ b/include/3d.h @@ -8,9 +8,9 @@ typedef struct model3d { u8 name[12]; matrix44 view; - vector4 **vertexlist; + vector4 *vertexlist; u16 vertexnb; - u16 **facelist; + u16 *facelist; u16 facenb; } model3d __attribute__ ((packed)); @@ -25,13 +25,29 @@ typedef struct vertex3d { }; } vertex3d __attribute__ ((packed)); + void proj(vector4 list[], vertex2d plane[], vector4 origin[], u16 number, float factor); void cube(vector4 list[], vector4 *origin, u16 size); - +int load3ds(u8 *pointer,u32 size, model3d *model); /*******************************************************************************/ /* Fichier 3DS */ +typedef enum dsState +{ + DS_READ_CHUNK_ID, + DS_READ_CHUNK_LENGTH, + DS_READ_OBJECT_NAME, + DS_SKIP_CHUNK, + DS_READ_POINT_COUNT, + DS_READ_POINTS, + DS_READ_FACE_COUNT, + DS_READ_FACES, + DS_READ_MATRIX, + DS_READ_DONE +} dsState __attribute__ ((packed)); + + #define MAIN3DS 0x4D4D //>------ Main Chunks diff --git a/lib/3d.c b/lib/3d.c index 07a1a47..d893589 100755 --- a/lib/3d.c +++ b/lib/3d.c @@ -4,6 +4,7 @@ #include "3d.h" #include "types.h" #include "video.h" +#include "string.h" /*******************************************************************************/ /* Crée une projection simple pour test */ @@ -58,35 +59,123 @@ void cube(vector4 list[], vector4 *origin, u16 size) /*******************************************************************************/ /* Charge un fichier 3DS */ -void load3ds(u8 *pointer, model3d *model) +int load3ds(u8 *pointer,u32 size, model3d *model) { - u16 chunk; - u32 size; - bool formatok; - while(true) { - chunk=(u16) *(pointer); - pointer+=2; - size=(u32) *(pointer); - pointer+=4; - switch(chunk) - { - case MAIN3DS: - break; - case EDIT3DS: - break; - case EDIT_OBJECT: - break; - case OBJ_TRIMESH: - break; - case TRI_VERTEXL: - break; - case TRI_FACEL1: - break; - case TRI_LOCAL: - break; - default: - break; + u8 *ptr=pointer; + u16 chunk_id; + u32 chunk_size; + u16 i; + float *listfloat; + u16 *listunsigned; + dsState state=DS_READ_CHUNK_ID; + bool dsfile=false; + while(ptr-pointername); + ptr+=(strlen(ptr)+1); + state=DS_READ_CHUNK_ID; + break; + case DS_SKIP_CHUNK: + break; + case DS_READ_POINT_COUNT: + model->vertexnb=*((u16*) ptr); + state=DS_READ_POINTS; + ptr+=2; + break; + case DS_READ_POINTS: + i=0; + listfloat=ptr; + model->vertexlist=0x00300000; + while(ivertexnb) + { + model->vertexlist[i].x=*(listfloat++); + model->vertexlist[i].y=*(listfloat++); + model->vertexlist[i].z=*(listfloat++); + model->vertexlist[i++].w=1.0; + } + ptr=listfloat; + state=DS_READ_CHUNK_ID; + break; + case DS_READ_FACE_COUNT: + model->facenb=*((u16*) ptr); + state=DS_READ_FACES; + ptr+=2; + break; + case DS_READ_FACES: + i=0; + listunsigned=ptr; + model->facelist=0x00400000; + while(ifacenb*3) + { + model->facelist[i++]=*(listunsigned++); + model->facelist[i++]=*(listunsigned++); + model->facelist[i++]=*(listunsigned++); + listunsigned++; + } + ptr=listunsigned; + state=DS_READ_CHUNK_ID; + break; + case DS_READ_MATRIX: + i=0; + listfloat=ptr; + while(i<4) + { + model->view.V[i].x=*(listfloat++); + model->view.V[i].y=*(listfloat++); + model->view.V[i].z=*(listfloat++); + model->view.V[i++].w=0.0f; + } + model->view.V[3].w=1.0f; + ptr=listfloat; + state=DS_READ_CHUNK_ID; + break; + case DS_READ_DONE: + break; + } + } } diff --git a/lib/shell.c b/lib/shell.c index 3f7a0a3..4d7c871 100644 --- a/lib/shell.c +++ b/lib/shell.c @@ -429,7 +429,7 @@ int test3d() return 1; } model3d model; - load3ds(&sphere, &model); + load3ds(&sphere, sizeof(sphere), &model); vector4 list3d[8]; vertex2d list2d[8]; matrix44 rotatex,rotatey,rotatez,mrotatex,mrotatey,mrotatez;