fix gc bug
This commit is contained in:
94
obj.c
94
obj.c
@@ -158,10 +158,12 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
}
|
||||
|
||||
// Create buffer
|
||||
JSValue tmp;
|
||||
JS_ROOT(buffers_arr, JS_NewArray(js));
|
||||
{
|
||||
JS_ROOT(buf, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, buf.val, "blob", js_new_blob_stoned_copy(js, buffer_data, total_buffer_size));
|
||||
tmp = js_new_blob_stoned_copy(js, buffer_data, total_buffer_size);
|
||||
JS_SetPropertyStr(js, buf.val, "blob", tmp);
|
||||
JS_SetPropertyStr(js, buf.val, "byte_length", JS_NewInt64(js, total_buffer_size));
|
||||
JS_SetPropertyNumber(js, buffers_arr.val, 0, buf.val);
|
||||
}
|
||||
@@ -178,7 +180,8 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, pos_view.val, "byte_offset", JS_NewInt64(js, 0));
|
||||
JS_SetPropertyStr(js, pos_view.val, "byte_length", JS_NewInt64(js, pos_size));
|
||||
JS_SetPropertyStr(js, pos_view.val, "byte_stride", JS_NULL);
|
||||
JS_SetPropertyStr(js, pos_view.val, "usage", JS_NewString(js, "vertex"));
|
||||
tmp = JS_NewString(js, "vertex");
|
||||
JS_SetPropertyStr(js, pos_view.val, "usage", tmp);
|
||||
JS_SetPropertyNumber(js, views_arr.val, view_idx++, pos_view.val);
|
||||
}
|
||||
int pos_view_idx = 0;
|
||||
@@ -190,7 +193,8 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, norm_view.val, "byte_offset", JS_NewInt64(js, pos_size));
|
||||
JS_SetPropertyStr(js, norm_view.val, "byte_length", JS_NewInt64(js, norm_size));
|
||||
JS_SetPropertyStr(js, norm_view.val, "byte_stride", JS_NULL);
|
||||
JS_SetPropertyStr(js, norm_view.val, "usage", JS_NewString(js, "vertex"));
|
||||
tmp = JS_NewString(js, "vertex");
|
||||
JS_SetPropertyStr(js, norm_view.val, "usage", tmp);
|
||||
norm_view_idx = view_idx;
|
||||
JS_SetPropertyNumber(js, views_arr.val, view_idx++, norm_view.val);
|
||||
}
|
||||
@@ -202,7 +206,8 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, uv_view.val, "byte_offset", JS_NewInt64(js, pos_size + norm_size));
|
||||
JS_SetPropertyStr(js, uv_view.val, "byte_length", JS_NewInt64(js, uv_size));
|
||||
JS_SetPropertyStr(js, uv_view.val, "byte_stride", JS_NULL);
|
||||
JS_SetPropertyStr(js, uv_view.val, "usage", JS_NewString(js, "vertex"));
|
||||
tmp = JS_NewString(js, "vertex");
|
||||
JS_SetPropertyStr(js, uv_view.val, "usage", tmp);
|
||||
uv_view_idx = view_idx;
|
||||
JS_SetPropertyNumber(js, views_arr.val, view_idx++, uv_view.val);
|
||||
}
|
||||
@@ -215,7 +220,8 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, idx_view.val, "byte_offset", JS_NewInt64(js, pos_size + norm_size + uv_size));
|
||||
JS_SetPropertyStr(js, idx_view.val, "byte_length", JS_NewInt64(js, idx_size));
|
||||
JS_SetPropertyStr(js, idx_view.val, "byte_stride", JS_NULL);
|
||||
JS_SetPropertyStr(js, idx_view.val, "usage", JS_NewString(js, "index"));
|
||||
tmp = JS_NewString(js, "index");
|
||||
JS_SetPropertyStr(js, idx_view.val, "usage", tmp);
|
||||
idx_view_idx = view_idx;
|
||||
JS_SetPropertyNumber(js, views_arr.val, view_idx++, idx_view.val);
|
||||
}
|
||||
@@ -240,8 +246,10 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, spa.val, "view", JS_NewInt32(js, pos_view_idx));
|
||||
JS_SetPropertyStr(js, spa.val, "byte_offset", JS_NewInt64(js, vertex_offset * 3 * sizeof(float)));
|
||||
JS_SetPropertyStr(js, spa.val, "count", JS_NewInt64(js, shape_vertices));
|
||||
JS_SetPropertyStr(js, spa.val, "component_type", JS_NewString(js, "f32"));
|
||||
JS_SetPropertyStr(js, spa.val, "type", JS_NewString(js, "vec3"));
|
||||
tmp = JS_NewString(js, "f32");
|
||||
JS_SetPropertyStr(js, spa.val, "component_type", tmp);
|
||||
tmp = JS_NewString(js, "vec3");
|
||||
JS_SetPropertyStr(js, spa.val, "type", tmp);
|
||||
JS_SetPropertyStr(js, spa.val, "normalized", JS_FALSE);
|
||||
JS_SetPropertyStr(js, spa.val, "min", JS_NULL);
|
||||
JS_SetPropertyStr(js, spa.val, "max", JS_NULL);
|
||||
@@ -255,8 +263,10 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, sna.val, "view", JS_NewInt32(js, norm_view_idx));
|
||||
JS_SetPropertyStr(js, sna.val, "byte_offset", JS_NewInt64(js, vertex_offset * 3 * sizeof(float)));
|
||||
JS_SetPropertyStr(js, sna.val, "count", JS_NewInt64(js, shape_vertices));
|
||||
JS_SetPropertyStr(js, sna.val, "component_type", JS_NewString(js, "f32"));
|
||||
JS_SetPropertyStr(js, sna.val, "type", JS_NewString(js, "vec3"));
|
||||
tmp = JS_NewString(js, "f32");
|
||||
JS_SetPropertyStr(js, sna.val, "component_type", tmp);
|
||||
tmp = JS_NewString(js, "vec3");
|
||||
JS_SetPropertyStr(js, sna.val, "type", tmp);
|
||||
JS_SetPropertyStr(js, sna.val, "normalized", JS_FALSE);
|
||||
JS_SetPropertyStr(js, sna.val, "min", JS_NULL);
|
||||
JS_SetPropertyStr(js, sna.val, "max", JS_NULL);
|
||||
@@ -270,8 +280,10 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, sua.val, "view", JS_NewInt32(js, uv_view_idx));
|
||||
JS_SetPropertyStr(js, sua.val, "byte_offset", JS_NewInt64(js, vertex_offset * 2 * sizeof(float)));
|
||||
JS_SetPropertyStr(js, sua.val, "count", JS_NewInt64(js, shape_vertices));
|
||||
JS_SetPropertyStr(js, sua.val, "component_type", JS_NewString(js, "f32"));
|
||||
JS_SetPropertyStr(js, sua.val, "type", JS_NewString(js, "vec2"));
|
||||
tmp = JS_NewString(js, "f32");
|
||||
JS_SetPropertyStr(js, sua.val, "component_type", tmp);
|
||||
tmp = JS_NewString(js, "vec2");
|
||||
JS_SetPropertyStr(js, sua.val, "type", tmp);
|
||||
JS_SetPropertyStr(js, sua.val, "normalized", JS_FALSE);
|
||||
JS_SetPropertyStr(js, sua.val, "min", JS_NULL);
|
||||
JS_SetPropertyStr(js, sua.val, "max", JS_NULL);
|
||||
@@ -284,8 +296,10 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, sia.val, "view", JS_NewInt32(js, idx_view_idx));
|
||||
JS_SetPropertyStr(js, sia.val, "byte_offset", JS_NewInt64(js, vertex_offset * (use_32bit ? sizeof(uint32_t) : sizeof(uint16_t))));
|
||||
JS_SetPropertyStr(js, sia.val, "count", JS_NewInt64(js, shape_vertices));
|
||||
JS_SetPropertyStr(js, sia.val, "component_type", JS_NewString(js, use_32bit ? "u32" : "u16"));
|
||||
JS_SetPropertyStr(js, sia.val, "type", JS_NewString(js, "scalar"));
|
||||
tmp = JS_NewString(js, use_32bit ? "u32" : "u16");
|
||||
JS_SetPropertyStr(js, sia.val, "component_type", tmp);
|
||||
tmp = JS_NewString(js, "scalar");
|
||||
JS_SetPropertyStr(js, sia.val, "type", tmp);
|
||||
JS_SetPropertyStr(js, sia.val, "normalized", JS_FALSE);
|
||||
JS_SetPropertyStr(js, sia.val, "min", JS_NULL);
|
||||
JS_SetPropertyStr(js, sia.val, "max", JS_NULL);
|
||||
@@ -294,12 +308,14 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
|
||||
// Create mesh
|
||||
JS_ROOT(mesh, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, mesh.val, "name", shape->name ? JS_NewString(js, shape->name) : JS_NULL);
|
||||
tmp = shape->name ? JS_NewString(js, shape->name) : JS_NULL;
|
||||
JS_SetPropertyStr(js, mesh.val, "name", tmp);
|
||||
|
||||
JS_ROOT(prims_arr, JS_NewArray(js));
|
||||
{
|
||||
JS_ROOT(prim, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, prim.val, "topology", JS_NewString(js, "triangles"));
|
||||
tmp = JS_NewString(js, "triangles");
|
||||
JS_SetPropertyStr(js, prim.val, "topology", tmp);
|
||||
|
||||
JS_ROOT(attrs, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, attrs.val, "POSITION", JS_NewInt32(js, shape_pos_acc));
|
||||
@@ -328,11 +344,13 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
for (size_t i = 0; i < num_materials; i++) {
|
||||
tinyobj_material_t *mat = &materials[i];
|
||||
JS_ROOT(m, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, m.val, "name", mat->name ? JS_NewString(js, mat->name) : JS_NULL);
|
||||
tmp = mat->name ? JS_NewString(js, mat->name) : JS_NULL;
|
||||
JS_SetPropertyStr(js, m.val, "name", tmp);
|
||||
|
||||
JS_ROOT(pbr, JS_NewObject(js));
|
||||
float bc[4] = {mat->diffuse[0], mat->diffuse[1], mat->diffuse[2], 1.0f};
|
||||
JS_SetPropertyStr(js, pbr.val, "base_color_factor", make_float_array(js, bc, 4));
|
||||
tmp = make_float_array(js, bc, 4);
|
||||
JS_SetPropertyStr(js, pbr.val, "base_color_factor", tmp);
|
||||
JS_SetPropertyStr(js, pbr.val, "base_color_texture", JS_NULL);
|
||||
JS_SetPropertyStr(js, pbr.val, "metallic_factor", JS_NewFloat64(js, 0.0));
|
||||
JS_SetPropertyStr(js, pbr.val, "roughness_factor", JS_NewFloat64(js, 1.0));
|
||||
@@ -340,11 +358,13 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, pbr.val, "normal_texture", JS_NULL);
|
||||
JS_SetPropertyStr(js, pbr.val, "occlusion_texture", JS_NULL);
|
||||
float ef[3] = {mat->emission[0], mat->emission[1], mat->emission[2]};
|
||||
JS_SetPropertyStr(js, pbr.val, "emissive_factor", make_float_array(js, ef, 3));
|
||||
tmp = make_float_array(js, ef, 3);
|
||||
JS_SetPropertyStr(js, pbr.val, "emissive_factor", tmp);
|
||||
JS_SetPropertyStr(js, pbr.val, "emissive_texture", JS_NULL);
|
||||
JS_SetPropertyStr(js, m.val, "pbr", pbr.val);
|
||||
|
||||
JS_SetPropertyStr(js, m.val, "alpha_mode", JS_NewString(js, "OPAQUE"));
|
||||
tmp = JS_NewString(js, "OPAQUE");
|
||||
JS_SetPropertyStr(js, m.val, "alpha_mode", tmp);
|
||||
JS_SetPropertyStr(js, m.val, "alpha_cutoff", JS_NewFloat64(js, 0.5));
|
||||
JS_SetPropertyStr(js, m.val, "double_sided", JS_FALSE);
|
||||
|
||||
@@ -353,25 +373,33 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, obj.val, "materials", materials_arr.val);
|
||||
|
||||
// Empty arrays for unsupported features
|
||||
JS_SetPropertyStr(js, obj.val, "images", JS_NewArray(js));
|
||||
JS_SetPropertyStr(js, obj.val, "textures", JS_NewArray(js));
|
||||
JS_SetPropertyStr(js, obj.val, "samplers", JS_NewArray(js));
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, obj.val, "images", tmp);
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, obj.val, "textures", tmp);
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, obj.val, "samplers", tmp);
|
||||
|
||||
// Nodes - one node per mesh
|
||||
JS_ROOT(nodes_arr, JS_NewArray(js));
|
||||
JS_ROOT(scene_nodes, JS_NewArray(js));
|
||||
for (size_t i = 0; i < num_shapes; i++) {
|
||||
JS_ROOT(n, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, n.val, "name", shapes[i].name ? JS_NewString(js, shapes[i].name) : JS_NULL);
|
||||
tmp = shapes[i].name ? JS_NewString(js, shapes[i].name) : JS_NULL;
|
||||
JS_SetPropertyStr(js, n.val, "name", tmp);
|
||||
JS_SetPropertyStr(js, n.val, "mesh", JS_NewInt32(js, i));
|
||||
JS_SetPropertyStr(js, n.val, "children", JS_NewArray(js));
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, n.val, "children", tmp);
|
||||
JS_SetPropertyStr(js, n.val, "matrix", JS_NULL);
|
||||
float t[3] = {0, 0, 0};
|
||||
float r[4] = {0, 0, 0, 1};
|
||||
float s[3] = {1, 1, 1};
|
||||
JS_SetPropertyStr(js, n.val, "translation", make_float_array(js, t, 3));
|
||||
JS_SetPropertyStr(js, n.val, "rotation", make_float_array(js, r, 4));
|
||||
JS_SetPropertyStr(js, n.val, "scale", make_float_array(js, s, 3));
|
||||
tmp = make_float_array(js, t, 3);
|
||||
JS_SetPropertyStr(js, n.val, "translation", tmp);
|
||||
tmp = make_float_array(js, r, 4);
|
||||
JS_SetPropertyStr(js, n.val, "rotation", tmp);
|
||||
tmp = make_float_array(js, s, 3);
|
||||
JS_SetPropertyStr(js, n.val, "scale", tmp);
|
||||
JS_SetPropertyStr(js, n.val, "skin", JS_NULL);
|
||||
JS_SetPropertyNumber(js, nodes_arr.val, i, n.val);
|
||||
JS_SetPropertyNumber(js, scene_nodes.val, i, JS_NewInt32(js, i));
|
||||
@@ -389,13 +417,17 @@ JSValue js_obj_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a
|
||||
JS_SetPropertyStr(js, obj.val, "scene", JS_NewInt32(js, 0));
|
||||
|
||||
// Empty arrays for animations/skins
|
||||
JS_SetPropertyStr(js, obj.val, "animations", JS_NewArray(js));
|
||||
JS_SetPropertyStr(js, obj.val, "skins", JS_NewArray(js));
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, obj.val, "animations", tmp);
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, obj.val, "skins", tmp);
|
||||
|
||||
// Extensions
|
||||
JS_ROOT(exts, JS_NewObject(js));
|
||||
JS_SetPropertyStr(js, exts.val, "used", JS_NewArray(js));
|
||||
JS_SetPropertyStr(js, exts.val, "required", JS_NewArray(js));
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, exts.val, "used", tmp);
|
||||
tmp = JS_NewArray(js);
|
||||
JS_SetPropertyStr(js, exts.val, "required", tmp);
|
||||
JS_SetPropertyStr(js, obj.val, "extensions", exts.val);
|
||||
|
||||
free(buffer_data);
|
||||
|
||||
Reference in New Issue
Block a user