]> Dogcows Code - chaz/rasterize/blobdiff - model.c
add opengl support
[chaz/rasterize] / model.c
diff --git a/model.c b/model.c
index 4ed8a8e2be41e097bc0945002c062db733d44839..9c6678701bb674c434221deaf8858a48e5d904a8 100644 (file)
--- a/model.c
+++ b/model.c
@@ -7,10 +7,9 @@
 
 #include <errno.h>
 
-#include "array.h"
+#include "list.h"
 #include "model.h"
 #include "raster.h"
-#include "tri.h"
 
 
 // create an interface for a vector array
@@ -19,7 +18,7 @@ DEFINE_ARRAY_TYPE(vec);
 
 struct model
 {
-    list_t*         triangles;
+    array_t*        triangles;
     mat_t           model;
     color_t         specular;
     scal_t          shininess;
@@ -32,8 +31,8 @@ struct model
 static int _model_read_raw(model_t* m, const char* filename);
 static int _model_read_obj(model_t* m, const char* filename);
 
-static int _model_try_read_cache(const char* filename, list_t** l);
-static void _model_write_cache(const char* filename, int count, list_t* l);
+static int _model_try_read_cache(const char* filename, array_t* l);
+static void _model_write_cache(const char* filename, int count, const array_t* l);
     
 
 model_t* model_alloc(const char* filename)
@@ -60,7 +59,7 @@ fail:
 model_t* model_alloc2(const char* filename, int type)
 {
     model_t* m = (model_t*)mem_alloc(sizeof(model_t));
-    m->triangles = NULL;
+    m->triangles = array_tri_alloc();
     m->model = MAT_IDENTITY;
     m->specular = COLOR_BLACK;
     m->shininess = S(64.0);
@@ -69,7 +68,7 @@ model_t* model_alloc2(const char* filename, int type)
     m->count = 0;
 
 #if CACHE_GEOMETRY
-    m->count = _model_try_read_cache(filename, &m->triangles);
+    m->count = _model_try_read_cache(filename, m->triangles);
     if (0 < m->count) {
         return m;
     }
@@ -98,7 +97,7 @@ model_t* model_alloc2(const char* filename, int type)
 
 void model_destroy(model_t* m)
 {
-    list_destroy(&m->triangles);
+    array_destroy(m->triangles);
     if (m->texture) {
         raster_destroy((raster_t*)m->texture);
     }
@@ -107,7 +106,7 @@ void model_destroy(model_t* m)
 }
 
 
-const list_t* model_geometry(const model_t* m)
+const array_t* model_geometry(const model_t* m)
 {
     return m->triangles;
 }
@@ -145,6 +144,16 @@ color_t model_tcolor(const model_t* m, vec_t pt)
     return COLOR_WHITE;
 }
 
+void* model_tdata(const model_t* m, int* width, int* height)
+{
+    if (m->texture) {
+        if (width) *width = raster_width(m->texture);
+        if (height) *height = raster_height(m->texture);
+        return raster_data(m->texture);
+    }
+    return NULL;
+}
+
 
 void model_transform(model_t* m, const mat_t* transform)
 {
@@ -233,6 +242,8 @@ static int _model_read_raw(model_t* m, const char* filename)
         return -1;
     }
 
+    list_t* triangles = NULL;
+
 #if CALC_NORMALS
     map_t* nlookup = map_vnorm_alloc();
 #endif
@@ -245,7 +256,7 @@ static int _model_read_raw(model_t* m, const char* filename)
             vert_new2((scal_t)x2, (scal_t)y2, (scal_t)z2),
             vert_new2((scal_t)x3, (scal_t)y3, (scal_t)z3)
         );
-        list_push2(&m->triangles, t, mem_free);
+        list_push2(&triangles, t, mem_free);
         ++m->count;
 
 #if CALC_NORMALS
@@ -264,10 +275,16 @@ static int _model_read_raw(model_t* m, const char* filename)
 #endif
 
     fclose(file);
-    if (m->triangles == NULL) {
+    if (triangles == NULL) {
         fprintf(stderr, "No triangles read from %s\n", filename);
         return -1;
     }
+
+    while (triangles) {
+        array_tri_push(m->triangles, *(tri_t*)triangles->val);
+        list_pop(&triangles);
+    }
+
     return 0;
 }
 
@@ -279,6 +296,8 @@ static int _model_read_obj(model_t* m, const char* filename)
         return -1;
     }
 
+    list_t* triangles = NULL;
+
 #if CALC_NORMALS
     map_t* nlookup = map_vnorm_alloc();
 #endif
@@ -314,7 +333,7 @@ static int _model_read_obj(model_t* m, const char* filename)
                 vert_new(*array_vec_index(v, i2)),
                 vert_new(*array_vec_index(v, i3))
             );
-            list_push2(&m->triangles, t, mem_free);
+            list_push2(&triangles, t, mem_free);
             ++m->count;
 
 #if CALC_NORMALS
@@ -332,7 +351,7 @@ static int _model_read_obj(model_t* m, const char* filename)
                 vert_new(*array_vec_index(v, i3)),
                 vert_new(*array_vec_index(v, i5))
             );
-            list_push2(&m->triangles, t, mem_free);
+            list_push2(&triangles, t, mem_free);
             ++m->count;
             t->a.t = *array_vec_index(vt, i2);
             t->b.t = *array_vec_index(vt, i4);
