| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 | 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 PassThroughDepth from "../Shaders/PostProcessStages/PassThroughDepth.js";/** * @private */function GlobeTranslucencyFramebuffer() {  this._framebuffer = new FramebufferManager({    depthStencil: true,    supportsDepthTexture: true,  });  this._packedDepthFramebuffer = new FramebufferManager();  this._renderState = undefined;  this._packedDepthCommand = undefined;  this._clearCommand = undefined;  this._viewport = new BoundingRectangle();  this._useScissorTest = false;  this._scissorRectangle = undefined;  this._useHdr = undefined;}Object.defineProperties(GlobeTranslucencyFramebuffer.prototype, {  // Exposed for testing  classificationTexture: {    get: function () {      return this._framebuffer.getColorTexture();    },  },  classificationFramebuffer: {    get: function () {      return this._framebuffer.framebuffer;    },  },  // Exposed for testing  packedDepthFramebuffer: {    get: function () {      return this._packedDepthFramebuffer.framebuffer;    },  },  depthStencilTexture: {    get: function () {      return this._framebuffer.getDepthStencilTexture();    },  },  // Exposed for testing  depthStencilRenderbuffer: {    get: function () {      return this._framebuffer.getDepthStencilRenderbuffer();    },  },  packedDepthTexture: {    get: function () {      return this._packedDepthFramebuffer.getColorTexture();    },  },});function destroyResources(globeTranslucency) {  globeTranslucency._framebuffer.destroy();  globeTranslucency._packedDepthFramebuffer.destroy();}function updateResources(globeTranslucency, context, width, height, hdr) {  const pixelDatatype = hdr    ? context.halfFloatingPointTexture      ? PixelDatatype.HALF_FLOAT      : PixelDatatype.FLOAT    : PixelDatatype.UNSIGNED_BYTE;  globeTranslucency._framebuffer.update(    context,    width,    height,    1,    pixelDatatype  );  globeTranslucency._packedDepthFramebuffer.update(context, width, height);}function updateCommands(globeTranslucency, context, width, height, passState) {  globeTranslucency._viewport.width = width;  globeTranslucency._viewport.height = height;  const useScissorTest = !BoundingRectangle.equals(    globeTranslucency._viewport,    passState.viewport  );  let updateScissor = useScissorTest !== globeTranslucency._useScissorTest;  globeTranslucency._useScissorTest = useScissorTest;  if (    !BoundingRectangle.equals(      globeTranslucency._scissorRectangle,      passState.viewport    )  ) {    globeTranslucency._scissorRectangle = BoundingRectangle.clone(      passState.viewport,      globeTranslucency._scissorRectangle    );    updateScissor = true;  }  if (    !defined(globeTranslucency._renderState) ||    !BoundingRectangle.equals(      globeTranslucency._viewport,      globeTranslucency._renderState.viewport    ) ||    updateScissor  ) {    globeTranslucency._renderState = RenderState.fromCache({      viewport: globeTranslucency._viewport,      scissorTest: {        enabled: globeTranslucency._useScissorTest,        rectangle: globeTranslucency._scissorRectangle,      },    });  }  if (!defined(globeTranslucency._packedDepthCommand)) {    globeTranslucency._packedDepthCommand = context.createViewportQuadCommand(      PassThroughDepth,      {        uniformMap: {          u_depthTexture: function () {            return globeTranslucency.depthStencilTexture;          },        },        owner: globeTranslucency,      }    );  }  if (!defined(globeTranslucency._clearCommand)) {    globeTranslucency._clearCommand = new ClearCommand({      color: new Color(0.0, 0.0, 0.0, 0.0),      depth: 1.0,      stencil: 0.0,      owner: globeTranslucency,    });  }  globeTranslucency._packedDepthCommand.framebuffer =    globeTranslucency._packedDepthFramebuffer.framebuffer;  globeTranslucency._packedDepthCommand.renderState =    globeTranslucency._renderState;  globeTranslucency._clearCommand.framebuffer =    globeTranslucency.classificationFramebuffer;  globeTranslucency._clearCommand.renderState = globeTranslucency._renderState;}GlobeTranslucencyFramebuffer.prototype.updateAndClear = function (  hdr,  viewport,  context,  passState) {  const width = viewport.width;  const height = viewport.height;  updateResources(this, context, width, height, hdr);  updateCommands(this, context, width, height, passState);  this._useHdr = hdr;};GlobeTranslucencyFramebuffer.prototype.clearClassification = function (  context,  passState) {  this._clearCommand.execute(context, passState);};GlobeTranslucencyFramebuffer.prototype.packDepth = function (  context,  passState) {  this._packedDepthCommand.execute(context, passState);  return this.packedDepthTexture;};GlobeTranslucencyFramebuffer.prototype.isDestroyed = function () {  return false;};GlobeTranslucencyFramebuffer.prototype.destroy = function () {  destroyResources(this);  return destroyObject(this);};export default GlobeTranslucencyFramebuffer;
 |