UNPKG

itowns

Version:

A JS/WebGL framework for 3D geospatial data visualization

55 lines (45 loc) 2.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var rePosition = new RegExp('gl_Position.*(?![^]*gl_Position)'); var reMain = new RegExp('[^\\w]*main[^\\w]*(void)?[^\\w]*{'); var _default = { patchMaterialForLogDepthSupport: function patchMaterialForLogDepthSupport(material) { // Check if the shader does not already use the log depth buffer if (material.vertexShader.includes('USE_LOGDEPTHBUF') || material.vertexShader.includes('logdepthbuf_pars_vertex')) { return; } // Add vertex shader log depth buffer header material.vertexShader = "#include <logdepthbuf_pars_vertex>\n#define EPSILON 1e-6\n".concat(material.vertexShader); // Add log depth buffer code snippet after last gl_Position modification var re = rePosition.exec(material.vertexShader); var idx = re[0].length + re.index; material.vertexShader = "".concat(material.vertexShader.slice(0, idx), "\n#include <logdepthbuf_vertex>\n").concat(material.vertexShader.slice(idx)); // Add fragment shader log depth buffer header material.fragmentShader = "#include <itowns/precision_qualifier\n".concat(material.fragmentShader); material.fragmentShader = "#include <logdepthbuf_pars_fragment>\n".concat(material.fragmentShader); // Add log depth buffer code snippet at the first line of the main function re = reMain.exec(material.fragmentShader); idx = re[0].length + re.index; material.fragmentShader = "".concat(material.fragmentShader.slice(0, idx), "\n#include <logdepthbuf_fragment>\n").concat(material.fragmentShader.slice(idx)); material.defines = { USE_LOGDEPTHBUF: 1, USE_LOGDEPTHBUF_EXT: 1 }; }, // adapted from unrollLoops in WebGLProgram unrollLoops: function unrollLoops(string, defines) { // look for a for loop with an unroll_loop pragma // The detection of the scope of the for loop is hacky as it does not support nested scopes var pattern = /#pragma unroll_loop\s+for\s*\(\s*int\s+i\s*=\s*([\w\d]+);\s*i\s+<\s+([\w\d]+);\s*i\s*\+\+\s*\)\s*\{\n([^}]*)\}/g; function replace(match, start, end, snippet) { var unroll = ''; start = start in defines ? defines[start] : parseInt(start, 10); end = end in defines ? defines[end] : parseInt(end, 10); for (var i = start; i < end; i++) { unroll += snippet.replace(/\bi\b/g, " ".concat(i, " ")); } return unroll; } return string.replace(pattern, replace); } }; exports["default"] = _default;