From 6f0b727ccf1f3b791d38c72519a3005cf56dd2fb Mon Sep 17 00:00:00 2001
From: Kyle K <kylek389@gmail.com>
Date: Sun, 3 Oct 2010 19:52:04 -0500
Subject: Initial commit

---
 obj.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)
 create mode 100644 obj.c

(limited to 'obj.c')

diff --git a/obj.c b/obj.c
new file mode 100644
index 0000000..e871fda
--- /dev/null
+++ b/obj.c
@@ -0,0 +1,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;
+}
+
-- 
cgit v1.2.3