diff --git a/Applications.txt b/Applications.txt index 08d309c3..fa407f31 100644 --- a/Applications.txt +++ b/Applications.txt @@ -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", diff --git a/Applications/3DTest/3DTest.lua b/Applications/3DTest/3DTest.lua index 5a87e1e0..27f96c6e 100644 --- a/Applications/3DTest/3DTest.lua +++ b/Applications/3DTest/3DTest.lua @@ -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, "", "%") diff --git a/lib/OpenComputersGL/Main.lua b/lib/OpenComputersGL/Main.lua index 3196d717..08900a8c 100644 --- a/lib/OpenComputersGL/Main.lua +++ b/lib/OpenComputersGL/Main.lua @@ -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] diff --git a/lib/PolyCatEngine/Main.lua b/lib/PolyCatEngine/Main.lua index 943a5785..ef54c12d 100644 --- a/lib/PolyCatEngine/Main.lua +++ b/lib/PolyCatEngine/Main.lua @@ -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 diff --git a/lib/vector.lua b/lib/vector.lua index f414fcbf..ab4d8712 100644 --- a/lib/vector.lua +++ b/lib/vector.lua @@ -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