|
@@ -111,10 +111,7 @@ namespace Viewer {
|
|
|
far: 10000,
|
|
|
position: Vec3.create(0, 0, 50)
|
|
|
})
|
|
|
-
|
|
|
- const controls = TrackballControls.create(input, camera, {
|
|
|
-
|
|
|
- })
|
|
|
+ // camera.lookAt(Vec3.create(0, 0, 0))
|
|
|
|
|
|
const gl = getWebGLContext(canvas, {
|
|
|
alpha: false,
|
|
@@ -128,6 +125,8 @@ namespace Viewer {
|
|
|
const ctx = createContext(gl)
|
|
|
|
|
|
const scene = Scene.create(ctx)
|
|
|
+ // const controls = TrackballControls.create(input, scene, {})
|
|
|
+ const controls = TrackballControls.create(input, camera, {})
|
|
|
const renderer = Renderer.create(ctx, camera)
|
|
|
|
|
|
const pickScale = 1 / 4
|
|
@@ -140,13 +139,53 @@ namespace Viewer {
|
|
|
let pickDirty = true
|
|
|
let drawPending = false
|
|
|
const prevProjectionView = Mat4.zero()
|
|
|
+ const prevSceneView = Mat4.zero()
|
|
|
+
|
|
|
+ let nearPlaneDelta = 0
|
|
|
+ function computeNearDistance() {
|
|
|
+ const focusRadius = scene.boundingSphere.radius
|
|
|
+ let dist = Vec3.distance(controls.target, camera.position)
|
|
|
+ if (dist > focusRadius) return dist - focusRadius
|
|
|
+ return 0
|
|
|
+ }
|
|
|
|
|
|
function render(variant: RenderVariant, force?: boolean) {
|
|
|
+ // const p = scene.boundingSphere.center
|
|
|
+ // console.log(p[0], p[1], p[2])
|
|
|
+ // Vec3.set(controls.target, p[0], p[1], p[2])
|
|
|
+
|
|
|
+ const focusRadius = scene.boundingSphere.radius
|
|
|
+ const targetDistance = Vec3.distance(controls.target, camera.position)
|
|
|
+ // console.log(targetDistance, controls.target, camera.position)
|
|
|
+ let near = computeNearDistance() + nearPlaneDelta
|
|
|
+ camera.near = Math.max(0.01, Math.min(near, targetDistance - 0.5))
|
|
|
+
|
|
|
+ let fogNear = targetDistance - camera.near + 1 * focusRadius - nearPlaneDelta;
|
|
|
+ let fogFar = targetDistance - camera.near + 2 * focusRadius - nearPlaneDelta;
|
|
|
+
|
|
|
+ //console.log(fogNear, fogFar);
|
|
|
+ camera.fogNear = Math.max(fogNear, 0.1);
|
|
|
+ camera.fogFar = Math.max(fogFar, 0.2);
|
|
|
+
|
|
|
+ // console.log(camera.fogNear, camera.fogFar, targetDistance)
|
|
|
+
|
|
|
+ switch (variant) {
|
|
|
+ case 'pickObject': objectPickTarget.bind(); break;
|
|
|
+ case 'pickInstance': instancePickTarget.bind(); break;
|
|
|
+ case 'pickElement': elementPickTarget.bind(); break;
|
|
|
+ case 'draw':
|
|
|
+ ctx.unbindFramebuffer();
|
|
|
+ renderer.setViewport(0, 0, canvas.width, canvas.height);
|
|
|
+ break;
|
|
|
+ }
|
|
|
let didRender = false
|
|
|
controls.update()
|
|
|
camera.update()
|
|
|
- if (force || !Mat4.areEqual(camera.projectionView, prevProjectionView, EPSILON.Value)) {
|
|
|
+ scene.update()
|
|
|
+ if (force || !Mat4.areEqual(camera.projectionView, prevProjectionView, EPSILON.Value) || !Mat4.areEqual(scene.view, prevSceneView, EPSILON.Value)) {
|
|
|
+ // console.log('foo', force, prevSceneView, scene.view)
|
|
|
Mat4.copy(prevProjectionView, camera.projectionView)
|
|
|
+ Mat4.copy(prevSceneView, scene.view)
|
|
|
renderer.render(scene, variant)
|
|
|
if (variant === 'draw') {
|
|
|
pickDirty = true
|
|
@@ -158,9 +197,6 @@ namespace Viewer {
|
|
|
}
|
|
|
|
|
|
function draw(force?: boolean) {
|
|
|
- ctx.unbindFramebuffer()
|
|
|
- const viewport = { x: 0, y: 0, width: canvas.width, height: canvas.height }
|
|
|
- renderer.setViewport(viewport)
|
|
|
if (render('draw', force)) {
|
|
|
didDraw.next(performance.now() - startTime)
|
|
|
}
|
|
@@ -179,13 +215,8 @@ namespace Viewer {
|
|
|
}
|
|
|
|
|
|
function pick() {
|
|
|
- objectPickTarget.bind()
|
|
|
render('pickObject', pickDirty)
|
|
|
-
|
|
|
- instancePickTarget.bind()
|
|
|
render('pickInstance', pickDirty)
|
|
|
-
|
|
|
- elementPickTarget.bind()
|
|
|
render('pickElement', pickDirty)
|
|
|
|
|
|
pickDirty = false
|
|
@@ -238,7 +269,7 @@ namespace Viewer {
|
|
|
if (oldRO) {
|
|
|
SetUtils.difference(newRO, oldRO).forEach(o => scene.add(o))
|
|
|
SetUtils.difference(oldRO, newRO).forEach(o => scene.remove(o))
|
|
|
- scene.update()
|
|
|
+ // scene.update()
|
|
|
} else {
|
|
|
repr.renderObjects.forEach(o => scene.add(o))
|
|
|
}
|
|
@@ -253,7 +284,10 @@ namespace Viewer {
|
|
|
reprCount.next(reprMap.size)
|
|
|
}
|
|
|
},
|
|
|
- update: () => scene.update(),
|
|
|
+ update: () => {
|
|
|
+ scene.forEach((r, o) => r.update())
|
|
|
+ scene.unsetBoundingSphere()
|
|
|
+ },
|
|
|
clear: () => {
|
|
|
reprMap.clear()
|
|
|
scene.clear()
|
|
@@ -300,10 +334,9 @@ namespace Viewer {
|
|
|
|
|
|
function handleResize() {
|
|
|
resizeCanvas(canvas, container)
|
|
|
- const viewport = { x: 0, y: 0, width: canvas.width, height: canvas.height }
|
|
|
- renderer.setViewport(viewport)
|
|
|
- Viewport.copy(camera.viewport, viewport)
|
|
|
- Viewport.copy(controls.viewport, viewport)
|
|
|
+ renderer.setViewport(0, 0, canvas.width, canvas.height)
|
|
|
+ Viewport.set(camera.viewport, 0, 0, canvas.width, canvas.height)
|
|
|
+ Viewport.set(controls.viewport, 0, 0, canvas.width, canvas.height)
|
|
|
|
|
|
const pickWidth = Math.round(canvas.width * pickScale)
|
|
|
const pickHeight = Math.round(canvas.height * pickScale)
|