From 331db15b5d16e38a7ef371574fd0a90c33169db7 Mon Sep 17 00:00:00 2001
From: Alexander Rose <alex.rose@rcsb.org>
Date: Thu, 10 Jan 2019 09:56:33 -0800
Subject: [PATCH] added cameraClipDistance to canvas3d

---
 src/mol-canvas3d/canvas3d.ts | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts
index ba9315151..087a4fd41 100644
--- a/src/mol-canvas3d/canvas3d.ts
+++ b/src/mol-canvas3d/canvas3d.ts
@@ -34,6 +34,7 @@ export const Canvas3DParams = {
     // maxFps: PD.Numeric(30),
     cameraMode: PD.Select('perspective', [['perspective', 'Perspective'], ['orthographic', 'Orthographic']]),
     backgroundColor: PD.Color(Color(0x000000)),
+    cameraClipDistance: PD.Numeric(0, { min: 0.0, max: 50.0, step: 0.1 }, { description: 'The distance between camera and scene at which to clip regardless of near clipping plane.' }),
     clip: PD.Interval([1, 100], { min: 1, max: 100, step: 1 }),
     fog: PD.Interval([50, 100], { min: 1, max: 100, step: 1 }),
     pickingAlphaThreshold: PD.Numeric(0.5, { min: 0.0, max: 1.0, step: 0.01 }, { description: 'The minimum opacity value needed for an object to be pickable.' }),
@@ -161,13 +162,24 @@ namespace Canvas3D {
 
             const nearFactor = (50 - p.clip[0]) / 50
             const farFactor = -(50 - p.clip[1]) / 50
-            const near = cDist - (bRadius * nearFactor)
-            const far = cDist + (bRadius * farFactor)
+            let near = cDist - (bRadius * nearFactor)
+            let far = cDist + (bRadius * farFactor)
 
             const fogNearFactor = (50 - p.fog[0]) / 50
             const fogFarFactor = -(50 - p.fog[1]) / 50
-            const fogNear = cDist - (bRadius * fogNearFactor)
-            const fogFar = cDist + (bRadius * fogFarFactor)
+            let fogNear = cDist - (bRadius * fogNearFactor)
+            let fogFar = cDist + (bRadius * fogFarFactor)
+
+            if (camera.state.mode === 'perspective') {
+                near = Math.max(0.1, p.cameraClipDistance, near)
+                far = Math.max(1, far)
+                fogNear = Math.max(0.1, fogNear)
+                fogFar = Math.max(1, fogFar)
+            } else if (camera.state.mode === 'orthographic') {
+                if (p.cameraClipDistance > 0) {
+                    near = Math.max(p.cameraClipDistance, near)
+                }
+            }
 
             if (near !== currentNear || far !== currentFar || fogNear !== currentFogNear || fogFar !== currentFogFar) {
                 camera.setState({ near, far, fogNear, fogFar })
@@ -371,6 +383,7 @@ namespace Canvas3D {
                     renderer.setClearColor(props.backgroundColor)
                 }
 
+                if (props.cameraClipDistance !== undefined) p.cameraClipDistance = props.cameraClipDistance
                 if (props.clip !== undefined) p.clip = [props.clip[0], props.clip[1]]
                 if (props.fog !== undefined) p.fog = [props.fog[0], props.fog[1]]
 
@@ -386,6 +399,7 @@ namespace Canvas3D {
                 return {
                     cameraMode: camera.state.mode,
                     backgroundColor: renderer.props.clearColor,
+                    cameraClipDistance: p.cameraClipDistance,
                     clip: p.clip,
                     fog: p.fog,
                     pickingAlphaThreshold: renderer.props.pickingAlphaThreshold,
-- 
GitLab