util3d.monkey2 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. Namespace mojo3d
  2. #rem monkeydoc @hidden
  3. #end
  4. Function UpdateTangents( vertices:Vertex3f Ptr,vcount:Int,indices:UInt Ptr,icount:Int )
  5. Local tan1:=New Vec3f[vcount]
  6. Local tan2:=New Vec3f[vcount]
  7. For Local i:=0 Until icount Step 3
  8. Local i1:=indices[i+0]
  9. Local i2:=indices[i+1]
  10. Local i3:=indices[i+2]
  11. Local v1:=vertices+i1
  12. Local v2:=vertices+i2
  13. Local v3:=vertices+i3
  14. Local x1:=v2->Tx-v1->Tx
  15. Local x2:=v3->Tx-v1->Tx
  16. Local y1:=v2->Ty-v1->Ty
  17. Local y2:=v3->Ty-v1->Ty
  18. Local z1:=v2->Tz-v1->Tz
  19. Local z2:=v3->Tz-v1->Tz
  20. Local s1:=v2->Sx-v1->Sx
  21. Local s2:=v3->Sx-v1->Sx
  22. Local t1:=v2->Sy-v1->Sy
  23. Local t2:=v3->Sy-v1->Sy
  24. Local r:=1.0/(s1*t2-s2*t1)
  25. Local sdir:=New Vec3f( (t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r )
  26. Local tdir:=New Vec3f( (s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r )
  27. tan1[i1]+=sdir
  28. tan1[i2]+=sdir
  29. tan1[i3]+=sdir
  30. tan2[i1]+=tdir
  31. tan2[i2]+=tdir
  32. tan2[i3]+=tdir
  33. Next
  34. For Local i:=0 Until vcount
  35. Local v:=vertices+i
  36. Local n:=v->normal,t:=tan1[i]
  37. v->tangent.XYZ=( t - n * n.Dot( t ) ).Normalize()
  38. v->tangent.w=n.Cross( t ).Dot( tan2[i] ) < 0 ? -1 Else 1
  39. Next
  40. End