You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
260 lines
7.8 KiB
JavaScript
260 lines
7.8 KiB
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 PixelFormat from "../Core/PixelFormat.js";
|
|
import ClearCommand from "../Renderer/ClearCommand.js";
|
|
import Framebuffer from "../Renderer/Framebuffer.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 Sampler from "../Renderer/Sampler.js";
|
|
import Texture from "../Renderer/Texture.js";
|
|
import PassThroughDepth from "../Shaders/PostProcessStages/PassThroughDepth.js";
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
function GlobeTranslucencyFramebuffer() {
|
|
this._colorTexture = undefined;
|
|
this._depthStencilTexture = undefined;
|
|
this._depthStencilRenderbuffer = undefined;
|
|
this._framebuffer = undefined;
|
|
|
|
this._packedDepthTexture = undefined;
|
|
this._packedDepthFramebuffer = undefined;
|
|
|
|
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, {
|
|
classificationTexture: {
|
|
get: function () {
|
|
return this._colorTexture;
|
|
},
|
|
},
|
|
classificationFramebuffer: {
|
|
get: function () {
|
|
return this._framebuffer;
|
|
},
|
|
},
|
|
});
|
|
|
|
function destroyResources(globeTranslucency) {
|
|
globeTranslucency._colorTexture =
|
|
globeTranslucency._colorTexture &&
|
|
!globeTranslucency._colorTexture.isDestroyed() &&
|
|
globeTranslucency._colorTexture.destroy();
|
|
globeTranslucency._depthStencilTexture =
|
|
globeTranslucency._depthStencilTexture &&
|
|
!globeTranslucency._depthStencilTexture.isDestroyed() &&
|
|
globeTranslucency._depthStencilTexture.destroy();
|
|
globeTranslucency._depthStencilRenderbuffer =
|
|
globeTranslucency._depthStencilRenderbuffer &&
|
|
!globeTranslucency._depthStencilRenderbuffer.isDestroyed() &&
|
|
globeTranslucency._depthStencilRenderbuffer.destroy();
|
|
globeTranslucency._framebuffer =
|
|
globeTranslucency._framebuffer &&
|
|
!globeTranslucency._framebuffer.isDestroyed() &&
|
|
globeTranslucency._framebuffer.destroy();
|
|
globeTranslucency._packedDepthTexture =
|
|
globeTranslucency._packedDepthTexture &&
|
|
!globeTranslucency._packedDepthTexture.isDestroyed() &&
|
|
globeTranslucency._packedDepthTexture.destroy();
|
|
globeTranslucency._packedDepthFramebuffer =
|
|
globeTranslucency._packedDepthFramebuffer &&
|
|
!globeTranslucency._packedDepthFramebuffer.isDestroyed() &&
|
|
globeTranslucency._packedDepthFramebuffer.destroy();
|
|
}
|
|
|
|
function createResources(globeTranslucency, context, width, height, hdr) {
|
|
var pixelDatatype = hdr
|
|
? context.halfFloatingPointTexture
|
|
? PixelDatatype.HALF_FLOAT
|
|
: PixelDatatype.FLOAT
|
|
: PixelDatatype.UNSIGNED_BYTE;
|
|
globeTranslucency._colorTexture = new Texture({
|
|
context: context,
|
|
width: width,
|
|
height: height,
|
|
pixelFormat: PixelFormat.RGBA,
|
|
pixelDatatype: pixelDatatype,
|
|
sampler: Sampler.NEAREST,
|
|
});
|
|
|
|
if (context.depthTexture) {
|
|
globeTranslucency._depthStencilTexture = new Texture({
|
|
context: context,
|
|
width: width,
|
|
height: height,
|
|
pixelFormat: PixelFormat.DEPTH_STENCIL,
|
|
pixelDatatype: PixelDatatype.UNSIGNED_INT_24_8,
|
|
});
|
|
} else {
|
|
globeTranslucency._depthStencilRenderbuffer = new Renderbuffer({
|
|
context: context,
|
|
width: width,
|
|
height: height,
|
|
format: RenderbufferFormat.DEPTH_STENCIL,
|
|
});
|
|
}
|
|
|
|
globeTranslucency._framebuffer = new Framebuffer({
|
|
context: context,
|
|
colorTextures: [globeTranslucency._colorTexture],
|
|
depthStencilTexture: globeTranslucency._depthStencilTexture,
|
|
depthStencilRenderbuffer: globeTranslucency._depthStencilRenderbuffer,
|
|
destroyAttachments: false,
|
|
});
|
|
|
|
globeTranslucency._packedDepthTexture = new Texture({
|
|
context: context,
|
|
width: width,
|
|
height: height,
|
|
pixelFormat: PixelFormat.RGBA,
|
|
pixelDatatype: PixelDatatype.UNSIGNED_BYTE,
|
|
sampler: Sampler.NEAREST,
|
|
});
|
|
|
|
globeTranslucency._packedDepthFramebuffer = new Framebuffer({
|
|
context: context,
|
|
colorTextures: [globeTranslucency._packedDepthTexture],
|
|
destroyAttachments: false,
|
|
});
|
|
}
|
|
|
|
function updateResources(globeTranslucency, context, width, height, hdr) {
|
|
var colorTexture = globeTranslucency._colorTexture;
|
|
var textureChanged =
|
|
!defined(colorTexture) ||
|
|
colorTexture.width !== width ||
|
|
colorTexture.height !== height ||
|
|
hdr !== globeTranslucency._useHdr;
|
|
if (textureChanged) {
|
|
destroyResources(globeTranslucency);
|
|
createResources(globeTranslucency, context, width, height, hdr);
|
|
}
|
|
}
|
|
|
|
function updateCommands(globeTranslucency, context, width, height, passState) {
|
|
globeTranslucency._viewport.width = width;
|
|
globeTranslucency._viewport.height = height;
|
|
|
|
var useScissorTest = !BoundingRectangle.equals(
|
|
globeTranslucency._viewport,
|
|
passState.viewport
|
|
);
|
|
var 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;
|
|
globeTranslucency._packedDepthCommand.renderState =
|
|
globeTranslucency._renderState;
|
|
globeTranslucency._clearCommand.framebuffer = globeTranslucency._framebuffer;
|
|
globeTranslucency._clearCommand.renderState = globeTranslucency._renderState;
|
|
}
|
|
|
|
GlobeTranslucencyFramebuffer.prototype.updateAndClear = function (
|
|
hdr,
|
|
viewport,
|
|
context,
|
|
passState
|
|
) {
|
|
var width = viewport.width;
|
|
var 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;
|