2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
local sk_definition_writer = require('sk_definition_writer')
|
|
|
|
local sk_scene = require('sk_scene')
|
|
|
|
local sk_mesh = require('sk_mesh')
|
2022-12-23 21:20:25 -05:00
|
|
|
local sk_input = require('sk_input')
|
2022-12-20 00:16:31 -05:00
|
|
|
local room_export = require('tools.level_scripts.room_export')
|
2022-12-30 22:28:27 -05:00
|
|
|
local animation = require('tools.level_scripts.animation')
|
2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
sk_definition_writer.add_header('"../build/assets/materials/static.h"')
|
|
|
|
sk_definition_writer.add_header('"levels/level_definition.h"')
|
|
|
|
|
|
|
|
local function proccessStaticNodes(nodes)
|
|
|
|
local result = {}
|
2022-12-31 15:32:01 -05:00
|
|
|
local bb_scale = sk_input.settings.fixed_point_scale
|
2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
for k, v in pairs(nodes) do
|
|
|
|
local renderChunks = sk_mesh.generate_render_chunks(v.node)
|
|
|
|
|
|
|
|
for _, chunkV in pairs(renderChunks) do
|
2022-12-31 18:12:35 -05:00
|
|
|
local transform_index = animation.get_bone_index_for_node(v.node)
|
|
|
|
|
2023-01-02 23:03:04 -05:00
|
|
|
local original_bb = chunkV.mesh.bb
|
|
|
|
|
2022-12-31 18:12:35 -05:00
|
|
|
if transform_index then
|
|
|
|
local bone = animation.get_bone_for_index(transform_index)
|
2023-01-02 23:03:04 -05:00
|
|
|
local parent_pos = bone.full_transformation:decompose()
|
2022-12-31 18:12:35 -05:00
|
|
|
chunkV.mesh = chunkV.mesh:transform(bone.full_transformation:inverse())
|
2023-01-02 23:03:04 -05:00
|
|
|
|
|
|
|
original_bb.min = original_bb.min - parent_pos
|
|
|
|
original_bb.max = original_bb.max - parent_pos
|
2022-12-31 18:12:35 -05:00
|
|
|
end
|
|
|
|
|
2022-12-20 00:16:31 -05:00
|
|
|
local gfxName = sk_mesh.generate_mesh({chunkV}, "_geo", {defaultMaterial = chunkV.material})
|
2022-12-23 21:20:25 -05:00
|
|
|
|
2023-01-02 23:03:04 -05:00
|
|
|
local mesh_bb = original_bb * bb_scale
|
2022-12-23 21:20:25 -05:00
|
|
|
|
|
|
|
mesh_bb.min.x = math.floor(mesh_bb.min.x + 0.5)
|
|
|
|
mesh_bb.min.y = math.floor(mesh_bb.min.y + 0.5)
|
|
|
|
mesh_bb.min.z = math.floor(mesh_bb.min.z + 0.5)
|
|
|
|
|
|
|
|
mesh_bb.max.x = math.floor(mesh_bb.max.x + 0.5)
|
|
|
|
mesh_bb.max.y = math.floor(mesh_bb.max.y + 0.5)
|
|
|
|
mesh_bb.max.z = math.floor(mesh_bb.max.z + 0.5)
|
2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
table.insert(result, {
|
|
|
|
node = v.node,
|
2022-12-21 22:35:54 -05:00
|
|
|
mesh = chunkV.mesh,
|
2022-12-23 21:20:25 -05:00
|
|
|
mesh_bb = mesh_bb,
|
2022-12-20 00:16:31 -05:00
|
|
|
display_list = sk_definition_writer.raw(gfxName),
|
2022-12-30 22:28:27 -05:00
|
|
|
material_index = sk_definition_writer.raw(chunkV.material.macro_name),
|
2022-12-31 18:12:35 -05:00
|
|
|
transform_index = transform_index,
|
2022-12-30 22:28:27 -05:00
|
|
|
room_index = room_export.node_nearest_room_index(v.node) or 0
|
2022-12-20 00:16:31 -05:00
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-12-30 22:28:27 -05:00
|
|
|
table.sort(result, function(a, b)
|
|
|
|
return a.room_index < b.room_index
|
|
|
|
end)
|
|
|
|
|
2022-12-20 00:16:31 -05:00
|
|
|
return result;
|
|
|
|
end
|
|
|
|
|
|
|
|
local static_nodes = proccessStaticNodes(sk_scene.nodes_for_type('@static'))
|
|
|
|
|
|
|
|
local static_content_elements = {}
|
|
|
|
|
|
|
|
local room_ranges = {}
|
2022-12-23 21:20:25 -05:00
|
|
|
local static_bounding_boxes = {}
|
2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
for index, static_node in pairs(static_nodes) do
|
|
|
|
table.insert(static_content_elements, {
|
|
|
|
displayList = static_node.display_list,
|
2022-12-30 22:28:27 -05:00
|
|
|
materialIndex = static_node.material_index,
|
|
|
|
transformIndex = static_node.transform_index and (static_node.transform_index - 1) or sk_definition_writer.raw('NO_TRANSFORM_INDEX'),
|
2022-12-20 00:16:31 -05:00
|
|
|
})
|
2022-12-24 13:33:18 -05:00
|
|
|
table.insert(static_bounding_boxes, {
|
|
|
|
static_node.mesh_bb.min.x,
|
|
|
|
static_node.mesh_bb.min.y,
|
|
|
|
static_node.mesh_bb.min.z,
|
|
|
|
|
|
|
|
static_node.mesh_bb.max.x,
|
|
|
|
static_node.mesh_bb.max.y,
|
|
|
|
static_node.mesh_bb.max.z,
|
|
|
|
})
|
2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
good_index = index - 1
|
|
|
|
|
|
|
|
while (#room_ranges <= static_node.room_index) do
|
|
|
|
table.insert(room_ranges, {
|
|
|
|
good_index,
|
|
|
|
good_index
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
local room_range = room_ranges[static_node.room_index + 1]
|
|
|
|
|
|
|
|
room_range[2] = good_index + 1
|
|
|
|
end
|
|
|
|
|
|
|
|
sk_definition_writer.add_definition("static", "struct StaticContentElement[]", "_geo", static_content_elements)
|
|
|
|
sk_definition_writer.add_definition("room_mapping", "struct Rangeu16[]", "_geo", room_ranges)
|
2022-12-23 21:20:25 -05:00
|
|
|
sk_definition_writer.add_definition('bounding_boxes', 'struct BoundingBoxs16[]', '_geo', static_bounding_boxes)
|
2022-12-20 00:16:31 -05:00
|
|
|
|
|
|
|
return {
|
|
|
|
static_nodes = static_nodes,
|
|
|
|
static_content_elements = static_content_elements,
|
2022-12-23 21:20:25 -05:00
|
|
|
static_bounding_boxes = static_bounding_boxes,
|
2022-12-20 00:16:31 -05:00
|
|
|
room_ranges = room_ranges,
|
|
|
|
}
|