UNPKG

gl-react

Version:

Universal React library, write and compose WebGL shaders, implement complex effects using a descriptive paradigm

161 lines (134 loc) 4.29 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; exports.ensureShaderDefinition = ensureShaderDefinition; exports.isShaderIdentifier = isShaderIdentifier; exports.shaderDefinitionToShaderInfo = shaderDefinitionToShaderInfo; exports.shaderInfoEquals = shaderInfoEquals; var _invariant = _interopRequireDefault(require("invariant")); var _GLSL = _interopRequireDefault(require("./GLSL")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const ShaderID = "ShaderID"; /** * An object that contains a `frag` GLSLCode. * @example * { * frag: GLSL`...` * } */ const shaderDefinitions = {}; const shaderNames = {}; const shaderResults = {}; const genShaderId = (i => () => (++i).toString())(0); const staticVerts = { "100": (0, _GLSL.default)` attribute vec2 _p; varying vec2 uv; void main() { gl_Position = vec4(_p,0.0,1.0); uv = vec2(0.5, 0.5) * (_p+vec2(1.0, 1.0)); }`, "300 es": (0, _GLSL.default)`#version 300 es in vec2 _p; out vec2 uv; void main() { gl_Position = vec4(_p,0.0,1.0); uv = vec2(0.5, 0.5) * (_p+vec2(1.0, 1.0)); }` }; function isShaderIdentifier(shaderIdentifier) { return typeof shaderIdentifier === "object" && !!shaderIdentifier && shaderIdentifier.type === ShaderID && typeof shaderIdentifier.id === "string"; } function ensureShaderDefinition(definition, ctx = "") { (0, _invariant.default)(definition && typeof definition.frag === "string", "A `frag` GLSL code (string) is required" + ctx); return definition; } const versionDef = "#version"; function inferGLSLVersion(glsl) { const i = glsl.indexOf("\n"); const line1 = i > -1 ? glsl.slice(0, i) : glsl; if (line1.startsWith(versionDef)) { return line1.slice(versionDef.length + 1); } return "100"; } const addGLSLName = (glsl, name) => !name ? glsl : glsl + "\n#define SHADER_NAME " + name + "\n"; function shaderDefinitionToShaderInfo({ frag, vert }, name) { frag = frag.trim(); const version = inferGLSLVersion(frag); if (vert) { vert = vert.trim(); const vertVersion = inferGLSLVersion(vert); if (version !== vertVersion) { throw new Error("GLSL shader vert and frag version must match"); } } else { vert = staticVerts[version]; if (!vert) { throw new Error("gl-react: could not find static vertex shader for GLSL version '" + version + "'"); } } frag = addGLSLName(frag, name); vert = addGLSLName(vert, name); return { frag, vert }; } function shaderInfoEquals(s1, s2) { return s1.frag === s2.frag && s1.vert === s2.vert; } /** * Define shaders statically. * @namespace */ const Shaders = global.__glReactShaders = global.__glReactShaders || { /** * @memberof Shaders * @param {ShadersDefinition} shadersDef - an object that statically define all shaders. * @returns {ShadersSheet}, an object map that returns a ShaderIdentifier for each shader key defined in the shaders definition. * @example * const shaders = Shaders.create({ * helloGL: { * frag: GLSL`...` * } * }); * ... * <Node shader={shaders.helloGL} /> */ create(shadersDef) { const sheet = {}; Object.keys(shadersDef).forEach(k => { const definition = ensureShaderDefinition(shadersDef[k], " in Shaders.create({ " + k + ": ... })"); const id = genShaderId(); const shaderId = Object.freeze({ type: ShaderID, id }); shaderDefinitions[id] = definition; shaderNames[id] = k; sheet[k] = shaderId; const result = shaderDefinitionToShaderInfo(definition, k); shaderResults[id] = result; }); return sheet; }, getName(shaderIdentifier) { return (shaderNames[shaderIdentifier.id] || "???") + `#${String(shaderIdentifier.id)}`; }, getShortName(shaderIdentifier) { return shaderNames[shaderIdentifier.id] || "???"; }, get(shaderIdentifier) { (0, _invariant.default)(shaderIdentifier.id in shaderDefinitions, "Shader %s does not exist. Make sure you don't have gl-react dup issue: `npm ls gl-react`", shaderIdentifier.id); return shaderResults[shaderIdentifier.id]; } }; var _default = Shaders; exports.default = _default; //# sourceMappingURL=Shaders.js.map