/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** COLLISION"); ::Collision <- {}; function Collision::PointInBox(point, mins, maxs) { if ( point.x > mins.x && point.x < maxs.x && point.y > mins.y && point.y < maxs.y && point.z > mins.z && point.z < maxs.z) { return true } return false; } function Collision::RaySphereIntersect(start, end, point, radius) { if (radius == 0.0) return null; local n = (end - start) n.Norm(); local l = point - start local ta = n.Dot(l); if (ta < 0) return null; local d = sqrt(l.Dot(l) - ta*ta); if (d > radius) return null; local tb = sqrt(radius*radius - d*d); return { t0 = ta - tb, t1 = ta + tb, }; } function Collision::RayCylinderIntersect(start, end, point, radius, height) { if (radius == 0.0 || height == 0.0) return null; local tz0 = (point.z - start.z) / (end.z - start.z); local tz1 = ((point.z + height) - start.z) / (end.z - start.z); start = Vector2D(start.x, start.y); end = Vector2D(end.x, end.y); point = Vector2D(point.x, point.y); /* local n = (end - start) n.Norm(); local l = point - start local ta = n.Dot(l); if (ta < 0) return null; local d = sqrt(l.Dot(l) - ta*ta); if (d > radius) return null; local tb = sqrt(radius*radius - d*d); local t0 = ta - tb; local t1 = ta + tb; */ // @TODO - can't be bothered return ::Collision.RaySphereIntersect(start, end, point, radius); }