Advertisement
yal_f

SATv2

Jun 16th, 2025 (edited)
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.46 KB | None | 0 0
  1. --!optimize 2
  2. --!native
  3.  
  4. local PointToWorldSpace = CFrame.identity.PointToWorldSpace
  5.  
  6. local BOX_POINT_2 = Vector3.new( 1, 1,-1)
  7. local BOX_POINT_3 = Vector3.new( 1,-1, 1)
  8. local BOX_POINT_4 = Vector3.new( 1,-1,-1)
  9. local BOX_POINT_5 = Vector3.new(-1, 1, 1)
  10. local BOX_POINT_6 = Vector3.new(-1, 1,-1)
  11. local BOX_POINT_7 = Vector3.new(-1,-1, 1)
  12.  
  13. --
  14.  
  15. local function GetBoxData(box1CFrame: CFrame, box1Size: Vector3, box2CFrame: CFrame, box2Size: Vector3)
  16.     local box1HalfSize = box1Size / 2
  17.     local box2HalfSize = box2Size / 2
  18.  
  19.     return {
  20.         PointToWorldSpace(box1CFrame,
  21.             box1HalfSize,
  22.             box1HalfSize * BOX_POINT_2,
  23.             box1HalfSize * BOX_POINT_3,
  24.             box1HalfSize * BOX_POINT_4,
  25.             box1HalfSize * BOX_POINT_5,
  26.             box1HalfSize * BOX_POINT_6,
  27.             box1HalfSize * BOX_POINT_7,
  28.             -box1HalfSize
  29.         )
  30.     }, {
  31.         PointToWorldSpace(box2CFrame,
  32.             box2HalfSize,
  33.             box2HalfSize * BOX_POINT_2,
  34.             box2HalfSize * BOX_POINT_3,
  35.             box2HalfSize * BOX_POINT_4,
  36.             box2HalfSize * BOX_POINT_5,
  37.             box2HalfSize * BOX_POINT_6,
  38.             box2HalfSize * BOX_POINT_7,
  39.             -box2HalfSize
  40.         )
  41.     }, {
  42.         [box1HalfSize.X] = box1CFrame.XVector,
  43.         [box1HalfSize.Y] = box1CFrame.YVector,
  44.         [box1HalfSize.Z] = box1CFrame.ZVector
  45.     }, {
  46.         [box2HalfSize.X] = box2CFrame.XVector,
  47.         [box2HalfSize.Y] = box2CFrame.YVector,
  48.         [box2HalfSize.Z] = box2CFrame.ZVector
  49.     }
  50. end
  51.  
  52. local function SATCheck(box1CFrame: CFrame, box1Size: Vector3, box2CFrame: CFrame, box2Size: Vector3): boolean
  53.     local box1Points, box2Points, box1Normals, box2Normals = GetBoxData(box1CFrame, box1Size, box2CFrame, box2Size)
  54.  
  55.     local box1Pos = box1CFrame.Position
  56.     local box2Pos = box2CFrame.Position
  57.  
  58.     --
  59.  
  60.     for axisSize, box1normal in box1Normals do
  61.         local p1,p2,p3,p4,p5,p6,p7,p8=
  62.             vector.dot(box1normal, box2Points[1]),
  63.             vector.dot(box1normal, box2Points[1]),
  64.             vector.dot(box1normal, p3),
  65.             vector.dot(box1normal, p4),
  66.             vector.dot(box1normal, p5),
  67.             vector.dot(box1normal, p6),
  68.             vector.dot(box1normal, p7),
  69.             vector.dot(box1normal, p8),
  70.  
  71.         local originDist = vector.dot(box1Pos, box1normal)
  72.  
  73.         if
  74.             (originDist + axisSize) < math.min(p1,p2,p3,p4,p5,p6,p7,p8)
  75.             or (originDist - axisSize) > math.max(p1,p2,p3,p4,p5,p6,p7,p8) then
  76.             return false --returns false if theres a seperating axis
  77.         end
  78.     end
  79.  
  80.     for axisSize, box2Normal in box2Normals do
  81.         local box1Min = math.huge
  82.         local box1Max = -math.huge
  83.  
  84.         for _, point in box1Points do
  85.             local dist = vector.dot(box2Normal, point)
  86.  
  87.             if dist > box1Max then
  88.                 box1Max = dist
  89.             end
  90.  
  91.             if dist < box1Min then
  92.                 box1Min = dist
  93.             end
  94.         end
  95.  
  96.         local originDist = vector.dot(box2Pos, box2Normal)
  97.  
  98.         if (originDist + axisSize) < box1Min or (originDist - axisSize) > box1Max then
  99.             return false
  100.         end
  101.  
  102.         --
  103.  
  104.         for _, box1Normal in box1Normals do
  105.             local dir = vector.cross(box1Normal, box2Normal)
  106.  
  107.             local box1Min = math.huge
  108.             local box1Max = -math.huge
  109.  
  110.             local box2Min = math.huge
  111.             local box2Max = -math.huge
  112.  
  113.             for _, point in box1Points do
  114.                 local dist = vector.dot(dir, point)
  115.  
  116.                 if dist > box1Max then
  117.                     box1Max = dist
  118.                 end
  119.  
  120.                 if dist < box1Min then
  121.                     box1Min = dist
  122.                 end
  123.             end
  124.  
  125.             for _, point in box2Points do
  126.                 local dist = vector.dot(dir, point)
  127.  
  128.                 if dist > box2Max then
  129.                     box2Max = dist
  130.                 end
  131.  
  132.                 if dist < box2Min then
  133.                     box2Min = dist
  134.                 end
  135.             end
  136.  
  137.             if box1Max < box2Min or box1Min > box2Max then
  138.                 return false
  139.             end
  140.         end
  141.     end
  142.    
  143.     return true
  144. end
  145.  
  146. return SATCheck
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement