mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-24 21:12:50 +01:00
345 lines
9.0 KiB
Lua
345 lines
9.0 KiB
Lua
|
||
------------------------------------------ Библиотеки -----------------------------------------------------------------
|
||
|
||
|
||
local component = require("component")
|
||
local colorlib = require("colorlib")
|
||
local event = require("event")
|
||
local gpu = component.gpu
|
||
local printer = component.printer3d
|
||
local hologram = component.hologram
|
||
|
||
------------------------------------------ Переменные -----------------------------------------------------------------
|
||
|
||
local pixels = {}
|
||
|
||
local model = {
|
||
label = "Sosi hui",
|
||
tooltip = "mamu ebal",
|
||
buttonMode = true,
|
||
redstoneEmitter = true,
|
||
active = {
|
||
{x = 1, y = 1, z = 1, x2 = 1, y2 = 1, z2 = 12},
|
||
|
||
{x = 1, y = 8, z = 1, x2 = 8, y2 = 8, z2 = 16},
|
||
|
||
{x = 16, y = 16, z = 16, x2 = 16, y2 = 16, z2 = 16},
|
||
},
|
||
passive = {}
|
||
}
|
||
|
||
local colors = {
|
||
objects = 0x3349FF,
|
||
points = 0xFFFFFF,
|
||
border = 0xFFFF00,
|
||
background = 0x262626,
|
||
rightBar = 0x383838,
|
||
lines = 0x222222,
|
||
|
||
}
|
||
local countOfShapes = printer.getMaxShapeCount()
|
||
local adder = 360 / countOfShapes
|
||
local hue = 0
|
||
colors.shapes = {}
|
||
for i = 1, countOfShapes do
|
||
table.insert(colors.shapes, colorlib.HSBtoHEX(hue, 100, 100))
|
||
hue = hue + adder
|
||
end
|
||
|
||
local sizes = {}
|
||
sizes.oldResolutionWidth, sizes.oldResolutionHeight = gpu.getResolution()
|
||
sizes.xSize, sizes.ySize = gpu.maxResolution()
|
||
--
|
||
sizes.widthOfRightBar, sizes.heightOfRightBar = 36, sizes.ySize
|
||
sizes.xStartOfRightBar, sizes.yStartOfRightBar = sizes.xSize - sizes.widthOfRightBar + 1, 1
|
||
--
|
||
sizes.widthOfHorizontal = sizes.xSize - sizes.widthOfRightBar
|
||
sizes.xStartOfVertical, sizes.yStartOfVertical = math.floor(sizes.widthOfHorizontal / 2), 1
|
||
sizes.xStartOfHorizontal, sizes.yStartOfHorizontal = 1, math.floor(sizes.ySize / 2)
|
||
--
|
||
sizes.widthOfPixel, sizes.heightOfPixel = 2, 1
|
||
sizes.image = {}
|
||
|
||
sizes.image[1] = {x = math.floor(sizes.xStartOfVertical / 2 - (sizes.widthOfPixel * 16) / 2), y = math.floor(sizes.yStartOfHorizontal / 2 - (sizes.heightOfPixel * 16) / 2)}
|
||
sizes.image[2] = {x = sizes.xStartOfVertical + sizes.image[1].x + 1, y = sizes.image[1].y}
|
||
sizes.image[3] = {x = sizes.image[1].x, y = sizes.yStartOfHorizontal + sizes.image[1].y + 1}
|
||
sizes.image[4] = {x = sizes.image[2].x, y = sizes.image[3].y}
|
||
|
||
local holoOutlineX, holoOutlineY, holoOutlineZ = 16, 24, 16
|
||
local currentShape = 1
|
||
local currentLayer = 1
|
||
|
||
------------------------------------------ Функции -----------------------------------------------------------------
|
||
|
||
local function drawTransparentBackground(x, y, color1, color2)
|
||
local xPos, yPos = x, y
|
||
local color
|
||
for j = 1, 16 do
|
||
for i = 1, 16 do
|
||
if i % 2 == 0 then
|
||
if j % 2 == 0 then
|
||
color = color1
|
||
else
|
||
color = color2
|
||
end
|
||
else
|
||
if j % 2 == 0 then
|
||
color = color2
|
||
else
|
||
color = color1
|
||
end
|
||
end
|
||
ecs.square(xPos, yPos, sizes.widthOfPixel, sizes.heightOfPixel, color)
|
||
xPos = xPos + sizes.widthOfPixel
|
||
end
|
||
xPos = x
|
||
yPos = yPos + sizes.heightOfPixel
|
||
end
|
||
end
|
||
|
||
local function changePalette()
|
||
hologram.setPaletteColor(1, colors.objects)
|
||
hologram.setPaletteColor(2, colors.points)
|
||
hologram.setPaletteColor(3, colors.border)
|
||
end
|
||
|
||
local function drawShapesList(x, y)
|
||
local xPos, yPos = x, y
|
||
local color
|
||
for i = 1, countOfShapes do
|
||
color = 0x000000
|
||
if i == currentShape then color = colors.shapes[i] end
|
||
ecs.drawButton(xPos, yPos, 4, 1, tostring(i), color, 0xFFFFFF )
|
||
xPos = xPos + 5
|
||
if i % 6 == 0 then xPos = x; yPos = yPos + 2 end
|
||
end
|
||
end
|
||
|
||
local function drawInfo(y, info)
|
||
ecs.square(sizes.xStartOfRightBar, y, sizes.widthOfRightBar, 1, 0x000000)
|
||
ecs.colorText(sizes.xStartOfRightBar + 2, y, 0xFFFFFF, info)
|
||
end
|
||
|
||
local function drawRightBar()
|
||
local xPos, yPos = sizes.xStartOfRightBar, sizes.yStartOfRightBar
|
||
ecs.square(xPos, yPos, sizes.widthOfRightBar, sizes.heightOfRightBar, colors.rightBar)
|
||
|
||
drawInfo(yPos, "Работа с моделью"); yPos = yPos + 2
|
||
|
||
yPos = yPos + 5
|
||
|
||
drawInfo(yPos, "Работа с объектом"); yPos = yPos + 2
|
||
|
||
yPos = yPos + 5
|
||
|
||
drawInfo(yPos, "Выбор объекта"); yPos = yPos + 3
|
||
drawShapesList(xPos + 2, yPos); yPos = yPos + (countOfShapes / 6 * 2) + 1
|
||
|
||
drawInfo(yPos, "Управление голограммой"); yPos = yPos + 2
|
||
|
||
yPos = yPos + 5
|
||
|
||
|
||
drawInfo(yPos, "Управление принтером"); yPos = yPos + 2
|
||
|
||
yPos = yPos + 5
|
||
|
||
|
||
end
|
||
|
||
local function drawLines()
|
||
ecs.square(sizes.xStartOfVertical, sizes.yStartOfVertical, 2, sizes.ySize,colors.lines)
|
||
ecs.square(sizes.xStartOfHorizontal, sizes.yStartOfHorizontal, sizes.widthOfHorizontal , 1, colors.lines)
|
||
end
|
||
|
||
local function drawViewArray(x, y, massiv)
|
||
local xPos, yPos = x, y
|
||
for i = 1, #massiv do
|
||
for j = 1, #massiv[i] do
|
||
if massiv[i][j] ~= "#" then
|
||
ecs.square(xPos, yPos, sizes.widthOfPixel, sizes.heightOfPixel, massiv[i][j])
|
||
end
|
||
xPos = xPos + sizes.widthOfPixel
|
||
end
|
||
xPos = x
|
||
yPos = yPos + sizes.heightOfPixel
|
||
end
|
||
end
|
||
|
||
--Нарисовать вид спереди
|
||
local function drawFrontView()
|
||
local massiv = {}
|
||
for i = 1, 16 do
|
||
massiv[i] = {}
|
||
for j = 1, 16 do
|
||
massiv[i][j] = "#"
|
||
end
|
||
end
|
||
for x = 1, #pixels do
|
||
for y = 1, #pixels[x] do
|
||
for z = 1, #pixels[x][y] do
|
||
if pixels[x][y][z] ~= "#" then
|
||
massiv[y][x] = pixels[x][y][z]
|
||
end
|
||
end
|
||
end
|
||
end
|
||
drawViewArray(sizes.image[1].x, sizes.image[1].y, massiv)
|
||
end
|
||
|
||
--Нарисовать вид сверху
|
||
local function drawTopView()
|
||
local massiv = {}
|
||
for i = 1, 16 do
|
||
massiv[i] = {}
|
||
for j = 1, 16 do
|
||
massiv[i][j] = "#"
|
||
end
|
||
end
|
||
for x = 1, #pixels do
|
||
for y = 1, #pixels[x] do
|
||
for z = 1, #pixels[x][y] do
|
||
if pixels[x][y][z] ~= "#" then
|
||
massiv[z][x] = pixels[x][y][z]
|
||
end
|
||
end
|
||
end
|
||
end
|
||
drawViewArray(sizes.image[3].x, sizes.image[3].y, massiv)
|
||
end
|
||
|
||
--Нарисовать вид сбоку
|
||
local function drawSideView()
|
||
local massiv = {}
|
||
for i = 1, 16 do
|
||
massiv[i] = {}
|
||
for j = 1, 16 do
|
||
massiv[i][j] = "#"
|
||
end
|
||
end
|
||
for x = 1, #pixels do
|
||
for y = 1, #pixels[x] do
|
||
for z = 1, #pixels[x][y] do
|
||
if pixels[x][y][z] ~= "#" then
|
||
massiv[y][z] = pixels[x][y][z]
|
||
end
|
||
end
|
||
end
|
||
end
|
||
drawViewArray(sizes.image[2].x, sizes.image[2].y, massiv)
|
||
end
|
||
|
||
--Сконвертировать массив объектов в трехмерный массив 3D-изображения
|
||
local function render()
|
||
pixels = {}
|
||
|
||
for x = 1, 16 do
|
||
pixels[x] = {}
|
||
for y = 1, 16 do
|
||
pixels[x][y] = {}
|
||
for z = 1, 16 do
|
||
pixels[x][y][z] = "#"
|
||
end
|
||
end
|
||
end
|
||
|
||
for x = 1, 16 do
|
||
for y = 1, 16 do
|
||
for z = 1, 16 do
|
||
for i = 1, #model.active do
|
||
if (x >= model.active[i].x and x <= model.active[i].x2) and (y >= model.active[i].y and y <= model.active[i].y2) and (z >= model.active[i].z and z <= model.active[i].z2) then
|
||
pixels[x][y][z] = colors.shapes[i]
|
||
--hologram.set(x, y, z, 1)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
local function drawBorder()
|
||
for i = 0, 17 do
|
||
hologram.set(i + holoOutlineX, holoOutlineY - currentLayer, holoOutlineZ, 3)
|
||
hologram.set(i + holoOutlineX, holoOutlineY - currentLayer, 17 + holoOutlineZ, 3)
|
||
hologram.set(holoOutlineX, holoOutlineY - currentLayer, i + holoOutlineZ, 3)
|
||
hologram.set(17 + holoOutlineX, holoOutlineY - currentLayer, i + holoOutlineZ, 3)
|
||
end
|
||
end
|
||
|
||
local function drawFrame()
|
||
--Верхний левый
|
||
for i = 1, 2 do hologram.set(i + holoOutlineX - 1, holoOutlineY - 1, holoOutlineZ, 2) end
|
||
hologram.set(holoOutlineX, holoOutlineY - 1, holoOutlineZ + 1, 2)
|
||
hologram.set(holoOutlineX, holoOutlineY - 2, holoOutlineZ, 2)
|
||
--Верхний левый
|
||
for i = 1, 2 do hologram.set(i + holoOutlineX - 1, holoOutlineY - 16, holoOutlineZ, 2) end
|
||
hologram.set(holoOutlineX, holoOutlineY - 16, holoOutlineZ + 1, 2)
|
||
hologram.set(holoOutlineX, holoOutlineY - 15, holoOutlineZ, 2)
|
||
end
|
||
|
||
local function drawModelOnHolo()
|
||
hologram.clear()
|
||
for x = 1, #pixels do
|
||
for y = 1, #pixels[x] do
|
||
for z = 1, #pixels[x][y] do
|
||
if pixels[x][y][z] ~= "#" then
|
||
hologram.set(x + holoOutlineX, holoOutlineY - y, z + holoOutlineZ, 1)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
drawBorder()
|
||
--drawFrame()
|
||
end
|
||
|
||
local function drawAllViews()
|
||
render()
|
||
drawModelOnHolo()
|
||
drawFrontView()
|
||
drawTopView()
|
||
drawSideView()
|
||
|
||
drawTransparentBackground(sizes.image[4].x, sizes.image[4].y, 0xFFFFFF, 0xDDDDDD)
|
||
end
|
||
|
||
local function drawAll()
|
||
drawLines()
|
||
drawAllViews()
|
||
drawRightBar()
|
||
end
|
||
|
||
------------------------------------------ Программа -----------------------------------------------------------------
|
||
|
||
if sizes.xSize < 150 then ecs.error("Этой программе требуется монитор и видеокарта 3 уровня."); return end
|
||
|
||
gpu.setResolution(sizes.xSize, sizes.ySize)
|
||
|
||
ecs.prepareToExit()
|
||
changePalette()
|
||
drawAll()
|
||
|
||
while true do
|
||
local e = {event.pull()}
|
||
if e[1] == "scroll" then
|
||
if e[5] == 1 then
|
||
if currentLayer > 1 then currentLayer = currentLayer - 1;drawModelOnHolo() end
|
||
else
|
||
if currentLayer < 16 then currentLayer = currentLayer + 1;drawModelOnHolo() end
|
||
end
|
||
end
|
||
end
|
||
|
||
------------------------------------------ Выход из программы -----------------------------------------------------------------
|
||
|
||
gpu.setResolution(sizes.oldResolutionWidth, sizes.oldResolutionHeight)
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|