This commit is contained in:
2026-01-18 11:23:32 -06:00
parent 1a6f34e5e4
commit 8b0df988bc
8 changed files with 69 additions and 69 deletions

View File

@@ -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)

View File

@@ -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

34
core.cm
View File

@@ -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"

View File

@@ -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,

View File

@@ -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)

View File

@@ -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]) {

6
sdl.cm
View File

@@ -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

16
skin.cm
View File

@@ -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]
}