mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2026-01-06 03:02:38 +01:00
Добавлена поддержка яркости источника освещения
This commit is contained in:
parent
1804202aa4
commit
c8a01a8aca
@ -396,7 +396,7 @@
|
||||
name="lib/vector.lua",
|
||||
url="IgorTimofeev/OpenComputers/master/lib/vector.lua",
|
||||
type="Library",
|
||||
version=1.02,
|
||||
version=1.03,
|
||||
},
|
||||
{
|
||||
name="lib/matrix.lua",
|
||||
@ -408,7 +408,7 @@
|
||||
name="lib/OpenComputersGL/Main.lua",
|
||||
url="IgorTimofeev/OpenComputers/master/lib/OpenComputersGL/Main.lua",
|
||||
type="Library",
|
||||
version=1.04,
|
||||
version=1.05,
|
||||
},
|
||||
{
|
||||
name="lib/OpenComputersGL/Materials.lua",
|
||||
@ -426,7 +426,7 @@
|
||||
name="lib/PolyCatEngine/Main.lua",
|
||||
url="IgorTimofeev/OpenComputers/master/lib/PolyCatEngine/Main.lua",
|
||||
type="Library",
|
||||
version=1.05,
|
||||
version=1.06,
|
||||
},
|
||||
|
||||
----------------------------------------------------- Скрипты и дополнения к ним --------------------------------------------------------------------------
|
||||
@ -530,7 +530,7 @@
|
||||
type="Application",
|
||||
icon="IgorTimofeev/OpenComputers/master/Applications/3DTest/Icon.pic",
|
||||
createShortcut="desktop",
|
||||
version=1.13,
|
||||
version=1.14,
|
||||
},
|
||||
{
|
||||
name="MineOS/Applications/GeoScan2",
|
||||
|
||||
@ -29,7 +29,7 @@ local polyCatEngine = require("PolyCatEngine/Main")
|
||||
-- /MineOS/Desktop/3DTest.app/3DTest.lua
|
||||
|
||||
buffer.start()
|
||||
polyCatEngine.intro(vector.newVector3(0, 0, 0), 20)
|
||||
-- polyCatEngine.intro(vector.newVector3(0, 0, 0), 20)
|
||||
|
||||
local mainWindow = windows.fullScreen()
|
||||
local scene = polyCatEngine.newScene(0x1D1D1D)
|
||||
@ -39,7 +39,7 @@ scene.auxiliaryMode = OCGL.auxiliaryModes.disabled
|
||||
|
||||
scene.camera:translate(-2.5, 8.11, -19.57)
|
||||
scene.camera:rotate(math.rad(30), 0, 0)
|
||||
scene:addLight(polyCatEngine.newLight(vector.newVector3(0, 20, 0), 1000))
|
||||
scene:addLight(polyCatEngine.newLight(vector.newVector3(0, 20, 0), 1.0, 200))
|
||||
|
||||
---------------------------------------------- Constants ----------------------------------------------
|
||||
|
||||
@ -419,16 +419,16 @@ local function calculateLightComboBox()
|
||||
mainWindow.toolbar.lightSelectComboBox:addItem(tostring(i))
|
||||
end
|
||||
mainWindow.toolbar.lightSelectComboBox.currentItem = #mainWindow.toolbar.lightSelectComboBox.items
|
||||
mainWindow.toolbar.lightIntensitySlider.value = scene.lights[mainWindow.toolbar.lightSelectComboBox.currentItem].intensity * 100
|
||||
mainWindow.toolbar.lightEmissionSlider.value = scene.lights[mainWindow.toolbar.lightSelectComboBox.currentItem].emissionDistance
|
||||
end
|
||||
|
||||
mainWindow.toolbar:addLabel(2, elementY, elementWidth, 1, 0xEEEEEE, "Light control"):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); elementY = elementY + 2
|
||||
mainWindow.toolbar.lightSelectComboBox = mainWindow.toolbar:addComboBox(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0x888888); elementY = elementY + mainWindow.toolbar.lightSelectComboBox.height + 1
|
||||
calculateLightComboBox()
|
||||
|
||||
|
||||
mainWindow.toolbar.addLightButton = mainWindow.toolbar:addButton(2, elementY, elementWidth, 1, 0x2D2D2D, 0xAAAAAA, 0x555555, 0xAAAAAA, "Add light"); elementY = elementY + 2
|
||||
mainWindow.toolbar.addLightButton.onTouch = function()
|
||||
scene:addLight(polyCatEngine.newLight(vector.newVector3(0, 10, 0), mainWindow.toolbar.lightEmissionSlider.value))
|
||||
scene:addLight(polyCatEngine.newLight(vector.newVector3(0, 10, 0), mainWindow.toolbar.lightIntensitySlider.value / 100, mainWindow.toolbar.lightEmissionSlider.value))
|
||||
calculateLightComboBox()
|
||||
end
|
||||
|
||||
@ -440,10 +440,15 @@ mainWindow.toolbar.removeLightButton.onTouch = function()
|
||||
end
|
||||
end
|
||||
|
||||
mainWindow.toolbar.lightEmissionSlider = mainWindow.toolbar:addHorizontalSlider(2, elementY, elementWidth, 0xCCCCCC, 0x2D2D2D, 0xEEEEEE, 0xAAAAAA, 5, 500, 450, false, "Emission: ", ""); elementY = elementY + 3
|
||||
mainWindow.toolbar.lightIntensitySlider = mainWindow.toolbar:addHorizontalSlider(2, elementY, elementWidth, 0xCCCCCC, 0x2D2D2D, 0xEEEEEE, 0xAAAAAA, 0, 500, 100, false, "Intensity: ", ""); elementY = elementY + 3
|
||||
mainWindow.toolbar.lightIntensitySlider.onValueChanged = function(value)
|
||||
scene.lights[mainWindow.toolbar.lightSelectComboBox.currentItem].intensity = value / 100
|
||||
end
|
||||
mainWindow.toolbar.lightEmissionSlider = mainWindow.toolbar:addHorizontalSlider(2, elementY, elementWidth, 0xCCCCCC, 0x2D2D2D, 0xEEEEEE, 0xAAAAAA, 0, scene.lights[mainWindow.toolbar.lightSelectComboBox.currentItem].emissionDistance, scene.lights[mainWindow.toolbar.lightSelectComboBox.currentItem].emissionDistance, false, "Distance: ", ""); elementY = elementY + 3
|
||||
mainWindow.toolbar.lightEmissionSlider.onValueChanged = function(value)
|
||||
scene.lights[mainWindow.toolbar.lightSelectComboBox.currentItem].emissionDistance = value
|
||||
end
|
||||
calculateLightComboBox()
|
||||
|
||||
mainWindow.toolbar.blockColorSelector = mainWindow.toolbar:addColorSelector(2, elementY, elementWidth, 1, 0xEEEEEE, "Block color"); elementY = elementY + mainWindow.toolbar.blockColorSelector.height + 1
|
||||
mainWindow.toolbar.backgroundColorSelector = mainWindow.toolbar:addColorSelector(2, elementY, elementWidth, 1, scene.backgroundColor, "Background color"); elementY = elementY + mainWindow.toolbar.blockColorSelector.height + 1
|
||||
@ -454,7 +459,7 @@ end
|
||||
mainWindow.toolbar:addLabel(2, elementY, elementWidth, 1, 0xEEEEEE, "RAM monitoring"):setAlignment(GUI.alignment.horizontal.center, GUI.alignment.vertical.top); elementY = elementY + 2
|
||||
mainWindow.toolbar.RAMChart = mainWindow.toolbar:addChart(2, elementY, elementWidth, mainWindow.toolbar.height - elementY - 6, 0xEEEEEE, 0xAAAAAA, 0x555555, 0x66DB80, 0.35, 0.25, "s", "%", true, {}); elementY = elementY + mainWindow.toolbar.RAMChart.height + 1
|
||||
mainWindow.toolbar.RAMChart.roundValues = true
|
||||
-- mainWindow.toolbar.RAMChart.showXAxisValues = false
|
||||
mainWindow.toolbar.RAMChart.showXAxisValues = false
|
||||
mainWindow.toolbar.RAMChart.counter = 1
|
||||
mainWindow.toolbar.RAMProgressBar = mainWindow.toolbar:addProgressBar(2, elementY, elementWidth, 0x66DB80, 0x2D2D2D, 0xAAAAAA, 1, true, true, "", "%")
|
||||
|
||||
|
||||
@ -79,8 +79,8 @@ end
|
||||
|
||||
-------------------------------------------------------- Render queue methods --------------------------------------------------------
|
||||
|
||||
function OCGL.newIndexedLight(indexOfVertex1, emissionDistance)
|
||||
return { indexOfVertex1, emissionDistance }
|
||||
function OCGL.newIndexedLight(indexOfVertex1, intensity, emissionDistance)
|
||||
return { indexOfVertex1, intensity, emissionDistance }
|
||||
end
|
||||
|
||||
function OCGL.newIndexedTriangle(indexOfVertex1, indexOfVertex2, indexOfVertex3, material)
|
||||
@ -95,9 +95,9 @@ function OCGL.newIndexedFloatingText(indexOfVertex, color, text)
|
||||
return {indexOfVertex, text, color}
|
||||
end
|
||||
|
||||
function OCGL.pushLightToRenderQueue(vector3Vertex, emissionDistance)
|
||||
function OCGL.pushLightToRenderQueue(vector3Vertex, intensity, emissionDistance)
|
||||
table.insert(OCGL.vertices, vector3Vertex)
|
||||
table.insert(OCGL.lights, OCGL.newIndexedLight(OCGL.nextVertexIndex, emissionDistance))
|
||||
table.insert(OCGL.lights, OCGL.newIndexedLight(OCGL.nextVertexIndex, intensity, emissionDistance))
|
||||
OCGL.nextVertexIndex = OCGL.nextVertexIndex + 1
|
||||
end
|
||||
|
||||
@ -147,7 +147,7 @@ function OCGL.getTriangleLightIntensity(vertex1, vertex2, vertex3, indexedLight)
|
||||
}
|
||||
local lightDistance = vector.length(lightVector)
|
||||
|
||||
if lightDistance <= indexedLight[2] then
|
||||
if lightDistance <= indexedLight[3] then
|
||||
local normalVector = vector.getSurfaceNormal(vertex1, vertex2, vertex3)
|
||||
-- buffer.text(2, buffer.screen.height - 2, 0x0, "normalVector: " .. normalVector[1] .. " x " .. normalVector[2] .. " x " .. normalVector[3])
|
||||
|
||||
@ -161,7 +161,7 @@ function OCGL.getTriangleLightIntensity(vertex1, vertex2, vertex3, indexedLight)
|
||||
absAngle = 3.1415926535898 - absAngle
|
||||
end
|
||||
-- buffer.text(2, buffer.screen.height, 0xFFFFFF, "Angle: " .. math.deg(angle) .. ", newAngle: " .. math.deg(absAngle) .. ", intensity: " .. absAngle / 1.5707963267949)
|
||||
return (1 - lightDistance / indexedLight[2]) * (1 - absAngle / 1.5707963267949)
|
||||
return indexedLight[2] * (1 - lightDistance / indexedLight[3]) * (1 - absAngle / 1.5707963267949)
|
||||
else
|
||||
return 0
|
||||
end
|
||||
@ -181,7 +181,7 @@ function OCGL.calculateLights()
|
||||
OCGL.lights[lightIndex]
|
||||
)
|
||||
if OCGL.triangles[triangleIndex][5] then
|
||||
OCGL.triangles[triangleIndex][5] = (OCGL.triangles[triangleIndex][5] + intensity) / 2
|
||||
OCGL.triangles[triangleIndex][5] = OCGL.triangles[triangleIndex][5] + intensity
|
||||
else
|
||||
OCGL.triangles[triangleIndex][5] = intensity
|
||||
end
|
||||
@ -207,10 +207,19 @@ function OCGL.render()
|
||||
if OCGL.renderMode == OCGL.renderModes.constantShading then
|
||||
renderer.renderFilledTriangle({ vertex1, vertex2, vertex3 }, material.color)
|
||||
elseif OCGL.renderMode == OCGL.renderModes.flatShading then
|
||||
local finalColor = 0x0
|
||||
finalColor = colorlib.alphaBlend(material.color, 0x0, OCGL.triangles[triangleIndex][5])
|
||||
-- local finalColor = 0x0
|
||||
-- finalColor = colorlib.alphaBlend(material.color, 0x0, OCGL.triangles[triangleIndex][5])
|
||||
-- OCGL.triangles[triangleIndex][5] = nil
|
||||
-- renderer.renderFilledTriangle({ vertex1, vertex2, vertex3 }, finalColor)
|
||||
|
||||
local r, g, b = colorlib.HEXtoRGB(material.color)
|
||||
r, g, b = r * OCGL.triangles[triangleIndex][5], g * OCGL.triangles[triangleIndex][5], b * OCGL.triangles[triangleIndex][5]
|
||||
if r > 255 then r = 255 end
|
||||
if g > 255 then g = 255 end
|
||||
if b > 255 then b = 255 end
|
||||
OCGL.triangles[triangleIndex][5] = nil
|
||||
renderer.renderFilledTriangle({ vertex1, vertex2, vertex3 }, finalColor)
|
||||
|
||||
renderer.renderFilledTriangle({ vertex1, vertex2, vertex3 }, colorlib.RGBtoHEX(r, g, b))
|
||||
end
|
||||
elseif material.type == materials.types.textured then
|
||||
vertex1[4], vertex1[5] = OCGL.vertices[OCGL.triangles[triangleIndex][1]][4], OCGL.vertices[OCGL.triangles[triangleIndex][1]][5]
|
||||
|
||||
@ -24,10 +24,11 @@ end
|
||||
|
||||
-------------------------------------------------------- Light object --------------------------------------------------------
|
||||
|
||||
function polyCatEngine.newLight(vector3Position, emissionDistance)
|
||||
function polyCatEngine.newLight(vector3Position, intensity, emissionDistance)
|
||||
return {
|
||||
position = vector3Position,
|
||||
emissionDistance = emissionDistance
|
||||
emissionDistance = emissionDistance,
|
||||
intensity = intensity
|
||||
}
|
||||
end
|
||||
|
||||
@ -274,6 +275,7 @@ local function sceneRender(scene)
|
||||
for lightIndex = 1, #scene.lights do
|
||||
OCGL.pushLightToRenderQueue(
|
||||
vector.newVector3(scene.lights[lightIndex].position[1], scene.lights[lightIndex].position[2], scene.lights[lightIndex].position[3]),
|
||||
scene.lights[lightIndex].intensity,
|
||||
scene.lights[lightIndex].emissionDistance
|
||||
)
|
||||
end
|
||||
|
||||
@ -57,7 +57,7 @@ end
|
||||
function vectorLibrary.toString(vector)
|
||||
local result = "("
|
||||
for dismension = 1, #vector do
|
||||
result = result .. vector[dismension]
|
||||
result = result .. string.format("%.2f", vector[dismension])
|
||||
if dismension < #vector then
|
||||
result = result .. "; "
|
||||
end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user