From 491de4583457365b0c881fb6843e8698800fa901 Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Tue, 24 Feb 2026 19:03:51 +0000 Subject: [PATCH] collada_scene: node_instance: store transform table --- collada_scene.lua | 103 +++++++++++++++++++++++++++++++++++----------- main.lua | 6 +-- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/collada_scene.lua b/collada_scene.lua index 3bd7936..ff27813 100644 --- a/collada_scene.lua +++ b/collada_scene.lua @@ -53,7 +53,67 @@ collada_scene = { end end, - node_world_transform = function(node) + load_transform = function(transform) + if transform.type == collada_types.transform_type.LOOKAT then + assert(false) + elseif transform.type == collada_types.transform_type.MATRIX then + return mat4.load_table(transform.matrix) + elseif transform.type == collada_types.transform_type.ROTATE then + return vec4.load_table(transform.rotate) + elseif transform.type == collada_types.transform_type.SCALE then + return vec3.load_table(transform.scale) + elseif transform.type == collada_types.transform_type.TRANSLATE then + return vec3.load_table(transform.translate) + else + assert(false) + end + end, + + transform_matrix = function (loaded_transform) + local type = loaded_transform.type + local value = loaded_transform.value + if type == collada_types.transform_type.LOOKAT then + assert(false) + elseif type == collada_types.transform_type.MATRIX then + return value + elseif type == collada_types.transform_type.ROTATE then + return mat4.rotation_axis(value, scalar.convert_to_radians(value.f[3])) + elseif type == collada_types.transform_type.SCALE then + return mat4.scaling_from_vector(value) + elseif type == collada_types.transform_type.TRANSLATE then + return mat4.translation_from_vector(value) + else + assert(false) + end + end, + + -- + -- node instance + -- + -- { + -- transforms = .., + -- transforms_count = .., + -- world = .., + -- } + + node_instance_initialize_transforms = function(node) + local transforms = {} + + local transform_index = 0 + for _, transform in ipairs(node.transforms) do + local value = collada_scene.load_transform(transform) + local loaded_transform = { + type = transform.type, + value = value, + } + transforms[transform_index] = loaded_transform + transform_index = transform_index + 1 + end + + return transforms, transform_index + end, + + node_instance_world = function(node, transforms, transforms_count) local world if node.parent_index >= 0 then world = node_instances[node.parent_index].world @@ -62,34 +122,31 @@ collada_scene = { world = mat4.identity() end - for _, transform in ipairs(node.transforms) do - local m - if transform.type == collada_types.transform_type.LOOKAT then - assert(false) - elseif transform.type == collada_types.transform_type.MATRIX then - m = mat4.load_table(transform.matrix) - elseif transform.type == collada_types.transform_type.ROTATE then - local rotate = vec4.load_table(transform.rotate) - local w = rotate.f[3] - m = mat4.rotation_axis(rotate, scalar.convert_to_radians(w)) - elseif transform.type == collada_types.transform_type.SCALE then - m = mat4.scaling_from_vector(vec3.load_table(transform.scale)) - elseif transform.type == collada_types.transform_type.TRANSLATE then - m = mat4.translation_from_vector(vec3.load_table(transform.translate)) - else - assert(false) - end - + local transform_index = 0 + while transform_index < transforms_count do + local m = collada_scene.transform_matrix(transforms[transform_index]) world = m * world + transform_index = transform_index + 1 end return world end, - load_node_world_transforms = function(nodes) + node_instance_initialize = function(node) + local transforms, transforms_count = collada_scene.node_instance_initialize_transforms(node) + local world = collada_scene.node_instance_world(node, transforms, transforms_count) + local node_instance = { + transforms = transforms, + transforms_count = transforms_count, + world = world, + } + return node_instance + end, + + load_node_instances = function(nodes) local node_index = 0 for _, node in ipairs(nodes) do - world = collada_scene.node_world_transform(node) - node_instances[node_index] = { world = world } + local node_instance = collada_scene.node_instance_initialize(node) + node_instances[node_index] = node_instance node_index = node_index + 1 end end, @@ -189,6 +246,6 @@ collada_scene = { return { draw_nodes = collada_scene.draw_nodes, load_buffers = collada_scene.load_buffers, - load_node_world_transforms = collada_scene.load_node_world_transforms, + load_node_instances = collada_scene.load_node_instances, load_images = collada_scene.load_images, } diff --git a/main.lua b/main.lua index 4eec157..0ab7777 100644 --- a/main.lua +++ b/main.lua @@ -14,8 +14,8 @@ function love.load(args) love.window.setMode(1024, 1024, {depth=true}) collada_scene.load_buffers() - collada_scene.load_node_world_transforms(scene_test.descriptor.nodes) collada_scene.load_images("scene/test", scene_test.descriptor.images) + collada_scene.load_node_instances(scene_test.descriptor.nodes) end local rotation = 0.0 @@ -26,10 +26,6 @@ function love.draw() width, height = love.graphics.getDimensions() - -- local projection = mat4.perspective_rh(width / width * 0.1, - -- height / width * 0.1, - -- 0.1, - -- 1000.0) local aspect_ratio = width / height local projection = mat4.perspective_fov_rh(scalar.convert_to_radians(45 / 2), aspect_ratio,