Добавлена поддержка яркости источника освещения

This commit is contained in:
Igor Timofeev 2017-03-15 21:23:35 +03:00
parent 1804202aa4
commit c8a01a8aca
5 changed files with 40 additions and 24 deletions

View File

@ -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",

View File

@ -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, "", "%")

View File

@ -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]

View File

@ -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

View File

@ -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