|
@@ -278,6 +278,7 @@ namespace Camera {
|
|
|
fog: 50,
|
|
|
clipFar: true,
|
|
|
minNear: 5,
|
|
|
+ minFar: 0,
|
|
|
};
|
|
|
}
|
|
|
|
|
@@ -294,6 +295,7 @@ namespace Camera {
|
|
|
fog: number
|
|
|
clipFar: boolean
|
|
|
minNear: number
|
|
|
+ minFar: number
|
|
|
}
|
|
|
|
|
|
export function copySnapshot(out: Snapshot, source?: Partial<Snapshot>) {
|
|
@@ -311,6 +313,7 @@ namespace Camera {
|
|
|
if (typeof source.fog !== 'undefined') out.fog = source.fog;
|
|
|
if (typeof source.clipFar !== 'undefined') out.clipFar = source.clipFar;
|
|
|
if (typeof source.minNear !== 'undefined') out.minNear = source.minNear;
|
|
|
+ if (typeof source.minFar !== 'undefined') out.minFar = source.minFar;
|
|
|
|
|
|
return out;
|
|
|
}
|
|
@@ -323,6 +326,7 @@ namespace Camera {
|
|
|
&& a.fog === b.fog
|
|
|
&& a.clipFar === b.clipFar
|
|
|
&& a.minNear === b.minNear
|
|
|
+ && a.minFar === b.minFar
|
|
|
&& Vec3.exactEquals(a.position, b.position)
|
|
|
&& Vec3.exactEquals(a.up, b.up)
|
|
|
&& Vec3.exactEquals(a.target, b.target);
|
|
@@ -390,18 +394,14 @@ function updatePers(camera: Camera) {
|
|
|
}
|
|
|
|
|
|
function updateClip(camera: Camera) {
|
|
|
- let { radius, radiusMax, mode, fog, clipFar, minNear } = camera.state;
|
|
|
+ let { radius, radiusMax, mode, fog, clipFar, minNear, minFar } = camera.state;
|
|
|
if (radius < 0.01) radius = 0.01;
|
|
|
|
|
|
- const normalizedFar = clipFar ? radius : radiusMax;
|
|
|
+ const normalizedFar = Math.max(clipFar ? radius : radiusMax, minFar);
|
|
|
const cameraDistance = Vec3.distance(camera.position, camera.target);
|
|
|
let near = cameraDistance - radius;
|
|
|
let far = cameraDistance + normalizedFar;
|
|
|
|
|
|
- const fogNearFactor = -(50 - fog) / 50;
|
|
|
- const fogNear = cameraDistance - (normalizedFar * fogNearFactor);
|
|
|
- const fogFar = far;
|
|
|
-
|
|
|
if (mode === 'perspective') {
|
|
|
// set at least to 5 to avoid slow sphere impostor rendering
|
|
|
near = Math.max(Math.min(radiusMax, minNear), near);
|
|
@@ -417,6 +417,10 @@ function updateClip(camera: Camera) {
|
|
|
far = near + 0.01;
|
|
|
}
|
|
|
|
|
|
+ const fogNearFactor = -(50 - fog) / 50;
|
|
|
+ const fogNear = cameraDistance - (normalizedFar * fogNearFactor);
|
|
|
+ const fogFar = far;
|
|
|
+
|
|
|
camera.near = near;
|
|
|
camera.far = 2 * far; // avoid precision issues distingushing far objects from background
|
|
|
camera.fogNear = fogNear;
|