From f703879ab7bae8b30a001dc07ab039cb4efb5d5e Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Wed, 25 Feb 2026 23:26:12 -0600 Subject: [PATCH] fix gc bug --- fbx.c | 97 ++++++++++++++++++++++++++-------------- internal/gltf.c | 115 ++++++++++++++++++++++++++++++++---------------- obj.c | 94 ++++++++++++++++++++++++++------------- 3 files changed, 205 insertions(+), 101 deletions(-) diff --git a/fbx.c b/fbx.c index 65f9576..bd92f8b 100644 --- a/fbx.c +++ b/fbx.c @@ -144,10 +144,12 @@ JSValue js_fbx_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); } @@ -163,7 +165,8 @@ JSValue js_fbx_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; @@ -175,7 +178,8 @@ JSValue js_fbx_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); } @@ -187,7 +191,8 @@ JSValue js_fbx_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); } @@ -198,7 +203,8 @@ JSValue js_fbx_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); int idx_view_idx_tmp = view_idx; JS_SetPropertyNumber(js, views_arr.val, view_idx++, idx_view.val); } @@ -223,8 +229,10 @@ JSValue js_fbx_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, info->vertex_start * 3 * sizeof(float))); JS_SetPropertyStr(js, spa.val, "count", JS_NewInt64(js, info->vertex_count)); - 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); @@ -238,8 +246,10 @@ JSValue js_fbx_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, info->vertex_start * 3 * sizeof(float))); JS_SetPropertyStr(js, sna.val, "count", JS_NewInt64(js, info->vertex_count)); - 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); @@ -253,8 +263,10 @@ JSValue js_fbx_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, info->vertex_start * 2 * sizeof(float))); JS_SetPropertyStr(js, sua.val, "count", JS_NewInt64(js, info->vertex_count)); - 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); @@ -267,8 +279,10 @@ JSValue js_fbx_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, info->index_start * (use_32bit ? sizeof(uint32_t) : sizeof(uint16_t)))); JS_SetPropertyStr(js, sia.val, "count", JS_NewInt64(js, info->index_count)); - 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); @@ -277,12 +291,14 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a // Create mesh JS_ROOT(m, JS_NewObject(js)); - JS_SetPropertyStr(js, m.val, "name", mesh->element.name.length > 0 ? JS_NewString(js, mesh->element.name.data) : JS_NULL); + tmp = mesh->element.name.length > 0 ? JS_NewString(js, mesh->element.name.data) : JS_NULL; + JS_SetPropertyStr(js, m.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, mesh_pos_acc)); @@ -310,7 +326,8 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a for (size_t i = 0; i < scene->materials.count; i++) { ufbx_material *mat = scene->materials.data[i]; JS_ROOT(m, JS_NewObject(js)); - JS_SetPropertyStr(js, m.val, "name", mat->element.name.length > 0 ? JS_NewString(js, mat->element.name.data) : JS_NULL); + tmp = mat->element.name.length > 0 ? JS_NewString(js, mat->element.name.data) : JS_NULL; + JS_SetPropertyStr(js, m.val, "name", tmp); JS_ROOT(pbr, JS_NewObject(js)); float bc[4] = { @@ -319,7 +336,8 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a (float)mat->pbr.base_color.value_vec4.z, (float)mat->pbr.base_color.value_vec4.w }; - JS_SetPropertyStr(js, pbr.val, "base_color_factor", make_float_array_f(js, bc, 4)); + tmp = make_float_array_f(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, mat->pbr.metalness.value_real)); JS_SetPropertyStr(js, pbr.val, "roughness_factor", JS_NewFloat64(js, mat->pbr.roughness.value_real)); @@ -331,11 +349,13 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a (float)mat->pbr.emission_color.value_vec3.y, (float)mat->pbr.emission_color.value_vec3.z }; - JS_SetPropertyStr(js, pbr.val, "emissive_factor", make_float_array_f(js, ef, 3)); + tmp = make_float_array_f(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); @@ -348,8 +368,10 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a for (size_t i = 0; i < scene->texture_files.count; i++) { ufbx_texture_file *tf = &scene->texture_files.data[i]; JS_ROOT(im, JS_NewObject(js)); - JS_SetPropertyStr(js, im.val, "kind", JS_NewString(js, "uri")); - JS_SetPropertyStr(js, im.val, "uri", tf->filename.length > 0 ? JS_NewString(js, tf->filename.data) : JS_NULL); + tmp = JS_NewString(js, "uri"); + JS_SetPropertyStr(js, im.val, "kind", tmp); + tmp = tf->filename.length > 0 ? JS_NewString(js, tf->filename.data) : JS_NULL; + JS_SetPropertyStr(js, im.val, "uri", tmp); JS_SetPropertyStr(js, im.val, "mime", JS_NULL); JS_SetPropertyNumber(js, images_arr.val, i, im.val); } @@ -365,14 +387,16 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a } JS_SetPropertyStr(js, obj.val, "textures", textures_arr.val); - JS_SetPropertyStr(js, obj.val, "samplers", JS_NewArray(js)); + tmp = JS_NewArray(js); + JS_SetPropertyStr(js, obj.val, "samplers", tmp); // Nodes JS_ROOT(nodes_arr, JS_NewArray(js)); for (size_t i = 0; i < scene->nodes.count; i++) { ufbx_node *node = scene->nodes.data[i]; JS_ROOT(n, JS_NewObject(js)); - JS_SetPropertyStr(js, n.val, "name", node->element.name.length > 0 ? JS_NewString(js, node->element.name.data) : JS_NULL); + tmp = node->element.name.length > 0 ? JS_NewString(js, node->element.name.data) : JS_NULL; + JS_SetPropertyStr(js, n.val, "name", tmp); // Find mesh index if this node has a mesh int mesh_idx = -1; @@ -402,9 +426,12 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a double tr[3] = {node->local_transform.translation.x, node->local_transform.translation.y, node->local_transform.translation.z}; double ro[4] = {node->local_transform.rotation.x, node->local_transform.rotation.y, node->local_transform.rotation.z, node->local_transform.rotation.w}; double sc[3] = {node->local_transform.scale.x, node->local_transform.scale.y, node->local_transform.scale.z}; - JS_SetPropertyStr(js, n.val, "translation", make_float_array(js, tr, 3)); - JS_SetPropertyStr(js, n.val, "rotation", make_float_array(js, ro, 4)); - JS_SetPropertyStr(js, n.val, "scale", make_float_array(js, sc, 3)); + tmp = make_float_array(js, tr, 3); + JS_SetPropertyStr(js, n.val, "translation", tmp); + tmp = make_float_array(js, ro, 4); + JS_SetPropertyStr(js, n.val, "rotation", tmp); + tmp = make_float_array(js, sc, 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); @@ -434,9 +461,12 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a for (size_t ai = 0; ai < scene->anim_stacks.count; ai++) { ufbx_anim_stack *stack = scene->anim_stacks.data[ai]; JS_ROOT(a, JS_NewObject(js)); - JS_SetPropertyStr(js, a.val, "name", stack->element.name.length > 0 ? JS_NewString(js, stack->element.name.data) : JS_NULL); - JS_SetPropertyStr(js, a.val, "samplers", JS_NewArray(js)); - JS_SetPropertyStr(js, a.val, "channels", JS_NewArray(js)); + tmp = stack->element.name.length > 0 ? JS_NewString(js, stack->element.name.data) : JS_NULL; + JS_SetPropertyStr(js, a.val, "name", tmp); + tmp = JS_NewArray(js); + JS_SetPropertyStr(js, a.val, "samplers", tmp); + tmp = JS_NewArray(js); + JS_SetPropertyStr(js, a.val, "channels", tmp); JS_SetPropertyNumber(js, anims_arr.val, ai, a.val); } JS_SetPropertyStr(js, obj.val, "animations", anims_arr.val); @@ -446,7 +476,8 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a for (size_t i = 0; i < scene->skin_deformers.count; i++) { ufbx_skin_deformer *skin = scene->skin_deformers.data[i]; JS_ROOT(s, JS_NewObject(js)); - JS_SetPropertyStr(js, s.val, "name", skin->element.name.length > 0 ? JS_NewString(js, skin->element.name.data) : JS_NULL); + tmp = skin->element.name.length > 0 ? JS_NewString(js, skin->element.name.data) : JS_NULL; + JS_SetPropertyStr(js, s.val, "name", tmp); JS_ROOT(joints, JS_NewArray(js)); for (size_t ci = 0; ci < skin->clusters.count; ci++) { @@ -470,8 +501,10 @@ JSValue js_fbx_decode(JSContext *js, JSValue this_val, int argc, JSValueConst *a // 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(mesh_infos); diff --git a/internal/gltf.c b/internal/gltf.c index 26d511f..7c4b569 100644 --- a/internal/gltf.c +++ b/internal/gltf.c @@ -86,9 +86,12 @@ static JSValue make_texture_info(JSContext *js, cgltf_texture_view *tv, cgltf_da JS_SetPropertyStr(js, o.val, "texture", JS_NewInt32(js, (int)(tv->texture - data->textures))); JS_SetPropertyStr(js, o.val, "texcoord", JS_NewInt32(js, tv->texcoord)); if (tv->has_transform) { + JSValue t; JS_ROOT(tr, JS_NewObject(js)); - JS_SetPropertyStr(js, tr.val, "offset", make_float_array(js, tv->transform.offset, 2)); - JS_SetPropertyStr(js, tr.val, "scale", make_float_array(js, tv->transform.scale, 2)); + t = make_float_array(js, tv->transform.offset, 2); + JS_SetPropertyStr(js, tr.val, "offset", t); + t = make_float_array(js, tv->transform.scale, 2); + JS_SetPropertyStr(js, tr.val, "scale", t); JS_SetPropertyStr(js, tr.val, "rotation", JS_NewFloat64(js, tv->transform.rotation)); JS_SetPropertyStr(js, o.val, "transform", tr.val); } @@ -118,14 +121,17 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * JS_ROOT(obj, JS_NewObject(js)); // Buffers + JSValue tmp; JS_ROOT(buffers_arr, JS_NewArray(js)); for (cgltf_size i = 0; i < data->buffers_count; i++) { cgltf_buffer *buf = &data->buffers[i]; JS_ROOT(b, JS_NewObject(js)); - if (buf->data && buf->size > 0) - JS_SetPropertyStr(js, b.val, "blob", js_new_blob_stoned_copy(js, buf->data, buf->size)); - else + if (buf->data && buf->size > 0) { + tmp = js_new_blob_stoned_copy(js, buf->data, buf->size); + JS_SetPropertyStr(js, b.val, "blob", tmp); + } else { JS_SetPropertyStr(js, b.val, "blob", JS_NULL); + } JS_SetPropertyStr(js, b.val, "byte_length", JS_NewInt64(js, buf->size)); JS_SetPropertyNumber(js, buffers_arr.val, i, b.val); } @@ -143,7 +149,8 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * const char *usage = "unknown"; if (bv->type == cgltf_buffer_view_type_vertices) usage = "vertex"; else if (bv->type == cgltf_buffer_view_type_indices) usage = "index"; - JS_SetPropertyStr(js, v.val, "usage", JS_NewString(js, usage)); + tmp = JS_NewString(js, usage); + JS_SetPropertyStr(js, v.val, "usage", tmp); JS_SetPropertyNumber(js, views_arr.val, i, v.val); } JS_SetPropertyStr(js, obj.val, "views", views_arr.val); @@ -159,18 +166,22 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * JS_SetPropertyStr(js, a.val, "view", JS_NULL); JS_SetPropertyStr(js, a.val, "byte_offset", JS_NewInt64(js, acc->offset)); JS_SetPropertyStr(js, a.val, "count", JS_NewInt64(js, acc->count)); - JS_SetPropertyStr(js, a.val, "component_type", JS_NewString(js, component_type_str(acc->component_type))); - JS_SetPropertyStr(js, a.val, "type", JS_NewString(js, type_str(acc->type))); + tmp = JS_NewString(js, component_type_str(acc->component_type)); + JS_SetPropertyStr(js, a.val, "component_type", tmp); + tmp = JS_NewString(js, type_str(acc->type)); + JS_SetPropertyStr(js, a.val, "type", tmp); JS_SetPropertyStr(js, a.val, "normalized", JS_NewBool(js, acc->normalized)); if (acc->has_min) { int n = cgltf_num_components(acc->type); - JS_SetPropertyStr(js, a.val, "min", make_float_array(js, acc->min, n)); + tmp = make_float_array(js, acc->min, n); + JS_SetPropertyStr(js, a.val, "min", tmp); } else { JS_SetPropertyStr(js, a.val, "min", JS_NULL); } if (acc->has_max) { int n = cgltf_num_components(acc->type); - JS_SetPropertyStr(js, a.val, "max", make_float_array(js, acc->max, n)); + tmp = make_float_array(js, acc->max, n); + JS_SetPropertyStr(js, a.val, "max", tmp); } else { JS_SetPropertyStr(js, a.val, "max", JS_NULL); } @@ -183,13 +194,15 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * for (cgltf_size mi = 0; mi < data->meshes_count; mi++) { cgltf_mesh *mesh = &data->meshes[mi]; JS_ROOT(m, JS_NewObject(js)); - JS_SetPropertyStr(js, m.val, "name", mesh->name ? JS_NewString(js, mesh->name) : JS_NULL); + tmp = mesh->name ? JS_NewString(js, mesh->name) : JS_NULL; + JS_SetPropertyStr(js, m.val, "name", tmp); JS_ROOT(prims_arr, JS_NewArray(js)); for (cgltf_size pi = 0; pi < mesh->primitives_count; pi++) { cgltf_primitive *prim = &mesh->primitives[pi]; JS_ROOT(p, JS_NewObject(js)); - JS_SetPropertyStr(js, p.val, "topology", JS_NewString(js, topology_str(prim->type))); + tmp = JS_NewString(js, topology_str(prim->type)); + JS_SetPropertyStr(js, p.val, "topology", tmp); JS_ROOT(attrs, JS_NewObject(js)); for (cgltf_size ai = 0; ai < prim->attributes_count; ai++) { @@ -222,13 +235,17 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * cgltf_image *img = &data->images[i]; JS_ROOT(im, JS_NewObject(js)); if (img->buffer_view) { - JS_SetPropertyStr(js, im.val, "kind", JS_NewString(js, "buffer_view")); + tmp = JS_NewString(js, "buffer_view"); + JS_SetPropertyStr(js, im.val, "kind", tmp); JS_SetPropertyStr(js, im.val, "view", JS_NewInt32(js, (int)(img->buffer_view - data->buffer_views))); } else if (img->uri) { - JS_SetPropertyStr(js, im.val, "kind", JS_NewString(js, "uri")); - JS_SetPropertyStr(js, im.val, "uri", JS_NewString(js, img->uri)); + tmp = JS_NewString(js, "uri"); + JS_SetPropertyStr(js, im.val, "kind", tmp); + tmp = JS_NewString(js, img->uri); + JS_SetPropertyStr(js, im.val, "uri", tmp); } - JS_SetPropertyStr(js, im.val, "mime", img->mime_type ? JS_NewString(js, img->mime_type) : JS_NULL); + tmp = img->mime_type ? JS_NewString(js, img->mime_type) : JS_NULL; + JS_SetPropertyStr(js, im.val, "mime", tmp); JS_SetPropertyNumber(js, images_arr.val, i, im.val); } JS_SetPropertyStr(js, obj.val, "images", images_arr.val); @@ -262,27 +279,36 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * for (cgltf_size i = 0; i < data->materials_count; i++) { cgltf_material *mat = &data->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)); if (mat->has_pbr_metallic_roughness) { cgltf_pbr_metallic_roughness *pmr = &mat->pbr_metallic_roughness; - JS_SetPropertyStr(js, pbr.val, "base_color_factor", make_float_array(js, pmr->base_color_factor, 4)); - JS_SetPropertyStr(js, pbr.val, "base_color_texture", make_texture_info(js, &pmr->base_color_texture, data)); + tmp = make_float_array(js, pmr->base_color_factor, 4); + JS_SetPropertyStr(js, pbr.val, "base_color_factor", tmp); + tmp = make_texture_info(js, &pmr->base_color_texture, data); + JS_SetPropertyStr(js, pbr.val, "base_color_texture", tmp); JS_SetPropertyStr(js, pbr.val, "metallic_factor", JS_NewFloat64(js, pmr->metallic_factor)); JS_SetPropertyStr(js, pbr.val, "roughness_factor", JS_NewFloat64(js, pmr->roughness_factor)); - JS_SetPropertyStr(js, pbr.val, "metallic_roughness_texture", make_texture_info(js, &pmr->metallic_roughness_texture, data)); + tmp = make_texture_info(js, &pmr->metallic_roughness_texture, data); + JS_SetPropertyStr(js, pbr.val, "metallic_roughness_texture", tmp); } - JS_SetPropertyStr(js, pbr.val, "normal_texture", make_texture_info(js, &mat->normal_texture, data)); - JS_SetPropertyStr(js, pbr.val, "occlusion_texture", make_texture_info(js, &mat->occlusion_texture, data)); - JS_SetPropertyStr(js, pbr.val, "emissive_factor", make_float_array(js, mat->emissive_factor, 3)); - JS_SetPropertyStr(js, pbr.val, "emissive_texture", make_texture_info(js, &mat->emissive_texture, data)); + tmp = make_texture_info(js, &mat->normal_texture, data); + JS_SetPropertyStr(js, pbr.val, "normal_texture", tmp); + tmp = make_texture_info(js, &mat->occlusion_texture, data); + JS_SetPropertyStr(js, pbr.val, "occlusion_texture", tmp); + tmp = make_float_array(js, mat->emissive_factor, 3); + JS_SetPropertyStr(js, pbr.val, "emissive_factor", tmp); + tmp = make_texture_info(js, &mat->emissive_texture, data); + JS_SetPropertyStr(js, pbr.val, "emissive_texture", tmp); JS_SetPropertyStr(js, m.val, "pbr", pbr.val); const char *alpha_mode = "OPAQUE"; if (mat->alpha_mode == cgltf_alpha_mode_mask) alpha_mode = "MASK"; else if (mat->alpha_mode == cgltf_alpha_mode_blend) alpha_mode = "BLEND"; - JS_SetPropertyStr(js, m.val, "alpha_mode", JS_NewString(js, alpha_mode)); + tmp = JS_NewString(js, alpha_mode); + JS_SetPropertyStr(js, m.val, "alpha_mode", tmp); JS_SetPropertyStr(js, m.val, "alpha_cutoff", JS_NewFloat64(js, mat->alpha_cutoff)); JS_SetPropertyStr(js, m.val, "double_sided", JS_NewBool(js, mat->double_sided)); JS_SetPropertyStr(js, m.val, "unlit", JS_NewBool(js, mat->unlit)); @@ -296,7 +322,8 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * for (cgltf_size i = 0; i < data->nodes_count; i++) { cgltf_node *node = &data->nodes[i]; JS_ROOT(n, JS_NewObject(js)); - JS_SetPropertyStr(js, n.val, "name", node->name ? JS_NewString(js, node->name) : JS_NULL); + tmp = node->name ? JS_NewString(js, node->name) : JS_NULL; + JS_SetPropertyStr(js, n.val, "name", tmp); JS_SetPropertyStr(js, n.val, "mesh", node->mesh ? JS_NewInt32(js, (int)(node->mesh - data->meshes)) : JS_NULL); JS_ROOT(children, JS_NewArray(js)); @@ -305,15 +332,19 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * JS_SetPropertyStr(js, n.val, "children", children.val); if (node->has_matrix) { - JS_SetPropertyStr(js, n.val, "matrix", make_float_array(js, node->matrix, 16)); + tmp = make_float_array(js, node->matrix, 16); + JS_SetPropertyStr(js, n.val, "matrix", tmp); JS_SetPropertyStr(js, n.val, "translation", JS_NULL); JS_SetPropertyStr(js, n.val, "rotation", JS_NULL); JS_SetPropertyStr(js, n.val, "scale", JS_NULL); } else { JS_SetPropertyStr(js, n.val, "matrix", JS_NULL); - JS_SetPropertyStr(js, n.val, "translation", make_float_array(js, node->translation, 3)); - JS_SetPropertyStr(js, n.val, "rotation", make_float_array(js, node->rotation, 4)); - JS_SetPropertyStr(js, n.val, "scale", make_float_array(js, node->scale, 3)); + tmp = make_float_array(js, node->translation, 3); + JS_SetPropertyStr(js, n.val, "translation", tmp); + tmp = make_float_array(js, node->rotation, 4); + JS_SetPropertyStr(js, n.val, "rotation", tmp); + tmp = make_float_array(js, node->scale, 3); + JS_SetPropertyStr(js, n.val, "scale", tmp); } JS_SetPropertyStr(js, n.val, "skin", node->skin ? JS_NewInt32(js, (int)(node->skin - data->skins)) : JS_NULL); @@ -340,7 +371,8 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * for (cgltf_size ai = 0; ai < data->animations_count; ai++) { cgltf_animation *anim = &data->animations[ai]; JS_ROOT(a, JS_NewObject(js)); - JS_SetPropertyStr(js, a.val, "name", anim->name ? JS_NewString(js, anim->name) : JS_NULL); + tmp = anim->name ? JS_NewString(js, anim->name) : JS_NULL; + JS_SetPropertyStr(js, a.val, "name", tmp); JS_ROOT(samps, JS_NewArray(js)); for (cgltf_size si = 0; si < anim->samplers_count; si++) { @@ -351,7 +383,8 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * const char *interp = "LINEAR"; if (samp->interpolation == cgltf_interpolation_type_step) interp = "STEP"; else if (samp->interpolation == cgltf_interpolation_type_cubic_spline) interp = "CUBICSPLINE"; - JS_SetPropertyStr(js, s.val, "interpolation", JS_NewString(js, interp)); + tmp = JS_NewString(js, interp); + JS_SetPropertyStr(js, s.val, "interpolation", tmp); JS_SetPropertyNumber(js, samps.val, si, s.val); } JS_SetPropertyStr(js, a.val, "samplers", samps.val); @@ -376,7 +409,8 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * case cgltf_animation_path_type_weights: path = "weights"; break; default: break; } - JS_SetPropertyStr(js, target.val, "path", JS_NewString(js, path)); + tmp = JS_NewString(js, path); + JS_SetPropertyStr(js, target.val, "path", tmp); JS_SetPropertyStr(js, c.val, "target", target.val); JS_SetPropertyNumber(js, channels.val, ci, c.val); } @@ -391,7 +425,8 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * for (cgltf_size i = 0; i < data->skins_count; i++) { cgltf_skin *skin = &data->skins[i]; JS_ROOT(s, JS_NewObject(js)); - JS_SetPropertyStr(js, s.val, "name", skin->name ? JS_NewString(js, skin->name) : JS_NULL); + tmp = skin->name ? JS_NewString(js, skin->name) : JS_NULL; + JS_SetPropertyStr(js, s.val, "name", tmp); JS_ROOT(joints, JS_NewArray(js)); for (cgltf_size ji = 0; ji < skin->joints_count; ji++) JS_SetPropertyNumber(js, joints.val, ji, JS_NewInt32(js, (int)(skin->joints[ji] - data->nodes))); @@ -405,12 +440,16 @@ JSValue js_gltf_decode(JSContext *js, JSValue this_val, int argc, JSValueConst * // Extensions JS_ROOT(exts, JS_NewObject(js)); JS_ROOT(used, JS_NewArray(js)); - for (cgltf_size i = 0; i < data->extensions_used_count; i++) - JS_SetPropertyNumber(js, used.val, i, JS_NewString(js, data->extensions_used[i])); + for (cgltf_size i = 0; i < data->extensions_used_count; i++) { + tmp = JS_NewString(js, data->extensions_used[i]); + JS_SetPropertyNumber(js, used.val, i, tmp); + } JS_SetPropertyStr(js, exts.val, "used", used.val); JS_ROOT(required, JS_NewArray(js)); - for (cgltf_size i = 0; i < data->extensions_required_count; i++) - JS_SetPropertyNumber(js, required.val, i, JS_NewString(js, data->extensions_required[i])); + for (cgltf_size i = 0; i < data->extensions_required_count; i++) { + tmp = JS_NewString(js, data->extensions_required[i]); + JS_SetPropertyNumber(js, required.val, i, tmp); + } JS_SetPropertyStr(js, exts.val, "required", required.val); JS_SetPropertyStr(js, obj.val, "extensions", exts.val); diff --git a/obj.c b/obj.c index 3d0fd6b..8af4b98 100644 --- a/obj.c +++ b/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);