31#include <libFreeWRL.h>
33#include "../vrml_parser/Structs.h"
34#include "../main/headers.h"
36#include "../x3d_parser/Bindable.h"
38#include "LinearAlgebra.h"
39#include "../opengl/OpenGL_Utils.h"
40#include "../scenegraph/RenderFuncs.h"
68 int layerId, saveActive, binding_stack_set;
70}* ppComponent_Layering;
71void *Component_Layering_constructor(){
76void Component_Layering_init(
struct tComponent_Layering *t){
79 t->prv = Component_Layering_constructor();
81 ppComponent_Layering p = (ppComponent_Layering)t->prv;
82 p->layersetnode = NULL;
85 p->binding_stack_set = 0;
88void Component_Layering_clear(
struct tComponent_Text *t){
97void getPickrayXY(
int *x,
int *y);
99ivec4 childViewport(
ivec4 parentViewport,
float *clipBoundary){
101 vport.W = (int)((clipBoundary[1] - clipBoundary[0]) *parentViewport.W);
102 vport.X = (int)(parentViewport.X + (clipBoundary[0] * parentViewport.W));
103 vport.H = (int)((clipBoundary[3] - clipBoundary[2]) *parentViewport.H);
104 vport.Y = (int)(parentViewport.Y + (clipBoundary[2] * parentViewport.H));
107void prep_Viewport(
struct X3D_Node * node);
108void fin_Viewport(
struct X3D_Node * node);
109static float defaultClipBoundary [] = {0.0f, 1.0f, 0.0f, 1.0f};
113void prep_Layer(
struct X3D_Node * _node){
123 if(!rs->render_vp && !rs->render_collision){
125 if(node->viewport) prep_Viewport(node->viewport);
129void child_Layer(
struct X3D_Node * _node){
139 if(!rs->render_vp && !rs->render_collision){
142 vportstack = (Stack *)tg->Mainloop._vportstack;
143 ivpvis = currentviewportvisible(vportstack);
145 setcurrentviewport(vportstack);
148 if (rs->render_geom == VF_Geom)
149 glClear(GL_DEPTH_BUFFER_BIT);
150 prep_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
151 normalChildren(node->children);
152 fin_sibAffectors((
struct X3D_Node*)node,&node->__sibAffectors);
155void fin_Layer(
struct X3D_Node * _node){
161 if(!rs->render_vp && !rs->render_collision){
162 if(node->viewport) fin_Viewport(node->viewport);
186void push_binding_stack_set(
struct X3D_Node* layersetnode){
188 ttglobal tg = gglobal();
189 ppComponent_Layering p = (ppComponent_Layering)tg->Component_Layering.prv;
190 p->binding_stack_set++;
191 p->saveActive = tg->Bindable.activeLayer;
193 p->layersetnode = layersetnode;
195void push_next_layerId_from_binding_stack_set(
struct X3D_Node *layer){
197 ttglobal tg = gglobal();
198 ppComponent_Layering p = (ppComponent_Layering)tg->Component_Layering.prv;
201 if(p->binding_stack_set > 0){
203 bstack = getBindableStacksByLayer(tg, p->layerId );
206 init_bindablestack(bstack, p->layerId, layer->_nodeType);
207 addBindableStack(tg,bstack);
210 tg->Bindable.activeLayer = p->layerId;
214void pop_binding_stack_set(){
215 ttglobal tg = gglobal();
216 ppComponent_Layering p = (ppComponent_Layering)tg->Component_Layering.prv;
218 p->binding_stack_set--;
219 tg->Bindable.activeLayer = p->saveActive;
221void post_parse_set_activeLayer(){
222 ttglobal tg = gglobal();
223 ppComponent_Layering p = (ppComponent_Layering)tg->Component_Layering.prv;
225 if(p->layersetnode && p->layersetnode->_nodeType == NODE_LayerSet){
227 tg->Bindable.activeLayer = ls->activeLayer;
233void prep_LayoutLayer(
struct X3D_Node * _node);
234void child_LayoutLayer(
struct X3D_Node * _node);
235void fin_LayoutLayer(
struct X3D_Node * _node);
237void setup_viewpoint_part1();
238void setup_viewpoint_part3();
239void set_viewmatrix();
240void setup_projection();
241void setup_projection_tinkering();
245void setup_pickray0();
246void child_LayerSet(
struct X3D_Node * node){
255 if(node && node->_nodeType == NODE_LayerSet){
269 for(i=0;i<layerset->order.n;i++){
271 int i0, saveActive, isActive;
279 if(rs->render_sensitive == VF_Sensitive){
280 ii = layerset->order.n - ii -1;
283 layerId = layerset->order.p[ii];
285 i0 = max(0,layerId -1);
286 if(i0 < 0 || i0 > layerset->layers.n -1)
289 isActive = layerId == tg->Bindable.activeLayer;
290 layer = (
struct X3D_Layer*)layerset->layers.p[i0];
292 if(rs->render_sensitive == VF_Sensitive){
293 if(!layer->isPickable)
continue;
295 if(rs->render_collision == VF_Collision && !isActive)
300 bstack = getBindableStacksByLayer(tg, layerId );
303 init_bindablestack(bstack, layerId, layer->_nodeType);
304 addBindableStack(tg,bstack);
306 saveActive = tg->Bindable.activeLayer;
310 tg->Bindable.activeLayer = layerId;
318 FW_GL_MATRIX_MODE(GL_PROJECTION);
320 FW_GL_MATRIX_MODE(GL_MODELVIEW);
322 if(rs->render_vp == VF_Viewpoint){
323 setup_viewpoint_part1();
328 if(!rs->render_vp && !rs->render_collision )
330 if(rs->render_sensitive == VF_Sensitive){
332 if(!isActive) upd_ray();
337 if(layer->_nodeType == NODE_Layer){
338 prep_Layer((
struct X3D_Node*)layer);
339 child_Layer((
struct X3D_Node*)layer);
342 else if(layer->_nodeType == NODE_LayoutLayer){
343 prep_LayoutLayer((
struct X3D_Node*)layer);
344 child_LayoutLayer((
struct X3D_Node*)layer);
345 fin_LayoutLayer((
struct X3D_Node*)layer);
348 if(rs->render_sensitive == VF_Sensitive){
349 rayhit = getRayHit();
356 if(rs->render_vp == VF_Viewpoint){
357 setup_viewpoint_part3();
359 FW_GL_MATRIX_MODE(GL_PROJECTION);
361 FW_GL_MATRIX_MODE(GL_MODELVIEW);
366 tg->Bindable.activeLayer = saveActive;
370 tg->Bindable.activeLayer = layerset->activeLayer;
387void pushaspect(Stack *vportstack,
ivec4 vport){
389 float aspect_last = (float)lastp.W/(
float)lastp.H;
390 float aspect = (float)vport.W/(
float)vport.H;
391 double change = aspect/aspect_last;
392 double mat[16], mat2[16];
395 fw_glGetDoublev(GL_PROJECTION_MATRIX, mat);
396 FW_GL_MATRIX_MODE(GL_PROJECTION);
398 loadIdentityMatrix(mat2);
400 mat2[0] = 1.0/change;
401 matmultiplyFULL(mat,mat,mat2);
402 fw_glSetDoublev(GL_PROJECTION_MATRIX, mat);
403 FW_GL_MATRIX_MODE(GL_MODELVIEW);
407 FW_GL_MATRIX_MODE(GL_MODELVIEW);
408 fw_glGetDoublev(GL_MODELVIEW_MATRIX, mat);
410 loadIdentityMatrix(mat2);
412 mat2[0] = 1.0/change;
414 matmultiplyFULL(mat,mat,mat2);
415 fw_glSetDoublev(GL_MODELVIEW_MATRIX, mat);
417 FW_GL_MATRIX_MODE(GL_MODELVIEW);
423 FW_GL_MATRIX_MODE(GL_PROJECTION);
425 FW_GL_MATRIX_MODE(GL_MODELVIEW);
428 FW_GL_MATRIX_MODE(GL_MODELVIEW);
430 FW_GL_MATRIX_MODE(GL_MODELVIEW);
433void prep_Viewport(
struct X3D_Node * node){
434 if(node && node->_nodeType == NODE_Viewport){
447 if(!rs->render_vp && !rs->render_collision){
450 vportstack = (Stack *)tg->Mainloop._vportstack;
451 pvport = stack_top(
ivec4,vportstack);
452 clipBoundary = defaultClipBoundary;
453 if(viewport->clipBoundary.p && viewport->clipBoundary.n > 3)
454 clipBoundary = viewport->clipBoundary.p;
456 vport = childViewport(pvport,clipBoundary);
457 if(rs->render_sensitive){
458 int mouseX, mouseY, inside;
460 getPickrayXY(&mouseX, &mouseY);
463 inside = pointinsideviewport(vport,pt);
469 pushaspect(vportstack,vport);
470 pushviewport(vportstack, vport);
471 if(currentviewportvisible(vportstack)){
472 setcurrentviewport(vportstack);
480void child_Viewport(
struct X3D_Node * nodein){
481 if(nodein && nodein->_nodeType == NODE_Viewport){
489 vportstack = (Stack *)tg->Mainloop._vportstack;
491 if(currentviewportvisible(vportstack)){
492 prep_sibAffectors((
struct X3D_Node*)node,&viewport->__sibAffectors);
493 prep_BBox((
struct BBoxFields*)&node->bboxCenter);
494 normalChildren(viewport->children);
496 fin_sibAffectors((
struct X3D_Node*)node,&viewport->__sibAffectors);
500void fin_Viewport(
struct X3D_Node * node){
501 if(node && node->_nodeType == NODE_Viewport){
514 if(!rs->render_vp && !rs->render_collision){
516 vportstack = (Stack *)tg->Mainloop._vportstack;
520 popviewport(vportstack);
521 setcurrentviewport(vportstack);