📄 vrml_smjs.c
字号:
char str[1000]; u32 id; GF_Node *n; JSString *s; GF_JSField *f; const char *name; if (! JS_InstanceOf(c, obj, &js_rt->SFNodeClass, NULL) ) return JS_FALSE; f = (GF_JSField *) JS_GetPrivate(c, obj); if (!f) return JS_FALSE; str[0] = 0; n = * ((GF_Node **)f->field.far_ptr); name = gf_node_get_name_and_id(n, &id); if (id) { if (name) { sprintf(str , "DEF %s ", name); } else { sprintf(str , "DEF %d ", id - 1); } } strcat(str, gf_node_get_class_name(n)); s = JS_NewStringCopyZ(c, (const char *) str); if (!s) return JS_FALSE; *rval = STRING_TO_JSVAL(s); return JS_TRUE; }/* Generic field destructor */static void field_finalize(JSContext *c, JSObject *obj){ GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); JS_ObjectDestroyed(c, obj); if (!ptr) return; if (ptr->field_ptr) gf_sg_vrml_field_pointer_del(ptr->field_ptr, ptr->field.fieldType); free(ptr);}/*SFImage class functions */static GFINLINE GF_JSField *SFImage_Create(JSContext *c, JSObject *obj, u32 w, u32 h, u32 nbComp, MFInt32 *pixels){ u32 i, len; GF_JSField *field; SFImage *v; field = NewJSField(); v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFIMAGE); field->field_ptr = field->field.far_ptr = v; field->field.fieldType = GF_SG_VRML_SFIMAGE; v->width = w; v->height = h; v->numComponents = nbComp; v->pixels = (u8 *) malloc(sizeof(u8) * nbComp * w * h); len = MIN(nbComp * w * h, pixels->count); for (i=0; i<len; i++) v->pixels[i] = (u8) pixels->vals[i]; JS_SetPrivate(c, obj, field); return field;}static JSBool SFImageConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){ u32 w, h, nbComp; MFInt32 *pixels; if (argc<4) return 0; if (!JSVAL_IS_INT(argv[0]) || !JSVAL_IS_INT(argv[1]) || !JSVAL_IS_INT(argv[2])) return JS_FALSE; if (!JSVAL_IS_OBJECT(argv[3]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[3]), &js_rt->MFInt32Class, NULL)) return JS_FALSE; w = JSVAL_TO_INT(argv[0]); h = JSVAL_TO_INT(argv[1]); nbComp = JSVAL_TO_INT(argv[2]); pixels = (MFInt32 *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[3])))->field.far_ptr; SFImage_Create(c, obj, w, h, nbComp, pixels); return JS_TRUE;}static JSBool image_getProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ GF_ScriptPriv *priv = JS_GetScriptStack(c); GF_JSField *val = (GF_JSField *) JS_GetPrivate(c, obj); SFImage *sfi = (SFImage*)val->field.far_ptr; if (JSVAL_IS_INT(id)) { switch (JSVAL_TO_INT(id)) { case 0: *vp = INT_TO_JSVAL( sfi->width ); break; case 1: *vp = INT_TO_JSVAL( sfi->height); break; case 2: *vp = INT_TO_JSVAL( sfi->numComponents ); break; case 3: { u32 i, len; JSObject *an_obj = JS_ConstructObject(priv->js_ctx, &js_rt->MFInt32Class, 0, priv->js_obj); len = sfi->width*sfi->height*sfi->numComponents; for (i=0; i<len; i++) { jsval newVal = INT_TO_JSVAL(sfi->pixels[i]); JS_SetElement(priv->js_ctx, an_obj, (jsint) i, &newVal); } } break; default: return JS_FALSE; } } return JS_TRUE;}static JSBool image_setProperty(JSContext *c, JSObject *obj, jsval id, jsval *vp){ u32 ival; Bool changed = 0; GF_JSField *ptr = (GF_JSField *) JS_GetPrivate(c, obj); SFImage *sfi = (SFImage*)ptr->field.far_ptr; if (JSVAL_IS_INT(id) && JSVAL_TO_INT(id) >= 0 && JSVAL_TO_INT(id) < 4) { switch (JSVAL_TO_INT(id)) { case 0: ival = JSVAL_TO_INT(vp); changed = ! (sfi->width == ival); sfi->width = ival; if (changed && sfi->pixels) { free(sfi->pixels); sfi->pixels = NULL; } break; case 1: ival = JSVAL_TO_INT(vp); changed = ! (sfi->height == ival); sfi->height = ival; if (changed && sfi->pixels) { free(sfi->pixels); sfi->pixels = NULL; } break; case 2: ival = JSVAL_TO_INT(vp); changed = ! (sfi->numComponents == ival); sfi->numComponents = ival; if (changed && sfi->pixels) { free(sfi->pixels); sfi->pixels = NULL; } break; case 3: { MFInt32 *pixels; u32 len, i; if (!JSVAL_IS_OBJECT(*vp) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(*vp), &js_rt->MFInt32Class, NULL)) return JS_FALSE; pixels = (MFInt32 *) ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(*vp)))->field.far_ptr; if (sfi->pixels) free(sfi->pixels); len = sfi->width*sfi->height*sfi->numComponents; sfi->pixels = (char *) malloc(sizeof(char)*len); len = MAX(len, pixels->count); for (i=0; i<len; i++) sfi->pixels[i] = (u8) pixels->vals[i]; changed = 1; break; } default: return JS_FALSE; } if (changed) Script_FieldChanged(c, NULL, ptr, NULL); return JS_TRUE; } return JS_FALSE;}/*SFVec2f class functions */static GFINLINE GF_JSField *SFVec2f_Create(JSContext *c, JSObject *obj, Fixed x, Fixed y){ GF_JSField *field; SFVec2f *v; field = NewJSField(); v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFVEC2F); field->field_ptr = field->field.far_ptr = v; field->field.fieldType = GF_SG_VRML_SFVEC2F; v->x = x; v->y = y; JS_SetPrivate(c, obj, field); return field;}static JSBool SFVec2fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){ jsdouble x = 0.0, y = 0.0; if (argc > 0) JS_ValueToNumber(c, argv[0], &x); if (argc > 1) JS_ValueToNumber(c, argv[1], &y); SFVec2f_Create(c, obj, FLT2FIX( x), FLT2FIX( y)); return JS_TRUE;}static JSBool vec2f_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( ((SFVec2f*)val->field.far_ptr)->x) )); break; case 1: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec2f*)val->field.far_ptr)->y) )); break; default: return JS_FALSE; } } return JS_TRUE;}static JSBool vec2f_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) < 2 && JS_ValueToNumber(c, *vp, &d)) { switch (JSVAL_TO_INT(id)) { case 0: v = FLT2FIX( d); changed = ! ( ((SFVec2f*)ptr->field.far_ptr)->x == v); ((SFVec2f*)ptr->field.far_ptr)->x = v; break; case 1: v = FLT2FIX( d); changed = ! ( ((SFVec2f*)ptr->field.far_ptr)->y == v); ((SFVec2f*)ptr->field.far_ptr)->y = v; break; default: return JS_FALSE; } if (changed) Script_FieldChanged(c, NULL, ptr, NULL); return JS_TRUE; } return JS_FALSE;}static JSBool vec2f_add(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec2f *v1, *v2; JSObject *pNew; if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec2fClass, NULL)) return JS_FALSE; v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr; pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj)); SFVec2f_Create(c, pNew, v1->x + v2->x, v1->y + v2->y); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec2f_subtract(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec2f *v1, *v2; JSObject *pNew; if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec2fClass, NULL)) return JS_FALSE; v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr; pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj)); SFVec2f_Create(c, pNew, v1->x - v2->x, v1->y - v2->y); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec2f_negate(JSContext *c, JSObject *obj, uintN n, jsval *v, jsval *rval){ SFVec2f *v1; JSObject *pNew; v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj)); SFVec2f_Create(c, pNew, -v1->x , -v1->y ); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec2f_multiply(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec2f *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->SFVec2fClass, 0, JS_GetParent(c, obj)); JS_ValueToNumber(c, argv[0], &d ); v = FLT2FIX( d); SFVec2f_Create(c, pNew, gf_mulfix(v1->x , v), gf_mulfix(v1->y, v) ); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec2f_divide(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec2f *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->SFVec2fClass, 0, JS_GetParent(c, obj)); JS_ValueToNumber(c, argv[0], &d ); v = FLT2FIX(d); SFVec2f_Create(c, pNew, gf_divfix(v1->x, v), gf_divfix(v1->y, v)); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec2f_length(JSContext *c, JSObject *obj, uintN n, jsval *val, jsval *rval){ Double res; SFVec2f *v1; v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; res = FIX2FLT(gf_v2d_len(v1)); *rval = DOUBLE_TO_JSVAL(JS_NewDouble(c, res) ); return JS_TRUE;}static JSBool vec2f_normalize(JSContext *c, JSObject *obj, uintN n, jsval *val, jsval *rval){ SFVec2f *v1; Fixed res; JSObject *pNew; v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; res = gf_v2d_len(v1); pNew = JS_NewObject(c, &js_rt->SFVec2fClass, 0, JS_GetParent(c, obj)); SFVec2f_Create(c, pNew, gf_divfix(v1->x, res), gf_divfix(v1->y, res) ); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec2f_dot(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec2f *v1, *v2; if (argc<=0 || !JSVAL_IS_OBJECT(argv[0]) || !JS_InstanceOf(c, JSVAL_TO_OBJECT(argv[0]), &js_rt->SFVec2fClass, NULL)) return JS_FALSE; v1 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; v2 = ((GF_JSField *) JS_GetPrivate(c, JSVAL_TO_OBJECT(argv[0])))->field.far_ptr; *rval = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( gf_mulfix(v1->x, v2->x) + gf_mulfix(v1->y, v2->y) ) ) ); return JS_TRUE;}/*SFVec3f class functions */static GFINLINE GF_JSField *SFVec3f_Create(JSContext *c, JSObject *obj, Fixed x, Fixed y, Fixed z){ GF_JSField *field; SFVec3f *v; field = NewJSField(); v = gf_sg_vrml_field_pointer_new(GF_SG_VRML_SFVEC3F); field->field_ptr = field->field.far_ptr = v; field->field.fieldType = GF_SG_VRML_SFVEC3F; v->x = x; v->y = y; v->z = z; JS_SetPrivate(c, obj, field); return field;}static JSBool SFVec3fConstructor(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rv){ jsdouble x = 0.0, y = 0.0, z = 0.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); SFVec3f_Create(c, obj, FLT2FIX( x), FLT2FIX( y), FLT2FIX( z)); return JS_TRUE;}static JSBool vec3f_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( ((SFVec3f*)val->field.far_ptr)->x) )); break; case 1: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec3f*)val->field.far_ptr)->y) )); break; case 2: *vp = DOUBLE_TO_JSVAL(JS_NewDouble(c, FIX2FLT( ((SFVec3f*)val->field.far_ptr)->z) )); break; default: return JS_FALSE; } } return JS_TRUE;}static JSBool vec3f_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 = ! ( ((SFVec3f*)ptr->field.far_ptr)->x == v); ((SFVec3f*)ptr->field.far_ptr)->x = v; break; case 1: v = FLT2FIX( d); changed = ! ( ((SFVec3f*)ptr->field.far_ptr)->y == v); ((SFVec3f*)ptr->field.far_ptr)->y = v; break; case 2: v = FLT2FIX( d); changed = ! ( ((SFVec3f*)ptr->field.far_ptr)->z == v); ((SFVec3f*)ptr->field.far_ptr)->z = v; break; default: return JS_FALSE; } if (changed) Script_FieldChanged(c, NULL, ptr, NULL); return JS_TRUE; } return JS_FALSE;}static JSBool vec3f_add(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec3f *v1, *v2; 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 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; v2 = ((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)); SFVec3f_Create(c, pNew, v1->x + v2->x, v1->y + v2->y, v1->z + v2->z); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}static JSBool vec3f_subtract(JSContext *c, JSObject *obj, uintN argc, jsval *argv, jsval *rval){ SFVec3f *v1, *v2; 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 = ((GF_JSField *) JS_GetPrivate(c, obj))->field.far_ptr; v2 = ((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)); SFVec3f_Create(c, pNew, v1->x - v2->x, v1->y - v2->y, v1->z - v2->z); *rval = OBJECT_TO_JSVAL(pNew); return JS_TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -