mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 19:19:21 +01:00
227 lines
5.9 KiB
Lua
227 lines
5.9 KiB
Lua
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
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|