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, GLfloat thisTransparency) {
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];
138 dest->c[3] = 1.0f - thisTransparency;
144void stream_polyrep(
void *innode,
void *coord,
void *fogCoord,
void *color,
void *normal,
struct X3D_TextureCoordinate *texCoordNode) {
148 int i, j, k, nmtexcoord;
152 struct SFVec3f *points= NULL;
int npoints=0;
153 struct SFColor *colors= NULL;
int ncolors=0;
154 struct SFVec3f *normals= NULL;
int nnormals=0;
155 float *fogpoints = NULL;
164 GLuint *newcindex = NULL;
165 GLuint *newtcindex = NULL;
166 struct SFVec3f *newpoints = NULL;
167 float *newfog = NULL;
168 struct SFVec3f *newnorms = NULL;
171 float *newTexCoords[MAX_MULTITEXTURE];
172 bool temp_points = FALSE;
173 struct Multi_Vec2f *textureCoordPoint[MAX_MULTITEXTURE];
174 int ntexdim[MAX_MULTITEXTURE];
175 for(k=0;k<MAX_MULTITEXTURE;k++){
176 textureCoordPoint[k] = NULL;
177 newTexCoords[k] = NULL;
183 node = X3D_NODE(innode);
187 #ifdef STREAM_POLY_VERBOSE
188 printf (
"start spv for %p extents %lf %lf, %lf %lf, %lf %lf\n",node,
202 printf (
"stream IFS, at start, this guy is empty, just returning \n");
209 if (xc->_nodeType != NODE_Coordinate && xc->_nodeType != NODE_GeoCoordinate ) {
210 printf (
"stream_polyrep, coord expected %d, got %d\n",NODE_Coordinate, xc->_nodeType);
213 }
else if(xc->_nodeType == NODE_GeoCoordinate){
219 points = MALLOC(
struct SFVec3f *,
sizeof(
struct SFVec3f)*(xgc->point.n));
220 npoints = xgc->point.n;
221 for(i=0;i<npoints;i++)
224 points[i].c[j] = (
float) xgc->point.p[i].c[j];
227 points = xgc->__movedCoords.p;
228 npoints = xgc->__movedCoords.n;
230 }
else { points = xc->point.p; npoints = xc->point.n; }
233 #ifdef STREAM_POLY_VERBOSE
234 printf (
"so, points is %p, npoints is %d ntri %d\n",points, npoints,r->ntri);
237 if (((
struct X3D_Node*)fogCoord)->_nodeType == NODE_FogCoordinate){
239 fogpoints = xfc->depth.p;
244 if ((cc->_nodeType != NODE_Color) && (cc->_nodeType != NODE_ColorRGBA)) {
245 ConsoleMessage (
"stream_polyrep, expected %d got %d\n", NODE_Color, cc->_nodeType);
249 colors = cc->color.p;
250 ncolors = cc->color.n;
251 isRGBA = (cc->_nodeType == NODE_ColorRGBA);
257 if (nc->_nodeType != NODE_Normal) {
258 ConsoleMessage (
"stream_polyrep, normal expected %d, got %d\n",NODE_Normal, nc->_nodeType);
261 }
else { normals = nc->vector.p; nnormals = nc->vector.n; }
265 if ((r->tcoordtype != NODE_TextureCoordinate) &&
266 (r->tcoordtype != NODE_TextureCoordinate3D) &&
267 (r->tcoordtype != NODE_TextureCoordinate4D) &&
268 (r->tcoordtype != NODE_MultiTextureCoordinate) &&
269 (r->tcoordtype != NODE_TextureCoordinateGenerator )) {
270 ConsoleMessage (
"stream_polyrep, TexCoord expected %d, got %d\n",NODE_TextureCoordinate, r->tcoordtype);
275 if (r->tcoordtype == NODE_TextureCoordinate) {
277 textureCoordPoint[0] = &(texCoordNode->point);
281 if (r->tcoordtype == NODE_TextureCoordinate3D) {
285 textureCoordPoint[0] = (
struct Multi_Vec2f*) &(tcn->point);
289 if (r->tcoordtype == NODE_TextureCoordinate4D) {
293 textureCoordPoint[0] =(
struct Multi_Vec2f*) &(tcn->point);
298 if (r->tcoordtype == NODE_MultiTextureCoordinate) {
301 if(mtc->texCoord.n && mtc->texCoord.p){
302 for(k=0;k<min(mtc->texCoord.n,MAX_MULTITEXTURE);k++){
303 textureCoordPoint[k] = NULL;
304 if( mtc->texCoord.p[k]->_nodeType == NODE_TextureCoordinate){
306 textureCoordPoint[k] = &(ttcc->point);
316 if (r->tcoordtype == NODE_TextureCoordinateGenerator) {
317 r->texgentype = findFieldInARR(((
struct X3D_TextureCoordinateGenerator *)texCoordNode)->mode->strptr, TEXTURECOORDINATEGENERATOR, TEXTURECOORDINATEGENERATOR_COUNT);
322 #ifdef STREAM_POLY_VERBOSE
323 printf (
"\nstart stream_polyrep ncoords %d ncolors %d nnormals %d ntri %d\n",
324 npoints, ncolors, nnormals, r->ntri);
328 #ifdef STREAM_POLY_VERBOSE
329 printf (
"stream polyrep, have an intern type of %d GeneratedTexCoords %p tcindex %p\n",r->tcoordtype, r->GeneratedTexCoords,r->tcindex);
330 printf (
"polyv, points %p coord %p ntri %d rnormal %p nnormal %d\n",points,r->actualCoord,r->ntri,r->normal, nnormals);
334 hasc = ((ncolors || r->color) && (gglobal()->RenderFuncs.last_texture_type!=TEXTURE_NO_ALPHA));
339 #ifdef STREAM_POLY_VERBOSE
340 printf (
"mustGenerateTextures, MALLOCing newtc\n");
344 if (!r->GeneratedTexCoords[0]) {
345 newTexCoords[0] = MALLOC (
float *,
sizeof (
float)*ntexdim[0]*r->ntri*3);
346 for(k=1;k<nmtexcoord;k++)
347 newTexCoords[k] = MALLOC (
float *,
sizeof (
float)*ntexdim[k]*r->ntri*3);
353 newcindex = MALLOC (GLuint *,
sizeof (GLuint)*r->ntri*3);
354 newtcindex = MALLOC (GLuint *,
sizeof (GLuint)*r->ntri*3);
356 newpoints = MALLOC (
struct SFVec3f *,
sizeof (
struct SFVec3f)*r->ntri*3);
358 newfog = MALLOC (
float *,
sizeof(
float)*r->ntri*3);
360 if ((nnormals) || (r->normal)) {
361 newnorms = MALLOC (
struct SFVec3f *,
sizeof (
struct SFVec3f)*r->ntri*3);
373 for (j=0; j<3; j++) {
375 r->minVals[j] = points[r->cindex[0]].c[j];
376 r->maxVals[j] = points[r->cindex[0]].c[j];
378 if (r->actualCoord!=NULL) {
379 r->minVals[j] = r->actualCoord[3*r->cindex[0]+j];
380 r->maxVals[j] = r->actualCoord[3*r->cindex[0]+j];
386 for(i=0; i<r->ntri*3; i++) {
387 int ind = r->cindex[i];
388 for (j=0; j<3; j++) {
390 if (ind >= npoints) {
394 printf (
"spv, warning, index %d >= npoints %d\n",ind,npoints);
396 if (r->minVals[j] > points[ind].c[j]) r->minVals[j] = points[ind].c[j];
397 if (r->maxVals[j] < points[ind].c[j]) r->maxVals[j] = points[ind].c[j];
399 }
else if(r->actualCoord) {
400 if (r->minVals[j] > r->actualCoord[3*ind+j]) r->minVals[j] = r->actualCoord[3*ind+j];
401 if (r->maxVals[j] < r->actualCoord[3*ind+j]) r->maxVals[j] = r->actualCoord[3*ind+j];
409 if (NO_TEXCOORD_NODE) {
410 defaultTextureMap(node, r);
426 if (node->_parentVector != NULL) {
427 if (vectorSize(node->_parentVector) != 0) {
428 parent = vector_get(
struct X3D_Shape *, node->_parentVector, 0);
430 if (parent->_nodeType == NODE_Shape) {
432 POSSIBLE_PROTO_EXPANSION(
struct X3D_Appearance *, parent->appearance,app)
435 if (app->_nodeType == NODE_Appearance) {
437 POSSIBLE_PROTO_EXPANSION(
struct X3D_Material *, app->material,mat)
440 if (mat->_nodeType == NODE_Material) {
441 thisTrans = mat->transparency;
455 #ifdef STREAM_POLY_VERBOSE
456 printf (
"before streaming for %p, extents %f %f, %f %f, %f %f\n",
467 extent6f_clear(node->_extent);
468 for(i=0; i<r->ntri*3; i++) {
471 int ind = r->cindex[i];
477 #ifdef STREAM_POLY_VERBOSE
478 printf (
"rp, i, ntri*3 %d %d\n",i,r->ntri*3);
482 if(r->norindex) { nori = r->norindex[i];}
486 coli = r->colindex[i];
492 newtcindex[i] = r->tcindex[i];
493 #ifdef STREAM_POLY_VERBOSE
494 printf (
"have textures, and tcindex i %d tci %d\n",i,newtcindex[i]);
501 if(nori >= nnormals) {
505 #ifdef STREAM_POLY_VERBOSE
506 printf (
"nnormals at %d , nori %d ",(
int) &normals[nori].c,nori);
507 fwnorprint (normals[nori].c);
510 do_glNormal3fv(&newnorms[i], normals[nori].c);
511 }
else if(r->normal) {
512 #ifdef STREAM_POLY_VERBOSE
513 printf (
"r->normal nori %d ",nori);
514 fwnorprint(r->normal+3*nori);
517 do_glNormal3fv(&newnorms[i], r->normal+3*nori);
524 if (coli >= ncolors) {
528 #ifdef STREAM_POLY_VERBOSE
529 printf (
"coloUr ncolors %d, coli %d",ncolors,coli);
530 fwnorprint(colors[coli].c);
534 do_glColor4fv(&newcolors[i],oldColorsRGBA[coli].c,isRGBA,thisTrans);
536 do_glColor4fv(&newcolors[i],colors[coli].c,isRGBA,thisTrans);
537 }
else if(r->color) {
538 #ifdef STREAM_POLY_VERBOSE
540 fwnorprint(r->color+3*coli);
544 do_glColor4fv(&newcolors[i],r->color+4*coli,isRGBA,thisTrans);
546 do_glColor4fv(&newcolors[i],r->color+3*coli,isRGBA,thisTrans);
555 newpoints[i].c[0] = 0.0f;
556 newpoints[i].c[1] = 0.0f;
557 newpoints[i].c[2] = 0.0f;
560 memcpy (&newpoints[i], &points[ind].c[0],
sizeof (
struct SFColor));
561 if(newfog) memcpy(&newfog[i],&fogpoints[ind],
sizeof(
float));
562 #ifdef STREAM_POLY_VERBOSE
563 printf(
"Render (points) #%d = [%.5f, %.5f, %.5f] from [%.5f, %.5f, %.5f]\n",i,
564 newpoints[i].c[0],newpoints[i].c[1],newpoints[i].c[2],
565 points[ind].c[0], points[ind].c[1],points[ind].c[2]);
568 }
else if(r->actualCoord) {
569 memcpy (&newpoints[i].c[0], &r->actualCoord[3*ind],
sizeof(
struct SFColor));
570 #ifdef STREAM_POLY_VERBOSE
571 printf(
"Render (r->actualCoord) #%d = [%.5f, %.5f, %.5f]\n",i,
572 newpoints[i].c[0],newpoints[i].c[1],newpoints[i].c[2]);
575 #ifdef STREAM_POLY_VERBOSE
576 printf (
"spv, no points and no coords, setting to 0,0,0\n");
578 newpoints[i].c[0] = 0.0f; newpoints[i].c[1]=0.0f;newpoints[i].c[2]=0.0f;
585 if (!r->GeneratedTexCoords[0]) {
586 for(k=0;k<(max(1,nmtexcoord));k++){
587 if (textureCoordPoint[k] != NULL) {
589 int j = newtcindex[i];
595 if (j>=(textureCoordPoint[k]->n)) {
599 ConsoleMessage (
"stream_polyrep, have tcindex %d, tex coords %d, overflow",j,textureCoordPoint[k]->n);
604 jj = textureCoordPoint[k]->n / max(1,nmtexcoord);
605 j= j % textureCoordPoint[k]->n;
614 me = (
float*)textureCoordPoint[k]->p;
618 newTexCoords[k][i*ndim] = me[0]/(float)(jj);
619 newTexCoords[k][i*ndim+1] = me[1]/(float)(jj);
621 newTexCoords[k][i*ndim] = me[0];
622 newTexCoords[k][i*ndim+1] = me[1];
625 newTexCoords[k][i*ndim+2] = me[2];
627 newTexCoords[k][i*ndim+3] = me[3];
635 newTexCoords[k][i*ndim] = (newpoints[i].c[p->Sindex] - p->minVals[p->Sindex])/p->Ssize;
636 newTexCoords[k][i*ndim+1] = (newpoints[i].c[p->Tindex] - p->minVals[p->Tindex])/p->Ssize;
639 newTexCoords[k][i*ndim+2] = (newpoints[i].c[p->Tindex] - p->minVals[p->Tindex])/p->Ssize;;
642 newTexCoords[k][i*ndim+3] = 1.0f;
654 if (newpoints[i].c[0] > node->EXTENT_MAX_X) node->EXTENT_MAX_X = newpoints[i].c[0];
655 if (newpoints[i].c[0] < node->EXTENT_MIN_X) node->EXTENT_MIN_X = newpoints[i].c[0];
656 if (newpoints[i].c[1] > node->EXTENT_MAX_Y) node->EXTENT_MAX_Y = newpoints[i].c[1];
657 if (newpoints[i].c[1] < node->EXTENT_MIN_Y) node->EXTENT_MIN_Y = newpoints[i].c[1];
658 if (newpoints[i].c[2] > node->EXTENT_MAX_Z) node->EXTENT_MAX_Z = newpoints[i].c[2];
659 if (newpoints[i].c[2] < node->EXTENT_MIN_Z) node->EXTENT_MIN_Z = newpoints[i].c[2];
661 extent6f_union_vec3f(node->_extent,newpoints[i].c);
666 FREE_IF_NZ(r->actualCoord);
667 r->actualCoord = (
float *)newpoints;
668 FREE_IF_NZ(r->normal);
669 r->normal = (
float *)newnorms;
670 FREE_IF_NZ(r->flat_normal);
671 FREE_IF_NZ(r->cindex);
672 r->cindex = newcindex;
673 FREE_IF_NZ(r->actualFog);
674 r->actualFog = (
float*)newfog;
679 for(k=0;k<max(1,nmtexcoord);k++){
680 if (newTexCoords[k] != NULL) {
681 FREE_IF_NZ(r->GeneratedTexCoords[k]);
682 r->GeneratedTexCoords[k] = newTexCoords[k];
689 r->ntcoord = nmtexcoord;
690 memcpy(r->ntexdim,ntexdim,4*
sizeof(
int));
691 FREE_IF_NZ(r->color);
692 FREE_IF_NZ(r->colindex);
698 r->color = (
float *)newcolors;
701 FREE_IF_NZ(r->tcindex);
702 r->tcindex=newtcindex;
705 FREE_IF_NZ(r->norindex);
707 #ifdef STREAM_POLY_VERBOSE
708 printf (
"end stream_polyrep - ntri %d\n\n",r->ntri);
715 r->transparency = thisTrans;
716 r->isRGBAcolorNode = isRGBA;
721 if (r->VBO_buffers[NORMAL_VBO] == 0) glGenBuffers(1,&r->VBO_buffers[NORMAL_VBO]);
722 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[NORMAL_VBO]);
723 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
struct SFColor)*3,r->normal, GL_STATIC_DRAW);
728 if (r->VBO_buffers[COLOR_VBO] == 0) glGenBuffers(1,&r->VBO_buffers[COLOR_VBO]);
729 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[COLOR_VBO]);
730 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
struct SFColorRGBA)*3,r->color, GL_STATIC_DRAW);
734 if (r->VBO_buffers[FOG_VBO] == 0) glGenBuffers(1,&r->VBO_buffers[FOG_VBO]);
735 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[FOG_VBO]);
736 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
float)*3,r->actualFog, GL_STATIC_DRAW);
739 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[VERTEX_VBO]);
740 glBufferData(GL_ARRAY_BUFFER,r->ntri*
sizeof(
struct SFColor)*3,r->actualCoord, GL_STATIC_DRAW);
742 FW_GL_BINDBUFFER(GL_ELEMENT_ARRAY_BUFFER,r->VBO_buffers[INDEX_VBO]);
753 r->tri_indices = MALLOC(GLushort *,
sizeof(GLushort) * r->ntri*3);
758 for (i=0; i<r->ntri*3; i++) {
760 *to = (GLushort) *from; to++; from++;
763 glBufferData(GL_ELEMENT_ARRAY_BUFFER,
sizeof (GLushort)*r->ntri*3,r->tri_indices,GL_STATIC_DRAW);
770 FREE_IF_NZ(r->wire_indices);
771 lindex = MALLOC(GLushort *,
sizeof(GLushort) * r->ntri*3*2);
773 for(i=0;i<r->ntri;i++){
776 lindex[i6+0] = i3 + 0;
777 lindex[i6+1] = i3 + 1;
778 lindex[i6+2] = i3 + 1;
779 lindex[i6+3] = i3 + 2;
780 lindex[i6+4] = i3 + 2;
781 lindex[i6+5] = i3 + 0;
784 r->wire_indices = lindex;
793 FREE_IF_NZ(r->flat_normal);
794 r->flat_normal = MALLOC(GLfloat*,r->ntri*
sizeof(
struct SFColor)*3);
795 for(i=0;i<r->ntri;i++){
796 float a[3],b[3],c[3],d[3], e[3], f[3], g[3];
798 memcpy(a,&r->actualCoord[i9 +0],
sizeof(
struct SFColor));
799 memcpy(b,&r->actualCoord[i9 +3],
sizeof(
struct SFColor));
800 memcpy(c,&r->actualCoord[i9 +6],
sizeof(
struct SFColor));
805 memcpy(&r->flat_normal[i9 +0],g,
sizeof(
struct SFColor));
806 memcpy(&r->flat_normal[i9 +3],g,
sizeof(
struct SFColor));
807 memcpy(&r->flat_normal[i9 +6],g,
sizeof(
struct SFColor));
812 for(k=0;k<max(1,nmtexcoord);k++){
813 if (r->GeneratedTexCoords[k]) {
814 if (r->VBO_buffers[TEXTURE_VBO0+k] == 0) glGenBuffers(1,&r->VBO_buffers[TEXTURE_VBO0+k]);
815 FW_GL_BINDBUFFER(GL_ARRAY_BUFFER,r->VBO_buffers[TEXTURE_VBO0+k]);
816 glBufferData(GL_ARRAY_BUFFER,
sizeof (
float)*r->ntexdim[k]*r->ntri*3,r->GeneratedTexCoords[k], GL_STATIC_DRAW);
828 #ifdef STREAM_POLY_VERBOSE
829 printf (
"end spv for %p, extents %f %f, %f %f, %f %f\n",
845 GLfloat Tsize = 0.0f;
846 GLfloat Xsize = 0.0f;
847 GLfloat Ysize = 0.0f;
848 GLfloat Zsize = 0.0f;
851 psp->Sindex = 0; psp->Tindex = 0;
853 psp->minVals[0]=r->minVals[0];
854 psp->minVals[1]=r->minVals[1];
855 psp->minVals[2]=r->minVals[2];
857 #ifdef STREAM_POLY_VERBOSE
858 printf (
"have to gen default textures\n");
863 if (p->_nodeType == NODE_IndexedFaceSet || p->_nodeType == NODE_ElevationGrid) {
865 Xsize = r->maxVals[0]-psp->minVals[0];
866 Ysize = r->maxVals[1]-psp->minVals[1];
867 Zsize = r->maxVals[2]-psp->minVals[2];
871 if ((Xsize >= Ysize) && (Xsize >= Zsize)) {
873 psp->Ssize = Xsize; psp->Sindex = 0;
874 if (Ysize >= Zsize) {
875 Tsize = Ysize; psp->Tindex = 1;
877 Tsize = Zsize; psp->Tindex = 2;
879 }
else if ((Ysize >= Xsize) && (Ysize >= Zsize)) {
881 psp->Ssize = Ysize; psp->Sindex = 1;
882 if (Xsize >= Zsize) {
883 Tsize = Xsize; psp->Tindex = 0;
885 Tsize = Zsize; psp->Tindex = 2;
889 psp->Ssize = Zsize; psp->Sindex = 2;
890 if (Xsize >= Ysize) {
891 Tsize = Xsize; psp->Tindex = 0;
893 Tsize = Ysize; psp->Tindex = 1;