From 730d89a76c6f475295a4b92efc5ab66c4edb79c6 Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Wed, 25 Nov 2020 13:29:27 +0100 Subject: [PATCH] feat: add basic reusable 2D objects Fixes #51 --- birb/objects/2D/indexedrect.lua | 68 +++++++++++++++++++++++++++++++ birb/objects/2D/point.lua | 71 +++++++++++++++++++++++++++++++++ birb/objects/2D/rect.lua | 65 ++++++++++++++++++++++++++++++ 3 files changed, 204 insertions(+) create mode 100644 birb/objects/2D/indexedrect.lua create mode 100644 birb/objects/2D/point.lua create mode 100644 birb/objects/2D/rect.lua diff --git a/birb/objects/2D/indexedrect.lua b/birb/objects/2D/indexedrect.lua new file mode 100644 index 0000000..fe87245 --- /dev/null +++ b/birb/objects/2D/indexedrect.lua @@ -0,0 +1,68 @@ +-- indexedrect.lua :: An indexed rectangle is a rectangle indexed to a point, +-- Basically a rectangle that have its coordinate recalculated from an existing +-- point + +--[[ + Copyright © 2019 Kazhnuz + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +]] + +local Rect = require "birb.objects.2D.rect" +local IndexedRect = Rect:extend() + +function IndexedRect:new(origin, ox, oy, w, h) + self.setOrigin(origin) + self.ox = ox + self.oy = oy + local x, y = self:getPosition() + IndexedRect.super.new(self, x, y, w, h) +end + +function IndexedRect:setRelativePosition(ox, oy) + self.ox = ox or self.ox + self.oy = oy or self.oy +end + +function IndexedRect:setOrigin(origin) + self.origin = origin + -- We should check if the origin is really a point +end + +function IndexedRect:getOrigin(origin) + return self.origin +end + +function IndexedRect:getPosition() + return self.origin.x + self.ox, self.origin.y + self.oy +end + +function IndexedRect:updateRect() + local x, y = self:getPosition() + self:setPosition(x, y) + return x, y, self.w, self.h +end + +function IndexedRect:modify(ox, oy, w, h) + self.ox = ox + self.oy = oy + self:setSize(w, h) + self:updateRect() +end + +return IndexedRect \ No newline at end of file diff --git a/birb/objects/2D/point.lua b/birb/objects/2D/point.lua new file mode 100644 index 0000000..893bf9c --- /dev/null +++ b/birb/objects/2D/point.lua @@ -0,0 +1,71 @@ +-- point.lua :: a 2D point. + +--[[ + Copyright © 2019 Kazhnuz + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +]] + +local Point = Object:extend() + +function Point:new(x, y) + self.x, self.y = x, y +end + +function Point:setPosition(x, y) + self.x, self.y = x, y +end + +function Point:move(x, y) + local x = x or 0 + local y = y or 0 + self:setPosition(self.x + x, self.y + y) +end + +function Point:getPosition() + return self.x, self.y +end + +function Point:getDistance(x, y) + return utils.math.pointDistance(self.x, self.y, x, y) +end + +function Point:getDistanceFromPoint(other) + local x, y = other:getPosition() + self:getDistance(x, y) +end + +function Point:getDirection(x, y) + return utils.math.pointDirection(self.x, self.y, x, y) +end + +function Point:getDirectionFromPoint(other) + local x, y = other:getPosition() + self:getDirection(x, y) +end + +function Point:getMiddlePoint(x, y) + return utils.math.getMiddlePoint(self.x, self.y, x, y) +end + +function Point:getDirectionFromPoint(other) + local x, y = other:getPosition() + self:getMiddlePoint(x, y) +end + +return Point \ No newline at end of file diff --git a/birb/objects/2D/rect.lua b/birb/objects/2D/rect.lua new file mode 100644 index 0000000..1218c7a --- /dev/null +++ b/birb/objects/2D/rect.lua @@ -0,0 +1,65 @@ +-- rect.lua :: a 2D rectangle. + +--[[ + Copyright © 2019 Kazhnuz + + Permission is hereby granted, free of charge, to any person obtaining a copy of + this software and associated documentation files (the "Software"), to deal in + the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +]] + +local Point = require "birb.objects.2D.point" +local Rect = Point:extend() + +function Rect:new(x, y, w, h) + Rect.super.new(self, x, y) + self:setSize(w, h) +end + +function Rect:setSize(w, h) + self.w = w or self.w + self.h = h or self.h +end + +function Rect:getArea() + local x, y = self:getPosition() + return x, y, self.w, self.h +end + +function Rect:getCorners() + local x, y, w, h = self:getArea() + return x, y, x + w, y + h +end + +function Rect:getCenter() + local x, y, w, h = self:getArea() + return math.floor(x + (w/2)), math.floor(y + (h/2)) +end + +function Rect:areCoordInside(dx, dy) + local x, y, w, h = self:getArea() + return ((dx > x) and (dx < x + w) and (dy > y) and (dy < y + h)) +end + +function Rect:getRelativeCoordinate(dx, dy) + return dx - self.x, dy - self.y +end + +function Rect:drawBox() + utils.graphics.box(self.x, self.y, self.w, self.h) +end + +return Rect \ No newline at end of file