34#include <libFreeWRL.h>
36#include "../vrml_parser/Structs.h"
37#include "../main/headers.h"
38#include "../opengl/OpenGL_Utils.h"
39#include "../opengl/Textures.h"
40#include "../scenegraph/RenderFuncs.h"
41#include "../scenegraph/Component_Shape.h"
42#include "../opengl/Frustum.h"
46#define NO_TEXCOORD_NODE (r->tcoordtype==0)
89void *StreamPoly_constructor(){
94void StreamPoly_init(
struct tStreamPoly *t){
97 t->prv = StreamPoly_constructor();
115static void do_glColor4fv(
struct SFColorRGBA *dest, GLfloat *param,
int isRGBA) {
119 if (isRGBA) pc = 4;
else pc = 3;
124 for (i=0; i<pc; i++) {
125 if ((param[i] < 0.0) || (param[i] >1.0)) {
129 dest->c[0] = param[0];
130 dest->c[1] = param[1];
131 dest->c[2] = param[2];
135 dest->c[3] = param[3];
144void stream_polyrep(
void *innode,
void *coord,
void *fogCoord,
void *color,
void *normal,
struct X3D_TextureCoordinate *texCoordNode) {
151 int i, j, k, nmtexcoord;
155 struct SFVec3f *points= NULL;
int npoints=0;
156 struct SFColor *colors= NULL;
int ncolors=0;
157 struct SFVec3f *normals= NULL;
int nnormals=0;
158 float *fogpoints = NULL;
167 GLuint *newcindex = NULL;
168 GLuint *newtcindex = NULL;
169 struct SFVec3f *newpoints = NULL;
170 float *newfog = NULL;
171 struct SFVec3f *newnorms = NULL;
174 float *newTexCoords[MAX_MULTITEXTURE];
175 bool temp_points = FALSE;
176 struct Multi_Vec2f *textureCoordPoint[MAX_MULTITEXTURE];
177 int ntexdim[MAX_MULTITEXTURE];
178 char* map[MAX_MULTITEXTURE];
179 for(k=0;k<MAX_MULTITEXTURE;k++){
180 textureCoordPoint[k] = NULL;
181 newTexCoords[k] = NULL;
188 node = X3D_NODE(innode);
192 #ifdef STREAM_POLY_VERBOSE
193 printf (
"start spv for %p extents %lf %lf, %lf %lf, %lf %lf\n",node,
207 printf (
"stream IFS, at start, this guy is empty, just returning \n");
214 if (xc->_nodeType != NODE_Coordinate && xc->_nodeType != NODE_GeoCoordinate ) {
215 printf (
"stream_polyrep, coord expected %d, got %d\n",NODE_Coordinate, xc->_nodeType);
218 }
else if(xc->_nodeType == NODE_GeoCoordinate){
224 points = MALLOC(
struct SFVec3f *,
sizeof(
struct SFVec3f)*(xgc->point.n));
225 npoints = xgc->point.n;
226 for(i=0;i<npoints;i++)
229 points[i].c[j] = (
float) xgc->point.p[i].c[j];
232 points = xgc->__movedCoords.p;
233 npoints = xgc->__movedCoords.n;
235 }
else { points = xc->point.p; npoints = xc->point.n; }
238 #ifdef STREAM_POLY_VERBOSE
239 printf (
"so, points is %p, npoints is %d ntri %d\n",points, npoints,r->ntri);
242 if (((
struct X3D_Node*)fogCoord)->_nodeType == NODE_FogCoordinate){
244 fogpoints = xfc->depth.p;
249 if ((cc->_nodeType != NODE_Color) && (cc->_nodeType != NODE_ColorRGBA)) {
250 ConsoleMessage (
"stream_polyrep, expected %d got %d\n", NODE_Color, cc->_nodeType);
254 colors = cc->color.p;
255 ncolors = cc->color.n;
256 isRGBA = (cc->_nodeType == NODE_ColorRGBA);
262 if (nc->_nodeType != NODE_Normal) {
263 ConsoleMessage (
"stream_polyrep, normal expected %d, got %d\n",NODE_Normal, nc->_nodeType);
266 }
else { normals = nc->vector.p; nnormals = nc->vector.n; }
270 if ((r->tcoordtype != NODE_TextureCoordinate) &&
271 (r->tcoordtype != NODE_TextureCoordinate3D) &&
272 (r->tcoordtype != NODE_TextureCoordinate4D) &&
273 (r->tcoordtype != NODE_MultiTextureCoordinate) &&
274 (r->tcoordtype != NODE_TextureCoordinateGenerator )) {
275 ConsoleMessage (
"stream_polyrep, TexCoord expected %d, got %d\n",NODE_TextureCoordinate, r->tcoordtype);
280 if (r->tcoordtype == NODE_TextureCoordinate) {
283 textureCoordPoint[0] = &(texCoordNode->point);
286 map[0] = texCoordNode->mapping ? texCoordNode->mapping->strptr : NULL;
289 if (r->tcoordtype == NODE_TextureCoordinate3D) {
293 textureCoordPoint[0] = (
struct Multi_Vec2f*) &(tcn->point);
296 map[0] = tcn->mapping ? tcn->mapping->strptr : NULL;
298 if (r->tcoordtype == NODE_TextureCoordinate4D) {
302 textureCoordPoint[0] =(
struct Multi_Vec2f*) &(tcn->point);
305 map[0] = tcn->mapping ? tcn->mapping->strptr : NULL;
308 if (r->tcoordtype == NODE_MultiTextureCoordinate) {
311 if(mtc->texCoord.n && mtc->texCoord.p){
312 for(k=0;k<min(mtc->texCoord.n,MAX_MULTITEXTURE);k++){
313 textureCoordPoint[k] = NULL;
314 if( mtc->texCoord.p[k]->_nodeType == NODE_TextureCoordinate){
316 textureCoordPoint[k] = &(ttcc->point);
318 map[k] = ttcc->mapping ? ttcc->mapping->strptr : NULL;
327 if (r->tcoordtype == NODE_TextureCoordinateGenerator) {
329 r->texgentype = findFieldInARR((tcg)->mode->strptr, TEXTURECOORDINATEGENERATOR, TEXTURECOORDINATEGENERATOR_COUNT);
331 map[0] = tcg->mapping ? tcg->mapping->strptr : NULL;
335 #ifdef STREAM_POLY_VERBOSE
336 printf (
"\nstart stream_polyrep ncoords %d ncolors %d nnormals %d ntri %d\n",
337 npoints, ncolors, nnormals, r->ntri);
341 #ifdef STREAM_POLY_VERBOSE
342 printf (
"stream polyrep, have an intern type of %d GeneratedTexCoords %p tcindex %p\n",r->tcoordtype, r->GeneratedTexCoords,r->tcindex);
343 printf (
"polyv, points %p coord %p ntri %d rnormal %p nnormal %d\n",points,r->actualCoord,r->ntri,r->normal, nnormals);
347 hasc = ((ncolors || r->color) && (gglobal()->RenderFuncs.last_texture_type!=TEXTURE_NO_ALPHA));
352 #ifdef STREAM_POLY_VERBOSE
353 printf (
"mustGenerateTextures, MALLOCing newtc\n");
357 if (!r->GeneratedTexCoords[0]) {
358 newTexCoords[0] = MALLOC(
float*,
sizeof(
float) * ntexdim[0] * r->ntri * 3);
359 for (k = 1; k < nmtexcoord; k++){
360 newTexCoords[k] = MALLOC(
float*,
sizeof(
float) * ntexdim[k] * r->ntri * 3);
367 newcindex = MALLOC (GLuint *,
sizeof (GLuint)*r->ntri*3);
368 newtcindex = MALLOC (GLuint *,
sizeof (GLuint)*r->ntri*3);
370 newpoints = MALLOC (
struct SFVec3f *,
sizeof (
struct SFVec3f)*r->ntri*3);
373 newfog = MALLOC (
float *,
sizeof(
float)*r->ntri*3);
375 if ((nnormals) || (r->normal)) {
376 newnorms = MALLOC (
struct SFVec3f *,
sizeof (
struct SFVec3f)*r->ntri*3);
388 for (j=0; j<3; j++) {
390 r->minVals[j] = points[r->cindex[0]].c[j];
391 r->maxVals[j] = points[r->cindex[0]].c[j];
393 if (r->actualCoord!=NULL) {
394 r->minVals[j] = r->actualCoord[3*r->cindex[0]+j];
395 r->maxVals[j] = r->actualCoord[3*r->cindex[0]+j];
401 for(i=0; i<r->ntri*3; i++) {
402 int ind = r->cindex[i];
403 for (j=0; j<3; j++) {
405 if (ind >= npoints) {
411 if (r->minVals[j] > points[ind].c[j]) r->minVals[j] = points[ind].c[j];
412 if (r->maxVals[j] < points[ind].c[j]) r->maxVals[j] = points[ind].c[j];
414 }
else if(r->actualCoord) {
415 if (r->minVals[j] > r->actualCoord[3*ind+j]) r->minVals[j] = r->actualCoord[3*ind+j];
416 if (r->maxVals[j] < r->actualCoord[3*ind+j]) r->maxVals[j] = r->actualCoord[3*ind+j];
424 if (NO_TEXCOORD_NODE) {
425 defaultTextureMap(node, r);
432 #ifdef STREAM_POLY_VERBOSE
433 printf (
"before streaming for %p, extents %f %f, %f %f, %f %f\n",
444 extent6f_clear(node->_extent);
445 for(i=0; i<r->ntri*3; i++) {
448 int ind = r->cindex[i];
454 #ifdef STREAM_POLY_VERBOSE
455 printf (
"rp, i, ntri*3 %d %d\n",i,r->ntri*3);
459 if(r->norindex) { nori = r->norindex[i];}
463 coli = r->colindex[i];
469 newtcindex[i] = r->tcindex[i];
470 #ifdef STREAM_POLY_VERBOSE
471 printf (
"have textures, and tcindex i %d tci %d\n",i,newtcindex[i]);
478 if(nori >= nnormals) {
482 #ifdef STREAM_POLY_VERBOSE
483 printf (
"nnormals at %d , nori %d ",(
int) &normals[nori].c,nori);
484 fwnorprint (normals[nori].c);
487 do_glNormal3fv(&newnorms[i], normals[nori].c);
488 }
else if(r->normal) {
489 #ifdef STREAM_POLY_VERBOSE
490 printf (
"r->normal nori %d ",nori);
491 fwnorprint(r->normal+3*nori);
494 do_glNormal3fv(&newnorms[i], r->normal+3*nori);
501 if (coli >= ncolors) {
505 #ifdef STREAM_POLY_VERBOSE
506 printf (
"coloUr ncolors %d, coli %d",ncolors,coli);
507 fwnorprint(colors[coli].c);
511 do_glColor4fv(&newcolors[i],oldColorsRGBA[coli].c,isRGBA);
513 do_glColor4fv(&newcolors[i],colors[coli].c,isRGBA);
514 }
else if(r->color) {
515 #ifdef STREAM_POLY_VERBOSE
517 fwnorprint(r->color+3*coli);
521 do_glColor4fv(&newcolors[i],r->color+4*coli,isRGBA);
523 do_glColor4fv(&newcolors[i],r->color+3*coli,isRGBA);
532 newpoints[i].c[0] = 0.0f;
533 newpoints[i].c[1] = 0.0f;
534 newpoints[i].c[2] = 0.0f;
537 memcpy (&newpoints[i], &points[ind].c[0],
sizeof (
struct SFColor));
538 if(newfog) memcpy(&newfog[i],&fogpoints[ind],
sizeof(
float));
539 #ifdef STREAM_POLY_VERBOSE
540 printf(
"Render (points) #%d = [%.5f, %.5f, %.5f] from [%.5f, %.5f, %.5f]\n",i,
541 newpoints[i].c[0],newpoints[i].c[1],newpoints[i].c[2],
542 points[ind].c[0], points[ind].c[1],points[ind].c[2]);
545 }
else if(r->actualCoord) {
546 memcpy (&newpoints[i].c[0], &r->actualCoord[3*ind],
sizeof(
struct SFColor));
547 #ifdef STREAM_POLY_VERBOSE
548 printf(
"Render (r->actualCoord) #%d = [%.5f, %.5f, %.5f]\n",i,
549 newpoints[i].c[0],newpoints[i].c[1],newpoints[i].c[2]);
552 #ifdef STREAM_POLY_VERBOSE
553 printf (
"spv, no points and no coords, setting to 0,0,0\n");
555 newpoints[i].c[0] = 0.0f; newpoints[i].c[1]=0.0f;newpoints[i].c[2]=0.0f;
562 if (!r->GeneratedTexCoords[0]) {
563 for(k=0;k<(max(1,nmtexcoord));k++){
564 if (textureCoordPoint[k] != NULL) {
566 int j = newtcindex[i];
572 j = min(j, textureCoordPoint[k]->n - 1);
593 me = (
float*)textureCoordPoint[k]->p;
598 newTexCoords[k][i * ndim] = me[0] / (float)(jj);
599 newTexCoords[k][i * ndim + 1] = me[1] / (float)(jj);
602 newTexCoords[k][i * ndim] = me[0];
603 newTexCoords[k][i * ndim + 1] = me[1];
606 newTexCoords[k][i * ndim + 2] = me[2];
608 newTexCoords[k][i * ndim + 3] = me[3];
615 ppStreamPoly p = (ppStreamPoly)gglobal()->StreamPoly.prv;
617 newTexCoords[k][i*ndim] = (newpoints[i].c[p->Sindex] - p->minVals[p->Sindex])/p->Ssize;
618 newTexCoords[k][i*ndim+1] = (newpoints[i].c[p->Tindex] - p->minVals[p->Tindex])/p->Ssize;
621 newTexCoords[k][i*ndim+2] = (newpoints[i].c[p->Tindex] - p->minVals[p->Tindex])/p->Ssize;;
624 newTexCoords[k][i*ndim+3] = 1.0f;
636 if (newpoints[i].c[0] > node->EXTENT_MAX_X) node->EXTENT_MAX_X = newpoints[i].c[0];
637 if (newpoints[i].c[0] < node->EXTENT_MIN_X) node->EXTENT_MIN_X = newpoints[i].c[0];
638 if (newpoints[i].c[1] > node->EXTENT_MAX_Y) node->EXTENT_MAX_Y = newpoints[i].c[1];
639 if (newpoints[i].c[1] < node->EXTENT_MIN_Y) node->EXTENT_MIN_Y = newpoints[i].c[1];
640 if (newpoints[i].c[2] > node->EXTENT_MAX_Z) node->EXTENT_MAX_Z = newpoints[i].c[2];
641 if (newpoints[i].c[2] < node->EXTENT_MIN_Z) node->EXTENT_MIN_Z = newpoints[i].c[2];
643 extent6f_union_vec3f(node->_extent,newpoints[i].c);
648 FREE_IF_NZ(r->actualCoord);
649 r->actualCoord = (
float *)newpoints;
650 FREE_IF_NZ(r->normal);
651 r->normal = (
float *)newnorms;
652 FREE_IF_NZ(r->flat_normal);
653 r->oindex = r->cindex;
655 FREE_IF_NZ(r->cindex);
656 r->cindex = newcindex;
657 FREE_IF_NZ(r->actualFog);
658 r->actualFog = (
float*)newfog;
663 for(k=0;k<max(1,nmtexcoord);k++){
664 if (newTexCoords[k] != NULL) {
665 FREE_IF_NZ(r->GeneratedTexCoords[k]);
666 r->GeneratedTexCoords[k] = newTexCoords[k];
673 r->ntcoord = nmtexcoord;
674 memcpy(r->ntexdim,ntexdim,4*
sizeof(
int));
675 memcpy(r->map, map, 4 *
sizeof(
char*));
676 FREE_IF_NZ(r->color);
677 FREE_IF_NZ(r->colindex);
683 r->color = (
float *)newcolors;
686 FREE_IF_NZ(r->tcindex);
687 r->tcindex=newtcindex;
690 FREE_IF_NZ(r->norindex);
692 #ifdef STREAM_POLY_VERBOSE
693 printf (
"end stream_polyrep - ntri %d\n\n",r->ntri);
701 r->isRGBAcolorNode = isRGBA;
706 if (r->VBO_buffers[NORMAL_VBO] == 0) glGenBuffers(1,&r->VBO_buffers[NORMAL_VBO]);
707 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[NORMAL_VBO]);
708 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
struct SFColor)*3,r->normal, GL_STATIC_DRAW);
713 if (r->VBO_buffers[COLOR_VBO] == 0) glGenBuffers(1,&r->VBO_buffers[COLOR_VBO]);
714 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[COLOR_VBO]);
715 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
struct SFColorRGBA)*3,r->color, GL_STATIC_DRAW);
719 if (r->VBO_buffers[FOG_VBO] == 0) glGenBuffers(1,&r->VBO_buffers[FOG_VBO]);
720 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[FOG_VBO]);
721 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
float)*3,r->actualFog, GL_STATIC_DRAW);
726 PRINT_GL_ERROR_IF_ANY(
"Stream OINDEX 0");
727 if (r->VBO_buffers[CINDEX_VBO] == 0) glGenBuffers(1, &r->VBO_buffers[CINDEX_VBO]);
728 PRINT_GL_ERROR_IF_ANY(
"Stream OINDEX 1");
730 glBindBuffer(GL_ARRAY_BUFFER, r->VBO_buffers[CINDEX_VBO]);
731 PRINT_GL_ERROR_IF_ANY(
"Stream OINDEX 2");
732 glBufferData(GL_ARRAY_BUFFER, r->ntri *
sizeof(
int) * 3, r->oindex, GL_STATIC_DRAW);
733 PRINT_GL_ERROR_IF_ANY(
"Stream OINDEX 3");
737 for (
int j = 0; j < r->ntri; j++)
740 for (
int k = 0; k < 3; k++)
741 printf(
"%d ", r->oindex[(3 * j) + k]);
748 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[VERTEX_VBO]);
749 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
struct SFColor)*3,r->actualCoord, GL_STATIC_DRAW);
751 FW_GL_BINDBUFFER(GL_ELEMENT_ARRAY_BUFFER,r->VBO_buffers[INDEX_VBO]);
762 r->tri_indices = MALLOC(GLuint *,
sizeof(GLuint) * r->ntri*3);
767 for (i=0; i<r->ntri*3; i++) {
769 *to = (GLuint) *from; to++; from++;
772 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof (GLuint)*r->ntri*3,r->tri_indices,GL_STATIC_DRAW);
779 FREE_IF_NZ(r->wire_indices);
780 lindex = MALLOC(GLuint *,
sizeof(GLuint) * r->ntri*3*2);
782 for(i=0;i<r->ntri;i++){
785 lindex[i6+0] = i3 + 0;
786 lindex[i6+1] = i3 + 1;
787 lindex[i6+2] = i3 + 1;
788 lindex[i6+3] = i3 + 2;
789 lindex[i6+4] = i3 + 2;
790 lindex[i6+5] = i3 + 0;
793 r->wire_indices = lindex;
802 FREE_IF_NZ(r->flat_normal);
803 r->flat_normal = MALLOC(GLfloat*,r->ntri*
sizeof(
struct SFColor)*3);
804 for(i=0;i<r->ntri;i++){
805 float a[3],b[3],c[3],d[3], e[3], f[3], g[3];
807 memcpy(a,&r->actualCoord[i9 +0],
sizeof(
struct SFColor));
808 memcpy(b,&r->actualCoord[i9 +3],
sizeof(
struct SFColor));
809 memcpy(c,&r->actualCoord[i9 +6],
sizeof(
struct SFColor));
814 memcpy(&r->flat_normal[i9 +0],g,
sizeof(
struct SFColor));
815 memcpy(&r->flat_normal[i9 +3],g,
sizeof(
struct SFColor));
816 memcpy(&r->flat_normal[i9 +6],g,
sizeof(
struct SFColor));
821 for(k=0;k<max(1,nmtexcoord);k++){
822 if (r->GeneratedTexCoords[k]) {
823 if (r->VBO_buffers[TEXTURE_VBO0+k] == 0) glGenBuffers(1,&r->VBO_buffers[TEXTURE_VBO0+k]);
824 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[TEXTURE_VBO0+k]);
825 glBufferData(GL_ARRAY_BUFFER,
sizeof (
float)*r->ntexdim[k]*r->ntri*3,r->GeneratedTexCoords[k], GL_STATIC_DRAW);
837 #ifdef STREAM_POLY_VERBOSE
838 printf (
"end spv for %p, extents %f %f, %f %f, %f %f\n",
851 ppStreamPoly psp = (ppStreamPoly)gglobal()->StreamPoly.prv;
854 GLfloat Tsize = 0.0f;
855 GLfloat Xsize = 0.0f;
856 GLfloat Ysize = 0.0f;
857 GLfloat Zsize = 0.0f;
860 psp->Sindex = 0; psp->Tindex = 0;
862 psp->minVals[0]=r->minVals[0];
863 psp->minVals[1]=r->minVals[1];
864 psp->minVals[2]=r->minVals[2];
866 #ifdef STREAM_POLY_VERBOSE
867 printf (
"have to gen default textures\n");
872 if (p->_nodeType == NODE_IndexedFaceSet || p->_nodeType == NODE_ElevationGrid) {
874 Xsize = r->maxVals[0]-psp->minVals[0];
875 Ysize = r->maxVals[1]-psp->minVals[1];
876 Zsize = r->maxVals[2]-psp->minVals[2];
880 if ((Xsize >= Ysize) && (Xsize >= Zsize)) {
882 psp->Ssize = Xsize; psp->Sindex = 0;
883 if (Ysize >= Zsize) {
884 Tsize = Ysize; psp->Tindex = 1;
886 Tsize = Zsize; psp->Tindex = 2;
888 }
else if ((Ysize >= Xsize) && (Ysize >= Zsize)) {
890 psp->Ssize = Ysize; psp->Sindex = 1;
891 if (Xsize >= Zsize) {
892 Tsize = Xsize; psp->Tindex = 0;
894 Tsize = Zsize; psp->Tindex = 2;
898 psp->Ssize = Zsize; psp->Sindex = 2;
899 if (Xsize >= Ysize) {
900 Tsize = Xsize; psp->Tindex = 0;
902 Tsize = Ysize; psp->Tindex = 1;