Merge pull request #39134 from abustin/fbx_mesh_compression_fix

Respect 'mesh compression' editor import option in Assimp and glTF importers
This commit is contained in:
Rémi Verschelde 2020-06-08 13:16:39 +02:00 committed by GitHub
commit e891fae52b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 15 additions and 3 deletions

View file

@ -951,6 +951,9 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
if (!state.json.has("meshes")) if (!state.json.has("meshes"))
return OK; return OK;
bool compress_vert_data = state.import_flags & IMPORT_USE_COMPRESSION;
uint32_t mesh_flags = compress_vert_data ? Mesh::ARRAY_COMPRESS_DEFAULT : 0;
Array meshes = state.json["meshes"]; Array meshes = state.json["meshes"];
for (GLTFMeshIndex i = 0; i < meshes.size(); i++) { for (GLTFMeshIndex i = 0; i < meshes.size(); i++) {
@ -1207,7 +1210,7 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
} }
//just add it //just add it
mesh.mesh->add_surface_from_arrays(primitive, array, morphs); mesh.mesh->add_surface_from_arrays(primitive, array, morphs, mesh_flags);
if (p.has("material")) { if (p.has("material")) {
const int material = p["material"]; const int material = p["material"];
@ -2987,6 +2990,7 @@ Node *EditorSceneImporterGLTF::import_scene(const String &p_path, uint32_t p_fla
String version = asset["version"]; String version = asset["version"];
state.import_flags = p_flags;
state.major_version = version.get_slice(".", 0).to_int(); state.major_version = version.get_slice(".", 0).to_int();
state.minor_version = version.get_slice(".", 1).to_int(); state.minor_version = version.get_slice(".", 1).to_int();
state.use_named_skin_binds = p_flags & IMPORT_USE_NAMED_SKIN_BINDS; state.use_named_skin_binds = p_flags & IMPORT_USE_NAMED_SKIN_BINDS;

View file

@ -325,6 +325,9 @@ class EditorSceneImporterGLTF : public EditorSceneImporter {
Map<GLTFNodeIndex, Node *> scene_nodes; Map<GLTFNodeIndex, Node *> scene_nodes;
// EditorSceneImporter::ImportFlags
uint32_t import_flags;
~GLTFState() { ~GLTFState() {
for (int i = 0; i < nodes.size(); i++) { for (int i = 0; i < nodes.size(); i++) {
memdelete(nodes[i]); memdelete(nodes[i]);

View file

@ -37,7 +37,6 @@
#include "scene/resources/shape.h" #include "scene/resources/shape.h"
class Material; class Material;
class EditorSceneImporter : public Reference { class EditorSceneImporter : public Reference {
GDCLASS(EditorSceneImporter, Reference); GDCLASS(EditorSceneImporter, Reference);

View file

@ -308,6 +308,7 @@ EditorSceneImporterAssimp::_generate_scene(const String &p_path, aiScene *scene,
state.assimp_scene = scene; state.assimp_scene = scene;
state.max_bone_weights = p_max_bone_weights; state.max_bone_weights = p_max_bone_weights;
state.animation_player = NULL; state.animation_player = NULL;
state.import_flags = p_flags;
// populate light map // populate light map
for (unsigned int l = 0; l < scene->mNumLights; l++) { for (unsigned int l = 0; l < scene->mNumLights; l++) {
@ -848,6 +849,8 @@ EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportState &stat
Ref<ArrayMesh> mesh; Ref<ArrayMesh> mesh;
mesh.instance(); mesh.instance();
bool has_uvs = false; bool has_uvs = false;
bool compress_vert_data = state.import_flags & IMPORT_USE_COMPRESSION;
uint32_t mesh_flags = compress_vert_data ? Mesh::ARRAY_COMPRESS_DEFAULT : 0;
Map<String, uint32_t> morph_mesh_string_lookup; Map<String, uint32_t> morph_mesh_string_lookup;
@ -1295,7 +1298,7 @@ EditorSceneImporterAssimp::_generate_mesh_from_surface_indices(ImportState &stat
morphs[j] = array_copy; morphs[j] = array_copy;
} }
mesh->add_surface_from_arrays(primitive, array_mesh, morphs); mesh->add_surface_from_arrays(primitive, array_mesh, morphs, mesh_flags);
mesh->surface_set_material(i, mat); mesh->surface_set_material(i, mat);
mesh->surface_set_name(i, AssimpUtils::get_assimp_string(ai_mesh->mName)); mesh->surface_set_name(i, AssimpUtils::get_assimp_string(ai_mesh->mName));
} }

View file

@ -88,6 +88,9 @@ struct ImportState {
// this means we can detect // this means we can detect
// what bones are for other armatures // what bones are for other armatures
List<aiBone *> bone_stack; List<aiBone *> bone_stack;
// EditorSceneImporter::ImportFlags
uint32_t import_flags;
}; };
struct AssimpImageData { struct AssimpImageData {