renderer.spec.ts 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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 { createGl } from './gl.shim';
  7. import { Camera } from '../../mol-canvas3d/camera';
  8. import { Vec3, Mat4 } from '../../mol-math/linear-algebra';
  9. import { ValueCell } from '../../mol-util';
  10. import Renderer from '../renderer';
  11. import { createValueColor } from '../../mol-geo/geometry/color-data';
  12. import { createValueSize } from '../../mol-geo/geometry/size-data';
  13. import { createContext } from '../webgl/context';
  14. import { RenderableState } from '../renderable';
  15. import { createRenderObject } from '../render-object';
  16. import { PointsValues } from '../renderable/points';
  17. import Scene from '../scene';
  18. import { createEmptyMarkers } from '../../mol-geo/geometry/marker-data';
  19. import { fillSerial } from '../../mol-util/array';
  20. import { Color } from '../../mol-util/color';
  21. import { Sphere3D } from '../../mol-math/geometry';
  22. import { createEmptyOverpaint } from '../../mol-geo/geometry/overpaint-data';
  23. import { createEmptyTransparency } from '../../mol-geo/geometry/transparency-data';
  24. import { DefaultCanvas3DParams } from '../../mol-canvas3d/canvas3d';
  25. function createRenderer(gl: WebGLRenderingContext) {
  26. const ctx = createContext(gl)
  27. const camera = new Camera(DefaultCanvas3DParams, {
  28. near: 0.01,
  29. far: 10000,
  30. position: Vec3.create(0, 0, 50)
  31. })
  32. const renderer = Renderer.create(ctx, camera)
  33. return { ctx, camera, renderer }
  34. }
  35. function createPoints() {
  36. const aPosition = ValueCell.create(new Float32Array([0, -1, 0, -1, 0, 0, 1, 1, 0]))
  37. const aGroup = ValueCell.create(fillSerial(new Float32Array(3)))
  38. const aInstance = ValueCell.create(fillSerial(new Float32Array(1)))
  39. const color = createValueColor(Color(0xFF0000))
  40. const size = createValueSize(1)
  41. const marker = createEmptyMarkers()
  42. const overpaint = createEmptyOverpaint()
  43. const transparency = createEmptyTransparency()
  44. const aTransform = ValueCell.create(new Float32Array(16))
  45. const m4 = Mat4.identity()
  46. Mat4.toArray(m4, aTransform.ref.value, 0)
  47. const transform = ValueCell.create(new Float32Array(aTransform.ref.value))
  48. const extraTransform = ValueCell.create(new Float32Array(aTransform.ref.value))
  49. const boundingSphere = ValueCell.create(Sphere3D.create(Vec3.zero(), 2))
  50. const invariantBoundingSphere = ValueCell.create(Sphere3D.create(Vec3.zero(), 2))
  51. const values: PointsValues = {
  52. aPosition,
  53. aGroup,
  54. aTransform,
  55. aInstance,
  56. ...color,
  57. ...marker,
  58. ...size,
  59. ...overpaint,
  60. ...transparency,
  61. uAlpha: ValueCell.create(1.0),
  62. uHighlightColor: ValueCell.create(Vec3.create(1.0, 0.4, 0.6)),
  63. uSelectColor: ValueCell.create(Vec3.create(0.2, 1.0, 0.1)),
  64. uInstanceCount: ValueCell.create(1),
  65. uGroupCount: ValueCell.create(3),
  66. alpha: ValueCell.create(1.0),
  67. drawCount: ValueCell.create(3),
  68. instanceCount: ValueCell.create(1),
  69. matrix: ValueCell.create(m4),
  70. transform,
  71. extraTransform,
  72. boundingSphere,
  73. invariantBoundingSphere,
  74. uSizeFactor: ValueCell.create(1),
  75. dPointSizeAttenuation: ValueCell.create(true),
  76. dPointFilledCircle: ValueCell.create(false),
  77. uPointEdgeBleach: ValueCell.create(0.5),
  78. dUseFog: ValueCell.create(true),
  79. }
  80. const state: RenderableState = {
  81. visible: true,
  82. alphaFactor: 1,
  83. pickable: true,
  84. opaque: true
  85. }
  86. return createRenderObject('points', values, state, -1)
  87. }
  88. describe('renderer', () => {
  89. it('basic', () => {
  90. const [ width, height ] = [ 32, 32 ]
  91. const gl = createGl(width, height, { preserveDrawingBuffer: true })
  92. const { ctx, renderer } = createRenderer(gl)
  93. expect(ctx.gl.canvas.width).toBe(32)
  94. expect(ctx.gl.canvas.height).toBe(32)
  95. expect(ctx.stats.bufferCount).toBe(0);
  96. expect(ctx.stats.textureCount).toBe(0);
  97. expect(ctx.stats.vaoCount).toBe(0);
  98. expect(ctx.programCache.count).toBe(0);
  99. expect(ctx.shaderCache.count).toBe(0);
  100. renderer.setViewport(0, 0, 64, 48)
  101. expect(ctx.gl.getParameter(ctx.gl.VIEWPORT)[2]).toBe(64)
  102. expect(ctx.gl.getParameter(ctx.gl.VIEWPORT)[3]).toBe(48)
  103. })
  104. it('points', async () => {
  105. const [ width, height ] = [ 32, 32 ]
  106. const gl = createGl(width, height, { preserveDrawingBuffer: true })
  107. const { ctx } = createRenderer(gl)
  108. const scene = Scene.create(ctx)
  109. const points = createPoints()
  110. scene.add(points)
  111. await scene.commit().run()
  112. expect(ctx.stats.bufferCount).toBe(4);
  113. expect(ctx.stats.textureCount).toBe(5);
  114. expect(ctx.stats.vaoCount).toBe(5);
  115. expect(ctx.programCache.count).toBe(5);
  116. expect(ctx.shaderCache.count).toBe(10);
  117. scene.remove(points)
  118. await scene.commit().run()
  119. expect(ctx.stats.bufferCount).toBe(0);
  120. expect(ctx.stats.textureCount).toBe(0);
  121. expect(ctx.stats.vaoCount).toBe(0);
  122. expect(ctx.programCache.count).toBe(5);
  123. expect(ctx.shaderCache.count).toBe(10);
  124. ctx.programCache.dispose()
  125. expect(ctx.programCache.count).toBe(0);
  126. ctx.shaderCache.clear()
  127. expect(ctx.shaderCache.count).toBe(0);
  128. })
  129. })