You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

382 lines
8.7 KiB
Plaintext

os.loadAPI("draw/drawtext")
for i, v in pairs(peripheral.getNames()) do
if peripheral.getType(v) == "GPU" then
gpu = peripheral.wrap(v) -- So can't wait for peripheral.find
break
end
end
if not gpu then
error("Could not find a GPU connected to the computer!",0)
end
local sectex
function fadeDouble(v,x,y,r,g,b)
x, y = x or 0, y or 0
r,g,b = r or 0,g or 0,b or 0
gpu.push()
gpu.scale(2,2)
for i=1,16 do
gpu.setColor(r,g,b,32)
drawtext.drawText(gpu, v,x,y)
sleep(0)
end
gpu.setColor(r,g,b)
drawtext.drawText(gpu, v,x,y)
gpu.pop()
end
function fade(v,x,y,r,g,b)
x, y = x or 0, y or 0
r,g,b = r or 0,g or 0,b or 0
for i=1,4 do
gpu.setColor(r,g,b,64)
drawtext.drawText(gpu, v,x,y)
sleep(0)
end
gpu.setColor(r,g,b)
drawtext.drawText(gpu, v,x,y)
end
local ny = 0
function fadeNext(v,r,g,b)
fade(v,0,ny,r,g,b)
ny = ny+8
end
function fadeDoubleNext(v,r,g,b)
fadeDouble(v,0,ny,r,g,b)
ny = ny+16
end
function fadeScreen()
--copy screen to sectex
for i=0,255,16 do
gpu.setColor(255,255,255,i)
gpu.filledRectangle(0,0,gpu.getSize(0))
sleep(0)
end
gpu.setColor(255,255,255)
gpu.fill()
ny = 0
end
local examples = {
{"Colors and Fills",
function()
fade "Screen filling"
fade("gpu.setColor(128,128,255)",0,8)
fade("gpu.fill()",0,16)
fade("Click to continue",0,24)
os.pullEvent("monitor_up")
gpu.setColor(128,128,255)
gpu.fill()
fade "The screen is filled"
fade("Click to continue",0,8)
os.pullEvent("monitor_up")
fadeScreen()
end
},
{"Rectangles",
function()
fade "Outlined Rectangles:"
fade("gpu.rectangle(25,25,50,50)",0,8)
gpu.setColor(128,128,255)
gpu.rectangle(25,25,50,50)
fade("Click to continue",0,16)
os.pullEvent("monitor_up")
fadeScreen()
fade "Filled Rectangles:"
fade("gpu.filledRectangle(25,25,50,50)",0,8)
gpu.setColor(128,128,255)
gpu.filledRectangle(25,25,50,50)
fade("Click to continue",0,16)
os.pullEvent("monitor_up")
fadeScreen()
end},
{"Textures",
function()
fadeNext("In CCLights2, you can use")
fadeNext("gpu.createTexture(width,height)")
fadeNext("to create textures.")
fadeNext("The above method will return a number")
fadeNext("That number is the texture id")
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
fadeNext("Also, textures come with a cost")
fadeNext("The ingame GPU starts with 8kb of RAM")
fadeNext("A texture will use (w*h)/32 bytes of RAM")
fadeNext("There are methods to measure RAM usage")
fadeNext("gpu.getUsedMemory()")
fadeNext("gpu.getFreeMemory()")
fadeNext("gpu.getTotalMemory()")
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
fadeNext("Because CCLights2 has limited texture memory,")
fadeNext("you can free textures.")
fadeNext("gpu.freeTexture(id)")
fadeNext("Given an id, the above will free that texture")
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
fadeNext("In CCLights2, the screen texture has an id of 0")
fadeNext("You can use the screen like a texture")
fadeNext("gpu.drawTexture(0,64,64)")
sleep(0.5)
gpu.setColor(255,255,255)
gpu.drawTexture(0,64,64)
fadeNext("Now the screen is onscreen!")
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
fadeNext("Textures in CCLights2 are framebuffers")
fadeNext("This means that you can draw to them")
fadeNext("gpu.bindTexture(id) allows you to do that")
fadeNext("gpu.bindTexture(0) will draw to the screen")
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
fadeNext("Example Code:")
fadeNext("local tex = gpu.createTexture(32,32)")
fadeNext("gpu.bindTexture(tex)")
fadeNext("gpu.setColor(255,0,0)")
fadeNext("gpu.filledRectangle(8,8,16,16)")
fadeNext("gpu.bindTexture(0)")
fadeNext("gpu.setColor(255,255,255)")
fadeNext("gpu.drawTexture(tex,64,64)")
fadeNext("gpu.drawTexture(tex,128,128)")
fadeNext("gpu.freeTexture(tex)")
local tex = gpu.createTexture(32,32)
gpu.bindTexture(tex)
gpu.setColor(255,0,0)
gpu.filledRectangle(8,8,16,16)
gpu.bindTexture(0)
gpu.setColor(255,255,255)
gpu.drawTexture(tex,64,64)
gpu.drawTexture(tex,128,128)
gpu.freeTexture(tex)
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
fadeNext("That example did the following:")
fadeNext("Created a 32 by 32 texture")
fadeNext("Binded the new texture")
fadeNext("Set the draw color to red")
fadeNext("Rendered a rectangle on the texture")
fadeNext("Binded the screen")
fadeNext("Set the draw color to white")
fadeNext("Draw the texture at 64,64")
fadeNext("Draw the texture at 128,128")
fadeNext("Free the memory allocated for the texture")
fadeNext("Click to continue")
os.pullEvent("monitor_up")
fadeScreen()
end},
{"Importing Images",
function()
local lp = fs.combine(shell.getRunningProgram(),"..")
fs.copy(fs.combine(lp,"tutorialFiles/smile.png"),"temp.png")
local t = gpu.import("temp.png")
fs.delete("temp.png")
fade("Importing images:")
fade("local texture = gpu.import(\"smile.png\")",0,8)
fade("gpu.drawTexture(texture,64,64)",0,16)
fade("gpu.freeTexture(texture)",0,24)
gpu.setColor(255,255,255)
gpu.drawTexture(t,64,64)
gpu.freeTexture(t)
fade("Click to continue",0,32)
os.pullEvent("monitor_up")
fadeScreen()
end}
}
function runExample(i)
fadeDouble("Example "..i)
fade(examples[i][1],0,16)
fade("Click to continue",0,24)
os.pullEvent("monitor_up")
fadeScreen()
examples[i][2]()
end
function askQuit()
gpu.bindTexture(sectex)
gpu.setColor(255,255,255)
gpu.drawTexture(0,0,0)
gpu.blur(sectex)
gpu.bindTexture(0)
for i=0,255,16 do
gpu.setColor(255,255,255,i)
gpu.drawTexture(sectex,0,0)
gpu.setColor(0,0,0,math.floor(i/4))
gpu.filledRectangle(0,0,gpu.getSize(0))
sleep(0)
end
fadeDouble("Bye!",0,0,255,255,255)
fade("Click to continue",0,16)
os.pullEvent("monitor_up")
for i=0,255,16 do
gpu.setColor(0,0,0,i)
gpu.filledRectangle(0,0,gpu.getSize(0))
sleep(0)
end
end
local s,e = pcall(function()
local w,h = gpu.getSize(0)
sectex = gpu.createTexture(w,h)
local q = false
parallel.waitForAny(function()
for i=0,255,16 do
gpu.setColor(i,i,i)
gpu.fill()
sleep(0)
end
gpu.setColor(255,255,255)
gpu.fill()
fadeDouble("CCLights2 Tutorial",0,0)
fade("Click to continue",0,16)
local exm = "Click me for the examples menu"
fade(exm,0,24)
gpu.setColor(255,0,0)
gpu.filledRectangle(w-4,h-4,4,4)
local _,b,x,y = os.pullEvent("monitor_up")
if x>=0 and x<=gpu.getTextWidth(exm) and y>=24 and y<=32 then
fadeScreen()
--load example menu
--so, we bind to sectex, draw the menu, then we fade in
local ent = math.floor(h/9)
local tw = gpu.getTextWidth("<")
local function redraw(i)
gpu.bindTexture(sectex)
gpu.setColor(0,0,0)
gpu.fill()
gpu.setColor(64,64,64)
gpu.filledRectangle(0,0,tw,h)
gpu.filledRectangle(w-tw,0,tw,h)
gpu.setColor(0,0,0)
drawtext.drawText(gpu, "<",0,h/2-3)
drawtext.drawText(gpu, ">",w-tw,h/2-3)
gpu.setColor(128,128,128)
gpu.filledRectangle(tw,0,w-tw-tw,h)
local x = tw+1
local y = 1
for i=i, i+ent-1 do
if examples[i] then
gpu.setColor(0,0,0)
drawtext.drawText(gpu, " - "..examples[i][1],x,y)
end
gpu.setColor(192,192,192)
gpu.line(x-1,y-1,x-1+w-tw-tw,y-1)
gpu.line(x-1,y+7,x-1+w-tw-tw,y+7)
y = y+9
end
gpu.bindTexture(0)
end
redraw(1)
for i=0,255,16 do
gpu.setColor(255,255,255)
gpu.fill()
gpu.setColor(255,255,255,i)
gpu.drawTexture(sectex,0,0)
sleep(0)
end
while true do
gpu.drawTexture(sectex,0,0)
local _,b,mx,my = os.pullEvent("monitor_up")
local x = tw+1
local y = 1
for i=1, 1+ent-1 do
if examples[i] then
if mx>=x-1 and mx<=x-1+w-tw-tw and my>=y-1 and my<=y+8 then
fadeScreen()
runExample(i)
redraw(1)
for i=0,255,16 do
gpu.setColor(255,255,255)
gpu.fill()
gpu.setColor(255,255,255,i)
gpu.drawTexture(sectex,0,0)
sleep(0)
end
end
end
y = y+9
end
end
else
fadeScreen()
for i=1, #examples do
runExample(i)
end
fade("You are finished with the CCLights2 tutorial!")
fade("Click to continue",0,8)
os.pullEvent("monitor_up")
fadeScreen()
end
end,function()
while true do
local _,b,x,y = os.pullEvent("monitor_up")
if x>=w-4 and y>=h-4 then
q = true
return
end
end
end)
if q then askQuit() end
end)
if not s then
print(s)
if sectex then gpu.freeTexture(sectex) end
gpu.setColor(0,0,0)
gpu.fill()
sleep(0)
gpu.setColor(255,255,255)
gpu.push()
gpu.scale(2,2)
drawtext.drawText(gpu, "Well, that was bad...",0,0)
gpu.pop()
sleep(0)
drawtext.drawText(gpu, e,0,16)
print(e)
else
gpu.freeTexture(sectex)
end