Igor Timofeev 54a97ec96d мяу
2015-10-26 11:28:00 +03:00

227 lines
5.9 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local component = require("component")
local buffer = require("doubleBuffering")
local event = require("event")
local camera
if not component.isAvailable("camera") then
ecs.error("Этой программе требуется камера из мода Computronix.")
return
else
camera = component.camera
end
local step = 0.04
local from = step * 25
local distanceLimit = 36
local widthOfImage, heightOfImage = 100, 50
local grayScale = {
0x000000,
0x111111,
0x111111,
0x222222,
0x333333,
0x333333,
0x444444,
0x555555,
0x666666,
0x777777,
0x777777,
0x888888,
0x999999,
0xaaaaaa,
0xbbbbbb,
0xbbbbbb,
0xcccccc,
0xdddddd,
0xeeeeee,
0xeeeeee,
0xffffff,
}
local rainbow = {
0x000000,
0x000040,
0x000080,
0x002480,
0x0000BF,
0x0024BF,
0x002400,
0x004900,
0x006D00,
0x009200,
0x00B600,
0x33DB00,
0x99FF00,
0xCCFF00,
0xFFDB00,
0xFFB600,
0xFF9200,
0xFF6D00,
0xFF4900,
0xFF2400,
0xFF0000,
}
local currentPalette = rainbow
local topObjects
local currentTopObject = 0
local function gui()
topObjects = ecs.drawTopMenu(1, 1, widthOfImage, 0xeeeeee, currentTopObject, {"Камера", 0x000000}, {"Сделать снимок", 0x444444}, {"Параметры рендера", 0x444444}, {"Палитра", 0x444444})
end
local function capture(x, y)
local xPos, yPos = x, y
local distance, color
local oldPixels = ecs.info("auto", "auto", " ", " Делаю снимок... ")
for y = from, -from, -step do
for x = -from, from, step do
distance = camera.distance(x, y)
if distance >= 0 then
if distance > distanceLimit then distance = distanceLimit end
color = currentPalette[(#currentPalette + 1) - math.ceil(distance / (distanceLimit / #currentPalette))]
buffer.set(xPos, yPos, color, 0x000000, " ")
buffer.set(xPos + 1, yPos, color, 0x000000, " ")
else
buffer.set(xPos, yPos, 0x000000, 0x000000, " ")
buffer.set(xPos + 1, yPos, 0x000000, 0x000000, " ")
end
percent = (x * y) / (widthOfImage * heightOfImage)
xPos = xPos + 2
end
xPos = x
yPos = yPos + 1
end
ecs.drawOldPixels(oldPixels)
end
local function drawDistanceMeter()
local width = 4
local xPos, yPos = widthOfImage - 3 - width, 3
buffer.square(xPos, yPos, width + 2, #currentPalette * 2 + 2, 0x000000, 0x000000, " ")
yPos = yPos + 1
xPos = xPos + 1
for i = #currentPalette, 1, -1 do
buffer.square(xPos, yPos, width, 2, currentPalette[i], 0x000000, " ")
yPos = yPos + 2
end
end
local xOld, yOld = gpu.getResolution()
gpu.setResolution(100, 50)
buffer.start()
gui()
ecs.square(1, 2, widthOfImage, heightOfImage - 1, 0x000000)
buffer.square(1, 2, widthOfImage, heightOfImage - 1, 0x000000, 0x000000, " ")
capture(1, 1)
drawDistanceMeter()
buffer.draw()
gui()
while true do
local e = {event.pull()}
if e[1] == "touch" then
for key in pairs(topObjects) do
if ecs.clickedAtArea(e[3], e[4], topObjects[key][1], topObjects[key][2], topObjects[key][3], topObjects[key][4]) then
currentTopObject = topObjects[key][5]
gui()
if key == "Камера" then
local action = context.menu(topObjects[key][1] - 1, 2, {"О программе"}, {"Выход"})
if action == "О программе" then
local text = "Эта программа является тестом библиотеки двойной буферизации изображения, написана для проверки адекватности нескольких функций. Сама идея сперта у какого-то крутого парня с форума CC, однако немного доработана в GUI-плане. Такие дела."
ecs.universalWindow("auto", "auto", 36, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x000000, "О программе \"Камера\""}, {"EmptyLine"}, {"TextField", 9, 0xFFFFFF, 0x000000, 0xaaaaaa, ecs.colors.blue, text}, {"EmptyLine"}, {"Button", {0x999999, 0xffffff, "OK"}})
elseif action == "Выход" then
gpu.setResolution(xOld, yOld)
ecs.prepareToExit()
return
end
elseif key == "Сделать снимок" then
capture(1, 1)
drawDistanceMeter()
buffer.draw()
gui()
elseif key == "Параметры рендера" then
local action = context.menu(topObjects[key][1] - 1, 2, {"Масштаб"}, {"Дальность рейкастинга"})
if action == "Масштаб" then
local data = ecs.universalWindow("auto", "auto", 36, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x000000, "Изменить масштаб:"}, {"EmptyLine"}, {"Slider", 0x262626, 0x880000, 1, 100, 100, "", "%"}, {"EmptyLine"}, {"Button", {0x999999, 0xffffff, "OK"}})
local part = (0.04 - 0.01) / 100
local percent = part * data[1]
step = percent
from = step * 25
capture(1, 1)
drawDistanceMeter()
buffer.draw()
gui()
elseif action == "Дальность рейкастинга" then
local data = ecs.universalWindow("auto", "auto", 36, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x000000, "Изменить дальность:"}, {"EmptyLine"}, {"Slider", 0x262626, 0x880000, 10, 36, distanceLimit, "", " блоков"}, {"EmptyLine"}, {"Button", {0x999999, 0xffffff, "OK"}})
distanceLimit = data[1]
capture(1, 1)
drawDistanceMeter()
buffer.draw()
gui()
end
elseif key == "Палитра" then
local action = context.menu(topObjects[key][1] - 1, 2, {"Черно-белая"}, {"Термальная"})
if action == "Черно-белая" then
currentPalette = grayScale
capture(1, 1)
drawDistanceMeter()
buffer.draw()
gui()
elseif action == "Термальная" then
currentPalette = rainbow
capture(1, 1)
drawDistanceMeter()
buffer.draw()
gui()
end
end
currentTopObject = 0
gui()
break
end
end
end
end