Skip to content

Commit c00ec97

Browse files
committed
width-and-height-for-extrusions (#227)
1 parent b3fee93 commit c00ec97

File tree

4 files changed

+84
-50
lines changed

4 files changed

+84
-50
lines changed

demo/js/presets.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ export const presets = {
4343
title: 'Vase mode',
4444
file: 'gcodes/vase.gcode',
4545
lineWidth: 0,
46+
lineHeight: 0.4,
4647
renderExtrusion: true,
4748
renderTubes: true,
4849
extrusionColor: ['rgb(84,74,187)'],

src/__tests__/path.ts

Lines changed: 71 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { test, expect } from 'vitest';
1+
import { test, expect, describe } from 'vitest';
22
import { Path, PathType } from '../path';
33
import { ExtrusionGeometry } from '../extrusion-geometry';
44
import { BufferGeometry } from 'three';
@@ -64,70 +64,96 @@ test('.path returns an array of Vector3', () => {
6464
expect(result[1]).toEqual({ x: 1, y: 2, z: 3 });
6565
});
6666

67-
test('.geometry returns an ExtrusionGeometry from the path', () => {
68-
const path = new Path(PathType.Travel, undefined, undefined, undefined);
67+
describe('.geometry', () => {
68+
test('returns an ExtrusionGeometry from the path', () => {
69+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
6970

70-
path.addPoint(0, 0, 0);
71-
path.addPoint(1, 2, 3);
71+
path.addPoint(0, 0, 0);
72+
path.addPoint(1, 2, 3);
7273

73-
const result = path.geometry() as ExtrusionGeometry;
74+
const result = path.geometry() as ExtrusionGeometry;
7475

75-
expect(result).not.toBeNull();
76-
expect(result).toBeInstanceOf(ExtrusionGeometry);
77-
expect(result.parameters.points.length).toEqual(2);
78-
expect(result.parameters.closed).toEqual(false);
79-
});
76+
expect(result).not.toBeNull();
77+
expect(result).toBeInstanceOf(ExtrusionGeometry);
78+
expect(result.parameters.points.length).toEqual(2);
79+
expect(result.parameters.closed).toEqual(false);
80+
});
8081

81-
test('.geometry returns an ExtrusionGeometry with the path extrusion width', () => {
82-
const path = new Path(PathType.Travel, 9, undefined, undefined);
82+
test('returns an ExtrusionGeometry with the path extrusion width', () => {
83+
const path = new Path(PathType.Travel, 9, undefined, undefined);
8384

84-
path.addPoint(0, 0, 0);
85-
path.addPoint(1, 2, 3);
85+
path.addPoint(0, 0, 0);
86+
path.addPoint(1, 2, 3);
8687

87-
const result = path.geometry() as ExtrusionGeometry;
88+
const result = path.geometry() as ExtrusionGeometry;
8889

89-
expect(result.parameters.lineWidth).toEqual(9);
90-
});
90+
expect(result.parameters.lineWidth).toEqual(9);
91+
});
9192

92-
test('.geometry returns an ExtrusionGeometry with the path line height', () => {
93-
const path = new Path(PathType.Travel, undefined, 5, undefined);
93+
test('returns an ExtrusionGeometry with the path line height', () => {
94+
const path = new Path(PathType.Travel, undefined, 5, undefined);
9495

95-
path.addPoint(0, 0, 0);
96-
path.addPoint(1, 2, 3);
96+
path.addPoint(0, 0, 0);
97+
path.addPoint(1, 2, 3);
9798

98-
const result = path.geometry() as ExtrusionGeometry;
99+
const result = path.geometry() as ExtrusionGeometry;
99100

100-
expect(result.parameters.lineHeight).toEqual(5);
101-
});
101+
expect(result.parameters.lineHeight).toEqual(5);
102+
});
102103

103-
test('.geometry returns an empty BufferGeometry if there are less than 3 vertices', () => {
104-
const path = new Path(PathType.Travel, undefined, undefined, undefined);
104+
test('returns an ExtrusionGeometry with the extrusionWidthOverride when passed', () => {
105+
const path = new Path(PathType.Travel, 9, undefined, undefined);
105106

106-
const result = path.geometry();
107+
path.addPoint(0, 0, 0);
108+
path.addPoint(1, 2, 3);
107109

108-
expect(result).not.toBeNull();
109-
expect(result).toBeInstanceOf(BufferGeometry);
110-
});
110+
const result = path.geometry({ extrusionWidthOverride: 2 }) as ExtrusionGeometry;
111111

112-
test('.line returns a BufferGeometry from the path', () => {
113-
const path = new Path(PathType.Travel, undefined, undefined, undefined);
112+
expect(result.parameters.lineWidth).toEqual(2);
113+
});
114114

115-
path.addPoint(0, 0, 0);
116-
path.addPoint(1, 2, 3);
115+
test('returns an ExtrusionGeometry with the lineHeightOverride when passed', () => {
116+
const path = new Path(PathType.Travel, undefined, 5, undefined);
117117

118-
const result = path.line();
118+
path.addPoint(0, 0, 0);
119+
path.addPoint(1, 2, 3);
119120

120-
expect(result).not.toBeNull();
121-
const points = result.attributes['instanceStart'].array;
122-
expect(points).toEqual(Float32Array.from([0, 0, 0, 1, 2, 3]));
121+
const result = path.geometry({ lineHeightOverride: 7 }) as ExtrusionGeometry;
122+
123+
expect(result.parameters.lineHeight).toEqual(7);
124+
});
125+
126+
test('returns an empty BufferGeometry if there are less than 3 vertices', () => {
127+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
128+
129+
const result = path.geometry();
130+
131+
expect(result).not.toBeNull();
132+
expect(result).toBeInstanceOf(BufferGeometry);
133+
});
123134
});
124135

125-
test('.line returns a BufferGeometry when there are no vertices', () => {
126-
const path = new Path(PathType.Travel, undefined, undefined, undefined);
136+
describe('.line', () => {
137+
test('returns a BufferGeometry from the path', () => {
138+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
127139

128-
const result = path.line();
140+
path.addPoint(0, 0, 0);
141+
path.addPoint(1, 2, 3);
129142

130-
expect(result).not.toBeNull();
131-
const points = result.attributes['instanceStart'].array;
132-
expect(points.length).toEqual(0);
143+
const result = path.line();
144+
145+
expect(result).not.toBeNull();
146+
const points = result.attributes['instanceStart'].array;
147+
expect(points).toEqual(Float32Array.from([0, 0, 0, 1, 2, 3]));
148+
});
149+
150+
test('returns a BufferGeometry when there are no vertices', () => {
151+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
152+
153+
const result = path.line();
154+
155+
expect(result).not.toBeNull();
156+
const points = result.attributes['instanceStart'].array;
157+
expect(points.length).toEqual(0);
158+
});
133159
});

src/path.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,17 @@ export class Path {
5252
return path;
5353
}
5454

55-
geometry(): BufferGeometry {
55+
geometry(opts: { extrusionWidthOverride?: number; lineHeightOverride?: number } = {}): BufferGeometry {
5656
if (this._vertices.length < 3) {
5757
return new BufferGeometry();
5858
}
5959

60-
return new ExtrusionGeometry(this.path(), this.extrusionWidth, this.lineHeight, 4);
60+
return new ExtrusionGeometry(
61+
this.path(),
62+
opts.extrusionWidthOverride ?? this.extrusionWidth,
63+
opts.lineHeightOverride ?? this.lineHeight,
64+
4
65+
);
6166
}
6267

6368
line(): LineSegmentsGeometry {

src/webgl-preview.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class WebGLPreview {
7373
renderExtrusion = true;
7474
renderTravel = false;
7575
renderTubes = false;
76-
extrusionWidth = 0.6;
76+
extrusionWidth?: number;
7777
lineWidth?: number;
7878
lineHeight?: number;
7979
startLayer?: number;
@@ -135,7 +135,7 @@ export class WebGLPreview {
135135
this.renderTravel = opts.renderTravel ?? this.renderTravel;
136136
this.nonTravelmoves = opts.nonTravelMoves ?? this.nonTravelmoves;
137137
this.renderTubes = opts.renderTubes ?? this.renderTubes;
138-
this.extrusionWidth = opts.extrusionWidth ?? this.extrusionWidth;
138+
this.extrusionWidth = opts.extrusionWidth;
139139
this.devMode = opts.devMode ?? this.devMode;
140140
this.stats = this.devMode ? new Stats() : undefined;
141141

@@ -475,7 +475,9 @@ export class WebGLPreview {
475475
}
476476

477477
this._geometries[color] ||= [];
478-
this._geometries[color].push(path.geometry());
478+
this._geometries[color].push(
479+
path.geometry({ extrusionWidthOverride: this.extrusionWidth, lineHeightOverride: this.lineHeight })
480+
);
479481
});
480482
}
481483

0 commit comments

Comments
 (0)