Skip to content

Commit e0dcb92

Browse files
committed
width-and-height-for-extrusions
1 parent 51e3442 commit e0dcb92

File tree

4 files changed

+78
-46
lines changed

4 files changed

+78
-46
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: 65 additions & 41 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,66 +64,90 @@ 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.vertices = [0, 0, 0, 1, 2, 3];
71+
path.vertices = [0, 0, 0, 1, 2, 3];
7172

72-
const result = path.geometry() as ExtrusionGeometry;
73+
const result = path.geometry() as ExtrusionGeometry;
7374

74-
expect(result).not.toBeNull();
75-
expect(result).toBeInstanceOf(ExtrusionGeometry);
76-
expect(result.parameters.points.length).toEqual(2);
77-
expect(result.parameters.closed).toEqual(false);
78-
});
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+
});
7980

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

83-
path.vertices = [0, 0, 0, 1, 2, 3];
84+
path.vertices = [0, 0, 0, 1, 2, 3];
8485

85-
const result = path.geometry() as ExtrusionGeometry;
86+
const result = path.geometry() as ExtrusionGeometry;
8687

87-
expect(result.parameters.lineWidth).toEqual(9);
88-
});
88+
expect(result.parameters.lineWidth).toEqual(9);
89+
});
8990

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

93-
path.vertices = [0, 0, 0, 1, 2, 3];
94+
path.vertices = [0, 0, 0, 1, 2, 3];
9495

95-
const result = path.geometry() as ExtrusionGeometry;
96+
const result = path.geometry() as ExtrusionGeometry;
9697

97-
expect(result.parameters.lineHeight).toEqual(5);
98-
});
98+
expect(result.parameters.lineHeight).toEqual(5);
99+
});
99100

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

103-
const result = path.geometry();
104+
path.vertices = [0, 0, 0, 1, 2, 3];
104105

105-
expect(result).not.toBeNull();
106-
expect(result).toBeInstanceOf(BufferGeometry);
107-
});
106+
const result = path.geometry({ extrusionWidthOverride: 2 }) as ExtrusionGeometry;
108107

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

112-
path.vertices = [0, 0, 0, 1, 2, 3];
111+
test('returns an ExtrusionGeometry with the lineHeightOverride when passed', () => {
112+
const path = new Path(PathType.Travel, undefined, 5, undefined);
113113

114-
const result = path.line();
114+
path.vertices = [0, 0, 0, 1, 2, 3];
115115

116-
expect(result).not.toBeNull();
117-
expect(result).toBeInstanceOf(BufferGeometry);
118-
expect(result.getAttribute('position').count).toEqual(2);
116+
const result = path.geometry({ lineHeightOverride: 7 }) as ExtrusionGeometry;
117+
118+
expect(result.parameters.lineHeight).toEqual(7);
119+
});
120+
121+
test('returns an empty BufferGeometry if there are less than 3 vertices', () => {
122+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
123+
124+
const result = path.geometry();
125+
126+
expect(result).not.toBeNull();
127+
expect(result).toBeInstanceOf(BufferGeometry);
128+
});
119129
});
120130

121-
test('.line returns a BufferGeometry when there are no vertices', () => {
122-
const path = new Path(PathType.Travel, undefined, undefined, undefined);
131+
describe('.line', () => {
132+
test('returns a BufferGeometry from the path', () => {
133+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
123134

124-
const result = path.line();
135+
path.vertices = [0, 0, 0, 1, 2, 3];
125136

126-
expect(result).not.toBeNull();
127-
expect(result).toBeInstanceOf(BufferGeometry);
128-
expect(result.getAttribute('position').count).toEqual(0);
137+
const result = path.line();
138+
139+
expect(result).not.toBeNull();
140+
expect(result).toBeInstanceOf(BufferGeometry);
141+
expect(result.getAttribute('position').count).toEqual(2);
142+
});
143+
144+
test('returns a BufferGeometry when there are no vertices', () => {
145+
const path = new Path(PathType.Travel, undefined, undefined, undefined);
146+
147+
const result = path.line();
148+
149+
expect(result).not.toBeNull();
150+
expect(result).toBeInstanceOf(BufferGeometry);
151+
expect(result.getAttribute('position').count).toEqual(0);
152+
});
129153
});

src/path.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,17 @@ export class Path {
4747
return path;
4848
}
4949

50-
geometry(): BufferGeometry {
50+
geometry(opts: { extrusionWidthOverride?: number; lineHeightOverride?: number } = {}): BufferGeometry {
5151
if (this.vertices.length < 3) {
5252
return new BufferGeometry();
5353
}
5454

55-
return new ExtrusionGeometry(this.path(), this.extrusionWidth, this.lineHeight, 4);
55+
return new ExtrusionGeometry(
56+
this.path(),
57+
opts.extrusionWidthOverride ?? this.extrusionWidth,
58+
opts.lineHeightOverride ?? this.lineHeight,
59+
4
60+
);
5661
}
5762

5863
line(): BufferGeometry {

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

@@ -478,7 +478,9 @@ export class WebGLPreview {
478478
}
479479

480480
this._geometries[color] ||= [];
481-
this._geometries[color].push(path.geometry());
481+
this._geometries[color].push(
482+
path.geometry({ extrusionWidthOverride: this.extrusionWidth, lineHeightOverride: this.lineHeight })
483+
);
482484
});
483485
}
484486

0 commit comments

Comments
 (0)