Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --!optimize 2
- --!native
- local PointToWorldSpace = CFrame.identity.PointToWorldSpace
- local BOX_POINT_2 = Vector3.new( 1, 1,-1)
- local BOX_POINT_3 = Vector3.new( 1,-1, 1)
- local BOX_POINT_4 = Vector3.new( 1,-1,-1)
- local BOX_POINT_5 = Vector3.new(-1, 1, 1)
- local BOX_POINT_6 = Vector3.new(-1, 1,-1)
- local BOX_POINT_7 = Vector3.new(-1,-1, 1)
- --
- local function GetBoxData(box1CFrame: CFrame, box1Size: Vector3, box2CFrame: CFrame, box2Size: Vector3)
- local box1HalfSize = box1Size / 2
- local box2HalfSize = box2Size / 2
- return {
- PointToWorldSpace(box1CFrame,
- box1HalfSize,
- box1HalfSize * BOX_POINT_2,
- box1HalfSize * BOX_POINT_3,
- box1HalfSize * BOX_POINT_4,
- box1HalfSize * BOX_POINT_5,
- box1HalfSize * BOX_POINT_6,
- box1HalfSize * BOX_POINT_7,
- -box1HalfSize
- )
- }, {
- PointToWorldSpace(box2CFrame,
- box2HalfSize,
- box2HalfSize * BOX_POINT_2,
- box2HalfSize * BOX_POINT_3,
- box2HalfSize * BOX_POINT_4,
- box2HalfSize * BOX_POINT_5,
- box2HalfSize * BOX_POINT_6,
- box2HalfSize * BOX_POINT_7,
- -box2HalfSize
- )
- }, {
- [box1HalfSize.X] = box1CFrame.XVector,
- [box1HalfSize.Y] = box1CFrame.YVector,
- [box1HalfSize.Z] = box1CFrame.ZVector
- }, {
- [box2HalfSize.X] = box2CFrame.XVector,
- [box2HalfSize.Y] = box2CFrame.YVector,
- [box2HalfSize.Z] = box2CFrame.ZVector
- }
- end
- local function SATCheck(box1CFrame: CFrame, box1Size: Vector3, box2CFrame: CFrame, box2Size: Vector3): boolean
- local box1Points, box2Points, box1Normals, box2Normals = GetBoxData(box1CFrame, box1Size, box2CFrame, box2Size)
- local box1Pos = box1CFrame.Position
- local box2Pos = box2CFrame.Position
- --
- for axisSize, box1normal in box1Normals do
- local p1,p2,p3,p4,p5,p6,p7,p8=
- vector.dot(box1normal, box2Points[1]),
- vector.dot(box1normal, box2Points[1]),
- vector.dot(box1normal, p3),
- vector.dot(box1normal, p4),
- vector.dot(box1normal, p5),
- vector.dot(box1normal, p6),
- vector.dot(box1normal, p7),
- vector.dot(box1normal, p8),
- local originDist = vector.dot(box1Pos, box1normal)
- if
- (originDist + axisSize) < math.min(p1,p2,p3,p4,p5,p6,p7,p8)
- or (originDist - axisSize) > math.max(p1,p2,p3,p4,p5,p6,p7,p8) then
- return false --returns false if theres a seperating axis
- end
- end
- for axisSize, box2Normal in box2Normals do
- local box1Min = math.huge
- local box1Max = -math.huge
- for _, point in box1Points do
- local dist = vector.dot(box2Normal, point)
- if dist > box1Max then
- box1Max = dist
- end
- if dist < box1Min then
- box1Min = dist
- end
- end
- local originDist = vector.dot(box2Pos, box2Normal)
- if (originDist + axisSize) < box1Min or (originDist - axisSize) > box1Max then
- return false
- end
- --
- for _, box1Normal in box1Normals do
- local dir = vector.cross(box1Normal, box2Normal)
- local box1Min = math.huge
- local box1Max = -math.huge
- local box2Min = math.huge
- local box2Max = -math.huge
- for _, point in box1Points do
- local dist = vector.dot(dir, point)
- if dist > box1Max then
- box1Max = dist
- end
- if dist < box1Min then
- box1Min = dist
- end
- end
- for _, point in box2Points do
- local dist = vector.dot(dir, point)
- if dist > box2Max then
- box2Max = dist
- end
- if dist < box2Min then
- box2Min = dist
- end
- end
- if box1Max < box2Min or box1Min > box2Max then
- return false
- end
- end
- end
- return true
- end
- return SATCheck
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement