renderer.spec.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /**
  2. * Copyright (c) 2018-2020 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. uInstanceCount: ValueCell.create(1),
  63. uGroupCount: ValueCell.create(3),
  64. uInvariantBoundingSphere: ValueCell.create(Vec4.ofSphere(invariantBoundingSphere.ref.value)),
  65. alpha: ValueCell.create(1.0),
  66. drawCount: ValueCell.create(3),
  67. instanceCount: ValueCell.create(1),
  68. matrix: ValueCell.create(m4),
  69. transform,
  70. extraTransform,
  71. hasReflection: ValueCell.create(false),
  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. };
  79. const state: RenderableState = {
  80. visible: true,
  81. alphaFactor: 1,
  82. pickable: true,
  83. opaque: true,
  84. writeDepth: 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.resourceCounts.attribute).toBe(0);
  96. expect(ctx.stats.resourceCounts.texture).toBe(0);
  97. expect(ctx.stats.resourceCounts.vertexArray).toBe(0);
  98. expect(ctx.stats.resourceCounts.program).toBe(0);
  99. expect(ctx.stats.resourceCounts.shader).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. scene.commit();
  112. expect(ctx.stats.resourceCounts.attribute).toBe(4);
  113. expect(ctx.stats.resourceCounts.texture).toBe(6);
  114. expect(ctx.stats.resourceCounts.vertexArray).toBe(5);
  115. expect(ctx.stats.resourceCounts.program).toBe(5);
  116. expect(ctx.stats.resourceCounts.shader).toBe(10);
  117. scene.remove(points);
  118. scene.commit();
  119. expect(ctx.stats.resourceCounts.attribute).toBe(0);
  120. expect(ctx.stats.resourceCounts.texture).toBe(0);
  121. expect(ctx.stats.resourceCounts.vertexArray).toBe(0);
  122. expect(ctx.stats.resourceCounts.program).toBe(5);
  123. expect(ctx.stats.resourceCounts.shader).toBe(10);
  124. ctx.resources.destroy();
  125. expect(ctx.stats.resourceCounts.program).toBe(0);
  126. expect(ctx.stats.resourceCounts.shader).toBe(0);
  127. });
  128. });