| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 | 
							- import BoundingRectangle from "../Core/BoundingRectangle.js";
 
- import Cartesian2 from "../Core/Cartesian2.js";
 
- import Cartesian4 from "../Core/Cartesian4.js";
 
- import defined from "../Core/defined.js";
 
- import destroyObject from "../Core/destroyObject.js";
 
- import CesiumMath from "../Core/Math.js";
 
- import Matrix4 from "../Core/Matrix4.js";
 
- import Transforms from "../Core/Transforms.js";
 
- import AdditiveBlend from "../Shaders/PostProcessStages/AdditiveBlend.js";
 
- import BrightPass from "../Shaders/PostProcessStages/BrightPass.js";
 
- import GaussianBlur1D from "../Shaders/PostProcessStages/GaussianBlur1D.js";
 
- import PassThrough from "../Shaders/PostProcessStages/PassThrough.js";
 
- import PostProcessStage from "./PostProcessStage.js";
 
- import PostProcessStageComposite from "./PostProcessStageComposite.js";
 
- import PostProcessStageSampleMode from "./PostProcessStageSampleMode.js";
 
- import PostProcessStageTextureCache from "./PostProcessStageTextureCache.js";
 
- import SceneFramebuffer from "./SceneFramebuffer.js";
 
- function SunPostProcess() {
 
-   this._sceneFramebuffer = new SceneFramebuffer();
 
-   const scale = 0.125;
 
-   const stages = new Array(6);
 
-   stages[0] = new PostProcessStage({
 
-     fragmentShader: PassThrough,
 
-     textureScale: scale,
 
-     forcePowerOfTwo: true,
 
-     sampleMode: PostProcessStageSampleMode.LINEAR,
 
-   });
 
-   const brightPass = (stages[1] = new PostProcessStage({
 
-     fragmentShader: BrightPass,
 
-     uniforms: {
 
-       avgLuminance: 0.5, // A guess at the average luminance across the entire scene
 
-       threshold: 0.25,
 
-       offset: 0.1,
 
-     },
 
-     textureScale: scale,
 
-     forcePowerOfTwo: true,
 
-   }));
 
-   const that = this;
 
-   this._delta = 1.0;
 
-   this._sigma = 2.0;
 
-   this._blurStep = new Cartesian2();
 
-   stages[2] = new PostProcessStage({
 
-     fragmentShader: GaussianBlur1D,
 
-     uniforms: {
 
-       step: function () {
 
-         that._blurStep.x = that._blurStep.y =
 
-           1.0 / brightPass.outputTexture.width;
 
-         return that._blurStep;
 
-       },
 
-       delta: function () {
 
-         return that._delta;
 
-       },
 
-       sigma: function () {
 
-         return that._sigma;
 
-       },
 
-       direction: 0.0,
 
-     },
 
-     textureScale: scale,
 
-     forcePowerOfTwo: true,
 
-   });
 
-   stages[3] = new PostProcessStage({
 
-     fragmentShader: GaussianBlur1D,
 
-     uniforms: {
 
-       step: function () {
 
-         that._blurStep.x = that._blurStep.y =
 
-           1.0 / brightPass.outputTexture.width;
 
-         return that._blurStep;
 
-       },
 
-       delta: function () {
 
-         return that._delta;
 
-       },
 
-       sigma: function () {
 
-         return that._sigma;
 
-       },
 
-       direction: 1.0,
 
-     },
 
-     textureScale: scale,
 
-     forcePowerOfTwo: true,
 
-   });
 
-   stages[4] = new PostProcessStage({
 
-     fragmentShader: PassThrough,
 
-     sampleMode: PostProcessStageSampleMode.LINEAR,
 
-   });
 
-   this._uCenter = new Cartesian2();
 
-   this._uRadius = undefined;
 
-   stages[5] = new PostProcessStage({
 
-     fragmentShader: AdditiveBlend,
 
-     uniforms: {
 
-       center: function () {
 
-         return that._uCenter;
 
-       },
 
-       radius: function () {
 
-         return that._uRadius;
 
-       },
 
-       colorTexture2: function () {
 
-         return that._sceneFramebuffer.framebuffer.getColorTexture(0);
 
-       },
 
-     },
 
-   });
 
-   this._stages = new PostProcessStageComposite({
 
-     stages: stages,
 
-   });
 
-   const textureCache = new PostProcessStageTextureCache(this);
 
-   const length = stages.length;
 
-   for (let i = 0; i < length; ++i) {
 
-     stages[i]._textureCache = textureCache;
 
-   }
 
-   this._textureCache = textureCache;
 
-   this.length = stages.length;
 
- }
 
- SunPostProcess.prototype.get = function (index) {
 
-   return this._stages.get(index);
 
- };
 
- SunPostProcess.prototype.getStageByName = function (name) {
 
-   const length = this._stages.length;
 
-   for (let i = 0; i < length; ++i) {
 
-     const stage = this._stages.get(i);
 
-     if (stage.name === name) {
 
-       return stage;
 
-     }
 
-   }
 
-   return undefined;
 
- };
 
- const sunPositionECScratch = new Cartesian4();
 
- const sunPositionWCScratch = new Cartesian2();
 
- const sizeScratch = new Cartesian2();
 
- const postProcessMatrix4Scratch = new Matrix4();
 
