@@ -96,10 +96,6 @@ bool SurfaceTool::Vertex::operator==(const Vertex &p_vertex) const {
9696 return false ;
9797 }
9898
99- if (binormal != p_vertex.binormal ) {
100- return false ;
101- }
102-
10399 if (tangent != p_vertex.tangent ) {
104100 return false ;
105101 }
@@ -235,8 +231,7 @@ void SurfaceTool::add_vertex(const Vector3 &p_vertex) {
235231 vtx.uv2 = last_uv2;
236232 vtx.weights = last_weights;
237233 vtx.bones = last_bones;
238- vtx.tangent = last_tangent.normal ;
239- vtx.binormal = last_normal.cross (last_tangent.normal ).normalized () * last_tangent.d ;
234+ vtx.tangent = last_tangent;
240235 vtx.smooth_group = last_smooth_group;
241236
242237 for (int i = 0 ; i < RSE ::ARRAY_CUSTOM_COUNT ; i++) {
@@ -317,7 +312,7 @@ void SurfaceTool::set_tangent(const Plane &p_tangent) {
317312 ERR_FAIL_COND (!first && !(format & Mesh::ARRAY_FORMAT_TANGENT ));
318313
319314 format |= Mesh::ARRAY_FORMAT_TANGENT ;
320- last_tangent = p_tangent;
315+ last_tangent = Vector4 ( p_tangent. normal . x , p_tangent. normal . y , p_tangent. normal . z , p_tangent. d ) ;
321316}
322317
323318void SurfaceTool::set_uv (const Vector2 &p_uv) {
@@ -483,10 +478,7 @@ Array SurfaceTool::commit_to_arrays() {
483478 w[idx * 4 + 0 ] = v.tangent .x ;
484479 w[idx * 4 + 1 ] = v.tangent .y ;
485480 w[idx * 4 + 2 ] = v.tangent .z ;
486-
487- // float d = v.tangent.dot(v.binormal,v.normal);
488- float d = v.binormal .dot (v.normal .cross (v.tangent ));
489- w[idx * 4 + 3 ] = d < 0 ? -1 : 1 ;
481+ w[idx * 4 + 3 ] = v.tangent .w ;
490482 }
491483
492484 a[i] = array;
@@ -882,9 +874,7 @@ void SurfaceTool::create_vertex_array_from_arrays(const Array &p_arrays, LocalVe
882874 v.normal = narr[i];
883875 }
884876 if (lformat & RSE ::ARRAY_FORMAT_TANGENT ) {
885- v.tangent = Vector3 (tarr[i * 4 + 0 ], tarr[i * 4 + 1 ], tarr[i * 4 + 2 ]);
886- float d = tarr[i * 4 + 3 ];
887- v.binormal = v.normal .cross (v.tangent ).normalized () * d;
877+ v.tangent = Vector4 (tarr[i * 4 + 0 ], tarr[i * 4 + 1 ], tarr[i * 4 + 2 ], tarr[i * 4 + 3 ]);
888878 }
889879 if (lformat & RSE ::ARRAY_FORMAT_COLOR ) {
890880 v.color = carr[i];
@@ -1039,15 +1029,16 @@ void SurfaceTool::append_from(const Ref<Mesh> &p_existing, int p_surface, const
10391029 }
10401030 }
10411031 int vfrom = vertex_array.size ();
1032+ float flip = p_xform.basis .determinant () < 0 ? -1 .0f : 1 .0f ;
10421033
10431034 for (Vertex &v : nvertices) {
10441035 v.vertex = p_xform.xform (v.vertex );
10451036 if (nformat & RSE ::ARRAY_FORMAT_NORMAL ) {
10461037 v.normal = p_xform.basis .xform (v.normal );
10471038 }
10481039 if (nformat & RSE ::ARRAY_FORMAT_TANGENT ) {
1049- v. tangent = p_xform.basis .xform (v.tangent );
1050- v.binormal = p_xform. basis . xform (v. binormal );
1040+ Vector3 tangent = p_xform.basis .xform (Vector3 ( v.tangent . x , v. tangent . y , v. tangent . z ) );
1041+ v.tangent = Vector4 (tangent. x , tangent. y , tangent. z , v. tangent . w * flip );
10511042 }
10521043
10531044 vertex_array.push_back (v);
@@ -1148,8 +1139,7 @@ void SurfaceTool::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, cons
11481139 }
11491140
11501141 if (vtx != nullptr ) {
1151- vtx->tangent = Vector3 (fvTangent[0 ], fvTangent[1 ], fvTangent[2 ]);
1152- vtx->binormal = Vector3 (-fvBiTangent[0 ], -fvBiTangent[1 ], -fvBiTangent[2 ]); // for some reason these are reversed, something with the coordinate system in Godot
1142+ vtx->tangent = Vector4 (fvTangent[0 ], fvTangent[1 ], fvTangent[2 ], bIsOrientationPreserving ? 1 .0f : -1 .0f );
11531143 }
11541144}
11551145
@@ -1172,8 +1162,7 @@ void SurfaceTool::generate_tangents() {
11721162 TangentGenerationContextUserData triangle_data;
11731163 triangle_data.vertices = &vertex_array;
11741164 for (Vertex &vertex : vertex_array) {
1175- vertex.binormal = Vector3 ();
1176- vertex.tangent = Vector3 ();
1165+ vertex.tangent = Vector4 ();
11771166 }
11781167 triangle_data.indices = &index_array;
11791168 msc.m_pUserData = &triangle_data;
0 commit comments