56 lines
1.4 KiB
JavaScript
56 lines
1.4 KiB
JavaScript
/**
|
|
* A utility for dynamically-generating a GLSL struct.
|
|
*
|
|
* @alias ShaderStruct
|
|
* @constructor
|
|
*
|
|
* @see {@link ShaderBuilder}
|
|
* @param {string} name The name of the struct as it will appear in the shader.
|
|
* @example
|
|
* // Generate the struct:
|
|
* //
|
|
* // struct Attributes
|
|
* // {
|
|
* // vec3 position;
|
|
* // vec3 normal;
|
|
* // vec2 texCoord;
|
|
* // };
|
|
* const struct = new ShaderStruct("Attributes");
|
|
* struct.addField("vec3", "position");
|
|
* struct.addField("vec3", "normal");
|
|
* struct.addField("vec2", "texCoord");
|
|
* const generatedLines = struct.generateGlslLines();
|
|
*
|
|
* @private
|
|
*/
|
|
function ShaderStruct(name) {
|
|
this.name = name;
|
|
this.fields = [];
|
|
}
|
|
|
|
/**
|
|
* Add a field to the struct
|
|
* @param {string} type The type of the struct field
|
|
* @param {string} identifier The identifier of the struct field
|
|
*/
|
|
ShaderStruct.prototype.addField = function (type, identifier) {
|
|
const field = ` ${type} ${identifier};`;
|
|
this.fields.push(field);
|
|
};
|
|
|
|
/**
|
|
* Generate a list of lines of GLSL code for use with {@link ShaderBuilder}
|
|
* @return {string[]} The generated GLSL code.
|
|
*/
|
|
ShaderStruct.prototype.generateGlslLines = function () {
|
|
let fields = this.fields;
|
|
if (fields.length === 0) {
|
|
// GLSL requires structs to have at least one field
|
|
fields = [" float _empty;"];
|
|
}
|
|
|
|
return [].concat(`struct ${this.name}`, "{", fields, "};");
|
|
};
|
|
|
|
export default ShaderStruct;
|