| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 | import BoundingRectangle from "../Core/BoundingRectangle.js";import Color from "../Core/Color.js";import defined from "../Core/defined.js";import destroyObject from "../Core/destroyObject.js";import ClearCommand from "../Renderer/ClearCommand.js";import FramebufferManager from "../Renderer/FramebufferManager.js";import PixelDatatype from "../Renderer/PixelDatatype.js";import RenderState from "../Renderer/RenderState.js";import PassThrough from "../Shaders/PostProcessStages/PassThrough.js";import PassThroughDepth from "../Shaders/PostProcessStages/PassThroughDepth.js";import BlendingState from "./BlendingState.js";import StencilConstants from "./StencilConstants.js";import StencilFunction from "./StencilFunction.js";import StencilOperation from "./StencilOperation.js";/** * @private */function GlobeDepth() {  this._picking = false;  this._numSamples = 1;  this._tempCopyDepthTexture = undefined;  this._pickColorFramebuffer = new FramebufferManager({    depthStencil: true,    supportsDepthTexture: true,  });  this._outputFramebuffer = new FramebufferManager({    depthStencil: true,    supportsDepthTexture: true,  });  this._copyDepthFramebuffer = new FramebufferManager();  this._tempCopyDepthFramebuffer = new FramebufferManager();  this._updateDepthFramebuffer = new FramebufferManager({    createColorAttachments: false,    createDepthAttachments: false,    depthStencil: true,  });  this._clearGlobeColorCommand = undefined;  this._copyColorCommand = undefined;  this._copyDepthCommand = undefined;  this._tempCopyDepthCommand = undefined;  this._updateDepthCommand = undefined;  this._viewport = new BoundingRectangle();  this._rs = undefined;  this._rsBlend = undefined;  this._rsUpdate = undefined;  this._useScissorTest = false;  this._scissorRectangle = undefined;  this._useHdr = undefined;  this._clearGlobeDepth = undefined;}Object.defineProperties(GlobeDepth.prototype, {  colorFramebufferManager: {    get: function () {      return this._picking        ? this._pickColorFramebuffer        : this._outputFramebuffer;    },  },  framebuffer: {    get: function () {      return this.colorFramebufferManager.framebuffer;    },  },  depthStencilTexture: {    get: function () {      return this.colorFramebufferManager.getDepthStencilTexture();    },  },  picking: {    get: function () {      return this._picking;    },    set: function (value) {      this._picking = value;    },  },});function destroyFramebuffers(globeDepth) {  globeDepth._pickColorFramebuffer.destroy();  globeDepth._outputFramebuffer.destroy();  globeDepth._copyDepthFramebuffer.destroy();  globeDepth._tempCopyDepthFramebuffer.destroy();  globeDepth._updateDepthFramebuffer.destroy();}function updateCopyCommands(globeDepth, context, width, height, passState) {  globeDepth._viewport.width = width;  globeDepth._viewport.height = height;  const useScissorTest = !BoundingRectangle.equals(    globeDepth._viewport,    passState.viewport  );  let updateScissor = useScissorTest !== globeDepth._useScissorTest;  globeDepth._useScissorTest = useScissorTest;  if (    !BoundingRectangle.equals(globeDepth._scissorRectangle, passState.viewport)  ) {    globeDepth._scissorRectangle = BoundingRectangle.clone(      passState.viewport,      globeDepth._scissorRectangle    );    updateScissor = true;  }  if (    !defined(globeDepth._rs) ||    !BoundingRectangle.equals(globeDepth._viewport, globeDepth._rs.viewport) ||    updateScissor  ) {    globeDepth._rs = RenderState.fromCache({      viewport: globeDepth._viewport,      scissorTest: {        enabled: globeDepth._useScissorTest,        rectangle: globeDepth._scissorRectangle,      },    });    globeDepth._rsBlend = RenderState.fromCache({      viewport: globeDepth._viewport,      scissorTest: {        enabled: globeDepth._useScissorTest,        rectangle: globeDepth._scissorRectangle,      },      blending: BlendingState.ALPHA_BLEND,    });    // Copy packed depth only if the 3D Tiles bit is set    globeDepth._rsUpdate = RenderState.fromCache({      viewport: globeDepth._viewport,      scissorTest: {        enabled: globeDepth._useScissorTest,        rectangle: globeDepth._scissorRectangle,      },      stencilTest: {        enabled: true,        frontFunction: StencilFunction.EQUAL,        frontOperation: {          fail: StencilOperation.KEEP,          zFail: StencilOperation.KEEP,          zPass: StencilOperation.KEEP,        },        backFunction: StencilFunction.NEVER,        reference: StencilConstants.CESIUM_3D_TILE_MASK,        mask: StencilConstants.CESIUM_3D_TILE_MASK,      },    });  }  if (!defined(globeDepth._copyDepthCommand)) {    globeDepth._copyDepthCommand = context.createViewportQuadCommand(      PassThroughDepth,      {        uniformMap: {          u_depthTexture: function () {            return globeDepth.colorFramebufferManager.getDepthStencilTexture();          },        },        owner: globeDepth,      }    );  }  globeDepth._copyDepthCommand.framebuffer =    globeDepth._copyDepthFramebuffer.framebuffer;  globeDepth._copyDepthCommand.renderState = globeDepth._rs;  if (!defined(globeDepth._copyColorCommand)) {    globeDepth._copyColorCommand = context.createViewportQuadCommand(      PassThrough,      {        uniformMap: {          colorTexture: function () {            return globeDepth.colorFramebufferManager.getColorTexture();          },        },        owner: globeDepth,      }    );  }  globeDepth._copyColorCommand.renderState = globeDepth._rs;  if (!defined(globeDepth._tempCopyDepthCommand)) {    globeDepth._tempCopyDepthCommand = context.createViewportQuadCommand(      PassThroughDepth,      {        uniformMap: {          u_depthTexture: function () {            return globeDepth._tempCopyDepthTexture;          },        },        owner: globeDepth,      }    );  }  globeDepth._tempCopyDepthCommand.framebuffer =    globeDepth._tempCopyDepthFramebuffer.framebuffer;  globeDepth._tempCopyDepthCommand.renderState = globeDepth._rs;  if (!defined(globeDepth._updateDepthCommand)) {    globeDepth._updateDepthCommand = context.createViewportQuadCommand(      PassThrough,      {        uniformMap: {          colorTexture: function () {            return globeDepth._tempCopyDepthFramebuffer.getColorTexture();          },        },        owner: globeDepth,      }    );  }  globeDepth._updateDepthCommand.framebuffer =    globeDepth._updateDepthFramebuffer.framebuffer;  globeDepth._updateDepthCommand.renderState = globeDepth._rsUpdate;  if (!defined(globeDepth._clearGlobeColorCommand)) {    globeDepth._clearGlobeColorCommand = new ClearCommand({      color: new Color(0.0, 0.0, 0.0, 0.0),      stencil: 0.0,      owner: globeDepth,    });  }  globeDepth._clearGlobeColorCommand.framebuffer = globeDepth.framebuffer;}GlobeDepth.prototype.update = function (  context,  passState,  viewport,  numSamples,  hdr,  clearGlobeDepth) {  const width = viewport.width;  const height = viewport.height;  const pixelDatatype = hdr    ? context.halfFloatingPointTexture      ? PixelDatatype.HALF_FLOAT      : PixelDatatype.FLOAT    : PixelDatatype.UNSIGNED_BYTE;  this._numSamples = numSamples;  if (this.picking) {    this._pickColorFramebuffer.update(context, width, height);  } else {    this._outputFramebuffer.update(      context,      width,      height,      numSamples,      pixelDatatype    );  }  this._copyDepthFramebuffer.update(context, width, height);  updateCopyCommands(this, context, width, height, passState);  context.uniformState.globeDepthTexture = undefined;  this._useHdr = hdr;  this._clearGlobeDepth = clearGlobeDepth;};GlobeDepth.prototype.prepareColorTextures = function (context, blitStencil) {  if (!this.picking && this._numSamples > 1) {    this._outputFramebuffer.prepareTextures(context, blitStencil);  }};GlobeDepth.prototype.executeCopyDepth = function (context, passState) {  if (defined(this._copyDepthCommand)) {    this.prepareColorTextures(context);    this._copyDepthCommand.execute(context, passState);    context.uniformState.globeDepthTexture = this._copyDepthFramebuffer.getColorTexture();  }};GlobeDepth.prototype.executeUpdateDepth = function (  context,  passState,  clearGlobeDepth,  depthTexture) {  const depthTextureToCopy = defined(depthTexture)    ? depthTexture    : passState.framebuffer.depthStencilTexture;  if (    clearGlobeDepth ||    depthTextureToCopy !== this.colorFramebufferManager.getDepthStencilTexture()  ) {    // First copy the depth to a temporary globe depth texture, then update the    // main globe depth texture where the stencil bit for 3D Tiles is set.    // This preserves the original globe depth except where 3D Tiles is rendered.    // The additional texture and framebuffer resources are created on demand.    if (defined(this._updateDepthCommand)) {      if (        !defined(this._updateDepthFramebuffer.framebuffer) ||        this._updateDepthFramebuffer.getDepthStencilTexture() !==          depthTextureToCopy ||        this._updateDepthFramebuffer.getColorTexture() !==          this._copyDepthFramebuffer.getColorTexture()      ) {        const width = this._copyDepthFramebuffer.getColorTexture().width;        const height = this._copyDepthFramebuffer.getColorTexture().height;        this._tempCopyDepthFramebuffer.destroy();        this._tempCopyDepthFramebuffer.update(context, width, height);        const colorTexture = this._copyDepthFramebuffer.getColorTexture();        this._updateDepthFramebuffer.setColorTexture(colorTexture, 0);        this._updateDepthFramebuffer.setDepthStencilTexture(depthTextureToCopy);        this._updateDepthFramebuffer.update(context, width, height);        updateCopyCommands(this, context, width, height, passState);      }      this._tempCopyDepthTexture = depthTextureToCopy;      this._tempCopyDepthCommand.execute(context, passState);      this._updateDepthCommand.execute(context, passState);    }    return;  }  // Fast path - the depth texture can be copied normally.  if (defined(this._copyDepthCommand)) {    this._copyDepthCommand.execute(context, passState);  }};GlobeDepth.prototype.executeCopyColor = function (context, passState) {  if (defined(this._copyColorCommand)) {    this._copyColorCommand.execute(context, passState);  }};GlobeDepth.prototype.clear = function (context, passState, clearColor) {  const clear = this._clearGlobeColorCommand;  if (defined(clear)) {    Color.clone(clearColor, clear.color);    this.colorFramebufferManager.clear(context, clear, passState);  }};GlobeDepth.prototype.isDestroyed = function () {  return false;};GlobeDepth.prototype.destroy = function () {  destroyFramebuffers(this);  if (defined(this._copyColorCommand)) {    this._copyColorCommand.shaderProgram = this._copyColorCommand.shaderProgram.destroy();  }  if (defined(this._copyDepthCommand)) {    this._copyDepthCommand.shaderProgram = this._copyDepthCommand.shaderProgram.destroy();  }  if (defined(this._tempCopyDepthCommand)) {    this._tempCopyDepthCommand.shaderProgram = this._tempCopyDepthCommand.shaderProgram.destroy();  }  if (defined(this._updateDepthCommand)) {    this._updateDepthCommand.shaderProgram = this._updateDepthCommand.shaderProgram.destroy();  }  return destroyObject(this);};export default GlobeDepth;
 |