Add a gltf level exporter (#1719)

* Add a gltf level exporter

* more fixes

* disable by default

* compile fixes for windows

* improve collide packer

* bug fix

* clang format

* fix texture bug
This commit is contained in:
water111
2022-08-05 12:25:35 -04:00
committed by GitHub
parent dc6589cef5
commit da4ec008c3
39 changed files with 1690 additions and 231 deletions
+26 -12
View File
@@ -13,6 +13,7 @@
#include "decompiler/level_extractor/extract_shrub.h"
#include "decompiler/level_extractor/extract_tfrag.h"
#include "decompiler/level_extractor/extract_tie.h"
#include "decompiler/level_extractor/fr3_to_gltf.h"
namespace decompiler {
@@ -98,13 +99,12 @@ void extract_art_groups_from_level(const ObjectFileDB& db,
const TextureDB& tex_db,
const std::vector<level_tools::TextureRemap>& tex_remap,
const std::string& dgo_name,
tfrag3::Level& level_data,
bool dump_level) {
tfrag3::Level& level_data) {
const auto& files = db.obj_files_by_dgo.at(dgo_name);
for (const auto& file : files) {
if (file.name.length() > 3 && !file.name.compare(file.name.length() - 3, 3, "-ag")) {
const auto& ag_file = db.lookup_record(file);
extract_merc(ag_file, tex_db, db.dts, tex_remap, level_data, dump_level);
extract_merc(ag_file, tex_db, db.dts, tex_remap, level_data, false);
}
}
}
@@ -113,7 +113,6 @@ std::vector<level_tools::TextureRemap> extract_bsp_from_level(const ObjectFileDB
const TextureDB& tex_db,
const std::string& dgo_name,
const DecompileHacks& hacks,
bool dump_level,
bool extract_collision,
tfrag3::Level& level_data) {
auto bsp_rec = get_bsp_file(db.obj_files_by_dgo.at(dgo_name));
@@ -165,18 +164,18 @@ std::vector<level_tools::TextureRemap> extract_bsp_from_level(const ObjectFileDB
}
extract_tfrag(as_tfrag_tree, fmt::format("{}-{}", dgo_name, i++),
bsp_header.texture_remap_table, tex_db, expected_missing_textures, level_data,
dump_level);
false);
} else if (draw_tree->my_type() == "drawable-tree-instance-tie") {
auto as_tie_tree = dynamic_cast<level_tools::DrawableTreeInstanceTie*>(draw_tree.get());
ASSERT(as_tie_tree);
extract_tie(as_tie_tree, fmt::format("{}-{}-tie", dgo_name, i++),
bsp_header.texture_remap_table, tex_db, level_data, dump_level);
bsp_header.texture_remap_table, tex_db, level_data, false);
} else if (draw_tree->my_type() == "drawable-tree-instance-shrub") {
auto as_shrub_tree =
dynamic_cast<level_tools::shrub_types::DrawableTreeInstanceShrub*>(draw_tree.get());
ASSERT(as_shrub_tree);
extract_shrub(as_shrub_tree, fmt::format("{}-{}-shrub", dgo_name, i++),
bsp_header.texture_remap_table, tex_db, {}, level_data, dump_level);
bsp_header.texture_remap_table, tex_db, {}, level_data, false);
} else if (draw_tree->my_type() == "drawable-tree-collide-fragment" && extract_collision) {
auto as_collide_frags =
dynamic_cast<level_tools::DrawableTreeCollideFragment*>(draw_tree.get());
@@ -184,7 +183,7 @@ std::vector<level_tools::TextureRemap> extract_bsp_from_level(const ObjectFileDB
ASSERT(!got_collide);
got_collide = true;
extract_collide_frags(as_collide_frags, all_ties, fmt::format("{}-{}-collide", dgo_name, i++),
level_data, dump_level);
level_data, false);
} else {
// fmt::print(" unsupported tree {}\n", draw_tree->my_type());
}
@@ -218,7 +217,8 @@ void extract_common(const ObjectFileDB& db,
tfrag3::Level tfrag_level;
add_all_textures_from_level(tfrag_level, dgo_name, tex_db);
extract_art_groups_from_level(db, tex_db, {}, dgo_name, tfrag_level, dump_levels);
extract_art_groups_from_level(db, tex_db, {}, dgo_name, tfrag_level);
Serializer ser;
tfrag_level.serialize(ser);
auto compressed =
@@ -231,6 +231,11 @@ void extract_common(const ObjectFileDB& db,
file_util::write_binary_file(
output_folder / fmt::format("{}.fr3", dgo_name.substr(0, dgo_name.length() - 4)),
compressed.data(), compressed.size());
if (dump_levels) {
save_level_foreground_as_gltf(tfrag_level,
file_util::get_jak_project_dir() / "debug_out" / "common.glb");
}
}
void extract_from_level(const ObjectFileDB& db,
@@ -248,9 +253,9 @@ void extract_from_level(const ObjectFileDB& db,
add_all_textures_from_level(level_data, dgo_name, tex_db);
// the bsp header file data
auto tex_remap = extract_bsp_from_level(db, tex_db, dgo_name, hacks, dump_level,
extract_collision, level_data);
extract_art_groups_from_level(db, tex_db, tex_remap, dgo_name, level_data, dump_level);
auto tex_remap =
extract_bsp_from_level(db, tex_db, dgo_name, hacks, extract_collision, level_data);
extract_art_groups_from_level(db, tex_db, tex_remap, dgo_name, level_data);
Serializer ser;
level_data.serialize(ser);
@@ -263,6 +268,15 @@ void extract_from_level(const ObjectFileDB& db,
file_util::write_binary_file(
output_folder / fmt::format("{}.fr3", dgo_name.substr(0, dgo_name.length() - 4)),
compressed.data(), compressed.size());
if (dump_level) {
save_level_background_as_gltf(level_data,
file_util::get_jak_project_dir() / "debug_out" /
fmt::format("{}_background.glb", level_data.level_name));
save_level_foreground_as_gltf(level_data,
file_util::get_jak_project_dir() / "debug_out" /
fmt::format("{}_foreground.glb", level_data.level_name));
}
}
void extract_all_levels(const ObjectFileDB& db,