Browse Source

Merge pull request #81854 from bitsawer/fix_importer_mesh_bones

Fix ImporterMesh bone weight handling during lightmap unwrap
Rémi Verschelde 1 year ago
parent
commit
44ea5f9470
1 changed files with 10 additions and 1 deletions
  1. 10 1
      scene/resources/importer_mesh.cpp

+ 10 - 1
scene/resources/importer_mesh.cpp

@@ -1233,6 +1233,7 @@ Error ImporterMesh::lightmap_unwrap_cached(const Transform3D &p_base_transform,
 	for (int i = 0; i < lightmap_surfaces.size(); i++) {
 		Ref<SurfaceTool> st;
 		st.instantiate();
+		st->set_skin_weight_count((lightmap_surfaces[i].format & Mesh::ARRAY_FLAG_USE_8_BONE_WEIGHTS) ? SurfaceTool::SKIN_8_WEIGHTS : SurfaceTool::SKIN_4_WEIGHTS);
 		st->begin(Mesh::PRIMITIVE_TRIANGLES);
 		st->set_material(lightmap_surfaces[i].material);
 		st->set_meta("name", lightmap_surfaces[i].name);
@@ -1300,7 +1301,15 @@ Error ImporterMesh::lightmap_unwrap_cached(const Transform3D &p_base_transform,
 		Ref<SurfaceTool> &tool = surfaces_tools[i];
 		tool->index();
 		Array arrays = tool->commit_to_arrays();
-		add_surface(tool->get_primitive_type(), arrays, Array(), Dictionary(), tool->get_material(), tool->get_meta("name"), lightmap_surfaces[i].format);
+
+		uint64_t format = lightmap_surfaces[i].format;
+		if (tool->get_skin_weight_count() == SurfaceTool::SKIN_8_WEIGHTS) {
+			format |= RS::ARRAY_FLAG_USE_8_BONE_WEIGHTS;
+		} else {
+			format &= ~RS::ARRAY_FLAG_USE_8_BONE_WEIGHTS;
+		}
+
+		add_surface(tool->get_primitive_type(), arrays, Array(), Dictionary(), tool->get_material(), tool->get_meta("name"), format);
 	}
 
 	set_lightmap_size_hint(Size2(size_x, size_y));