@@ -353,7 +372,7 @@ static int _model_read_obj(model_t* m, const char* filename)
                 vert_new(*array_vec_index(v, i3)),
                 vert_new(*array_vec_index(v, i5))
             );
-            list_push2(&m->triangles, t, mem_free);
+            list_push2(&triangles, t, mem_free);
             ++m->count;
             t->a.n = *array_vec_index(vn, i2);
             t->b.n = *array_vec_index(vn, i4);
@@ -366,7 +385,7 @@ static int _model_read_obj(model_t* m, const char* filename)
                 vert_new(*array_vec_index(v, i4)),
                 vert_new(*array_vec_index(v, i7))
             );
-            list_push2(&m->triangles, t, mem_free);
+            list_push2(&triangles, t, mem_free);
             ++m->count;
             t->a.t = *array_vec_index(vt, i2);
             t->b.t = *array_vec_index(vt, i5);
@@ -387,10 +406,16 @@ static int _model_read_obj(model_t* m, const char* filename)
 #endif
 
     fclose(file);
-    if (m->triangles == NULL) {
+    if (triangles == NULL) {
         fprintf(stderr, "No triangles read from %s\n", filename);
         return -1;
     }
+
+    while (triangles) {
+        array_tri_push(m->triangles, *(tri_t*)triangles->val);
+        list_pop(&triangles);
+    }
+
     return 0;
 }
 
@@ -400,7 +425,7 @@ static int _model_read_obj(model_t* m, const char* filename)
 /*
  * Try to read the triangle geometry from the cache file.
  */
-static int _model_try_read_cache(const char* filename, list_t** l)
+static int _model_try_read_cache(const char* filename, array_t* l)
 {
     int     count = 0;
     char*   cachename  = mem_strcat(".", filename);
@@ -420,13 +445,14 @@ static int _model_try_read_cache(const char* filename, list_t** l)
         _DO_OR_DONE(fread(&x3, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&y3, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&z3, sizeof(float), 1, file));
-        tri_t* t = tri_alloc(
+        tri_t t = tri_new(
             vert_new2((scal_t)x1, (scal_t)y1, (scal_t)z1),
             vert_new2((scal_t)x2, (scal_t)y2, (scal_t)z2),
             vert_new2((scal_t)x3, (scal_t)y3, (scal_t)z3)
         );
         ++count;
-        list_push2(l, t, mem_free);
+        array_tri_push(l, t);
+        tri_t* tp = array_tri_back(l);
         _DO_OR_DONE(fread(&x1, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&y1, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&z1, sizeof(float), 1, file));
@@ -436,18 +462,18 @@ static int _model_try_read_cache(const char* filename, list_t** l)
         _DO_OR_DONE(fread(&x3, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&y3, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&z3, sizeof(float), 1, file));
-        t->a.n = vec_new((scal_t)x1, (scal_t)y1, (scal_t)z1);
-        t->b.n = vec_new((scal_t)x2, (scal_t)y2, (scal_t)z2);
-        t->c.n = vec_new((scal_t)x3, (scal_t)y3, (scal_t)z3);
+        tp->a.n = vec_new((scal_t)x1, (scal_t)y1, (scal_t)z1);
+        tp->b.n = vec_new((scal_t)x2, (scal_t)y2, (scal_t)z2);
+        tp->c.n = vec_new((scal_t)x3, (scal_t)y3, (scal_t)z3);
         _DO_OR_DONE(fread(&x1, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&y1, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&x2, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&y2, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&x3, sizeof(float), 1, file));
         _DO_OR_DONE(fread(&y3, sizeof(float), 1, file));
-        t->a.t = vec_new((scal_t)x1, (scal_t)y1, S(0.0));
-        t->b.t = vec_new((scal_t)x2, (scal_t)y2, S(0.0));
-        t->c.t = vec_new((scal_t)x3, (scal_t)y3, S(0.0));
+        tp->a.t = vec_new((scal_t)x1, (scal_t)y1, S(0.0));
+        tp->b.t = vec_new((scal_t)x2, (scal_t)y2, S(0.0));
+        tp->c.t = vec_new((scal_t)x3, (scal_t)y3, S(0.0));
     }
 
 done:
@@ -462,7 +488,7 @@ done:
 /*
  * Write the triangle data to the cache.
  */
-static void _model_write_cache(const char* filename, int count, list_t* l)
+static void _model_write_cache(const char* filename, int count, const array_t* l)
 {
     char*   cachename  = mem_strcat(".", filename);
     FILE*   file = fopen(cachename, "wb");
@@ -472,8 +498,8 @@ static void _model_write_cache(const char* filename, int count, list_t* l)
     }
 
     float x1, y1, z1, x2, y2, z2, x3, y3, z3;
-    for (list_t* i = l; i; i = i->link) {
-        tri_t* t = (tri_t*)i->val;
+    array_it_t it = array_begin(l);
+    for (tri_t* t; t = array_it_tri_next(&it);) {
         x1 = (float)t->a.v.x; y1 = (float)t->a.v.y; z1 = (float)t->a.v.z;
         x2 = (float)t->b.v.x; y2 = (float)t->b.v.y; z2 = (float)t->b.v.z;
         x3 = (float)t->c.v.x; y3 = (float)t->c.v.y; z3 = (float)t->c.v.z;
@@ -518,4 +544,3 @@ done:
 
 #undef _DO_OR_DIE
 
-
This page took 0.027799 seconds and 4 git commands to generate.