Skip to content
Snippets Groups Projects
Commit b41ebcbb authored by Alexander Rose's avatar Alexander Rose
Browse files

Merge branch 'master' of https://github.com/molstar/molstar

# Conflicts:
#	src/mol-canvas3d/camera.ts
#	src/mol-canvas3d/canvas3d.ts
parents 991d2e3a 0924020f
No related branches found
No related tags found
No related merge requests found
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
...@@ -63,29 +63,29 @@ ...@@ -63,29 +63,29 @@
"devDependencies": { "devDependencies": {
"benchmark": "^2.1.4", "benchmark": "^2.1.4",
"circular-dependency-plugin": "^5.0.2", "circular-dependency-plugin": "^5.0.2",
"concurrently": "^4.1.0", "concurrently": "^4.1.1",
"cpx": "^1.5.0", "cpx": "^1.5.0",
"css-loader": "^3.0.0", "css-loader": "^3.1.0",
"extra-watch-webpack-plugin": "^1.0.3", "extra-watch-webpack-plugin": "^1.0.3",
"file-loader": "^4.0.0", "file-loader": "^4.1.0",
"fs-extra": "^8.0.1", "fs-extra": "^8.1.0",
"graphql-code-generator": "^0.18.2", "graphql-code-generator": "^0.18.2",
"graphql-codegen-time": "^0.18.2", "graphql-codegen-time": "^0.18.2",
"graphql-codegen-typescript-template": "^0.18.2", "graphql-codegen-typescript-template": "^0.18.2",
"jest": "^24.8.0", "jest": "^24.8.0",
"jest-raw-loader": "^1.0.1", "jest-raw-loader": "^1.0.1",
"mini-css-extract-plugin": "^0.7.0", "mini-css-extract-plugin": "^0.8.0",
"node-sass": "^4.12.0", "node-sass": "^4.12.0",
"raw-loader": "^3.0.0", "raw-loader": "^3.1.0",
"resolve-url-loader": "^3.1.0", "resolve-url-loader": "^3.1.0",
"sass-loader": "^7.1.0", "sass-loader": "^7.1.0",
"simple-git": "^1.116.0", "simple-git": "^1.122.0",
"style-loader": "^0.23.1", "style-loader": "^0.23.1",
"ts-jest": "^24.0.2", "ts-jest": "^24.0.2",
"tslint": "^5.18.0", "tslint": "^5.18.0",
"typescript": "^3.5.2", "typescript": "^3.5.3",
"webpack": "^4.35.0", "webpack": "^4.36.1",
"webpack-cli": "^3.3.4" "webpack-cli": "^3.3.6"
}, },
"dependencies": { "dependencies": {
"@types/argparse": "^1.0.36", "@types/argparse": "^1.0.36",
...@@ -93,22 +93,22 @@ ...@@ -93,22 +93,22 @@
"@types/compression": "0.0.36", "@types/compression": "0.0.36",
"@types/express": "^4.17.0", "@types/express": "^4.17.0",
"@types/jest": "^24.0.15", "@types/jest": "^24.0.15",
"@types/node": "^12.0.10", "@types/node": "^12.6.8",
"@types/node-fetch": "^2.3.7", "@types/node-fetch": "^2.3.7",
"@types/react": "^16.8.22", "@types/react": "^16.8.23",
"@types/react-dom": "^16.8.4", "@types/react-dom": "^16.8.4",
"@types/swagger-ui-dist": "3.0.0", "@types/swagger-ui-dist": "3.0.0",
"@types/webgl2": "0.0.4", "@types/webgl2": "0.0.5",
"argparse": "^1.0.10", "argparse": "^1.0.10",
"compression": "^1.7.4", "compression": "^1.7.4",
"express": "^4.17.1", "express": "^4.17.1",
"graphql": "^14.3.1", "graphql": "^14.4.2",
"immutable": "^3.8.2", "immutable": "^3.8.2",
"node-fetch": "^2.6.0", "node-fetch": "^2.6.0",
"react": "^16.8.6", "react": "^16.8.6",
"react-dom": "^16.8.6", "react-dom": "^16.8.6",
"rxjs": "^6.5.2", "rxjs": "^6.5.2",
"swagger-ui-dist": "^3.22.3", "swagger-ui-dist": "^3.23.1",
"util.promisify": "^1.0.0", "util.promisify": "^1.0.0",
"xhr2": "^0.2.0" "xhr2": "^0.2.0"
} }
......
== v3.3 ==
* Camera Clipping.
== v3.2 == == v3.2 ==
* Fixed assembly loading. * Fixed assembly loading.
......
...@@ -130,7 +130,11 @@ ...@@ -130,7 +130,11 @@
addSeparator(); addSeparator();
addHeader('Camera'); addHeader('Camera');
addControl('Toggle Spin', () => PluginWrapper.toggleSpin()); addControl('Reset Position', () => PluginWrapper.camera.resetPosition());
addControl('Toggle Spin', () => PluginWrapper.camera.toggleSpin());
// Same as "wheel icon" and Viewport options
addControl('Clip', () => PluginWrapper.viewport.setSettings({ clip: [33, 66] }));
addControl('Reset Clip', () => PluginWrapper.viewport.setSettings({ clip: [1, 100] }));
addSeparator(); addSeparator();
......
...@@ -29,6 +29,7 @@ import { BuiltInSizeThemes } from '../../mol-theme/size'; ...@@ -29,6 +29,7 @@ import { BuiltInSizeThemes } from '../../mol-theme/size';
import { ColorNames } from '../../mol-util/color/tables'; import { ColorNames } from '../../mol-util/color/tables';
import { InitVolumeStreaming, CreateVolumeStreamingInfo } from '../../mol-plugin/behavior/dynamic/volume-streaming/transformers'; import { InitVolumeStreaming, CreateVolumeStreamingInfo } from '../../mol-plugin/behavior/dynamic/volume-streaming/transformers';
import { ParamDefinition } from '../../mol-util/param-definition'; import { ParamDefinition } from '../../mol-util/param-definition';
import { DefaultCanvas3DParams, Canvas3DProps } from '../../mol-canvas3d/canvas3d';
// import { Vec3 } from 'mol-math/linear-algebra'; // import { Vec3 } from 'mol-math/linear-algebra';
// import { ParamDefinition } from 'mol-util/param-definition'; // import { ParamDefinition } from 'mol-util/param-definition';
// import { Text } from 'mol-geo/geometry/text/text'; // import { Text } from 'mol-geo/geometry/text/text';
...@@ -36,7 +37,7 @@ require('../../mol-plugin/skin/light.scss') ...@@ -36,7 +37,7 @@ require('../../mol-plugin/skin/light.scss')
class MolStarProteopediaWrapper { class MolStarProteopediaWrapper {
static VERSION_MAJOR = 3; static VERSION_MAJOR = 3;
static VERSION_MINOR = 2; static VERSION_MINOR = 3;
private _ev = RxEventHelper.create(); private _ev = RxEventHelper.create();
...@@ -241,6 +242,38 @@ class MolStarProteopediaWrapper { ...@@ -241,6 +242,38 @@ class MolStarProteopediaWrapper {
if (!spinning) PluginCommands.Camera.Reset.dispatch(this.plugin, { }); if (!spinning) PluginCommands.Camera.Reset.dispatch(this.plugin, { });
} }
viewport = {
setSettings: (settings?: Canvas3DProps) => {
PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, {
settings: settings || DefaultCanvas3DParams
});
}
};
camera = {
toggleSpin: () => this.toggleSpin(),
resetPosition: () => PluginCommands.Camera.Reset.dispatch(this.plugin, { }),
// setClip: (options?: { distance?: number, near?: number, far?: number }) => {
// if (!options) {
// PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, {
// settings: {
// cameraClipDistance: DefaultCanvas3DParams.cameraClipDistance,
// clip: DefaultCanvas3DParams.clip
// }
// });
// return;
// }
// options = options || { };
// const props = this.plugin.canvas3d.props;
// const clipNear = typeof options.near === 'undefined' ? props.clip[0] : options.near;
// const clipFar = typeof options.far === 'undefined' ? props.clip[1] : options.far;
// PluginCommands.Canvas3D.SetSettings.dispatch(this.plugin, {
// settings: { cameraClipDistance: options.distance, clip: [clipNear, clipFar] }
// });
// }
}
animate = { animate = {
modelIndex: { modelIndex: {
maxFPS: 8, maxFPS: 8,
......
...@@ -90,25 +90,30 @@ class Camera implements Object3D { ...@@ -90,25 +90,30 @@ class Camera implements Object3D {
return ret; return ret;
} }
getFocus(target: Vec3, radius: number): Partial<Camera.Snapshot> { getFocus(target: Vec3, radius: number, dir?: Vec3): Partial<Camera.Snapshot> {
const fov = this.state.fov const fov = this.state.fov
const { width, height } = this.viewport const { width, height } = this.viewport
const aspect = width / height const aspect = width / height
const aspectFactor = (height < width ? 1 : aspect) const aspectFactor = (height < width ? 1 : aspect)
const currentDistance = Vec3.distance(this.state.position, target) const currentDistance = Vec3.distance(this.state.position, target)
const targetDistance = Math.abs((radius / aspectFactor) / Math.sin(fov / 2)) const targetDistance = Math.abs((radius / aspectFactor) / Math.sin(fov / 2))
const deltaDistance = Math.abs(currentDistance - targetDistance) const deltaDistance = Math.abs(currentDistance - targetDistance)
Vec3.sub(this.deltaDirection, this.state.position, target) if (dir) {
Vec3.setMagnitude(this.deltaDirection, this.state.direction, deltaDistance) Vec3.setMagnitude(this.deltaDirection, dir, targetDistance)
if (currentDistance < targetDistance) Vec3.negate(this.deltaDirection, this.deltaDirection) Vec3.add(this.newPosition, target, this.deltaDirection)
Vec3.add(this.newPosition, this.state.position, this.deltaDirection) } else {
Vec3.setMagnitude(this.deltaDirection, this.state.direction, deltaDistance)
if (currentDistance < targetDistance) Vec3.negate(this.deltaDirection, this.deltaDirection)
Vec3.add(this.newPosition, this.state.position, this.deltaDirection)
}
return { target, position: Vec3.clone(this.newPosition) }; return { target, position: Vec3.clone(this.newPosition) };
} }
focus(target: Vec3, radius: number) { focus(target: Vec3, radius: number, dir?: Vec3) {
if (radius > 0) this.setState(this.getFocus(target, radius)); if (radius > 0) this.setState(this.getFocus(target, radius, dir));
} }
// lookAt(target: Vec3) { // lookAt(target: Vec3) {
......
...@@ -47,6 +47,7 @@ export const Canvas3DParams = { ...@@ -47,6 +47,7 @@ export const Canvas3DParams = {
trackball: PD.Group(TrackballControlsParams), trackball: PD.Group(TrackballControlsParams),
debug: PD.Group(DebugHelperParams) debug: PD.Group(DebugHelperParams)
} }
export const DefaultCanvas3DParams = PD.getDefaultValues(Canvas3DParams);
export type Canvas3DProps = PD.Values<typeof Canvas3DParams> export type Canvas3DProps = PD.Values<typeof Canvas3DParams>
export { Canvas3D } export { Canvas3D }
...@@ -106,7 +107,7 @@ namespace Canvas3D { ...@@ -106,7 +107,7 @@ namespace Canvas3D {
} }
export function create(gl: GLRenderingContext, input: InputObserver, props: Partial<Canvas3DProps> = {}, runTask = DefaultRunTask): Canvas3D { export function create(gl: GLRenderingContext, input: InputObserver, props: Partial<Canvas3DProps> = {}, runTask = DefaultRunTask): Canvas3D {
const p = { ...PD.getDefaultValues(Canvas3DParams), ...props } const p = { ...DefaultCanvas3DParams, ...props }
const reprRenderObjects = new Map<Representation.Any, Set<GraphicsRenderObject>>() const reprRenderObjects = new Map<Representation.Any, Set<GraphicsRenderObject>>()
const reprUpdatedSubscriptions = new Map<Representation.Any, Subscription>() const reprUpdatedSubscriptions = new Map<Representation.Any, Subscription>()
...@@ -351,11 +352,12 @@ namespace Canvas3D { ...@@ -351,11 +352,12 @@ namespace Canvas3D {
getLoci, getLoci,
handleResize, handleResize,
resetCamera: () => { resetCamera: (dir?: Vec3) => {
if (scene.isCommiting) { if (scene.isCommiting) {
// TODO handle `dir`
cameraResetRequested = true cameraResetRequested = true
} else { } else {
camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius) camera.focus(scene.boundingSphere.center, scene.boundingSphere.radius, dir)
requestDraw(true); requestDraw(true);
} }
}, },
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment