diff --git a/CHANGELOG.md b/CHANGELOG.md index 1801012459b3b81255433dfeba1f3e6385e5fabd..8a32821d044b9d0d1f073edbd987d46fd2bdf9bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Note that since we don't clearly distinguish between a public and private interf - Add custom labels to Confal pyramids - Improve naming of some internal types in Confal pyramids extension coordinate - Add example mmCIF file with categories necessary to display Confal pyramids +- Add Field of View camera parameter ## [v3.13.0] - 2022-07-24 diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index edb4d15f0dd17a5696439ef2421ab9a587d08407..27167c4bf60e9dc94e9c35112af06ab4f97eaf60 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -40,6 +40,7 @@ import { Passes } from './passes/passes'; import { shallowEqual } from '../mol-util'; import { MarkingParams } from './passes/marking'; import { GraphicsRenderVariantsBlended, GraphicsRenderVariantsWboit } from '../mol-gl/webgl/render-item'; +import { degToRad, radToDeg } from '../mol-math/misc'; export const Canvas3DParams = { camera: PD.Group({ @@ -49,6 +50,7 @@ export const Canvas3DParams = { on: PD.Group(StereoCameraParams), off: PD.Group({}) }, { cycle: true, hideIf: p => p?.mode !== 'perspective' }), + fov: PD.Numeric(45, { min: 10, max: 130, step: 1 }, { label: 'Field of View' }), manualReset: PD.Boolean(false, { isHidden: true }), }, { pivot: 'mode' }), cameraFog: PD.MappedStatic('on', { @@ -303,7 +305,7 @@ namespace Canvas3D { position: Vec3.create(0, 0, 100), mode: p.camera.mode, fog: p.cameraFog.name === 'on' ? p.cameraFog.params.intensity : 0, - clipFar: p.cameraClipping.far + fov: degToRad(p.camera.fov), }, { x, y, width, height }, { pixelScale: attribs.pixelScale }); const stereoCamera = new StereoCamera(camera, p.camera.stereo.params); @@ -658,6 +660,7 @@ namespace Canvas3D { mode: camera.state.mode, helper: { ...helper.camera.props }, stereo: { ...p.camera.stereo }, + fov: Math.round(radToDeg(camera.state.fov)), manualReset: !!p.camera.manualReset }, cameraFog: camera.state.fog > 0 @@ -771,6 +774,10 @@ namespace Canvas3D { if (props.camera && props.camera.mode !== undefined && props.camera.mode !== camera.state.mode) { cameraState.mode = props.camera.mode; } + const oldFov = Math.round(radToDeg(camera.state.fov)); + if (props.camera && props.camera.fov !== undefined && props.camera.fov !== oldFov) { + cameraState.fov = degToRad(props.camera.fov); + } if (props.cameraFog !== undefined && props.cameraFog.params) { const newFog = props.cameraFog.name === 'on' ? props.cameraFog.params.intensity : 0; if (newFog !== camera.state.fog) cameraState.fog = newFog;