Changeset View
Standalone View
binaries/data/mods/public/maps/random/rmgen/painter/DunePainter.js
- This file was added.
/** | |||||
* @param {Boolean} type - ELEVATION_MODIFY or ELEVATION_SET. | |||||
* @param {Number} scale - Global scale of dune size. | |||||
Stan: Missing space after star | |||||
* @param {Number} scaleVertical - Vertical scale of dune size. | |||||
* @param {Number} baseHeight - Dunes base altitude if type=ELEVATION_SET. | |||||
*/ | |||||
Done Inline Actions@ both scaleVertical and baseHeight: In what unit? State that. (e.g. tiles, meters, engine space units, art length units, ...) FeXoR: @ both scaleVertical and baseHeight: In what unit? State that. (e.g. tiles, meters, engine… | |||||
Done Inline ActionsscaleVertical is a multiplier so its value is adimensional nani: `scaleVertical` is a multiplier so its value is adimensional
`baseHeight` has the same measure… | |||||
class DunePainter | |||||
{ | |||||
constructor(type = ELEVATION_MODIFY, scale = 1, scaleVertical = 1, baseHeight = 0) | |||||
{ | |||||
this.type = type; | |||||
this.scale = scale; | |||||
this.scaleVertical = scaleVertical; | |||||
this.baseHeight = baseHeight; | |||||
} | |||||
/** | |||||
* Dune shape function. | |||||
Done Inline ActionsI think we have '-' after the variable name everywhere else Missing final dot :) Stan: I think we have '-' after the variable name everywhere else
Missing final dot :) | |||||
* @param {Number} x - [0,1] value. | |||||
* @param {Number} xCrest - (0,1) position of the dune crest. | |||||
Done Inline ActionsNice you added the expected value range but a discription is missing ;) FeXoR: Nice you added the expected value range but a discription is missing ;) | |||||
* @param {Boolean} dune - True is dune, false is dome. | |||||
Done Inline ActionsMissing @return Stan: Missing @return | |||||
* @returns {Number} Height of dune at point x | |||||
*/ | |||||
dune(x, xCrest = 0.75, dune = true) | |||||
{ | |||||
return x < xCrest ? (1 - Math.cos(Math.PI * x / xCrest)) * 0.5 : | |||||
Done Inline ActionsAny way to optimise this? Stan: Any way to optimise this? | |||||
Done Inline Actionsno nani: no | |||||
dune ? (1 - Math.cos(Math.PI * (x - 1) / (xCrest - 1))) * 0.5 : | |||||
1 - Math.cos(Math.PI * (x - 1) / (xCrest - 1) * 0.5); | |||||
} | |||||
paint(area) | |||||
Done Inline ActionsJsdoc? Stan: Jsdoc? | |||||
Done Inline Actionspart of rmgen internals, no need nani: part of rmgen internals, no need | |||||
{ | |||||
let points = area.getPoints(); | |||||
// 1st dune layer. | |||||
let height1_1 = PerlinNoise(points, 6, 2, 1, 1.1, true); | |||||
let height1_2 = PerlinNoise(points, 3, 2, 1, 1, true); | |||||
// Make big dunes 17 times wider than taller. | |||||
Done Inline ActionsTypo. Stan: Typo. | |||||
let width1 = 17.0 * this.scale; | |||||
// 2nd dune layer. | |||||
Done Inline ActionsAny reason for this magic number ? Stan: Any reason for this magic number ? | |||||
let height2_1 = PerlinNoise(points, 8, 1, 2, 2, true); | |||||
let height2_2 = PerlinNoise(points, 4, 2, 2, 2, true); | |||||
// Make smaller dunes 14 times wider than taller. | |||||
Done Inline Actions"wider than tall" once more. FeXoR: "wider than tall" once more. | |||||
let width2 = 14.0 * this.scale; | |||||
for (let i = 0; i < points.length; ++i) | |||||
Done Inline ActionsLoop over all the points. Not sure if comment is useful Stan: Loop over all the points. Not sure if comment is useful | |||||
{ | |||||
Done Inline Actions++i Stan: ++i | |||||
let x1 = ((points[i].x + height1_1[i] * 13 + points[i].y * 0.1) % width1) / width1; | |||||
// Main dunes creation height. | |||||
let height1 = this.dune(x1, 0.60, false) * 9 * 0.9 + height1_1[i] * height1_2[i] * 150 * 0.1; | |||||
let x2 = ((points[i].x + height2_1[i] * 13 + points[i].y * 0.1) % width2) / width2; | |||||
// Secondary dunes height. | |||||
let height2 = this.dune(x2, 0.60, false) * 9 * 0.9 + height2_2[i] * 50 * 0.1; | |||||
Done Inline ActionsBetter name ? Stan: Better name ? | |||||
Done Inline ActionsThose are magic (optimized by fiddling around and testing aiming for the result you find most appealing I guess - that's OK of cause!) numbers anyway so would'nt it be appropriate to use 8.1 instead of 9*0.9 and 5 instead of 50*0.1? If this multiplication really helps wrapping your head around what's going on leave them as they are I guess. FeXoR: Those are magic (optimized by fiddling around and testing aiming for the result you find most… | |||||
Done Inline Actions0.9 and 0.1 are weights but yes, I prefer to leave the expression expanded for easy modification. nani: 0.9 and 0.1 are weights but yes, I prefer to leave the expression expanded for easy… | |||||
let height = (height1 * 0.8 + height2 * 0.2) * this.scaleVertical * this.scale; | |||||
// Add or set height. | |||||
let base = this.type ? g_Map.getHeight(points[i]) : baseHeight; | |||||
g_Map.setHeight(points[i], base + height); | |||||
Done Inline ActionsTernary? Stan: Ternary? | |||||
Done Inline ActionsHuh? When does the case "not this.type" happen??? FeXoR: Huh? When does the case "not this.type" happen??? | |||||
Done Inline Actionsthis.type can be ELEVATION_SET = 1 or ELEVATION_MODIFY = 0 nani: this.type can be ELEVATION_SET = 1 or ELEVATION_MODIFY = 0 | |||||
} | |||||
} | |||||
} |
Missing space after star