From 4d3c769e6c2fccc39cb178bd42c7d633b6304eff Mon Sep 17 00:00:00 2001 From: Alexander Rose <alex.rose@rcsb.org> Date: Tue, 24 Apr 2018 14:53:36 -0700 Subject: [PATCH] wip, renderer tweaks --- src/apps/render-test/state.ts | 2 +- src/mol-geo/representation/structure/point.ts | 2 +- src/mol-gl/renderer.ts | 1 - src/mol-view/controls/trackball.ts | 7 +++++-- src/mol-view/viewer.ts | 17 +++++++++++------ 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/apps/render-test/state.ts b/src/apps/render-test/state.ts index d722048f4..c8a2f0cd6 100644 --- a/src/apps/render-test/state.ts +++ b/src/apps/render-test/state.ts @@ -39,7 +39,7 @@ export default class State { initialized = new BehaviorSubject<boolean>(false) loading = new BehaviorSubject<boolean>(false) - colorTheme = new BehaviorSubject<ColorTheme>('chain-id') + colorTheme = new BehaviorSubject<ColorTheme>('atom-index') detail = new BehaviorSubject<number>(2) pointVisibility = new BehaviorSubject<boolean>(true) diff --git a/src/mol-geo/representation/structure/point.ts b/src/mol-geo/representation/structure/point.ts index b162a8a0a..e1ffca4b3 100644 --- a/src/mol-geo/representation/structure/point.ts +++ b/src/mol-geo/representation/structure/point.ts @@ -75,7 +75,7 @@ export default function Point(): UnitsRepresentation<PointProps> { objectId: 0, position: ValueCell.create(vertices), - id: ValueCell.create(fillSerial(new Float32Array(unitCount))), + id: ValueCell.create(fillSerial(new Float32Array(elementCount))), size, color, transform: ValueCell.create(transforms), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 64b3f0429..70525b7a0 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -74,7 +74,6 @@ namespace Renderer { const draw = () => { regl.poll() // updates timers and viewport - camera.update() baseContext(state => { regl.clear({ color: [0, 0, 0, 1] }) // TODO painters sort, filter visible, filter picking, visibility culling? diff --git a/src/mol-view/controls/trackball.ts b/src/mol-view/controls/trackball.ts index 5535d7c6f..d55e69035 100644 --- a/src/mol-view/controls/trackball.ts +++ b/src/mol-view/controls/trackball.ts @@ -63,7 +63,7 @@ namespace TrackballControls { const wheelSub = input.wheel.subscribe(onWheel) const pinchSub = input.pinch.subscribe(onPinch) - // internals + // For internal use const target = Vec3.zero() const lastPosition = Vec3.zero() @@ -84,7 +84,7 @@ namespace TrackballControls { const _panStart = Vec2.zero() const _panEnd = Vec2.zero() - // for reset + // Initial values for reseting const target0 = Vec3.clone(target) const position0 = Vec3.clone(object.position) const up0 = Vec3.clone(object.up) @@ -197,6 +197,7 @@ namespace TrackballControls { } } + /** Ensure the distance between object and target is within the min/max distance */ function checkDistances() { if (Vec3.squaredMagnitude(_eye) > maxDistance * maxDistance) { Vec3.setMagnitude(_eye, _eye, maxDistance) @@ -211,6 +212,7 @@ namespace TrackballControls { } } + /** Update the object's position, direction and up vectors */ function update() { Vec3.sub(_eye, object.position, target) @@ -229,6 +231,7 @@ namespace TrackballControls { } } + /** Reset object's vectors and the target vector to their initial values */ function reset() { Vec3.copy(target, target0) Vec3.copy(object.position, position0) diff --git a/src/mol-view/viewer.ts b/src/mol-view/viewer.ts index faf022963..4bd6189ff 100644 --- a/src/mol-view/viewer.ts +++ b/src/mol-view/viewer.ts @@ -4,7 +4,7 @@ * @author Alexander Rose <alexander.rose@weirdbyte.de> */ -import { Vec3 } from 'mol-math/linear-algebra' +import { Vec3, Mat4, EPSILON } from 'mol-math/linear-algebra' import InputObserver from 'mol-util/input/input-observer' import * as SetUtils from 'mol-util/set' import Renderer, { RendererStats } from 'mol-gl/renderer' @@ -24,7 +24,7 @@ interface Viewer { remove: (repr: StructureRepresentation) => void clear: () => void - draw: () => void + draw: (force?: boolean) => void requestDraw: () => void animate: () => void @@ -68,22 +68,27 @@ namespace Viewer { const renderer = Renderer.create(gl, camera) let drawPending = false + const prevProjectionView = Mat4.zero() - function draw () { + function draw (force?: boolean) { controls.update() camera.update() - renderer.draw() + if (force || !Mat4.areEqual(camera.projectionView, prevProjectionView, EPSILON.Value)) { + Mat4.copy(prevProjectionView, camera.projectionView) + renderer.draw() + } + drawPending = false } function requestDraw () { if (drawPending) return drawPending = true - window.requestAnimationFrame(draw) + window.requestAnimationFrame(() => draw(true)) } function animate () { draw() - window.requestAnimationFrame(animate) + window.requestAnimationFrame(() => animate()) } handleResize() -- GitLab