FreeWRL / FreeX3D 4.3.0
headers.h
1/*
2
3
4Global includes.
5
6*/
7
8/****************************************************************************
9 This file is part of the FreeWRL/FreeX3D Distribution.
10
11 Copyright 2009 CRC Canada. (http://www.crc.gc.ca)
12
13 FreeWRL/FreeX3D is free software: you can redistribute it and/or modify
14 it under the terms of the GNU Lesser Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 FreeWRL/FreeX3D is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with FreeWRL/FreeX3D. If not, see <http://www.gnu.org/licenses/>.
25****************************************************************************/
26
27
28
29#ifndef __FREEWRL_HEADERS_H__
30#define __FREEWRL_HEADERS_H__
31
32#define int_t intptr_t
33
34extern char *BrowserName;
35const char* freewrl_get_browser_program();
36
37void Multi_String_print(struct Multi_String *url);
38
40//#define IO_FLOAT -2335549.0f
41
42/* specification versions, for close adherence to requested spec levels */
43#define SPEC_VRML 0x01
44#define SPEC_X3D30 0x02
45#define SPEC_X3D31 0x04
46#define SPEC_X3D32 0x08
47#define SPEC_X3D33 0x10
48#define SPEC_X3D34 0x20 //there was never a 3.4 - it jumped to 4.0
49#define SPEC_X3D40 0X40
50#define SPEC_VRML1 0x01 /* same as SPEC_VRML */
51
52/*UNIT statement base and derived 'unit categories', un-ca or UNCA for short */
53enum {
54 UNCA_NONE = 0,
55 UNCA_LENGTH = 1,
56 UNCA_BLENGTH, //bboxCenter, bboxSize
57 UNCA_ANGLE,
58 UNCA_PLANE, //first 3 are plane normal, 4th is scaleable distance
59 UNCA_MASS,
60 UNCA_FORCE,
61 UNCA_ACCEL,
62 UNCA_ANGLERATE,
63 UNCA_AREA,
64 UNCA_SPEED,
65 UNCA_VOLUME,
66 UNCA_TORQUE,
67 UNCA_MOMENT,
68 UNCA_GEO, //don't know if its angle or length untill geoSystem field parsed
69};
70#define FIELDOFFSET_LENGTH 6 //search also for struct field_info
71typedef struct field_info{
72 int nameIndex;
73 int offset;
74 int typeIndex;
75 int ioType;
76 int version;
77 int unca;
78} *fieldinfo;
79
80int viewer_iside();
81/* children fields path optimizations */
82#define CHILDREN_COUNT int nc = node->_sortedChildren.n;
83#define RETURN_FROM_CHILD_IF_NOT_FOR_ME \
84 /* any children at all? */ \
85 if (nc==0) return; \
86 /* should we go down here? */ \
87 /* printf ("Group, rb %x VF_B %x, rg %x VF_G %x\n",render_blend, VF_Blend, render_geom, VF_Geom); */ \
88 {\
89 ttrenderstate rs = renderstate(); \
90 if (rs->render_blend == VF_Blend) \
91 if ((node->_renderFlags & VF_Blend) != VF_Blend) { \
92 return; \
93 } \
94 if (rs->render_proximity == VF_Proximity) \
95 if ((node->_renderFlags & VF_Proximity) != VF_Proximity) { \
96 return; \
97 } \
98 if (rs->render_light == VF_globalLight) \
99 if ((node->_renderFlags & VF_globalLight) != VF_globalLight) { \
100 return; \
101 } \
102 }
103
104
105/* Size of static array */
106#define ARR_SIZE(arr) (int)(sizeof(arr)/sizeof((arr)[0]))
107
108extern char *BrowserName;
109extern char *BrowserFullPath;
110
111/* To allow BOOL for boolean values */
112#define BOOL int
113
114/* rendering constants used in SceneGraph, etc. */
115#define VF_Viewpoint 0x0001
116#define VF_Geom 0x0002
117#define VF_localLight 0x0004
118#define VF_Sensitive 0x0008
119#define VF_Blend 0x0010
120#define VF_Proximity 0x0020
121#define VF_Collision 0x0040
122#define VF_globalLight 0x0080
123#define VF_hasVisibleChildren 0x0100
124#define VF_shouldSortChildren 0x0200
125#define VF_Other 0x0400
126#define VF_Picking 0x1000
127#define VF_HideLeft 0x2000 /*stereo don't draw on left side, used for stereovision experiments*/
128#define VF_HideRight 0x4000 /*stereo don't draw on right side*/
129#define VF_USE 0x8000 /*for 2-node scenarios like pickingsensor and transform sensor, signals a node_USE to save its modelview matrix for do_handling*/
130#define VF_Cube 0x10000 //when generating generatedcubemap texture to fbo (don't render generatedcubemap parent nodes)
131#define VF_Background 0x20000
132/* for z depth buffer calculations */
133#define DEFAULT_NEARPLANE 0.07
134#define DEFAULT_FARPLANE 21000.0
135#define DEFAULT_BACKGROUNDPLANE 18000.0 /* approx 80% of DEFAULT_FARPLANE */
136extern double geoHeightinZAxis;
137
138
139/* Routing - complex types */
140#define ROUTING_SFNODE -23
141#define ROUTING_MFNODE -10
142#define ROUTING_SFIMAGE -12
143#define ROUTING_MFSTRING -13
144#define ROUTING_MFFLOAT -14
145#define ROUTING_MFROTATION -15
146#define ROUTING_MFINT32 -16
147#define ROUTING_MFCOLOR -17
148#define ROUTING_MFVEC2F -18
149#define ROUTING_MFVEC3F -19
150#define ROUTING_MFVEC3D -20
151#define ROUTING_MFDOUBLE -21
152#define ROUTING_SFSTRING -22
153#define ROUTING_MFMATRIX4F -30
154#define ROUTING_MFMATRIX4D -31
155#define ROUTING_MFVEC2D -32
156#define ROUTING_MFVEC4F -33
157#define ROUTING_MFVEC4D -34
158#define ROUTING_MFMATRIX3F -35
159#define ROUTING_MFMATRIX3D -36
160
161
162
163/* compile simple nodes (eg, Cone, LineSet) into an internal format. Check out
164 CompileC in VRMLRend.pm, and look for compile_* functions in code. General
165 meshes are rendered using the PolyRep scheme, which also compiles into OpenGL
166 calls, using the PolyRep (and, stream_PolyRep) methodology */
167
168
169
170#define NODE_CHANGE_INIT_VAL 153 /* node->_change is set to this when created */
171#define COMPILE_POLY_IF_REQUIRED(a,b,c,d,e) \
172 if(!node->_intern || node->_change != (node->_intern)->irep_change) { \
173 compileNode ((void *)compile_polyrep, node, a,b,c,d,e); \
174 } \
175 if (!node->_intern) return;
176
177#define COMPILE_IF_REQUIRED { struct X3D_Virt *v; \
178 if (node->_ichange != node->_change) { \
179 v = virtTable[node->_nodeType]; \
180 if (v->compile) { \
181 compileNode (v->compile, (void *)node, NULL, NULL, NULL, NULL, NULL); \
182 } else {printf ("huh - have COMPIFREQD, but v->compile null for %s at %s:%d\n",stringNodeType(node->_nodeType),__FILE__,__LINE__);} \
183 } \
184 if (node->_ichange == 0) return; \
185 }
186
187#define COMPILE_IF_REQUIRED_RETURN_NULL_ON_ERROR { struct X3D_Virt *v; \
188 if (node->_ichange != node->_change) { \
189 v = virtTable[node->_nodeType]; \
190 if (v->compile) { \
191 compileNode (v->compile, (void *)node, NULL, NULL, NULL, NULL, NULL); \
192 } else {printf ("huh - have COMPIFREQD, but v->compile null for %s at %s:%d\n",stringNodeType(node->_nodeType),__FILE__,__LINE__);} \
193 } \
194 if (node->_ichange == 0) return NULL; \
195 }
196
197#define COMPILE_TCNODE { \
198 struct X3D_Virt *v; \
199 if (myTCnode->_ichange != myTCnode->_change) { \
200 v = virtTable[myTCnode->_nodeType]; \
201 if (v->compile) { \
202 compileNode (v->compile, (void *)myTCnode, NULL, NULL, NULL, NULL, NULL); \
203 myTCnode->_ichange = myTCnode->_change; \
204 } else {printf ("huh - have COMPIFREQD, but v->compile null for %s at %s:%d\n",stringNodeType(myTCnode->_nodeType),__FILE__,__LINE__);} \
205 } \
206 if (myTCnode->_ichange == 0) return; \
207}
208
209
210
211/* convert a PROTO node (which will be a Group node) into a node. eg, for Materials - this is a possible child
212node for ANY node that takes something other than a Group */
213
214#define offsetPointer_deref(t, me, offs) ((t)(((char*)(me))+offs))
215
216/* before Brotos/Proto
217#define POSSIBLE_PROTO_EXPANSION(type,inNode,outNode) \
218 if (inNode == NULL) outNode = NULL; \
219 else {if (X3D_NODE(inNode)->_nodeType == NODE_Group) { \
220 if (X3D_GROUP(inNode)->children.n>0) { \
221 outNode = (type)(X3D_GROUP(inNode)->children.p[0]); \
222 } else outNode = NULL; \
223 } else outNode = (type)inNode; };
224*/
225
226struct X3D_Node* getTypeNode(struct X3D_Node *node);
227
228//with Proto for Brotos
229#define POSSIBLE_PROTO_EXPANSION(type,inNode,outNode) \
230 outNode = (type)getTypeNode(inNode);
231
232#define MARK_NODE_COMPILED node->_ichange = node->_change;
233#define NODE_NEEDS_COMPILING (node->_ichange != node->_change)
234#define ROOTNODE_NEEDS_COMPILING (rootNode()->_ichange != rootNode()->_change)
235/* end of compile simple nodes code */
236
237
238#define MARK_SFFLOAT_INOUT_EVENT(good,save,offset) \
239 if (!APPROX(good,save)) { \
240 MARK_EVENT(X3D_NODE(node), offset);\
241 save = good; \
242 }
243
244#define MARK_SFTIME_INOUT_EVENT(good,save,offset) \
245 if (!APPROX(good,save)) { \
246 MARK_EVENT(X3D_NODE(node), offset);\
247 save = good; \
248 }
249
250#define MARK_SFINT32_INOUT_EVENT(good,save,offset) \
251 if (good!=save) { \
252 MARK_EVENT(X3D_NODE(node), offset);\
253 save = good; \
254 }
255
256#define MARK_SFBOOL_INOUT_EVENT(good,save,offset) \
257 if (good!=save) { \
258 MARK_EVENT(X3D_NODE(node), offset);\
259 save = good; \
260 }
261
262
263#define MARK_SFVEC3F_INOUT_EVENT(good,save,offset) \
264 if ((!APPROX(good.c[0],save.c[0])) || (!APPROX(good.c[1],save.c[1])) || (!APPROX(good.c[2],save.c[2]))) { \
265 MARK_EVENT(X3D_NODE(node), offset);\
266 memcpy (&save.c, &good.c, sizeof (struct SFColor));\
267 }
268
269#define MARK_SFVEC3D_INOUT_EVENT(good,save,offset) \
270 if ((!APPROX(good.c[0],save.c[0])) || (!APPROX(good.c[1],save.c[1])) || (!APPROX(good.c[2],save.c[2]))) { \
271 MARK_EVENT(X3D_NODE(node), offset);\
272 memcpy (&save.c, &good.c, sizeof (struct SFVec3d));\
273 }
274
275
276/* make sure that the SFNODE "save" field is not deleted when scenegraph is removed (dup pointer problem) */
277#define MARK_SFNODE_INOUT_EVENT(good,save,offset) \
278 if (good != save) { \
279 MARK_EVENT(X3D_NODE(node), offset);\
280 save = good; \
281 }
282
283
284#define MARK_MFNODE_INOUT_EVENT_PRE_JULY29_2015(good,save,offset) \
285 /* assumes that the good pointer has been updated */ \
286 if (good.p != save.p) { \
287 MARK_EVENT(X3D_NODE(node), offset);\
288 save.n = good.n; \
289 save.p = good.p; \
290 }
291
292#define MARK_MFNODE_INOUT_EVENT(good,save,offset) \
293 /* assumes that the good pointer has been updated - the old version crashed during exit due to freeing a .p twice*/ \
294 if (good.p != save.p) { \
295 MARK_EVENT(X3D_NODE(node), offset);\
296 save.n = 0; \
297 FREE_IF_NZ(save.p); \
298 save.p = NULL; \
299 if(good.n && good.p){ \
300 save.p = MALLOCV(good.n * sizeof(void*)); \
301 memcpy(save.p,good.p,good.n * sizeof(void*)); \
302 save.n = good.n; \
303 } \
304 }
305
306/* for deciding on using set_ SF fields, with nodes with explicit "set_" fields... note that MF fields are handled by
307the EVIN_AND_FIELD_SAME MACRO */
308
309//#define USE_SET_SFVEC3D_IF_CHANGED(setField,regField) \
310//if (!APPROX (node->setField.c[0],node->regField.c[0]) || \
311// !APPROX(node->setField.c[1],node->regField.c[1]) || \
312// !APPROX(node->setField.c[2],node->regField.c[2]) ) { \
313// /* now, is the setField at our default value?? if not, we just use the regField */ \
314// if (APPROX(node->setField.c[0], IO_FLOAT) && APPROX(node->setField.c[1],IO_FLOAT) && APPROX(node->setField.c[2],IO_FLOAT)) { \
315// /* printf ("just use regField\n"); */ \
316// } else { \
317// /* printf ("use the setField as the real poistion field\n"); */ \
318// memcpy (node->regField.c, node->setField.c, sizeof (struct SFVec3d)); \
319// } \
320//}
321
322//#define USE_SET_SFROTATION_IF_CHANGED(setField,regField) \
323//if (!APPROX (node->setField.c[0],node->regField.c[0]) || \
324// !APPROX(node->setField.c[1],node->regField.c[1]) || \
325// !APPROX(node->setField.c[2],node->regField.c[2]) || \
326// !APPROX(node->setField.c[3],node->regField.c[3]) ) { \
327// /* now, is the setField at our default value?? if not, we just use the regField */ \
328// if (APPROX(node->setField.c[0], IO_FLOAT) && APPROX(node->setField.c[1],IO_FLOAT) && APPROX(node->setField.c[2],IO_FLOAT) && APPROX(node->setField.c[3],IO_FLOAT)) { \
329// /* printf ("just use SFRotation regField\n"); */ \
330// } else { \
331// /* printf ("use the setField SFRotation as the real poistion field\n"); */ \
332// memcpy (node->regField.c, node->setField.c, sizeof (struct SFRotation)); \
333// } \
334//}
335
336
337
338
339int find_key (int kin, float frac, float *keys);
340void startOfLoopNodeUpdates(void);
341//extern int HaveSensitive;
342void zeroVisibilityFlag(void);
343void setField_fromJavascript (struct X3D_Node *ptr, char *field, char *value, int isXML);
344unsigned int setField_FromEAI (char *ptr);
345
346#define EXTENTTOBBOX
347float *extent6f_clear(float *extent6);
348#define INITIALIZE_EXTENT extent6f_clear(node->_extent);
349 //{ node->EXTENT_MAX_X = (float) -10000.0; \
350 // node->EXTENT_MAX_Y = (float) -10000.0; \
351 // node->EXTENT_MAX_Z = (float) -10000.0; \
352 // node->EXTENT_MIN_X = (float) 10000.0; \
353 // node->EXTENT_MIN_Y = (float) 10000.0; \
354 // node->EXTENT_MIN_Z = (float) 10000.0; }
355
356/********************************
357 Verbosity
358*********************************/
359#if defined(DEBUG) || defined(FW_DEBUG)
360 /* define verbosity that should be forced-on when debug is set */
361
362
363#else
364#undef SETFIELDVERBOSE
365/* Parsing & Lexing */
366#undef CPARSERVERBOSE
367
368/* Java Class invocation */
369#undef JSVRMLCLASSESVERBOSE
370
371/* child node parsing */
372#undef CHILDVERBOSE
373
374/* routing */
375#undef CRVERBOSE
376
377/* Javascript */
378#undef JSVERBOSE
379
380/* sensitive events */
381#undef SEVERBOSE
382
383/* Text nodes */
384#undef TEXTVERBOSE
385
386/* Texture processing */
387#undef TEXVERBOSE
388
389/* streaming from VRML to OpenGL internals. */
390#undef STREAM_POLY_VERBOSE
391
392/* collision */
393#undef COLLISIONVERBOSE
394
395/* Capabilities of x3dv and x3d */
396#undef CAPABILITIESVERBOSE
397
398#endif /* end of ifdef DEBUG */
399
400/* number of tesselated coordinates allowed */
401#define TESS_MAX_COORDS 200000
402
403#define offset_of(p_type,field) ((unsigned int)(&(((p_type)NULL)->field)-NULL))
404
405#define UNUSED(v) ((void) v)
406#define ISUSED(v) ((void) v)
407
408#define PI 3.14159265358979323846
409#define PIF 3.1415926535f
410
411/* return TRUE if numbers are very close */
412#define APPROX(a,b) (fabs((a)-(b))<0.00000001)
413/* defines for raycasting: */
414
415#define NORMAL_VECTOR_LENGTH_TOLERANCE 0.00001
416/* (test if the vector part of a rotation is normalized) */
417#define IS_ROTATION_VEC_NOT_NORMAL(rot) ( \
418 fabs(1-sqrt(rot.c[0]*rot.c[0]+rot.c[1]*rot.c[1]+rot.c[2]*rot.c[2])) \
419 >NORMAL_VECTOR_LENGTH_TOLERANCE \
420)
421
422/* defines for raycasting: */
423#define XEQ (APPROX(t_r1.x,t_r2.x))
424#define YEQ (APPROX(t_r1.y,t_r2.y))
425#define ZEQ (APPROX(t_r1.z,t_r2.z))
426/* xrat(a) = ratio to reach coordinate a on axis x */
427#define XRAT(a) (((a)-t_r1.x)/(t_r2.x-t_r1.x))
428#define YRAT(a) (((a)-t_r1.y)/(t_r2.y-t_r1.y))
429#define ZRAT(a) (((a)-t_r1.z)/(t_r2.z-t_r1.z))
430/* mratx(r) = x-coordinate gotten by multiplying by given ratio */
431#define MRATX(a) (t_r1.x + (a)*(t_r2.x-t_r1.x))
432#define MRATY(a) (t_r1.y + (a)*(t_r2.y-t_r1.y))
433#define MRATZ(a) (t_r1.z + (a)*(t_r2.z-t_r1.z))
434
435/* POLYREP stuff */
436#define POINT_FACES 16 /* give me a point, and it is in up to xx faces */
437
438/* Function Prototypes */
439
440void render_node(struct X3D_Node *node);
441
442void rayhit(float rat, float cx,float cy,float cz, float nx,float ny,float nz,
443float tx,float ty, char *descr) ;
444
445void fwnorprint (float *norm);
446
447
448/* not defined anywhere: */
449/* void Extru_init_tex_cap_vals(); */
450
451
452/* from the PNG examples */
453unsigned char *readpng_get_image(double display_exponent, int *pChannels,
454 unsigned long *pRowbytes);
455
456/* Used to determine in Group, etc, if a child is a local light; do comparison with this */
457void LocalLight_Rend(void *nod_);
458
459void saveLightState2(int *ls);
460void restoreLightState2(int ls);
461int numberOfLights();
462void refreshLightUniforms();
463#define LOCAL_LIGHT_SAVE int lastlight; //savedlight[8];
464/*
465Saved version by Doug Sanden(?)
466void saveLightState(int *);
467void restoreLightState(int *);
468#define LOCAL_LIGHT_CHILDREN(a) \
469 if ((node->_renderFlags & VF_localLight)==VF_localLight){saveLightState(savedlight); localLightChildren(a);}
470
471#define LOCAL_LIGHT_OFF if ((node->_renderFlags & VF_localLight)==VF_localLight) { \
472 restoreLightState(savedlight); }
473*/
474
475/* comments rearranged by John Stewart to get around compiler warnings
476//#define LOCAL_LIGHT_CHILDREN(a) \
477// if ((node->_renderFlags & VF_localLight)==VF_localLight && renderstate()->render_light != VF_globalLight){ \
478// saveLightState2(&lastlight);\
479// localLightChildren(a);}
480//
481//#define LOCAL_LIGHT_OFF \
482// if ((node->_renderFlags & VF_localLight)==VF_localLight && renderstate()->render_light != VF_globalLight) { \
483// if(numberOfLights() > lastlight) {\
484// setLightChangedFlag(numberOfLights()-1); \
485// refreshLightUniforms();\
486// }\
487// restoreLightState2(lastlight); \
488// }
489*/
490
491
492void prep_sibAffectors(struct X3D_Node *parent, struct Multi_Node* affectors);
493void fin_sibAffectors(struct X3D_Node *parent, struct Multi_Node* affectors);
494
495void normalize_ifs_face (float *point_normal,
496 struct SFVec3f *facenormals, //struct point_XYZ *facenormals,
497 int *pointfaces,
498 int mypoint,
499 int curpoly,
500 float creaseAngle);
501
502
503
504#define RUNNINGONAMD64 (sizeof(void *) == 8)
505
506/* Text node system fonts. On startup, freewrl checks to see where the fonts
507 * are stored
508 */
509//extern float AC_LastDuration[];
510
511//extern int SoundEngineStarted;
512
513/* used to determine whether we have transparent materials. */
514//extern int have_transparency;
515
516
517/* current time */
518//extern double TickTime;
519//extern double lastTime;
520double TickTime();
521double lastTime();
522
523/* number of triangles this rendering loop */
524//extern int trisThisLoop;
525
526/* saved rayhit and hyperhit */
527//extern struct SFColor ray_save_posn, hyp_save_posn, hyp_save_norm;
528
529/* set a node to be sensitive */
530void setSensitive(struct X3D_Node *parent,struct X3D_Node *me);
531
532/* bindable nodes */
533extern GLint viewport[]; //true static
534//extern struct sNaviInfo naviinfo;
535
536
537extern double defaultExamineDist;
538
539
540/* Sending events back to Browser (eg, Anchor) */
541extern int wantEAI;
542
543void *returnInterpolatorPointer (int nodeType);
544
545/* SAI code node interface return values The meanings of
546 these numbers can be found in the SAI java code */
547#define X3DBoundedObject 1
548#define X3DBounded2DObject 2
549#define X3DURLObject 3
550#define X3DAppearanceNode 10
551#define X3DAppearanceChildNode 11
552#define X3DMaterialNode 12
553#define X3DTextureNode 13
554#define X3DTexture2DNode 14
555#define X3DTexture3DNode 15
556#define X3DTextureTransformNode 16
557#define X3DTextureTransform2DNode 17
558#define X3DGeometryNode 18
559#define X3DTextNode 19
560#define X3DParametricGeometryNode 20
561#define X3DGeometricPropertyNode 21
562#define X3DColorNode 22
563#define X3DCoordinateNode 23
564#define X3DNormalNode 24
565#define X3DTextureCoordinateNode 25
566#define X3DFontStyleNode 26
567#define X3DProtoInstance 27
568#define X3DChildNode 28
569#define X3DBindableNode 29
570#define X3DBackgroundNode 30
571#define X3DGroupingNode 31
572#define X3DShapeNode 32
573#define X3DInterpolatorNode 33
574#define X3DLightNode 34
575#define X3DScriptNode 35
576#define X3DSensorNode 36
577#define X3DEnvironmentalSensorNode 37
578#define X3DKeyDeviceSensorNode 38
579#define X3DNetworkSensorNode 39
580#define X3DPointingDeviceSensorNode 40
581#define X3DDragSensorNode 41
582#define X3DTouchSensorNode 42
583#define X3DSequencerNode 43
584#define X3DTimeDependentNode 44
585#define X3DSoundSourceNode 45
586#define X3DTriggerNode 46
587#define X3DInfoNode 47
588#define X3DShaderNode 48
589#define X3DVertexAttributeNode 49
590#define X3DProgrammableShaderObject 50
591#define X3DUrlObject 51
592#define X3DEnvironmentTextureNode 52
593#define X3DSFNode 53 /* this is an "X3DNode" in the spec, but it conflicts with an internal def. */
594#define X3DProductStructureChildNode 54
595#define X3DComposedGeometryNode 55
596#define X3DNurbsControlCurveNode 56
597#define X3DNurbsSurfaceGeometryNode 57
598#define X3DViewportNode 58
599#define X3DLayerNode 59
600#define X3DLayerSetNode 60
601#define X3DLayoutNode 61
602#define X3DNBodyCollidableNode 62
603#define X3DRigidJointNode 63
604#define X3DChaserNode 64
605#define X3DDamperNode 65
606#define X3DParticleEmitterNode 66
607#define X3DParticlePhysicsModelNode 67
608#define X3DComposableVolumeRenderStyleNode 68
609#define X3DVolumeDataNode 69
610#define X3DTextureProjectorNode 70
611
612
613BOOL isManagedField(int mode, int type, BOOL isPublic);
614
615void AddRemoveChildren (struct X3D_Node *parent, struct Multi_Node *tn, struct X3D_Node * *nodelist, int len, int ar, char * where, int lin);
616unsigned long upper_power_of_two(unsigned long v);
617unsigned long lower_power_of_two(unsigned long v);
618void update_node(struct X3D_Node *ptr);
619//void update_renderFlag(struct X3D_Node *ptr, int flag);
620void UPDATE_RENDERFLAG(struct X3D_Node *ptr, int flag,char *fi, int li);
621#define update_renderFlag(aaa,bbb) UPDATE_RENDERFLAG(aaa,bbb,__FILE__,__LINE__)
622
623int get_touched_flag(uintptr_t fptr, uintptr_t actualscript);
624void getMultiElementtype(char *strp, struct Multi_Vec3f *tn, int eletype);
625void CRoutes_RemoveSimple(struct X3D_Node* from, int fromOfs,
626 struct X3D_Node* to, int toOfs, int len);
627 void CRoutes_RemoveSimpleB(struct X3D_Node* from, int fromIndex, int fromBuiltin,
628 struct X3D_Node* to, int toIndex, int toBuiltin, int len);
629void CRoutes_RegisterSimple(struct X3D_Node* from, int fromOfs,
630 struct X3D_Node* to, int toOfs, int len);
631 void CRoutes_RegisterSimpleB(
632 struct X3D_Node* from, int fromIndex, int fromBuiltIn,
633 struct X3D_Node* to, int toIndex, int toBuiltIn,
634 int type);
635void CRoutes_Register(int adrem, struct X3D_Node *from,
636 int fromoffset,
637 struct X3D_Node *to,
638 int toOffset,
639 int length,
640 void *intptr,
641 int scrdir,
642 void* extra);
643void CRoutes_free(void);
644void propagate_events(void);
645int getRoutesCount(void);
646void getField_ToJavascript (int num, int fromoffset);
647void add_first(struct X3D_Node * node);
648void add_physics(struct X3D_Node * node);
649void registerTexture(struct X3D_Node * node);
650int checkNode(struct X3D_Node *node, char *fn, int line);
651
652
653void do_first(void);
654void process_eventsProcessed(void);
655
656
657void getEAI_MFStringtype (struct Multi_String *from, struct Multi_String *to);
658
659
660
661/* menubar stuff */
662void frontendUpdateButtons(void); /* used only if we are not able to multi-thread OpenGL */
663/* IS -- moved these into libFreeWRL.h as front-ends call some of them directly
664void setMenuButton_collision (int val) ;
665void setMenuButton_headlight (int val) ;
666void setMenuButton_navModes (int type) ;
667void setMenuButton_texSize (int size); */
668void setConsoleMessage(char *stat) ;
669void fwl_reload(void);
670
671void fwl_do_rawKeyPress(int key, int type);
672
673int convert_typetoInt (const char *type); /* convert a string, eg "SFBOOL" to type, eg SFBOOL */
674
675//extern double BrowserFPS;
676//extern double BrowserSpeed;
677void render_polyrep(void *node);
678
679//extern int CRoutesExtra; /* let EAI see param of routing table - Listener data. */
680
681/* types of scripts. */
682#define NOSCRIPT 0
683#define JAVASCRIPT 1
684#define SHADERSCRIPT 4
685
686/* printf is defined by perl; causes segfault in threaded freewrl */
687#ifdef printf
688#undef printf
689#endif
690#ifdef die
691#undef die
692#endif
693
694//extern struct X3D_Group *rootNode;
695struct X3D_Node *rootNode();
696void setRootNode(struct X3D_Node *rn);
697typedef struct void3 {
698 void *one;
699 void *two;
700 void *three;
701} void3;
702struct Vector *libraries();
703void setLibraries(struct Vector *);
704void addLibrary(char *url, struct X3D_Proto *library, void* res);
705void3 *librarySearch(char *absoluteUniUrlNoPound);
706
707extern int isPerlParsing(void);
708/* extern int isURLLoaded(void); /\* initial scene loaded? Robert Sim *\/ */
709extern int isTextureParsing(void);
710extern void loadMovieTexture(struct X3D_MovieTexture *node, void *param);
711extern void loadMultiTexture(struct X3D_MultiTexture *node);
712extern void loadBackgroundTextures (struct X3D_Background *node);
713extern void loadTextureBackgroundTextures (struct X3D_TextureBackground *node);
714extern GLfloat boxtex[], boxnorms[], BackgroundVert[];
715extern GLfloat Backnorms[];
716
717extern void new_tessellation(void);
718extern void new_text_tessellation(void);
719extern void initializePerlThread(void);
720//extern void setWantEAI(int flag);
721extern void setPluginPipe(const char *optarg);
722extern void setPluginFD(const char *optarg);
723extern void setPluginInstance(const char *optarg);
724
725extern int isPerlinitialized(void);
726
727extern char *getInputURL(void);
728extern char *lastReadFile; /* name last file read in */
729struct sCollisionInfo* CollisionInfo();
730struct sFallInfo* FallInfo();
731
732extern void xs_init(void);
733
734//extern int navi_tos;
735extern void checkAndAllocMemTables(int *texture_num, int increment);
736extern void storeMPGFrameData(int latest_texture_number, int h_size, int v_size,
737 int mt_repeatS, int mt_repeatT, char *Image);
738void mpg_main(char *filename, int *x,int *y,int *depth,int *frameCount,char **ptr);
739void removeFilenameFromPath (char *path);
740
741int EAI_CreateVrml(const char *tp, const char *inputstring, struct X3D_Node *ectx, struct X3D_Group *node);
742int EAI_CreateX3d(const char *tp, const char *inputstring, struct X3D_Node *ectx, struct X3D_Group *where);
743void EAI_Route(char cmnd, const char *tf);
744
745void handle_aqua(const int mev, const unsigned int button, int x, int y);
746
747#define overMark 23425
748
749/* mimic X11 events in WIN32 ; FIXME: establish a cleaner interface for this */
750#define KeyChar 1
751
752// OLD_IPHONE_AQUA #if defined(AQUA) || defined(_MSC_VER) || defined(_ANDROID) || defined(ANDROIDNDK)
753#if defined(_MSC_VER) || defined(_ANDROID) || defined(ANDROIDNDK)
754#ifndef _MIMIC_X11_SCREEN_BUTTONS
755 #define _MIMIC_X11_SCREEN_BUTTONS
756 #define KeyPress 2
757 #define KeyRelease 3
758 #define ButtonPress 4
759 #define ButtonRelease 5
760 #define MotionNotify 6
761 #define MapNotify 19
762 #endif
763#endif
764
765/* extern void setSnapSeq(); */
766extern void setEAIport(int pnum);
767/* extern void setKeyString(const char *str); */
768extern void setNoCollision();
769/* extern void setSeqFile(const char* file); */
770/* extern void setMaxImages(int max); */
771extern void setBrowserFullPath(const char *str);
772extern void setInstance(uintptr_t instance);
773
774extern const char *getLibVersion();
775extern int doBrowserAction ();
776
777
778extern char *myPerlInstallDir;
779
780/* for Extents and BoundingBoxen */
781#define EXTENT_MAX_X _extent[0]
782#define EXTENT_MIN_X _extent[1]
783#define EXTENT_MAX_Y _extent[2]
784#define EXTENT_MIN_Y _extent[3]
785#define EXTENT_MAX_Z _extent[4]
786#define EXTENT_MIN_Z _extent[5]
787
788void freewrlDie(const char *format);
789
790/* children stuff moved out of VRMLRend.pm and VRMLC.pm for v1.08 */
791
792//extern int render_sensitive,render_vp,render_light,render_proximity,render_other,verbose,render_blend,render_geom,render_collision;
793typedef struct trenderstate{
794int render_sensitive,render_picking,render_vp,render_light,render_proximity,render_other,
795verbose,render_blend,render_geom,render_collision,render_cube,render_background, render_boxes;
797//extern struct trenderstate renderstate;
798ttrenderstate renderstate();
799
800int SAI_IntRetCommand (char cmnd, const char *fn);
801char * SAI_StrRetCommand (char cmnd, const char *fn);
802char *EAI_GetTypeName (unsigned int uretval);
803char* EAI_GetValue(unsigned int nodenum, const char *fieldname, const char *nodename);
804
805void add_parent(struct X3D_Node *node_, struct X3D_Node *parent_,char *file, int line);
806void remove_parent(struct X3D_Node *child, struct X3D_Node *parent);
807void EAI_readNewWorld(char *inputstring);
808
809void collide_ElevationGrid(struct X3D_ElevationGrid *node);
810void collide_GeoElevationGrid(struct X3D_GeoElevationGrid *node);
811
812
813void make_genericfaceset(struct X3D_IndexedFaceSet *this_);
814void collide_genericfaceset (struct X3D_IndexedFaceSet *node );
815#define rendray_Text render_ray_polyrep
816#define rendray_ElevationGrid render_ray_polyrep
817//#define collide_ElevationGrid collide_genericfaceset
818#define rendray_Extrusion render_ray_polyrep
819#define rendray_IndexedFaceSet render_ray_polyrep
820#define make_IndexedFaceSet make_genericfaceset
821#define make_ElevationGrid make_genericfaceset
822#define rendray_ElevationGrid render_ray_polyrep
823
824/* Component Rendering nodes */
825#define rendray_IndexedTriangleSet render_ray_polyrep
826#define rendray_IndexedTriangleFanSet render_ray_polyrep
827#define rendray_IndexedTriangleStripSet render_ray_polyrep
828#define rendray_IndexedQuadSet render_ray_polyrep
829#define rendray_QuadSet render_ray_polyrep
830#define rendray_TriangleSet render_ray_polyrep
831#define rendray_TriangleFanSet render_ray_polyrep
832#define rendray_TriangleStripSet render_ray_polyrep
833#define collide_IndexedFaceSet collide_genericfaceset
834#define collide_IndexedTriangleFanSet collide_genericfaceset
835#define collide_IndexedTriangleSet collide_genericfaceset
836#define collide_IndexedTriangleStripSet collide_genericfaceset
837#define collide_IndexedQuadSet collide_genericfaceset
838#define collide_QuadSet collide_genericfaceset
839#define collide_TriangleFanSet collide_genericfaceset
840#define collide_TriangleSet collide_genericfaceset
841#define collide_TriangleStripSet collide_genericfaceset
842#define make_IndexedTriangleFanSet make_genericfaceset
843#define make_IndexedTriangleSet make_genericfaceset
844#define make_IndexedTriangleStripSet make_genericfaceset
845#define make_IndexedQuadSet make_genericfaceset
846#define make_QuadSet make_genericfaceset
847#define make_TriangleFanSet make_genericfaceset
848#define make_TriangleSet make_genericfaceset
849#define make_TriangleStripSet make_genericfaceset
850#define rendray_GeoElevationGrid render_ray_polyrep
851//#define collide_GeoElevationGrid collide_genericfaceset
852#define make_GeoElevationGrid make_genericfaceset
853
854
855/* Event Utilities Component */
856void do_BooleanFilter (void *node);
857void do_BooleanSequencer (void *node);
858void do_BooleanToggle (void *node);
859void do_BooleanTrigger (void *node);
860void do_IntegerSequencer (void *node);
861void do_IntegerTrigger (void *node);
862void do_TimeTrigger (void *node);
863
864/* GeoSpatial event utility */
865void do_GeoConvert(void *node);
866
867#define ADD_PARENT(a,b) add_parent(a,b,__FILE__,__LINE__)
868//#define NODE_ADD_PARENT(a) ADD_PARENT(a,X3D_NODE(ptr))
869//#define NODE_REMOVE_PARENT(a) ADD_PARENT(a,X3D_NODE(ptr)) //dug9 looks wrong, but not used
870
871
872#define LIGHTING_ON if (!tg->RenderFuncs.lightingOn) {tg->RenderFuncs.lightingOn=TRUE;}
873#define LIGHTING_OFF if(tg->RenderFuncs.lightingOn) {tg->RenderFuncs.lightingOn=FALSE;}
874
875#define LIGHTING_INITIALIZE gglobal()->RenderFuncs.lightingOn=TRUE;
876
877void zeroAllBindables(void);
878
879int inputParse(unsigned type, char *inp, int bind, int returnifbusy,
880 void *ptr, unsigned ofs, int *complete,
881 int zeroBind);
882void compileNode (void (*nodefn)(void *, void *, void *, void *, void *, void *), void *node, void *a, void *b, void *c, void *d, void *e);
883void destroyCParserData();
884//extern struct VRMLParser* savedParser;
885
886void getMovieTextureOpenGLFrames(int *highest, int *lowest,int myIndex);
887int ConsoleMessage(const char *fmt, ...);
888void closeConsoleMessage(void);
889
890
891void outOfMemory(const char *message);
892
893void killErrantChildren(void);
894
895void kill_routing(void);
896void kill_bindables(void);
897void kill_javascript(void);
898void kill_oldWorld(int kill_EAI, int kill_JavaScript, char *file, int line);
899void reset_Browser();
900void kill_clockEvents(void);
901//void kill_openGLTextures(void);
902void kill_X3DDefs(void);
903//extern int currentFileVersion;
904
905int countCommas (char *instr);
906void dirlightChildren(struct Multi_Node ch);
907void normalChildren(struct Multi_Node ch);
908void checkParentLink (struct X3D_Node *node,struct X3D_Node *parent);
909
910/* background colour */
911void setglClearColor (float *val);
912void doglClearColor(void);
913extern int cc_changed;
914
915/* int mapFieldTypeToInernaltype (indexT kwIndex); msvc has problem perhaps with typedef typdef unsigned int indexT*/
916int mapFieldTypeToInernaltype (unsigned int kwIndex);
917void resetSensorEvents();
918
919
920/* META data, component, profile stuff */
921void handleMetaDataStringString(struct Uni_String *val1,struct Uni_String *val2);
922void handleUnitDataStringString(void *ec, char *categoryname,char *unitname, double conversionfactor);
923void handleProfile(int myp);
924void handleComponent(int com, int lev);
925void handleExport (char *node, char *as);
926void handleImport (char *nodeName,char *nodeImport, char *as);
927void handleVersion (const char *versionString);
928
929
930/* free memory */
931void registerX3DNode(struct X3D_Node * node);
932
933void doNotRegisterThisNodeForDestroy(struct X3D_Node * nodePtr);
934
935struct Multi_Vec3f *getCoordinate (struct X3D_Node *node, char *str);
936
937void replaceWorldNeeded(char* str);
938
939/* X3D C parser */
940int X3DParse(struct X3D_Node *ectx, struct X3D_Node *parent, const char *inputstring);
941void *createNewX3DNode (int nt);
942void *createNewX3DNode0 (int nt);
943void *createNewX3DNodeB(int nt, int intable, void *executionContext);
944
945char *findFIELDNAMESfromNodeOffset0(struct X3D_Node *node, int offset);
946#include <stdio.h>
947void print_routes(FILE* fp);
948void print_DEFed_node_names_and_pointers(FILE* fp);
949
950//updateStatusBar(void);
951void profile_start(char *);
952void profile_end(char *);
953void profile_print_all();
954
955
956/*pack 4 flags into one int, using char */
957char ciflag_get(int flags, int index);
958int ciflag_set(int flags, char flag, int index );
959int indexChildrenName(struct X3D_Node *node);
960struct Multi_Node *childrenField(struct X3D_Node *node);
961int offsetofChildren(struct X3D_Node *node);
962
963//for Tess.c and Component_Text - the Opengl redbook gluTessBeginPolygon(,data) tesselator combiner callback data
964typedef struct text_combiner_data {
965 //so we can add the new point to our own data
966 float *coords;
967 int *counter;
968 int *ria;
969 int *riaindex;
971typedef struct polyrep_combiner_data {
972 //so we can add the new point to our own data
973 float *coords;
974 int *counter;
975 int *ria;
976 int *riaindex;
978
979#endif /* __FREEWRL_HEADERS_H__ */
Definition Viewer.h:139