transform-data.ts 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /**
  2. * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author Alexander Rose <alexander.rose@weirdbyte.de>
  5. */
  6. import { ValueCell } from 'mol-util';
  7. import { Mat4 } from 'mol-math/linear-algebra';
  8. import { fillSerial } from 'mol-util/array';
  9. import { Unit } from 'mol-model/structure';
  10. export type TransformData = {
  11. aTransform: ValueCell<Float32Array>,
  12. uInstanceCount: ValueCell<number>,
  13. instanceCount: ValueCell<number>,
  14. aInstance: ValueCell<Float32Array>,
  15. }
  16. export function _createTransforms(transformArray: Float32Array, instanceCount: number, transformData?: TransformData): TransformData {
  17. if (transformData) {
  18. ValueCell.update(transformData.aTransform, transformArray)
  19. ValueCell.update(transformData.uInstanceCount, instanceCount)
  20. ValueCell.update(transformData.instanceCount, instanceCount)
  21. const aInstance = transformData.aInstance.ref.value.length >= instanceCount ? transformData.aInstance.ref.value : new Float32Array(instanceCount)
  22. ValueCell.update(transformData.aInstance, fillSerial(aInstance, instanceCount))
  23. return transformData
  24. } else {
  25. return {
  26. aTransform: ValueCell.create(transformArray),
  27. uInstanceCount: ValueCell.create(instanceCount),
  28. instanceCount: ValueCell.create(instanceCount),
  29. aInstance: ValueCell.create(fillSerial(new Float32Array(instanceCount)))
  30. }
  31. }
  32. }
  33. const identityTransform = new Float32Array(16)
  34. Mat4.toArray(Mat4.identity(), identityTransform, 0)
  35. export function createIdentityTransform(transformData?: TransformData): TransformData {
  36. return _createTransforms(identityTransform, 1, transformData)
  37. }
  38. export function createTransforms({ units }: Unit.SymmetryGroup, transformData?: TransformData) {
  39. const unitCount = units.length
  40. const n = unitCount * 16
  41. const array = transformData && transformData.aTransform.ref.value.length >= n ? transformData.aTransform.ref.value : new Float32Array(n)
  42. for (let i = 0; i < unitCount; i++) {
  43. Mat4.toArray(units[i].conformation.operator.matrix, array, i * 16)
  44. }
  45. return _createTransforms(array, unitCount, transformData)
  46. }