diff --git a/.jscs.json b/.jscs.json index 657a9ad..f61037d 100644 --- a/.jscs.json +++ b/.jscs.json @@ -1,19 +1,66 @@ { - "requireCurlyBraces": ["for", "while", "do", "try", "catch"], - "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try"], - "disallowLeftStickedOperators": ["?", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], - "disallowRightStickedOperators": ["?", ":", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], - "requireRightStickedOperators": ["!", "++", "--"], - "requireLeftStickedOperators": [",", "++", "--"], + "disallowEmptyBlocks": { + "allExcept": ["comments"] + }, "disallowImplicitTypeConversion": [], "disallowKeywords": ["with"], - "disallowMultipleLineBreaks": true, "disallowKeywordsOnNewLine": [], + "disallowMixedSpacesAndTabs": true, + "disallowMultipleLineBreaks": true, + "disallowNewlineBeforeBlockStatements": true, + "disallowOperatorBeforeLineBreak": ["."], + "disallowSpaceAfterObjectKeys": true, + "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "~", "!"], + "disallowSpaceBeforeBinaryOperators": [","], + "disallowSpaceBeforeComma": true, + "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], + "disallowSpaceBeforeSemicolon": true, + "disallowSpacesInCallExpression": true, + "disallowSpacesInFunctionDeclaration": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInsideBrackets": { + "allExcept": ["[", "]", "{", "}"] + }, + "disallowTrailingWhitespace": true, + "disallowYodaConditions": true, + "requireBlocksOnNewline": 1, + "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", + "requireCapitalizedConstructors": true, + "requireCommaBeforeLineBreak": true, + "requireCurlyBraces": ["for", "while", "do", "try", "catch"], "requireKeywordsOnNewLine": ["else"], + "requireLineBreakAfterVariableAssignment": true, "requireLineFeedAtFileEnd": true, "requireParenthesesAroundIIFE": true, - "disallowSpaceAfterObjectKeys": true, - "requireCommaBeforeLineBreak": true, - "disallowMixedSpacesAndTabs": true, - "disallowTrailingWhitespace": true + "requireSemicolons": true, + "requireSpaceAfterBinaryOperators": ["=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "case", "return", "try", "catch", "void", "with", "typeof"], + "requireSpaceAfterLineComment": { + "allExcept": ["#", "="] + }, + "requireSpaceBeforeBinaryOperators": ["=", "==", "===", "!=", "!==", ">", ">=", "<", "<="], + "requireSpaceBeforeBlockStatements": true, + "requireSpaceBeforeObjectValues": true, + "requireSpaceBetweenArguments": true, + "requireSpacesInConditionalExpression": { + "afterTest": true, + "beforeConsequent": true, + "afterConsequent": true, + "beforeAlternate": true + }, + "requireSpacesInForStatement": true, + "requireSpacesInFunction": { + "beforeOpeningCurlyBrace": true + }, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "validateQuoteMarks": { + "escape": true, + "mark": "'" + } } diff --git a/Gruntfile.js b/Gruntfile.js index 031380c..8580720 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -9,7 +9,7 @@ module.exports = function(grunt) { pkg: grunt.file.readJSON('package.json'), concat: { options: { - banner: banner + "\n", + banner: banner + '\n', separator: grunt.util.linefeed, }, target: { @@ -18,8 +18,8 @@ module.exports = function(grunt) { 'src/core.js', 'src/images.js', 'src/filters.js', - //'src/gaussian.js', - //'src/weightedBoxBlurGaussian.js', + // 'src/gaussian.js', + // 'src/weightedBoxBlurGaussian.js', 'src/generators.js', 'src/materials.js', 'src/scatter.js', @@ -112,7 +112,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks("grunt-jscs-checker"); + grunt.loadNpmTasks('grunt-jscs'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.registerTask('default', ['concat', 'uglify', 'jshint', 'jscs']); grunt.registerTask('lint', ['jshint', 'jscs']); diff --git a/bower.json b/bower.json index 4cd934a..30818ca 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "THREE.Terrain", - "version": "1.2.1", + "version": "1.2.2", "main": "build/THREE.Terrain.min.js", "ignore": [ "node_modules" diff --git a/build/THREE.Terrain.js b/build/THREE.Terrain.js index 4376cd0..f2dc53e 100644 --- a/build/THREE.Terrain.js +++ b/build/THREE.Terrain.js @@ -1,5 +1,5 @@ /** - * THREE.Terrain.js 1.2.1-20150607 + * THREE.Terrain.js 1.2.2-20150822 * * @author Isaac Sukin (http://www.isaacsukin.com/) * @license MIT @@ -9,179 +9,187 @@ * Simplex and Perlin noise. * * Copied with small edits from https://github.com/josephg/noisejs which is -* public domain, originally by Stefan Gustavson (stegu@itn.liu.se) with +* public domain. Originally by Stefan Gustavson (stegu@itn.liu.se) with * optimizations by Peter Eastman (peastman@drizzle.stanford.edu) and converted * to JavaScript by Joseph Gentle. */ (function(global) { - var module = global.noise = {}; - - function Grad(x, y, z) { - this.x = x; this.y = y; this.z = z; - } - - Grad.prototype.dot2 = function(x, y) { - return this.x*x + this.y*y; - }; - - Grad.prototype.dot3 = function(x, y, z) { - return this.x*x + this.y*y + this.z*z; - }; - - var grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), - new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), - new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)]; - - var p = [151,160,137,91,90,15, - 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, - 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, - 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, - 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, - 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, - 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, - 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, - 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, - 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, - 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, - 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, - 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; - // To remove the need for index wrapping, double the permutation table length - var perm = new Array(512); - var gradP = new Array(512); - - // This isn't a very good seeding function, but it works ok. It supports 2^16 - // different seed values. Write something better if you need more seeds. - module.seed = function(seed) { - if (seed > 0 && seed < 1) { - // Scale the seed out - seed *= 65536; - } + var module = global.noise = {}; - seed = Math.floor(seed); - if (seed < 256) { - seed |= seed << 8; + function Grad(x, y, z) { + this.x = x; + this.y = y; + this.z = z; } - for (var i = 0; i < 256; i++) { - var v; - if (i & 1) { - v = p[i] ^ (seed & 255); - } - else { - v = p[i] ^ ((seed>>8) & 255); - } - - perm[i] = perm[i + 256] = v; - gradP[i] = gradP[i + 256] = grad3[v % 12]; - } - }; - - module.seed(Math.random()); - - // Skewing and unskewing factors for 2, 3, and 4 dimensions - var F2 = 0.5*(Math.sqrt(3)-1); - var G2 = (3-Math.sqrt(3))/6; - - var F3 = 1/3; - var G3 = 1/6; - - // 2D simplex noise - module.simplex = function(xin, yin) { - var n0, n1, n2; // Noise contributions from the three corners - // Skew the input space to determine which simplex cell we're in - var s = (xin+yin)*F2; // Hairy factor for 2D - var i = Math.floor(xin+s); - var j = Math.floor(yin+s); - var t = (i+j)*G2; - var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. - var y0 = yin-j+t; - // For the 2D case, the simplex shape is an equilateral triangle. - // Determine which simplex we are in. - var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords - if (x0 > y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1) - i1 = 1; j1 = 0; - } - else { // upper triangle, YX order: (0,0)->(0,1)->(1,1) - i1 = 0; j1 = 1; - } - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - var y1 = y0 - j1 + G2; - var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords - var y2 = y0 - 1 + 2 * G2; - // Work out the hashed gradient indices of the three simplex corners - i &= 255; - j &= 255; - var gi0 = gradP[i+perm[j]]; - var gi1 = gradP[i+i1+perm[j+j1]]; - var gi2 = gradP[i+1+perm[j+1]]; - // Calculate the contribution from the three corners - var t0 = 0.5 - x0*x0-y0*y0; - if (t0 < 0) { - n0 = 0; - } - else { - t0 *= t0; - n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient - } - var t1 = 0.5 - x1*x1-y1*y1; - if (t1 < 0) { - n1 = 0; - } - else { - t1 *= t1; - n1 = t1 * t1 * gi1.dot2(x1, y1); - } - var t2 = 0.5 - x2*x2-y2*y2; - if (t2 < 0) { - n2 = 0; + Grad.prototype.dot2 = function(x, y) { + return this.x*x + this.y*y; + }; + + Grad.prototype.dot3 = function(x, y, z) { + return this.x*x + this.y*y + this.z*z; + }; + + var grad3 = [ + new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), + new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), + new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1), + ]; + + var p = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103, + 30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94, + 252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171, + 168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122, + 60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161, + 1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159, + 86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147, + 118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183, + 170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129, + 22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239, + 107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4, + 150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215, + 61,156,180]; + // To avoid the need for index wrapping, double the permutation table length + var perm = new Array(512), + gradP = new Array(512); + + // This isn't a very good seeding function, but it works okay. It supports + // 2^16 different seed values. Write your own if you need more seeds. + module.seed = function(seed) { + if (seed > 0 && seed < 1) { + // Scale the seed out + seed *= 65536; + } + + seed = Math.floor(seed); + if (seed < 256) { + seed |= seed << 8; + } + + for (var i = 0; i < 256; i++) { + var v; + if (i & 1) { + v = p[i] ^ (seed & 255); + } + else { + v = p[i] ^ ((seed>>8) & 255); + } + + perm[i] = perm[i + 256] = v; + gradP[i] = gradP[i + 256] = grad3[v % 12]; + } + }; + + module.seed(Math.random()); + + // Skewing and unskewing factors for 2 and 3 dimensions + var F2 = 0.5*(Math.sqrt(3)-1), + G2 = (3-Math.sqrt(3))/6, + F3 = 1/3, + G3 = 1/6; + + // 2D simplex noise + module.simplex = function(xin, yin) { + var n0, n1, n2; // Noise contributions from the three corners + // Skew the input space to determine which simplex cell we're in + var s = (xin+yin)*F2; // Hairy factor for 2D + var i = Math.floor(xin+s); + var j = Math.floor(yin+s); + var t = (i+j)*G2; + var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed + var y0 = yin-j+t; + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords + if (x0 > y0) { // Lower triangle, XY order: (0,0)->(1,0)->(1,1) + i1 = 1; j1 = 0; + } + else { // Upper triangle, YX order: (0,0)->(0,1)->(1,1) + i1 = 0; j1 = 1; + } + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + var y1 = y0 - j1 + G2; + var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords + var y2 = y0 - 1 + 2 * G2; + // Work out the hashed gradient indices of the three simplex corners + i &= 255; + j &= 255; + var gi0 = gradP[i+perm[j]]; + var gi1 = gradP[i+i1+perm[j+j1]]; + var gi2 = gradP[i+1+perm[j+1]]; + // Calculate the contribution from the three corners + var t0 = 0.5 - x0*x0-y0*y0; + if (t0 < 0) { + n0 = 0; + } + else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.5 - x1*x1-y1*y1; + if (t1 < 0) { + n1 = 0; + } + else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot2(x1, y1); + } + var t2 = 0.5 - x2*x2-y2*y2; + if (t2 < 0) { + n2 = 0; + } + else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot2(x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70 * (n0 + n1 + n2); + }; + + // ##### Perlin noise stuff + + function fade(t) { + return t*t*t*(t*(t*6-15)+10); } - else { - t2 *= t2; - n2 = t2 * t2 * gi2.dot2(x2, y2); + + function lerp(a, b, t) { + return (1-t)*a + t*b; } - // Add contributions from each corner to get the final noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70 * (n0 + n1 + n2); - }; - - // ##### Perlin noise stuff - - function fade(t) { - return t*t*t*(t*(t*6-15)+10); - } - - function lerp(a, b, t) { - return (1-t)*a + t*b; - } - - // 2D Perlin Noise - module.perlin = function(x, y) { - // Find unit grid cell containing point - var X = Math.floor(x), Y = Math.floor(y); - // Get relative xy coordinates of point within that cell - x = x - X; y = y - Y; - // Wrap the integer cells at 255 (smaller integer period can be introduced here) - X = X & 255; Y = Y & 255; - - // Calculate noise contributions from each of the four corners - var n00 = gradP[X+perm[Y]].dot2(x, y); - var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); - var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); - var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); - - // Compute the fade curve value for x - var u = fade(x); - - // Interpolate the four results - return lerp( - lerp(n00, n10, u), - lerp(n01, n11, u), - fade(y)); - }; + + // 2D Perlin Noise + module.perlin = function(x, y) { + // Find unit grid cell containing point + var X = Math.floor(x), + Y = Math.floor(y); + // Get relative xy coordinates of point within that cell + x = x - X; + y = y - Y; + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; + Y = Y & 255; + + // Calculate noise contributions from each of the four corners + var n00 = gradP[X+perm[Y]].dot2(x, y); + var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); + var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); + var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); + + // Compute the fade curve value for x + var u = fade(x); + + // Interpolate the four results + return lerp( + lerp(n00, n10, u), + lerp(n01, n11, u), + fade(y) + ); + }; })(this); /** @@ -285,7 +293,7 @@ THREE.Terrain = function(options) { options[opt] = typeof options[opt] === 'undefined' ? defaultOptions[opt] : options[opt]; } } - //options.unit = (options.xSize / (options.xSegments+1) + options.ySize / (options.ySegments+1)) * 0.5; + // options.unit = (options.xSize / (options.xSegments+1) + options.ySize / (options.ySegments+1)) * 0.5; options.material = options.material || new THREE.MeshBasicMaterial({ color: 0xee6633 }); // Encapsulating the terrain in a parent object allows us the flexibility @@ -805,7 +813,7 @@ THREE.Terrain.RadialEdges = function(g, options, direction, distance, easing) { yl2 = yl * 0.5, xSegmentSize = options.xSize / options.xSegments, ySegmentSize = options.ySize / options.ySegments, - edgeRadius = Math.min(options.xSize, options.ySize) * 0.5 - distance,//Math.sqrt(options.xSize * options.xSize + options.ySize * options.ySize) - distance, + edgeRadius = Math.min(options.xSize, options.ySize) * 0.5 - distance, i, j, multiplier, k, vertexDistance; for (i = 0; i < xl; i++) { for (j = 0; j < yl2; j++) { @@ -838,8 +846,7 @@ THREE.Terrain.RadialEdges = function(g, options, direction, distance, easing) { THREE.Terrain.Smooth = function(g, options, weight) { var heightmap = new Float64Array(g.length); for (var i = 0, xl = options.xSegments + 1, yl = options.ySegments + 1; i < xl; i++) { - for (var j = 0; j < yl; j++) { - var sum = 0, c = 0; + for (var j = 0, sum = 0, c = 0; j < yl; j++) { for (var n = -1; n <= 1; n++) { for (var m = -1; m <= 1; m++) { var key = (j+n)*xl + i + m; @@ -1098,8 +1105,9 @@ THREE.Terrain.CosineLayers = function(g, options) { THREE.Terrain.DiamondSquare = function(g, options) { // Set the segment length to the smallest power of 2 that is greater than // the number of vertices in either dimension of the plane - var segments = Math.max(options.xSegments, options.ySegments) + 1, n; - for (n = 1; Math.pow(2, n) < segments; n++) {} + var segments = Math.max(options.xSegments, options.ySegments) + 1, + n = 1; + while (Math.pow(2, n) < segments) { n++; } segments = Math.pow(2, n); // Initialize heightmap @@ -1116,15 +1124,21 @@ THREE.Terrain.DiamondSquare = function(g, options) { // Generate heightmap for (var l = segments; l >= 2; l /= 2) { - var half = Math.round(l*0.5), whole = Math.round(l), x, y, avg, d, e; + var half = Math.round(l*0.5), + whole = Math.round(l), + x, + y, + avg, + d, + e; smoothing /= 2; // square for (x = 0; x < segments; x += whole) { for (y = 0; y < segments; y += whole) { d = Math.random() * smoothing * 2 - smoothing; - avg = heightmap[x][y] + // top left - heightmap[x+whole][y] + // top right - heightmap[x][y+whole] + // bottom left + avg = heightmap[x][y] + // top left + heightmap[x+whole][y] + // top right + heightmap[x][y+whole] + // bottom left heightmap[x+whole][y+whole]; // bottom right avg *= 0.25; heightmap[x+half][y+half] = avg + d; @@ -1155,7 +1169,7 @@ THREE.Terrain.DiamondSquare = function(g, options) { } } - //THREE.Terrain.SmoothConservative(g, options); + // THREE.Terrain.SmoothConservative(g, options); }; /** @@ -1193,7 +1207,7 @@ THREE.Terrain.Fault = function(g, options) { } } } - //THREE.Terrain.Smooth(g, options); + // THREE.Terrain.Smooth(g, options); }; /** @@ -1365,7 +1379,7 @@ THREE.Terrain.HillIsland = (function() { j = Math.floor(options.ySegments*(0.5+yDeviation) + Math.sin(d) * Math.random() * options.ySegments*(0.5-Math.abs(yDeviation))); } } - //THREE.Terrain.Smooth(g, options, 3); + // THREE.Terrain.Smooth(g, options, 3); }; })(); @@ -1473,12 +1487,14 @@ THREE.Terrain.SimplexLayers = function(g, options) { var k = j * xl + i; data[k] = Math.random() * range; if (lastX < 0 && lastY < 0) continue; + // jscs:disable disallowSpacesInsideBrackets /* c b * * l t */ var t = data[k], l = data[ j * xl + (i-inc)] || t, // left b = data[(j-inc) * xl + i ] || t, // bottom c = data[(j-inc) * xl + (i-inc)] || t; // corner + // jscs:enable disallowSpacesInsideBrackets // Interpolate between adjacent points to set the height of // higher-resolution target data. for (var x = lastX; x < i; x++) { @@ -1521,8 +1537,9 @@ THREE.Terrain.SimplexLayers = function(g, options) { THREE.Terrain.Value = function(g, options) { // Set the segment length to the smallest power of 2 that is greater // than the number of vertices in either dimension of the plane - var segments = Math.max(options.xSegments, options.ySegments) + 1, n; - for (n = 1; Math.pow(2, n) < segments; n++) {} + var segments = Math.max(options.xSegments, options.ySegments) + 1, + n = 1; + while (Math.pow(2, n) < segments) { n++; } segments = Math.pow(2, n); // Store the array of white noise outside of the WhiteNoise function to @@ -1537,7 +1554,7 @@ THREE.Terrain.SimplexLayers = function(g, options) { } // White noise creates some weird artifacts; fix them. - //THREE.Terrain.Smooth(g, options, 1); + // THREE.Terrain.Smooth(g, options, 1); THREE.Terrain.Clamp(g, { maxHeight: options.maxHeight, minHeight: options.minHeight, @@ -1646,7 +1663,7 @@ THREE.Terrain.generateBlendedMaterial = function(textures) { // Convert levels to floating-point numbers as strings so GLSL doesn't barf on "1" instead of "1.0" for (var j = 0; j < v.length; j++) { var n = v[j]; - v[j] = n|0 === n ? n+'.0' : n+''; + v[j] = n === n|0 ? n+'.0' : n+''; } } // The transparency of the new texture when it is layered on top of the existing color at this texel is @@ -1721,7 +1738,7 @@ THREE.Terrain.generateBlendedMaterial = function(textures) { ' vec4 color = texture2D( texture_0, MyvUv ); // base', assign, ' diffuseColor = color;', - //' gl_FragColor = color;', + // ' gl_FragColor = color;', THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.map_fragment, @@ -1841,7 +1858,7 @@ THREE.Terrain.ScatterMeshes = function(geometry, options) { randomHeightmap = options.randomness(); randomness = typeof randomHeightmap === 'number' ? Math.random : function(k) { return randomHeightmap[k]; }; } - //geometry.computeFaceNormals(); + // geometry.computeFaceNormals(); for (var i = 0, w = options.w*2; i < w; i++) { for (var j = 0, h = options.h; j < h; j++) { var key = j*w + i, @@ -1868,9 +1885,9 @@ THREE.Terrain.ScatterMeshes = function(geometry, options) { continue; } var mesh = options.mesh.clone(); - //mesh.geometry.computeBoundingBox(); + // mesh.geometry.computeBoundingBox(); mesh.position.copy(v[f.a]).add(v[f.b]).add(v[f.c]).divideScalar(3); - //mesh.translateZ((mesh.geometry.boundingBox.max.z - mesh.geometry.boundingBox.min.z) * 0.5); + // mesh.translateZ((mesh.geometry.boundingBox.max.z - mesh.geometry.boundingBox.min.z) * 0.5); if (options.maxTilt > 0) { var normal = mesh.position.clone().add(f.normal); mesh.lookAt(normal); @@ -2099,7 +2116,7 @@ THREE.Terrain.Influence = function(g, options, f, x, y, r, h, t, e) { // interpolate using e, then blend according to t. d = f(fdr, fdxr, fdyr) * h * (1 - e(fdr, fdxr, fdyr)); if (fd > r || typeof g[k] == 'undefined') continue; - if (t === THREE.AdditiveBlending) g[k].z += d; + if (t === THREE.AdditiveBlending) g[k].z += d; // jscs:ignore requireSpaceAfterKeywords else if (t === THREE.SubtractiveBlending) g[k].z -= d; else if (t === THREE.MultiplyBlending) g[k].z *= d; else if (t === THREE.NoBlending) g[k].z = d; diff --git a/build/THREE.Terrain.min.js b/build/THREE.Terrain.min.js index 99ec7af..474a258 100644 --- a/build/THREE.Terrain.min.js +++ b/build/THREE.Terrain.min.js @@ -1,9 +1,9 @@ /** - * THREE.Terrain.js 1.2.1-20150607 + * THREE.Terrain.js 1.2.2-20150822 * * @author Isaac Sukin (http://www.isaacsukin.com/) * @license MIT */ -!function(a){function b(a,b,c){this.x=a,this.y=b,this.z=c}function c(a){return a*a*a*(a*(6*a-15)+10)}function d(a,b,c){return(1-c)*a+c*b}var e=a.noise={};b.prototype.dot2=function(a,b){return this.x*a+this.y*b},b.prototype.dot3=function(a,b,c){return this.x*a+this.y*b+this.z*c};var f=[new b(1,1,0),new b(-1,1,0),new b(1,-1,0),new b(-1,-1,0),new b(1,0,1),new b(-1,0,1),new b(1,0,-1),new b(-1,0,-1),new b(0,1,1),new b(0,-1,1),new b(0,1,-1),new b(0,-1,-1)],g=[151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180],h=new Array(512),i=new Array(512);e.seed=function(a){a>0&&1>a&&(a*=65536),a=Math.floor(a),256>a&&(a|=a<<8);for(var b=0;256>b;b++){var c;c=1&b?g[b]^255&a:g[b]^a>>8&255,h[b]=h[b+256]=c,i[b]=i[b+256]=f[c%12]}},e.seed(Math.random());var j=.5*(Math.sqrt(3)-1),k=(3-Math.sqrt(3))/6,l=1/3,m=1/6;e.simplex=function(a,b){var c,d,e,f=(a+b)*j,g=Math.floor(a+f),l=Math.floor(b+f),m=(g+l)*k,n=a-g+m,o=b-l+m,p,q;n>o?(p=1,q=0):(p=0,q=1);var r=n-p+k,s=o-q+k,t=n-1+2*k,u=o-1+2*k;g&=255,l&=255;var v=i[g+h[l]],w=i[g+p+h[l+q]],x=i[g+1+h[l+1]],y=.5-n*n-o*o;0>y?c=0:(y*=y,c=y*y*v.dot2(n,o));var z=.5-r*r-s*s;0>z?d=0:(z*=z,d=z*z*w.dot2(r,s));var A=.5-t*t-u*u;return 0>A?e=0:(A*=A,e=A*A*x.dot2(t,u)),70*(c+d+e)},e.perlin=function(a,b){var e=Math.floor(a),f=Math.floor(b);a-=e,b-=f,e=255&e,f=255&f;var g=i[e+h[f]].dot2(a,b),j=i[e+h[f+1]].dot2(a,b-1),k=i[e+1+h[f]].dot2(a-1,b),l=i[e+1+h[f+1]].dot2(a-1,b-1),m=c(a);return d(d(g,k,m),d(j,l,m),c(b))}}(this),THREE.Terrain=function(a){var b={after:null,easing:THREE.Terrain.Linear,heightmap:THREE.Terrain.DiamondSquare,material:null,maxHeight:100,minHeight:-100,optimization:THREE.Terrain.NONE,frequency:2.5,steps:1,stretch:!0,turbulent:!1,useBufferGeometry:!1,xSegments:63,xSize:1024,ySegments:63,ySize:1024};a=a||{};for(var c in b)b.hasOwnProperty(c)&&(a[c]="undefined"==typeof a[c]?b[c]:a[c]);a.material=a.material||new THREE.MeshBasicMaterial({color:15623731});var d=new THREE.Object3D;d.rotation.x=-.5*Math.PI;var e=new THREE.Mesh(new THREE.PlaneGeometry(a.xSize,a.ySize,a.xSegments,a.ySegments),a.material);return a.heightmap instanceof HTMLCanvasElement||a.heightmap instanceof Image?THREE.Terrain.fromHeightmap(e.geometry.vertices,a):"function"==typeof a.heightmap?a.heightmap(e.geometry.vertices,a):console.warn("An invalid value was passed for `options.heightmap`: "+a.heightmap),THREE.Terrain.Normalize(e,a),a.useBufferGeometry&&(e.geometry=(new THREE.BufferGeometry).fromGeometry(e.geometry)),d.add(e),d},THREE.Terrain.Normalize=function(a,b){var c=a.geometry.vertices;b.turbulent&&THREE.Terrain.Turbulence(c,b),b.steps>1&&(THREE.Terrain.Step(c,b.steps),THREE.Terrain.Smooth(c,b)),THREE.Terrain.Clamp(c,b),"function"==typeof b.after&&b.after(c,b),a.geometry.verticesNeedUpdate=!0,a.geometry.normalsNeedUpdate=!0,a.geometry.computeBoundingSphere(),a.geometry.computeFaceNormals(),a.geometry.computeVertexNormals()},THREE.Terrain.NONE=0,THREE.Terrain.GEOMIPMAP=1,THREE.Terrain.GEOCLIPMAP=2,THREE.Terrain.POLYGONREDUCTION=3,THREE.Terrain.toArray2D=function(a,b){var c=new Array(b.xSegments),d=b.xSegments+1,e=b.ySegments+1,f,g;for(f=0;d>f;f++)for(c[f]=new Float64Array(b.ySegments),g=0;e>g;g++)c[f][g]=a[g*d+f].z;return c},THREE.Terrain.fromArray2D=function(a,b){for(var c=0,d=b.length;d>c;c++)for(var e=0,f=b[c].length;f>e;e++)a[e*d+c].z=b[c][e]},THREE.Terrain.toArray1D=function(a){for(var b=new Float64Array(a.length),c=0,d=b.length;d>c;c++)b[c]=a[c].z;return b},THREE.Terrain.fromArray1D=function(a,b){for(var c=0,d=Math.min(a.length,b.length);d>c;c++)a[c].z=b[c]},THREE.Terrain.heightmapArray=function(a,b){var c=new Array((b.xSegments+1)*(b.ySegments+1)),d=c.length,e;for(e=0;d>e;e++)c[e]={z:0};for(b.minHeight=b.minHeight||0,b.maxHeight="undefined"==typeof b.maxHeight?1:b.maxHeight,b.stretch=b.stretch||!1,a(c,b),THREE.Terrain.Clamp(c,b),e=0;d>e;e++)c[e]=c[e].z;return c},THREE.Terrain.Linear=function(a){return a},THREE.Terrain.EaseIn=function(a){return a*a},THREE.Terrain.EaseOut=function(a){return-a*(a-2)},THREE.Terrain.EaseInOut=function(a){return a*a*(3-2*a)},THREE.Terrain.InEaseOut=function(a){var b=2*a-1;return.5*b*b*b+.5},THREE.Terrain.EaseInStrong=function(a){return a*a*a*a*a*a*a},THREE.Terrain.fromHeightmap=function(a,b){var c=document.createElement("canvas"),d=c.getContext("2d"),e=b.ySegments+1,f=b.xSegments+1,g=b.maxHeight-b.minHeight;c.width=f,c.height=e,d.drawImage(b.heightmap,0,0,c.width,c.height);for(var h=d.getImageData(0,0,c.width,c.height).data,i=0;e>i;i++)for(var j=0;f>j;j++){var k=i*f+j,l=4*k;a[k].z=(h[l]+h[l+1]+h[l+2])/765*g+b.minHeight}},THREE.Terrain.toHeightmap=function(a,b){var c="undefined"==typeof b.maxHeight,d="undefined"==typeof b.minHeight,e=c?b.maxHeight:-1/0,f=d?b.minHeight:1/0;if(!c||!d){for(var g=e,h=f,i=0,j=a.length;j>i;i++)a[i].z>g&&(g=a[i].z),a[i].zr;r++)for(var s=0;n>s;s++){var t=r*n+s,u=4*t;q[u]=q[u+1]=q[u+2]=Math.round((a[t].z-b.minHeight)/o*255),q[u+3]=255}return l.putImageData(p,0,0),k},THREE.Terrain.Clamp=function(a,b){var c=1/0,d=-1/0,e=a.length,f;for(b.easing=b.easing||THREE.Terrain.Linear,f=0;e>f;f++)a[f].zd&&(d=a[f].z);var g=d-c,h="number"!=typeof b.maxHeight?d:b.maxHeight,i="number"!=typeof b.minHeight?c:b.minHeight,j=b.stretch?h:h>d?d:h,k=b.stretch?i:c>i?c:i,l=j-k;for(k>j&&(j=h,l=j-k),f=0;e>f;f++)a[f].z=b.easing((a[f].z-c)/g)*l+i},THREE.Terrain.Edges=function(a,b,c,d,e,f){var g=Math.floor(d/(b.xSize/b.xSegments))||1,h=Math.floor(d/(b.ySize/b.ySegments))||1,i=c?b.maxHeight:b.minHeight,j=c?Math.max:Math.min,k=b.xSegments+1,l=b.ySegments+1,m,n,o,p,q;for(e=e||THREE.Terrain.EaseInOut,"object"!=typeof f&&(f={top:!0,bottom:!0,left:!0,right:!0}),m=0;k>m;m++)for(n=0;h>n;n++)o=e(1-n/h),p=n*k+m,q=(b.ySegments-n)*k+m,f.top&&(a[p].z=j(a[p].z,(i-a[p].z)*o+a[p].z)),f.bottom&&(a[q].z=j(a[q].z,(i-a[q].z)*o+a[q].z));for(m=0;l>m;m++)for(n=0;g>n;n++)o=e(1-n/g),p=m*k+n,q=(b.ySegments-m)*k+(b.xSegments-n),f.left&&(a[p].z=j(a[p].z,(i-a[p].z)*o+a[p].z)),f.right&&(a[q].z=j(a[q].z,(i-a[q].z)*o+a[q].z));THREE.Terrain.Clamp(a,{maxHeight:b.maxHeight,minHeight:b.minHeight,stretch:!0})},THREE.Terrain.RadialEdges=function(a,b,c,d,e){var f=c?b.maxHeight:b.minHeight,g=c?Math.max:Math.min,h=b.xSegments+1,i=b.ySegments+1,j=.5*h,k=.5*i,l=b.xSize/b.xSegments,m=b.ySize/b.ySegments,n=.5*Math.min(b.xSize,b.ySize)-d,o,p,q,r,s;for(o=0;h>o;o++)for(p=0;k>p;p++)r=p*h+o,s=Math.min(n,Math.sqrt((j-o)*l*(j-o)*l+(k-p)*m*(k-p)*m)-d),0>s||(q=e(s/n),a[r].z=g(a[r].z,(f-a[r].z)*q+a[r].z),r=(b.ySegments-p)*h+o,a[r].z=g(a[r].z,(f-a[r].z)*q+a[r].z))},THREE.Terrain.Smooth=function(a,b,c){for(var d=new Float64Array(a.length),e=0,f=b.xSegments+1,g=b.ySegments+1;f>e;e++)for(var h=0;g>h;h++){for(var i=0,j=0,k=-1;1>=k;k++)for(var l=-1;1>=l;l++){var m=(h+k)*f+e+l;"undefined"!=typeof a[m]&&(i+=a[m].z,j++)}d[h*f+e]=i/j}c=c||0;for(var n=1/(1+c),o=0,p=a.length;p>o;o++)a[o].z=(d[o]+a[o].z*c)*n},THREE.Terrain.SmoothMedian=function(a,b){for(var c=new Float64Array(a.length),d=[],e=[],f=function(a,b){return d[a]-d[b]},g=0,h=b.xSegments+1,i=b.ySegments+1;h>g;g++)for(var j=0;i>j;j++){d.length=0,e.length=0;for(var k=-1;1>=k;k++)for(var l=-1;1>=l;l++){var m=(j+k)*h+g+l;"undefined"!=typeof a[m]&&(d.push(a[m].z),e.push(m))}e.sort(f);var n=Math.floor(.5*e.length),o;o=e.length%2===1?a[e[n]].z:.5*(a[e[n-1]].z+a[e[n]].z),c[j*h+g]=o}for(var p=0,q=a.length;q>p;p++)a[p].z=c[p]},THREE.Terrain.SmoothConservative=function(a,b,c){for(var d=new Float64Array(a.length),e=0,f=b.xSegments+1,g=b.ySegments+1;f>e;e++)for(var h=0;g>h;h++){for(var i=-1/0,j=1/0,k=-1;1>=k;k++)for(var l=-1;1>=l;l++){var m=(h+k)*f+e+l;"undefined"!=typeof a[m]&&k&&l&&(a[m].zi&&(i=a[m].z))}var n=h*f+e;if("number"==typeof c){var o=.5*(i-j),p=j+o;i=p+o*c,j=p-o*c}d[n]=a[n].z>i?i:a[n].zq;q++)a[q].z=d[q]},THREE.Terrain.Step=function(a,b){var c=0,d=0,e=a.length,f=Math.floor(e/b),g=new Array(e),h=new Array(b);for("undefined"==typeof b&&(b=Math.floor(Math.pow(.5*e,.25))),c=0;e>c;c++)g[c]=a[c].z;for(g.sort(function(a,b){return a-b}),c=0;b>c;c++){var i=g.slice(c*f,(c+1)*f),j=0,k=i.length;for(d=0;k>d;d++)j+=i[d];h[c]={min:i[0],max:i[i.length-1],avg:j/k}}for(c=0;e>c;c++){var l=a[c].z;for(d=0;b>d;d++)if(l>=h[d].min&&l<=h[d].max){a[c].z=h[d].avg;break}}},THREE.Terrain.Turbulence=function(a,b){for(var c=b.maxHeight-b.minHeight,d=0,e=a.length;e>d;d++)a[d].z=b.minHeight+Math.abs(2*(a[d].z-b.minHeight)-c)},THREE.Terrain.MultiPass=function(a,b,c){var d={};for(var e in b)b.hasOwnProperty(e)&&(d[e]=b[e]);for(var f=b.maxHeight-b.minHeight,g=0,h=c.length;h>g;g++){var i="undefined"==typeof c[g].amplitude?1:c[g].amplitude,j=.5*(f-f*i);d.maxHeight=b.maxHeight-j,d.minHeight=b.minHeight+j,d.frequency="undefined"==typeof c[g].frequency?b.frequency:c[g].frequency,c[g].method(a,d)}},THREE.Terrain.Cosine=function(a,b){for(var c=.5*(b.maxHeight-b.minHeight),d=b.frequency*Math.PI/(Math.min(b.xSegments,b.ySegments)+1),e=Math.random()*Math.PI*2,f=0,g=b.xSegments+1;g>f;f++)for(var h=0,i=b.ySegments+1;i>h;h++)a[h*g+f].z+=c*(Math.cos(f*d+e)+Math.cos(h*d+e))},THREE.Terrain.CosineLayers=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Cosine,frequency:2.5},{method:THREE.Terrain.Cosine,amplitude:.1,frequency:12},{method:THREE.Terrain.Cosine,amplitude:.05,frequency:15},{method:THREE.Terrain.Cosine,amplitude:.025,frequency:20}])},THREE.Terrain.DiamondSquare=function(a,b){var c=Math.max(b.xSegments,b.ySegments)+1,d;for(d=1;Math.pow(2,d)=h;h++)f[h]=new Float64Array(c+1);for(var l=c;l>=2;l/=2){var m=Math.round(.5*l),n=Math.round(l),o,p,q,r,s;for(g/=2,o=0;c>o;o+=n)for(p=0;c>p;p+=n)r=Math.random()*g*2-g,q=f[o][p]+f[o+n][p]+f[o][p+n]+f[o+n][p+n],q*=.25,f[o+m][p+m]=q+r;for(o=0;c>o;o+=m)for(p=(o+m)%l;c>p;p+=l)r=Math.random()*g*2-g,q=f[(o-m+e)%e][p]+f[(o+m)%e][p]+f[o][(p+m)%e]+f[o][(p-m+e)%e],q*=.25,q+=r,f[o][p]=q,0===o&&(f[c][p]=q),0===p&&(f[o][c]=q)}for(h=0;j>h;h++)for(i=0;k>i;i++)a[i*j+h].z+=f[h][i]},THREE.Terrain.Fault=function(a,b){for(var c=Math.sqrt(b.xSegments*b.xSegments+b.ySegments*b.ySegments),d=c*b.frequency,e=.5*(b.maxHeight-b.minHeight),f=e/d,g=Math.min(b.xSize/b.xSegments,b.ySize/b.ySegments)*b.frequency,h=0;d>h;h++)for(var i=Math.random(),j=Math.sin(i*Math.PI*2),k=Math.cos(i*Math.PI*2),l=Math.random()*c-.5*c,m=0,n=b.xSegments+1;n>m;m++)for(var o=0,p=b.ySegments+1;p>o;o++){var q=j*m+k*o-l;q>g?a[o*n+m].z+=f:-g>q?a[o*n+m].z-=f:a[o*n+m].z+=Math.cos(q/g*Math.PI*2)*f}},THREE.Terrain.Hill=function(a,b,c,d){var e=2*b.frequency,f=e*e*10,g=b.maxHeight-b.minHeight,h=g/(e*e),i=g/e,j=Math.min(b.xSize,b.ySize),k=j/(e*e),l=j/e;c=c||THREE.Terrain.Influences.Hill;for(var m={x:0,y:0},n=0;f>n;n++){var o=Math.random()*(l-k)+k,p=Math.random()*(i-h)+h,q=0-o,r=b.xSize+o,s=b.ySize+o;m.x=Math.random(),m.y=Math.random(),"function"==typeof d&&d(m),THREE.Terrain.Influence(a,b,c,m.x,m.y,o,p,THREE.AdditiveBlending,THREE.Terrain.EaseInStrong)}},THREE.Terrain.HillIsland=function(){var a=function(a){var b=Math.random()*Math.PI*2;a.x=.5+Math.cos(b)*a.x*.4,a.y=.5+Math.sin(b)*a.y*.4};return function(b,c,d){THREE.Terrain.Hill(b,c,d,a)}}(),function(){function a(b,c,d,e,f){for(var g=d*e+c,h=0;3>h;h++){var i=Math.floor(8*Math.random());switch(i){case 0:c++;break;case 1:c--;break;case 2:d++;break;case 3:d--;break;case 4:c++,d++;break;case 5:c++,d--;break;case 6:c--,d++;break;case 7:c--,d--}var j=d*e+c;if("undefined"!=typeof b[j]){if(b[j].zk;k++){a(b,g,h,e,f);var l=Math.random()*Math.PI*2;k%1e3===0&&(i=.2*Math.random()-.1,j=.2*Math.random()-.1),k%100===0&&(g=Math.floor(c.xSegments*(.5+i)+Math.cos(l)*Math.random()*c.xSegments*(.5-Math.abs(i))),h=Math.floor(c.ySegments*(.5+j)+Math.sin(l)*Math.random()*c.ySegments*(.5-Math.abs(j))))}}}(),THREE.Terrain.Perlin=function(a,b){noise.seed(Math.random());for(var c=.5*(b.maxHeight-b.minHeight),d=(Math.min(b.xSegments,b.ySegments)+1)/b.frequency,e=0,f=b.xSegments+1;f>e;e++)for(var g=0,h=b.ySegments+1;h>g;g++)a[g*f+e].z+=noise.perlin(e/d,g/d)*c},THREE.Terrain.PerlinDiamond=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Perlin},{method:THREE.Terrain.DiamondSquare,amplitude:.75},{method:function(a,b){return THREE.Terrain.SmoothMedian(a,b)}}])},THREE.Terrain.PerlinLayers=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Perlin,frequency:1.25},{method:THREE.Terrain.Perlin,amplitude:.05,frequency:2.5},{method:THREE.Terrain.Perlin,amplitude:.35,frequency:5},{method:THREE.Terrain.Perlin,amplitude:.15,frequency:10}])},THREE.Terrain.Simplex=function(a,b){noise.seed(Math.random());for(var c=.5*(b.maxHeight-b.minHeight),d=2*(Math.min(b.xSegments,b.ySegments)+1)/b.frequency,e=0,f=b.xSegments+1;f>e;e++)for(var g=0,h=b.ySegments+1;h>g;g++)a[g*f+e].z+=noise.simplex(e/d,g/d)*c},THREE.Terrain.SimplexLayers=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Simplex,frequency:1.25},{method:THREE.Terrain.Simplex,amplitude:.5,frequency:2.5},{method:THREE.Terrain.Simplex,amplitude:.25,frequency:5},{method:THREE.Terrain.Simplex,amplitude:.125,frequency:10},{method:THREE.Terrain.Simplex,amplitude:.0625,frequency:20}])},function(){function a(a,b,c,d,e,f){if(!(c>d)){var g=0,h=0,i=d,j=d,k=Math.floor(d/c),l=-k,m=-k;for(g=0;i>=g;g+=k){for(h=0;j>=h;h+=k){var n=h*i+g;if(f[n]=Math.random()*e,!(0>l&&0>m)){for(var o=f[n],p=f[h*i+(g-k)]||o,q=f[(h-k)*i+g]||o,r=f[(h-k)*i+(g-k)]||o,s=l;g>s;s++)for(var t=m;h>t;t++)if(s!==l||t!==m){var u=t*i+s;if(!(0>u)){var v=(s-l)/k,w=(t-m)/k,x=v*q+(1-v)*r,y=v*o+(1-v)*p;f[u]=w*y+(1-w)*x}}m=h}}l=g,m=-k}for(g=0,i=b.xSegments+1;i>g;g++)for(h=0,j=b.ySegments+1;j>h;h++){var z=h*i+g,A=h*d+g;a[z].z+=f[A]}}}THREE.Terrain.Value=function(b,c){var d=Math.max(c.xSegments,c.ySegments)+1,e;for(e=1;Math.pow(2,e)h;h++)a(b,c,Math.pow(2,h),d,g*Math.pow(2,2.4-1.2*h),f);THREE.Terrain.Clamp(b,{maxHeight:c.maxHeight,minHeight:c.minHeight,stretch:!0})}}(),THREE.Terrain.Weierstrass=function(a,b){for(var c=.5*(b.maxHeight-b.minHeight),d=Math.random()<.5?1:-1,e=Math.random()<.5?1:-1,f=.5+1*Math.random(),g=.5+1*Math.random(),h=.025+.1*Math.random(),i=-1+2*Math.random(),j=.5+1*Math.random(),k=.5+1*Math.random(),l=.025+.1*Math.random(),m=-1+2*Math.random(),n=0,o=b.xSegments+1;o>n;n++)for(var p=0,q=b.ySegments+1;q>p;p++){for(var r=0,s=0;20>s;s++){var t=Math.pow(1+f,-s)*Math.sin(Math.pow(1+g,s)*(n+.25*Math.cos(p)+i*p)*h),u=Math.pow(1+j,-s)*Math.sin(Math.pow(1+k,s)*(p+.25*Math.cos(n)+m*n)*l);r-=Math.exp(d*t*t+e*u*u)}a[p*o+n].z+=r*c}THREE.Terrain.Clamp(a,b)},THREE.Terrain.generateBlendedMaterial=function(a){for(var b=THREE.UniformsUtils.merge([THREE.ShaderLib.lambert.uniforms]),c="",d="",e=0,f=a.length;f>e;e++)if(a[e].wrapS=a[e].wrapT=THREE.RepeatWrapping,a[e].needsUpdate=!0,b["texture_"+e]={type:"t",value:a[e].texture},c+="uniform sampler2D texture_"+e+";\n",0!==e){var g=a[e].levels,h=a[e].glsl,i="undefined"!=typeof g;if(i){g[1]-g[0]<1&&(g[0]-=1),g[3]-g[2]<1&&(g[3]+=1);for(var j=0;jm;m++)for(var o=0,p=b.h;p>o;o++){var q=o*n+m,r=a.faces[q],s=!1;if(e){var t=g(q);tMath.random())}else s=b.spread(j[r.a],q,r,m,o);if(s){if(r.normal.angleTo(l)>b.maxSlope)continue;var u=b.mesh.clone();if(u.position.copy(j[r.a]).add(j[r.b]).add(j[r.c]).divideScalar(3),b.maxTilt>0){var v=u.position.clone().add(r.normal);u.lookAt(v);var w=r.normal.angleTo(l);if(w>b.maxTilt){var x=b.maxTilt/w;u.rotation.x*=x,u.rotation.y*=x,u.rotation.z*=x}}if(u.rotation.x+=.5*Math.PI,u.rotateY(2*Math.random()*Math.PI),b.sizeVariance){var y=Math.random()*i-b.sizeVariance;u.scale.x=u.scale.z=1+y,u.scale.y+=y}k.push(u)}}var z,A;if(b.mesh.geometry instanceof THREE.Geometry){var B=new THREE.Geometry;for(z=0,A=k.length;A>z;z++){var C=k[z];C.updateMatrix(),B.merge(C.geometry,C.matrix)}b.scene.add(new THREE.Mesh(B,b.mesh.material))}else for(z=0,A=k.length;A>z;z++)b.scene.add(k[z]);return b.scene},THREE.Terrain.ScatterHelper=function(a,b,c,d){c=c||1,d=d||.25,b.frequency=b.frequency||2.5;var e={};for(var f in b)b.hasOwnProperty(f)&&(e[f]=b[f]);e.xSegments*=2,e.stretch=!0,e.maxHeight=1,e.minHeight=0;for(var g=THREE.Terrain.heightmapArray(a,e),h=0,i=g.length;i>h;h++)(h%c||Math.random()>d)&&(g[h]=1);return function(){return g}},THREE.Terrain.Influences={Mesa:function(a){return 1.25*Math.min(.8,Math.exp(-(a*a)))},Hole:function(a){return-THREE.Terrain.Influences.Mesa(a)},Hill:function(a){return 0>a?(a+1)*(a+1)*(3-2*(a+1)):1-a*a*(3-2*a)},Valley:function(a){return-THREE.Terrain.Influences.Hill(a)},Dome:function(a){return-(a+1)*(a-1)},Flat:function(a){return 0},Volcano:function(a){return.94-.32*(Math.abs(2*a)+Math.cos(2*Math.PI*Math.abs(a)+.4))}},THREE.Terrain.Influence=function(a,b,c,d,e,f,g,h,i){c=c||THREE.Terrain.Influences.Hill,d="undefined"==typeof d?.5:d,e="undefined"==typeof e?.5:e,f="undefined"==typeof f?64:f,g="undefined"==typeof g?64:g,h="undefined"==typeof h?THREE.NormalBlending:h,i=i||THREE.Terrain.EaseIn;for(var j=b.xSegments+1,k=b.ySegments+1,l=j*d,m=k*e,n=b.xSize/b.xSegments,o=b.ySize/b.ySegments,p=f/n,q=f/o,r=1/f,s=Math.ceil(l-p),t=Math.floor(l+p),u=Math.ceil(m-q),v=Math.floor(m+q),w=s;t>w;w++)for(var x=u;v>x;x++){var y=x*j+w,z=(w-l)*n,A=(x-m)*o,B=Math.sqrt(z*z+A*A),C=B*r,D=z*r,E=A*r,F=c(C,D,E)*g*(1-i(C,D,E));B>f||"undefined"==typeof a[y]||(h===THREE.AdditiveBlending?a[y].z+=F:h===THREE.SubtractiveBlending?a[y].z-=F:h===THREE.MultiplyBlending?a[y].z*=F:h===THREE.NoBlending?a[y].z=F:h===THREE.NormalBlending?a[y].z=i(C,D,E)*a[y].z+F:"function"==typeof h&&(a[y].z=h(a[y].z,F,C,D,E)))}}; -//# sourceMappingURL=THREE.Terrain.min.map \ No newline at end of file +!function(a){function b(a,b,c){this.x=a,this.y=b,this.z=c}function c(a){return a*a*a*(a*(6*a-15)+10)}function d(a,b,c){return(1-c)*a+c*b}var e=a.noise={};b.prototype.dot2=function(a,b){return this.x*a+this.y*b},b.prototype.dot3=function(a,b,c){return this.x*a+this.y*b+this.z*c};var f=[new b(1,1,0),new b(-1,1,0),new b(1,-1,0),new b(-1,-1,0),new b(1,0,1),new b(-1,0,1),new b(1,0,-1),new b(-1,0,-1),new b(0,1,1),new b(0,-1,1),new b(0,1,-1),new b(0,-1,-1)],g=[151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180],h=new Array(512),i=new Array(512);e.seed=function(a){a>0&&1>a&&(a*=65536),a=Math.floor(a),256>a&&(a|=a<<8);for(var b=0;256>b;b++){var c;c=1&b?g[b]^255&a:g[b]^a>>8&255,h[b]=h[b+256]=c,i[b]=i[b+256]=f[c%12]}},e.seed(Math.random());var j=.5*(Math.sqrt(3)-1),k=(3-Math.sqrt(3))/6,l=1/3,m=1/6;e.simplex=function(a,b){var c,d,e,f=(a+b)*j,g=Math.floor(a+f),l=Math.floor(b+f),m=(g+l)*k,n=a-g+m,o=b-l+m,p,q;n>o?(p=1,q=0):(p=0,q=1);var r=n-p+k,s=o-q+k,t=n-1+2*k,u=o-1+2*k;g&=255,l&=255;var v=i[g+h[l]],w=i[g+p+h[l+q]],x=i[g+1+h[l+1]],y=.5-n*n-o*o;0>y?c=0:(y*=y,c=y*y*v.dot2(n,o));var z=.5-r*r-s*s;0>z?d=0:(z*=z,d=z*z*w.dot2(r,s));var A=.5-t*t-u*u;return 0>A?e=0:(A*=A,e=A*A*x.dot2(t,u)),70*(c+d+e)},e.perlin=function(a,b){var e=Math.floor(a),f=Math.floor(b);a-=e,b-=f,e=255&e,f=255&f;var g=i[e+h[f]].dot2(a,b),j=i[e+h[f+1]].dot2(a,b-1),k=i[e+1+h[f]].dot2(a-1,b),l=i[e+1+h[f+1]].dot2(a-1,b-1),m=c(a);return d(d(g,k,m),d(j,l,m),c(b))}}(this),THREE.Terrain=function(a){var b={after:null,easing:THREE.Terrain.Linear,heightmap:THREE.Terrain.DiamondSquare,material:null,maxHeight:100,minHeight:-100,optimization:THREE.Terrain.NONE,frequency:2.5,steps:1,stretch:!0,turbulent:!1,useBufferGeometry:!1,xSegments:63,xSize:1024,ySegments:63,ySize:1024};a=a||{};for(var c in b)b.hasOwnProperty(c)&&(a[c]="undefined"==typeof a[c]?b[c]:a[c]);a.material=a.material||new THREE.MeshBasicMaterial({color:15623731});var d=new THREE.Object3D;d.rotation.x=-.5*Math.PI;var e=new THREE.Mesh(new THREE.PlaneGeometry(a.xSize,a.ySize,a.xSegments,a.ySegments),a.material);return a.heightmap instanceof HTMLCanvasElement||a.heightmap instanceof Image?THREE.Terrain.fromHeightmap(e.geometry.vertices,a):"function"==typeof a.heightmap?a.heightmap(e.geometry.vertices,a):console.warn("An invalid value was passed for `options.heightmap`: "+a.heightmap),THREE.Terrain.Normalize(e,a),a.useBufferGeometry&&(e.geometry=(new THREE.BufferGeometry).fromGeometry(e.geometry)),d.add(e),d},THREE.Terrain.Normalize=function(a,b){var c=a.geometry.vertices;b.turbulent&&THREE.Terrain.Turbulence(c,b),b.steps>1&&(THREE.Terrain.Step(c,b.steps),THREE.Terrain.Smooth(c,b)),THREE.Terrain.Clamp(c,b),"function"==typeof b.after&&b.after(c,b),a.geometry.verticesNeedUpdate=!0,a.geometry.normalsNeedUpdate=!0,a.geometry.computeBoundingSphere(),a.geometry.computeFaceNormals(),a.geometry.computeVertexNormals()},THREE.Terrain.NONE=0,THREE.Terrain.GEOMIPMAP=1,THREE.Terrain.GEOCLIPMAP=2,THREE.Terrain.POLYGONREDUCTION=3,THREE.Terrain.toArray2D=function(a,b){var c=new Array(b.xSegments),d=b.xSegments+1,e=b.ySegments+1,f,g;for(f=0;d>f;f++)for(c[f]=new Float64Array(b.ySegments),g=0;e>g;g++)c[f][g]=a[g*d+f].z;return c},THREE.Terrain.fromArray2D=function(a,b){for(var c=0,d=b.length;d>c;c++)for(var e=0,f=b[c].length;f>e;e++)a[e*d+c].z=b[c][e]},THREE.Terrain.toArray1D=function(a){for(var b=new Float64Array(a.length),c=0,d=b.length;d>c;c++)b[c]=a[c].z;return b},THREE.Terrain.fromArray1D=function(a,b){for(var c=0,d=Math.min(a.length,b.length);d>c;c++)a[c].z=b[c]},THREE.Terrain.heightmapArray=function(a,b){var c=new Array((b.xSegments+1)*(b.ySegments+1)),d=c.length,e;for(e=0;d>e;e++)c[e]={z:0};for(b.minHeight=b.minHeight||0,b.maxHeight="undefined"==typeof b.maxHeight?1:b.maxHeight,b.stretch=b.stretch||!1,a(c,b),THREE.Terrain.Clamp(c,b),e=0;d>e;e++)c[e]=c[e].z;return c},THREE.Terrain.Linear=function(a){return a},THREE.Terrain.EaseIn=function(a){return a*a},THREE.Terrain.EaseOut=function(a){return-a*(a-2)},THREE.Terrain.EaseInOut=function(a){return a*a*(3-2*a)},THREE.Terrain.InEaseOut=function(a){var b=2*a-1;return.5*b*b*b+.5},THREE.Terrain.EaseInStrong=function(a){return a*a*a*a*a*a*a},THREE.Terrain.fromHeightmap=function(a,b){var c=document.createElement("canvas"),d=c.getContext("2d"),e=b.ySegments+1,f=b.xSegments+1,g=b.maxHeight-b.minHeight;c.width=f,c.height=e,d.drawImage(b.heightmap,0,0,c.width,c.height);for(var h=d.getImageData(0,0,c.width,c.height).data,i=0;e>i;i++)for(var j=0;f>j;j++){var k=i*f+j,l=4*k;a[k].z=(h[l]+h[l+1]+h[l+2])/765*g+b.minHeight}},THREE.Terrain.toHeightmap=function(a,b){var c="undefined"==typeof b.maxHeight,d="undefined"==typeof b.minHeight,e=c?b.maxHeight:-(1/0),f=d?b.minHeight:1/0;if(!c||!d){for(var g=e,h=f,i=0,j=a.length;j>i;i++)a[i].z>g&&(g=a[i].z),a[i].zr;r++)for(var s=0;n>s;s++){var t=r*n+s,u=4*t;q[u]=q[u+1]=q[u+2]=Math.round((a[t].z-b.minHeight)/o*255),q[u+3]=255}return l.putImageData(p,0,0),k},THREE.Terrain.Clamp=function(a,b){var c=1/0,d=-(1/0),e=a.length,f;for(b.easing=b.easing||THREE.Terrain.Linear,f=0;e>f;f++)a[f].zd&&(d=a[f].z);var g=d-c,h="number"!=typeof b.maxHeight?d:b.maxHeight,i="number"!=typeof b.minHeight?c:b.minHeight,j=b.stretch?h:h>d?d:h,k=b.stretch?i:c>i?c:i,l=j-k;for(k>j&&(j=h,l=j-k),f=0;e>f;f++)a[f].z=b.easing((a[f].z-c)/g)*l+i},THREE.Terrain.Edges=function(a,b,c,d,e,f){var g=Math.floor(d/(b.xSize/b.xSegments))||1,h=Math.floor(d/(b.ySize/b.ySegments))||1,i=c?b.maxHeight:b.minHeight,j=c?Math.max:Math.min,k=b.xSegments+1,l=b.ySegments+1,m,n,o,p,q;for(e=e||THREE.Terrain.EaseInOut,"object"!=typeof f&&(f={top:!0,bottom:!0,left:!0,right:!0}),m=0;k>m;m++)for(n=0;h>n;n++)o=e(1-n/h),p=n*k+m,q=(b.ySegments-n)*k+m,f.top&&(a[p].z=j(a[p].z,(i-a[p].z)*o+a[p].z)),f.bottom&&(a[q].z=j(a[q].z,(i-a[q].z)*o+a[q].z));for(m=0;l>m;m++)for(n=0;g>n;n++)o=e(1-n/g),p=m*k+n,q=(b.ySegments-m)*k+(b.xSegments-n),f.left&&(a[p].z=j(a[p].z,(i-a[p].z)*o+a[p].z)),f.right&&(a[q].z=j(a[q].z,(i-a[q].z)*o+a[q].z));THREE.Terrain.Clamp(a,{maxHeight:b.maxHeight,minHeight:b.minHeight,stretch:!0})},THREE.Terrain.RadialEdges=function(a,b,c,d,e){var f=c?b.maxHeight:b.minHeight,g=c?Math.max:Math.min,h=b.xSegments+1,i=b.ySegments+1,j=.5*h,k=.5*i,l=b.xSize/b.xSegments,m=b.ySize/b.ySegments,n=.5*Math.min(b.xSize,b.ySize)-d,o,p,q,r,s;for(o=0;h>o;o++)for(p=0;k>p;p++)r=p*h+o,s=Math.min(n,Math.sqrt((j-o)*l*(j-o)*l+(k-p)*m*(k-p)*m)-d),0>s||(q=e(s/n),a[r].z=g(a[r].z,(f-a[r].z)*q+a[r].z),r=(b.ySegments-p)*h+o,a[r].z=g(a[r].z,(f-a[r].z)*q+a[r].z))},THREE.Terrain.Smooth=function(a,b,c){for(var d=new Float64Array(a.length),e=0,f=b.xSegments+1,g=b.ySegments+1;f>e;e++)for(var h=0,i=0,j=0;g>h;h++){for(var k=-1;1>=k;k++)for(var l=-1;1>=l;l++){var m=(h+k)*f+e+l;"undefined"!=typeof a[m]&&(i+=a[m].z,j++)}d[h*f+e]=i/j}c=c||0;for(var n=1/(1+c),o=0,p=a.length;p>o;o++)a[o].z=(d[o]+a[o].z*c)*n},THREE.Terrain.SmoothMedian=function(a,b){for(var c=new Float64Array(a.length),d=[],e=[],f=function(a,b){return d[a]-d[b]},g=0,h=b.xSegments+1,i=b.ySegments+1;h>g;g++)for(var j=0;i>j;j++){d.length=0,e.length=0;for(var k=-1;1>=k;k++)for(var l=-1;1>=l;l++){var m=(j+k)*h+g+l;"undefined"!=typeof a[m]&&(d.push(a[m].z),e.push(m))}e.sort(f);var n=Math.floor(.5*e.length),o;o=e.length%2===1?a[e[n]].z:.5*(a[e[n-1]].z+a[e[n]].z),c[j*h+g]=o}for(var p=0,q=a.length;q>p;p++)a[p].z=c[p]},THREE.Terrain.SmoothConservative=function(a,b,c){for(var d=new Float64Array(a.length),e=0,f=b.xSegments+1,g=b.ySegments+1;f>e;e++)for(var h=0;g>h;h++){for(var i=-(1/0),j=1/0,k=-1;1>=k;k++)for(var l=-1;1>=l;l++){var m=(h+k)*f+e+l;"undefined"!=typeof a[m]&&k&&l&&(a[m].zi&&(i=a[m].z))}var n=h*f+e;if("number"==typeof c){var o=.5*(i-j),p=j+o;i=p+o*c,j=p-o*c}d[n]=a[n].z>i?i:a[n].zq;q++)a[q].z=d[q]},THREE.Terrain.Step=function(a,b){var c=0,d=0,e=a.length,f=Math.floor(e/b),g=new Array(e),h=new Array(b);for("undefined"==typeof b&&(b=Math.floor(Math.pow(.5*e,.25))),c=0;e>c;c++)g[c]=a[c].z;for(g.sort(function(a,b){return a-b}),c=0;b>c;c++){var i=g.slice(c*f,(c+1)*f),j=0,k=i.length;for(d=0;k>d;d++)j+=i[d];h[c]={min:i[0],max:i[i.length-1],avg:j/k}}for(c=0;e>c;c++){var l=a[c].z;for(d=0;b>d;d++)if(l>=h[d].min&&l<=h[d].max){a[c].z=h[d].avg;break}}},THREE.Terrain.Turbulence=function(a,b){for(var c=b.maxHeight-b.minHeight,d=0,e=a.length;e>d;d++)a[d].z=b.minHeight+Math.abs(2*(a[d].z-b.minHeight)-c)},THREE.Terrain.MultiPass=function(a,b,c){var d={};for(var e in b)b.hasOwnProperty(e)&&(d[e]=b[e]);for(var f=b.maxHeight-b.minHeight,g=0,h=c.length;h>g;g++){var i="undefined"==typeof c[g].amplitude?1:c[g].amplitude,j=.5*(f-f*i);d.maxHeight=b.maxHeight-j,d.minHeight=b.minHeight+j,d.frequency="undefined"==typeof c[g].frequency?b.frequency:c[g].frequency,c[g].method(a,d)}},THREE.Terrain.Cosine=function(a,b){for(var c=.5*(b.maxHeight-b.minHeight),d=b.frequency*Math.PI/(Math.min(b.xSegments,b.ySegments)+1),e=Math.random()*Math.PI*2,f=0,g=b.xSegments+1;g>f;f++)for(var h=0,i=b.ySegments+1;i>h;h++)a[h*g+f].z+=c*(Math.cos(f*d+e)+Math.cos(h*d+e))},THREE.Terrain.CosineLayers=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Cosine,frequency:2.5},{method:THREE.Terrain.Cosine,amplitude:.1,frequency:12},{method:THREE.Terrain.Cosine,amplitude:.05,frequency:15},{method:THREE.Terrain.Cosine,amplitude:.025,frequency:20}])},THREE.Terrain.DiamondSquare=function(a,b){for(var c=Math.max(b.xSegments,b.ySegments)+1,d=1;Math.pow(2,d)=h;h++)f[h]=new Float64Array(c+1);for(var l=c;l>=2;l/=2){var m=Math.round(.5*l),n=Math.round(l),o,p,q,r,s;for(g/=2,o=0;c>o;o+=n)for(p=0;c>p;p+=n)r=Math.random()*g*2-g,q=f[o][p]+f[o+n][p]+f[o][p+n]+f[o+n][p+n],q*=.25,f[o+m][p+m]=q+r;for(o=0;c>o;o+=m)for(p=(o+m)%l;c>p;p+=l)r=Math.random()*g*2-g,q=f[(o-m+e)%e][p]+f[(o+m)%e][p]+f[o][(p+m)%e]+f[o][(p-m+e)%e],q*=.25,q+=r,f[o][p]=q,0===o&&(f[c][p]=q),0===p&&(f[o][c]=q)}for(h=0;j>h;h++)for(i=0;k>i;i++)a[i*j+h].z+=f[h][i]},THREE.Terrain.Fault=function(a,b){for(var c=Math.sqrt(b.xSegments*b.xSegments+b.ySegments*b.ySegments),d=c*b.frequency,e=.5*(b.maxHeight-b.minHeight),f=e/d,g=Math.min(b.xSize/b.xSegments,b.ySize/b.ySegments)*b.frequency,h=0;d>h;h++)for(var i=Math.random(),j=Math.sin(i*Math.PI*2),k=Math.cos(i*Math.PI*2),l=Math.random()*c-.5*c,m=0,n=b.xSegments+1;n>m;m++)for(var o=0,p=b.ySegments+1;p>o;o++){var q=j*m+k*o-l;q>g?a[o*n+m].z+=f:-g>q?a[o*n+m].z-=f:a[o*n+m].z+=Math.cos(q/g*Math.PI*2)*f}},THREE.Terrain.Hill=function(a,b,c,d){var e=2*b.frequency,f=e*e*10,g=b.maxHeight-b.minHeight,h=g/(e*e),i=g/e,j=Math.min(b.xSize,b.ySize),k=j/(e*e),l=j/e;c=c||THREE.Terrain.Influences.Hill;for(var m={x:0,y:0},n=0;f>n;n++){var o=Math.random()*(l-k)+k,p=Math.random()*(i-h)+h,q=0-o,r=b.xSize+o,s=b.ySize+o;m.x=Math.random(),m.y=Math.random(),"function"==typeof d&&d(m),THREE.Terrain.Influence(a,b,c,m.x,m.y,o,p,THREE.AdditiveBlending,THREE.Terrain.EaseInStrong)}},THREE.Terrain.HillIsland=function(){var a=function(a){var b=Math.random()*Math.PI*2;a.x=.5+Math.cos(b)*a.x*.4,a.y=.5+Math.sin(b)*a.y*.4};return function(b,c,d){THREE.Terrain.Hill(b,c,d,a)}}(),function(){function a(b,c,d,e,f){for(var g=d*e+c,h=0;3>h;h++){var i=Math.floor(8*Math.random());switch(i){case 0:c++;break;case 1:c--;break;case 2:d++;break;case 3:d--;break;case 4:c++,d++;break;case 5:c++,d--;break;case 6:c--,d++;break;case 7:c--,d--}var j=d*e+c;if("undefined"!=typeof b[j]){if(b[j].zk;k++){a(b,g,h,e,f);var l=Math.random()*Math.PI*2;k%1e3===0&&(i=.2*Math.random()-.1,j=.2*Math.random()-.1),k%100===0&&(g=Math.floor(c.xSegments*(.5+i)+Math.cos(l)*Math.random()*c.xSegments*(.5-Math.abs(i))),h=Math.floor(c.ySegments*(.5+j)+Math.sin(l)*Math.random()*c.ySegments*(.5-Math.abs(j))))}}}(),THREE.Terrain.Perlin=function(a,b){noise.seed(Math.random());for(var c=.5*(b.maxHeight-b.minHeight),d=(Math.min(b.xSegments,b.ySegments)+1)/b.frequency,e=0,f=b.xSegments+1;f>e;e++)for(var g=0,h=b.ySegments+1;h>g;g++)a[g*f+e].z+=noise.perlin(e/d,g/d)*c},THREE.Terrain.PerlinDiamond=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Perlin},{method:THREE.Terrain.DiamondSquare,amplitude:.75},{method:function(a,b){return THREE.Terrain.SmoothMedian(a,b)}}])},THREE.Terrain.PerlinLayers=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Perlin,frequency:1.25},{method:THREE.Terrain.Perlin,amplitude:.05,frequency:2.5},{method:THREE.Terrain.Perlin,amplitude:.35,frequency:5},{method:THREE.Terrain.Perlin,amplitude:.15,frequency:10}])},THREE.Terrain.Simplex=function(a,b){noise.seed(Math.random());for(var c=.5*(b.maxHeight-b.minHeight),d=2*(Math.min(b.xSegments,b.ySegments)+1)/b.frequency,e=0,f=b.xSegments+1;f>e;e++)for(var g=0,h=b.ySegments+1;h>g;g++)a[g*f+e].z+=noise.simplex(e/d,g/d)*c},THREE.Terrain.SimplexLayers=function(a,b){THREE.Terrain.MultiPass(a,b,[{method:THREE.Terrain.Simplex,frequency:1.25},{method:THREE.Terrain.Simplex,amplitude:.5,frequency:2.5},{method:THREE.Terrain.Simplex,amplitude:.25,frequency:5},{method:THREE.Terrain.Simplex,amplitude:.125,frequency:10},{method:THREE.Terrain.Simplex,amplitude:.0625,frequency:20}])},function(){function a(a,b,c,d,e,f){if(!(c>d)){var g=0,h=0,i=d,j=d,k=Math.floor(d/c),l=-k,m=-k;for(g=0;i>=g;g+=k){for(h=0;j>=h;h+=k){var n=h*i+g;if(f[n]=Math.random()*e,!(0>l&&0>m)){for(var o=f[n],p=f[h*i+(g-k)]||o,q=f[(h-k)*i+g]||o,r=f[(h-k)*i+(g-k)]||o,s=l;g>s;s++)for(var t=m;h>t;t++)if(s!==l||t!==m){var u=t*i+s;if(!(0>u)){var v=(s-l)/k,w=(t-m)/k,x=v*q+(1-v)*r,y=v*o+(1-v)*p;f[u]=w*y+(1-w)*x}}m=h}}l=g,m=-k}for(g=0,i=b.xSegments+1;i>g;g++)for(h=0,j=b.ySegments+1;j>h;h++){var z=h*i+g,A=h*d+g;a[z].z+=f[A]}}}THREE.Terrain.Value=function(b,c){for(var d=Math.max(c.xSegments,c.ySegments)+1,e=1;Math.pow(2,e)h;h++)a(b,c,Math.pow(2,h),d,g*Math.pow(2,2.4-1.2*h),f);THREE.Terrain.Clamp(b,{maxHeight:c.maxHeight,minHeight:c.minHeight,stretch:!0})}}(),THREE.Terrain.Weierstrass=function(a,b){for(var c=.5*(b.maxHeight-b.minHeight),d=Math.random()<.5?1:-1,e=Math.random()<.5?1:-1,f=.5+1*Math.random(),g=.5+1*Math.random(),h=.025+.1*Math.random(),i=-1+2*Math.random(),j=.5+1*Math.random(),k=.5+1*Math.random(),l=.025+.1*Math.random(),m=-1+2*Math.random(),n=0,o=b.xSegments+1;o>n;n++)for(var p=0,q=b.ySegments+1;q>p;p++){for(var r=0,s=0;20>s;s++){var t=Math.pow(1+f,-s)*Math.sin(Math.pow(1+g,s)*(n+.25*Math.cos(p)+i*p)*h),u=Math.pow(1+j,-s)*Math.sin(Math.pow(1+k,s)*(p+.25*Math.cos(n)+m*n)*l);r-=Math.exp(d*t*t+e*u*u)}a[p*o+n].z+=r*c}THREE.Terrain.Clamp(a,b)},THREE.Terrain.generateBlendedMaterial=function(a){for(var b=THREE.UniformsUtils.merge([THREE.ShaderLib.lambert.uniforms]),c="",d="",e=0,f=a.length;f>e;e++)if(a[e].wrapS=a[e].wrapT=THREE.RepeatWrapping,a[e].needsUpdate=!0,b["texture_"+e]={type:"t",value:a[e].texture},c+="uniform sampler2D texture_"+e+";\n",0!==e){var g=a[e].levels,h=a[e].glsl,i="undefined"!=typeof g;if(i){g[1]-g[0]<1&&(g[0]-=1),g[3]-g[2]<1&&(g[3]+=1);for(var j=0;jm;m++)for(var o=0,p=b.h;p>o;o++){var q=o*n+m,r=a.faces[q],s=!1;if(e){var t=g(q);tMath.random())}else s=b.spread(j[r.a],q,r,m,o);if(s){if(r.normal.angleTo(l)>b.maxSlope)continue;var u=b.mesh.clone();if(u.position.copy(j[r.a]).add(j[r.b]).add(j[r.c]).divideScalar(3),b.maxTilt>0){var v=u.position.clone().add(r.normal);u.lookAt(v);var w=r.normal.angleTo(l);if(w>b.maxTilt){var x=b.maxTilt/w;u.rotation.x*=x,u.rotation.y*=x,u.rotation.z*=x}}if(u.rotation.x+=.5*Math.PI,u.rotateY(2*Math.random()*Math.PI),b.sizeVariance){var y=Math.random()*i-b.sizeVariance;u.scale.x=u.scale.z=1+y,u.scale.y+=y}k.push(u)}}var z,A;if(b.mesh.geometry instanceof THREE.Geometry){var B=new THREE.Geometry;for(z=0,A=k.length;A>z;z++){var C=k[z];C.updateMatrix(),B.merge(C.geometry,C.matrix)}b.scene.add(new THREE.Mesh(B,b.mesh.material))}else for(z=0,A=k.length;A>z;z++)b.scene.add(k[z]);return b.scene},THREE.Terrain.ScatterHelper=function(a,b,c,d){c=c||1,d=d||.25,b.frequency=b.frequency||2.5;var e={};for(var f in b)b.hasOwnProperty(f)&&(e[f]=b[f]);e.xSegments*=2,e.stretch=!0,e.maxHeight=1,e.minHeight=0;for(var g=THREE.Terrain.heightmapArray(a,e),h=0,i=g.length;i>h;h++)(h%c||Math.random()>d)&&(g[h]=1);return function(){return g}},THREE.Terrain.Influences={Mesa:function(a){return 1.25*Math.min(.8,Math.exp(-(a*a)))},Hole:function(a){return-THREE.Terrain.Influences.Mesa(a)},Hill:function(a){return 0>a?(a+1)*(a+1)*(3-2*(a+1)):1-a*a*(3-2*a)},Valley:function(a){return-THREE.Terrain.Influences.Hill(a)},Dome:function(a){return-(a+1)*(a-1)},Flat:function(a){return 0},Volcano:function(a){return.94-.32*(Math.abs(2*a)+Math.cos(2*Math.PI*Math.abs(a)+.4))}},THREE.Terrain.Influence=function(a,b,c,d,e,f,g,h,i){c=c||THREE.Terrain.Influences.Hill,d="undefined"==typeof d?.5:d,e="undefined"==typeof e?.5:e,f="undefined"==typeof f?64:f,g="undefined"==typeof g?64:g,h="undefined"==typeof h?THREE.NormalBlending:h,i=i||THREE.Terrain.EaseIn;for(var j=b.xSegments+1,k=b.ySegments+1,l=j*d,m=k*e,n=b.xSize/b.xSegments,o=b.ySize/b.ySegments,p=f/n,q=f/o,r=1/f,s=Math.ceil(l-p),t=Math.floor(l+p),u=Math.ceil(m-q),v=Math.floor(m+q),w=s;t>w;w++)for(var x=u;v>x;x++){var y=x*j+w,z=(w-l)*n,A=(x-m)*o,B=Math.sqrt(z*z+A*A),C=B*r,D=z*r,E=A*r,F=c(C,D,E)*g*(1-i(C,D,E));B>f||"undefined"==typeof a[y]||(h===THREE.AdditiveBlending?a[y].z+=F:h===THREE.SubtractiveBlending?a[y].z-=F:h===THREE.MultiplyBlending?a[y].z*=F:h===THREE.NoBlending?a[y].z=F:h===THREE.NormalBlending?a[y].z=i(C,D,E)*a[y].z+F:"function"==typeof h&&(a[y].z=h(a[y].z,F,C,D,E)))}}; +//# sourceMappingURL=THREE.Terrain.min.js.map \ No newline at end of file diff --git a/build/THREE.Terrain.min.js.map b/build/THREE.Terrain.min.js.map new file mode 100644 index 0000000..21d1c74 --- /dev/null +++ b/build/THREE.Terrain.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"THREE.Terrain.min.js","sources":["THREE.Terrain.js"],"names":["global","Grad","x","y","z","this","fade","t","lerp","a","b","module","noise","prototype","dot2","dot3","grad3","p","perm","Array","gradP","seed","Math","floor","i","v","random","F2","sqrt","G2","F3","G3","simplex","xin","yin","n0","n1","n2","s","j","x0","y0","i1","j1","x1","y1","x2","y2","gi0","gi1","gi2","t0","t1","t2","perlin","X","Y","n00","n01","n10","n11","u","THREE","Terrain","options","defaultOptions","after","easing","Linear","heightmap","DiamondSquare","material","maxHeight","minHeight","optimization","NONE","frequency","steps","stretch","turbulent","useBufferGeometry","xSegments","xSize","ySegments","ySize","opt","hasOwnProperty","MeshBasicMaterial","color","scene","Object3D","rotation","PI","mesh","Mesh","PlaneGeometry","HTMLCanvasElement","Image","fromHeightmap","geometry","vertices","console","warn","Normalize","BufferGeometry","fromGeometry","add","Turbulence","Step","Smooth","Clamp","verticesNeedUpdate","normalsNeedUpdate","computeBoundingSphere","computeFaceNormals","computeVertexNormals","GEOMIPMAP","GEOCLIPMAP","POLYGONREDUCTION","toArray2D","tgt","xl","yl","Float64Array","fromArray2D","src","length","toArray1D","l","fromArray1D","min","heightmapArray","method","arr","EaseIn","EaseOut","EaseInOut","InEaseOut","EaseInStrong","g","canvas","document","createElement","context","getContext","rows","cols","spread","width","height","drawImage","data","getImageData","row","col","idx","toHeightmap","hasMax","hasMin","max","Infinity","max2","min2","k","d","createImageData","round","putImageData","actualRange","optMax","optMin","targetMax","targetMin","range","Edges","direction","distance","edges","numXSegments","numYSegments","peak","multiplier","k1","k2","top","bottom","left","right","RadialEdges","xl2","yl2","xSegmentSize","ySegmentSize","edgeRadius","vertexDistance","weight","sum","c","n","m","key","w","SmoothMedian","neighborValues","neighborKeys","sortByValue","push","sort","halfKey","median","SmoothConservative","kk","halfdiff","middle","levels","inc","heights","buckets","pow","subset","slice","bl","avg","startHeight","abs","MultiPass","passes","clonedOptions","amp","amplitude","move","Cosine","frequencyScalar","phase","cos","CosineLayers","segments","size","smoothing","half","whole","e","Fault","iterations","displacement","smoothDistance","sin","Hill","feature","shape","numFeatures","heightRange","smallerSideLength","minRadius","maxRadius","Influences","coords","radius","maxX","maxY","Influence","AdditiveBlending","HillIsland","island","theta","deposit","currentKey","r","neighborKey","Particles","xDeviation","yDeviation","Perlin","divisor","PerlinDiamond","o","PerlinLayers","Simplex","SimplexLayers","WhiteNoise","scale","lastX","lastY","px","py","r1","r2","kg","kd","Value","Weierstrass","dir1","dir2","r11","r12","r13","r14","r21","r22","r23","r24","exp","generateBlendedMaterial","textures","uniforms","UniformsUtils","merge","ShaderLib","lambert","declare","assign","wrapS","wrapT","RepeatWrapping","needsUpdate","type","value","texture","glsl","useLevels","blendAmount","params","fog","lights","vertexShader","replace","fragmentShader","ShaderChunk","common","color_pars_fragment","map_pars_fragment","alphamap_pars_fragment","lightmap_pars_fragment","envmap_pars_fragment","fog_pars_fragment","shadowmap_pars_fragment","specularmap_pars_fragment","logdepthbuf_pars_fragment","logdepthbuf_fragment","map_fragment","color_fragment","alphamap_fragment","alphatest_fragment","specularmap_fragment","lightmap_fragment","envmap_fragment","shadowmap_fragment","linear_to_gamma_fragment","fog_fragment","join","ShaderMaterial","ScatterMeshes","error","smoothSpread","sizeVariance","randomness","maxSlope","maxTilt","h","spreadIsNumber","randomHeightmap","spreadRange","doubleSizeVariance","meshes","up","clone","applyAxisAngle","Vector3","f","faces","place","rv","normal","angleTo","position","copy","divideScalar","lookAt","tiltAngle","ratio","rotateY","variance","Geometry","updateMatrix","matrix","ScatterHelper","skip","threshold","Mesa","Hole","Valley","Dome","Flat","Volcano","NormalBlending","vx","vy","xw","yw","rx","ry","xs","ceil","xe","ys","ye","fdx","fdy","fd","fdr","fdxr","fdyr","SubtractiveBlending","MultiplyBlending","NoBlending"],"mappings":"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"} \ No newline at end of file diff --git a/demo/index.js b/demo/index.js index f7ba9a0..e225449 100644 --- a/demo/index.js +++ b/demo/index.js @@ -1,4 +1,4 @@ -var webglExists = ( function () { try { var canvas = document.createElement( 'canvas' ); return !!window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); } catch( e ) { return false; } } )(); +var webglExists = ( function () { try { var canvas = document.createElement( 'canvas' ); return !!window.WebGLRenderingContext && ( canvas.getContext( 'webgl' ) || canvas.getContext( 'experimental-webgl' ) ); } catch( e ) { return false; } } )(); // jscs:ignore if (!webglExists) { alert('Your browser does not appear to support WebGL. You can try viewing this page anyway, but it may be slow and some things may not look as intended. Please try viewing on desktop Firefox or Chrome.'); @@ -11,10 +11,14 @@ if (/&?webgl=0\b/g.test(location.hash)) { } } -// Workaround: in Chrome, if a page is opened with window.open(), window.innerWidth and window.innerHeight will be zero. -if ( window.innerWidth === 0 ) { window.innerWidth = parent.innerWidth; window.innerHeight = parent.innerHeight; } +// Workaround: in Chrome, if a page is opened with window.open(), +// window.innerWidth and window.innerHeight will be zero. +if ( window.innerWidth === 0 ) { + window.innerWidth = parent.innerWidth; + window.innerHeight = parent.innerHeight; +} -var camera, scene, renderer, clock, player, terrainScene, decoScene, lastOptions, controls = {}, fpsCamera, skyDome, skyLight, sand, water; +var camera, scene, renderer, clock, player, terrainScene, decoScene, lastOptions, controls = {}, fpsCamera, skyDome, skyLight, sand, water; // jscs:ignore requireLineBreakAfterVariableAssignment var INV_MAX_FPS = 1 / 100, frameDelta = 0, paused = true, @@ -383,12 +387,12 @@ function watchFocus() { window.addEventListener('focus', function() { if (_blurred) { _blurred = false; - //startAnimating(); + // startAnimating(); controls.freeze = false; } }); window.addEventListener('blur', function() { - //stopAnimating(); + // stopAnimating(); _blurred = true; controls.freeze = true; }); diff --git a/package.json b/package.json index abc326c..561bf5e 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,10 @@ { "name": "three.terrain.js", - "version": "1.2.1", + "version": "1.2.2", "description": "Extends the Three.js web-based 3D graphics framework to support generating random terrains and rendering terrain from predetermined heightmaps.", "homepage": "https://github.com/IceCreamYou/THREE.Terrain", "bugs": "https://github.com/IceCreamYou/THREE.Terrain/issues", + "main": "build/THREE.Terrain.min.js", "directories": { "lib": "build", "example": "demo" @@ -25,11 +26,11 @@ "license": "MIT", "readmeFilename": "README.md", "devDependencies": { - "grunt": "~0.4.4", - "grunt-contrib-concat": "~0.4.0", - "grunt-contrib-jshint": "~0.10.0", - "grunt-contrib-uglify": "~0.4.0", - "grunt-jscs-checker": "~0.4.1", + "grunt": "~0.4.5", + "grunt-contrib-concat": "~0.5.1", + "grunt-contrib-jshint": "~0.11.2", + "grunt-contrib-uglify": "~0.9.1", + "grunt-jscs": "~2.1.0", "grunt-contrib-watch": "^0.6.1" } } diff --git a/src/core.js b/src/core.js index e1dfa8c..2da0302 100644 --- a/src/core.js +++ b/src/core.js @@ -99,7 +99,7 @@ THREE.Terrain = function(options) { options[opt] = typeof options[opt] === 'undefined' ? defaultOptions[opt] : options[opt]; } } - //options.unit = (options.xSize / (options.xSegments+1) + options.ySize / (options.ySegments+1)) * 0.5; + // options.unit = (options.xSize / (options.xSegments+1) + options.ySize / (options.ySegments+1)) * 0.5; options.material = options.material || new THREE.MeshBasicMaterial({ color: 0xee6633 }); // Encapsulating the terrain in a parent object allows us the flexibility diff --git a/src/filters.js b/src/filters.js index bf5e602..140be0e 100644 --- a/src/filters.js +++ b/src/filters.js @@ -147,7 +147,7 @@ THREE.Terrain.RadialEdges = function(g, options, direction, distance, easing) { yl2 = yl * 0.5, xSegmentSize = options.xSize / options.xSegments, ySegmentSize = options.ySize / options.ySegments, - edgeRadius = Math.min(options.xSize, options.ySize) * 0.5 - distance,//Math.sqrt(options.xSize * options.xSize + options.ySize * options.ySize) - distance, + edgeRadius = Math.min(options.xSize, options.ySize) * 0.5 - distance, i, j, multiplier, k, vertexDistance; for (i = 0; i < xl; i++) { for (j = 0; j < yl2; j++) { @@ -180,8 +180,7 @@ THREE.Terrain.RadialEdges = function(g, options, direction, distance, easing) { THREE.Terrain.Smooth = function(g, options, weight) { var heightmap = new Float64Array(g.length); for (var i = 0, xl = options.xSegments + 1, yl = options.ySegments + 1; i < xl; i++) { - for (var j = 0; j < yl; j++) { - var sum = 0, c = 0; + for (var j = 0, sum = 0, c = 0; j < yl; j++) { for (var n = -1; n <= 1; n++) { for (var m = -1; m <= 1; m++) { var key = (j+n)*xl + i + m; diff --git a/src/generators.js b/src/generators.js index a8e8baa..f98290e 100644 --- a/src/generators.js +++ b/src/generators.js @@ -85,8 +85,9 @@ THREE.Terrain.CosineLayers = function(g, options) { THREE.Terrain.DiamondSquare = function(g, options) { // Set the segment length to the smallest power of 2 that is greater than // the number of vertices in either dimension of the plane - var segments = Math.max(options.xSegments, options.ySegments) + 1, n; - for (n = 1; Math.pow(2, n) < segments; n++) {} + var segments = Math.max(options.xSegments, options.ySegments) + 1, + n = 1; + while (Math.pow(2, n) < segments) { n++; } segments = Math.pow(2, n); // Initialize heightmap @@ -103,15 +104,21 @@ THREE.Terrain.DiamondSquare = function(g, options) { // Generate heightmap for (var l = segments; l >= 2; l /= 2) { - var half = Math.round(l*0.5), whole = Math.round(l), x, y, avg, d, e; + var half = Math.round(l*0.5), + whole = Math.round(l), + x, + y, + avg, + d, + e; smoothing /= 2; // square for (x = 0; x < segments; x += whole) { for (y = 0; y < segments; y += whole) { d = Math.random() * smoothing * 2 - smoothing; - avg = heightmap[x][y] + // top left - heightmap[x+whole][y] + // top right - heightmap[x][y+whole] + // bottom left + avg = heightmap[x][y] + // top left + heightmap[x+whole][y] + // top right + heightmap[x][y+whole] + // bottom left heightmap[x+whole][y+whole]; // bottom right avg *= 0.25; heightmap[x+half][y+half] = avg + d; @@ -142,7 +149,7 @@ THREE.Terrain.DiamondSquare = function(g, options) { } } - //THREE.Terrain.SmoothConservative(g, options); + // THREE.Terrain.SmoothConservative(g, options); }; /** @@ -180,7 +187,7 @@ THREE.Terrain.Fault = function(g, options) { } } } - //THREE.Terrain.Smooth(g, options); + // THREE.Terrain.Smooth(g, options); }; /** @@ -352,7 +359,7 @@ THREE.Terrain.HillIsland = (function() { j = Math.floor(options.ySegments*(0.5+yDeviation) + Math.sin(d) * Math.random() * options.ySegments*(0.5-Math.abs(yDeviation))); } } - //THREE.Terrain.Smooth(g, options, 3); + // THREE.Terrain.Smooth(g, options, 3); }; })(); @@ -460,12 +467,14 @@ THREE.Terrain.SimplexLayers = function(g, options) { var k = j * xl + i; data[k] = Math.random() * range; if (lastX < 0 && lastY < 0) continue; + // jscs:disable disallowSpacesInsideBrackets /* c b * * l t */ var t = data[k], l = data[ j * xl + (i-inc)] || t, // left b = data[(j-inc) * xl + i ] || t, // bottom c = data[(j-inc) * xl + (i-inc)] || t; // corner + // jscs:enable disallowSpacesInsideBrackets // Interpolate between adjacent points to set the height of // higher-resolution target data. for (var x = lastX; x < i; x++) { @@ -508,8 +517,9 @@ THREE.Terrain.SimplexLayers = function(g, options) { THREE.Terrain.Value = function(g, options) { // Set the segment length to the smallest power of 2 that is greater // than the number of vertices in either dimension of the plane - var segments = Math.max(options.xSegments, options.ySegments) + 1, n; - for (n = 1; Math.pow(2, n) < segments; n++) {} + var segments = Math.max(options.xSegments, options.ySegments) + 1, + n = 1; + while (Math.pow(2, n) < segments) { n++; } segments = Math.pow(2, n); // Store the array of white noise outside of the WhiteNoise function to @@ -524,7 +534,7 @@ THREE.Terrain.SimplexLayers = function(g, options) { } // White noise creates some weird artifacts; fix them. - //THREE.Terrain.Smooth(g, options, 1); + // THREE.Terrain.Smooth(g, options, 1); THREE.Terrain.Clamp(g, { maxHeight: options.maxHeight, minHeight: options.minHeight, diff --git a/src/influences.js b/src/influences.js index f52235b..9553a1e 100644 --- a/src/influences.js +++ b/src/influences.js @@ -121,7 +121,7 @@ THREE.Terrain.Influence = function(g, options, f, x, y, r, h, t, e) { // interpolate using e, then blend according to t. d = f(fdr, fdxr, fdyr) * h * (1 - e(fdr, fdxr, fdyr)); if (fd > r || typeof g[k] == 'undefined') continue; - if (t === THREE.AdditiveBlending) g[k].z += d; + if (t === THREE.AdditiveBlending) g[k].z += d; // jscs:ignore requireSpaceAfterKeywords else if (t === THREE.SubtractiveBlending) g[k].z -= d; else if (t === THREE.MultiplyBlending) g[k].z *= d; else if (t === THREE.NoBlending) g[k].z = d; diff --git a/src/materials.js b/src/materials.js index b6c4cc9..4df3bdb 100644 --- a/src/materials.js +++ b/src/materials.js @@ -63,7 +63,7 @@ THREE.Terrain.generateBlendedMaterial = function(textures) { // Convert levels to floating-point numbers as strings so GLSL doesn't barf on "1" instead of "1.0" for (var j = 0; j < v.length; j++) { var n = v[j]; - v[j] = n|0 === n ? n+'.0' : n+''; + v[j] = n === n|0 ? n+'.0' : n+''; } } // The transparency of the new texture when it is layered on top of the existing color at this texel is @@ -138,7 +138,7 @@ THREE.Terrain.generateBlendedMaterial = function(textures) { ' vec4 color = texture2D( texture_0, MyvUv ); // base', assign, ' diffuseColor = color;', - //' gl_FragColor = color;', + // ' gl_FragColor = color;', THREE.ShaderChunk.logdepthbuf_fragment, THREE.ShaderChunk.map_fragment, diff --git a/src/noise.js b/src/noise.js index 341d5b3..a20e3d0 100644 --- a/src/noise.js +++ b/src/noise.js @@ -2,177 +2,185 @@ * Simplex and Perlin noise. * * Copied with small edits from https://github.com/josephg/noisejs which is -* public domain, originally by Stefan Gustavson (stegu@itn.liu.se) with +* public domain. Originally by Stefan Gustavson (stegu@itn.liu.se) with * optimizations by Peter Eastman (peastman@drizzle.stanford.edu) and converted * to JavaScript by Joseph Gentle. */ (function(global) { - var module = global.noise = {}; - - function Grad(x, y, z) { - this.x = x; this.y = y; this.z = z; - } - - Grad.prototype.dot2 = function(x, y) { - return this.x*x + this.y*y; - }; - - Grad.prototype.dot3 = function(x, y, z) { - return this.x*x + this.y*y + this.z*z; - }; - - var grad3 = [new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), - new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), - new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1)]; - - var p = [151,160,137,91,90,15, - 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, - 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, - 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, - 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, - 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, - 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, - 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, - 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, - 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, - 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, - 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, - 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180]; - // To remove the need for index wrapping, double the permutation table length - var perm = new Array(512); - var gradP = new Array(512); - - // This isn't a very good seeding function, but it works ok. It supports 2^16 - // different seed values. Write something better if you need more seeds. - module.seed = function(seed) { - if (seed > 0 && seed < 1) { - // Scale the seed out - seed *= 65536; - } + var module = global.noise = {}; - seed = Math.floor(seed); - if (seed < 256) { - seed |= seed << 8; + function Grad(x, y, z) { + this.x = x; + this.y = y; + this.z = z; } - for (var i = 0; i < 256; i++) { - var v; - if (i & 1) { - v = p[i] ^ (seed & 255); - } - else { - v = p[i] ^ ((seed>>8) & 255); - } - - perm[i] = perm[i + 256] = v; - gradP[i] = gradP[i + 256] = grad3[v % 12]; - } - }; - - module.seed(Math.random()); - - // Skewing and unskewing factors for 2, 3, and 4 dimensions - var F2 = 0.5*(Math.sqrt(3)-1); - var G2 = (3-Math.sqrt(3))/6; - - var F3 = 1/3; - var G3 = 1/6; - - // 2D simplex noise - module.simplex = function(xin, yin) { - var n0, n1, n2; // Noise contributions from the three corners - // Skew the input space to determine which simplex cell we're in - var s = (xin+yin)*F2; // Hairy factor for 2D - var i = Math.floor(xin+s); - var j = Math.floor(yin+s); - var t = (i+j)*G2; - var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed. - var y0 = yin-j+t; - // For the 2D case, the simplex shape is an equilateral triangle. - // Determine which simplex we are in. - var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords - if (x0 > y0) { // lower triangle, XY order: (0,0)->(1,0)->(1,1) - i1 = 1; j1 = 0; - } - else { // upper triangle, YX order: (0,0)->(0,1)->(1,1) - i1 = 0; j1 = 1; - } - // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and - // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where - // c = (3-sqrt(3))/6 - var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords - var y1 = y0 - j1 + G2; - var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords - var y2 = y0 - 1 + 2 * G2; - // Work out the hashed gradient indices of the three simplex corners - i &= 255; - j &= 255; - var gi0 = gradP[i+perm[j]]; - var gi1 = gradP[i+i1+perm[j+j1]]; - var gi2 = gradP[i+1+perm[j+1]]; - // Calculate the contribution from the three corners - var t0 = 0.5 - x0*x0-y0*y0; - if (t0 < 0) { - n0 = 0; - } - else { - t0 *= t0; - n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient + Grad.prototype.dot2 = function(x, y) { + return this.x*x + this.y*y; + }; + + Grad.prototype.dot3 = function(x, y, z) { + return this.x*x + this.y*y + this.z*z; + }; + + var grad3 = [ + new Grad(1,1,0),new Grad(-1,1,0),new Grad(1,-1,0),new Grad(-1,-1,0), + new Grad(1,0,1),new Grad(-1,0,1),new Grad(1,0,-1),new Grad(-1,0,-1), + new Grad(0,1,1),new Grad(0,-1,1),new Grad(0,1,-1),new Grad(0,-1,-1), + ]; + + var p = [151,160,137,91,90,15,131,13,201,95,96,53,194,233,7,225,140,36,103, + 30,69,142,8,99,37,240,21,10,23,190,6,148,247,120,234,75,0,26,197,62,94, + 252,219,203,117,35,11,32,57,177,33,88,237,149,56,87,174,20,125,136,171, + 168,68,175,74,165,71,134,139,48,27,166,77,146,158,231,83,111,229,122, + 60,211,133,230,220,105,92,41,55,46,245,40,244,102,143,54,65,25,63,161, + 1,216,80,73,209,76,132,187,208,89,18,169,200,196,135,130,116,188,159, + 86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,5,202,38,147, + 118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,223,183, + 170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,129, + 22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228, + 251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239, + 107,49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4, + 150,254,138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215, + 61,156,180]; + // To avoid the need for index wrapping, double the permutation table length + var perm = new Array(512), + gradP = new Array(512); + + // This isn't a very good seeding function, but it works okay. It supports + // 2^16 different seed values. Write your own if you need more seeds. + module.seed = function(seed) { + if (seed > 0 && seed < 1) { + // Scale the seed out + seed *= 65536; + } + + seed = Math.floor(seed); + if (seed < 256) { + seed |= seed << 8; + } + + for (var i = 0; i < 256; i++) { + var v; + if (i & 1) { + v = p[i] ^ (seed & 255); + } + else { + v = p[i] ^ ((seed>>8) & 255); + } + + perm[i] = perm[i + 256] = v; + gradP[i] = gradP[i + 256] = grad3[v % 12]; + } + }; + + module.seed(Math.random()); + + // Skewing and unskewing factors for 2 and 3 dimensions + var F2 = 0.5*(Math.sqrt(3)-1), + G2 = (3-Math.sqrt(3))/6, + F3 = 1/3, + G3 = 1/6; + + // 2D simplex noise + module.simplex = function(xin, yin) { + var n0, n1, n2; // Noise contributions from the three corners + // Skew the input space to determine which simplex cell we're in + var s = (xin+yin)*F2; // Hairy factor for 2D + var i = Math.floor(xin+s); + var j = Math.floor(yin+s); + var t = (i+j)*G2; + var x0 = xin-i+t; // The x,y distances from the cell origin, unskewed + var y0 = yin-j+t; + // For the 2D case, the simplex shape is an equilateral triangle. + // Determine which simplex we are in. + var i1, j1; // Offsets for second (middle) corner of simplex in (i,j) coords + if (x0 > y0) { // Lower triangle, XY order: (0,0)->(1,0)->(1,1) + i1 = 1; j1 = 0; + } + else { // Upper triangle, YX order: (0,0)->(0,1)->(1,1) + i1 = 0; j1 = 1; + } + // A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and + // a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where + // c = (3-sqrt(3))/6 + var x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords + var y1 = y0 - j1 + G2; + var x2 = x0 - 1 + 2 * G2; // Offsets for last corner in (x,y) unskewed coords + var y2 = y0 - 1 + 2 * G2; + // Work out the hashed gradient indices of the three simplex corners + i &= 255; + j &= 255; + var gi0 = gradP[i+perm[j]]; + var gi1 = gradP[i+i1+perm[j+j1]]; + var gi2 = gradP[i+1+perm[j+1]]; + // Calculate the contribution from the three corners + var t0 = 0.5 - x0*x0-y0*y0; + if (t0 < 0) { + n0 = 0; + } + else { + t0 *= t0; + n0 = t0 * t0 * gi0.dot2(x0, y0); // (x,y) of grad3 used for 2D gradient + } + var t1 = 0.5 - x1*x1-y1*y1; + if (t1 < 0) { + n1 = 0; + } + else { + t1 *= t1; + n1 = t1 * t1 * gi1.dot2(x1, y1); + } + var t2 = 0.5 - x2*x2-y2*y2; + if (t2 < 0) { + n2 = 0; + } + else { + t2 *= t2; + n2 = t2 * t2 * gi2.dot2(x2, y2); + } + // Add contributions from each corner to get the final noise value. + // The result is scaled to return values in the interval [-1,1]. + return 70 * (n0 + n1 + n2); + }; + + // ##### Perlin noise stuff + + function fade(t) { + return t*t*t*(t*(t*6-15)+10); } - var t1 = 0.5 - x1*x1-y1*y1; - if (t1 < 0) { - n1 = 0; - } - else { - t1 *= t1; - n1 = t1 * t1 * gi1.dot2(x1, y1); - } - var t2 = 0.5 - x2*x2-y2*y2; - if (t2 < 0) { - n2 = 0; - } - else { - t2 *= t2; - n2 = t2 * t2 * gi2.dot2(x2, y2); + + function lerp(a, b, t) { + return (1-t)*a + t*b; } - // Add contributions from each corner to get the final noise value. - // The result is scaled to return values in the interval [-1,1]. - return 70 * (n0 + n1 + n2); - }; - - // ##### Perlin noise stuff - - function fade(t) { - return t*t*t*(t*(t*6-15)+10); - } - - function lerp(a, b, t) { - return (1-t)*a + t*b; - } - - // 2D Perlin Noise - module.perlin = function(x, y) { - // Find unit grid cell containing point - var X = Math.floor(x), Y = Math.floor(y); - // Get relative xy coordinates of point within that cell - x = x - X; y = y - Y; - // Wrap the integer cells at 255 (smaller integer period can be introduced here) - X = X & 255; Y = Y & 255; - - // Calculate noise contributions from each of the four corners - var n00 = gradP[X+perm[Y]].dot2(x, y); - var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); - var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); - var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); - - // Compute the fade curve value for x - var u = fade(x); - - // Interpolate the four results - return lerp( - lerp(n00, n10, u), - lerp(n01, n11, u), - fade(y)); - }; + + // 2D Perlin Noise + module.perlin = function(x, y) { + // Find unit grid cell containing point + var X = Math.floor(x), + Y = Math.floor(y); + // Get relative xy coordinates of point within that cell + x = x - X; + y = y - Y; + // Wrap the integer cells at 255 (smaller integer period can be introduced here) + X = X & 255; + Y = Y & 255; + + // Calculate noise contributions from each of the four corners + var n00 = gradP[X+perm[Y]].dot2(x, y); + var n01 = gradP[X+perm[Y+1]].dot2(x, y-1); + var n10 = gradP[X+1+perm[Y]].dot2(x-1, y); + var n11 = gradP[X+1+perm[Y+1]].dot2(x-1, y-1); + + // Compute the fade curve value for x + var u = fade(x); + + // Interpolate the four results + return lerp( + lerp(n00, n10, u), + lerp(n01, n11, u), + fade(y) + ); + }; })(this); diff --git a/src/scatter.js b/src/scatter.js index dafe1eb..d58299b 100644 --- a/src/scatter.js +++ b/src/scatter.js @@ -87,7 +87,7 @@ THREE.Terrain.ScatterMeshes = function(geometry, options) { randomHeightmap = options.randomness(); randomness = typeof randomHeightmap === 'number' ? Math.random : function(k) { return randomHeightmap[k]; }; } - //geometry.computeFaceNormals(); + // geometry.computeFaceNormals(); for (var i = 0, w = options.w*2; i < w; i++) { for (var j = 0, h = options.h; j < h; j++) { var key = j*w + i, @@ -114,9 +114,9 @@ THREE.Terrain.ScatterMeshes = function(geometry, options) { continue; } var mesh = options.mesh.clone(); - //mesh.geometry.computeBoundingBox(); + // mesh.geometry.computeBoundingBox(); mesh.position.copy(v[f.a]).add(v[f.b]).add(v[f.c]).divideScalar(3); - //mesh.translateZ((mesh.geometry.boundingBox.max.z - mesh.geometry.boundingBox.min.z) * 0.5); + // mesh.translateZ((mesh.geometry.boundingBox.max.z - mesh.geometry.boundingBox.min.z) * 0.5); if (options.maxTilt > 0) { var normal = mesh.position.clone().add(f.normal); mesh.lookAt(normal); diff --git a/src/weightedBoxBlurGaussian.js b/src/weightedBoxBlurGaussian.js index 3046fcf..1bb6bde 100644 --- a/src/weightedBoxBlurGaussian.js +++ b/src/weightedBoxBlurGaussian.js @@ -1,3 +1,4 @@ +// jscs:disable disallowSpaceBeforeSemicolon, requireBlocksOnNewline (function() { /** diff --git a/src/worley.js b/src/worley.js index 720cb21..e580f64 100644 --- a/src/worley.js +++ b/src/worley.js @@ -9,11 +9,13 @@ return Math.abs(this.x - b.x) + Math.abs(this.y - b.y); }; THREE.Vector2.prototype.distanceToChebyshev = function(b) { - var c = Math.abs(this.x - b.x), d = Math.abs(this.y - b.y); + var c = Math.abs(this.x - b.x), + d = Math.abs(this.y - b.y); return c <= d ? d : c; }; THREE.Vector2.prototype.distanceToQuadratic = function(b) { - var c = Math.abs(this.x - b.x), d = Math.abs(this.y - b.y); + var c = Math.abs(this.x - b.x), + d = Math.abs(this.y - b.y); return c*c + c*d + d*d; }; @@ -119,13 +121,14 @@ } function putInGrid(grid, point, cellSize) { - var gx = Math.floor(point.x / cellSize), gy = Math.floor(point.y / cellSize); + var gx = Math.floor(point.x / cellSize), + gy = Math.floor(point.y / cellSize); if (!grid[gx]) grid[gx] = []; grid[gx][gy] = point; } function inRectangle(point, width, height) { - return point.x >= 0 && + return point.x >= 0 && // jscs:ignore requireSpaceAfterKeywords point.y >= 0 && point.x <= width+1 && point.y <= height+1; @@ -138,7 +141,8 @@ for (var y = gy - 1; y <= gy + 1; y++) { if (x !== gx && y !== gy && typeof grid[x] !== 'undefined' && typeof grid[x][y] !== 'undefined') { - var cx = x * cellSize, cy = y * cellSize; + var cx = x * cellSize, + cy = y * cellSize; if (Math.sqrt((point.x - cx) * (point.x - cx) + (point.y - cy) * (point.y - cy)) < minDist) { return true; }