diff --git a/index.html b/index.html index 277d0d46056940e0047b8a13075bf1be8b771ea5..12bc07e13ce2d3132fc1827c09eb4b0478a60881 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ <title>Vite App</title> </head> <body> - <script type="module" src="/src/main.ts"></script> + <script type="module" src="/src/Main.ts"></script> <nav> <a href="index.html">Home</a> <a href="pages/bezier.html">Bezier Curves</a> diff --git a/pages/bezier.html b/pages/bezier.html index 0b51663ceab199fd9a5700ed450295338fcbabad..e72e9d23993f0d13e0d9e5dc5f90e2bc5c18773d 100644 --- a/pages/bezier.html +++ b/pages/bezier.html @@ -8,7 +8,7 @@ <title>Vite App</title> </head> <body> - <script type="module" src="/src/main.ts"></script> + <script type="module" src="/src/Main.ts"></script> <nav> <a href="../index.html">Home</a> <a href="bezier.html">Bezier Curves</a> diff --git a/pages/example.html b/pages/example.html index ec5e61c38da8e8be7ecd736cc33903e23f693cec..d7489db10267ea0d36b1e085166591f7ca733ce0 100644 --- a/pages/example.html +++ b/pages/example.html @@ -8,7 +8,7 @@ <title>Vite App</title> </head> <body> - <script type="module" src="/src/main.ts"></script> + <script type="module" src="/src/Main.ts"></script> <nav> <a href="../index.html">Home</a> <a href="bezier.html">Bezier Curves</a> diff --git a/pages/quaternion.html b/pages/quaternion.html index 0b51663ceab199fd9a5700ed450295338fcbabad..e72e9d23993f0d13e0d9e5dc5f90e2bc5c18773d 100644 --- a/pages/quaternion.html +++ b/pages/quaternion.html @@ -8,7 +8,7 @@ <title>Vite App</title> </head> <body> - <script type="module" src="/src/main.ts"></script> + <script type="module" src="/src/Main.ts"></script> <nav> <a href="../index.html">Home</a> <a href="bezier.html">Bezier Curves</a> diff --git a/pages/simulation.html b/pages/simulation.html index dee4f4f1a2c82777aeabd863350b5181598e2c2a..1b75b205ed18090b6d1ce1e694df3938588601ca 100644 --- a/pages/simulation.html +++ b/pages/simulation.html @@ -8,7 +8,7 @@ <title>Vite App</title> </head> <body> - <script type="module" src="/src/main.ts"></script> + <script type="module" src="/src/Main.ts"></script> <nav> <a href="../index.html">Home</a> <a href="bezier.html">Bezier Curves</a> diff --git a/src/00-welcome-and-example/Example.ts b/src/00-welcome-and-example/Example.ts index 2985b2d41620a2544523f45fad7e117ec5731fc7..2ea25116667309614bbea0c8458fd35b0a5af381 100644 --- a/src/00-welcome-and-example/Example.ts +++ b/src/00-welcome-and-example/Example.ts @@ -1,6 +1,9 @@ import * as THREE from "three" ; +import { Line1d, Line2d } from "../core/Lines"; import { PipelineData } from "../core/Pipeline"; -import { DebugHelper, Line1d, Line2d, Point2d, Point3d, Mesh } from "../core/Shapes"; +import { Point2d, Point3d } from "../core/Points"; +import { DebugHelper } from "../core/Shapes"; +import { TriangleMesh } from "../core/TriangleMesh"; class Example extends PipelineData { public constructor() { super(); } @@ -20,13 +23,16 @@ class Example extends PipelineData { const point3d = new Point3d(.1, 32, new THREE.Color(0xffffff)); const line1d = new Line1d(pointsA, new THREE.Color(0xffffff)); const line2d = new Line2d(pointsB, .01, new THREE.Color(0xffffff)); - const mesh = new Mesh("../assets/suzanne.obj", new THREE.Color(0xffffff)); + const mesh = new TriangleMesh("../assets/suzanne.obj", new THREE.Color(0xffffff)); - this.addObject(point2d, true); - this.addObject(point3d, true); - this.addObject(line1d), true; // gives a waring + this.addObject(point2d); + this.addObject(point3d); + this.addObject(line1d); // gives a waring this.addObject(line2d); - this.addObject(mesh, true); + this.addObject(mesh); + + this.addDraggable(point2d); + this.addDraggable(point3d); const debugHelper = new DebugHelper(); this.observers.push(debugHelper); diff --git a/src/00-welcome-and-example/demo.ts b/src/00-welcome-and-example/demo.ts index 2e0a8377c96b53d02043081f2fcd8ba509f9f986..3715ef913db4bee18bafa5ad4efa56e5ff4bd8c1 100644 --- a/src/00-welcome-and-example/demo.ts +++ b/src/00-welcome-and-example/demo.ts @@ -6,7 +6,7 @@ class Demo extends PipelineData { data(): void { const spinningCube = new SpinningCube(); - this.addObject(spinningCube, false); + this.addObject(spinningCube); this.addObserver(spinningCube); } } diff --git a/src/01-bezierCurves/Curve.ts b/src/01-bezierCurves/Curve.ts index d5c7a8ded2f4c52a44f93e264a13775b168991fa..611c33144ac140fda36514a92ed49be353133722 100644 --- a/src/01-bezierCurves/Curve.ts +++ b/src/01-bezierCurves/Curve.ts @@ -1,5 +1,7 @@ import * as THREE from 'three'; -import { Line2d, Point2d } from "../core/Shapes"; +import { Line2d } from "../core/Lines"; +import { PipelineObserver } from '../core/Pipeline'; +import { Point2d } from '../core/Points'; import { CubicBezierCurve, DeCasteljauAlgorithm } from "./CubicBezierCurve"; interface CurveParameter { @@ -14,7 +16,7 @@ interface CurveParameter { color: THREE.Color; } -class Curve extends Line2d { +class Curve extends Line2d implements PipelineObserver { public positions: Array<THREE.Vector3>; @@ -33,7 +35,7 @@ class Curve extends Line2d { parameter.tangentA.position(), parameter.tangentB.position(), parameter.pointB.position(), - ]; + ]; this._generator = new CubicBezierCurve(this.positions, new DeCasteljauAlgorithm()); } diff --git a/src/01-bezierCurves/CurveHelper.ts b/src/01-bezierCurves/CurveHelper.ts index ecf6f8275d48147ff8cf4678e4d13e172630515e..8bd59f6d1bec577a1a6eef814720dc64e522dc6c 100644 --- a/src/01-bezierCurves/CurveHelper.ts +++ b/src/01-bezierCurves/CurveHelper.ts @@ -1,7 +1,8 @@ import * as THREE from "three"; import { Curve } from "./Curve"; import { PipelineDraggable, PipelineGUI, PipelineObserver, PipelineRenderable } from "../core/Pipeline"; -import { Line1d, Point2d } from "../core/Shapes"; +import { Line1d } from "../core/Lines"; +import { Point2d } from "../core/Points"; import { DeCasteljauAlgorithm, BernsteinAlgorithm } from "./CubicBezierCurve"; import dat from "dat.gui"; diff --git a/src/01-bezierCurves/DemoBezier.ts b/src/01-bezierCurves/DemoBezier.ts index 1bb096260d4ef668301352ca14ea7297a81e2710..a22571cb7f43bd5ec264eec643d88ea1f99a894e 100644 --- a/src/01-bezierCurves/DemoBezier.ts +++ b/src/01-bezierCurves/DemoBezier.ts @@ -1,6 +1,6 @@ import * as THREE from 'three'; import { PipelineData } from "../core/Pipeline"; -import { Point2d } from "../core/Shapes"; +import { Point2d } from "../core/Points"; import { Curve } from './Curve'; import { CurveHelper, CurveHelperBernstein } from './CurveHelper'; @@ -9,15 +9,18 @@ class BezierDemo extends PipelineData { data(): void { - const pointA = new Point2d(.05, 36, new THREE.Color(0x00ff00)); - const tangentA = new Point2d(.025, 36, new THREE.Color(0x00ff00)); - const pointB = new Point2d(.05, 36, new THREE.Color(0xff0000)); - const tangentB = new Point2d(.025, 36, new THREE.Color(0xff0000)); + const pointA = new Point2d(.05, 36); + const tangentA = new Point2d(.025, 36); + const pointB = new Point2d(.05, 36); + const tangentB = new Point2d(.025, 36); - pointA.material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: false });; - tangentA.material = new THREE.MeshBasicMaterial({ color: 0x00ff00, wireframe: false });; - pointB.material = new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: false });; - tangentB.material = new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: false });; + const solidGreenMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); + const solidRedMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 }); + + pointA.material = solidGreenMaterial; + tangentA.material = solidGreenMaterial; + pointB.material = solidRedMaterial; + tangentB.material = solidRedMaterial; const curve = new Curve({ pointA: pointA, @@ -43,6 +46,7 @@ class BezierDemo extends PipelineData { this.addObserver(curveHelper); this.addObserver(curveHelperBernstein); + this.addGUI(curve); this.addGUI(curveHelper); this.addObject(pointA); @@ -54,11 +58,6 @@ class BezierDemo extends PipelineData { this.addDraggable(tangentA); this.addDraggable(pointB); this.addDraggable(tangentB); - - this.addObserver(pointA); - this.addObserver(tangentA); - this.addObserver(pointB); - this.addObserver(tangentB); } } diff --git a/src/02-quaternion/Axes.ts b/src/02-quaternion/Axes.ts index 9ead75334ccf3c3595dfa9038e640ad63cf569ef..a174f99cfe496a98bb2080311b9a293886395109 100644 --- a/src/02-quaternion/Axes.ts +++ b/src/02-quaternion/Axes.ts @@ -1,6 +1,6 @@ import * as THREE from 'three'; import { PipelineRenderable } from '../core/Pipeline'; -import { Line1d } from "../core/Shapes"; +import { Line1d } from "../core/Lines"; class Axes implements PipelineRenderable { public x: Line1d; diff --git a/src/02-quaternion/DemoQuaternion.ts b/src/02-quaternion/DemoQuaternion.ts index 6424c9602b44b3fd64c9944c20e0e7739353cc25..fd09de2d5be5bb145f68609ba3c6d4ae8c3d5232 100644 --- a/src/02-quaternion/DemoQuaternion.ts +++ b/src/02-quaternion/DemoQuaternion.ts @@ -1,6 +1,6 @@ import * as THREE from 'three'; import { PipelineData } from "../core/Pipeline"; -import { Mesh } from "../core/Shapes"; +import { TriangleMesh } from "../core/TriangleMesh"; import { Axes } from './Axes'; import { Rotator } from './Rotator'; @@ -22,9 +22,8 @@ class QuaternionDemo extends PipelineData { const axes = new Axes(5); this.addObject(axes); - const material = new THREE.MeshLambertMaterial({ color: 0xffffff }); - const rotationObject: Mesh = new Mesh("../../assets/suzanne.obj", new THREE.Color(0xffffff)); - rotationObject.material = material; + const rotationObject = new TriangleMesh("../../assets/suzanne.obj", new THREE.Color(0xffffff)); + rotationObject.material = new THREE.MeshLambertMaterial({ color: 0xffffff }); this.addObject(rotationObject); const rotator: Rotator = new Rotator(rotationObject.object()); diff --git a/src/core/Lines.ts b/src/core/Lines.ts new file mode 100644 index 0000000000000000000000000000000000000000..d79373428531a5bb5fb5b0a1ce2877084313e011 --- /dev/null +++ b/src/core/Lines.ts @@ -0,0 +1,91 @@ +import * as THREE from "three"; +import { Shape } from "./Shapes"; +import { LineMaterial } from "three/examples/jsm/lines/LineMaterial"; +import { LineGeometry } from "three/examples/jsm/lines/LineGeometry"; +import { PipelineGUI } from "./Pipeline"; +import { GUI } from "dat.gui"; + +abstract class Line extends Shape { + protected _points: Array<THREE.Vector3>; + protected _color: THREE.Color; + + constructor(points: Array<THREE.Vector3>, color: THREE.Color, + geometry: THREE.BufferGeometry, material: LineMaterial | THREE.LineBasicMaterial) { + super(); + + this._points = points; + this._color = color; + + if (this instanceof Line2d) { + this._object3d = new THREE.Mesh(geometry, material); + } else { + this._object3d = new THREE.Line(geometry, material); + } + } + + protected abstract _createLine(): void; + + public set points(points: Array<THREE.Vector3>) { + if (this._points.length !== points.length) { + this._points = points; + this._createLine(); + } else { + this._points = points; + (this._object3d as THREE.Line).geometry.setFromPoints(points); + } + } + + protected static pointsToBuffer(points: Array<THREE.Vector3>): Array<number> { + if (points.length < 1) { + return []; + } + return points.reduce((acc, cur) => { + acc.push(cur.x, cur.y, cur.z); + return acc;} + , new Array<number>()); + } +} + +class Line1d extends Line { + constructor(points: Array<THREE.Vector3>, color: THREE.Color = new THREE.Color(0xffffff)) { + super(points, color, new THREE.BufferGeometry().setFromPoints(points), + new THREE.LineBasicMaterial({ color: color.getHex(), linewidth: .1 })); + } + + protected _createLine(): void { + (this._object3d as THREE.Line).geometry.dispose(); + (this._object3d as THREE.Line).geometry = new THREE.BufferGeometry().setFromPoints(this._points); + } +} + +class Line2d extends Line implements PipelineGUI { + + private _lineWidth: number; + + constructor(points: Array<THREE.Vector3>, linewidth: number, color: THREE.Color = new THREE.Color(0xffffff)) { + super(points, color, new LineGeometry().setFromPoints(points), + new LineMaterial({ color: color.getHex(), linewidth: linewidth })); + this._lineWidth = linewidth; + } + + public get lineWidth(): number { + return this._lineWidth; + } + + public set lineWidth(linewidth: number) { + this._lineWidth = linewidth; + ((this._object3d as THREE.Mesh).material as LineMaterial).linewidth = linewidth; + } + + protected _createLine(): void { + (this._object3d as THREE.Line).geometry.dispose(); + (this._object3d as THREE.Line).geometry = new LineGeometry().setPositions(Line.pointsToBuffer(this._points)); + } + + gui(gui: GUI): void { + const folder = gui.addFolder("Line2d"); + folder.add(this, "lineWidth", 0, .2, .001).name("Line Width"); + } +} + +export { Line, Line1d, Line2d }; \ No newline at end of file diff --git a/src/core/Points.ts b/src/core/Points.ts new file mode 100644 index 0000000000000000000000000000000000000000..c31dbc062f750bb8b8bd518cf463f2ea970ed76d --- /dev/null +++ b/src/core/Points.ts @@ -0,0 +1,62 @@ +import * as THREE from "three"; +import { PipelineDraggable } from "./Pipeline"; +import { Shape } from "./Shapes"; + +abstract class Point extends Shape implements PipelineDraggable { + protected _radius: number; + protected _resolution: number; + + constructor(radius: number, resolution: number, geometry: THREE.BufferGeometry, + material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial) { + super(); + + this._radius = radius; + this._resolution = resolution; + + this._object3d = new THREE.Mesh(geometry, material); + } + + protected abstract _createMesh(): void; + + public set radius(radius: number) { + this._radius = radius; + this._createMesh(); + } + + public set resolution(resolution: number) { + this._resolution = resolution; + this._createMesh(); + } + + hitbox(): THREE.Object3D<THREE.Event> { + return this._object3d; + } +} + +class Point2d extends Point { + constructor(radius: number, resolution: number, color: THREE.Color = new THREE.Color(0xffffff)) { + super(radius, resolution, new THREE.CircleBufferGeometry(radius, resolution), + new THREE.MeshBasicMaterial({ color: color.getHex(), wireframe: true })); + } + + protected _createMesh(): void { + (this._object3d as THREE.Mesh).geometry.dispose(); + (this._object3d as THREE.Mesh).geometry = new THREE.CircleBufferGeometry(this._radius, this._resolution); + } +} + +class Point3d extends Point { + constructor(radius: number, resolution: number, color: THREE.Color = new THREE.Color(0xffffff)) { + super(radius, resolution, new THREE.SphereBufferGeometry(radius, resolution, resolution / 2), + new THREE.MeshBasicMaterial({ color: color.getHex(), wireframe: true })); + } + + protected _createMesh(): void { + (this._object3d as THREE.Mesh).geometry.dispose(); + (this._object3d as THREE.Mesh).geometry = new THREE.SphereBufferGeometry(this._radius, this._resolution, + this._resolution / 2); + } +} + + +export { Point, Point2d, Point3d }; \ No newline at end of file diff --git a/src/core/Shapes.ts b/src/core/Shapes.ts index 9530680a9e337ed3310c51c7b0367840b721a274..a3e8a69cc524d68ed9f14589132a3e6697b519ef 100644 --- a/src/core/Shapes.ts +++ b/src/core/Shapes.ts @@ -1,11 +1,8 @@ import * as THREE from "three"; -import { PipelineDraggable, PipelineObserver, PipelineRenderable } from "./Pipeline"; - +import { PipelineObserver, PipelineRenderable } from "./Pipeline"; import { LineMaterial } from "three/examples/jsm/lines/LineMaterial"; -import { LineGeometry } from "three/examples/jsm/lines/LineGeometry"; -import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader"; -abstract class Shape implements PipelineObserver, PipelineRenderable { +abstract class Shape implements PipelineRenderable { /** * Any class that extends Shape must initialize this field. @@ -14,113 +11,38 @@ abstract class Shape implements PipelineObserver, PipelineRenderable { */ public _object3d!: THREE.Object3D; - public object(): THREE.Object3D { - return this._object3d!; - } - - public position(): THREE.Vector3 { - return this._object3d.position; - } - - update(_deltaTime: number): void {/* INTENTIONAL */ } -} - -abstract class Point extends Shape implements PipelineDraggable { - private _geometry: THREE.BufferGeometry; - private _material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial; - - protected _radius: number; - protected _resolution: number; - protected _color: THREE.Color; - - constructor(radius: number, resolution: number, color: THREE.Color, geometry: THREE.BufferGeometry, - material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial) { - super(); - - this._radius = radius; - this._resolution = resolution; - this._color = color; - - this._geometry = geometry; - this._material = material - - this._object3d = new THREE.Mesh(this._geometry, this._material); - } - - protected abstract _createMesh(): void; - - public set radius(radius: number) { - this._radius = radius; - this._createMesh(); - } - - public set resolution(resolution: number) { - this._resolution = resolution; - this._createMesh(); - } - public set color(color: THREE.Color) { - this._color = color; - this._material.color = color; - } - - public set material(material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial) { - this._material = material.clone(); - this._material.color = this._color; - (this._object3d as THREE.Mesh).material = material; - } - - hitbox(): THREE.Object3D<THREE.Event> { - return this._object3d; - } - -} - -abstract class Line extends Shape { - protected _geometry: THREE.BufferGeometry; - protected _material: LineMaterial | THREE.LineBasicMaterial; - - protected _points: Array<THREE.Vector3>; - protected _color: THREE.Color; - - constructor(points: Array<THREE.Vector3>, color: THREE.Color, - geometry: THREE.BufferGeometry, material: LineMaterial | THREE.LineBasicMaterial) { - super(); - - this._points = points; - this._color = color; - - this._geometry = geometry; - this._material = material; - - if (this._material instanceof LineMaterial) { - this._object3d = new THREE.Mesh(this._geometry, this._material); - } else { - this._object3d = new THREE.Line(this._geometry, this._material); + if (this._object3d instanceof THREE.Mesh) { + const mr = (this._object3d as THREE.Mesh).material; + if (mr instanceof THREE.MeshBasicMaterial) { + (mr as THREE.MeshBasicMaterial).color.set(color.getHex()); + } else if (mr instanceof THREE.MeshLambertMaterial) { + (mr as THREE.MeshLambertMaterial).color.set(color.getHex()); + } + } else if (this._object3d instanceof THREE.Line) { + const mr = (this._object3d as THREE.Line).material; + if (mr instanceof LineMaterial) { + (mr as LineMaterial).color.set(color.getHex()); + } else if (mr instanceof THREE.LineBasicMaterial) { + (mr as THREE.LineBasicMaterial).color.set(color.getHex()); + } } } - protected abstract _createLine(): void; - - public set points(points: Array<THREE.Vector3>) { - if (this._points.length !== points.length) { - this._points = points; - this._createLine(); - } else { - this._points = points; - this._geometry.setFromPoints(points); + public set material(material: THREE.Material) { + if (this._object3d instanceof THREE.Mesh) { + (this._object3d as THREE.Mesh).material = material; + } else if (this._object3d instanceof THREE.Line) { + (this._object3d as THREE.Line).material = material; } } - public set color(color: THREE.Color) { - this._color = color; - this._material.color = color; + public object(): THREE.Object3D { + return this._object3d!; } - public set material(material: LineMaterial | THREE.LineBasicMaterial) { - this._material = material.clone(); - this._material.color = this._color; - (this._object3d as THREE.Line).material = material; + public position(): THREE.Vector3 { + return this._object3d.position; } } @@ -152,134 +74,4 @@ class DebugHelper implements PipelineObserver { } } -class Point2d extends Point { - constructor(radius: number, resolution: number, color: THREE.Color) { - super(radius, resolution, color, new THREE.CircleBufferGeometry(radius, resolution), - new THREE.MeshBasicMaterial({ color: color.getHex(), wireframe: true })); - } - - protected _createMesh(): void { - (this._object3d as THREE.Mesh).geometry.dispose(); - (this._object3d as THREE.Mesh).geometry = new THREE.CircleBufferGeometry(this._radius, this._resolution); - } -} - -class Point3d extends Point { - constructor(radius: number, resolution: number, color: THREE.Color) { - super(radius, resolution, color, new THREE.SphereBufferGeometry(radius, resolution, resolution / 2), - new THREE.MeshBasicMaterial({ color: color.getHex(), wireframe: true })); - } - - protected _createMesh(): void { - (this._object3d as THREE.Mesh).geometry.dispose(); - (this._object3d as THREE.Mesh).geometry = new THREE.SphereBufferGeometry(this._radius, this._resolution, - this._resolution / 2); - } -} - -function pointsToBuffer(points: Array<THREE.Vector3>): LineGeometry { - if (points.length < 1) { - return new LineGeometry(); - } - return new LineGeometry().setPositions(points.reduce((acc, cur) => { - acc.push(cur.x, cur.y, cur.z); - return acc;} - , new Array<number>())); -} - -class Line1d extends Line { - - constructor(points: Array<THREE.Vector3>, color: THREE.Color) { - super(points, color, new THREE.BufferGeometry().setFromPoints(points), - new THREE.LineBasicMaterial({ color: color.getHex(), linewidth: .1 })); - } - - protected _createLine(): void { - (this._object3d as THREE.Line).geometry.dispose(); - (this._object3d as THREE.Line).geometry = new THREE.BufferGeometry().setFromPoints(this._points); - } -} - -class Line2d extends Line { - - protected _linewidth: number; - - constructor(points: Array<THREE.Vector3>, linewidth: number, color: THREE.Color) { - super(points, color, pointsToBuffer(points), - new LineMaterial({ color: color.getHex(), linewidth: linewidth })); - this._linewidth = linewidth; - } - - protected _createLine(): void { - (this._object3d as THREE.Line).geometry.dispose(); - (this._object3d as THREE.Line).geometry = pointsToBuffer(this._points); - } - - public set linewidth(linewidth: number) { - this._linewidth = linewidth; - this._material.linewidth = linewidth; - } - - public set material(material: LineMaterial) { - this._material = material; - this._material.color = this._color; - this._material.linewidth = this._linewidth; - (this._object3d as THREE.Line).material = material; - } -} - -class Mesh extends Shape implements PipelineDraggable { - - protected _material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial; - protected _color: THREE.Color; - - constructor(obj: string, color: THREE.Color) { - super(); - - this._material = new THREE.MeshBasicMaterial({ color: color.getHex(), wireframe: true }); - this._color = color; - - const objLoader = new OBJLoader(); - - objLoader.load(obj, (object: THREE.Group) => { - object.name = "obj"; - localStorage.setItem("obj", JSON.stringify(object)); - }); - - const jsonString = localStorage.getItem("obj"); - if (!jsonString) { - throw new Error("No object found in local storage"); - } - localStorage.removeItem("obj"); - - const objectLoader = new THREE.ObjectLoader(); - this._object3d = objectLoader.parse(JSON.parse(jsonString)); - - this._object3d.traverse((child: THREE.Object3D) => { - if (child instanceof THREE.Mesh) { - child.material = this._material; - } - }); - } - - public set color(color: THREE.Color) { - this._color = color; - this._material.color = color; - } - - public set material(material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial) { - this._material = material; - (this._object3d as THREE.Group).traverse((child: THREE.Object3D) => { - if (child instanceof THREE.Mesh) { - child.material = material; - } - }); - } - - hitbox(): THREE.Object3D<THREE.Event> { - return this._object3d; - } -} - - -export { Shape, DebugHelper, Point, Point2d, Point3d, Line, Line1d, Line2d, Mesh }; \ No newline at end of file +export { Shape, DebugHelper }; \ No newline at end of file diff --git a/src/core/TriangleMesh.ts b/src/core/TriangleMesh.ts new file mode 100644 index 0000000000000000000000000000000000000000..81d3e2f0f94640597d2f1de4c118b9e2454b491f --- /dev/null +++ b/src/core/TriangleMesh.ts @@ -0,0 +1,56 @@ +import * as THREE from "three"; +import { PipelineDraggable } from "./Pipeline"; +import { Shape } from "./Shapes"; +import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader"; + +class TriangleMesh extends Shape implements PipelineDraggable { + constructor(obj: string, color: THREE.Color) { + super(); + + const objLoader = new OBJLoader(); + + objLoader.load(obj, (object: THREE.Group) => { + object.name = "obj"; + localStorage.setItem("obj", JSON.stringify(object)); + }); + + const jsonString = localStorage.getItem("obj"); + if (!jsonString) { + throw new Error("No object found in local storage"); + } + localStorage.removeItem("obj"); + + const objectLoader = new THREE.ObjectLoader(); + this._object3d = objectLoader.parse(JSON.parse(jsonString)); + + const material = new THREE.MeshBasicMaterial({ color: color.getHex(), wireframe: true }); + this._object3d.traverse((child: THREE.Object3D) => { + if (child instanceof THREE.Mesh) { + child.material = material; + } + }); + } + + public set color(color: THREE.Color) { + this._object3d.traverse((child: THREE.Object3D) => { + if (child instanceof THREE.Mesh) { + child.material.color.set(color.getHex()); + } + }); + } + + public set material(material: THREE.MeshBasicMaterial | THREE.MeshLambertMaterial) { + this._object3d.traverse((child: THREE.Object3D) => { + if (child instanceof THREE.Mesh) { + child.material = material; + } + }); + } + + hitbox(): THREE.Object3D<THREE.Event> { + return this._object3d; + } +} + + +export {TriangleMesh}; \ No newline at end of file