collada_scene: skinned animation

This commit is contained in:
Zack Buhman 2026-02-25 03:14:30 +00:00
parent 5f867891fa
commit 8d8c87c5b0
13 changed files with 391 additions and 341 deletions

View File

@ -68,6 +68,15 @@ mat4 = {
t[13], t[14], t[15], t[16])
end,
store_table = function(M)
return {
M.m[0], M.m[1], M.m[2], M.m[3],
M.m[4], M.m[5], M.m[6], M.m[7],
M.m[8], M.m[9], M.m[10], M.m[11],
M.m[12], M.m[13], M.m[14], M.m[15],
}
end,
set = function(m00, m01, m02, m03,
m10, m11, m12, m13,
m20, m21, m22, m23,
@ -363,6 +372,9 @@ mat4 = {
end,
rotation_axis = function(axis, angle)
assert(not vec3.equal(axis, vec3._zero))
assert(not vec3.isinfinite(axis))
local normal = vec3.normalize(axis)
return mat4.rotation_normal(normal, angle)
end,

View File

@ -7,7 +7,8 @@ local scalar = _math.scalar
local collada_types = require 'collada_types'
local pixel_data = love.filesystem.newFileData("pixel.glsl")
local vertex_data = love.filesystem.newFileData("vertex.glsl")
--local vertex_data = love.filesystem.newFileData("vertex.glsl")
local vertex_data = love.filesystem.newFileData("skinned_vertex.glsl")
local shader = love.graphics.newShader(pixel_data, vertex_data)
local images_textures = {}
@ -30,14 +31,23 @@ collada_scene = {
-- vertex shader storage buffer
----------------------------------------------------------------------
local format = {
local vtx_format = {
{ name = 'Position', format = 'floatvec4' },
{ name = 'Normal', format = 'floatvec4' },
{ name = 'Texture', format = 'floatvec4' },
}
local vertex_data = love.filesystem.newFileData("scene/noodle/noodle.vtx")
local shaderstorage_buffer = love.graphics.newBuffer(format, vertex_data, { shaderstorage = true, usage = "static" })
shader:send("VertexLayout", shaderstorage_buffer)
local vtx_data = love.filesystem.newFileData("scene/noodle/noodle.vtx")
local vtx_shaderstorage_buffer = love.graphics.newBuffer(vtx_format, vtx_data, { shaderstorage = true, usage = "static" })
local vjw_format = {
{ name = 'Joint', format = 'int32vec4' },
{ name = 'Weight', format = 'floatvec4' },
}
local vjw_data = love.filesystem.newFileData("scene/noodle/noodle.vjw")
local vjw_shaderstorage_buffer = love.graphics.newBuffer(vjw_format, vjw_data, { shaderstorage = true, usage = "static" })
shader:send("VertexPNTLayout", vtx_shaderstorage_buffer)
shader:send("VertexJWLayout", vjw_shaderstorage_buffer)
end,
load_images = function(base_path, images)
@ -98,22 +108,77 @@ collada_scene = {
end,
draw_geometry = function(geometry, instance_materials)
local base_index_buffer_offset = geometry.mesh.index_buffer_offset / 4
local mesh = geometry.mesh
local base_index_buffer_offset = mesh.index_buffer_offset / 4
for _, instance_material in ipairs(instance_materials) do
collada_scene.set_instance_material(instance_material)
local triangles = geometry.mesh.triangles[instance_material.element_index + 1]
local triangles = mesh.triangles[instance_material.element_index + 1]
local index_offset = base_index_buffer_offset + triangles.index_offset
local index_count = triangles.count * 3
local vertex_offset = geometry.mesh.vertex_buffer_offset / (4 * 4 * 3)
shader:send("VertexOffset", vertex_offset)
local vertex_offset = mesh.vertex_buffer_offset / (4 * 4 * 3)
shader:send("VertexPNTOffset", vertex_offset)
love.graphics.drawFromShader(index_buffer, index_count, 1, 1 + index_offset)
end
end,
draw_node = function(node, node_instance, transform)
draw_instance_geometries = function(instance_geometries)
for _, instance_geometry in ipairs(instance_geometries) do
collada_scene.draw_geometry(instance_geometry.geometry, instance_geometry.instance_materials)
end
end,
draw_skin = function(skin, instance_materials)
local mesh = skin.geometry.mesh
local base_index_buffer_offset = mesh.index_buffer_offset / 4
for _, instance_material in ipairs(instance_materials) do
collada_scene.set_instance_material(instance_material)
local triangles = mesh.triangles[instance_material.element_index + 1]
local index_offset = base_index_buffer_offset + triangles.index_offset
local index_count = triangles.count * 3
local mesh_vertex_offset = mesh.vertex_buffer_offset / (4 * 4 * 3)
shader:send("VertexPNTOffset", mesh_vertex_offset)
local skin_vertex_offset = skin.vertex_buffer_offset / (4 * 4 * 2)
shader:send("VertexJWOffset", skin_vertex_offset)
love.graphics.drawFromShader(index_buffer, index_count, 1, 1 + index_offset)
end
end,
draw_instance_controllers = function(node_state, instance_controllers)
for _, instance_controller in ipairs(instance_controllers) do
local skin = instance_controller.controller.skin
local joints = {}
for joint_index = 1, instance_controller.joint_count do
local ibm = mat4.load_table(skin.inverse_bind_matrices[joint_index])
local node_index = instance_controller.joint_node_indices[joint_index]
local node_instance = node_state.node_instances[node_index]
joints[joint_index] = ibm * node_instance.world
end
--shader:send("Joints", "column",
--joints[1].data,
--joints[2].data,
--joints[3].data)
shader:send("Joints", "column",
mat4.store_table(joints[1]),
mat4.store_table(joints[2]),
mat4.store_table(joints[3]))
collada_scene.draw_skin(instance_controller.controller.skin,
instance_controller.instance_materials)
end
end,
draw_node = function(node_state, node, node_instance, transform)
if node.type ~= collada_types.node_type.NODE then
return
end
@ -127,20 +192,19 @@ collada_scene = {
shader:send("world_transform", "column", world.data)
shader:send("transform", "column", transform.data)
for _, instance_geometry in ipairs(node.instance_geometries) do
collada_scene.draw_geometry(instance_geometry.geometry, instance_geometry.instance_materials)
end
collada_scene.draw_instance_geometries(node.instance_geometries)
collada_scene.draw_instance_controllers(node_state, node.instance_controllers)
end,
draw_nodes = function(node_state, transform)
love.graphics.setShader(shader)
shader:send("view_position", {-88.57101, -71.71298, 104.5738, 1.0})
shader:send("light_position", {0.0, -56.804, 58.237, 1.0})
shader:send("light_position", {-26.649, -56.804, 58.237, 1.0})
local node_index = 0
for _, node in ipairs(node_state.nodes) do
local node_instance = node_state.node_instances[node_index]
collada_scene.draw_node(node, node_instance, transform)
collada_scene.draw_node(node_state, node, node_instance, transform)
node_index = node_index + 1
end
end,

View File

@ -143,9 +143,9 @@ local animate_channel_segment = function(channel, transform, frame_ix, t)
local target_attributes = {channel.target_attribute}
if channel.target_attribute == collada_types.target_attribute.ALL then
if transform.type == collada_types.transform_type.TRANSLATE or transform.type == collada_types.transform_type.SCALE then
target_attributes = translate_scale_target_attributes
target_attributes = collada_types.translate_scale_target_attributes
elseif transform.type == collada_types.transform_type.ROTATE then
target_attributes = rotate_target_attributes
target_attributes = collada_types.rotate_target_attributes
else
assert(false)
end
@ -157,7 +157,8 @@ local animate_channel_segment = function(channel, transform, frame_ix, t)
for parameter_ix = 0, target_attributes_count-1 do
local interpolation = channel.source_sampler.interpolation.interpolation_array[frame_ix]
local value
if interpolation == collada_types.interpolation.BEZIER then
--if interpolation == collada_types.interpolation.BEZIER then
if false then
value = bezier_sampler(channel.source_sampler, frame_ix, parameter_ix, t)
else
local iv = linear_interpolate_iv(channel.source_sampler.input, frame_ix, t)
@ -185,7 +186,6 @@ local update = function(_t, node_state)
local node_index = 0
for _, node in ipairs(node_state.nodes) do
node_instance = node_state.node_instances[node_index]
animate_node(node, node_instance, t)
local world = node_state:node_instance_world(node, node_instance.transforms)

View File

@ -30,6 +30,10 @@ local transform_matrix = function (loaded_transform)
elseif type == collada_types.transform_type.MATRIX then
return value
elseif type == collada_types.transform_type.ROTATE then
if value.f[0] == 0 and value.f[1] == 0 and value.f[2] == 0 then
-- WUT?
return mat4.identity()
end
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)

View File

@ -50,7 +50,7 @@ function love.draw()
local transform = view * projection
--collada_scene_animate.update(t, node_state)
collada_scene_animate.update(t, node_state)
t = t + 0.016
love.graphics.setDepthMode("less", true)

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -1555,33 +1555,28 @@ ns.node_channel_node_bone003_scaleaxisrotation = {
target_transform_index = 6,
target_attribute = collada_types.target_attribute.ALL,
}
-- logOnly_png
ns.image_logonly_png = {
uri = "./images/0_logOnly.png",
}
ns.images = {
ns.image_logonly_png,
}
ns.effect_material__47 = {
type = collada_types.effect_type.BLINN,
blinn = {
ns.effect_coloreffectr5g54b179 = {
type = collada_types.effect_type.PHONG,
phong = {
emission = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.0, 0.0, 0.0, 1.0},
color = {0.0, 0.0, 0.0, 0.0},
},
ambient = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.588, 0.588, 0.588, 1.0},
color = {0.01960784, 0.2117647, 0.7019608, 1.0},
},
diffuse = {
type = collada_types.color_or_texture_type.TEXTURE,
texture = { image_index = 0 }, -- logOnly_png
type = collada_types.color_or_texture_type.COLOR,
color = {0.01960784, 0.2117647, 0.7019608, 1.0},
},
specular = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.36, 0.36, 0.36, 1.0},
color = {1.0, 1.0, 1.0, 1.0},
},
shininess = 37.0,
shininess = 10.0,
reflective = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.0, 0.0, 0.0, 1.0},
@ -1628,47 +1623,11 @@ ns.effect_coloreffectr6g134b58 = {
index_of_refraction = 0.0,
}
}
ns.effect_coloreffectr5g54b179 = {
type = collada_types.effect_type.PHONG,
phong = {
emission = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.0, 0.0, 0.0, 0.0},
},
ambient = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.01960784, 0.2117647, 0.7019608, 1.0},
},
diffuse = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.01960784, 0.2117647, 0.7019608, 1.0},
},
specular = {
type = collada_types.color_or_texture_type.COLOR,
color = {1.0, 1.0, 1.0, 1.0},
},
shininess = 10.0,
reflective = {
type = collada_types.color_or_texture_type.COLOR,
color = {0.0, 0.0, 0.0, 1.0},
},
reflectivity = 0.0,
transparent = {
type = collada_types.color_or_texture_type.COLOR,
color = {1.0, 1.0, 1.0, 1.0},
},
transparency = 1.0,
index_of_refraction = 0.0,
}
}
ns.material_coloreffectr6g134b58_material = {
effect = ns.effect_coloreffectr6g134b58,
}
ns.material_coloreffectr5g54b179_material = {
effect = ns.effect_coloreffectr5g54b179,
}
ns.material_material__47_material = {
effect = ns.effect_material__47,
ns.material_coloreffectr6g134b58_material = {
effect = ns.effect_coloreffectr6g134b58,
}
ns.input_elements_position_0_3_normal_0_3_texcoord_0_3 = {
{
@ -1687,28 +1646,9 @@ ns.input_elements_position_0_3_normal_0_3_texcoord_0_3 = {
format = collada_types.input_format.FLOAT3,
},
}
ns.triangles_geom_plane = {
{
count = 20000, -- triangles
index_offset = 0, -- indices
inputs_index = 0, -- index into inputs_list
},
}
ns.geometry_geom_plane = {
mesh = {
triangles = ns.triangles_geom_plane,
triangles_count = 1,
vertex_buffer_offset = 0,
vertex_buffer_size = 489648,
index_buffer_offset = 0,
index_buffer_size = 240000,
}
}
ns.triangles_geom_box001 = {
{
count = 960, -- triangles
count = 60, -- triangles
index_offset = 0, -- indices
inputs_index = 0, -- index into inputs_list
},
@ -1718,17 +1658,46 @@ ns.geometry_geom_box001 = {
triangles = ns.triangles_geom_box001,
triangles_count = 1,
vertex_buffer_offset = 489648,
vertex_buffer_size = 30240,
vertex_buffer_offset = 0,
vertex_buffer_size = 3456,
index_buffer_offset = 240000,
index_buffer_size = 11520,
index_buffer_offset = 0,
index_buffer_size = 720,
}
}
ns.geometries = {
ns.geometry_geom_plane,
ns.geometry_geom_box001,
}
ns.inverse_bind_matrices_geom_box001_skin1 = {
{
4.37114e-08, -8.74228e-08, -1.0, 0.0,
8.74228e-08, 1.0, -8.74228e-08, 0.0,
1.0, -8.74228e-08, 4.37114e-08, 0.0,
0.0, 0.0, 0.0, 1.0,
},
{
3.45463e-08, 1.03685e-06, -1.0, 0.0,
-4.60877e-14, 1.0, 1.03685e-06, 0.0,
1.0, 1.57076e-14, 3.45463e-08, 0.0,
-16.75902, 6.06573e-05, 1.77593e-07, 1.0,
},
{
-4.37114e-08, 4.76837e-07, -1.0, 0.0,
1.74846e-07, 1.0, 4.76837e-07, 0.0,
1.0, -1.74846e-07, -4.37115e-08, 0.0,
-7.378868, -1.26227e-06, 6.50286e-07, 1.0,
},
}
ns.controller_geom_box001_skin1 = {
skin = {
geometry = ns.geometry_geom_box001,
inverse_bind_matrices = ns.inverse_bind_matrices_geom_box001_skin1,
vertex_buffer_offset = 0,
vertex_buffer_size = 2304,
}
}
ns.transforms_node_environmentambientlight = {
}
ns.instance_geometries_node_environmentambientlight = {
@ -1762,55 +1731,72 @@ ns.node_node_environmentambientlight = {
channels = ns.node_channels_node_environmentambientlight,
channels_count = 0,
}
ns.transforms_node_plane = {
ns.transforms_node_cameratargethelper = {
{
type = collada_types.transform_type.TRANSLATE,
translate = {5.93245e-12, 2.29894e-15, -14.64218},
translate = {-19.90239, -27.72767, 54.6898},
},
}
ns.instance_geometry_instance_materials_node_plane_0 = {
{
element_index = 0, -- an index into mesh.triangles
material = ns.material_material__47_material,
emission = { input_set = -1 },
ambient = { input_set = -1 },
diffuse = { input_set = 0 },
specular = { input_set = -1 },
},
ns.instance_geometries_node_cameratargethelper = {
}
ns.instance_geometries_node_plane = {
{
geometry = ns.geometry_geom_plane,
instance_materials = ns.instance_geometry_instance_materials_node_plane_0,
instance_materials_count = 1,
},
ns.instance_controllers_node_cameratargethelper = {
}
ns.instance_controllers_node_plane = {
ns.instance_lights_node_cameratargethelper = {
}
ns.instance_lights_node_plane = {
ns.node_channels_node_cameratargethelper = {
}
ns.node_channels_node_plane = {
}
ns.node_node_plane = {
ns.node_node_cameratargethelper = {
parent_index = -1,
type = collada_types.node_type.NODE,
transforms = ns.transforms_node_plane,
transforms = ns.transforms_node_cameratargethelper,
transforms_count = 1,
instance_geometries = ns.instance_geometries_node_plane,
instance_geometries_count = 1,
instance_geometries = ns.instance_geometries_node_cameratargethelper,
instance_geometries_count = 0,
instance_controllers = ns.instance_controllers_node_plane,
instance_controllers = ns.instance_controllers_node_cameratargethelper,
instance_controllers_count = 0,
instance_lights = ns.instance_lights_node_plane,
instance_lights = ns.instance_lights_node_cameratargethelper,
instance_lights_count = 0,
channels = ns.node_channels_node_plane,
channels = ns.node_channels_node_cameratargethelper,
channels_count = 0,
}
ns.transforms_node_camera_target = {
{
type = collada_types.transform_type.TRANSLATE,
translate = {-12.69313, 5.226418, -13.172},
},
}
ns.instance_geometries_node_camera_target = {
}
ns.instance_controllers_node_camera_target = {
}
ns.instance_lights_node_camera_target = {
}
ns.node_channels_node_camera_target = {
}
ns.node_node_camera_target = {
parent_index = 1,
type = collada_types.node_type.NODE,
transforms = ns.transforms_node_camera_target,
transforms_count = 1,
instance_geometries = ns.instance_geometries_node_camera_target,
instance_geometries_count = 0,
instance_controllers = ns.instance_controllers_node_camera_target,
instance_controllers_count = 0,
instance_lights = ns.instance_lights_node_camera_target,
instance_lights_count = 0,
channels = ns.node_channels_node_camera_target,
channels_count = 0,
}
ns.transforms_node_omni001 = {
@ -1856,7 +1842,14 @@ ns.node_node_omni001 = {
}
ns.transforms_node_box001 = {
}
ns.instance_geometry_instance_materials_node_box001_0 = {
ns.instance_geometries_node_box001 = {
}
ns.joint_node_indices_node_box001_geom_box001_skin1 = {
6, -- joint0 node_bone001
8, -- joint1 node_bone003
7, -- joint2 node_bone002
}
ns.instance_controller_instance_materials_node_box001_0 = {
{
element_index = 0, -- an index into mesh.triangles
material = ns.material_coloreffectr6g134b58_material,
@ -1867,16 +1860,17 @@ ns.instance_geometry_instance_materials_node_box001_0 = {
specular = { input_set = -1 },
},
}
ns.instance_geometries_node_box001 = {
ns.instance_controllers_node_box001 = {
{
geometry = ns.geometry_geom_box001,
controller = ns.controller_geom_box001_skin1,
instance_materials = ns.instance_geometry_instance_materials_node_box001_0,
joint_node_indices = ns.joint_node_indices_node_box001_geom_box001_skin1,
joint_count = #ns.joint_node_indices_node_box001_geom_box001_skin1,
instance_materials = ns.instance_controller_instance_materials_node_box001_0,
instance_materials_count = 1,
},
}
ns.instance_controllers_node_box001 = {
}
ns.instance_lights_node_box001 = {
}
ns.node_channels_node_box001 = {
@ -1890,10 +1884,10 @@ ns.node_node_box001 = {
transforms_count = 0,
instance_geometries = ns.instance_geometries_node_box001,
instance_geometries_count = 1,
instance_geometries_count = 0,
instance_controllers = ns.instance_controllers_node_box001,
instance_controllers_count = 0,
instance_controllers_count = 1,
instance_lights = ns.instance_lights_node_box001,
instance_lights_count = 0,
@ -1972,20 +1966,20 @@ ns.instance_controllers_node_bone001 = {
ns.instance_lights_node_bone001 = {
}
ns.node_channels_node_bone001 = {
node_channel_node_bone001_scaleaxisrotation,
node_channel_node_bone001_translation_z,
node_channel_node_bone001_translation_x,
node_channel_node_bone001_rotationz_angle,
node_channel_node_bone001_scale,
node_channel_node_bone001_inversescaleaxisrotation,
node_channel_node_bone001_rotationx_angle,
node_channel_node_bone001_translation_y,
node_channel_node_bone001_rotationy_angle,
ns.node_channel_node_bone001_rotationy_angle,
ns.node_channel_node_bone001_translation_z,
ns.node_channel_node_bone001_scaleaxisrotation,
ns.node_channel_node_bone001_rotationz_angle,
ns.node_channel_node_bone001_rotationx_angle,
ns.node_channel_node_bone001_inversescaleaxisrotation,
ns.node_channel_node_bone001_translation_x,
ns.node_channel_node_bone001_translation_y,
ns.node_channel_node_bone001_scale,
}
ns.node_node_bone001 = {
parent_index = 4,
parent_index = 5,
type = collada_types.node_type.NODE,
type = collada_types.node_type.JOINT,
transforms = ns.transforms_node_bone001,
transforms_count = 7,
@ -2039,20 +2033,20 @@ ns.instance_controllers_node_bone002 = {
ns.instance_lights_node_bone002 = {
}
ns.node_channels_node_bone002 = {
node_channel_node_bone002_rotationx_angle,
node_channel_node_bone002_translation_z,
node_channel_node_bone002_inversescaleaxisrotation,
node_channel_node_bone002_rotationz_angle,
node_channel_node_bone002_rotationy_angle,
node_channel_node_bone002_translation_y,
node_channel_node_bone002_translation_x,
node_channel_node_bone002_scale,
node_channel_node_bone002_scaleaxisrotation,
ns.node_channel_node_bone002_rotationx_angle,
ns.node_channel_node_bone002_translation_y,
ns.node_channel_node_bone002_inversescaleaxisrotation,
ns.node_channel_node_bone002_translation_z,
ns.node_channel_node_bone002_translation_x,
ns.node_channel_node_bone002_scale,
ns.node_channel_node_bone002_rotationz_angle,
ns.node_channel_node_bone002_rotationy_angle,
ns.node_channel_node_bone002_scaleaxisrotation,
}
ns.node_node_bone002 = {
parent_index = 5,
parent_index = 6,
type = collada_types.node_type.NODE,
type = collada_types.node_type.JOINT,
transforms = ns.transforms_node_bone002,
transforms_count = 7,
@ -2106,20 +2100,20 @@ ns.instance_controllers_node_bone003 = {
ns.instance_lights_node_bone003 = {
}
ns.node_channels_node_bone003 = {
node_channel_node_bone003_rotationz_angle,
node_channel_node_bone003_translation_x,
node_channel_node_bone003_translation_y,
node_channel_node_bone003_scale,
node_channel_node_bone003_inversescaleaxisrotation,
node_channel_node_bone003_rotationx_angle,
node_channel_node_bone003_rotationy_angle,
node_channel_node_bone003_translation_z,
node_channel_node_bone003_scaleaxisrotation,
ns.node_channel_node_bone003_inversescaleaxisrotation,
ns.node_channel_node_bone003_rotationx_angle,
ns.node_channel_node_bone003_translation_z,
ns.node_channel_node_bone003_translation_x,
ns.node_channel_node_bone003_scale,
ns.node_channel_node_bone003_rotationy_angle,
ns.node_channel_node_bone003_translation_y,
ns.node_channel_node_bone003_rotationz_angle,
ns.node_channel_node_bone003_scaleaxisrotation,
}
ns.node_node_bone003 = {
parent_index = 6,
parent_index = 7,
type = collada_types.node_type.NODE,
type = collada_types.node_type.JOINT,
transforms = ns.transforms_node_bone003,
transforms_count = 7,
@ -2185,7 +2179,7 @@ ns.instance_lights_node_camera001 = {
ns.node_channels_node_camera001 = {
}
ns.node_node_camera001 = {
parent_index = 8,
parent_index = 9,
type = collada_types.node_type.NODE,
@ -2253,7 +2247,7 @@ ns.instance_lights_node_camera001_target = {
ns.node_channels_node_camera001_target = {
}
ns.node_node_camera001_target = {
parent_index = 10,
parent_index = 11,
type = collada_types.node_type.NODE,
@ -2274,17 +2268,18 @@ ns.node_node_camera001_target = {
}
ns.nodes = {
ns.node_node_environmentambientlight, -- 0
ns.node_node_plane, -- 1
ns.node_node_omni001, -- 2
ns.node_node_box001, -- 3
ns.node_node_bonehelper, -- 4
ns.node_node_bone001, -- 5
ns.node_node_bone002, -- 6
ns.node_node_bone003, -- 7
ns.node_node_camerahelper_1, -- 8
ns.node_node_camera001, -- 9
ns.node_node_cameratargethelper_1, -- 10
ns.node_node_camera001_target, -- 11
ns.node_node_cameratargethelper, -- 1
ns.node_node_camera_target, -- 2
ns.node_node_omni001, -- 3
ns.node_node_box001, -- 4
ns.node_node_bonehelper, -- 5
ns.node_node_bone001, -- 6
ns.node_node_bone002, -- 7
ns.node_node_bone003, -- 8
ns.node_node_camerahelper_1, -- 9
ns.node_node_camera001, -- 10
ns.node_node_cameratargethelper_1, -- 11
ns.node_node_camera001_target, -- 12
}
ns.inputs_list = {
{

View File

@ -1,6 +0,0 @@
IMAGES += image/0_logOnly.DDS
image/0_logOnly.DDS: ./images/0_logOnly.png
@mkdir -p image
texconv10.exe -f BC1_UNORM -nologo "$<"
mv "$(<:.png=.DDS)" "$@"

View File

@ -2,4 +2,3 @@ RES_SCENES_NOODLE_VTX RCDATA "noodle.vtx"
RES_SCENES_NOODLE_VJW RCDATA "noodle.vjw"
RES_SCENES_NOODLE_IDX RCDATA "noodle.idx"
_0_LOGONLY_PNG RCDATA "image/0_logOnly.DDS"

Binary file not shown.

Binary file not shown.

55
skinned_vertex.glsl Normal file
View File

@ -0,0 +1,55 @@
#pragma language glsl4
struct vertex_pnt_t {
vec4 Position;
vec4 Normal;
vec4 Texture;
};
struct vertex_jw_t {
ivec4 Joint;
vec4 Weight;
};
layout (std430) readonly buffer VertexPNTLayout
{
vertex_pnt_t VertexPNTBuffer[];
};
layout (std430) readonly buffer VertexJWLayout
{
vertex_jw_t VertexJWBuffer[];
};
uniform int VertexPNTOffset;
uniform int VertexJWOffset;
uniform mat4 Joints[3];
uniform mat4 world_transform;
uniform mat4 transform;
varying vec4 PixelNormal;
varying vec4 PixelTexture;
varying vec4 PixelWorldPosition;
void vertexmain()
{
vertex_pnt_t VertexPNT = VertexPNTBuffer[VertexPNTOffset + gl_VertexID];
vertex_jw_t VertexJW = VertexJWBuffer[VertexJWOffset + gl_VertexID];
mat4 mSkin
= VertexJW.Weight.x * Joints[VertexJW.Joint.x]
+ VertexJW.Weight.y * Joints[VertexJW.Joint.y]
+ VertexJW.Weight.z * Joints[VertexJW.Joint.z]
+ VertexJW.Weight.w * Joints[VertexJW.Joint.w]
;
PixelNormal = world_transform * vec4(VertexPNT.Normal.xyz, 0);
PixelTexture = VertexPNT.Texture;
vec4 Position = mSkin * vec4(VertexPNT.Position.xyz, 1);
//vec4 Position = Joints * vec4(VertexPNT.Position.xyz, 1);
PixelWorldPosition = world_transform * Position;
love_Position = transform * Position;
}