3ds max ASE-parseri

Entropia 14.07.04 01:33

Parsii ASE-tiedostosta yhden objektin verteksit ja tahkot.

 Tekstiversio  Arvo: 3 (3 ääntä)  Äänestä: +  -
/*
   Käyttö kaikessa yksinkertaisuudessaan:
   Deklaroi OBJECT objektisi.
   Kutsu objload("palikka.ase", &objektisi);
   Piirto: käy silmukassa läpi objekti.vertices[i].x, y ja z.

   Lisään tahkojen normaalit kunhan kerkiän ;)
   Kääntyy ainakin VC++ 6.0:lla.
*/


typedef struct {
        float x, y, z;
} VERTEX;

typedef struct {
        float x, y, z;
} NORMAL;

typedef struct {
        int numvertices;
        int numfaces;
        VERTEX *vertices;
        NORMAL *normals;
} OBJECT;

void objallocate(OBJECT *k, int n, int m)
{                     
        k->vertices = (VERTEX*)malloc(sizeof(VERTEX)*n);
        k->normals = (NORMAL*)malloc(sizeof(NORMAL)*m);
}
void objfree(OBJECT *k)
{
        free(k->vertices);
        free(k->normals);
}

void objload(char *name, OBJECT *k)
{
        FILE *filu = NULL;
        int vertices, faces, i = 0;
        float vx, vy, vz = 0;
        int indeksi = 1337;
        char rivi[255];
        char temppi[255];

        filu = fopen(name, "r");

        // verteksien määrä
        while(vertices < 1) {
                fgets(rivi, 250, filu);
                sscanf(rivi, "\t\t*MESH_NUMVERTEX %d", &vertices);
                if(vertices > 0) {
                        wsprintf(temppi, "%i verteksiä", vertices);
                        break;
                }
        }
        fseek(filu, 0, SEEK_SET);

        // tahkojen määrä
        while(faces < 1) {
                fgets(rivi, 250, filu);
                sscanf(rivi, "\t\t*MESH_NUMFACES %d", &faces);
                if(faces > 0) {
                        break;
                }
        }
        fseek(filu, 0, SEEK_SET);

        // varataan muistia vertekseille ja tahkoille
        objallocate(k, vertices, faces);

        // verteksit
        while(indeksi > 0) {
                fgets(rivi, 250, filu);
                sscanf(rivi, "\t\t\t*MESH_VERTEX %d %f %f %f", &indeksi, &vx, &vy, &vz);
                if(indeksi == 0) {
                        k->vertices[0].x = vx;
                        k->vertices[0].y = vy;
                        k->vertices[0].z = vz;

                        for(i = 0; i < vertices; i++) {
                                fgets(rivi, 250, filu);
                                sscanf(rivi, "\t\t\t*MESH_VERTEX %d %f %f %f", &indeksi, &vx, &vy, &vz);
                               
                                k->vertices[indeksi].x = vx;
                                k->vertices[indeksi].y = vy;
                                k->vertices[indeksi].z = vz;
                        }

                        break;
                }
        }

        sprintf(temppi, "Objekti: %s\nVerteksejä: %i\nTahkoja: %i", name, vertices, faces);
        MessageBox(NULL, temppi, "kebab technicians", MB_OK | MB_ICONINFORMATION);

        fclose(filu);
}