⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vrml_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -