From b03af23da5a5b9cea84cacb2e7c8b4b52ab0886f Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Thu, 11 May 2023 21:28:37 +0300 Subject: [PATCH] initial commit --- BezierCurve.lua | 99 ++++++++++++++++++++ GUI-Framework.lua | 166 ++++++++++++++++++++++++++++++++++ GUI/Button.lua | 95 ++++++++++++++++++++ GUI/Label.lua | 14 +++ README.md | 14 +++ Vector2.lua | 137 ++++++++++++++++++++++++++++ conf.lua | 4 + main.lua | 64 +++++++++++++ screenshot.png | Bin 0 -> 67051 bytes utils.lua | 225 ++++++++++++++++++++++++++++++++++++++++++++++ 10 files changed, 818 insertions(+) create mode 100644 BezierCurve.lua create mode 100644 GUI-Framework.lua create mode 100644 GUI/Button.lua create mode 100644 GUI/Label.lua create mode 100644 README.md create mode 100644 Vector2.lua create mode 100644 conf.lua create mode 100644 main.lua create mode 100644 screenshot.png create mode 100644 utils.lua diff --git a/BezierCurve.lua b/BezierCurve.lua new file mode 100644 index 0000000..a9cf609 --- /dev/null +++ b/BezierCurve.lua @@ -0,0 +1,99 @@ +local Vector2 = require("Vector2") +local BezierCurve = {} +local width = 5 +local interval = 1/10 +BezierCurve.maxDepth = -1 +BezierCurve.randSeed = love.math.random() +BezierCurve.__index = BezierCurve + +local function dist(x1,y1,x2,y2) + return ((x1-x2)^2+(y1-y2)^2)^0.5 +end + +local function linearBezier(p1, p2) + return (1-t)*p1 + t*p2 +end + +function BezierCurve.new(class, points) + return setmetatable({ + _curve = love.math.newBezierCurve(points or {100,180,250,250,200,500}), + selectedPoint = false + }, class) +end + +function BezierCurve:draw(drawPoints, drawLines, drawFinal) + love.graphics.setLineJoin("bevel") + love.graphics.setLineStyle("smooth") + + if drawLines then + love.graphics.setLineWidth(width*0.25) + local p = {} + for i=1, self._curve:getControlPointCount() do + table.insert(p, Vector2(self._curve:getControlPoint(i))) + end + BezierCurve.stringArt(p, 0) + end + + if drawFinal then + love.graphics.setLineWidth(width) + love.graphics.setColor(0.8,0,0) + love.graphics.line(self._curve:render()) + end + + if drawPoints then + love.graphics.setColor(0,0,0.8) + for i=1,self._curve:getControlPointCount() do + local x,y = self._curve:getControlPoint(i) + love.graphics.circle("fill",x,y,width*1.25) + end + end +end + +function BezierCurve:mousemoved(x, y) + if self.selectedPoint then + self._curve:setControlPoint(self.selectedPoint, x, y) + end +end + +function BezierCurve:mousepressed(x, y, button) + if button == 1 then + local isCtrl = love.keyboard.isDown("lctrl", "rctrl") + for i=1,self._curve:getControlPointCount() do + if dist(x,y,self._curve:getControlPoint(i)) < width*1.25 then + if isCtrl then + self._curve:removeControlPoint(i) + else + self.selectedPoint = i + end + return + end + end + if isCtrl then + self._curve:insertControlPoint(x, y) + end + end +end + +function BezierCurve:mousereleased(_, _, button) + if button == 1 then + self.selectedPoint = false + end +end + +function BezierCurve.stringArt(points, depth) + if #points > 2 and (BezierCurve.maxDepth < 0 or depth < BezierCurve.maxDepth) then + for t=0,1,interval do + love.graphics.setColor(0.3,0.5,0.1) + local p = {} + for pointI=1, #points-1 do + table.insert(p, (1-t)*points[pointI] + t*points[pointI+1]) + end + for pointI=1, #p-1 do + love.graphics.line(p[pointI].x, p[pointI].y, p[pointI+1].x, p[pointI+1].y) + end + BezierCurve.stringArt(p, depth+1) + end + end +end + +return BezierCurve \ No newline at end of file diff --git a/GUI-Framework.lua b/GUI-Framework.lua new file mode 100644 index 0000000..f255ca9 --- /dev/null +++ b/GUI-Framework.lua @@ -0,0 +1,166 @@ +local GUI = {} +local EMPTY = {} +local Vector2 = require("Vector2") +local templates = {} +GUI.__index = GUI + + +local function clone(data) + if type(data) ~= "table" then + return data + else + + local new = {} + for k, v in pairs(data) do + new[k] = clone(v) + end + return setmetatable(new, getmetatable(data)) + end +end + +function revipairs(t) + return function(t, i) i = i - 1 if i > 0 then return i, t[i] end end, t, #t+1 +end + +function GUI.sortByDepth(a, b) + return a.depth < b.depth +end + +function getPos(self) + if self._parent then + local x0, y0 = self._parent:getPos() + return self.pos.x + x0, self.pos.y + y0 + else + return self.pos.x, self.pos.y + end +end +function getSize(self) + return self.size.x, self.size.y +end +function getBounds(self) + local x, y = getPos(self) + return x, y, self.size.x, self.size.y +end +function inBounds(self, x, y) + local Ex, Ey, width, height = getBounds(self) + return (x > Ex and x < Ex + width and y > Ey and y < Ey + height) +end + +function GUI.createElement(elementType, data) + assert(templates[elementType], "Element type \""..elementType.."\" dosen't exist") + + local elem = data or {} + for k, v in pairs(templates[elementType]) do + if not (type(k) == "string" and k:find("^__")) and type(elem[k]) == "nil" then + elem[k] = clone(v) + end + end + setmetatable(elem, template) + + -- Ensure that the mandatory varaibles are declered + elem.depth = elem.depth or 0 + elem.pos = elem.pos or Vector2() + elem.size = elem.size or Vector2() + if type(elem.visible) ~= "boolean" then + elem.visible = true + end + + if elem.load then elem:load() end + return elem +end + +function GUI.new(class, width, height) + assert(width and height, "Width and height are undefined") + local self = setmetatable({}, class) + self.pos = Vector2() + self.size = Vector2(width, height) + + self.getPos = getPos + self.getSize = getSize + self.getBounds = getBounds + self.inBounds = inBounds + + self._elements = {} + return self +end + +function GUI:removeElement(element) + for i, elem in ipairs(self._elements) do + if elem == element then + table.remove(self._elements, i) + break + end + end +end + +function GUI:addElement(elementType, data) + local elem = GUI.createElement(elementType, data) + elem._parent = self + -- Add it to the list + table.insert(self._elements, elem) + table.sort(self._elements, GUI.sortByDepth) + return elem +end + +function GUI.newTemplate(name) + local template = {} + template.__index = template + + template.getPos = getPos + template.getSize = getSize + template.getBounds = getBounds + template.inBounds = inBounds + + templates[name] = template + return template +end + +function GUI:resize(...) + for _, element in ipairs(self._elements) do + if element.resize then + element:resize(...) + end + end +end + +function GUI.callMethod(parent, name, ...) + local useFallback = false + for _, element in revipairs(parent._elements) do + if element.visible then + if type(element._elements) == "table" then + if GUI.callMethod(element, name, ...) then break end + end + if useFallback and element[name.."Fallback"] then + element[name.."Fallback"](element, ...) + elseif element[name] then + if element[name](element, ...) then useFallback = true end + end + end + end + return useFallback +end + +function GUI:draw(...) + local useFallback = false + for _, element in ipairs(self._elements) do + if element.visible then + if useFallback and element["drawFallback"] then + element["drawFallback"](element, ...) + elseif element["draw"] then + if element["draw"](element, ...) then useFallback = true end + end + if type(element._elements) == "table" then + GUI.draw(element, "draw", ...) + end + end + end + return useFallback +end + +for i, name in pairs{"keypressed", "keyreleased", "mousemoved", "mousepressed", "mousereleased", "textinput"} do + GUI[name] = function(self, ...) + GUI.callMethod(self, name, ...) + end +end + +return GUI \ No newline at end of file diff --git a/GUI/Button.lua b/GUI/Button.lua new file mode 100644 index 0000000..b3c378c --- /dev/null +++ b/GUI/Button.lua @@ -0,0 +1,95 @@ +local GUI = require("GUI-Framework") +local Vector2 = require("Vector2") +local utils = require("utils") +local Button = GUI.newTemplate("Button") + +Button.isHover = false +Button.isDown = false +Button.text = "" +Button.font = love.graphics.getFont() + +function Button:load() + local minWidth = self.font:getWidth(self.text) + local minHeight = self.font:getHeight(self.text) * ((select(2, self.text:gsub('\n', '\n')) or 0) + 1) + + if self.size.x < minWidth then + self.size.x = minWidth + 10 + end + if self.size.y < minHeight then + self.size.y = minHeight + 10 + end +end + +function Button:draw() + if self.isDown then + self:drawDown() + elseif self.isHover then + self:drawHover() + else + self:drawDefault() + end +end + +function Button:drawHover() + local x, y, width, height = self:getBounds() + local cx, cy = x + width/2, y + height/2 + + -- Shadow + utils.smoothRectangle(x, y, width, height, 2, utils.rgba(0, 0, 0, 0.62)) + -- The actual button + utils.smoothRectangle(x, y-1, width, height, 2, utils.rgb(42, 147, 247)) + -- Text + love.graphics.setColor(1, 1, 1) + utils.alignedPrint(self.font, self.text, cx, cy-1) +end + +function Button:drawDefault() + local x, y, width, height = self:getBounds() + local cx, cy = x + width/2, y + height/2 + + -- Shadow + utils.smoothRectangle(x, y, width, height, 2, utils.rgba(0, 0, 0, 0.62)) + -- The actual button + utils.smoothRectangle(x, y-1, width, height, 2, utils.rgb(56, 158, 255)) + -- Text + love.graphics.setColor(1, 1, 1) + utils.alignedPrint(self.font, self.text, cx, cy-1) +end + +function Button:mousemoved(x, y) + if self:inBounds(x, y) then + self.isHover = true + return true + else + self.isHover = false + end +end + +function Button:mousemovedFallback() + self.isHover = false +end + +function Button:mousepressed() + if self.isHover then + self.isDown = true + return true + end +end + +function Button:mousereleased(x, y, ...) + if self.isDown and self:inBounds(x, y) then + if self.mouseClicked then self:mouseClicked(x, y, ...) end + end + self.isDown = false +end + +function Button:drawDown() + local x, y, width, height = self:getBounds() + local cx, cy = x + width/2, y + height/2 + + -- the actual button + utils.smoothRectangle(x, y, width, height, 2, utils.rgb(0, 116, 225)) + -- Text + love.graphics.setColor(1, 1, 1) + utils.alignedPrint(self.font, self.text, cx, cy) +end diff --git a/GUI/Label.lua b/GUI/Label.lua new file mode 100644 index 0000000..2bd5da2 --- /dev/null +++ b/GUI/Label.lua @@ -0,0 +1,14 @@ +local Vector2 = require("Vector2") +local utils = require("utils") +local GUI = require("GUI-Framework") +local Label = GUI.newTemplate("Label") +local textFont = love.graphics.getFont() + +Label.color = utils.rgb(255 , 255, 255) +Label.text = "Lorem ipsum..." + +function Label:draw() + local x, y = self:getPos() + love.graphics.setColor(self.color) + utils.alignedPrint(textFont, self.text, x , y, self.alignX, self.alignY) +end diff --git a/README.md b/README.md new file mode 100644 index 0000000..40b55b1 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# Bezier curve string art + +![Screenshot](./screenshot.png) + +Visualize bezier curves as string art [String art](https://en.wikipedia.org/wiki/String_art) + +How to launch: +``` +love . +``` + +Controls: +* RCtrl + LMB - create/delete point +* RCtrl + LMB drag - move point diff --git a/Vector2.lua b/Vector2.lua new file mode 100644 index 0000000..44b31dc --- /dev/null +++ b/Vector2.lua @@ -0,0 +1,137 @@ +local ffi = assert(require("ffi"), "Vector2 needs ffi to be enabled") +local Vector2 = {} +setmetatable(Vector2, Vector2) + +ffi.cdef[[ +typedef struct { + double x, y; +} vector2; +]] + +function Vector2.copy(t) + return ffi.new("vector2", t.x, t.y) +end + +function Vector2.__call(t, x, y) + return ffi.new("vector2", x or 0, y or 0) +end + +function Vector2.__concat(v1, v2) + return v1 .. tostring(v2) +end + +function Vector2.__tostring(t) + return string.format("Vector2(%.4f,%.4f)", t.x, t.y) +end + +function Vector2.__eq(v1, v2) + if (not ffi.istype("vector2", v2)) or (not ffi.istype("vector2", v1)) then return false end + return v1.x == v2.x and v1.y == v2.y +end + +function Vector2.__unm(v) + return Vector2(-v.x, -v.y) +end + +function Vector2.__div(v1, op) + if type(op) ~= "number" then error("Vector2 must be divided by scalar") end + return Vector2(v1.x / op, v1.y / op) +end + +function Vector2.__mul(v1, op) + if type(op) == "number" then + return Vector2(v1.x * op, v1.y * op) + elseif type(v1) == "number" then + return Vector2(op.x * v1, op.y * v1) + end + return Vector2(v1.x * op.x, v1.y * op.y) +end + +function Vector2.__sub(v1, v2) + if type(v1) == "number" then + return Vector2(v1 - v2.x, v1 - v2.y) + elseif type(v2) == "number" then + return Vector2(v1.x - v2, v1.y - v2) + end + return Vector2(v1.x - v2.x, v1.y - v2.y) +end + +function Vector2.__add(v1, v2) + if type(v1) == "number" then + return Vector2(v1 + v2.x, v1 + v2.y) + elseif type(v2) == "number" then + return Vector2(v1.x + v2, v1.y + v2) + end + return Vector2(v1.x + v2.x, v1.y + v2.y) +end + +function Vector2.split(v) + return v.x, v.y +end + +function Vector2.setAngle(v, angle) + local magnitude = v.magnitude + return Vector2(math.cos(angle) * magnitude, math.sin(angle) * magnitude) +end + +function Vector2.setMagnitude(t, mag) + return t.normalized * mag +end + +function Vector2.__newindex(t, k, v) + if k == "magnitude" then + local result = t:setMagnitude(v) + t:set(result) + elseif k == "angle" then + local result = t:setAngle(v) + t:set(result) + elseif type(t) == "cdata" then + error("Cannot assign new property '" .. k .. "' to a Vector2") + else + rawset(t, k, v) + end +end + +function Vector2.getAngle(v) + return math.atan2(v.y, v.x) +end + +function Vector2.getNormalized(v) + local magnitude = v.magnitude + if magnitude == 0 then return Vector2(0, 0, 0) end + return Vector2(v.x / magnitude, v.y / magnitude) +end + +function Vector2.getMagnitude(v) + return (v.x^2 + v.y^2)^0.5 +end + +function Vector2.__index(t, k) + if k == "magnitude" then + return Vector2.getMagnitude(t) + elseif k == "normalized" then + return Vector2.getNormalized(t) + elseif k == "angle" then + return Vector2.getAngle(t) + end + return rawget(Vector2, k) +end + +function Vector2.rotate(t, rad) + return Vector2.setAngle(t, t:getAngle() + rad) +end + +function Vector2.set(t, v) + if ffi.istype("vector2", v) then + t.x = v.x + t.y = v.y + end +end + +function Vector2.distance(v1, v2) + return ((v1.x-v2.x)^2 + (v1.y-v2.y)^2)^0.5 +end + +ffi.metatype("vector2", Vector2) + +return Vector2 \ No newline at end of file diff --git a/conf.lua b/conf.lua new file mode 100644 index 0000000..ed8c640 --- /dev/null +++ b/conf.lua @@ -0,0 +1,4 @@ +function love.conf(t) + t.console = true + t.modules.joystick = false +end \ No newline at end of file diff --git a/main.lua b/main.lua new file mode 100644 index 0000000..a01dccc --- /dev/null +++ b/main.lua @@ -0,0 +1,64 @@ +local BezierCurve = require("BezierCurve") +local GUI = require("GUI-Framework") +local Vector2 = require("Vector2") + +function addCurve(points) + local newCurve = BezierCurve:new(points) + table.insert(allCurves, newCurve) +end + +function love.load(args, unfilteredArgs) + love.window.setTitle("Bezier Curves") + gui = GUI:new(love.graphics.getDimensions()) + allCurves = {} + show = {true, true , false} + + for _, file in pairs(love.filesystem.getDirectoryItems("GUI")) do + require("GUI."..file:sub(1, -5)) + end + + addCurve{200,200,300,150} + + gui:addElement("Button", {pos=Vector2(10,10), size = Vector2(100,25), text = "Hide points", mouseClicked = function(self) + show[1] = not show[1] + if show[1] then + self.text = "Hide points" + else + self.text = "Show points" + end + end}) + gui:addElement("Button", {pos=Vector2(10,50), size = Vector2(100,25), text = "Hide lines", mouseClicked = function(self) + show[2] = not show[2] + if show[2] then + self.text = "Hide lines" + else + self.text = "Show lines" + end + end}) + gui:addElement("Button", {pos=Vector2(10,90), size = Vector2(100,25), text = "Show curves", mouseClicked = function(self) + show[3] = not show[3] + if show[3] then + self.text = "Hide curves" + else + self.text = "Show curves" + end + end}) + + -- Make functions + for _, name in ipairs{"mousepressed", "mousereleased", "mousemoved", "load", "resize", "keypressed", "keyreleased", "textinput"} do + love[name] = function(...) + for _, curve in ipairs(allCurves) do + if curve[name] then curve[name](curve, ...) end + if gui[name] then gui[name](gui, ...) end + end + end + end +end + +function love.draw() + love.graphics.clear(0.9,0.9,0.9) + for _, curve in ipairs(allCurves) do + curve:draw(show[1], show[2], show[3]) + end + gui:draw() +end \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..737000c33d04a998105a00fd38f4d092a6cdce22 GIT binary patch literal 67051 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 0 ) and math.atan(y/x) + or (x < 0 and y >= 0) and math.atan(y/x) + math.pi + or (x < 0 and y < 0) and math.atan(y/x) - math.pi + or (x == 0 and y > 0) and math.pi/2 + or (x == 0 and y < 0) and -math.pi/2 + or 0 -- this situration is technically undefined +end +]] + +function utils.lastIndex(t) + local res = -math.huge + for k in pairs(t) do + if k > res then res = k end + end + return res +end + +function utils.translate(dx, dy) + love.graphics.translate(dx, dy) + _tx, _ty = _tx + dx, _ty + dy +end + +function utils.pushRegion(x, y, w, h) + local sx, sy, sw, sh = love.graphics.getScissor() + table.insert(_stack.sx, sx) + table.insert(_stack.sy, sy) + table.insert(_stack.sw, sw) + table.insert(_stack.sh, sh) + table.insert(_stack.tx, _ty) + table.insert(_stack.ty, _tx) + + love.graphics.push() + if x and y then + if w and h then + love.graphics.intersectScissor(_tx + x, _ty + y, math.max(0, w), math.max(0, h)) + end + utils.translate(x, y) + end +end + +function utils.popRegion() + local sx = table.remove(_stack.sx) + local sy = table.remove(_stack.sy) + local sw = table.remove(_stack.sw) + local sh = table.remove(_stack.sh) + + _tx = table.remove(_stack.tx) or 0 + _ty = table.remove(_stack.ty) or 0 + + love.graphics.pop() + if sx and sy and sw and sh then + love.graphics.setScissor(sx, sy, sw, sh) + else + love.graphics.setScissor() + end +end + +function utils.smoothLine (x1, y1, x2, y2, width, color) + love.graphics.setLineStyle("smooth") + love.graphics.setLineWidth(width) + if color then love.graphics.setColor(color) end + love.graphics.line(x1, y1, x2, y2) +end + +function utils.clamp(x, A, B) + if x < A then + return A + elseif x > B then + return B + else + return x + end +end + +local function previous(t, i) + i = i - 1 + if i > 0 then return i, t[i] end +end + +function utils.revipairs(t) + return previous, t, #t+1 +end + +function utils.smoothRectangle(x, y, w, h, r, color) + love.graphics.setLineStyle("smooth") + love.graphics.setLineWidth(1) + if color then love.graphics.setColor(color) end + love.graphics.rectangle("fill", x, y, w, h, r) + love.graphics.rectangle("line", x, y, w, h, r) +end + +function utils.borderRectangle(x,y,w,h,r,lineWidth,color) + love.graphics.setLineStyle("smooth") + love.graphics.setLineWidth(lineWidth) + if color then love.graphics.setColor(color) end + love.graphics.rectangle("line", x, y, w, h, r) +end + +function utils.alignedPrint(font, text, x, y, alignX, alignY) + local line_count = (select(2, text:gsub('\n', '\n')) or 0) + 1 + local width = font:getWidth(text) + local height = font:getHeight()*line_count + + love.graphics.setFont(font) + love.graphics.print(text, utils.round(x + (alignment[alignX] or -0.5) * width), utils.round(y + (alignment[alignY] or -0.5) * height)) +end + +function utils.rgb(r, g, b) + return {r/255, g/255, b/255, 1} +end + +function utils.rgba(r, g, b, a) + return {r/255, g/255, b/255, a} +end + +function utils.round(num, numDecimalPlaces) + local mult = 10^(numDecimalPlaces or 0) + return math.floor(num * mult + 0.5) / mult +end + +function utils.map(x, A, B, C, D) + return (x - A) / (B - A) * (D - C) + C +end + +function utils.sign(x) + if x > 0 then + return 1 + elseif x < 0 then + return -1 + else + return 0 + end +end + +function utils.clone(data) + if type(data) ~= "table" then + return data + else + + local new = {} + for k, v in pairs(data) do + new[k] = utils.clone(v) + end + return setmetatable(new, getmetatable(data)) + end +end + +function utils.serialize(data) + if type(data) == "string" then + return "\""..data.."\"" + elseif type(data) == "table" then + local t = {} + for key,value in pairs(data) do + table.insert(t,"["..utils.serialize(key).."]="..utils.serialize(value)) + end + return "{"..table.concat(t,",").."}" + else + return tostring(data) + end +end + +function utils.unserialize(data) + return load("return "..data, nil, "t", {Vector2 = Vector2})() +end + +function utils.printTable(t,depth) + depth = depth or 0 + for k,v in pairs(t) do + if type(v) == "table" then + print(string.rep(" ", depth)..k, "table:") + utils.printTable(v,depth+1) + else + print(string.rep(" ", depth)..k, v) + end + end +end + +function utils.loadFile(fileName) + if not love.filesystem.getInfo(fileName) then return nil end + local file = love.filesystem.read(fileName) + local data = love.data.decompress("string","zlib", file) + return utils.unserialize(data) +end + +function utils.saveFile(data, fileName) + local rawstring = utils.serialize(data) + local file = io.open(fileName, "wb") + file:write(love.data.compress("string","zlib",rawstring)) +end + +function utils.pairsByKeys(t) + local tableKeys = {} + for key in pairs(t) do table.insert(tableKeys, key) end + table.sort(tableKeys) + local i = 0 + local n = table.getn(tableKeys) + return function () + i = i + 1 + if i <= n then return tableKeys[i], t[tableKeys[i]] end + end +end + +return utils \ No newline at end of file