/* shadow volume mesh * * written by Alexander Zaprjagaev * frustum@public.tsu.ru */ #ifndef __SV_MESH_H__ #define __SV_MESH_H__ typedef struct { float xyz[3]; /* координата */ float normal[3]; /* нормаль */ float st[2]; /* текстурные координаты */ } vertex_t; typedef struct { float xyz[3]; /* координата */ } sv_vertex_t; typedef struct { sv_vertex_t *v0,*v1; /* вершины */ int rv; /* для правильного направления обхода */ int id; /* идентификатор */ } sv_edge_t; typedef struct { sv_vertex_t *v0,*v1,*v2; /* вершины */ sv_edge_t *e0,*e1,*e2; /* ребра */ int r0,r1,r2; /* реверс */ float plane[4]; /* плоскость */ } sv_face_t; typedef struct { int num_vertex; /* число вершин */ sv_vertex_t *vertex; /* вершины */ int num_edge; /* число ребер */ sv_edge_t *edge; /* ребра */ int num_face; /* число граней */ sv_face_t *face; /* грани */ } sv_t; typedef struct { int num_vertex; /* число вершин */ vertex_t *vertex; /* вершины */ float matrix[16]; /* матрица преобразования */ sv_t *sv; /* теневой объем */ } sv_mesh_t; sv_mesh_t *sv_mesh_create(float *vertex,int num_vertex); sv_mesh_t *sv_mesh_load_3ds(char *name); void sv_mesh_set_matrix(sv_mesh_t *mesh,float *matrix); void sv_mesh_render(sv_mesh_t *mesh); void sv_mesh_render_to_stencil(sv_mesh_t *mesh,float *light); void sv_mesh_render_shadow(float *color); #endif /* __SV_MESH_H__ */