32 #include <libFreeWRL.h>
34 #include "../vrml_parser/Structs.h"
35 #include "../main/headers.h"
40 typedef void (__stdcall *_GLUfuncptr)();
69 int global_IFS_Coords[TESS_MAX_COORDS];
71 void *Tess_constructor(){
72 void *v = MALLOCV(
sizeof(
struct pTess));
73 memset(v,0,
sizeof(
struct pTess));
76 void Tess_init(
struct tTess *t){
81 t->prv = Tess_constructor();
84 t->global_IFS_Coords = p->global_IFS_Coords;
93 void CALLBACK FW_tess_begin(GLenum e) {
99 freewrlDie(
"Something went wrong while tessellating!");
102 void CALLBACK FW_tess_end(
void) {
107 void CALLBACK FW_tess_edgeflag(GLenum flag) {
113 void CALLBACK FW_IFS_tess_vertex(
void *p) {
118 if (tg->Tess.global_IFS_Coord_count == TESS_MAX_COORDS) {
130 tg->Tess.global_IFS_Coords[tg->Tess.global_IFS_Coord_count++] = *dp;
135 void CALLBACK FW_tess_error(GLenum e) {
139 printf(
"FW_tess_error %d: >%s<\n",(
int) e,GL_ERROR_MSG);
144 void CALLBACK FW_tess_combine_text_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
160 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
167 int FW_pointctr, RAI_indx;
178 FW_pointctr = *(cbdata->counter);
179 RAI_indx = *(cbdata->riaindex);
180 tg->Tess.global_IFS_Coords[RAI_indx] = FW_pointctr;
181 coords = (
float *)cbdata->coords;
182 coords[FW_pointctr*3+0] = (
float)c[0];
183 coords[FW_pointctr*3+1] = (float)c[1];
184 coords[FW_pointctr*3+2] = (float)c[2];
185 cbdata->ria[(*cbdata->riaindex)] = FW_pointctr;
186 *out = &cbdata->ria[(*cbdata->riaindex)];
189 *(cbdata->counter) = FW_pointctr + 1;
190 (*cbdata->riaindex)++;
194 void CALLBACK FW_tess_combine_polyrep_data (GLDOUBLE c[3], GLfloat *d[4], GLfloat w[4],
void **out,
void *polygondata) {
210 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
272 void verify_global_IFS_Coords(
int max) {
276 for (count = 0; count < tg->Tess.global_IFS_Coord_count; count++) {
279 if ((tg->Tess.global_IFS_Coords[count] < 0) ||
280 (tg->Tess.global_IFS_Coords[count] >= max)) {
283 tg->Tess.global_IFS_Coords[count] = 0;
285 tg->Tess.global_IFS_Coords[count] = tg->Tess.global_IFS_Coords[count-1];
292 void CALLBACK FW_tess_combine (GLDOUBLE c[3],
void *d[4], GLfloat w[4],
void **out) {
293 GLDOUBLE *nv = MALLOC(GLDOUBLE *,
sizeof(GLDOUBLE)*3);
306 void CALLBACK XXtessA() { printf (
"GLU_TESS_BEGIN\n"); }
307 void CALLBACK XXtessB() { printf (
"GLU_TESS_BEGIN_DATA\n"); }
308 void CALLBACK XXtessC() { printf (
"GLU_TESS_EDGE\n"); }
309 void CALLBACK XXtessD() { printf (
"GLU_TESS_EDGE_FLAG_DATA\n"); }
310 void CALLBACK XXtessE() { printf (
"GLU_TESS_VERTEX\n"); }
311 void CALLBACK XXtessF() { printf (
"GLU_TESS_VERTEX_DATA\n"); }
312 void CALLBACK XXtessG() { printf (
"GLU_TESS_END\n"); }
313 void CALLBACK XXtessH() { printf (
"GLU_TESS_END_DATA\n"); }
314 void CALLBACK XXtessI() { printf (
"GLU_TESS_COMBINE_DATA\n"); }
315 void CALLBACK XXtessJ() { printf (
"GLU_TESS_ERROR\n"); }
316 void CALLBACK XXtessK() { printf (
"GLU_TESS_ERROR_DATA\n"); }
319 void new_tessellation(
void) {
321 tg->Tess.global_tessobj=FW_GLU_NEW_TESS();
322 if(!tg->Tess.global_tessobj)
323 freewrlDie(
"Got no memory for Tessellation Object!");
326 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_BEGIN,(_GLUfuncptr)FW_tess_begin);
327 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_EDGE_FLAG,(_GLUfuncptr)FW_tess_edgeflag);
329 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_VERTEX,(_GLUfuncptr)FW_IFS_tess_vertex);
330 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_ERROR,(_GLUfuncptr)FW_tess_error);
331 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj,GLU_TESS_END,(_GLUfuncptr)FW_tess_end);
332 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_polyrep_data);
351 void register_Text_combiner(){
354 if(tg->Tess.global_tessobj){
356 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_text_data);
359 void register_Polyrep_combiner(){
362 if(tg->Tess.global_tessobj){
364 FW_GLU_TESS_CALLBACK(tg->Tess.global_tessobj, GLU_TESS_COMBINE_DATA,(_GLUfuncptr)FW_tess_combine_polyrep_data);
368 void destruct_tessellation(
void) {
370 FW_GLU_DELETETESS(tg->Tess.global_tessobj);
371 printf(
"Tessellation Object deleted!\n");