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

📄 vrml_smjs.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
static JSBool vec3f_negate(JSContext *c, JSObject *obj, uintN n, jsval *v, jsval *rval){	SFVec3f *v1;	JSObject *pNew;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	SFVec3f_Create(c, pNew, -v1->x , -v1->y , -v1->z );	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec3f_multiply(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f *v1;	JSObject *pNew;	jsdouble d;	Fixed v;	if (argc<=0) return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	JS_ValueToNumber(c, argv[0], &d );	v = FLT2FIX(d);	SFVec3f_Create(c, pNew, gf_mulfix(v1->x, v), gf_mulfix(v1->y, v), gf_mulfix(v1->z, v) );	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec3f_divide(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f *v1;	JSObject *pNew;	jsdouble d;	Fixed v;	if (argc<=0) return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	JS_ValueToNumber(c, argv[0], &d );	v = FLT2FIX(d);	SFVec3f_Create(c, pNew, gf_divfix(v1->x, v), gf_divfix(v1->y, v), gf_divfix(v1->z, v));	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec3f_length(JSContext *c, JSObject *obj, uintN n, jsval *val, jsval *rval){	Fixed res;	SFVec3f *v1;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	res = gf_vec_len(*v1);	*rval = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT(res)) );	return JS_TRUE;}static JSBool vec3f_normalize(JSContext *c, JSObject *obj, uintN n, jsval *val, jsval *rval){	SFVec3f v1;	JSObject *pNew;	v1 = * (SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	gf_vec_norm(&v1);	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	SFVec3f_Create(c, pNew, v1.x, v1.y, v1.z);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool vec3f_dot(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f v1, v2;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec3fClass, NULL))		return JS_FALSE;	v1 = *(SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = *(SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	*rval = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT(gf_vec_dot(v1, v2))) );	return JS_TRUE;}static JSBool vec3f_cross(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f v1, v2, v3;	JSObject *pNew;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec3fClass, NULL))		return JS_FALSE;	v1 = * (SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;    v2 = * (SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	v3 = gf_vec_cross(v1, v2);	SFVec3f_Create(c, pNew, v3.x, v3.y, v3.z);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}/*SFRotation class*/static GFINLINE GF_JSField *SFRotation_Create(JSContext *c, JSObject *obj, Fixed x, Fixed y, Fixed z, Fixed q){	GF_JSField *field;	SFRotation *v;	field = NewJSField();	v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFROTATION);	field->field_ptr = field->field.far_ptr = v;	field->field.fieldType = GF_SG_VRML_SFROTATION;	v->x = x;	v->y = y;	v->z = z;	v->q = q;	JS_SetPrivate(c, obj, field);	return field;}static JSBool SFRotationConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){	JSObject *an_obj;	SFVec3f v1, v2;	Fixed l1, l2, dot;	jsdouble x = 0.0, y = 0.0, z = 0.0, a = 0.0;	if (argc == 0) {		SFRotation_Create(c, obj, FLT2FIX(x), FLT2FIX(y), FIX_ONE, FLT2FIX(a) );		return JS_TRUE;	}	if ((argc>0) && JSVAL_IS_DOUBLE(argv[0])) {		if (argc > 0) JS_ValueToNumber(c, argv[0], &x);		if (argc > 1) JS_ValueToNumber(c, argv[1], &y);		if (argc > 2) JS_ValueToNumber(c, argv[2], &z);		if (argc > 3) JS_ValueToNumber(c, argv[2], &a);		SFRotation_Create(c, obj, FLT2FIX(x), FLT2FIX(y), FLT2FIX(z), FLT2FIX(a));		return JS_TRUE;	}	if (argc!=2) return JS_FALSE;	if (!JSVAL_IS_OBJECT(argv[0])) return JS_FALSE;	an_obj = JSVAL_TO_OBJECT(argv[0]);	if (! JS_InstanceOf(c, an_obj, &js_rt->SFVec3fClass, NULL)) return JS_FALSE;	v1 = * (SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, an_obj))->field.far_ptr;	if (JSVAL_IS_DOUBLE(argv[1])) {		JS_ValueToNumber(c, argv[1], &a);		SFRotation_Create(c, obj, v1.x, v1.y, v1.z, FLT2FIX(a));		return JS_TRUE;	}	if (!JSVAL_IS_OBJECT(argv[1])) return JS_FALSE;	an_obj = JSVAL_TO_OBJECT(argv[1]);	if (!JS_InstanceOf(c, an_obj, &js_rt->SFVec3fClass, NULL)) return JS_FALSE;	v2 = * (SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, an_obj))->field.far_ptr;	l1 = gf_vec_len(v1);	l2 = gf_vec_len(v2);	dot = gf_divfix(gf_vec_dot(v1, v2), gf_mulfix(l1, l2) );	a = gf_atan2(gf_sqrt(FIX_ONE - gf_mulfix(dot, dot)), dot);	SFRotation_Create(c, obj, gf_mulfix(v1.y, v2.z) - gf_mulfix(v2.y, v1.z),								gf_mulfix(v1.z, v2.x) - gf_mulfix(v2.z, v1.x),								gf_mulfix(v1.x, v2.y) - gf_mulfix(v2.x, v1.y),								FLT2FIX(a));	return JS_TRUE;}static JSBool rot_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	GF_JSField *val = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id)) {		switch (JSVAL_TO_INT(id)) {		case 0: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFRotation*)val->field.far_ptr)->x)) ); break;		case 1: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFRotation*)val->field.far_ptr)->y)) ); break;		case 2: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFRotation*)val->field.far_ptr)->z)) ); break;		case 3: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFRotation*)val->field.far_ptr)->q)) ); break;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool rot_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	jsdouble d;	Fixed v;	Bool changed = 0;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0 && JSVAL_TO_INT(id) < 4 && JS_ValueToNumber(c, *vp, &d)) {		switch (JSVAL_TO_INT(id)) {		case 0: 			v = FLT2FIX(d);			changed = ! ( ((SFRotation*)ptr->field.far_ptr)->x == v);			((SFRotation*)ptr->field.far_ptr)->x = v;			break;		case 1: 			v = FLT2FIX(d);			changed = ! ( ((SFRotation*)ptr->field.far_ptr)->y == v);			((SFRotation*)ptr->field.far_ptr)->y = v;			break;		case 2: 			v = FLT2FIX(d);			changed = ! ( ((SFRotation*)ptr->field.far_ptr)->z == v);			((SFRotation*)ptr->field.far_ptr)->z = v;			break;		case 3: 			v = FLT2FIX(d);			changed = ! ( ((SFRotation*)ptr->field.far_ptr)->q == v);			((SFRotation*)ptr->field.far_ptr)->q = v;			break;		default: return JS_FALSE;		}		if (changed) Script_FieldChanged(c, NULL, ptr, NULL);		return JS_TRUE;    }	return JS_FALSE;}static JSBool rot_getAxis(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFRotation r;	JSObject *pNew;	r = * (SFRotation *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	SFVec3f_Create(c, pNew, r.x, r.y, r.z);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool rot_inverse(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFRotation r;	JSObject *pNew;	r = * (SFRotation *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	pNew = JS_NewObject(c, &js_rt->SFRotationClass, 0, JS_GetParent(c, obj));  	SFRotation_Create(c, pNew, r.x, r.y, r.z, r.q-GF_PI);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool rot_multiply(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFRotation r1, r2;	SFVec4f q1, q2;	JSObject *pNew;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFRotationClass, NULL))		return JS_FALSE;		r1 = * (SFRotation *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	r2 = * (SFRotation *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	q1 = gf_quat_from_rotation(r1);	q2 = gf_quat_from_rotation(r2);	q1 = gf_quat_multiply(&q1, &q2);	r1 = gf_quat_to_rotation(&q1);	pNew = JS_NewObject(c, &js_rt->SFRotationClass, 0, JS_GetParent(c, obj)); 	SFRotation_Create(c, pNew, r1.x, r1.y, r1.z, r1.q);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool rot_multVec(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f v;	SFRotation r;	GF_Matrix mx;	JSObject *pNew;	if (argc<=0) return JS_FALSE;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec3fClass, NULL))		return JS_FALSE;	r = *(SFRotation *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	v = *(SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	gf_mx_init(mx);	gf_mx_add_rotation(&mx, r.q, r.x, r.y, r.z);	gf_mx_apply_vec(&mx, &v);	pNew = JS_NewObject(c, &js_rt->SFVec3fClass, 0, JS_GetParent(c, obj));  	SFVec3f_Create(c, pNew, v.x, v.y, v.z);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}static JSBool rot_setAxis(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFVec3f v;	SFRotation r;	if (argc<=0) return JS_FALSE;	if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec3fClass, NULL))		return JS_FALSE;	r = *(SFRotation *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	v = *(SFVec3f *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	r.x = v.x;	r.y = v.y;	r.z = v.z;	return JS_TRUE;}static JSBool rot_slerp(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){	SFRotation v1, v2, res;	SFVec4f q1, q2;	JSObject *pNew;	jsdouble d;	if (argc<=1) return JS_FALSE;	if (!JSVAL_IS_DOUBLE(argv[1]) || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFRotationClass, NULL)) return JS_FALSE;	v1 = *(SFRotation *) ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	v2 = *(SFRotation *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr;	JS_ValueToNumber(c, argv[1], &d );	q1 = gf_quat_from_rotation(v1);	q2 = gf_quat_from_rotation(v2);	q1 = gf_quat_slerp(q1, q2, FLT2FIX( d));	res = gf_quat_to_rotation(&q1);	pNew = JS_NewObject(c, &js_rt->SFRotationClass, 0, JS_GetParent(c, obj));  	SFRotation_Create(c, pNew, res.x, res.y, res.z, res.q);	*rval = OBJECT_TO_JSVAL(pNew);	return JS_TRUE;}/* SFColor class functions */static GFINLINE GF_JSField *SFColor_Create(JSContext *c, JSObject *obj, Fixed r, Fixed g, Fixed b){	GF_JSField *field;	SFColor *v;	field = NewJSField();	v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFCOLOR);	field->field_ptr = field->field.far_ptr = v;	field->field.fieldType = GF_SG_VRML_SFCOLOR;	v->red = r;	v->green = g;	v->blue = b;	JS_SetPrivate(c, obj, field);	return field;}static JSBool SFColorConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){	jsdouble r = 0.0, g = 0.0, b = 0.0;	if (argc > 0) JS_ValueToNumber(c, argv[0], &r);	if (argc > 1) JS_ValueToNumber(c, argv[1], &g);	if (argc > 2) JS_ValueToNumber(c, argv[2], &b);	SFColor_Create(c, obj, FLT2FIX( r), FLT2FIX( g), FLT2FIX( b));	return JS_TRUE;}static JSBool color_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	GF_JSField *val = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id)) {		switch (JSVAL_TO_INT(id)) {		case 0: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFColor*)val->field.far_ptr)->red)) ); break;		case 1: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFColor*)val->field.far_ptr)->green)) ); break;		case 2: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFColor*)val->field.far_ptr)->blue)) ); break;		default: return JS_FALSE;		}	}	return JS_TRUE;}static JSBool color_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){	jsdouble d;	Fixed v;	Bool changed = 0;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0 && JSVAL_TO_INT(id) < 3 && JS_ValueToNumber(c, *vp, &d)) {		switch (JSVAL_TO_INT(id)) {		case 0: 			v = FLT2FIX(d);			changed = ! ( ((SFColor*)ptr->field.far_ptr)->red == v);			((SFColor*)ptr->field.far_ptr)->red = v;			break;		case 1: 			v = FLT2FIX(d);			changed = ! ( ((SFColor*)ptr->field.far_ptr)->green == v);			((SFColor*)ptr->field.far_ptr)->green = v;			break;		case 2: 			v = FLT2FIX(d);			changed = ! ( ((SFColor*)ptr->field.far_ptr)->blue == v);			((SFColor*)ptr->field.far_ptr)->blue = v;			break;		default: return JS_FALSE;		}		if (changed) Script_FieldChanged(c, NULL, ptr, NULL);		return JS_TRUE;    }	return JS_FALSE;}static JSBool color_setHSV(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){	SFColor *v1, hsv;	jsdouble h, s, v;	GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj);	if (argc != 3) return JS_FALSE;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	JS_ValueToNumber( c, argv[0], &h);	JS_ValueToNumber( c, argv[1], &s);	JS_ValueToNumber( c, argv[2], &v);	hsv.red = FLT2FIX( h);	hsv.green = FLT2FIX( s);	hsv.blue = FLT2FIX( v);	SFColor_fromHSV(&hsv);	gf_sg_vrml_field_copy(v1, &hsv, GF_SG_VRML_SFCOLOR);	Script_FieldChanged(c, NULL, ptr, NULL);	return JS_TRUE;}static JSBool color_getHSV(JSContext *c, JSObject *obj, uintN n, jsval *va, jsval *rval){	SFColor *v1, hsv;	jsval vec[3];	JSObject *arr;	v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr;	hsv = *v1;	SFColor_toHSV(&hsv);	vec[0] = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT(hsv.red)));	vec[1] = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT(hsv.green)));	vec[2] = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT(hsv.blue)));	arr = JS_NewArrayObject(c, 3, vec);	*rval = OBJECT_TO_JSVAL(arr);	return JS_TRUE;}static JSBool MFArrayConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval, u32 fieldType){	GF_JSField *ptr = NewJSField();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -