| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | import BoundingRectangle from "../Core/BoundingRectangle.js";import Check from "../Core/Check.js";import Color from "../Core/Color.js";import defined from "../Core/defined.js";import destroyObject from "../Core/destroyObject.js";import DeveloperError from "../Core/DeveloperError.js";import PrimitiveType from "../Core/PrimitiveType.js";import ViewportQuadVS from "../Shaders/ViewportQuadVS.js";import ClearCommand from "./ClearCommand.js";import DrawCommand from "./DrawCommand.js";import Framebuffer from "./Framebuffer.js";import RenderState from "./RenderState.js";import ShaderProgram from "./ShaderProgram.js";/** * @private */function ComputeEngine(context) {  this._context = context;}let renderStateScratch;const drawCommandScratch = new DrawCommand({  primitiveType: PrimitiveType.TRIANGLES,});const clearCommandScratch = new ClearCommand({  color: new Color(0.0, 0.0, 0.0, 0.0),});function createFramebuffer(context, outputTexture) {  return new Framebuffer({    context: context,    colorTextures: [outputTexture],    destroyAttachments: false,  });}function createViewportQuadShader(context, fragmentShaderSource) {  return ShaderProgram.fromCache({    context: context,    vertexShaderSource: ViewportQuadVS,    fragmentShaderSource: fragmentShaderSource,    attributeLocations: {      position: 0,      textureCoordinates: 1,    },  });}function createRenderState(width, height) {  if (    !defined(renderStateScratch) ||    renderStateScratch.viewport.width !== width ||    renderStateScratch.viewport.height !== height  ) {    renderStateScratch = RenderState.fromCache({      viewport: new BoundingRectangle(0, 0, width, height),    });  }  return renderStateScratch;}ComputeEngine.prototype.execute = function (computeCommand) {  //>>includeStart('debug', pragmas.debug);  Check.defined("computeCommand", computeCommand);  //>>includeEnd('debug');  // This may modify the command's resources, so do error checking afterwards  if (defined(computeCommand.preExecute)) {    computeCommand.preExecute(computeCommand);  }  //>>includeStart('debug', pragmas.debug);  if (    !defined(computeCommand.fragmentShaderSource) &&    !defined(computeCommand.shaderProgram)  ) {    throw new DeveloperError(      "computeCommand.fragmentShaderSource or computeCommand.shaderProgram is required."    );  }  Check.defined("computeCommand.outputTexture", computeCommand.outputTexture);  //>>includeEnd('debug');  const outputTexture = computeCommand.outputTexture;  const width = outputTexture.width;  const height = outputTexture.height;  const context = this._context;  const vertexArray = defined(computeCommand.vertexArray)    ? computeCommand.vertexArray    : context.getViewportQuadVertexArray();  const shaderProgram = defined(computeCommand.shaderProgram)    ? computeCommand.shaderProgram    : createViewportQuadShader(context, computeCommand.fragmentShaderSource);  const framebuffer = createFramebuffer(context, outputTexture);  const renderState = createRenderState(width, height);  const uniformMap = computeCommand.uniformMap;  const clearCommand = clearCommandScratch;  clearCommand.framebuffer = framebuffer;  clearCommand.renderState = renderState;  clearCommand.execute(context);  const drawCommand = drawCommandScratch;  drawCommand.vertexArray = vertexArray;  drawCommand.renderState = renderState;  drawCommand.shaderProgram = shaderProgram;  drawCommand.uniformMap = uniformMap;  drawCommand.framebuffer = framebuffer;  drawCommand.execute(context);  framebuffer.destroy();  if (!computeCommand.persists) {    shaderProgram.destroy();    if (defined(computeCommand.vertexArray)) {      vertexArray.destroy();    }  }  if (defined(computeCommand.postExecute)) {    computeCommand.postExecute(outputTexture);  }};ComputeEngine.prototype.isDestroyed = function () {  return false;};ComputeEngine.prototype.destroy = function () {  return destroyObject(this);};export default ComputeEngine;
 |