29#ifndef __FREEWRL_HEADERS_H__
30#define __FREEWRL_HEADERS_H__
34extern char *BrowserName;
35const char* freewrl_get_browser_program();
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
49#define SPEC_X3D40 0X40
50#define SPEC_VRML1 0x01
70#define FIELDOFFSET_LENGTH 6
82#define CHILDREN_COUNT int nc = node->_sortedChildren.n;
83#define RETURN_FROM_CHILD_IF_NOT_FOR_ME \
89 ttrenderstate rs = renderstate(); \
90 if (rs->render_blend == VF_Blend) \
91 if ((node->_renderFlags & VF_Blend) != VF_Blend) { \
94 if (rs->render_proximity == VF_Proximity) \
95 if ((node->_renderFlags & VF_Proximity) != VF_Proximity) { \
98 if (rs->render_light == VF_globalLight) \
99 if ((node->_renderFlags & VF_globalLight) != VF_globalLight) { \
106#define ARR_SIZE(arr) (int)(sizeof(arr)/sizeof((arr)[0]))
108extern char *BrowserName;
109extern char *BrowserFullPath;
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
128#define VF_HideRight 0x4000
130#define VF_Cube 0x10000
131#define VF_Background 0x20000
133#define DEFAULT_NEARPLANE 0.07
134#define DEFAULT_FARPLANE 21000.0
135#define DEFAULT_BACKGROUNDPLANE 18000.0
136extern double geoHeightinZAxis;
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
170#define NODE_CHANGE_INIT_VAL 153
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); \
175 if (!node->_intern) return;
177#define COMPILE_IF_REQUIRED { struct X3D_Virt *v; \
178 if (node->_ichange != node->_change) { \
179 v = virtTable[node->_nodeType]; \
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__);} \
184 if (node->_ichange == 0) return; \
187#define COMPILE_IF_REQUIRED_RETURN_NULL_ON_ERROR { struct X3D_Virt *v; \
188 if (node->_ichange != node->_change) { \
189 v = virtTable[node->_nodeType]; \
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__);} \
194 if (node->_ichange == 0) return NULL; \
197#define COMPILE_TCNODE { \
198 struct X3D_Virt *v; \
199 if (myTCnode->_ichange != myTCnode->_change) { \
200 v = virtTable[myTCnode->_nodeType]; \
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__);} \
206 if (myTCnode->_ichange == 0) return; \
214#define offsetPointer_deref(t, me, offs) ((t)(((char*)(me))+offs))
229#define POSSIBLE_PROTO_EXPANSION(type,inNode,outNode) \
230 outNode = (type)getTypeNode(inNode);
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)
238#define MARK_SFFLOAT_INOUT_EVENT(good,save,offset) \
239 if (!APPROX(good,save)) { \
240 MARK_EVENT(X3D_NODE(node), offset);\
244#define MARK_SFTIME_INOUT_EVENT(good,save,offset) \
245 if (!APPROX(good,save)) { \
246 MARK_EVENT(X3D_NODE(node), offset);\
250#define MARK_SFINT32_INOUT_EVENT(good,save,offset) \
252 MARK_EVENT(X3D_NODE(node), offset);\
256#define MARK_SFBOOL_INOUT_EVENT(good,save,offset) \
258 MARK_EVENT(X3D_NODE(node), offset);\
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));\
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));\
277#define MARK_SFNODE_INOUT_EVENT(good,save,offset) \
278 if (good != save) { \
279 MARK_EVENT(X3D_NODE(node), offset);\
284#define MARK_MFNODE_INOUT_EVENT_PRE_JULY29_2015(good,save,offset) \
286 if (good.p != save.p) { \
287 MARK_EVENT(X3D_NODE(node), offset);\
292#define MARK_MFNODE_INOUT_EVENT(good,save,offset) \
294 if (good.p != save.p) { \
295 MARK_EVENT(X3D_NODE(node), offset);\
297 FREE_IF_NZ(save.p); \
299 if(good.n && good.p){ \
300 save.p = MALLOCV(good.n * sizeof(void*)); \
301 memcpy(save.p,good.p,good.n * sizeof(void*)); \
339int find_key (
int kin,
float frac,
float *keys);
340void startOfLoopNodeUpdates(
void);
342void zeroVisibilityFlag(
void);
343void setField_fromJavascript (
struct X3D_Node *ptr,
char *field,
char *value,
int isXML);
344unsigned int setField_FromEAI (
char *ptr);
347float *extent6f_clear(
float *extent6);
348#define INITIALIZE_EXTENT extent6f_clear(node->_extent);
359#if defined(DEBUG) || defined(FW_DEBUG)
364#undef SETFIELDVERBOSE
369#undef JSVRMLCLASSESVERBOSE
390#undef STREAM_POLY_VERBOSE
393#undef COLLISIONVERBOSE
396#undef CAPABILITIESVERBOSE
401#define TESS_MAX_COORDS 200000
403#define offset_of(p_type,field) ((unsigned int)(&(((p_type)NULL)->field)-NULL))
405#define UNUSED(v) ((void) v)
406#define ISUSED(v) ((void) v)
408#define PI 3.14159265358979323846
409#define PIF 3.1415926535f
412#define APPROX(a,b) (fabs((a)-(b))<0.00000001)
415#define NORMAL_VECTOR_LENGTH_TOLERANCE 0.00001
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 \
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))
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))
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))
436#define POINT_FACES 16
440void render_node(
struct X3D_Node *node);
442void rayhit(
float rat,
float cx,
float cy,
float cz,
float nx,
float ny,
float nz,
443float tx,
float ty,
char *descr) ;
445void fwnorprint (
float *norm);
453unsigned char *readpng_get_image(
double display_exponent,
int *pChannels,
454 unsigned long *pRowbytes);
457void LocalLight_Rend(
void *nod_);
459void saveLightState2(
int *ls);
460void restoreLightState2(
int ls);
462void refreshLightUniforms();
463#define LOCAL_LIGHT_SAVE int lastlight;
495void normalize_ifs_face (
float *point_normal,
504#define RUNNINGONAMD64 (sizeof(void *) == 8)
533extern GLint viewport[];
537extern double defaultExamineDist;
543void *returnInterpolatorPointer (
int nodeType);
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
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
613BOOL isManagedField(
int mode,
int type, BOOL isPublic);
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);
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__)
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,
635void CRoutes_Register(
int adrem,
struct X3D_Node *from,
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);
654void process_eventsProcessed(
void);
662void frontendUpdateButtons(
void);
668void setConsoleMessage(
char *stat) ;
669void fwl_reload(
void);
671void fwl_do_rawKeyPress(
int key,
int type);
673int convert_typetoInt (
const char *type);
677void render_polyrep(
void *node);
684#define SHADERSCRIPT 4
696void setRootNode(
struct X3D_Node *rn);
702struct Vector *libraries();
703void setLibraries(
struct Vector *);
704void addLibrary(
char *url,
struct X3D_Proto *library,
void* res);
705void3 *librarySearch(
char *absoluteUniUrlNoPound);
707extern int isPerlParsing(
void);
709extern int isTextureParsing(
void);
714extern GLfloat boxtex[], boxnorms[], BackgroundVert[];
715extern GLfloat Backnorms[];
717extern void new_tessellation(
void);
718extern void new_text_tessellation(
void);
719extern void initializePerlThread(
void);
721extern void setPluginPipe(
const char *optarg);
722extern void setPluginFD(
const char *optarg);
723extern void setPluginInstance(
const char *optarg);
725extern int isPerlinitialized(
void);
727extern char *getInputURL(
void);
728extern char *lastReadFile;
732extern void xs_init(
void);
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);
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);
745void handle_aqua(
const int mev,
const unsigned int button,
int x,
int y);
747#define overMark 23425
753#if defined(_MSC_VER) || defined(_ANDROID) || defined(ANDROIDNDK)
754#ifndef _MIMIC_X11_SCREEN_BUTTONS
755 #define _MIMIC_X11_SCREEN_BUTTONS
758 #define ButtonPress 4
759 #define ButtonRelease 5
760 #define MotionNotify 6
766extern void setEAIport(
int pnum);
768extern void setNoCollision();
771extern void setBrowserFullPath(
const char *str);
772extern void setInstance(uintptr_t instance);
774extern const char *getLibVersion();
775extern int doBrowserAction ();
778extern char *myPerlInstallDir;
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]
788void freewrlDie(
const char *format);
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;
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);
805void add_parent(
struct X3D_Node *node_,
struct X3D_Node *parent_,
char *file,
int line);
807void EAI_readNewWorld(
char *inputstring);
815#define rendray_Text render_ray_polyrep
816#define rendray_ElevationGrid render_ray_polyrep
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
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
852#define make_GeoElevationGrid make_genericfaceset
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);
865void do_GeoConvert(
void *node);
867#define ADD_PARENT(a,b) add_parent(a,b,__FILE__,__LINE__)
872#define LIGHTING_ON if (!tg->RenderFuncs.lightingOn) {tg->RenderFuncs.lightingOn=TRUE;}
873#define LIGHTING_OFF if(tg->RenderFuncs.lightingOn) {tg->RenderFuncs.lightingOn=FALSE;}
875#define LIGHTING_INITIALIZE gglobal()->RenderFuncs.lightingOn=TRUE;
877void zeroAllBindables(
void);
879int inputParse(
unsigned type,
char *inp,
int bind,
int returnifbusy,
880 void *ptr,
unsigned ofs,
int *complete,
882void compileNode (
void (*nodefn)(
void *,
void *,
void *,
void *,
void *,
void *),
void *node,
void *a,
void *b,
void *c,
void *d,
void *e);
883void destroyCParserData();
886void getMovieTextureOpenGLFrames(
int *highest,
int *lowest,
int myIndex);
887int ConsoleMessage(
const char *fmt, ...);
888void closeConsoleMessage(
void);
891void outOfMemory(
const char *message);
893void killErrantChildren(
void);
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);
900void kill_clockEvents(
void);
902void kill_X3DDefs(
void);
905int countCommas (
char *instr);
911void setglClearColor (
float *val);
912void doglClearColor(
void);
913extern int cc_changed;
916int mapFieldTypeToInernaltype (
unsigned int kwIndex);
917void resetSensorEvents();
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);
931void registerX3DNode(
struct X3D_Node * node);
933void doNotRegisterThisNodeForDestroy(
struct X3D_Node * nodePtr);
937void replaceWorldNeeded(
char* str);
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);
945char *findFIELDNAMESfromNodeOffset0(
struct X3D_Node *node,
int offset);
947void print_routes(FILE* fp);
948void print_DEFed_node_names_and_pointers(FILE* fp);
951void profile_start(
char *);
952void profile_end(
char *);
953void profile_print_all();
957char ciflag_get(
int flags,
int index);
958int ciflag_set(
int flags,
char flag,
int index );
959int indexChildrenName(
struct X3D_Node *node);
961int offsetofChildren(
struct X3D_Node *node);