35#include <libFreeWRL.h>
37#include "../vrml_parser/Structs.h"
38#include "quaternion.h"
42#include "../opengl/OpenGL_Utils.h"
43#include "RenderFuncs.h"
44#include "../opengl/Frustum.h"
46#define DJ_KEEP_COMPILER_WARNING 0
48#if DJ_KEEP_COMPILER_WARNING
49#define VF_localLight 0x0004
55 for(i=0; i<ch.n; i++) {
56 struct X3D_Node *p = X3D_NODE(ch.p[i]);
58 if ((p->_nodeType == NODE_DirectionalLight) ||
59 (p->_nodeType == NODE_PointLight) ||
60 (p->_nodeType == NODE_SpotLight))
71 for(i=0; i<ch.n; i++) {
72 p = X3D_NODE(ch.p[i]);
78 if (p->_nodeType == NODE_DirectionalLight) {
79 if (X3D_DIRECTIONALLIGHT(p)->global == TRUE) render_node(p);
80 }
else if (p->_nodeType == NODE_SpotLight) {
81 if (X3D_SPOTLIGHT(p)->global == TRUE) render_node(p);
82 }
else if (p->_nodeType == NODE_PointLight) {
83 if (X3D_POINTLIGHT(p)->global == TRUE)
85 }
else if (p->_nodeType == NODE_TextureProjector) {
86 if (X3D_TEXTUREPROJECTOR(p)->global == TRUE)
88 }
else if (p->_nodeType == NODE_TextureProjectorParallel) {
89 if (X3D_TEXTUREPROJECTORPARALLEL(p)->global == TRUE)
91 }
else if (p->_nodeType == NODE_TextureProjectorPoint) {
92 if (X3D_TEXTUREPROJECTORPOINT(p)->global == TRUE)
108void update_renderFlagB (
struct X3D_Node *p,
int flag,
int li) {
110 static int depth = 0;
114 printf (
"start of update_renderFlag from %d for %p (%s) flag %x parents %d\n",li,p, stringNodeType(p->_nodeType),
115 flag, vectorSize(p->_parentVector));
116 if (p->_nodeType == NODE_Shape) {
117 printf (
"... and this one is our Shape...\n");
118 for (i = 0; i < vectorSize(p->_parentVector); i++) {
120 printf (
"Shape parent %d is %p, type %s\n",i,me,stringNodeType(me->_nodeType));
136 p->_renderFlags = p->_renderFlags | flag;
138 if (p->_parentVector == NULL) {
143 for (i = 0; i < vectorSize(p->_parentVector); i++) {
147 if (me->referenceCount > 0) {
152 ConsoleMessage (
"update_renderFlag, me NULL for child %d",i);
153 markForDispose(p, TRUE);
157 if (me->_parentVector == NULL) {
160 ConsoleMessage (
"warning, for node %p (%s), pv %d, child has null parentVector\n",p,stringNodeType(p->_nodeType),i);
161 markForDispose(p, TRUE);
167 switch (me->_nodeType) {
170 if (is_Switchchild_inrange(X3D_SWITCH(me),p)) {
172 update_renderFlagB(me,flag, __LINE__);
178 if (is_vp_new_way() || p == X3D_LODNODE(me)->_selected) {
179 update_renderFlagB(me,flag, __LINE__);
184 if (is_GeoLODchild_inrange(X3D_GEOLOD(me),p)) {
186 update_renderFlagB(me,flag, __LINE__);
198 update_renderFlagB(me,flag, __LINE__);
206int update_renderFlagC(
struct X3D_Node* p,
int flag,
int setaction) {
208 static int depth = 0;
221 p->_renderFlags = p->_renderFlags | flag;
223 p->_renderFlags = p->_renderFlags & (0xFFFF ^ flag);
226 if (p->_parentVector == NULL || vectorSize(p->_parentVector) == 0) {
228 if (p == rootNode()) iret = 1;
232 for (i = 0; i < vectorSize(p->_parentVector); i++) {
236 if (me->referenceCount > 0) {
241 ConsoleMessage(
"update_renderFlag, me NULL for child %d", i);
242 markForDispose(p, TRUE);
246 if (me->_parentVector == NULL) {
249 ConsoleMessage(
"warning, for node %p (%s), pv %d, child has null parentVector\n", p, stringNodeType(p->_nodeType), i);
250 markForDispose(p, TRUE);
256 switch (me->_nodeType) {
259 if (is_Switchchild_inrange(X3D_SWITCH(me), p)) {
261 iret = update_renderFlagC(me, flag, setaction);
267 if (is_vp_new_way() || p == X3D_LODNODE(me)->_selected) {
268 iret = update_renderFlagC(me, flag, setaction);
269 if (iret && setaction) {
270 X3D_LODNODE(me)->_selected = p;
271 X3D_LODNODE(me)->_lastMethod = 1;
278 if (is_GeoLODchild_inrange(X3D_GEOLOD(me), p)) {
280 iret = update_renderFlagC(me, flag, setaction);
291 iret = update_renderFlagC(me, flag, setaction);
300void UPDATE_RENDERFLAG (
struct X3D_Node *p,
int flag,
char *fi,
int li){
302 ConsoleMessage (
"update_renderFlag, p NULL from %s:%d\n",fi,li);
306 update_renderFlagB (p, flag, __LINE__);