32#include <libFreeWRL.h>
34#include "../vrml_parser/Structs.h"
35#include "../main/headers.h"
36#include "LinearAlgebra.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();
83 ppTess p = (ppTess)t->prv;
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) {
116 ttglobal tg = gglobal();
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;
172 ttglobal tg = gglobal();
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)++;
196void CALLBACK FW_tess_combine_extrusion_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
212 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
219 int FW_pointctr, RAI_indx;
223 ttglobal tg = gglobal();
230 FW_pointctr = *(cbdata->counter);
231 RAI_indx = *(cbdata->riaindex);
232 tg->Tess.global_IFS_Coords[RAI_indx] = FW_pointctr;
233 coords = (
float *)cbdata->coords;
234 coords[FW_pointctr*3+0] = (float)c[0];
235 coords[FW_pointctr*3+1] = (float)c[1];
236 coords[FW_pointctr*3+2] = (float)c[2];
237 cbdata->ria[(*cbdata->riaindex)] = FW_pointctr;
238 *out = &cbdata->ria[(*cbdata->riaindex)];
241 *(cbdata->counter) = FW_pointctr + 1;
242 (*cbdata->riaindex)++;
246void CALLBACK FW_tess_combine_polyrep_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
262 ttglobal tg = gglobal();
264 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
326void CALLBACK FW_tess_combine_polyrep2_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
328 ttglobal tg = gglobal();
329 int FW_pointctr, RAI_indx;
338 FW_pointctr = *(cbdata->counter);
339 RAI_indx = *(cbdata->riaindex);
340 tg->Tess.global_IFS_Coords[RAI_indx] = FW_pointctr;
341 coords = (
struct SFVec3f *)cbdata->coords;
342 printf(
"combiner compute intersection %lf %lf %lf\n",c[0],c[1],c[2]);
343 double2float(coords[FW_pointctr].c, c, 3);
344 cbdata->ria[(*cbdata->riaindex)] = FW_pointctr;
345 *out = &cbdata->ria[(*cbdata->riaindex)];
348 *(cbdata->counter) = FW_pointctr + 1;
349 (*cbdata->riaindex)++;
357void verify_global_IFS_Coords(
int max) {
359 ttglobal tg = gglobal();
361 for (count = 0; count < tg->Tess.global_IFS_Coord_count; count++) {
364 if ((tg->Tess.global_IFS_Coords[count] < 0) ||
365 (tg->Tess.global_IFS_Coords[count] >= max)) {
368 tg->Tess.global_IFS_Coords[count] = 0;
370 tg->Tess.global_IFS_Coords[count] = tg->Tess.global_IFS_Coords[count-1];
377void CALLBACK FW_tess_combine (GLDOUBLE c[3],
void *d[4], GLfloat w[4],
void **out) {
378 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
391void CALLBACK XXtessA() { printf (
"GLU_TESS_BEGIN\n"); }
392void CALLBACK XXtessB() { printf (
"GLU_TESS_BEGIN_DATA\n"); }
393void CALLBACK XXtessC() { printf (
"GLU_TESS_EDGE\n"); }
394void CALLBACK XXtessD() { printf (
"GLU_TESS_EDGE_FLAG_DATA\n"); }
395void CALLBACK XXtessE() { printf (
"GLU_TESS_VERTEX\n"); }
396void CALLBACK XXtessF() { printf (
"GLU_TESS_VERTEX_DATA\n"); }
397void CALLBACK XXtessG() { printf (
"GLU_TESS_END\n"); }
398void CALLBACK XXtessH() { printf (
"GLU_TESS_END_DATA\n"); }
399void CALLBACK XXtessI() { printf (
"GLU_TESS_COMBINE_DATA\n"); }
400void CALLBACK XXtessJ() { printf (
"GLU_TESS_ERROR\n"); }
401void CALLBACK XXtessK() { printf (
"GLU_TESS_ERROR_DATA\n"); }
404void new_tessellation(
void) {
405 ttglobal tg = gglobal();
406 tg->Tess.global_tessobj=FW_GLU_NEW_TESS();
407 if(!tg->Tess.global_tessobj)
408 freewrlDie(
"Got no memory for Tessellation Object!");
411 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_BEGIN,(_GLUfuncptr)FW_tess_begin);
412 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_EDGE_FLAG,(_GLUfuncptr)FW_tess_edgeflag);
414 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_VERTEX,(_GLUfuncptr)FW_IFS_tess_vertex);
415 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_ERROR,(_GLUfuncptr)FW_tess_error);
416 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_END,(_GLUfuncptr)FW_tess_end);
417 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_polyrep_data);
453void set_tess_callbacks(
int variant){
454 ttglobal tg = gglobal();
457 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_extrusion_data);
458 }
else if(variant == 2){
460 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_polyrep2_data);
463 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_polyrep_data);
466void destruct_tessellation(
void) {
467 ttglobal tg = gglobal();
468 FW_GLU_DELETETESS(tg->Tess.global_tessobj);
469 printf(
"Tessellation Object deleted!\n");
472void destruct_text_tessellation(
void) {
473 ttglobal tg = gglobal();
474 FW_GLU_DELETETESS(tg->Tess.text_tessobj);
475 printf(
"Tessellation Object deleted!\n");
478void CALLBACK FW_text_tess_vertex(
void *p) {
480 ttglobal tg = gglobal();
483 if (tg->Tess.text_IFS_Coord_count == TESS_MAX_COORDS) {
495 tg->Tess.text_IFS_Coords[tg->Tess.text_IFS_Coord_count++] = *dp;
501void new_text_tessellation(
void) {
502 ttglobal tg = gglobal();
503 tg->Tess.text_tessobj=FW_GLU_NEW_TESS();
504 if(!tg->Tess.text_tessobj)
505 freewrlDie(
"Got no memory for Tessellation Object!");
508 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_BEGIN,(_GLUfuncptr)FW_tess_begin);
509 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_EDGE_FLAG,(_GLUfuncptr)FW_tess_edgeflag);
511 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_VERTEX,(_GLUfuncptr)FW_text_tess_vertex);
512 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_ERROR,(_GLUfuncptr)FW_tess_error);
513 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj,GLU_TESS_END,(_GLUfuncptr)FW_tess_end);
514 FW_GLU_TESS_CALLBACK(tg->Tess.text_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_text_data);