From 201dc74d83107affa8694899bab1dec5b7c1dffa Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 1 Mar 2020 00:19:53 -0600 Subject: [PATCH] cleaner ui and code --- data/index.wasm | Bin 0 -> 211051 bytes data/main.wasm | Bin 1048 -> 1052 bytes decompile.lua | 60 +++++++++++++++++------- main.lua | 122 +++++++++++++++++++++++++++--------------------- ui.lua | 55 ++++++++++++++++------ utils.lua | 38 ++++++++++++++- 6 files changed, 189 insertions(+), 86 deletions(-) create mode 100755 data/index.wasm diff --git a/data/index.wasm b/data/index.wasm new file mode 100755 index 0000000000000000000000000000000000000000..c1357160783948672925854a0a22c0a9e771fe35 GIT binary patch literal 211051 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 N>yZve56?#T{}1W5D+vGq literal 0 HcmV?d00001 diff --git a/data/main.wasm b/data/main.wasm index 1c41dc82d29da8f1cb0e262d87b36e3d1675ee7a..2e254e94444efadbbcdd2a9b0dfa6e11d7a88244 100755 GIT binary patch delta 36 pcmbQiF^6NqPsW8Ce{nO5i!s= 32 then + self:read_byte() + self:read_byte() + self:read_byte() + self:read_byte() + end + if N >= 64 then + self:read_byte() + self:read_byte() + self:read_byte() + self:read_byte() + end return 0.0; end; } function decompile(filepath) - local reader = Reader(filepath) + local reader = Parser(filepath) return parse_module(reader) end -return module { decompile; VAL_TYPES = VAL_TYPES } +return module { decompile } diff --git a/main.lua b/main.lua index 1dc3e36..67be148 100644 --- a/main.lua +++ b/main.lua @@ -3,7 +3,6 @@ require "lualib.oop" import { decompile = "decompile:"; - VAL_TYPES = "decompile:VAL_TYPES"; Ui = "ui:Ui"; UiRegion = "ui:UiRegion"; @@ -12,34 +11,45 @@ import { render_text = "ui:render_text"; + scissor_points = "utils:scissor_points"; pprint = "lualib.pprint"; } +TEXT_COLORS = { + keyword = { 0.7, 0.7, 1.0 }; + value = { 0.8, 1.0, 0.8 }; + text = { 0.9, 0.9, 0.9 }; + jumppoint = { 1, 0.5, 0.5 }; + + header_background = { 0.1, 0.1, 0.1 }; + background = { 0.15, 0.15, 0.15 }; +} + function build_func_header_text(func, mod) local text = {} - table.insert(text, { text = "[" .. func.funcidx .. "] ", color = { 0, 0, 0 } }) - table.insert(text, { text = func.name, color = { 0, 0, 1 } }) - table.insert(text, { text = ": ", color = { 0, 0, 0 } }) + table.insert(text, { text = "[" .. func.funcidx .. "] ", color = TEXT_COLORS.text }) + table.insert(text, { text = func.name, color = TEXT_COLORS.keyword }) + table.insert(text, { text = ": ", color = TEXT_COLORS.text }) local type_ = func.type_ for _, t in ipairs(type_.param_types) do - table.insert(text, { text = t .. " ", color = { 0, 0, 0 } }) + table.insert(text, { text = t .. " " }) end if #type_.param_types == 0 then - table.insert(text, { text = "void ", color = { 0, 0, 0 } }) + table.insert(text, { text = "void " }) end - table.insert(text, { text = "-> ", color = { 0, 0, 0 } }) + table.insert(text, { text = "-> " }) for _, t in ipairs(type_.result_types) do - table.insert(text, { text = t .. " ", color = { 0, 0, 0 } }) + table.insert(text, { text = t .. " " }) end if #type_.result_types == 0 then - table.insert(text, { text = "void", color = { 0, 0, 0 } }) + table.insert(text, { text = "void" }) end table.insert(text, { newline = true }) @@ -52,22 +62,25 @@ local line = 1 function add_line_number(textlist, newline) if newline == nil then newline = true end table.insert(textlist, { newline = newline }) - table.insert(textlist, { text = ("%4d"):format(line), color = { 0.3, 0.3, 0.3 }, background = { 0.7, 0.7, 0.7 }, post_indent = true }) - table.insert(textlist, { text = " ", color = { 0, 0, 0 }, post_indent = true }) + table.insert(textlist, { text = ("%4d"):format(line), color = TEXT_COLORS.text, background = TEXT_COLORS.header_background, post_indent = true }) + table.insert(textlist, { text = " ", post_indent = true }) line = line + 1 end function instr_to_text(textlist, instr, func, mod) if instr[1] == "block" then - table.insert(textlist, { text = "block", color = { 1, 0, 0 }, change_indent = 1 }) for _, ins in ipairs(instr.instrs) do - add_line_number(textlist) instr_to_text(textlist, ins, func, mod) + add_line_number(textlist) end - table.insert(textlist, { change_indent = -1 }) + table.insert(textlist, { text = "label ", color = TEXT_COLORS.jumppoint }) + table.insert(textlist, { text = instr.label, color = TEXT_COLORS.value }) + elseif instr[1] == "loop" then - table.insert(textlist, { text = "loop", color = { 1, 0, 0 }, change_indent = 1 }) + table.insert(textlist, { text = "loop ", color = TEXT_COLORS.jumppoint }) + table.insert(textlist, { text = instr.label, color = TEXT_COLORS.value, change_indent = 1 }) + for _, ins in ipairs(instr.instrs) do add_line_number(textlist) instr_to_text(textlist, ins, func, mod) @@ -75,7 +88,7 @@ function instr_to_text(textlist, instr, func, mod) table.insert(textlist, { change_indent = -1 }) elseif instr[1] == "if" then - table.insert(textlist, { text = "if", color = { 1, 0, 0 }, change_indent = 1 }) + table.insert(textlist, { text = "if", color = TEXT_COLORS.jumppoint, change_indent = 1 }) for _, ins in ipairs(instr.instrs) do add_line_number(textlist) instr_to_text(textlist, ins, func, mod) @@ -84,8 +97,8 @@ function instr_to_text(textlist, instr, func, mod) if #instr.else_instrs > 0 then add_line_number(textlist) - table.insert(textlist, { text = "else", color = { 1, 0, 0 }, change_indent = 1 }) - for _, ins in ipairs(instr.instrs) do + table.insert(textlist, { text = "else", color = TEXT_COLORS.jumppoint, change_indent = 1 }) + for _, ins in ipairs(instr.else_instrs) do add_line_number(textlist) instr_to_text(textlist, ins, func, mod) end @@ -93,25 +106,30 @@ function instr_to_text(textlist, instr, func, mod) end elseif instr[1] == "call" then - table.insert(textlist, { text = instr[1] .. " ", color = { 0, 0, 1 } }) - table.insert(textlist, { text = mod.funcs[instr.x].name, color = { 0, 0.5, 0 } }) + table.insert(textlist, { text = instr[1] .. " ", color = TEXT_COLORS.keyword }) + table.insert(textlist, { text = mod.funcs[instr.x].name, color = TEXT_COLORS.value }) elseif instr[1]:match("local") then - table.insert(textlist, { text = instr[1] .. " ", color = { 0, 0, 1 } }) - table.insert(textlist, { text = func.locals[instr.x + 1].name, color = { 0, 0.5, 0 } }) + table.insert(textlist, { text = instr[1] .. " ", color = TEXT_COLORS.keyword }) + table.insert(textlist, { text = func.locals[instr.x + 1].name, color = TEXT_COLORS.value }) else - table.insert(textlist, { text = instr[1] .. " ", color = { 0, 0, 1 } }) + table.insert(textlist, { text = instr[1] .. " ", color = TEXT_COLORS.keyword }) if instr.x then if type(instr.x) == "table" then if instr.x[1] == "memarg" then table.insert(textlist, { - text = ("align=0x%03x offset=0x%08x"):format(instr.x.align, instr.x.offset); - color = { 0, 0.5, 0 } + text = ("align=0x%02x offset=0x%04x"):format(instr.x.align, instr.x.offset); + color = TEXT_COLORS.value }) end + + if instr.x[1] == "labelidx" then + table.insert(textlist, { text = instr.x.block.label .. " ", color = TEXT_COLORS.value }) + table.insert(textlist, { text = ("[0x%02x]"):format(instr.x.labelidx), color = TEXT_COLORS.text }) + end else - table.insert(textlist, { text = tostring(instr.x), color = { 0, 0.5, 0 } }) + table.insert(textlist, { text = tostring(instr.x), color = TEXT_COLORS.value }) end end end @@ -123,25 +141,23 @@ function build_func_body_text(func, mod) local text = {} line = 1 - table.insert(text, { text = "Locals:", color = { 0, 0, 1 }, newline = true, change_indent = 2 }) + table.insert(text, { text = " Locals:", color = TEXT_COLORS.keyword, newline = true, change_indent = 2 }) for _, loc in ipairs(func.locals) do - table.insert(text, { text = loc.type_ .. " " .. loc.name, color = { 0, 0, 0 }, newline = true }) + table.insert(text, { text = loc.type_ .. " " .. loc.name, color = TEXT_COLORS.text , newline = true }) end if #func.locals == 0 then - table.insert(text, { text = "no locals", color = { 1, 0, 0 }, newline = true }) + table.insert(text, { text = "no locals", color = TEXT_COLORS.text, newline = true }) end table.insert(text, { newline = true, change_indent = -2 }) - table.insert(text, { text = "Body:", color = { 0, 0, 1 } }) + table.insert(text, { text = " Body:", color = TEXT_COLORS.keyword }) for _, instr in ipairs(func.body) do add_line_number(text) instr_to_text(text, instr, func, mod) end - -- table.remove(text, #text) - return text end @@ -150,7 +166,14 @@ class "FunctionBlock" [DraggableRect] { DraggableRect.init(self, x, y, 400, 400) self.header_text = build_func_header_text(func, mod) - self.body_text = build_func_body_text(func, mod) + if func.body then + self.body_text = build_func_body_text(func, mod) + else + self.rect.h = 48 + self.body_text = { + { text = "imported function", color = TEXT_COLORS.text } + } + end self.scroll = 0 end; @@ -162,7 +185,7 @@ class "FunctionBlock" [DraggableRect] { ondrag = function(self, button, x, y, dx, dy) DraggableRect.ondrag(self, button, x, y, dx, dy) - if button == 2 then + if y >= 24 and button == 2 then self.rect.w = math.max(100, x) self.rect.h = math.max(22, y) end @@ -171,18 +194,18 @@ class "FunctionBlock" [DraggableRect] { draw = function(self) love.graphics.setColor(0, 0, 0) love.graphics.rectangle("fill", 0, 0, self.rect.w, self.rect.h) - love.graphics.setColor(1, 1, 1) + love.graphics.setColor(self.selected and TEXT_COLORS.background or TEXT_COLORS.header_background) love.graphics.rectangle("fill", 2, 2, self.rect.w - 4, self.rect.h - 4) - love.graphics.setColor(0.8, 0.8, 0.8) + love.graphics.setColor(TEXT_COLORS.header_background) love.graphics.rectangle("fill", 2, 2, self.rect.w - 4, 18) - local sx, sy = love.graphics.transformPoint(0, 0) - love.graphics.intersectScissor(sx, sy, self.rect.w, self.rect.h) + love.graphics.intersectScissor(scissor_points(0, 0, self.rect.w, self.rect.h)) local x, y = render_text(2, 2, self.header_text) - local sx, sy = love.graphics.transformPoint(2, y - 1) - love.graphics.intersectScissor(sx, sy, self.rect.w - 4, self.rect.h - 22) - render_text(2, y + 4 - self.scroll, self.body_text) + if self.body_text then + love.graphics.intersectScissor(scissor_points(2, y - 1, self.rect.w - 4, self.rect.h - 22)) + render_text(2, y + 4 - self.scroll, self.body_text) + end end; } @@ -199,22 +222,15 @@ function love.load() ui_region.rect.w = 1200 ui_region.rect.h = 900 ui_region.background_color = { 0.1, 0.1, 0.1 } - ui_region.line_color = { 0.2, 0.2, 0.2 } - - -- ui_region:add_object(DraggableRect(100, 100, 100, 100)) - -- ui_region:add_object(DraggableRect(200, 100, 100, 100)) - -- ui_region:add_object(DraggableRect(300, 100, 100, 100)) - -- ui_region:add_object(DraggableRect(400, 100, 300, 100)) + ui_region.line_color = { 0.15, 0.15, 0.2 } local x = 0 local y = 0 for _, func in pairs(mod.funcs) do - if func.body then - local block = FunctionBlock(func, x, y) - block.order = 600 - y - ui_region:add_object(block) - y = y + 20 - end + local block = FunctionBlock(func, x, y) + block.order = 600 - y + ui_region:add_object(block) + y = y + 20 end ui:add_region(ui_region) diff --git a/ui.lua b/ui.lua index c9aa260..1d3f1b7 100644 --- a/ui.lua +++ b/ui.lua @@ -2,6 +2,7 @@ import { Rectangle = "utils:Rectangle"; uuid = "utils:uuidv4"; revipairs = "utils:revipairs"; + scissor_points = "utils:scissor_points"; } class "Ui" { @@ -93,7 +94,7 @@ class "Ui" { draw = function(self) for _, region in ipairs(self.regions) do love.graphics.push() - love.graphics.setScissor(region.rect.x, region.rect.y, region.rect.w, region.rect.h) + love.graphics.setScissor(scissor_points(region.rect.x, region.rect.y, region.rect.w, region.rect.h)) love.graphics.translate(region.rect.x, region.rect.y) region:draw() love.graphics.pop() @@ -235,18 +236,34 @@ class "ScrollingUiRegion" [UiRegion] { end; _obj_rect = function(self, obj) - return Rectangle( - obj.rect.x + self.offset.x, - obj.rect.y + self.offset.y, - obj.rect.w, obj.rect.h) + return obj.rect + end; + + _transform_mouse = function(self, x, y) + return + ((x + self.rect.x) - self.rect.w / 2) / self.zoom + self.rect.w / 2 - self.offset.x - self.rect.x, + ((y + self.rect.y) - self.rect.h / 2) / self.zoom + self.rect.h / 2 - self.offset.y - self.rect.y + end; + + onmousedown = function(self, button, x, y) + print(x, y) + local mx, my = self:_transform_mouse(x, y) + print(mx, my) + UiRegion.onmousedown(self, button, mx, my) + end; + + onmouseup = function(self, button, x, y) + local mx, my = self:_transform_mouse(x, y) + UiRegion.onmouseup(self, button, mx, my) end; onmousemove = function(self, x, y, dx, dy) - UiRegion.onmousemove(self, x, y, dx, dy) + local mx, my = self:_transform_mouse(x, y) + UiRegion.onmousemove(self, mx, my, dx / self.zoom, dy / self.zoom) if self.is_mouse_down and self.selected_object == nil then - self.offset.x = self.offset.x + dx - self.offset.y = self.offset.y + dy + self.offset.x = self.offset.x + dx / self.zoom + self.offset.y = self.offset.y + dy / self.zoom end end; @@ -256,6 +273,7 @@ class "ScrollingUiRegion" [UiRegion] { if self.selected_object == nil then self.zoom = self.zoom * (dy > 0 and 1.05 or (1 / 1.05)) if self.zoom >= 1 then self.zoom = 1 end + if self.zoom <= (1 / 1.05) ^ 20 then self.zoom = (1 / 1.05) ^ 20 end end end; @@ -263,7 +281,7 @@ class "ScrollingUiRegion" [UiRegion] { UiRegion.update(self, dt) if self.active then - local speed = 300 + local speed = 300 / self.zoom if love.keyboard.isDown "left" then self.offset.x = self.offset.x + speed * dt end @@ -289,6 +307,11 @@ class "ScrollingUiRegion" [UiRegion] { local tmpbgcolor = self.background_color self.background_color = nil + love.graphics.translate(self.rect.w / 2, self.rect.h / 2) + love.graphics.scale(self.zoom, self.zoom) + love.graphics.translate(-self.rect.w / 2, -self.rect.h / 2) + + local xoff = self.offset.x local yoff = self.offset.y local spacing = 64 @@ -299,11 +322,11 @@ class "ScrollingUiRegion" [UiRegion] { while yoff <= -spacing do yoff = yoff + spacing end love.graphics.setColor(self.line_color) - for x = 0, 40 do - love.graphics.line(x * spacing + xoff, 0, x * spacing + xoff, self.rect.h) + for x = -40, 80 do + love.graphics.line(x * spacing + xoff, -self.rect.h, x * spacing + xoff, self.rect.h * 2) end - for y = 0, 40 do - love.graphics.line(0, y * spacing + yoff, self.rect.w, y * spacing + yoff) + for y = -40, 80 do + love.graphics.line(-self.rect.w, y * spacing + yoff, self.rect.w * 2, y * spacing + yoff) end love.graphics.translate(self.offset.x, self.offset.y) @@ -319,7 +342,7 @@ class "UiObject" { self.rect = Rectangle(0, 0, 0, 0) self.uuid = uuid() self.selected = false - self.order = math.random(1, 128) + self.order = math.random(1, 1024) end; onclick = function(self, button, x, y) end; @@ -403,7 +426,9 @@ function render_text(x, y, text) love.graphics.rectangle("fill", x, y, programming_font:getWidth(txt.text), fheight + 2); end - love.graphics.setColor(txt.color) + if txt.color then + love.graphics.setColor(txt.color) + end love.graphics.print(printed, x, y) x = x + programming_font:getWidth(printed) diff --git a/utils.lua b/utils.lua index ec4b5e0..d5ff427 100644 --- a/utils.lua +++ b/utils.lua @@ -49,6 +49,14 @@ function uuidv4() end) end +function random_str(n) + local str = "" + for i=1, n do + str = str .. string.char(math.random(0,25) + 0x41 + 0x20 * math.random(0, 1)) + end + return str +end + function revipairs(t) local max = 1 while t[max] ~= nil do @@ -89,13 +97,41 @@ class "Rectangle" { __lt = function(self, other) return self:intersects(other) end } +class "Stack" { + init = function(self) + self.data = {} + end; + + push = function(self, it) + table.insert(self.data, it) + end; + + pop = function(self) + local rt = table.remove(self.data) + return rt + end; + + at = function(self, x) + return self.data[#self.data - x] + end +} + +function scissor_points(x, y, w, h) + local nx, ny = love.graphics.transformPoint(x, y) + local tx, ty = love.graphics.transformPoint(w + x, h + y) + return nx, ny, tx - nx, ty - ny +end + return module { buffered_read = buffered_read; build_str = build_str; + random_str = random_str; uuidv4 = uuidv4; - revipairs = revipairs; + scissor_points = scissor_points; + Rectangle = Rectangle; + Stack = Stack; } -- 2.25.1