All files / utils cameraUtils.ts

21.05% Statements 4/19
100% Branches 0/0
0% Functions 0/2
21.05% Lines 4/19

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48        1x 1x   1x                 1x                                                              
/*!
 * Copyright 2020 Cognite AS
 */
 
import { vec3 } from 'gl-matrix';
import { Box3 } from './Box3';
import { SectorMetadata } from '../models/cad/types';
import { traverseDepthFirst } from './traversal';
 
export interface SuggestedCameraConfig {
  position: vec3;
  target: vec3;
  near: number;
  far: number;
}
 
export function suggestCameraConfig(rootSector: SectorMetadata): SuggestedCameraConfig {
  const averageMin = vec3.create();
  const averageMax = vec3.create();
  let count = 0;
 
  traverseDepthFirst(rootSector, node => {
    vec3.add(averageMin, averageMin, node.bounds.min);
    vec3.add(averageMax, averageMax, node.bounds.max);
    count += 1;
    return true;
  });
 
  vec3.scale(averageMin, averageMin, 1.0 / count);
  vec3.scale(averageMax, averageMax, 1.0 / count);
 
  const bounds = new Box3([averageMin, averageMax]);
  const target = bounds.center;
  const extent = vec3.subtract(vec3.create(), bounds.max, bounds.min);
 
  const position = vec3.add(
    vec3.create(),
    target,
    vec3.fromValues(-2.0 * extent[0], -2.0 * extent[1], 2.0 * extent[2])
  );
  return {
    position,
    target,
    near: 0.1,
    far: vec3.distance(position, target) * 12
  };
}