Advertisement
yal_f

Untitled

Jun 15th, 2025
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.36 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 * .5
  17.     local box2HalfSize = box2Size * .5
  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 box2min = math.huge
  62.         local box2max = -math.huge
  63.  
  64.         for _, point in box2Points do
  65.             local dist = vector.dot(box1normal, point)
  66.  
  67.             if dist > box2max then
  68.                 box2max = dist
  69.             end
  70.  
  71.             if dist < box2min then
  72.                 box2min = dist
  73.             end
  74.         end
  75.  
  76.         local originDist = vector.dot(box1Pos, box1normal)
  77.  
  78.         if (originDist + axisSize) < box2min or (originDist - axisSize) > box2max then --returns false if theres a seperating axis
  79.             return false
  80.         end
  81.     end
  82.  
  83.     for axisSize, box2Normal in box2Normals do
  84.         local box1Min = math.huge
  85.         local box1Max = -math.huge
  86.  
  87.         for _, point in box1Points do
  88.             local dist = vector.dot(box2Normal, point)
  89.  
  90.             if dist > box1Max then
  91.                 box1Max = dist
  92.             end
  93.  
  94.             if dist < box1Min then
  95.                 box1Min = dist
  96.             end
  97.         end
  98.  
  99.         local originDist = vector.dot(box2Pos, box2Normal)
  100.  
  101.         if (originDist + axisSize) < box1Min or (originDist - axisSize) > box1Max then
  102.             return false
  103.         end
  104.  
  105.         --
  106.  
  107.         for _, box1Normal in box1Normals do
  108.             local dir = vector.cross(box1Normal, box2Normal)
  109.  
  110.             local box1Min = math.huge
  111.             local box1Max = -math.huge
  112.  
  113.             local box2Min = math.huge
  114.             local box2Max = -math.huge
  115.  
  116.             for _, point in box1Points do
  117.                 local dist = vector.dot(dir, point)
  118.  
  119.                 if dist > box1Max then
  120.                     box1Max = dist
  121.                 end
  122.  
  123.                 if dist < box1Min then
  124.                     box1Min = dist
  125.                 end
  126.             end
  127.  
  128.             for _, point in box2Points do
  129.                 local dist = vector.dot(dir, point)
  130.  
  131.                 if dist > box2Max then
  132.                     box2Max = dist
  133.                 end
  134.  
  135.                 if dist < box2Min then
  136.                     box2Min = dist
  137.                 end
  138.             end
  139.  
  140.             if box1Max < box2Min or box1Min > box2Max then
  141.                 return false
  142.             end
  143.         end
  144.     end
  145.    
  146.     return true
  147. end
  148.  
  149. return SATCheck
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement