152 lines
3.7 KiB
C
152 lines
3.7 KiB
C
#include <fxengine/model/object.h>
|
|
|
|
#include <gint/std/string.h>
|
|
#include <gint/std/stdlib.h>
|
|
|
|
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();
|
|
}
|
|
*/
|
|
|