Merge pull request #937 from openglobus/depth-buffer-api

renderer Depth buffer api extended, camera FlyCartesian precision fix
This commit is contained in:
Michael Gevlich 2025-10-12 16:25:36 +02:00 committed by GitHub
commit e19eebf4aa
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 35 additions and 13 deletions

View File

@ -452,8 +452,12 @@ class PlanetCamera extends Camera {
fly: (progress: number) => { fly: (progress: number) => {
let t = ease(progress); let t = ease(progress);
let d = 1 - t; let d = 1 - t;
// camera path and orientations calculation let eye_i: Vec3;
let g_i = ground_a.smerp(ground_b, d).normalize(); 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 ground_i = this.planet.getRayIntersectionEllipsoid(new Ray(zero, g_i));
let height_i = let height_i =
@ -462,7 +466,9 @@ class PlanetCamera extends Camera {
max_h * 3 * d * t * t + max_h * 3 * d * t * t +
lonlat_b.height * t * 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 up_i = v_a.smerp(v_b, d);
let look_i = Vec3.add(eye_i, n_a.smerp(n_b, d).negateTo()); let look_i = Vec3.add(eye_i, n_a.smerp(n_b, d).negateTo());

View File

@ -20,7 +20,7 @@ import {TextureAtlas} from "../utils/TextureAtlas";
import {Vec2} from "../math/Vec2"; import {Vec2} from "../math/Vec2";
import {Vec3} from "../math/Vec3"; import {Vec3} from "../math/Vec3";
import type {NumberArray3} from "../math/Vec3"; import type {NumberArray3} from "../math/Vec3";
import {NumberArray4, Vec4} from "../math/Vec4"; import {Vec4} from "../math/Vec4";
interface IRendererParams { interface IRendererParams {
controls?: Control[]; controls?: Control[];
@ -204,6 +204,8 @@ class Renderer {
protected _format: string; protected _format: string;
protected _type: string; protected _type: string;
protected _depthRefreshRequired: boolean;
public sceneFramebuffer: Framebuffer | Multisample | null; public sceneFramebuffer: Framebuffer | Multisample | null;
protected blitFramebuffer: Framebuffer | null; protected blitFramebuffer: Framebuffer | null;
@ -310,6 +312,8 @@ class Renderer {
this.depthFramebuffer = null; this.depthFramebuffer = null;
this._depthRefreshRequired = false;
let urlParams = new URLSearchParams(location.search); let urlParams = new URLSearchParams(location.search);
let msaaParam = urlParams.get('og_msaa'); let msaaParam = urlParams.get('og_msaa');
if (msaaParam) { if (msaaParam) {
@ -847,6 +851,14 @@ class Renderer {
this._entityCollections[depthOrder].push(...ecArr); 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 * @protected
*/ */
@ -1000,6 +1012,10 @@ class Renderer {
let pointerEvent = e.pointerEvent(); let pointerEvent = e.pointerEvent();
let pointerFree = !e.mouseState.leftButtonDown && !e.mouseState.rightButtonDown; let pointerFree = !e.mouseState.leftButtonDown && !e.mouseState.rightButtonDown;
let touchTrigger = e.touchState.touchStart || e.touchState.touchEnd; let touchTrigger = e.touchState.touchStart || e.touchState.touchEnd;
const refreshDepth = (pointerEvent && pointerFree)
|| touchTrigger
|| this._depthRefreshRequired;
this._depthRefreshRequired = false;
e.handleEvents(); e.handleEvents();
let sceneFramebuffer = this.sceneFramebuffer!; let sceneFramebuffer = this.sceneFramebuffer!;
@ -1047,7 +1063,7 @@ class Renderer {
e.dispatch(e.drawtransparent, this); e.dispatch(e.drawtransparent, this);
if ((pointerEvent && pointerFree) || touchTrigger) { if (refreshDepth) {
this._drawPickingBuffer(0); this._drawPickingBuffer(0);
} }
@ -1067,7 +1083,7 @@ class Renderer {
this._drawEntityCollections(i); this._drawEntityCollections(i);
if ((pointerEvent && pointerFree) || touchTrigger) { if (refreshDepth) {
this._drawPickingBuffer(i); this._drawPickingBuffer(i);
} }
@ -1081,7 +1097,7 @@ class Renderer {
this.blitFramebuffer && (sceneFramebuffer as Multisample).blitTo(this.blitFramebuffer, 0); this.blitFramebuffer && (sceneFramebuffer as Multisample).blitTo(this.blitFramebuffer, 0);
if ((pointerEvent && pointerFree) || touchTrigger) { if (refreshDepth) {
this._readPickingBuffer(); this._readPickingBuffer();
this._readDepthBuffer(); this._readDepthBuffer();
} }