35#include <libFreeWRL.h>
37#include "../vrml_parser/Structs.h"
38#include "../vrml_parser/CRoutes.h"
39#include "../main/headers.h"
41#include "../opengl/OpenGL_Utils.h"
42#include "../opengl/Frustum.h"
43#include "../opengl/Material.h"
45#include "LinearAlgebra.h"
47#include "../scenegraph/RenderFuncs.h"
56 Stack *group_visible_stack;
57 Stack *group_extent_stack;
58 Stack *transform_local_stack;
59}* ppComponent_Grouping;
60void *Component_Grouping_constructor(){
65void Component_Grouping_init(
struct tComponent_Grouping *t){
69 t->prv = Component_Grouping_constructor();
71 ppComponent_Grouping p = (ppComponent_Grouping)t->prv;
72 p->group_visible_stack = newStack(
int);
73 stack_push(
int,p->group_visible_stack,TRUE);
74 p->group_extent_stack = newStack(extent_t);
75 p->transform_local_stack = newStack(mat4x4_t);
78void Component_Grouping_clear(
struct tComponent_Grouping *t){
79 ppComponent_Grouping p = (ppComponent_Grouping)t->prv;
80 deleteVector(
struct X3D_Node*,p->transform_local_stack);
81 deleteVector(
struct X3D_Node*,p->group_extent_stack);
82 deleteVector(
struct X3D_Node*,p->group_visible_stack);
88void push_group_visible(
int visible){
89 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
90 stack_push(
int,p->group_visible_stack,visible);
92void pop_group_visible(){
93 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
94 stack_pop(
int,p->group_visible_stack);
96int peek_group_visible(){
97 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
98 return stack_top(
int,p->group_visible_stack);
103void push_group_extent(
float *e6){
105 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
106 memcpy(&e.e,e6,6*
sizeof(
float));
107 testVector(extent_t, p->group_extent_stack);
108 stack_push(extent_t,p->group_extent_stack,e);
109 testVector(extent_t, p->group_extent_stack);
111void push_group_extent_default(){
113 extent6f_clear(extent6);
114 push_group_extent(extent6);
116void pop_group_extent(){
117 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
118 stack_pop(extent_t,p->group_extent_stack);
120float * peek_group_extent(){
121 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
128 return (stack_top_ptr(extent_t,p->group_extent_stack))->e;
130void union_group_extent(
float *e6){
131 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
132 float *etop = peek_group_extent();
133 testVector(extent_t, p->group_extent_stack);
134 extent6f_union_extent6f(etop,e6);
135 testVector(extent_t, p->group_extent_stack);
137void draw_bbox(
float *center,
float *size);
142void push_transform_local(
double *mat){
144 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
145 memcpy(&m4.mat,mat,16*
sizeof(
double));
146 stack_push(mat4x4_t,p->transform_local_stack,m4);
148void push_transform_local_identity(){
151 push_transform_local(m4);
153void pop_transform_local(){
154 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
155 stack_pop(mat4x4_t,p->transform_local_stack);
157double * peek_transform_local(){
158 ppComponent_Grouping p = (ppComponent_Grouping)gglobal()->Component_Grouping.prv;
159 return (stack_top_ptr(mat4x4_t,p->transform_local_stack))->mat;
161void reset_transform_local(
double *mat){
163 double *mattop = peek_transform_local();
164 memcpy(mattop,mat,16*
sizeof(
double));
166void multiply_transform_local(
double *mat){
169 double *mattop = peek_transform_local();
170 matmultiplyAFFINE(matboth,mat,mattop);
171 memcpy(mattop,matboth,16*
sizeof(
double));
177 node->__do_center = verify_translate ((GLfloat *)node->center.c);
178 node->__do_trans = verify_translate ((GLfloat *)node->translation.c);
179 node->__do_scale = verify_scale ((GLfloat *)node->scale.c);
180 node->__do_rotation = verify_rotate ((GLfloat *)node->rotation.c);
181 node->__do_scaleO = verify_rotate ((GLfloat *)node->scaleOrientation.c);
183 node->__do_anything = (node->__do_center ||
186 node->__do_rotation ||
189 REINITIALIZE_SORTED_NODES_FIELD(node->children,node->_sortedChildren);
195void compile_Group(
struct X3D_Group *node) {
196 REINITIALIZE_SORTED_NODES_FIELD(node->children,node->_sortedChildren);
209void prep_Group (
struct X3D_Group *node) {
243 if(!renderstate()->render_vp) {
245 push_transform_local_identity();
246 if (node->__do_anything) {
250 FW_GL_LOAD_IDENTITY();
253 if (node->__do_trans)
254 FW_GL_TRANSLATE_F(node->translation.c[0],node->translation.c[1],node->translation.c[2]);
257 if (node->__do_center)
258 FW_GL_TRANSLATE_F(node->center.c[0],node->center.c[1],node->center.c[2]);
261 if (node->__do_rotation) {
262 FW_GL_ROTATE_RADIANS(node->rotation.c[3], node->rotation.c[0],node->rotation.c[1],node->rotation.c[2]);
266 if (node->__do_scaleO) {
267 FW_GL_ROTATE_RADIANS(node->scaleOrientation.c[3], node->scaleOrientation.c[0], node->scaleOrientation.c[1],node->scaleOrientation.c[2]);
272 if (node->__do_scale)
273 FW_GL_SCALE_F(node->scale.c[0],node->scale.c[1],node->scale.c[2]);
276 if (node->__do_scaleO)
277 FW_GL_ROTATE_RADIANS(-node->scaleOrientation.c[3], node->scaleOrientation.c[0], node->scaleOrientation.c[1],node->scaleOrientation.c[2]);
280 if (node->__do_center)
281 FW_GL_TRANSLATE_F(-node->center.c[0],-node->center.c[1],-node->center.c[2]);
285 FW_GL_GETDOUBLEV(GL_MODELVIEW_MATRIX,mat);
287 FW_GL_TRANSFORM_D(mat);
288 reset_transform_local(mat);
298 if(!renderstate()->render_vp) {
299 pop_transform_local();
300 if (node->__do_anything) {
305 if((node->_renderFlags & VF_Viewpoint) == VF_Viewpoint)
307 FW_GL_TRANSLATE_F(((node->center).c[0]),((node->center).c[1]),((node->center).c[2])
309 FW_GL_ROTATE_RADIANS(((node->scaleOrientation).c[3]),((node->scaleOrientation).c[0]),((node->scaleOrientation).c[1]),((node->scaleOrientation).c[2])
311 FW_GL_SCALE_F((
float)1.0/(((node->scale).c[0])),(
float)1.0/(((node->scale).c[1])),(
float)1.0/(((node->scale).c[2]))
313 FW_GL_ROTATE_RADIANS(-(((node->scaleOrientation).c[3])),((node->scaleOrientation).c[0]),((node->scaleOrientation).c[1]),((node->scaleOrientation).c[2])
315 FW_GL_ROTATE_RADIANS(-(((node->rotation).c[3])),((node->rotation).c[0]),((node->rotation).c[1]),((node->rotation).c[2])
317 FW_GL_TRANSLATE_F(-(((node->center).c[0])),-(((node->center).c[1])),-(((node->center).c[2]))
319 FW_GL_TRANSLATE_F(-(((node->translation).c[0])),-(((node->translation).c[1])),-(((node->translation).c[2]))
329 int wc = node->whichChoice;
336 int spec = X3D_PROTO(node->_executionContext)->__specversion;
337 if (spec < 300 || node->choice.n){
341 pp = node->children.p;
342 n = node->children.n;
346 if(wc >= 0 && wc < n){
349 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
371void sib_prep_LocalFog(
struct X3D_Node *parent,
struct X3D_Node *sibAffector);
373void sib_prep_ClipPlane(
struct X3D_Node *parent,
struct X3D_Node *sibAffector);
375void sib_prep_TextureProjector(
struct X3D_Node *parent,
struct X3D_Node *sibAffector);
378 switch(sibAffector->_nodeType){
379 case NODE_DirectionalLight:
381 case NODE_PointLight:
382 sib_prep_Light(parent, sibAffector);
385 sib_prep_LocalFog(parent,sibAffector);
break;
387 sib_prep_ClipPlane(parent,sibAffector);
break;
389 sib_prep_Effect(parent,sibAffector);
break;
390 case NODE_TextureProjector:
391 case NODE_TextureProjectorParallel:
392 case NODE_TextureProjectorPoint:
393 sib_prep_TextureProjector(parent,sibAffector);
break;
399void sib_fin_LocalFog(
struct X3D_Node *parent,
struct X3D_Node *sibAffector);
402void sib_fin_ClipPlane(
struct X3D_Node *parent,
struct X3D_Node *sibAffector);
404void sib_fin_TextureProjector(
struct X3D_Node *parent,
struct X3D_Node *sibAffector);
407 switch(sibAffector->_nodeType){
408 case NODE_DirectionalLight:
410 case NODE_PointLight:
411 sib_fin_Light(parent, sibAffector);
414 sib_fin_LocalFog(parent,sibAffector);
break;
416 sib_fin_ClipPlane(parent,sibAffector);
break;
418 sib_fin_Effect(parent,sibAffector);
break;
419 case NODE_TextureProjector:
420 case NODE_TextureProjectorParallel:
421 case NODE_TextureProjectorPoint:
422 sib_fin_TextureProjector(parent,sibAffector);
break;
431 for(j=0;j<affectors->n;j++){
432 struct X3D_Node *sa = affectors->p[j];
440 for(jj=0;jj<affectors->n;jj++){
444 j = affectors->n - jj - 1;
445 sa = affectors->p[j];
461 ttrenderstate rs = renderstate();
462 if (rs->render_vp || rs->render_other || rs->render_sensitive || rs->render_depth || rs->render_light || rs->render_cube || rs->render_collision)
return;
463 push_group_extent_default();
464 push_group_visible( bfields->visible && peek_group_visible());
469 ttrenderstate rs = renderstate();
470 if (rs->render_vp || rs->render_other || rs->render_sensitive || rs->render_depth || rs->render_light || rs->render_cube || rs->render_collision)
474 printf (
"\nstart fin_BBox\n");
475 printf (
"... node %p type %s\n",node, stringNodeType(node->_nodeType));
476 printf (
"... center %4.3f %4.3f %4.3f, size %4.3f %4.3f %4.3f\n",
477 bfields->bboxCenter.c[0],
478 bfields->bboxCenter.c[1],
479 bfields->bboxCenter.c[2],
480 bfields->bboxSize.c[0],
481 bfields->bboxSize.c[1],
482 bfields->bboxSize.c[2]);
488 extent6f2bbox(peek_group_extent(),bfields->bboxCenter.c,bfields->bboxSize.c);
491 printf (
"step1 fin_BBox\n");
492 printf (
"... node %p type %s\n",node, stringNodeType(node->_nodeType));
493 printf (
"... center %4.3f %4.3f %4.3f, size %4.3f %4.3f %4.3f\n",
494 bfields->bboxCenter.c[0],
495 bfields->bboxCenter.c[1],
496 bfields->bboxCenter.c[2],
497 bfields->bboxSize.c[0],
498 bfields->bboxSize.c[1],
499 bfields->bboxSize.c[2]);
502 if(renderstate()->render_geom && (bfields->bboxDisplay || fwl_getDrawBoundingBoxes() )) {
503 draw_bbox(bfields->bboxCenter.c,bfields->bboxSize.c);
509 extent6f_mattransform4d(node->_extent,peek_group_extent(),peek_transform_local());
512 extent6f_copy(node->_extent,peek_group_extent());
517 printf (
"step2 fin_BBox\n");
518 printf (
"... node %p type %s\n",node, stringNodeType(node->_nodeType));
519 printf (
"... center %4.3f %4.3f %4.3f, size %4.3f %4.3f %4.3f\n",
520 bfields->bboxCenter.c[0],
521 bfields->bboxCenter.c[1],
522 bfields->bboxCenter.c[2],
523 bfields->bboxSize.c[0],
524 bfields->bboxSize.c[1],
525 bfields->bboxSize.c[2]);
529 union_group_extent(node->_extent);
531 record_ZBufferDistance(node,bfields);
534 printf (
"node %p %s extent ",node,stringNodeType(node->_nodeType));
536 for (i=0; i<6; i++) printf (
"%4.3f ",node->_extent[i]); printf (
"\n");
537 printf (
"recording Z_BufferDistance at %s:%d\n",__FILE__,__LINE__);
541 printf (
"fin fin_BBox nodeType %s\n",stringNodeType(node->_nodeType));
551 RETURN_FROM_CHILD_IF_NOT_FOR_ME
554 if NODE_NEEDS_COMPILING {
555 REINITIALIZE_SORTED_NODES_FIELD(node->children,node->_sortedChildren);
562 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
565 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
566 normalChildren(node->_sortedChildren);
570 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
574void child_Group (
struct X3D_Group *node) {
594 RETURN_FROM_CHILD_IF_NOT_FOR_ME
598 ttrenderstate rs = renderstate();
599 if (rs->render_geom) {
600 if (node->_renderFlags & VF_HideLeft && (viewer_iside() == 0) ) {
603 if (node->_renderFlags & VF_HideRight && (viewer_iside() == 1) ) {
608 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
616printf (
"child_Group, children.n %d sortedChildren.n %d\n",node->children.n, node->_sortedChildren.n);
618 printf (
"child_Group, this %p rf %x isProto %d\n",node,node->_renderFlags, node->FreeWRL__protoDef);
621 for (x=0; x<nc; x++) {
622 xx = X3D_NODE(node->_sortedChildren.p[x]);
624 printf (
" %d: ch %p type %s dist %f\n",x, node->_sortedChildren.p[x],stringNodeType(xx->_nodeType),xx->_dist);
625 else printf (
" chiuld %d null\n",x);
627 for (x=0; x<nc; x++) {
628 xx = X3D_NODE(node->_sortedChildren.p[x]);
630 printf (
" %d: sch %p type %s dist %f\n",x, node->_sortedChildren.p[x],stringNodeType(xx->_nodeType),xx->_dist);
631 else printf (
" chiuld %d null\n",x);
643 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
644 normalChildren(node->_sortedChildren);
648 printf (
"child_Group ");
658 printf (
"bboxCenter %4.3f %4.3f %4.3f ",node->bboxCenter.c[0],node->bboxCenter.c[1],node->bboxCenter.c[2]);
659 printf (
"bboxSize %4.3f %4.3f %4.3f ",node->bboxSize.c[0],node->bboxSize.c[1],node->bboxSize.c[2]);
660 printf (
"visible %d displayBox %d\n",node->visible,node->bboxDisplay);
667 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
677 RETURN_FROM_CHILD_IF_NOT_FOR_ME
681 ttrenderstate rs = renderstate();
682 if (rs->render_geom) {
683 if (node->_renderFlags & VF_HideLeft && (viewer_iside() == 0) ) {
686 if (node->_renderFlags & VF_HideRight && (viewer_iside() == 1) ) {
697 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
710 printf (
"transform - doing normalChildren\n");
713 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
714 normalChildren(node->_sortedChildren);
718 printf (
"transform - done normalChildren\n");
722 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
729char ciflag_get(
int flags,
int index){
730 char *cflags = (
char *)(&flags);
731 return cflags[index];
733int ciflag_set(
int flags,
char flag,
int index ){
734 char *cflags = (
char *)(&flags);
735 cflags[index] = flag;
738void prep_Proto (
struct X3D_Proto *node) {
739 if(0)printf(
"in prep_proto\n");
740 load_externProtoInstance(node);
745void compile_Proto(
struct X3D_Proto *node) {
747 if(0)printf(
"in compile_proto\n");
748 pflag = ciflag_get(node->__protoFlags,2);
751 REINITIALIZE_SORTED_NODES_FIELD(node->__children,node->_sortedChildren);
759int isUnitSpecVersionOK(
int specversion);
760static int unitoption_scalescene = TRUE;
761void prep_unitscale (
struct X3D_Proto *ec) {
764 if(!renderstate()->render_vp) {
767 double parentfactor = 1.0;
768 parent = X3D_PROTO(ec->_executionContext);
771 if(isUnitSpecVersionOK(ec->__specversion)){
772 factor = ec->__unitlengthfactor;
775 if(isUnitSpecVersionOK(parent->__specversion))
776 parentfactor = parent->__unitlengthfactor;
779 if(unitoption_scalescene){
782 parentfactor = factor;
788 factor = factor / parentfactor;
790 FW_GL_SCALE_D(factor,factor,factor);
797void fin_unitscale (
struct X3D_Proto *ec) {
801 if(!renderstate()->render_vp) {
828void child_Proto (
struct X3D_Proto *node) {
830 unsigned char sceneflag;
831 int renderFirstProtoChildOnlyAsPerSpecs;
833 if(0)printf(
"in child_proto\n");
835 nc = node->__children.n;
851 RETURN_FROM_CHILD_IF_NOT_FOR_ME
853 push_executionContext(X3D_NODE(node));
854 prep_unitscale(node);
861printf (
"child_Group, children.n %d sortedChildren.n %d\n",node->children.n, node->_sortedChildren.n);
863 printf (
"child_Group, this %p rf %x isProto %d\n",node,node->_renderFlags, node->FreeWRL__protoDef);
866 for (x=0; x<nc; x++) {
867 xx = X3D_NODE(node->_sortedChildren.p[x]);
869 printf (
" %d: ch %p type %s dist %f\n",x, node->_sortedChildren.p[x],stringNodeType(xx->_nodeType),xx->_dist);
870 else printf (
" chiuld %d null\n",x);
872 for (x=0; x<nc; x++) {
873 xx = X3D_NODE(node->_sortedChildren.p[x]);
875 printf (
" %d: sch %p type %s dist %f\n",x, node->_sortedChildren.p[x],stringNodeType(xx->_nodeType),xx->_dist);
876 else printf (
" chiuld %d null\n",x);
883 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
884 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
887 sceneflag = ciflag_get(node->__protoFlags,2);
888 renderFirstProtoChildOnlyAsPerSpecs = TRUE;
891 normalChildren(node->_sortedChildren);
893 if(renderFirstProtoChildOnlyAsPerSpecs && (renderstate()->render_geom || renderstate()->render_blend)) {
895 (node->__children).n = 1;
896 normalChildren(node->__children);
897 (node->__children).n = nc;
901 normalChildren(node->__children);
907 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
909 pop_executionContext();