| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 | import Color from "../Core/Color.js";import DrawCommand from "../Renderer/DrawCommand.js";import ShaderSource from "../Renderer/ShaderSource.js";import ShaderProgram from "../Renderer/ShaderProgram.js";import defined from "../Core/defined.js";/** * @private */function DebugInspector() {  this._cachedShowFrustumsShaders = {};}function getAttributeLocations(shaderProgram) {  const attributeLocations = {};  const attributes = shaderProgram.vertexAttributes;  for (const a in attributes) {    if (attributes.hasOwnProperty(a)) {      attributeLocations[a] = attributes[a].index;    }  }  return attributeLocations;}function createDebugShowFrustumsShaderProgram(scene, shaderProgram) {  const context = scene.context;  const sp = shaderProgram;  const fs = sp.fragmentShaderSource.clone();  const targets = [];  fs.sources = fs.sources.map(function (source) {    source = ShaderSource.replaceMain(source, "czm_Debug_main");    const re = /gl_FragData\[(\d+)\]/g;    let match;    while ((match = re.exec(source)) !== null) {      if (targets.indexOf(match[1]) === -1) {        targets.push(match[1]);      }    }    return source;  });  const length = targets.length;  let newMain = "";  newMain += "uniform vec3 debugShowCommandsColor;\n";  newMain += "uniform vec3 debugShowFrustumsColor;\n";  newMain += "void main() \n" + "{ \n" + "    czm_Debug_main(); \n";  // set debugShowCommandsColor to Color(1.0, 1.0, 1.0, 1.0) to stop rendering scene.debugShowCommands  // set debugShowFrustumsColor to Color(1.0, 1.0, 1.0, 1.0) to stop rendering scene.debugShowFrustums  let i;  if (length > 0) {    for (i = 0; i < length; ++i) {      newMain += `    gl_FragData[${targets[i]}].rgb *= debugShowCommandsColor;\n`;      newMain += `    gl_FragData[${targets[i]}].rgb *= debugShowFrustumsColor;\n`;    }  } else {    newMain += "    gl_FragColor.rgb *= debugShowCommandsColor;\n";    newMain += "    gl_FragColor.rgb *= debugShowFrustumsColor;\n";  }  newMain += "}";  fs.sources.push(newMain);  const attributeLocations = getAttributeLocations(sp);  return ShaderProgram.fromCache({    context: context,    vertexShaderSource: sp.vertexShaderSource,    fragmentShaderSource: fs,    attributeLocations: attributeLocations,  });}const scratchFrustumColor = new Color();function createDebugShowFrustumsUniformMap(scene, command) {  // setup uniform for the shader  let debugUniformMap;  if (!defined(command.uniformMap)) {    debugUniformMap = {};  } else {    debugUniformMap = command.uniformMap;  }  if (    defined(debugUniformMap.debugShowCommandsColor) ||    defined(debugUniformMap.debugShowFrustumsColor)  ) {    return debugUniformMap;  }  debugUniformMap.debugShowCommandsColor = function () {    if (!scene.debugShowCommands) {      return Color.WHITE;    }    if (!defined(command._debugColor)) {      command._debugColor = Color.fromRandom();    }    return command._debugColor;  };  debugUniformMap.debugShowFrustumsColor = function () {    if (!scene.debugShowFrustums) {      return Color.WHITE;    }    // Support up to three frustums.  If a command overlaps all    // three, it's code is not changed.    scratchFrustumColor.red =      command.debugOverlappingFrustums & (1 << 0) ? 1.0 : 0.0;    scratchFrustumColor.green =      command.debugOverlappingFrustums & (1 << 1) ? 1.0 : 0.0;    scratchFrustumColor.blue =      command.debugOverlappingFrustums & (1 << 2) ? 1.0 : 0.0;    scratchFrustumColor.alpha = 1.0;    return scratchFrustumColor;  };  return debugUniformMap;}const scratchShowFrustumCommand = new DrawCommand();DebugInspector.prototype.executeDebugShowFrustumsCommand = function (  scene,  command,  passState) {  // create debug command  const shaderProgramId = command.shaderProgram.id;  let debugShaderProgram = this._cachedShowFrustumsShaders[shaderProgramId];  if (!defined(debugShaderProgram)) {    debugShaderProgram = createDebugShowFrustumsShaderProgram(      scene,      command.shaderProgram    );    this._cachedShowFrustumsShaders[shaderProgramId] = debugShaderProgram;  }  const debugCommand = DrawCommand.shallowClone(    command,    scratchShowFrustumCommand  );  debugCommand.shaderProgram = debugShaderProgram;  debugCommand.uniformMap = createDebugShowFrustumsUniformMap(scene, command);  debugCommand.execute(scene.context, passState);};export default DebugInspector;
 |