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