diff --git a/animation.cm b/animation.cm index f47fee5..0388de6 100644 --- a/animation.cm +++ b/animation.cm @@ -13,12 +13,12 @@ function prepare_animations(model) { var prepared = [] - for (var ai = 0; ai < g.animations.length; ai++) { + for (var ai = 0; ai < length(g.animations); ai++) { var anim = g.animations[ai] var channels = [] var duration = 0 - for (var ci = 0; ci < anim.channels.length; ci++) { + for (var ci = 0; ci < length(anim.channels); ci++) { var chan = anim.channels[ci] var sampler = anim.samplers[chan.sampler] if (!sampler) continue @@ -91,25 +91,25 @@ function create_instance(model, prepared_anims) { // Get clip count function clip_count(instance) { - return instance.animations ? instance.animations.length : 0 + return instance.animations ? length(instance.animations) : 0 } // Get clip duration function clip_duration(instance, clip_idx) { - if (!instance.animations || clip_idx >= instance.animations.length) return 0 + if (!instance.animations || clip_idx >= length(instance.animations)) return 0 return instance.animations[clip_idx].duration } // Get clip name function clip_name(instance, clip_idx) { - if (!instance.animations || clip_idx >= instance.animations.length) return null + if (!instance.animations || clip_idx >= length(instance.animations)) return null return instance.animations[clip_idx].name } // Find clip by name function find_clip(instance, name) { if (!instance.animations) return -1 - for (var i = 0; i < instance.animations.length; i++) { + for (var i = 0; i < length(instance.animations); i++) { if (instance.animations[i].name == name) return i } return -1 @@ -158,16 +158,16 @@ function update(instance, dt) { // Apply animation to model nodes at current time // This samples all channels and updates node TRS values function apply(instance) { - if (!instance.animations || instance.clip_index >= instance.animations.length) return + if (!instance.animations || instance.clip_index >= length(instance.animations)) return var anim = instance.animations[instance.clip_index] var model = instance.model var t = instance.time - for (var ci = 0; ci < anim.channels.length; ci++) { + for (var ci = 0; ci < length(anim.channels); ci++) { var chan = anim.channels[ci] var node_idx = chan.node - if (node_idx == null || node_idx >= model.nodes.length) continue + if (node_idx == null || node_idx >= length(model.nodes)) continue var node = model.nodes[node_idx] @@ -200,7 +200,7 @@ function apply(instance) { } // Mark all children dirty (propagate down hierarchy) - for (var ni = 0; ni < model.nodes.length; ni++) { + for (var ni = 0; ni < length(model.nodes); ni++) { var n = model.nodes[ni] if (n.dirty_world) { _mark_children_dirty(n) @@ -209,7 +209,7 @@ function apply(instance) { } function _mark_children_dirty(node) { - for (var i = 0; i < node.children.length; i++) { + for (var i = 0; i < length(node.children); i++) { var child = node.children[i] child.dirty_world = true _mark_children_dirty(child) diff --git a/collision.cm b/collision.cm index 73b094f..25bbdba 100644 --- a/collision.cm +++ b/collision.cm @@ -39,7 +39,7 @@ function add_box(transform, sx, sy, sz, opts) { } function remove(collider) { - for (var i = 0; i < _colliders.length; i++) { + for (var i = 0; i < length(_colliders); i++) { if (_colliders[i].id == collider.id) { _colliders.splice(i, 1) return true @@ -50,8 +50,8 @@ function remove(collider) { function overlaps(layer_mask_a, layer_mask_b) { var results = [] - for (var i = 0; i < _colliders.length; i++) { - for (var j = i + 1; j < _colliders.length; j++) { + for (var i = 0; i < length(_colliders); i++) { + for (var j = i + 1; j < length(_colliders); j++) { var a = _colliders[i] var b = _colliders[j] @@ -81,7 +81,7 @@ function raycast(ox, oy, oz, dx, dy, dz, opts) { var closest = null var closest_dist = max_dist - for (var i = 0; i < _colliders.length; i++) { + for (var i = 0; i < length(_colliders); i++) { var c = _colliders[i] if (!(c.layer_mask & layer_mask)) continue @@ -104,7 +104,7 @@ function raycast(ox, oy, oz, dx, dy, dz, opts) { function _get_position(transform) { if (!transform) return {x: 0, y: 0, z: 0} // If transform is a matrix (array of 16), extract translation - if (transform.length == 16) { + if (length(transform) == 16) { return {x: transform[12], y: transform[13], z: transform[14]} } // If transform is an object with x,y,z diff --git a/core.cm b/core.cm index 1bfc0e7..ff1b14e 100644 --- a/core.cm +++ b/core.cm @@ -183,7 +183,7 @@ function stat(name) { function log_msg() { var args = [] - for (var i = 0; i < arguments.length; i++) { + for (var i = 0; i < length(arguments); i++) { args.push(text(arguments[i])) } log.console("[lance3d] " + text(args, " ")) @@ -360,7 +360,7 @@ function anim_info(model) { if (!model || !model._internal) return [] var internal = model._internal var result = [] - for (var i = 0; i < internal.animations.length; i++) { + for (var i = 0; i < length(internal.animations); i++) { var anim = internal.animations[i] result.push({ name: anim.name || ("clip_" + text(i)), @@ -380,7 +380,7 @@ function sample_pose(model, name, time_val) { if (is_number(name)) { anim_idx = name } else { - for (var i = 0; i < internal.animations.length; i++) { + for (var i = 0; i < length(internal.animations); i++) { if (internal.animations[i].name == name) { anim_idx = i break @@ -388,7 +388,7 @@ function sample_pose(model, name, time_val) { } } - if (anim_idx < 0 || anim_idx >= internal.animations.length) { + if (anim_idx < 0 || anim_idx >= length(internal.animations)) { return null } @@ -413,17 +413,17 @@ function sample_pose(model, name, time_val) { node_matrices: [] } - for (var ni = 0; ni < internal.nodes.length; ni++) { + for (var ni = 0; ni < length(internal.nodes); ni++) { pose.node_matrices.push(resources_mod.get_transform_world_matrix(internal.nodes[ni])) } // Build skin palettes if model has skins - if (internal.skins && internal.skins.length > 0) { + if (internal.skins && length(internal.skins) > 0) { pose.skin_palettes = [] - for (var si = 0; si < internal.skins.length; si++) { + for (var si = 0; si < length(internal.skins); si++) { var skin = internal.skins[si] var world_matrices = [] - for (var j = 0; j < skin.joints.length; j++) { + for (var j = 0; j < length(skin.joints); j++) { var node_idx = skin.joints[j] var jnode = internal.nodes[node_idx] if (jnode) { @@ -456,11 +456,11 @@ function draw_model(model, transform, pose) { var skin_palettes = [] if (pose && pose.skin_palettes) { skin_palettes = pose.skin_palettes - } else if (internal.skins && internal.skins.length > 0) { - for (var si = 0; si < internal.skins.length; si++) { + } else if (internal.skins && length(internal.skins) > 0) { + for (var si = 0; si < length(internal.skins); si++) { var skin = internal.skins[si] var world_matrices = [] - for (var j = 0; j < skin.joints.length; j++) { + for (var j = 0; j < length(skin.joints); j++) { var node_idx = skin.joints[j] var jnode = internal.nodes[node_idx] if (jnode) { @@ -479,7 +479,7 @@ function draw_model(model, transform, pose) { } // Draw each mesh in the model array - for (var i = 0; i < model.length; i++) { + for (var i = 0; i < length(model); i++) { var entry = model[i] var mesh = entry.mesh var mat = entry.material @@ -502,7 +502,7 @@ function draw_model(model, transform, pose) { var uniforms = _build_uniforms(world_matrix, view_matrix, proj_matrix, mat) var palette = null - if (mesh.skinned && skin_palettes.length > 0) { + if (mesh.skinned && length(skin_palettes) > 0) { palette = skin_palettes[0] } @@ -674,16 +674,16 @@ function _build_uniforms(model_mat, view_mat, proj_mat, mat) { } function _make_mesh_from_arrays(positions, normals, uvs, indices) { - var vertex_count = positions.length / 3 + var vertex_count = length(positions) / 3 var mesh = { vertex_count: vertex_count, - index_count: indices.length + index_count: length(indices) } mesh.positions = model_c.f32_blob(positions) - mesh.normals = normals && normals.length > 0 ? model_c.f32_blob(normals) : null - mesh.uvs = uvs && uvs.length > 0 ? model_c.f32_blob(uvs) : null + mesh.normals = normals && length(normals) > 0 ? model_c.f32_blob(normals) : null + mesh.uvs = uvs && length(uvs) > 0 ? model_c.f32_blob(uvs) : null mesh.indices = model_c.u16_blob(indices) mesh.index_type = "uint16" diff --git a/examples/forest.ce b/examples/forest.ce index ad010b3..8021477 100644 --- a/examples/forest.ce +++ b/examples/forest.ce @@ -137,7 +137,7 @@ function _draw() { lance3d.draw_mesh(ground_mesh, null, ground_mat) // Draw tree trunks - for (var i = 0; i < trees.length; i++) { + for (var i = 0; i < length(trees); i++) { var tree = trees[i] var trunk_transform = lance3d.trs_matrix( tree.x, tree.trunk_h / 2, tree.z, @@ -148,7 +148,7 @@ function _draw() { } // Draw tree canopies - for (var i = 0; i < trees.length; i++) { + for (var i = 0; i < length(trees); i++) { var tree = trees[i] var canopy_transform = lance3d.trs_matrix( tree.x, tree.trunk_h + tree.canopy_s / 2, tree.z, diff --git a/examples/modelview.ce b/examples/modelview.ce index 36e64d6..a0c535f 100644 --- a/examples/modelview.ce +++ b/examples/modelview.ce @@ -52,12 +52,12 @@ function _init() { return } - log.console("Model loaded with " + text(model.length) + " mesh(es)") + log.console("Model loaded with " + text(length(model)) + " mesh(es)") // Get animation info animations = lance3d.anim_info(model) - log.console(" Animations: " + text(animations.length)) - for (var i = 0; i < animations.length; i++) { + log.console(" Animations: " + text(length(animations))) + for (var i = 0; i < length(animations); i++) { log.console(" " + text(i) + ": " + animations[i].name + " (" + text(animations[i].duration) + "s)") } @@ -127,17 +127,17 @@ function _update(dt) { } // Toggle animation with space - if (lance3d.keyp('space') && animations.length > 0) { + if (lance3d.keyp('space') && length(animations) > 0) { anim_playing = !anim_playing log.console(anim_playing ? "Animation resumed" : "Animation paused") } // Switch animation clips with number keys - if (animations.length > 0) { + if (length(animations) > 0) { for (var i = 1; i <= 9; i++) { if (lance3d.keyp(text(i))) { var clip_idx = i - 1 - if (clip_idx < animations.length) { + if (clip_idx < length(animations)) { current_anim = clip_idx anim_time = 0 log.console("Playing clip " + text(clip_idx) + ": " + animations[clip_idx].name) @@ -158,7 +158,7 @@ function _update(dt) { } // Update animation time - if (anim_playing && animations.length > 0) { + if (anim_playing && length(animations) > 0) { anim_time += dt * anim_speed var duration = animations[current_anim].duration if (duration > 0) { @@ -199,7 +199,7 @@ function _draw() { // Draw the model if (model) { var pose = null - if (animations.length > 0) { + if (length(animations) > 0) { pose = lance3d.sample_pose(model, current_anim, anim_time) } lance3d.draw_model(model, null, pose) diff --git a/resources.cm b/resources.cm index a658cc1..d659fa1 100644 --- a/resources.cm +++ b/resources.cm @@ -129,7 +129,7 @@ function load_model(path, style, tier) { var original_images = [] // Load textures with platform-appropriate sizing - for (var ti = 0; ti < g.images.length; ti++) { + for (var ti = 0; ti < length(g.images); ti++) { var img = g.images[ti] var tex = null if (img && img.pixels) { @@ -151,7 +151,7 @@ function load_model(path, style, tier) { // Create materials var gltf_mats = g.materials || [] - for (var mi = 0; mi < gltf_mats.length; mi++) { + for (var mi = 0; mi < length(gltf_mats); mi++) { var gmat = gltf_mats[mi] var paint = [1, 1, 1, 1] @@ -196,7 +196,7 @@ function load_model(path, style, tier) { } // Build node transforms - for (var ni = 0; ni < g.nodes.length; ni++) { + for (var ni = 0; ni < length(g.nodes); ni++) { var node = g.nodes[ni] var t = _make_internal_transform(node) t.mesh_index = node.mesh @@ -206,27 +206,27 @@ function load_model(path, style, tier) { } // Set up parent-child relationships - for (var ni = 0; ni < internal_model.nodes.length; ni++) { + for (var ni = 0; ni < length(internal_model.nodes); ni++) { var t = internal_model.nodes[ni] - for (var ci = 0; ci < t.gltf_children.length; ci++) { + for (var ci = 0; ci < length(t.gltf_children); ci++) { var child_idx = t.gltf_children[ci] - if (child_idx < internal_model.nodes.length) { + if (child_idx < length(internal_model.nodes)) { _transform_set_parent(internal_model.nodes[child_idx], t) } } } // Find root nodes - for (var ni = 0; ni < internal_model.nodes.length; ni++) { + for (var ni = 0; ni < length(internal_model.nodes); ni++) { if (!internal_model.nodes[ni].parent) { internal_model.root_nodes.push(internal_model.nodes[ni]) } } // Process meshes - for (var mi = 0; mi < g.meshes.length; mi++) { + for (var mi = 0; mi < length(g.meshes); mi++) { var mesh = g.meshes[mi] - for (var pi = 0; pi < mesh.primitives.length; pi++) { + for (var pi = 0; pi < length(mesh.primitives); pi++) { var prim = mesh.primitives[pi] var gpu_mesh = _process_gltf_primitive(g, buffer_blob, prim, textures) if (gpu_mesh) { @@ -243,11 +243,11 @@ function load_model(path, style, tier) { internal_model.skins = skin_mod.prepare_skins(internal_model) // Build result array: [{mesh, material, node_index}] - for (var ni = 0; ni < internal_model.nodes.length; ni++) { + for (var ni = 0; ni < length(internal_model.nodes); ni++) { var node = internal_model.nodes[ni] if (node.mesh_index == null) continue - for (var mi = 0; mi < internal_model.meshes.length; mi++) { + for (var mi = 0; mi < length(internal_model.meshes); mi++) { var mesh = internal_model.meshes[mi] if (mesh.mesh_index != node.mesh_index) continue @@ -273,7 +273,7 @@ function recalc_model_textures(model, style, tier) { if (!model || !model._internal) return var internal = model._internal - for (var ti = 0; ti < internal._original_images.length; ti++) { + for (var ti = 0; ti < length(internal._original_images); ti++) { var original = internal._original_images[ti] if (!original) continue @@ -284,7 +284,7 @@ function recalc_model_textures(model, style, tier) { // Update material references var g = internal._gltf var gltf_mats = g.materials || [] - for (var mi = 0; mi < gltf_mats.length; mi++) { + for (var mi = 0; mi < length(gltf_mats); mi++) { var gmat = gltf_mats[mi] if (gmat.pbr && gmat.pbr.base_color_texture) { var tex_info = gmat.pbr.base_color_texture @@ -296,7 +296,7 @@ function recalc_model_textures(model, style, tier) { } // Update mesh textures - for (var mi = 0; mi < internal.meshes.length; mi++) { + for (var mi = 0; mi < length(internal.meshes); mi++) { var mesh = internal.meshes[mi] var mat_idx = mesh.material_index if (mat_idx != null && internal.materials[mat_idx]) { @@ -305,7 +305,7 @@ function recalc_model_textures(model, style, tier) { } // Update result array materials - for (var i = 0; i < model.length; i++) { + for (var i = 0; i < length(model); i++) { var entry = model[i] var mat_idx = entry.mesh.material_index if (mat_idx != null && internal.materials[mat_idx]) { diff --git a/sdl.cm b/sdl.cm index f5b6487..0f6b3cc 100644 --- a/sdl.cm +++ b/sdl.cm @@ -231,7 +231,7 @@ function create_texture(w, h, pixels) { } function create_vertex_buffer(data) { - var size = data.length / 8 + var size = length(data) / 8 var buffer = new gpu_mod.buffer(_gpu, { size: size, vertex: true @@ -258,7 +258,7 @@ function create_vertex_buffer(data) { } function create_index_buffer(data) { - var size = data.length / 8 + var size = length(data) / 8 var buffer = new gpu_mod.buffer(_gpu, { size: size, index: true @@ -343,7 +343,7 @@ function submit_frame(draws, clear_color, clear_depth, style_id) { var triangles = 0 var sampler = get_sampler(style_id) - for (var i = 0; i < draws.length; i++) { + for (var i = 0; i < length(draws); i++) { var d = draws[i] var skinned = d.mesh.skinned && d.palette diff --git a/skin.cm b/skin.cm index 847f482..3bd16a3 100644 --- a/skin.cm +++ b/skin.cm @@ -13,7 +13,7 @@ function prepare_skins(model) { var prepared = [] - for (var si = 0; si < g.skins.length; si++) { + for (var si = 0; si < length(g.skins); si++) { var skin = g.skins[si] // Extract inverse bind matrices @@ -37,7 +37,7 @@ function prepare_skins(model) { prepared.push({ name: skin.name, joints: skin.joints, - joint_count: skin.joints.length, + joint_count: length(skin.joints), inv_bind: inv_bind_blob, skeleton: skin.skeleton, palette: null // Will be built each frame @@ -50,11 +50,11 @@ function prepare_skins(model) { // Build joint palette for a skin // This computes world * inv_bind for each joint function build_palette(skin, model, retro3d) { - if (!skin || !skin.joints || skin.joints.length == 0) return null + if (!skin || !skin.joints || length(skin.joints) == 0) return null // Collect world matrices for each joint var world_matrices = [] - for (var j = 0; j < skin.joints.length; j++) { + for (var j = 0; j < length(skin.joints); j++) { var node_idx = skin.joints[j] var node = model.nodes[node_idx] if (node) { @@ -71,7 +71,7 @@ function build_palette(skin, model, retro3d) { // Get a joint's world matrix (for attachments) function get_joint_world(skin, joint_index, model, retro3d) { - if (!skin || joint_index >= skin.joints.length) { + if (!skin || joint_index >= length(skin.joints)) { return model_c.mat4_identity() } @@ -86,7 +86,7 @@ function get_joint_world(skin, joint_index, model, retro3d) { function find_joint(skin, name, model) { if (!skin || !skin.joints) return -1 - for (var j = 0; j < skin.joints.length; j++) { + for (var j = 0; j < length(skin.joints); j++) { var node_idx = skin.joints[j] var node = model.nodes[node_idx] if (node && node.name == name) return j @@ -98,7 +98,7 @@ function find_joint(skin, name, model) { function joint_from_node(skin, node_idx) { if (!skin || !skin.joints) return -1 - for (var j = 0; j < skin.joints.length; j++) { + for (var j = 0; j < length(skin.joints); j++) { if (skin.joints[j] == node_idx) return j } return -1 @@ -106,7 +106,7 @@ function joint_from_node(skin, node_idx) { // Get node index from joint index function node_from_joint(skin, joint_idx) { - if (!skin || !skin.joints || joint_idx >= skin.joints.length) return -1 + if (!skin || !skin.joints || joint_idx >= length(skin.joints)) return -1 return skin.joints[joint_idx] }