X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Frasterize;a=blobdiff_plain;f=model.c;h=9c6678701bb674c434221deaf8858a48e5d904a8;hp=4ed8a8e2be41e097bc0945002c062db733d44839;hb=bc662e293c854e1bdc9d46e9a410fe220247e6d4;hpb=07083c8dfbbd4fe48e84d86ce8d7e44e0719b84a diff --git a/model.c b/model.c index 4ed8a8e..9c66787 100644 --- a/model.c +++ b/model.c @@ -7,10 +7,9 @@ #include -#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 -