| 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;
 
 
  |