Add obj importer changes to use ImporterMesh.
This commit is contained in:
parent
84e205b5a1
commit
1430f0b67d
1 changed files with 14 additions and 21 deletions
|
@ -202,7 +202,7 @@ static Error _parse_material_library(const String &p_path, HashMap<String, Ref<S
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_single_mesh, bool p_generate_tangents, bool p_optimize, Vector3 p_scale_mesh, Vector3 p_offset_mesh, bool p_disable_compression, List<String> *r_missing_deps) {
|
static Error _parse_obj(const String &p_path, List<Ref<ImporterMesh>> &r_meshes, bool p_single_mesh, bool p_generate_tangents, bool p_optimize, Vector3 p_scale_mesh, Vector3 p_offset_mesh, bool p_disable_compression, List<String> *r_missing_deps) {
|
||||||
Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ);
|
Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ);
|
||||||
ERR_FAIL_COND_V_MSG(f.is_null(), ERR_CANT_OPEN, vformat("Couldn't open OBJ file '%s', it may not exist or not be readable.", p_path));
|
ERR_FAIL_COND_V_MSG(f.is_null(), ERR_CANT_OPEN, vformat("Couldn't open OBJ file '%s', it may not exist or not be readable.", p_path));
|
||||||
|
|
||||||
|
@ -220,7 +220,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_
|
||||||
ERR_FAIL_COND_V_MSG(coff_header_machines.find(first_bytes) != -1, ERR_FILE_CORRUPT, vformat("Couldn't read OBJ file '%s', it seems to be binary, corrupted, or empty.", p_path));
|
ERR_FAIL_COND_V_MSG(coff_header_machines.find(first_bytes) != -1, ERR_FILE_CORRUPT, vformat("Couldn't read OBJ file '%s', it seems to be binary, corrupted, or empty.", p_path));
|
||||||
f->seek(0);
|
f->seek(0);
|
||||||
|
|
||||||
Ref<ArrayMesh> mesh;
|
Ref<ImporterMesh> mesh;
|
||||||
mesh.instantiate();
|
mesh.instantiate();
|
||||||
|
|
||||||
bool generate_tangents = p_generate_tangents;
|
bool generate_tangents = p_generate_tangents;
|
||||||
|
@ -400,24 +400,24 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_
|
||||||
|
|
||||||
print_verbose("OBJ: Current material library " + current_material_library + " has " + itos(material_map.has(current_material_library)));
|
print_verbose("OBJ: Current material library " + current_material_library + " has " + itos(material_map.has(current_material_library)));
|
||||||
print_verbose("OBJ: Current material " + current_material + " has " + itos(material_map.has(current_material_library) && material_map[current_material_library].has(current_material)));
|
print_verbose("OBJ: Current material " + current_material + " has " + itos(material_map.has(current_material_library) && material_map[current_material_library].has(current_material)));
|
||||||
|
Ref<StandardMaterial3D> material;
|
||||||
if (material_map.has(current_material_library) && material_map[current_material_library].has(current_material)) {
|
if (material_map.has(current_material_library) && material_map[current_material_library].has(current_material)) {
|
||||||
Ref<StandardMaterial3D> &material = material_map[current_material_library][current_material];
|
material = material_map[current_material_library][current_material];
|
||||||
if (!colors.is_empty()) {
|
if (!colors.is_empty()) {
|
||||||
material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
|
material->set_flag(StandardMaterial3D::FLAG_SRGB_VERTEX_COLOR, true);
|
||||||
}
|
}
|
||||||
surf_tool->set_material(material);
|
surf_tool->set_material(material);
|
||||||
}
|
}
|
||||||
|
|
||||||
mesh = surf_tool->commit(mesh, mesh_flags);
|
|
||||||
|
|
||||||
if (!current_material.is_empty()) {
|
if (!current_material.is_empty()) {
|
||||||
mesh->surface_set_name(mesh->get_surface_count() - 1, current_material.get_basename());
|
mesh->set_surface_name(mesh->get_surface_count() - 1, current_material.get_basename());
|
||||||
} else if (!current_group.is_empty()) {
|
} else if (!current_group.is_empty()) {
|
||||||
mesh->surface_set_name(mesh->get_surface_count() - 1, current_group);
|
mesh->set_surface_name(mesh->get_surface_count() - 1, current_group);
|
||||||
}
|
}
|
||||||
|
Array array = surf_tool->commit_to_arrays();
|
||||||
|
mesh->add_surface(Mesh::PRIMITIVE_TRIANGLES, array, TypedArray<Array>(), Dictionary(), material, name, mesh_flags);
|
||||||
|
print_verbose("OBJ: Added surface :" + mesh->get_surface_name(mesh->get_surface_count() - 1));
|
||||||
|
|
||||||
print_verbose("OBJ: Added surface :" + mesh->surface_get_name(mesh->get_surface_count() - 1));
|
|
||||||
surf_tool->clear();
|
surf_tool->clear();
|
||||||
surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
|
surf_tool->begin(Mesh::PRIMITIVE_TRIANGLES);
|
||||||
}
|
}
|
||||||
|
@ -476,7 +476,7 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_
|
||||||
}
|
}
|
||||||
|
|
||||||
Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, const HashMap<StringName, Variant> &p_options, List<String> *r_missing_deps, Error *r_err) {
|
Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, const HashMap<StringName, Variant> &p_options, List<String> *r_missing_deps, Error *r_err) {
|
||||||
List<Ref<Mesh>> meshes;
|
List<Ref<ImporterMesh>> meshes;
|
||||||
|
|
||||||
Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, false, Vector3(1, 1, 1), Vector3(0, 0, 0), p_flags & IMPORT_FORCE_DISABLE_MESH_COMPRESSION, r_missing_deps);
|
Error err = _parse_obj(p_path, meshes, false, p_flags & IMPORT_GENERATE_TANGENT_ARRAYS, false, Vector3(1, 1, 1), Vector3(0, 0, 0), p_flags & IMPORT_FORCE_DISABLE_MESH_COMPRESSION, r_missing_deps);
|
||||||
|
|
||||||
|
@ -489,16 +489,9 @@ Node *EditorOBJImporter::import_scene(const String &p_path, uint32_t p_flags, co
|
||||||
|
|
||||||
Node3D *scene = memnew(Node3D);
|
Node3D *scene = memnew(Node3D);
|
||||||
|
|
||||||
for (const Ref<Mesh> &m : meshes) {
|
for (Ref<ImporterMesh> m : meshes) {
|
||||||
Ref<ImporterMesh> mesh;
|
|
||||||
mesh.instantiate();
|
|
||||||
mesh->set_name(m->get_name());
|
|
||||||
for (int i = 0; i < m->get_surface_count(); i++) {
|
|
||||||
mesh->add_surface(m->surface_get_primitive_type(i), m->surface_get_arrays(i), Array(), Dictionary(), m->surface_get_material(i), String(), m->surface_get_format(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
ImporterMeshInstance3D *mi = memnew(ImporterMeshInstance3D);
|
ImporterMeshInstance3D *mi = memnew(ImporterMeshInstance3D);
|
||||||
mi->set_mesh(mesh);
|
mi->set_mesh(m);
|
||||||
mi->set_name(m->get_name());
|
mi->set_name(m->get_name());
|
||||||
scene->add_child(mi, true);
|
scene->add_child(mi, true);
|
||||||
mi->set_owner(scene);
|
mi->set_owner(scene);
|
||||||
|
@ -565,7 +558,7 @@ bool ResourceImporterOBJ::get_option_visibility(const String &p_path, const Stri
|
||||||
}
|
}
|
||||||
|
|
||||||
Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_save_path, const HashMap<StringName, Variant> &p_options, List<String> *r_platform_variants, List<String> *r_gen_files, Variant *r_metadata) {
|
||||||
List<Ref<Mesh>> meshes;
|
List<Ref<ImporterMesh>> meshes;
|
||||||
|
|
||||||
Error err = _parse_obj(p_source_file, meshes, true, p_options["generate_tangents"], p_options["optimize_mesh"], p_options["scale_mesh"], p_options["offset_mesh"], p_options["force_disable_mesh_compression"], nullptr);
|
Error err = _parse_obj(p_source_file, meshes, true, p_options["generate_tangents"], p_options["optimize_mesh"], p_options["scale_mesh"], p_options["offset_mesh"], p_options["force_disable_mesh_compression"], nullptr);
|
||||||
|
|
||||||
|
@ -574,7 +567,7 @@ Error ResourceImporterOBJ::import(const String &p_source_file, const String &p_s
|
||||||
|
|
||||||
String save_path = p_save_path + ".mesh";
|
String save_path = p_save_path + ".mesh";
|
||||||
|
|
||||||
err = ResourceSaver::save(meshes.front()->get(), save_path);
|
err = ResourceSaver::save(meshes.front()->get()->get_mesh(), save_path);
|
||||||
|
|
||||||
ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot save Mesh to file '" + save_path + "'.");
|
ERR_FAIL_COND_V_MSG(err != OK, err, "Cannot save Mesh to file '" + save_path + "'.");
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue