UNPKG

@tolokoban/tgd

Version:

ToloGameDev library for WebGL2

62 lines 3.4 kB
import { TgdVec3 } from "./../../index.js"; const EPSILON = 1e-12; /** * This class deals with the joint between two segments, * and provide the points of the previous and next ellipses. * * ``` * -----+ * | + * | / \ * | / \ * |/ * -----+ * \ * \ * ``` */ export class Ellipse { constructor(prv, cur, nxt, roundness, vertices, elements) { this.prvPointsIndexes = []; this.nxtPointsIndexes = []; this.vecY = new TgdVec3(); this.vecPrvX = new TgdVec3(); this.vecPrvZ = new TgdVec3(); this.vecNxtX = new TgdVec3(); this.vecNxtZ = new TgdVec3(); this.scaleX = 1; this.shiftZ = 0; this.vecPrv = new TgdVec3(); } computeAxis(prv, cur, nxt) { if (!prv && !nxt) throw new Error("Cannot compute axis without at least a previous or next point."); // const { vecZ, vecPrv, vecX, vecY } = this // vecZ.reset(...nxt.pos) // .subtract(cur.pos) // .normalize() // vecPrv // .reset(...prv.pos) // .subtract(cur.pos) // .normalize() // vecY.fromCross(vecZ, vecPrv) // const lenY = vecY.length // vecX.fromCross(vecY, vecZ) // const lenX = vecX.length // if (lenY > EPSILON && lenX > EPSILON) { // vecX.scale(1 / lenX) // vecY.scale(1 / lenY) // this.scaleX = 1 / Math.sin(Math.acos(vecX.dot(vecY))) // return this // } // // Segments are perfectly aligned. // vecX.fromCross([0, 1, 0], vecZ) // if (vecX.length < EPSILON) { // vecX.fromCross([0.24253562503633294, 0.9701425001453318, 0], vecZ) // } // vecY.fromCross(vecZ, vecX) // this.scaleX = 1 // return this } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxsaXBzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wYWludGVyL3R1YmVzL2VsbGlwc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUdwQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUE7QUFFckI7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLE9BQU8sT0FBTztJQWFoQixZQUNJLEdBQTZCLEVBQzdCLEdBQWlCLEVBQ2pCLEdBQTZCLEVBQzdCLFNBQWlCLEVBQ2pCLFFBQWtCLEVBQ2xCLFFBQWtCO1FBbEJOLHFCQUFnQixHQUFhLEVBQUUsQ0FBQTtRQUMvQixxQkFBZ0IsR0FBYSxFQUFFLENBQUE7UUFFdkMsU0FBSSxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDcEIsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDdkIsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDdkIsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDdkIsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7UUFDdkIsV0FBTSxHQUFHLENBQUMsQ0FBQTtRQUNWLFdBQU0sR0FBRyxDQUFDLENBQUE7UUFDVixXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtJQVMzQixDQUFDO0lBRUksV0FBVyxDQUFDLEdBQTZCLEVBQUUsR0FBaUIsRUFBRSxHQUE2QjtRQUMvRixJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0VBQWdFLENBQUMsQ0FBQTtRQUVuRyw0Q0FBNEM7UUFDNUMseUJBQXlCO1FBQ3pCLHlCQUF5QjtRQUN6QixtQkFBbUI7UUFDbkIsU0FBUztRQUNULHlCQUF5QjtRQUN6Qix5QkFBeUI7UUFDekIsbUJBQW1CO1FBQ25CLCtCQUErQjtRQUMvQiwyQkFBMkI7UUFDM0IsNkJBQTZCO1FBQzdCLDJCQUEyQjtRQUMzQiwwQ0FBMEM7UUFDMUMsMkJBQTJCO1FBQzNCLDJCQUEyQjtRQUMzQiw0REFBNEQ7UUFDNUQsa0JBQWtCO1FBQ2xCLElBQUk7UUFDSixxQ0FBcUM7UUFDckMsa0NBQWtDO1FBQ2xDLCtCQUErQjtRQUMvQix5RUFBeUU7UUFDekUsSUFBSTtRQUNKLDZCQUE2QjtRQUM3QixrQkFBa0I7UUFDbEIsY0FBYztJQUNsQixDQUFDO0NBQ0oifQ==