32#include <libFreeWRL.h>
34#include "../vrml_parser/Structs.h"
35#include "../main/headers.h"
40typedef void (__stdcall *_GLUfuncptr)();
69 int global_IFS_Coords[TESS_MAX_COORDS];
71void *Tess_constructor(){
72 void *v = MALLOCV(
sizeof(
struct pTess));
73 memset(v,0,
sizeof(
struct pTess));
76void Tess_init(
struct tTess *t){
81 t->prv = Tess_constructor();
84 t->global_IFS_Coords = p->global_IFS_Coords;
85 t->text_IFS_Coords = p->global_IFS_Coords;
94void CALLBACK FW_tess_begin(GLenum e) {
100 freewrlDie(
"Something went wrong while tessellating!");
103void CALLBACK FW_tess_end(
void) {
108void CALLBACK FW_tess_edgeflag(GLenum flag) {
114void CALLBACK FW_IFS_tess_vertex(
void *p) {
119 if (tg->Tess.global_IFS_Coord_count == TESS_MAX_COORDS) {
131 tg->Tess.global_IFS_Coords[tg->Tess.global_IFS_Coord_count++] = *dp;
136void CALLBACK FW_tess_error(GLenum e) {
140 printf(
"FW_tess_error %d: >%s<\n",(
int) e,GL_ERROR_MSG);
145void CALLBACK FW_tess_combine_text_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
161 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
168 int FW_pointctr, RAI_indx;
179 FW_pointctr = *(cbdata->counter);
180 RAI_indx = *(cbdata->riaindex);
181 tg->Tess.global_IFS_Coords[RAI_indx] = FW_pointctr;
182 coords = (
float *)cbdata->coords;
183 coords[FW_pointctr*3+0] = (float)c[0];
184 coords[FW_pointctr*3+1] = (float)c[1];
185 coords[FW_pointctr*3+2] = (float)c[2];
186 cbdata->ria[(*cbdata->riaindex)] = FW_pointctr;
187 *out = &cbdata->ria[(*cbdata->riaindex)];
190 *(cbdata->counter) = FW_pointctr + 1;
191 (*cbdata->riaindex)++;
195void CALLBACK FW_tess_combine_polyrep_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
211 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
273void verify_global_IFS_Coords(
int max) {
277 for (count = 0; count < tg->Tess.global_IFS_Coord_count; count++) {
280 if ((tg->Tess.global_IFS_Coords[count] < 0) ||
281 (tg->Tess.global_IFS_Coords[count] >= max)) {
284 tg->Tess.global_IFS_Coords[count] = 0;
286 tg->Tess.global_IFS_Coords[count] = tg->Tess.global_IFS_Coords[count-1];
293void CALLBACK FW_tess_combine (GLDOUBLE c[3],
void *d[4], GLfloat w[4],
void **out) {
294 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
307void CALLBACK XXtessA() { printf (
"GLU_TESS_BEGIN\n"); }
308void CALLBACK XXtessB() { printf (
"GLU_TESS_BEGIN_DATA\n"); }
309void CALLBACK XXtessC() { printf (
"GLU_TESS_EDGE\n"); }
310void CALLBACK XXtessD() { printf (
"GLU_TESS_EDGE_FLAG_DATA\n"); }
311void CALLBACK XXtessE() { printf (
"GLU_TESS_VERTEX\n"); }
312void CALLBACK XXtessF() { printf (
"GLU_TESS_VERTEX_DATA\n"); }
313void CALLBACK XXtessG() { printf (
"GLU_TESS_END\n"); }
314void CALLBACK XXtessH() { printf (
"GLU_TESS_END_DATA\n"); }
315void CALLBACK XXtessI() { printf (
"GLU_TESS_COMBINE_DATA\n"); }
316void CALLBACK XXtessJ() { printf (
"GLU_TESS_ERROR\n"); }
317void CALLBACK XXtessK() { printf (
"GLU_TESS_ERROR_DATA\n"); }
320void new_tessellation(
void) {
322 tg->Tess.global_tessobj=FW_GLU_NEW_TESS();
323 if(!tg->Tess.global_tessobj)
324 freewrlDie(
"Got no memory for Tessellation Object!");
327 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_BEGIN,(_GLUfuncptr)FW_tess_begin);
328 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_EDGE_FLAG,(_GLUfuncptr)FW_tess_edgeflag);
330 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_VERTEX,(_GLUfuncptr)FW_IFS_tess_vertex);
331 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_ERROR,(_GLUfuncptr)FW_tess_error);
332 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_END,(_GLUfuncptr)FW_tess_end);
333 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_polyrep_data);
369void destruct_tessellation(
void) {
371 FW_GLU_DELETETESS(tg->Tess.global_tessobj);
372 printf(
"Tessellation Object deleted!\n");
375void destruct_text_tessellation(
void) {
377 FW_GLU_DELETETESS(tg->Tess.text_tessobj);
378 printf(
"Tessellation Object deleted!\n");
381void CALLBACK FW_text_tess_vertex(
void *p) {
386 if (tg->Tess.text_IFS_Coord_count == TESS_MAX_COORDS) {
398 tg->Tess.text_IFS_Coords[tg->Tess.text_IFS_Coord_count++] = *dp;
404void new_text_tessellation(
void) {
406 tg->Tess.text_tessobj=FW_GLU_NEW_TESS();
407 if(!tg->Tess.text_tessobj)
408 freewrlDie(
"Got no memory for Tessellation Object!");
411 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_BEGIN,(_GLUfuncptr)FW_tess_begin);
412 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_EDGE_FLAG,(_GLUfuncptr)FW_tess_edgeflag);
414 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_VERTEX,(_GLUfuncptr)FW_text_tess_vertex);
415 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_ERROR,(_GLUfuncptr)FW_tess_error);
416 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_END,(_GLUfuncptr)FW_tess_end);
417 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_text_data);