collada_scene: skinned animation
This commit is contained in:
parent
5f867891fa
commit
8d8c87c5b0
12
_math.lua
12
_math.lua
@ -68,6 +68,15 @@ mat4 = {
|
|||||||
t[13], t[14], t[15], t[16])
|
t[13], t[14], t[15], t[16])
|
||||||
end,
|
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,
|
set = function(m00, m01, m02, m03,
|
||||||
m10, m11, m12, m13,
|
m10, m11, m12, m13,
|
||||||
m20, m21, m22, m23,
|
m20, m21, m22, m23,
|
||||||
@ -363,6 +372,9 @@ mat4 = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
rotation_axis = function(axis, angle)
|
rotation_axis = function(axis, angle)
|
||||||
|
assert(not vec3.equal(axis, vec3._zero))
|
||||||
|
assert(not vec3.isinfinite(axis))
|
||||||
|
|
||||||
local normal = vec3.normalize(axis)
|
local normal = vec3.normalize(axis)
|
||||||
return mat4.rotation_normal(normal, angle)
|
return mat4.rotation_normal(normal, angle)
|
||||||
end,
|
end,
|
||||||
|
|||||||
@ -7,7 +7,8 @@ local scalar = _math.scalar
|
|||||||
local collada_types = require 'collada_types'
|
local collada_types = require 'collada_types'
|
||||||
|
|
||||||
local pixel_data = love.filesystem.newFileData("pixel.glsl")
|
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 shader = love.graphics.newShader(pixel_data, vertex_data)
|
||||||
|
|
||||||
local images_textures = {}
|
local images_textures = {}
|
||||||
@ -30,14 +31,23 @@ collada_scene = {
|
|||||||
-- vertex shader storage buffer
|
-- vertex shader storage buffer
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
local format = {
|
local vtx_format = {
|
||||||
{ name = 'Position', format = 'floatvec4' },
|
{ name = 'Position', format = 'floatvec4' },
|
||||||
{ name = 'Normal', format = 'floatvec4' },
|
{ name = 'Normal', format = 'floatvec4' },
|
||||||
{ name = 'Texture', format = 'floatvec4' },
|
{ name = 'Texture', format = 'floatvec4' },
|
||||||
}
|
}
|
||||||
local vertex_data = love.filesystem.newFileData("scene/noodle/noodle.vtx")
|
local vtx_data = love.filesystem.newFileData("scene/noodle/noodle.vtx")
|
||||||
local shaderstorage_buffer = love.graphics.newBuffer(format, vertex_data, { shaderstorage = true, usage = "static" })
|
local vtx_shaderstorage_buffer = love.graphics.newBuffer(vtx_format, vtx_data, { shaderstorage = true, usage = "static" })
|
||||||
shader:send("VertexLayout", shaderstorage_buffer)
|
|
||||||
|
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,
|
end,
|
||||||
|
|
||||||
load_images = function(base_path, images)
|
load_images = function(base_path, images)
|
||||||
@ -98,22 +108,77 @@ collada_scene = {
|
|||||||
end,
|
end,
|
||||||
|
|
||||||
draw_geometry = function(geometry, instance_materials)
|
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
|
for _, instance_material in ipairs(instance_materials) do
|
||||||
collada_scene.set_instance_material(instance_material)
|
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_offset = base_index_buffer_offset + triangles.index_offset
|
||||||
local index_count = triangles.count * 3
|
local index_count = triangles.count * 3
|
||||||
|
|
||||||
local vertex_offset = geometry.mesh.vertex_buffer_offset / (4 * 4 * 3)
|
local vertex_offset = mesh.vertex_buffer_offset / (4 * 4 * 3)
|
||||||
shader:send("VertexOffset", vertex_offset)
|
shader:send("VertexPNTOffset", vertex_offset)
|
||||||
love.graphics.drawFromShader(index_buffer, index_count, 1, 1 + index_offset)
|
love.graphics.drawFromShader(index_buffer, index_count, 1, 1 + index_offset)
|
||||||
end
|
end
|
||||||
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
|
if node.type ~= collada_types.node_type.NODE then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
@ -127,20 +192,19 @@ collada_scene = {
|
|||||||
shader:send("world_transform", "column", world.data)
|
shader:send("world_transform", "column", world.data)
|
||||||
shader:send("transform", "column", transform.data)
|
shader:send("transform", "column", transform.data)
|
||||||
|
|
||||||
for _, instance_geometry in ipairs(node.instance_geometries) do
|
collada_scene.draw_instance_geometries(node.instance_geometries)
|
||||||
collada_scene.draw_geometry(instance_geometry.geometry, instance_geometry.instance_materials)
|
collada_scene.draw_instance_controllers(node_state, node.instance_controllers)
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
|
|
||||||
draw_nodes = function(node_state, transform)
|
draw_nodes = function(node_state, transform)
|
||||||
love.graphics.setShader(shader)
|
love.graphics.setShader(shader)
|
||||||
shader:send("view_position", {-88.57101, -71.71298, 104.5738, 1.0})
|
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
|
local node_index = 0
|
||||||
for _, node in ipairs(node_state.nodes) do
|
for _, node in ipairs(node_state.nodes) do
|
||||||
local node_instance = node_state.node_instances[node_index]
|
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
|
node_index = node_index + 1
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|||||||
@ -143,9 +143,9 @@ local animate_channel_segment = function(channel, transform, frame_ix, t)
|
|||||||
local target_attributes = {channel.target_attribute}
|
local target_attributes = {channel.target_attribute}
|
||||||
if channel.target_attribute == collada_types.target_attribute.ALL then
|
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
|
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
|
elseif transform.type == collada_types.transform_type.ROTATE then
|
||||||
target_attributes = rotate_target_attributes
|
target_attributes = collada_types.rotate_target_attributes
|
||||||
else
|
else
|
||||||
assert(false)
|
assert(false)
|
||||||
end
|
end
|
||||||
@ -157,7 +157,8 @@ local animate_channel_segment = function(channel, transform, frame_ix, t)
|
|||||||
for parameter_ix = 0, target_attributes_count-1 do
|
for parameter_ix = 0, target_attributes_count-1 do
|
||||||
local interpolation = channel.source_sampler.interpolation.interpolation_array[frame_ix]
|
local interpolation = channel.source_sampler.interpolation.interpolation_array[frame_ix]
|
||||||
local value
|
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)
|
value = bezier_sampler(channel.source_sampler, frame_ix, parameter_ix, t)
|
||||||
else
|
else
|
||||||
local iv = linear_interpolate_iv(channel.source_sampler.input, frame_ix, t)
|
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
|
local node_index = 0
|
||||||
for _, node in ipairs(node_state.nodes) do
|
for _, node in ipairs(node_state.nodes) do
|
||||||
node_instance = node_state.node_instances[node_index]
|
node_instance = node_state.node_instances[node_index]
|
||||||
|
|
||||||
animate_node(node, node_instance, t)
|
animate_node(node, node_instance, t)
|
||||||
|
|
||||||
local world = node_state:node_instance_world(node, node_instance.transforms)
|
local world = node_state:node_instance_world(node, node_instance.transforms)
|
||||||
|
|||||||
@ -30,6 +30,10 @@ local transform_matrix = function (loaded_transform)
|
|||||||
elseif type == collada_types.transform_type.MATRIX then
|
elseif type == collada_types.transform_type.MATRIX then
|
||||||
return value
|
return value
|
||||||
elseif type == collada_types.transform_type.ROTATE then
|
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]))
|
return mat4.rotation_axis(value, scalar.convert_to_radians(value.f[3]))
|
||||||
elseif type == collada_types.transform_type.SCALE then
|
elseif type == collada_types.transform_type.SCALE then
|
||||||
return mat4.scaling_from_vector(value)
|
return mat4.scaling_from_vector(value)
|
||||||
|
|||||||
2
main.lua
2
main.lua
@ -50,7 +50,7 @@ function love.draw()
|
|||||||
|
|
||||||
local transform = view * projection
|
local transform = view * projection
|
||||||
|
|
||||||
--collada_scene_animate.update(t, node_state)
|
collada_scene_animate.update(t, node_state)
|
||||||
t = t + 0.016
|
t = t + 0.016
|
||||||
|
|
||||||
love.graphics.setDepthMode("less", true)
|
love.graphics.setDepthMode("less", true)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -1555,33 +1555,28 @@ ns.node_channel_node_bone003_scaleaxisrotation = {
|
|||||||
target_transform_index = 6,
|
target_transform_index = 6,
|
||||||
target_attribute = collada_types.target_attribute.ALL,
|
target_attribute = collada_types.target_attribute.ALL,
|
||||||
}
|
}
|
||||||
-- logOnly_png
|
|
||||||
ns.image_logonly_png = {
|
|
||||||
uri = "./images/0_logOnly.png",
|
|
||||||
}
|
|
||||||
ns.images = {
|
ns.images = {
|
||||||
ns.image_logonly_png,
|
|
||||||
}
|
}
|
||||||
ns.effect_material__47 = {
|
ns.effect_coloreffectr5g54b179 = {
|
||||||
type = collada_types.effect_type.BLINN,
|
type = collada_types.effect_type.PHONG,
|
||||||
blinn = {
|
phong = {
|
||||||
emission = {
|
emission = {
|
||||||
type = collada_types.color_or_texture_type.COLOR,
|
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 = {
|
ambient = {
|
||||||
type = collada_types.color_or_texture_type.COLOR,
|
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 = {
|
diffuse = {
|
||||||
type = collada_types.color_or_texture_type.TEXTURE,
|
type = collada_types.color_or_texture_type.COLOR,
|
||||||
texture = { image_index = 0 }, -- logOnly_png
|
color = {0.01960784, 0.2117647, 0.7019608, 1.0},
|
||||||
},
|
},
|
||||||
specular = {
|
specular = {
|
||||||
type = collada_types.color_or_texture_type.COLOR,
|
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 = {
|
reflective = {
|
||||||
type = collada_types.color_or_texture_type.COLOR,
|
type = collada_types.color_or_texture_type.COLOR,
|
||||||
color = {0.0, 0.0, 0.0, 1.0},
|
color = {0.0, 0.0, 0.0, 1.0},
|
||||||
@ -1628,47 +1623,11 @@ ns.effect_coloreffectr6g134b58 = {
|
|||||||
index_of_refraction = 0.0,
|
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 = {
|
ns.material_coloreffectr5g54b179_material = {
|
||||||
effect = ns.effect_coloreffectr5g54b179,
|
effect = ns.effect_coloreffectr5g54b179,
|
||||||
}
|
}
|
||||||
ns.material_material__47_material = {
|
ns.material_coloreffectr6g134b58_material = {
|
||||||
effect = ns.effect_material__47,
|
effect = ns.effect_coloreffectr6g134b58,
|
||||||
}
|
}
|
||||||
ns.input_elements_position_0_3_normal_0_3_texcoord_0_3 = {
|
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,
|
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 = {
|
ns.triangles_geom_box001 = {
|
||||||
{
|
{
|
||||||
count = 960, -- triangles
|
count = 60, -- triangles
|
||||||
index_offset = 0, -- indices
|
index_offset = 0, -- indices
|
||||||
inputs_index = 0, -- index into inputs_list
|
inputs_index = 0, -- index into inputs_list
|
||||||
},
|
},
|
||||||
@ -1718,17 +1658,46 @@ ns.geometry_geom_box001 = {
|
|||||||
triangles = ns.triangles_geom_box001,
|
triangles = ns.triangles_geom_box001,
|
||||||
triangles_count = 1,
|
triangles_count = 1,
|
||||||
|
|
||||||
vertex_buffer_offset = 489648,
|
vertex_buffer_offset = 0,
|
||||||
vertex_buffer_size = 30240,
|
vertex_buffer_size = 3456,
|
||||||
|
|
||||||
index_buffer_offset = 240000,
|
index_buffer_offset = 0,
|
||||||
index_buffer_size = 11520,
|
index_buffer_size = 720,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ns.geometries = {
|
ns.geometries = {
|
||||||
ns.geometry_geom_plane,
|
|
||||||
ns.geometry_geom_box001,
|
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.transforms_node_environmentambientlight = {
|
||||||
}
|
}
|
||||||
ns.instance_geometries_node_environmentambientlight = {
|
ns.instance_geometries_node_environmentambientlight = {
|
||||||
@ -1762,55 +1731,72 @@ ns.node_node_environmentambientlight = {
|
|||||||
channels = ns.node_channels_node_environmentambientlight,
|
channels = ns.node_channels_node_environmentambientlight,
|
||||||
channels_count = 0,
|
channels_count = 0,
|
||||||
}
|
}
|
||||||
ns.transforms_node_plane = {
|
ns.transforms_node_cameratargethelper = {
|
||||||
{
|
{
|
||||||
type = collada_types.transform_type.TRANSLATE,
|
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 = {
|
ns.instance_geometries_node_cameratargethelper = {
|
||||||
{
|
|
||||||
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_plane = {
|
ns.instance_controllers_node_cameratargethelper = {
|
||||||
{
|
|
||||||
geometry = ns.geometry_geom_plane,
|
|
||||||
|
|
||||||
instance_materials = ns.instance_geometry_instance_materials_node_plane_0,
|
|
||||||
instance_materials_count = 1,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
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_cameratargethelper = {
|
||||||
}
|
|
||||||
ns.node_node_plane = {
|
|
||||||
parent_index = -1,
|
parent_index = -1,
|
||||||
|
|
||||||
type = collada_types.node_type.NODE,
|
type = collada_types.node_type.NODE,
|
||||||
|
|
||||||
transforms = ns.transforms_node_plane,
|
transforms = ns.transforms_node_cameratargethelper,
|
||||||
transforms_count = 1,
|
transforms_count = 1,
|
||||||
|
|
||||||
instance_geometries = ns.instance_geometries_node_plane,
|
instance_geometries = ns.instance_geometries_node_cameratargethelper,
|
||||||
instance_geometries_count = 1,
|
instance_geometries_count = 0,
|
||||||
|
|
||||||
instance_controllers = ns.instance_controllers_node_plane,
|
instance_controllers = ns.instance_controllers_node_cameratargethelper,
|
||||||
instance_controllers_count = 0,
|
instance_controllers_count = 0,
|
||||||
|
|
||||||
instance_lights = ns.instance_lights_node_plane,
|
instance_lights = ns.instance_lights_node_cameratargethelper,
|
||||||
instance_lights_count = 0,
|
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,
|
channels_count = 0,
|
||||||
}
|
}
|
||||||
ns.transforms_node_omni001 = {
|
ns.transforms_node_omni001 = {
|
||||||
@ -1856,7 +1842,14 @@ ns.node_node_omni001 = {
|
|||||||
}
|
}
|
||||||
ns.transforms_node_box001 = {
|
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
|
element_index = 0, -- an index into mesh.triangles
|
||||||
material = ns.material_coloreffectr6g134b58_material,
|
material = ns.material_coloreffectr6g134b58_material,
|
||||||
@ -1867,16 +1860,17 @@ ns.instance_geometry_instance_materials_node_box001_0 = {
|
|||||||
specular = { input_set = -1 },
|
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,
|
instance_materials_count = 1,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
ns.instance_controllers_node_box001 = {
|
|
||||||
}
|
|
||||||
ns.instance_lights_node_box001 = {
|
ns.instance_lights_node_box001 = {
|
||||||
}
|
}
|
||||||
ns.node_channels_node_box001 = {
|
ns.node_channels_node_box001 = {
|
||||||
@ -1890,10 +1884,10 @@ ns.node_node_box001 = {
|
|||||||
transforms_count = 0,
|
transforms_count = 0,
|
||||||
|
|
||||||
instance_geometries = ns.instance_geometries_node_box001,
|
instance_geometries = ns.instance_geometries_node_box001,
|
||||||
instance_geometries_count = 1,
|
instance_geometries_count = 0,
|
||||||
|
|
||||||
instance_controllers = ns.instance_controllers_node_box001,
|
instance_controllers = ns.instance_controllers_node_box001,
|
||||||
instance_controllers_count = 0,
|
instance_controllers_count = 1,
|
||||||
|
|
||||||
instance_lights = ns.instance_lights_node_box001,
|
instance_lights = ns.instance_lights_node_box001,
|
||||||
instance_lights_count = 0,
|
instance_lights_count = 0,
|
||||||
@ -1972,20 +1966,20 @@ ns.instance_controllers_node_bone001 = {
|
|||||||
ns.instance_lights_node_bone001 = {
|
ns.instance_lights_node_bone001 = {
|
||||||
}
|
}
|
||||||
ns.node_channels_node_bone001 = {
|
ns.node_channels_node_bone001 = {
|
||||||
node_channel_node_bone001_scaleaxisrotation,
|
ns.node_channel_node_bone001_rotationy_angle,
|
||||||
node_channel_node_bone001_translation_z,
|
ns.node_channel_node_bone001_translation_z,
|
||||||
node_channel_node_bone001_translation_x,
|
ns.node_channel_node_bone001_scaleaxisrotation,
|
||||||
node_channel_node_bone001_rotationz_angle,
|
ns.node_channel_node_bone001_rotationz_angle,
|
||||||
node_channel_node_bone001_scale,
|
ns.node_channel_node_bone001_rotationx_angle,
|
||||||
node_channel_node_bone001_inversescaleaxisrotation,
|
ns.node_channel_node_bone001_inversescaleaxisrotation,
|
||||||
node_channel_node_bone001_rotationx_angle,
|
ns.node_channel_node_bone001_translation_x,
|
||||||
node_channel_node_bone001_translation_y,
|
ns.node_channel_node_bone001_translation_y,
|
||||||
node_channel_node_bone001_rotationy_angle,
|
ns.node_channel_node_bone001_scale,
|
||||||
}
|
}
|
||||||
ns.node_node_bone001 = {
|
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 = ns.transforms_node_bone001,
|
||||||
transforms_count = 7,
|
transforms_count = 7,
|
||||||
@ -2039,20 +2033,20 @@ ns.instance_controllers_node_bone002 = {
|
|||||||
ns.instance_lights_node_bone002 = {
|
ns.instance_lights_node_bone002 = {
|
||||||
}
|
}
|
||||||
ns.node_channels_node_bone002 = {
|
ns.node_channels_node_bone002 = {
|
||||||
node_channel_node_bone002_rotationx_angle,
|
ns.node_channel_node_bone002_rotationx_angle,
|
||||||
node_channel_node_bone002_translation_z,
|
ns.node_channel_node_bone002_translation_y,
|
||||||
node_channel_node_bone002_inversescaleaxisrotation,
|
ns.node_channel_node_bone002_inversescaleaxisrotation,
|
||||||
node_channel_node_bone002_rotationz_angle,
|
ns.node_channel_node_bone002_translation_z,
|
||||||
node_channel_node_bone002_rotationy_angle,
|
ns.node_channel_node_bone002_translation_x,
|
||||||
node_channel_node_bone002_translation_y,
|
ns.node_channel_node_bone002_scale,
|
||||||
node_channel_node_bone002_translation_x,
|
ns.node_channel_node_bone002_rotationz_angle,
|
||||||
node_channel_node_bone002_scale,
|
ns.node_channel_node_bone002_rotationy_angle,
|
||||||
node_channel_node_bone002_scaleaxisrotation,
|
ns.node_channel_node_bone002_scaleaxisrotation,
|
||||||
}
|
}
|
||||||
ns.node_node_bone002 = {
|
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 = ns.transforms_node_bone002,
|
||||||
transforms_count = 7,
|
transforms_count = 7,
|
||||||
@ -2106,20 +2100,20 @@ ns.instance_controllers_node_bone003 = {
|
|||||||
ns.instance_lights_node_bone003 = {
|
ns.instance_lights_node_bone003 = {
|
||||||
}
|
}
|
||||||
ns.node_channels_node_bone003 = {
|
ns.node_channels_node_bone003 = {
|
||||||
node_channel_node_bone003_rotationz_angle,
|
ns.node_channel_node_bone003_inversescaleaxisrotation,
|
||||||
node_channel_node_bone003_translation_x,
|
ns.node_channel_node_bone003_rotationx_angle,
|
||||||
node_channel_node_bone003_translation_y,
|
ns.node_channel_node_bone003_translation_z,
|
||||||
node_channel_node_bone003_scale,
|
ns.node_channel_node_bone003_translation_x,
|
||||||
node_channel_node_bone003_inversescaleaxisrotation,
|
ns.node_channel_node_bone003_scale,
|
||||||
node_channel_node_bone003_rotationx_angle,
|
ns.node_channel_node_bone003_rotationy_angle,
|
||||||
node_channel_node_bone003_rotationy_angle,
|
ns.node_channel_node_bone003_translation_y,
|
||||||
node_channel_node_bone003_translation_z,
|
ns.node_channel_node_bone003_rotationz_angle,
|
||||||
node_channel_node_bone003_scaleaxisrotation,
|
ns.node_channel_node_bone003_scaleaxisrotation,
|
||||||
}
|
}
|
||||||
ns.node_node_bone003 = {
|
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 = ns.transforms_node_bone003,
|
||||||
transforms_count = 7,
|
transforms_count = 7,
|
||||||
@ -2185,7 +2179,7 @@ ns.instance_lights_node_camera001 = {
|
|||||||
ns.node_channels_node_camera001 = {
|
ns.node_channels_node_camera001 = {
|
||||||
}
|
}
|
||||||
ns.node_node_camera001 = {
|
ns.node_node_camera001 = {
|
||||||
parent_index = 8,
|
parent_index = 9,
|
||||||
|
|
||||||
type = collada_types.node_type.NODE,
|
type = collada_types.node_type.NODE,
|
||||||
|
|
||||||
@ -2253,7 +2247,7 @@ ns.instance_lights_node_camera001_target = {
|
|||||||
ns.node_channels_node_camera001_target = {
|
ns.node_channels_node_camera001_target = {
|
||||||
}
|
}
|
||||||
ns.node_node_camera001_target = {
|
ns.node_node_camera001_target = {
|
||||||
parent_index = 10,
|
parent_index = 11,
|
||||||
|
|
||||||
type = collada_types.node_type.NODE,
|
type = collada_types.node_type.NODE,
|
||||||
|
|
||||||
@ -2274,17 +2268,18 @@ ns.node_node_camera001_target = {
|
|||||||
}
|
}
|
||||||
ns.nodes = {
|
ns.nodes = {
|
||||||
ns.node_node_environmentambientlight, -- 0
|
ns.node_node_environmentambientlight, -- 0
|
||||||
ns.node_node_plane, -- 1
|
ns.node_node_cameratargethelper, -- 1
|
||||||
ns.node_node_omni001, -- 2
|
ns.node_node_camera_target, -- 2
|
||||||
ns.node_node_box001, -- 3
|
ns.node_node_omni001, -- 3
|
||||||
ns.node_node_bonehelper, -- 4
|
ns.node_node_box001, -- 4
|
||||||
ns.node_node_bone001, -- 5
|
ns.node_node_bonehelper, -- 5
|
||||||
ns.node_node_bone002, -- 6
|
ns.node_node_bone001, -- 6
|
||||||
ns.node_node_bone003, -- 7
|
ns.node_node_bone002, -- 7
|
||||||
ns.node_node_camerahelper_1, -- 8
|
ns.node_node_bone003, -- 8
|
||||||
ns.node_node_camera001, -- 9
|
ns.node_node_camerahelper_1, -- 9
|
||||||
ns.node_node_cameratargethelper_1, -- 10
|
ns.node_node_camera001, -- 10
|
||||||
ns.node_node_camera001_target, -- 11
|
ns.node_node_cameratargethelper_1, -- 11
|
||||||
|
ns.node_node_camera001_target, -- 12
|
||||||
}
|
}
|
||||||
ns.inputs_list = {
|
ns.inputs_list = {
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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)" "$@"
|
|
||||||
|
|
||||||
@ -2,4 +2,3 @@ RES_SCENES_NOODLE_VTX RCDATA "noodle.vtx"
|
|||||||
RES_SCENES_NOODLE_VJW RCDATA "noodle.vjw"
|
RES_SCENES_NOODLE_VJW RCDATA "noodle.vjw"
|
||||||
RES_SCENES_NOODLE_IDX RCDATA "noodle.idx"
|
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
55
skinned_vertex.glsl
Normal 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;
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user