📄 vrml_smjs.c
字号:
ptr->field.fieldType = fieldType; ptr->js_list = JS_NewArrayObject(c, (jsint) argc, argv); JS_SetPrivate(c, obj, ptr); *rval = OBJECT_TO_JSVAL(obj); return obj == 0 ? JS_FALSE : JS_TRUE;}static JSBool MFBoolConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFBOOL);}static JSBool MFInt32Constructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFINT32);}static JSBool MFFloatConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFFLOAT);}static JSBool MFTimeConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFTIME);}static JSBool MFStringConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFSTRING);}static JSBool MFURLConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFURL);}static JSBool MFNodeConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ return MFArrayConstructor(c, obj, argc, argv, rval, GF_SG_VRML_MFNODE);}static void array_finalize(JSContext *c, JSObject *obj){ GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); JS_ObjectDestroyed(c, obj); if (!ptr) return; GF_LOG(GF_LOG_DEBUG, GF_LOG_SCRIPT, ("[VRML JS] unregistering MFField %s\n", ptr->field.name)); /*MFNode*/ if (ptr->temp_list) { gf_node_unregister_children(ptr->owner, ptr->temp_list); } if (ptr->field_ptr) { gf_sg_vrml_field_pointer_del(ptr->field_ptr, ptr->field.fieldType); } free(ptr);}JSBool array_getElement(JSContext *c, JSObject *obj, jsval id, jsval *rval){ u32 i; GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); if (JSVAL_IS_INT(id)) { i = JSVAL_TO_INT(id); JS_GetElement(c, ptr->js_list, (jsint) i, rval); } return JS_TRUE;}//this could be overloaded for each MF type...JSBool array_setElement(JSContext *c, JSObject *obj, jsval id, jsval *rval){ u32 ind, len; jsdouble d; GF_JSField *from; JSBool ret; JSClass *the_sf_class = NULL; JSString *str; char *str_val; void *sf_slot; GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); ind = JSVAL_TO_INT(id); ret = JS_GetArrayLength(c, ptr->js_list, &len); if (ret==JS_FALSE) return JS_FALSE; switch (ptr->field.fieldType) { case GF_SG_VRML_MFVEC2F: the_sf_class = &js_rt->SFVec2fClass; break; case GF_SG_VRML_MFVEC3F: the_sf_class = &js_rt->SFVec3fClass; break; case GF_SG_VRML_MFCOLOR: the_sf_class = &js_rt->SFColorClass; break; case GF_SG_VRML_MFROTATION: the_sf_class = &js_rt->SFRotationClass; break; } /*dynamic expend*/ if (ind>=len) { ret = JS_SetArrayLength(c, ptr->js_list, len+1); if (ret==JS_FALSE) return JS_FALSE; while (len<ind) { jsval a_val; switch (ptr->field.fieldType) { case GF_SG_VRML_MFBOOL: a_val = BOOLEAN_TO_JSVAL(0); break; case GF_SG_VRML_MFINT32: a_val = INT_TO_JSVAL(0); break; case GF_SG_VRML_MFFLOAT: case GF_SG_VRML_MFTIME: a_val = DOUBLE_TO_JSVAL( JS_NewDouble(c, 0) ); break; case GF_SG_VRML_MFSTRING: case GF_SG_VRML_MFURL: a_val = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "") ); break; case GF_SG_VRML_MFVEC2F: case GF_SG_VRML_MFVEC3F: case GF_SG_VRML_MFCOLOR: case GF_SG_VRML_MFROTATION: a_val = OBJECT_TO_JSVAL( JS_ConstructObject(c, the_sf_class, 0, obj) ); break; default: a_val = INT_TO_JSVAL(0); break; } if (ptr->field.fieldType!=GF_SG_VRML_MFNODE) gf_sg_vrml_mf_insert(ptr->field.far_ptr, ptr->field.fieldType, &sf_slot, len); JS_SetElement(c, ptr->js_list, len, &a_val); len++; } if (ptr->field.fieldType!=GF_SG_VRML_MFNODE) gf_sg_vrml_mf_insert(ptr->field.far_ptr, ptr->field.fieldType, &sf_slot, ind); } /*assign object*/ if (ptr->field.fieldType==GF_SG_VRML_MFNODE) { if (JSVAL_IS_VOID(*rval) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(*rval), &js_rt->SFNodeClass, NULL) ) return JS_FALSE; } else if (the_sf_class) { if (JSVAL_IS_VOID(*rval)) return JS_FALSE; if (!JS_InstanceOf(c, JSVAL_TO_OBJECT(*rval), the_sf_class, NULL) ) return JS_FALSE; } else if (ptr->field.fieldType==GF_SG_VRML_MFBOOL) { if (!JSVAL_IS_BOOLEAN(*rval)) return JS_FALSE; } else if (ptr->field.fieldType==GF_SG_VRML_MFINT32) { if (!JSVAL_IS_INT(*rval)) return JS_FALSE; } else if (ptr->field.fieldType==GF_SG_VRML_MFFLOAT) { if (!JSVAL_IS_NUMBER(*rval)) return JS_FALSE; } else if (ptr->field.fieldType==GF_SG_VRML_MFTIME) { if (!JSVAL_IS_NUMBER(*rval)) return JS_FALSE; } else if (ptr->field.fieldType==GF_SG_VRML_MFSTRING) { if (!JSVAL_IS_STRING(*rval)) return JS_FALSE; } else if (ptr->field.fieldType==GF_SG_VRML_MFURL) { if (!JSVAL_IS_STRING(*rval)) return JS_FALSE; } ret = JS_SetElement(c, ptr->js_list, ind, rval); if (ret==JS_FALSE) return JS_FALSE; if (!ptr->owner) return JS_TRUE; /*rewrite MFNode entry*/ if (ptr->field.fieldType==GF_SG_VRML_MFNODE) { GF_Node *prev_n, *new_n; /*get and delete previous node if any, but unregister later*/ prev_n = gf_node_list_del_child_idx( (GF_ChildNodeItem **)ptr->field.far_ptr, ind); /*get new node*/ from = (GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(*rval)); new_n = *(GF_Node**)from->field.far_ptr; if (new_n) { gf_node_list_insert_child( (GF_ChildNodeItem **)ptr->field.far_ptr , new_n, ind); gf_node_register(new_n, ptr->owner); } /*unregister previous node*/ if (prev_n) gf_node_unregister(prev_n, ptr->owner); Script_FieldChanged(c, NULL, ptr, NULL); return JS_TRUE; } /*rewrite MF slot*/ switch (ptr->field.fieldType) { case GF_SG_VRML_MFBOOL: ((MFBool *)ptr->field.far_ptr)->vals[ind] = (Bool) JSVAL_TO_BOOLEAN(*rval); break; case GF_SG_VRML_MFINT32: ((MFInt32 *)ptr->field.far_ptr)->vals[ind] = (s32) JSVAL_TO_INT(*rval); break; case GF_SG_VRML_MFFLOAT: JS_ValueToNumber(c, *rval, &d); ((MFFloat *)ptr->field.far_ptr)->vals[ind] = FLT2FIX(d); break; case GF_SG_VRML_MFTIME: JS_ValueToNumber(c, *rval, &d); ((MFTime *)ptr->field.far_ptr)->vals[ind] = d; break; case GF_SG_VRML_MFSTRING: if (((MFString *)ptr->field.far_ptr)->vals[ind]) { free(((MFString *)ptr->field.far_ptr)->vals[ind]); ((MFString *)ptr->field.far_ptr)->vals[ind] = NULL; } str = JSVAL_IS_STRING(*rval) ? JSVAL_TO_STRING(*rval) : JS_ValueToString(c, *rval); str_val = JS_GetStringBytes(str); ((MFString *)ptr->field.far_ptr)->vals[ind] = strdup(str_val); break; case GF_SG_VRML_MFURL: if (((MFURL *)ptr->field.far_ptr)->vals[ind].url) { free(((MFURL *)ptr->field.far_ptr)->vals[ind].url); ((MFURL *)ptr->field.far_ptr)->vals[ind].url = NULL; } str = JSVAL_IS_STRING(*rval) ? JSVAL_TO_STRING(*rval) : JS_ValueToString(c, *rval); str_val = JS_GetStringBytes(str); ((MFURL *)ptr->field.far_ptr)->vals[ind].url = strdup(str_val); ((MFURL *)ptr->field.far_ptr)->vals[ind].OD_ID = 0; break; case GF_SG_VRML_MFVEC2F: case GF_SG_VRML_MFVEC3F: case GF_SG_VRML_MFROTATION: case GF_SG_VRML_MFCOLOR: from = (GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(*rval)); gf_sg_vrml_field_copy(& ((GenMFField *)ptr->field.far_ptr)->array[ind], from->field.far_ptr, from->field.fieldType); break; } Script_FieldChanged(c, NULL, ptr, NULL); return JS_TRUE;}JSBool array_setLength(JSContext *c, JSObject *obj, jsval v, jsval *val){ u32 len, i, sftype; JSBool ret; JSClass *the_sf_class; GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); if (!JSVAL_IS_INT(*val) || JSVAL_TO_INT(*val) < 0) return JS_FALSE; len = JSVAL_TO_INT(*val); ret = JS_SetArrayLength(c, ptr->js_list, len); if (ret==JS_FALSE) return ret; #if 0 /*insert till index if needed*/ if (ptr->field.fieldType != GF_SG_VRML_MFNODE) { if (!ptr->field.far_ptr) ptr->field_ptr = ptr->field.far_ptr = gf_sg_vrml_field_pointer_new(ptr->field.fieldType); gf_sg_vrml_mf_reset(ptr->field.far_ptr, ptr->field.fieldType); gf_sg_vrml_mf_alloc(ptr->field.far_ptr, ptr->field.fieldType, len); if (ptr->field_ptr) ptr->field_ptr = ptr->field.far_ptr; }#endif the_sf_class = NULL; switch (ptr->field.fieldType) { case GF_SG_VRML_MFVEC2F: the_sf_class = &js_rt->SFVec2fClass; break; case GF_SG_VRML_MFVEC3F: the_sf_class = &js_rt->SFVec3fClass; break; case GF_SG_VRML_MFCOLOR: the_sf_class = &js_rt->SFColorClass; break; case GF_SG_VRML_MFROTATION: the_sf_class = &js_rt->SFRotationClass; break; case GF_SG_VRML_MFNODE: the_sf_class = &js_rt->SFNodeClass; break; } sftype = gf_sg_vrml_get_sf_type(ptr->field.fieldType); for (i=0; i<len; i++) { jsval a_val; if (the_sf_class) { JSObject *an_obj = JS_ConstructObject(c, the_sf_class, 0, obj); a_val = OBJECT_TO_JSVAL(an_obj ); } else { switch (sftype) { case GF_SG_VRML_SFBOOL: a_val = BOOLEAN_TO_JSVAL(0); break; case GF_SG_VRML_SFINT32: a_val = INT_TO_JSVAL(0); break; case GF_SG_VRML_SFFLOAT: case GF_SG_VRML_SFTIME: a_val = DOUBLE_TO_JSVAL( JS_NewDouble(c, 0) ); break; case GF_SG_VRML_SFSTRING: case GF_SG_VRML_SFURL: a_val = STRING_TO_JSVAL( JS_NewStringCopyZ(c, "") ); break; default: a_val = INT_TO_JSVAL(0); break; } } JS_SetElement(c, ptr->js_list, i, &a_val); } return JS_TRUE;}JSBool array_getLength(JSContext *c, JSObject *obj, jsval v, jsval *val){ jsuint len; GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); JSBool ret = JS_GetArrayLength(c, ptr->js_list, &len); *val = INT_TO_JSVAL(len); return ret;}/* MFVec2f class constructor */static JSBool MFVec2fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsval val; JSObject *item; u32 i; GF_JSField *ptr = NewJSField(); ptr->js_list = JS_NewArrayObject(c, 0, 0); JS_SetArrayLength(c, ptr->js_list, argc); JS_SetPrivate(c, obj, ptr); for (i=0; i<argc; i++) { if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFVec2fClass, NULL) ) { item = JS_ConstructObject(c, &js_rt->SFVec2fClass, 0, obj); val = OBJECT_TO_JSVAL(item); JS_SetElement(c, ptr->js_list, i, &val); } else { JS_SetElement(c, ptr->js_list, i, &argv[i]); } } *rval = OBJECT_TO_JSVAL(obj); return obj == 0 ? JS_FALSE : JS_TRUE;}/* MFVec3f class constructor */static JSBool MFVec3fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsval val; JSObject *item; u32 i; GF_JSField *ptr = NewJSField(); ptr->field.fieldType = GF_SG_VRML_MFVEC3F; ptr->js_list = JS_NewArrayObject(c, (jsint) argc, argv); JS_SetArrayLength(c, ptr->js_list, argc); JS_SetPrivate(c, obj, ptr); for (i=0; i<argc; i++) { if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFVec3fClass, NULL) ) { item = JS_ConstructObject(c, &js_rt->SFVec3fClass, 0, obj); val = OBJECT_TO_JSVAL(item); JS_SetElement(c, ptr->js_list, i, &val); } else { JS_SetElement(c, ptr->js_list, i, &argv[i]); } } *rval = OBJECT_TO_JSVAL(obj); return obj == 0 ? JS_FALSE : JS_TRUE;}/* MFRotation class constructor */static JSBool MFRotationConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsval val; JSObject *item; u32 i; GF_JSField *ptr = NewJSField(); ptr->field.fieldType = GF_SG_VRML_MFROTATION; ptr->js_list = JS_NewArrayObject(c, 0, 0); JS_SetArrayLength(c, ptr->js_list, argc); JS_SetPrivate(c, obj, ptr); for (i=0; i<argc; i++) { if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFRotationClass, NULL) ) { item = JS_ConstructObject(c, &js_rt->SFVec3fClass, 0, obj); val = OBJECT_TO_JSVAL(item); JS_SetElement(c, ptr->js_list, i, &val); } else { JS_SetElement(c, ptr->js_list, i, &argv[i]); } } *rval = OBJECT_TO_JSVAL(obj); return obj == 0 ? JS_FALSE : JS_TRUE;}/*MFColor class constructor */static JSBool MFColorConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ jsval val; JSObject *item; u32 i; GF_JSField *ptr = NewJSField(); ptr->field.fieldType = GF_SG_VRML_MFCOLOR; ptr->js_list = JS_NewArrayObject(c, 0, 0); JS_SetArrayLength(c, ptr->js_list, argc); JS_SetPrivate(c, obj, ptr); for (i=0; i<argc; i++) { if (!JSVAL_IS_OBJECT(argv[i]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[i]), &js_rt->SFColorClass, NULL) ) { item = JS_ConstructObject(c, &js_rt->SFColorClass, 0, obj); val = OBJECT_TO_JSVAL(item); JS_SetElement(c, ptr->js_list, i, &val); } else { JS_SetElement(c, ptr->js_list, i, &argv[i]); } } *rval = OBJECT_TO_JSVAL(obj); return obj == 0 ? JS_FALSE : JS_TRUE;}void gf_sg_script_init_sm_api(GF_ScriptPriv *sc, GF_Node *script){ /*GCC port: classes are declared within code since JS_PropertyStub and co are exported symbols from JS runtime lib, so with non-constant addresses*/ GF_SETUP_JS(js_rt->globalClass, "global", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub); GF_SETUP_JS(js_rt->browserClass , "Browser", 0, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub); GF_SETUP_JS(js_rt->SFNodeClass, "SFNode", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, node_getProperty, node_setProperty, JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, node_finalize); GF_SETUP_JS(js_rt->SFVec2fClass , "SFVec2f", JSCLASS_HAS_PRIVATE, JS_PropertyStub, JS_PropertyStub, vec2f_ge
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -