public void WorldToToken(SBSVector3 worldPos, out float longitudinal, out float trasversal) { switch (type) { case TokenType.Cross: case TokenType.Rect: SBSVector3 localPos = matInvWorld.MultiplyPoint3x4(worldPos); longitudinal = SBSVector3.Dot(localPos, SBSVector3.forward) / lengthOrRadius; trasversal = SBSVector3.Dot(localPos, SBSVector3.right) * 2.0f / width; break; case TokenType.Curve: SBSVector3 c = this.Center, p0 = matWorld.position - c, p1 = worldPos - c; p0.DecrementBy(SBSVector3.Dot(p0, SBSVector3.up) * SBSVector3.up); p1.DecrementBy(SBSVector3.Dot(p1, SBSVector3.up) * SBSVector3.up); float sign = SBSMath.Sign(SBSVector3.Dot(SBSVector3.Cross(p0, p1), SBSVector3.up)); float angle = SBSVector3.Angle(p0, p1); longitudinal = angle / arcAngle; if (sign == curveDir) { longitudinal *= -1.0f; } trasversal = (p1.magnitude - lengthOrRadius) * 2.0f * curveDir / width; break; default: longitudinal = 0.0f; trasversal = 0.0f; break; } }