gpu.js/src/plugins/math-random-uniformly-distributed.js
Robert Plummer ed1cd94448 feat: Added features and fixes for the following issues:
...it kind of snowballed from some needs
Fixes #521 - If `tactic` is not set, check precision allowed from WebGL, and automatically change based off needs, otherwise use value from `tactic`.
Fixes #535 - Internally check if texture from argument is the same as output, if so, clone this texture, and then clean it up after the kernel runs.
Fixes #536 - Normalize all declarations to non-destructured, and then parse
Fixes #537 - Change logic
Fixes #538 - Found the GL script that would work, and reduced the methods to use it
Fixes #539 - Found a better way of testing random, and this gives me an error for 1 in 10 runs, acceptable

Some refactoring for less duplicate code and documentation
2019-11-26 10:55:28 -05:00

50 lines
1.1 KiB
JavaScript

// language=GLSL
const source = `// https://www.shadertoy.com/view/4t2SDh
//note: uniformly distributed, normalized rand, [0,1]
highp float randomSeedShift = 1.0;
highp float slide = 1.0;
uniform highp float randomSeed1;
uniform highp float randomSeed2;
highp float nrand(highp vec2 n) {
highp float result = fract(sin(dot((n.xy + 1.0) * vec2(randomSeed1 * slide, randomSeed2 * randomSeedShift), vec2(12.9898, 78.233))) * 43758.5453);
randomSeedShift = result;
if (randomSeedShift > 0.5) {
slide += 0.00009;
} else {
slide += 0.0009;
}
return result;
}`;
const name = 'math-random-uniformly-distributed';
// language=JavaScript
const functionMatch = `Math.random()`;
const functionReplace = `nrand(vTexCoord)`;
const functionReturnType = 'Number';
/**
*
* @param {Kernel} kernel
*/
const onBeforeRun = (kernel) => {
kernel.setUniform1f('randomSeed1', Math.random());
kernel.setUniform1f('randomSeed2', Math.random());
};
/**
*
* @type IPlugin
*/
const plugin = {
name,
onBeforeRun,
functionMatch,
functionReplace,
functionReturnType,
source
};
module.exports = plugin;