diff --git a/src/mol-gl/_spec/renderable.spec.ts b/src/mol-gl/_spec/renderable.spec.ts index a0e486863709e31b396583cc8bf9dceef338dfe0..9053ec9d130ac52dd20f2aad02565bc4fc6e029c 100644 --- a/src/mol-gl/_spec/renderable.spec.ts +++ b/src/mol-gl/_spec/renderable.spec.ts @@ -29,12 +29,10 @@ describe('renderable', () => { 2, 0, 0, 0 ]) - const bs = calculateBoundingSphere({ - position, - positionCount: position.length / 3, - transform, - transformCount: transform.length / 16 - }) + const bs = calculateBoundingSphere( + position, position.length / 3, + transform, transform.length / 16 + ) expect(bs.radius).toBe(1.5) expect(bs.center).toEqual([1.5, 0.0, 0.0]) diff --git a/src/mol-gl/renderable.ts b/src/mol-gl/renderable.ts index 1e69c67553d7a53b7474f51688840f4e6354a243..9d458fe4cbda39892e2555992bdfc213dc79a2f3 100644 --- a/src/mol-gl/renderable.ts +++ b/src/mol-gl/renderable.ts @@ -8,7 +8,7 @@ import { Program } from './webgl/program'; import { RenderableValues, Values, RenderableSchema, BaseValues } from './renderable/schema'; import { RenderVariant, RenderItem } from './webgl/render-item'; import { Sphere3D } from 'mol-math/geometry'; -import { calculateBoundingSphere } from './renderable/util'; +import { calculateBoundingSphereFromValues } from './renderable/util'; export type RenderableState = { visible: boolean @@ -27,11 +27,6 @@ export interface Renderable<T extends RenderableValues & BaseValues> { } export function createRenderable<T extends Values<RenderableSchema> & BaseValues>(renderItem: RenderItem, values: T, state: RenderableState): Renderable<T> { - const position = values.aPosition.ref.value - const transform = values.aTransform.ref.value - const positionCount = values.drawCount.ref.value / 3 / 3 - const transformCount = values.instanceCount.ref.value - let boundingSphere: Sphere3D | undefined return { @@ -39,7 +34,7 @@ export function createRenderable<T extends Values<RenderableSchema> & BaseValues get state () { return state }, get boundingSphere () { if (boundingSphere) return boundingSphere - boundingSphere = calculateBoundingSphere({ position, positionCount, transform, transformCount }) + boundingSphere = calculateBoundingSphereFromValues(values) return boundingSphere }, diff --git a/src/mol-gl/renderable/util.ts b/src/mol-gl/renderable/util.ts index 650831214d131cf15433d8f15407efb82b56d933..86f791611b5e64057ab7a1aee6a4714ef4476471 100644 --- a/src/mol-gl/renderable/util.ts +++ b/src/mol-gl/renderable/util.ts @@ -6,6 +6,7 @@ import { Sphere3D } from 'mol-math/geometry' import { Mat4, Vec3 } from 'mol-math/linear-algebra' +import { ValueCell } from 'mol-util'; export function calculateTextureInfo (n: number, itemSize: number) { const sqN = Math.sqrt(n * itemSize) @@ -32,15 +33,28 @@ export function fillSerial<T extends Helpers.NumberArray> (array: T) { return array } -export interface PositionData { - position: Float32Array - positionCount: number, - transform: Float32Array, - transformCount: number, +export interface PositionValues { + aPosition: ValueCell<Float32Array> + drawCount: ValueCell<number>, + aTransform: ValueCell<Float32Array>, + instanceCount: ValueCell<number>, } -export function calculateBoundingSphere(data: PositionData): Sphere3D { - const { position, positionCount, transform, transformCount } = data +function getPositionDataFromValues(values: PositionValues) { + return { + position: values.aPosition.ref.value, + positionCount: values.drawCount.ref.value / 3 / 3, + transform: values.aTransform.ref.value, + transformCount: values.instanceCount.ref.value + } +} + +export function calculateBoundingSphereFromValues(values: PositionValues){ + const { position, positionCount, transform, transformCount } = getPositionDataFromValues(values) + return calculateBoundingSphere(position, positionCount, transform, transformCount) +} + +export function calculateBoundingSphere(position: Float32Array, positionCount: number, transform: Float32Array, transformCount: number): Sphere3D { const m = Mat4.zero()