mirror of
https://github.com/openglobus/openglobus.git
synced 2025-12-08 19:25:27 +00:00
Merge pull request #937 from openglobus/depth-buffer-api
renderer Depth buffer api extended, camera FlyCartesian precision fix
This commit is contained in:
commit
e19eebf4aa
@ -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());
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user