Advertisement
ssccsscc

Layering helper remastered update

Mar 2nd, 2019
637
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 29.95 KB | None | 0 0
  1. ------------------- Configuration -------------------
  2. local rquiredAPIVersion = 2.42
  3.  
  4. local resizingGridSize = 30
  5. local safeModeByDefault = true
  6. -----------------------------------------------------
  7. pcall(dofile,"scripts/ssccssccAPI.lua")
  8. if not interface_s or interface_s.Version < rquiredAPIVersion then
  9.   if tpt.confirm("Download and install file", "Layering Helper Remastered script is required (scripts/ssccssccAPI.lua) to run. Download it now?") then
  10.     fs.makeDirectory("scripts")
  11.     tpt.getscript(172, "scripts/ssccssccAPI.lua", 1, 0)
  12.   else
  13.     tpt.log("Layering Helper Remastered script is unavailable due to lack of required files.")
  14.     return
  15.   end
  16. end
  17. --=================================================================--
  18. --                    CODE IS BELOW THIS LINE                      --
  19. --=================================================================--
  20. local DefaultTheme = interface_s.DefaultTheme
  21. --local mouseEvents = interface_s.mouseEvents       --Only for 2.43+
  22. --local mouseButtons = interface_s.mouseButtons     --
  23. local mouseEvents = {
  24.   Down = 1,
  25.   Up = 2
  26. }
  27. local mouseButtons = {
  28.     Left = 1,
  29.     Middle = 2,
  30.     Right = 3
  31. }
  32.  
  33. local TransparentWindow = {}
  34. TransparentWindow.BackColor = gfx.getHexColor(0,0,0,150)
  35. TransparentWindow.UnfocusedBackColor = gfx.getHexColor(0,0,0,150)
  36. TransparentWindow.BorderColor = gfx.getHexColor(255,255,255,150)
  37. TransparentWindow.UnfocusedBorderColor = gfx.getHexColor(150,150,150,150)
  38. TransparentWindow.HeaderColor = gfx.getHexColor(150,150,255,150)
  39. TransparentWindow.UnfocusedHeaderColor = gfx.getHexColor(32,32,55,150)
  40.  
  41. local function round(n)
  42.   return math.floor(n+0.5)
  43. end
  44. --==========================Zoom gfx============================--
  45. local isZoomActive = false
  46. local zoomPixelSize = -1
  47. local zoomWidthInRealPixels = -1
  48. local zoomRealPositionX = -1
  49. local zoomRealPositionY = -1
  50. local zoomWindowPositionX = -1
  51. local zoomWindowPositionY = -1
  52. local zoomWindowSize = -1
  53. local function getZoomInfo()
  54.   isZoomActive=false
  55.   if sim.adjustCoords(sim.XRES-1,5)~=sim.XRES-1 then
  56.     isZoomActive=true
  57.     local x,y = sim.adjustCoords(sim.XRES-1,2)
  58.     zoomRealPositionX = x
  59.     zoomRealPositionY = y
  60.     local i=sim.XRES-2
  61.     while x==sim.adjustCoords(i,2) do
  62.       i=i-1
  63.     end
  64.     zoomPixelSize = sim.XRES-i-1
  65.     i=zoomPixelSize
  66.     while sim.adjustCoords(sim.XRES-i,2)~=sim.XRES-i do
  67.       i=i+zoomPixelSize
  68.     end
  69.     zoomWidthInRealPixels = (i-zoomPixelSize)/zoomPixelSize
  70.     zoomRealPositionX=zoomRealPositionX-zoomWidthInRealPixels+1
  71.     zoomWindowPositionX = sim.XRES-i+zoomPixelSize
  72.     if tpt.version.jacob1s_mod~=nil then
  73.       zoomWindowPositionY = 1
  74.     else
  75.       zoomWindowPositionY = 0
  76.     end
  77.     zoomWindowSize = zoomPixelSize*zoomWidthInRealPixels
  78.   else
  79.     if sim.adjustCoords(1,5)~=1 then
  80.       isZoomActive=true
  81.       local x,y = sim.adjustCoords(1,2)
  82.       zoomRealPositionX = x
  83.       zoomRealPositionY = y
  84.       local i=2
  85.       while x==sim.adjustCoords(i,2) do
  86.         i=i+1
  87.       end
  88.       if tpt.version.jacob1s_mod~=nil then
  89.         zoomPixelSize = i-1
  90.       else
  91.         zoomPixelSize = i
  92.       end
  93.       i=zoomPixelSize
  94.       while sim.adjustCoords(i,2)~=i do
  95.         i=i+zoomPixelSize
  96.       end
  97.       zoomWidthInRealPixels = (i-zoomPixelSize)/zoomPixelSize
  98.       if tpt.version.jacob1s_mod~=nil then
  99.         zoomWindowPositionX = 1
  100.         zoomWindowPositionY = 1
  101.       else
  102.         zoomWindowPositionX = 0
  103.         zoomWindowPositionY = 0
  104.       end
  105.       zoomWindowSize = zoomPixelSize*zoomWidthInRealPixels+1
  106.     end
  107.   end
  108. end
  109.  
  110. local function CoordinatesToZoomWindow(x,y)
  111.   return zoomWindowPositionX+(x-zoomRealPositionX)*zoomPixelSize,zoomWindowPositionY+(y-zoomRealPositionY)*zoomPixelSize
  112. end
  113.  
  114. local function drawPixelInZoomWindow(x,y,r,g,b,a)
  115.   if isZoomActive then
  116.     x = round(x)
  117.     y = round(y)
  118.     if x>=zoomRealPositionX and x<zoomRealPositionX+zoomWidthInRealPixels and y>=zoomRealPositionY and y<zoomRealPositionY+zoomWidthInRealPixels then
  119.       local posX,posY = CoordinatesToZoomWindow(x,y)
  120.       graphics.fillRect(posX,posY,zoomPixelSize-1,zoomPixelSize-1,r,g,b,a)
  121.     end
  122.   end
  123. end
  124.  
  125. local function drawRectangleInZoomWindow(x,y,w,h,r,g,b,a)
  126.   if isZoomActive then
  127.     local leftX = math.max(x,zoomRealPositionX)
  128.     local rightX = math.min(x+w,zoomRealPositionX+zoomWidthInRealPixels)
  129.     local topY = math.max(y,zoomRealPositionY)
  130.     local bottomY = math.min(y+h,zoomRealPositionY+zoomWidthInRealPixels)
  131.     if leftX < rightX and topY < bottomY then
  132.       local posX,posY = CoordinatesToZoomWindow(leftX,topY)
  133.       graphics.fillRect(posX,posY,(rightX-leftX)*(zoomPixelSize),(bottomY-topY)*(zoomPixelSize),r,g,b,a)
  134.     end
  135.   end
  136. end
  137. --==========================Zoom gfx end========================--
  138.  
  139. local function clone(org)
  140.   local temp = {}
  141.   for i=1, #org do
  142.     temp[i]={}
  143.     for k, v in pairs(org[i]) do
  144.       temp[i][k]=v
  145.     end
  146.   end
  147.   return temp
  148. end
  149.  
  150. local function HSVToRGB( hue, saturation, value )
  151.   if saturation == 0 then
  152.     return value
  153.   end
  154.   local hue_sector = math.floor( hue / 60 )
  155.   local hue_sector_offset = ( hue / 60 ) - hue_sector
  156.   local p = value * ( 1 - saturation )
  157.   local q = value * ( 1 - saturation * hue_sector_offset )
  158.   local t = value * ( 1 - saturation * ( 1 - hue_sector_offset ) )
  159.   if hue_sector == 0 then
  160.     return value, t, p
  161.   elseif hue_sector == 1 then
  162.     return q, value, p
  163.   elseif hue_sector == 2 then
  164.     return p, value, t
  165.   elseif hue_sector == 3 then
  166.     return p, q, value
  167.   elseif hue_sector == 4 then
  168.     return t, p, value
  169.   elseif hue_sector == 5 then
  170.     return value, p, q
  171.   end
  172. end
  173.  
  174. function layer()
  175.   Layer()
  176. end
  177.  
  178. function Layer()
  179.   tpt.log("Press \"Select\" to start.")
  180.   local pause = false
  181.   if tpt.set_pause() == 1 then
  182.     pause = true
  183.   end
  184.   tpt.set_pause(1)
  185.  
  186.   local selectionMover = nil
  187.   local selection = nil
  188.   local particlesIndexes = {}
  189.   local virtualParticles = {}
  190.   local virtualParticlesbackup = {}
  191.   local selectionMenu = nil
  192.  
  193.   local function resetVars()
  194.     selectionMover = nil
  195.     selection = nil
  196.     particlesIndexes = {}
  197.     virtualParticles = {}
  198.     virtualParticlesbackup = {}
  199.   end
  200.  
  201.   local rotateButton = interface_s.Components.Button:new(2, 2, 12, 12,"R", DefaultTheme.Button)
  202.   local resizeButton = interface_s.Components.Button:new(15, 2, 12, 12,"S", DefaultTheme.Button)
  203.   resizeButton.Enabled = not safeModeByDefault
  204.  
  205.   local startangle = 0
  206.   local lastangle = 0
  207.   local currentangle = 0
  208.   local isfirst = true
  209.   local info = interface_s.ComponentsHelpers.Hint:new()
  210.   local ignoreClicks = false
  211.   local safeMode = safeModeByDefault
  212.   local layerMode = true
  213.  
  214.   local function copyPart(i,dx,dy,vx,vy)
  215.     local props = {"life","ctype","temp","flags","tmp","tmp2","dcolour","pavg0","pavg1"}
  216.     local t = sim.partProperty(i,"type")
  217.     local ni = sim.partCreate(-3,dx,dy,t)
  218.     sim.partProperty(ni,"vx",vx)
  219.     sim.partProperty(ni,"vy",vy)
  220.     for k,v in pairs(props) do
  221.       sim.partProperty(ni,v,sim.partProperty(i,v))
  222.     end
  223.     return ni
  224.   end
  225.  
  226.   local function getIndexUsageCount()
  227.     local usageCount = {}
  228.     for i=0, #virtualParticles do
  229.       if virtualParticles[i]~=nil then
  230.         usageCount[virtualParticles[i]["i"]] = (usageCount[virtualParticles[i]["i"]] or 0) + 1
  231.       end
  232.     end
  233.     return usageCount
  234.   end
  235.  
  236.   local function virtualParticlesToReal()
  237.     sim.takeSnapshot()
  238.     local usageCount = getIndexUsageCount()
  239.     for i=1, #virtualParticles do
  240.       if usageCount[virtualParticles[i]["i"]]==1 then
  241.         sim.partPosition(virtualParticles[i]["i"],virtualParticles[i]["x"],virtualParticles[i]["y"])
  242.         sim.partProperty(virtualParticles[i]["i"],"vx",virtualParticles[i]["vx"])
  243.         sim.partProperty(virtualParticles[i]["i"],"vy",virtualParticles[i]["vy"])
  244.       else
  245.         local id = copyPart(virtualParticles[i]["i"],virtualParticles[i]["x"],virtualParticles[i]["y"],virtualParticles[i]["vx"],virtualParticles[i]["vy"])
  246.         usageCount[id] = 1 -- Prevent part from delete if not in layer mode
  247.       end
  248.     end
  249.     for i=1, #particlesIndexes do
  250.       if usageCount[particlesIndexes[i]]~=1 then
  251.         simulation.partKill(particlesIndexes[i])
  252.       end
  253.     end
  254.     if not layerMode then
  255.       local tempGrid = {}
  256.       for i in sim.parts() do
  257.         local cx,cy = sim.partPosition(i)
  258.         cx,cy=round(cx),round(cy)
  259.         if tempGrid[cx]==nil then tempGrid[cx]={} end
  260.         if tempGrid[cx][cy]==nil then tempGrid[cx][cy]={} end
  261.         tempGrid[cx][cy][#(tempGrid[cx][cy])+1]=i
  262.       end
  263.       for i=1, #virtualParticles do
  264.         if tempGrid[virtualParticles[i]["x"]]~=nil and tempGrid[virtualParticles[i]["x"]][virtualParticles[i]["y"]]~=nil then
  265.           for j=1,#tempGrid[virtualParticles[i]["x"]][virtualParticles[i]["y"]] do
  266.             if usageCount[tempGrid[virtualParticles[i]["x"]][virtualParticles[i]["y"]][j]]==nil or usageCount[tempGrid[virtualParticles[i]["x"]][virtualParticles[i]["y"]][j]]==0 then
  267.               sim.partKill(tempGrid[virtualParticles[i]["x"]][virtualParticles[i]["y"]][j])
  268.             end
  269.           end
  270.         end
  271.       end
  272.     end
  273.   end
  274.  
  275.   local hue = 0
  276.  
  277.   local function drawOverOriginal()
  278.     for i=1, #particlesIndexes do
  279.       local r,g,b = HSVToRGB(hue,1,190)
  280.       local cx,cy = sim.partPosition(particlesIndexes[i])
  281.       if cx==nil or cy==nil then
  282.         return
  283.       end
  284.       if not isZoomActive or not (cx>=zoomWindowPositionX and cx<=zoomWindowPositionX+zoomWindowSize and cy>=zoomWindowPositionY and cy<=zoomWindowPositionY+zoomWindowSize) then
  285.         graphics.fillRect(cx,cy,1,1,r,g,b,170)
  286.       end
  287.       drawPixelInZoomWindow(cx,cy,r,g,b,170)
  288.     end
  289.   end
  290.  
  291.   local function drawVirtualParticles()
  292.     getZoomInfo()
  293.     for i=1, #virtualParticles do
  294.       local r,g,b = HSVToRGB(hue,1,190)
  295.       if not isZoomActive or not (virtualParticles[i]["x"]>=zoomWindowPositionX and virtualParticles[i]["x"]<=zoomWindowPositionX+zoomWindowSize and virtualParticles[i]["y"]>=zoomWindowPositionY and virtualParticles[i]["y"]<=zoomWindowPositionY+zoomWindowSize) then
  296.         graphics.fillRect(virtualParticles[i]["x"],virtualParticles[i]["y"],1,1,r,g,b,170)
  297.       end
  298.       drawPixelInZoomWindow(virtualParticles[i]["x"],virtualParticles[i]["y"],r,g,b,170)
  299.     end
  300.     drawOverOriginal()
  301.     hue = hue+1
  302.     if hue>359 then
  303.       hue=0
  304.     end
  305.   end
  306.  
  307.   local function saveToVirtual()
  308.     virtualParticles = {}
  309.     for i=1, #particlesIndexes do
  310.       local cx,cy = sim.partPosition(particlesIndexes[i])
  311.       virtualParticles[i]={}
  312.       if selectionMover~=nil then
  313.         virtualParticles[i]["x"] = cx+selectionMover.SumDX
  314.         virtualParticles[i]["y"] = cy+selectionMover.SumDY
  315.       else
  316.         virtualParticles[i]["x"] = cx
  317.         virtualParticles[i]["y"] = cy
  318.       end
  319.       virtualParticles[i]["i"]=particlesIndexes[i]
  320.       virtualParticles[i]["vx"] = sim.partProperty(particlesIndexes[i], "vx") or 0
  321.       virtualParticles[i]["vy"] = sim.partProperty(particlesIndexes[i], "vy") or 0
  322.     end
  323.   end
  324.  
  325.   local function adjustSelection()
  326.     local maxX = 0
  327.     local maxY = 0
  328.     for i=1, #virtualParticles do
  329.       if virtualParticles[i]~=nil then
  330.         if maxX<virtualParticles[i]["x"] then maxX=virtualParticles[i]["x"] end
  331.         if maxY<virtualParticles[i]["y"] then maxY=virtualParticles[i]["y"] end
  332.       end
  333.     end
  334.     selectionMover.Height = maxY-selectionMover.Y+10
  335.     selectionMover.Width = maxX-selectionMover.X+10
  336.     selectionMenu.X=selectionMover.X+selectionMover.Width
  337.   end
  338.  
  339.   --==========================Rotation============================--
  340.  
  341.   local virtualParticlesGrid = {}
  342.  
  343.   local function toTempGrid()
  344.     virtualParticlesGrid = {}
  345.     for i=1, #virtualParticles do
  346.       local cx,cy=round(virtualParticles[i]["x"]),round(virtualParticles[i]["y"])
  347.       if virtualParticlesGrid[cx]==nil then virtualParticlesGrid[cx]={} end
  348.       if virtualParticlesGrid[cx][cy]==nil then virtualParticlesGrid[cx][cy]={} end
  349.       virtualParticlesGrid[cx][cy][#(virtualParticlesGrid[cx][cy])+1] = {}
  350.       virtualParticlesGrid[cx][cy][#(virtualParticlesGrid[cx][cy])]["i"] = virtualParticles[i]["i"]
  351.       virtualParticlesGrid[cx][cy][#(virtualParticlesGrid[cx][cy])]["vx"] = virtualParticles[i]["vx"]
  352.       virtualParticlesGrid[cx][cy][#(virtualParticlesGrid[cx][cy])]["vy"] = virtualParticles[i]["vy"]
  353.     end
  354.   end
  355.  
  356.   local function rot(a)
  357.     if safeMode then
  358.       for i=1, #virtualParticles do
  359.         local cx = virtualParticles[i]["x"]
  360.         local cy = virtualParticles[i]["y"]
  361.         cx=cx-selectionMover.X-selectionMover.Width/2
  362.         cy=cy-selectionMover.Y-selectionMover.Height/2
  363.         local cx2 = cx
  364.         cx = -cy*math.sin(math.rad(a))+cx*math.cos(math.rad(a))
  365.         cy = cy*math.cos(math.rad(a))+cx2*math.sin(math.rad(a))
  366.         cx=cx+selectionMover.X+selectionMover.Width/2
  367.         cy=cy+selectionMover.Y+selectionMover.Height/2
  368.         virtualParticles[i]["x"] = cx
  369.         virtualParticles[i]["y"] = cy
  370.         local vx = virtualParticles[i]["vx"]
  371.         local vy = virtualParticles[i]["vy"]
  372.         local vx2 = vx
  373.         vx = -vy*math.sin(math.rad(a))+vx*math.cos(math.rad(a))
  374.         vy = vy*math.cos(math.rad(a))+vx2*math.sin(math.rad(a))
  375.         virtualParticles[i]["vx"] = vx
  376.         virtualParticles[i]["vy"] = vy
  377.       end
  378.     else
  379.       local minX, maxX, minY, maxY = 0, 0, 0, 0
  380.       for i=1, #virtualParticlesbackup do
  381.         local cx = virtualParticlesbackup[i]["x"]
  382.         local cy = virtualParticlesbackup[i]["y"]
  383.         cx=cx-selectionMover.X-selectionMover.Width/2
  384.         cy=cy-selectionMover.Y-selectionMover.Height/2
  385.         local cx2 = cx
  386.         cx = round(-cy*math.sin(math.rad(-currentangle))+cx*math.cos(math.rad(-currentangle)))
  387.         if minX>cx then minX = cx end
  388.         if maxX<cx then maxX = cx end
  389.         cy = round(cy*math.cos(math.rad(-currentangle))+cx2*math.sin(math.rad(-currentangle)))
  390.         if minY>cy then minY = cy end
  391.         if maxY<cy then maxY = cy end
  392.       end
  393.       minX = minX-2
  394.       maxX = maxX+2
  395.       minY = minY-2
  396.       maxY = maxY+2
  397.       virtualParticles={}
  398.       for x=minX,maxX do
  399.         for y=minY,maxY do
  400.           local x2=x+selectionMover.X+selectionMover.Width/2
  401.           local y2=y+selectionMover.Y+selectionMover.Height/2
  402.           x2 = round(x2)
  403.           y2 = round(y2)
  404.           local cx = -y*math.sin(math.rad(currentangle))+x*math.cos(math.rad(currentangle))
  405.           local cy = y*math.cos(math.rad(currentangle))+x*math.sin(math.rad(currentangle))
  406.           cx=cx+selectionMover.X+selectionMover.Width/2
  407.           cy=cy+selectionMover.Y+selectionMover.Height/2
  408.           cx = round(cx)
  409.           cy = round(cy)
  410.           if virtualParticlesGrid[cx]~=nil and virtualParticlesGrid[cx][cy]~=nil then
  411.             for i=1,#virtualParticlesGrid[cx][cy] do
  412.               virtualParticles[#virtualParticles+1]={}
  413.               virtualParticles[#virtualParticles]["x"]=x2
  414.               virtualParticles[#virtualParticles]["y"]=y2
  415.               virtualParticles[#virtualParticles]["i"]=virtualParticlesGrid[cx][cy][i]["i"]
  416.               local vx = virtualParticlesGrid[cx][cy][i]["vx"]
  417.               local vy = virtualParticlesGrid[cx][cy][i]["vy"]
  418.               local vx2 = vx
  419.               vx = -vy*math.sin(math.rad(-currentangle))+vx*math.cos(math.rad(-currentangle))
  420.               vy = vy*math.cos(math.rad(-currentangle))+vx2*math.sin(math.rad(-currentangle))
  421.               virtualParticles[#virtualParticles]["vx"] = vx
  422.               virtualParticles[#virtualParticles]["vy"] = vy
  423.             end
  424.           end
  425.         end
  426.       end
  427.     end
  428.   end
  429.  
  430.   local function onStepRotate(x,y)
  431.     local angle = currentangle
  432.     if angle<0 then angle=angle+360 end
  433.     info:MouseOver(x,y,"Rotating ("..angle.."). Press RMB to cancel. Press LMB to save.")
  434.     currentangle = math.floor(math.deg(math.atan2(tpt.mousex-selectionMover.X-selectionMover.Width/2,tpt.mousey-selectionMover.Y-selectionMover.Height/2)))-startangle
  435.     if isfirst then
  436.       isfirst = false
  437.     else
  438.       rot(lastangle-currentangle)
  439.     end
  440.     lastangle = currentangle
  441.   end
  442.  
  443.   local function onClickRotate(x,y,e,b)
  444.     if e==mouseEvents.Up and b==mouseButtons.Left then
  445.       interface_s.RemoveOnClickAction(onClickRotate)
  446.       interface_s.RemoveOnStepAction(onStepRotate)
  447.       ignoreClicks = false
  448.       rotateButton.Enabled = true
  449.       resizeButton.Enabled = not safeMode
  450.     end
  451.     if e==mouseEvents.Up and (b==mouseButtons.Right or b==4) then --Reset
  452.       virtualParticles = clone(virtualParticlesbackup)
  453.       interface_s.RemoveOnClickAction(onClickRotate)
  454.       interface_s.RemoveOnStepAction(onStepRotate)
  455.       ignoreClicks = false
  456.       rotateButton.Enabled = true
  457.       resizeButton.Enabled = not safeMode
  458.     end
  459.     return true
  460.   end
  461.  
  462.   rotateButton.OnPressed = (function()
  463.     toTempGrid()
  464.     virtualParticlesbackup = clone(virtualParticles)
  465.     startangle = math.floor(math.deg(math.atan2(tpt.mousex-selectionMover.X-selectionMover.Width/2,tpt.mousey-selectionMover.Y-selectionMover.Height/2)))
  466.     lastangle = startangle
  467.     isfirst = true
  468.     info.HintFrames = 41
  469.     interface_s.AddOnStepAction(onStepRotate)
  470.     interface_s.AddOnClickAction(onClickRotate)
  471.     ignoreClicks = true
  472.     rotateButton.Enabled = false
  473.     resizeButton.Enabled = false
  474.   end)
  475.   --=================================================================--
  476.  
  477.   --=============================Resize==============================--
  478.   local resizePosX = -1
  479.   local resizePosY = -1
  480.   local SizeX = 1
  481.   local SizeY = 1
  482.  
  483.   local function removeDeletedFromTable(tbl)
  484.     local newTable = {}
  485.     for i=1,#tbl do
  486.       if tbl[i]~=123 then
  487.         newTable[#newTable+1]=tbl[i]
  488.       end
  489.     end
  490.     return newTable
  491.   end
  492.  
  493.   local function onStepResize(x,y)
  494.     SizeX = math.ceil((x-resizePosX)/resizingGridSize)+1
  495.     SizeY = math.ceil((y-resizePosY)/resizingGridSize)+1
  496.     local sizeXStr = SizeX
  497.     local sizeYStr = SizeY
  498.     if sizeXStr==0 then sizeXStr=1 end
  499.     if sizeYStr==0 then sizeYStr=1 end
  500.     if sizeXStr<0 then
  501.       sizeXStr="1/"..math.abs(sizeXStr-1)
  502.     end
  503.     if sizeYStr<0 then
  504.       sizeYStr="1/"..math.abs(sizeYStr-1)
  505.     end
  506.     info:MouseOver(tpt.mousex,tpt.mousey,"Resizing ("..sizeXStr.."x, "..sizeYStr.."y). Press RMB to cancel. Press LMB to save.")
  507.     virtualParticles = clone(virtualParticlesbackup)
  508.     local minX = 900
  509.     local minY = 900
  510.    
  511.     for i=1, #virtualParticles do
  512.       if minX>virtualParticles[i]["x"] then minX=virtualParticles[i]["x"] end
  513.       if minY>virtualParticles[i]["y"] then minY=virtualParticles[i]["y"] end
  514.     end
  515.     if SizeX>0 then
  516.       for i=1, #virtualParticles do
  517.         virtualParticles[i]["x"]=math.ceil(minX+(virtualParticles[i]["x"]-minX)*(SizeX))
  518.         for j=virtualParticles[i]["x"]+1,virtualParticles[i]["x"]+SizeX-1 do
  519.           virtualParticles[#virtualParticles+1]={}
  520.           virtualParticles[#virtualParticles]["x"]=j
  521.           virtualParticles[#virtualParticles]["y"]=virtualParticles[i]["y"]
  522.           virtualParticles[#virtualParticles]["i"]=virtualParticles[i]["i"]
  523.           virtualParticles[#virtualParticles]["vx"]=virtualParticles[i]["vx"]
  524.           virtualParticles[#virtualParticles]["vy"]=virtualParticles[i]["vy"]
  525.         end
  526.       end
  527.     else
  528.       local s = 1/math.abs(SizeX-1)
  529.       for i=1, #virtualParticles do
  530.         if (virtualParticles[i]["x"]-minX)%math.abs(SizeX-1)~= 0 then
  531.           virtualParticles[i]=123
  532.         else
  533.           virtualParticles[i]["x"]=math.ceil(minX+(virtualParticles[i]["x"]-minX)*s)
  534.           for j=virtualParticles[i]["x"]+1,virtualParticles[i]["x"]+s-1 do
  535.             virtualParticles[#virtualParticles+1]={}
  536.             virtualParticles[#virtualParticles]["x"]=j
  537.             virtualParticles[#virtualParticles]["y"]=virtualParticles[i]["y"]
  538.             virtualParticles[#virtualParticles]["i"]=virtualParticles[i]["i"]
  539.             virtualParticles[#virtualParticles]["vx"]=virtualParticles[i]["vx"]
  540.             virtualParticles[#virtualParticles]["vy"]=virtualParticles[i]["vy"]
  541.           end
  542.         end
  543.       end
  544.       virtualParticles=removeDeletedFromTable(virtualParticles)
  545.     end
  546.     if SizeY>0 then
  547.       for i=1, #virtualParticles do
  548.         virtualParticles[i]["y"]=math.ceil(minY+(virtualParticles[i]["y"]-minY)*(SizeY))
  549.         for j=virtualParticles[i]["y"]+1,virtualParticles[i]["y"]+SizeY-1 do
  550.           virtualParticles[#virtualParticles+1]={}
  551.           virtualParticles[#virtualParticles]["y"]=j
  552.           virtualParticles[#virtualParticles]["x"]=virtualParticles[i]["x"]
  553.           virtualParticles[#virtualParticles]["i"]=virtualParticles[i]["i"]
  554.           virtualParticles[#virtualParticles]["vx"]=virtualParticles[i]["vx"]
  555.           virtualParticles[#virtualParticles]["vy"]=virtualParticles[i]["vy"]
  556.         end
  557.       end
  558.     else
  559.       local s = 1/math.abs(SizeY-1)
  560.       for i=1, #virtualParticles do
  561.         if (virtualParticles[i]["y"]-minY)%math.abs(SizeY-1) ~= 0 then
  562.           virtualParticles[i]=123
  563.         else
  564.           virtualParticles[i]["y"]=math.ceil(minY+(virtualParticles[i]["y"]-minY)*(s))
  565.           for j=virtualParticles[i]["y"]+1,virtualParticles[i]["y"]+s-1 do
  566.             virtualParticles[#virtualParticles+1]={}
  567.             virtualParticles[#virtualParticles]["y"]=j
  568.             virtualParticles[#virtualParticles]["x"]=virtualParticles[i]["x"]
  569.             virtualParticles[#virtualParticles]["i"]=virtualParticles[i]["i"]
  570.             virtualParticles[#virtualParticles]["vx"]=virtualParticles[i]["vx"]
  571.             virtualParticles[#virtualParticles]["vy"]=virtualParticles[i]["vy"]
  572.           end
  573.         end
  574.       end
  575.       virtualParticles=removeDeletedFromTable(virtualParticles)
  576.     end
  577.     adjustSelection()
  578.   end
  579.  
  580.   local function onClickResize(x,y,e,b)
  581.     if e==mouseEvents.Up and b==mouseButtons.Left then
  582.       interface_s.RemoveOnClickAction(onClickResize)
  583.       interface_s.RemoveOnStepAction(onStepResize)
  584.       rotateButton.Enabled = true
  585.       resizeButton.Enabled = not safeMode
  586.       ignoreClicks = false
  587.     end
  588.     if e==mouseEvents.Up and (b==mouseButtons.Right or b==4) then --Reset
  589.       virtualParticles = clone(virtualParticlesbackup)
  590.       adjustSelection()
  591.       interface_s.RemoveOnClickAction(onClickResize)
  592.       interface_s.RemoveOnStepAction(onStepResize)
  593.       rotateButton.Enabled = true
  594.       resizeButton.Enabled = not safeMode
  595.       ignoreClicks = false
  596.     end
  597.     return true
  598.   end
  599.  
  600.   resizeButton.OnPressed = (function(x,y)
  601.     virtualParticlesbackup = clone(virtualParticles)
  602.     resizePosX=tpt.mousex
  603.     resizePosY=tpt.mousey
  604.     interface_s.AddOnStepAction(onStepResize)
  605.     interface_s.AddOnClickAction(onClickResize)
  606.     ignoreClicks = true
  607.     rotateButton.Enabled = false
  608.     resizeButton.Enabled = false
  609.   end)
  610.   --=================================================================--
  611.  
  612.   --=================================================================--
  613.   local Zkey = false
  614.   local function ZKeyPress(key, scan, r, ctrl, shift, alt)
  615.     if key==122 then
  616.       Zkey = true
  617.     end
  618.   end
  619.   local function ZKeyRelease(key, scan, r, ctrl, shift, alt)
  620.     if key==122 then
  621.       Zkey = false
  622.     end
  623.   end
  624.  
  625.   local function ZkeyforOldAPI(a,b,c,d)
  626.     if d==1 then
  627.       ZKeyPress(b)
  628.     else
  629.       ZKeyRelease(b)
  630.     end
  631.   end
  632.  
  633.   if tpt.version.major<=93 and tpt.version.jacob1s_mod==nil or tpt.version.jacob1s_mod~=nil and tpt.version.jacob1s_mod<42 then
  634.     tpt.register_keypress(ZkeyforOldAPI)
  635.   else
  636.     event.register(event.keyrelease, ZKeyRelease)
  637.     event.register(event.keypress, ZKeyPress)
  638.   end
  639.   --=================================================================--
  640.   selectionMenu = interface_s.Components.Window:new(10, 10, 65, 40,false, TransparentWindow)
  641.   selectionMenu.IsShowing = false
  642.   selectionMenu.AlwaysFocused = true
  643.   selectionMenu.AllowResize = false
  644.   interface_s.addComponent(selectionMenu)
  645.  
  646.   local layerModeCheckbox = interface_s.Components.Checkbox:new(2, 27, 10, "Layer", DefaultTheme.Checkbox)
  647.   layerModeCheckbox.Checked = layerMode
  648.   layerModeCheckbox.OnStateChanged = function(checked)
  649.     layerMode = checked
  650.   end
  651.  
  652.   local safeModeCheckbox = interface_s.Components.Checkbox:new(2, 15, 10, "Safe mode", DefaultTheme.Checkbox)
  653.   safeModeCheckbox.Checked = safeMode
  654.   safeModeCheckbox.OnStateChanged = function(checked)
  655.     safeMode = checked
  656.     resizeButton.Enabled = not safeMode
  657.   end
  658.  
  659.   local mainWindow = interface_s.Components.Window:new(10, 10, 60, 60,true, DefaultTheme.Window)
  660.   mainWindow.AllowResize = false
  661.   interface_s.addComponent(mainWindow)
  662.  
  663.   local blockClicks = false
  664.   local function blockAllClicks()
  665.     if blockClicks and not Zkey then
  666.       return true
  667.     end
  668.   end
  669.   interface_s.AddOnClickAction(blockAllClicks)
  670.  
  671.   local Exit = interface_s.Components.Button:new(5, 40, 50, 15,"Exit", DefaultTheme.Button)
  672.   Exit.OnPressed = (function()
  673.     interface_s.RemoveComponent(mainWindow)
  674.     interface_s.RemoveComponent(selectionMover)
  675.     interface_s.RemoveComponent(selection)
  676.     interface_s.RemoveComponent(selectionMenu)
  677.     interface_s.RemoveOnClickAction(onClickRotate)
  678.     interface_s.RemoveOnStepAction(onStepRotate)
  679.     interface_s.RemoveOnClickAction(blockAllClicks)
  680.     interface_s.RemoveOnStepAction(drawVirtualParticles)
  681.     if pause == true then
  682.       tpt.set_pause(1)
  683.     else
  684.       tpt.set_pause(0)
  685.     end
  686.     if tpt.version.major<=93 and tpt.version.jacob1s_mod==nil or tpt.version.jacob1s_mod~=nil and tpt.version.jacob1s_mod<42 then
  687.       tpt.unregister_keypress(ZkeyforOldAPI)
  688.     else
  689.       event.unregister(event.keyrelease, ZKeyRelease)
  690.       event.unregister(event.keypress, ZKeyPress)
  691.     end
  692.   end)
  693.  
  694.   local selectButton = interface_s.Components.Button:new(5, 10, 50, 15,"Select", DefaultTheme.Button)
  695.   selectButton.OnPressed = (function()
  696.     selectButton.Enabled = false
  697.     tpt.log("Select area that you need to layer.")
  698.     resetVars()
  699.     if selectionMover ~= nil then
  700.       interface_s.RemoveComponent(selectionMover)
  701.     end
  702.     selection = interface_s.Components.Selection:new(50, 50, DefaultTheme.Selection)
  703.     selection.OnDraw = function(IsFocused,x,y)
  704.       x,y = sim.adjustCoords(x,y)
  705.       if selection.IsPointSet then
  706.         getZoomInfo()
  707.         local x2,y2 = sim.adjustCoords(selection.V2StartX,selection.V2StartY)
  708.         drawRectangleInZoomWindow(x2,y2,selection.V2EndWidth,selection.V2EndHeight,gfx.getColors(selection.Theme.BackColor))
  709.       end
  710.       return IsFocused,x,y
  711.     end
  712.     selection.OnClick = function(x,y,e,b)
  713.       if b==3 then    --
  714.         b=4           -- To make it correctly work while 2.43 interface API update is not approved
  715.       end             --
  716.       x,y = sim.adjustCoords(x,y)
  717.       return x,y,e,b
  718.     end
  719.     selection.OnSelected = function(x,y,x2,y2,v2x,v2y,v2w,v2h)
  720.       if v2w<5 or v2h<5 then
  721.         interface_s.RemoveComponent(selection)
  722.         selectButton.Enabled=true
  723.         return
  724.       end
  725.       interface_s.AddOnStepAction(drawVirtualParticles)
  726.       tpt.log("Now move the selection on the other particles. Press RMB to cancel. Press LMB to finish.")
  727.       interface_s.RemoveComponent(selection)
  728.       selectionMenu.X = v2x+v2w
  729.       selectionMenu.Y = v2y
  730.       selectionMenu:Show()
  731.       particlesIndexes={}
  732.       for i in sim.parts() do
  733.         local cx,cy = sim.partPosition(i)
  734.         cx = round(cx)
  735.         cy = round(cy)
  736.         if (cx>v2x) and (cx<v2x+v2w) and (cy>v2y) and (cy<v2y+v2h) then
  737.           particlesIndexes[#particlesIndexes+1]=i
  738.         end
  739.       end
  740.  
  741.       blockClicks = true
  742.  
  743.       saveToVirtual()
  744.  
  745.       selectionMover = interface_s.Components.SelectionMover:new(v2x,v2y,v2w,v2h, DefaultTheme.Selection)
  746.       selectionMover.OnClick = (function(x,y,e,b)
  747.         if Zkey or ignoreClicks then return nil end
  748.         if b==3 then    --
  749.           b=4           -- To make it correctly work while 2.43 interface API update is not approved
  750.         end             --
  751.         x,y = sim.adjustCoords(x,y)
  752.         return x,y,e,b
  753.       end)
  754.       selectionMover.OnMove = (function(x,y,e,b)
  755.         if Zkey then return nil end
  756.         x,y = sim.adjustCoords(x,y)
  757.         return x,y,e,b
  758.       end)
  759.       selectionMover.OnDraw = (function(f,x,y)
  760.         drawRectangleInZoomWindow(selectionMover.X,selectionMover.Y,selectionMover.Width,selectionMover.Height,gfx.getColors(selectionMover.Theme.BackColor))
  761.       end)
  762.       selectionMover.OnDone = (function()
  763.         interface_s.RemoveComponent(selectionMover)
  764.         interface_s.RemoveOnStepAction(drawVirtualParticles)
  765.         virtualParticlesToReal()
  766.         selectionMenu:Hide()
  767.         blockClicks = false
  768.         selectButton.Enabled=true
  769.       end)
  770.       selectionMover.OnAbort = (function(tdx,tdy)
  771.         interface_s.RemoveOnStepAction(drawVirtualParticles)
  772.         interface_s.RemoveComponent(selectionMover)
  773.         selectionMenu:Hide()
  774.         blockClicks = false
  775.         selectButton.Enabled=true
  776.       end)
  777.       selectionMover.OnMovement = (function(xd,yd)
  778.         selectionMenu.X=selectionMenu.X+xd
  779.         selectionMenu.Y=selectionMenu.Y+yd
  780.           for i=0, #virtualParticles do
  781.             if virtualParticles[i]~=nil then
  782.               virtualParticles[i]["x"] = virtualParticles[i]["x"]+xd
  783.               virtualParticles[i]["y"] = virtualParticles[i]["y"]+yd
  784.             end
  785.           end
  786.         end)
  787.         interface_s.addComponent(selectionMover)
  788.     end
  789.     selection.OnSelectionAborted = function()
  790.       interface_s.RemoveComponent(selection)
  791.       selectButton.Enabled=true
  792.     end
  793.     interface_s.addComponent(selection)
  794.   end)
  795.   mainWindow:AddComponent(selectButton)
  796.   mainWindow:AddComponent(Exit)
  797.   selectionMenu:AddComponent(rotateButton)
  798.   selectionMenu:AddComponent(resizeButton)
  799.   selectionMenu:AddComponent(safeModeCheckbox)
  800.   selectionMenu:AddComponent(layerModeCheckbox)
  801. end
  802. --=================================================================--
  803. --                    CODE IS ABOVE THIS LINE                      --
  804. --=================================================================--
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement