diff --git a/LICENSE.txt b/LICENSE.txt index d9550727a4..7dcefde92c 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -37,7 +37,7 @@ in particular, let us know and we can try to clarify it. BSD /build/premake/*.lua - MIT + MIT - see license_mit.txt /docs Various (unspecified) @@ -49,7 +49,7 @@ in particular, let us know and we can try to clarify it. GPL version 2 (or later) - see license_gpl-2.0.txt /source/lib - MIT + MIT - see license_mit.txt /source/scriptinterface/third_party MPL 2.0 @@ -60,16 +60,16 @@ in particular, let us know and we can try to clarify it. /source/third_party/encryption GPL version 2 (or later) ISC (pkcs5_pbkdf2.cpp) - MIT (pkcs5_pbkdf2.h) + MIT (pkcs5_pbkdf2.h) - see license_mit.txt /source/third-party/jsonspirit - MIT + MIT - see license_mit.txt /source/third_party/mikktspace zlib /source/third_party/mongoose - MIT + MIT - see license_mit.txt /source/third_party/tinygettext zlib @@ -79,3 +79,6 @@ in particular, let us know and we can try to clarify it. /source/tools/atlas GPL version 2 (or later) - see license_gpl-2.0.txt + + /binaries/data/mods/public/globalscripts/BicubicInterpolation.js + MIT 2013 Hugh Kennedy - see license_mit.txt diff --git a/binaries/data/mods/public/globalscripts/BicubicInterpolation.js b/binaries/data/mods/public/globalscripts/BicubicInterpolation.js new file mode 100644 index 0000000000..b21f3b5a09 --- /dev/null +++ b/binaries/data/mods/public/globalscripts/BicubicInterpolation.js @@ -0,0 +1,47 @@ +/** + * From https://github.com/hughsk/bicubic licensed under MIT 2013 Hugh Kennedy - see /license_mit.txt + * Two dimensional interpolation within a square grid using polynomials of 3rd degree. + * @param {float} xf - X coordinate within the subgrid (see below) of the point to interpolate the value for + * @param {float} yf - y coordinate within the subgrid (see below) of the point to interpolate the value for + * @param {float} p00 - Value of the property to calculate at the origin of the naighbor grid + * @param {float} pxy - Value at naighbor grid coordinates x/y, x/y in {0, 1, 2, 3} + * @return {float} - Value at the given float coordinates in the small grid interpolated from it's values + */ +function bicubicInterpolation( + xf, yf, + p00, p01, p02, p03, + p10, p11, p12, p13, + p20, p21, p22, p23, + p30, p31, p32, p33 +) +{ + var yf2 = yf * yf; + var xf2 = xf * xf; + var xf3 = xf * xf2; + + var x00 = p03 - p02 - p00 + p01; + var x01 = p00 - p01 - x00; + var x02 = p02 - p00; + var x0 = x00*xf3 + x01*xf2 + x02*xf + p01; + + var x10 = p13 - p12 - p10 + p11; + var x11 = p10 - p11 - x10; + var x12 = p12 - p10; + var x1 = x10*xf3 + x11*xf2 + x12*xf + p11; + + var x20 = p23 - p22 - p20 + p21; + var x21 = p20 - p21 - x20; + var x22 = p22 - p20; + var x2 = x20*xf3 + x21*xf2 + x22*xf + p21; + + var x30 = p33 - p32 - p30 + p31; + var x31 = p30 - p31 - x30; + var x32 = p32 - p30; + var x3 = x30*xf3 + x31*xf2 + x32*xf + p31; + + var y0 = x3 - x2 - x0 + x1; + var y1 = x0 - x1 - y0; + var y2 = x2 - x0; + + return y0*yf*yf2 + y1*yf2 + y2*yf + x1; +} diff --git a/binaries/data/mods/public/maps/random/rmgen2/gaia.js b/binaries/data/mods/public/maps/random/rmgen2/gaia.js index b22a4d47f1..3dfe64c4cd 100644 --- a/binaries/data/mods/public/maps/random/rmgen2/gaia.js +++ b/binaries/data/mods/public/maps/random/rmgen2/gaia.js @@ -1274,43 +1274,51 @@ function getRandomDeviation(base, deviation) * @param heightmap - An array with a square number of heights * @param tilemap - The IDs of the palletmap to be painted for each heightmap tile * @param pallet - The tile texture names used by the tilemap. - * @returns the ratio of heightmap tiles per map size tiles + * @return the ratio of heightmap tiles per map size tiles */ function paintHeightmap(heightmap, tilemap, pallet, func = undefined) { - let lastI = -1; - let mapSize = getMapSize(); + let mapSize = getMapSize(); // Width of the map in terrain tiles let hmSize = Math.sqrt(heightmap.length); - let scale = hmSize / mapSize; + let scale = hmSize / (mapSize + 1); // There are mapSize + 1 vertices (each 1 tile is surrounded by 2x2 vertices) - for (let y = 0; y < mapSize; ++y) - for (let x = 0; x < mapSize; ++x) + for (let x = 0; x <= mapSize; ++x) + for (let y = 0; y <= mapSize; ++y) { - let i = Math.floor(x * scale) * hmSize + Math.floor(y * scale); + let hmPoint = { "x": x * scale, "y": y * scale }; + let hmTile = { "x": Math.floor(hmPoint.x), "y": Math.floor(hmPoint.y) }; + let shift = { "x": 0, "y": 0 }; - let height = heightmap[i]; - let tile = pallet[tilemap[i]]; + if (hmTile.x == 0) + shift.x = 1; + else if (hmTile.x == hmSize - 1) + shift.x = - 2; + else if (hmTile.x == hmSize - 2) + shift.x = - 1; - if (i == lastI) + if (hmTile.y == 0) + shift.y = 1; + else if (hmTile.y == hmSize - 1) + shift.y = - 2; + else if (hmTile.y == hmSize - 2) + shift.y = - 1; + + let neighbors = []; + for (let localYi = 0; localYi < 4; ++localYi) + for (let localXi = 0; localXi < 4; ++localXi) + neighbors.push(heightmap[(hmTile.x + localXi + shift.x - 1) * hmSize + (hmTile.y + localYi + shift.y - 1)]); + + setHeight(x, y, bicubicInterpolation(hmPoint.x - hmTile.x - shift.x, hmPoint.y - hmTile.y - shift.y, ...neighbors) / scale); + + if (x < mapSize && y < mapSize) { - let nearby = [i]; + let i = hmTile.x * hmSize + hmTile.y; + let tile = pallet[tilemap[i]]; + placeTerrain(x, y, tile); - if (i + hmSize < heightmap.length) - { - nearby.push(i + hmSize); - height = (heightmap[nearby[0]] + heightmap[nearby[1]]) / 2; - } - - tile = pallet[tilemap[nearby[randInt(0, nearby.length - 1)]]]; + if (func) + func(tile, x, y); } - - setHeight(x, y, height / scale); - placeTerrain(x, y, tile); - - if (func) - func(tile, x, y); - - lastI = i; } return scale; diff --git a/license_mit.txt b/license_mit.txt new file mode 100644 index 0000000000..8b9abce10c --- /dev/null +++ b/license_mit.txt @@ -0,0 +1,19 @@ +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.