33#if defined(JAVASCRIPT_DUK)
37#include <libFreeWRL.h>
40#include "../vrml_parser/Structs.h"
41#include "../vrml_parser/CRoutes.h"
42#include "../opengl/OpenGL_Utils.h"
43#include "../main/headers.h"
44#include "../scenegraph/RenderFuncs.h"
45#include "../vrml_parser/CParseGeneral.h"
46#include "../scenegraph/Vector.h"
47#include "../vrml_parser/CFieldDecls.h"
48#include "../vrml_parser/CParseParser.h"
49#include "../vrml_parser/CParseLexer.h"
50#include "../vrml_parser/CParse.h"
51#include "../main/Snapshot.h"
52#include "../scenegraph/Collision.h"
53#include "../scenegraph/quaternion.h"
54#include "../scenegraph/Viewer.h"
55#include "../x3d_parser/Bindable.h"
56#include "../input/EAIHeaders.h"
65#define malloc(A) MALLOCV(A)
66#define free(A) FREE_IF_NZ(A)
67#define realloc(A,B) REALLOC(A,B)
227struct string_int lookup_X3DConstants[] = {
228 {
"INITIALIZED_EVENT",1},
229 {
"SHUTDOWN_EVENT",1},
230 {
"CONNECTION_ERROR",1},
231 {
"INITIALIZED_ERROR",1},
232 {
"NOT_STARTED_STATE",1},
233 {
"IN_PROGRESS_STATE",1},
234 {
"COMPLETE_STATE",1},
236 {
"SFBool",FIELDTYPE_SFBool},
237 {
"MFBool",FIELDTYPE_MFBool},
238 {
"MFInt32",FIELDTYPE_MFInt32},
239 {
"SFInt32",FIELDTYPE_SFInt32},
240 {
"SFFloat",FIELDTYPE_SFFloat},
241 {
"MFFloat",FIELDTYPE_MFFloat},
242 {
"SFDouble",FIELDTYPE_SFDouble},
243 {
"MFDouble",FIELDTYPE_MFDouble},
244 {
"SFTime",FIELDTYPE_SFTime},
245 {
"MFTime",FIELDTYPE_MFTime},
246 {
"SFNode",FIELDTYPE_SFNode},
247 {
"MFNode",FIELDTYPE_MFNode},
248 {
"SFVec2f",FIELDTYPE_SFVec2f},
249 {
"MFVec2f",FIELDTYPE_MFVec2f},
250 {
"SFVec3f",FIELDTYPE_SFVec3f},
251 {
"MFVec3f",FIELDTYPE_MFVec3f},
252 {
"SFVec4f",FIELDTYPE_SFVec4f},
253 {
"MFVec4f",FIELDTYPE_MFVec3f},
254 {
"SFVec2d",FIELDTYPE_SFVec2d},
255 {
"MFVec2d",FIELDTYPE_MFVec2d},
256 {
"SFVec3d",FIELDTYPE_SFVec3d},
257 {
"MFVec3d",FIELDTYPE_MFVec3d},
258 {
"SFVec4d",FIELDTYPE_SFVec4d},
259 {
"MFVec4d",FIELDTYPE_MFVec4d},
260 {
"SFRotation",FIELDTYPE_SFRotation},
261 {
"MFRotation",FIELDTYPE_MFRotation},
262 {
"SFColor",FIELDTYPE_SFColor},
263 {
"MFColor",FIELDTYPE_MFColor},
264 {
"SFImage",FIELDTYPE_SFImage},
265 {
"MFImage",FIELDTYPE_MFImage},
266 {
"SFColorRGBA",FIELDTYPE_SFColorRGBA},
267 {
"MFColorRGBA",FIELDTYPE_MFColorRGBA},
268 {
"SFString",FIELDTYPE_SFString},
269 {
"MFString",FIELDTYPE_MFString},
270 {
"SFMatrix3f",FIELDTYPE_SFMatrix3f},
271 {
"MFMatrix3f",FIELDTYPE_MFMatrix3f},
272 {
"SFMatrix4f",FIELDTYPE_SFMatrix4f},
273 {
"MFMatrix4f",FIELDTYPE_MFMatrix4f},
274 {
"SFMatrix3d",FIELDTYPE_SFMatrix3d},
275 {
"MFMatrix3d",FIELDTYPE_MFMatrix3d},
276 {
"SFMatrix4d",FIELDTYPE_SFMatrix4d},
277 {
"MFMatrix4d",FIELDTYPE_MFMatrix4d},
321 {
"inputOnly",PKW_inputOnly},
322 {
"outputOnly",PKW_outputOnly},
323 {
"inputOutput",PKW_inputOutput},
324 {
"initializeOnly",PKW_initializeOnly},
328struct string_int *lookup_string_int(
struct string_int *table,
const char *searchkey,
int *index){
332 if(!table)
return NULL;
335 if(!strcmp(table[i].c,searchkey)){
345int X3DConstantsGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
347 fwretval->_integer = lookup_X3DConstants[index].i;
348 fwretval->itype =
'I';
353 int len = (
sizeof(lookup_X3DConstants) /
sizeof(
struct string_int)) -1;
356int X3DConstantsIterator(
int index, FWType fwt, FWPointer *pointer,
const char **name,
int *lastProp,
int *jndex,
char *type,
char *readOnly){
359 if(index < len_constants()){
360 (*name) = lookup_X3DConstants[index].c;
369struct FWTYPE X3DConstantsType = {
370 AUXTYPE_X3DConstants,
377 X3DConstantsIterator,
387int VRBrowserGetName(FWType fwtype,
void *ec,
void * fwn,
int argc, FWval fwpars, FWval fwretval)
389 fwretval->_string = BrowserName;
390 fwretval->itype =
'S';
393int VRBrowserGetVersion(FWType fwtype,
void *ec,
void * fwn,
int argc, FWval fwpars, FWval fwretval)
395 fwretval->_string = libFreeWRL_get_version();
396 fwretval->itype =
'S';
399int VRBrowserGetCurrentSpeed(FWType fwtype,
void *ec,
void * fwn,
int argc, FWval fwpars, FWval fwretval)
402 sprintf (
string,
"%f",gglobal()->Mainloop.BrowserSpeed);
403 fwretval->_string = strdup(
string);
404 fwretval->itype =
'S';
408int VRBrowserGetCurrentFrameRate(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
411 sprintf (
string,
"%6.2f",gglobal()->Mainloop.BrowserFPS);
412 fwretval->_string = strdup(
string);
413 fwretval->itype =
'S';
416int VRBrowserGetWorldURL(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
418 fwretval->_string = BrowserFullPath;
419 fwretval->itype =
'S';
422const char *flexiString(FWval fwpars,
char *buffer)
435 if(fwpars[0].itype ==
'W'){
436 switch(fwpars[0]._web3dval.fieldType){
437 case FIELDTYPE_SFString:
441 _costr = sfs->strptr;
444 case FIELDTYPE_MFString:
448 int i, l1, l2, l3, lt;
455 for(i=0;i<mfs->n;i++){
456 l3 = strlen(mfs->p[i]->strptr);
457 if(lt + l1 + l2 + l3 > lenbuf)
break;
458 strcat(buffer,
"[\"");
459 strcat(buffer,mfs->p[i]->strptr);
460 strcat(buffer,
"\"] ");
465 _costr = mfs->p[0]->strptr;
474int VRBrowserReplaceWorld(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
479 _costr = strdup(flexiString(&fwpars[0],NULL));
486void conCat_duk (
char *out,
char *in) {
488 while (strlen (in) > 0) {
489 strcat (out,
" :loadURLStringBreak:");
490 while (*out !=
'\0') out++;
492 if (*in ==
'[') in++;
493 while ((*in !=
'\0') && (*in ==
' ')) in++;
497 while (*in !=
'"') { *out = *in; out++; in++; }
503 if (*in ==
'"') in++;
504 if (*in ==
',') in++;
505 if (*in ==
']') in++;
509void createLoadUrlString_duk(
char *out,
int outLen,
char *url,
char *param) {
529 commacount1 = 0; commacount2 = 0;
530 tptr = url;
while (*tptr !=
'\0') {
if (*tptr ==
'"') commacount1 ++; tptr++; }
531 tptr = param;
while (*tptr !=
'\0') {
if (*tptr ==
'"') commacount2 ++; tptr++; }
532 commacount1 = commacount1 / 2;
533 commacount2 = commacount2 / 2;
537 (commacount1 * strlen (
" :loadURLStringBreak:")) +
538 (commacount2 * strlen (
" :loadURLStringBreak:"))) > (outLen - 20)) {
539 printf (
"createLoadUrlString, string too long\n");
543 sprintf (out,
"%d %d",commacount1,commacount2);
546 while (*out !=
'\0') out++;
549 conCat_duk (out,url);
550 while (*out !=
'\0') out++;
551 conCat_duk (out,param);
553struct X3D_Anchor* get_EAIEventsIn_AnchorNode();
554int VRBrowserLoadURL(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
556 char *url, *parameter;
557 char bufferUrl[1000];
558 char bufferParam[1000];
561 url = strdup(flexiString(&fwpars[0],bufferUrl));
562 parameter = strdup(flexiString(&fwpars[1],bufferParam));
566 createLoadUrlString_duk(myBuf,1000,url, parameter);
567 createLoadURL(myBuf);
570 setAnchorsAnchor( get_EAIEventsIn_AnchorNode());
572 gglobal()->RenderFuncs.BrowserAction = TRUE;
575int VRBrowserSetDescription(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
578 if(fwpars[0].itype ==
'S')
579 gglobal()->Mainloop.BrowserDescription = fwpars[0]._string;
582int VRBrowserCreateX3DFromString(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
594 ttglobal tg = gglobal();
596 const char *_c = fwpars[0]._string;
599 retGroup = createNewX3DNode0(NODE_Group);
600 gglobal()->ProdCon.savedParser = (
void *)globalParser; globalParser = NULL;
601 ra = EAI_CreateX3d(
"String",_c,ec,retGroup);
602 globalParser = (
struct VRMLParser*)gglobal()->ProdCon.savedParser;
603 if(retGroup->children.n > 0) {
605 memcpy(mfn,&retGroup->children,
sizeof(
struct Multi_Node));
606 FREE_IF_NZ(retGroup);
607 for(i=0;i<mfn->n;i++){
608 mfn->p[i]->_parentVector->n = 0;
610 fwretval->_web3dval.native = mfn;
611 fwretval->_web3dval.fieldType = FIELDTYPE_MFNode;
612 fwretval->_web3dval.gc = 1;
613 fwretval->itype =
'W';
616 FREE_IF_NZ(retGroup);
622int VRBrowserCreateVrmlFromString(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
633 ttglobal tg = gglobal();
635 const char *_c = fwpars[0]._string;
638 retGroup = createNewX3DNode0(NODE_Group);
639 gglobal()->ProdCon.savedParser = (
void *)globalParser; globalParser = NULL;
640 ra = EAI_CreateVrml(
"String",_c,ec,retGroup);
641 globalParser = (
struct VRMLParser*)gglobal()->ProdCon.savedParser;
642 if(retGroup->children.n > 0) {
644 memcpy(mfn,&retGroup->children,
sizeof(
struct Multi_Node));
645 for(i=0;i<mfn->n;i++){
646 mfn->p[i]->_parentVector->n = 0;
648 fwretval->_web3dval.native = mfn;
649 fwretval->_web3dval.fieldType = FIELDTYPE_MFNode;
650 fwretval->_web3dval.gc = 1;
651 fwretval->itype =
'W';
654 deleteVector(
struct X3D_Node*,retGroup->_parentVector);
655 FREE_IF_NZ(retGroup);
660void *createNewX3DNode(
int nt);
661void add_node_to_broto_context(
struct X3D_Proto *currentContext,
struct X3D_Node *node);
662int VRBrowserCreateNodeFromString(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
664 int i, iret, isVRML,isX3D;
666 const char *_c = fwpars[0]._string;
672 for(i=0;i<strlen(_c);i++){
673 if(_c[i] ==
'<') isX3D = TRUE;
674 if(_c[i] ==
'{') isVRML = TRUE;
676 if(!isX3D && !isVRML){
680 ctype = findFieldInNODES(_c);
682 node = (
struct X3D_Node*)createNewX3DNode(ctype);
683 add_node_to_broto_context(ec,node);
690 iret = VRBrowserCreateVrmlFromString(fwtype,ec,fwn,argc,fwpars,fwretval);
692 iret = VRBrowserCreateX3DFromString(fwtype,ec,fwn,argc,fwpars,fwretval);
694 node = fwretval->_web3dval.anyvrml->mfnode.p[0];
695 node->_executionContext = ec;
699 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
700 fwretval->_web3dval.anyvrml->sfnode = node;
701 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
702 fwretval->_web3dval.gc = 0;
703 fwretval->itype =
'W';
708void send_resource_to_parser_async(resource_item_t *res);
709int VRBrowserCreateVrmlFromURL(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
713 int i, iret, type,kind,ifield,ifound;
718 resource_item_t *res;
723 if(fwpars[0].itype ==
'W')
724 url = &fwpars[0]._web3dval.anyvrml->mfstring;
726 if(fwpars[1].itype ==
'W')
727 if(fwpars[1]._web3dval.fieldType == FIELDTYPE_SFNode)
728 target_node = fwpars[1]._web3dval.anyvrml->sfnode;
729 if(fwpars[2].itype ==
'S')
730 cfield = fwpars[2]._string;
732 if(!url || !target_node || !cfield){
733 ConsoleMessage(
"createX3DFromURL parameters: (MFString url, SFNode target_node, string target_field\n");
738 ifound = getFieldFromNodeAndName(target_node,cfield,&type,&kind,&ifield,&value);
740 ConsoleMessage(
"createX3DFromURL no field named %s on nodetype %s\n",cfield,stringNodeType(target_node->_nodeType));
747 res = resource_create_multi(url);
749 res->whereToPlaceData = target_node;
750 res->offsetFromWhereToPlaceData = (int) ((
size_t)value - (
size_t) target_node);
753 send_resource_to_parser_async(res);
759void jsRegisterRoute_HIDE(
762 int len,
const char *adrem) {
765 if (strcmp(
"addRoute",adrem) == 0)
769 CRoutes_Register(ad, from, fromOfs, to, toOfs , len,
770 returnInterpolatorPointer(to->_nodeType), 0, 0);
773int getFieldFromNodeAndNameC(
struct X3D_Node* node,
const char *fieldname,
int *type,
int *kind,
int *iifield,
int *builtIn,
union anyVrml **value,
const char **cname);
774void *addDeleteRoute0(
void *fwn,
const char* callingFunc,
struct X3D_Node* fromNode,
const char *sfromField,
struct X3D_Node* toNode,
const char *stoField){
776 int fromType,toType,fromKind,toKind,fromField,toField,fromBuiltIn,toBuiltIn;
777 const char *fromCname,*toCname;
778 int i, len, fromOfs, toOfs;
779 union anyVrml *fromValue, *toValue;
781 getFieldFromNodeAndNameC(fromNode,sfromField,&fromType,&fromKind,&fromField,&fromBuiltIn,&fromValue,&fromCname);
782 getFieldFromNodeAndNameC(toNode,stoField,&toType,&toKind,&toField,&toBuiltIn,&toValue,&toCname);
785 if (fromType != toType) {
786 printf (
"Javascript routing problem - can not route from %s to %s\n",
787 stringNodeType(fromNode->_nodeType),
788 stringNodeType(toNode->_nodeType));
792 len = returnRoutingElementLength(toType);
796 if(!ec) ec = (
struct X3D_Proto*)fromNode->_executionContext;
797 if(!strcmp(callingFunc,
"addRoute")){
798 broute = createNewBrotoRoute();
799 broute->from.node = fromNode;
800 broute->from.ifield = fromField;
801 broute->from.builtIn = fromBuiltIn;
803 broute->from.ftype = fromType;
804 broute->to.node = toNode;
805 broute->to.ifield = toField;
806 broute->to.builtIn = toBuiltIn;
808 broute->to.ftype = toType;
809 broute->lastCommand = 1;
810 CRoutes_RegisterSimpleB(broute->from.node,broute->from.ifield,broute->from.builtIn,broute->to.node,broute->to.ifield,broute->to.builtIn,broute->ft);
811 broute->ft = fromType == toType ? fromType : -1;
814 stack_push(
struct brotoRoute *, ec->__ROUTES, broute);
815 retval = (
void*)broute;
819 for(i=0;i<vectorSize(ec->__ROUTES);i++){
820 broute = vector_get(
struct brotoRoute*,ec->__ROUTES,i);
821 if(broute->from.node == fromNode && broute->from.ifield == fromField
822 && broute->to.node == toNode && broute->to.ifield == toField){
823 if(broute->lastCommand == 1)
824 CRoutes_RemoveSimpleB(broute->from.node,broute->from.ifield,broute->from.builtIn,broute->to.node,broute->to.ifield,broute->to.builtIn,broute->ft);
825 broute->lastCommand = 0;
826 vector_remove_elem(
struct brotoRoute*,ec->__ROUTES,i);
838void * addDeleteRoute(
void *fwn,
char* callingFunc,
int argc, FWval fwpars, FWval fwretval){
841 const char *fromField, *toField;
848 fromNode = fwpars[0]._web3dval.anyvrml->sfnode;
849 toNode = fwpars[2]._web3dval.anyvrml->sfnode;
851 fromField = fwpars[1]._string;
852 toField = fwpars[3]._string;
854 retval = addDeleteRoute0(fwn,callingFunc,fromNode, fromField, toNode, toField);
857int X3DExecutionContext_deleteRoute(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
862 const char *fromField, *toField;
863 int fromIfield, toIfield, fromBuiltIn, toBuiltIn;
867 if(fwpars[0].itype !=
'P')
return nr;
871 fromNode = broute->from.node;
872 fromIfield = broute->from.ifield;
873 fromBuiltIn = broute->from.builtIn;
874 toNode = broute->to.node;
875 toIfield = broute->to.ifield;
876 toBuiltIn = broute->to.builtIn;
878 getFieldFromNodeAndIndexSource(fromNode,fromIfield,fromBuiltIn,&fromField,&
ftype,&kind,&value);
879 getFieldFromNodeAndIndexSource(toNode,toIfield,toBuiltIn,&toField,&
ftype,&kind,&value);
880 xroute = addDeleteRoute0(fwn,
"deleteRoute",fromNode, fromField, toNode, toField);
884int VRBrowserAddRoute(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
887 xroute = addDeleteRoute(fwn,
"addRoute",argc,fwpars,fwretval);
889 fwretval->_web3dval.fieldType = AUXTYPE_X3DRoute;
890 fwretval->_web3dval.native = xroute;
891 fwretval->_web3dval.gc = 0;
892 fwretval->itype =
'P';
897int VRBrowserDeleteRoute(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
900 xroute = addDeleteRoute(fwn,
"deleteRoute",argc,fwpars,fwretval);
903int VRBrowserPrint(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
905 const char *_costr = NULL;
906 if(fwpars[0].itype ==
'S'){
907 _costr = fwpars[0]._string;
909 ConsoleMessage(
"%s",_costr);
913int VRBrowserPrintln(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval)
915 const char *_costr = NULL;
916 if(fwpars[0].itype ==
'S'){
917 _costr = fwpars[0]._string;
919 ConsoleMessage(
"%s\n",_costr);
925 {
"getName", VRBrowserGetName,
'S',{0,0,0,NULL}},
926 {
"getVersion", VRBrowserGetVersion,
'S',{0,0,0,NULL}},
927 {
"getCurrentSpeed", VRBrowserGetCurrentSpeed,
'S',{0,0,0,NULL}},
928 {
"getCurrentFrameRate", VRBrowserGetCurrentFrameRate,
'S',{0,0,0,NULL}},
929 {
"getWorldURL", VRBrowserGetWorldURL,
'S',{0,0,0,NULL}},
930 {
"replaceWorld", VRBrowserReplaceWorld,
'0',{1,-1,0,
"Z"}},
931 {
"loadURL", VRBrowserLoadURL,
'0',{2,1,
'T',
"FF"}},
932 {
"setDescription", VRBrowserSetDescription,
'0',{1,-1,0,
"S"}},
933 {
"createVrmlFromString", VRBrowserCreateVrmlFromString,
'W',{1,-1,0,
"S"}},
934 {
"createVrmlFromURL", VRBrowserCreateVrmlFromURL,
'0',{3,3,0,
"WWS"}},
935 {
"createX3DFromString", VRBrowserCreateX3DFromString,
'W',{1,-1,0,
"S"}},
936 {
"createX3DFromURL", VRBrowserCreateVrmlFromURL,
'0',{3,3,0,
"WWS"}},
937 {
"addRoute", VRBrowserAddRoute,
'P',{4,-1,0,
"WSWS"}},
938 {
"deleteRoute", VRBrowserDeleteRoute,
'0',{4,-1,0,
"WSWS"}},
939 {
"print", VRBrowserPrint,
'0',{1,-1,0,
"S"}},
940 {
"println", VRBrowserPrintln,
'0',{1,-1,0,
"S"}},
960 {
"name", 0,
'S',
'T'},
961 {
"version", 1,
'S',
'T'},
962 {
"currentSpeed", 2,
'D',
'T'},
963 {
"currentFrameRate", 3,
'D',
'T'},
964 {
"description", 4,
'S', 0},
965 {
"supportedComponents", 5,
'P',
'T'},
966 {
"supportedProfiles", 6,
'P',
'T'},
967 {
"currentScene", 7,
'P',
'T'},
974 const int *profileTable;
978const int * getCapabilitiesTable();
979int BrowserGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
984 fwretval->_string = BrowserName;
985 fwretval->itype =
'S';
988 fwretval->_string = libFreeWRL_get_version();
989 fwretval->itype =
'S';
992 fwretval->_numeric = gglobal()->Mainloop.BrowserSpeed;
993 fwretval->itype =
'D';
996 fwretval->_numeric = gglobal()->Mainloop.BrowserFPS;
997 fwretval->itype =
'D';
1000 fwretval->_string = gglobal()->Mainloop.BrowserDescription;
1001 fwretval->itype =
'S';
1004 fwretval->_pointer.fieldType = AUXTYPE_ComponentInfoArray;
1005 fwretval->_pointer.native = (
void*)getCapabilitiesTable();
1006 fwretval->_pointer.gc = 0;
1007 fwretval->itype =
'P';
1010 fwretval->_pointer.fieldType = AUXTYPE_ProfileInfoArray;
1011 fwretval->_pointer.native = (
void*)getProfTable();
1012 fwretval->_pointer.gc = 0;
1013 fwretval->itype =
'P';
1016 fwretval->_web3dval.fieldType = AUXTYPE_X3DExecutionContext;
1017 fwretval->_web3dval.native = (
void *)(
struct X3D_Node*)ec;
1018 fwretval->_web3dval.gc = 0;
1020 fwretval->itype =
'P';
1027int BrowserSetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwval){
1030 gglobal()->Mainloop.BrowserDescription = fwval->_string;
1039struct FWTYPE BrowserType = {
1070int capabilitiesHandler_getTableLength(
int* table);
1071int capabilitiesHandler_getComponentLevel(
int *table,
int comp);
1072int capabilitiesHandler_getProfileLevel(
int prof);
1073const int *capabilitiesHandler_getProfileComponent(
int prof);
1074const int *capabilitiesHandler_getCapabilitiesTable();
1088int *intdup(
int value){
1089 int* p = malloc(
sizeof(
int));
1090 memcpy(p,&value,
sizeof(
int));
1093int ComponentInfoArrayGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1096 _table = (
int *)fwn;
1101 int _length = capabilitiesHandler_getTableLength(_table);
1103 fwretval->itype =
'I';
1104 fwretval->_integer = _length;
1106 }
else if(index > -1 && index < COMPONENTS_COUNT ){
1107 fwretval->_pointer.native = &_table[2*index];
1108 fwretval->_pointer.fieldType = AUXTYPE_ComponentInfo;
1109 fwretval->_pointer.gc = 0;
1110 fwretval->itype =
'P';
1117 {
"length", -1,
'I',
'T'},
1121struct FWTYPE ComponentInfoArrayType = {
1122 AUXTYPE_ComponentInfoArray,
1124 "ComponentInfoArray",
1128 ComponentInfoArrayProperties,
1130 ComponentInfoArrayGetter,
1137 {
"name", 0,
'S',
'T'},
1138 {
"title", 1,
'S',
'T'},
1139 {
"level", 2,
'I',
'T'},
1140 {
"providerUrl", 3,
'S',
'T'},
1145int ComponentInfoGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1146 int nr, *tableEntry, nameIndex;
1147 tableEntry = (
int *)fwn;
1153 nameIndex = tableEntry[0];
1154 fwretval->_string = COMPONENTS[nameIndex];
1155 fwretval->itype =
'S';
1158 fwretval->_integer = tableEntry[1];
1159 fwretval->itype =
'I';
1162 fwretval->_string =
"freewrl.sourceforge.net";
1163 fwretval->itype =
'S';
1172struct FWTYPE ComponentInfoType = {
1173 AUXTYPE_ComponentInfo,
1179 ComponentInfoProperties,
1181 ComponentInfoGetter,
1195int ProfileInfoArrayGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1203 fwretval->_integer = PROFILES_COUNT;
1204 fwretval->itype =
'I';
1205 }
else if(index > -1 && index < PROFILES_COUNT ){
1206 fwretval->_pointer.native = &_table[index];
1207 fwretval->_pointer.fieldType = AUXTYPE_ProfileInfo;
1208 fwretval->_pointer.gc = 0;
1209 fwretval->itype =
'P';
1216 {
"length", -1,
'I',
'T'},
1220struct FWTYPE ProfileInfoArrayType = {
1221 AUXTYPE_ProfileInfoArray,
1227 ProfileInfoArrayProperties,
1229 ProfileInfoArrayGetter,
1245 {
"name", 0,
'S',
'T'},
1246 {
"Title", 1,
'I',
'T'},
1247 {
"level", 2,
'S',
'T'},
1248 {
"providerUrl", 3,
'S',
'T'},
1249 {
"components", 4,
'P',
'T'},
1254int ProfileInfoGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1263 nameIndex = tableEntry->profileName;
1264 fwretval->_string = stringProfileType(nameIndex);
1265 fwretval->itype =
'S';
1268 fwretval->_integer = tableEntry->level;
1269 fwretval->itype =
'I';
1272 fwretval->_string =
"freewrl.sourceforge.net";
1273 fwretval->itype =
'S';
1276 fwretval->_pointer.native = (
void *)tableEntry->profileTable;
1277 fwretval->_pointer.fieldType = AUXTYPE_ComponentInfoArray;
1278 fwretval->_pointer.gc = 0;
1279 fwretval->itype =
'P';
1288struct FWTYPE ProfileInfoType = {
1289 AUXTYPE_ProfileInfo,
1295 ProfileInfoProperties,
1306struct X3D_Node *broto_search_DEFname(
struct X3D_Proto *context,
const char *name);
1307struct X3D_Node * broto_search_ALLnames(
struct X3D_Proto *context,
const char *name,
int *source);
1308int X3DExecutionContext_getNamedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1313 node = broto_search_DEFname(ec, fwpars[0]._string);
1317 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
1318 fwretval->_web3dval.anyvrml->sfnode = node;
1319 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
1320 fwretval->_web3dval.gc = 1;
1321 fwretval->itype =
'W';
1327int X3DExecutionContext_updateNamedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1334 const char *defname;
1335 defname = fwpars[0]._string;
1336 node = X3D_NODE(fwpars[1]._web3dval.native);
1337 if(_ec->__DEFnames){
1338 struct Vector* defnames = (
struct Vector*)_ec->__DEFnames;
1339 for(i=0;i<vectorSize(defnames);i++){
1343 if(!strcmp(bd->name,defname)){
1348 if(bd->node == node){
1349 bd->name = strdup(defname);
1357 if(!_ec->__DEFnames)
1362 bd2.name = strdup(defname);
1367void remove_node_from_parents_children(
struct X3D_Node* node) {
1368 for (
int i = 0; i < vectorSize(node->_parentVector); i++) {
1369 struct X3D_Node* pnode = vector_get(
struct X3D_Node*, node->_parentVector, i);
1370 int type, kind, iifield;
1371 union anyVrml* value, *valuer;
1372 int kids = getFieldFromNodeAndName(pnode,
"children", &type, &kind, &iifield, &value);
1373 if(!kids) kids = getFieldFromNodeAndName(pnode,
"__children", &type, &kind, &iifield, &value);
1381 for (
int j = 0; j < value->mfnode.n; j++) {
1382 if (value->mfnode.p[j] == node) {
1384 remove_parent(node, pnode);
1389 value->mfnode.p[n] = value->mfnode.p[j];
1393 value->mfnode.n = n;
1399int X3DExecutionContext_removeNamedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1405 const char *defname;
1406 defname = fwpars[0]._string;
1407 if(_ec->__DEFnames){
1409 for(i=0;i<vectorSize(_ec->__DEFnames);i++){
1410 bd = vector_get_ptr(
struct brotoDefpair,_ec->__DEFnames,i);
1411 if(!strcmp(bd->name,defname)){
1416 vector_remove_elem(
struct brotoDefpair,_ec->__DEFnames,i);
1418 remove_node_from_parents_children(node);
1419 remove_broto_node(_ec,node);
1428int X3DExecutionContext_createProto(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1436 if( isAvailableBroto(fwpars[0]._string, ec, &proto))
1439 node=X3D_NODE(brotoInstance(proto,1));
1440 node->_executionContext = X3D_NODE(ec);
1441 add_node_to_broto_context(ec,node);
1445 source = X3D_PROTO(X3D_PROTO(node)->__prototype);
1446 dest = X3D_PROTO(node);
1447 deep_copy_broto_body2(&source,&dest);
1451 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
1452 fwretval->_web3dval.anyvrml->sfnode = node;
1453 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
1454 fwretval->_web3dval.gc = 1;
1455 fwretval->itype =
'W';
1461int X3DExecutionContext_getImportedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1472 node = broto_search_ALLnames(ec, fwpars[0]._string,&source);
1473 if(source == 0) node = NULL;
1476 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
1477 fwretval->_web3dval.anyvrml->sfnode = node;
1478 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
1479 fwretval->_web3dval.gc = 1;
1480 fwretval->itype =
'W';
1486void update_weakRoutes(
struct X3D_Proto *context);
1487int X3DExecutionContext_updateImportedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1500 const char* as, * mxname, * impname;
1505 as = fwpars[0]._string;
1506 mxname = fwpars[1]._string;
1507 impname = strdup(mxname);
1509 const char* dot = strstr(mxname,
".");
1511 nline = strdup(mxname);
1512 nline[dot - mxname] = 0;
1513 impname = strdup(&dot[1]);
1515 printf(
"as [%s] impname [%s] nline [%s]\n", as, impname, nline);
1516 node = X3D_NODE(fwpars[1]._web3dval.native);
1518 for(i=0;i<vectorSize(_ec->__IMPORTS);i++){
1519 mxp = vector_get(
struct IMEXPORT *,_ec->__IMPORTS,i);
1522 int inlineOK = !nline || !strcmp(nline, mxp->inlinename);
1523 int asOK = !strcmp(as, mxp->as);
1524 int impOK = !strcmp(impname, mxp->mxname);
1525 if (inlineOK && impOK) {
1527 printf(
"updating import new as [%s] old import [%s] inline [%s]\n", as, impname, nline);
1528 mxp->as = strdup(as);
1537 _ec->__IMPORTS = newVector(
struct IMEXPORT *,4);
1539 mxp->mxname = strdup(impname);
1540 mxp->as = strdup(as);
1541 mxp->inlinename = nline ? strdup(nline) : NULL;
1542 printf(
"adding import mapping as [%s] import [%s] inline [%s]\n", impname, as, nline);
1543 stack_push(
struct IMEXPORT *,_ec->__IMPORTS,mxp);
1545 update_weakRoutes(_ec);
1550int X3DExecutionContext_removeImportedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1556 const char *defname;
1557 defname = fwpars[0]._string;
1560 for(i=0;i<vectorSize(_ec->__IMPORTS);i++){
1561 mxp = vector_get(
struct IMEXPORT *,_ec->__IMPORTS,i);
1562 if(!strcmp(mxp->as,defname)){
1564 vector_remove_elem(
struct IMEXPORT *,_ec->__IMPORTS,i);
1565 update_weakRoutes(_ec);
1574int X3DScene_getExportedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1580 mxp = broto_search_EXPORTname(ec, fwpars[0]._string);
1582 node = mxp->nodeptr;
1586 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
1587 fwretval->_web3dval.anyvrml->sfnode = node;
1588 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
1589 fwretval->_web3dval.gc = 1;
1590 fwretval->itype =
'W';
1596int X3DScene_updateExportedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1602 const char *defname;
1606 defname = fwpars[0]._string;
1607 node = X3D_NODE(fwpars[1]._web3dval.anyvrml->sfnode);
1609 for(i=0;i<vectorSize(_ec->__EXPORTS);i++){
1610 mxp = vector_get(
struct IMEXPORT *,_ec->__EXPORTS,i);
1613 if(!strcmp(mxp->as,defname)){
1614 mxp->nodeptr = node;
1618 if(mxp->nodeptr == node){
1619 mxp->as = strdup(defname);
1628 _ec->__EXPORTS = newVector(
struct IMEXPORT *,4);
1630 mxp->nodeptr = node;
1631 mxp->mxname = strdup(defname);
1632 mxp->as = mxp->mxname;
1633 stack_push(
struct IMEXPORT *,_ec->__EXPORTS,mxp);
1635 if(_ec->_executionContext){
1638 update_weakRoutes(X3D_PROTO(_ec->_executionContext));
1643int X3DScene_removeExportedNode(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1649 const char *defname;
1650 defname = fwpars[0]._string;
1653 for(i=0;i<vectorSize(_ec->__EXPORTS);i++){
1654 mxp = vector_get(
struct IMEXPORT *,_ec->__EXPORTS,i);
1655 if(!strcmp(mxp->as,defname)){
1657 vector_remove_elem(
struct IMEXPORT *,_ec->__EXPORTS,i);
1662 if(_ec->_executionContext){
1665 update_weakRoutes(X3D_PROTO(_ec->_executionContext));
1669int X3DExecutionContext_toString(FWType fwtype,
void* ec,
void* fwn,
int argc, FWval fwpars, FWval fwretval) {
1676 sprintf(str,
"%p", (
void*)ecc);
1677 value = strdup(str);
1680 fwretval->_string = value;
1681 fwretval->itype =
'S';
1687int X3DScene_setMetaData(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1689 const char *name, *content;
1690 name = fwpars[0]._string;
1691 content = fwpars[1]._string;
1695 _ec->__META = newVector(
struct metarecord, 10);
1700 for (
int i = 0; i < vectorSize(metalist); i++) {
1701 mr = vector_get_ptr(
struct metarecord, metalist, i);
1702 if (!strcmp(mr->name, name)) {
1703 mr->content = strdup(content);
1711 mr2.name = strdup(name);
1712 mr2.content = strdup(content);
1713 vector_pushBack(
struct metarecord, metalist, mr2);
1717int X3DScene_getMetaData(FWType fwtype,
void *ec,
void *fwn,
int argc, FWval fwpars, FWval fwretval){
1722 name = fwpars[0]._string;
1728 for (
int i = 0; i < vectorSize(metalist); i++) {
1729 mr = vector_get_ptr(
struct metarecord, metalist, i);
1730 if (!strcmp(mr->name, name)) {
1731 content = strdup(mr->content);
1737 fwretval->_string = content;
1738 fwretval->itype =
'S';
1746 {
"addRoute", VRBrowserAddRoute,
'P',{4,-1,0,
"WSWS"}},
1747 {
"deleteRoute", X3DExecutionContext_deleteRoute,
'0',{1,-1,0,
"P"}},
1748 {
"createNode", VRBrowserCreateNodeFromString,
'W',{1,-1,0,
"S"}},
1749 {
"createProto", X3DExecutionContext_createProto,
'W',{1,-1,0,
"S"}},
1750 {
"getImportedNode", X3DExecutionContext_getImportedNode,
'W',{1,-1,0,
"S"}},
1751 {
"updateImportedNode", X3DExecutionContext_updateImportedNode,
'0',{2,-1,0,
"SS"}},
1752 {
"removeImportedNode", X3DExecutionContext_removeImportedNode,
'0',{1,-1,0,
"S"}},
1753 {
"getNamedNode", X3DExecutionContext_getNamedNode,
'W',{1,-1,0,
"S"}},
1754 {
"updateNamedNode", X3DExecutionContext_updateNamedNode,
'0',{2,-1,0,
"SW"}},
1755 {
"removeNamedNode", X3DExecutionContext_removeNamedNode,
'0',{1,-1,0,
"S"}},
1756 {
"toString",X3DExecutionContext_toString,
'S',{0,0,0,NULL}},
1758 {
"setMetaData", X3DScene_setMetaData,
'0',{2,-1,0,
"SS"}},
1759 {
"getMetaData", X3DScene_getMetaData,
'S',{1,-1,0,
"S"}},
1760 {
"getExportedNode", X3DScene_getExportedNode,
'W',{1,-1,0,
"S"}},
1761 {
"updateExportedNode", X3DScene_updateExportedNode,
'0',{2,-1,0,
"SW"}},
1762 {
"removeExportedNode", X3DScene_removeExportedNode,
'0',{1,-1,0,
"S"}},
1770 {
"specificationVersion", 0,
'S',
'T'},
1771 {
"encoding", 1,
'S',
'T'},
1772 {
"profile", 2,
'P',
'T'},
1773 {
"components", 3,
'P',
'T'},
1774 {
"worldURL", 4,
'S',
'T'},
1775 {
"rootNodes", 5,
'W',
'T'},
1776 {
"protos", 6,
'P',
'T'},
1777 {
"externprotos", 7,
'P',
'T'},
1778 {
"routes", 8,
'P',
'T'},
1780 {
"isScene", 9,
'B',
'T'},
1783static int _TRUE = TRUE;
1784static int _FALSE = FALSE;
1785int X3DExecutionContextGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1795 if(ecc->__loadResource || ecc->_parentResource){
1797 specver = ecc->__specversion;
1798 sprintf(str,
"{%d.%d.%d}",specver/100,(specver/10)%10,specver % 10);
1800 fwretval->_string = strdup(str);
1801 fwretval->itype =
'S';
1807 fwretval->_string =
"not filled in yet sb. VRML or XML or ..";
1808 fwretval->itype =
'S';
1814 int index = gglobal()->Mainloop.scene_profile;
1815 profile = getProfTable();
1816 fwretval->_pointer.native = &profile[index];
1817 fwretval->_pointer.fieldType = AUXTYPE_ProfileInfo;
1818 fwretval->_pointer.gc = 0;
1819 fwretval->itype =
'P';
1823 fwretval->_pointer.native = (
void *)gglobal()->Mainloop.scene_components;
1824 fwretval->_pointer.fieldType = AUXTYPE_ComponentInfoArray;
1825 fwretval->_pointer.gc = 0;
1826 fwretval->itype =
'P';
1829 fwretval->_string = gglobal()->Mainloop.url;
1830 fwretval->itype =
'S';
1833 fwretval->_web3dval.native = (
void *)&ecc->__children;
1834 fwretval->_web3dval.fieldType = FIELDTYPE_MFNode;
1835 fwretval->_web3dval.gc = 0;
1836 fwretval->itype =
'W';
1839 fwretval->_pointer.fieldType = AUXTYPE_X3DProtoArray;
1840 fwretval->_pointer.native = (
void*)ecc->__protoDeclares;
1841 fwretval->_pointer.gc = 0;
1842 fwretval->itype =
'P';
1845 fwretval->_pointer.fieldType = AUXTYPE_X3DExternProtoArray;
1846 fwretval->_pointer.native = (
void*)ecc->__externProtoDeclares;
1847 fwretval->_pointer.gc = 0;
1848 fwretval->itype =
'P';
1851 fwretval->_pointer.fieldType = AUXTYPE_X3DRouteArray;
1852 fwretval->_pointer.native = (
void*)ecc->__ROUTES;
1853 fwretval->_pointer.gc = 0;
1854 fwretval->itype =
'P';
1858 fwretval->itype =
'B';
1860 unsigned char flag = ciflag_get(ecc->__protoFlags,2);
1862 fwretval->_boolean = TRUE;
1864 fwretval->_boolean = FALSE;
1873struct FWTYPE X3DExecutionContextType = {
1874 AUXTYPE_X3DExecutionContext,
1876 "X3DExecutionContext",
1880 X3DExecutionContextProperties,
1882 X3DExecutionContextGetter,
1885 X3DExecutionContextFunctions,
1889int getCRouteCount();
1890int *getCRouteCounter();
1891int X3DRouteArrayGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1897 _length = vectorSize(fwn);
1898 fwretval->_integer = _length;
1899 fwretval->itype =
'I';
1901 }
else if(index > -1 ){
1902 if(index < vectorSize(fwn)){
1903 fwretval->_pointer.native = vector_get(
void *, fwn, index);
1904 fwretval->_pointer.gc = 0;
1905 fwretval->_pointer.fieldType = AUXTYPE_X3DRoute;
1906 fwretval->itype =
'P';
1915 {
"length", -1,
'I',
'T'},
1919struct FWTYPE X3DRouteArrayType = {
1920 AUXTYPE_X3DRouteArray,
1926 X3DRouteArrayProperties,
1928 X3DRouteArrayGetter,
1941int X3DRouteToString(FWType fwtype,
void* ec,
void* fwn,
int argc, FWval fwpars, FWval fwretval) {
1952 char* fromName = lookup_brotoDefname(ecc, route->from.node);
1953 char* toName = lookup_brotoDefname(ecc, route->from.node);
1954 char* fromfield = findFIELDNAMESfromNodeOffset0(route->from.node, route->from.ifield);
1955 char* tofield = findFIELDNAMESfromNodeOffset0(route->to.node, route->to.ifield);
1957 sprintf(str,
"[ROUTE %s.%s TO %s.%s]", fromName, fromfield, toName, tofield);
1958 value = strdup(str);
1961 fwretval->_string = value;
1962 fwretval->itype =
'S';
1969 {
"toString", X3DRouteToString,
'S',{0,0,0,NULL}},
1974 {
"sourceNode", 0,
'W',
'T'},
1975 {
"sourceField", 1,
'S',
'T'},
1976 {
"destinationNode", 2,
'W',
'T'},
1977 {
"destinationField", 3,
'S',
'T'},
1980int X3DRouteGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
1983 const char *fieldname;
1984 struct X3D_Node *fromNode, *toNode;
1985 int fromIndex, toIndex, fromBuiltIn, toBuiltIn;
1989 fromNode = broute->from.node;
1990 fromIndex = broute->from.ifield;
1991 fromBuiltIn = broute->from.builtIn;
1992 toNode = broute->to.node;
1993 toIndex = broute->to.ifield;
1994 toBuiltIn = broute->to.builtIn;
1996 if(!fromNode || !toNode)
return 0;
2003 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
2004 fwretval->_web3dval.anyvrml->sfnode = fromNode;
2005 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
2006 fwretval->_web3dval.gc = 1;
2007 fwretval->itype =
'W';
2011 getFieldFromNodeAndIndexSource(fromNode,fromIndex,fromBuiltIn,&fieldname,&type,&kind,&value);
2012 fwretval->_string = fieldname;
2013 fwretval->itype =
'S';
2017 fwretval->_web3dval.anyvrml = malloc(
sizeof(
union anyVrml));
2018 fwretval->_web3dval.anyvrml->sfnode = toNode;
2019 fwretval->_web3dval.fieldType = FIELDTYPE_SFNode;
2020 fwretval->itype =
'W';
2021 fwretval->_web3dval.gc = 1;
2025 getFieldFromNodeAndIndexSource(toNode,toIndex,toBuiltIn,&fieldname,&type,&kind,&value);
2026 fwretval->_string = fieldname;
2027 fwretval->itype =
'S';
2036struct FWTYPE X3DRouteType = {
2053int X3DProtoArrayGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
2056 Stack* parray = (Stack*)fwn;
2060 _length = vectorSize(parray);
2061 fwretval->_integer = _length;
2062 fwretval->itype =
'I';
2064 }
else if(index > -1 ){
2065 if(index < vectorSize(fwn)){
2066 fwretval->_pointer.native = (
void*)vector_get(
struct X3D_Proto *, parray, index);
2067 fwretval->_pointer.gc = 0;
2068 fwretval->_pointer.fieldType = AUXTYPE_X3DProto;
2069 fwretval->itype =
'P';
2078 {
"length", -1,
'I',
'T'},
2082struct FWTYPE X3DProtoArrayType = {
2083 AUXTYPE_X3DProtoArray,
2089 X3DProtoArrayProperties,
2091 X3DProtoArrayGetter,
2097struct FWTYPE X3DExternProtoArrayType = {
2098 AUXTYPE_X3DExternProtoArray,
2100 "X3DExternProtoArray",
2104 X3DProtoArrayProperties,
2106 X3DProtoArrayGetter,
2113struct tuplePointerInt {
2119 {
"name", 0,
'S',
'T'},
2120 {
"fields", 1,
'W',
'T'},
2121 {
"isExternProto", 2,
'B',
'T'},
2124int X3DProtoGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
2130 fwretval->_string = strdup(pd->protoName);
2131 fwretval->itype =
'S';
2132 fwretval->_web3dval.gc = 0;
2136 fwretval->_web3dval.native = pd->iface;
2137 fwretval->_web3dval.fieldType = AUXTYPE_X3DFieldDefinitionArray;
2138 fwretval->itype =
'W';
2139 fwretval->_web3dval.gc = 0;
2143 fwretval->itype =
'B';
2144 fwretval->_web3dval.gc = 0;
2146 unsigned char flag = ciflag_get(X3D_PROTO(fwn)->__protoFlags,3);
2148 fwretval->_boolean = TRUE;
2150 fwretval->_boolean = FALSE;
2161struct FWTYPE X3DProtoType = {
2164 "X3DProtoDeclaration",
2175struct FWTYPE X3DExternProtoType = {
2176 AUXTYPE_X3DExternProto,
2178 "X3DExternProtoDeclaration",
2190int count_fields(
struct X3D_Node* node);
2191int X3DFieldDefinitionArrayGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
2195 Stack* iface = (Stack*)fwn;
2200 _length = vectorSize(iface);
2201 fwretval->_integer = _length;
2202 fwretval->itype =
'I';
2204 }
else if(index > -1 ){
2205 if(index < vectorSize(fwn)){
2210 fwretval->_pointer.native = pfield;
2211 fwretval->_pointer.gc = 0;
2212 fwretval->_pointer.fieldType = AUXTYPE_X3DFieldDefinition;
2213 fwretval->itype =
'P';
2222 {
"length", -1,
'I',
'T'},
2226struct FWTYPE X3DFieldDefinitionArrayType = {
2227 AUXTYPE_X3DFieldDefinitionArray,
2229 "X3DFieldDefinitionArray",
2233 X3DFieldDefinitionArrayProperties,
2235 X3DFieldDefinitionArrayGetter,
2242 {
"name", 0,
'S',
'T'},
2243 {
"accessType", 1,
'I',
'T'},
2244 {
"dataType", 2,
'I',
'T'},
2247int X3DFieldDefinitionGetter(FWType fwt,
int index,
void *ec,
void *fwn, FWval fwretval){
2248 int ifield, type,kind, konstindex, nr = 0;
2249 struct string_int * si;
2265 fwretval->_string = pfield->cname;
2266 fwretval->itype =
'S';
2271 fwretval->_integer = pfield->mode;
2272 fwretval->itype =
'I';
2277 fwretval->_integer = pfield->type;
2278 fwretval->itype =
'I';
2289struct FWTYPE X3DFieldDefinitionType = {
2290 AUXTYPE_X3DFieldDefinition,
2292 "X3DFieldDefinition",
2296 X3DFieldDefinitionProperties,
2298 X3DFieldDefinitionGetter,
2307extern struct FWTYPE X3DMatrix3Type;
2308extern struct FWTYPE X3DMatrix4Type;
2310void initVRMLBrowser(FWType* typeArray,
int *n){
2311 typeArray[*n] = &X3DRouteType; (*n)++;
2312 typeArray[*n] = &X3DRouteArrayType; (*n)++;
2313 typeArray[*n] = &X3DExecutionContextType; (*n)++;
2314 typeArray[*n] = &ProfileInfoType; (*n)++;
2315 typeArray[*n] = &ProfileInfoArrayType; (*n)++;
2316 typeArray[*n] = &ComponentInfoType; (*n)++;
2317 typeArray[*n] = &ComponentInfoArrayType; (*n)++;
2318 typeArray[*n] = &BrowserType; (*n)++;
2319 typeArray[*n] = &X3DConstantsType; (*n)++;
2321 typeArray[*n] = &X3DProtoType; (*n)++;
2322 typeArray[*n] = &X3DProtoArrayType; (*n)++;
2323 typeArray[*n] = &X3DExternProtoType; (*n)++;
2324 typeArray[*n] = &X3DExternProtoArrayType; (*n)++;
2325 typeArray[*n] = &X3DFieldDefinitionType; (*n)++;
2326 typeArray[*n] = &X3DFieldDefinitionArrayType; (*n)++;