36#include <libFreeWRL.h>
38#include "../vrml_parser/Structs.h"
39#include "../main/headers.h"
40#include "../vrml_parser/CParseGeneral.h"
41#include "../vrml_parser/CRoutes.h"
42#include "../main/Snapshot.h"
43#include "../scenegraph/Collision.h"
44#include "../scenegraph/quaternion.h"
45#include "../scenegraph/Viewer.h"
46#include "../input/EAIHelpers.h"
47#include "../input/SensInterps.h"
48#include "../x3d_parser/Bindable.h"
54#include "jsVRMLClasses.h"
55#include "jsVRMLBrowser.h"
58#ifndef JSCLASS_GLOBAL_FLAGS
60#define JSCLASS_GLOBAL_FLAGS 0
63#ifdef JAVASCRIPTVERBOSE
64int ActualrunScript(
int num,
char *script, jsval *rval,
char *fn,
int line);
66int ActualrunScript(
int num,
char *script, jsval *rval);
70static JSClass staticGlobalClass = {
76 JS_StrictPropertyStub,
95typedef struct pJScript{
101 jsval JSglobal_return_value;
102 struct Shader_Script *current_script;
107void *JScript_constructor(){
108 void *v = MALLOCV(
sizeof(
struct pJScript));
109 memset(v,0,
sizeof(
struct pJScript));
112void JScript_init(
struct tJScript *t){
114 t->JSglobal_return_val = NULL;
116 t->prv = JScript_constructor();
118 ppJScript p = (ppJScript)t->prv;
121 memcpy(&p->globalClass,&staticGlobalClass,
sizeof(staticGlobalClass));
122 t->JSglobal_return_val = &p->JSglobal_return_value;
123 p->current_script = NULL;
130void sm_js_cleanup_script_context(
int counter){
133 #if JS_VERSION <= 185
135 #define CATCH_JS_GC_THROWS 1
136 #if defined(CATCH_JS_GC_THROWS) && defined(_MSC_VER) && defined(W_DEBUG)
141 __except(EXCEPTION_EXECUTE_HANDLER) {
142 printf(
"bad js_gc for script num %d\n", counter);
143 if(crss->scriptText){
144 struct X3D_Node *scnode = crss->script->ShaderScriptNode;
146 const char* nn = getNodeName(X3D_NODE(scnode));
147 if(nn) printf(
"DEF %s \n",nn);
148 if(crss->scriptText) printf(
"%s\n",crss->scriptText);
157 ttglobal tg = gglobal();
158 ppJScript p = (ppJScript)tg->JScript.prv;
161 JS_MaybeGC(getScriptControlIndex(counter)->cx);
175void sm_process_eventsProcessed() {
180 ttglobal tg = gglobal();
182 for (counter = 0; counter <= tg->CRoutes.max_script_found_and_initialized; counter++) {
183 scriptcontrol = getScriptControlIndex(counter);
184 if(scriptcontrol->thisScriptType != NOSCRIPT ){
185 if (scriptcontrol->eventsProcessed == NULL) {
186#if defined(JS_THREADSAFE)
187 JS_BeginRequest(scriptcontrol->cx);
189 scriptcontrol->eventsProcessed = (
void *)JS_CompileScript(
192 "eventsProcessed()", strlen (
"eventsProcessed()"),
193 "compile eventsProcessed()", 1);
195 if (!JS_AddObjectRoot(scriptcontrol->cx,(JSSCRIPT**)(&scriptcontrol->eventsProcessed))) {
196 printf (
"can not add object root for compiled eventsProcessed() for script %d\n",counter);
199#if defined(JS_THREADSAFE)
200 JS_EndRequest(scriptcontrol->cx);
204#if defined(JS_THREADSAFE)
205 JS_BeginRequest(scriptcontrol->cx);
207 if (!JS_ExecuteScript( scriptcontrol->cx,
209 scriptcontrol->eventsProcessed, &retval)) {
211 printf (
"can not run eventsProcessed() for script %d thread %u\n",counter,(
unsigned int)pthread_self().x);
213 printf (
"can not run eventsProcessed() for script %d thread %p\n",counter,(
void *)pthread_self());
216#if defined(JS_THREADSAFE)
217 JS_EndRequest(scriptcontrol->cx);
228void sm_jsClearScriptControlEntries(
int num)
231 ScriptControl = getScriptControlIndex(num);
232 if (ScriptControl->eventsProcessed != NULL) {
234 if (ScriptControl->cx != NULL) {
235 JS_RemoveObjectRoot(ScriptControl->cx,(JSSCRIPT**)(&ScriptControl->eventsProcessed));
238 ScriptControl->eventsProcessed = NULL;
248#define MAX_RUNTIME_BYTES 0x4000000L
253#define STACK_CHUNK_SIZE 8192
255static int JSaddGlobalECMANativeProperty(
int num,
const char *name);
256static int JSaddGlobalAssignProperty(
int num,
const char *name,
const char *str);
291static char *DefaultScriptMethods =
"function initialize() {}; " \
292 " function shutdown() {}; " \
293 " function eventsProcessed() {}; " \
294 " TRUE=true; FALSE=false; " \
295 " function print(x) {Browser.print(x)}; " \
296 " function println(x) {Browser.println(x)}; " \
297 " function getName() {return Browser.getName()}; "\
298 " function getVersion() {return Browser.getVersion()}; "\
299 " function getCurrentSpeed() {return Browser.getCurrentSpeed()}; "\
300 " function getCurrentFrameRate() {return Browser.getCurrentFrameRate()}; "\
301 " function getWorldURL() {return Browser.getWorldURL()}; "\
302 " function replaceWorld(x) {Browser.replaceWorld(x)}; "\
303 " function loadURL(x,y) {Browser.loadURL(x,y)}; "\
304 " function setDescription(x) {Browser.setDescription(x)}; "\
305 " function createVrmlFromString(x) {Browser.createVrmlFromString(x)}; "\
306 " function createVrmlFromURL(x,y,z) {Browser.createVrmlFromURL(x,y,z)}; "\
307 " function createX3DFromString(x) {Browser.createX3DFromString(x)}; "\
308 " function createX3DFromURL(x,y,z) {Browser.createX3DFromURL(x,y,z)}; "\
309 " function addRoute(a,b,c,d) {Browser.addRoute(a,b,c,d)}; "\
310 " function deleteRoute(a,b,c,d) {Browser.deleteRoute(a,b,c,d)}; "\
311 " function _rename_function(obj,oldf,newf) {if(typeof obj[oldf] === 'function') {obj[newf]=obj[oldf]; delete obj[oldf];}}; "\
318 ppJScript p = (ppJScript)gglobal()->JScript.prv;
319 return p->runtime ? 1 : 0;
321void sm_JSDeleteScriptContext(
int num){
325 ScriptControl = getScriptControlIndex(num);
327 if (ScriptControl->eventsProcessed != NULL) {
328 JS_RemoveObjectRoot(ScriptControl->cx,(JSSCRIPT **)(&ScriptControl->eventsProcessed));
332 JS_DestroyContextMaybeGC(ScriptControl->cx);
338 ttglobal tg = gglobal();
339 ppJScript p = (ppJScript)tg->JScript.prv;
341 JS_DestroyRuntime(p->runtime);
347static struct keyname {
351{JSGC_MAX_BYTES,
"JSGC_MAX_BYTES"},
352{JSGC_MAX_MALLOC_BYTES,
"JSGC_MAX_MALLOC_BYTES"},
353{JSGC_BYTES,
"JSGC_BYTES"},
354{JSGC_NUMBER,
"JSGC_NUMBER"},
355{JSGC_MAX_CODE_CACHE_BYTES,
"JSGC_MAX_CODE_CACHE_BYTES"},
356{JSGC_MODE,
"JSGC_MODE"},
357{JSGC_UNUSED_CHUNKS,
"JSGC_UNUSED_CHUNKS"},
358{JSGC_TOTAL_CHUNKS,
"JSGC_TOTAL_CHUNKS"},
359{JSGC_SLICE_TIME_BUDGET,
"JSGC_SLICE_TIME_BUDGET"},
360{JSGC_MARK_STACK_LIMIT,
"JSGC_MARK_STACK_LIMIT"},
361{JSGC_HIGH_FREQUENCY_TIME_LIMIT,
"JSGC_HIGH_FREQUENCY_TIME_LIMIT"},
362{JSGC_HIGH_FREQUENCY_LOW_LIMIT,
"JSGC_HIGH_FREQUENCY_LOW_LIMIT"},
363{JSGC_HIGH_FREQUENCY_HIGH_LIMIT,
"JSGC_HIGH_FREQUENCY_HIGH_LIMIT"},
364{JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX,
"JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MAX"},
365{JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN,
"JSGC_HIGH_FREQUENCY_HEAP_GROWTH_MIN"},
366{JSGC_LOW_FREQUENCY_HEAP_GROWTH,
"JSGC_LOW_FREQUENCY_HEAP_GROWTH"},
367{JSGC_DYNAMIC_HEAP_GROWTH,
"JSGC_DYNAMIC_HEAP_GROWTH"},
368{JSGC_DYNAMIC_MARK_SLICE,
"JSGC_DYNAMIC_MARK_SLICE"},
369{JSGC_ANALYSIS_PURGE_TRIGGER,
"JSGC_ANALYSIS_PURGE_TRIGGER"},
374static struct keyname {
378{JSGC_MAX_BYTES,
"JSGC_MAX_BYTES"},
379{JSGC_MAX_MALLOC_BYTES,
"JSGC_MAX_MALLOC_BYTES"},
380{JSGC_STACKPOOL_LIFESPAN,
"JSGC_STACKPOOL_LIFESPAN"},
381{JSGC_TRIGGER_FACTOR,
"JSGC_TRIGGER_FACTOR"},
382{JSGC_BYTES,
"JSGC_BYTES"},
383{JSGC_NUMBER,
"JSGC_NUMBER"},
384{JSGC_MAX_CODE_CACHE_BYTES,
"JSGC_MAX_CODE_CACHE_BYTES"},
385{JSGC_MODE,
"JSGC_MODE"},
386{JSGC_UNUSED_CHUNKS,
"JSGC_UNUSED_CHUNKS"},
390const char *getgcparamname(
int key){
392 while(gcparamname[i].name != NULL){
393 if(gcparamname[i].
key ==
key){
394 return gcparamname[i].name;
411void sm_JSCreateScriptContext(
int num) {
414 JSObject *_globalObj;
416 ppJScript p = (ppJScript)gglobal()->JScript.prv;
419 ScriptControl = getScriptControlIndex(num);
422 if (p->runtime == NULL) {
423 p->runtime = JS_NewRuntime(MAX_RUNTIME_BYTES);
424 if (!p->runtime) freewrlDie(
"JS_NewRuntime failed");
425 #ifdef JAVASCRIPTVERBOSE
426 printf(
"\tJS runtime created,\n");
430 int iend = JS_VERSION == 185 ? 8 : JS_VERSION == 186 ? 19 : 0;
431 for(
unsigned int i=0; i<= iend; i++){
432 unsigned int gcparam = JS_GetGCParameter(p->runtime,i);
433 printf(
"%s = %u\n",getgcparamname(i),gcparam);
443 _context = JS_NewContext(p->runtime, STACK_CHUNK_SIZE);
444 if (!_context) freewrlDie(
"JS_NewContext failed");
445 JS_SetContextPrivate(_context, ScriptControl->script->ShaderScriptNode->_executionContext);
448 unsigned int opts = JS_GetOptions(_context);
449 printf(
"options %x\n",opts);
453 #ifdef JAVASCRIPTVERBOSE
454 printf(
"\tJS context created,\n");
457#if defined(JS_THREADSAFE)
458 JS_BeginRequest(_context);
465 #if JS_VERSION >= 185
466 if (num == 0 && JS_VERSION < 186) {
468 _globalObj = JS_NewCompartmentAndGlobalObject(_context, &p->globalClass, NULL);
472 JS_SetGlobalObject(_context,cs->glob);
473 _globalObj = JS_NewGlobalObjectFw(_context,&p->globalClass);
474 JS_SetGlobalObject(_context,_globalObj);
477 _globalObj = JS_NewObject(_context, &p->globalClass, NULL, NULL);
482#if defined(JS_THREADSAFE)
483 JS_EndRequest(_context);
485 if (!_globalObj) freewrlDie(
"JS_NewObject failed");
487 #ifdef JAVASCRIPTVERBOSE
488 printf(
"\tJS global object created,\n");
493#if defined(JS_THREADSAFE)
494 JS_BeginRequest(_context);
496 if (!JS_InitStandardClasses(_context, _globalObj))
497#if defined(JS_THREADSAFE)
498 { JS_EndRequest(_context);
500 freewrlDie(
"JS_InitStandardClasses failed");
501#if defined(JS_THREADSAFE)
503 JS_EndRequest(_context);
506 #ifdef JAVASCRIPTVERBOSE
507 printf(
"\tJS standard classes initialized,\n");
510 #ifdef JAVASCRIPTVERBOSE
514 JS_SetErrorReporter(_context, errorReporter);
516 #ifdef JAVASCRIPTVERBOSE
517 printf(
"\tJS error reporter set,\n");
520 br = (BrowserNative *) JS_malloc(_context,
sizeof(BrowserNative));
523 ScriptControl->cx = _context;
524 ScriptControl->glob = _globalObj;
526 JS_SetPrivateFw(_context,_globalObj,ScriptControl->script);
530#if defined(JS_THREADSAFE)
531 JS_BeginRequest(_context);
533 if (!loadVrmlClasses(_context, _globalObj))
534#if defined(JS_THREADSAFE)
535 { JS_EndRequest(_context);
537 freewrlDie(
"loadVrmlClasses failed");
538#if defined(JS_THREADSAFE)
540 JS_EndRequest(_context);
545 #ifdef JAVASCRIPTVERBOSE
546 printf(
"\tVRML classes loaded,\n");
549#if defined(JS_THREADSAFE)
550 JS_BeginRequest(_context);
552 if (!VrmlBrowserInit(_context, _globalObj, br))
553#if defined(JS_THREADSAFE)
554 { JS_EndRequest(_context);
556 freewrlDie(
"VrmlBrowserInit failed");
557#if defined(JS_THREADSAFE)
559 JS_EndRequest(_context);
563 #ifdef JAVASCRIPTVERBOSE
564 printf(
"\tVRML Browser interface loaded,\n");
568 if (!ACTUALRUNSCRIPT(num,DefaultScriptMethods,&rval))
569 cleanupDie(num,
"runScript failed in VRML::newJS DefaultScriptMethods");
572 CRoutes_js_new (num, JAVASCRIPT);
574 #ifdef JAVASCRIPTVERBOSE
575 printf(
"\tVRML browser initialized, thread %u\n",pthread_self());
578int getJsEngineVariant();
580 return getJsEngineVariant() == 2? 2 : 0;
586#ifdef JAVASCRIPTVERBOSE
587int ActualrunScript(
int num,
char *script, jsval *rval,
char *fn,
int line) {
589int ActualrunScript(
int num,
char *script, jsval *rval) {
593 JSObject *_globalObj;
596 ScriptControl = getScriptControlIndex(num);
598 _context = (JSContext*)ScriptControl->cx;
599 _globalObj = (JSObject*)ScriptControl->glob;
601 #ifdef JAVASCRIPTVERBOSE
602 printf(
"ActualrunScript script called at %s:%d num: %d cx %p \"%s\", \n",
603 fn, line, num, _context, script);
606#if defined(JS_THREADSAFE)
607 JS_BeginRequest(_context);
610 js_cleanup_script_context(num);
611#if defined(JS_THREADSAFE)
612 JS_EndRequest(_context);
615 len = (int) strlen(script);
616#if defined(JS_THREADSAFE)
617 JS_BeginRequest(_context);
619 if (!JS_EvaluateScript(_context, _globalObj, script, len, FNAME_STUB, LINENO_STUB, rval)) {
620 printf (
"ActualrunScript - JS_EvaluateScript failed for %s", script);
622 ConsoleMessage (
"ActualrunScript - JS_EvaluateScript failed for %s", script);
623#if defined(JS_THREADSAFE)
624 JS_EndRequest(_context);
627#if defined(JS_THREADSAFE)
629 JS_EndRequest(_context);
632 #ifdef JAVASCRIPTVERBOSE
633 printf (
"runscript passed\n");
639int sm_jsActualrunScript(
int num,
char *script) {
641 return ACTUALRUNSCRIPT(num,script,&rval);
645int jsrrunScript(JSContext *_context, JSObject *_globalObj,
char *script, jsval *rval) {
649 #ifdef JAVASCRIPTVERBOSE
650 printf(
"jsrrunScript script cx %p \"%s\", \n",
654 len = (int) strlen(script);
655#if defined(JS_THREADSAFE)
656 JS_BeginRequest(_context);
658 if (!JS_EvaluateScript(_context, _globalObj, script, len,
659 FNAME_STUB, LINENO_STUB, rval)) {
660 ConsoleMessage (
"jsrunScript - JS_EvaluateScript failed for %s", script);
661#if defined(JS_THREADSAFE)
662 JS_EndRequest(_context);
665#if defined(JS_THREADSAFE)
667 JS_EndRequest(_context);
671 #ifdef JAVASCRIPTVERBOSE
672 printf (
"runscript passed\n");
680int sizeofSForMF(
int itype);
681void *AnyNativeNew(
int type,
union anyVrml* source,
int *valueChanged){
683 ptr = MALLOC(AnyNative *,
sizeof(AnyNative));
684 memset(ptr,0,
sizeof(AnyNative));
686 ptr->valueChanged = valueChanged;
690 ptr->v = MALLOC(
void *,sizeofSForMF(type));
691 memset(ptr->v,0,sizeofSForMF(type));
696void shallow_copy_field(
int typeIndex,
union anyVrml* source,
union anyVrml* dest);
697void AnyNativeAssign(
void *top,
void *fromp)
700 AnyNative *to = (AnyNative *)top;
701 AnyNative *from = (AnyNative *)fromp;
702 if(to->type == from->type){
704 (*to->valueChanged) ++;
707 shallow_copy_field(from->type,from->v,to->v);
712void *SFNodeNativeNew()
715 ptr = MALLOC(SFNodeNative *,
sizeof(*ptr));
720 ptr->valueChanged = 0;
721 if(SM_method() == 0){
722 ptr->X3DString = NULL;
723 ptr->fieldsExpanded = FALSE;
729int SFNodeNativeAssign(
void *top,
void *fromp)
731 SFNodeNative *to = (SFNodeNative *)top;
732 SFNodeNative *from = (SFNodeNative *)fromp;
738 to->handle = from->handle;
740 to->X3DString = STRDUP(from->X3DString);
742 #ifdef JAVASCRIPTVERBOSE
743 printf (
"SFNodeNativeAssign, copied %p to %p, handle %p, string %s\n", from, to, to->handle, to->X3DString);
748 to->X3DString = STRDUP(
"from a NULL assignment");
754int SFNodeNativeEquals(
void *top,
void *fromp)
757 SFNodeNative *to = (SFNodeNative *)top;
758 SFNodeNative *from = (SFNodeNative *)fromp;
763 if(to->handle == from->handle)
770void *SFColorRGBANativeNew()
772 SFColorRGBANative *ptr;
773 ptr = MALLOC(SFColorRGBANative *,
sizeof(*ptr));
774 ptr->valueChanged = 0;
778void SFColorRGBANativeAssign(
void *top,
void *fromp)
780 SFColorRGBANative *to = (SFColorRGBANative *)top;
781 SFColorRGBANative *from = (SFColorRGBANative *)fromp;
786void *SFColorNativeNew()
789 ptr = MALLOC(SFColorNative *,
sizeof(*ptr));
790 ptr->valueChanged = 0;
794void SFColorNativeAssign(
void *top,
void *fromp)
796 SFColorNative *to = (SFColorNative *)top;
797 SFColorNative *from = (SFColorNative *)fromp;
802void *SFImageNativeNew()
805 ptr =MALLOC(SFImageNative *,
sizeof(*ptr));
806 ptr->valueChanged = 0;
810void SFImageNativeAssign(
void *top,
void *fromp)
812 SFImageNative *to = (SFImageNative *)top;
820void *SFRotationNativeNew()
822 SFRotationNative *ptr;
823 ptr = MALLOC(SFRotationNative *,
sizeof(*ptr));
824 ptr->valueChanged = 0;
828void SFRotationNativeAssign(
void *top,
void *fromp)
830 SFRotationNative *to = (SFRotationNative *)top;
831 SFRotationNative *from = (SFRotationNative *)fromp;
836void *SFVec2fNativeNew()
839 ptr = MALLOC(SFVec2fNative *,
sizeof(*ptr));
840 ptr->valueChanged = 0;
844void SFVec2fNativeAssign(
void *top,
void *fromp)
846 SFVec2fNative *to = (SFVec2fNative *)top;
847 SFVec2fNative *from = (SFVec2fNative *)fromp;
852void *SFVec3fNativeNew() {
854 ptr = MALLOC(SFVec3fNative *,
sizeof(*ptr));
855 ptr->valueChanged = 0;
859void SFVec3fNativeAssign(
void *top,
void *fromp) {
860 SFVec3fNative *to = (SFVec3fNative *)top;
861 SFVec3fNative *from = (SFVec3fNative *)fromp;
866void *SFVec3dNativeNew() {
868 ptr = MALLOC(SFVec3dNative *,
sizeof(*ptr));
869 ptr->valueChanged = 0;
873void SFVec3dNativeAssign(
void *top,
void *fromp) {
874 SFVec3dNative *to = (SFVec3dNative *)top;
875 SFVec3dNative *from = (SFVec3dNative *)fromp;
880void *SFVec4fNativeNew() {
882 ptr = MALLOC(SFVec4fNative *,
sizeof(*ptr));
883 ptr->valueChanged = 0;
887void SFVec4fNativeAssign(
void *top,
void *fromp) {
888 SFVec4fNative *to = (SFVec4fNative *)top;
889 SFVec4fNative *from = (SFVec4fNative *)fromp;
894void *SFVec4dNativeNew() {
896 ptr = MALLOC(SFVec4dNative *,
sizeof(*ptr));
897 ptr->valueChanged = 0;
901void SFVec4dNativeAssign(
void *top,
void *fromp) {
902 SFVec4dNative *to = (SFVec4dNative *)top;
903 SFVec4dNative *from = (SFVec4dNative *)fromp;
910static char* re_strcat(
char *_Dest,
char *_Source,
int *destLen,
int *destDim)
931 int srclen = (int) strlen(_Source);
932 *destLen = *destLen + srclen;
933 if(*destLen > *destDim -1)
935 *destDim = *destDim + srclen + 1 + 100;
936 _Dest = REALLOC(_Dest,*destDim);
938 _Dest = strcat(_Dest,_Source);
951void InitScriptField(
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
953 char *smallfield = NULL;
961 int rowCount, eleCount;
970 float defaultFloat[] = {0.0f,0.0f,0.0f,0.0f};
971 int defaultInt[] = {0,0,0,0};
972 double defaultDouble[] = {0.0, 0.0, 0.0, 0.0};
974 struct X3D_Node *defaultVoid[] = {NULL,NULL};
977 #ifdef JAVASCRIPTVERBOSE
978 printf (
"calling InitScriptField from thread %u\n",pthread_self());
979 printf (
"\nInitScriptField, num %d, kind %s type %s field %s value %d\n", num,PROTOKEYWORDS[kind],FIELDTYPES[type],field,value);
982 if ((kind != PKW_inputOnly) && (kind != PKW_outputOnly) && (kind != PKW_initializeOnly) && (kind != PKW_inputOutput)) {
983 ConsoleMessage (
"InitScriptField: invalid kind for script: %d\n",kind);
987 if (type >= FIELDTYPES_COUNT) {
988 ConsoleMessage (
"InitScriptField: invalid type for script: %d\n",type);
991 ScriptControl = getScriptControlIndex(num);
998 if (kind == PKW_inputOutput) {
1004 cx = (JSContext*)ScriptControl->cx;
1005 obj = (JSObject*)ScriptControl->glob;
1007 if (JS_GetProperty(cx,obj,field,&retval)){
1008 if (JSVAL_IS_OBJECT(retval)){
1010 char runstring[STRING_SIZE];
1012 sprintf(runstring,
"_rename_function(this,'%s','set_%s');",field,field);
1014 #if defined(JS_THREADSAFE)
1015 JS_BeginRequest(cx);
1017 if(!JS_EvaluateScript(cx,obj, runstring, (
int) strlen(runstring), FNAME_STUB, LINENO_STUB, &retval)){
1018 printf(
"sorry couldn't rename function: %s",runstring);
1020 #if defined(JS_THREADSAFE)
1025 strcpy(mynewname,field);
1027 }
else strcpy(mynewname,field);
1032 case FIELDTYPE_SFBool:
1033 case FIELDTYPE_SFFloat:
1034 case FIELDTYPE_SFTime:
1035 case FIELDTYPE_SFDouble:
1036 case FIELDTYPE_SFInt32:
1037 case FIELDTYPE_SFString: {
1039 if (kind != PKW_inputOnly) {
1040 JSaddGlobalECMANativeProperty(num, field);
1041 if (kind == PKW_initializeOnly || kind == PKW_inputOutput) {
1042 if (type == FIELDTYPE_SFString) {
1043 tlen = (int) strlen(value.sfstring->strptr) + strlen(field) + 20;
1045 tlen = (int) strlen(field) + 400;
1047 smallfield = MALLOC (
char *, tlen);
1048 smallfield[0] =
'\0';
1051 case FIELDTYPE_SFFloat: sprintf (smallfield,
"%s=%f\n",field,value.sffloat);
break;
1052 case FIELDTYPE_SFTime: sprintf (smallfield,
"%s=%f\n",field,value.sftime);
break;
1053 case FIELDTYPE_SFDouble: sprintf (smallfield,
"%s=%f\n",field,value.sftime);
break;
1054 case FIELDTYPE_SFInt32: sprintf (smallfield,
"%s=%d\n",field,value.sfint32);
break;
1055 case FIELDTYPE_SFBool:
1056 if (value.sfbool == 1) sprintf (smallfield,
"%s=true",field);
1057 else sprintf (smallfield,
"%s=false",field);
1059 case FIELDTYPE_SFString:
1060 sprintf (smallfield,
"%s=\"%s\"\n",field,value.sfstring->strptr);
break;
1063 if (!ACTUALRUNSCRIPT(num,smallfield,&rval))
1064 printf (
"huh??? Field initialization script failed %s\n",smallfield);
1076 case FIELDTYPE_MFString:
1077 case FIELDTYPE_MFTime:
1078 case FIELDTYPE_MFBool:
1079 case FIELDTYPE_MFInt32:
1080 case FIELDTYPE_MFFloat:
1081 JSaddGlobalECMANativeProperty(num, field);
1082 MFhasECMAtype = TRUE;
1085 MFhasECMAtype = FALSE;
1095 if (kind == PKW_initializeOnly || kind == PKW_inputOutput) {
1100 case FIELDTYPE_SFNode:
1101 VoidPtr = (
struct X3D_Node **) (&(value.sfnode)); elements = 1;
1103 case FIELDTYPE_MFColor:
1104 FloatPtr = (
float *) value.mfcolor.p; elements = value.mfcolor.n;
1106 case FIELDTYPE_MFColorRGBA:
1107 FloatPtr = (
float *) value.mfcolorrgba.p; elements = value.mfcolorrgba.n;
1109 case FIELDTYPE_MFVec2f:
1110 FloatPtr = (
float *) value.mfvec2f.p; elements = value.mfvec2f.n;
1112 case FIELDTYPE_MFVec3f:
1113 FloatPtr = (
float *) value.mfvec3f.p; elements = value.mfvec3f.n;
1115 case FIELDTYPE_MFRotation:
1116 FloatPtr = (
float *) value.mfrotation.p; elements = value.mfrotation.n;
1118 case FIELDTYPE_SFVec2f:
1119 FloatPtr = (
float *) value.sfvec2f.c; elements = 1;
1121 case FIELDTYPE_SFColor:
1122 FloatPtr = value.sfcolor.c; elements = 1;
1124 case FIELDTYPE_SFColorRGBA:
1125 FloatPtr = value.sfcolorrgba.c; elements = 1;
1127 case FIELDTYPE_SFRotation:
1128 FloatPtr = value.sfrotation.c; elements = 1;
1130 case FIELDTYPE_SFVec3f:
1131 FloatPtr = value.sfvec3f.c; elements =1;
1133 case FIELDTYPE_SFVec3d:
1134 DoublePtr = value.sfvec3d.c; elements =1;
1136 case FIELDTYPE_MFString:
1137 SVPtr = value.mfstring.p; elements = value.mfstring.n;
1139 case FIELDTYPE_MFTime:
1140 DoublePtr = value.mftime.p; elements = value.mftime.n;
1142 case FIELDTYPE_MFBool:
1143 IntPtr = value.mfbool.p; elements = value.mfbool.n;
1145 case FIELDTYPE_SFImage:
1146 case FIELDTYPE_MFInt32:
1147 IntPtr = value.mfint32.p; elements = value.mfint32.n;
1149 case FIELDTYPE_MFNode:
1150 VoidPtr = (
struct X3D_Node **)(value.mfnode.p); elements = value.mfnode.n;
1152 case FIELDTYPE_MFFloat:
1153 FloatPtr = value.mffloat.p; elements = value.mffloat.n;
1155 case FIELDTYPE_SFVec4f:
1156 FloatPtr = value.sfvec4f.c; elements = 1;
1158 case FIELDTYPE_SFVec4d:
1159 DoublePtr = value.sfvec4d.c; elements = 1;
1163 printf (
"unhandled type, in InitScriptField %d\n",type);
1173 case FIELDTYPE_SFNode:
1174 case FIELDTYPE_MFNode:
1175 VoidPtr = (
struct X3D_Node **) &defaultVoid;
1179 case FIELDTYPE_MFColor:
1180 case FIELDTYPE_MFColorRGBA:
1181 case FIELDTYPE_MFVec2f:
1182 case FIELDTYPE_MFVec3f:
1183 case FIELDTYPE_MFRotation:
1184 case FIELDTYPE_SFVec2f:
1185 case FIELDTYPE_SFColor:
1186 case FIELDTYPE_SFColorRGBA:
1187 case FIELDTYPE_SFRotation:
1188 case FIELDTYPE_SFVec3f:
1189 case FIELDTYPE_SFVec4f:
1190 case FIELDTYPE_MFFloat:
1191 FloatPtr = defaultFloat;
1195 case FIELDTYPE_MFBool:
1196 case FIELDTYPE_MFInt32:
1197 IntPtr = defaultInt;
1201 case FIELDTYPE_SFString:
1202 case FIELDTYPE_MFString:
1203 sptr[0] = newASCIIString(
"");
1208 case FIELDTYPE_SFImage:
1209 IntPtr = defaultInt;
1213 case FIELDTYPE_SFVec2d:
1214 case FIELDTYPE_SFVec3d:
1215 case FIELDTYPE_MFTime:
1216 case FIELDTYPE_SFTime:
1217 case FIELDTYPE_SFDouble:
1218 case FIELDTYPE_SFVec4d:
1219 DoublePtr = defaultDouble;
1223 printf (
"unhandled type, in InitScriptField part 2 %d\n",type);
1230 rows = returnElementRowSize (type);
1232 #ifdef JAVASCRIPTVERBOSE
1233 printf (
"in fieldSet, we have ElementRowSize %d and individual elements %d\n",rows,elements);
1260 int dstlen, dstdim, tdim;
1262 thisValue = MALLOC(
char *, tdim+1);
1263 dstdim = (rows+1)*(elements*15) + 100;
1265 smallfield = MALLOC (
char *, dstdim+1);
1267 if (type != convertToSFType(type)) haveMulti = TRUE;
1268 else haveMulti = FALSE;
1271 sftype = STRDUP((
char *)FIELDTYPES[convertToSFType(type)]);
1274 if (strncmp(sftype,
"SFString",8)==0) strcpy (sftype,
"String");
1278 smallfield[0] =
'\0';
1282 smallfield = re_strcat(smallfield,
"new ",&dstlen,&dstdim);
1283 smallfield = re_strcat(smallfield, (
char *)FIELDTYPES[type],&dstlen,&dstdim);
1284 smallfield = re_strcat(smallfield,
"(",&dstlen,&dstdim);
1288 for (eleCount=0; eleCount<elements; eleCount++) {
1290 if (!MFhasECMAtype) {
1291 smallfield = re_strcat(smallfield,
"new ",&dstlen,&dstdim);
1292 smallfield = re_strcat(smallfield, sftype,&dstlen,&dstdim);
1293 smallfield = re_strcat(smallfield,
"(",&dstlen,&dstdim);
1297 for (rowCount=0; rowCount<rows; rowCount++ ) {
1298 if (IntPtr != NULL) {
1299 sprintf (thisValue,
"%d",*IntPtr); IntPtr++;
1300 }
else if (FloatPtr != NULL) {
1301 sprintf (thisValue,
"%f",*FloatPtr); FloatPtr++;
1302 }
else if (DoublePtr != NULL) {
1303 sprintf (thisValue,
"%f",*DoublePtr); DoublePtr++;
1304 }
else if (SVPtr != NULL) {
1305 sptr[0] = *SVPtr; SVPtr++;
1306 if((
int)strlen(sptr[0]->strptr)+2 > tdim-1)
1308 tdim = (int) strlen(sptr[0]->strptr) + 1 + 100;
1309 thisValue = REALLOC(thisValue,tdim);
1311 sprintf (thisValue,
"\"%s\"",sptr[0]->strptr);
1315 sprintf (thisValue,
"\"%p\"", VoidPtr[0]); VoidPtr++;
1317 smallfield = re_strcat(smallfield, thisValue,&dstlen,&dstdim);
1318 if (rowCount < (rows-1)) smallfield = re_strcat(smallfield,
",",&dstlen,&dstdim);
1321 if (!MFhasECMAtype) smallfield = re_strcat(smallfield,
")",&dstlen,&dstdim);
1322 if (eleCount < (elements-1)) smallfield = re_strcat(smallfield,
",",&dstlen,&dstdim);
1328 smallfield = re_strcat(smallfield,
")",&dstlen,&dstdim);
1331 FREE_IF_NZ (thisValue);
1334 #ifdef JAVASCRIPTVERBOSE
1335 printf (
"JScript, for non-ECMA newname %s, sending :%s:\n",mynewname,smallfield);
1338 JSaddGlobalAssignProperty (num,mynewname,smallfield);
1345 if (kind == PKW_outputOnly) {
1352 fptr = JSparamIndex (field, FIELDTYPES[type],kind);
1355 touched = get_valueChanged_flag (fptr, num);
1358 resetScriptTouchedFlag(num, fptr);
1360 ScriptControl = getScriptControlIndex(num);
1361#if defined(JS_THREADSAFE)
1362 JS_BeginRequest(ScriptControl->cx);
1365 js_cleanup_script_context(num);
1366#if defined(JS_THREADSAFE)
1367 JS_EndRequest(ScriptControl->cx);
1370 FREE_IF_NZ (smallfield);
1371 FREE_IF_NZ (sftype);
1373 #ifdef JAVASCRIPTVERBOSE
1374 printf (
"finished InitScriptField\n");
1378void InitScriptFieldB(
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
1383 #ifdef JAVASCRIPTVERBOSE
1384 printf (
"calling InitScriptField from thread %u\n",pthread_self());
1385 printf (
"\nInitScriptField, num %d, kind %s type %s field %s value %d\n", num,PROTOKEYWORDS[kind],FIELDTYPES[type],field,value);
1388 if ((kind != PKW_inputOnly) && (kind != PKW_outputOnly) && (kind != PKW_initializeOnly) && (kind != PKW_inputOutput)) {
1389 ConsoleMessage (
"InitScriptField: invalid kind for script: %d\n",kind);
1393 ScriptControl = getScriptControlIndex(num);
1403 if( kind == PKW_inputOutput) {
1407 cx = (JSContext*)ScriptControl->cx;
1408 obj = (JSObject*)ScriptControl->glob;
1410 if (JS_GetProperty(cx,obj,field,&retval)){
1411 if (JSVAL_IS_OBJECT(retval)){
1413 char runstring[STRING_SIZE];
1415 sprintf(runstring,
"_rename_function(this,'%s','set_%s');",field,field);
1417 #if defined(JS_THREADSAFE)
1418 JS_BeginRequest(cx);
1420 if(!JS_EvaluateScript(cx,obj, runstring, (
int) strlen(runstring), FNAME_STUB, LINENO_STUB, &retval)){
1421 printf(
"sorry couldn't rename function: %s",runstring);
1423 #if defined(JS_THREADSAFE)
1433 JSaddGlobalECMANativeProperty(num, field);
1438static int JSaddGlobalECMANativeProperty(
int num,
const char *name) {
1439 JSContext *_context;
1440 JSObject *_globalObj;
1441 jsval rval = INT_TO_JSVAL(0);
1444 ScriptControl = getScriptControlIndex(num);
1446 _context = (JSContext*)ScriptControl->cx;
1447 _globalObj = (JSObject*)ScriptControl->glob;
1449 #ifdef JAVASCRIPTVERBOSE
1450 printf(
"addGlobalECMANativeProperty: name \"%s\"\n", name);
1453#if defined(JS_THREADSAFE)
1454 JS_BeginRequest(_context);
1461 if (!JS_DefineProperty(_context, _globalObj, name, rval, getECMANative, setECMANative,
1464 0 | JSPROP_PERMANENT
1469 printf(
"JS_DefineProperty failed for \"%s\" in addGlobalECMANativeProperty.\n", name);
1470#if defined(JS_THREADSAFE)
1471 JS_EndRequest(_context);
1474#if defined(JS_THREADSAFE)
1476 JS_EndRequest(_context);
1483static int JSaddGlobalAssignProperty(
int num,
const char *name,
const char *str) {
1484 jsval _rval = INT_TO_JSVAL(0);
1485 JSContext *_context;
1486 JSObject *_globalObj;
1489 ScriptControl = getScriptControlIndex(num);
1492 _context = (JSContext*)ScriptControl->cx;
1493 _globalObj = (JSObject*)ScriptControl->glob;
1495 #ifdef JAVASCRIPTVERBOSE
1496 printf(
"addGlobalAssignProperty: cx: %p obj %p name \"%s\", evaluate script \"%s\"\n",
1497 _context, _globalObj, name, str);
1500#if defined(JS_THREADSAFE)
1501 JS_BeginRequest(_context);
1503 if (!JS_EvaluateScript(_context, _globalObj, str, (
int) strlen(str), FNAME_STUB, LINENO_STUB, &_rval)) {
1504 ConsoleMessage (
"JSaddGlobalAssignProperty - JS_EvaluateScript failed for %s", str);
1505#if defined(JS_THREADSAFE)
1506 JS_EndRequest(_context);
1509#if defined(JS_THREADSAFE)
1511 JS_EndRequest(_context);
1514#if defined(JS_THREADSAFE)
1515 JS_BeginRequest(_context);
1517 if (!JS_DefineProperty(_context, _globalObj, name, _rval, getAssignProperty, setAssignProperty, 0 | JSPROP_PERMANENT)) {
1518 printf(
"JS_DefineProperty failed for \"%s\" in addGlobalAssignProperty.\n", name);
1519#if defined(JS_THREADSAFE)
1520 JS_EndRequest(_context);
1523#if defined(JS_THREADSAFE)
1525 JS_EndRequest(_context);
1534#if defined(JS_THREADSAFE)
1535# define JSBEGINREQUEST_SUBSTITUTION(mycx) JS_BeginRequest(mycx);
1536# define JSENDREQUEST_SUBSTITUTION(mycx) JS_EndRequest(mycx);
1538# define JSBEGINREQUEST_SUBSTITUTION(mycx)
1539# define JSENDREQUEST_SUBSTITUTION(mycx)
1544#define GETJSPTR_TYPE_A(thistype) \
1545 case FIELDTYPE_##thistype: { \
1546 thistype##Native *ptr; \
1548 if ((ptr = (thistype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(*(jsval *)(tg->JScript.JSglobal_return_val)))) == NULL) { \
1549 printf( "JS_GetPrivate failed in get_valueChanged_flag\n"); \
1550 JSENDREQUEST_SUBSTITUTION(cx) \
1554 tg->CRoutes.JSSFpointer = (void *)ptr; \
1555 touched = ptr->valueChanged; \
1559#define RESET_TOUCHED_TYPE_A(thistype) \
1560 case FIELDTYPE_##thistype: { \
1561 ((thistype##Native *)tg->CRoutes.JSSFpointer)->valueChanged = 0; \
1565#define GETJSPTR_TYPE_MF_A(thisMFtype,thisSFtype) \
1566 case FIELDTYPE_##thisMFtype: { \
1567 thisSFtype##Native *ptr; \
1568 jsval mainElement; \
1571 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval *)(tg->JScript.JSglobal_return_val)), "length", &mainElement)) { \
1572 printf ("JS_GetProperty failed for \"length\" in get_valueChanged_flag\n"); \
1573 JSENDREQUEST_SUBSTITUTION(cx) \
1576 len = JSVAL_TO_INT(mainElement); \
1578 for (i = 0; i < len; i++) { \
1579 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), i, &mainElement)) { \
1580 printf ("JS_GetElement failed for %d in get_valueChanged_flag\n",i); \
1581 JSENDREQUEST_SUBSTITUTION(cx) \
1584 if ((ptr = (thisSFtype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) { \
1585 printf( "JS_GetPrivate failed for obj in setField_javascriptEventOut.\n"); \
1586 JSENDREQUEST_SUBSTITUTION(cx) \
1589 if (ptr->valueChanged > 0) touched = TRUE; \
1595#define RESET_TOUCHED_TYPE_MF_A(thisMFtype,thisSFtype) \
1596 case FIELDTYPE_##thisMFtype: { \
1597 thisSFtype##Native *ptr; \
1598 jsval mainElement; \
1602 cx = scriptcontrol->cx; \
1603 JSBEGINREQUEST_SUBSTITUTION(cx) \
1604 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "length", &mainElement)) { \
1605 printf ("JS_GetProperty failed for \"length\" in get_valueChanged_flag\n"); \
1606 JSENDREQUEST_SUBSTITUTION(cx) \
1609 len = JSVAL_TO_INT(mainElement); \
1611 for (i = 0; i < len; i++) { \
1612 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), i, &mainElement)) { \
1613 printf ("JS_GetElement failed for %d in get_valueChanged_flag\n",i); \
1614 JSENDREQUEST_SUBSTITUTION(cx) \
1617 if ((ptr = (thisSFtype##Native *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) { \
1618 printf( "JS_GetPrivate failed for obj in setField_javascriptEventOut.\n"); \
1619 JSENDREQUEST_SUBSTITUTION(cx) \
1622 ptr->valueChanged = 0; \
1624 JSENDREQUEST_SUBSTITUTION(cx) \
1632OLDCODE #define savedBool Bool
1640#define GET_ECMA_TOUCHED(thistype) \
1641 case FIELDTYPE_SF##thistype: { \
1642 touched = findNameInECMATable( scriptcontrol->cx,fullname);\
1646#define GET_ECMA_MF_TOUCHED(thistype) \
1647 case FIELDTYPE_MF##thistype: {\
1648 jsval mainElement; \
1650 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "MF_ECMA_has_changed", &mainElement)) { \
1651 printf ("JS_GetProperty failed for \"MF_ECMA_HAS_changed\" in get_valueChanged_flag\n"); \
1653 touched = JSVAL_TO_INT(mainElement);\
1657#define RESET_ECMA_MF_TOUCHED(thistype) \
1658 case FIELDTYPE_##thistype: {\
1659 jsval myv = INT_TO_JSVAL(0); \
1661 JSBEGINREQUEST_SUBSTITUTION(scriptcontrol->cx) \
1662 if (!JS_SetProperty(scriptcontrol->cx, JSVAL_TO_OBJECT(*(jsval*)(tg->JScript.JSglobal_return_val)), "MF_ECMA_has_changed", &myv)) { \
1663 printf( "JS_SetProperty failed for \"MF_ECMA_has_changed\" in RESET_ECMA_MF_TOUCHED.\n"); \
1669 JSENDREQUEST_SUBSTITUTION(scriptcontrol->cx) \
1673#define RESET_TOUCHED_TYPE_ECMA(thistype) \
1674 case FIELDTYPE_##thistype: { \
1675 JSBEGINREQUEST_SUBSTITUTION(scriptcontrol->cx) \
1676 resetNameInECMATable( scriptcontrol->cx,JSparamnames[fptr].name); \
1677 JSENDREQUEST_SUBSTITUTION(scriptcontrol->cx) \
1683OLDCODE #define Bool savedBool
1735int sm1_get_valueChanged_flag (
int fptr,
int actualscript) {
1740 JSObject *interpobj;
1744 ttglobal tg = gglobal();
1749 scriptcontrol = getScriptControlIndex(actualscript);
1750 interpobj = (JSObject*)scriptcontrol->glob;
1751 cx = (JSContext*)scriptcontrol->cx;
1752 fullname = JSparamnames[fptr].name;
1754#if defined(JS_THREADSAFE)
1755 JS_BeginRequest(cx);
1758 printf (
"\ngetting property for fullname %s, cx %p, interpobj %d script %d, fptr %d (%s:%s)\n",
1759 fullname,cx,interpobj,actualscript, fptr,
1760 JSparamnames[fptr].name, FIELDTYPES[JSparamnames[fptr].type]);
1763 if (!JS_GetProperty(cx, interpobj ,fullname,tg->JScript.JSglobal_return_val)) {
1764 printf (
"cant get property for %s\n",fullname);
1765#if defined(JS_THREADSAFE)
1771 printf (
"so, property is %d (%p)\n",*(jsval*)tg->JScript.JSglobal_return_val,*(jsval *)tg->JScript.JSglobal_return_val);
1772 printf(
"get_valueChanged_flag: node type: %s name %s\n",FIELDTYPES[JSparamnames[fptr].type],JSparamnames[fptr].name);
1775 switch (JSparamnames[fptr].type) {
1777 GETJSPTR_TYPE_A(SFNode)
1789 GETJSPTR_TYPE_MF_A(MFNode,SFNode)
1790 GETJSPTR_TYPE_MF_A(MFVec2f,
SFVec2f)
1791 GETJSPTR_TYPE_MF_A(MFVec3f,
SFVec3f)
1792 GETJSPTR_TYPE_MF_A(MFVec4f,
SFVec4f)
1793 GETJSPTR_TYPE_MF_A(MFVec4d,
SFVec4d)
1795 GETJSPTR_TYPE_MF_A(MFColor,
SFColor)
1798 GET_ECMA_MF_TOUCHED(Int32)
1799 GET_ECMA_MF_TOUCHED(Bool)
1800 GET_ECMA_MF_TOUCHED(Time)
1801 GET_ECMA_MF_TOUCHED(Double)
1802 GET_ECMA_MF_TOUCHED(Float)
1803 GET_ECMA_MF_TOUCHED(String)
1805 GET_ECMA_TOUCHED(Int32)
1806 GET_ECMA_TOUCHED(Bool)
1807 GET_ECMA_TOUCHED(Float)
1808 GET_ECMA_TOUCHED(Time)
1809 GET_ECMA_TOUCHED(Double)
1810 GET_ECMA_TOUCHED(String)
1812 default: {printf (
"not handled yet in get_valueChanged_flag %s\n",FIELDTYPES[JSparamnames[fptr].type]);
1815#if defined(JS_THREADSAFE)
1821 if (JSparamnames[fptr].type == FIELDTYPE_MFString) {
1826 unsigned CRCCheck = 0;
1827 cx = p->ScriptControl[actualscript].cx;
1828#if defined(JS_THREADSAFE)
1829 JS_BeginRequest(cx);
1831 if (!JS_GetProperty(cx, JSglobal_return_val,
"length", &mainElement)) {
1832 printf (
"JS_GetProperty failed for length_flag\n");
1834 len = JSVAL_TO_INT(mainElement);
1836 for (i = 0; i < len; i++) {
1837 if (!JS_GetElement(cx, JSglobal_return_val, i, &mainElement)) {
1838 printf (
"JS_GetElement failed for %d in get_valueChanged_flag\n",i);
1841 CRCCheck += (unsigned) mainElement;
1852 printf (
"CRCcheck %u\n",CRCCheck);
1853#if defined(JS_THREADSAFE)
1867void sm1_resetScriptTouchedFlag(
int actualscript,
int fptr) {
1870 ttglobal tg = gglobal();
1874 printf (
"resetScriptTouchedFlag, name %s type %s script %d, fptr %d\n",JSparamnames[fptr].name, stringFieldtypeType(JSparamnames[fptr].type), actualscript, fptr);
1876 scriptcontrol = getScriptControlIndex(actualscript);
1877 switch (JSparamnames[fptr].type) {
1879 RESET_TOUCHED_TYPE_A(SFNode)
1889 RESET_TOUCHED_TYPE_MF_A(MFRotation,
SFRotation)
1890 RESET_TOUCHED_TYPE_MF_A(MFNode,SFNode)
1891 RESET_TOUCHED_TYPE_MF_A(MFVec2f,
SFVec2f)
1892 RESET_TOUCHED_TYPE_MF_A(MFVec3f,
SFVec3f)
1893 RESET_TOUCHED_TYPE_MF_A(MFVec4f,
SFVec4f)
1894 RESET_TOUCHED_TYPE_MF_A(MFVec4d,
SFVec4d)
1896 RESET_TOUCHED_TYPE_MF_A(MFColor,
SFColor)
1899 RESET_TOUCHED_TYPE_ECMA (SFInt32)
1900 RESET_TOUCHED_TYPE_ECMA (SFBool)
1901 RESET_TOUCHED_TYPE_ECMA (SFFloat)
1902 RESET_TOUCHED_TYPE_ECMA (SFTime)
1903 RESET_TOUCHED_TYPE_ECMA (SFDouble)
1904 RESET_TOUCHED_TYPE_ECMA (SFString)
1905 RESET_ECMA_MF_TOUCHED(MFInt32)
1906 RESET_ECMA_MF_TOUCHED(MFBool)
1907 RESET_ECMA_MF_TOUCHED(MFFloat)
1908 RESET_ECMA_MF_TOUCHED(MFTime)
1909 RESET_ECMA_MF_TOUCHED(MFString)
1912 default: {printf (
"can not reset touched_flag for %s\n",stringFieldtypeType(JSparamnames[fptr].type));
1918int sm2_get_valueChanged_flag (
int fptr,
int actualscript){
1921 int type, kind, ifield, found;
1928 scriptcontrol = getScriptControlIndex(actualscript);
1929 script = scriptcontrol->script;
1930 node = script->ShaderScriptNode;
1931 fullname = JSparamnames[fptr].name;
1932 found = getFieldFromNodeAndName(node,fullname,&type,&kind,&ifield,&value);
1934 field = Shader_Script_getScriptField(script, ifield);
1935 gglobal()->JScript.JSglobal_return_val = (
void *)&field->value;
1936 return field->valueChanged;
1938 gglobal()->JScript.JSglobal_return_val = NULL;
1941void sm2_resetScriptTouchedFlag(
int actualscript,
int fptr){
1944 int type, kind, ifield, found;
1951 scriptcontrol = getScriptControlIndex(actualscript);
1952 script = scriptcontrol->script;
1953 node = script->ShaderScriptNode;
1954 fullname = JSparamnames[fptr].name;
1955 found = getFieldFromNodeAndName(node,fullname,&type,&kind,&ifield,&value);
1957 field = Shader_Script_getScriptField(script, ifield);
1958 field->valueChanged = 0;
1963int sm_get_valueChanged_flag (
int fptr,
int actualscript){
1964 if(SM_method() == 2)
1965 return sm2_get_valueChanged_flag(fptr,actualscript);
1967 return sm1_get_valueChanged_flag(fptr,actualscript);
1969void sm_resetScriptTouchedFlag(
int actualscript,
int fptr){
1970 if(SM_method() == 2)
1971 sm2_resetScriptTouchedFlag(actualscript,fptr);
1973 sm1_resetScriptTouchedFlag(actualscript,fptr);
1976int jsActualrunScript(
int num,
char *script);
1977void sm_JSInitializeScriptAndFields (
int num) {
1991 int i,nfields,kind,itype;
1992 const char *fieldname;
1993 char longfieldname[256];
1997 ScriptControl = getScriptControlIndex(num);
2000 if(1)
if (!jsActualrunScript(num, ScriptControl->scriptText)) {
2001 ConsoleMessage (
"JSInitializeScriptAndFields, script failure\n");
2002 ScriptControl->scriptOK = FALSE;
2003 ScriptControl->_initialized = TRUE;
2013 script = ScriptControl->script;
2015 nfields = Shader_Script_getScriptFieldCount(script);
2016 for(i=0;i<nfields;i++){
2017 field = Shader_Script_getScriptField(script,i);
2018 fieldname = ScriptFieldDecl_getName(field);
2019 kind = ScriptFieldDecl_getMode(field);
2020 itype = ScriptFieldDecl_getType(field);
2021 longfieldname[0] = 0;
2022 if(kind == PKW_inputOnly)
2023 strcat(longfieldname,
"__eventIn_Value_");
2024 strcat(longfieldname,fieldname);
2025 if(SM_method() == 2)
2026 InitScriptFieldB(num, kind, itype, longfieldname, field->value);
2028 InitScriptField(num, kind, itype, longfieldname, field->value);
2032 if(0)
if (!jsActualrunScript(num, ScriptControl->scriptText)) {
2033 ConsoleMessage (
"JSInitializeScriptAndFields, script failure\n");
2034 ScriptControl->scriptOK = FALSE;
2035 ScriptControl->_initialized = TRUE;
2040 ScriptControl->_initialized = TRUE;
2041 ScriptControl->scriptOK = TRUE;
2048void sm_SaveScriptField (
int num, indexT kind, indexT type,
const char* field,
union anyVrml value) {
2065void getJSMultiNumType (JSContext *cx,
struct Multi_Vec3f *tn,
int eletype) {
2076#if JS_VERSION >= 185
2080 SFVec2fNative *sfvec2f;
2081 SFVec3fNative *sfvec3f;
2082 SFRotationNative *sfrotation;
2085 ttglobal tg = gglobal();
2089 elesize = returnElementLength(eletype) * returnElementRowSize(eletype);
2093 #ifdef SETFIELDVERBOSE
2094 printf (
"getJSMultiNumType, JSCreate_global_return_val %u, JSglobal_return_val %u\n",
2095 (
unsigned int) JSVAL_TO_INT(*(jsval *)tg->jsVRMLBrowser.JSCreate_global_return_val),
2096 (
unsigned int) JSVAL_TO_INT(*(jsval *)tg->JScript.JSglobal_return_val));
2099 if (JSVAL_TO_INT(*(jsval*)(tg->jsVRMLBrowser.JSCreate_global_return_val)) != 0) {
2100 myJSVal = (jsval *)tg->jsVRMLBrowser.JSCreate_global_return_val;
2101 *(jsval *)(tg->jsVRMLBrowser.JSCreate_global_return_val) = INT_TO_JSVAL(0);
2103 #ifdef SETFIELDVERBOSE
2104 printf (
"getJSMultiNumType: using JSCreate_global_return_val\n");
2107 #ifdef SETFIELDVERBOSE
2108 printf (
"getJSMultiNumType: using JSglobal_return_val\n");
2111 myJSVal = tg->JScript.JSglobal_return_val;
2114 if (!JSVAL_IS_OBJECT(*myJSVal)) {
2115 printf (
"getJSMultiNumType - did not get an object\n");
2119 #ifdef SETFIELDVERBOSE
2120 printf (
"getJSMultiNumType, tn %p dest has %s size %d\n",tn,stringFieldtypeType(eletype), elesize);
2122 printf(
"getJSMulitNumType, node type of myJSVal is :");
2123 printJSNodeType (cx,myJSVal);
2126 if (!JS_GetProperty(cx, JSVAL_TO_OBJECT(*myJSVal), MF_LENGTH_FIELD, &mainElement)) {
2127 printf (
"JS_GetProperty failed for \"%s\" in getJSMultiNumType\n", MF_LENGTH_FIELD);
2130 len = JSVAL_TO_INT(mainElement);
2131 #ifdef SETFIELDVERBOSE
2132 printf (
"getmuiltie length of grv is %d old len is %d\n",len,tn->n);
2142 tn->p = MALLOC (
struct SFVec3f *, (
unsigned)(elesize*len));
2144 #ifdef SETFIELDVERBOSE
2145 printf (
"MALLOCing memory for elesize %d len %d new pointer now is %p\n",elesize,len,tn->p);
2149 if (eletype == FIELDTYPE_SFString) {
2150 #ifdef SETFIELDVERBOSE
2151 printf (
"getJSMultiNumType, this is a MFString, so making tiny strings for now\n");
2155 for (i=0; i<len; i++) {
2156 *ms = newASCIIString (
"(getJSMultiNumType null)");
2163 fl = (
float *) tn->p;
2165 dl = (
double *) tn->p;
2170 for (i = 0; i < len; i++) {
2171 if (!JS_GetElement(cx, JSVAL_TO_OBJECT(*myJSVal), i, &mainElement)) {
2172 printf (
"WARNING: JS_GetElement failed for %d in getJSMultiNumType\n",i);
2174 case FIELDTYPE_SFNode:
2175 *nl = 0; nl++;
break;
2176 case FIELDTYPE_SFInt32:
2178 case FIELDTYPE_SFDouble:
2179 case FIELDTYPE_SFTime:
2180 *dl=0.0; dl++;
break;
2181 case FIELDTYPE_SFFloat:
2182 *fl = (float) 0.0; fl++;
break;
2183 case FIELDTYPE_SFVec2f:
2184 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
2185 case FIELDTYPE_SFVec3f:
2186 case FIELDTYPE_SFColor:
2187 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
2188 case FIELDTYPE_SFRotation:
2189 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
break;
2190 case FIELDTYPE_SFString:
2191 verify_Uni_String (*ms,
"(empty value)"); ms++;
break;
2193 default : {printf (
"getJSMultiNumType unhandled eletype: %d\n",
2199 #ifdef SETFIELDVERBOSE
2202 _tmpStr = JS_ValueToString(cx, mainElement);
2204 strp = JS_GetStringBytes(_tmpStr);
2206 strp = strpp = JS_EncodeString(cx,_tmpStr);
2208 printf (
"sub element %d is \"%s\" \n",i,strp);
2209#if JS_VERSION >= 185
2213 if (JSVAL_IS_OBJECT(mainElement)) printf (
"sub element %d is an OBJECT\n",i);
2214 if (JSVAL_IS_PRIMITIVE(mainElement)) printf (
"sub element %d is an PRIMITIVE\n",i);
2219 case FIELDTYPE_SFNode: {
2221 if (JS_InstanceOf (cx, JSVAL_TO_OBJECT(mainElement), &SFNodeClass, NULL)) {
2225 if ((_vec = (SFNodeNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2226 printf (
"error getting native\n");
2234 printf (
"hmm - not an SFNode class\n");
2241 case FIELDTYPE_SFInt32: {
2242 if (!JS_ValueToInt32(cx, mainElement ,il)) {
2249 case FIELDTYPE_SFDouble:
2250 case FIELDTYPE_SFTime: {
2251 if (!JS_ValueToNumber(cx, mainElement ,dl)) *dl=0.0;
2255 case FIELDTYPE_SFFloat: {
2256 if (!JS_ValueToNumber(cx, mainElement, &dtmp)) dtmp=0.0;
2262 case FIELDTYPE_SFVec2f: {
2263 if (JSVAL_IS_OBJECT(mainElement)) {
2264 if ((sfvec2f = (SFVec2fNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2265 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2268 memcpy ((
void *)fl, (
void *)&(sfvec2f->v),2*
sizeof(
float));
2272 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2276 case FIELDTYPE_SFVec3f:
2277 case FIELDTYPE_SFColor: {
2278 if (JSVAL_IS_OBJECT(mainElement)) {
2279 if ((sfvec3f = (SFVec3fNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2280 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2283 memcpy ((
void *)fl, (
void *)&(sfvec3f->v),3*
sizeof(
float));
2287 *fl = (float) 0.0; fl++;
2288 *fl = (float) 0.0; fl++;
2289 *fl = (float) 0.0; fl++;
2293 case FIELDTYPE_SFRotation: {
2294 if (JSVAL_IS_OBJECT(mainElement)) {
2295 if ((sfrotation = (SFRotationNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(mainElement))) == NULL) {
2296 printf(
"JS_GetPrivate failed for obj in setField_javascriptEventOut.\n");
2299 memcpy ((
void *)fl, (
void *)&(sfrotation->v),4*
sizeof(
float));
2303 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2304 *fl = (float) 0.0; fl++; *fl = (float) 0.0; fl++;
2309 case FIELDTYPE_SFString: {
2312 strval = JS_ValueToString(cx, mainElement);
2314 strp = JS_GetStringBytes(strval);
2316 strp = strpp = JS_EncodeString(cx,strval);
2320 #ifdef SETFIELDVERBOSE
2321 printf (
"getJSMultiNumType, got string %s\n",strp);
2325 verify_Uni_String (*ms,strp);
2327#if JS_VERSION >= 185
2333 default : {printf (
"getJSMultiNumType unhandled eletype: %d\n",
2341 #ifdef SETFIELDVERBOSE
2342 printf (
"getJSMultiNumType, setting old length %d to length %d\n",tn->n, len);
2352void getMFStringtype (JSContext *cx, jsval *from,
struct Multi_String *to) {
2357 char *valStr, *OldvalStr;
2368 if (!JS_ValueToObject(cx, *from, &obj))
2369 printf (
"JS_ValueToObject failed in getMFStringtype\n");
2371 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_v)) {
2372 printf (
"JS_GetProperty failed for \"%s\" in getMFStringtype.\n", MF_LENGTH_FIELD);
2375 newlen = JSVAL_TO_INT(_v);
2381 if (newlen > oldlen) {
2384 to->p = MALLOC(
struct Uni_String **, newlen *
sizeof(to->p));
2388 for (count = 0; count <oldlen; count ++) {
2396 for (count = oldlen; count < newlen; count ++) {
2402 *newp = newASCIIString(
"");
2421 for (i = 0; i < newlen; i++) {
2423 OldvalStr = svptr[i]->strptr;
2427 if (!JS_GetElement(cx, obj, i, &_v)) {
2429 "JS_GetElement failed for %d in getMFStringtype\n",i);
2432 strval = JS_ValueToString(cx, _v);
2434 valStr = JS_GetStringBytes(strval);
2436 valStr = JS_EncodeString(cx,strval);
2442 if (strcmp(valStr,OldvalStr) != 0) {
2444 svptr[i] = newASCIIString(valStr);
2446#if JS_VERSION >= 185
2463void setField_javascriptEventOut(
struct X3D_Node *tn,
unsigned int tptr,
int fieldType,
unsigned len,
int extraData, JSContext *scriptContext) {
2470#if JS_VERSION >= 185
2473 ttglobal tg = gglobal();
2478 memptr = offsetPointer_deref(
char *, tn, tptr);
2480 #ifdef SETFIELDVERBOSE
2481 strval = JS_ValueToString(scriptContext, *(jsval *)tg->JScript.JSglobal_return_val);
2483 strp = JS_GetStringBytes(strval);
2485 strp = strpp = JS_EncodeString(scriptContext,strval);
2487 printf (
"start of setField_javascriptEventOut, to %ld:%d = %p, fieldtype %d string %s\n",(
long)tn, tptr, memptr, fieldType, strp);
2488#if JS_VERSION >= 185
2489 JS_free(scriptContext,strpp);
2493#define GETJSVAL_TYPE_A(thistype,field) \
2494 case FIELDTYPE_##thistype: { \
2496 memcpy ((void *)memptr, (void *) &(((thistype##Native *)tg->CRoutes.JSSFpointer)->field),len); \
2500#define GETJSVAL_TYPE_MF_A(MFtype,SFtype) \
2501 case FIELDTYPE_##MFtype: {getJSMultiNumType (scriptContext, (struct Multi_Vec3f *)memptr,FIELDTYPE_##SFtype); break;}
2503 switch (fieldType) {
2516 GETJSVAL_TYPE_MF_A(MFVec2d,
SFVec2d)
2517 GETJSVAL_TYPE_MF_A(MFVec3d,
SFVec3d)
2518 GETJSVAL_TYPE_MF_A(MFVec4d,
SFVec4d)
2519 GETJSVAL_TYPE_MF_A(MFVec2f,
SFVec2f)
2520 GETJSVAL_TYPE_MF_A(MFVec3f,
SFVec3f)
2521 GETJSVAL_TYPE_MF_A(MFVec4f,
SFVec4f)
2522 GETJSVAL_TYPE_MF_A(MFColor,
SFColor)
2526 case FIELDTYPE_SFInt32:
2527 case FIELDTYPE_SFBool: {
2528 if (!JS_ValueToInt32(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&ival)) {
2532 memcpy ((
void *)memptr, (
void *)&ival,len);
2536 case FIELDTYPE_SFDouble:
2537 case FIELDTYPE_SFTime: {
2538 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2539 memcpy ((
void *)memptr, (
void *)&tval,len);
2543 case FIELDTYPE_SFFloat: {
2544 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2546 fl[0] = (float) tval;
2547 memcpy ((
void *)memptr, (
void *)fl,len);
2551 case FIELDTYPE_SFImage: {
2553 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2555 strp = JS_GetStringBytes(strval);
2557 strp = strpp = JS_EncodeString(scriptContext,strval);
2560 Parser_scanStringValueToMem(tn, tptr, FIELDTYPE_SFImage, strp, FALSE);
2561#if JS_VERSION >= 185
2562 JS_free(scriptContext,strpp);
2567 case FIELDTYPE_SFString: {
2571 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2573 strp = JS_GetStringBytes(strval);
2575 strp = strpp = JS_EncodeString(scriptContext,strval);
2581 newptr = (intptr_t *)memptr;
2583 verify_Uni_String (ms,strp);
2584#if JS_VERSION >= 185
2585 JS_free(scriptContext,strpp);
2592 case FIELDTYPE_MFFloat: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFFloat);
break;}
2593 case FIELDTYPE_MFInt32: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFInt32);
break;}
2594 case FIELDTYPE_MFTime: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFTime);
break;}
2595 case FIELDTYPE_MFDouble: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFDouble);
break;}
2596 case FIELDTYPE_MFNode: {
2599 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2601 strp = JS_GetStringBytes(strval);
2603 strp = strpp = JS_EncodeString(scriptContext,strval);
2607 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2609 if (*strp ==
'[') strp ++;
2610 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2616 sscanf(strp,
"%zu", (
size_t*)mynode);
2619 sscanf(strp,
"%zu", (
size_t*)mynode);
2621#if JS_VERSION >= 185
2622 JS_free(scriptContext,strpp);
2630 getMFNodetype (mynode,(
struct Multi_Node *)memptr,X3D_NODE(tn),extraData);
break;
2632 case FIELDTYPE_MFString: {
2635 (jsval *)tg->JScript.JSglobal_return_val,
2640 case FIELDTYPE_SFNode: {
2644 memcpy ((
void *)memptr, (
void *) &(((SFNodeNative *)tg->CRoutes.JSSFpointer)->handle),returnElementLength(FIELDTYPE_SFNode));
2652 default: { printf(
"WARNING: unhandled from type %s\n", stringFieldtypeType(fieldType));
2656 #ifdef SETFIELDVERBOSE
2657 printf (
"done setField_javascriptEventOut\n");
2658 if (fieldType == FIELDTYPE_MFInt32) {
2659 printf (
"setField_javascriptEventOut, checking the pointers...\n");
2660 printf (
"node type is %s\n",stringNodeType(X3D_NODE(tn)->_nodeType));
2662 if (fieldType == FIELDTYPE_SFNode) {
2663 printf (
"setField_javascriptEventOut, checking the pointers...\n");
2664 printf (
"node type is %s\n",stringNodeType(X3D_NODE(tn)->_nodeType));
2670void Parser_scanStringValueToMem_B(
union anyVrml* any, indexT ctype,
const char *value,
int isXML);
2672void setField_javascriptEventOut_B(
union anyVrml* any,
2673 int fieldType,
unsigned len,
int extraData, JSContext *scriptContext)
2684#if JS_VERSION >= 185
2687 ttglobal tg = gglobal();
2692 memptr = (
char *)any;
2694 #ifdef SETFIELDVERBOSE
2695 strval = JS_ValueToString(scriptContext, *(jsval *)tg->JScript.JSglobal_return_val);
2697 strp = JS_GetStringBytes(strval);
2699 strp = strpp = JS_EncodeString(scriptContext,strval);
2701 printf (
"start of setField_javascriptEventOut, to %ld:%d = %p, fieldtype %d string %s\n",(
long)any, fieldType, memptr, fieldType, strp);
2702#if JS_VERSION >= 185
2703 JS_free(scriptContext,strpp);
2707#define GETJSVAL_TYPE_A(thistype,field) \
2708 case FIELDTYPE_##thistype: { \
2710 memcpy ((void *)memptr, (void *) &(((thistype##Native *)tg->CRoutes.JSSFpointer)->field),len); \
2714#define GETJSVAL_TYPE_MF_A(MFtype,SFtype) \
2715 case FIELDTYPE_##MFtype: {getJSMultiNumType (scriptContext, (struct Multi_Vec3f *)memptr,FIELDTYPE_##SFtype); break;}
2717 switch (fieldType) {
2730 GETJSVAL_TYPE_MF_A(MFVec2d,
SFVec2d)
2731 GETJSVAL_TYPE_MF_A(MFVec3d,
SFVec3d)
2732 GETJSVAL_TYPE_MF_A(MFVec4d,
SFVec4d)
2733 GETJSVAL_TYPE_MF_A(MFVec2f,
SFVec2f)
2734 GETJSVAL_TYPE_MF_A(MFVec3f,
SFVec3f)
2735 GETJSVAL_TYPE_MF_A(MFVec4f,
SFVec4f)
2736 GETJSVAL_TYPE_MF_A(MFColor,
SFColor)
2740 case FIELDTYPE_SFInt32:
2741 case FIELDTYPE_SFBool: {
2742 if (!JS_ValueToInt32(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&ival)) {
2746 memcpy ((
void *)memptr, (
void *)&ival,len);
2750 case FIELDTYPE_SFDouble:
2751 case FIELDTYPE_SFTime: {
2752 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2753 memcpy ((
void *)memptr, (
void *)&tval,len);
2757 case FIELDTYPE_SFFloat: {
2758 if (!JS_ValueToNumber(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val),&tval)) tval=0.0;
2760 fl[0] = (float) tval;
2761 memcpy ((
void *)memptr, (
void *)fl,len);
2765 case FIELDTYPE_SFImage: {
2767 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2769 strp = JS_GetStringBytes(strval);
2771 strp = strpp = JS_EncodeString(scriptContext,strval);
2774 Parser_scanStringValueToMem_B(any, FIELDTYPE_SFImage, strp, FALSE);
2775#if JS_VERSION >= 185
2776 JS_free(scriptContext,strpp);
2781 case FIELDTYPE_SFString: {
2785 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2787 strp = JS_GetStringBytes(strval);
2789 strp = strpp = JS_EncodeString(scriptContext,strval);
2795 newptr = (intptr_t *)memptr;
2799 *newptr = (intptr_t) ms;
2802 ms->touched = FALSE;
2804 verify_Uni_String (ms,strp);
2805#if JS_VERSION >= 185
2806 JS_free(scriptContext,strpp);
2813 case FIELDTYPE_MFFloat: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFFloat);
break;}
2814 case FIELDTYPE_MFInt32: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFInt32);
break;}
2815 case FIELDTYPE_MFTime: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFTime);
break;}
2816 case FIELDTYPE_MFDouble: {getJSMultiNumType (scriptContext, (
struct Multi_Vec3f *)memptr,FIELDTYPE_SFDouble);
break;}
2817 case FIELDTYPE_MFNode: {
2820 strval = JS_ValueToString(scriptContext, *(jsval*)(tg->JScript.JSglobal_return_val));
2822 strp = JS_GetStringBytes(strval);
2824 strp = strpp = JS_EncodeString(scriptContext,strval);
2828 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2830 if (*strp ==
'[') strp ++;
2831 while ((*strp >
'\0') && (*strp <=
' ')) strp ++;
2837 sscanf(strp,
"%zu", (
size_t*)&mynode);
2840 sscanf(strp,
"%zu", (
size_t*)&mynode);
2842#if JS_VERSION >= 185
2843 JS_free(scriptContext,strpp);
2854 any->mfnode.p[0] = mynode;
2858 case FIELDTYPE_MFString: {
2861 (jsval *)tg->JScript.JSglobal_return_val,
2866 case FIELDTYPE_SFNode: {
2870 memcpy ((
void *)memptr, (
void *) &(((SFNodeNative *)tg->CRoutes.JSSFpointer)->handle),returnElementLength(FIELDTYPE_SFNode));
2878 default: { printf(
"WARNING: unhandled from type %s\n", stringFieldtypeType(fieldType));
2882 #ifdef SETFIELDVERBOSE
2883 printf (
"done setField_javascriptEventOut\n");
2884 if (fieldType == FIELDTYPE_MFInt32) {
2885 printf (
"setField_javascriptEventOut, checking the pointers...\n");
2886 printf (
"node type is %s\n",stringNodeType(X3D_NODE(any)->_nodeType));
2888 if (fieldType == FIELDTYPE_SFNode) {
2889 printf (
"setField_javascriptEventOut, checking the pointers...\n");
2890 printf (
"node type is %s\n",stringNodeType(X3D_NODE(any)->_nodeType));
2896void sm_js_setField_javascriptEventOut(
struct X3D_Node *tn,
unsigned int tptr,
int fieldType,
unsigned len,
int extraData,
int actualscript) {
2899 scriptcontrol = getScriptControlIndex(actualscript);
2900#if defined(JS_THREADSAFE)
2901 JS_BeginRequest(scriptcontrol->cx);
2903 setField_javascriptEventOut(tn,tptr,fieldType, len, extraData, scriptcontrol->cx);
2904#if defined(JS_THREADSAFE)
2905 JS_EndRequest(scriptcontrol->cx);
2909void sm_js_setField_javascriptEventOut_B(
union anyVrml* any,
int fieldType,
unsigned len,
int extraData,
int actualscript){
2912 scriptcontrol = getScriptControlIndex(actualscript);
2913#if defined(JS_THREADSAFE)
2914 JS_BeginRequest(scriptcontrol->cx);
2916 setField_javascriptEventOut_B(any,fieldType, len, extraData, scriptcontrol->cx);
2918#if defined(JS_THREADSAFE)
2919 JS_EndRequest(scriptcontrol->cx);
2926void sm_set_one_ECMAtype (
int tonode,
int toname,
int dataType,
void *Data,
int datalen) {
2927 char scriptline[256];
2935 #ifdef SETFIELDVERBOSE
2936 printf (
"set_one_ECMAtype, to %d namepointer %d, fieldname %s, datatype %d length %d\n",
2937 tonode,toname,JSparamnames[toname].name,dataType,datalen);
2939 ScriptControl = getScriptControlIndex(tonode);
2941 cx = (JSContext*)ScriptControl->cx;
2942 obj = (JSObject*)ScriptControl->glob;
2944#if defined(JS_THREADSAFE)
2945 JS_BeginRequest(cx);
2951 kind = JSparamnames[toname].kind;
2952 if(SM_method() == 2){
2953 int type, iifield, *valueChanged, ifound;
2957 fieldname = JSparamnames[toname].name;
2959 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2960 if(ifound && type == dataType && isSFType(type)){
2964 shallow_copy_field(type,any,value);
2967 (*valueChanged) = 1;
2969 ConsoleMessage(
"sm_set_one_ECMAtype did not find field %s type %d\n",fieldname, dataType);
2974 X3D_ECMA_TO_JS(cx, Data, datalen, dataType, &newval);
2978 if(kind == PKW_inputOnly)
2979 strcat(scriptline,
"__eventIn_Value_");
2981 strcat(scriptline,JSparamnames[toname].name);
2982 #ifdef SETFIELDVERBOSE
2983 printf (
"set_one_ECMAtype, calling JS_DefineProperty on name %s obj %u, setting setECMANative, 0 \n",scriptline,obj);
2986 if (!JS_DefineProperty(cx,obj, scriptline, newval, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_PERMANENT)) {
2987 printf(
"JS_DefineProperty failed for \"ECMA in\" at %s:%d.\n",__FILE__,__LINE__);
2988#if defined(JS_THREADSAFE)
2998 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3001 RUN_FUNCTION (toname)
3004#if defined(JS_THREADSAFE)
3018void sm_setScriptECMAtype (
int num) {
3023 CRnodeStruct *to_ptr = NULL;
3024 struct CRStruct *CRoutes = getCRoutes();
3027 fn = offsetPointer_deref(
void *, CRoutes[num].routeFromNode, CRoutes[num].fnptr);
3028 len = CRoutes[num].len;
3030 for (to_counter = 0; to_counter < CRoutes[num].tonode_count; to_counter++) {
3033 to_ptr = &(CRoutes[num].tonodes[to_counter]);
3034 myObj = X3D_SCRIPT(to_ptr->routeToNode)->__scriptObj;
3036 tptr = to_ptr->foffset;
3037 set_one_ECMAtype (myObj->num, tptr, JSparamnames[tptr].type, fn,len);
3043void sm_set_one_MFElementType(
int tonode,
int toname,
int dataType,
void *Data,
int datalen) {
3048 char scriptline[20000];
3062 ScriptControl = getScriptControlIndex(tonode);
3063 cx = (JSContext*)ScriptControl->cx;
3064 obj = (JSObject*)ScriptControl->glob;
3066#if defined(JS_THREADSAFE)
3067 JS_BeginRequest(cx);
3070 kind = JSparamnames[toname].kind;
3071 if(SM_method() == 2){
3072 int type, iifield, *valueChanged, ifound;
3076 fieldname = JSparamnames[toname].name;
3078 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
3079 if(ifound && type == dataType && !isSFType(type)){
3082 any.mfbool.n = datalen;
3083 any.mfbool.p = Data;
3088 shallow_copy_field(type,&any,value);
3095 (*valueChanged) = 1;
3097 ConsoleMessage(
"sm_set_one_MFElementType did not find field %s type %d\n",fieldname, dataType);
3103 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3104 RUN_FUNCTION(toname)
3111 case FIELDTYPE_MFRotation: {
3112 JSObject *newMFObject;
3113 JSObject *newSFObject;
3114 SFRotationNative *SFRPptr;
3115 float *fp, *fp_in=(
float *)Data;
3118 newMFObject = JS_ConstructObjectFw(cx, &MFRotationClass, NULL ,JS_GetParentFw(cx, obj));
3119 ADD_ROOT (cx, newMFObject)
3122 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3125 elementlen = (int)
sizeof (
float);
3126 for (x=0; x<datalen; x++) {
3128 newSFObject = JS_ConstructObjectFw(cx,&SFRotationClass,NULL, newMFObject);
3129 if ((SFRPptr = (SFRotationNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3130 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3131#if defined(JS_THREADSAFE)
3138 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3139 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3140 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3141 fp = (
float *)fp_in; SFRPptr->v.c[3] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3144 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3145 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3146 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3151 SET_LENGTH (cx,newMFObject,datalen)
3154 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3157 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3158 RUN_FUNCTION(toname)
3162 case FIELDTYPE_MFVec3f: {
3163 JSObject *newMFObject;
3164 JSObject *newSFObject;
3165 SFVec3fNative *SFRPptr;
3166 float *fp, *fp_in=(
float *)Data;
3169 newMFObject = JS_ConstructObjectFw(cx, &MFVec3fClass, NULL ,JS_GetParentFw(cx, obj));
3170 ADD_ROOT (cx, newMFObject)
3173 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3176 elementlen = (int)
sizeof (
float);
3177 for (x=0; x<datalen; x++) {
3179 newSFObject = JS_ConstructObjectFw(cx,&SFVec3fClass,NULL, newMFObject);
3180 if ((SFRPptr = (SFVec3fNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3181 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3182#if defined(JS_THREADSAFE)
3189 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3190 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3191 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3194 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3195 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3196 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3201 SET_LENGTH (cx,newMFObject,datalen)
3204 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3207 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3208 RUN_FUNCTION(toname)
3212 case FIELDTYPE_MFColor: {
3213 JSObject *newMFObject;
3214 JSObject *newSFObject;
3215 SFColorNative *SFRPptr;
3216 float *fp, *fp_in=(
float *)Data;
3219 newMFObject = JS_ConstructObjectFw(cx, &MFColorClass, NULL ,JS_GetParentFw(cx, obj));
3220 ADD_ROOT (cx, newMFObject)
3223 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3226 elementlen = (int)
sizeof (
float);
3227 for (x=0; x<datalen; x++) {
3229 newSFObject = JS_ConstructObjectFw(cx,&SFColorClass,NULL, newMFObject);
3230 if ((SFRPptr = (SFColorNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3231 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3232#if defined(JS_THREADSAFE)
3239 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3240 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3241 fp = (
float *)fp_in; SFRPptr->v.c[2] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3244 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3245 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3246 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3251 SET_LENGTH (cx,newMFObject,datalen)
3254 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3257 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3258 RUN_FUNCTION(toname)
3262 case FIELDTYPE_MFVec2f: {
3263 JSObject *newMFObject;
3264 JSObject *newSFObject;
3265 SFVec2fNative *SFRPptr;
3266 float *fp, *fp_in=(
float *)Data;
3269 newMFObject = JS_ConstructObjectFw(cx, &MFVec2fClass, NULL ,JS_GetParentFw(cx, obj));
3270 ADD_ROOT (cx, newMFObject)
3273 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3276 elementlen = (int)
sizeof (
float);
3277 for (x=0; x<datalen; x++) {
3279 newSFObject = JS_ConstructObjectFw(cx,&SFVec2fClass,NULL, newMFObject);
3280 if ((SFRPptr = (SFVec2fNative *)JS_GetPrivateFw(cx, newSFObject)) == NULL) {
3281 ConsoleMessage (
"failure in getting SF class at %s:%d\n",__FILE__,__LINE__);
3282#if defined(JS_THREADSAFE)
3289 fp = (
float *)fp_in; SFRPptr->v.c[0] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3290 fp = (
float *)fp_in; SFRPptr->v.c[1] = *fp; fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3293 if (!JS_DefineElement(cx, newMFObject, (jsint) x, OBJECT_TO_JSVAL(newSFObject),
3294 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3295 ConsoleMessage(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3300 SET_LENGTH (cx,newMFObject,datalen)
3303 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3306 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3307 RUN_FUNCTION(toname)
3312 case FIELDTYPE_MFFloat: {
3313 JSObject *newMFObject;
3315 float *fp, *fp_in=(
float *)Data;
3317 newMFObject = JS_ConstructObjectFw(cx, &MFFloatClass, NULL ,JS_GetParentFw(cx, obj));
3318 ADD_ROOT (cx, newMFObject)
3321 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3324 elementlen = (int)
sizeof (
float);
3325 for (x=0; x<datalen; x++) {
3328 fp = (
float *)fp_in;
3329 JS_NewNumberValue(cx,(
double)*fp,&newjsval);
3330 fp_in = offsetPointer_deref(
float *,fp_in,elementlen);
3333 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3334 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3335 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3340 SET_LENGTH (cx,newMFObject,datalen)
3343 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3346 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3347 RUN_FUNCTION(toname)
3350 case FIELDTYPE_MFTime: {
3351 JSObject *newMFObject;
3353 double *dp, *dp_in=(
double *)Data;
3356 newMFObject = JS_ConstructObjectFw(cx, &MFTimeClass, NULL ,JS_GetParentFw(cx, obj));
3357 ADD_ROOT (cx, newMFObject)
3360 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3363 elementlen = (int)
sizeof (
double);
3364 for (x=0; x<datalen; x++) {
3367 dp = (
double *)dp_in;
3368 JS_NewNumberValue(cx,(
double)*dp,&newjsval);
3369 dp_in = offsetPointer_deref(
double *,dp_in,elementlen);
3372 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3373 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3374 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3379 SET_LENGTH (cx,newMFObject,datalen)
3382 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3385 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3386 RUN_FUNCTION(toname)
3389 case FIELDTYPE_MFInt32: {
3390 JSObject *newMFObject;
3392 int *ip, *ip_in=(
int *)Data;
3395 newMFObject = JS_ConstructObjectFw(cx, &MFInt32Class, NULL ,JS_GetParentFw(cx, obj));
3396 ADD_ROOT (cx, newMFObject)
3399 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3402 elementlen = (int)
sizeof (
float);
3403 for (x=0; x<datalen; x++) {
3408 newjsval = INT_TO_JSVAL((
int)ip);
3409 ip_in = offsetPointer_deref(
int *,ip_in,elementlen);
3412 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3413 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3414 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3419 SET_LENGTH (cx,newMFObject,datalen)
3422 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3425 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3426 RUN_FUNCTION(toname)
3429 case FIELDTYPE_MFString: {
3430 JSObject *newMFObject;
3435 newMFObject = JS_ConstructObjectFw(cx, &MFStringClass, NULL ,JS_GetParentFw(cx, obj));
3436 ADD_ROOT (cx, newMFObject)
3442 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3445 for (x=0; x<datalen; x++) {
3448 chptr = uniptr[x]->strptr;
3449 newjsval = STRING_TO_JSVAL( JS_NewStringCopyZ(cx,chptr));
3452 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3453 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3454 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3459 SET_LENGTH (cx,newMFObject,datalen)
3462 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3465 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3466 RUN_FUNCTION(toname)
3469 case FIELDTYPE_MFNode: {
3470 JSObject *newMFObject;
3472 double *ip, *ip_in=(
double *)Data;
3474 newMFObject = JS_ConstructObjectFw(cx, &MFNodeClass, NULL ,JS_GetParentFw(cx, obj));
3475 ADD_ROOT (cx, newMFObject)
3478 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3481 elementlen = (int)
sizeof (
void *);
3482 for (x=0; x<datalen; x++) {
3485 newjsval = INT_TO_JSVAL((
int)ip);
3486 ip_in = offsetPointer_deref(
double *,ip_in,elementlen);
3489 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3490 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3491 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3496 SET_LENGTH (cx,newMFObject,datalen)
3499 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3502 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3503 RUN_FUNCTION(toname)
3507 case FIELDTYPE_SFImage: {
3508 JSObject *newMFObject;
3510 int *ip_in=(
int *)Data;
3513 newMFObject = JS_ConstructObjectFw(cx, &SFImageClass, NULL ,JS_GetParentFw(cx, obj));
3514 ADD_ROOT (cx, newMFObject)
3517 DEFINE_LENGTH_NORV(cx,newMFObject,datalen)
3520 for (x=0; x<datalen; x++) {
3521 newjsval = INT_TO_JSVAL(ip_in[x]);
3523 if (!JS_DefineElement(cx, newMFObject, (jsint) x, newjsval,
3524 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB3, JSPROP_ENUMERATE)) {
3525 printf(
"failure in inserting SF class at %s:%d\n",__FILE__,__LINE__);
3530 SET_LENGTH (cx,newMFObject,datalen)
3533 SET_EVENTIN_VALUE (cx,obj,toname,newMFObject)
3536 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3537 RUN_FUNCTION(toname)
3543 printf (
"setMFElement, SHOULD NOT DISPLAY THIS\n");
3544 strcat (scriptline,
"(");
3547#if defined(JS_THREADSAFE)
3563void **getInternalDataPointerForJavascriptObject(JSContext *cx, JSObject *obj,
int tnfield,
int *iflag) {
3564 char scriptline[256];
3576 if(JSparamnames[tnfield].kind == PKW_inputOnly)
3577 strcat(scriptline,
"__eventIn_Value_");
3578 strcat(scriptline,JSparamnames[tnfield].name);
3579 #ifdef SETFIELDVERBOSE
3580 printf (
"getInternalDataPointerForJavascriptObject: line %s\n",scriptline);
3583 if (!JS_GetProperty(cx,obj,scriptline,&retval)){
3588 printf (
"JS_GetProperty failed in set_one_MultiElementType.\n");
3592 if (!JSVAL_IS_OBJECT(retval)){
3597 if (!JS_GetProperty(cx,obj,JSparamnames[tnfield].name,&retval)){
3599 printf (
"no field for eventIn function: %s\n",JSparamnames[tnfield].name);
3602 if (!JSVAL_IS_OBJECT(retval)){
3603 printf (
"no field for eventIn function: %s\n",JSparamnames[tnfield].name);
3609 sfObj = JSVAL_TO_OBJECT(retval);
3611 if ((_privPtr = JS_GetPrivateFw(cx, sfObj)) == NULL)
3612 printf(
"JS_GetPrivate failed set_one_MultiElementType.\n");
3614 if (_privPtr == NULL)
return NULL;
3621 if (JS_InstanceOf(cx, sfObj, &SFVec3fClass, NULL)) {
3622 SFVec3fNative *me = (SFVec3fNative *)_privPtr;
3623 return (
void **) &me->v;
3625 }
else if (JS_InstanceOf(cx, sfObj, &SFVec3dClass, NULL)) {
3626 SFVec3dNative *me = (SFVec3dNative *)_privPtr;
3627 return (
void **) &me->v;
3629 }
else if (JS_InstanceOf(cx, sfObj, &SFRotationClass, NULL)) {
3630 SFRotationNative *me = (SFRotationNative *)_privPtr;
3631 return (
void **) &me->v;
3633 }
else if (JS_InstanceOf(cx, sfObj, &SFVec2fClass, NULL)) {
3634 SFVec2fNative *me = (SFVec2fNative *)_privPtr;
3635 return (
void **) &me->v;
3637 }
else if (JS_InstanceOf(cx, sfObj, &SFColorClass, NULL)) {
3638 SFColorNative *me = (SFColorNative *)_privPtr;
3639 return (
void **) &me->v;
3641 }
else if (JS_InstanceOf(cx, sfObj, &SFColorRGBAClass, NULL)) {
3642 SFColorRGBANative *me = (SFColorRGBANative *)_privPtr;
3643 return (
void **) &me->v;
3645 }
else if (JS_InstanceOf(cx, sfObj, &SFVec4fClass, NULL)) {
3646 SFVec4fNative *me = (SFVec4fNative *)_privPtr;
3647 return (
void **) &me->v;
3649 }
else if (JS_InstanceOf(cx, sfObj, &SFVec4dClass, NULL)) {
3650 SFVec4dNative *me = (SFVec4dNative *)_privPtr;
3651 return (
void **) &me->v;
3653 }
else if (JS_InstanceOf(cx, sfObj, &SFNodeClass, NULL)) {
3654 SFNodeNative *me = (SFNodeNative *)_privPtr;
3655 return (
void **) &me->handle;;
3658 }
else if (JS_InstanceOf(cx, sfObj, &SFImageClass, NULL)) {
3664 ConsoleMessage (
"getInternalDataPointerForJavascriptObject malfunction");
3678void sm_set_one_MultiElementType (
int tonode,
int tnfield,
void *Data,
int dataLen ) {
3679 char scriptline[256];
3683 int iflag, kind, toname;
3688 ScriptControl = getScriptControlIndex(tonode);
3689 cx = (JSContext*)ScriptControl->cx;
3690 obj = (JSObject*)ScriptControl->glob;
3692#if defined(JS_THREADSAFE)
3693 JS_BeginRequest(cx);
3696 kind = JSparamnames[toname].kind;
3697 if(SM_method() == 2){
3698 int type, iifield, *valueChanged, ifound, datatype;
3703 fieldname = JSparamnames[toname].name;
3704 datatype = JSparamnames[toname].type;
3707 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
3708 if(ifound && type == datatype && isSFType(type)){
3710 shallow_copy_field(type,Data,value);
3711 (*valueChanged) = 1;
3713 ConsoleMessage(
"sm_set_one_MultiElementType did not find field %s type %d\n",fieldname, datatype);
3719 COMPILE_FUNCTION_IF_NEEDED_SET(toname,kind)
3720 RUN_FUNCTION(toname)
3727 pp = getInternalDataPointerForJavascriptObject(cx,obj,tnfield,&iflag);
3730 printf(
"function not found\n");
3733 memcpy (pp,Data, dataLen);
3741 COMPILE_FUNCTION_IF_NEEDED_SET(tnfield,kind)
3744 #ifdef SETFIELDVERBOSE
3745 printf (
"set_one_MultiElementType: running script %s\n",scriptline);
3748 RUN_FUNCTION (tnfield)
3750#if defined(JS_THREADSAFE)
3755int sm_runQueuedDirectOutputs(){
3757 static int doneOnce = 0;
3760 printf(
"javascript engine spidermonkey version %ld %s\n", (
long)JS_VERSION, SM_method() == 2?
"SM2" :
"SM1");