Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions demo/js/presets.js
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export const presets = {
title: 'Vase mode',
file: 'gcodes/vase.gcode',
lineWidth: 0,
lineHeight: 0.4,
renderExtrusion: true,
renderTubes: true,
extrusionColor: ['rgb(84,74,187)'],
Expand Down
116 changes: 71 additions & 45 deletions src/__tests__/path.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { test, expect } from 'vitest';
import { test, expect, describe } from 'vitest';
import { Path, PathType } from '../path';
import { ExtrusionGeometry } from '../extrusion-geometry';
import { BufferGeometry } from 'three';
Expand Down Expand Up @@ -64,70 +64,96 @@ test('.path returns an array of Vector3', () => {
expect(result[1]).toEqual({ x: 1, y: 2, z: 3 });
});

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

path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);
path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);

const result = path.geometry() as ExtrusionGeometry;
const result = path.geometry() as ExtrusionGeometry;

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(ExtrusionGeometry);
expect(result.parameters.points.length).toEqual(2);
expect(result.parameters.closed).toEqual(false);
});
expect(result).not.toBeNull();
expect(result).toBeInstanceOf(ExtrusionGeometry);
expect(result.parameters.points.length).toEqual(2);
expect(result.parameters.closed).toEqual(false);
});

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

path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);
path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);

const result = path.geometry() as ExtrusionGeometry;
const result = path.geometry() as ExtrusionGeometry;

expect(result.parameters.lineWidth).toEqual(9);
});
expect(result.parameters.lineWidth).toEqual(9);
});

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

path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);
path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);

const result = path.geometry() as ExtrusionGeometry;
const result = path.geometry() as ExtrusionGeometry;

expect(result.parameters.lineHeight).toEqual(5);
});
expect(result.parameters.lineHeight).toEqual(5);
});

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

const result = path.geometry();
path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(BufferGeometry);
});
const result = path.geometry({ extrusionWidthOverride: 2 }) as ExtrusionGeometry;

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

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

const result = path.line();
path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(BufferGeometry);
expect(result.getAttribute('position').count).toEqual(2);
const result = path.geometry({ lineHeightOverride: 7 }) as ExtrusionGeometry;

expect(result.parameters.lineHeight).toEqual(7);
});

test('returns an empty BufferGeometry if there are less than 3 vertices', () => {
const path = new Path(PathType.Travel, undefined, undefined, undefined);

const result = path.geometry();

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(BufferGeometry);
});
});

test('.line returns a BufferGeometry when there are no vertices', () => {
const path = new Path(PathType.Travel, undefined, undefined, undefined);
describe('.line', () => {
test('returns a BufferGeometry from the path', () => {
const path = new Path(PathType.Travel, undefined, undefined, undefined);

const result = path.line();
path.addPoint(0, 0, 0);
path.addPoint(1, 2, 3);

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(BufferGeometry);
expect(result.getAttribute('position').count).toEqual(0);
const result = path.line();

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(BufferGeometry);
expect(result.getAttribute('position').count).toEqual(2);
});

test('returns a BufferGeometry when there are no vertices', () => {
const path = new Path(PathType.Travel, undefined, undefined, undefined);

const result = path.line();

expect(result).not.toBeNull();
expect(result).toBeInstanceOf(BufferGeometry);
expect(result.getAttribute('position').count).toEqual(0);
});
});
9 changes: 7 additions & 2 deletions src/path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,17 @@ export class Path {
return path;
}

geometry(): BufferGeometry {
geometry(opts: { extrusionWidthOverride?: number; lineHeightOverride?: number } = {}): BufferGeometry {
if (this._vertices.length < 3) {
return new BufferGeometry();
}

return new ExtrusionGeometry(this.path(), this.extrusionWidth, this.lineHeight, 4);
return new ExtrusionGeometry(
this.path(),
opts.extrusionWidthOverride ?? this.extrusionWidth,
opts.lineHeightOverride ?? this.lineHeight,
4
);
}

line(): BufferGeometry {
Expand Down
8 changes: 5 additions & 3 deletions src/webgl-preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class WebGLPreview {
renderExtrusion = true;
renderTravel = false;
renderTubes = false;
extrusionWidth = 0.6;
extrusionWidth?: number;
lineWidth?: number;
lineHeight?: number;
startLayer?: number;
Expand Down Expand Up @@ -135,7 +135,7 @@ export class WebGLPreview {
this.renderTravel = opts.renderTravel ?? this.renderTravel;
this.nonTravelmoves = opts.nonTravelMoves ?? this.nonTravelmoves;
this.renderTubes = opts.renderTubes ?? this.renderTubes;
this.extrusionWidth = opts.extrusionWidth ?? this.extrusionWidth;
this.extrusionWidth = opts.extrusionWidth;
this.devMode = opts.devMode ?? this.devMode;
this.stats = this.devMode ? new Stats() : undefined;

Expand Down Expand Up @@ -475,7 +475,9 @@ export class WebGLPreview {
}

this._geometries[color] ||= [];
this._geometries[color].push(path.geometry());
this._geometries[color].push(
path.geometry({ extrusionWidthOverride: this.extrusionWidth, lineHeightOverride: this.lineHeight })
);
});
}

Expand Down