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 = [] 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 anim = g.animations[ai]
var channels = [] var channels = []
var duration = 0 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 chan = anim.channels[ci]
var sampler = anim.samplers[chan.sampler] var sampler = anim.samplers[chan.sampler]
if (!sampler) continue if (!sampler) continue
@@ -91,25 +91,25 @@ function create_instance(model, prepared_anims) {
// Get clip count // Get clip count
function clip_count(instance) { function clip_count(instance) {
return instance.animations ? instance.animations.length : 0 return instance.animations ? length(instance.animations) : 0
} }
// Get clip duration // Get clip duration
function clip_duration(instance, clip_idx) { 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 return instance.animations[clip_idx].duration
} }
// Get clip name // Get clip name
function clip_name(instance, clip_idx) { 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 return instance.animations[clip_idx].name
} }
// Find clip by name // Find clip by name
function find_clip(instance, name) { function find_clip(instance, name) {
if (!instance.animations) return -1 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 if (instance.animations[i].name == name) return i
} }
return -1 return -1
@@ -158,16 +158,16 @@ function update(instance, dt) {
// Apply animation to model nodes at current time // Apply animation to model nodes at current time
// This samples all channels and updates node TRS values // This samples all channels and updates node TRS values
function apply(instance) { 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 anim = instance.animations[instance.clip_index]
var model = instance.model var model = instance.model
var t = instance.time 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 chan = anim.channels[ci]
var node_idx = chan.node 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] var node = model.nodes[node_idx]
@@ -200,7 +200,7 @@ function apply(instance) {
} }
// Mark all children dirty (propagate down hierarchy) // 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] var n = model.nodes[ni]
if (n.dirty_world) { if (n.dirty_world) {
_mark_children_dirty(n) _mark_children_dirty(n)
@@ -209,7 +209,7 @@ function apply(instance) {
} }
function _mark_children_dirty(node) { 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] var child = node.children[i]
child.dirty_world = true child.dirty_world = true
_mark_children_dirty(child) _mark_children_dirty(child)

View File

@@ -39,7 +39,7 @@ function add_box(transform, sx, sy, sz, opts) {
} }
function remove(collider) { 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) { if (_colliders[i].id == collider.id) {
_colliders.splice(i, 1) _colliders.splice(i, 1)
return true return true
@@ -50,8 +50,8 @@ function remove(collider) {
function overlaps(layer_mask_a, layer_mask_b) { function overlaps(layer_mask_a, layer_mask_b) {
var results = [] var results = []
for (var i = 0; i < _colliders.length; i++) { for (var i = 0; i < length(_colliders); i++) {
for (var j = i + 1; j < _colliders.length; j++) { for (var j = i + 1; j < length(_colliders); j++) {
var a = _colliders[i] var a = _colliders[i]
var b = _colliders[j] var b = _colliders[j]
@@ -81,7 +81,7 @@ function raycast(ox, oy, oz, dx, dy, dz, opts) {
var closest = null var closest = null
var closest_dist = max_dist 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] var c = _colliders[i]
if (!(c.layer_mask & layer_mask)) continue if (!(c.layer_mask & layer_mask)) continue
@@ -104,7 +104,7 @@ function raycast(ox, oy, oz, dx, dy, dz, opts) {
function _get_position(transform) { function _get_position(transform) {
if (!transform) return {x: 0, y: 0, z: 0} if (!transform) return {x: 0, y: 0, z: 0}
// If transform is a matrix (array of 16), extract translation // 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]} return {x: transform[12], y: transform[13], z: transform[14]}
} }
// If transform is an object with x,y,z // If transform is an object with x,y,z

34
core.cm
View File

@@ -183,7 +183,7 @@ function stat(name) {
function log_msg() { function log_msg() {
var args = [] var args = []
for (var i = 0; i < arguments.length; i++) { for (var i = 0; i < length(arguments); i++) {
args.push(text(arguments[i])) args.push(text(arguments[i]))
} }
log.console("[lance3d] " + text(args, " ")) log.console("[lance3d] " + text(args, " "))
@@ -360,7 +360,7 @@ function anim_info(model) {
if (!model || !model._internal) return [] if (!model || !model._internal) return []
var internal = model._internal var internal = model._internal
var result = [] 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] var anim = internal.animations[i]
result.push({ result.push({
name: anim.name || ("clip_" + text(i)), name: anim.name || ("clip_" + text(i)),
@@ -380,7 +380,7 @@ function sample_pose(model, name, time_val) {
if (is_number(name)) { if (is_number(name)) {
anim_idx = name anim_idx = name
} else { } 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) { if (internal.animations[i].name == name) {
anim_idx = i anim_idx = i
break 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 return null
} }
@@ -413,17 +413,17 @@ function sample_pose(model, name, time_val) {
node_matrices: [] 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])) pose.node_matrices.push(resources_mod.get_transform_world_matrix(internal.nodes[ni]))
} }
// Build skin palettes if model has skins // Build skin palettes if model has skins
if (internal.skins && internal.skins.length > 0) { if (internal.skins && length(internal.skins) > 0) {
pose.skin_palettes = [] 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 skin = internal.skins[si]
var world_matrices = [] 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_idx = skin.joints[j]
var jnode = internal.nodes[node_idx] var jnode = internal.nodes[node_idx]
if (jnode) { if (jnode) {
@@ -456,11 +456,11 @@ function draw_model(model, transform, pose) {
var skin_palettes = [] var skin_palettes = []
if (pose && pose.skin_palettes) { if (pose && pose.skin_palettes) {
skin_palettes = pose.skin_palettes skin_palettes = pose.skin_palettes
} else if (internal.skins && internal.skins.length > 0) { } else if (internal.skins && length(internal.skins) > 0) {
for (var si = 0; si < internal.skins.length; si++) { for (var si = 0; si < length(internal.skins); si++) {
var skin = internal.skins[si] var skin = internal.skins[si]
var world_matrices = [] 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_idx = skin.joints[j]
var jnode = internal.nodes[node_idx] var jnode = internal.nodes[node_idx]
if (jnode) { if (jnode) {
@@ -479,7 +479,7 @@ function draw_model(model, transform, pose) {
} }
// Draw each mesh in the model array // 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 entry = model[i]
var mesh = entry.mesh var mesh = entry.mesh
var mat = entry.material 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 uniforms = _build_uniforms(world_matrix, view_matrix, proj_matrix, mat)
var palette = null var palette = null
if (mesh.skinned && skin_palettes.length > 0) { if (mesh.skinned && length(skin_palettes) > 0) {
palette = 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) { function _make_mesh_from_arrays(positions, normals, uvs, indices) {
var vertex_count = positions.length / 3 var vertex_count = length(positions) / 3
var mesh = { var mesh = {
vertex_count: vertex_count, vertex_count: vertex_count,
index_count: indices.length index_count: length(indices)
} }
mesh.positions = model_c.f32_blob(positions) mesh.positions = model_c.f32_blob(positions)
mesh.normals = normals && normals.length > 0 ? model_c.f32_blob(normals) : null mesh.normals = normals && length(normals) > 0 ? model_c.f32_blob(normals) : null
mesh.uvs = uvs && uvs.length > 0 ? model_c.f32_blob(uvs) : null mesh.uvs = uvs && length(uvs) > 0 ? model_c.f32_blob(uvs) : null
mesh.indices = model_c.u16_blob(indices) mesh.indices = model_c.u16_blob(indices)
mesh.index_type = "uint16" mesh.index_type = "uint16"

View File

@@ -137,7 +137,7 @@ function _draw() {
lance3d.draw_mesh(ground_mesh, null, ground_mat) lance3d.draw_mesh(ground_mesh, null, ground_mat)
// Draw tree trunks // Draw tree trunks
for (var i = 0; i < trees.length; i++) { for (var i = 0; i < length(trees); i++) {
var tree = trees[i] var tree = trees[i]
var trunk_transform = lance3d.trs_matrix( var trunk_transform = lance3d.trs_matrix(
tree.x, tree.trunk_h / 2, tree.z, tree.x, tree.trunk_h / 2, tree.z,
@@ -148,7 +148,7 @@ function _draw() {
} }
// Draw tree canopies // Draw tree canopies
for (var i = 0; i < trees.length; i++) { for (var i = 0; i < length(trees); i++) {
var tree = trees[i] var tree = trees[i]
var canopy_transform = lance3d.trs_matrix( var canopy_transform = lance3d.trs_matrix(
tree.x, tree.trunk_h + tree.canopy_s / 2, tree.z, tree.x, tree.trunk_h + tree.canopy_s / 2, tree.z,

View File

@@ -52,12 +52,12 @@ function _init() {
return return
} }
log.console("Model loaded with " + text(model.length) + " mesh(es)") log.console("Model loaded with " + text(length(model)) + " mesh(es)")
// Get animation info // Get animation info
animations = lance3d.anim_info(model) animations = lance3d.anim_info(model)
log.console(" Animations: " + text(animations.length)) log.console(" Animations: " + text(length(animations)))
for (var i = 0; i < animations.length; i++) { for (var i = 0; i < length(animations); i++) {
log.console(" " + text(i) + ": " + animations[i].name + " (" + text(animations[i].duration) + "s)") log.console(" " + text(i) + ": " + animations[i].name + " (" + text(animations[i].duration) + "s)")
} }
@@ -127,17 +127,17 @@ function _update(dt) {
} }
// Toggle animation with space // Toggle animation with space
if (lance3d.keyp('space') && animations.length > 0) { if (lance3d.keyp('space') && length(animations) > 0) {
anim_playing = !anim_playing anim_playing = !anim_playing
log.console(anim_playing ? "Animation resumed" : "Animation paused") log.console(anim_playing ? "Animation resumed" : "Animation paused")
} }
// Switch animation clips with number keys // Switch animation clips with number keys
if (animations.length > 0) { if (length(animations) > 0) {
for (var i = 1; i <= 9; i++) { for (var i = 1; i <= 9; i++) {
if (lance3d.keyp(text(i))) { if (lance3d.keyp(text(i))) {
var clip_idx = i - 1 var clip_idx = i - 1
if (clip_idx < animations.length) { if (clip_idx < length(animations)) {
current_anim = clip_idx current_anim = clip_idx
anim_time = 0 anim_time = 0
log.console("Playing clip " + text(clip_idx) + ": " + animations[clip_idx].name) log.console("Playing clip " + text(clip_idx) + ": " + animations[clip_idx].name)
@@ -158,7 +158,7 @@ function _update(dt) {
} }
// Update animation time // Update animation time
if (anim_playing && animations.length > 0) { if (anim_playing && length(animations) > 0) {
anim_time += dt * anim_speed anim_time += dt * anim_speed
var duration = animations[current_anim].duration var duration = animations[current_anim].duration
if (duration > 0) { if (duration > 0) {
@@ -199,7 +199,7 @@ function _draw() {
// Draw the model // Draw the model
if (model) { if (model) {
var pose = null var pose = null
if (animations.length > 0) { if (length(animations) > 0) {
pose = lance3d.sample_pose(model, current_anim, anim_time) pose = lance3d.sample_pose(model, current_anim, anim_time)
} }
lance3d.draw_model(model, null, pose) lance3d.draw_model(model, null, pose)

View File

@@ -129,7 +129,7 @@ function load_model(path, style, tier) {
var original_images = [] var original_images = []
// Load textures with platform-appropriate sizing // 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 img = g.images[ti]
var tex = null var tex = null
if (img && img.pixels) { if (img && img.pixels) {
@@ -151,7 +151,7 @@ function load_model(path, style, tier) {
// Create materials // Create materials
var gltf_mats = g.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 gmat = gltf_mats[mi]
var paint = [1, 1, 1, 1] var paint = [1, 1, 1, 1]
@@ -196,7 +196,7 @@ function load_model(path, style, tier) {
} }
// Build node transforms // 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 node = g.nodes[ni]
var t = _make_internal_transform(node) var t = _make_internal_transform(node)
t.mesh_index = node.mesh t.mesh_index = node.mesh
@@ -206,27 +206,27 @@ function load_model(path, style, tier) {
} }
// Set up parent-child relationships // 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] 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] 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) _transform_set_parent(internal_model.nodes[child_idx], t)
} }
} }
} }
// Find root nodes // 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) { if (!internal_model.nodes[ni].parent) {
internal_model.root_nodes.push(internal_model.nodes[ni]) internal_model.root_nodes.push(internal_model.nodes[ni])
} }
} }
// Process meshes // 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] 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 prim = mesh.primitives[pi]
var gpu_mesh = _process_gltf_primitive(g, buffer_blob, prim, textures) var gpu_mesh = _process_gltf_primitive(g, buffer_blob, prim, textures)
if (gpu_mesh) { if (gpu_mesh) {
@@ -243,11 +243,11 @@ function load_model(path, style, tier) {
internal_model.skins = skin_mod.prepare_skins(internal_model) internal_model.skins = skin_mod.prepare_skins(internal_model)
// Build result array: [{mesh, material, node_index}] // 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] var node = internal_model.nodes[ni]
if (node.mesh_index == null) continue 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] var mesh = internal_model.meshes[mi]
if (mesh.mesh_index != node.mesh_index) continue if (mesh.mesh_index != node.mesh_index) continue
@@ -273,7 +273,7 @@ function recalc_model_textures(model, style, tier) {
if (!model || !model._internal) return if (!model || !model._internal) return
var internal = model._internal 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] var original = internal._original_images[ti]
if (!original) continue if (!original) continue
@@ -284,7 +284,7 @@ function recalc_model_textures(model, style, tier) {
// Update material references // Update material references
var g = internal._gltf var g = internal._gltf
var gltf_mats = g.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 gmat = gltf_mats[mi]
if (gmat.pbr && gmat.pbr.base_color_texture) { if (gmat.pbr && gmat.pbr.base_color_texture) {
var tex_info = 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 // 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 mesh = internal.meshes[mi]
var mat_idx = mesh.material_index var mat_idx = mesh.material_index
if (mat_idx != null && internal.materials[mat_idx]) { if (mat_idx != null && internal.materials[mat_idx]) {
@@ -305,7 +305,7 @@ function recalc_model_textures(model, style, tier) {
} }
// Update result array materials // 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 entry = model[i]
var mat_idx = entry.mesh.material_index var mat_idx = entry.mesh.material_index
if (mat_idx != null && internal.materials[mat_idx]) { 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) { function create_vertex_buffer(data) {
var size = data.length / 8 var size = length(data) / 8
var buffer = new gpu_mod.buffer(_gpu, { var buffer = new gpu_mod.buffer(_gpu, {
size: size, size: size,
vertex: true vertex: true
@@ -258,7 +258,7 @@ function create_vertex_buffer(data) {
} }
function create_index_buffer(data) { function create_index_buffer(data) {
var size = data.length / 8 var size = length(data) / 8
var buffer = new gpu_mod.buffer(_gpu, { var buffer = new gpu_mod.buffer(_gpu, {
size: size, size: size,
index: true index: true
@@ -343,7 +343,7 @@ function submit_frame(draws, clear_color, clear_depth, style_id) {
var triangles = 0 var triangles = 0
var sampler = get_sampler(style_id) 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 d = draws[i]
var skinned = d.mesh.skinned && d.palette var skinned = d.mesh.skinned && d.palette

16
skin.cm
View File

@@ -13,7 +13,7 @@ function prepare_skins(model) {
var prepared = [] 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] var skin = g.skins[si]
// Extract inverse bind matrices // Extract inverse bind matrices
@@ -37,7 +37,7 @@ function prepare_skins(model) {
prepared.push({ prepared.push({
name: skin.name, name: skin.name,
joints: skin.joints, joints: skin.joints,
joint_count: skin.joints.length, joint_count: length(skin.joints),
inv_bind: inv_bind_blob, inv_bind: inv_bind_blob,
skeleton: skin.skeleton, skeleton: skin.skeleton,
palette: null // Will be built each frame palette: null // Will be built each frame
@@ -50,11 +50,11 @@ function prepare_skins(model) {
// Build joint palette for a skin // Build joint palette for a skin
// This computes world * inv_bind for each joint // This computes world * inv_bind for each joint
function build_palette(skin, model, retro3d) { 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 // Collect world matrices for each joint
var world_matrices = [] 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_idx = skin.joints[j]
var node = model.nodes[node_idx] var node = model.nodes[node_idx]
if (node) { if (node) {
@@ -71,7 +71,7 @@ function build_palette(skin, model, retro3d) {
// Get a joint's world matrix (for attachments) // Get a joint's world matrix (for attachments)
function get_joint_world(skin, joint_index, model, retro3d) { 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() return model_c.mat4_identity()
} }
@@ -86,7 +86,7 @@ function get_joint_world(skin, joint_index, model, retro3d) {
function find_joint(skin, name, model) { function find_joint(skin, name, model) {
if (!skin || !skin.joints) return -1 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_idx = skin.joints[j]
var node = model.nodes[node_idx] var node = model.nodes[node_idx]
if (node && node.name == name) return j if (node && node.name == name) return j
@@ -98,7 +98,7 @@ function find_joint(skin, name, model) {
function joint_from_node(skin, node_idx) { function joint_from_node(skin, node_idx) {
if (!skin || !skin.joints) return -1 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 if (skin.joints[j] == node_idx) return j
} }
return -1 return -1
@@ -106,7 +106,7 @@ function joint_from_node(skin, node_idx) {
// Get node index from joint index // Get node index from joint index
function node_from_joint(skin, joint_idx) { 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] return skin.joints[joint_idx]
} }