import { Color } from '../../math/Color.js';
import { Matrix2 } from '../../math/Matrix2.js';
import { Matrix3 } from '../../math/Matrix3.js';
import { Matrix4 } from '../../math/Matrix4.js';
import { Vector2 } from '../../math/Vector2.js';
import { Vector3 } from '../../math/Vector3.js';
import { Vector4 } from '../../math/Vector4.js';
/**
* Abstract base class for uniforms.
*
* @abstract
* @private
*/
class Uniform {
/**
* Constructs a new uniform.
*
* @param {String} name - The uniform's name.
* @param {Any} value - The uniform's value.
*/
constructor( name, value ) {
/**
* The uniform's name.
*
* @type {String}
*/
this.name = name;
/**
* The uniform's value.
*
* @type {Any}
*/
this.value = value;
/**
* Used to build the uniform buffer according to the STD140 layout.
* Derived uniforms will set this property to a data type specific
* value.
*
* @type {Number}
*/
this.boundary = 0;
/**
* The item size. Derived uniforms will set this property to a data
* type specific value.
*
* @type {Number}
*/
this.itemSize = 0;
/**
* This property is set by {@link UniformsGroup} and marks
* the start position in the uniform buffer.
*
* @type {Number}
*/
this.offset = 0;
}
/**
* Sets the uniform's value.
*
* @param {Any} value - The value to set.
*/
setValue( value ) {
this.value = value;
}
/**
* Returns the uniform's value.
*
* @return {Any} The value.
*/
getValue() {
return this.value;
}
}
/**
* Represents a Number uniform.
*
* @private
* @augments Uniform
*/
class NumberUniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Number} value - The uniform's value.
*/
constructor( name, value = 0 ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isNumberUniform = true;
this.boundary = 4;
this.itemSize = 1;
}
}
/**
* Represents a Vector2 uniform.
*
* @private
* @augments Uniform
*/
class Vector2Uniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Vector2} value - The uniform's value.
*/
constructor( name, value = new Vector2() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isVector2Uniform = true;
this.boundary = 8;
this.itemSize = 2;
}
}
/**
* Represents a Vector3 uniform.
*
* @private
* @augments Uniform
*/
class Vector3Uniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Vector3} value - The uniform's value.
*/
constructor( name, value = new Vector3() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isVector3Uniform = true;
this.boundary = 16;
this.itemSize = 3;
}
}
/**
* Represents a Vector4 uniform.
*
* @private
* @augments Uniform
*/
class Vector4Uniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Vector4} value - The uniform's value.
*/
constructor( name, value = new Vector4() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isVector4Uniform = true;
this.boundary = 16;
this.itemSize = 4;
}
}
/**
* Represents a Color uniform.
*
* @private
* @augments Uniform
*/
class ColorUniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Color} value - The uniform's value.
*/
constructor( name, value = new Color() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isColorUniform = true;
this.boundary = 16;
this.itemSize = 3;
}
}
/**
* Represents a Matrix2 uniform.
*
* @private
* @augments Uniform
*/
class Matrix2Uniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Matrix2} value - The uniform's value.
*/
constructor( name, value = new Matrix2() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isMatrix2Uniform = true;
this.boundary = 16;
this.itemSize = 4;
}
}
/**
* Represents a Matrix3 uniform.
*
* @private
* @augments Uniform
*/
class Matrix3Uniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Matrix3} value - The uniform's value.
*/
constructor( name, value = new Matrix3() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isMatrix3Uniform = true;
this.boundary = 48;
this.itemSize = 12;
}
}
/**
* Represents a Matrix4 uniform.
*
* @private
* @augments Uniform
*/
class Matrix4Uniform extends Uniform {
/**
* Constructs a new Number uniform.
*
* @param {String} name - The uniform's name.
* @param {Matrix4} value - The uniform's value.
*/
constructor( name, value = new Matrix4() ) {
super( name, value );
/**
* This flag can be used for type testing.
*
* @type {Boolean}
* @readonly
* @default true
*/
this.isMatrix4Uniform = true;
this.boundary = 64;
this.itemSize = 16;
}
}
export {
NumberUniform,
Vector2Uniform, Vector3Uniform, Vector4Uniform, ColorUniform,
Matrix2Uniform, Matrix3Uniform, Matrix4Uniform
};