📄 vrml_smjs.c
字号:
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 + -