Adds globalscripts/BicubicInterpolation.js, the corresponding license_mit.txt and points to it for other files with the same license in LICENSE.txt - reviewed by Philip and Itms. Uses that to fix an interpolation issue in gaia.js and also fixes a "fail by one" there - reviewed by elexis. Fixes #4174

This was SVN commit r18710.
This commit is contained in:
FeXoR 2016-09-06 21:49:57 +00:00
parent a673a330a5
commit 64b1da0ddf
4 changed files with 108 additions and 31 deletions

View File

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

View File

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

View File

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

19
license_mit.txt Normal file
View File

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