Skip to content

Instantly share code, notes, and snippets.

@GlueBalloon
Forked from JMV38/1aTabOrder
Last active April 10, 2021 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save GlueBalloon/a956c11cd936513b1257bb71e3650373 to your computer and use it in GitHub Desktop.
Save GlueBalloon/a956c11cd936513b1257bb71e3650373 to your computer and use it in GitHub Desktop.
Codea 2D Mesh Creator by Jmv38
--# ChoiceItem
ChoiceItem = class(XFC.MenuItem)
XFC.itemClass["choice"] = ChoiceItem
function ChoiceItem:init(data)
-- this item is a button to make choices
-- special fields of data:
-- data.choices = table of choice elements: {txt="comment",value=v,iconLetter=nil}
-- (iconLetter is optionnal)
-- data.currentValue : optionnal
-- data.tag : a str describing the variable
-- data.choiceCallback(v)
-- default icon (unless other required)
if data.iconLetter == nil then data.iconLetter = '?' end
-- shortcuts
local basicItem = XFC.itemClass["basic"]
local infoItem = XFC.itemClass["info"]
-- top item
self:setup(data)
-- information
local item = {}
item.parent = self
item.txt = data.txt
self.info = infoItem(item)
-- choices
self.choiceItems = {}
if self.choices == nil then
print("error : choices field missing!")
else
for _,choice in pairs(self.choices) do
local item = {}
item.parent = self
item.txt = choice.txt
item.value = choice.value
item.callback = function(s)
self.choiceCallback(choice.value)
self.currentValue = choice.value
self:update()
end
self.choiceItems[choice.value] = basicItem(item)
end
end
self:update()
end
function ChoiceItem:update()
self.disabled = false
if self.choices == nil then self.disabled = true end
if self.disabled then
self.callback = function() end
else
self.txt = self.tag .." : " .. tostring(self.currentValue)
self.info.txt = self.tag .." : " .. tostring(self.currentValue)
for _,choice in pairs(self.choices) do
local value = choice.value
local item = self.choiceItems[value]
if self.currentValue == value
then item.iconLetter = '◉'
else item.iconLetter = '○'
end
item:createIcon()
end
self.callback = XFC.MenuItem.callback
end
end
--# Decoder
Coder = class()
--This function encodes an image in two strings
--the first string makes a list of unique color settings (r,g,b,a), encoded as an 8 char hex string
--the second string runs through the image, through rows then columns, and every time the color changes,
--it records the color setting and number of cells that had that color
--NB it doesn't store the color setting as an 8 char hex string, imstead it stores the position of
--this color in the first string. This saves a lot of storage where colors are used over and over again
local
Codes="!#&~*+,)/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ-_`abcdefghijklmnopqrstuvwxyz"
-- 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
-- 1 2 3 4 5 6 7 8
function Coder:Encode(img)
local rows=img.height
local cols=img.width
local colors={} --hash table of unique colors, gives us their sequence in the unique list
local strCol="" --unique list of color settings, each one is 8 chars hex, for r,g,b,a
local str="" -- each item consists of a color setting (or rather, the position in strCol), and the number of
--cells to be colored
--for example, if the image starts with 56 cells with r=1,g=2,b=5,a=6, we will add the hex value of this,
--which is 001002005006, to strCol, and set colors[001002005006]=1, (1 because this is the first color)
--to str, we add the hex values of the string position, ie 1, and the number of cells, ie 56, so we will
--add 001038 to str
local colorCount=0
local prevColor=-1 --to tell us when the color changes
local count=0 --number of cells with current color
local r,g,b,a,x
local tbl={}
local tblCol={}
--loop through image
for i=1,cols do
for j=1,rows do
r,g,b,a=img:get(i,j)
x=r..","..g..","..b..","..a
if x==prevColor then
count=count+1
else --color has changed, store details of last color
if count>0 then --this will only be zero for the very first cell
y=colors[prevColor] --this looks up the position of the color, in the color list
if y==nil then --add the color to the list if not there
colorCount = colorCount + 1
y=colorCount
colors[prevColor]=colorCount
--if colorCount>1 then
--table.insert(tblCol,","..prevColor)
--else
table.insert(tblCol,prevColor)
--end
end
table.insert(tbl,y..","..count)
end
prevColor=x
count=1
end
if errMessage~=nil then break end
end
if errMessage~=nil then break end
end
--we've finished, but we may have some left over chars that need to be stored
if count>0 then
y=colors[prevColor]
if y==nil then
colorCount = colorCount + 1
colors[prevColor]=colorCount
y=colorCount
end
table.insert(tblCol,y)
table.insert(tbl,count)
end
str=table.concat(tbl,",")
strCol=table.concat(tblCol,",")
--create code for user
if errMessage~=nil then
print(errMessage)
return errMessage,errMessage
else
str1=Coder:Compress(strCol)
str2=Coder:Compress(str)
local final = Coder:PrintCode(cols,rows,str1,str2)
return final
end
end
function Coder:Compress(d)
local a={}
local m=0
local y,z
local x=string.gsub(d,"8","82")
x=string.gsub(x,"7","81")
x=string.gsub(x,"9","83")
x=string.gsub(x,",","7")
for i=1,#x,2 do
y=string.sub(x,i,i)*9
if i<#x then y=y+string.sub(x,i+1,i+1) else y=y+7 end
y=y+1
z=string.sub(Codes,y,y)
table.insert(a,z)
end
--return table.concat(a)
return self:concatN(table.concat(a),70)
end
local function splitString(s,n)
local out = {}
out[1] = ""
if #s <= n
then out[1] = s
else
for k = 1,math.ceil( #s/n ) do
out[k] = string.sub(s,(k-1)*n+1,k*n)
end
end
return out
end
function Coder:concatN(a,n)
local t = splitString(a,n)
local s = table.concat(t,'\n')
return s
end
function Coder:PrintCode(c,r,s1,s2)
local str =
"--image code\nimg=Decoder:Decode("..c..","..r
..',\n[[\n'..s1.. '\n]]\n,\n[[\n'..s2.. '\n]]\n)'
saveProjectTab("ImageCode",str)
return str
end
Decoder=class()
local
Codes="!#&~*+,)/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ-_`abcdefghijklmnopqrstuvwxyz"
-- 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
-- 1 2 3 4 5 6 7 8
function Decoder:Decode(cols,rows,cc,dd)
local img=image(cols,rows)
local n=0
local m=4
local arrCols={}
cc = string.gsub(cc,"\n","")
dd = string.gsub(dd,"\n","")
strCol=Decoder:Decompress(cc)
strDat=Decoder:Decompress(dd)
--unpack color descriptions
for q in string.gmatch(strCol,"[^,]+") do
m = m + 1
if m==5 then
m=1
n = n + 1
arrCols[n]={}
end
arrCols[n][m]=q
end
--if m~=4 then print("faulty column codes, m=",m) end
--unpack RLE content
local col=1
local row=0
local ind=1
n=0
for q in string.gmatch(strDat, "[^,]+") do
if ind==1 then
colIndex=tonumber(q)
else
colCount=tonumber(q)
n = n + 1
for u=1,colCount do
row = row + 1
if row>rows then col=col+1 row=1 end
img:set(col,row,
color(arrCols[colIndex][1],arrCols[colIndex][2],arrCols[colIndex][3],arrCols[colIndex][4]))
end
end
ind=3-ind
end
return img
end
function Decoder:Decompress(a)
local s={}
local d1,d2,y,x
for i=1,#a do
y=string.find(Codes,string.sub(a,i,i))-1
d2=y%9
d1=(y-d2)/9
d2=d2
table.insert(s,d1)
table.insert(s,d2)
end
if s[#s]==7 then table.remove(s,#s) end
str=table.concat(s)
x=string.gsub(str,"7",",")
x=string.gsub(x,"81","7")
x=string.gsub(x,"83","9")
x=string.gsub(x,"82","8")
return x
end
--# DotMesh
DotMesh = class()
-- mesh to display the touchable dots of the triangles
function DotMesh:init(parent,triangles)
self.parent = parent
self.triangles = triangles
self.texture = self:spot()
self:mode( self.parent:mode() )
end
function DotMesh:reset(triangles)
if triangles then self.triangles = triangles end
local triangles = self.triangles
local mode = self:mode()
if mode == "move" then self:resetPoints(triangles,"summits")
elseif mode == "move3" then self:resetPoints(triangles,"center")
elseif mode == "moveT" then self:resetPoints(triangles,"center")
elseif mode == "moveB" then self:resetPoints(triangles,"center")
elseif mode == "split2" then self:resetPoints(triangles,"faces")
elseif mode == "split3" then self:resetPoints(triangles,"center")
elseif mode == "split4" then self:resetPoints(triangles,"center")
elseif mode == "add" then self:resetPoints(triangles,"none")
elseif mode == "delete" then self:resetPoints(triangles,"center")
elseif mode == "color3" then self:resetPoints(triangles,"center")
elseif mode == "pickColor" then self:resetPoints(triangles,"center")
elseif mode == "view" then self:resetPoints(triangles,"none")
elseif mode == "new" then self:resetPoints(triangles,"none")
elseif mode == "newSquare" then self:resetPoints(triangles,"none")
else
self:resetPoints(triangles,"none")
end
end
function DotMesh:resetPoints(triangles,points)
local mode = self:mode()
local rect2tri = {}
local tri2rect = {}
self.rect2tri = rect2tri
self.tri2rect = tri2rect
local ms = mesh()
ms.texture = self.texture
self.ms = ms
if points == "none" then return end
local w,h = self.w,self.h
for _,t in pairs(triangles) do
if t.touchable then
local i = nil
local list = t[points]
if type(list) == "table" then
for _,v in ipairs(list) do
k = ms:addRect(v.x,v.y,w,h)
if i == nil then i = k end
end
else
local v = list
i = ms:addRect(v.x,v.y,w,h)
end
rect2tri[i] = t
tri2rect[t] = i
end
end
collectgarbage()
end
function DotMesh:triangleMove(t)
local i = self.tri2rect[t]
local ms = self.ms
local w,h = self.w,self.h
for k,v in ipairs(t.summits) do
ms:setRect(i+k-1, v.x, v.y, w, h)
end
end
function DotMesh:triangleMove3(t)
local i = self.tri2rect[t]
local ms = self.ms
local w,h = self.w,self.h
local v = t.center
ms:setRect(i, v.x, v.y, w, h)
end
function DotMesh:mode(str)
-- set mode to str; if no arg, simply return current mode
if str then
self.modeValue = str
self:reset()
end
return self.modeValue
end
function DotMesh:draw()
self.ms:draw()
end
-- image of the spot
function DotMesh:spot()
self.radius = 8
local w,h = self.radius*2, self.radius*2
self.w,self.h = w,h
local img = image(w,h)
setContext(img)
resetStyle()
background(0,0,0,0)
ellipseMode(RADIUS)
fill(0, 0, 0, 255)
ellipse(self.radius,self.radius,self.radius)
fill(255, 0, 0, 255)
ellipse(self.radius,self.radius,self.radius-2)
setContext()
return img
end
--# Drawing
Drawing = class()
-- manages the triangles, the triMesh and the dotMesh
function Drawing:init()
-- global positionning
self.DisplayModeShift = 0
self.x0, self.y0 = WIDTH/2, HEIGHT/2
-- mode settings
self.modeValue = "move"
-- current color
self:color( color(255, 0, 0, 255) )
-- the triangles
self.triangles = Triangles(self)
-- a shift to see the edges of the triangles
self.shiftMax = 3
self.shift = self.shiftMax
self:resetTriangles()
-- undo
self.undo = Undo(self)
-- memory management
self.mem = SlotManager(self)
-- user menu
self.menu = Menu(self)
end
function Drawing:reset()
self.triangles = Triangles(self)
self:resetTriangles()
end
--[[
function Drawing:load( meshTab )
loadstring( readProjectTab( meshTab ) )()
self.triangles = Triangles(self,ms0)
self:resetTriangles()
end
--]]
-- save load
function Drawing:loadSlot( slot )
self.triangles = Triangles(self, self.mem:getMesh(slot))
self:resetTriangles()
end
function Drawing:save( slot )
self.triMesh:save(slot)
end
-- undo
function Drawing:push()
self.undo:push(self.triMesh)
end
function Drawing:pop()
local ms = self.undo:pop()
if ms == nil then return end
self.triangles = Triangles(self, ms )
self:resetTriangles()
end
function Drawing:resetTriangles()
-- the triangle mesh
self.triMesh = TriMesh(self, self.triangles:getList(), self.shift)
-- the displayed dots
self.dotMesh = DotMesh(self, self.triangles:getList())
end
function Drawing:triangleMove(t)
self.triMesh:triangleMove(t)
self.dotMesh:triangleMove(t)
end
function Drawing:triangleMove3(t)
self.triMesh:triangleMove(t)
self.dotMesh:triangleMove3(t)
end
function Drawing:addBelow(v)
self.triangles:addBelow(v)
end
function Drawing:color(c)
if c ~= nil then
self.colorValue = c
_current_color = c
if self.menu then self.menu:changeColorButton( c ) end
end
return self.colorValue
end
function Drawing:triangleColor(t)
self.triMesh:triangleColor(t)
end
function Drawing:mode(str)
-- set mode to str; if no arg, simply return current mode
if str then
self.modeValue = str
self.dotMesh:mode(str)
self.triangles:mode(str)
self:resetTriangles()
end
return self.modeValue
end
function Drawing:setFullscreen(v)
local deltaX = - 275
if v == true then
if displayMode() == FULLSCREEN
then -- do nothing
else
displayMode(FULLSCREEN)
self.DisplayModeShift = 0
end
end
if v == false then
if displayMode() == STANDARD
then -- do nothing
else
displayMode(STANDARD)
self.DisplayModeShift = deltaX
end
end
end
function Drawing:draw()
local mode = self:mode()
if mode == "slots" then
self.mem:draw()
else
translate( self.DisplayModeShift , 0)
if self.preDraw then self:preDraw() end
if self.shiftMode then
translate(self.x0 + self.shiftX, self.y0 + self.shiftY)
else
translate(self.x0, self.y0)
end
if self.rotateMode then rotate(self.angle) end
if self.scaleMode then scale(self.scaleFactor) end
self.triMesh:draw()
self.dotMesh:draw()
self.triangles:draw()
if self.postDraw then self:postDraw() end
end
resetMatrix()
translate( self.DisplayModeShift , 0)
self.menu:draw()
end
function Drawing:touchedToShift(touch)
if touch.state == BEGAN then
self.shiftMode = true
self.shiftX = 0
self.shiftY = 0
self.touchX0 = touch.x
self.touchY0 = touch.y
elseif touch.state == MOVING then
self.shiftX = touch.x - self.touchX0
self.shiftY = touch.y - self.touchY0
else
self.shiftMode = false
self.shiftX = touch.x - self.touchX0
self.shiftY = touch.y - self.touchY0
self.triangles:shift(self.shiftX, self.shiftY)
end
end
function Drawing:touchedToRotate(touch)
if touch.state == BEGAN then
self.rotateMode = true
self.touchY0 = touch.y
self.angle = (touch.y - self.touchY0)/5
elseif touch.state == MOVING then
self.angle = (touch.y - self.touchY0)/5
else
self.rotateMode = false
self.angle = (touch.y - self.touchY0)/5
self.triangles:rotate(self.angle)
end
end
function Drawing:touchedToScale(touch)
if touch.state == BEGAN then
self.scaleMode = true
self.touchY0 = touch.y
self.scaleFactor = (touch.y - self.touchY0)/1000 + 1
elseif touch.state == MOVING then
self.scaleFactor = (touch.y - self.touchY0)/1000 + 1
else
self.scaleMode = false
self.triangles:scale(self.scaleFactor)
end
end
function Drawing:touched(touch)
-- new touch data corrected for translation
local rtouch = {}
rtouch.state = touch.state
rtouch.deltaX = touch.deltaX
rtouch.deltaY = touch.deltaY
rtouch.x = touch.x - self.DisplayModeShift
rtouch.y = touch.y
if self.menu:touched(rtouch) then return end
if self:mode() == "shift" then
self:touchedToShift(rtouch)
elseif self:mode() == "rotate" then
self:touchedToRotate(rtouch)
elseif self:mode() == "scale" then
self:touchedToScale(rtouch)
elseif self:mode() == "slots" then
self.mem:touched(rtouch)
else
-- new touch data corrected for mesh translation
rtouch.x = rtouch.x - self.x0
rtouch.y = rtouch.y - self.y0
self.triangles:touched(rtouch)
end
end
--# Icon
icons = {}
icons['move'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
75kkjkukmjkskojk-@tjkI@0jk7@I77@R77@I78I@I7@@R7@@I7<kmjktkmjk)@77skmjq
7@771kkjq7@77@@77skkjqI@I78@@I7skljk)@I7-@I7ukmjqI@I7I@0jkkojkkj)77@0j
lkkjkkkjlkk)7I@@7@@@7I@0jjkj)7@@g7@@0jlkljqI@R7ukljnkljk)@I7skljjtkljq
I@@7skjjkkjjq7@@71kjjq7@R7skjjk)@R7A@@R7<kljkkmjkkljjukljjkmjjkljk7@0j
kI@tjk-@g7A7@R7AI@@5
]]
)
icons['rotate'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
7A:kjjl)@I7A@@-7?kq77=kqI7tkjjq7@R7@@1jokljnkojjkljjkljjkljokljnkkjkkk
jnkljj)@I7-@@7@@@7-@I70kljnkojnkljj)@I7g@R7g@I70kljj-@R71kljjR@I72kmjj
@@R73kmjj)@R75kmjq7@-76kj-78I@1jkI@tjs@
]]
)
icons['zoom'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
7Ekl)7@@Bjkkl)7@@I7skljjR@I7@@I7skljjR@I7@@I7skljjR@I7@@I7skljjR@I7@@I
7skljjR@I7@@I7skljjR@I7@@I7skljjR@I7@@I7skljjR@I7@@I7skljjR@I7@@3jjR@I
7@@3jjR@I7@@3jjR@I7@@I7=kljkkljj7@g7skljkkljj7@g7skljkkljj7@R7ukljkklj
j7@-7tkljkkljj7@@77@I7skljkkljj7@@7@@I7@@@7@@I7@@I76kljjkkjkkljkkljjsk
njkkljkkljjtkmjkkljkkljjg@g7@@I7@@I76kojkkljkkl)7@@Bjkkl)E
]]
)
icons['undo'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
7tg@77Bkljktknjkg@sjkR@ujk@@1jk)@3jqI@sjkkj-7tkq77@@5jq@@sjkkj-7tkq77g
@sjj@@sjokq772kq77g@sjj@@sjokq772kq77g@sjj@@sjokq772kq77g@sjj@@9jj@@9j
j@@9jj@@9jjI@8@75kjg787@4k#
]]
)
icons['colors'] = Decoder:Decode(32,32,
[[
>->->->-)))>-)>-)>-))>->->-))>-7
]]
,
[[
71kq@7;kj@78@@RItkmjj-@@I4kkjj@@II6kljqI@II8@@I7tkmljtkkjq7@@R@@@I8@@@
7-@@RR@@I8@@@7R@7Rg@@I8@@77I@@Rskkljskkjkkkmq@@@I6kkjkkjmj)@@I6kkjjkjm
j7@@I5kkjjkjmj@@@I4kkjjkjmjI@@Iskq@77@7R3kjsjjkjmjI@unokkjjkjmjI@I-2kk
jjkjmj@@@-4kkjjkkmj7@@-3kkjkkkmj)@@-4kkjlkjmj)@@-4kjjmkkmq@@I-3kkjnkkm
q7@@-3kkjq7@@R-@I-2kkjq@@IRI@I-2kljqI@IR@@@-2kljj@@--1kkjj-@R-tkmjjtkj
@7;kq@3
]]
)
icons['fill'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7hI@g7=kklnkqI75kklj-@@73kjljskkjj@@7I8@@@71kjljukkjj)@7I0kq7II@770kjl
q7@I7R@RI@@770kjlokkjnkkjkkmjj)@7IR@I7-@R7@@I71knjokkjkkkjkkljk)@@7R@@
7@@I78@@@7g@@7@@I76kljq7@@7@@I74kkjj)@@7I@@72kkjj@@@7@@I70kkjjR@@7@@I7
tkkjjg@@77@I7skkjjtkmjq7@I78@@I7ukljjg@I71kljjR@I73kljjI@@75kljj7@@787
@I7ukkjjukljq7@@7:kljnkkjkI@R7@@@7>kojktkljI
]]
)
icons['picker'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
76g@-7A@@-7AI@R7<kjjnkmjk@@@7-@R7:kljnkmjk)@R7-@R79kmjnkmjokmjj)@R7-@R
7I@sjj)@R7-@R77@tjj7@R7-@g7@@R72kmjnkmjmkljjI@R7-@@7-@I74kmjlkkjnkmjj-
@R77@@7-@R787@g7R@g787@R7R@@77@-787@I7I@@7I@-75kljlkljmkmjjR@I7I@I7g@R
73kljkkmjq7@I73kj)7g@I73kj77g@@74knjkkmjmkljj-@I7R@-77@R7<kq@7>knl
]]
)
icons['M1'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7fkktjmkktjmkkljjk7@I7-@@I@78I@I7g@@II787@I7skkjjlljj-@I7tkkjklljjI@I7
ukkjllljj7@I70kkjmlljqI@I71kkjnlljq7@I72kkjolljnkljjI@@7slljlkljjR@@7t
lljjkljj-@@7ullkkjjg@@70lljjskkjqI@@II76kkjq@@I77II75kkjq7@I7III74kkjo
kljnlljjI@@7-@I7slljj@@@7R@I7ulljj7@@7I@I71lljj)@@7@@I73lljqI@@77@I75l
ljq@@-787II7skmjjtlljq7@I70lj@7skjlkR7sljISI
]]
)
icons['M3'] = Decoder:Decode(32,32,
[[
>->->->-)-)>->--)>-7
]]
,
[[
7utkmjktkq@7=kjI78I@@7-@0jj-@@70kj)70kkjj-@ujokkjk)@-7-@@7:kmjnkkjjllj
j-@R7skkjjlq@7tkmjqI@@77I2jkkmjj7@@77I@7gIujj@@@77I@7ukjlj)7skkjjlkjq7
@R7IIujmkkjjlkjnkmjj7IR7I@@77I@7R@R74lkjlkkjjlkjkkmjjRIR7I@@77I@@I74ln
jnkkjjlkkjjjRI-7skllkjj@I-70kllkjqII-73kjjjkjlkjq@IR78@I@7-I-79lkjklnj
kIIsjk-IR7A@I7u)
]]
)
icons['S2'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7fkljkuknjkskklkkljk-@@II@R7<kkjjlkjjknjk7@@77II7@@-78I@@7@I@7R@R78@@@
7@II7-@-75kkjllljokmjjR@@7III7tkmjj@@@7RII7tknjj)@@7-I@70knjq@@@7-II71
knjokkjolkjjI@R7-@@7gII73knjlkkjq7II73kmjlkkjq@I@71kojlkkjq@II7tkojnkk
jqII@7-@sjq7@@7ulljkkojj)@@70llknjj@@@70llkljjR@@7tkllkjjskkjoknjjukkj
mknjk7@@77@g7<kq77>kmjktkko)
]]
)
icons['S3'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7fkljkuknjkskklkkljk-@@II@R7<kkjjlkjjknjk7@@77II7@@-78I@@7@I@7R@R78@@@
7@II7-@-75kkjllljokmjjR@@7III7tkmjj@@@7RII7tknjj)@@7-I@70knjq@@@7-II71
knjokkjolj)7-@R7-@@7-I8I@I7I@@7-II7tlqI@@7I@@7RII74klljkkjlkkjmlljj@@g
7-@@7RI@70kq77skkjllljq@@g70kkjklljq7@g72kkjklkjokojjR@@77II7R@-787@@7
7I@7I@-78I@@II77@-7:kklkknjkI@@I7@R7>kmjktkko)
]]
)
icons['S4'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7fkljkuknjkskq77>kkjkknjkI@@7R@-7:kkjoknjjukkjq@@R78@@@70lkkljj-@@70ll
kljjR@@7tlnjjkmjj@@@7gIR77I@7@@-70kkjmlmjllkjmknjq@@@7@IR7-I@7g@-7g@@I
R7slkjq@@R7-@7II7ulkjqI@-7I@7II7ulkjj)@R7I@@IR7slkjq@@g7I@@7@II7gI@7g@
g7-@@7RII7RI@7I@sjq7@@7-II7II@77@g70kkjq7II77I@@-72kkjq@I-@I74kkjq@@g7
6kkjoknjjukkjmknjk7@@7@@-7<kq77>kmjktkko)
]]
)
icons['T'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
7uukkjl)@R7A@@g7?kkjjknjkR@@7R@I7<kkjnkmjk7@@7skmjjukkjqI@R787@@70kmjj
g@@72kmjjR@@74kmjj@@@76kljj7@@78@@I7ukkjjukmjq7@@7:kmjnkkjk7@-7R@@78I@
sjmkkjjskojq7@@74kojj)@@72kojj@@@70knjj-@@7tkojjg@@7-@g78I@@7I@g7:kq@7
=knjkskmjktkjo)
]]
)
icons['S'] = Decoder:Decode(32,32,
[[
>->->->-7))>-7
]]
,
[[
7fkktjmkktjmkktjmknjk)@I7R@g78I@I7R@I77@I78@@I7R@I7@@I787@I7R@I7I@I76k
ljmkljmkljj-@I7R@I7-@I74kljmkljokljjI@I7R@I7skljj@@I7R@I7tkljj7@I7R@I7
ukljj)@I7R@I70kljqI@I7R@I71kljq@@I7R@I72kljq7@I7R@I73kljokljmkljjR@I7-
@I7R@I75kljmkljmkljjg@I7I@I7R@I787@I7@@I7R@I78@@I77@I7R@I78I@g7R@I79kn
jmkktjmkktjmkktog
]]
)
icons['A'] = Decoder:Decode(32,32,
[[
>->->->-)))>->7))>-7
]]
,
[[
7fkktjmkktjmkkjk@@II77R@@7:kllkjmkkjk)@I77I@7R@@78I@I77I@7-@@78@@I7@I@
7-@@787@I7@I@7g@@76kljllkjokkjj-@I7II@7skkjjR@I7III7skkjjI@I7RI@7tkkjj
@@I7RI@7ukkjj7@I7-I@7ukkjj)@I7-I@70kkjqI@I7gI@70kkjq@@I7slkjj)@@7skljq
7I@71kkjokljq7II71kkjnkljq@I@72kkjmkljq@I@73kkjlkljqII@73kkjkkljqII@74
kkjjkljj)I@74knjj)I@75kmjolq775kklj-75kjlqItR
]]
)
icons['above'] = Decoder:Decode(32,32,
[[
>->->->->-))>-)))>-7
]]
,
[[
7Bkjjotlkjl)I-7A7ItjkRI@77Itjk7I@7RItjjtlkjq7IsjjgI@70lq773lkjlkkjq@Is
jj)I@7I@R7tlq77tlkjlknjj)Isjnlkjlkojj@I-7RI@7I@tjq@Ig7-I@7I@ujmlq77slk
jlkj)77Ig70lkjlkj@I@73lkjlkjI74lkjlkjR73lkjlkjg71lnkjsjj)I-@8@7ulljkkk
)7sljjmkk771kk78G
]]
)
icons['below'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7uukkjl)@-7A7@tjkR@@77@tjk7@@7R@tjjtkkjq7@sjjg@@70kq773kkjmljjq@@sjj)@
@7RI777I77tkq77tkkjmljjlljjqI@sjnkkjqII771knjmkkjlljjq7I@7g@g7-@@7II77
2kq77skkjjI@sjj)@@7II77skojjI@@7II77R@gI-71kkjokolqI7ukkjlkq7I2jq@@ulj
sjoknlk@7-@I7@I:jokjjmljtjjRI4jjtlj77:lq77>lljktlkqA7
]]
)
icons['save'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7Ekl)7@@Bjkkl)7@@Bjkkk@I7@sjkkkjj@@slkkq77@@@72kollkq77@@@72knlmkq77@@
@72kmlmkq@7@@@72kllmkqI7@@@72kkljR7@@@72kjlj-7@@@72ljg7@@@71ljsjkkkjj)
I8@7@@@77@uljtjkkkjjkj)I877@@@77@0jjljg7@@@77@0jjkjlj-7@@@72kkljR7@@@7
2kllmkqI7@@@72kmlmkq@7@@8IIR@sjkkk)II@sjkkk7I@@sjlkk7I7@sjmkktjnkksjok
kg7skk-E
]]
)
icons['floppy'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
7Ekl)7@@Bjkkl)7@@Bjkkl)7@@@72kjg7@@@72kjg7@@@72kjg7@@@72kjg7@@@72kjg7@
@@72kjg7@@@72kjg7@@@72kjg7@@@72kjg7@@@72kjg7@@@77@0jjkjg7@@@77@0jjkjg7
@@@77@0jjkjg7@@@77@0jjkjg7@@@72kjg7@@@72kjg7@@@72kjg7@@Bjkkl)7@@Bjlkku
jmkktjnkksjokkg7skk-E
]]
)
icons['load'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7Ekl)7@@Bjkkl)7@@Bjkkk7I7@tjkkkjj@@slkkq77@@@72kq7II@g7@@@72kq7IR@-7@@
@72kq@IR@R7@@@72kqIIR@I7@@@70ljg@@7@@@70ljskjjkkkjj)I8@7@@@70ljujjkkjj
)I8I77@@77@uljtjkkkjjkqII87@77@@@77@uljg@@7@@@77@0jjkqIIR@I7@@@72kq@IR
@R7@@@72kq7IR@-7@@@72kq7II@g7@@:lkkq77@@:ljkq@7@@Bjlkkujmkktjnkksjokkg
7skk-E
]]
)
icons['mesh'] = Decoder:Decode(32,32,
[[
>->->->-)))>-88788788@>->-))>-7
]]
,
[[
7_@@I7<kqI7I@775kjI7I@@70kqIIg@@7I@I7g@tlj)@@7I@R77@5lq@@@7@@@I7@-RR@R
R@@RIg@@7@@@I@@7Rg@@I@@@RI@RI-@@77@@I@@@R-@@II@7Rg@III@@77@@II@@RR@7IR
@@Rskllkkjjjkklmkkmkkklnkkmq@@R77@@IR@@R@@7IskkmqI@@77@@I-@RIsklmokmjj
kklnkmlq@@IRR@-77@@Ig@IIukkmkklmkkkjjkklnkllj)@-RR@@77@@IR@8@R-@@77@@I
I@gR0kmmmkkjjkklkkklkkjmjkkmq@@IR-@I77@@I7@@II@7R@@@Rskmmmkkjkkmlmkjml
klmnkkljkkmlkkjkkllnkjmmkkmnkklkkkmkkkjkkklokjmnklmlkkllkkmjkkjkkklokj
mokkmlkjlnkmjlkllmkjmq7@@R7@@Ig@I7R@III@7Rsknlq7@@7g@@I@@7Rukllq7@77tk
mmqI@1jj)@@R0kkjjukj@O
]]
)
icons['load'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7Ekl)7@@Bjkkl)7@@Bjkkk7I@@sjkkkjj@@sllkojkkkjj@@slmknjkkkjj@@slnkmjkkk
jqII6kljkkkjqII2jjlmkkjkkkjqII2jklmkjjkkkjqIII72lmjkkkjqIII73lmjjkkjqI
II74lljjkkjqIII75lkjjkkjjkq@II75lkjjkkjjkq@II74lljjkkjjkq@II73lmjjkkjj
kq@II72lmjkkkjqII2jklmkjjkkkjqII2jjlmkkjkkkjqII6kljkkk7I-@R7@@:lmknjkk
k7II@g7I@9lkkq77R@A@7-@A77g@?jq7@>lI
]]
)
icons['save'] = Decoder:Decode(32,32,
[[
>->->->-)))>->-))>-7
]]
,
[[
7Ekl)7@@Bjkkl)7@@BjkkjulkkqI7@@@72kmllkqI7@@@72kllmkqI7@@@72kklnkqI7@@
@72kjlokqI7@@@72lmjjlj@77@@71lmjklj@77@@70lmjllj@77@@7ulmjjRI@77@@7tlm
jj-I@77@@7slmjjgI@77@@77@gIR76lkjjkkjjkq7IR75lkjjkkjjkq@IR74lkjjkkjjkq
IIR7II2jjkkjj7IR7@I2jjkkjj@IR77I2jjkkjj@@7Ig@ujkkjgI-@ujkkjslmkqI7@@8@
II@ujlkjtlkkqI7R@A@7-@A77g@?jq7@>lI
]]
)
icons['reset'] = Decoder:Decode(32,32,
[[
>->->->-)))>-9)8J@97>-7
]]
,
[[
7;kmjktkojjukqII@@@74kjRI@@@71kq@Iskklkkmjkkj7I1kklkkmjkkq@I4kklmkkjkk
klk)@@IR@I77@@IukjIIR@I77@=lnkkjjkj7I1kklnkoljukklnknlk)@@I-@-I9kklokm
lk)@@Ig@?lokkgIg@RI9kklokmlk)@@Ig@RI9kklnkoljukklnkjRI1kklnkkslnkkjjkk
lqI@3lmkljjkklk)@@IR@I77@uljI@@IR@@7@@1lj7@@I@@R70kq@Ig@@I@@R73kjII@@@
78I@ulkkkjkg@g7?kmo
]]
)
icons['delete'] = Decoder:Decode(32,32,
[[
>->->->-)))>-9)8J@97>-7
]]
,
[[
7;kmjktkojjukqII@@@74kjRI@@@71kq@Iskklkkmjkkj7I1kklkkmjkkq@I4kklmkkjkk
klk)@@IR@I77@@IukjIIR@I77@=lnkkjjkj7I1kklnkoljukklnknlk)@@I-@-I9kklokm
lk)@@Ig@?lokkgIg@RI9kklokmlk)@@Ig@RI9kklnkoljukklnkjRI1kklnkkslnkkjjkk
lqI@3lmkljjkklk)@@IR@I77@uljI@@IR@@7@@1lj7@@I@@R70kq@Ig@@I@@R73kjII@@@
78I@ulkkkjkg@g7?kmo
]]
)
icons['lines'] = Decoder:Decode(32,32,
[[
>->->->-)))>-7
]]
,
[[
77@@7Bkkjjkjjktkkjjkljkg@@77@R7>kkjkkljkkkjl)@R7A@@R78I@@7ukkjkkkjj-@@
73kmjjI@@73kmjl)@@7@@770kkjjukljq@@@78I@R7skkjk)@I7@@77Ckljkukmjjkkjkt
kjjjkkjl)@@7<kljktkmjk-@77@@@7g@@787@R7ukkjjg@R7>kkjkkjjj@@@71knjjR@@7
1kljjg@@7skljjkjjk-@-7A7@R7<kmjktkmjkg@7B
]]
)
--# InfoItem
InfoItem = class(XFC.MenuItem)
XFC.itemClass["info"] = InfoItem
function InfoItem:init(data)
-- this item is a button to show / hide all item txt
-- default icon (unless other required)
if data.iconLetter == nil then data.iconLetter = 'ℹ' end
if data.tfont == nil then data.tfont = "AppleColorEmoji" end
data.fsize = 32
self:setup(data)
if self.txt == "" then self.txt = self.parent.txt end
self.callback = self.toggleAllInfos
end
function InfoItem:toggleAllInfos()
if self.displayTxt then self:hideAllTxt() else self:showAllTxt() end
if self.childrenVisible then self:hideChildren() else self:showChildren() end
end
--# Main
--Project: 2d mesh drawer
--Version: Alpha 2.0
--Comments: blabla
-- 2d mesh drawer
displayMode(FULLSCREEN)
-- Use this function to perform your initial setup
function setup()
drawing = Drawing()
if FPS then fps = FPS() end
end
-- This function gets called once every frame
function draw()
background(41, 41, 41, 255)
drawing:draw()
if fps then resetMatrix() fps:draw() end
end
function touched(touch)
-- if show then ms:touched(touch) end
drawing:touched(touch)
end
--# Menu
Menu = class()
function Menu:init(parent)
self.parent = parent
self:topMenu()
end
function Menu:draw()
self.root:draw()
end
function Menu:touched(touch)
return self.root:touched(touch)
end
function Menu:topMenu()
parameter.color("_current_color",color(255,0,0),
function(c)
self.parent:color(c)
end
)
parameter.action("close",
function()
self.parent:setFullscreen(true)
--self.parent:mode(self.previousMode)
end
)
-- root menu item (not displayed)
local data = {}
data.name = "root"
data.iconLetter = "R"
data.callback = function() end
local menu = MenuItem(data)
menu:show()
menu:hideIcon()
menu:hideTxt()
self.root = menu
-- information button
local data = {}
data.parent = "root"
data.txt = "Commands available to make the drawing:"
local info = InfoItem(data)
-- undo button
local data = {}
data.parent = "root"
data.txt = "Undo: revert to last save point (auto save @ each menu tap)"
data.iconLetter = "U"
data.iconImage = icons["undo"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:pop()
tween.delay(1,function()
button:select(false)
self.parent:mode("none")
end)
end
MenuItem(data)
self:moveMenu()
self:plusMenu()
local data = {}
data.parent = "root"
data.txt = "Delete: tap the red dot to delete a triangle"
data.iconLetter = "-"
data.iconImage = icons["delete"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("delete")
end
MenuItem(data)
self:colorMenu()
self:globalMenu()
self:saveLoadMenu()
local data = {}
data.parent = "root"
data.txt = "View: view the current mesh as it will be saved"
data.iconLetter = "V"
data.iconImage = icons["lines"]
data.callback = function(button)
button:select()
button:showChildren()
local mode = self.parent:mode()
if mode ~= "view" then
self.previousMode = mode
self.parent:mode("view")
else
self.parent:mode(self.previousMode)
end
end
MenuItem(data)
menu:showChildren()
info:hideAllTxt()
end
-- ####################################################################################
function Menu:saveLoadMenu()
-- menu to modify the mesh globally
local data = {}
data.parent = "root"
data.txt = "Save, Load or Reset the current mesh"
data.iconLetter = "S"
data.name = "saveLoad"
data.iconImage = icons["floppy"]
data.callback = function(button)
button:hideAllTxt()
button:select()
button:showChildren()
self.mem = self.parent.mem
self.parent:mode("slots")
end
MenuItem(data)
-- information button
local data = {}
data.parent = "saveLoad"
InfoItem(data)
local data = {}
data.parent = "saveLoad"
data.txt = "Load: 1/ tap this button then 2/ the slot to load from"
data.iconLetter = "L"
data.iconImage = icons["load"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("slots")
self.mem:action("load")
self.mem.menuDeselect = function()
button:select(false)
end
end
MenuItem(data)
local data = {}
data.parent = "saveLoad"
data.txt = "Save: 1/ tap this button then 2/ the slot to save to"
data.iconLetter = "S"
data.iconImage = icons["save"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:mode("slots")
self.mem:action("save")
self.mem.menuDeselect = function()
button:select(false)
end
end
MenuItem(data)
local data = {}
data.parent = "saveLoad"
data.txt = "Reset: restart the mesh"
data.iconLetter = "rst"
data.iconImage = icons["delete"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:reset()
tween.delay(1,function()
button:select(false)
self.parent:mode("none")
end)
end
MenuItem(data)
end
-- ####################################################################################
function Menu:globalMenu()
-- menu to modify the mesh globally
local data = {}
data.parent = "root"
data.txt = "Global: different tools to modify all triangles"
data.iconLetter = "[ ]"
data.iconImage = icons["mesh"]
data.name = "global"
data.callback = function(button)
button:hideAllTxt()
button:select()
button:showChildren()
self.parent:push()
self.parent:mode(self.globalLastMode)
end
MenuItem(data)
-- information button
local data = {}
data.parent = "global"
InfoItem(data)
--[[
local data = {}
data.parent = "global"
data.txt = "Select the triangle that will be modified"
data.iconLetter = "[ ]"
data.callback = function(button)
button:hideAllTxt()
button:select()
button:showChildren()
self.parent:mode("select")
self.globalLastMode = self.parent:mode()
end
data.onHide = function(button)
-- self.parent:resetSelection()
end
MenuItem(data)
--]]
local data = {}
data.parent = "global"
data.txt = "Move: drag the image to move the mesh"
data.iconLetter = "M"
data.iconImage = icons["move"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("shift")
self.globalLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "global"
data.txt = "Rotate: drag vertically to rotate the mesh"
data.iconLetter = "R"
data.iconImage = icons["rotate"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("rotate")
self.globalLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "global"
data.txt = "Scale: drag vertically to scale the mesh"
data.iconLetter = "S"
data.iconImage = icons["zoom"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("scale")
self.globalLastMode = self.parent:mode()
end
MenuItem(data)
end
-- ####################################################################################
function Menu:colorMenu()
-- menu to color individual triangles
local data = {}
data.parent = "root"
data.txt = "Different tools to color 1 triangle"
data.iconLetter = "C"
data.iconImage = icons["colors"]
data.name = "color"
data.callback = function(button)
button:hideAllTxt()
button:select()
button:showChildren()
self.parent:push()
self.parent:mode(self.colorLastMode)
end
MenuItem(data)
-- information button
local data = {}
data.parent = "color"
InfoItem(data)
local data = {}
data.parent = "color"
data.txt = "Fill: tap the red dot to fill the triangle with current color."
data.iconLetter = "F"
data.iconImage = icons["fill"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("color3")
self.colorLastMode = self.parent:mode()
end
local fillButton = MenuItem(data)
local data = {}
data.parent = "color"
data.txt = "Pick color: tap the red dot to copy the color of the rectangle"
data.iconLetter = "P"
data.iconImage = icons["picker"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("pickColor")
self.colorLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "color"
data.txt = "Choose current color in left panel then TAP AGAIN TO CLOSE"
data.iconLetter = "C"
data.bgcolor = _current_color
data.callback = function(button)
if displayMode() == STANDARD then
button:showChildren()
self.parent:setFullscreen(true)
--self.parent:mode(self.previousMode)
else
button:showChildren()
self.previousMode = self.parent:mode()
self.parent:mode("none")
self.parent:setFullscreen(false)
end
end
self.selectedColorButton = MenuItem(data)
-- special function to adjust button color to picked color
self.changeColorButton = function(button, c)
local b = self.selectedColorButton
b.bgcolor = _current_color
b:createIcon()
collectgarbage()
end
end
-- ####################################################################################
function Menu:moveMenu()
-- menu to move individual triangles
local data = {}
data.parent = "root"
data.txt = "Different methods to move 1 triangle"
data.iconLetter = "M"
data.iconImage = icons["move"]
data.name = "move1triangle"
data.callback = function(button)
button:hideAllTxt()
button:select()
button:showChildren()
self.parent:push()
self.parent:mode(self.TmoveLastMode)
end
local item = MenuItem(data)
item:select() -- initial setting
-- information button
local data = {}
data.parent = "move1triangle"
data.txt = "Commands available to move a triangle:"
InfoItem(data)
local data = {}
data.parent = "move1triangle"
data.txt = "Move: drag the red dots to move triangle summits"
data.iconLetter = "M1"
data.iconImage = icons["M1"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("move")
self.TmoveLastMode = self.parent:mode()
end
local moveButton = MenuItem(data)
moveButton:select() -- initial setting
self.TmoveLastMode = self.parent:mode() -- initial setting
local data = {}
data.parent = "move1triangle"
data.txt = "Move: drag the red dots to move triangle"
data.iconLetter = "M3"
data.iconImage = icons["M3"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("move3")
self.TmoveLastMode = self.parent:mode()
end
local moveButton = MenuItem(data)
local data = {}
data.parent = "move1triangle"
data.txt = "Move to Top: tap the red dots to move triangle above"
data.iconLetter = "T"
data.iconImage = icons["above"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("moveT")
self.TmoveLastMode = self.parent:mode()
end
local moveButton = MenuItem(data)
local data = {}
data.parent = "move1triangle"
data.txt = "Move to Bottom: tap the red dots to move triangle below"
data.iconLetter = "B"
data.iconImage = icons["below"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("moveB")
self.TmoveLastMode = self.parent:mode()
end
local moveButton = MenuItem(data)
return item
end
-- ####################################################################################
function Menu:plusMenu()
-- menu to add triangles
local data = {}
data.parent = "root"
data.txt = "Different methods to add 1 or more triangles"
data.iconLetter = "+"
data.name = "plus"
data.callback = function(button)
button:hideAllTxt()
button:select()
button:showChildren()
self.parent:push()
self.parent:mode(self.plusLastMode)
end
MenuItem(data)
-- information button
local data = {}
data.parent = "plus"
data.txt = "Choose one of these methods to add one or more triangles:"
local info = InfoItem(data)
local data = {}
data.parent = "plus"
data.txt = "Triangle: tap anywhere to add 1 triangle"
data.iconLetter = "T"
data.iconImage = icons["T"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("new")
self.plusLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "plus"
data.txt = "Square: tap anywhere to add 1 square"
data.iconLetter = "S"
data.iconImage = icons["S"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("newSquare")
self.plusLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "plus"
data.txt = "Add 1: tap outside the triangles to add 1 triangle, aside closest one"
data.iconLetter = "A1"
data.iconImage = icons["A"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("add")
self.plusLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "plus"
data.txt = "Split 2: tap the red dots slightly inside the triangle to split in 2"
data.iconLetter = "S2"
data.iconImage = icons["S2"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("split2")
self.plusLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "plus"
data.txt = "Split 3: tap the red dot to split a triangle in 3 parts"
data.iconLetter = "S3"
data.iconImage = icons["S3"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("split3")
self.plusLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "plus"
data.txt = "Split 4: tap the red dot to split a triangle in 4 parts"
data.iconLetter = "S4"
data.iconImage = icons["S4"]
data.callback = function(button)
button:select()
button:showChildren()
self.parent:push()
self.parent:mode("split4")
self.plusLastMode = self.parent:mode()
end
MenuItem(data)
local data = {}
data.parent = "plus"
data.txt = "Set position of insertion for next triangles"
data.choices = {
{txt = "next triangles will be on top", value = false},
{txt = "next triangles will be below", value = true}
}
data.tag = "Add next triangles below"
data.currentValue = false
data.iconLetter = "b"
data.iconImage = icons["below"]
data.choiceCallback = function(v)
self.parent:addBelow(v)
end
ChoiceItem(data)
end
--# MenuItem
MenuItem = class()
XFC = {}
XFC.MenuItem = MenuItem
XFC.MenuItemNames = {} -- a table to manage items via their names
XFC.itemClass = {} -- a table to store all various item classes
XFC.itemClass["basic"] = MenuItem
function MenuItem:init(data)
self:setup(data)
end
function MenuItem:setup(data)
-- generic menu item class
-- self.parent = otherMenuItem required
-- self.name = a string to access easily this item (optionnal)
-- self.iconLetter = a string (1 letter or emoticon, but more is possible)
-- self.iconImage = if not nil, an image to be used for icon
-- self.txt = data.txt a short text display aside the icon
-- self.permission: if present, then shown only if XFC[self.permission] is true
-- save all inputs
for i,v in pairs(data) do self[i]=v end
-- if parent defined by its name, then replace it by parent object
if self.parent and type(self.parent) == "string" then
local str = self.parent
self.parent = XFC.MenuItemNames[str]
if self.parent == nil then
print("error: the item name "..str.." is not registered")
end
end
-- all items must have a parent, except "root"
if self.parent then
self.parent:addChild(self) -- register to parent
else
if self.name ~= "root" then
print("error: menuItem "..tostring(self.name).." has no parent defined!")
end
end
-- register item in list
if self.name ~= nil then
if XFC.MenuItemNames[self.name] then
print("error: the item name "..self.name.." is already used")
end
XFC.MenuItemNames[self.name] = self
end
-- check other inputs to avoid errors
if self.iconLetter == nil then self.iconLetter = "" end
if self.txt == nil then self.txt = "" end
-- a table to store all children
self.children = {}
self.childrenVisible = false
-- draw and touch position is computed from parent position
self:computePosition()
self:hide()
self.selected = false
end
function MenuItem:valid()
-- ok by default (to be implemented by derived classes)
return true
end
function MenuItem:update()
self.disabled = false
end
function MenuItem:callback()
if self.disabled then return end
-- default callback: toggle children visibility on/off
if self.childrenVisible then self:hideChildren() else self:showChildren() end
self:hideAllTxt()
end
function MenuItem:createIcon()
local w,h = self.w,self.h
local dy = 0
local icon = image(w,w)
local tfont = self.tfont or "AmericanTypewriter-Bold"
local fsize = self.fsize or 28
local bgcolor = self.bgcolor or color(218, 218, 218, 255)
local tcolor = self.tcolor or color(0, 0, 0, 255)
if tfont == "AppleColorEmoji" then
tcolor = color(255, 255, 255, 255)
dy=-w/10
end
setContext(icon)
resetStyle() resetMatrix()
if self.iconImage then
spriteMode(CENTER)
background(bgcolor)
tint(bgcolor)
smooth()
sprite(self.iconImage,w/2,w/2)
else
background(bgcolor)
font(tfont)
fontSize(fsize)
fill(tcolor)
textMode(CENTER)
text(self.iconLetter,w/2,w/2+dy)
end
setContext()
self.icon = icon
end
function MenuItem:computePosition()
local w0,h0,w,h,dw,dh = 0,45,40,40,5,5
local x,y = WIDTH - w0,HEIGHT - h0
if self.parent then
if self.childIndex == 1 then
local pos = self.parent.position
x,y = pos.x,pos.y -- child start from parent
x = x - w - dw
y = y
else
local previousBrotherIndex = self.childIndex - 1
local pos = self.parent.children[previousBrotherIndex].position
x,y = pos.x,pos.y -- item starts from previous brother
x = x
y = y - h - dh
end
end
local mypos = vec2(x,y)
self.position = mypos
-- touch coordinates
self.tx, self.ty, self.tw, self.th = x+w/2, y+h/2, w/2, h/2
-- size definition
self.w0,self.h0,self.w,self.h,self.dw,self.dh = w0,h0,w,h,dw,dh
end
function MenuItem:show()
if self.permission and XFC[self.permission] == false then
self:hide()
return
end
-- these 2 variables are the same exactly, except inverted, but more clear for me
self.hidden = false
self.visible = true
-- self.icon = self:createIcon()
self:createIcon()
self:showIcon()
-- this is an animation
if self.parent then
local y = self.position.y
local ty = self.ty
local y0 = self.parent.position.y
local ty0 = self.parent.ty
self.position.y = y0
self.ty = ty0
local n = #self.parent.children
local duration = 0.5
if n<10 then duration = 0.4 *n/10 +0.1 end
tween(duration, self.position, {y=y})
tween(duration, self, {ty=ty})
end
end
function MenuItem:hide()
self.hidden = true
self.visible = false
self:hideChildren()
self:hideTxt()
self.icon = nil -- free memory from this image
if self.onHide then self:onHide() end
collectgarbage()
end
-- details
function MenuItem:showIcon()
self.displayIcon = true
end
function MenuItem:hideIcon()
self.displayIcon = false
end
function MenuItem:showTxt()
self.displayTxt = true
-- a little animation
end
function MenuItem:hideTxt()
self.displayTxt = false
end
function MenuItem:showAllTxt()
local p = self.parent
if p then
for _,child in pairs(p.children) do child:showTxt() end
end
end
function MenuItem:hideAllTxt()
local p = self.parent
if p then
for _,child in pairs(p.children) do child:hideTxt() end
end
end
function MenuItem:select(value)
if value == nil or value == true then
local p = self.parent
if p then
for _,child in pairs(p.children) do
child.selected = false
end
end
self.selected = true
elseif value == false then
self.selected = false
end
end
function MenuItem:tabExist(tabName)
local list = listProjectTabs()
local exist = false
for i,name in pairs(list) do if name==tabName then exist = true end end
return exist
end
function MenuItem:eraseAllTheseFields(fields)
for _,field in pairs(fields) do self[field] = nil end
for _,child in pairs(self.children) do child:eraseAllTheseFields(fields) end
end
function MenuItem:updateField(field,value)
self[field] = value
for _,child in pairs(self.children) do child:updateField(field,value) end
end
-- children functions
function MenuItem:addChild(item)
table.insert(self.children,item)
item.childIndex = #self.children
end
function MenuItem:removeChildren()
self.children = {}
end
function MenuItem:updateChildren()
for _,child in pairs(self.children) do child:update() end
end
function MenuItem:showChildren()
-- compute dynamic position
self:shiftChildrenUp()
-- show children
if #self.children > 0 then
self.childrenVisible = true
for _,child in pairs(self.children) do child:show() end
-- self.children[1]:showAllTxt()
else
self.childrenVisible = false
end
-- hide children of other items
local p = self.parent
if p then
for _,child in pairs(p.children) do
if child ~= self then child:hideChildren() end
end
end
end
function MenuItem:hideChildren()
self.childrenVisible = false
for _,child in pairs(self.children) do child:hide() end
end
function MenuItem:shiftChildrenUp(shift)
-- if no children, return
local n = #self.children
if n == 0 then return end
-- if no problem, return
local lastChild = self.children[n]
local yn = lastChild.position.y
local ymin = 30
if yn > ymin and shift==nil then return end
-- compute shift if not provided
local forced = (shift ~= nil)
if not forced then
shift = ymin - yn
local y0 = HEIGHT - self.h0
local firstChild = self.children[1]
local y1 = firstChild.position.y
if y1 + shift > y0 then shift = y0-y1 end
end
-- apply this shift to children
for _,child in pairs(self.children) do
local newy = child.position.y + shift
local newty = child.ty + shift
child.position.y = newy
child.ty = newty
child:shiftChildrenUp(shift)
end
end
-- draw functions
function MenuItem:drawIcon()
local position = self.position
local x,y = position.x, position.y
noSmooth() noStroke()
spriteMode(CORNER)
if self.disabled then tint(200)
elseif self.selected then tint(255, 231, 0, 255)
else tint(255) end
sprite(self.icon,x,y)
tint(255)
end
function MenuItem:drawTxt()
local position = self.position
local w,h = 600,40
local x,y = position.x - w -5, position.y
if x<0 then w = w + x - 5 ; x = 5 end
rectMode(CORNER)
textMode(CORNER)
if self.disabled then
fill(192)
else
fill(238)
end
rect(x,y,w,h)
font("ArialMT")
fontSize(18)
fill(0, 0, 0, 255)
text(self.txt,x+5,y+10)
end
function MenuItem:draw()
if self.hidden then return end
if self.displayIcon then self:drawIcon() end
if self.displayTxt then self:drawTxt() end
if self.childrenVisible then
for _,child in pairs(self.children) do child:draw() end
end
end
function MenuItem:touched(touch)
local touchIntercepted = false
if self.hidden then return touchIntercepted end
local x,y = touch.x, touch.y
local abs = math.abs
-- check if item touched
if abs(x- self.tx)<self.tw and abs(y- self.ty)<self.th then
if touch.state == BEGAN then
self:callback(touch)
end
touchIntercepted = true
else
touchIntercepted = false
end
-- or if its children touched
if self.childrenVisible then
for _,child in pairs(self.children) do
if not touchIntercepted
then touchIntercepted = child:touched(touch) end
end
end
return touchIntercepted
end
--# Mesh1
ms1 = mesh()
ms1.vertices = {
vec3(-219.571686, 104.566360, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-218.737442, 179.694946, 0.000000),
vec3(189.411102, 148.075897, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(151.351685, 69.740204, 0.000000),
vec3(-209.565704, -53.979797, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-211.506454, -126.866577, 0.000000),
vec3(189.411102, 148.075897, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(145.082336, 259.125244, 0.000000),
vec3(128.632812, -138.636505, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(174.067062, -69.819870, 0.000000),
vec3(-144.361420, 223.765411, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-53.058029, 168.018738, 0.000000),
vec3(53.790123, 282.314301, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-22.603785, 211.152710, 0.000000),
vec3(-144.361420, 223.765411, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-218.737442, 179.694946, 0.000000),
vec3(53.790123, 282.314301, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(145.082336, 259.125244, 0.000000),
vec3(-219.571686, 104.566360, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-183.916550, 28.713135, 0.000000),
vec3(-110.686813, -167.099045, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-41.955685, -142.319366, 0.000000),
vec3(10.966793, -234.629791, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(46.610764, -277.925354, 0.000000),
vec3(186.087067, -11.027695, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(133.181335, 32.446251, 0.000000),
vec3(186.087067, -11.027695, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(174.067062, -69.819870, 0.000000),
vec3(128.632812, -138.636505, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(47.842583, -108.256622, 0.000000),
vec3(-110.686813, -167.099045, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-211.506454, -126.866577, 0.000000),
vec3(-209.565704, -53.979797, 0.000000),
vec3(-21.249115, 22.687412, 0.000000),
vec3(-166.706787, 1.075752, 0.000000),
}
ms1.colors = {
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(45, 143, 28, 255),
color(45, 143, 28, 255),
color(45, 143, 28, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(38, 255, 0, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
color(42, 210, 13, 255),
}
--# Mesh2
ms2 = mesh()
ms2.vertices = {
vec3(246.000000, -248.000000, 0.000000),
vec3(-341.333344, -256.000000, 0.000000),
vec3(-341.333344, 256.000000, 0.000000),
vec3(246.000000, -248.000000, 0.000000),
vec3(251.000000, 257.000000, 0.000000),
vec3(-341.333344, 256.000000, 0.000000),
vec3(-219.000000, 206.000000, 0.000000),
vec3(-40.000000, 56.000000, 0.000000),
vec3(156.000000, 206.000000, 0.000000),
vec3(-280.000000, -159.000000, 0.000000),
vec3(-111.000000, -13.000000, 0.000000),
vec3(-289.000000, 151.000000, 0.000000),
vec3(23.000000, 14.000000, 0.000000),
vec3(198.000000, -143.000000, 0.000000),
vec3(191.000000, 178.000000, 0.000000),
vec3(-241.000000, -208.000000, 0.000000),
vec3(154.000000, -206.000000, 0.000000),
vec3(-38.000000, -56.000000, 0.000000),
}
ms2.colors = {
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
}
--# Mesh3
ms3 = mesh()
ms3.vertices = {
vec3(-102.441963, -116.527771, 0.000000),
vec3(-150.834610, 142.056366, 0.000000),
vec3(43.103443, 178.350845, 0.000000),
vec3(-73.033836, -164.944305, 0.000000),
vec3(120.904221, -128.649796, 0.000000),
vec3(40.127319, -54.553272, 0.000000),
vec3(134.981216, -100.581345, 0.000000),
vec3(86.588562, 158.002747, 0.000000),
vec3(54.204308, -26.484818, 0.000000),
vec3(62.015175, 153.403961, 0.000000),
vec3(-83.530228, -141.474640, 0.000000),
vec3(29.630924, -31.083603, 0.000000),
}
ms3.colors = {
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
color(150, 84, 84, 255),
}
--# mesh4
ms4 = mesh()
ms4.vertices = {
vec3(341.333344, -256.000000, 0.000000),
vec3(-341.333344, -256.000000, 0.000000),
vec3(-341.333344, 256.000000, 0.000000),
vec3(341.333344, -256.000000, 0.000000),
vec3(341.333344, 256.000000, 0.000000),
vec3(-341.333344, 256.000000, 0.000000),
}
ms4.colors = {
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
}
--# Mesh5
ms5 = mesh()
ms5.vertices = {
vec3(-126.000000, -42.000000, 0.000000),
vec3(-100.000000, 293.000000, 0.000000),
vec3(-77.000000, 339.000000, 0.000000),
vec3(-126.000000, -42.000000, 0.000000),
vec3(-82.000000, -54.000000, 0.000000),
vec3(-77.000000, 339.000000, 0.000000),
vec3(-33.000000, -241.000000, 0.000000),
vec3(-315.000000, -134.000000, 0.000000),
vec3(-14.000000, -110.000000, 0.000000),
vec3(-14.000000, -110.000000, 0.000000),
vec3(377.000000, -52.000000, 0.000000),
vec3(-358.000000, -30.000000, 0.000000),
vec3(360.000000, -160.000000, 0.000000),
vec3(-33.000000, -241.000000, 0.000000),
vec3(-14.000000, -110.000000, 0.000000),
vec3(-198.000000, -215.000000, 0.000000),
vec3(-315.000000, -134.000000, 0.000000),
vec3(-33.000000, -241.000000, 0.000000),
vec3(-358.000000, -30.000000, 0.000000),
vec3(-14.000000, -110.000000, 0.000000),
vec3(-315.000000, -134.000000, 0.000000),
vec3(-14.000000, -110.000000, 0.000000),
vec3(377.000000, -52.000000, 0.000000),
vec3(360.000000, -160.000000, 0.000000),
vec3(-38.000000, 228.000000, 0.000000),
vec3(303.000000, -31.000000, 0.000000),
vec3(-75.000000, 337.000000, 0.000000),
vec3(-46.000000, 53.000000, 0.000000),
vec3(303.000000, -31.000000, 0.000000),
vec3(-79.000000, -4.000000, 0.000000),
vec3(-38.000000, 228.000000, 0.000000),
vec3(303.000000, -31.000000, 0.000000),
vec3(-34.000000, 149.000000, 0.000000),
vec3(-46.000000, 53.000000, 0.000000),
vec3(303.000000, -31.000000, 0.000000),
vec3(-34.000000, 149.000000, 0.000000),
vec3(-366.000000, 7.000000, 0.000000),
vec3(-238.000000, 16.000000, 0.000000),
vec3(-113.000000, 288.000000, 0.000000),
}
ms5.colors = {
color(97, 72, 31, 255),
color(97, 72, 31, 255),
color(97, 72, 31, 255),
color(97, 72, 31, 255),
color(97, 72, 31, 255),
color(97, 72, 31, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
color(255, 255, 255, 255),
}
--# Mesh6
ms6 = mesh()
ms6.vertices = {
vec3(341.333344, -256.000000, 0.000000),
vec3(-341.333344, -256.000000, 0.000000),
vec3(-341.333344, 256.000000, 0.000000),
vec3(341.333344, -256.000000, 0.000000),
vec3(341.333344, 256.000000, 0.000000),
vec3(-341.333344, 256.000000, 0.000000),
vec3(-41.000000, 11.000000, 0.000000),
vec3(91.000000, -228.000000, 0.000000),
vec3(-79.000000, 220.000000, 0.000000),
vec3(48.000000, 13.000000, 0.000000),
vec3(87.000000, 220.000000, 0.000000),
vec3(-79.000000, 220.000000, 0.000000),
vec3(10.000000, -36.000000, 0.000000),
vec3(-253.000000, -82.000000, 0.000000),
vec3(-255.000000, 82.000000, 0.000000),
vec3(7.000000, 47.000000, 0.000000),
vec3(264.000000, -83.000000, 0.000000),
vec3(-255.000000, 82.000000, 0.000000),
vec3(7.000000, 47.000000, 0.000000),
vec3(264.000000, -83.000000, 0.000000),
vec3(260.000000, 84.000000, 0.000000),
vec3(10.000000, -36.000000, 0.000000),
vec3(264.000000, -83.000000, 0.000000),
vec3(-255.000000, 82.000000, 0.000000),
vec3(-41.000000, 11.000000, 0.000000),
vec3(91.000000, -228.000000, 0.000000),
vec3(-69.000000, -226.000000, 0.000000),
vec3(48.000000, 13.000000, 0.000000),
vec3(91.000000, -228.000000, 0.000000),
vec3(-79.000000, 220.000000, 0.000000),
}
ms6.colors = {
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(200, 200, 200, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
color(255, 0, 0, 255),
}
--# Mesh7
ms7 = mesh()
ms7.vertices = {
vec3(-38.481995, -156.420944, 0.000000),
vec3(-81.621475, -34.791557, 0.000000),
vec3(59.209717, -152.452118, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(26.855103, 95.599991, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(193.893143, -92.759102, 0.000000),
vec3(142.964584, -87.965828, 0.000000),
vec3(188.029022, -144.063843, 0.000000),
vec3(254.535706, 171.094086, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(284.493744, 82.418472, 0.000000),
vec3(-73.803696, 27.295807, 0.000000),
vec3(26.855103, 95.599991, 0.000000),
vec3(-25.870895, 213.035248, 0.000000),
vec3(110.000000, -271.000000, 0.000000),
vec3(59.209717, -152.452118, 0.000000),
vec3(138.298782, -138.072235, 0.000000),
vec3(-92.976791, -236.334320, 0.000000),
vec3(-155.346710, -28.574684, 0.000000),
vec3(52.000000, -247.000000, 0.000000),
vec3(-143.306244, 101.591568, 0.000000),
vec3(-7.896149, -41.008362, 0.000000),
vec3(-155.346710, -28.574684, 0.000000),
vec3(81.977791, 232.208313, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(170.653397, 222.621826, 0.000000),
vec3(262.923981, 21.304199, 0.000000),
vec3(279.700439, -33.818474, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(-143.306244, 101.591568, 0.000000),
vec3(-73.803696, 27.295807, 0.000000),
vec3(-25.870895, 213.035248, 0.000000),
vec3(-7.896149, -41.008362, 0.000000),
vec3(26.855103, 95.599991, 0.000000),
vec3(-73.803696, 27.295807, 0.000000),
vec3(81.977791, 232.208313, 0.000000),
vec3(-25.870895, 213.035248, 0.000000),
vec3(26.855103, 95.599991, 0.000000),
vec3(214.264572, -35.239784, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(81.977791, 232.208313, 0.000000),
vec3(26.855103, 95.599991, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(-7.896149, -41.008362, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(26.855103, 95.599991, 0.000000),
vec3(-25.870895, 213.035248, 0.000000),
vec3(-143.306244, 101.591568, 0.000000),
vec3(-57.027252, 411.956116, 0.000000),
vec3(170.653397, 222.621826, 0.000000),
vec3(81.977791, 232.208313, 0.000000),
vec3(149.083649, 377.204956, 0.000000),
vec3(245.000000, -184.000000, 0.000000),
vec3(257.000000, -260.000000, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(-7.896149, -41.008362, 0.000000),
vec3(137.100464, -139.270569, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(197.000000, -279.000000, 0.000000),
vec3(122.000000, -212.000000, 0.000000),
vec3(191.862946, -238.358765, 0.000000),
vec3(52.000000, -247.000000, 0.000000),
vec3(59.209717, -152.452118, 0.000000),
vec3(110.000000, -271.000000, 0.000000),
vec3(-7.896149, -41.008362, 0.000000),
vec3(138.298782, -138.072235, 0.000000),
vec3(59.209717, -152.452118, 0.000000),
vec3(254.535706, 171.094086, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(170.653397, 222.621826, 0.000000),
vec3(261.384003, 21.304199, 0.000000),
vec3(282.953796, 82.418472, 0.000000),
vec3(202.666367, 27.295807, 0.000000),
vec3(52.000000, -247.000000, 0.000000),
vec3(-38.481995, -156.420944, 0.000000),
vec3(59.209717, -152.452118, 0.000000),
vec3(-155.346710, -28.574684, 0.000000),
vec3(-81.621475, -34.791557, 0.000000),
vec3(-38.481995, -156.420944, 0.000000),
vec3(-7.896149, -41.008362, 0.000000),
vec3(59.209717, -152.452118, 0.000000),
vec3(-81.621475, -34.791557, 0.000000),
vec3(92.069626, 32.548218, 0.000000),
vec3(181.284668, 28.171631, 0.000000),
vec3(86.683060, 68.234238, 0.000000),
vec3(211.957840, 28.171677, 0.000000),
vec3(260.399902, 35.241516, 0.000000),
vec3(274.068787, 71.290009, 0.000000),
vec3(188.029022, -144.063843, 0.000000),
vec3(228.000000, -124.000000, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(191.862946, -238.358765, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(170.330765, -161.158051, 0.000000),
vec3(193.893143, -92.759102, 0.000000),
vec3(210.244064, -82.381813, 0.000000),
vec3(185.662140, -54.886658, 0.000000),
vec3(210.244064, -82.381813, 0.000000),
vec3(279.700439, -33.818474, 0.000000),
vec3(222.495575, -73.112228, 0.000000),
vec3(228.000000, -124.000000, 0.000000),
vec3(193.893143, -92.759102, 0.000000),
vec3(188.029022, -144.063843, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(142.964584, -87.965828, 0.000000),
vec3(193.893143, -92.759102, 0.000000),
vec3(137.100464, -139.270569, 0.000000),
vec3(188.029022, -144.063843, 0.000000),
vec3(142.964584, -87.965828, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(193.893143, -92.759102, 0.000000),
vec3(185.662140, -54.886658, 0.000000),
vec3(228.000000, -124.000000, 0.000000),
vec3(210.244064, -82.381813, 0.000000),
vec3(193.893143, -92.759102, 0.000000),
vec3(222.495575, -73.112228, 0.000000),
vec3(185.662140, -54.886658, 0.000000),
vec3(210.244064, -82.381813, 0.000000),
vec3(210.244064, -82.381813, 0.000000),
vec3(279.700439, -33.818474, 0.000000),
vec3(228.000000, -124.000000, 0.000000),
vec3(188.029022, -144.063843, 0.000000),
vec3(137.100464, -139.270569, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(257.000000, -260.000000, 0.000000),
vec3(197.000000, -279.000000, 0.000000),
vec3(191.862946, -238.358765, 0.000000),
vec3(110.000000, -271.000000, 0.000000),
vec3(122.000000, -212.000000, 0.000000),
vec3(197.000000, -279.000000, 0.000000),
vec3(138.298782, -138.072235, 0.000000),
vec3(191.862946, -238.358765, 0.000000),
vec3(122.000000, -212.000000, 0.000000),
vec3(137.100464, -139.270569, 0.000000),
vec3(191.862946, -238.358765, 0.000000),
vec3(170.330765, -161.158051, 0.000000),
vec3(257.000000, -260.000000, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(191.862946, -238.358765, 0.000000),
vec3(202.209137, -190.798279, 0.000000),
vec3(170.330765, -161.158051, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(245.000000, -184.000000, 0.000000),
vec3(228.000000, -124.000000, 0.000000),
vec3(189.000000, -189.000000, 0.000000),
vec3(214.264572, -35.239784, 0.000000),
vec3(204.206314, 27.295807, 0.000000),
vec3(279.700439, -33.818474, 0.000000),
vec3(214.264572, -35.239784, 0.000000),
vec3(279.700439, -33.818474, 0.000000),
vec3(222.495575, -73.112228, 0.000000),
vec3(214.264572, -35.239784, 0.000000),
vec3(148.828705, -36.661072, 0.000000),
vec3(222.495575, -73.112228, 0.000000),
vec3(183.985321, -90.784607, 0.000000),
vec3(271.000000, -100.000000, 0.000000),
vec3(207.357361, 48.302780, 0.000000),
}
ms7.colors = {
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
}
--# Mesh8
ms8 = mesh()
ms8.vertices = {
vec3(-105.369003, -193.742996, 0.000000),
vec3(-181.279938, -100.716736, 0.000000),
vec3(-28.795603, -228.113205, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(-32.024002, 29.630581, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(117.032372, -163.480835, 0.000000),
vec3(61.889671, -158.290955, 0.000000),
vec3(110.682983, -219.030838, 0.000000),
vec3(182.692825, 122.205139, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(215.129776, 26.191973, 0.000000),
vec3(-172.815323, -33.491898, 0.000000),
vec3(-32.024002, 29.630581, 0.000000),
vec3(-120.916267, 167.616699, 0.000000),
vec3(37.695450, -322.072327, 0.000000),
vec3(-28.795603, -228.113205, 0.000000),
vec3(56.837776, -212.543457, 0.000000),
vec3(-179.014008, -200.541000, 0.000000),
vec3(-105.369003, -193.742996, 0.000000),
vec3(-87.241005, -353.496002, 0.000000),
vec3(-248.068878, 46.951542, 0.000000),
vec3(-101.454140, -107.447960, 0.000000),
vec3(-243.595001, -91.773003, 0.000000),
vec3(-4.143560, 188.376328, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(91.869637, 177.996567, 0.000000),
vec3(191.775238, -39.979279, 0.000000),
vec3(209.939835, -99.663124, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(-248.068878, 46.951542, 0.000000),
vec3(-172.815323, -33.491898, 0.000000),
vec3(-120.916267, 167.616699, 0.000000),
vec3(-101.454140, -107.447960, 0.000000),
vec3(-32.024002, 29.630581, 0.000000),
vec3(-172.815323, -33.491898, 0.000000),
vec3(-4.143560, 188.376328, 0.000000),
vec3(-120.916267, 167.616699, 0.000000),
vec3(-32.024002, 29.630581, 0.000000),
vec3(139.089417, -101.202057, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(-4.143560, 188.376328, 0.000000),
vec3(-32.024002, 29.630581, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(-101.454140, -107.447960, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(-32.024002, 29.630581, 0.000000),
vec3(-120.916267, 167.616699, 0.000000),
vec3(-248.068878, 46.951542, 0.000000),
vec3(-154.650650, 382.997528, 0.000000),
vec3(91.869637, 177.996567, 0.000000),
vec3(-4.143560, 188.376328, 0.000000),
vec3(68.515053, 345.370758, 0.000000),
vec3(172.368103, -262.271576, 0.000000),
vec3(155.697189, -314.698181, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(-101.454140, -107.447960, 0.000000),
vec3(55.540321, -213.840988, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(101.804382, -353.742950, 0.000000),
vec3(37.695450, -322.072327, 0.000000),
vec3(88.434647, -296.142975, 0.000000),
vec3(-21.710264, -304.565765, 0.000000),
vec3(-28.795603, -228.113205, 0.000000),
vec3(37.695450, -322.072327, 0.000000),
vec3(-101.454140, -107.447960, 0.000000),
vec3(56.837776, -212.543457, 0.000000),
vec3(-28.795603, -228.113205, 0.000000),
vec3(182.692825, 122.205139, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(91.869637, 177.996567, 0.000000),
vec3(190.107788, -39.979279, 0.000000),
vec3(213.462402, 26.191973, 0.000000),
vec3(126.531540, -33.491898, 0.000000),
vec3(-21.710264, -304.565765, 0.000000),
vec3(-105.369003, -193.742996, 0.000000),
vec3(-28.795603, -228.113205, 0.000000),
vec3(-243.595001, -91.773003, 0.000000),
vec3(-181.279938, -100.716736, 0.000000),
vec3(-105.369003, -193.742996, 0.000000),
vec3(-101.454140, -107.447960, 0.000000),
vec3(-28.795603, -228.113205, 0.000000),
vec3(-181.279938, -100.716736, 0.000000),
vec3(6.783340, -27.804867, 0.000000),
vec3(103.380569, -32.543594, 0.000000),
vec3(0.951050, 10.834019, 0.000000),
vec3(137.461487, -31.673880, 0.000000),
vec3(186.020935, -35.637486, 0.000000),
vec3(204.711868, 15.012306, 0.000000),
vec3(110.682983, -219.030838, 0.000000),
vec3(153.961411, -197.306824, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(88.434647, -296.142975, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(92.300316, -240.477432, 0.000000),
vec3(117.032372, -163.480835, 0.000000),
vec3(134.736237, -152.244888, 0.000000),
vec3(108.120293, -122.474602, 0.000000),
vec3(134.736237, -152.244888, 0.000000),
vec3(209.939835, -99.663124, 0.000000),
vec3(148.001511, -142.208267, 0.000000),
vec3(153.961411, -197.306824, 0.000000),
vec3(117.032372, -163.480835, 0.000000),
vec3(110.682983, -219.030838, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(61.889671, -158.290955, 0.000000),
vec3(117.032372, -163.480835, 0.000000),
vec3(55.540321, -213.840988, 0.000000),
vec3(110.682983, -219.030838, 0.000000),
vec3(61.889671, -158.290955, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(117.032372, -163.480835, 0.000000),
vec3(108.120293, -122.474602, 0.000000),
vec3(153.961411, -197.306824, 0.000000),
vec3(134.736237, -152.244888, 0.000000),
vec3(117.032372, -163.480835, 0.000000),
vec3(148.001511, -142.208267, 0.000000),
vec3(108.120293, -122.474602, 0.000000),
vec3(134.736237, -152.244888, 0.000000),
vec3(134.736237, -152.244888, 0.000000),
vec3(209.939835, -99.663124, 0.000000),
vec3(153.961411, -197.306824, 0.000000),
vec3(110.682983, -219.030838, 0.000000),
vec3(55.540321, -213.840988, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(155.697189, -314.698181, 0.000000),
vec3(101.804382, -353.742950, 0.000000),
vec3(88.434647, -296.142975, 0.000000),
vec3(-21.710264, -304.565765, 0.000000),
vec3(37.695450, -322.072327, 0.000000),
vec3(101.804382, -353.742950, 0.000000),
vec3(56.837776, -212.543457, 0.000000),
vec3(88.434647, -296.142975, 0.000000),
vec3(37.695450, -322.072327, 0.000000),
vec3(55.540321, -213.840988, 0.000000),
vec3(88.434647, -296.142975, 0.000000),
vec3(92.300316, -240.477432, 0.000000),
vec3(155.697189, -314.698181, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(88.434647, -296.142975, 0.000000),
vec3(110.082352, -271.402710, 0.000000),
vec3(92.300316, -240.477432, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(172.368103, -262.271576, 0.000000),
vec3(153.961411, -197.306824, 0.000000),
vec3(115.494301, -261.352020, 0.000000),
vec3(139.089417, -101.202057, 0.000000),
vec3(128.198914, -33.491898, 0.000000),
vec3(209.939835, -99.663124, 0.000000),
vec3(139.089417, -101.202057, 0.000000),
vec3(209.939835, -99.663124, 0.000000),
vec3(148.001511, -142.208267, 0.000000),
vec3(139.089417, -101.202057, 0.000000),
vec3(68.239021, -102.740929, 0.000000),
vec3(148.001511, -142.208267, 0.000000),
vec3(106.304710, -161.342972, 0.000000),
vec3(200.519531, -171.320923, 0.000000),
vec3(131.610687, -10.746678, 0.000000),
vec3(153.083267, -222.778809, 0.000000),
vec3(32.675129, -262.095764, 0.000000),
vec3(27.926273, -235.256836, 0.000000),
vec3(-210.397903, 82.402145, 0.000000),
vec3(-156.311249, 96.511719, 0.000000),
vec3(-155.135391, 250.541260, 0.000000),
vec3(-182.413010, -338.766998, 0.000000),
vec3(-179.014008, -200.541000, 0.000000),
vec3(-87.241005, -353.496002, 0.000000),
vec3(-243.595001, -91.773003, 0.000000),
vec3(-105.369003, -193.742996, 0.000000),
vec3(-179.014008, -200.541000, 0.000000),
vec3(-21.710264, -304.565765, 0.000000),
vec3(-87.241005, -353.496002, 0.000000),
vec3(-105.369003, -193.742996, 0.000000),
}
ms8.colors = {
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
}
--# Mesh9
ms9 = mesh()
ms9.vertices = {
vec3(-128.773865, -180.060287, 0.000000),
vec3(-201.039932, -91.500671, 0.000000),
vec3(-55.877106, -212.780167, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(82.948929, -151.251129, 0.000000),
vec3(30.453899, -146.310455, 0.000000),
vec3(76.904404, -204.133896, 0.000000),
vec3(145.456696, 120.717636, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(176.336212, 29.314533, 0.000000),
vec3(-192.981781, -27.503618, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(-143.574646, 163.948776, 0.000000),
vec3(7.421368, -302.227844, 0.000000),
vec3(-55.877106, -212.780167, 0.000000),
vec3(25.644575, -197.958038, 0.000000),
vec3(-198.882797, -186.531876, 0.000000),
vec3(-128.773865, -180.060287, 0.000000),
vec3(-111.516235, -332.142792, 0.000000),
vec3(-264.622009, 49.077347, 0.000000),
vec3(-125.046936, -97.908691, 0.000000),
vec3(-260.362823, -82.986359, 0.000000),
vec3(66.000000, 104.000000, 0.000000),
vec3(-35.000000, 201.000000, 0.000000),
vec3(58.994385, 173.830261, 0.000000),
vec3(154.102997, -33.679504, 0.000000),
vec3(177.089935, -108.516060, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(-264.622009, 49.077347, 0.000000),
vec3(-192.981781, -27.503618, 0.000000),
vec3(-143.574646, 163.948776, 0.000000),
vec3(-125.046936, -97.908691, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(-192.981781, -27.503618, 0.000000),
vec3(-35.000000, 201.000000, 0.000000),
vec3(-143.574646, 163.948776, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(103.946930, -91.962677, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(66.000000, 104.000000, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(-125.046936, -97.908691, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(-143.574646, 163.948776, 0.000000),
vec3(-264.622009, 49.077347, 0.000000),
vec3(-175.689240, 368.988129, 0.000000),
vec3(58.994385, 173.830261, 0.000000),
vec3(-35.000000, 201.000000, 0.000000),
vec3(36.761169, 333.167908, 0.000000),
vec3(135.627716, -245.298462, 0.000000),
vec3(119.757271, -295.207764, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(-125.046936, -97.908691, 0.000000),
vec3(24.409416, -199.193268, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(68.452118, -332.377838, 0.000000),
vec3(7.421368, -302.227844, 0.000000),
vec3(55.724323, -277.543549, 0.000000),
vec3(-49.131973, -285.561829, 0.000000),
vec3(-55.877106, -212.780167, 0.000000),
vec3(7.421368, -302.227844, 0.000000),
vec3(-125.046936, -97.908691, 0.000000),
vec3(25.644575, -197.958038, 0.000000),
vec3(-55.877106, -212.780167, 0.000000),
vec3(145.456696, 120.717636, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(58.994385, 173.830261, 0.000000),
vec3(152.922455, -35.306801, 0.000000),
vec3(175.155685, 27.687244, 0.000000),
vec3(91.775040, -28.362831, 0.000000),
vec3(-49.131973, -285.561829, 0.000000),
vec3(-128.773865, -180.060287, 0.000000),
vec3(-55.877106, -212.780167, 0.000000),
vec3(-260.362823, -82.986359, 0.000000),
vec3(-201.039932, -91.500671, 0.000000),
vec3(-128.773865, -180.060287, 0.000000),
vec3(-125.046936, -97.908691, 0.000000),
vec3(-55.877106, -212.780167, 0.000000),
vec3(-201.039932, -91.500671, 0.000000),
vec3(-22.006500, -22.089653, 0.000000),
vec3(69.952614, -26.600840, 0.000000),
vec3(-27.558754, 14.693989, 0.000000),
vec3(94.215981, -31.210594, 0.000000),
vec3(153.146820, -21.611530, 0.000000),
vec3(162.910583, 13.782120, 0.000000),
vec3(76.904404, -204.133896, 0.000000),
vec3(118.104820, -183.452942, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(55.724323, -277.543549, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(59.404381, -224.550766, 0.000000),
vec3(82.948929, -151.251129, 0.000000),
vec3(99.802757, -140.554672, 0.000000),
vec3(74.464767, -112.213821, 0.000000),
vec3(101.773361, -116.907295, 0.000000),
vec3(177.089935, -108.516060, 0.000000),
vec3(94.324142, -143.987106, 0.000000),
vec3(118.104820, -183.452942, 0.000000),
vec3(82.948929, -151.251129, 0.000000),
vec3(76.904404, -204.133896, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(30.453899, -146.310455, 0.000000),
vec3(82.948929, -151.251129, 0.000000),
vec3(24.409416, -199.193268, 0.000000),
vec3(76.904404, -204.133896, 0.000000),
vec3(30.453899, -146.310455, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(82.948929, -151.251129, 0.000000),
vec3(74.464767, -112.213821, 0.000000),
vec3(118.104820, -183.452942, 0.000000),
vec3(99.802757, -140.554672, 0.000000),
vec3(82.948929, -151.251129, 0.000000),
vec3(112.431076, -130.999969, 0.000000),
vec3(74.464767, -112.213821, 0.000000),
vec3(99.802757, -140.554672, 0.000000),
vec3(99.802757, -140.554672, 0.000000),
vec3(177.089935, -108.516060, 0.000000),
vec3(118.104820, -183.452942, 0.000000),
vec3(76.904404, -204.133896, 0.000000),
vec3(24.409416, -199.193268, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(119.757271, -295.207764, 0.000000),
vec3(68.452118, -332.377838, 0.000000),
vec3(55.724323, -277.543549, 0.000000),
vec3(-49.131973, -285.561829, 0.000000),
vec3(7.421368, -302.227844, 0.000000),
vec3(68.452118, -332.377838, 0.000000),
vec3(25.644575, -197.958038, 0.000000),
vec3(55.724323, -277.543549, 0.000000),
vec3(7.421368, -302.227844, 0.000000),
vec3(24.409416, -199.193268, 0.000000),
vec3(55.724323, -277.543549, 0.000000),
vec3(59.404381, -224.550766, 0.000000),
vec3(119.757271, -295.207764, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(55.724323, -277.543549, 0.000000),
vec3(76.332611, -253.991165, 0.000000),
vec3(59.404381, -224.550766, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(135.627716, -245.298462, 0.000000),
vec3(118.104820, -183.452942, 0.000000),
vec3(81.484711, -244.423035, 0.000000),
vec3(109.333389, -93.578621, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(177.089935, -108.516060, 0.000000),
vec3(105.102921, -86.576225, 0.000000),
vec3(177.089935, -108.516060, 0.000000),
vec3(113.587105, -125.613503, 0.000000),
vec3(103.946930, -91.962677, 0.000000),
vec3(36.498390, -93.427658, 0.000000),
vec3(112.431076, -130.999969, 0.000000),
vec3(73.813644, -140.597595, 0.000000),
vec3(150.000000, -169.000000, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(117.268837, -207.701965, 0.000000),
vec3(2.642082, -245.131104, 0.000000),
vec3(-1.878746, -219.580841, 0.000000),
vec3(-228.759796, 82.825768, 0.000000),
vec3(-177.270157, 96.257889, 0.000000),
vec3(-176.150681, 242.891647, 0.000000),
vec3(-202.118591, -318.120911, 0.000000),
vec3(-198.882797, -186.531876, 0.000000),
vec3(-111.516235, -332.142792, 0.000000),
vec3(-260.362823, -82.986359, 0.000000),
vec3(-128.773865, -180.060287, 0.000000),
vec3(-198.882797, -186.531876, 0.000000),
vec3(-49.131973, -285.561829, 0.000000),
vec3(-111.516235, -332.142792, 0.000000),
vec3(-128.773865, -180.060287, 0.000000),
vec3(150.000000, -169.000000, 0.000000),
vec3(141.978577, -125.415215, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(-57.000000, -130.000000, 0.000000),
vec3(-27.000000, -168.000000, 0.000000),
vec3(24.000000, -149.000000, 0.000000),
vec3(66.000000, 104.000000, 0.000000),
vec3(91.368225, -26.735537, 0.000000),
vec3(58.994385, 173.830261, 0.000000),
vec3(66.000000, 104.000000, 0.000000),
vec3(-58.950485, 32.588032, 0.000000),
vec3(-35.000000, 201.000000, 0.000000),
}
ms9.colors = {
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(223, 207, 170, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(0, 0, 0, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(141, 132, 111, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(34, 30, 66, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
color(39, 31, 100, 255),
}
--# SlotManager
SlotManager = class()
-- class to manage memory slots
function SlotManager:init(parent)
self.parent = parent
self:prepare()
end
function SlotManager:prepare()
local positions = {}
local meshes = {}
local names = {}
local stepX, stepY = WIDTH/4, HEIGHT/4
self.stepY = stepY
for c =1,3 do
for r =1,3 do
local k = c + (r-1)*3
local dx, dy = c*stepX, HEIGHT - r*stepY
positions[k] = vec2(dx,dy)
names[k] = "ms"..tostring(k)
meshes[k] = _G[ names[k] ]
end
end
self.positions = positions
self.meshes = meshes
self.names = names
end
function SlotManager:getMesh(slot)
return self.meshes[slot]
end
function SlotManager:draw()
self:drawMeshes()
self:drawNames()
end
function SlotManager:drawMeshes()
for k = 1,9 do
local p = self.positions[k]
local ms = self.meshes[k]
resetMatrix()
translate(p.x,p.y)
scale(1/4)
ms:draw()
end
end
function SlotManager:drawNames()
pushStyle()
textMode(CENTER)
fill(255, 255, 255, 255)
for k = 1,9 do
local p = self.positions[k]
local str = self.names[k]
resetMatrix()
translate(p.x, p.y -self.stepY/2)
text(str)
end
popStyle()
end
function SlotManager:action(str)
if str then
self.actionValue = str
self.selectedSlot = nil
elseif str == false then
self.actionValue = nil
self.selectedSlot = nil
end
return self.actionValue
end
function SlotManager:touched(touch)
if touch.state == BEGAN then
local abs = math.abs
local t = vec2(touch.x,touch.y)
local dx,dy = WIDTH/10, HEIGHT/10
for k = 1,9 do
local p = self.positions[k] - t
if abs(p.x)<dx and abs(p.y)<dy then
self.selectedSlot = k
end
end
if self.selectedSlot then
if self.actionValue == "load" then
self.parent:loadSlot(self.selectedSlot)
self.parent:mode("none")
self.menuDeselect()
self:action(false)
elseif self.actionValue == "save" then
self.parent:save(self.selectedSlot)
local k = self.selectedSlot
self.meshes[k] = _G["ms"..tostring(k)]
self.parent:mode("slots")
self.menuDeselect()
self:action(false)
end
end
end
end
--# Triangle
Triangle = class()
-- one triangle
function Triangle:init(parent,x1,y1,x2,y2,x3,y3)
self.parent = parent
-- points of the triangle
self.summits = {}
self.faces = {}
self.center = nil
self:setPosition(x1,y1,x2,y2,x3,y3)
-- colors of the summits
local c = color(200) -- default value
self:setColors(c,c,c)
-- touch management
self.isTouched = false
self.touchedPoint = nil
self.touchable = true
end
local abs = math.abs
function Triangle:setPosition(x1,y1,x2,y2,x3,y3)
self.summits[1] = vec2(x1,y1)
self.summits[2] = vec2(x2,y2)
self.summits[3] = vec2(x3,y3)
self.faces[1] = vec2( (x1+x2)/2, (y1+y2)/2 )
self.faces[2] = vec2( (x3+x2)/2, (y3+y2)/2 )
self.faces[3] = vec2( (x1+x3)/2, (y1+y3)/2 )
self.center = vec2( (x1+x2+x3)/3, (y1+y2+y3)/3 )
end
function Triangle:setColors(c1,c2,c3)
self.colors = {}
self.colors[1] = c1
self.colors[2] = c2
self.colors[3] = c3
end
function Triangle:shrinkSummits(shift)
-- compute the scaling, to have about required shift
local avg = 0
local center = self.center
for i,v in pairs(self.summits) do avg = avg + (v - center):len() end
avg = avg / 3
local s = 1 - shift/avg
-- apply scaling
local newSummits = {}
local dv = center - center*s
for i,v in pairs(self.summits) do
newSummits[i] = v * s + dv
end
return newSummits
end
-- ############ ACTIONS #############
function Triangle:changeColors(c1,c2,c3)
self:setColors(c1,c2,c3)
self.parent:triangleColor(self)
end
function Triangle:delete()
self.parent:delete(self)
self.parent:resetTriangles()
end
function Triangle:split2()
-- f1 = s12, f2 = s23, f3 = s31
local p1,p2,p3,q1,q2,q3
local s = self.summits
local f = self.faces
local c1,c2,c3 = unpack(self.colors)
if self.touchedPoint == 1 then
p1,p2,p3 = f[1],s[1],s[3]
q1,q2,q3 = f[1],s[2],s[3]
elseif self.touchedPoint == 2 then
p1,p2,p3 = f[2],s[1],s[2]
q1,q2,q3 = f[2],s[1],s[3]
elseif self.touchedPoint == 3 then
p1,p2,p3 = f[3],s[2],s[3]
q1,q2,q3 = f[3],s[2],s[1]
end
self:setPosition(p1.x,p1.y,p2.x,p2.y,p3.x,p3.y)
self.parent:add(q1.x,q1.y,q2.x,q2.y,q3.x,q3.y,c1,c2,c3)
self.parent:resetTriangles()
end
function Triangle:split3()
local p1,p2,p3,q1,q2,q3
local s = self.summits
local f = self.faces
local c = self.center
local c1,c2,c3 = unpack(self.colors)
p1,p2,p3 = unpack(s)
self:setPosition(p1.x, p1.y, p2.x, p2.y, c.x, c.y)
self.parent:add(p2.x, p2.y, p3.x, p3.y, c.x, c.y, c1,c2,c3)
self.parent:add(p3.x, p3.y, p1.x, p1.y, c.x, c.y, c1,c2,c3)
self.parent:resetTriangles()
end
function Triangle:split4()
local p1,p2,p3,q1,q2,q3
local s = self.summits
local f = self.faces
local c = self.center
local c1,c2,c3 = unpack(self.colors)
p1,p2,p3 = unpack(s)
q1,q2,q3 = unpack(f)
self:setPosition(q1.x, q1.y, q2.x, q2.y, q3.x, q3.y)
self.parent:add(p1.x, p1.y, q1.x, q1.y, q3.x, q3.y, c1,c2,c3)
self.parent:add(p2.x, p2.y, q2.x, q2.y, q1.x, q1.y, c1,c2,c3)
self.parent:add(p3.x, p3.y, q3.x, q3.y, q2.x, q2.y, c1,c2,c3)
self.parent:resetTriangles()
end
function Triangle:move(touch)
local s = self.summits
s[ self.touchedPoint ] = vec2(touch.x,touch.y)
local p1,p2,p3 = s[1],s[2],s[3]
self:setPosition(p1.x,p1.y,p2.x,p2.y,p3.x,p3.y)
self.parent:triangleMove(self)
end
function Triangle:move3(touch)
local s = self.summits
local dx,dy = touch.deltaX, touch.deltaY
local p1,p2,p3 = s[1],s[2],s[3]
self:setPosition(p1.x+dx ,p1.y+dy ,p2.x+dx ,p2.y+dy ,p3.x+dx ,p3.y+dy )
self.parent:triangleMove3(self)
end
local function rot(p,angle)
local v = vec2(p.x, p.y):rotate(angle)
return v
end
function Triangle:rotate(angle)
local a = math.rad(angle)
local p1,p2,p3 = unpack( self.summits )
p1,p2,p3 = rot(p1,a), rot(p2,a), rot(p3,a)
self:setPosition(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y)
self.parent:resetTriangles()
end
function Triangle:moveToTop(touch)
self.parent:moveToTop(self)
end
function Triangle:moveToBottom(touch)
self.parent:moveToBottom(self)
end
function Triangle:add1triangle(touch)
-- find the 2 closest summits
local p1,p2,p3 = unpack( self.summits )
local c1,c2,c3 = unpack(self.colors)
local p = vec2(touch.x, touch.y)
local ref = self.center - p
local d1 = (p1-p):dot(ref)
local d2 = (p2-p):dot(ref)
local d3 = (p3-p):dot(ref)
if (d1<d3) and (d2<d3) then
self.parent:add(p1.x, p1.y, p2.x, p2.y, p.x, p.y, c1,c2,c3)
elseif (d2<d1) and (d3<d1) then
self.parent:add(p3.x, p3.y, p2.x, p2.y, p.x, p.y, c1,c2,c3)
else
self.parent:add(p3.x, p3.y, p1.x, p1.y, p.x, p.y, c1,c2,c3)
end
self.parent:resetTriangles()
end
-- ############ TESTS #############
-- return true if point p is touched
function Triangle:hit(p,touch)
local mode = self.parent:mode()
local dist
if mode == "move" then dist = 20
elseif mode == "split2" then dist = 20
else dist = 20
end
return abs(p.x-touch.x)<dist and abs(p.y-touch.y)<dist
end
-- returns true if touch is inside triangle
function Triangle:inside(touch)
local t = vec2(touch.x, touch.y)
local v1,v2,v3 = unpack(self.summits)
local s1 = (v2-v1):cross(t-v1)
local s2 = (v3-v2):cross(t-v2)
local s3 = (v1-v3):cross(t-v3)
local out = (s1>0 and s2>0 and s3>0) or (s1<0 and s2<0 and s3<0)
return out
end
function Triangle:isSummitTouched(touch)
local isTouched = false
for i,v in pairs( self.summits ) do
if self:hit(v,touch) then
-- register touch on which point
isTouched = true
self.touchedPoint = i
end
end
return isTouched
end
function Triangle:isFaceTouched(touch)
local isTouched = false
for i,v in pairs( self.faces ) do
if self:hit(v,touch) and self:inside(touch) then
-- register touch on which point
isTouched = true
self.touchedPoint = i
end
end
return isTouched
end
function Triangle:isCenterTouched(touch)
local isTouched = false
isTouched = self:hit(self.center, touch)
return isTouched
end
-- ############ TOUCH #############
function Triangle:touchedToMoveT(touch)
if touch.state == BEGAN and self:isCenterTouched(touch) and self.parent:ready() then
self:moveToTop()
self.parent:ready(false)
end
end
function Triangle:touchedToMoveB(touch)
if touch.state == BEGAN and self:isCenterTouched(touch) and self.parent:ready() then
self:moveToBottom()
self.parent:ready(false)
end
end
function Triangle:touchedToMove3(touch)
if touch.state == BEGAN then
self.isTouched = self:isCenterTouched(touch)
elseif touch.state == MOVING then
if self.isTouched then self:move3(touch) end
else -- ENDED or CANCELLED
if self.isTouched then self.isTouched = false end
end
end
function Triangle:touchedToMoveSummit(touch)
if touch.state == BEGAN then
self.isTouched = self:isSummitTouched(touch)
elseif touch.state == MOVING then
if self.isTouched then self:move(touch) end
else -- ENDED or CANCELLED
if self.isTouched then self.isTouched = false end
end
end
function Triangle:touchedToSplit2(touch)
if touch.state == BEGAN then
if self:isFaceTouched(touch) and self.parent:ready() then
self:split2()
self.parent:ready(false)
end
elseif touch.state == MOVING then
else -- ENDED or CANCELLED
end
end
function Triangle:touchedToSplit3(touch)
if touch.state == BEGAN then
if self:isCenterTouched(touch) and self.parent:ready() then
self:split3()
self.parent:ready(false)
end
elseif touch.state == MOVING then
else -- ENDED or CANCELLED
end
end
function Triangle:touchedToSplit4(touch)
if touch.state == BEGAN then
if self:isCenterTouched(touch) and self.parent:ready() then
self:split4()
self.parent:ready(false)
end
elseif touch.state == MOVING then
else -- ENDED or CANCELLED
end
end
function Triangle:touchedToDelete(touch)
if touch.state == BEGAN then
if self:isCenterTouched(touch) and self.parent:ready() then
self:delete()
self.parent:ready(false)
end
end
end
function Triangle:touchedToColor3(touch)
if touch.state == BEGAN or touch.state == MOVING then
if self:isCenterTouched(touch) then
local c = self.parent:color()
self:changeColors(c,c,c)
end
end
end
function Triangle:touchedToPick(touch)
if touch.state == BEGAN then
if self:isCenterTouched(touch) then
local c = self.colors[1]
self.parent:color(c)
end
end
end
function Triangle:touchedToAdd(touch)
local min = math.min
if touch.state == BEGAN and self.parent:ready() and not self:inside(touch) then
-- compute min distance
local p1,p2,p3 = unpack( self.summits )
local p = vec2(touch.x, touch.y)
local d1 = (p1-p):len()
local d2 = (p2-p):len()
local d3 = (p3-p):len()
local d = min(d1+d2, d2+d3, d3+d1)
self.parent:shortestDistance(self, d)
end
end
function Triangle:touched(touch)
if self.touchable then
local mode = self.parent:mode()
if mode == "move" then self:touchedToMoveSummit(touch)
elseif mode == "move3" then self:touchedToMove3(touch)
elseif mode == "moveT" then self:touchedToMoveT(touch)
elseif mode == "moveB" then self:touchedToMoveB(touch)
elseif mode == "split2" then self:touchedToSplit2(touch)
elseif mode == "split3" then self:touchedToSplit3(touch)
elseif mode == "split4" then self:touchedToSplit4(touch)
elseif mode == "add" then self:touchedToAdd(touch)
elseif mode == "delete" then self:touchedToDelete(touch)
elseif mode == "color3" then self:touchedToColor3(touch)
elseif mode == "pickColor" then self:touchedToPick(touch)
end
end
end
--# Triangles
Triangles = class()
-- all the triangles
function Triangles:init(parent,ms)
self.parent = parent
self:mode( self.parent:mode() )
self.list = {}
if ms == nil then
self:initSquare()
else
self:initFromMesh(ms)
end
self:ready(true)
end
function Triangles:initSquare()
local w,h = WIDTH/3, HEIGHT/3
self:add(w,-h,-w,-h,-w,h)
self:add(w,-h,w,h,-w,h)
end
function Triangles:initFromMesh(ms)
local n = #ms.vertices
local p1,p2,p3, c1,c2,c3, k
for i = 1,n/3 do
k = (i-1)*3
p1 = ms:vertex(k+1)
p2 = ms:vertex(k+2)
p3 = ms:vertex(k+3)
c1 = ms:color(k+1)
c2 = ms:color(k+2)
c3 = ms:color(k+3)
self:add(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, c1,c2,c3)
end
end
function Triangles:add(x1,y1,x2,y2,x3,y3, c1,c2,c3)
local t = Triangle(self,x1,y1,x2,y2,x3,y3)
if c1 and c2 and c3 then
t:setColors(c1,c2,c3)
end
if self.addBelowBoolean then
table.insert(self.list,1,t)
else
table.insert(self.list,t)
end
end
function Triangles:addBelow(value)
if self.addBelowBoolean == nil then self.addBelowBoolean = false end
if value == true then self.addBelowBoolean = true
elseif value == false then self.addBelowBoolean = false
end
return self.addBelowBoolean
end
function Triangles:delete(t)
for i,v in pairs(self.list) do
if v == t then table.remove(self.list,i) end
end
end
function Triangles:moveToTop(t)
self:delete(t)
table.insert(self.list,t)
self.parent:resetTriangles()
end
function Triangles:moveToBottom(t)
self:delete(t)
table.insert(self.list,1,t)
self.parent:resetTriangles()
end
function Triangles:color(t)
return self.parent:color(t)
end
function Triangles:triangleMove(t)
self.parent:triangleMove(t)
end
function Triangles:triangleMove3(t)
self.parent:triangleMove3(t)
end
function Triangles:triangleColor(t)
self.parent:triangleColor(t)
end
function Triangles:resetTriangles()
self.parent:resetTriangles()
end
function Triangles:shortestDistance(t,d)
if self.minDist == nil or d < self.minDist then
self.minDist = d
self.closestTriangle = t
end
end
function Triangles:mode(str)
-- set mode to str; if no arg, simply return current mode
if str then self.modeValue = str end
return self.modeValue
end
function Triangles:ready(b)
-- set mode to str; if no arg, simply return current state
if b == true then self.readyValue = b
elseif b == false then self.readyValue = b
tween.delay(0.5, function() self:ready(true) end)
end
return self.readyValue
end
function Triangles:getList()
return self.list
end
function Triangles:shift(dx,dy)
local dv = vec2(dx,dy)
for _,t in pairs(self.list) do
local p1,p2,p3 = unpack( t.summits )
p1,p2,p3 = p1+dv, p2+dv, p3+dv
t:setPosition(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y)
end
self.parent:resetTriangles()
end
local function rot(p,angle)
local v = vec2(p.x, p.y):rotate(angle)
return v
end
function Triangles:rotate(angle)
local a = math.rad(angle)
for _,t in pairs(self.list) do
local p1,p2,p3 = unpack( t.summits )
p1,p2,p3 = rot(p1,a), rot(p2,a), rot(p3,a)
t:setPosition(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y)
end
self.parent:resetTriangles()
end
function Triangles:scale(s)
for _,t in pairs(self.list) do
local p1,p2,p3 = unpack( t.summits )
p1,p2,p3 = p1*s, p2*s, p3*s
t:setPosition(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y)
end
self.parent:resetTriangles()
end
function Triangles:draw()
end
function Triangles:touched(touch)
for _,t in pairs(self.list) do
t:touched(touch)
end
if self:mode() == "add" and touch.state == BEGAN and self:ready() then
self.closestTriangle:add1triangle(touch)
self.minDist = nil
self:ready(false)
elseif self:mode() == "new" and touch.state == BEGAN and self:ready() then
local x,y = touch.x,touch.y
local c = self.parent.colorValue
self:add(x-100, y-50, x+100, y-50, x, y+100,c,c,c)
self.parent:resetTriangles()
self:ready(false)
elseif self:mode() == "newSquare" and touch.state == BEGAN and self:ready() then
local x,y = touch.x,touch.y
local c = self.parent.colorValue
self:add(x-50, y-50, x+50, y-50, x-50, y+50,c,c,c)
self:add(x+50, y+50, x+50, y-50, x-50, y+50,c,c,c)
self.parent:resetTriangles()
self:ready(false)
end
self.currentTouch = touch
end
--#TriMesh
TriMesh = class()
-- mesh to display all triangles
function TriMesh:init(parent,triangles,shift)
self.parent = parent
self.shift = shift or 0
self:reset(triangles)
end
function TriMesh:reset(triangles)
local shift = self.shift
if self.parent:mode() == "view" then shift = 0 end
self.triangles = triangles or self.triangles
triangles = triangles or self.triangles
local vert2tri = {}
local tri2vert = {}
local vertices = {}
local colors = {}
for _,t in pairs(triangles) do
local i = #vertices
local summits = t:shrinkSummits(shift)
for _,v in ipairs(summits) do
table.insert(vertices, v)
end
for _,c in ipairs(t.colors) do
table.insert(colors, c)
end
vert2tri[i] = t
tri2vert[t] = i
end
self.vert2tri = vert2tri
self.tri2vert = tri2vert
ms = mesh()
ms.vertices = vertices
ms.colors = colors
self.ms = ms
collectgarbage()
end
function TriMesh:triangleMove(t)
local i = self.tri2vert[t]
local ms = self.ms
local summits = t:shrinkSummits(self.shift)
for k,v in ipairs(summits) do
ms:vertex(i+k,v)
end
end
function TriMesh:triangleColor(t)
local i = self.tri2vert[t]
local ms = self.ms
local newColor = self.parent:color()
for k,c in pairs(t.colors) do
ms:color(i+k,c)
end
end
function TriMesh:round2string()
end
function TriMesh:tostring(slot)
local oldShift = self.shift
self.shift = 0
self:reset()
self.shift = oldShift
local ms = self.ms
local vertices = {}
local msTxt = "ms" .. tostring(slot)
table.insert( vertices, msTxt .. ".vertices = {")
local colors = {}
table.insert( colors, msTxt .. ".colors = {")
for i=1,#self.ms.vertices do
table.insert( vertices, "vec3" .. tostring( ms:vertex(i) ).."," )
table.insert( colors, "color" .. tostring( ms:color(i) ).."," )
end
table.insert( vertices, " }")
table.insert( colors, " }")
local str = {}
table.insert( str, msTxt .. " = mesh()" )
table.insert( str, table.concat(vertices,"\r") )
table.insert( str, table.concat(colors,"\r") )
return table.concat(str,"\r")
end
function TriMesh:save(slot)
local str = self:tostring(slot)
loadstring(str)()
saveProjectTab("Mesh"..tostring(slot),str)
--print("mesh saved!")
end
function TriMesh:draw()
self.ms:draw()
end
--# Undo
Undo = class()
function Undo:init(parent)
self.parent = parent
self.last = nil
end
function Undo:push(triMesh)
self.last = triMesh:tostring(0)
end
function Undo:pop()
if self.last == nil then return end
loadstring(self.last)()
self.last = nil
return ms0
end
function Undo:touched(touch)
-- Codea does not automatically call this method
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment