diff options
| author | Rémi Verschelde <rverschelde@gmail.com> | 2023-11-08 19:09:36 +0100 |
|---|---|---|
| committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-11-08 19:09:36 +0100 |
| commit | f0c52c0e3510d3e073c92a782bff88ebb51d80d1 (patch) | |
| tree | 8d5b0c55a77b94195e45ea0e14231c1f7f307beb /scene/resources/immediate_mesh.cpp | |
| parent | 7efe2e3d829287f4ea69000bc4940cb3704143db (diff) | |
| parent | 031f221b9d378a7952c72ce4596be8df0d2d0e89 (diff) | |
| download | redot-engine-f0c52c0e3510d3e073c92a782bff88ebb51d80d1.tar.gz | |
Merge pull request #84576 from clayjohn/mesh-tangents-always
Create tangent array if mesh created without tangents
Diffstat (limited to 'scene/resources/immediate_mesh.cpp')
| -rw-r--r-- | scene/resources/immediate_mesh.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/scene/resources/immediate_mesh.cpp b/scene/resources/immediate_mesh.cpp index 3507df8bd8..dde556c264 100644 --- a/scene/resources/immediate_mesh.cpp +++ b/scene/resources/immediate_mesh.cpp @@ -166,7 +166,7 @@ void ImmediateMesh::surface_end() { normal_tangent_stride += sizeof(uint32_t); } uint32_t tangent_offset = 0; - if (uses_tangents) { + if (uses_tangents || uses_normals) { format |= ARRAY_FORMAT_TANGENT; tangent_offset = vertex_stride * vertices.size() + normal_tangent_stride; normal_tangent_stride += sizeof(uint32_t); @@ -202,9 +202,16 @@ void ImmediateMesh::surface_end() { *normal = value; } - if (uses_tangents) { + if (uses_tangents || uses_normals) { uint32_t *tangent = (uint32_t *)&surface_vertex_ptr[i * normal_tangent_stride + tangent_offset]; - Vector2 t = tangents[i].normal.octahedron_tangent_encode(tangents[i].d); + Vector2 t; + if (uses_tangents) { + t = tangents[i].normal.octahedron_tangent_encode(tangents[i].d); + } else { + Vector3 tan = Vector3(0.0, 1.0, 0.0).cross(normals[i].normalized()); + t = tan.octahedron_tangent_encode(1.0); + } + uint32_t value = 0; value |= (uint16_t)CLAMP(t.x * 65535, 0, 65535); value |= (uint16_t)CLAMP(t.y * 65535, 0, 65535) << 16; |
