poly-extrude 0.13.0 → 0.14.0
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/dist/cylinder.d.ts +11 -0
- package/{src → dist}/cylinder.js +108 -111
- package/dist/cylinder.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/math/Curve.d.ts +41 -0
- package/dist/math/Curve.js +142 -0
- package/dist/math/Curve.js.map +1 -0
- package/dist/math/Interpolations.d.ts +8 -0
- package/dist/math/Interpolations.js +48 -0
- package/dist/math/Interpolations.js.map +1 -0
- package/dist/math/Matrix4.d.ts +8 -0
- package/dist/math/Matrix4.js +582 -0
- package/dist/math/Matrix4.js.map +1 -0
- package/dist/math/QuadraticBezierCurve3.d.ts +10 -0
- package/dist/math/QuadraticBezierCurve3.js +22 -0
- package/dist/math/QuadraticBezierCurve3.js.map +1 -0
- package/dist/math/Quaternion.d.ts +46 -0
- package/dist/math/Quaternion.js +415 -0
- package/dist/math/Quaternion.js.map +1 -0
- package/dist/math/Vector3.d.ts +42 -0
- package/dist/math/Vector3.js +403 -0
- package/dist/math/Vector3.js.map +1 -0
- package/dist/path/PathPoint.d.ts +15 -0
- package/dist/path/PathPoint.js +35 -0
- package/dist/path/PathPoint.js.map +1 -0
- package/dist/path/PathPointList.d.ts +27 -0
- package/dist/path/PathPointList.js +212 -0
- package/dist/path/PathPointList.js.map +1 -0
- package/dist/path.d.ts +11 -0
- package/{src → dist}/path.js +334 -360
- package/dist/path.js.map +1 -0
- package/dist/plane.d.ts +2 -0
- package/{src → dist}/plane.js +57 -58
- package/dist/plane.js.map +1 -0
- package/dist/poly-extrude.js +1286 -1581
- package/dist/poly-extrude.js.map +1 -1
- package/dist/poly-extrude.min.js +2 -2
- package/dist/poly-extrude.mjs +1286 -1581
- package/dist/poly-extrude.mjs.map +1 -0
- package/dist/polygon.d.ts +9 -0
- package/{src → dist}/polygon.js +163 -179
- package/dist/polygon.js.map +1 -0
- package/dist/polyline.d.ts +24 -0
- package/{src → dist}/polyline.js +420 -456
- package/dist/polyline.js.map +1 -0
- package/dist/tube.d.ts +12 -0
- package/{src → dist}/tube.js +124 -142
- package/dist/tube.js.map +1 -0
- package/dist/type.d.ts +9 -0
- package/dist/type.js +2 -0
- package/dist/type.js.map +1 -0
- package/dist/util.d.ts +20 -0
- package/dist/util.js +217 -0
- package/dist/util.js.map +1 -0
- package/package.json +53 -48
- package/readme.md +12 -2
- package/src/cylinder.ts +124 -0
- package/src/index.ts +7 -0
- package/src/path.ts +385 -0
- package/src/plane.ts +60 -0
- package/src/polygon.ts +189 -0
- package/src/polyline.ts +473 -0
- package/src/tube.ts +155 -0
- package/src/type.ts +9 -0
- package/src/{util.js → util.ts} +1 -1
- package/index.js +0 -7
package/dist/poly-extrude.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* poly-extrude v0.
|
2
|
+
* poly-extrude v0.14.0
|
3
3
|
*/
|
4
4
|
(function (global, factory) {
|
5
5
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
@@ -1752,1157 +1752,896 @@
|
|
1752
1752
|
return Vector3;
|
1753
1753
|
}();
|
1754
1754
|
|
1755
|
-
/**
|
1756
|
-
* https://github.com/Turfjs/turf/blob/master/packages/turf-boolean-clockwise/index.ts
|
1757
|
-
* @param {*} ring
|
1758
|
-
* @returns
|
1755
|
+
/**
|
1756
|
+
* https://github.com/Turfjs/turf/blob/master/packages/turf-boolean-clockwise/index.ts
|
1757
|
+
* @param {*} ring
|
1758
|
+
* @returns
|
1759
1759
|
*/
|
1760
|
-
|
1761
1760
|
function isClockwise(ring) {
|
1762
|
-
|
1763
|
-
|
1764
|
-
|
1765
|
-
|
1766
|
-
|
1767
|
-
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1772
|
-
|
1773
|
-
|
1774
|
-
|
1775
|
-
return sum > 0;
|
1761
|
+
let sum = 0;
|
1762
|
+
let i = 1;
|
1763
|
+
let prev;
|
1764
|
+
let cur;
|
1765
|
+
const len = ring.length;
|
1766
|
+
while (i < len) {
|
1767
|
+
prev = cur || ring[0];
|
1768
|
+
cur = ring[i];
|
1769
|
+
sum += (cur[0] - prev[0]) * (cur[1] + prev[1]);
|
1770
|
+
i++;
|
1771
|
+
}
|
1772
|
+
return sum > 0;
|
1776
1773
|
}
|
1777
|
-
|
1778
1774
|
function v3Sub(out, v1, v2) {
|
1779
|
-
|
1780
|
-
|
1781
|
-
|
1782
|
-
|
1775
|
+
out[0] = v1[0] - v2[0];
|
1776
|
+
out[1] = v1[1] - v2[1];
|
1777
|
+
out[2] = v1[2] - v2[2];
|
1778
|
+
return out;
|
1783
1779
|
}
|
1784
|
-
|
1785
1780
|
function v3Normalize(out, v) {
|
1786
|
-
|
1787
|
-
|
1788
|
-
|
1789
|
-
|
1790
|
-
|
1791
|
-
|
1792
|
-
|
1793
|
-
|
1781
|
+
const x = v[0];
|
1782
|
+
const y = v[1];
|
1783
|
+
const z = v[2];
|
1784
|
+
const d = Math.sqrt(x * x + y * y + z * z) || 1;
|
1785
|
+
out[0] = x / d;
|
1786
|
+
out[1] = y / d;
|
1787
|
+
out[2] = z / d;
|
1788
|
+
return out;
|
1794
1789
|
}
|
1795
|
-
|
1796
1790
|
function v3Cross(out, v1, v2) {
|
1797
|
-
|
1798
|
-
|
1799
|
-
|
1800
|
-
|
1801
|
-
|
1802
|
-
bz = v2[2];
|
1803
|
-
out[0] = ay * bz - az * by;
|
1804
|
-
out[1] = az * bx - ax * bz;
|
1805
|
-
out[2] = ax * by - ay * bx;
|
1806
|
-
return out;
|
1791
|
+
const ax = v1[0], ay = v1[1], az = v1[2], bx = v2[0], by = v2[1], bz = v2[2];
|
1792
|
+
out[0] = ay * bz - az * by;
|
1793
|
+
out[1] = az * bx - ax * bz;
|
1794
|
+
out[2] = ax * by - ay * bx;
|
1795
|
+
return out;
|
1807
1796
|
}
|
1808
|
-
|
1809
1797
|
function generateNormal(indices, position) {
|
1810
|
-
|
1811
|
-
|
1812
|
-
|
1813
|
-
|
1814
|
-
}
|
1815
|
-
|
1816
|
-
var p1 = [];
|
1817
|
-
var p2 = [];
|
1818
|
-
var p3 = [];
|
1819
|
-
var v21 = [];
|
1820
|
-
var v32 = [];
|
1821
|
-
var n = [];
|
1822
|
-
var len = indices.length;
|
1823
|
-
var normals = new Float32Array(position.length);
|
1824
|
-
var f = 0;
|
1825
|
-
|
1826
|
-
while (f < len) {
|
1827
|
-
// const i1 = indices[f++] * 3;
|
1828
|
-
// const i2 = indices[f++] * 3;
|
1829
|
-
// const i3 = indices[f++] * 3;
|
1830
|
-
// const i1 = indices[f];
|
1831
|
-
// const i2 = indices[f + 1];
|
1832
|
-
// const i3 = indices[f + 2];
|
1833
|
-
var a = indices[f],
|
1834
|
-
b = indices[f + 1],
|
1835
|
-
c = indices[f + 2];
|
1836
|
-
var i1 = a * 3,
|
1837
|
-
i2 = b * 3,
|
1838
|
-
i3 = c * 3;
|
1839
|
-
v3Set(p1, position[i1], position[i1 + 1], position[i1 + 2]);
|
1840
|
-
v3Set(p2, position[i2], position[i2 + 1], position[i2 + 2]);
|
1841
|
-
v3Set(p3, position[i3], position[i3 + 1], position[i3 + 2]);
|
1842
|
-
v3Sub(v32, p3, p2);
|
1843
|
-
v3Sub(v21, p1, p2);
|
1844
|
-
v3Cross(n, v32, v21); // Already be weighted by the triangle area
|
1845
|
-
|
1846
|
-
for (var _i = 0; _i < 3; _i++) {
|
1847
|
-
normals[i1 + _i] += n[_i];
|
1848
|
-
normals[i2 + _i] += n[_i];
|
1849
|
-
normals[i3 + _i] += n[_i];
|
1798
|
+
function v3Set(p, a, b, c) {
|
1799
|
+
p[0] = a;
|
1800
|
+
p[1] = b;
|
1801
|
+
p[2] = c;
|
1850
1802
|
}
|
1851
|
-
|
1852
|
-
|
1853
|
-
|
1854
|
-
|
1855
|
-
|
1856
|
-
|
1857
|
-
|
1858
|
-
|
1859
|
-
|
1860
|
-
|
1861
|
-
|
1862
|
-
|
1863
|
-
|
1864
|
-
|
1865
|
-
|
1866
|
-
|
1867
|
-
|
1803
|
+
const p1 = [];
|
1804
|
+
const p2 = [];
|
1805
|
+
const p3 = [];
|
1806
|
+
const v21 = [];
|
1807
|
+
const v32 = [];
|
1808
|
+
const n = [];
|
1809
|
+
const len = indices.length;
|
1810
|
+
const normals = new Float32Array(position.length);
|
1811
|
+
let f = 0;
|
1812
|
+
while (f < len) {
|
1813
|
+
// const i1 = indices[f++] * 3;
|
1814
|
+
// const i2 = indices[f++] * 3;
|
1815
|
+
// const i3 = indices[f++] * 3;
|
1816
|
+
// const i1 = indices[f];
|
1817
|
+
// const i2 = indices[f + 1];
|
1818
|
+
// const i3 = indices[f + 2];
|
1819
|
+
const a = indices[f], b = indices[f + 1], c = indices[f + 2];
|
1820
|
+
const i1 = a * 3, i2 = b * 3, i3 = c * 3;
|
1821
|
+
v3Set(p1, position[i1], position[i1 + 1], position[i1 + 2]);
|
1822
|
+
v3Set(p2, position[i2], position[i2 + 1], position[i2 + 2]);
|
1823
|
+
v3Set(p3, position[i3], position[i3 + 1], position[i3 + 2]);
|
1824
|
+
v3Sub(v32, p3, p2);
|
1825
|
+
v3Sub(v21, p1, p2);
|
1826
|
+
v3Cross(n, v32, v21);
|
1827
|
+
// Already be weighted by the triangle area
|
1828
|
+
for (let i = 0; i < 3; i++) {
|
1829
|
+
normals[i1 + i] += n[i];
|
1830
|
+
normals[i2 + i] += n[i];
|
1831
|
+
normals[i3 + i] += n[i];
|
1832
|
+
}
|
1833
|
+
f += 3;
|
1834
|
+
}
|
1835
|
+
let i = 0;
|
1836
|
+
const l = normals.length;
|
1837
|
+
while (i < l) {
|
1838
|
+
v3Set(n, normals[i], normals[i + 1], normals[i + 2]);
|
1839
|
+
v3Normalize(n, n);
|
1840
|
+
normals[i] = n[0] || 0;
|
1841
|
+
normals[i + 1] = n[1] || 0;
|
1842
|
+
normals[i + 2] = n[2] || 0;
|
1843
|
+
i += 3;
|
1844
|
+
}
|
1845
|
+
return normals;
|
1868
1846
|
}
|
1869
1847
|
function merge(results) {
|
1870
|
-
|
1871
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
|
1875
|
-
|
1876
|
-
|
1848
|
+
if (results.length === 1) {
|
1849
|
+
const result = {
|
1850
|
+
position: results[0].position,
|
1851
|
+
normal: results[0].normal,
|
1852
|
+
uv: results[0].uv,
|
1853
|
+
indices: results[0].indices,
|
1854
|
+
results
|
1855
|
+
};
|
1856
|
+
return result;
|
1857
|
+
}
|
1858
|
+
let plen = 0, ilen = 0;
|
1859
|
+
for (let i = 0, len = results.length; i < len; i++) {
|
1860
|
+
const { position, indices } = results[i];
|
1861
|
+
plen += position.length;
|
1862
|
+
ilen += indices.length;
|
1863
|
+
}
|
1864
|
+
const result = {
|
1865
|
+
position: new Float32Array(plen),
|
1866
|
+
normal: new Float32Array(plen),
|
1867
|
+
uv: new Float32Array(plen / 3 * 2),
|
1868
|
+
indices: new Uint32Array(ilen),
|
1869
|
+
results
|
1877
1870
|
};
|
1878
|
-
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1882
|
-
|
1883
|
-
|
1884
|
-
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1888
|
-
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1892
|
-
|
1893
|
-
|
1894
|
-
|
1895
|
-
uv: new Float32Array(plen / 3 * 2),
|
1896
|
-
indices: new Uint32Array(ilen),
|
1897
|
-
results: results
|
1898
|
-
};
|
1899
|
-
var pOffset = 0,
|
1900
|
-
pCount = 0,
|
1901
|
-
iIdx = 0,
|
1902
|
-
uvOffset = 0;
|
1903
|
-
|
1904
|
-
for (var _i2 = 0, _len = results.length; _i2 < _len; _i2++) {
|
1905
|
-
var _results$_i = results[_i2],
|
1906
|
-
_position = _results$_i.position,
|
1907
|
-
_indices = _results$_i.indices,
|
1908
|
-
normal = _results$_i.normal,
|
1909
|
-
uv = _results$_i.uv;
|
1910
|
-
result.position.set(_position, pOffset);
|
1911
|
-
result.normal.set(normal, pOffset);
|
1912
|
-
result.uv.set(uv, uvOffset);
|
1913
|
-
var j = 0;
|
1914
|
-
var len1 = _indices.length;
|
1915
|
-
|
1916
|
-
while (j < len1) {
|
1917
|
-
var pIndex = _indices[j] + pCount;
|
1918
|
-
result.indices[iIdx] = pIndex;
|
1919
|
-
iIdx++;
|
1920
|
-
j++;
|
1871
|
+
let pOffset = 0, pCount = 0, iIdx = 0, uvOffset = 0;
|
1872
|
+
for (let i = 0, len = results.length; i < len; i++) {
|
1873
|
+
const { position, indices, normal, uv } = results[i];
|
1874
|
+
result.position.set(position, pOffset);
|
1875
|
+
result.normal.set(normal, pOffset);
|
1876
|
+
result.uv.set(uv, uvOffset);
|
1877
|
+
let j = 0;
|
1878
|
+
const len1 = indices.length;
|
1879
|
+
while (j < len1) {
|
1880
|
+
const pIndex = indices[j] + pCount;
|
1881
|
+
result.indices[iIdx] = pIndex;
|
1882
|
+
iIdx++;
|
1883
|
+
j++;
|
1884
|
+
}
|
1885
|
+
uvOffset += uv.length;
|
1886
|
+
pOffset += position.length;
|
1887
|
+
pCount += position.length / 3;
|
1921
1888
|
}
|
1922
|
-
|
1923
|
-
uvOffset += uv.length;
|
1924
|
-
pOffset += _position.length;
|
1925
|
-
pCount += _position.length / 3;
|
1926
|
-
}
|
1927
|
-
|
1928
|
-
return result;
|
1889
|
+
return result;
|
1929
1890
|
}
|
1930
1891
|
function radToDeg(rad) {
|
1931
|
-
|
1892
|
+
return rad * 180 / Math.PI;
|
1932
1893
|
}
|
1933
1894
|
function degToRad(angle) {
|
1934
|
-
|
1935
|
-
}
|
1936
|
-
|
1895
|
+
return angle / 180 * Math.PI;
|
1896
|
+
}
|
1897
|
+
// https://github.com/mrdoob/three.js/blob/16f13e3b07e31d0e9a00df7c3366bbe0e464588c/src/geometries/ExtrudeGeometry.js?_pjax=%23js-repo-pjax-container#L736
|
1937
1898
|
function generateSideWallUV(uvs, vertices, indexA, indexB, indexC, indexD) {
|
1938
|
-
|
1939
|
-
|
1940
|
-
|
1941
|
-
|
1942
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
1946
|
-
|
1947
|
-
|
1948
|
-
|
1949
|
-
|
1950
|
-
|
1951
|
-
|
1952
|
-
|
1953
|
-
|
1954
|
-
|
1955
|
-
|
1956
|
-
|
1957
|
-
|
1958
|
-
|
1959
|
-
|
1960
|
-
|
1961
|
-
|
1962
|
-
|
1963
|
-
|
1964
|
-
|
1965
|
-
|
1966
|
-
|
1967
|
-
|
1968
|
-
|
1969
|
-
|
1970
|
-
|
1971
|
-
|
1972
|
-
|
1973
|
-
|
1974
|
-
|
1975
|
-
|
1976
|
-
|
1977
|
-
|
1978
|
-
|
1979
|
-
|
1980
|
-
}
|
1899
|
+
const idx1 = indexA * 3, idx2 = indexB * 3, idx3 = indexC * 3, idx4 = indexD * 3;
|
1900
|
+
const a_x = vertices[idx1];
|
1901
|
+
const a_y = vertices[idx1 + 1];
|
1902
|
+
const a_z = vertices[idx1 + 2];
|
1903
|
+
const b_x = vertices[idx2];
|
1904
|
+
const b_y = vertices[idx2 + 1];
|
1905
|
+
const b_z = vertices[idx2 + 2];
|
1906
|
+
const c_x = vertices[idx3];
|
1907
|
+
const c_y = vertices[idx3 + 1];
|
1908
|
+
const c_z = vertices[idx3 + 2];
|
1909
|
+
const d_x = vertices[idx4];
|
1910
|
+
const d_y = vertices[idx4 + 1];
|
1911
|
+
const d_z = vertices[idx4 + 2];
|
1912
|
+
let uIndex = uvs.length - 1;
|
1913
|
+
if (Math.abs(a_y - b_y) < Math.abs(a_x - b_x)) {
|
1914
|
+
uvs[++uIndex] = a_x;
|
1915
|
+
uvs[++uIndex] = 1 - a_z;
|
1916
|
+
uvs[++uIndex] = b_x;
|
1917
|
+
uvs[++uIndex] = 1 - b_z;
|
1918
|
+
uvs[++uIndex] = c_x;
|
1919
|
+
uvs[++uIndex] = 1 - c_z;
|
1920
|
+
uvs[++uIndex] = d_x;
|
1921
|
+
uvs[++uIndex] = 1 - d_z;
|
1922
|
+
// uvs.push(a_x, 1 - a_z);
|
1923
|
+
// uvs.push(b_x, 1 - b_z);
|
1924
|
+
// uvs.push(c_x, 1 - c_z);
|
1925
|
+
// uvs.push(d_x, 1 - d_z);
|
1926
|
+
}
|
1927
|
+
else {
|
1928
|
+
uvs[++uIndex] = a_y;
|
1929
|
+
uvs[++uIndex] = 1 - a_z;
|
1930
|
+
uvs[++uIndex] = b_y;
|
1931
|
+
uvs[++uIndex] = 1 - b_z;
|
1932
|
+
uvs[++uIndex] = c_y;
|
1933
|
+
uvs[++uIndex] = 1 - c_z;
|
1934
|
+
uvs[++uIndex] = d_y;
|
1935
|
+
uvs[++uIndex] = 1 - d_z;
|
1936
|
+
// uvs.push(a_y, 1 - a_z);
|
1937
|
+
// uvs.push(b_y, 1 - b_z);
|
1938
|
+
// uvs.push(c_y, 1 - c_z);
|
1939
|
+
// uvs.push(d_y, 1 - d_z);
|
1940
|
+
}
|
1981
1941
|
}
|
1982
1942
|
function line2Vectors(line) {
|
1983
|
-
|
1984
|
-
|
1985
|
-
|
1986
|
-
|
1987
|
-
|
1988
|
-
|
1989
|
-
|
1990
|
-
|
1991
|
-
points[i] = v;
|
1992
|
-
}
|
1993
|
-
|
1994
|
-
return points;
|
1943
|
+
const points = [];
|
1944
|
+
for (let i = 0, len = line.length; i < len; i++) {
|
1945
|
+
const p = line[i];
|
1946
|
+
const [x, y, z] = p;
|
1947
|
+
const v = new Vector3(x, y, z || 0);
|
1948
|
+
points[i] = v;
|
1949
|
+
}
|
1950
|
+
return points;
|
1995
1951
|
}
|
1996
1952
|
function calLineDistance(line) {
|
1997
|
-
|
1998
|
-
|
1999
|
-
|
2000
|
-
|
2001
|
-
|
2002
|
-
|
2003
|
-
|
2004
|
-
|
2005
|
-
|
2006
|
-
|
2007
|
-
|
2008
|
-
|
2009
|
-
|
2010
|
-
|
2011
|
-
var x2 = p2[0],
|
2012
|
-
y2 = p2[1],
|
2013
|
-
z2 = p2[2];
|
2014
|
-
var dx = x1 - x2,
|
2015
|
-
dy = y1 - y2,
|
2016
|
-
dz = (z1 || 0) - (z2 || 0);
|
2017
|
-
var dis = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
2018
|
-
distance += dis;
|
2019
|
-
p2.distance = distance;
|
1953
|
+
let distance = 0;
|
1954
|
+
for (let i = 0, len = line.length; i < len; i++) {
|
1955
|
+
const p1 = line[i], p2 = line[i + 1];
|
1956
|
+
if (i === 0) {
|
1957
|
+
p1.distance = 0;
|
1958
|
+
}
|
1959
|
+
if (p1 && p2) {
|
1960
|
+
const [x1, y1, z1] = p1;
|
1961
|
+
const [x2, y2, z2] = p2;
|
1962
|
+
const dx = x1 - x2, dy = y1 - y2, dz = (z1 || 0) - (z2 || 0);
|
1963
|
+
const dis = Math.sqrt(dx * dx + dy * dy + dz * dz);
|
1964
|
+
distance += dis;
|
1965
|
+
p2.distance = distance;
|
1966
|
+
}
|
2020
1967
|
}
|
2021
|
-
|
2022
|
-
|
2023
|
-
return distance;
|
1968
|
+
return distance;
|
2024
1969
|
}
|
2025
1970
|
|
2026
1971
|
function extrudePolygons(polygons, options) {
|
2027
|
-
|
2028
|
-
|
2029
|
-
|
2030
|
-
|
2031
|
-
|
2032
|
-
|
2033
|
-
|
2034
|
-
|
2035
|
-
|
2036
|
-
|
2037
|
-
|
1972
|
+
options = Object.assign({}, { depth: 2 }, options);
|
1973
|
+
const results = polygons.map(polygon => {
|
1974
|
+
for (let i = 0, len = polygon.length; i < len; i++) {
|
1975
|
+
const ring = polygon[i];
|
1976
|
+
validateRing(ring);
|
1977
|
+
if (i === 0) {
|
1978
|
+
if (!isClockwise(ring)) {
|
1979
|
+
polygon[i] = ring.reverse();
|
1980
|
+
}
|
1981
|
+
}
|
1982
|
+
else if (isClockwise(ring)) {
|
1983
|
+
polygon[i] = ring.reverse();
|
1984
|
+
}
|
1985
|
+
if (isClosedRing(ring)) {
|
1986
|
+
ring.splice(ring.length - 1, 1);
|
1987
|
+
}
|
2038
1988
|
}
|
2039
|
-
|
2040
|
-
polygon
|
2041
|
-
|
2042
|
-
|
2043
|
-
|
2044
|
-
|
2045
|
-
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
2049
|
-
|
2050
|
-
|
2051
|
-
|
2052
|
-
generateSides$1(result, options);
|
2053
|
-
result.position = new Float32Array(result.points);
|
2054
|
-
result.indices = new Uint32Array(result.indices);
|
2055
|
-
result.uv = new Float32Array(result.uv);
|
2056
|
-
result.normal = generateNormal(result.indices, result.position);
|
1989
|
+
const result = flatVertices(polygon, options);
|
1990
|
+
result.polygon = polygon;
|
1991
|
+
const triangles = earcut$1(result.flatVertices, result.holes, 2);
|
1992
|
+
generateTopAndBottom$1(result, triangles);
|
1993
|
+
generateSides$1(result, options);
|
1994
|
+
result.position = new Float32Array(result.points);
|
1995
|
+
result.indices = new Uint32Array(result.indices);
|
1996
|
+
result.uv = new Float32Array(result.uv);
|
1997
|
+
result.normal = generateNormal(result.indices, result.position);
|
1998
|
+
return result;
|
1999
|
+
});
|
2000
|
+
const result = merge(results);
|
2001
|
+
result.polygons = polygons;
|
2057
2002
|
return result;
|
2058
|
-
});
|
2059
|
-
var result = merge(results);
|
2060
|
-
result.polygons = polygons;
|
2061
|
-
return result;
|
2062
2003
|
}
|
2063
|
-
|
2064
2004
|
function generateTopAndBottom$1(result, triangles) {
|
2065
|
-
|
2066
|
-
|
2067
|
-
|
2068
|
-
|
2069
|
-
|
2070
|
-
|
2071
|
-
|
2072
|
-
|
2073
|
-
|
2074
|
-
|
2075
|
-
|
2076
|
-
|
2077
|
-
|
2078
|
-
|
2079
|
-
|
2080
|
-
|
2081
|
-
indices[idx] = a1;
|
2082
|
-
indices[idx + 1] = b1;
|
2083
|
-
indices[idx + 2] = c1;
|
2084
|
-
}
|
2085
|
-
|
2086
|
-
result.indices = indices;
|
2005
|
+
const indices = [];
|
2006
|
+
const { count } = result;
|
2007
|
+
for (let i = 0, len = triangles.length; i < len; i += 3) {
|
2008
|
+
// top
|
2009
|
+
const a = triangles[i], b = triangles[i + 1], c = triangles[i + 2];
|
2010
|
+
indices[i] = a;
|
2011
|
+
indices[i + 1] = b;
|
2012
|
+
indices[i + 2] = c;
|
2013
|
+
// bottom
|
2014
|
+
const idx = len + i;
|
2015
|
+
const a1 = count + a, b1 = count + b, c1 = count + c;
|
2016
|
+
indices[idx] = a1;
|
2017
|
+
indices[idx + 1] = b1;
|
2018
|
+
indices[idx + 2] = c1;
|
2019
|
+
}
|
2020
|
+
result.indices = indices;
|
2087
2021
|
}
|
2088
|
-
|
2089
2022
|
function generateSides$1(result, options) {
|
2090
|
-
|
2091
|
-
|
2092
|
-
|
2093
|
-
|
2094
|
-
|
2095
|
-
|
2096
|
-
|
2097
|
-
|
2098
|
-
|
2099
|
-
|
2100
|
-
|
2101
|
-
|
2102
|
-
|
2103
|
-
|
2104
|
-
|
2105
|
-
|
2106
|
-
|
2107
|
-
|
2108
|
-
|
2109
|
-
|
2110
|
-
|
2111
|
-
|
2112
|
-
|
2113
|
-
|
2114
|
-
|
2115
|
-
|
2116
|
-
|
2117
|
-
|
2118
|
-
|
2119
|
-
|
2120
|
-
|
2121
|
-
|
2122
|
-
|
2123
|
-
|
2124
|
-
|
2125
|
-
|
2126
|
-
|
2127
|
-
|
2128
|
-
|
2129
|
-
|
2130
|
-
|
2131
|
-
|
2132
|
-
b = idx + 3,
|
2133
|
-
c = idx,
|
2134
|
-
d = idx + 1; // points.push(p3, p4, p1, p2);
|
2135
|
-
// index.push(a, c, b, c, d, b);
|
2136
|
-
|
2137
|
-
indices[++iIndex] = a;
|
2138
|
-
indices[++iIndex] = c;
|
2139
|
-
indices[++iIndex] = b;
|
2140
|
-
indices[++iIndex] = c;
|
2141
|
-
indices[++iIndex] = d;
|
2142
|
-
indices[++iIndex] = b; // index.push(c, d, b);
|
2143
|
-
|
2144
|
-
generateSideWallUV(uv, points, a, b, c, d);
|
2145
|
-
j++;
|
2023
|
+
const { points, indices, polygon, uv } = result;
|
2024
|
+
const depth = options.depth;
|
2025
|
+
let pIndex = points.length - 1;
|
2026
|
+
let iIndex = indices.length - 1;
|
2027
|
+
for (let i = 0, len = polygon.length; i < len; i++) {
|
2028
|
+
const ring = polygon[i];
|
2029
|
+
let j = 0;
|
2030
|
+
const len1 = ring.length;
|
2031
|
+
while (j < len1) {
|
2032
|
+
const v1 = ring[j];
|
2033
|
+
let v2 = ring[j + 1];
|
2034
|
+
if (j === len1 - 1) {
|
2035
|
+
v2 = ring[0];
|
2036
|
+
}
|
2037
|
+
const idx = points.length / 3;
|
2038
|
+
const x1 = v1[0], y1 = v1[1], z1 = v1[2] || 0, x2 = v2[0], y2 = v2[1], z2 = v2[2] || 0;
|
2039
|
+
points[++pIndex] = x1;
|
2040
|
+
points[++pIndex] = y1;
|
2041
|
+
points[++pIndex] = z1 + depth;
|
2042
|
+
points[++pIndex] = x2;
|
2043
|
+
points[++pIndex] = y2;
|
2044
|
+
points[++pIndex] = z2 + depth;
|
2045
|
+
points[++pIndex] = x1;
|
2046
|
+
points[++pIndex] = y1;
|
2047
|
+
points[++pIndex] = z1;
|
2048
|
+
points[++pIndex] = x2;
|
2049
|
+
points[++pIndex] = y2;
|
2050
|
+
points[++pIndex] = z2;
|
2051
|
+
// points.push(x1, y1, z, x2, y2, z, x1, y1, 0, x2, y2, 0);
|
2052
|
+
const a = idx + 2, b = idx + 3, c = idx, d = idx + 1;
|
2053
|
+
// points.push(p3, p4, p1, p2);
|
2054
|
+
// index.push(a, c, b, c, d, b);
|
2055
|
+
indices[++iIndex] = a;
|
2056
|
+
indices[++iIndex] = c;
|
2057
|
+
indices[++iIndex] = b;
|
2058
|
+
indices[++iIndex] = c;
|
2059
|
+
indices[++iIndex] = d;
|
2060
|
+
indices[++iIndex] = b;
|
2061
|
+
// index.push(c, d, b);
|
2062
|
+
generateSideWallUV(uv, points, a, b, c, d);
|
2063
|
+
j++;
|
2064
|
+
}
|
2146
2065
|
}
|
2147
|
-
}
|
2148
2066
|
}
|
2149
|
-
|
2150
2067
|
function calPolygonPointsCount(polygon) {
|
2151
|
-
|
2152
|
-
|
2153
|
-
|
2154
|
-
|
2155
|
-
|
2156
|
-
|
2157
|
-
|
2158
|
-
|
2159
|
-
|
2160
|
-
return count;
|
2068
|
+
let count = 0;
|
2069
|
+
let i = 0;
|
2070
|
+
const len = polygon.length;
|
2071
|
+
while (i < len) {
|
2072
|
+
count += (polygon[i].length);
|
2073
|
+
i++;
|
2074
|
+
}
|
2075
|
+
return count;
|
2161
2076
|
}
|
2162
|
-
|
2163
2077
|
function flatVertices(polygon, options) {
|
2164
|
-
|
2165
|
-
|
2166
|
-
|
2167
|
-
|
2168
|
-
|
2169
|
-
|
2170
|
-
|
2171
|
-
|
2172
|
-
|
2173
|
-
|
2174
|
-
|
2175
|
-
|
2176
|
-
|
2177
|
-
|
2178
|
-
|
2179
|
-
|
2180
|
-
|
2181
|
-
|
2182
|
-
|
2183
|
-
|
2184
|
-
|
2185
|
-
|
2186
|
-
|
2187
|
-
|
2188
|
-
|
2189
|
-
|
2190
|
-
|
2191
|
-
|
2192
|
-
|
2193
|
-
|
2194
|
-
|
2195
|
-
|
2196
|
-
|
2197
|
-
|
2198
|
-
|
2199
|
-
points[pOffset + idx1] = x;
|
2200
|
-
points[pOffset + idx1 + 1] = y;
|
2201
|
-
points[pOffset + idx1 + 2] = z;
|
2202
|
-
uv[idx2] = x;
|
2203
|
-
uv[idx2 + 1] = y;
|
2204
|
-
uv[uOffset + idx2] = x;
|
2205
|
-
uv[uOffset + idx2 + 1] = y;
|
2206
|
-
idx1 += 3;
|
2207
|
-
idx2 += 2;
|
2208
|
-
j++;
|
2078
|
+
const count = calPolygonPointsCount(polygon);
|
2079
|
+
const len = polygon.length;
|
2080
|
+
const holes = [], flatVertices = new Float32Array(count * 2), points = [], uv = [];
|
2081
|
+
const pOffset = count * 3, uOffset = count * 2;
|
2082
|
+
const depth = options.depth;
|
2083
|
+
let idx0 = 0, idx1 = 0, idx2 = 0;
|
2084
|
+
for (let i = 0; i < len; i++) {
|
2085
|
+
const ring = polygon[i];
|
2086
|
+
if (i > 0) {
|
2087
|
+
holes.push(idx0 / 2);
|
2088
|
+
}
|
2089
|
+
let j = 0;
|
2090
|
+
const len1 = ring.length;
|
2091
|
+
while (j < len1) {
|
2092
|
+
const c = ring[j];
|
2093
|
+
const x = c[0], y = c[1], z = c[2] || 0;
|
2094
|
+
flatVertices[idx0++] = x;
|
2095
|
+
flatVertices[idx0++] = y;
|
2096
|
+
// top vertices
|
2097
|
+
points[idx1] = x;
|
2098
|
+
points[idx1 + 1] = y;
|
2099
|
+
points[idx1 + 2] = depth + z;
|
2100
|
+
// bottom vertices
|
2101
|
+
points[pOffset + idx1] = x;
|
2102
|
+
points[pOffset + idx1 + 1] = y;
|
2103
|
+
points[pOffset + idx1 + 2] = z;
|
2104
|
+
uv[idx2] = x;
|
2105
|
+
uv[idx2 + 1] = y;
|
2106
|
+
uv[uOffset + idx2] = x;
|
2107
|
+
uv[uOffset + idx2 + 1] = y;
|
2108
|
+
idx1 += 3;
|
2109
|
+
idx2 += 2;
|
2110
|
+
j++;
|
2111
|
+
}
|
2209
2112
|
}
|
2210
|
-
|
2211
|
-
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
2217
|
-
uv: uv
|
2218
|
-
};
|
2113
|
+
return {
|
2114
|
+
flatVertices,
|
2115
|
+
holes,
|
2116
|
+
points,
|
2117
|
+
count,
|
2118
|
+
uv
|
2119
|
+
};
|
2219
2120
|
}
|
2220
|
-
|
2221
2121
|
function validateRing(ring) {
|
2222
|
-
|
2223
|
-
|
2224
|
-
|
2122
|
+
if (!isClosedRing(ring)) {
|
2123
|
+
ring.push(ring[0]);
|
2124
|
+
}
|
2225
2125
|
}
|
2226
|
-
|
2227
2126
|
function isClosedRing(ring) {
|
2228
|
-
|
2229
|
-
|
2230
|
-
|
2231
|
-
y1 = _ring$[1],
|
2232
|
-
_ring = ring[len - 1],
|
2233
|
-
x2 = _ring[0],
|
2234
|
-
y2 = _ring[1];
|
2235
|
-
return x1 === x2 && y1 === y2;
|
2127
|
+
const len = ring.length;
|
2128
|
+
const [x1, y1] = ring[0], [x2, y2] = ring[len - 1];
|
2129
|
+
return (x1 === x2 && y1 === y2);
|
2236
2130
|
}
|
2237
2131
|
|
2238
2132
|
function checkOptions(options) {
|
2239
|
-
|
2240
|
-
|
2241
|
-
|
2133
|
+
options.lineWidth = Math.max(0, options.lineWidth);
|
2134
|
+
options.depth = Math.max(0, options.depth);
|
2135
|
+
options.sideDepth = Math.max(0, options.sideDepth);
|
2242
2136
|
}
|
2243
|
-
|
2244
2137
|
function extrudePolylines(lines, options) {
|
2245
|
-
|
2246
|
-
|
2247
|
-
|
2248
|
-
|
2249
|
-
|
2250
|
-
|
2251
|
-
|
2252
|
-
|
2253
|
-
|
2254
|
-
|
2255
|
-
|
2256
|
-
|
2257
|
-
|
2258
|
-
result
|
2259
|
-
result.
|
2260
|
-
result.normal = generateNormal(result.indices, result.position);
|
2138
|
+
options = Object.assign({}, { depth: 2, lineWidth: 1, bottomStickGround: false, pathUV: false }, options);
|
2139
|
+
checkOptions(options);
|
2140
|
+
const results = lines.map(line => {
|
2141
|
+
const result = expandLine(line, options);
|
2142
|
+
result.line = line;
|
2143
|
+
generateTopAndBottom(result, options);
|
2144
|
+
generateSides(result, options);
|
2145
|
+
result.position = new Float32Array(result.points);
|
2146
|
+
result.indices = new Uint32Array(result.indices);
|
2147
|
+
result.uv = new Float32Array(result.uv);
|
2148
|
+
result.normal = generateNormal(result.indices, result.position);
|
2149
|
+
return result;
|
2150
|
+
});
|
2151
|
+
const result = merge(results);
|
2152
|
+
result.lines = lines;
|
2261
2153
|
return result;
|
2262
|
-
});
|
2263
|
-
var result = merge(results);
|
2264
|
-
result.lines = lines;
|
2265
|
-
return result;
|
2266
2154
|
}
|
2267
2155
|
function extrudeSlopes(lines, options) {
|
2268
|
-
|
2269
|
-
|
2270
|
-
|
2271
|
-
|
2272
|
-
|
2273
|
-
|
2274
|
-
|
2275
|
-
|
2276
|
-
|
2277
|
-
|
2278
|
-
|
2279
|
-
|
2280
|
-
|
2281
|
-
|
2282
|
-
|
2283
|
-
|
2284
|
-
|
2285
|
-
|
2286
|
-
|
2287
|
-
|
2288
|
-
|
2289
|
-
|
2290
|
-
|
2291
|
-
|
2292
|
-
|
2293
|
-
|
2294
|
-
|
2295
|
-
|
2296
|
-
|
2297
|
-
|
2298
|
-
|
2299
|
-
|
2300
|
-
|
2301
|
-
result.leftPoints = line;
|
2302
|
-
result.rightPoints = rightPoints;
|
2303
|
-
depths = [depth, sideDepth];
|
2304
|
-
}
|
2305
|
-
|
2306
|
-
result.depths = depths;
|
2307
|
-
generateTopAndBottom(result, options);
|
2308
|
-
generateSides(result, options);
|
2309
|
-
result.position = new Float32Array(result.points);
|
2310
|
-
result.indices = new Uint32Array(result.indices);
|
2311
|
-
result.uv = new Float32Array(result.uv);
|
2312
|
-
result.normal = generateNormal(result.indices, result.position);
|
2156
|
+
options = Object.assign({}, { depth: 2, lineWidth: 1, side: 'left', sideDepth: 0, bottomStickGround: false, pathUV: false, isSlope: true }, options);
|
2157
|
+
checkOptions(options);
|
2158
|
+
const { depth, side, sideDepth } = options;
|
2159
|
+
const results = lines.map(line => {
|
2160
|
+
const tempResult = expandLine(line, options);
|
2161
|
+
tempResult.line = line;
|
2162
|
+
const { leftPoints, rightPoints } = tempResult;
|
2163
|
+
const result = { line };
|
2164
|
+
let depths;
|
2165
|
+
for (let i = 0, len = line.length; i < len; i++) {
|
2166
|
+
line[i][2] = line[i][2] || 0;
|
2167
|
+
}
|
2168
|
+
if (side === 'left') {
|
2169
|
+
result.leftPoints = leftPoints;
|
2170
|
+
result.rightPoints = line;
|
2171
|
+
depths = [sideDepth, depth];
|
2172
|
+
}
|
2173
|
+
else {
|
2174
|
+
result.leftPoints = line;
|
2175
|
+
result.rightPoints = rightPoints;
|
2176
|
+
depths = [depth, sideDepth];
|
2177
|
+
}
|
2178
|
+
result.depths = depths;
|
2179
|
+
generateTopAndBottom(result, options);
|
2180
|
+
generateSides(result, options);
|
2181
|
+
result.position = new Float32Array(result.points);
|
2182
|
+
result.indices = new Uint32Array(result.indices);
|
2183
|
+
result.uv = new Float32Array(result.uv);
|
2184
|
+
result.normal = generateNormal(result.indices, result.position);
|
2185
|
+
return result;
|
2186
|
+
});
|
2187
|
+
const result = merge(results);
|
2188
|
+
result.lines = lines;
|
2313
2189
|
return result;
|
2314
|
-
});
|
2315
|
-
var result = merge(results);
|
2316
|
-
result.lines = lines;
|
2317
|
-
return result;
|
2318
2190
|
}
|
2319
|
-
|
2320
2191
|
function generateTopAndBottom(result, options) {
|
2321
|
-
|
2322
|
-
|
2323
|
-
|
2324
|
-
|
2325
|
-
|
2326
|
-
|
2327
|
-
|
2328
|
-
lz = depths[0];
|
2329
|
-
rz = depths[1];
|
2330
|
-
}
|
2331
|
-
|
2332
|
-
var leftPoints = result.leftPoints,
|
2333
|
-
rightPoints = result.rightPoints;
|
2334
|
-
var line = result.line;
|
2335
|
-
var pathUV = options.pathUV;
|
2336
|
-
|
2337
|
-
if (pathUV) {
|
2338
|
-
calLineDistance(line);
|
2339
|
-
|
2340
|
-
for (var _i = 0, _len = line.length; _i < _len; _i++) {
|
2341
|
-
leftPoints[_i].distance = rightPoints[_i].distance = line[_i].distance;
|
2192
|
+
const bottomStickGround = options.bottomStickGround;
|
2193
|
+
const z = options.depth;
|
2194
|
+
const depths = result.depths;
|
2195
|
+
let lz = z, rz = z;
|
2196
|
+
if (depths) {
|
2197
|
+
lz = depths[0];
|
2198
|
+
rz = depths[1];
|
2342
2199
|
}
|
2343
|
-
|
2344
|
-
|
2345
|
-
|
2346
|
-
len = leftPoints.length;
|
2347
|
-
var points = [],
|
2348
|
-
indices = [],
|
2349
|
-
uv = [];
|
2350
|
-
|
2351
|
-
while (i < len) {
|
2352
|
-
// top left
|
2353
|
-
var idx0 = i * 3;
|
2354
|
-
var _leftPoints$i = leftPoints[i],
|
2355
|
-
x1 = _leftPoints$i[0],
|
2356
|
-
y1 = _leftPoints$i[1],
|
2357
|
-
z1 = _leftPoints$i[2];
|
2358
|
-
points[idx0] = x1;
|
2359
|
-
points[idx0 + 1] = y1;
|
2360
|
-
points[idx0 + 2] = lz + z1; // top right
|
2361
|
-
|
2362
|
-
var _rightPoints$i = rightPoints[i],
|
2363
|
-
x2 = _rightPoints$i[0],
|
2364
|
-
y2 = _rightPoints$i[1],
|
2365
|
-
z2 = _rightPoints$i[2];
|
2366
|
-
var idx1 = len * 3 + idx0;
|
2367
|
-
points[idx1] = x2;
|
2368
|
-
points[idx1 + 1] = y2;
|
2369
|
-
points[idx1 + 2] = rz + z2; // bottom left
|
2370
|
-
|
2371
|
-
var idx2 = len * 2 * 3 + idx0;
|
2372
|
-
points[idx2] = x1;
|
2373
|
-
points[idx2 + 1] = y1;
|
2374
|
-
points[idx2 + 2] = z1;
|
2375
|
-
|
2376
|
-
if (bottomStickGround) {
|
2377
|
-
points[idx2 + 2] = 0;
|
2378
|
-
} // bottom right
|
2379
|
-
|
2380
|
-
|
2381
|
-
var idx3 = len * 2 * 3 + len * 3 + idx0;
|
2382
|
-
points[idx3] = x2;
|
2383
|
-
points[idx3 + 1] = y2;
|
2384
|
-
points[idx3 + 2] = z2;
|
2385
|
-
|
2386
|
-
if (bottomStickGround) {
|
2387
|
-
points[idx3 + 2] = 0;
|
2388
|
-
} // generate path uv
|
2389
|
-
|
2390
|
-
|
2200
|
+
const { leftPoints, rightPoints } = result;
|
2201
|
+
const line = result.line;
|
2202
|
+
const pathUV = options.pathUV;
|
2391
2203
|
if (pathUV) {
|
2392
|
-
|
2393
|
-
|
2394
|
-
|
2395
|
-
|
2396
|
-
uv[uIndex0 + 1] = 1;
|
2397
|
-
var uIndex1 = len * 2 + uIndex0;
|
2398
|
-
uv[uIndex1] = uvx;
|
2399
|
-
uv[uIndex1 + 1] = 0;
|
2400
|
-
var uIndex2 = len * 2 * 2 + uIndex0;
|
2401
|
-
uv[uIndex2] = uvx;
|
2402
|
-
uv[uIndex2 + 1] = 1;
|
2403
|
-
var uIndex3 = len * 2 * 2 + len * 2 + uIndex0;
|
2404
|
-
uv[uIndex3] = uvx;
|
2405
|
-
uv[uIndex3 + 1] = 0;
|
2204
|
+
calLineDistance(line);
|
2205
|
+
for (let i = 0, len = line.length; i < len; i++) {
|
2206
|
+
leftPoints[i].distance = rightPoints[i].distance = line[i].distance;
|
2207
|
+
}
|
2406
2208
|
}
|
2407
|
-
|
2408
|
-
|
2409
|
-
}
|
2410
|
-
|
2411
|
-
if (!pathUV) {
|
2412
|
-
i = 0;
|
2413
|
-
len = points.length;
|
2414
|
-
var uIndex = uv.length - 1;
|
2415
|
-
|
2209
|
+
let i = 0, len = leftPoints.length;
|
2210
|
+
const points = [], indices = [], uv = [];
|
2416
2211
|
while (i < len) {
|
2417
|
-
|
2418
|
-
|
2419
|
-
|
2420
|
-
|
2421
|
-
|
2422
|
-
|
2212
|
+
// top left
|
2213
|
+
const idx0 = i * 3;
|
2214
|
+
const [x1, y1, z1] = leftPoints[i];
|
2215
|
+
points[idx0] = x1;
|
2216
|
+
points[idx0 + 1] = y1;
|
2217
|
+
points[idx0 + 2] = lz + z1;
|
2218
|
+
// top right
|
2219
|
+
const [x2, y2, z2] = rightPoints[i];
|
2220
|
+
const idx1 = len * 3 + idx0;
|
2221
|
+
points[idx1] = x2;
|
2222
|
+
points[idx1 + 1] = y2;
|
2223
|
+
points[idx1 + 2] = rz + z2;
|
2224
|
+
// bottom left
|
2225
|
+
const idx2 = (len * 2) * 3 + idx0;
|
2226
|
+
points[idx2] = x1;
|
2227
|
+
points[idx2 + 1] = y1;
|
2228
|
+
points[idx2 + 2] = z1;
|
2229
|
+
if (bottomStickGround) {
|
2230
|
+
points[idx2 + 2] = 0;
|
2231
|
+
}
|
2232
|
+
// bottom right
|
2233
|
+
const idx3 = (len * 2) * 3 + len * 3 + idx0;
|
2234
|
+
points[idx3] = x2;
|
2235
|
+
points[idx3 + 1] = y2;
|
2236
|
+
points[idx3 + 2] = z2;
|
2237
|
+
if (bottomStickGround) {
|
2238
|
+
points[idx3 + 2] = 0;
|
2239
|
+
}
|
2240
|
+
// generate path uv
|
2241
|
+
if (pathUV) {
|
2242
|
+
const p = line[i];
|
2243
|
+
const uvx = p.distance;
|
2244
|
+
const uIndex0 = i * 2;
|
2245
|
+
uv[uIndex0] = uvx;
|
2246
|
+
uv[uIndex0 + 1] = 1;
|
2247
|
+
const uIndex1 = len * 2 + uIndex0;
|
2248
|
+
uv[uIndex1] = uvx;
|
2249
|
+
uv[uIndex1 + 1] = 0;
|
2250
|
+
const uIndex2 = (len * 2) * 2 + uIndex0;
|
2251
|
+
uv[uIndex2] = uvx;
|
2252
|
+
uv[uIndex2 + 1] = 1;
|
2253
|
+
const uIndex3 = (len * 2) * 2 + len * 2 + uIndex0;
|
2254
|
+
uv[uIndex3] = uvx;
|
2255
|
+
uv[uIndex3 + 1] = 0;
|
2256
|
+
}
|
2257
|
+
i++;
|
2258
|
+
}
|
2259
|
+
if (!pathUV) {
|
2260
|
+
i = 0;
|
2261
|
+
len = points.length;
|
2262
|
+
let uIndex = uv.length - 1;
|
2263
|
+
while (i < len) {
|
2264
|
+
const x = points[i], y = points[i + 1];
|
2265
|
+
uv[++uIndex] = x;
|
2266
|
+
uv[++uIndex] = y;
|
2267
|
+
// uvs.push(x, y);
|
2268
|
+
i += 3;
|
2269
|
+
}
|
2423
2270
|
}
|
2424
|
-
}
|
2425
|
-
|
2426
|
-
i = 0;
|
2427
|
-
len = leftPoints.length;
|
2428
|
-
var iIndex = indices.length - 1;
|
2429
|
-
|
2430
|
-
while (i < len - 1) {
|
2431
|
-
// top
|
2432
|
-
// left1 left2 right1,right2
|
2433
|
-
var a1 = i,
|
2434
|
-
b1 = i + 1,
|
2435
|
-
c1 = a1 + len,
|
2436
|
-
d1 = b1 + len;
|
2437
|
-
indices[++iIndex] = a1;
|
2438
|
-
indices[++iIndex] = c1;
|
2439
|
-
indices[++iIndex] = b1;
|
2440
|
-
indices[++iIndex] = c1;
|
2441
|
-
indices[++iIndex] = d1;
|
2442
|
-
indices[++iIndex] = b1; // index.push(a1, c1, b1);
|
2443
|
-
// index.push(c1, d1, b1);
|
2444
|
-
// bottom
|
2445
|
-
// left1 left2 right1,right2
|
2446
|
-
|
2447
|
-
var len2 = len * 2;
|
2448
|
-
var a2 = i + len2,
|
2449
|
-
b2 = a2 + 1,
|
2450
|
-
c2 = a2 + len,
|
2451
|
-
d2 = b2 + len;
|
2452
|
-
indices[++iIndex] = a2;
|
2453
|
-
indices[++iIndex] = c2;
|
2454
|
-
indices[++iIndex] = b2;
|
2455
|
-
indices[++iIndex] = c2;
|
2456
|
-
indices[++iIndex] = d2;
|
2457
|
-
indices[++iIndex] = b2; // index.push(a2, c2, b2);
|
2458
|
-
// index.push(c2, d2, b2);
|
2459
|
-
|
2460
|
-
i++;
|
2461
|
-
}
|
2462
|
-
|
2463
|
-
result.indices = indices;
|
2464
|
-
result.points = points;
|
2465
|
-
result.uv = uv;
|
2466
|
-
|
2467
|
-
if (depths) {
|
2468
|
-
len = leftPoints.length;
|
2469
2271
|
i = 0;
|
2470
|
-
|
2471
|
-
|
2472
|
-
|
2473
|
-
|
2474
|
-
|
2272
|
+
len = leftPoints.length;
|
2273
|
+
let iIndex = indices.length - 1;
|
2274
|
+
while (i < len - 1) {
|
2275
|
+
// top
|
2276
|
+
// left1 left2 right1,right2
|
2277
|
+
const a1 = i, b1 = i + 1, c1 = a1 + len, d1 = b1 + len;
|
2278
|
+
indices[++iIndex] = a1;
|
2279
|
+
indices[++iIndex] = c1;
|
2280
|
+
indices[++iIndex] = b1;
|
2281
|
+
indices[++iIndex] = c1;
|
2282
|
+
indices[++iIndex] = d1;
|
2283
|
+
indices[++iIndex] = b1;
|
2284
|
+
// index.push(a1, c1, b1);
|
2285
|
+
// index.push(c1, d1, b1);
|
2286
|
+
// bottom
|
2287
|
+
// left1 left2 right1,right2
|
2288
|
+
const len2 = len * 2;
|
2289
|
+
const a2 = i + len2, b2 = a2 + 1, c2 = a2 + len, d2 = b2 + len;
|
2290
|
+
indices[++iIndex] = a2;
|
2291
|
+
indices[++iIndex] = c2;
|
2292
|
+
indices[++iIndex] = b2;
|
2293
|
+
indices[++iIndex] = c2;
|
2294
|
+
indices[++iIndex] = d2;
|
2295
|
+
indices[++iIndex] = b2;
|
2296
|
+
// index.push(a2, c2, b2);
|
2297
|
+
// index.push(c2, d2, b2);
|
2298
|
+
i++;
|
2299
|
+
}
|
2300
|
+
result.indices = indices;
|
2301
|
+
result.points = points;
|
2302
|
+
result.uv = uv;
|
2303
|
+
if (depths) {
|
2304
|
+
len = leftPoints.length;
|
2305
|
+
i = 0;
|
2306
|
+
while (i < len) {
|
2307
|
+
leftPoints[i].depth = lz;
|
2308
|
+
rightPoints[i].depth = rz;
|
2309
|
+
i++;
|
2310
|
+
}
|
2475
2311
|
}
|
2476
|
-
}
|
2477
2312
|
}
|
2478
|
-
|
2479
2313
|
function generateSides(result, options) {
|
2480
|
-
|
2481
|
-
|
2482
|
-
|
2483
|
-
|
2484
|
-
|
2485
|
-
|
2486
|
-
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2490
|
-
|
2491
|
-
|
2492
|
-
|
2493
|
-
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2497
|
-
|
2498
|
-
|
2499
|
-
|
2500
|
-
|
2501
|
-
|
2502
|
-
|
2503
|
-
|
2504
|
-
|
2505
|
-
|
2506
|
-
|
2507
|
-
|
2508
|
-
|
2509
|
-
|
2510
|
-
|
2511
|
-
|
2512
|
-
|
2513
|
-
|
2514
|
-
|
2515
|
-
|
2516
|
-
|
2517
|
-
|
2518
|
-
c
|
2519
|
-
|
2520
|
-
|
2521
|
-
|
2522
|
-
|
2523
|
-
|
2524
|
-
|
2525
|
-
|
2526
|
-
|
2527
|
-
|
2528
|
-
|
2529
|
-
|
2530
|
-
|
2531
|
-
|
2532
|
-
uv[++uIndex] = v2.distance;
|
2533
|
-
uv[++uIndex] = v2Depth / lineWidth;
|
2534
|
-
uv[++uIndex] = v1.distance;
|
2535
|
-
uv[++uIndex] = 0;
|
2536
|
-
uv[++uIndex] = v2.distance;
|
2537
|
-
uv[++uIndex] = 0;
|
2314
|
+
const { points, indices, leftPoints, rightPoints, uv } = result;
|
2315
|
+
const z = options.depth;
|
2316
|
+
const bottomStickGround = options.bottomStickGround;
|
2317
|
+
const rings = [leftPoints, rightPoints];
|
2318
|
+
const depthsEnable = result.depths;
|
2319
|
+
const pathUV = options.pathUV;
|
2320
|
+
const lineWidth = options.lineWidth;
|
2321
|
+
let pIndex = points.length - 1;
|
2322
|
+
let iIndex = indices.length - 1;
|
2323
|
+
let uIndex = uv.length - 1;
|
2324
|
+
function addOneSideIndex(v1, v2) {
|
2325
|
+
const idx = points.length / 3;
|
2326
|
+
// let pIndex = points.length - 1;
|
2327
|
+
const v1Depth = (depthsEnable ? v1.depth : z);
|
2328
|
+
const v2Depth = (depthsEnable ? v2.depth : z);
|
2329
|
+
// top
|
2330
|
+
points[++pIndex] = v1[0];
|
2331
|
+
points[++pIndex] = v1[1];
|
2332
|
+
points[++pIndex] = v1Depth + v1[2];
|
2333
|
+
points[++pIndex] = v2[0];
|
2334
|
+
points[++pIndex] = v2[1];
|
2335
|
+
points[++pIndex] = v2Depth + v2[2];
|
2336
|
+
// points.push(v1[0], v1[1], (depthsEnable ? v1.depth : z) + v1[2], v2[0], v2[1], (depthsEnable ? v2.depth : z) + v2[2]);
|
2337
|
+
// bottom
|
2338
|
+
points[++pIndex] = v1[0];
|
2339
|
+
points[++pIndex] = v1[1];
|
2340
|
+
points[++pIndex] = bottomStickGround ? 0 : v1[2];
|
2341
|
+
points[++pIndex] = v2[0];
|
2342
|
+
points[++pIndex] = v2[1];
|
2343
|
+
points[++pIndex] = bottomStickGround ? 0 : v2[2];
|
2344
|
+
// points.push(v1[0], v1[1], v1[2], v2[0], v2[1], v2[2]);
|
2345
|
+
const a = idx + 2, b = idx + 3, c = idx, d = idx + 1;
|
2346
|
+
indices[++iIndex] = a;
|
2347
|
+
indices[++iIndex] = c;
|
2348
|
+
indices[++iIndex] = b;
|
2349
|
+
indices[++iIndex] = c;
|
2350
|
+
indices[++iIndex] = d;
|
2351
|
+
indices[++iIndex] = b;
|
2352
|
+
// index.push(a, c, b, c, d, b);
|
2353
|
+
if (!pathUV) {
|
2354
|
+
generateSideWallUV(uv, points, a, b, c, d);
|
2355
|
+
}
|
2356
|
+
else {
|
2357
|
+
uv[++uIndex] = v1.distance;
|
2358
|
+
uv[++uIndex] = v1Depth / lineWidth;
|
2359
|
+
uv[++uIndex] = v2.distance;
|
2360
|
+
uv[++uIndex] = v2Depth / lineWidth;
|
2361
|
+
uv[++uIndex] = v1.distance;
|
2362
|
+
uv[++uIndex] = 0;
|
2363
|
+
uv[++uIndex] = v2.distance;
|
2364
|
+
uv[++uIndex] = 0;
|
2365
|
+
}
|
2538
2366
|
}
|
2539
|
-
|
2540
|
-
|
2541
|
-
|
2542
|
-
|
2543
|
-
|
2544
|
-
|
2545
|
-
|
2546
|
-
|
2547
|
-
|
2548
|
-
|
2367
|
+
for (let i = 0, len = rings.length; i < len; i++) {
|
2368
|
+
let ring = rings[i];
|
2369
|
+
if (i > 0) {
|
2370
|
+
ring = ring.map(p => {
|
2371
|
+
return p;
|
2372
|
+
});
|
2373
|
+
ring = ring.reverse();
|
2374
|
+
}
|
2375
|
+
let j = 0;
|
2376
|
+
const len1 = ring.length - 1;
|
2377
|
+
while (j < len1) {
|
2378
|
+
const v1 = ring[j];
|
2379
|
+
const v2 = ring[j + 1];
|
2380
|
+
addOneSideIndex(v1, v2);
|
2381
|
+
j++;
|
2382
|
+
}
|
2549
2383
|
}
|
2550
|
-
|
2551
|
-
|
2552
|
-
|
2553
|
-
|
2554
|
-
|
2555
|
-
var v1 = ring[j];
|
2556
|
-
var v2 = ring[j + 1];
|
2557
|
-
addOneSideIndex(v1, v2);
|
2558
|
-
j++;
|
2384
|
+
const len = leftPoints.length;
|
2385
|
+
const vs = [rightPoints[0], leftPoints[0], leftPoints[len - 1], rightPoints[len - 1]];
|
2386
|
+
for (let i = 0; i < vs.length; i += 2) {
|
2387
|
+
const v1 = vs[i], v2 = vs[i + 1];
|
2388
|
+
addOneSideIndex(v1, v2);
|
2559
2389
|
}
|
2560
|
-
}
|
2561
|
-
|
2562
|
-
var len = leftPoints.length;
|
2563
|
-
var vs = [rightPoints[0], leftPoints[0], leftPoints[len - 1], rightPoints[len - 1]];
|
2564
|
-
|
2565
|
-
for (var _i2 = 0; _i2 < vs.length; _i2 += 2) {
|
2566
|
-
var _v = vs[_i2],
|
2567
|
-
_v2 = vs[_i2 + 1];
|
2568
|
-
addOneSideIndex(_v, _v2);
|
2569
|
-
}
|
2570
2390
|
}
|
2571
|
-
|
2572
|
-
var TEMPV1 = {
|
2573
|
-
x: 0,
|
2574
|
-
y: 0
|
2575
|
-
},
|
2576
|
-
TEMPV2 = {
|
2577
|
-
x: 0,
|
2578
|
-
y: 0
|
2579
|
-
};
|
2391
|
+
const TEMPV1 = { x: 0, y: 0 }, TEMPV2 = { x: 0, y: 0 };
|
2580
2392
|
function expandLine(line, options) {
|
2581
|
-
|
2582
|
-
|
2583
|
-
|
2584
|
-
|
2585
|
-
radius *= 2;
|
2586
|
-
}
|
2587
|
-
|
2588
|
-
var points = [],
|
2589
|
-
leftPoints = [],
|
2590
|
-
rightPoints = [];
|
2591
|
-
var len = line.length;
|
2592
|
-
var i = 0;
|
2593
|
-
|
2594
|
-
while (i < len) {
|
2595
|
-
var p1 = line[i],
|
2596
|
-
p2 = line[i + 1];
|
2597
|
-
var currentp = line[i]; // last vertex
|
2598
|
-
|
2599
|
-
if (i === len - 1) {
|
2600
|
-
p1 = line[len - 2];
|
2601
|
-
p2 = line[len - 1];
|
2602
|
-
}
|
2603
|
-
|
2604
|
-
var dy = p2[1] - p1[1],
|
2605
|
-
dx = p2[0] - p1[0];
|
2606
|
-
var rAngle = 0;
|
2607
|
-
var rad = Math.atan(dy / dx);
|
2608
|
-
var angle = radToDeg(rad); // preAngle = angle;
|
2609
|
-
|
2610
|
-
if (i === 0 || i === len - 1) {
|
2611
|
-
rAngle = angle;
|
2612
|
-
rAngle -= 90;
|
2613
|
-
} else {
|
2614
|
-
// 至少3个顶点才会触发
|
2615
|
-
var p0 = line[i - 1];
|
2616
|
-
TEMPV1.x = p0[0] - p1[0];
|
2617
|
-
TEMPV1.y = p0[1] - p1[1];
|
2618
|
-
TEMPV2.x = p2[0] - p1[0];
|
2619
|
-
TEMPV2.y = p2[1] - p1[1];
|
2620
|
-
var vAngle = getAngle(TEMPV1, TEMPV2);
|
2621
|
-
rAngle = angle - vAngle / 2;
|
2622
|
-
}
|
2623
|
-
|
2624
|
-
var rRad = degToRad(rAngle);
|
2625
|
-
var p3 = currentp;
|
2626
|
-
var x = Math.cos(rRad) + p3[0],
|
2627
|
-
y = Math.sin(rRad) + p3[1];
|
2628
|
-
var p4 = [x, y];
|
2629
|
-
|
2630
|
-
var _translateLine = translateLine(p1, p2, radius),
|
2631
|
-
line1 = _translateLine[0],
|
2632
|
-
line2 = _translateLine[1];
|
2633
|
-
|
2634
|
-
var op1 = lineIntersection(line1[0], line1[1], p3, p4);
|
2635
|
-
var op2 = lineIntersection(line2[0], line2[1], p3, p4); // 平行,回头路
|
2636
|
-
|
2637
|
-
if (!op1 || !op2) {
|
2638
|
-
var len1 = points.length;
|
2639
|
-
var point1 = points[len1 - 2];
|
2640
|
-
var point2 = points[len1 - 1];
|
2641
|
-
|
2642
|
-
if (!point1 || !point2) {
|
2643
|
-
continue;
|
2644
|
-
}
|
2645
|
-
|
2646
|
-
op1 = [point1[0], point1[1]];
|
2647
|
-
op2 = [point2[0], point2[1]];
|
2393
|
+
// let preAngle = 0;
|
2394
|
+
let radius = options.lineWidth / 2;
|
2395
|
+
if (options.isSlope) {
|
2396
|
+
radius *= 2;
|
2648
2397
|
}
|
2649
|
-
|
2650
|
-
|
2651
|
-
|
2652
|
-
|
2653
|
-
|
2654
|
-
|
2655
|
-
|
2656
|
-
|
2657
|
-
|
2658
|
-
|
2659
|
-
|
2660
|
-
|
2398
|
+
const points = [], leftPoints = [], rightPoints = [];
|
2399
|
+
const len = line.length;
|
2400
|
+
let i = 0;
|
2401
|
+
while (i < len) {
|
2402
|
+
let p1 = line[i], p2 = line[i + 1];
|
2403
|
+
const currentp = line[i];
|
2404
|
+
// last vertex
|
2405
|
+
if (i === len - 1) {
|
2406
|
+
p1 = line[len - 2];
|
2407
|
+
p2 = line[len - 1];
|
2408
|
+
}
|
2409
|
+
const dy = p2[1] - p1[1], dx = p2[0] - p1[0];
|
2410
|
+
let rAngle = 0;
|
2411
|
+
const rad = Math.atan(dy / dx);
|
2412
|
+
const angle = radToDeg(rad);
|
2413
|
+
// preAngle = angle;
|
2414
|
+
if (i === 0 || i === len - 1) {
|
2415
|
+
rAngle = angle;
|
2416
|
+
rAngle -= 90;
|
2417
|
+
}
|
2418
|
+
else {
|
2419
|
+
// 至少3个顶点才会触发
|
2420
|
+
const p0 = line[i - 1];
|
2421
|
+
TEMPV1.x = p0[0] - p1[0];
|
2422
|
+
TEMPV1.y = p0[1] - p1[1];
|
2423
|
+
TEMPV2.x = p2[0] - p1[0];
|
2424
|
+
TEMPV2.y = p2[1] - p1[1];
|
2425
|
+
const vAngle = getAngle(TEMPV1, TEMPV2);
|
2426
|
+
rAngle = angle - vAngle / 2;
|
2427
|
+
}
|
2428
|
+
const rRad = degToRad(rAngle);
|
2429
|
+
const p3 = currentp;
|
2430
|
+
const x = Math.cos(rRad) + p3[0], y = Math.sin(rRad) + p3[1];
|
2431
|
+
const p4 = [x, y];
|
2432
|
+
const [line1, line2] = translateLine(p1, p2, radius);
|
2433
|
+
let op1 = lineIntersection(line1[0], line1[1], p3, p4);
|
2434
|
+
let op2 = lineIntersection(line2[0], line2[1], p3, p4);
|
2435
|
+
// 平行,回头路
|
2436
|
+
if (!op1 || !op2) {
|
2437
|
+
const len1 = points.length;
|
2438
|
+
const point1 = points[len1 - 2];
|
2439
|
+
const point2 = points[len1 - 1];
|
2440
|
+
if (!point1 || !point2) {
|
2441
|
+
continue;
|
2442
|
+
}
|
2443
|
+
op1 = [point1[0], point1[1]];
|
2444
|
+
op2 = [point2[0], point2[1]];
|
2445
|
+
}
|
2446
|
+
op1[2] = currentp[2] || 0;
|
2447
|
+
op2[2] = currentp[2] || 0;
|
2448
|
+
// const [op1, op2] = calOffsetPoint(rRad, radius, p1);
|
2449
|
+
points.push(op1, op2);
|
2450
|
+
if (leftOnLine(op1, p1, p2)) {
|
2451
|
+
leftPoints.push(op1);
|
2452
|
+
rightPoints.push(op2);
|
2453
|
+
}
|
2454
|
+
else {
|
2455
|
+
leftPoints.push(op2);
|
2456
|
+
rightPoints.push(op1);
|
2457
|
+
}
|
2458
|
+
i++;
|
2661
2459
|
}
|
2662
|
-
|
2663
|
-
|
2664
|
-
|
2665
|
-
|
2666
|
-
|
2667
|
-
|
2668
|
-
|
2669
|
-
rightPoints: rightPoints,
|
2670
|
-
line: line
|
2671
|
-
};
|
2672
|
-
} // eslint-disable-next-line no-unused-vars
|
2673
|
-
|
2674
|
-
var getAngle = function getAngle(_ref, _ref2) {
|
2675
|
-
var x1 = _ref.x,
|
2676
|
-
y1 = _ref.y;
|
2677
|
-
var x2 = _ref2.x,
|
2678
|
-
y2 = _ref2.y;
|
2679
|
-
var dot = x1 * x2 + y1 * y2;
|
2680
|
-
var det = x1 * y2 - y1 * x2;
|
2681
|
-
var angle = Math.atan2(det, dot) / Math.PI * 180;
|
2682
|
-
return (angle + 360) % 360;
|
2460
|
+
return { offsetPoints: points, leftPoints, rightPoints, line };
|
2461
|
+
}
|
2462
|
+
const getAngle = ({ x: x1, y: y1 }, { x: x2, y: y2 }) => {
|
2463
|
+
const dot = x1 * x2 + y1 * y2;
|
2464
|
+
const det = x1 * y2 - y1 * x2;
|
2465
|
+
const angle = Math.atan2(det, dot) / Math.PI * 180;
|
2466
|
+
return (angle + 360) % 360;
|
2683
2467
|
};
|
2684
|
-
|
2685
2468
|
function leftOnLine(p, p1, p2) {
|
2686
|
-
|
2687
|
-
|
2688
|
-
|
2689
|
-
|
2690
|
-
var x = p[0],
|
2691
|
-
y = p[1];
|
2692
|
-
return (y1 - y2) * x + (x2 - x1) * y + x1 * y2 - x2 * y1 > 0;
|
2469
|
+
const [x1, y1] = p1;
|
2470
|
+
const [x2, y2] = p2;
|
2471
|
+
const [x, y] = p;
|
2472
|
+
return (y1 - y2) * x + (x2 - x1) * y + x1 * y2 - x2 * y1 > 0;
|
2693
2473
|
}
|
2694
|
-
/**
|
2695
|
-
* 平移线
|
2696
|
-
* @param {*} p1
|
2697
|
-
* @param {*} p2
|
2698
|
-
* @param {*} distance
|
2699
|
-
* @returns
|
2474
|
+
/**
|
2475
|
+
* 平移线
|
2476
|
+
* @param {*} p1
|
2477
|
+
* @param {*} p2
|
2478
|
+
* @param {*} distance
|
2479
|
+
* @returns
|
2700
2480
|
*/
|
2701
|
-
|
2702
2481
|
function translateLine(p1, p2, distance) {
|
2703
|
-
|
2704
|
-
|
2705
|
-
|
2706
|
-
|
2707
|
-
|
2708
|
-
|
2709
|
-
|
2710
|
-
|
2711
|
-
|
2712
|
-
|
2713
|
-
|
2714
|
-
|
2715
|
-
var tp4 = [p2[0] + offsetX, p2[1] + offsetY];
|
2716
|
-
return [[tp1, tp2], [tp3, tp4]];
|
2482
|
+
const dy = p2[1] - p1[1], dx = p2[0] - p1[0];
|
2483
|
+
const rad = Math.atan2(dy, dx);
|
2484
|
+
const rad1 = rad + Math.PI / 2;
|
2485
|
+
let offsetX = Math.cos(rad1) * distance, offsetY = Math.sin(rad1) * distance;
|
2486
|
+
const tp1 = [p1[0] + offsetX, p1[1] + offsetY];
|
2487
|
+
const tp2 = [p2[0] + offsetX, p2[1] + offsetY];
|
2488
|
+
const rad2 = rad - Math.PI / 2;
|
2489
|
+
offsetX = Math.cos(rad2) * distance;
|
2490
|
+
offsetY = Math.sin(rad2) * distance;
|
2491
|
+
const tp3 = [p1[0] + offsetX, p1[1] + offsetY];
|
2492
|
+
const tp4 = [p2[0] + offsetX, p2[1] + offsetY];
|
2493
|
+
return [[tp1, tp2], [tp3, tp4]];
|
2717
2494
|
}
|
2718
|
-
/**
|
2719
|
-
* 直线交点
|
2720
|
-
* @param {*} p1
|
2721
|
-
* @param {*} p2
|
2722
|
-
* @param {*} p3
|
2723
|
-
* @param {*} p4
|
2724
|
-
* @returns
|
2495
|
+
/**
|
2496
|
+
* 直线交点
|
2497
|
+
* @param {*} p1
|
2498
|
+
* @param {*} p2
|
2499
|
+
* @param {*} p3
|
2500
|
+
* @param {*} p4
|
2501
|
+
* @returns
|
2725
2502
|
*/
|
2726
|
-
|
2727
|
-
|
2728
2503
|
function lineIntersection(p1, p2, p3, p4) {
|
2729
|
-
|
2730
|
-
|
2731
|
-
|
2732
|
-
|
2733
|
-
|
2734
|
-
|
2735
|
-
|
2736
|
-
|
2737
|
-
|
2738
|
-
|
2739
|
-
|
2740
|
-
|
2741
|
-
|
2742
|
-
|
2743
|
-
|
2744
|
-
|
2745
|
-
|
2746
|
-
|
2747
|
-
|
2748
|
-
|
2749
|
-
|
2750
|
-
|
2751
|
-
|
2752
|
-
|
2753
|
-
|
2754
|
-
|
2755
|
-
|
2756
|
-
|
2757
|
-
|
2758
|
-
|
2759
|
-
|
2760
|
-
|
2761
|
-
|
2762
|
-
|
2763
|
-
}
|
2764
|
-
|
2765
|
-
return [x, y];
|
2504
|
+
const dx1 = p2[0] - p1[0], dy1 = p2[1] - p1[1];
|
2505
|
+
const dx2 = p4[0] - p3[0], dy2 = p4[1] - p3[1];
|
2506
|
+
if (dx1 === 0 && dx2 === 0) {
|
2507
|
+
return null;
|
2508
|
+
}
|
2509
|
+
if (dy1 === 0 && dy2 === 0) {
|
2510
|
+
return null;
|
2511
|
+
}
|
2512
|
+
const k1 = dy1 / dx1;
|
2513
|
+
const k2 = dy2 / dx2;
|
2514
|
+
const b1 = p1[1] - k1 * p1[0];
|
2515
|
+
const b2 = p3[1] - k2 * p3[0];
|
2516
|
+
let x, y;
|
2517
|
+
if (dx1 === 0) {
|
2518
|
+
x = p1[0];
|
2519
|
+
y = k2 * x + b2;
|
2520
|
+
}
|
2521
|
+
else if (dx2 === 0) {
|
2522
|
+
x = p3[0];
|
2523
|
+
y = k1 * x + b1;
|
2524
|
+
}
|
2525
|
+
else if (dy1 === 0) {
|
2526
|
+
y = p1[1];
|
2527
|
+
x = (y - b2) / k2;
|
2528
|
+
}
|
2529
|
+
else if (dy2 === 0) {
|
2530
|
+
y = p3[1];
|
2531
|
+
x = (y - b1) / k1;
|
2532
|
+
}
|
2533
|
+
else {
|
2534
|
+
x = (b2 - b1) / (k1 - k2);
|
2535
|
+
y = k1 * x + b1;
|
2536
|
+
}
|
2537
|
+
return [x, y];
|
2766
2538
|
}
|
2767
2539
|
|
2768
2540
|
function cylinder(point, options) {
|
2769
|
-
|
2770
|
-
|
2771
|
-
|
2772
|
-
|
2773
|
-
|
2774
|
-
|
2775
|
-
|
2776
|
-
|
2777
|
-
|
2778
|
-
|
2779
|
-
|
2780
|
-
|
2781
|
-
|
2782
|
-
|
2783
|
-
|
2784
|
-
|
2785
|
-
|
2786
|
-
|
2787
|
-
|
2788
|
-
|
2789
|
-
|
2790
|
-
|
2791
|
-
|
2792
|
-
|
2793
|
-
|
2794
|
-
|
2795
|
-
|
2796
|
-
|
2797
|
-
|
2798
|
-
|
2799
|
-
|
2800
|
-
|
2801
|
-
|
2802
|
-
|
2803
|
-
|
2804
|
-
|
2805
|
-
|
2806
|
-
|
2807
|
-
|
2808
|
-
|
2809
|
-
u = 0.5 + x / radius / 2;
|
2810
|
-
v = 0.5 + y / radius / 2;
|
2811
|
-
uv[uIdx] = u;
|
2812
|
-
uv[uIdx + 1] = v;
|
2813
|
-
uv[uIdx + uOffset] = u;
|
2814
|
-
uv[uIdx + 1 + uOffset] = v;
|
2815
|
-
idx += 3;
|
2816
|
-
uIdx += 2;
|
2817
|
-
|
2818
|
-
if (i > 1) {
|
2819
|
-
// bottom indices
|
2820
|
-
// indices.push(0, i - 1, i);
|
2821
|
-
indices[++iIndex] = 0;
|
2822
|
-
indices[++iIndex] = i - 1;
|
2823
|
-
indices[++iIndex] = i;
|
2541
|
+
options = Object.assign({}, { radius: 1, height: 2, radialSegments: 6 }, options);
|
2542
|
+
const radialSegments = Math.round(Math.max(4, options.radialSegments));
|
2543
|
+
let { radius, height } = options;
|
2544
|
+
radius = radius;
|
2545
|
+
height = height;
|
2546
|
+
const aRad = 360 / radialSegments / 360 * Math.PI * 2;
|
2547
|
+
const circlePointsLen = (radialSegments + 1);
|
2548
|
+
const points = new Float32Array(circlePointsLen * 3 * 2);
|
2549
|
+
const [centerx, centery] = point;
|
2550
|
+
let idx = 0, uIdx = 0;
|
2551
|
+
const offset = circlePointsLen * 3, uOffset = circlePointsLen * 2;
|
2552
|
+
const indices = [], uv = [];
|
2553
|
+
let iIndex = indices.length - 1;
|
2554
|
+
for (let i = -1; i < radialSegments; i++) {
|
2555
|
+
const rad = aRad * i;
|
2556
|
+
const x = Math.cos(rad) * radius + centerx, y = Math.sin(rad) * radius + centery;
|
2557
|
+
// bottom vertices
|
2558
|
+
points[idx] = x;
|
2559
|
+
points[idx + 1] = y;
|
2560
|
+
points[idx + 2] = 0;
|
2561
|
+
// top vertices
|
2562
|
+
points[idx + offset] = x;
|
2563
|
+
points[idx + 1 + offset] = y;
|
2564
|
+
points[idx + 2 + offset] = height;
|
2565
|
+
let u = 0, v = 0;
|
2566
|
+
u = 0.5 + x / radius / 2;
|
2567
|
+
v = 0.5 + y / radius / 2;
|
2568
|
+
uv[uIdx] = u;
|
2569
|
+
uv[uIdx + 1] = v;
|
2570
|
+
uv[uIdx + uOffset] = u;
|
2571
|
+
uv[uIdx + 1 + uOffset] = v;
|
2572
|
+
idx += 3;
|
2573
|
+
uIdx += 2;
|
2574
|
+
if (i > 1) {
|
2575
|
+
// bottom indices
|
2576
|
+
// indices.push(0, i - 1, i);
|
2577
|
+
indices[++iIndex] = 0;
|
2578
|
+
indices[++iIndex] = i - 1;
|
2579
|
+
indices[++iIndex] = i;
|
2580
|
+
}
|
2824
2581
|
}
|
2825
|
-
|
2826
|
-
|
2827
|
-
|
2828
|
-
|
2829
|
-
|
2830
|
-
|
2831
|
-
|
2832
|
-
|
2833
|
-
|
2834
|
-
|
2835
|
-
|
2836
|
-
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2841
|
-
|
2842
|
-
|
2843
|
-
|
2844
|
-
|
2845
|
-
|
2846
|
-
|
2847
|
-
|
2848
|
-
|
2849
|
-
|
2850
|
-
|
2851
|
-
|
2852
|
-
|
2853
|
-
|
2854
|
-
|
2855
|
-
|
2856
|
-
|
2857
|
-
|
2858
|
-
|
2859
|
-
|
2860
|
-
|
2861
|
-
|
2862
|
-
|
2863
|
-
|
2864
|
-
|
2865
|
-
|
2866
|
-
|
2867
|
-
|
2868
|
-
|
2869
|
-
|
2870
|
-
|
2871
|
-
|
2872
|
-
|
2873
|
-
|
2874
|
-
|
2875
|
-
|
2876
|
-
|
2877
|
-
|
2878
|
-
|
2879
|
-
|
2880
|
-
|
2881
|
-
|
2882
|
-
|
2883
|
-
|
2884
|
-
|
2885
|
-
|
2886
|
-
|
2887
|
-
uv
|
2888
|
-
uv[++uvIndex] = 0;
|
2889
|
-
uv[++uvIndex] = u2;
|
2890
|
-
uv[++uvIndex] = 0; // uvs.push(u1, height / radius / 2, u2, height / radius / 2, u1, 0, u2, 0);
|
2891
|
-
|
2892
|
-
uIdx++;
|
2893
|
-
}
|
2894
|
-
|
2895
|
-
var position = new Float32Array(points.length + sidePoints.length);
|
2896
|
-
position.set(points, 0);
|
2897
|
-
position.set(sidePoints, points.length);
|
2898
|
-
var normal = generateNormal(indices, position);
|
2899
|
-
return {
|
2900
|
-
points: points,
|
2901
|
-
indices: new Uint32Array(indices),
|
2902
|
-
position: position,
|
2903
|
-
normal: normal,
|
2904
|
-
uv: new Float32Array(uv)
|
2905
|
-
};
|
2582
|
+
idx -= 3;
|
2583
|
+
points[idx] = points[0];
|
2584
|
+
points[idx + 1] = points[1];
|
2585
|
+
points[idx + 2] = points[2];
|
2586
|
+
const pointsLen = points.length;
|
2587
|
+
points[pointsLen - 3] = points[0];
|
2588
|
+
points[pointsLen - 2] = points[1];
|
2589
|
+
points[pointsLen - 1] = height;
|
2590
|
+
const indicesLen = indices.length;
|
2591
|
+
// top indices
|
2592
|
+
iIndex = indices.length - 1;
|
2593
|
+
for (let i = 0; i < indicesLen; i++) {
|
2594
|
+
const index = indices[i];
|
2595
|
+
indices[++iIndex] = index + circlePointsLen;
|
2596
|
+
// indices.push(index + circlePointsLen);
|
2597
|
+
}
|
2598
|
+
const sidePoints = new Float32Array((circlePointsLen * 3 * 2 - 6) * 2);
|
2599
|
+
let pIndex = -1;
|
2600
|
+
idx = circlePointsLen * 2;
|
2601
|
+
uIdx = 0;
|
2602
|
+
iIndex = indices.length - 1;
|
2603
|
+
let uvIndex = uv.length - 1;
|
2604
|
+
for (let i = 0, len = points.length / 2; i < len - 3; i += 3) {
|
2605
|
+
const x1 = points[i], y1 = points[i + 1], x2 = points[i + 3], y2 = points[i + 4];
|
2606
|
+
sidePoints[++pIndex] = x1;
|
2607
|
+
sidePoints[++pIndex] = y1;
|
2608
|
+
sidePoints[++pIndex] = height;
|
2609
|
+
sidePoints[++pIndex] = x2;
|
2610
|
+
sidePoints[++pIndex] = y2;
|
2611
|
+
sidePoints[++pIndex] = height;
|
2612
|
+
sidePoints[++pIndex] = x1;
|
2613
|
+
sidePoints[++pIndex] = y1;
|
2614
|
+
sidePoints[++pIndex] = 0;
|
2615
|
+
sidePoints[++pIndex] = x2;
|
2616
|
+
sidePoints[++pIndex] = y2;
|
2617
|
+
sidePoints[++pIndex] = 0;
|
2618
|
+
const a = idx + 2, b = idx + 3, c = idx, d = idx + 1;
|
2619
|
+
// indices.push(a, c, b, c, d, b);
|
2620
|
+
indices[++iIndex] = c;
|
2621
|
+
indices[++iIndex] = a;
|
2622
|
+
indices[++iIndex] = d;
|
2623
|
+
indices[++iIndex] = a;
|
2624
|
+
indices[++iIndex] = b;
|
2625
|
+
indices[++iIndex] = d;
|
2626
|
+
// indices.push(c, a, d, a, b, d);
|
2627
|
+
idx += 4;
|
2628
|
+
const u1 = uIdx / circlePointsLen, u2 = (uIdx + 1) / circlePointsLen;
|
2629
|
+
uv[++uvIndex] = u1;
|
2630
|
+
uv[++uvIndex] = height / radius / 2;
|
2631
|
+
uv[++uvIndex] = u2;
|
2632
|
+
uv[++uvIndex] = height / radius / 2;
|
2633
|
+
uv[++uvIndex] = u1;
|
2634
|
+
uv[++uvIndex] = 0;
|
2635
|
+
uv[++uvIndex] = u2;
|
2636
|
+
uv[++uvIndex] = 0;
|
2637
|
+
// uvs.push(u1, height / radius / 2, u2, height / radius / 2, u1, 0, u2, 0);
|
2638
|
+
uIdx++;
|
2639
|
+
}
|
2640
|
+
const position = new Float32Array(points.length + sidePoints.length);
|
2641
|
+
position.set(points, 0);
|
2642
|
+
position.set(sidePoints, points.length);
|
2643
|
+
const normal = generateNormal(indices, position);
|
2644
|
+
return { points, indices: new Uint32Array(indices), position, normal, uv: new Float32Array(uv) };
|
2906
2645
|
}
|
2907
2646
|
|
2908
2647
|
/* eslint-disable no-tabs */
|
@@ -4197,539 +3936,504 @@
|
|
4197
3936
|
return PathPointList;
|
4198
3937
|
}();
|
4199
3938
|
|
4200
|
-
|
4201
|
-
|
4202
|
-
|
4203
|
-
|
4204
|
-
|
4205
|
-
|
4206
|
-
|
4207
|
-
|
3939
|
+
const UP$1 = new Vector3(0, 0, 1);
|
3940
|
+
const right = new Vector3();
|
3941
|
+
const left = new Vector3();
|
3942
|
+
// for sharp corners
|
3943
|
+
const leftOffset = new Vector3();
|
3944
|
+
const rightOffset = new Vector3();
|
3945
|
+
const tempPoint1 = new Vector3();
|
3946
|
+
const tempPoint2 = new Vector3();
|
4208
3947
|
function expandPaths(lines, options) {
|
4209
|
-
|
4210
|
-
|
4211
|
-
|
4212
|
-
|
4213
|
-
|
4214
|
-
|
4215
|
-
|
4216
|
-
|
4217
|
-
|
4218
|
-
|
4219
|
-
|
4220
|
-
|
4221
|
-
|
4222
|
-
|
4223
|
-
|
3948
|
+
options = Object.assign({}, { lineWidth: 1, cornerRadius: 0, cornerSplit: 10 }, options);
|
3949
|
+
const results = lines.map(line => {
|
3950
|
+
const points = line2Vectors(line);
|
3951
|
+
const pathPointList = new PathPointList();
|
3952
|
+
//@ts-ignore
|
3953
|
+
pathPointList.set(points, options.cornerRadius, options.cornerSplit, UP$1);
|
3954
|
+
const params = generatePathVertexData(pathPointList, options);
|
3955
|
+
const result = {
|
3956
|
+
position: new Float32Array(params.position),
|
3957
|
+
indices: new Uint32Array(params.indices),
|
3958
|
+
uv: new Float32Array(params.uv),
|
3959
|
+
normal: new Float32Array(params.normal),
|
3960
|
+
line,
|
3961
|
+
count: params.count
|
3962
|
+
};
|
3963
|
+
return result;
|
3964
|
+
});
|
3965
|
+
const result = merge(results);
|
3966
|
+
result.lines = lines;
|
4224
3967
|
return result;
|
4225
|
-
|
4226
|
-
|
4227
|
-
result.lines = lines;
|
4228
|
-
return result;
|
4229
|
-
} // Vertex Data Generate Functions
|
3968
|
+
}
|
3969
|
+
// Vertex Data Generate Functions
|
4230
3970
|
// code copy from https://github.com/shawn0326/three.path/blob/master/src/PathGeometry.js
|
4231
|
-
|
4232
3971
|
function generatePathVertexData(pathPointList, options) {
|
4233
|
-
|
4234
|
-
|
4235
|
-
|
4236
|
-
|
4237
|
-
|
4238
|
-
|
4239
|
-
|
4240
|
-
|
4241
|
-
|
4242
|
-
|
4243
|
-
|
4244
|
-
|
4245
|
-
|
4246
|
-
|
4247
|
-
|
4248
|
-
|
4249
|
-
|
4250
|
-
|
4251
|
-
|
4252
|
-
|
4253
|
-
|
4254
|
-
var nIndex = normal.length - 1;
|
4255
|
-
var uIndex = uv.length - 1;
|
4256
|
-
var iIndex = indices.length - 1;
|
4257
|
-
|
4258
|
-
function addVertices(pathPoint) {
|
4259
|
-
var first = position.length === 0;
|
4260
|
-
var sharpCorner = pathPoint.sharp && !first;
|
4261
|
-
var uvDist = pathPoint.dist / sideWidth; // const uvDist2 = pathPoint.dist / totalDistance;
|
4262
|
-
|
4263
|
-
var dir = pathPoint.dir;
|
4264
|
-
var up = pathPoint.up;
|
4265
|
-
var _right = pathPoint.right;
|
4266
|
-
|
4267
|
-
{
|
4268
|
-
right.copy(_right).multiplyScalar(halfWidth * pathPoint.widthScale);
|
3972
|
+
const width = options.lineWidth || 0.1;
|
3973
|
+
const progress = 1;
|
3974
|
+
const halfWidth = width / 2;
|
3975
|
+
const sideWidth = (width);
|
3976
|
+
const totalDistance = pathPointList.distance();
|
3977
|
+
const progressDistance = progress * totalDistance;
|
3978
|
+
let count = 0;
|
3979
|
+
// modify data
|
3980
|
+
const position = [];
|
3981
|
+
const normal = [];
|
3982
|
+
const uv = [];
|
3983
|
+
const indices = [];
|
3984
|
+
let verticesCount = 0;
|
3985
|
+
if (totalDistance === 0) {
|
3986
|
+
return {
|
3987
|
+
position: position,
|
3988
|
+
normal,
|
3989
|
+
uv: uv,
|
3990
|
+
indices: indices,
|
3991
|
+
count
|
3992
|
+
};
|
4269
3993
|
}
|
4270
|
-
|
4271
|
-
|
4272
|
-
|
3994
|
+
const sharpUvOffset = halfWidth / sideWidth;
|
3995
|
+
// const sharpUvOffset2 = halfWidth / totalDistance;
|
3996
|
+
let pIndex = position.length - 1;
|
3997
|
+
let nIndex = normal.length - 1;
|
3998
|
+
let uIndex = uv.length - 1;
|
3999
|
+
let iIndex = indices.length - 1;
|
4000
|
+
function addVertices(pathPoint) {
|
4001
|
+
const first = position.length === 0;
|
4002
|
+
const sharpCorner = pathPoint.sharp && !first;
|
4003
|
+
const uvDist = pathPoint.dist / sideWidth;
|
4004
|
+
// const uvDist2 = pathPoint.dist / totalDistance;
|
4005
|
+
const dir = pathPoint.dir;
|
4006
|
+
const up = pathPoint.up;
|
4007
|
+
const _right = pathPoint.right;
|
4008
|
+
//@ts-ignore
|
4009
|
+
{
|
4010
|
+
right.copy(_right).multiplyScalar(halfWidth * pathPoint.widthScale);
|
4011
|
+
}
|
4012
|
+
//@ts-ignore
|
4013
|
+
{
|
4014
|
+
left.copy(_right).multiplyScalar(-halfWidth * pathPoint.widthScale);
|
4015
|
+
}
|
4016
|
+
right.add(pathPoint.pos);
|
4017
|
+
left.add(pathPoint.pos);
|
4018
|
+
if (sharpCorner) {
|
4019
|
+
leftOffset.fromArray(position, position.length - 6).sub(left);
|
4020
|
+
rightOffset.fromArray(position, position.length - 3).sub(right);
|
4021
|
+
const leftDist = leftOffset.length();
|
4022
|
+
const rightDist = rightOffset.length();
|
4023
|
+
const sideOffset = leftDist - rightDist;
|
4024
|
+
let longerOffset, longEdge;
|
4025
|
+
if (sideOffset > 0) {
|
4026
|
+
longerOffset = leftOffset;
|
4027
|
+
longEdge = left;
|
4028
|
+
}
|
4029
|
+
else {
|
4030
|
+
longerOffset = rightOffset;
|
4031
|
+
longEdge = right;
|
4032
|
+
}
|
4033
|
+
tempPoint1.copy(longerOffset).setLength(Math.abs(sideOffset)).add(longEdge);
|
4034
|
+
// eslint-disable-next-line prefer-const
|
4035
|
+
let _cos = tempPoint2.copy(longEdge).sub(tempPoint1).normalize().dot(dir);
|
4036
|
+
// eslint-disable-next-line prefer-const
|
4037
|
+
let _len = tempPoint2.copy(longEdge).sub(tempPoint1).length();
|
4038
|
+
// eslint-disable-next-line prefer-const
|
4039
|
+
let _dist = _cos * _len * 2;
|
4040
|
+
tempPoint2.copy(dir).setLength(_dist).add(tempPoint1);
|
4041
|
+
if (sideOffset > 0) {
|
4042
|
+
position[++pIndex] = tempPoint1.x;
|
4043
|
+
position[++pIndex] = tempPoint1.y;
|
4044
|
+
position[++pIndex] = tempPoint1.z;
|
4045
|
+
position[++pIndex] = right.x;
|
4046
|
+
position[++pIndex] = right.y;
|
4047
|
+
position[++pIndex] = right.z;
|
4048
|
+
position[++pIndex] = left.x;
|
4049
|
+
position[++pIndex] = left.y;
|
4050
|
+
position[++pIndex] = left.z;
|
4051
|
+
position[++pIndex] = right.x;
|
4052
|
+
position[++pIndex] = right.y;
|
4053
|
+
position[++pIndex] = right.z;
|
4054
|
+
position[++pIndex] = tempPoint2.x;
|
4055
|
+
position[++pIndex] = tempPoint2.y;
|
4056
|
+
position[++pIndex] = tempPoint2.z;
|
4057
|
+
position[++pIndex] = right.x;
|
4058
|
+
position[++pIndex] = right.y;
|
4059
|
+
position[++pIndex] = right.z;
|
4060
|
+
// position.push(
|
4061
|
+
// tempPoint1.x, tempPoint1.y, tempPoint1.z, // 6
|
4062
|
+
// right.x, right.y, right.z, // 5
|
4063
|
+
// left.x, left.y, left.z, // 4
|
4064
|
+
// right.x, right.y, right.z, // 3
|
4065
|
+
// tempPoint2.x, tempPoint2.y, tempPoint2.z, // 2
|
4066
|
+
// right.x, right.y, right.z // 1
|
4067
|
+
// );
|
4068
|
+
verticesCount += 6;
|
4069
|
+
indices[++iIndex] = verticesCount - 6;
|
4070
|
+
indices[++iIndex] = verticesCount - 8;
|
4071
|
+
indices[++iIndex] = verticesCount - 7;
|
4072
|
+
indices[++iIndex] = verticesCount - 6;
|
4073
|
+
indices[++iIndex] = verticesCount - 7;
|
4074
|
+
indices[++iIndex] = verticesCount - 5;
|
4075
|
+
indices[++iIndex] = verticesCount - 4;
|
4076
|
+
indices[++iIndex] = verticesCount - 6;
|
4077
|
+
indices[++iIndex] = verticesCount - 5;
|
4078
|
+
indices[++iIndex] = verticesCount - 2;
|
4079
|
+
indices[++iIndex] = verticesCount - 4;
|
4080
|
+
indices[++iIndex] = verticesCount - 1;
|
4081
|
+
// indices.push(
|
4082
|
+
// verticesCount - 6, verticesCount - 8, verticesCount - 7,
|
4083
|
+
// verticesCount - 6, verticesCount - 7, verticesCount - 5,
|
4084
|
+
// verticesCount - 4, verticesCount - 6, verticesCount - 5,
|
4085
|
+
// verticesCount - 2, verticesCount - 4, verticesCount - 1
|
4086
|
+
// );
|
4087
|
+
count += 12;
|
4088
|
+
}
|
4089
|
+
else {
|
4090
|
+
position[++pIndex] = left.x;
|
4091
|
+
position[++pIndex] = left.y;
|
4092
|
+
position[++pIndex] = left.z;
|
4093
|
+
position[++pIndex] = tempPoint1.x;
|
4094
|
+
position[++pIndex] = tempPoint1.y;
|
4095
|
+
position[++pIndex] = tempPoint1.z;
|
4096
|
+
position[++pIndex] = left.x;
|
4097
|
+
position[++pIndex] = left.y;
|
4098
|
+
position[++pIndex] = left.z;
|
4099
|
+
position[++pIndex] = right.x;
|
4100
|
+
position[++pIndex] = right.y;
|
4101
|
+
position[++pIndex] = right.z;
|
4102
|
+
position[++pIndex] = left.x;
|
4103
|
+
position[++pIndex] = left.y;
|
4104
|
+
position[++pIndex] = left.z;
|
4105
|
+
position[++pIndex] = tempPoint2.x;
|
4106
|
+
position[++pIndex] = tempPoint2.y;
|
4107
|
+
position[++pIndex] = tempPoint2.z;
|
4108
|
+
// position.push(
|
4109
|
+
// left.x, left.y, left.z, // 6
|
4110
|
+
// tempPoint1.x, tempPoint1.y, tempPoint1.z, // 5
|
4111
|
+
// left.x, left.y, left.z, // 4
|
4112
|
+
// right.x, right.y, right.z, // 3
|
4113
|
+
// left.x, left.y, left.z, // 2
|
4114
|
+
// tempPoint2.x, tempPoint2.y, tempPoint2.z // 1
|
4115
|
+
// );
|
4116
|
+
verticesCount += 6;
|
4117
|
+
indices[++iIndex] = verticesCount - 6;
|
4118
|
+
indices[++iIndex] = verticesCount - 8;
|
4119
|
+
indices[++iIndex] = verticesCount - 7;
|
4120
|
+
indices[++iIndex] = verticesCount - 6;
|
4121
|
+
indices[++iIndex] = verticesCount - 7;
|
4122
|
+
indices[++iIndex] = verticesCount - 5;
|
4123
|
+
indices[++iIndex] = verticesCount - 6;
|
4124
|
+
indices[++iIndex] = verticesCount - 5;
|
4125
|
+
indices[++iIndex] = verticesCount - 3;
|
4126
|
+
indices[++iIndex] = verticesCount - 2;
|
4127
|
+
indices[++iIndex] = verticesCount - 3;
|
4128
|
+
indices[++iIndex] = verticesCount - 1;
|
4129
|
+
// indices.push(
|
4130
|
+
// verticesCount - 6, verticesCount - 8, verticesCount - 7,
|
4131
|
+
// verticesCount - 6, verticesCount - 7, verticesCount - 5,
|
4132
|
+
// verticesCount - 6, verticesCount - 5, verticesCount - 3,
|
4133
|
+
// verticesCount - 2, verticesCount - 3, verticesCount - 1
|
4134
|
+
// );
|
4135
|
+
count += 12;
|
4136
|
+
}
|
4137
|
+
for (let i = 0; i < 6; i++) {
|
4138
|
+
normal[++nIndex] = up.x;
|
4139
|
+
normal[++nIndex] = up.y;
|
4140
|
+
normal[++nIndex] = up.z;
|
4141
|
+
}
|
4142
|
+
// normal.push(
|
4143
|
+
// up.x, up.y, up.z,
|
4144
|
+
// up.x, up.y, up.z,
|
4145
|
+
// up.x, up.y, up.z,
|
4146
|
+
// up.x, up.y, up.z,
|
4147
|
+
// up.x, up.y, up.z,
|
4148
|
+
// up.x, up.y, up.z
|
4149
|
+
// );
|
4150
|
+
uv[++uIndex] = uvDist - sharpUvOffset;
|
4151
|
+
uv[++uIndex] = 0;
|
4152
|
+
uv[++uIndex] = uvDist - sharpUvOffset;
|
4153
|
+
uv[++uIndex] = 1;
|
4154
|
+
uv[++uIndex] = uvDist;
|
4155
|
+
uv[++uIndex] = 0;
|
4156
|
+
uv[++uIndex] = uvDist;
|
4157
|
+
uv[++uIndex] = 1;
|
4158
|
+
uv[++uIndex] = uvDist + sharpUvOffset;
|
4159
|
+
uv[++uIndex] = 0;
|
4160
|
+
uv[++uIndex] = uvDist + sharpUvOffset;
|
4161
|
+
uv[++uIndex] = 1;
|
4162
|
+
// uv.push(
|
4163
|
+
// uvDist - sharpUvOffset, 0,
|
4164
|
+
// uvDist - sharpUvOffset, 1,
|
4165
|
+
// uvDist, 0,
|
4166
|
+
// uvDist, 1,
|
4167
|
+
// uvDist + sharpUvOffset, 0,
|
4168
|
+
// uvDist + sharpUvOffset, 1
|
4169
|
+
// );
|
4170
|
+
// if (generateUv2) {
|
4171
|
+
// uv2.push(
|
4172
|
+
// uvDist2 - sharpUvOffset2, 0,
|
4173
|
+
// uvDist2 - sharpUvOffset2, 1,
|
4174
|
+
// uvDist2, 0,
|
4175
|
+
// uvDist2, 1,
|
4176
|
+
// uvDist2 + sharpUvOffset2, 0,
|
4177
|
+
// uvDist2 + sharpUvOffset2, 1
|
4178
|
+
// );
|
4179
|
+
// }
|
4180
|
+
}
|
4181
|
+
else {
|
4182
|
+
position[++pIndex] = left.x;
|
4183
|
+
position[++pIndex] = left.y;
|
4184
|
+
position[++pIndex] = left.z;
|
4185
|
+
position[++pIndex] = right.x;
|
4186
|
+
position[++pIndex] = right.y;
|
4187
|
+
position[++pIndex] = right.z;
|
4188
|
+
// position.push(
|
4189
|
+
// left.x, left.y, left.z,
|
4190
|
+
// right.x, right.y, right.z
|
4191
|
+
// );
|
4192
|
+
normal[++nIndex] = up.x;
|
4193
|
+
normal[++nIndex] = up.y;
|
4194
|
+
normal[++nIndex] = up.z;
|
4195
|
+
normal[++nIndex] = up.x;
|
4196
|
+
normal[++nIndex] = up.y;
|
4197
|
+
normal[++nIndex] = up.z;
|
4198
|
+
// normal.push(
|
4199
|
+
// up.x, up.y, up.z,
|
4200
|
+
// up.x, up.y, up.z
|
4201
|
+
// );
|
4202
|
+
uv[++uIndex] = uvDist;
|
4203
|
+
uv[++uIndex] = 0;
|
4204
|
+
uv[++uIndex] = uvDist;
|
4205
|
+
uv[++uIndex] = 1;
|
4206
|
+
// uv.push(
|
4207
|
+
// uvDist, 0,
|
4208
|
+
// uvDist, 1
|
4209
|
+
// );
|
4210
|
+
// if (generateUv2) {
|
4211
|
+
// uv2.push(
|
4212
|
+
// uvDist2, 0,
|
4213
|
+
// uvDist2, 1
|
4214
|
+
// );
|
4215
|
+
// }
|
4216
|
+
verticesCount += 2;
|
4217
|
+
if (!first) {
|
4218
|
+
indices[++iIndex] = verticesCount - 2;
|
4219
|
+
indices[++iIndex] = verticesCount - 4;
|
4220
|
+
indices[++iIndex] = verticesCount - 3;
|
4221
|
+
indices[++iIndex] = verticesCount - 2;
|
4222
|
+
indices[++iIndex] = verticesCount - 3;
|
4223
|
+
indices[++iIndex] = verticesCount - 1;
|
4224
|
+
// indices.push(
|
4225
|
+
// verticesCount - 2, verticesCount - 4, verticesCount - 3,
|
4226
|
+
// verticesCount - 2, verticesCount - 3, verticesCount - 1
|
4227
|
+
// );
|
4228
|
+
count += 6;
|
4229
|
+
}
|
4230
|
+
}
|
4273
4231
|
}
|
4274
|
-
|
4275
|
-
|
4276
|
-
|
4277
|
-
|
4278
|
-
|
4279
|
-
|
4280
|
-
|
4281
|
-
|
4282
|
-
|
4283
|
-
|
4284
|
-
|
4285
|
-
|
4286
|
-
|
4287
|
-
|
4288
|
-
|
4289
|
-
|
4290
|
-
|
4291
|
-
longEdge = right;
|
4292
|
-
}
|
4293
|
-
|
4294
|
-
tempPoint1.copy(longerOffset).setLength(Math.abs(sideOffset)).add(longEdge); // eslint-disable-next-line prefer-const
|
4295
|
-
|
4296
|
-
var _cos = tempPoint2.copy(longEdge).sub(tempPoint1).normalize().dot(dir); // eslint-disable-next-line prefer-const
|
4297
|
-
|
4298
|
-
|
4299
|
-
var _len = tempPoint2.copy(longEdge).sub(tempPoint1).length(); // eslint-disable-next-line prefer-const
|
4300
|
-
|
4301
|
-
|
4302
|
-
var _dist = _cos * _len * 2;
|
4303
|
-
|
4304
|
-
tempPoint2.copy(dir).setLength(_dist).add(tempPoint1);
|
4305
|
-
|
4306
|
-
if (sideOffset > 0) {
|
4307
|
-
position[++pIndex] = tempPoint1.x;
|
4308
|
-
position[++pIndex] = tempPoint1.y;
|
4309
|
-
position[++pIndex] = tempPoint1.z;
|
4310
|
-
position[++pIndex] = right.x;
|
4311
|
-
position[++pIndex] = right.y;
|
4312
|
-
position[++pIndex] = right.z;
|
4313
|
-
position[++pIndex] = left.x;
|
4314
|
-
position[++pIndex] = left.y;
|
4315
|
-
position[++pIndex] = left.z;
|
4316
|
-
position[++pIndex] = right.x;
|
4317
|
-
position[++pIndex] = right.y;
|
4318
|
-
position[++pIndex] = right.z;
|
4319
|
-
position[++pIndex] = tempPoint2.x;
|
4320
|
-
position[++pIndex] = tempPoint2.y;
|
4321
|
-
position[++pIndex] = tempPoint2.z;
|
4322
|
-
position[++pIndex] = right.x;
|
4323
|
-
position[++pIndex] = right.y;
|
4324
|
-
position[++pIndex] = right.z; // position.push(
|
4325
|
-
// tempPoint1.x, tempPoint1.y, tempPoint1.z, // 6
|
4326
|
-
// right.x, right.y, right.z, // 5
|
4327
|
-
// left.x, left.y, left.z, // 4
|
4328
|
-
// right.x, right.y, right.z, // 3
|
4329
|
-
// tempPoint2.x, tempPoint2.y, tempPoint2.z, // 2
|
4330
|
-
// right.x, right.y, right.z // 1
|
4331
|
-
// );
|
4332
|
-
|
4333
|
-
verticesCount += 6;
|
4334
|
-
indices[++iIndex] = verticesCount - 6;
|
4335
|
-
indices[++iIndex] = verticesCount - 8;
|
4336
|
-
indices[++iIndex] = verticesCount - 7;
|
4337
|
-
indices[++iIndex] = verticesCount - 6;
|
4338
|
-
indices[++iIndex] = verticesCount - 7;
|
4339
|
-
indices[++iIndex] = verticesCount - 5;
|
4340
|
-
indices[++iIndex] = verticesCount - 4;
|
4341
|
-
indices[++iIndex] = verticesCount - 6;
|
4342
|
-
indices[++iIndex] = verticesCount - 5;
|
4343
|
-
indices[++iIndex] = verticesCount - 2;
|
4344
|
-
indices[++iIndex] = verticesCount - 4;
|
4345
|
-
indices[++iIndex] = verticesCount - 1; // indices.push(
|
4346
|
-
// verticesCount - 6, verticesCount - 8, verticesCount - 7,
|
4347
|
-
// verticesCount - 6, verticesCount - 7, verticesCount - 5,
|
4348
|
-
// verticesCount - 4, verticesCount - 6, verticesCount - 5,
|
4349
|
-
// verticesCount - 2, verticesCount - 4, verticesCount - 1
|
4350
|
-
// );
|
4351
|
-
|
4352
|
-
count += 12;
|
4353
|
-
} else {
|
4354
|
-
position[++pIndex] = left.x;
|
4355
|
-
position[++pIndex] = left.y;
|
4356
|
-
position[++pIndex] = left.z;
|
4357
|
-
position[++pIndex] = tempPoint1.x;
|
4358
|
-
position[++pIndex] = tempPoint1.y;
|
4359
|
-
position[++pIndex] = tempPoint1.z;
|
4360
|
-
position[++pIndex] = left.x;
|
4361
|
-
position[++pIndex] = left.y;
|
4362
|
-
position[++pIndex] = left.z;
|
4363
|
-
position[++pIndex] = right.x;
|
4364
|
-
position[++pIndex] = right.y;
|
4365
|
-
position[++pIndex] = right.z;
|
4366
|
-
position[++pIndex] = left.x;
|
4367
|
-
position[++pIndex] = left.y;
|
4368
|
-
position[++pIndex] = left.z;
|
4369
|
-
position[++pIndex] = tempPoint2.x;
|
4370
|
-
position[++pIndex] = tempPoint2.y;
|
4371
|
-
position[++pIndex] = tempPoint2.z; // position.push(
|
4372
|
-
// left.x, left.y, left.z, // 6
|
4373
|
-
// tempPoint1.x, tempPoint1.y, tempPoint1.z, // 5
|
4374
|
-
// left.x, left.y, left.z, // 4
|
4375
|
-
// right.x, right.y, right.z, // 3
|
4376
|
-
// left.x, left.y, left.z, // 2
|
4377
|
-
// tempPoint2.x, tempPoint2.y, tempPoint2.z // 1
|
4378
|
-
// );
|
4379
|
-
|
4380
|
-
verticesCount += 6;
|
4381
|
-
indices[++iIndex] = verticesCount - 6;
|
4382
|
-
indices[++iIndex] = verticesCount - 8;
|
4383
|
-
indices[++iIndex] = verticesCount - 7;
|
4384
|
-
indices[++iIndex] = verticesCount - 6;
|
4385
|
-
indices[++iIndex] = verticesCount - 7;
|
4386
|
-
indices[++iIndex] = verticesCount - 5;
|
4387
|
-
indices[++iIndex] = verticesCount - 6;
|
4388
|
-
indices[++iIndex] = verticesCount - 5;
|
4389
|
-
indices[++iIndex] = verticesCount - 3;
|
4390
|
-
indices[++iIndex] = verticesCount - 2;
|
4391
|
-
indices[++iIndex] = verticesCount - 3;
|
4392
|
-
indices[++iIndex] = verticesCount - 1; // indices.push(
|
4393
|
-
// verticesCount - 6, verticesCount - 8, verticesCount - 7,
|
4394
|
-
// verticesCount - 6, verticesCount - 7, verticesCount - 5,
|
4395
|
-
// verticesCount - 6, verticesCount - 5, verticesCount - 3,
|
4396
|
-
// verticesCount - 2, verticesCount - 3, verticesCount - 1
|
4397
|
-
// );
|
4398
|
-
|
4399
|
-
count += 12;
|
4400
|
-
}
|
4401
|
-
|
4402
|
-
for (var i = 0; i < 6; i++) {
|
4403
|
-
normal[++nIndex] = up.x;
|
4404
|
-
normal[++nIndex] = up.y;
|
4405
|
-
normal[++nIndex] = up.z;
|
4406
|
-
} // normal.push(
|
4407
|
-
// up.x, up.y, up.z,
|
4408
|
-
// up.x, up.y, up.z,
|
4409
|
-
// up.x, up.y, up.z,
|
4410
|
-
// up.x, up.y, up.z,
|
4411
|
-
// up.x, up.y, up.z,
|
4412
|
-
// up.x, up.y, up.z
|
4413
|
-
// );
|
4414
|
-
|
4415
|
-
|
4416
|
-
uv[++uIndex] = uvDist - sharpUvOffset;
|
4417
|
-
uv[++uIndex] = 0;
|
4418
|
-
uv[++uIndex] = uvDist - sharpUvOffset;
|
4419
|
-
uv[++uIndex] = 1;
|
4420
|
-
uv[++uIndex] = uvDist;
|
4421
|
-
uv[++uIndex] = 0;
|
4422
|
-
uv[++uIndex] = uvDist;
|
4423
|
-
uv[++uIndex] = 1;
|
4424
|
-
uv[++uIndex] = uvDist + sharpUvOffset;
|
4425
|
-
uv[++uIndex] = 0;
|
4426
|
-
uv[++uIndex] = uvDist + sharpUvOffset;
|
4427
|
-
uv[++uIndex] = 1; // uv.push(
|
4428
|
-
// uvDist - sharpUvOffset, 0,
|
4429
|
-
// uvDist - sharpUvOffset, 1,
|
4430
|
-
// uvDist, 0,
|
4431
|
-
// uvDist, 1,
|
4432
|
-
// uvDist + sharpUvOffset, 0,
|
4433
|
-
// uvDist + sharpUvOffset, 1
|
4434
|
-
// );
|
4435
|
-
// if (generateUv2) {
|
4436
|
-
// uv2.push(
|
4437
|
-
// uvDist2 - sharpUvOffset2, 0,
|
4438
|
-
// uvDist2 - sharpUvOffset2, 1,
|
4439
|
-
// uvDist2, 0,
|
4440
|
-
// uvDist2, 1,
|
4441
|
-
// uvDist2 + sharpUvOffset2, 0,
|
4442
|
-
// uvDist2 + sharpUvOffset2, 1
|
4443
|
-
// );
|
4444
|
-
// }
|
4445
|
-
} else {
|
4446
|
-
position[++pIndex] = left.x;
|
4447
|
-
position[++pIndex] = left.y;
|
4448
|
-
position[++pIndex] = left.z;
|
4449
|
-
position[++pIndex] = right.x;
|
4450
|
-
position[++pIndex] = right.y;
|
4451
|
-
position[++pIndex] = right.z; // position.push(
|
4452
|
-
// left.x, left.y, left.z,
|
4453
|
-
// right.x, right.y, right.z
|
4454
|
-
// );
|
4455
|
-
|
4456
|
-
normal[++nIndex] = up.x;
|
4457
|
-
normal[++nIndex] = up.y;
|
4458
|
-
normal[++nIndex] = up.z;
|
4459
|
-
normal[++nIndex] = up.x;
|
4460
|
-
normal[++nIndex] = up.y;
|
4461
|
-
normal[++nIndex] = up.z; // normal.push(
|
4462
|
-
// up.x, up.y, up.z,
|
4463
|
-
// up.x, up.y, up.z
|
4464
|
-
// );
|
4465
|
-
|
4466
|
-
uv[++uIndex] = uvDist;
|
4467
|
-
uv[++uIndex] = 0;
|
4468
|
-
uv[++uIndex] = uvDist;
|
4469
|
-
uv[++uIndex] = 1; // uv.push(
|
4470
|
-
// uvDist, 0,
|
4471
|
-
// uvDist, 1
|
4472
|
-
// );
|
4473
|
-
// if (generateUv2) {
|
4474
|
-
// uv2.push(
|
4475
|
-
// uvDist2, 0,
|
4476
|
-
// uvDist2, 1
|
4477
|
-
// );
|
4478
|
-
// }
|
4479
|
-
|
4480
|
-
verticesCount += 2;
|
4481
|
-
|
4482
|
-
if (!first) {
|
4483
|
-
indices[++iIndex] = verticesCount - 2;
|
4484
|
-
indices[++iIndex] = verticesCount - 4;
|
4485
|
-
indices[++iIndex] = verticesCount - 3;
|
4486
|
-
indices[++iIndex] = verticesCount - 2;
|
4487
|
-
indices[++iIndex] = verticesCount - 3;
|
4488
|
-
indices[++iIndex] = verticesCount - 1; // indices.push(
|
4489
|
-
// verticesCount - 2, verticesCount - 4, verticesCount - 3,
|
4490
|
-
// verticesCount - 2, verticesCount - 3, verticesCount - 1
|
4491
|
-
// );
|
4492
|
-
|
4493
|
-
count += 6;
|
4494
|
-
}
|
4232
|
+
let lastPoint;
|
4233
|
+
if (progressDistance > 0) {
|
4234
|
+
for (let i = 0; i < pathPointList.count; i++) {
|
4235
|
+
const pathPoint = pathPointList.array[i];
|
4236
|
+
if (pathPoint.dist > progressDistance) {
|
4237
|
+
const prevPoint = pathPointList.array[i - 1];
|
4238
|
+
lastPoint = new PathPoint();
|
4239
|
+
// linear lerp for progress
|
4240
|
+
const alpha = (progressDistance - prevPoint.dist) / (pathPoint.dist - prevPoint.dist);
|
4241
|
+
lastPoint.lerpPathPoints(prevPoint, pathPoint, alpha);
|
4242
|
+
addVertices(lastPoint);
|
4243
|
+
break;
|
4244
|
+
}
|
4245
|
+
else {
|
4246
|
+
addVertices(pathPoint);
|
4247
|
+
}
|
4248
|
+
}
|
4495
4249
|
}
|
4496
|
-
|
4497
|
-
|
4498
|
-
var lastPoint;
|
4499
|
-
|
4500
|
-
if (progressDistance > 0) {
|
4501
|
-
for (var i = 0; i < pathPointList.count; i++) {
|
4502
|
-
var pathPoint = pathPointList.array[i];
|
4503
|
-
|
4504
|
-
if (pathPoint.dist > progressDistance) {
|
4505
|
-
var prevPoint = pathPointList.array[i - 1];
|
4506
|
-
lastPoint = new PathPoint(); // linear lerp for progress
|
4507
|
-
|
4508
|
-
var alpha = (progressDistance - prevPoint.dist) / (pathPoint.dist - prevPoint.dist);
|
4509
|
-
lastPoint.lerpPathPoints(prevPoint, pathPoint, alpha);
|
4510
|
-
addVertices(lastPoint);
|
4511
|
-
break;
|
4512
|
-
} else {
|
4513
|
-
addVertices(pathPoint);
|
4514
|
-
}
|
4250
|
+
else {
|
4251
|
+
lastPoint = pathPointList.array[0];
|
4515
4252
|
}
|
4516
|
-
|
4517
|
-
|
4518
|
-
|
4519
|
-
|
4520
|
-
|
4521
|
-
|
4522
|
-
|
4523
|
-
uv: uv,
|
4524
|
-
indices: indices,
|
4525
|
-
count: count
|
4526
|
-
};
|
4253
|
+
return {
|
4254
|
+
position: position,
|
4255
|
+
normal,
|
4256
|
+
uv: uv,
|
4257
|
+
indices: indices,
|
4258
|
+
count
|
4259
|
+
};
|
4527
4260
|
}
|
4528
4261
|
|
4529
|
-
|
4530
|
-
|
4262
|
+
const UP = new Vector3(0, 0, 1);
|
4263
|
+
const normalDir = new Vector3();
|
4531
4264
|
function expandTubes(lines, options) {
|
4532
|
-
|
4533
|
-
|
4534
|
-
|
4535
|
-
|
4536
|
-
|
4537
|
-
|
4538
|
-
|
4539
|
-
|
4540
|
-
|
4541
|
-
|
4542
|
-
|
4543
|
-
|
4544
|
-
|
4545
|
-
|
4546
|
-
result
|
4547
|
-
result.
|
4265
|
+
options = Object.assign({}, { radius: 1, cornerSplit: 0, radialSegments: 8, startRad: -Math.PI / 4 }, options);
|
4266
|
+
const results = lines.map(line => {
|
4267
|
+
const points = line2Vectors(line);
|
4268
|
+
const pathPointList = new PathPointList();
|
4269
|
+
//@ts-ignore
|
4270
|
+
pathPointList.set(points, 0, options.cornerSplit, UP);
|
4271
|
+
const result = generateTubeVertexData(pathPointList, options);
|
4272
|
+
result.line = line;
|
4273
|
+
result.position = new Float32Array(result.points);
|
4274
|
+
result.indices = new Uint32Array(result.indices);
|
4275
|
+
result.uv = new Float32Array(result.uv);
|
4276
|
+
result.normal = new Float32Array(result.normal);
|
4277
|
+
return result;
|
4278
|
+
});
|
4279
|
+
const result = merge(results);
|
4280
|
+
result.lines = lines;
|
4548
4281
|
return result;
|
4549
|
-
|
4550
|
-
|
4551
|
-
result.lines = lines;
|
4552
|
-
return result;
|
4553
|
-
} // Vertex Data Generate Functions
|
4282
|
+
}
|
4283
|
+
// Vertex Data Generate Functions
|
4554
4284
|
// code copy from https://github.com/shawn0326/three.path/blob/master/src/PathGeometry.js
|
4555
|
-
|
4556
4285
|
function generateTubeVertexData(pathPointList, options) {
|
4557
|
-
|
4558
|
-
|
4559
|
-
|
4560
|
-
|
4561
|
-
|
4562
|
-
|
4563
|
-
|
4564
|
-
|
4565
|
-
|
4566
|
-
return null;
|
4567
|
-
}
|
4568
|
-
|
4569
|
-
var count = 0; // modify data
|
4570
|
-
|
4571
|
-
var points = [];
|
4572
|
-
var normal = [];
|
4573
|
-
var uv = []; // const uv2 = [];
|
4574
|
-
|
4575
|
-
var indices = [];
|
4576
|
-
var verticesCount = 0;
|
4577
|
-
var pIndex = -1;
|
4578
|
-
var nIndex = -1;
|
4579
|
-
var uIndex = -1;
|
4580
|
-
var iIndex = -1;
|
4581
|
-
|
4582
|
-
function addVertices(pathPoint, radius, radialSegments) {
|
4583
|
-
var first = points.length === 0;
|
4584
|
-
var uvDist = pathPoint.dist / circum; // const uvDist2 = pathPoint.dist / totalDistance;
|
4585
|
-
|
4586
|
-
for (var i = 0; i <= radialSegments; i++) {
|
4587
|
-
var r = i;
|
4588
|
-
|
4589
|
-
if (r === radialSegments) {
|
4590
|
-
r = 0;
|
4591
|
-
}
|
4592
|
-
|
4593
|
-
normalDir.copy(pathPoint.up).applyAxisAngle(pathPoint.dir, startRad + Math.PI * 2 * r / radialSegments).normalize();
|
4594
|
-
var scale = radius * pathPoint.widthScale;
|
4595
|
-
points[++pIndex] = pathPoint.pos.x + normalDir.x * scale;
|
4596
|
-
points[++pIndex] = pathPoint.pos.y + normalDir.y * scale;
|
4597
|
-
points[++pIndex] = pathPoint.pos.z + normalDir.z * scale;
|
4598
|
-
normal[++nIndex] = normalDir.x;
|
4599
|
-
normal[++nIndex] = normalDir.y;
|
4600
|
-
normal[++nIndex] = normalDir.z;
|
4601
|
-
uv[++uIndex] = uvDist;
|
4602
|
-
uv[++uIndex] = i / radialSegments; // uvs.push(uvDist, r / radialSegments);
|
4603
|
-
// if (generateUv2) {
|
4604
|
-
// uv2.push(uvDist2, r / radialSegments);
|
4605
|
-
// }
|
4606
|
-
|
4607
|
-
verticesCount++;
|
4286
|
+
const radius = Math.max(options.radius || 1, 0.00000001);
|
4287
|
+
const progress = options.progress !== undefined ? options.progress : 1;
|
4288
|
+
const radialSegments = Math.max(3, options.radialSegments || 8);
|
4289
|
+
const startRad = options.startRad || 0;
|
4290
|
+
const circum = radius * 2 * Math.PI;
|
4291
|
+
const totalDistance = pathPointList.distance();
|
4292
|
+
const progressDistance = progress * totalDistance;
|
4293
|
+
if (progressDistance === 0) {
|
4294
|
+
return null;
|
4608
4295
|
}
|
4609
|
-
|
4610
|
-
|
4611
|
-
|
4612
|
-
|
4613
|
-
|
4614
|
-
|
4615
|
-
|
4616
|
-
|
4617
|
-
|
4618
|
-
|
4619
|
-
|
4620
|
-
|
4621
|
-
|
4622
|
-
|
4623
|
-
|
4624
|
-
//
|
4625
|
-
|
4626
|
-
|
4627
|
-
|
4628
|
-
|
4629
|
-
|
4630
|
-
|
4296
|
+
let count = 0;
|
4297
|
+
// modify data
|
4298
|
+
const points = [];
|
4299
|
+
const normal = [];
|
4300
|
+
const uv = [];
|
4301
|
+
// const uv2 = [];
|
4302
|
+
const indices = [];
|
4303
|
+
let verticesCount = 0;
|
4304
|
+
let pIndex = -1;
|
4305
|
+
let nIndex = -1;
|
4306
|
+
let uIndex = -1;
|
4307
|
+
let iIndex = -1;
|
4308
|
+
function addVertices(pathPoint, radius, radialSegments) {
|
4309
|
+
const first = points.length === 0;
|
4310
|
+
const uvDist = pathPoint.dist / circum;
|
4311
|
+
// const uvDist2 = pathPoint.dist / totalDistance;
|
4312
|
+
for (let i = 0; i <= radialSegments; i++) {
|
4313
|
+
let r = i;
|
4314
|
+
if (r === radialSegments) {
|
4315
|
+
r = 0;
|
4316
|
+
}
|
4317
|
+
normalDir.copy(pathPoint.up).applyAxisAngle(pathPoint.dir, startRad + Math.PI * 2 * r / radialSegments).normalize();
|
4318
|
+
const scale = radius * pathPoint.widthScale;
|
4319
|
+
points[++pIndex] = pathPoint.pos.x + normalDir.x * scale;
|
4320
|
+
points[++pIndex] = pathPoint.pos.y + normalDir.y * scale;
|
4321
|
+
points[++pIndex] = pathPoint.pos.z + normalDir.z * scale;
|
4322
|
+
normal[++nIndex] = normalDir.x;
|
4323
|
+
normal[++nIndex] = normalDir.y;
|
4324
|
+
normal[++nIndex] = normalDir.z;
|
4325
|
+
uv[++uIndex] = uvDist;
|
4326
|
+
uv[++uIndex] = i / radialSegments;
|
4327
|
+
// uvs.push(uvDist, r / radialSegments);
|
4328
|
+
// if (generateUv2) {
|
4329
|
+
// uv2.push(uvDist2, r / radialSegments);
|
4330
|
+
// }
|
4331
|
+
verticesCount++;
|
4332
|
+
}
|
4333
|
+
if (!first) {
|
4334
|
+
const begin1 = verticesCount - (radialSegments + 1) * 2;
|
4335
|
+
const begin2 = verticesCount - (radialSegments + 1);
|
4336
|
+
for (let i = 0; i < radialSegments; i++) {
|
4337
|
+
indices[++iIndex] = begin2 + i;
|
4338
|
+
indices[++iIndex] = begin1 + i;
|
4339
|
+
indices[++iIndex] = begin1 + i + 1;
|
4340
|
+
indices[++iIndex] = begin2 + i;
|
4341
|
+
indices[++iIndex] = begin1 + i + 1;
|
4342
|
+
indices[++iIndex] = begin2 + i + 1;
|
4343
|
+
// index.push(
|
4344
|
+
// begin2 + i,
|
4345
|
+
// begin1 + i,
|
4346
|
+
// begin1 + i + 1,
|
4347
|
+
// begin2 + i,
|
4348
|
+
// begin1 + i + 1,
|
4349
|
+
// begin2 + i + 1
|
4350
|
+
// );
|
4351
|
+
count += 6;
|
4352
|
+
}
|
4353
|
+
}
|
4631
4354
|
}
|
4632
|
-
|
4633
|
-
|
4634
|
-
|
4635
|
-
|
4636
|
-
|
4637
|
-
|
4638
|
-
|
4639
|
-
|
4640
|
-
|
4641
|
-
|
4642
|
-
|
4643
|
-
|
4644
|
-
|
4645
|
-
|
4646
|
-
|
4647
|
-
|
4648
|
-
}
|
4355
|
+
if (progressDistance > 0) {
|
4356
|
+
for (let i = 0; i < pathPointList.count; i++) {
|
4357
|
+
const pathPoint = pathPointList.array[i];
|
4358
|
+
if (pathPoint.dist > progressDistance) {
|
4359
|
+
const prevPoint = pathPointList.array[i - 1];
|
4360
|
+
const lastPoint = new PathPoint();
|
4361
|
+
// linear lerp for progress
|
4362
|
+
const alpha = (progressDistance - prevPoint.dist) / (pathPoint.dist - prevPoint.dist);
|
4363
|
+
lastPoint.lerpPathPoints(prevPoint, pathPoint, alpha);
|
4364
|
+
addVertices(lastPoint, radius, radialSegments);
|
4365
|
+
break;
|
4366
|
+
}
|
4367
|
+
else {
|
4368
|
+
addVertices(pathPoint, radius, radialSegments);
|
4369
|
+
}
|
4370
|
+
}
|
4649
4371
|
}
|
4650
|
-
|
4651
|
-
|
4652
|
-
|
4653
|
-
|
4654
|
-
|
4655
|
-
|
4656
|
-
|
4657
|
-
|
4658
|
-
count: count
|
4659
|
-
};
|
4372
|
+
return {
|
4373
|
+
points,
|
4374
|
+
normal,
|
4375
|
+
uv,
|
4376
|
+
// uv2,
|
4377
|
+
indices,
|
4378
|
+
count
|
4379
|
+
};
|
4660
4380
|
}
|
4661
4381
|
|
4662
4382
|
function plane(width, height, devideW, devideH) {
|
4663
|
-
|
4664
|
-
|
4665
|
-
|
4666
|
-
|
4667
|
-
|
4668
|
-
|
4669
|
-
|
4670
|
-
|
4671
|
-
|
4672
|
-
|
4673
|
-
|
4674
|
-
|
4675
|
-
|
4676
|
-
|
4677
|
-
|
4678
|
-
|
4679
|
-
|
4680
|
-
|
4681
|
-
|
4682
|
-
|
4683
|
-
|
4684
|
-
|
4685
|
-
|
4686
|
-
|
4687
|
-
|
4688
|
-
|
4689
|
-
|
4690
|
-
|
4691
|
-
|
4692
|
-
|
4693
|
-
|
4694
|
-
|
4695
|
-
|
4696
|
-
|
4697
|
-
|
4698
|
-
|
4699
|
-
|
4700
|
-
var a = j * (devideW + 1) + i,
|
4701
|
-
b = a + 1,
|
4702
|
-
c = (devideW + 1) * (j + 1) + i,
|
4703
|
-
d = c + 1;
|
4704
|
-
indices[iIndex] = a;
|
4705
|
-
indices[iIndex + 1] = c;
|
4706
|
-
indices[iIndex + 2] = b;
|
4707
|
-
indices[iIndex + 3] = c;
|
4708
|
-
indices[iIndex + 4] = d;
|
4709
|
-
indices[iIndex + 5] = b;
|
4710
|
-
iIndex += 6; // indexs.push(a, c, b, c, d, b);
|
4711
|
-
}
|
4383
|
+
devideW = Math.max(1, devideW);
|
4384
|
+
devideH = Math.max(1, devideH);
|
4385
|
+
const dx = width / devideW, dy = height / devideH;
|
4386
|
+
const minX = -width / 2, maxY = height / 2, minY = -height / 2;
|
4387
|
+
const len = (devideW + 1) * (devideH + 1);
|
4388
|
+
const position = new Float32Array(len * 3), uv = new Float32Array(len * 2), normal = new Float32Array(len * 3), indices = new Uint32Array(len * 10);
|
4389
|
+
let index = 0, uIndex = 0, iIndex = 0;
|
4390
|
+
for (let j = 0; j <= devideH; j++) {
|
4391
|
+
for (let i = 0; i <= devideW; i++) {
|
4392
|
+
const x = minX + dx * i;
|
4393
|
+
const y = maxY - dy * j;
|
4394
|
+
position[index] = x;
|
4395
|
+
position[index + 1] = y;
|
4396
|
+
position[index + 2] = 0;
|
4397
|
+
normal[index] = 0;
|
4398
|
+
normal[index + 1] = 0;
|
4399
|
+
normal[index + 2] = 1;
|
4400
|
+
// position.push(x, y, 0);
|
4401
|
+
// normal.push(0, 0, 1);
|
4402
|
+
const uvx = (x - minX) / width, uvy = (y - minY) / height;
|
4403
|
+
// uv.push(uvx, uvy);
|
4404
|
+
uv[uIndex] = uvx;
|
4405
|
+
uv[uIndex + 1] = uvy;
|
4406
|
+
index += 3;
|
4407
|
+
uIndex += 2;
|
4408
|
+
if (i < devideW && j < devideH) {
|
4409
|
+
const a = j * (devideW + 1) + i, b = a + 1, c = (devideW + 1) * (j + 1) + i, d = c + 1;
|
4410
|
+
indices[iIndex] = a;
|
4411
|
+
indices[iIndex + 1] = c;
|
4412
|
+
indices[iIndex + 2] = b;
|
4413
|
+
indices[iIndex + 3] = c;
|
4414
|
+
indices[iIndex + 4] = d;
|
4415
|
+
indices[iIndex + 5] = b;
|
4416
|
+
iIndex += 6;
|
4417
|
+
// indexs.push(a, c, b, c, d, b);
|
4418
|
+
}
|
4419
|
+
}
|
4712
4420
|
}
|
4713
|
-
|
4714
|
-
|
4715
|
-
|
4716
|
-
|
4717
|
-
|
4718
|
-
|
4719
|
-
|
4720
|
-
|
4721
|
-
|
4722
|
-
|
4723
|
-
|
4724
|
-
|
4725
|
-
|
4726
|
-
|
4727
|
-
|
4728
|
-
|
4729
|
-
uv: uv,
|
4730
|
-
normal: normal,
|
4731
|
-
indices: indexArray
|
4732
|
-
};
|
4421
|
+
const indexArray = new Uint32Array(iIndex);
|
4422
|
+
for (let i = 0, len = indexArray.length; i < len; i++) {
|
4423
|
+
indexArray[i] = indices[i];
|
4424
|
+
}
|
4425
|
+
// for (let j = 0; j < devideH; j++) {
|
4426
|
+
// for (let i = 0; i < devideW; i++) {
|
4427
|
+
// const a = j * (devideW + 1) + i, b = a + 1, c = (devideW + 1) * (j + 1) + i, d = c + 1;
|
4428
|
+
// indexs.push(a, c, b, c, d, b);
|
4429
|
+
// }
|
4430
|
+
// }
|
4431
|
+
return {
|
4432
|
+
position,
|
4433
|
+
uv,
|
4434
|
+
normal,
|
4435
|
+
indices: indexArray
|
4436
|
+
};
|
4733
4437
|
}
|
4734
4438
|
|
4735
4439
|
exports.cylinder = cylinder;
|
@@ -4745,3 +4449,4 @@
|
|
4745
4449
|
Object.defineProperty(exports, '__esModule', { value: true });
|
4746
4450
|
|
4747
4451
|
}));
|
4452
|
+
//# sourceMappingURL=poly-extrude.js.map
|