mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 02:59:20 +01:00
537 lines
26 KiB
Lua
Executable File
537 lines
26 KiB
Lua
Executable File
|
||
-------------------------------------------------------- Libraries --------------------------------------------------------
|
||
|
||
-- package.loaded["GUI"] = nil
|
||
-- package.loaded["doubleBuffering"] = nil
|
||
-- package.loaded["vector"] = nil
|
||
-- package.loaded["OpenComputersGL/Main"] = nil
|
||
-- package.loaded["OpenComputersGL/Materials"] = nil
|
||
-- package.loaded["OpenComputersGL/Renderer"] = nil
|
||
-- package.loaded["MeowEngine/Main"] = nil
|
||
|
||
local color = require("color")
|
||
local computer = require("computer")
|
||
local buffer = require("doubleBuffering")
|
||
local event = require("event")
|
||
local GUI = require("GUI")
|
||
local vector = require("vector")
|
||
local materials = require("OpenComputersGL/Materials")
|
||
local renderer = require("OpenComputersGL/Renderer")
|
||
local OCGL = require("OpenComputersGL/Main")
|
||
local meowEngine = require("MeowEngine/Main")
|
||
|
||
---------------------------------------------- Anus preparing ----------------------------------------------
|
||
|
||
-- /MineOS/Desktop/3DTest.app/3DTest.lua
|
||
|
||
buffer.flush()
|
||
meowEngine.intro(vector.newVector3(0, 0, 0), 20)
|
||
|
||
local mainContainer = GUI.fullScreenContainer()
|
||
local scene = meowEngine.newScene(0x1D1D1D)
|
||
|
||
scene.renderMode = OCGL.renderModes.flatShading
|
||
scene.auxiliaryMode = OCGL.auxiliaryModes.disabled
|
||
|
||
scene.camera:translate(-2.5, 8.11, -19.57)
|
||
scene.camera:rotate(math.rad(30), 0, 0)
|
||
scene:addLight(meowEngine.newLight(vector.newVector3(0, 20, 0), 1.0, 200))
|
||
|
||
---------------------------------------------- Constants ----------------------------------------------
|
||
|
||
local blockSize = 5
|
||
local rotationAngle = math.rad(5)
|
||
local translationOffset = 1
|
||
|
||
---------------------------------------------- Voxel-world system ----------------------------------------------
|
||
|
||
local world = {{{}}}
|
||
|
||
local worldMesh = scene:addObject(
|
||
meowEngine.newMesh(
|
||
vector.newVector3(0, 0, 0), { }, { },
|
||
materials.newSolidMaterial(0xFF00FF)
|
||
)
|
||
)
|
||
|
||
local function checkBlock(x, y, z)
|
||
if world[z] and world[z][y] and world[z][y][x] then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
local function setBlock(x, y, z, value)
|
||
world[z] = world[z] or {}
|
||
world[z][y] = world[z][y] or {}
|
||
world[z][y][x] = value
|
||
end
|
||
|
||
local blockSides = {
|
||
front = 1,
|
||
left = 2,
|
||
back = 3,
|
||
right = 4,
|
||
up = 5,
|
||
down = 6
|
||
}
|
||
|
||
local function renderWorld()
|
||
worldMesh.vertices = {}
|
||
worldMesh.triangles = {}
|
||
|
||
for z in pairs(world) do
|
||
for y in pairs(world[z]) do
|
||
for x in pairs(world[z][y]) do
|
||
local firstVertexIndex = #worldMesh.vertices + 1
|
||
local xBlock, yBlock, zBlock = (x - 1) * blockSize, (y - 1) * blockSize, (z - 1) * blockSize
|
||
local material = materials.newSolidMaterial(world[z][y][x])
|
||
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock, yBlock, zBlock))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock, yBlock + blockSize, zBlock))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock + blockSize, yBlock + blockSize, zBlock))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock + blockSize, yBlock, zBlock))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock, yBlock, zBlock + blockSize))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock, yBlock + blockSize, zBlock + blockSize))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock + blockSize, yBlock + blockSize, zBlock + blockSize))
|
||
table.insert(worldMesh.vertices, vector.newVector3(xBlock + blockSize, yBlock, zBlock + blockSize))
|
||
|
||
-- Front (1, 2)
|
||
if not checkBlock(x, y, z - 1) then
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex, firstVertexIndex + 1, firstVertexIndex + 2, material))
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 3, firstVertexIndex, firstVertexIndex + 2, material))
|
||
end
|
||
|
||
-- Left (3, 4)
|
||
if not checkBlock(x - 1, y, z) then
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 5, firstVertexIndex + 1, firstVertexIndex + 4, material))
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 1, firstVertexIndex, firstVertexIndex + 4, material))
|
||
end
|
||
|
||
-- Back (5, 6)
|
||
if not checkBlock(x, y, z + 1) then
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 6, firstVertexIndex + 5, firstVertexIndex + 7, material))
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 5, firstVertexIndex + 4, firstVertexIndex + 7, material))
|
||
end
|
||
|
||
-- Right (7, 8)
|
||
if not checkBlock(x + 1, y, z) then
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 3, firstVertexIndex + 2, firstVertexIndex + 6, material))
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 7, firstVertexIndex + 3, firstVertexIndex + 6, material))
|
||
end
|
||
|
||
-- Up (9, 10)
|
||
if not checkBlock(x, y + 1, z) then
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 1, firstVertexIndex + 5, firstVertexIndex + 6, material))
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 2, firstVertexIndex + 1, firstVertexIndex + 6, material))
|
||
end
|
||
|
||
-- Down (11, 12)
|
||
if not checkBlock(x, y - 1, z) then
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex + 4, firstVertexIndex, firstVertexIndex + 7, material))
|
||
table.insert(worldMesh.triangles, OCGL.newIndexedTriangle(firstVertexIndex, firstVertexIndex + 3, firstVertexIndex + 7, material))
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- Mode 1
|
||
local hue, hueStep = 0, 360 / 9
|
||
for z = -1, 1 do
|
||
for x = -1, 1 do
|
||
if not (x == 0 and z == 0) then
|
||
setBlock(x, 0, z, color.HSBToInteger(hue, 1, 1))
|
||
hue = hue + hueStep
|
||
end
|
||
end
|
||
end
|
||
|
||
-- -- Mode 2
|
||
-- for z = 1, 7 do
|
||
-- for x = -3, 3 do
|
||
-- setBlock(x, 0, z, 0xFFFFFF)
|
||
-- end
|
||
-- end
|
||
|
||
---------------------------------------------- Cat ----------------------------------------------
|
||
|
||
-- scene:addObject(meowEngine.newPolyCatMesh(vector.newVector3(0, 5, 0), 5))
|
||
-- scene:addObject(meowEngine.newFloatingText(vector.newVector3(0, -2, 0), 0xEEEEEE, "Тест плавающего текста"))
|
||
|
||
---------------------------------------------- Texture ----------------------------------------------
|
||
|
||
-- scene.camera:translate(0, 20, 0)
|
||
-- scene.camera:rotate(math.rad(90), 0, 0)
|
||
-- local texturedPlane = scene:addObject(meowEngine.newTexturedPlane(vector.newVector3(0, 0, 0), 20, 20, materials.newDebugTexture(16, 16, 40)))
|
||
|
||
---------------------------------------------- Wave ----------------------------------------------
|
||
|
||
-- local xCells, yCells = 4, 1
|
||
-- local plane = meowEngine.newPlane(vector.newVector3(0, 0, 0), 40, 15, xCells, yCells, materials.newSolidMaterial(0xFFFFFF))
|
||
-- plane.nextWave = function(mesh)
|
||
-- for xCell = 1, xCells do
|
||
-- for yCell = 1, yCells do
|
||
|
||
-- end
|
||
-- end
|
||
-- end
|
||
|
||
---------------------------------------------- Fractal field ----------------------------------------------
|
||
|
||
-- local function createField(vector3Position, xCellCount, yCellCount, cellSize)
|
||
-- local totalWidth, totalHeight = xCellCount * cellSize, yCellCount * cellSize
|
||
-- local halfWidth, halfHeight = totalWidth / 2, totalHeight / 2
|
||
-- xCellCount, yCellCount = xCellCount + 1, yCellCount + 1
|
||
-- local vertices, triangles = {}, {}
|
||
|
||
-- local vertexIndex = 1
|
||
-- for yCell = 1, yCellCount do
|
||
-- for xCell = 1, xCellCount do
|
||
-- table.insert(vertices, vector.newVector3(xCell * cellSize - cellSize - halfWidth, yCell * cellSize - cellSize - halfHeight, 0))
|
||
|
||
-- if xCell < xCellCount and yCell < yCellCount then
|
||
-- table.insert(triangles,
|
||
-- OCGL.newIndexedTriangle(
|
||
-- vertexIndex,
|
||
-- vertexIndex + 1,
|
||
-- vertexIndex + xCellCount
|
||
-- )
|
||
-- )
|
||
-- table.insert(triangles,
|
||
-- OCGL.newIndexedTriangle(
|
||
-- vertexIndex + 1,
|
||
-- vertexIndex + xCellCount + 1,
|
||
-- vertexIndex + xCellCount
|
||
-- )
|
||
-- )
|
||
-- end
|
||
|
||
-- vertexIndex = vertexIndex + 1
|
||
-- end
|
||
-- end
|
||
|
||
-- local mesh = meowEngine.newMesh(vector3Position, vertices, triangles,materials.newSolidMaterial(0xFF8888))
|
||
|
||
-- local function getRandomSignedInt(from, to)
|
||
-- return (math.random(0, 1) == 1 and 1 or -1) * (math.random(from, to))
|
||
-- end
|
||
|
||
-- local function getRandomDirection()
|
||
-- return getRandomSignedInt(5, 100) / 100
|
||
-- end
|
||
|
||
-- mesh.randomizeTrianglesColor = function(mesh, hueChangeSpeed, brightnessChangeSpeed, minimumBrightness)
|
||
-- mesh.hue = mesh.hue and mesh.hue + hueChangeSpeed or math.random(0, 360)
|
||
-- if mesh.hue > 359 then mesh.hue = 0 end
|
||
|
||
-- for triangleIndex = 1, #mesh.triangles do
|
||
-- mesh.triangles[triangleIndex].brightness = mesh.triangles[triangleIndex].brightness and mesh.triangles[triangleIndex].brightness + getRandomSignedInt(1, brightnessChangeSpeed) or math.random(minimumBrightness, 100)
|
||
-- if mesh.triangles[triangleIndex].brightness > 100 then
|
||
-- mesh.triangles[triangleIndex].brightness = 100
|
||
-- elseif mesh.triangles[triangleIndex].brightness < minimumBrightness then
|
||
-- mesh.triangles[triangleIndex].brightness = minimumBrightness
|
||
-- end
|
||
-- mesh.triangles[triangleIndex][4] = materials.newSolidMaterial(color.HSBToInteger(mesh.hue, 1, mesh.triangles[triangleIndex].brightness))
|
||
-- end
|
||
-- end
|
||
|
||
-- mesh.randomizeVerticesPosition = function(mesh, speed)
|
||
-- local vertexIndex = 1
|
||
-- for yCell = 1, yCellCount do
|
||
-- for xCell = 1, xCellCount do
|
||
-- if xCell > 1 and xCell < xCellCount and yCell > 1 and yCell < yCellCount then
|
||
-- mesh.vertices[vertexIndex].offset = mesh.vertices[vertexIndex].offset or {0, 0}
|
||
-- mesh.vertices[vertexIndex].direction = mesh.vertices[vertexIndex].direction or {getRandomDirection(), getRandomDirection()}
|
||
|
||
-- local newOffset = {
|
||
-- mesh.vertices[vertexIndex].direction[1] * (speed * cellSize),
|
||
-- mesh.vertices[vertexIndex].direction[1] * (speed * cellSize)
|
||
-- }
|
||
|
||
-- for i = 1, 2 do
|
||
-- if math.abs(mesh.vertices[vertexIndex].offset[i] + newOffset[i]) < cellSize / 2 then
|
||
-- mesh.vertices[vertexIndex].offset[i] = mesh.vertices[vertexIndex].offset[i] + newOffset[i]
|
||
-- mesh.vertices[vertexIndex][i] = mesh.vertices[vertexIndex][i] + newOffset[i]
|
||
-- else
|
||
-- mesh.vertices[vertexIndex].direction[i] = getRandomDirection()
|
||
-- end
|
||
-- end
|
||
-- end
|
||
-- vertexIndex = vertexIndex + 1
|
||
-- end
|
||
-- end
|
||
-- end
|
||
|
||
-- return mesh
|
||
-- end
|
||
|
||
-- local plane = createField(vector.newVector3(0, 0, 0), 8, 4, 4)
|
||
-- scene:addObject(plane)
|
||
-- plane:randomizeTrianglesColor(10, 10, 50)
|
||
|
||
-------------------------------------------------------- Controls --------------------------------------------------------
|
||
|
||
local function move(x, y, z)
|
||
local moveVector = vector.newVector3(x, y, z)
|
||
OCGL.rotateVectorRelativeToXAxis(moveVector, scene.camera.rotation[1])
|
||
OCGL.rotateVectorRelativeToYAxis(moveVector, scene.camera.rotation[2])
|
||
scene.camera:translate(moveVector[1], moveVector[2], moveVector[3])
|
||
end
|
||
|
||
local function moveLight(x, y, z)
|
||
scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].position[1] = scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].position[1] + x
|
||
scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].position[2] = scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].position[2] + y
|
||
scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].position[3] = scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].position[3] + z
|
||
end
|
||
|
||
local controls = {
|
||
-- F1
|
||
[59 ] = function() mainContainer.toolbar.hidden = not mainContainer.toolbar.hidden; mainContainer.infoTextBox.hidden = not mainContainer.infoTextBox.hidden end,
|
||
-- Arrows
|
||
[200] = function() scene.camera:rotate(-rotationAngle, 0, 0) end,
|
||
[208] = function() scene.camera:rotate(rotationAngle, 0, 0) end,
|
||
[203] = function() scene.camera:rotate(0, -rotationAngle, 0) end,
|
||
[205] = function() scene.camera:rotate(0, rotationAngle, 0) end,
|
||
[16 ] = function() scene.camera:rotate(0, 0, rotationAngle) end,
|
||
[18 ] = function() scene.camera:rotate(0, 0, -rotationAngle) end,
|
||
-- WASD
|
||
[17 ] = function() move(0, 0, translationOffset) end,
|
||
[31 ] = function() move(0, 0, -translationOffset) end,
|
||
[30 ] = function() move(-translationOffset, 0, 0) end,
|
||
[32 ] = function() move(translationOffset, 0, 0) end,
|
||
-- RSHIFT, SPACE
|
||
[42 ] = function() move(0, -translationOffset, 0) end,
|
||
[57 ] = function() move(0, translationOffset, 0) end,
|
||
-- NUM 4 6 8 5 1 3
|
||
[75 ] = function() moveLight(-translationOffset, 0, 0) end,
|
||
[77 ] = function() moveLight(translationOffset, 0, 0) end,
|
||
[72 ] = function() moveLight(0, 0, translationOffset) end,
|
||
[80 ] = function() moveLight(0, 0, -translationOffset) end,
|
||
[79 ] = function() moveLight(0, -translationOffset, 0) end,
|
||
[81 ] = function() moveLight(0, translationOffset, 0) end,
|
||
}
|
||
|
||
-------------------------------------------------------- GUI --------------------------------------------------------
|
||
|
||
local OCGLView = GUI.object(1, 1, mainContainer.width, mainContainer.height)
|
||
|
||
local function drawInvertedText(x, y, text)
|
||
local index = buffer.getIndex(x, y)
|
||
local background, foreground = buffer.rawGet(index)
|
||
buffer.rawSet(index, background, 0xFFFFFF - foreground, text)
|
||
end
|
||
|
||
local function drawCross(x, y)
|
||
drawInvertedText(x - 2, y, "━")
|
||
drawInvertedText(x - 1, y, "━")
|
||
drawInvertedText(x + 2, y, "━")
|
||
drawInvertedText(x + 1, y, "━")
|
||
drawInvertedText(x, y - 1, "┃")
|
||
drawInvertedText(x, y + 1, "┃")
|
||
end
|
||
|
||
OCGLView.draw = function(object)
|
||
mainContainer.oldClock = os.clock()
|
||
if world then renderWorld() end
|
||
scene:render()
|
||
if mainContainer.toolbar.zBufferSwitch.state then
|
||
renderer.visualizeDepthBuffer()
|
||
end
|
||
drawCross(renderer.viewport.xCenter, math.floor(renderer.viewport.yCenter / 2))
|
||
end
|
||
|
||
OCGLView.eventHandler = function(mainContainer, object, e1, e2, e3, e4, e5)
|
||
if e1 == "touch" then
|
||
local targetVector = vector.newVector3(scene.camera.position[1], scene.camera.position[2], scene.camera.position[3] + 1000)
|
||
OCGL.rotateVectorRelativeToXAxis(targetVector, scene.camera.rotation[1])
|
||
OCGL.rotateVectorRelativeToYAxis(targetVector, scene.camera.rotation[2])
|
||
local objectIndex, triangleIndex, distance = meowEngine.sceneRaycast(scene, scene.camera.position, targetVector)
|
||
|
||
if objectIndex then
|
||
local triangle = scene.objects[objectIndex].triangles[triangleIndex]
|
||
local xWorld = math.floor(((scene.objects[objectIndex].vertices[scene.objects[objectIndex].triangles[triangleIndex][1]][1] + scene.objects[objectIndex].vertices[scene.objects[objectIndex].triangles[triangleIndex][2]][1] + scene.objects[objectIndex].vertices[scene.objects[objectIndex].triangles[triangleIndex][3]][1]) / 3) / blockSize) + 1
|
||
local yWorld = math.floor(((scene.objects[objectIndex].vertices[triangle[1]][2] + scene.objects[objectIndex].vertices[triangle[2]][2] + scene.objects[objectIndex].vertices[triangle[3]][2]) / 3) / blockSize) + 1
|
||
local zWorld = math.floor(((scene.objects[objectIndex].vertices[triangle[1]][3] + scene.objects[objectIndex].vertices[triangle[2]][3] + scene.objects[objectIndex].vertices[triangle[3]][3]) / 3) / blockSize) + 1
|
||
|
||
local normalVector = vector.getSurfaceNormal(
|
||
scene.objects[objectIndex].vertices[triangle[1]],
|
||
scene.objects[objectIndex].vertices[triangle[2]],
|
||
scene.objects[objectIndex].vertices[triangle[3]]
|
||
)
|
||
|
||
if normalVector[1] > 0 and e5 ~= 1 or normalVector[1] < 0 and e5 == 1 then
|
||
xWorld = xWorld - 1
|
||
elseif normalVector[2] > 0 and e5 ~= 1 or normalVector[2] < 0 and e5 == 1 then
|
||
yWorld = yWorld - 1
|
||
elseif normalVector[3] > 0 and e5 ~= 1 or normalVector[3] < 0 and e5 == 1 then
|
||
zWorld = zWorld - 1
|
||
end
|
||
|
||
setBlock(xWorld, yWorld, zWorld, e5 == 1 and mainContainer.toolbar.blockColorSelector.color or nil)
|
||
end
|
||
end
|
||
end
|
||
|
||
mainContainer:addChild(OCGLView)
|
||
|
||
mainContainer.infoTextBox = mainContainer:addChild(GUI.textBox(2, 4, 45, mainContainer.height, nil, 0xEEEEEE, {}, 1, 0, 0))
|
||
local lines = {
|
||
"Copyright © 2016-2017 - Developed by ECS Inc.",
|
||
"Timofeef Igor (vk.com/id7799889), Trifonov Gleb (vk.com/id88323331), Verevkin Yakov (vk.com/id60991376), Bogushevich Victoria (vk.com/id171497518)",
|
||
"All rights reserved",
|
||
}
|
||
mainContainer:addChild(GUI.textBox(1, mainContainer.height - #lines + 1, mainContainer.width, #lines, nil, 0x3C3C3C, lines, 1)):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP)
|
||
|
||
local elementY = 2
|
||
mainContainer.toolbar = mainContainer:addChild(GUI.container(mainContainer.width - 31, 1, 32, mainContainer.height))
|
||
local elementWidth = mainContainer.toolbar.width - 2
|
||
mainContainer.toolbar:addChild(GUI.panel(1, 1, mainContainer.toolbar.width, mainContainer.toolbar.height, 0x0, 0.5))
|
||
|
||
mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "Render mode")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); elementY = elementY + 2
|
||
mainContainer.toolbar.renderModeComboBox = mainContainer.toolbar:addChild(GUI.comboBox(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0x888888)); elementY = elementY + mainContainer.toolbar.renderModeComboBox.height + 1
|
||
mainContainer.toolbar.renderModeComboBox:addItem("disabled")
|
||
mainContainer.toolbar.renderModeComboBox:addItem("constantShading")
|
||
mainContainer.toolbar.renderModeComboBox:addItem("flatShading")
|
||
mainContainer.toolbar.renderModeComboBox.selectedItem = scene.renderMode
|
||
mainContainer.toolbar.renderModeComboBox.onItemSelected = function()
|
||
scene.renderMode = mainContainer.toolbar.renderModeComboBox.selectedItem
|
||
end
|
||
|
||
mainContainer.toolbar.auxiliaryModeComboBox = mainContainer.toolbar:addChild(GUI.comboBox(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0x888888)); elementY = elementY + mainContainer.toolbar.auxiliaryModeComboBox.height + 1
|
||
mainContainer.toolbar.auxiliaryModeComboBox:addItem("disabled")
|
||
mainContainer.toolbar.auxiliaryModeComboBox:addItem("wireframe")
|
||
mainContainer.toolbar.auxiliaryModeComboBox:addItem("vertices")
|
||
mainContainer.toolbar.auxiliaryModeComboBox.selectedItem = scene.auxiliaryMode
|
||
mainContainer.toolbar.auxiliaryModeComboBox.onItemSelected = function()
|
||
scene.auxiliaryMode = mainContainer.toolbar.auxiliaryModeComboBox.selectedItem
|
||
end
|
||
|
||
mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xAAAAAA, "Perspective proj:"))
|
||
mainContainer.toolbar.perspectiveSwitch = mainContainer.toolbar:addChild(GUI.switch(mainContainer.toolbar.width - 8, elementY, 8, 0x66DB80, 0x2D2D2D, 0xEEEEEE, scene.camera.projectionEnabled)); elementY = elementY + 2
|
||
mainContainer.toolbar.perspectiveSwitch.onStateChanged = function()
|
||
scene.camera.projectionEnabled = mainContainer.toolbar.perspectiveSwitch.state
|
||
end
|
||
|
||
mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xAAAAAA, "Z-buffer visualize:"))
|
||
mainContainer.toolbar.zBufferSwitch = mainContainer.toolbar:addChild(GUI.switch(mainContainer.toolbar.width - 8, elementY, 8, 0x66DB80, 0x2D2D2D, 0xEEEEEE, false)); elementY = elementY + 2
|
||
|
||
|
||
local function calculateLightComboBox()
|
||
mainContainer.toolbar.lightSelectComboBox.dropDownMenu.itemsContainer.children = {}
|
||
for i = 1, #scene.lights do
|
||
mainContainer.toolbar.lightSelectComboBox:addItem(tostring(i))
|
||
end
|
||
mainContainer.toolbar.lightSelectComboBox.selectedItem = #mainContainer.toolbar.lightSelectComboBox.dropDownMenu.itemsContainer.children
|
||
mainContainer.toolbar.lightIntensitySlider.value = scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].intensity * 100
|
||
mainContainer.toolbar.lightEmissionSlider.value = scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].emissionDistance
|
||
end
|
||
|
||
mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "Light control")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); elementY = elementY + 2
|
||
mainContainer.toolbar.lightSelectComboBox = mainContainer.toolbar:addChild(GUI.comboBox(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0x888888)); elementY = elementY + mainContainer.toolbar.lightSelectComboBox.height + 1
|
||
|
||
mainContainer.toolbar.addLightButton = mainContainer.toolbar:addChild(GUI.button(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0xAAAAAA, "Add light")); elementY = elementY + 2
|
||
mainContainer.toolbar.addLightButton.onTouch = function()
|
||
scene:addLight(meowEngine.newLight(vector.newVector3(0, 10, 0), mainContainer.toolbar.lightIntensitySlider.value / 100, mainContainer.toolbar.lightEmissionSlider.value))
|
||
calculateLightComboBox()
|
||
end
|
||
|
||
mainContainer.toolbar.removeLightButton = mainContainer.toolbar:addChild(GUI.button(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0xAAAAAA, "Remove light")); elementY = elementY + 2
|
||
mainContainer.toolbar.removeLightButton.onTouch = function()
|
||
if #scene.lights > 1 then
|
||
table.remove(scene.lights, mainContainer.toolbar.lightSelectComboBox.selectedItem)
|
||
calculateLightComboBox()
|
||
end
|
||
end
|
||
|
||
mainContainer.toolbar.lightIntensitySlider = mainContainer.toolbar:addChild(GUI.slider(2, elementY, elementWidth, 0xCCCCCC, 0x2D2D2D, 0xEEEEEE, 0xAAAAAA, 0, 500, 100, false, "Intensity: ", "")); elementY = elementY + 3
|
||
mainContainer.toolbar.lightIntensitySlider.onValueChanged = function()
|
||
scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].intensity = mainContainer.toolbar.lightIntensitySlider.value / 100
|
||
end
|
||
mainContainer.toolbar.lightEmissionSlider = mainContainer.toolbar:addChild(GUI.slider(2, elementY, elementWidth, 0xCCCCCC, 0x2D2D2D, 0xEEEEEE, 0xAAAAAA, 0, scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].emissionDistance, scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].emissionDistance, false, "Distance: ", "")); elementY = elementY + 3
|
||
mainContainer.toolbar.lightEmissionSlider.onValueChanged = function()
|
||
scene.lights[mainContainer.toolbar.lightSelectComboBox.selectedItem].emissionDistance = mainContainer.toolbar.lightEmissionSlider.value
|
||
end
|
||
calculateLightComboBox()
|
||
|
||
mainContainer.toolbar.blockColorSelector = mainContainer.toolbar:addChild(GUI.colorSelector(2, elementY, elementWidth, 1, 0xEEEEEE, "Block color")); elementY = elementY + mainContainer.toolbar.blockColorSelector.height + 1
|
||
mainContainer.toolbar.backgroundColorSelector = mainContainer.toolbar:addChild(GUI.colorSelector(2, elementY, elementWidth, 1, scene.backgroundColor, "Background color")); elementY = elementY + mainContainer.toolbar.blockColorSelector.height + 1
|
||
mainContainer.toolbar.backgroundColorSelector.onTouch = function()
|
||
scene.backgroundColor = mainContainer.toolbar.backgroundColorSelector.color
|
||
end
|
||
|
||
mainContainer.toolbar:addChild(GUI.label(2, elementY, elementWidth, 1, 0xEEEEEE, "RAM monitoring")):setAlignment(GUI.ALIGNMENT_HORIZONTAL_CENTER, GUI.ALIGNMENT_VERTICAL_TOP); elementY = elementY + 2
|
||
mainContainer.toolbar.RAMChart = mainContainer.toolbar:addChild(GUI.chart(2, elementY, elementWidth, mainContainer.toolbar.height - elementY - 3, 0xEEEEEE, 0xAAAAAA, 0x555555, 0x66DB80, 0.35, 0.25, "s", "%", true, {})); elementY = elementY + mainContainer.toolbar.RAMChart.height + 1
|
||
mainContainer.toolbar.RAMChart.roundValues = true
|
||
-- mainContainer.toolbar.RAMChart.showXAxisValues = false
|
||
mainContainer.toolbar.RAMChart.counter = 1
|
||
|
||
mainContainer.toolbar:addChild(GUI.button(1, mainContainer.toolbar.height - 2, mainContainer.toolbar.width, 3, 0x2D2D2D, 0xEEEEEE, 0x444444, 0xEEEEEE, "Exit")).onTouch = function()
|
||
mainContainer:stopEventHandling()
|
||
end
|
||
|
||
local FPSCounter = GUI.object(2, 2, 8, 3)
|
||
FPSCounter.draw = function(FPSCounter)
|
||
renderer.renderFPSCounter(FPSCounter.x, FPSCounter.y, tostring(math.ceil(1 / (os.clock() - mainContainer.oldClock) / 10)), 0xFFFF00)
|
||
end
|
||
mainContainer:addChild(FPSCounter)
|
||
|
||
mainContainer.eventHandler = function(mainContainer, object, e1, e2, e3, e4, e5)
|
||
if not mainContainer.toolbar.hidden then
|
||
local totalMemory = computer.totalMemory()
|
||
table.insert(mainContainer.toolbar.RAMChart.values, {mainContainer.toolbar.RAMChart.counter, math.ceil((totalMemory - computer.freeMemory()) / totalMemory * 100)})
|
||
mainContainer.toolbar.RAMChart.counter = mainContainer.toolbar.RAMChart.counter + 1
|
||
if #mainContainer.toolbar.RAMChart.values > 20 then table.remove(mainContainer.toolbar.RAMChart.values, 1) end
|
||
|
||
mainContainer.infoTextBox.lines = {
|
||
" ",
|
||
"SceneObjects: " .. #scene.objects,
|
||
" ",
|
||
"OCGLVertices: " .. #OCGL.vertices,
|
||
"OCGLTriangles: " .. #OCGL.triangles,
|
||
"OCGLLines: " .. #OCGL.lines,
|
||
"OCGLFloatingTexts: " .. #OCGL.floatingTexts,
|
||
"OCGLLights: " .. #OCGL.lights,
|
||
" ",
|
||
"CameraFOV: " .. string.format("%.2f", math.deg(scene.camera.FOV)),
|
||
"СameraPosition: " .. string.format("%.2f", scene.camera.position[1]) .. " x " .. string.format("%.2f", scene.camera.position[2]) .. " x " .. string.format("%.2f", scene.camera.position[3]),
|
||
"СameraRotation: " .. string.format("%.2f", math.deg(scene.camera.rotation[1])) .. " x " .. string.format("%.2f", math.deg(scene.camera.rotation[2])) .. " x " .. string.format("%.2f", math.deg(scene.camera.rotation[3])),
|
||
"CameraNearClippingSurface: " .. string.format("%.2f", scene.camera.nearClippingSurface),
|
||
"CameraFarClippingSurface: " .. string.format("%.2f", scene.camera.farClippingSurface),
|
||
"CameraProjectionSurface: " .. string.format("%.2f", scene.camera.projectionSurface),
|
||
"CameraPerspectiveProjection: " .. tostring(scene.camera.projectionEnabled),
|
||
" ",
|
||
"Controls:",
|
||
" ",
|
||
"Arrows - camera rotation",
|
||
"WASD/Shift/Space - camera movement",
|
||
"LMB/RMB - destroy/place block",
|
||
"NUM 8/2/4/6/1/3 - selected light movement",
|
||
"F1 - toggle GUI overlay",
|
||
}
|
||
|
||
mainContainer.infoTextBox.height = #mainContainer.infoTextBox.lines
|
||
end
|
||
|
||
if e1 == "key_down" then
|
||
if controls[e4] then
|
||
controls[e4]()
|
||
end
|
||
elseif e1 == "scroll" then
|
||
if e5 == 1 then
|
||
if scene.camera.FOV < math.rad(170) then
|
||
scene.camera:setFOV(scene.camera.FOV + math.rad(5))
|
||
end
|
||
else
|
||
if scene.camera.FOV > math.rad(5) then
|
||
scene.camera:setFOV(scene.camera.FOV - math.rad(5))
|
||
end
|
||
end
|
||
end
|
||
|
||
mainContainer:drawOnScreen()
|
||
end
|
||
|
||
-------------------------------------------------------- Ebat-kopat --------------------------------------------------------
|
||
|
||
mainContainer:startEventHandling(0) |