Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- if (smooth)
- {
- UKismetProceduralMeshLibrary::CalculateTangentsForMesh(data.VertexArray, data.IndexArray, data.UVArray, data.NormalArray, data.TangentArray);
- }
- else
- {
- for (int32 Index = 0; Index < IndexCount; Index += 3)
- {
- const FVector Edge21 = data.VertexArray[data.IndexArray[Index + 1]] - data.VertexArray[data.IndexArray[Index + 2]];
- const FVector Edge20 = data.VertexArray[data.IndexArray[Index + 0]] - data.VertexArray[data.IndexArray[Index + 2]];
- FVector TriNormal = (Edge21 ^ Edge20).GetSafeNormal();
- FVector FaceTangentX = Edge20.GetSafeNormal();
- FVector FaceTangentY = (FaceTangentX ^ TriNormal).GetSafeNormal();
- FVector FaceTangentZ = TriNormal;
- // Use Gram-Schmidt orthogonalization to make sure X is orth with Z
- FaceTangentX -= FaceTangentZ * (FaceTangentZ | FaceTangentX);
- FaceTangentX.Normalize();
- // See if we need to flip TangentY when generating from cross product
- const bool bFlipBitangent = ((FaceTangentZ ^ FaceTangentX) | FaceTangentY) < 0.f;
- TriNormal.Normalize();
- FaceTangentX.Normalize();
- FProcMeshTangent tangent = FProcMeshTangent(FaceTangentX, bFlipBitangent);
- for (int32 i = 0; i < 3; i++)
- {
- data.NormalArray[data.IndexArray[Index + i]] = TriNormal;
- data.TangentArray[data.IndexArray[Index + i]] = tangent;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement