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.
93 lines
2.6 KiB
JavaScript
93 lines
2.6 KiB
JavaScript
import BoundingRectangle from "../Core/BoundingRectangle.js";
|
|
import defined from "../Core/defined.js";
|
|
import destroyObject from "../Core/destroyObject.js";
|
|
import PixelFormat from "../Core/PixelFormat.js";
|
|
import Framebuffer from "../Renderer/Framebuffer.js";
|
|
import PassState from "../Renderer/PassState.js";
|
|
import PixelDatatype from "../Renderer/PixelDatatype.js";
|
|
import Texture from "../Renderer/Texture.js";
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
function PickDepthFramebuffer() {
|
|
this._depthStencilTexture = undefined;
|
|
this._framebuffer = undefined;
|
|
this._passState = undefined;
|
|
}
|
|
|
|
function destroyResources(pickDepth) {
|
|
pickDepth._framebuffer =
|
|
pickDepth._framebuffer && pickDepth._framebuffer.destroy();
|
|
pickDepth._depthStencilTexture =
|
|
pickDepth._depthStencilTexture && pickDepth._depthStencilTexture.destroy();
|
|
}
|
|
|
|
function createResources(pickDepth, context) {
|
|
var width = context.drawingBufferWidth;
|
|
var height = context.drawingBufferHeight;
|
|
|
|
pickDepth._depthStencilTexture = new Texture({
|
|
context: context,
|
|
width: width,
|
|
height: height,
|
|
pixelFormat: PixelFormat.DEPTH_STENCIL,
|
|
pixelDatatype: PixelDatatype.UNSIGNED_INT_24_8,
|
|
});
|
|
|
|
pickDepth._framebuffer = new Framebuffer({
|
|
context: context,
|
|
depthStencilTexture: pickDepth._depthStencilTexture,
|
|
destroyAttachments: false,
|
|
});
|
|
|
|
var passState = new PassState(context);
|
|
passState.blendingEnabled = false;
|
|
passState.scissorTest = {
|
|
enabled: true,
|
|
rectangle: new BoundingRectangle(),
|
|
};
|
|
passState.viewport = new BoundingRectangle();
|
|
pickDepth._passState = passState;
|
|
}
|
|
|
|
PickDepthFramebuffer.prototype.update = function (
|
|
context,
|
|
drawingBufferPosition,
|
|
viewport
|
|
) {
|
|
var width = viewport.width;
|
|
var height = viewport.height;
|
|
|
|
if (
|
|
!defined(this._framebuffer) ||
|
|
width !== this._depthStencilTexture.width ||
|
|
height !== this._depthStencilTexture.height
|
|
) {
|
|
destroyResources(this);
|
|
createResources(this, context);
|
|
}
|
|
|
|
var framebuffer = this._framebuffer;
|
|
var passState = this._passState;
|
|
passState.framebuffer = framebuffer;
|
|
passState.viewport.width = width;
|
|
passState.viewport.height = height;
|
|
passState.scissorTest.rectangle.x = drawingBufferPosition.x;
|
|
passState.scissorTest.rectangle.y = height - drawingBufferPosition.y;
|
|
passState.scissorTest.rectangle.width = 1;
|
|
passState.scissorTest.rectangle.height = 1;
|
|
|
|
return passState;
|
|
};
|
|
|
|
PickDepthFramebuffer.prototype.isDestroyed = function () {
|
|
return false;
|
|
};
|
|
|
|
PickDepthFramebuffer.prototype.destroy = function () {
|
|
destroyResources(this);
|
|
return destroyObject(this);
|
|
};
|
|
export default PickDepthFramebuffer;
|