diff --git a/src/camera/PlanetCamera.ts b/src/camera/PlanetCamera.ts index 3fb2f5a1..d9279537 100644 --- a/src/camera/PlanetCamera.ts +++ b/src/camera/PlanetCamera.ts @@ -452,17 +452,23 @@ class PlanetCamera extends Camera { fly: (progress: number) => { let t = ease(progress); let d = 1 - t; - // camera path and orientations calculation - let g_i = ground_a.smerp(ground_b, d).normalize(); - let ground_i = this.planet.getRayIntersectionEllipsoid(new Ray(zero, g_i)); + let eye_i: Vec3; + if (t >= 1) { + eye_i = cartesian.clone(); + } else { + // camera path calculation + let g_i = ground_a.smerp(cartesian, d).normalize(); + let ground_i = this.planet.getRayIntersectionEllipsoid(new Ray(zero, g_i)); - let height_i = - this._lonLat.height * d * d * d + - max_h * 3 * d * d * t + - max_h * 3 * d * t * t + - lonlat_b.height * t * t * t; + let height_i = + this._lonLat.height * d * d * d + + max_h * 3 * d * d * t + + max_h * 3 * d * t * t + + lonlat_b.height * t * t * t; - let eye_i = ground_i!.addA(g_i.scale(height_i)); + eye_i = ground_i!.addA(g_i.scale(height_i)); + } + // orientation calculation let up_i = v_a.smerp(v_b, d); let look_i = Vec3.add(eye_i, n_a.smerp(n_b, d).negateTo()); diff --git a/src/renderer/Renderer.ts b/src/renderer/Renderer.ts index a12bd12c..edb2cc17 100644 --- a/src/renderer/Renderer.ts +++ b/src/renderer/Renderer.ts @@ -20,7 +20,7 @@ import {TextureAtlas} from "../utils/TextureAtlas"; import {Vec2} from "../math/Vec2"; import {Vec3} from "../math/Vec3"; import type {NumberArray3} from "../math/Vec3"; -import {NumberArray4, Vec4} from "../math/Vec4"; +import {Vec4} from "../math/Vec4"; interface IRendererParams { controls?: Control[]; @@ -204,6 +204,8 @@ class Renderer { protected _format: string; protected _type: string; + protected _depthRefreshRequired: boolean; + public sceneFramebuffer: Framebuffer | Multisample | null; protected blitFramebuffer: Framebuffer | null; @@ -310,6 +312,8 @@ class Renderer { this.depthFramebuffer = null; + this._depthRefreshRequired = false; + let urlParams = new URLSearchParams(location.search); let msaaParam = urlParams.get('og_msaa'); if (msaaParam) { @@ -847,6 +851,14 @@ class Renderer { this._entityCollections[depthOrder].push(...ecArr); } + /** + * Forces the depth buffer to be refreshed in the next frame. + * Has effect for terrain altitude estimate precision. + */ + public markForDepthRefresh(): void { + this._depthRefreshRequired = true; + } + /** * @protected */ @@ -1000,6 +1012,10 @@ class Renderer { let pointerEvent = e.pointerEvent(); let pointerFree = !e.mouseState.leftButtonDown && !e.mouseState.rightButtonDown; let touchTrigger = e.touchState.touchStart || e.touchState.touchEnd; + const refreshDepth = (pointerEvent && pointerFree) + || touchTrigger + || this._depthRefreshRequired; + this._depthRefreshRequired = false; e.handleEvents(); let sceneFramebuffer = this.sceneFramebuffer!; @@ -1047,7 +1063,7 @@ class Renderer { e.dispatch(e.drawtransparent, this); - if ((pointerEvent && pointerFree) || touchTrigger) { + if (refreshDepth) { this._drawPickingBuffer(0); } @@ -1067,7 +1083,7 @@ class Renderer { this._drawEntityCollections(i); - if ((pointerEvent && pointerFree) || touchTrigger) { + if (refreshDepth) { this._drawPickingBuffer(i); } @@ -1081,7 +1097,7 @@ class Renderer { this.blitFramebuffer && (sceneFramebuffer as Multisample).blitTo(this.blitFramebuffer, 0); - if ((pointerEvent && pointerFree) || touchTrigger) { + if (refreshDepth) { this._readPickingBuffer(); this._readDepthBuffer(); }