import Vector3 from './Vector3';
import Vector2 from './Vector2';
/**
* Random or constant 1d, 2d, 3d vector generator
* @constructor
* @alias clay.Value
*/
var Value = function() {};
/**
* @function
* @param {number|clay.Vector2|clay.Vector3} [out]
* @return {number|clay.Vector2|clay.Vector3}
*/
Value.prototype.get = function(out) {};
// Constant
var ConstantValue = function(val) {
this.get = function() {
return val;
};
};
ConstantValue.prototype = new Value();
ConstantValue.prototype.constructor = ConstantValue;
// Vector
var VectorValue = function(val) {
var Constructor = val.constructor;
this.get = function(out) {
if (!out) {
out = new Constructor();
}
out.copy(val);
return out;
};
};
VectorValue.prototype = new Value();
VectorValue.prototype.constructor = VectorValue;
//Random 1D
var Random1D = function(min, max) {
var range = max - min;
this.get = function() {
return Math.random() * range + min;
};
};
Random1D.prototype = new Value();
Random1D.prototype.constructor = Random1D;
// Random2D
var Random2D = function(min, max) {
var rangeX = max.x - min.x;
var rangeY = max.y - min.y;
this.get = function(out) {
if (!out) {
out = new Vector2();
}
Vector2.set(
out,
rangeX * Math.random() + min.array[0],
rangeY * Math.random() + min.array[1]
);
return out;
};
};
Random2D.prototype = new Value();
Random2D.prototype.constructor = Random2D;
var Random3D = function(min, max) {
var rangeX = max.x - min.x;
var rangeY = max.y - min.y;
var rangeZ = max.z - min.z;
this.get = function(out) {
if (!out) {
out = new Vector3();
}
Vector3.set(
out,
rangeX * Math.random() + min.array[0],
rangeY * Math.random() + min.array[1],
rangeZ * Math.random() + min.array[2]
);
return out;
};
};
Random3D.prototype = new Value();
Random3D.prototype.constructor = Random3D;
// Factory methods
/**
* Create a constant 1d value generator
* @param {number} constant
* @return {clay.Value}
*/
Value.constant = function(constant) {
return new ConstantValue(constant);
};
/**
* Create a constant vector value(2d or 3d) generator
* @param {clay.Vector2|clay.Vector3} vector
* @return {clay.Value}
*/
Value.vector = function(vector) {
return new VectorValue(vector);
};
/**
* Create a random 1d value generator
* @param {number} min
* @param {number} max
* @return {clay.Value}
*/
Value.random1D = function(min, max) {
return new Random1D(min, max);
};
/**
* Create a random 2d value generator
* @param {clay.Vector2} min
* @param {clay.Vector2} max
* @return {clay.Value}
*/
Value.random2D = function(min, max) {
return new Random2D(min, max);
};
/**
* Create a random 3d value generator
* @param {clay.Vector3} min
* @param {clay.Vector3} max
* @return {clay.Value}
*/
Value.random3D = function(min, max) {
return new Random3D(min, max);
};
export default Value;