From ab8792cc7b809a5004f7989b9228f231dee2c1bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Karwacki?= Date: Tue, 2 May 2023 12:03:01 +0200 Subject: [PATCH] Add vertex color support to OBJ importer --- editor/import/resource_importer_obj.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp index 6207ef0bf06..fcd3793c706 100644 --- a/editor/import/resource_importer_obj.cpp +++ b/editor/import/resource_importer_obj.cpp @@ -214,6 +214,7 @@ static Error _parse_obj(const String &p_path, List> &r_meshes, bool p_ Vector vertices; Vector normals; Vector uvs; + Vector colors; String name; Map>> material_map; @@ -244,6 +245,19 @@ static Error _parse_obj(const String &p_path, List> &r_meshes, bool p_ vtx.y = v[2].to_float() * scale_mesh.y + offset_mesh.y; vtx.z = v[3].to_float() * scale_mesh.z + offset_mesh.z; vertices.push_back(vtx); + //vertex colors + if (v.size() >= 7) { + while (colors.size() < vertices.size() - 1) { + colors.push_back(Color(1.0, 1.0, 1.0)); + } + Color c; + c.r = v[4].to_float(); + c.g = v[5].to_float(); + c.b = v[6].to_float(); + colors.push_back(c); + } else if (!colors.empty()) { + colors.push_back(Color(1.0, 1.0, 1.0)); + } } else if (l.begins_with("vt ")) { //uv Vector v = l.split(" ", false); @@ -312,6 +326,9 @@ static Error _parse_obj(const String &p_path, List> &r_meshes, bool p_ ERR_FAIL_INDEX_V(vtx, vertices.size(), ERR_FILE_CORRUPT); Vector3 vertex = vertices[vtx]; + if (!colors.empty()) { + surf_tool->add_color(colors[vtx]); + } //if (weld_vertices) // vertex.snap(Vector3(weld_tolerance, weld_tolerance, weld_tolerance)); surf_tool->add_vertex(vertex); @@ -344,7 +361,11 @@ static Error _parse_obj(const String &p_path, List> &r_meshes, bool p_ print_verbose("OBJ: Current material " + current_material + " has " + itos(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)) { - surf_tool->set_material(material_map[current_material_library][current_material]); + Ref &material = material_map[current_material_library][current_material]; + if (!colors.empty()) { + material->set_flag(SpatialMaterial::FLAG_SRGB_VERTEX_COLOR, true); + } + surf_tool->set_material(material); } mesh = surf_tool->commit(mesh, p_compress_flags);