#include <stdio.h>
#include "cmdlib.h"
#include "mathlib.h"
#include "4data.h"
#define FLOAT_START BOGUS_RANGE
#define FLOAT_END   -FLOAT_START
#define MAGIC       123322
typedef struct {
    float v[3];
} vector;
typedef struct
{
    vector n; 
    vector p; 
    vector c; 
    float u;  
    float v;  
} aliaspoint_t;
typedef struct {
    aliaspoint_t pt[3];
} tf_triangle;
void ByteSwapTri(tf_triangle *tri) {
    int32_t i;
    for (i = 0; i < sizeof(tf_triangle) / 4; i++) {
        ((int32_t *)tri)[i] = BigLong(((int32_t *)tri)[i]);
    }
}
void LoadTriangleList(char *filename, triangle_t **pptri, int32_t *numtriangles) {
    FILE *input;
    float start;
    char name[256], tex[256];
    int32_t i, count, magic;
    tf_triangle tri;
    triangle_t *ptri;
    int32_t iLevel;
    int32_t exitpattern;
    float t;
    t                              = -FLOAT_START;
    *((uint8_t *)&exitpattern + 0) = *((uint8_t *)&t + 3);
    *((uint8_t *)&exitpattern + 1) = *((uint8_t *)&t + 2);
    *((uint8_t *)&exitpattern + 2) = *((uint8_t *)&t + 1);
    *((uint8_t *)&exitpattern + 3) = *((uint8_t *)&t + 0);
    if ((input = fopen(filename, "rb")) == 0)
        Error("reader: could not open file '%s'", filename);
    iLevel = 0;
    fread(&magic, sizeof(int32_t), 1, input);
    if (BigLong(magic) != MAGIC)
        Error("%s is not a Alias object separated triangle file, magic number is wrong.", filename);
    ptri   = malloc(MAXTRIANGLES * sizeof(triangle_t));
    *pptri = ptri;
    while (feof(input) == 0) {
        if (fread(&start, sizeof(float), 1, input) < 1)
            break;
        *(int32_t *)&start = BigLong(*(int32_t *)&start);
        if (*(int32_t *)&start != exitpattern) {
            if (start == FLOAT_START) {
                
                i = -1;
                do {
                    
                    
                    
                    ++i;
                    fread(&(name[i]), sizeof(char), 1, input);
                } while (name[i] != '\0');
                                                fread(&count, sizeof(int32_t), 1, input);
                count = BigLong(count);
                ++iLevel;
                if (count != 0) {
                                        
                    i = -1;
                    do {
                        ++i;
                        fread(&(tex[i]), sizeof(char), 1, input);
                    } while (tex[i] != '\0');
                                                        }
                
                
            } else if (start == FLOAT_END) {
                
                
                
                
                
                --iLevel;
                i = -1;
                do {
                    ++i;
                    fread(&(name[i]), sizeof(char), 1, input);
                } while (name[i] != '\0');
                                                continue;
            }
        }
                                for (i = 0; i < count; ++i) {
            int32_t j;
            fread(&tri, sizeof(tf_triangle), 1, input);
            ByteSwapTri(&tri);
            for (j = 0; j < 3; j++) {
                int32_t k;
                for (k = 0; k < 3; k++) {
                    ptri->verts[j][k] = tri.pt[j].p.v[k];
                }
            }
            ptri++;
            if ((ptri - *pptri) >= MAXTRIANGLES)
                Error("Error: too many triangles; increase MAXTRIANGLES\n");
        }
    }
    *numtriangles = ptri - *pptri;
    fclose(input);
    free(ptri); }