From e58f1970490141b0e58dd22fab87a1f2c81b2951 Mon Sep 17 00:00:00 2001 From: Kazhnuz Date: Fri, 27 Nov 2020 16:02:39 +0100 Subject: [PATCH] feat: initial version of physical entities for 3D --- birb/objects/3D/box.lua | 70 +++++++++++++++++++++++++++++++++ birb/objects/3D/indexedbox.lua | 71 +++++++++++++++++++++++++++++++++ birb/objects/3D/point3D.lua | 72 ++++++++++++++++++++++++++++++++++ 3 files changed, 213 insertions(+) create mode 100644 birb/objects/3D/box.lua create mode 100644 birb/objects/3D/indexedbox.lua create mode 100644 birb/objects/3D/point3D.lua diff --git a/birb/objects/3D/box.lua b/birb/objects/3D/box.lua new file mode 100644 index 0000000..8453374 --- /dev/null +++ b/birb/objects/3D/box.lua @@ -0,0 +1,70 @@ +-- box.lua :: a 3D box. + +--[[ + 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.3D.point3D" +local Box = Point:extend() + +function Box:new(x, y, z, w, h, d) + Box.super.new(self, x, y, z) + self:setSize(w, h, d) +end + +function Box:setSize(w, h, d) + self.w = w or self.w + self.h = h or self.h + self.d = d or self.d +end + +function Box:getArea() + local x, y, z = self:getPosition() + return x, y, z, self.w, self.h, self.d +end + +function Box:getShape() + local x, y, z, w, h, d = self:getArea() +end + +function Box:getCorners() + local x, y, z, w, h, d = self:getArea() + return x, y, z, x + w, y + h, z + d +end + +function Box:getCenter() + local x, y, z, w, h, d = self:getArea() + return math.floor(x + (w/2)), math.floor(y + (h/2)), math.floor(z + (d/2)) +end + +function Box:areCoordInside(dx, dy, dz) + local x, y, z, w, h, d = self:getArea() + return ((dx > x) and (dx < x + w) and (dy > y) and (dy < y + h)) and (dz > z) and (dz < z + d) +end + +function Box:getRelativeCoordinate(dx, dy, dz) + return dx - self.x, dy - self.y, dz - self.z +end + +function Box:drawBox() + utils.graphics.box(self.x, self.y, self.w, self.h) +end + +return Box \ No newline at end of file diff --git a/birb/objects/3D/indexedbox.lua b/birb/objects/3D/indexedbox.lua new file mode 100644 index 0000000..8ee36b2 --- /dev/null +++ b/birb/objects/3D/indexedbox.lua @@ -0,0 +1,71 @@ +-- indexedbox.lua :: An indexed box is a box indexed to a point, +-- Basically a box 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, oz, w, h, d) + self.setOrigin(origin) + self.ox = ox + self.oy = oy + self.oz = oz + local x, y, z = self:getPosition() + IndexedRect.super.new(self, x, y, w, h) +end + +function IndexedRect:setRelativePosition(ox, oy, oz) + self.ox = ox or self.ox + self.oy = oy or self.oy + self.oz = oz or self.oz +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, self.origin.z + self.oz +end + +function IndexedRect:updateBox() + local x, y, z = self:getPosition() + self:setPosition(x, y, z) + return x, y, self.w, self.h, self.d +end + +function IndexedRect:modify(ox, oy, oz, w, h, d) + self.ox = ox + self.oy = oy + self.oz = oz + self:setSize(w, h, d) + self:updateBox() +end + +return IndexedRect \ No newline at end of file diff --git a/birb/objects/3D/point3D.lua b/birb/objects/3D/point3D.lua new file mode 100644 index 0000000..14a4b51 --- /dev/null +++ b/birb/objects/3D/point3D.lua @@ -0,0 +1,72 @@ +-- point3D.lua :: a 3D 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, z) + self.x, self.y, self.z = x, y, z +end + +function Point:setPosition(x, y, z) + self.x, self.y, self.z = x, y, z +end + +function Point:goToward(x, y, z) + local x = x or 0 + local y = y or 0 + local z = z or 0 + self:setPosition(self.x + x, self.y + y, self.z + z) +end + +function Point:getPosition() + return self.x, self.y, self.z +end + +function Point:getDistance(x, y, z) + return utils.math.pointDistance3D(self.x, self.y, self.z, x, y, z) +end + +function Point:getDistanceFromPoint(other) + local x, y, z = other:getPosition() + self:getDistance(x, y, z) +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, z) + return utils.math.getMiddlePoint3D(self.x, self.y, self.z, x, y, z) +end + +function Point:getMiddlePointFromPoint(other) + local x, y, z = other:getPosition() + self:getMiddlePoint(x, y, z) +end + +return Point \ No newline at end of file