Skip to content

Commit be01375

Browse files
Pass the container size as a uniform to point and line shaders
This is a more solid replacement of the "point size is NaN" bug fix.
1 parent 6ea518b commit be01375

5 files changed

Lines changed: 37 additions & 26 deletions

File tree

docs/build.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/graphics3d.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@ import {
1010
WebGLRenderer
1111
} from '../vendors/three.js';
1212

13-
import calculateExtent from './extent.js';
1413
import { positionTickNumbers, setTicksInitialPosition } from './axes.js';
14+
import calculateExtent from './extent.js';
1515
import lightFunctions from './lights.js';
16+
import { clamp } from './math.js';
1617
import primitiveFunctions from './primitives/index.js';
1718
import { getBasicMaterial } from './shader.js';
1819
import { getUniformsBuffer } from './uniforms.js';
19-
import { clamp } from './math.js';
2020

2121
/**
2222
* @typedef {import('./index.js').AxesTicks} AxesTicks
@@ -51,6 +51,19 @@ function setDefaultContainerStyle(container) {
5151
if (!style.cursor) container.style.cursor = 'pointer';
5252
}
5353

54+
/**
55+
* Read the container size. Returns 0 in case the inputs are invalid.
56+
* @param {HTMLElement} container
57+
*/
58+
function getContainerSize(container) {
59+
const { width, height } = getComputedStyle(container);
60+
61+
return {
62+
width: parseFloat(width) || 0,
63+
height: parseFloat(height) || 0
64+
};
65+
}
66+
5467
/**
5568
* Plot the data
5669
* @param {HTMLElement} container
@@ -144,6 +157,9 @@ export default function (
144157
scene.add(camera);
145158

146159
const uniforms = getUniformsBuffer();
160+
const containerSize = getContainerSize(container);
161+
162+
uniforms.viewportSize.value = [containerSize.width, containerSize.height];
147163

148164
lighting.forEach(
149165
(element) => lightFunctions[element.type](element, uniforms, extent)
@@ -313,10 +329,7 @@ export default function (
313329
alpha: true
314330
});
315331

316-
renderer.setSize(
317-
parseInt(getComputedStyle(container).width),
318-
parseInt(getComputedStyle(container).height)
319-
);
332+
renderer.setSize(containerSize.width, containerSize.height);
320333
renderer.setPixelRatio(window.devicePixelRatio);
321334
renderer.domElement.style.width = '100%';
322335
renderer.domElement.style.height = '100%';
@@ -527,9 +540,11 @@ export default function (
527540
container.addEventListener('touchend', onMouseUp);
528541

529542
new ResizeObserver(() => {
530-
const { width, height } = getComputedStyle(container);
543+
const { width, height } = getContainerSize(container);
544+
545+
uniforms.viewportSize.value = [width, height];
531546

532-
renderer.setSize(parseInt(width), parseInt(height));
547+
renderer.setSize(width, height);
533548

534549
render();
535550

src/primitives/line.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { getBasicMaterial } from '../shader.js';
2020
*
2121
* @type {import('./index.js').PrimitiveFunction}
2222
*/
23-
export default function ({ color = /** @type {[number, number, number]} */([0, 0, 0]), coords, dashed = false, gapSize = 10, opacity = 1 }, uniforms, extent, container) {
23+
export default function ({ color = /** @type {[number, number, number]} */([0, 0, 0]), coords, dashed = false, gapSize = 10, opacity = 1 }, uniforms, extent) {
2424
return new Line(
2525
new BufferGeometry().setAttribute(
2626
'position',
@@ -34,6 +34,7 @@ export default function ({ color = /** @type {[number, number, number]} */([0, 0
3434
? new RawShaderMaterial({
3535
opacity,
3636
transparent: opacity !== 1,
37+
uniforms,
3738
vertexShader: `#version 300 es
3839
in vec3 position;
3940
@@ -53,17 +54,16 @@ export default function ({ color = /** @type {[number, number, number]} */([0, 0
5354
fragmentShader: `#version 300 es
5455
precision mediump float;
5556
57+
uniform vec2 viewportSize;
58+
5659
flat in vec2 startPosition;
5760
in vec2 vertexPosition;
5861
5962
out vec4 pc_fragColor;
6063
6164
void main() {
6265
float doubleDistance = length(
63-
(vertexPosition - startPosition) * vec2(
64-
${parseInt(getComputedStyle(container).width)},
65-
${parseInt(getComputedStyle(container).height)}
66-
)
66+
(vertexPosition - startPosition) * viewportSize
6767
);
6868
6969
float quadrupleGapInverse = ${(1 / (4 * gapSize)).toFixed(4)};

src/primitives/point.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,8 @@ import { getPopulatedCoordinateBuffer } from '../bufferUtils.js';
2323
export default function (
2424
{ color = [0, 0, 0], coords, opacity = 1, pointSize = 1 },
2525
uniforms,
26-
extent,
27-
container
26+
extent
2827
) {
29-
const containerWidth = parseInt(getComputedStyle(container).width);
30-
const safeWidth =
31-
isNaN(containerWidth) || containerWidth <= 0 ? 500 : containerWidth;
32-
33-
const validatedSize = isNaN(pointSize) || pointSize <= 0 ? 1.0 : pointSize;
34-
const finalPointSize = (validatedSize * safeWidth).toFixed(4);
35-
3628
return new Points(
3729
new BufferGeometry().setAttribute(
3830
'position',
@@ -47,13 +39,15 @@ export default function (
4739
new RawShaderMaterial({
4840
transparent: true,
4941
depthWrite: false,
42+
uniforms,
5043
vertexShader: `#version 300 es
5144
in vec3 position;
5245
uniform mat4 projectionMatrix;
5346
uniform mat4 modelViewMatrix;
47+
uniform vec2 viewportSize;
5448
5549
void main() {
56-
gl_PointSize = ${finalPointSize};
50+
gl_PointSize = viewportSize.x * ${pointSize};
5751
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1);
5852
}
5953
`,

src/uniforms.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
* coneCos: number,
2020
* direction?: import('../vendors/three.js').Vector3,
2121
* position?: import('../vendors/three.js').Vector3
22-
* }[] }
22+
* }[] },
23+
* viewportSize: { value: [number, number] }
2324
* }} UniformsBuffer
2425
*/
2526

@@ -33,6 +34,7 @@ export function getUniformsBuffer() {
3334
ambientLightColor: { value: [0, 0, 0] },
3435
directionalLights: { value: [] },
3536
pointLights: { value: [] },
36-
spotLights: { value: [] }
37+
spotLights: { value: [] },
38+
viewportSize: { value: [0, 0] }
3739
};
3840
}

0 commit comments

Comments
 (0)