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