- function updateSunPosition(postProcess, context, viewport) {
 
-   const us = context.uniformState;
 
-   const sunPosition = us.sunPositionWC;
 
-   const viewMatrix = us.view;
 
-   const viewProjectionMatrix = us.viewProjection;
 
-   const projectionMatrix = us.projection;
 
-   // create up sampled render state
 
-   let viewportTransformation = Matrix4.computeViewportTransformation(
 
-     viewport,
 
-     0.0,
 
-     1.0,
 
-     postProcessMatrix4Scratch
 
-   );
 
-   const sunPositionEC = Matrix4.multiplyByPoint(
 
-     viewMatrix,
 
-     sunPosition,
 
-     sunPositionECScratch
 
-   );
 
-   let sunPositionWC = Transforms.pointToGLWindowCoordinates(
 
-     viewProjectionMatrix,
 
-     viewportTransformation,
 
-     sunPosition,
 
-     sunPositionWCScratch
 
-   );
 
-   sunPositionEC.x += CesiumMath.SOLAR_RADIUS;
 
-   const limbWC = Transforms.pointToGLWindowCoordinates(
 
-     projectionMatrix,
 
-     viewportTransformation,
 
-     sunPositionEC,
 
-     sunPositionEC
 
-   );
 
-   const sunSize =
 
-     Cartesian2.magnitude(Cartesian2.subtract(limbWC, sunPositionWC, limbWC)) *
 
-     30.0 *
 
-     2.0;
 
-   const size = sizeScratch;
 
-   size.x = sunSize;
 
-   size.y = sunSize;
 
-   postProcess._uCenter = Cartesian2.clone(sunPositionWC, postProcess._uCenter);
 
-   postProcess._uRadius = Math.max(size.x, size.y) * 0.15;
 
-   const width = context.drawingBufferWidth;
 
-   const height = context.drawingBufferHeight;
 
-   const stages = postProcess._stages;
 
-   const firstStage = stages.get(0);
 
-   const downSampleWidth = firstStage.outputTexture.width;
 
-   const downSampleHeight = firstStage.outputTexture.height;
 
-   const downSampleViewport = new BoundingRectangle();
 
-   downSampleViewport.width = downSampleWidth;
 
-   downSampleViewport.height = downSampleHeight;
 
-   // create down sampled render state
 
-   viewportTransformation = Matrix4.computeViewportTransformation(
 
-     downSampleViewport,
 
-     0.0,
 
-     1.0,
 
-     postProcessMatrix4Scratch
 
-   );
 
-   sunPositionWC = Transforms.pointToGLWindowCoordinates(
 
-     viewProjectionMatrix,
 
-     viewportTransformation,
 
-     sunPosition,
 
-     sunPositionWCScratch
 
-   );
 
-   size.x *= downSampleWidth / width;
 
-   size.y *= downSampleHeight / height;
 
-   const scissorRectangle = firstStage.scissorRectangle;
 
-   scissorRectangle.x = Math.max(sunPositionWC.x - size.x * 0.5, 0.0);
 
-   scissorRectangle.y = Math.max(sunPositionWC.y - size.y * 0.5, 0.0);
 
-   scissorRectangle.width = Math.min(size.x, width);
 
-   scissorRectangle.height = Math.min(size.y, height);
 
-   for (let i = 1; i < 4; ++i) {
 
-     BoundingRectangle.clone(scissorRectangle, stages.get(i).scissorRectangle);
 
-   }
 
- }
 
- SunPostProcess.prototype.clear = function (context, passState, clearColor) {
 
-   this._sceneFramebuffer.clear(context, passState, clearColor);
 
-   this._textureCache.clear(context);
 
- };
 
- SunPostProcess.prototype.update = function (passState) {
 
-   const context = passState.context;
 
-   const viewport = passState.viewport;
 
-   const sceneFramebuffer = this._sceneFramebuffer;
 
-   sceneFramebuffer.update(context, viewport);
 
-   const framebuffer = sceneFramebuffer.framebuffer;
 
-   this._textureCache.update(context);
 
-   this._stages.update(context, false);
 
-   updateSunPosition(this, context, viewport);
 
-   return framebuffer;
 
- };
 
- SunPostProcess.prototype.execute = function (context) {
 
-   const colorTexture = this._sceneFramebuffer.framebuffer.getColorTexture(0);
 
-   const stages = this._stages;
 
-   const length = stages.length;
 
-   stages.get(0).execute(context, colorTexture);
 
-   for (let i = 1; i < length; ++i) {
 
-     stages.get(i).execute(context, stages.get(i - 1).outputTexture);
 
-   }
 
- };
 
- SunPostProcess.prototype.copy = function (context, framebuffer) {
 
-   if (!defined(this._copyColorCommand)) {
 
-     const that = this;
 
-     this._copyColorCommand = context.createViewportQuadCommand(PassThrough, {
 
-       uniformMap: {
 
-         colorTexture: function () {
 
-           return that._stages.get(that._stages.length - 1).outputTexture;
 
-         },
 
-       },
 
-       owner: this,
 
-     });
 
-   }
 
-   this._copyColorCommand.framebuffer = framebuffer;
 
-   this._copyColorCommand.execute(context);
 
- };
 
- SunPostProcess.prototype.isDestroyed = function () {
 
-   return false;
 
- };
 
- SunPostProcess.prototype.destroy = function () {
 
-   this._textureCache.destroy();
 
-   this._stages.destroy();
 
-   return destroyObject(this);
 
- };
 
- export default SunPostProcess;
 
 
  |