50#define STRING_SIZE 256
54#define jsuint uint32_t
56#define jsdouble double
58#define JS_FinalizeStub NULL
59#define JS_GET_CLASS JS_GetClassFw
60JSBool JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval);
67#define JS_GET_PROPERTY_STUB JS_PropertyStub
70#define JS_SET_PROPERTY_STUB1 js_SetPropertyDebug1
73# define JS_SET_PROPERTY_STUB2 JS_StrictPropertyStub
74#define JS_SET_PROPERTY_STUB3 js_SetPropertyDebug3
83#include "scenegraph/Vector.h"
92#include "../vrml_parser/Structs.h"
104#include "../vrml_parser/CRoutes.h"
107void Parser_scanStringValueToMem_B(
union anyVrml* any, indexT ctype,
const char *value,
int isXML);
108int getJsEngineVariant();
113#include "jsVRMLBrowser_sm.h"
115#include "jsUtils_sm.h"
116#include "jsVRMLClasses_sm.h"
119#ifndef JSCLASS_GLOBAL_FLAGS
121#define JSCLASS_GLOBAL_FLAGS 0
124#ifdef JAVASCRIPTVERBOSE
125int ActualrunScript(
int num,
char *script, jsval *rval,
char *fn,
int line);
127int ActualrunScript(
int num,
char *script, jsval *rval);
131static JSClass staticGlobalClass = {
133 JSCLASS_GLOBAL_FLAGS,
135 JS_DeletePropertyStub,
137 JS_StrictPropertyStub,
157typedef struct pJScript{
160 jsval JSglobal_return_value;
165void *JScript_constructor(){
166 void *v = MALLOCV(
sizeof(
struct pJScript));
167 memset(v,0,
sizeof(
struct pJScript));
172void JScript_init(
struct iiglobal::tJScript *t){
174 t->JSglobal_return_val = NULL;
176 t->prv = JScript_constructor();
178 ppJScript p = (ppJScript)t->prv;
181 memcpy(&p->globalClass,&staticGlobalClass,
sizeof(staticGlobalClass));
182 t->JSglobal_return_val = &p->JSglobal_return_value;
183 p->current_script = NULL;
190void sm_js_cleanup_script_context(
int counter){
192 ppJScript p = (ppJScript)tg->JScript.prv;
196 cx = (JSContext *)getScriptControlIndex(counter)->cx;
197 global = (JSObject *)getScriptControlIndex(counter)->glob;
200 JSAutoRequest ar(cx);
203 JSAutoCompartment ac(cx, global);
219void sm_process_eventsProcessed() {
226 for (counter = 0; counter <= tg->CRoutes.max_script_found_and_initialized; counter++) {
227 scriptcontrol = getScriptControlIndex(counter);
228 if(scriptcontrol->thisScriptType != NOSCRIPT ){
229 JSContext *cx = (JSContext *)scriptcontrol->cx;
230 JSObject *global = (JSObject *)scriptcontrol->glob;
233 JSAutoRequest ar(cx);
236 JSAutoCompartment ac(cx, global);
237 if (scriptcontrol->eventsProcessed == NULL) {
238 scriptcontrol->eventsProcessed = (
void *)JS_CompileScript(cx,global,
"eventsProcessed()", strlen (
"eventsProcessed()"),
239 "compile eventsProcessed()", 1);
240 if (!JS_AddObjectRoot(cx,(JSObject**)(&scriptcontrol->eventsProcessed))) {
241 printf (
"can not add object root for compiled eventsProcessed() for script %d\n",counter);
244 if (!JS_ExecuteScript(cx,global,(JSScript *)scriptcontrol->eventsProcessed, &retval)) {
245 printf (
"can not run eventsProcessed() for script %d\n",counter);
256void sm_jsClearScriptControlEntries(
int num)
259 ScriptControl = getScriptControlIndex(num);
260 if (ScriptControl->eventsProcessed != NULL) {
262 if (ScriptControl->cx != NULL) {
263 JS_RemoveObjectRoot((JSContext *)ScriptControl->cx,(JSObject**)(&ScriptControl->eventsProcessed));
266 ScriptControl->eventsProcessed = NULL;
276#define MAX_RUNTIME_BYTES 0x4000000L
281#define STACK_CHUNK_SIZE 8192
283static int JSaddGlobalECMANativeProperty(
int num,
const char *name);
284static int JSaddGlobalAssignProperty(
int num,
const char *name,
const char *str);
319static char *DefaultScriptMethods =
"function initialize() {}; " \
320 " function shutdown() {}; " \
321 " function eventsProcessed() {}; " \
322 " TRUE=true; FALSE=false; " \
323 " function print(x) {Browser.print(x)}; " \
324 " function println(x) {Browser.println(x)}; " \
325 " function getName() {return Browser.getName()}; "\
326 " function getVersion() {return Browser.getVersion()}; "\
327 " function getCurrentSpeed() {return Browser.getCurrentSpeed()}; "\
328 " function getCurrentFrameRate() {return Browser.getCurrentFrameRate()}; "\
329 " function getWorldURL() {return Browser.getWorldURL()}; "\
330 " function replaceWorld(x) {Browser.replaceWorld(x)}; "\
331 " function loadURL(x,y) {Browser.loadURL(x,y)}; "\
332 " function setDescription(x) {Browser.setDescription(x)}; "\
333 " function createVrmlFromString(x) {Browser.createVrmlFromString(x)}; "\
334 " function createVrmlFromURL(x,y,z) {Browser.createVrmlFromURL(x,y,z)}; "\
335 " function createX3DFromString(x) {Browser.createX3DFromString(x)}; "\
336 " function createX3DFromURL(x,y,z) {Browser.createX3DFromURL(x,y,z)}; "\
337 " function addRoute(a,b,c,d) {Browser.addRoute(a,b,c,d)}; "\
338 " function deleteRoute(a,b,c,d) {Browser.deleteRoute(a,b,c,d)}; "\
339 " function _rename_function(obj,oldf,newf) {if(typeof obj[oldf] === 'function') {obj[newf]=obj[oldf]; delete obj[oldf];}}; "\
346 ppJScript p = (ppJScript)gglobal()->JScript.prv;
347 return p->runtime ? 1 : 0;
349void sm_JSDeleteScriptContext(
int num){
353 ScriptControl = getScriptControlIndex(num);
355 if (ScriptControl->eventsProcessed != NULL) {
356 JS_RemoveObjectRoot((JSContext *)ScriptControl->cx,(JSObject **)(&ScriptControl->eventsProcessed));
364 ppJScript p = (ppJScript)tg->JScript.prv;
366 JS_DestroyRuntime(p->runtime);
372static struct keyname {
376{JSGC_MAX_BYTES,
"JSGC_MAX_BYTES"},
377{JSGC_MAX_MALLOC_BYTES,
"JSGC_MAX_MALLOC_BYTES"},
378{JSGC_BYTES,
"JSGC_BYTES"},
379{JSGC_NUMBER,
"JSGC_NUMBER"},
380{JSGC_MAX_CODE_CACHE_BYTES,
"JSGC_MAX_CODE_CACHE_BYTES"},
381{JSGC_MODE,
"JSGC_MODE"},
382{JSGC_UNUSED_CHUNKS,
"JSGC_UNUSED_CHUNKS"},
383{JSGC_TOTAL_CHUNKS,
"JSGC_TOTAL_CHUNKS"},
384{JSGC_SLICE_TIME_BUDGET,
"JSGC_SLICE_TIME_BUDGET"},
385{JSGC_MARK_STACK_LIMIT,
"JSGC_MARK_STACK_LIMIT"},
386{JSGC_HIGH_FREQUENCY_TIME_LIMIT,
"JSGC_HIGH_FREQUENCY_TIME_LIMIT"},
387{JSGC_HIGH_FREQUENCY_LOW_LIMIT,
"JSGC_HIGH_FREQUENCY_LOW_LIMIT"},
388{JSGC_HIGH_FREQUENCY_HIGH_LIMIT,
"JSGC_HIGH_FREQUENCY_HIGH_LIMIT"},
389{JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX,
"JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX"},
390{JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN,
"JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN"},
391{JSGC_LOW_FREQUENCY_HEAP_GROWTH,
"JSGC_LOW_FREQUENCY_HEAP_GROWTH"},
392{JSGC_DYNAMIC_HEAP_GROWTH,
"JSGC_DYNAMIC_HEAP_GROWTH"},
393{JSGC_DYNAMIC_MARK_SLICE,
"JSGC_DYNAMIC_MARK_SLICE"},
394{JSGC_ANALYSIS_PURGE_TRIGGER,
"JSGC_ANALYSIS_PURGE_TRIGGER"},
398const char *getgcparamname(
int key){
400 while(gcparamname[i].name != NULL){
401 if(gcparamname[i].
key ==
key){
402 return gcparamname[i].name;
426void sm_JSCreateScriptContext(
int num) {
429 JSObject *_globalObj;
431 ppJScript p = (ppJScript)gglobal()->JScript.prv;
434 ScriptControl = getScriptControlIndex(num);
436 if (p->runtime == NULL) {
438 p->runtime = JS_NewRuntime(MAX_RUNTIME_BYTES, JS_USE_HELPER_THREADS);
439 if (!p->runtime) freewrlDie(
"JS_NewRuntime failed");
443 _context = JS_NewContext(p->runtime, STACK_CHUNK_SIZE);
444 if (!_context) freewrlDie(
"JS_NewContext failed");
447 JSContext *cx = _context;
449 JSAutoRequest ar(cx);
452 JS::RootedObject global(cx, JS_NewGlobalObject(cx, &p->globalClass,
nullptr));
456 JS::RootedValue rval(cx);
459 JSAutoCompartment ac(cx, global);
460 JS_InitStandardClasses(cx, global);
465 ScriptControl->cx = _context;
466 ScriptControl->glob = _globalObj;
469 JS_SetPrivate((JSObject*)ScriptControl->glob, ScriptControl->script);
472 if (!loadVrmlClasses(_context, _globalObj)){
473 freewrlDie(
"loadVrmlClasses failed");
475 if (!VrmlBrowserInit(_context, _globalObj, br)){
476 freewrlDie(
"VrmlBrowserInit failed");
478 if (!ActualrunScript(num,DefaultScriptMethods,rval.address()))
479 cleanupDie(num,
"runScript failed in VRML::newJS DefaultScriptMethods");
483 const char *script =
"'hello'+'world, it is '+new Date()";
484 const char *filename =
"noname";
486 bool ok = JS_EvaluateScript(cx, global, script, strlen(script), filename, lineno, rval.address());
489 JSString *str = rval.toString();
490 printf(
"%s\n", JS_EncodeString(cx, str));
497 CRoutes_js_new (num, JAVASCRIPT);
503 return getJsEngineVariant() == 2? 2 : 0;
509int ActualrunScript(
int num,
char *script, jsval *rval) {
516 ScriptControl = getScriptControlIndex(num);
518 cx = (JSContext*)ScriptControl->cx;
519 global = (JSObject*)ScriptControl->glob;
521 len = (int) strlen(script);
525 JSAutoRequest ar(cx);
528 JSAutoCompartment ac(cx, global);
529 bool ok = JS_EvaluateScript(cx, global, script, len, FNAME_STUB, LINENO_STUB, rval);
531 printf (
"ActualrunScript - JS_EvaluateScript failed for %s", script);
533 ConsoleMessage (
"ActualrunScript - JS_EvaluateScript failed for %s", script);
543int jsrrunScript(JSContext *cx, JSObject *global,
char *script, jsval *rval) {
546 #ifdef JAVASCRIPTVERBOSE
547 printf(
"jsrrunScript script cx %p \"%s\", \n",
550 len = (int) strlen(script);
553 JSAutoRequest ar(cx);
556 JSAutoCompartment ac(cx, global);
557 if (!JS_EvaluateScript(cx, global, script, len,
558 FNAME_STUB, LINENO_STUB, rval)) {
559 ConsoleMessage (
"jsrunScript - JS_EvaluateScript failed for %s", script);
570int sm_jsActualrunScript(
int num,
char *script) {
572 return ACTUALRUNSCRIPT(num,script,&rval);
580int sizeofSForMF(
int itype);
581void *AnyNativeNew(
int type,
union anyVrml* source,
int *valueChanged){
586 ptr->valueChanged = valueChanged;
590 ptr->v = (
union anyVrml *)MALLOC(
void *,sizeofSForMF(type));
591 memset(ptr->v,0,sizeofSForMF(type));
596void shallow_copy_field(
int typeIndex,
union anyVrml* source,
union anyVrml* dest);
597void AnyNativeAssign(
void *top,
void *fromp)
602 if(to->type == from->type){
604 (*to->valueChanged) ++;
607 shallow_copy_field(from->type,from->v,to->v);
612void *SFNodeNativeNew()
620 ptr->valueChanged = 0;
621 if(SM_method() == 0){
622 ptr->X3DString = NULL;
623 ptr->fieldsExpanded = FALSE;
629int SFNodeNativeAssign(
void *top,
void *fromp)
638 to->handle = from->handle;
640 to->X3DString = STRDUP(from->X3DString);
642 #ifdef JAVASCRIPTVERBOSE
643 printf (
"SFNodeNativeAssign, copied %p to %p, handle %p, string %s\n", from, to, to->handle, to->X3DString);
648 to->X3DString = STRDUP(
"from a NULL assignment");
654int SFNodeNativeEquals(
void *top,
void *fromp)
663 if(to->handle == from->handle)
670void *SFColorRGBANativeNew()
674 ptr->valueChanged = 0;
678void SFColorRGBANativeAssign(
void *top,
void *fromp)
686void *SFColorNativeNew()
690 ptr->valueChanged = 0;
694void SFColorNativeAssign(
void *top,
void *fromp)
702void *SFImageNativeNew()
706 ptr->valueChanged = 0;
710void SFImageNativeAssign(
void *top,
void *fromp)
720void *SFRotationNativeNew()
724 ptr->valueChanged = 0;
728void SFRotationNativeAssign(
void *top,
void *fromp)
736void *SFVec2fNativeNew()
740 ptr->valueChanged = 0;
744void SFVec2fNativeAssign(
void *top,
void *fromp)
752void *SFVec3fNativeNew() {
755 ptr->valueChanged = 0;
759void SFVec3fNativeAssign(
void *top,
void *fromp) {
766void *SFVec3dNativeNew() {
769 ptr->valueChanged = 0;
773void SFVec3dNativeAssign(
void *top,
void *fromp) {
780void *SFVec4fNativeNew() {
783 ptr->valueChanged = 0;
787void SFVec4fNativeAssign(
void *top,
void *fromp) {
794void *SFVec4dNativeNew() {
797 ptr->valueChanged = 0;
801void SFVec4dNativeAssign(
void *top,
void *fromp) {
811static char* re_strcat(
char *_Dest,
const char *_Source,
int *destLen,
int *destDim)
832 int srclen = (int) strlen(_Source);
833 *destLen = *destLen + srclen;
834 if(*destLen > *destDim -1)
836 *destDim = *destDim + srclen + 1 + 100;
837 _Dest = (
char *)REALLOC(_Dest,*destDim);
839 _Dest = strcat(_Dest,_Source);
852void InitScriptField(
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
854 char *smallfield = NULL;
862 int rowCount, eleCount;
871 float defaultFloat[] = {0.0f,0.0f,0.0f,0.0f};
872 int defaultInt[] = {0,0,0,0};
873 double defaultDouble[] = {0.0, 0.0, 0.0, 0.0};
875 struct X3D_Node *defaultVoid[] = {NULL,NULL};
878 #ifdef JAVASCRIPTVERBOSE
879 printf (
"calling InitScriptField from thread %u\n",pthread_self());
880 printf (
"\nInitScriptField, num %d, kind %s type %s field %s value %d\n", num,PROTOKEYWORDS[kind],FIELDTYPES[type],field,value);
883 if ((kind != PKW_inputOnly) && (kind != PKW_outputOnly) && (kind != PKW_initializeOnly) && (kind != PKW_inputOutput)) {
884 ConsoleMessage (
"InitScriptField: invalid kind for script: %d\n",kind);
888 if (type >= FIELDTYPES_COUNT) {
889 ConsoleMessage (
"InitScriptField: invalid type for script: %d\n",type);
892 ScriptControl = getScriptControlIndex(num);
899 if (kind == PKW_inputOutput) {
905 cx = (JSContext*)ScriptControl->cx;
906 obj = (JSObject*)ScriptControl->glob;
908 if (JS_GetProperty(cx,obj,field,&retval)){
910 if(retval.isObject()){
912 char runstring[STRING_SIZE];
914 sprintf(runstring,
"_rename_function(this,'%s','set_%s');",field,field);
918 JSAutoRequest ar(cx);
921 JSAutoCompartment ac(cx, obj);
922 if(!JS_EvaluateScript(cx,obj, runstring, (
int) strlen(runstring), FNAME_STUB, LINENO_STUB, &retval)){
923 printf(
"sorry couldn't rename function: %s",runstring);
929 strcpy(mynewname,field);
931 }
else strcpy(mynewname,field);
936 case FIELDTYPE_SFBool:
937 case FIELDTYPE_SFFloat:
938 case FIELDTYPE_SFTime:
939 case FIELDTYPE_SFDouble:
940 case FIELDTYPE_SFInt32:
941 case FIELDTYPE_SFString: {
943 if (kind != PKW_inputOnly) {
944 JSaddGlobalECMANativeProperty(num, field);
945 if (kind == PKW_initializeOnly || kind == PKW_inputOutput) {
946 if (type == FIELDTYPE_SFString) {
947 tlen = (int) strlen(value.sfstring->strptr) + strlen(field) + 20;
949 tlen = (int) strlen(field) + 400;
951 smallfield = MALLOC (
char *, tlen);
952 smallfield[0] =
'\0';
955 case FIELDTYPE_SFFloat: sprintf (smallfield,
"%s=%f\n",field,value.sffloat);
break;
956 case FIELDTYPE_SFTime: sprintf (smallfield,
"%s=%f\n",field,value.sftime);
break;
957 case FIELDTYPE_SFDouble: sprintf (smallfield,
"%s=%f\n",field,value.sftime);
break;
958 case FIELDTYPE_SFInt32: sprintf (smallfield,
"%s=%d\n",field,value.sfint32);
break;
959 case FIELDTYPE_SFBool:
960 if (value.sfbool == 1) sprintf (smallfield,
"%s=true",field);
961 else sprintf (smallfield,
"%s=false",field);
963 case FIELDTYPE_SFString:
964 sprintf (smallfield,
"%s=\"%s\"\n",field,value.sfstring->strptr);
break;
967 if (!ACTUALRUNSCRIPT(num,smallfield,&rval))
968 printf (
"huh??? Field initialization script failed %s\n",smallfield);
980 case FIELDTYPE_MFString:
981 case FIELDTYPE_MFTime:
982 case FIELDTYPE_MFBool:
983 case FIELDTYPE_MFInt32:
984 case FIELDTYPE_MFFloat:
985 JSaddGlobalECMANativeProperty(num, field);
986 MFhasECMAtype = TRUE;
989 MFhasECMAtype = FALSE;
999 if (kind == PKW_initializeOnly || kind == PKW_inputOutput) {
1004 case FIELDTYPE_SFNode:
1005 VoidPtr = (
struct X3D_Node **) (&(value.sfnode)); elements = 1;
1007 case FIELDTYPE_MFColor:
1008 FloatPtr = (
float *) value.mfcolor.p; elements = value.mfcolor.n;
1010 case FIELDTYPE_MFColorRGBA:
1011 FloatPtr = (
float *) value.mfcolorrgba.p; elements = value.mfcolorrgba.n;
1013 case FIELDTYPE_MFVec2f:
1014 FloatPtr = (
float *) value.mfvec2f.p; elements = value.mfvec2f.n;
1016 case FIELDTYPE_MFVec3f:
1017 FloatPtr = (
float *) value.mfvec3f.p; elements = value.mfvec3f.n;
1019 case FIELDTYPE_MFRotation:
1020 FloatPtr = (
float *) value.mfrotation.p; elements = value.mfrotation.n;
1022 case FIELDTYPE_SFVec2f:
1023 FloatPtr = (
float *) value.sfvec2f.c; elements = 1;
1025 case FIELDTYPE_SFColor:
1026 FloatPtr = value.sfcolor.c; elements = 1;
1028 case FIELDTYPE_SFColorRGBA:
1029 FloatPtr = value.sfcolorrgba.c; elements = 1;
1031 case FIELDTYPE_SFRotation:
1032 FloatPtr = value.sfrotation.c; elements = 1;
1034 case FIELDTYPE_SFVec3f:
1035 FloatPtr = value.sfvec3f.c; elements =1;
1037 case FIELDTYPE_SFVec3d:
1038 DoublePtr = value.sfvec3d.c; elements =1;
1040 case FIELDTYPE_MFString:
1041 SVPtr = value.mfstring.p; elements = value.mfstring.n;
1043 case FIELDTYPE_MFTime:
1044 DoublePtr = value.mftime.p; elements = value.mftime.n;
1046 case FIELDTYPE_MFBool:
1047 IntPtr = value.mfbool.p; elements = value.mfbool.n;
1049 case FIELDTYPE_SFImage:
1050 case FIELDTYPE_MFInt32:
1051 IntPtr = value.mfint32.p; elements = value.mfint32.n;
1053 case FIELDTYPE_MFNode:
1054 VoidPtr = (
struct X3D_Node **)(value.mfnode.p); elements = value.mfnode.n;
1056 case FIELDTYPE_MFFloat:
1057 FloatPtr = value.mffloat.p; elements = value.mffloat.n;
1059 case FIELDTYPE_SFVec4f:
1060 FloatPtr = value.sfvec4f.c; elements = 1;
1062 case FIELDTYPE_SFVec4d:
1063 DoublePtr = value.sfvec4d.c; elements = 1;
1067 printf (
"unhandled type, in InitScriptField %d\n",type);
1077 case FIELDTYPE_SFNode:
1078 case FIELDTYPE_MFNode:
1079 VoidPtr = (
struct X3D_Node **) &defaultVoid;
1083 case FIELDTYPE_MFColor:
1084 case FIELDTYPE_MFColorRGBA:
1085 case FIELDTYPE_MFVec2f:
1086 case FIELDTYPE_MFVec3f:
1087 case FIELDTYPE_MFRotation:
1088 case FIELDTYPE_SFVec2f:
1089 case FIELDTYPE_SFColor:
1090 case FIELDTYPE_SFColorRGBA:
1091 case FIELDTYPE_SFRotation:
1092 case FIELDTYPE_SFVec3f:
1093 case FIELDTYPE_SFVec4f:
1094 case FIELDTYPE_MFFloat:
1095 FloatPtr = defaultFloat;
1099 case FIELDTYPE_MFBool:
1100 case FIELDTYPE_MFInt32:
1101 IntPtr = defaultInt;
1105 case FIELDTYPE_SFString:
1106 case FIELDTYPE_MFString:
1107 sptr[0] = newASCIIString(
"");
1112 case FIELDTYPE_SFImage:
1113 IntPtr = defaultInt;
1117 case FIELDTYPE_SFVec2d:
1118 case FIELDTYPE_SFVec3d:
1119 case FIELDTYPE_MFTime:
1120 case FIELDTYPE_SFTime:
1121 case FIELDTYPE_SFDouble:
1122 case FIELDTYPE_SFVec4d:
1123 DoublePtr = defaultDouble;
1127 printf (
"unhandled type, in InitScriptField part 2 %d\n",type);
1134 rows = returnElementRowSize (type);
1136 #ifdef JAVASCRIPTVERBOSE
1137 printf (
"in fieldSet, we have ElementRowSize %d and individual elements %d\n",rows,elements);
1164 int dstlen, dstdim, tdim;
1166 thisValue = MALLOC(
char *, tdim+1);
1167 dstdim = (rows+1)*(elements*15) + 100;
1169 smallfield = MALLOC (
char *, dstdim+1);
1171 if (type != convertToSFType(type)) haveMulti = TRUE;
1172 else haveMulti = FALSE;
1175 sftype = STRDUP((
char *)FIELDTYPES[convertToSFType(type)]);
1178 if (strncmp(sftype,
"SFString",8)==0) strcpy (sftype,
"String");
1182 smallfield[0] =
'\0';
1186 smallfield = re_strcat(smallfield,
"new ",&dstlen,&dstdim);
1187 smallfield = re_strcat(smallfield, (
char *)FIELDTYPES[type],&dstlen,&dstdim);
1188 smallfield = re_strcat(smallfield,
"(",&dstlen,&dstdim);
1192 for (eleCount=0; eleCount<elements; eleCount++) {
1194 if (!MFhasECMAtype) {
1195 smallfield = re_strcat(smallfield,
"new ",&dstlen,&dstdim);
1196 smallfield = re_strcat(smallfield, sftype,&dstlen,&dstdim);
1197 smallfield = re_strcat(smallfield,
"(",&dstlen,&dstdim);
1201 for (rowCount=0; rowCount<rows; rowCount++ ) {
1202 if (IntPtr != NULL) {
1203 sprintf (thisValue,
"%d",*IntPtr); IntPtr++;
1204 }
else if (FloatPtr != NULL) {
1205 sprintf (thisValue,
"%f",*FloatPtr); FloatPtr++;
1206 }
else if (DoublePtr != NULL) {
1207 sprintf (thisValue,
"%f",*DoublePtr); DoublePtr++;
1208 }
else if (SVPtr != NULL) {
1209 sptr[0] = *SVPtr; SVPtr++;
1210 if((
int)strlen(sptr[0]->strptr)+2 > tdim-1)
1212 tdim = (int) strlen(sptr[0]->strptr) + 1 + 100;
1213 thisValue = (
char *)REALLOC(thisValue,tdim);
1215 sprintf (thisValue,
"\"%s\"",sptr[0]->strptr);
1219 sprintf (thisValue,
"\"%p\"", VoidPtr[0]); VoidPtr++;
1221 smallfield = re_strcat(smallfield, thisValue,&dstlen,&dstdim);
1222 if (rowCount < (rows-1)) smallfield = re_strcat(smallfield,
",",&dstlen,&dstdim);
1225 if (!MFhasECMAtype) smallfield = re_strcat(smallfield,
")",&dstlen,&dstdim);
1226 if (eleCount < (elements-1)) smallfield = re_strcat(smallfield,
",",&dstlen,&dstdim);
1232 smallfield = re_strcat(smallfield,
")",&dstlen,&dstdim);
1235 FREE_IF_NZ (thisValue);
1238 #ifdef JAVASCRIPTVERBOSE
1239 printf (
"JScript, for non-ECMA newname %s, sending :%s:\n",mynewname,smallfield);
1242 JSaddGlobalAssignProperty (num,mynewname,smallfield);
1249 if (kind == PKW_outputOnly) {
1256 fptr = JSparamIndex (field, FIELDTYPES[type],kind);
1259 touched = get_valueChanged_flag (fptr, num);
1262 resetScriptTouchedFlag(num, fptr);
1264 ScriptControl = getScriptControlIndex(num);
1265 js_cleanup_script_context(num);
1267 FREE_IF_NZ (smallfield);
1268 FREE_IF_NZ (sftype);
1272void InitScriptFieldB(
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
1277 #ifdef JAVASCRIPTVERBOSE
1278 printf (
"calling InitScriptField from thread %u\n",pthread_self());
1279 printf (
"\nInitScriptField, num %d, kind %s type %s field %s value %d\n", num,PROTOKEYWORDS[kind],FIELDTYPES[type],field,value);
1282 if ((kind != PKW_inputOnly) && (kind != PKW_outputOnly) && (kind != PKW_initializeOnly) && (kind != PKW_inputOutput)) {
1283 ConsoleMessage (
"InitScriptField: invalid kind for script: %d\n",kind);
1287 ScriptControl = getScriptControlIndex(num);
1297 if( kind == PKW_inputOutput) {
1301 cx = (JSContext*)ScriptControl->cx;
1302 obj = (JSObject*)ScriptControl->glob;
1304 if (JS_GetProperty(cx,obj,field,&retval)){
1306 if(retval.isObject()){
1308 char runstring[STRING_SIZE];
1310 sprintf(runstring,
"_rename_function(this,'%s','set_%s');",field,field);
1314 JSAutoRequest ar(cx);
1317 JSAutoCompartment ac(cx, obj);
1318 if(!JS_EvaluateScript(cx,obj, runstring, (
int) strlen(runstring), FNAME_STUB, LINENO_STUB, &retval)){
1319 printf(
"sorry couldn't rename function: %s",runstring);
1330 JSaddGlobalECMANativeProperty(num, field);
1335static int JSaddGlobalECMANativeProperty(
int num,
const char *name) {
1338 jsval rval = INT_TO_JSVAL(0);
1341 ScriptControl = getScriptControlIndex(num);
1343 cx = (JSContext*)ScriptControl->cx;
1344 global = (JSObject*)ScriptControl->glob;
1354 JSAutoRequest ar(cx);
1357 JSAutoCompartment ac(cx, global);
1358 bool ok = JS_DefineProperty(cx,global, name, rval, getECMANative, setECMANative,0);
1360 printf(
"JS_DefineProperty failed for \"%s\" in addGlobalECMANativeProperty.\n", name);
1368static int JSaddGlobalAssignProperty(
int num,
const char *name,
const char *str) {
1369 jsval _rval = INT_TO_JSVAL(0);
1374 ScriptControl = getScriptControlIndex(num);
1377 cx = (JSContext*)ScriptControl->cx;
1378 global = (JSObject*)ScriptControl->glob;
1382 JSAutoRequest ar(cx);
1385 JSAutoCompartment ac(cx,global);
1386 if (!JS_EvaluateScript(cx,global, str, (
int) strlen(str), FNAME_STUB, LINENO_STUB, &_rval)) {
1387 ConsoleMessage (
"JSaddGlobalAssignProperty - JS_EvaluateScript failed for %s", str);
1390 if (!JS_DefineProperty(cx,global, name, _rval, getAssignProperty, setAssignProperty, 0 | JSPROP_PERMANENT)) {
1391 printf(
"JS_DefineProperty failed for \"%s\" in addGlobalAssignProperty.\n", name);
1403#define GETJSPTR_TYPE_A(thistype) \
1404 case FIELDTYPE_##thistype: { \
1405 thistype##Native *ptr; \
1407 if ((ptr = (thistype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(*(jsval *)(tg->JScript.JSglobal_return_val)))) == NULL) { \
1408 printf( "JS_GetPrivate failed in get_valueChanged_flag\n"); \
1412 tg->CRoutes.JSSFpointer = (void *)ptr; \
1413 touched = ptr->valueChanged; \
1417#define RESET_TOUCHED_TYPE_A(thistype) \
1418 case FIELDTYPE_##thistype: { \
1419 ((thistype##Native *)tg->CRoutes.JSSFpointer)->valueChanged = 0; \
1423#define GETJSPTR_TYPE_MF_A(thisMFtype,thisSFtype) \
1424 case FIELDTYPE_##thisMFtype: { \
1425 thisSFtype##Native *ptr; \
1426 jsval mainElement; \
1429 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval *)(tg->JScript.JSglobal_return_val)), "length", &mainElement)) { \
1430 printf ("JS_GetProperty failed for \"length\" in get_valueChanged_flag\n"); \
1433 len = JSVAL_TO_INT(mainElement); \
1435 for (i = 0; i < len; i++) { \
1436 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), i, &mainElement)) { \
1437 printf ("JS_GetElement failed for %d in get_valueChanged_flag\n",i); \
1440 if ((ptr = (thisSFtype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) { \
1441 printf( "JS_GetPrivate failed for obj in setField_javascriptEventOut.\n"); \
1444 if (ptr->valueChanged > 0) touched = TRUE; \
1450#define RESET_TOUCHED_TYPE_MF_A(thisMFtype,thisSFtype) \
1451 case FIELDTYPE_##thisMFtype: { \
1452 thisSFtype##Native *ptr; \
1453 jsval mainElement; \
1457 cx = (JSContext*)scriptcontrol->cx; \
1458 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "length", &mainElement)) { \
1459 printf ("JS_GetProperty failed for \"length\" in get_valueChanged_flag\n"); \
1462 len = JSVAL_TO_INT(mainElement); \
1464 for (i = 0; i < len; i++) { \
1465 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), i, &mainElement)) { \
1466 printf ("JS_GetElement failed for %d in get_valueChanged_flag\n",i); \
1469 if ((ptr = (thisSFtype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) { \
1470 printf( "JS_GetPrivate failed for obj in setField_javascriptEventOut.\n"); \
1473 ptr->valueChanged = 0; \
1480#define GET_ECMA_TOUCHED(thistype) \
1481 case FIELDTYPE_SF##thistype: {\
1482 touched = findNameInECMATable( (JSContext*)scriptcontrol->cx,fullname);\
1486#define GET_ECMA_MF_TOUCHED(thistype) \
1487 case FIELDTYPE_MF##thistype: {\
1488 jsval mainElement; \
1490 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "MF_ECMA_has_changed", &mainElement)) { \
1491 printf ("JS_GetProperty failed for \"MF_ECMA_HAS_changed\" in get_valueChanged_flag\n"); \
1493 touched = JSVAL_TO_INT(mainElement);\
1497#define RESET_ECMA_MF_TOUCHED(thistype) \
1498 case FIELDTYPE_##thistype: {\
1499 jsval myv = INT_TO_JSVAL(0); \
1501 if (!JS_SetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "MF_ECMA_has_changed", &myv)) { \
1502 printf( "JS_SetProperty failed for \"MF_ECMA_has_changed\" in RESET_ECMA_MF_TOUCHED.\n"); \
1511#define RESET_TOUCHED_TYPE_ECMA(thistype) \
1512 case FIELDTYPE_##thistype: { \
1513 resetNameInECMATable( cx,JSparamnames[fptr].name); \
1519OLDCODE #define Bool savedBool
1571int sm1_get_valueChanged_flag (
int fptr,
int actualscript) {
1576 JSObject *interpobj;
1585 scriptcontrol = getScriptControlIndex(actualscript);
1586 interpobj = (JSObject*)scriptcontrol->glob;
1587 cx = (JSContext*)scriptcontrol->cx;
1588 fullname = JSparamnames[fptr].name;
1592 JSAutoRequest ar(cx);
1595 JSAutoCompartment ac(cx, interpobj);
1597 if (!JS_GetProperty(cx, interpobj ,fullname,(jsval*)tg->JScript.JSglobal_return_val)) {
1598 printf (
"cant get property for %s\n",fullname);
1602 switch (JSparamnames[fptr].type) {
1604 GETJSPTR_TYPE_A(SFNode)
1611 GETJSPTR_TYPE_A(SFImage)
1616 GETJSPTR_TYPE_MF_A(MFNode,SFNode)
1617 GETJSPTR_TYPE_MF_A(MFVec2f,
SFVec2f)
1618 GETJSPTR_TYPE_MF_A(MFVec3f,
SFVec3f)
1619 GETJSPTR_TYPE_MF_A(MFVec4f,
SFVec4f)
1620 GETJSPTR_TYPE_MF_A(MFVec4d,
SFVec4d)
1622 GETJSPTR_TYPE_MF_A(MFColor,
SFColor)
1625 GET_ECMA_MF_TOUCHED(Int32)
1626 GET_ECMA_MF_TOUCHED(Bool)
1627 GET_ECMA_MF_TOUCHED(Time)
1628 GET_ECMA_MF_TOUCHED(Double)
1629 GET_ECMA_MF_TOUCHED(Float)
1630 GET_ECMA_MF_TOUCHED(String)
1632 GET_ECMA_TOUCHED(Int32)
1633 GET_ECMA_TOUCHED(Bool)
1634 GET_ECMA_TOUCHED(Float)
1635 GET_ECMA_TOUCHED(Time)
1636 GET_ECMA_TOUCHED(Double)
1637 GET_ECMA_TOUCHED(String)
1639 default: {printf (
"not handled yet in get_valueChanged_flag %s\n",FIELDTYPES[JSparamnames[fptr].type]);
1652void sm1_resetScriptTouchedFlag(
int actualscript,
int fptr) {
1659 scriptcontrol = getScriptControlIndex(actualscript);
1660 cx = (JSContext*)scriptcontrol->cx;
1661 global = (JSObject*)scriptcontrol->glob;
1664 JSAutoRequest ar(cx);
1667 JSAutoCompartment ac(cx, global);
1669 switch (JSparamnames[fptr].type) {
1671 RESET_TOUCHED_TYPE_A(SFNode)
1678 RESET_TOUCHED_TYPE_A(SFImage)
1681 RESET_TOUCHED_TYPE_MF_A(MFRotation,
SFRotation)
1682 RESET_TOUCHED_TYPE_MF_A(MFNode,SFNode)
1683 RESET_TOUCHED_TYPE_MF_A(MFVec2f,
SFVec2f)
1684 RESET_TOUCHED_TYPE_MF_A(MFVec3f,
SFVec3f)
1685 RESET_TOUCHED_TYPE_MF_A(MFVec4f,
SFVec4f)
1686 RESET_TOUCHED_TYPE_MF_A(MFVec4d,
SFVec4d)
1688 RESET_TOUCHED_TYPE_MF_A(MFColor,
SFColor)
1691 RESET_TOUCHED_TYPE_ECMA (SFInt32)
1692 RESET_TOUCHED_TYPE_ECMA (SFBool)
1693 RESET_TOUCHED_TYPE_ECMA (SFFloat)
1694 RESET_TOUCHED_TYPE_ECMA (SFTime)
1695 RESET_TOUCHED_TYPE_ECMA (SFDouble)
1696 RESET_TOUCHED_TYPE_ECMA (SFString)
1697 RESET_ECMA_MF_TOUCHED(MFInt32)
1698 RESET_ECMA_MF_TOUCHED(MFBool)
1699 RESET_ECMA_MF_TOUCHED(MFFloat)
1700 RESET_ECMA_MF_TOUCHED(MFTime)
1701 RESET_ECMA_MF_TOUCHED(MFString)
1702 default: {printf (
"can not reset touched_flag for %s\n",stringFieldtypeType(JSparamnames[fptr].type));}
1708int sm2_get_valueChanged_flag (
int fptr,
int actualscript){
1711 int type, kind, ifield, found;
1718 scriptcontrol = getScriptControlIndex(actualscript);
1719 script = scriptcontrol->script;
1720 node = script->ShaderScriptNode;
1721 fullname = JSparamnames[fptr].name;
1722 found = getFieldFromNodeAndName(node,fullname,&type,&kind,&ifield,&value);
1724 field = Shader_Script_getScriptField(script, ifield);
1725 gglobal()->JScript.JSglobal_return_val = (
void *)&field->value;
1726 return field->valueChanged;
1728 gglobal()->JScript.JSglobal_return_val = NULL;
1731void sm2_resetScriptTouchedFlag(
int actualscript,
int fptr){
1734 int type, kind, ifield, found;
1741 scriptcontrol = getScriptControlIndex(actualscript);
1742 script = scriptcontrol->script;
1743 node = script->ShaderScriptNode;
1744 fullname = JSparamnames[fptr].name;
1745 found = getFieldFromNodeAndName(node,fullname,&type,&kind,&ifield,&value);
1747 field = Shader_Script_getScriptField(script, ifield);
1748 field->valueChanged = 0;
1753int sm_get_valueChanged_flag (
int fptr,
int actualscript){
1754 if(SM_method() == 2)
1755 return sm2_get_valueChanged_flag(fptr,actualscript);
1757 return sm1_get_valueChanged_flag(fptr,actualscript);
1759void sm_resetScriptTouchedFlag(
int actualscript,
int fptr){
1760 if(SM_method() == 2)
1761 sm2_resetScriptTouchedFlag(actualscript,fptr);
1763 sm1_resetScriptTouchedFlag(actualscript,fptr);
1766int jsActualrunScript(
int num,
char *script);
1767void sm_JSInitializeScriptAndFields (
int num) {
1781 int i,nfields,kind,itype;
1782 const char *fieldname;
1783 char longfieldname[256];
1787 ScriptControl = getScriptControlIndex(num);
1790 if(1)
if (!jsActualrunScript(num, ScriptControl->scriptText)) {
1791 ConsoleMessage (
"JSInitializeScriptAndFields, script failure\n");
1792 ScriptControl->scriptOK = FALSE;
1793 ScriptControl->_initialized = TRUE;
1803 script = ScriptControl->script;
1805 nfields = Shader_Script_getScriptFieldCount(script);
1806 for(i=0;i<nfields;i++){
1807 field = Shader_Script_getScriptField(script,i);
1808 fieldname = ScriptFieldDecl_getName(field);
1809 kind = ScriptFieldDecl_getMode(field);
1810 itype = ScriptFieldDecl_getType(field);
1811 longfieldname[0] = 0;
1812 if(kind == PKW_inputOnly)
1813 strcat(longfieldname,
"__eventIn_Value_");
1814 strcat(longfieldname,fieldname);
1815 if(SM_method() == 2)
1816 InitScriptFieldB(num, kind, itype, longfieldname, field->value);
1818 InitScriptField(num, kind, itype, longfieldname, field->value);
1822 if(0)
if (!jsActualrunScript(num, ScriptControl->scriptText)) {
1823 ConsoleMessage (
"JSInitializeScriptAndFields, script failure\n");
1824 ScriptControl->scriptOK = FALSE;
1825 ScriptControl->_initialized = TRUE;
1830 ScriptControl->_initialized = TRUE;
1831 ScriptControl->scriptOK = TRUE;
1838void sm_SaveScriptField (
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
1855void getJSMultiNumType (JSContext *cx,
struct Multi_Vec3f *tn,
int eletype) {
1879 elesize = returnElementLength(eletype) * returnElementRowSize(eletype);
1883 #ifdef SETFIELDVERBOSE
1884 printf (
"getJSMultiNumType, JSCreate_global_return_val %u, JSglobal_return_val %u\n",
1885 (
unsigned int) JSVAL_TO_INT(*(jsval *)tg->jsVRMLBrowser.JSCreate_global_return_val),
1886 (
unsigned int) JSVAL_TO_INT(*(jsval *)tg->JScript.JSglobal_return_val));
1889 if (JSVAL_TO_INT(*(jsval*)(tg->jsVRMLBrowser.JSCreate_global_return_val)) != 0) {
1890 myJSVal = (jsval *)tg->jsVRMLBrowser.JSCreate_global_return_val;
1891 *(jsval *)(tg->jsVRMLBrowser.JSCreate_global_return_val) = INT_TO_JSVAL(0);
1893 #ifdef SETFIELDVERBOSE
1894 printf (
"getJSMultiNumType: using JSCreate_global_return_val\n");
1897 #ifdef SETFIELDVERBOSE
1898 printf (
"getJSMultiNumType: using JSglobal_return_val\n");
1901 myJSVal = (jsval *)tg->JScript.JSglobal_return_val;
1905 if(!(*myJSVal).isObject()){
1906 printf (
"getJSMultiNumType - did not get an object\n");
1910 #ifdef SETFIELDVERBOSE
1911 printf (
"getJSMultiNumType, tn %p dest has %s size %d\n",tn,stringFieldtypeType(eletype), elesize);
1913 printf(
"getJSMulitNumType, node type of myJSVal is :");
1914 printJSNodeType (cx,myJSVal);
1917 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*myJSVal), MF_LENGTH_FIELD, &mainElement)) {
1918 printf (
"JS_GetProperty failed for \"%s\" in getJSMultiNumType\n", MF_LENGTH_FIELD);
1921 len = JSVAL_TO_INT(mainElement);
1922 #ifdef SETFIELDVERBOSE
1923 printf (
"getmuiltie length of grv is %d old len is %d\n",len,tn->n);
1933 tn->p = MALLOC (
struct SFVec3f *, (
unsigned)(elesize*len));
1935 #ifdef SETFIELDVERBOSE
1936 printf (
"MALLOCing memory for elesize %d len %d new pointer now is %p\n",elesize,len,tn->p);
1940 if (eletype == FIELDTYPE_SFString) {
1941 #ifdef SETFIELDVERBOSE
1942 printf (
"getJSMultiNumType, this is a MFString, so making tiny strings for now\n");
1946 for (i=0; i<len; i++) {
1947 *ms = newASCIIString (
"(getJSMultiNumType null)");
1954 fl = (
float *) tn->p;
1955 il = (
long *) tn->p;
1956 dl = (
double *) tn->p;
1961 for (i = 0; i < len; i++) {
1962 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*myJSVal), i, &mainElement)) {
1963 printf (
"WARNING: JS_GetElement failed for %d in getJSMultiNumType\n",i);
1965 case FIELDTYPE_SFNode:
1966 *nl = 0; nl++;
break;
1967 case FIELDTYPE_SFInt32:
1969 case FIELDTYPE_SFDouble:
1970 case FIELDTYPE_SFTime:
1971 *dl=0.0; dl++;
break;
1972 case FIELDTYPE_SFFloat:
1973 *fl = (float) 0.0; fl++;
break;
1974 case FIELDTYPE_SFVec2f:
1975 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
1976 case FIELDTYPE_SFVec3f:
1977 case FIELDTYPE_SFColor:
1978 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
1979 case FIELDTYPE_SFRotation:
1980 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
1981 case FIELDTYPE_SFString:
1982 verify_Uni_String (*ms,
"(empty value)"); ms++;
break;
1984 default : {printf (
"getJSMultiNumType unhandled eletype: %d\n",
1990 #ifdef SETFIELDVERBOSE
1993 _tmpStr = JS_ValueToString(cx, mainElement);
1995 strp = JS_GetStringBytes(_tmpStr);
1997 strp = strpp = JS_EncodeString(cx,_tmpStr);
1999 printf (
"sub element %d is \"%s\" \n",i,strp);
2000#if JS_VERSION >= 185
2004 if (JSVAL_IS_OBJECT(mainElement)) printf (
"sub element %d is an OBJECT\n",i);
2005 if (JSVAL_IS_PRIMITIVE(mainElement)) printf (
"sub element %d is an PRIMITIVE\n",i);
2010 case FIELDTYPE_SFNode: {
2012 if (JS_InstanceOf (cx, JSVAL_TO_OBJECT(mainElement), &SFNodeClass, NULL)) {
2016 if ((_vec = (
SFNodeNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2017 printf (
"error getting native\n");
2025 printf (
"hmm - not an SFNode class\n");
2032 case FIELDTYPE_SFInt32: {
2038 if(mainElement.isInt32()) *il = mainElement.toInt32();
2042 case FIELDTYPE_SFDouble:
2043 case FIELDTYPE_SFTime: {
2044 if (!JS_ValueToNumber(cx, mainElement ,dl)) *dl=0.0;
2048 case FIELDTYPE_SFFloat: {
2049 if (!JS_ValueToNumber(cx, mainElement, &dtmp)) dtmp=0.0;
2055 case FIELDTYPE_SFVec2f: {
2057 if(mainElement.isObject()){
2058 if ((sfvec2f = (
SFVec2fNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2059 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2062 memcpy ((
void *)fl, (
void *)&(sfvec2f->v),2*
sizeof(
float));
2066 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2070 case FIELDTYPE_SFVec3f:
2071 case FIELDTYPE_SFColor: {
2073 if(mainElement.isObject()){
2074 if ((sfvec3f = (
SFVec3fNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2075 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2078 memcpy ((
void *)fl, (
void *)&(sfvec3f->v),3*
sizeof(
float));
2082 *fl = (float) 0.0; fl++;
2083 *fl = (float) 0.0; fl++;
2084 *fl = (float) 0.0; fl++;
2088 case FIELDTYPE_SFRotation: {
2090 if(mainElement.isObject()){
2091 if ((sfrotation = (
SFRotationNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2092 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2095 memcpy ((
void *)fl, (
void *)&(sfrotation->v),4*
sizeof(
float));
2099 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2100 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2105 case FIELDTYPE_SFString: {
2108 strval = JS_ValueToString(cx, mainElement);
2109 strp = strpp = JS_EncodeString(cx,strval);
2113 #ifdef SETFIELDVERBOSE
2114 printf (
"getJSMultiNumType, got string %s\n",strp);
2118 verify_Uni_String (*ms,strp);
2126 default : {printf (
"getJSMultiNumType unhandled eletype: %d\n",
2134 #ifdef SETFIELDVERBOSE
2135 printf (
"getJSMultiNumType, setting old length %d to length %d\n",tn->n, len);
2145void getMFStringtype (JSContext *cx, jsval *from,
struct Multi_String *to) {
2150 char *valStr, *OldvalStr;
2161 if (!JS_ValueToObject(cx, *from, &obj))
2162 printf (
"JS_ValueToObject failed in getMFStringtype\n");
2164 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_v)) {
2165 printf (
"JS_GetProperty failed for \"%s\" in getMFStringtype.\n", MF_LENGTH_FIELD);
2168 newlen = JSVAL_TO_INT(_v);
2174 if (newlen > oldlen) {
2177 to->p = MALLOC(
struct Uni_String **, newlen *
sizeof(to->p));
2181 for (count = 0; count <oldlen; count ++) {
2189 for (count = oldlen; count < newlen; count ++) {
2195 *newp = newASCIIString(
"");
2214 for (i = 0; i < newlen; i++) {
2216 OldvalStr = svptr[i]->strptr;
2220 if (!JS_GetElement(cx, obj, i, &_v)) {
2222 "JS_GetElement failed for %d in getMFStringtype\n",i);
2225 strval = JS_ValueToString(cx, _v);
2227 valStr = JS_EncodeString(cx,strval);
2233 if (strcmp(valStr,OldvalStr) != 0) {
2235 svptr[i] = newASCIIString(valStr);
2254void setField_javascriptEventOut(
struct X3D_Node *tn,
unsigned int tptr,
int fieldType,
unsigned len,
int extraData, JSContext *scriptContext) {
2266 memptr = offsetPointer_deref(
char *, tn, tptr);
2268#define GETJSVAL_TYPE_A(thistype,field) \
2269 case FIELDTYPE_##thistype: { \
2271 memcpy ((void *)memptr, (void *) &(((thistype##Native *)tg->CRoutes.JSSFpointer)->field),len); \
2275#define GETJSVAL_TYPE_MF_A(MFtype,SFtype) \
2276 case FIELDTYPE_##MFtype: {getJSMultiNumType (scriptContext, (struct Multi_Vec3f *)memptr,FIELDTYPE_##SFtype); break;}
2278 switch (fieldType) {
2291 GETJSVAL_TYPE_MF_A(MFVec2d,
SFVec2d)
2292 GETJSVAL_TYPE_MF_A(MFVec3d,
SFVec3d)
2293 GETJSVAL_TYPE_MF_A(MFVec4d,
SFVec4d)
2294 GETJSVAL_TYPE_MF_A(MFVec2f,
SFVec2f)
2295 GETJSVAL_TYPE_MF_A(MFVec3f,
SFVec3f)
2296 GETJSVAL_TYPE_MF_A(MFVec4f,
SFVec4f)
2297 GETJSVAL_TYPE_MF_A(MFColor,
SFColor)
2301 case FIELDTYPE_SFInt32:
2302 case FIELDTYPE_SFBool: {
2304 val = *(jsval*)(tg->JScript.JSglobal_return_val);
2307 if(! (val.isBoolean() || val.isInt32())){
2310 if(val.isBoolean()) ival = val.isTrue() ? TRUE : FALSE;
2311 if(val.isInt32()) ival = val.toInt32() == 0 ? FALSE : TRUE;
2312 memcpy ((
void *)memptr, (
void *)&ival,len);
2316 case FIELDTYPE_SFDouble:
2317 case FIELDTYPE_SFTime: {
2318 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2319 memcpy ((
void *)memptr, (
void *)&tval,len);
2323 case FIELDTYPE_SFFloat: {
2324 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2326 fl[0] = (float) tval;
2327 memcpy ((
void *)memptr, (
void *)fl,len);
2331 case FIELDTYPE_SFImage: {
2333 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2334 strp = strpp = JS_EncodeString(scriptContext,strval);
2335 Parser_scanStringValueToMem(tn, tptr, FIELDTYPE_SFImage, strp, FALSE);
2336 JS_free(scriptContext,strpp);
2340 case FIELDTYPE_SFString: {
2344 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2345 strp = strpp = JS_EncodeString(scriptContext,strval);
2349 newptr = (intptr_t *)memptr;
2351 verify_Uni_String (ms,strp);
2352 JS_free(scriptContext,strpp);
2357 case FIELDTYPE_MFFloat: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFFloat);
break;}
2358 case FIELDTYPE_MFInt32: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFInt32);
break;}
2359 case FIELDTYPE_MFTime: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFTime);
break;}
2360 case FIELDTYPE_MFDouble: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFDouble);
break;}
2361 case FIELDTYPE_MFNode: {
2364 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2365 strp = strpp = JS_EncodeString(scriptContext,strval);
2368 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2370 if (*strp ==
'[') strp ++;
2371 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2375 mynode = X3D_NODE(atol(strp));
2376 JS_free(scriptContext,strpp);
2383 getMFNodetype (mynode,(
struct Multi_Node *)memptr,X3D_NODE(tn),extraData);
break;
2385 case FIELDTYPE_MFString: {
2388 (jsval *)tg->JScript.JSglobal_return_val,
2393 case FIELDTYPE_SFNode: {
2397 memcpy ((
void *)memptr, (
void *) &(((
SFNodeNative *)tg->CRoutes.JSSFpointer)->handle),returnElementLength(FIELDTYPE_SFNode));
2403 default: { printf(
"WARNING: unhandled from type %s\n", stringFieldtypeType(fieldType));
2410void setField_javascriptEventOut_B(
union anyVrml* any,
2411 int fieldType,
unsigned len,
int extraData, JSContext *scriptContext)
2425 memptr = (
char *)any;
2427#define GETJSVAL_TYPE_A(thistype,field) \
2428 case FIELDTYPE_##thistype: { \
2430 memcpy ((void *)memptr, (void *) &(((thistype##Native *)tg->CRoutes.JSSFpointer)->field),len); \
2434#define GETJSVAL_TYPE_MF_A(MFtype,SFtype) \
2435 case FIELDTYPE_##MFtype: {getJSMultiNumType (scriptContext, (struct Multi_Vec3f *)memptr,FIELDTYPE_##SFtype); break;}
2437 switch (fieldType) {
2450 GETJSVAL_TYPE_MF_A(MFVec2d,
SFVec2d)
2451 GETJSVAL_TYPE_MF_A(MFVec3d,
SFVec3d)
2452 GETJSVAL_TYPE_MF_A(MFVec4d,
SFVec4d)
2453 GETJSVAL_TYPE_MF_A(MFVec2f,
SFVec2f)
2454 GETJSVAL_TYPE_MF_A(MFVec3f,
SFVec3f)
2455 GETJSVAL_TYPE_MF_A(MFVec4f,
SFVec4f)
2456 GETJSVAL_TYPE_MF_A(MFColor,
SFColor)
2460 case FIELDTYPE_SFInt32:
2461 case FIELDTYPE_SFBool: {
2463 jsval val = *(jsval*)(tg->JScript.JSglobal_return_val);
2464 if(!val.isBoolean() || val.isInt32()){
2469 if(val.isBoolean()) ival = val.isTrue() ? TRUE : FALSE;
2470 if(val.isInt32()) ival = val.toInt32() == 0 ? FALSE : TRUE;
2471 memcpy ((
void *)memptr, (
void *)&ival,len);
2475 case FIELDTYPE_SFDouble:
2476 case FIELDTYPE_SFTime: {
2477 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2478 memcpy ((
void *)memptr, (
void *)&tval,len);
2482 case FIELDTYPE_SFFloat: {
2483 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2485 fl[0] = (float) tval;
2486 memcpy ((
void *)memptr, (
void *)fl,len);
2490 case FIELDTYPE_SFImage: {
2492 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2493 strp = strpp = JS_EncodeString(scriptContext,strval);
2494 Parser_scanStringValueToMem_B(any, FIELDTYPE_SFImage, strp, FALSE);
2495 JS_free(scriptContext,strpp);
2499 case FIELDTYPE_SFString: {
2503 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2504 strp = strpp = JS_EncodeString(scriptContext,strval);
2509 newptr = (intptr_t *)memptr;
2513 *newptr = (intptr_t) ms;
2516 ms->touched = FALSE;
2518 verify_Uni_String (ms,strp);
2519 JS_free(scriptContext,strpp);
2525 case FIELDTYPE_MFFloat: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFFloat);
break;}
2526 case FIELDTYPE_MFInt32: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFInt32);
break;}
2527 case FIELDTYPE_MFTime: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFTime);
break;}
2528 case FIELDTYPE_MFDouble: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFDouble);
break;}
2529 case FIELDTYPE_MFNode: {
2532 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2533 strp = strpp = JS_EncodeString(scriptContext,strval);
2535 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2537 if (*strp ==
'[') strp ++;
2538 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2542 mynode = X3D_NODE(atol(strp));
2543 JS_free(scriptContext,strpp);
2553 any->mfnode.p[0] = mynode;
2557 case FIELDTYPE_MFString: {
2560 (jsval *)tg->JScript.JSglobal_return_val,
2565 case FIELDTYPE_SFNode: {
2569 memcpy ((
void *)memptr, (
void *) &(((
SFNodeNative *)tg->CRoutes.JSSFpointer)->handle),returnElementLength(FIELDTYPE_SFNode));
2575 default: { printf(
"WARNING: unhandled from type %s\n", stringFieldtypeType(fieldType));
2582void sm_js_setField_javascriptEventOut(
struct X3D_Node *tn,
unsigned int tptr,
int fieldType,
unsigned len,
int extraData,
int actualscript) {
2586 scriptcontrol = getScriptControlIndex(actualscript);
2587 cx = (JSContext*)scriptcontrol->cx;
2588 global = (JSObject*)scriptcontrol->glob;
2591 JSAutoRequest ar(cx);
2594 JSAutoCompartment ac(cx, global);
2595 setField_javascriptEventOut(tn,tptr,fieldType, len, extraData, (JSContext*)scriptcontrol->cx);
2600void sm_js_setField_javascriptEventOut_B(
union anyVrml* any,
int fieldType,
unsigned len,
int extraData,
int actualscript){
2604 scriptcontrol = getScriptControlIndex(actualscript);
2605 cx = (JSContext*)scriptcontrol->cx;
2606 global = (JSObject*)scriptcontrol->glob;
2609 JSAutoRequest ar(cx);
2612 JSAutoCompartment ac(cx, global);
2613 setField_javascriptEventOut_B(any,fieldType, len, extraData, (JSContext*)scriptcontrol->cx);
2621void sm_set_one_ECMAtype (
int tonode,
int toname,
int dataType,
void *Data,
int datalen) {
2622 char scriptline[256];
2630 #ifdef SETFIELDVERBOSE
2631 printf (
"set_one_ECMAtype, to %d namepointer %d, fieldname %s, datatype %d length %d\n",
2632 tonode,toname,JSparamnames[toname].name,dataType,datalen);
2634 ScriptControl = getScriptControlIndex(tonode);
2636 cx = (JSContext*)ScriptControl->cx;
2637 obj = (JSObject*)ScriptControl->glob;
2642 JSAutoRequest ar(cx);
2645 JSAutoCompartment ac(cx, obj);
2651 JS_NewNumberValue(cx, TickTime(), &zimbo);
2652 if (!JS_DefineProperty(cx,obj,
"__eventInTickTime", zimbo, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB2, JSPROP_PERMANENT)) {
2653 printf(
"JS_DefineProperty failed for \"__eventInTickTime\" at %s:%d.\n",__FILE__,__LINE__);
2659 kind = JSparamnames[toname].kind;
2660 if(SM_method() == 2){
2661 int type, iifield, *valueChanged, ifound;
2665 fieldname = JSparamnames[toname].name;
2667 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2668 if(ifound && type == dataType && isSFType(type)){
2672 shallow_copy_field(type,any,value);
2675 (*valueChanged) = 1;
2677 ConsoleMessage(
"sm_set_one_ECMAtype did not find field %s type %d\n",fieldname, dataType);
2682 X3D_ECMA_TO_JS(cx, Data, datalen, dataType, &newval);
2686 if(kind == PKW_inputOnly)
2687 strcat(scriptline,
"__eventIn_Value_");
2689 strcat(scriptline,JSparamnames[toname].name);
2690 #ifdef SETFIELDVERBOSE
2691 printf (
"set_one_ECMAtype, calling JS_DefineProperty on name %s obj %u, setting setECMANative, 0 \n",scriptline,obj);
2694 if (!JS_DefineProperty(cx,obj, scriptline, newval, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_PERMANENT)) {
2695 printf(
"JS_DefineProperty failed for \"ECMA in\" at %s:%d.\n",__FILE__,__LINE__);
2703 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
2706 RUN_FUNCTION (toname)
2724void sm_setScriptECMAtype (
int num) {
2730 struct CRStruct *CRoutes = getCRoutes();
2733 fn = offsetPointer_deref(
void *, CRoutes[num].routeFromNode, CRoutes[num].fnptr);
2734 len = CRoutes[num].len;
2736 for (to_counter = 0; to_counter < CRoutes[num].tonode_count; to_counter++) {
2739 to_ptr = &(CRoutes[num].tonodes[to_counter]);
2740 myObj = (
struct Shader_Script*)X3D_SCRIPT(to_ptr->routeToNode)->__scriptObj;
2742 tptr = to_ptr->foffset;
2743 set_one_ECMAtype (myObj->num, tptr, JSparamnames[tptr].type, fn,len);
2749void sm_set_one_MFElementType(
int tonode,
int toname,
int dataType,
void *Data,
int datalen) {
2754 char scriptline[20000];
2768 ScriptControl = getScriptControlIndex(tonode);
2769 cx = (JSContext*)ScriptControl->cx;
2770 obj = (JSObject*)ScriptControl->glob;
2774 JSAutoRequest ar(cx);
2777 JSAutoCompartment ac(cx, obj);
2780 kind = JSparamnames[toname].kind;
2781 if(SM_method() == 2){
2782 int type, iifield, *valueChanged, ifound;
2786 fieldname = JSparamnames[toname].name;
2788 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2789 if(ifound && type == dataType && !isSFType(type)){
2792 any.mfbool.n = datalen;
2793 any.mfbool.p = (
int *)Data;
2798 shallow_copy_field(type,&any,value);
2805 (*valueChanged) = 1;
2807 ConsoleMessage(
"sm_set_one_MFElementType did not find field %s type %d\n",fieldname, dataType);
2813 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
2814 RUN_FUNCTION(toname)
2821 case FIELDTYPE_MFRotation: {
2822 JSObject *newMFObject;
2823 JSObject *newSFObject;
2825 float *fp, *fp_in=(
float *)Data;
2828 newMFObject = JS_ConstructObjectFw(cx, &MFRotationClass, NULL ,JS_GetParentFw(cx, obj));
2829 ADD_ROOT (cx, newMFObject)
2832 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
2835 elementlen = (int)
sizeof (
float);
2836 for (x=0; x<datalen; x++) {
2838 newSFObject = JS_ConstructObjectFw(cx,&SFRotationClass,NULL, newMFObject);
2839 if ((SFRPptr = (
SFRotationNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
2840 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
2845 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2846 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2847 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2848 fp = (
float *)fp_in; SFRPptr->v.c[3] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2851 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
2852 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
2853 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
2858 SET_LENGTH (cx,newMFObject,datalen)
2861 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
2864 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
2865 RUN_FUNCTION(toname)
2869 case FIELDTYPE_MFVec3f: {
2870 JSObject *newMFObject;
2871 JSObject *newSFObject;
2873 float *fp, *fp_in=(
float *)Data;
2876 newMFObject = JS_ConstructObjectFw(cx, &MFVec3fClass, NULL ,JS_GetParentFw(cx, obj));
2877 ADD_ROOT (cx, newMFObject)
2880 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
2883 elementlen = (int)
sizeof (
float);
2884 for (x=0; x<datalen; x++) {
2886 newSFObject = JS_ConstructObjectFw(cx,&SFVec3fClass,NULL, newMFObject);
2887 if ((SFRPptr = (
SFVec3fNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
2888 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
2893 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2894 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2895 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2898 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
2899 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
2900 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
2905 SET_LENGTH (cx,newMFObject,datalen)
2908 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
2911 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
2912 RUN_FUNCTION(toname)
2916 case FIELDTYPE_MFColor: {
2917 JSObject *newMFObject;
2918 JSObject *newSFObject;
2920 float *fp, *fp_in=(
float *)Data;
2923 newMFObject = JS_ConstructObjectFw(cx, &MFColorClass, NULL ,JS_GetParentFw(cx, obj));
2924 ADD_ROOT (cx, newMFObject)
2927 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
2930 elementlen = (int)
sizeof (
float);
2931 for (x=0; x<datalen; x++) {
2933 newSFObject = JS_ConstructObjectFw(cx,&SFColorClass,NULL, newMFObject);
2934 if ((SFRPptr = (
SFColorNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
2935 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
2940 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2941 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2942 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2945 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
2946 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
2947 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
2952 SET_LENGTH (cx,newMFObject,datalen)
2955 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
2958 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
2959 RUN_FUNCTION(toname)
2963 case FIELDTYPE_MFVec2f: {
2964 JSObject *newMFObject;
2965 JSObject *newSFObject;
2967 float *fp, *fp_in=(
float *)Data;
2970 newMFObject = JS_ConstructObjectFw(cx, &MFVec2fClass, NULL ,JS_GetParentFw(cx, obj));
2971 ADD_ROOT (cx, newMFObject)
2974 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
2977 elementlen = (int)
sizeof (
float);
2978 for (x=0; x<datalen; x++) {
2980 newSFObject = JS_ConstructObjectFw(cx,&SFVec2fClass,NULL, newMFObject);
2981 if ((SFRPptr = (
SFVec2fNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
2982 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
2987 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2988 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
2991 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
2992 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
2993 ConsoleMessage(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
2998 SET_LENGTH (cx,newMFObject,datalen)
3001 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3004 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3005 RUN_FUNCTION(toname)
3010 case FIELDTYPE_MFFloat: {
3011 JSObject *newMFObject;
3013 float *fp, *fp_in=(
float *)Data;
3015 newMFObject = JS_ConstructObjectFw(cx, &MFFloatClass, NULL ,JS_GetParentFw(cx, obj));
3016 ADD_ROOT (cx, newMFObject)
3019 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3022 elementlen = (int)
sizeof (
float);
3023 for (x=0; x<datalen; x++) {
3026 fp = (
float *)fp_in;
3027 JS_NewNumberValue(cx,(
double)*fp,&newjsval);
3028 fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3031 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3032 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3033 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3038 SET_LENGTH (cx,newMFObject,datalen)
3041 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3044 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3045 RUN_FUNCTION(toname)
3048 case FIELDTYPE_MFTime: {
3049 JSObject *newMFObject;
3051 double *dp, *dp_in=(
double *)Data;
3054 newMFObject = JS_ConstructObjectFw(cx, &MFTimeClass, NULL ,JS_GetParentFw(cx, obj));
3055 ADD_ROOT (cx, newMFObject)
3058 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3061 elementlen = (int)
sizeof (
double);
3062 for (x=0; x<datalen; x++) {
3065 dp = (
double *)dp_in;
3066 JS_NewNumberValue(cx,(
double)*dp,&newjsval);
3067 dp_in = offsetPointer_deref(
double *,dp_in,elementlen);
3070 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3071 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3072 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3077 SET_LENGTH (cx,newMFObject,datalen)
3080 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3083 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3084 RUN_FUNCTION(toname)
3087 case FIELDTYPE_MFInt32: {
3088 JSObject *newMFObject;
3090 int *ip, *ip_in=(
int *)Data;
3093 newMFObject = JS_ConstructObjectFw(cx, &MFInt32Class, NULL ,JS_GetParentFw(cx, obj));
3094 ADD_ROOT (cx, newMFObject)
3097 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3100 elementlen = (int)
sizeof (
float);
3101 for (x=0; x<datalen; x++) {
3105 newjsval = INT_TO_JSVAL((
int)*ip);
3106 ip_in = offsetPointer_deref(
int *,ip_in,elementlen);
3109 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3110 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3111 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3116 SET_LENGTH (cx,newMFObject,datalen)
3119 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3122 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3123 RUN_FUNCTION(toname)
3126 case FIELDTYPE_MFString: {
3127 JSObject *newMFObject;
3132 newMFObject = JS_ConstructObjectFw(cx, &MFStringClass, NULL ,JS_GetParentFw(cx, obj));
3133 ADD_ROOT (cx, newMFObject)
3139 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3142 for (x=0; x<datalen; x++) {
3145 chptr = uniptr[x]->strptr;
3146 newjsval = STRING_TO_JSVAL( JS_NewStringCopyZ(cx,chptr));
3149 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3150 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3151 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3156 SET_LENGTH (cx,newMFObject,datalen)
3159 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3162 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3163 RUN_FUNCTION(toname)
3166 case FIELDTYPE_MFNode: {
3167 JSObject *newMFObject;
3169 void **ip, **ip_in=(
void **)Data;
3171 newMFObject = JS_ConstructObjectFw(cx, &MFNodeClass, NULL ,JS_GetParentFw(cx, obj));
3172 ADD_ROOT (cx, newMFObject)
3175 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3178 elementlen = (int)
sizeof (
void *);
3179 for (x=0; x<datalen; x++) {
3181 newjsval = PRIVATE_TO_JSVAL((
void*)*ip);
3182 ip_in = offsetPointer_deref(
void **,ip_in,elementlen);
3185 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3186 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3187 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3192 SET_LENGTH (cx,newMFObject,datalen)
3195 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3198 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3199 RUN_FUNCTION(toname)
3203 case FIELDTYPE_SFImage: {
3204 JSObject *newMFObject;
3206 int *ip_in=(
int *)Data;
3209 newMFObject = JS_ConstructObjectFw(cx, &SFImageClass, NULL ,JS_GetParentFw(cx, obj));
3210 ADD_ROOT (cx, newMFObject)
3213 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3216 for (x=0; x<datalen; x++) {
3217 newjsval = INT_TO_JSVAL(ip_in[x]);
3219 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3220 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3221 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3226 SET_LENGTH (cx,newMFObject,datalen)
3229 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3232 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3233 RUN_FUNCTION(toname)
3239 printf (
"setMFElement, SHOULD NOT DISPLAY THIS\n");
3240 strcat (scriptline,
"(");
3261void **getInternalDataPointerForJavascriptObject(JSContext *cx, JSObject *obj,
int tnfield,
int *iflag) {
3262 char scriptline[256];
3271 if(JSparamnames[tnfield].kind == PKW_inputOnly)
3272 strcat(scriptline,
"__eventIn_Value_");
3273 strcat(scriptline,JSparamnames[tnfield].name);
3274 #ifdef SETFIELDVERBOSE
3275 printf (
"getInternalDataPointerForJavascriptObject: line %s\n",scriptline);
3278 if (!JS_GetProperty(cx,obj,scriptline,&retval)){
3283 printf (
"JS_GetProperty failed in set_one_MultiElementType.\n");
3288 if(!retval.isObject()){
3293 if (!JS_GetProperty(cx,obj,JSparamnames[tnfield].name,&retval)){
3295 printf (
"no field for eventIn function: %s\n",JSparamnames[tnfield].name);
3299 if(!retval.isObject()){
3300 printf (
"no field for eventIn function: %s\n",JSparamnames[tnfield].name);
3306 sfObj = JSVAL_TO_OBJECT(retval);
3308 if ((_privPtr = JS_GetPrivateFw(cx, sfObj)) == NULL)
3309 printf(
"JS_GetPrivate failed set_one_MultiElementType.\n");
3311 if (_privPtr == NULL)
return NULL;
3318 if (JS_InstanceOf(cx, sfObj, &SFVec3fClass, NULL)) {
3320 return (
void **) &me->v;
3322 }
else if (JS_InstanceOf(cx, sfObj, &SFVec3dClass, NULL)) {
3324 return (
void **) &me->v;
3326 }
else if (JS_InstanceOf(cx, sfObj, &SFRotationClass, NULL)) {
3328 return (
void **) &me->v;
3330 }
else if (JS_InstanceOf(cx, sfObj, &SFVec2fClass, NULL)) {
3332 return (
void **) &me->v;
3334 }
else if (JS_InstanceOf(cx, sfObj, &SFColorClass, NULL)) {
3336 return (
void **) &me->v;
3338 }
else if (JS_InstanceOf(cx, sfObj, &SFColorRGBAClass, NULL)) {
3340 return (
void **) &me->v;
3342 }
else if (JS_InstanceOf(cx, sfObj, &SFVec4fClass, NULL)) {
3344 return (
void **) &me->v;
3346 }
else if (JS_InstanceOf(cx, sfObj, &SFVec4dClass, NULL)) {
3348 return (
void **) &me->v;
3350 }
else if (JS_InstanceOf(cx, sfObj, &SFNodeClass, NULL)) {
3352 return (
void **) &me->handle;;
3355 }
else if (JS_InstanceOf(cx, sfObj, &SFImageClass, NULL)) {
3361 ConsoleMessage (
"getInternalDataPointerForJavascriptObject malfunction");
3376void sm_set_one_MultiElementType (
int tonode,
int tnfield,
void *Data,
int dataLen ) {
3377 char scriptline[256];
3381 int iflag, kind, toname;
3386 ScriptControl = getScriptControlIndex(tonode);
3387 cx = (JSContext*)ScriptControl->cx;
3388 obj = (JSObject*)ScriptControl->glob;
3392 JSAutoRequest ar(cx);
3395 JSAutoCompartment ac(cx, obj);
3397 kind = JSparamnames[toname].kind;
3398 if(SM_method() == 2){
3399 int type, iifield, *valueChanged, ifound, datatype;
3404 fieldname = JSparamnames[toname].name;
3405 datatype = JSparamnames[toname].type;
3408 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
3409 if(ifound && type == datatype && isSFType(type)){
3411 shallow_copy_field(type,(
union anyVrml*)Data,value);
3412 (*valueChanged) = 1;
3414 ConsoleMessage(
"sm_set_one_MultiElementType did not find field %s type %d\n",fieldname, datatype);
3420 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3421 RUN_FUNCTION(toname)
3426 pp = getInternalDataPointerForJavascriptObject(cx,obj,tnfield,&iflag);
3429 printf(
"function not found\n");
3432 memcpy (pp,Data, dataLen);
3440 COMPILE_FUNCTION_IF_NEEDED_SET(tnfield,kind)
3442 RUN_FUNCTION (tnfield)
3448int sm_runQueuedDirectOutputs(){
3450 static int doneOnce = 0;
3453 printf(
"javascript engine spidermonkey version %ld %s\n", (
long)JS_VERSION, SM_method() == 2?
"SM2" :
"SM1");