#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
struct model
{
- list_t* triangles;
+ array_t* triangles;
mat_t model;
color_t specular;
scal_t shininess;
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)
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);
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;
}
void model_destroy(model_t* m)
{
- list_destroy(&m->triangles);
+ array_destroy(m->triangles);
if (m->texture) {
raster_destroy((raster_t*)m->texture);
}
}
-const list_t* model_geometry(const model_t* m)
+const array_t* model_geometry(const model_t* m)
{
return m->triangles;
}
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)
{
return -1;
}
+ list_t* triangles = NULL;
+
#if CALC_NORMALS
map_t* nlookup = map_vnorm_alloc();
#endif
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
#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;
}
return -1;
}
+ list_t* triangles = NULL;
+
#if CALC_NORMALS
map_t* nlookup = map_vnorm_alloc();
#endif
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
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);
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);
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);
#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;
}
/*
* 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);
_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));
_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:
/*
* 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");
}
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;
#undef _DO_OR_DIE
-