Browse Source

Allow automatic lod when importing 3D scenes with Static Lightmaps

Avoid the normal merge procedure when uv2s are different and makes generating LODs happen after the lightmap generation
K. S. Ernest (iFire) Lee 3 years ago
parent
commit
ab15267096
2 changed files with 14 additions and 10 deletions
  1. 8 8
      editor/import/resource_importer_scene.cpp
  2. 6 2
      scene/resources/importer_mesh.cpp

+ 8 - 8
editor/import/resource_importer_scene.cpp

@@ -1649,14 +1649,6 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m
 					}
 					}
 				}
 				}
 
 
-				if (generate_lods) {
-					src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle);
-				}
-
-				if (create_shadow_meshes) {
-					src_mesh_node->get_mesh()->create_shadow_mesh();
-				}
-
 				if (bake_lightmaps) {
 				if (bake_lightmaps) {
 					Transform3D xf;
 					Transform3D xf;
 					Node3D *n = src_mesh_node;
 					Node3D *n = src_mesh_node;
@@ -1689,6 +1681,14 @@ void ResourceImporterScene::_generate_meshes(Node *p_node, const Dictionary &p_m
 					}
 					}
 				}
 				}
 
 
+				if (generate_lods) {
+					src_mesh_node->get_mesh()->generate_lods(merge_angle, split_angle);
+				}
+
+				if (create_shadow_meshes) {
+					src_mesh_node->get_mesh()->create_shadow_mesh();
+				}
+
 				if (!save_to_file.is_empty()) {
 				if (!save_to_file.is_empty()) {
 					Ref<Mesh> existing = Ref<Resource>(ResourceCache::get(save_to_file));
 					Ref<Mesh> existing = Ref<Resource>(ResourceCache::get(save_to_file));
 					if (existing.is_valid()) {
 					if (existing.is_valid()) {

+ 6 - 2
scene/resources/importer_mesh.cpp

@@ -275,6 +275,7 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli
 		PackedInt32Array indices = surfaces[i].arrays[RS::ARRAY_INDEX];
 		PackedInt32Array indices = surfaces[i].arrays[RS::ARRAY_INDEX];
 		Vector<Vector3> normals = surfaces[i].arrays[RS::ARRAY_NORMAL];
 		Vector<Vector3> normals = surfaces[i].arrays[RS::ARRAY_NORMAL];
 		Vector<Vector2> uvs = surfaces[i].arrays[RS::ARRAY_TEX_UV];
 		Vector<Vector2> uvs = surfaces[i].arrays[RS::ARRAY_TEX_UV];
+		Vector<Vector2> uv2s = surfaces[i].arrays[RS::ARRAY_TEX_UV2];
 
 
 		unsigned int index_count = indices.size();
 		unsigned int index_count = indices.size();
 		unsigned int vertex_count = vertices.size();
 		unsigned int vertex_count = vertices.size();
@@ -313,6 +314,7 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli
 		LocalVector<Vector3> merged_normals;
 		LocalVector<Vector3> merged_normals;
 		LocalVector<int> merged_normals_counts;
 		LocalVector<int> merged_normals_counts;
 		const Vector2 *uvs_ptr = uvs.ptr();
 		const Vector2 *uvs_ptr = uvs.ptr();
+		const Vector2 *uv2s_ptr = uv2s.ptr();
 
 
 		for (unsigned int j = 0; j < vertex_count; j++) {
 		for (unsigned int j = 0; j < vertex_count; j++) {
 			const Vector3 &v = vertices_ptr[j];
 			const Vector3 &v = vertices_ptr[j];
@@ -327,8 +329,10 @@ void ImporterMesh::generate_lods(float p_normal_merge_angle, float p_normal_spli
 				for (unsigned int k = 0; k < close_verts.size(); k++) {
 				for (unsigned int k = 0; k < close_verts.size(); k++) {
 					const Pair<int, int> &idx = close_verts[k];
 					const Pair<int, int> &idx = close_verts[k];
 
 
-					// TODO check more attributes?
-					if ((!uvs_ptr || uvs_ptr[j].distance_squared_to(uvs_ptr[idx.second]) < CMP_EPSILON2) && normals[idx.second].dot(n) > normal_merge_threshold) {
+					bool is_uvs_close = (!uvs_ptr || uvs_ptr[j].distance_squared_to(uvs_ptr[idx.second]) < CMP_EPSILON2);
+					bool is_uv2s_close = (!uv2s_ptr || uv2s_ptr[j].distance_squared_to(uv2s_ptr[idx.second]) < CMP_EPSILON2);
+					bool is_normals_close = normals[idx.second].dot(n) > normal_merge_threshold;
+					if (is_uvs_close && is_uv2s_close && is_normals_close) {
 						vertex_remap.push_back(idx.first);
 						vertex_remap.push_back(idx.first);
 						merged_normals[idx.first] += normals[idx.second];
 						merged_normals[idx.first] += normals[idx.second];
 						merged_normals_counts[idx.first]++;
 						merged_normals_counts[idx.first]++;