📄 vrml_smjs.c
字号:
gf_list_del(nlist); return JS_TRUE;}static JSBool getOption(JSContext*c, JSObject*obj, uintN argc, jsval *argv, jsval *rval){ JSString *s; GF_JSAPIParam par; GF_Node *sc_node = JS_GetContextPrivate(c); JSString *js_sec_name, *js_key_name; if (argc < 2) return JSVAL_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JSVAL_FALSE; js_sec_name = JSVAL_TO_STRING(argv[0]); par.gpac_cfg.section = JS_GetStringBytes(js_sec_name); if (!JSVAL_IS_STRING(argv[1])) return JSVAL_FALSE; js_key_name = JSVAL_TO_STRING(argv[1]); par.gpac_cfg.key = JS_GetStringBytes(js_key_name); par.gpac_cfg.key_val = NULL; if (!ScriptAction(c, NULL, GF_JSAPI_OP_GET_OPT, sc_node->sgprivate->scenegraph->RootNode, &par)) return JSVAL_FALSE; s = JS_NewStringCopyZ(c, par.gpac_cfg.key_val ? (const char *)par.gpac_cfg.key_val : ""); if (!s) return JS_FALSE; *rval = STRING_TO_JSVAL(s); return JS_TRUE; }static JSBool setOption(JSContext*c, JSObject*obj, uintN argc, jsval *argv, jsval *rval){ GF_JSAPIParam par; GF_Node *sc_node = JS_GetContextPrivate(c); JSString *js_sec_name, *js_key_name, *js_key_val; if (argc < 3) return JSVAL_FALSE; if (!JSVAL_IS_STRING(argv[0])) return JSVAL_FALSE; js_sec_name = JSVAL_TO_STRING(argv[0]); par.gpac_cfg.section = JS_GetStringBytes(js_sec_name); if (!JSVAL_IS_STRING(argv[1])) return JSVAL_FALSE; js_key_name = JSVAL_TO_STRING(argv[1]); par.gpac_cfg.key = JS_GetStringBytes(js_key_name); if (!JSVAL_IS_STRING(argv[2])) return JSVAL_FALSE; js_key_val = JSVAL_TO_STRING(argv[2]); par.gpac_cfg.key_val = JS_GetStringBytes(js_key_val); if (!ScriptAction(c, NULL, GF_JSAPI_OP_SET_OPT, sc_node->sgprivate->scenegraph->RootNode, &par)) return JSVAL_FALSE; return JSVAL_TRUE;}void Script_FieldChanged(JSContext *c, GF_Node *parent, GF_JSField *parent_owner, GF_FieldInfo *field){ GF_ScriptPriv *priv; u32 script_field; u32 i; GF_ScriptField *sf; if (!parent) { parent = parent_owner->owner; field = &parent_owner->field; } if (!parent) return; script_field = 0; if ((parent->sgprivate->tag == TAG_MPEG4_Script) || (parent->sgprivate->tag == TAG_X3D_Script) ) { script_field = 1; if ( (GF_Node *) JS_GetContextPrivate(c) == parent) script_field = 2; } if (script_field!=2) { if (field->on_event_in) field->on_event_in(parent); else if (script_field && (field->eventType==GF_SG_EVENT_IN) ) { gf_sg_script_event_in(parent, field); gf_node_changed(parent, field); return; } /*field has changed, set routes...*/ if (parent->sgprivate->tag == TAG_ProtoNode)gf_sg_proto_check_field_change(parent, field->fieldIndex); else { gf_node_event_out(parent, field->fieldIndex); gf_node_changed(parent, field); } return; } /*otherwise mark field if eventOut*/ if (parent_owner || parent) { priv = parent ? parent->sgprivate->UserPrivate : parent_owner->owner->sgprivate->UserPrivate; i=0; while ((sf = gf_list_enum(priv->fields, &i))) { if (sf->ALL_index == field->fieldIndex) { /*queue eventOut*/ if (sf->eventType == GF_SG_EVENT_OUT) { sf->activate_event_out = 1; } } } }}JSBool gf_sg_script_eventout_set_prop(JSContext *c, JSObject *obj, jsval id, jsval *val){ u32 i; const char *eventName; GF_ScriptPriv *script; GF_Node *n; GF_ScriptField *sf; GF_FieldInfo info; JSString *str = JS_ValueToString(c, id); if (!str) return JS_FALSE; eventName = JS_GetStringBytes(str); script = JS_GetScriptStack(c); if (!script) return JS_FALSE; n = (GF_Node *) JS_GetScript(c); i=0; while ((sf = gf_list_enum(script->fields, &i))) { if (!stricmp(sf->name, eventName)) { gf_node_get_field(n, sf->ALL_index, &info); gf_sg_script_to_node_field(c, *val, &info, n, NULL); sf->activate_event_out = 1; return JS_TRUE; } } return JS_FALSE;}/*generic ToString method*/static GFINLINE void sffield_toString(char *str, void *f_ptr, u32 fieldType){ char temp[1000]; switch (fieldType) { case GF_SG_VRML_SFVEC2F: { SFVec2f val = * ((SFVec2f *) f_ptr); sprintf(temp, "%f %f", FIX2FLT(val.x), FIX2FLT(val.y)); strcat(str, temp); break; } case GF_SG_VRML_SFVEC3F: { SFVec3f val = * ((SFVec3f *) f_ptr); sprintf(temp, "%f %f %f", FIX2FLT(val.x), FIX2FLT(val.y), FIX2FLT(val.z)); strcat(str, temp); break; } case GF_SG_VRML_SFVEC4F: { SFVec4f val = * ((SFVec4f *) f_ptr); sprintf(temp, "%f %f %f %f", FIX2FLT(val.x), FIX2FLT(val.y), FIX2FLT(val.z), FIX2FLT(val.q)); strcat(str, temp); break; } case GF_SG_VRML_SFROTATION: { SFRotation val = * ((SFRotation *) f_ptr); sprintf(temp, "%f %f %f %f", FIX2FLT(val.x), FIX2FLT(val.y), FIX2FLT(val.z), FIX2FLT(val.q)); strcat(str, temp); break; } case GF_SG_VRML_SFCOLOR: { SFColor val = * ((SFColor *) f_ptr); sprintf(temp, "%f %f %f", val.red, val.green, val.blue); strcat(str, temp); break; } case GF_SG_VRML_SFIMAGE: { SFImage *val = ((SFImage *)f_ptr); sprintf(temp, "%dx%dx%d", val->width, val->height, val->numComponents); strcat(str, temp); break; } }}static void JS_ObjectDestroyed(JSContext *c, JSObject *obj){ GF_ScriptPriv *priv = JS_GetScriptStack(c); JS_SetPrivate(c, obj, 0); if (priv->js_cache) gf_list_del_item(priv->js_cache, obj);}static JSBool field_toString(JSContext *c, JSObject *obj, uintN n, jsval *v, jsval *rval){ u32 i, len; jsdouble d; char temp[1000]; char str[5000]; JSString *s; jsval item; GF_JSField *f = (GF_JSField *) JS_GetPrivate(c, obj); if (!f) return JS_FALSE; strcpy(str, ""); if (gf_sg_vrml_is_sf_field(f->field.fieldType)) { sffield_toString(str, f->field.far_ptr, f->field.fieldType); } else { if (f->field.fieldType == GF_SG_VRML_MFNODE) return JS_TRUE; strcat(str, "["); JS_GetArrayLength(c, f->js_list, &len); for (i=0; i<len; i++) { JS_GetElement(c, f->js_list, (jsint) i, &item); switch (f->field.fieldType) { case GF_SG_VRML_MFBOOL: sprintf(temp, "%s", JSVAL_TO_BOOLEAN(item) ? "TRUE" : "FALSE"); strcat(str, temp); break; case GF_SG_VRML_MFINT32: sprintf(temp, "%d", JSVAL_TO_INT(item)); strcat(str, temp); break; case GF_SG_VRML_MFFLOAT: case GF_SG_VRML_MFTIME: JS_ValueToNumber(c, item, &d); sprintf(temp, "%g", d); strcat(str, temp); break; case GF_SG_VRML_MFSTRING: case GF_SG_VRML_MFURL: { JSString *j_str = JSVAL_TO_STRING(item); char *str_val = JS_GetStringBytes(j_str); strcat(str, str_val); } break; default: if (JSVAL_IS_OBJECT(item)) { GF_JSField *sf = (GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(item)); sffield_toString(str, sf->field.far_ptr, sf->field.fieldType); } break; } if (i<len-1) strcat(str, ", "); } strcat(str, "]"); } s = JS_NewStringCopyZ(c, str); if (!s) return JS_FALSE; *rval = STRING_TO_JSVAL(s); return JS_TRUE; }static JSBool SFNodeConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ u32 tag, ID; GF_Node *new_node; GF_JSField *field; JSString *str; GF_Proto *proto; GF_SceneGraph *sg; char *node_name; GF_ScriptPriv *priv = JS_GetScriptStack(c); M_Script *sc = JS_GetScript(c); if (!argc) { field = NewJSField(); field->field.fieldType = GF_SG_VRML_SFNODE; field->temp_node = NULL; field->field.far_ptr = &field->temp_node; JS_SetPrivate(c, obj, field); *rval = OBJECT_TO_JSVAL(obj); return JS_TRUE; } if (!JS_InstanceOf(c, obj, &js_rt->SFNodeClass, NULL) ) return JS_FALSE; str = JS_ValueToString(c, argv[0]); if (!str) return JS_FALSE; node_name = JS_GetStringBytes(str); if (!strnicmp(node_name, "_proto", 6)) { ID = atoi(node_name+6); /*locate proto in current graph and all parents*/ sg = sc->sgprivate->scenegraph; while (1) { proto = gf_sg_find_proto(sg, ID, NULL); if (proto) break; if (!sg->parent_scene) break; sg = sg->parent_scene; } if (!proto) return JS_FALSE; /* create interface and load code in current graph*/ new_node = gf_sg_proto_create_instance(sc->sgprivate->scenegraph, proto); if (!new_node) return JS_FALSE; /*OK, instanciate proto code*/ if (gf_sg_proto_load_code(new_node) != GF_OK) { gf_node_unregister(new_node, NULL); return JS_FALSE; } } else { if (sc->sgprivate->tag==TAG_MPEG4_Script) { tag = gf_node_mpeg4_type_by_class_name(node_name); } else { tag = gf_node_x3d_type_by_class_name(node_name); } if (!tag) return JS_FALSE; new_node = gf_node_new(sc->sgprivate->scenegraph, tag); if (!new_node) return JS_FALSE; gf_node_init(new_node); } gf_node_register(new_node, NULL); field = NewJSField(); field->field.fieldType = GF_SG_VRML_SFNODE; field->temp_node = new_node; field->field.far_ptr = &field->temp_node; field->obj = obj; JS_AddRoot(c, &field->obj); if (priv->js_cache) gf_list_add(priv->js_cache, obj); JS_SetPrivate(c, obj, field); *rval = OBJECT_TO_JSVAL(obj); return JS_TRUE;}static void node_finalize(JSContext *c, JSObject *obj){ GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); JS_ObjectDestroyed(c, obj); if (ptr) { if (ptr->temp_node) { GF_LOG(GF_LOG_DEBUG, GF_LOG_SCRIPT, ("[VRML JS] unregistering node %s\n", gf_node_get_class_name(ptr->temp_node))); gf_node_unregister(ptr->temp_node, ptr->owner); } free(ptr); }}static JSBool node_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ GF_Node *n; u32 index; JSString *str; GF_FieldInfo info; GF_JSField *ptr; if (! JS_InstanceOf(c, obj, &js_rt->SFNodeClass, NULL) ) return JS_FALSE; ptr = (GF_JSField *) JS_GetPrivate(c, obj); assert(ptr->field.fieldType==GF_SG_VRML_SFNODE); n = * ((GF_Node **)ptr->field.far_ptr); if (n && JSVAL_IS_STRING(id) && ( (str = JSVAL_TO_STRING(id)) != 0) ) { char *fieldName = JS_GetStringBytes(str); if (!strnicmp(fieldName, "toString", 8)) { return JS_TRUE; } /*fieldID indexing*/ if (!strnicmp(fieldName, "_field", 6)) { index = atoi(fieldName+6); if ( gf_node_get_field(n, index, &info) != GF_OK) return JS_FALSE; } else { if ( gf_node_get_field_by_name(n, fieldName, &info) != GF_OK) return JS_FALSE; } *vp = gf_sg_script_to_smjs_field(JS_GetScriptStack(c), &info, n, 0); return (*vp == JSVAL_NULL) ? JS_FALSE : JS_TRUE; } return JS_FALSE;}static JSBool node_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ GF_Node *n; GF_FieldInfo info; u32 index; char *fieldname; GF_JSField *ptr; if (! JS_InstanceOf(c, obj, &js_rt->SFNodeClass, NULL) ) return JS_FALSE; ptr = (GF_JSField *) JS_GetPrivate(c, obj); assert(ptr->field.fieldType==GF_SG_VRML_SFNODE); n = * ((GF_Node **)ptr->field.far_ptr); if (n && JSVAL_IS_STRING(id)) { JSString *str = JSVAL_TO_STRING(id); fieldname = JS_GetStringBytes(str); /*fieldID indexing*/ if (!strnicmp(fieldname, "_field", 6)) { index = atoi(fieldname+6); if ( gf_node_get_field(n, index, &info) != GF_OK) return JS_FALSE; } else { if (gf_node_get_field_by_name(n, fieldname, &info) != GF_OK) { /*VRML style*/ if (!strnicmp(fieldname, "set_", 4)) { fieldname+=4; if (gf_node_get_field_by_name(n, fieldname, &info) != GF_OK) return JS_FALSE; } else return JS_FALSE; } } gf_sg_script_to_node_field(c, *vp, &info, n, ptr); } return JS_TRUE;}static JSBool node_toString(JSContext *c, JSObject *obj, uintN i, jsval *v, jsval *rval){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -