length
This commit is contained in:
22
animation.cm
22
animation.cm
@@ -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)
|
||||||
|
|||||||
10
collision.cm
10
collision.cm
@@ -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
34
core.cm
@@ -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"
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
30
resources.cm
30
resources.cm
@@ -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
6
sdl.cm
@@ -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
16
skin.cm
@@ -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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user