@math.gl/geometry 4.2.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +140 -0
- package/README.md +15 -0
- package/dist/geometries/box-geometry.d.ts +17 -0
- package/dist/geometries/box-geometry.d.ts.map +1 -0
- package/dist/geometries/box-geometry.js +60 -0
- package/dist/geometries/box-geometry.js.map +1 -0
- package/dist/geometries/capsule-geometry.d.ts +15 -0
- package/dist/geometries/capsule-geometry.d.ts.map +1 -0
- package/dist/geometries/capsule-geometry.js +92 -0
- package/dist/geometries/capsule-geometry.js.map +1 -0
- package/dist/geometries/cylinder-geometry.d.ts +17 -0
- package/dist/geometries/cylinder-geometry.d.ts.map +1 -0
- package/dist/geometries/cylinder-geometry.js +27 -0
- package/dist/geometries/cylinder-geometry.js.map +1 -0
- package/dist/geometries/geometry-helpers.d.ts +16 -0
- package/dist/geometries/geometry-helpers.d.ts.map +1 -0
- package/dist/geometries/geometry-helpers.js +19 -0
- package/dist/geometries/geometry-helpers.js.map +1 -0
- package/dist/geometries/ico-sphere-geometry.d.ts +11 -0
- package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -0
- package/dist/geometries/ico-sphere-geometry.js +87 -0
- package/dist/geometries/ico-sphere-geometry.js.map +1 -0
- package/dist/geometries/plane-geometry.d.ts +13 -0
- package/dist/geometries/plane-geometry.d.ts.map +1 -0
- package/dist/geometries/plane-geometry.js +51 -0
- package/dist/geometries/plane-geometry.js.map +1 -0
- package/dist/geometries/sphere-geometry.d.ts +12 -0
- package/dist/geometries/sphere-geometry.d.ts.map +1 -0
- package/dist/geometries/sphere-geometry.js +35 -0
- package/dist/geometries/sphere-geometry.js.map +1 -0
- package/dist/geometries/surface-of-revolution.d.ts +11 -0
- package/dist/geometries/surface-of-revolution.d.ts.map +1 -0
- package/dist/geometries/surface-of-revolution.js +37 -0
- package/dist/geometries/surface-of-revolution.js.map +1 -0
- package/dist/geometries/truncated-cone-geometry.d.ts +17 -0
- package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -0
- package/dist/geometries/truncated-cone-geometry.js +92 -0
- package/dist/geometries/truncated-cone-geometry.js.map +1 -0
- package/dist/index.cjs +601 -0
- package/dist/index.cjs.map +6 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/geometry-utils.d.ts +9 -0
- package/dist/lib/geometry-utils.d.ts.map +1 -0
- package/dist/lib/geometry-utils.js +29 -0
- package/dist/lib/geometry-utils.js.map +1 -0
- package/dist/lib/geometry.d.ts +36 -0
- package/dist/lib/geometry.d.ts.map +1 -0
- package/dist/lib/geometry.js +89 -0
- package/dist/lib/geometry.js.map +1 -0
- package/package.json +40 -0
- package/src/geometries/box-geometry.ts +70 -0
- package/src/geometries/capsule-geometry.ts +120 -0
- package/src/geometries/cylinder-geometry.ts +41 -0
- package/src/geometries/geometry-helpers.ts +34 -0
- package/src/geometries/ico-sphere-geometry.ts +96 -0
- package/src/geometries/plane-geometry.ts +64 -0
- package/src/geometries/sphere-geometry.ts +42 -0
- package/src/geometries/surface-of-revolution.ts +43 -0
- package/src/geometries/truncated-cone-geometry.ts +129 -0
- package/src/index.ts +28 -0
- package/src/lib/geometry-utils.ts +35 -0
- package/src/lib/geometry.ts +140 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// math.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Geometry } from "../lib/geometry.js";
|
|
5
|
+
import { assertPositive, assertSegments, makeIndices } from "./geometry-helpers.js";
|
|
6
|
+
/** Tessellates a finite glTF plane in XZ with its front face and normal pointing +Y. */
|
|
7
|
+
export class PlaneGeometry extends Geometry {
|
|
8
|
+
constructor(props) {
|
|
9
|
+
const { sizeX, sizeZ, nx = 1, nz = 1 } = props;
|
|
10
|
+
assertPositive(sizeX, 'sizeX');
|
|
11
|
+
assertPositive(sizeZ, 'sizeZ');
|
|
12
|
+
assertSegments(nx, 'nx');
|
|
13
|
+
assertSegments(nz, 'nz');
|
|
14
|
+
const positions = [];
|
|
15
|
+
const normals = [];
|
|
16
|
+
const texCoords = [];
|
|
17
|
+
const indexValues = [];
|
|
18
|
+
for (let z = 0; z <= nz; z++) {
|
|
19
|
+
const v = z / nz;
|
|
20
|
+
for (let x = 0; x <= nx; x++) {
|
|
21
|
+
const u = x / nx;
|
|
22
|
+
positions.push((u - 0.5) * sizeX, 0, (0.5 - v) * sizeZ);
|
|
23
|
+
normals.push(0, 1, 0);
|
|
24
|
+
texCoords.push(u, v);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const stride = nx + 1;
|
|
28
|
+
for (let z = 0; z < nz; z++) {
|
|
29
|
+
for (let x = 0; x < nx; x++) {
|
|
30
|
+
const a = z * stride + x;
|
|
31
|
+
const b = a + 1;
|
|
32
|
+
const c = a + stride;
|
|
33
|
+
const d = c + 1;
|
|
34
|
+
indexValues.push(a, b, d, a, d, c);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const vertexCount = positions.length / 3;
|
|
38
|
+
super({
|
|
39
|
+
id: props.id,
|
|
40
|
+
topology: 'triangle-list',
|
|
41
|
+
indices: makeIndices(vertexCount, indexValues),
|
|
42
|
+
attributes: {
|
|
43
|
+
POSITION: { size: 3, value: new Float32Array(positions) },
|
|
44
|
+
NORMAL: { size: 3, value: new Float32Array(normals) },
|
|
45
|
+
TEXCOORD_0: { size: 2, value: new Float32Array(texCoords) },
|
|
46
|
+
...props.attributes
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=plane-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plane-geometry.js","sourceRoot":"","sources":["../../src/geometries/plane-geometry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Geometry } from "../lib/geometry.js";
|
|
2
|
+
import { type PrimitiveGeometryProps } from "./geometry-helpers.js";
|
|
3
|
+
export type SphereGeometryProps = PrimitiveGeometryProps & {
|
|
4
|
+
radius?: number;
|
|
5
|
+
nlat?: number;
|
|
6
|
+
nlong?: number;
|
|
7
|
+
};
|
|
8
|
+
/** Tessellates the glTF sphere shape. */
|
|
9
|
+
export declare class SphereGeometry extends Geometry {
|
|
10
|
+
constructor(props?: SphereGeometryProps);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=sphere-geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sphere-geometry.d.ts","sourceRoot":"","sources":["../../src/geometries/sphere-geometry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,QAAQ,EAAC,2BAAwB;AACzC,OAAO,EAAiC,KAAK,sBAAsB,EAAC,8BAA2B;AAG/F,MAAM,MAAM,mBAAmB,GAAG,sBAAsB,GAAG;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,yCAAyC;AACzC,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,KAAK,GAAE,mBAAwB;CAyB5C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// math.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Geometry } from "../lib/geometry.js";
|
|
5
|
+
import { assertPositive, assertSegments } from "./geometry-helpers.js";
|
|
6
|
+
import { makeSurfaceOfRevolution } from "./surface-of-revolution.js";
|
|
7
|
+
/** Tessellates the glTF sphere shape. */
|
|
8
|
+
export class SphereGeometry extends Geometry {
|
|
9
|
+
constructor(props = {}) {
|
|
10
|
+
const { radius = 0.5, nlat = 10, nlong = 10 } = props;
|
|
11
|
+
assertPositive(radius, 'radius');
|
|
12
|
+
assertSegments(nlat, 'nlat', 2);
|
|
13
|
+
assertSegments(nlong, 'nlong', 3);
|
|
14
|
+
const rings = [];
|
|
15
|
+
for (let latitude = 0; latitude <= nlat; latitude++) {
|
|
16
|
+
const angle = -Math.PI / 2 + (latitude / nlat) * Math.PI;
|
|
17
|
+
const normalRadius = Math.cos(angle);
|
|
18
|
+
const normalY = Math.sin(angle);
|
|
19
|
+
rings.push({ radius: radius * normalRadius, y: radius * normalY, normalRadius, normalY });
|
|
20
|
+
}
|
|
21
|
+
const mesh = makeSurfaceOfRevolution(rings, nlong);
|
|
22
|
+
super({
|
|
23
|
+
id: props.id,
|
|
24
|
+
topology: 'triangle-list',
|
|
25
|
+
indices: mesh.indexArray,
|
|
26
|
+
attributes: {
|
|
27
|
+
POSITION: { size: 3, value: new Float32Array(mesh.positions) },
|
|
28
|
+
NORMAL: { size: 3, value: new Float32Array(mesh.normals) },
|
|
29
|
+
TEXCOORD_0: { size: 2, value: new Float32Array(mesh.texCoords) },
|
|
30
|
+
...props.attributes
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=sphere-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sphere-geometry.js","sourceRoot":"","sources":["../../src/geometries/sphere-geometry.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,QAAQ,EAAC,2BAAwB;AACzC,OAAO,EAAC,cAAc,EAAE,cAAc,EAA8B,8BAA2B;AAC/F,OAAO,EAAC,uBAAuB,EAAmB,mCAAgC;AAQlF,yCAAyC;AACzC,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,QAA6B,EAAE;QACzC,MAAM,EAAC,MAAM,GAAG,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAC,GAAG,KAAK,CAAC;QACpD,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACjC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAChC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAE,QAAQ,IAAI,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;YACzD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,YAAY,EAAE,OAAO,EAAC,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,KAAK,CAAC;YACJ,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,QAAQ,EAAE,eAAe;YACzB,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,UAAU,EAAE;gBACV,QAAQ,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC;gBAC5D,MAAM,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAC;gBACxD,UAAU,EAAE,EAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC;gBAC9D,GAAG,KAAK,CAAC,UAAU;aACpB;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type MeshData } from "./geometry-helpers.js";
|
|
2
|
+
export type ProfileRing = {
|
|
3
|
+
radius: number;
|
|
4
|
+
y: number;
|
|
5
|
+
normalRadius: number;
|
|
6
|
+
normalY: number;
|
|
7
|
+
};
|
|
8
|
+
export declare function makeSurfaceOfRevolution(rings: ProfileRing[], nradial: number): MeshData & {
|
|
9
|
+
indexArray: Uint16Array | Uint32Array;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=surface-of-revolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-of-revolution.d.ts","sourceRoot":"","sources":["../../src/geometries/surface-of-revolution.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,QAAQ,EAAC,8BAA2B;AAE9D,MAAM,MAAM,WAAW,GAAG;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC;AAE7F,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAAE,EACpB,OAAO,EAAE,MAAM,GACd,QAAQ,GAAG;IAAC,UAAU,EAAE,WAAW,GAAG,WAAW,CAAA;CAAC,CA+BpD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// math.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { makeIndices } from "./geometry-helpers.js";
|
|
5
|
+
export function makeSurfaceOfRevolution(rings, nradial) {
|
|
6
|
+
const positions = [];
|
|
7
|
+
const normals = [];
|
|
8
|
+
const texCoords = [];
|
|
9
|
+
const indices = [];
|
|
10
|
+
const stride = nradial + 1;
|
|
11
|
+
for (let ringIndex = 0; ringIndex < rings.length; ringIndex++) {
|
|
12
|
+
const ring = rings[ringIndex];
|
|
13
|
+
for (let radial = 0; radial <= nradial; radial++) {
|
|
14
|
+
const u = radial / nradial;
|
|
15
|
+
const angle = u * Math.PI * 2;
|
|
16
|
+
const sin = Math.sin(angle);
|
|
17
|
+
const cos = Math.cos(angle);
|
|
18
|
+
positions.push(sin * ring.radius, ring.y, cos * ring.radius);
|
|
19
|
+
normals.push(sin * ring.normalRadius, ring.normalY, cos * ring.normalRadius);
|
|
20
|
+
texCoords.push(u, ringIndex / (rings.length - 1));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
for (let ring = 0; ring < rings.length - 1; ring++) {
|
|
24
|
+
for (let radial = 0; radial < nradial; radial++) {
|
|
25
|
+
const a = ring * stride + radial;
|
|
26
|
+
const b = a + 1;
|
|
27
|
+
const c = a + stride;
|
|
28
|
+
const d = c + 1;
|
|
29
|
+
indices.push(a, b, d, a, d, c);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
...{ positions, normals, texCoords, indices },
|
|
34
|
+
indexArray: makeIndices(positions.length / 3, indices)
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=surface-of-revolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"surface-of-revolution.js","sourceRoot":"","sources":["../../src/geometries/surface-of-revolution.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAEpC,OAAO,EAAC,WAAW,EAAgB,8BAA2B;AAI9D,MAAM,UAAU,uBAAuB,CACrC,KAAoB,EACpB,OAAe;IAEf,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;IAC3B,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9B,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YACjD,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5B,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;YAC7E,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACnD,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC;YAChD,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,OAAO;QACL,GAAG,EAAC,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAC;QAC3C,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC;KACvD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Geometry } from "../lib/geometry.js";
|
|
2
|
+
import { type PrimitiveGeometryProps } from "./geometry-helpers.js";
|
|
3
|
+
export type TruncatedConeGeometryProps = PrimitiveGeometryProps & {
|
|
4
|
+
topRadius?: number;
|
|
5
|
+
bottomRadius?: number;
|
|
6
|
+
topCap?: boolean;
|
|
7
|
+
bottomCap?: boolean;
|
|
8
|
+
height?: number;
|
|
9
|
+
nradial?: number;
|
|
10
|
+
nvertical?: number;
|
|
11
|
+
verticalAxis?: 'x' | 'y' | 'z';
|
|
12
|
+
};
|
|
13
|
+
/** General truncated cone primitive, adapted from luma.gl's CPU tessellator. */
|
|
14
|
+
export declare class TruncatedConeGeometry extends Geometry {
|
|
15
|
+
constructor(props?: TruncatedConeGeometryProps);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=truncated-cone-geometry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncated-cone-geometry.d.ts","sourceRoot":"","sources":["../../src/geometries/truncated-cone-geometry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAC,QAAQ,EAAC,2BAAwB;AACzC,OAAO,EAKL,KAAK,sBAAsB,EAC5B,8BAA2B;AAE5B,MAAM,MAAM,0BAA0B,GAAG,sBAAsB,GAAG;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;CAChC,CAAC;AAEF,gFAAgF;AAChF,qBAAa,qBAAsB,SAAQ,QAAQ;gBACrC,KAAK,GAAE,0BAA+B;CA2FnD"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// math.gl
|
|
2
|
+
// SPDX-License-Identifier: MIT
|
|
3
|
+
// Copyright (c) vis.gl contributors
|
|
4
|
+
import { Geometry } from "../lib/geometry.js";
|
|
5
|
+
import { assertNonNegative, assertPositive, assertSegments, makeIndices } from "./geometry-helpers.js";
|
|
6
|
+
/** General truncated cone primitive, adapted from luma.gl's CPU tessellator. */
|
|
7
|
+
export class TruncatedConeGeometry extends Geometry {
|
|
8
|
+
constructor(props = {}) {
|
|
9
|
+
const { topRadius = 0, bottomRadius = 0, topCap = false, bottomCap = false, height = 1, nradial = 10, nvertical = 1, verticalAxis = 'y' } = props;
|
|
10
|
+
assertNonNegative(topRadius, 'topRadius');
|
|
11
|
+
assertNonNegative(bottomRadius, 'bottomRadius');
|
|
12
|
+
if (topRadius === 0 && bottomRadius === 0)
|
|
13
|
+
throw new Error('At least one radius must be greater than zero');
|
|
14
|
+
assertPositive(height, 'height');
|
|
15
|
+
assertSegments(nradial, 'nradial', 3);
|
|
16
|
+
assertSegments(nvertical, 'nvertical');
|
|
17
|
+
const positions = [];
|
|
18
|
+
const normals = [];
|
|
19
|
+
const texCoords = [];
|
|
20
|
+
const indices = [];
|
|
21
|
+
const stride = nradial + 1;
|
|
22
|
+
const slope = (bottomRadius - topRadius) / height;
|
|
23
|
+
const normalScale = 1 / Math.hypot(1, slope);
|
|
24
|
+
const addRing = (radius, y, normalRadius, normalY, v) => {
|
|
25
|
+
const ring = positions.length / 3 / stride;
|
|
26
|
+
for (let radial = 0; radial <= nradial; radial++) {
|
|
27
|
+
const u = radial / nradial;
|
|
28
|
+
const angle = u * Math.PI * 2;
|
|
29
|
+
const sin = Math.sin(angle);
|
|
30
|
+
const cos = Math.cos(angle);
|
|
31
|
+
const point = orient([sin * radius, y, cos * radius], verticalAxis);
|
|
32
|
+
const normal = orient([sin * normalRadius, normalY, cos * normalRadius], verticalAxis);
|
|
33
|
+
positions.push(...point);
|
|
34
|
+
normals.push(...normal);
|
|
35
|
+
texCoords.push(u, v);
|
|
36
|
+
}
|
|
37
|
+
return ring;
|
|
38
|
+
};
|
|
39
|
+
const connect = (lower, upper) => {
|
|
40
|
+
for (let radial = 0; radial < nradial; radial++) {
|
|
41
|
+
const a = lower * stride + radial;
|
|
42
|
+
const b = a + 1;
|
|
43
|
+
const c = upper * stride + radial;
|
|
44
|
+
const d = c + 1;
|
|
45
|
+
indices.push(a, b, d, a, d, c);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
let previous;
|
|
49
|
+
if (bottomCap) {
|
|
50
|
+
const center = addRing(0, -height / 2, 0, -1, 0);
|
|
51
|
+
const edge = addRing(bottomRadius, -height / 2, 0, -1, 1);
|
|
52
|
+
connect(center, edge);
|
|
53
|
+
previous = addRing(bottomRadius, -height / 2, normalScale, slope * normalScale, 0);
|
|
54
|
+
}
|
|
55
|
+
for (let vertical = 0; vertical <= nvertical; vertical++) {
|
|
56
|
+
const v = vertical / nvertical;
|
|
57
|
+
const radius = bottomRadius + (topRadius - bottomRadius) * v;
|
|
58
|
+
const ring = addRing(radius, (v - 0.5) * height, normalScale, slope * normalScale, v);
|
|
59
|
+
if (previous !== undefined && !(bottomCap && vertical === 0))
|
|
60
|
+
connect(previous, ring);
|
|
61
|
+
previous = ring;
|
|
62
|
+
}
|
|
63
|
+
if (topCap && previous !== undefined) {
|
|
64
|
+
const edge = addRing(topRadius, height / 2, 0, 1, 1);
|
|
65
|
+
const center = addRing(0, height / 2, 0, 1, 0);
|
|
66
|
+
connect(edge, center);
|
|
67
|
+
}
|
|
68
|
+
const vertexCount = positions.length / 3;
|
|
69
|
+
super({
|
|
70
|
+
id: props.id,
|
|
71
|
+
topology: 'triangle-list',
|
|
72
|
+
indices: makeIndices(vertexCount, indices),
|
|
73
|
+
attributes: {
|
|
74
|
+
POSITION: { size: 3, value: new Float32Array(positions) },
|
|
75
|
+
NORMAL: { size: 3, value: new Float32Array(normals) },
|
|
76
|
+
TEXCOORD_0: { size: 2, value: new Float32Array(texCoords) },
|
|
77
|
+
...props.attributes
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function orient(vector, axis) {
|
|
83
|
+
switch (axis) {
|
|
84
|
+
case 'x':
|
|
85
|
+
return [vector[1], vector[2], vector[0]];
|
|
86
|
+
case 'z':
|
|
87
|
+
return [vector[2], vector[0], vector[1]];
|
|
88
|
+
default:
|
|
89
|
+
return [vector[0], vector[1], vector[2]];
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=truncated-cone-geometry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"truncated-cone-geometry.js","sourceRoot":"","sources":["../../src/geometries/truncated-cone-geometry.ts"],"names":[],"mappings":"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"}
|