data.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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. export type UniformSize = { type: 'uniform', value: number }
  8. export type AttributeSize = { type: 'attribute', value: ValueCell<Float32Array> }
  9. export type SizeData = UniformSize | AttributeSize
  10. export interface OffsetData {
  11. primitiveCount: number,
  12. offsetCount: number,
  13. offsets: Uint32Array
  14. }
  15. export interface UniformSizeProps {
  16. value: number
  17. }
  18. /** Creates size uniform */
  19. export function createUniformSize(props: UniformSizeProps): UniformSize {
  20. return { type: 'uniform', value: props.value }
  21. }
  22. export interface AttributeSizeProps {
  23. sizeFn: (elementIdx: number) => number
  24. offsetData: OffsetData
  25. }
  26. /** Creates size attribute with size for each element (i.e. shared across indtances/units) */
  27. export function createAttributeSize(props: AttributeSizeProps): AttributeSize {
  28. const { sizeFn, offsetData } = props
  29. const { primitiveCount, offsetCount, offsets } = offsetData
  30. const sizes = new Float32Array(primitiveCount);
  31. const _offsets = offsets // .ref.value
  32. for (let i = 0, il = offsetCount - 1; i < il; ++i) {
  33. const start = _offsets[i]
  34. const end = _offsets[i + 1]
  35. const size = sizeFn(i)
  36. for (let i = start, il = end; i < il; ++i) {
  37. sizes[i] = size
  38. }
  39. }
  40. return { type: 'attribute', value: ValueCell.create(sizes) }
  41. }