renderer.spec.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * Copyright (c) 2018-2021 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, Vec4 } 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 { createEmptyClipping } from '../../mol-geo/geometry/clipping-data';
  25. function createRenderer(gl: WebGLRenderingContext) {
  26. const ctx = createContext(gl);
  27. const camera = new Camera({
  28. position: Vec3.create(0, 0, 50)
  29. });
  30. const renderer = Renderer.create(ctx);
  31. return { ctx, camera, renderer };
  32. }
  33. function createPoints() {
  34. const aPosition = ValueCell.create(new Float32Array([0, -1, 0, -1, 0, 0, 1, 1, 0]));
  35. const aGroup = ValueCell.create(fillSerial(new Float32Array(3)));
  36. const aInstance = ValueCell.create(fillSerial(new Float32Array(1)));
  37. const color = createValueColor(Color(0xFF0000));
  38. const size = createValueSize(1);
  39. const marker = createEmptyMarkers();
  40. const overpaint = createEmptyOverpaint();
  41. const transparency = createEmptyTransparency();
  42. const clipping = createEmptyClipping();
  43. const aTransform = ValueCell.create(new Float32Array(16));
  44. const m4 = Mat4.identity();
  45. Mat4.toArray(m4, aTransform.ref.value, 0);
  46. const transform = ValueCell.create(new Float32Array(aTransform.ref.value));
  47. const extraTransform = ValueCell.create(new Float32Array(aTransform.ref.value));
  48. const boundingSphere = ValueCell.create(Sphere3D.create(Vec3.zero(), 2));
  49. const invariantBoundingSphere = ValueCell.create(Sphere3D.create(Vec3.zero(), 2));
  50. const values: PointsValues = {
  51. aPosition,
  52. aGroup,
  53. aTransform,
  54. aInstance,
  55. ...color,
  56. ...marker,
  57. ...size,
  58. ...overpaint,
  59. ...transparency,
  60. ...clipping,
  61. uAlpha: ValueCell.create(1.0),
  62. uVertexCount: ValueCell.create(3),
  63. uInstanceCount: ValueCell.create(1),
  64. uGroupCount: ValueCell.create(3),
  65. uInvariantBoundingSphere: ValueCell.create(Vec4.ofSphere(invariantBoundingSphere.ref.value)),
  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. hasReflection: ValueCell.create(false),
  73. boundingSphere,
  74. invariantBoundingSphere,
  75. uSizeFactor: ValueCell.create(1),
  76. dPointSizeAttenuation: ValueCell.create(true),
  77. dPointStyle: ValueCell.create('square'),
  78. };
  79. const state: RenderableState = {
  80. disposed: false,
  81. visible: true,
  82. alphaFactor: 1,
  83. pickable: true,
  84. colorOnly: false,
  85. opaque: true,
  86. writeDepth: true,
  87. noClip: false,
  88. };
  89. return createRenderObject('points', values, state, -1);
  90. }
  91. describe('renderer', () => {
  92. it('basic', () => {
  93. const [width, height] = [32, 32];
  94. const gl = createGl(width, height, { preserveDrawingBuffer: true });
  95. const { ctx, renderer } = createRenderer(gl);
  96. expect(ctx.gl.canvas.width).toBe(32);
  97. expect(ctx.gl.canvas.height).toBe(32);
  98. expect(ctx.stats.resourceCounts.attribute).toBe(0);
  99. expect(ctx.stats.resourceCounts.texture).toBe(0);
  100. expect(ctx.stats.resourceCounts.vertexArray).toBe(0);
  101. expect(ctx.stats.resourceCounts.program).toBe(0);
  102. expect(ctx.stats.resourceCounts.shader).toBe(0);
  103. renderer.setViewport(0, 0, 64, 48);
  104. expect(ctx.gl.getParameter(ctx.gl.VIEWPORT)[2]).toBe(64);
  105. expect(ctx.gl.getParameter(ctx.gl.VIEWPORT)[3]).toBe(48);
  106. });
  107. it('points', async () => {
  108. const [width, height] = [32, 32];
  109. const gl = createGl(width, height, { preserveDrawingBuffer: true });
  110. const { ctx } = createRenderer(gl);
  111. const scene = Scene.create(ctx);
  112. const points = createPoints();
  113. scene.add(points);
  114. scene.commit();
  115. expect(ctx.stats.resourceCounts.attribute).toBe(ctx.isWebGL2 ? 4 : 5);
  116. expect(ctx.stats.resourceCounts.texture).toBe(7);
  117. expect(ctx.stats.resourceCounts.vertexArray).toBe(8);
  118. expect(ctx.stats.resourceCounts.program).toBe(8);
  119. expect(ctx.stats.resourceCounts.shader).toBe(16);
  120. scene.remove(points);
  121. scene.commit();
  122. expect(ctx.stats.resourceCounts.attribute).toBe(0);
  123. expect(ctx.stats.resourceCounts.texture).toBe(0);
  124. expect(ctx.stats.resourceCounts.vertexArray).toBe(0);
  125. expect(ctx.stats.resourceCounts.program).toBe(8);
  126. expect(ctx.stats.resourceCounts.shader).toBe(16);
  127. ctx.resources.destroy();
  128. expect(ctx.stats.resourceCounts.program).toBe(0);
  129. expect(ctx.stats.resourceCounts.shader).toBe(0);
  130. });
  131. });