@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
202 lines (179 loc) • 5.49 kB
JavaScript
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;