summaryrefslogtreecommitdiffstats
path: root/obj.c
blob: e871fdaf2d49dfb4d2a92c090061ea87baf8464a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdlib.h>
#include <stdio.h>
#include <memory.h>
#include "obj.h"

ObjModel* ObjLoadModel(char *memory, size_t size)
{
    char *p = NULL, *e = NULL;
    ObjModel *ret = (ObjModel *) calloc(1, sizeof(ObjModel));
    memset(ret, 0, sizeof(ObjModel));

    p = memory;
    e = memory + size;
    
    while (p != e)
    {
        if (memcmp(p, "vn", 2) == 0)      ret->nNormal++;
        else if (memcmp(p, "vt", 2) == 0) ret->nTexCoord++;
        else if (memcmp(p, "v",  1) == 0) ret->nVertex++;
        else if (memcmp(p, "f",  1) == 0) ret->nTriangle++;

        while (*p++ != (char) 0x0A);
    }

    ret->VertexArray   = (ObjVertex *)   malloc(sizeof(ObjVertex) * ret->nVertex);
    ret->NormalArray   = (ObjNormal *)   malloc(sizeof(ObjNormal) * ret->nNormal);
    ret->TexCoordArray = (ObjTexCoord *) malloc(sizeof(ObjTexCoord) * ret->nTexCoord);
    ret->TriangleArray = (ObjTriangle *) malloc(sizeof(ObjTriangle) * ret->nTriangle);

    p = memory;
    
    int nV = 0, nN = 0, nT = 0, nF = 0;
    
    while (p != e)
    {
        if (memcmp(p, "vn", 2) == 0)
        {
            sscanf(p, "vn %f %f %f", &ret->NormalArray[nN].x,
                                     &ret->NormalArray[nN].y,
                                     &ret->NormalArray[nN].z);
            nN++;
        }
        else if (memcmp(p, "vt", 2) == 0)
        {
            sscanf(p, "vt %f %f", &ret->TexCoordArray[nT].u,
                                  &ret->TexCoordArray[nT].v);
            nT++;
        }
        else if (memcmp(p, "v", 1) == 0) /* or *p == 'v' */
        {
            sscanf(p, "v %f %f %f", &ret->VertexArray[nV].x,
                                    &ret->VertexArray[nV].y,
                                    &ret->VertexArray[nV].z);
            nV++;
        }
        else if (memcmp(p, "f", 1) == 0) /* or *p == 'f' */
        {
            sscanf(p, "f %d/%d/%d %d/%d/%d %d/%d/%d", &ret->TriangleArray[nF].Vertex[0],
                                                      &ret->TriangleArray[nF].TexCoord[0],
                                                      &ret->TriangleArray[nF].Normal[0],
                                                      &ret->TriangleArray[nF].Vertex[1],
                                                      &ret->TriangleArray[nF].TexCoord[1],
                                                      &ret->TriangleArray[nF].Normal[1],
                                                      &ret->TriangleArray[nF].Vertex[2],
                                                      &ret->TriangleArray[nF].TexCoord[2],
                                                      &ret->TriangleArray[nF].Normal[2]);
            nF++;
        }
        while (*p++ != (char) 0x0A);
    }
    return ret;
}

size_t ObjLoadFile(char *szFileName, char **memory)
{
    size_t bytes = 0;
    FILE *file = fopen(szFileName, "rt");

    if (file != NULL)
    {
        fseek(file, 0, SEEK_END);
        size_t end = ftell(file);
        fseek(file, 0, SEEK_SET);
       
        *memory = (char *) malloc(end);
        bytes = fread(*memory, sizeof(char), end, file);

        fclose(file);
    }
    return bytes;
}