tube.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. * @author David Sehnal <david.sehnal@gmail.com>
  6. */
  7. import { Vec3 } from 'mol-math/linear-algebra';
  8. import { ChunkedArray } from 'mol-data/util';
  9. const normalVector = Vec3.zero()
  10. const binormalVector = Vec3.zero()
  11. const tempPos = Vec3.zero()
  12. const a = Vec3.zero()
  13. const b = Vec3.zero()
  14. const u = Vec3.zero()
  15. const v = Vec3.zero()
  16. export function addTube(controlPoints: Helpers.NumberArray, normalVectors: Helpers.NumberArray, binormalVectors: Helpers.NumberArray, linearSegments: number, radialSegments: number, width: number, height: number, waveFactor: number, vertices: ChunkedArray<number, 3>, normals: ChunkedArray<number, 3>, indices: ChunkedArray<number, 3>, ids: ChunkedArray<number, 1>, currentId: number) {
  17. const vertexCount = vertices.elementCount
  18. const di = 1 / linearSegments
  19. for (let i = 0; i <= linearSegments; ++i) {
  20. const i3 = i * 3
  21. Vec3.fromArray(u, normalVectors, i3)
  22. Vec3.fromArray(v, binormalVectors, i3)
  23. const tt = di * i - 0.5;
  24. const ff = 1 + (waveFactor - 1) * (Math.cos(2 * Math.PI * tt) + 1);
  25. const w = ff * width, h = ff * height;
  26. for (let j = 0; j < radialSegments; ++j) {
  27. let t = 2 * Math.PI * j / radialSegments;
  28. Vec3.copy(a, u)
  29. Vec3.copy(b, v)
  30. Vec3.add(
  31. normalVector,
  32. Vec3.scale(a, a, w * Math.cos(t)),
  33. Vec3.scale(b, b, h * Math.sin(t))
  34. )
  35. Vec3.copy(a, u)
  36. Vec3.copy(b, v)
  37. Vec3.add(
  38. binormalVector,
  39. Vec3.scale(a, a, h * Math.cos(t)),
  40. Vec3.scale(b, b, w * Math.sin(t))
  41. )
  42. Vec3.normalize(normalVector, normalVector)
  43. Vec3.fromArray(tempPos, controlPoints, i3)
  44. Vec3.add(tempPos, tempPos, binormalVector)
  45. ChunkedArray.add3(vertices, tempPos[0], tempPos[1], tempPos[2]);
  46. ChunkedArray.add3(normals, normalVector[0], normalVector[1], normalVector[2]);
  47. ChunkedArray.add(ids, currentId);
  48. }
  49. }
  50. for (let i = 0; i < linearSegments; ++i) {
  51. for (let j = 0; j < radialSegments; ++j) {
  52. ChunkedArray.add3(
  53. indices,
  54. (vertexCount + i * radialSegments + (j + 1) % radialSegments),
  55. (vertexCount + (i + 1) * radialSegments + (j + 1) % radialSegments),
  56. (vertexCount + i * radialSegments + j)
  57. );
  58. ChunkedArray.add3(
  59. indices,
  60. (vertexCount + (i + 1) * radialSegments + (j + 1) % radialSegments),
  61. (vertexCount + (i + 1) * radialSegments + j),
  62. (vertexCount + i * radialSegments + j)
  63. );
  64. }
  65. }
  66. }