| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 | import Color from "../Core/Color.js";import defined from "../Core/defined.js";import destroyObject from "../Core/destroyObject.js";import PixelFormat from "../Core/PixelFormat.js";import ClearCommand from "../Renderer/ClearCommand.js";import FramebufferManager from "../Renderer/FramebufferManager.js";import PixelDatatype from "../Renderer/PixelDatatype.js";import Renderbuffer from "../Renderer/Renderbuffer.js";import RenderbufferFormat from "../Renderer/RenderbufferFormat.js";import RenderState from "../Renderer/RenderState.js";import ShaderSource from "../Renderer/ShaderSource.js";import Texture from "../Renderer/Texture.js";import PassThrough from "../Shaders/PostProcessStages/PassThrough.js";import BlendingState from "./BlendingState.js";import StencilConstants from "./StencilConstants.js";import StencilFunction from "./StencilFunction.js";import StencilOperation from "./StencilOperation.js";/** * @private */function InvertClassification() {  this._numSamples = 1;  this.previousFramebuffer = undefined;  this._previousFramebuffer = undefined;  this._depthStencilTexture = undefined;  this._depthStencilRenderbuffer = undefined;  this._fbo = new FramebufferManager({    depthStencil: true,    createDepthAttachments: false,  });  this._fboClassified = new FramebufferManager({    depthStencil: true,    createDepthAttachments: false,  });  this._rsUnclassified = undefined;  this._rsClassified = undefined;  this._unclassifiedCommand = undefined;  this._classifiedCommand = undefined;  this._translucentCommand = undefined;  this._clearColorCommand = new ClearCommand({    color: new Color(0.0, 0.0, 0.0, 0.0),    owner: this,  });  this._clearCommand = new ClearCommand({    color: new Color(0.0, 0.0, 0.0, 0.0),    depth: 1.0,    stencil: 0,  });  const that = this;  this._uniformMap = {    colorTexture: function () {      return that._fbo.getColorTexture();    },    depthTexture: function () {      return that._depthStencilTexture;    },    classifiedTexture: function () {      return that._fboClassified.getColorTexture();    },  };}Object.defineProperties(InvertClassification.prototype, {  unclassifiedCommand: {    get: function () {      return this._unclassifiedCommand;    },  },});InvertClassification.isTranslucencySupported = function (context) {  return context.depthTexture && context.fragmentDepth;};const rsUnclassified = {  depthMask: false,  stencilTest: {    enabled: true,    frontFunction: StencilFunction.EQUAL,    frontOperation: {      fail: StencilOperation.KEEP,      zFail: StencilOperation.KEEP,      zPass: StencilOperation.KEEP,    },    backFunction: StencilFunction.NEVER,    reference: 0,    mask: StencilConstants.CLASSIFICATION_MASK,  },  blending: BlendingState.ALPHA_BLEND,};const rsClassified = {  depthMask: false,  stencilTest: {    enabled: true,    frontFunction: StencilFunction.NOT_EQUAL,    frontOperation: {      fail: StencilOperation.KEEP,      zFail: StencilOperation.KEEP,      zPass: StencilOperation.KEEP,    },    backFunction: StencilFunction.NEVER,    reference: 0,    mask: StencilConstants.CLASSIFICATION_MASK,  },  blending: BlendingState.ALPHA_BLEND,};// Set the 3D Tiles bit when rendering back into the scene's framebuffer. This is only needed if// invert classification does not use the scene's depth-stencil texture, which is the case if the invert// classification color is translucent.const rsDefault = {  depthMask: true,  depthTest: {    enabled: true,  },  stencilTest: StencilConstants.setCesium3DTileBit(),  stencilMask: StencilConstants.CESIUM_3D_TILE_MASK,  blending: BlendingState.ALPHA_BLEND,};const translucentFS =  "#extension GL_EXT_frag_depth : enable\n" +  "uniform sampler2D colorTexture;\n" +  "uniform sampler2D depthTexture;\n" +  "uniform sampler2D classifiedTexture;\n" +  "varying vec2 v_textureCoordinates;\n" +  "void main()\n" +  "{\n" +  "    vec4 color = texture2D(colorTexture, v_textureCoordinates);\n" +  "    if (color.a == 0.0)\n" +  "    {\n" +  "        discard;\n" +  "    }\n" +  "    bool isClassified = all(equal(texture2D(classifiedTexture, v_textureCoordinates), vec4(0.0)));\n" +  "#ifdef UNCLASSIFIED\n" +  "    vec4 highlightColor = czm_invertClassificationColor;\n" +  "    if (isClassified)\n" +  "    {\n" +  "        discard;\n" +  "    }\n" +  "#else\n" +  "    vec4 highlightColor = vec4(1.0);\n" +  "    if (!isClassified)\n" +  "    {\n" +  "        discard;\n" +  "    }\n" +  "#endif\n" +  "    gl_FragColor = color * highlightColor;\n" +  "    gl_FragDepthEXT = texture2D(depthTexture, v_textureCoordinates).r;\n" +  "}\n";const opaqueFS =  "uniform sampler2D colorTexture;\n" +  "varying vec2 v_textureCoordinates;\n" +  "void main()\n" +  "{\n" +  "    vec4 color = texture2D(colorTexture, v_textureCoordinates);\n" +  "    if (color.a == 0.0)\n" +  "    {\n" +  "        discard;\n" +  "    }\n" +  "#ifdef UNCLASSIFIED\n" +  "    gl_FragColor = color * czm_invertClassificationColor;\n" +  "#else\n" +  "    gl_FragColor = color;\n" +  "#endif\n" +  "}\n";InvertClassification.prototype.update = function (  context,  numSamples,  globeFramebuffer) {  const texture = this._fbo.getColorTexture();  const previousFramebufferChanged =    this.previousFramebuffer !== this._previousFramebuffer;  this._previousFramebuffer = this.previousFramebuffer;  const samplesChanged = this._numSamples !== numSamples;  const width = context.drawingBufferWidth;  const height = context.drawingBufferHeight;  const textureChanged =    !defined(texture) || texture.width !== width || texture.height !== height;  if (textureChanged || previousFramebufferChanged || samplesChanged) {    this._numSamples = numSamples;    this._depthStencilTexture =      this._depthStencilTexture && this._depthStencilTexture.destroy();    this._depthStencilRenderbuffer =      this._depthStencilRenderbuffer &&      this._depthStencilRenderbuffer.destroy();    if (!defined(this._previousFramebuffer)) {      this._depthStencilTexture = new Texture({        context: context,        width: width,        height: height,        pixelFormat: PixelFormat.DEPTH_STENCIL,        pixelDatatype: PixelDatatype.UNSIGNED_INT_24_8,      });      if (numSamples > 1) {        this._depthStencilRenderbuffer = new Renderbuffer({          context: context,          width: width,          height: height,          format: RenderbufferFormat.DEPTH24_STENCIL8,          numSamples: numSamples,        });      }    }  }  if (    !defined(this._fbo.framebuffer) ||    textureChanged ||    previousFramebufferChanged ||    samplesChanged  ) {    this._fbo.destroy();    this._fboClassified.destroy();    let depthStencilTexture;    let depthStencilRenderbuffer;    if (defined(this._previousFramebuffer)) {      depthStencilTexture = globeFramebuffer.getDepthStencilTexture();      depthStencilRenderbuffer = globeFramebuffer.getDepthStencilRenderbuffer();    } else {      depthStencilTexture = this._depthStencilTexture;      depthStencilRenderbuffer = this._depthStencilRenderbuffer;    }    this._fbo.setDepthStencilTexture(depthStencilTexture);    if (defined(depthStencilRenderbuffer)) {      this._fbo.setDepthStencilRenderbuffer(depthStencilRenderbuffer);    }    this._fbo.update(context, width, height, numSamples);    if (!defined(this._previousFramebuffer)) {      this._fboClassified.setDepthStencilTexture(depthStencilTexture);      this._fboClassified.update(context, width, height);    }  }  if (!defined(this._rsUnclassified)) {    this._rsUnclassified = RenderState.fromCache(rsUnclassified);    this._rsClassified = RenderState.fromCache(rsClassified);    this._rsDefault = RenderState.fromCache(rsDefault);  }  if (    !defined(this._unclassifiedCommand) ||    previousFramebufferChanged ||    samplesChanged  ) {    if (defined(this._unclassifiedCommand)) {      this._unclassifiedCommand.shaderProgram =        this._unclassifiedCommand.shaderProgram &&        this._unclassifiedCommand.shaderProgram.destroy();      this._classifiedCommand.shaderProgram =        this._classifiedCommand.shaderProgram &&        this._classifiedCommand.shaderProgram.destroy();    }    const fs = defined(this._previousFramebuffer) ? opaqueFS : translucentFS;    const unclassifiedFSSource = new ShaderSource({      defines: ["UNCLASSIFIED"],      sources: [fs],    });    const classifiedFSSource = new ShaderSource({      sources: [fs],    });    this._unclassifiedCommand = context.createViewportQuadCommand(      unclassifiedFSSource,      {        renderState: defined(this._previousFramebuffer)          ? this._rsUnclassified          : this._rsDefault,        uniformMap: this._uniformMap,        owner: this,      }    );    this._classifiedCommand = context.createViewportQuadCommand(      classifiedFSSource,      {        renderState: defined(this._previousFramebuffer)          ? this._rsClassified          : this._rsDefault,        uniformMap: this._uniformMap,        owner: this,      }    );    if (defined(this._translucentCommand)) {      this._translucentCommand.shaderProgram =        this._translucentCommand.shaderProgram &&        this._translucentCommand.shaderProgram.destroy();    }    if (!defined(this._previousFramebuffer)) {      this._translucentCommand = context.createViewportQuadCommand(        PassThrough,        {          renderState: this._rsUnclassified,          uniformMap: this._uniformMap,          owner: this,        }      );    }  }};InvertClassification.prototype.prepareTextures = function (  context,  blitStencil) {  if (this._fbo._numSamples > 1) {    this._fbo.prepareTextures(context, blitStencil);  }};InvertClassification.prototype.clear = function (context, passState) {  if (defined(this._previousFramebuffer)) {    this._fbo.clear(context, this._clearColorCommand, passState);  } else {    this._fbo.clear(context, this._clearCommand, passState);    this._fboClassified.clear(context, this._clearCommand, passState);  }};InvertClassification.prototype.executeClassified = function (  context,  passState) {  if (!defined(this._previousFramebuffer)) {    const framebuffer = passState.framebuffer;    this.prepareTextures(context, true);    passState.framebuffer = this._fboClassified.framebuffer;    this._translucentCommand.execute(context, passState);    passState.framebuffer = framebuffer;  }  this._classifiedCommand.execute(context, passState);};InvertClassification.prototype.executeUnclassified = function (  context,  passState) {  this._unclassifiedCommand.execute(context, passState);};InvertClassification.prototype.isDestroyed = function () {  return false;};InvertClassification.prototype.destroy = function () {  this._fbo.destroy();  this._fboClassified.destroy();  this._depthStencilTexture =    this._depthStencilTexture && this._depthStencilTexture.destroy();  this._depthStencilRenderbuffer =    this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy();  if (defined(this._unclassifiedCommand)) {    this._unclassifiedCommand.shaderProgram =      this._unclassifiedCommand.shaderProgram &&      this._unclassifiedCommand.shaderProgram.destroy();    this._classifiedCommand.shaderProgram =      this._classifiedCommand.shaderProgram &&      this._classifiedCommand.shaderProgram.destroy();  }  return destroyObject(this);};export default InvertClassification;
 |