#include #include #include void fe_object_init(fe_object * object) { memset(object, 0, sizeof(fe_object)); } static void fe_object_delete_vertex(fe_object * object) { if (object->vertex_table==0 && object->vertex_t0==0 && object->vertex_t1==0 && object->vt_size==0) return; if (object->vt_own) free(object->vertex_table); else free(object->vertex_t0) object->vertex_table=0; object->vertex_t0=0; object->vertex_t1=0; object->vt_size=0; object->vt_own=0; } void fe_object_set_vertex(fe_object * object, fe_vertex * points, uint32_t n, bool copy) { fe_object_delete_vertex(object); if (copy) { object->vertex_table = malloc(3*n*sizeof(fe_vertex)); // Centraliser les données de copie if (!object->vertex_table) return; memcpy(object->points, points, n*sizeof(fe_ipoint)); object->vertex_t0 = object->vertex_table[n]; object->vertex_t1 = object->vertex_table[2*n]; } else { object->vertex_t0 = malloc(2*n*sizeof(fe_vertex)); if (!object->vertex_t0) return; object->vertex_t1 = &object->vertex_t0[n]; object->vertex_table = points; } object->vt_own = copy; object->vt_size = n; } void fe_object_set_faces(fe_object * object, fe_triangle * faces, uint32_t n, bool copy) { if (copy) { object->face_table = malloc(n*sizeof(fe_ipoint)); if (!object->face_table) return; memcpy(object->face_table, faces, n*sizeof(fe_ipoint)); } else { object->face_table = faces; } object->f_owner = copy; object->f_size = n; } static void fe_object_delete_faces(fe_object * object) { if (object->face_table && object->ft_own && object->ft_size) free(object->face_table); object->face_table=0; object->ft_size=0; object->ft_own=0; } void fe_object_delete(fe_object * object) { fe_object_delete_vertex(object); fe_object_delete_faces(object); fe_object_init(object); } fe_vertex* fe_object_getvx(const fe_object * object, const int n) { return &object->vertex_t1[n]; } void fe_object_display(fe_object * object) { object->old_centre.x=object->centre.x; object->old_centre.y=object->centre.y; object->old_centre.z=object->centre.z; for (int i = 0; i < object->vt_size; i++) { object->vertex_t0[i].x = object->old_centre.x + object->vertex_table[i].x; object->vertex_t0[i].y = object->old_centre.y + object->vertex_table[i].y; object->vertex_t0[i].z = object->old_centre.z + object->vertex_table[i].z; fe_vertex_translate(&object->vertex_t0[i]); } for (int i = 0; i < object->ft_size; i++) fe_display_triangle(&object->face_table[i]); // for (int i = 0; i < object->p_size; i++) // dpixel(object->points[i].translated.x, object->points[i].translated.y, C_BLACK); } /* void fe_object_debug(const fe_object * object) { dclear(C_WHITE); if (object) { char text[21]; sprintf(text, "ADDRESS : %p", object); dtext(1,1, text, C_BLACK, C_NONE); sprintf(text, "f-t %p %d", object->faces, object->f_owner); dtext(1,9, text, C_BLACK, C_NONE); sprintf(text, " -size = %d", object->f_size); dtext(1,17, text, C_BLACK, C_NONE); sprintf(text, "v-t %p %d", object->points, object->p_owner); dtext(1,25, text, C_BLACK, C_NONE); sprintf(text, " -size = %d", object->p_size); dtext(1,33, text, C_BLACK, C_NONE); } else { dtext(1,1, "No object sent !", C_BLACK, C_NONE); } dupdate(); getkey(); } */