summaryrefslogtreecommitdiffstats
path: root/editor/import/resource_importer_obj.cpp
diff options
context:
space:
mode:
authorclayjohn <claynjohn@gmail.com>2023-10-31 15:51:07 +0100
committerclayjohn <claynjohn@gmail.com>2023-11-01 22:40:42 +0100
commitd1043a5f930513aa4b48b014ec7961cad48b0560 (patch)
tree9db1971e8d3b8f33cfc5947628bc454031be065d /editor/import/resource_importer_obj.cpp
parent6afd320984cf14198368cc6c53752813a02169e3 (diff)
downloadredot-engine-d1043a5f930513aa4b48b014ec7961cad48b0560.tar.gz
Enhance checks and user experience around tangents.
Ensure `ensure_tangents` option actually creates tangent array. Even if it is just a dummy array. Allow mesh to generate its own tangents when using compression. This allows users to compress meshes without tangents. Warn users if they are trying to read from tangents without providing tangents.
Diffstat (limited to 'editor/import/resource_importer_obj.cpp')
-rw-r--r--editor/import/resource_importer_obj.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/editor/import/resource_importer_obj.cpp b/editor/import/resource_importer_obj.cpp
index 646831ca24..082e78fdbe 100644
--- a/editor/import/resource_importer_obj.cpp
+++ b/editor/import/resource_importer_obj.cpp
@@ -327,6 +327,17 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_
}
ERR_FAIL_INDEX_V(norm, normals.size(), ERR_FILE_CORRUPT);
surf_tool->set_normal(normals[norm]);
+ if (generate_tangents && uvs.is_empty()) {
+ // We can't generate tangents without UVs, so create dummy tangents.
+ Vector3 tan = Vector3(0.0, 1.0, 0.0).cross(normals[norm]);
+ surf_tool->set_tangent(Plane(tan.x, tan.y, tan.z, 1.0));
+ }
+ } else {
+ // No normals, use a dummy normal since normals will be generated.
+ if (generate_tangents && uvs.is_empty()) {
+ // We can't generate tangents without UVs, so create dummy tangents.
+ surf_tool->set_tangent(Plane(1.0, 0.0, 0.0, 1.0));
+ }
}
if (face[idx].size() >= 2 && !face[idx][1].is_empty()) {
@@ -383,9 +394,6 @@ static Error _parse_obj(const String &p_path, List<Ref<Mesh>> &r_meshes, bool p_
if (generate_tangents && uvs.size()) {
surf_tool->generate_tangents();
- } else {
- // We need tangents in order to compress vertex data. So disable if tangents aren't generated.
- mesh_flags = 0;
}
surf_tool->index();