poly-extrude 0.0.9 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- package/dist/poly-extrude.js +132 -10
- package/dist/poly-extrude.js.map +1 -1
- package/dist/poly-extrude.min.js +2 -2
- package/dist/poly-extrude.mjs +132 -11
- package/index.js +2 -1
- package/package.json +1 -1
- package/readme.md +132 -35
- package/src/cylinder.js +89 -0
- package/src/polyline.js +10 -9
package/dist/poly-extrude.mjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* poly-extrude v0.0
|
2
|
+
* poly-extrude v0.2.0
|
3
3
|
*/
|
4
4
|
var earcut$2 = {exports: {}};
|
5
5
|
|
@@ -1101,28 +1101,30 @@ function generateTopAndBottom(result, options) {
|
|
1101
1101
|
var idx0 = i * 3;
|
1102
1102
|
var _leftPoints$i = leftPoints[i],
|
1103
1103
|
x1 = _leftPoints$i[0],
|
1104
|
-
y1 = _leftPoints$i[1]
|
1104
|
+
y1 = _leftPoints$i[1],
|
1105
|
+
z1 = _leftPoints$i[2];
|
1105
1106
|
points[idx0] = x1;
|
1106
1107
|
points[idx0 + 1] = y1;
|
1107
|
-
points[idx0 + 2] = z; // top right
|
1108
|
+
points[idx0 + 2] = z + z1; // top right
|
1108
1109
|
|
1109
1110
|
var _rightPoints$i = rightPoints[i],
|
1110
1111
|
x2 = _rightPoints$i[0],
|
1111
|
-
y2 = _rightPoints$i[1]
|
1112
|
+
y2 = _rightPoints$i[1],
|
1113
|
+
z2 = _rightPoints$i[2];
|
1112
1114
|
var idx1 = len * 3 + idx0;
|
1113
1115
|
points[idx1] = x2;
|
1114
1116
|
points[idx1 + 1] = y2;
|
1115
|
-
points[idx1 + 2] = z; // bottom left
|
1117
|
+
points[idx1 + 2] = z + z2; // bottom left
|
1116
1118
|
|
1117
1119
|
var idx2 = len * 2 * 3 + idx0;
|
1118
1120
|
points[idx2] = x1;
|
1119
1121
|
points[idx2 + 1] = y1;
|
1120
|
-
points[idx2 + 2] =
|
1122
|
+
points[idx2 + 2] = z1; // bottom right
|
1121
1123
|
|
1122
1124
|
var idx3 = len * 2 * 3 + len * 3 + idx0;
|
1123
1125
|
points[idx3] = x2;
|
1124
1126
|
points[idx3 + 1] = y2;
|
1125
|
-
points[idx3 + 2] =
|
1127
|
+
points[idx3 + 2] = z2;
|
1126
1128
|
i++;
|
1127
1129
|
}
|
1128
1130
|
|
@@ -1176,7 +1178,7 @@ function generateSides(result, options) {
|
|
1176
1178
|
|
1177
1179
|
function addOneSideIndex(v1, v2) {
|
1178
1180
|
var idx = points.length / 3;
|
1179
|
-
points.push(v1[0], v1[1], z, v2[0], v2[1], z, v1[0], v1[1],
|
1181
|
+
points.push(v1[0], v1[1], z + v1[2], v2[0], v2[1], z + v2[2], v1[0], v1[1], v1[2], v2[0], v2[1], v2[2]);
|
1180
1182
|
var a = idx + 2,
|
1181
1183
|
b = idx + 3,
|
1182
1184
|
c = idx,
|
@@ -1305,13 +1307,14 @@ function expandLine(line, options) {
|
|
1305
1307
|
function calOffsetPoint(rad, radius, p) {
|
1306
1308
|
var x = p[0],
|
1307
1309
|
y = p[1];
|
1310
|
+
var z = p[2] || 0;
|
1308
1311
|
var x1 = Math.cos(rad) * radius,
|
1309
1312
|
y1 = Math.sin(rad) * radius;
|
1310
|
-
var p1 = [x + x1, y + y1];
|
1313
|
+
var p1 = [x + x1, y + y1, z];
|
1311
1314
|
var rad1 = rad += Math.PI;
|
1312
1315
|
var x2 = Math.cos(rad1) * radius,
|
1313
1316
|
y2 = Math.sin(rad1) * radius;
|
1314
|
-
var p2 = [x + x2, y + y2];
|
1317
|
+
var p2 = [x + x2, y + y2, z];
|
1315
1318
|
return [p1, p2];
|
1316
1319
|
}
|
1317
1320
|
|
@@ -1336,4 +1339,122 @@ function leftOnLine(p, p1, p2) {
|
|
1336
1339
|
return (y1 - y2) * x + (x2 - x1) * y + x1 * y2 - x2 * y1 > 0;
|
1337
1340
|
}
|
1338
1341
|
|
1339
|
-
|
1342
|
+
function cylinder(point, options) {
|
1343
|
+
if (options === void 0) {
|
1344
|
+
options = {};
|
1345
|
+
}
|
1346
|
+
|
1347
|
+
options = Object.assign({}, {
|
1348
|
+
radius: 1,
|
1349
|
+
height: 2,
|
1350
|
+
radialSegments: 6
|
1351
|
+
}, options);
|
1352
|
+
var radialSegments = Math.round(Math.max(4, options.radialSegments));
|
1353
|
+
var _options = options,
|
1354
|
+
radius = _options.radius,
|
1355
|
+
height = _options.height;
|
1356
|
+
var aRad = 360 / radialSegments / 360 * Math.PI * 2;
|
1357
|
+
var circlePointsLen = radialSegments + 1;
|
1358
|
+
var points = new Float32Array(circlePointsLen * 3 * 2);
|
1359
|
+
var centerx = point[0],
|
1360
|
+
centery = point[1];
|
1361
|
+
var idx = 0,
|
1362
|
+
uIdx = 0;
|
1363
|
+
var offset = circlePointsLen * 3,
|
1364
|
+
uOffset = circlePointsLen * 2;
|
1365
|
+
var indices = [],
|
1366
|
+
uvs = [];
|
1367
|
+
|
1368
|
+
for (var i = -1; i < radialSegments; i++) {
|
1369
|
+
var rad = aRad * i;
|
1370
|
+
var x = Math.cos(rad) * radius + centerx,
|
1371
|
+
y = Math.sin(rad) * radius + centery; // bottom vertices
|
1372
|
+
|
1373
|
+
points[idx] = x;
|
1374
|
+
points[idx + 1] = y;
|
1375
|
+
points[idx + 2] = 0; // top vertices
|
1376
|
+
|
1377
|
+
points[idx + offset] = x;
|
1378
|
+
points[idx + 1 + offset] = y;
|
1379
|
+
points[idx + 2 + offset] = height;
|
1380
|
+
var u = 0,
|
1381
|
+
v = 0;
|
1382
|
+
u = 0.5 + x / radius / 2;
|
1383
|
+
v = 0.5 + y / radius / 2;
|
1384
|
+
uvs[uIdx] = u;
|
1385
|
+
uvs[uIdx + 1] = v;
|
1386
|
+
uvs[uIdx + uOffset] = u;
|
1387
|
+
uvs[uIdx + 1 + uOffset] = v;
|
1388
|
+
idx += 3;
|
1389
|
+
uIdx += 2;
|
1390
|
+
|
1391
|
+
if (i > 1) {
|
1392
|
+
// bottom indices
|
1393
|
+
indices.push(0, i - 1, i);
|
1394
|
+
}
|
1395
|
+
}
|
1396
|
+
|
1397
|
+
idx -= 3;
|
1398
|
+
points[idx] = points[0];
|
1399
|
+
points[idx + 1] = points[1];
|
1400
|
+
points[idx + 2] = points[2];
|
1401
|
+
var pointsLen = points.length;
|
1402
|
+
points[pointsLen - 3] = points[0];
|
1403
|
+
points[pointsLen - 2] = points[1];
|
1404
|
+
points[pointsLen - 1] = height;
|
1405
|
+
var indicesLen = indices.length; // top indices
|
1406
|
+
|
1407
|
+
for (var _i = 0; _i < indicesLen; _i++) {
|
1408
|
+
var index = indices[_i];
|
1409
|
+
indices.push(index + circlePointsLen);
|
1410
|
+
}
|
1411
|
+
|
1412
|
+
var sidePoints = new Float32Array((circlePointsLen * 3 * 2 - 6) * 2);
|
1413
|
+
var pIndex = -1;
|
1414
|
+
idx = circlePointsLen * 2;
|
1415
|
+
uIdx = 0;
|
1416
|
+
|
1417
|
+
for (var _i2 = 0, len = points.length / 2; _i2 < len - 3; _i2 += 3) {
|
1418
|
+
var x1 = points[_i2],
|
1419
|
+
y1 = points[_i2 + 1],
|
1420
|
+
x2 = points[_i2 + 3],
|
1421
|
+
y2 = points[_i2 + 4];
|
1422
|
+
sidePoints[++pIndex] = x1;
|
1423
|
+
sidePoints[++pIndex] = y1;
|
1424
|
+
sidePoints[++pIndex] = height;
|
1425
|
+
sidePoints[++pIndex] = x2;
|
1426
|
+
sidePoints[++pIndex] = y2;
|
1427
|
+
sidePoints[++pIndex] = height;
|
1428
|
+
sidePoints[++pIndex] = x1;
|
1429
|
+
sidePoints[++pIndex] = y1;
|
1430
|
+
sidePoints[++pIndex] = 0;
|
1431
|
+
sidePoints[++pIndex] = x2;
|
1432
|
+
sidePoints[++pIndex] = y2;
|
1433
|
+
sidePoints[++pIndex] = 0;
|
1434
|
+
var a = idx + 2,
|
1435
|
+
b = idx + 3,
|
1436
|
+
c = idx,
|
1437
|
+
d = idx + 1; // indices.push(a, c, b, c, d, b);
|
1438
|
+
|
1439
|
+
indices.push(c, a, d, a, b, d);
|
1440
|
+
idx += 4;
|
1441
|
+
var u1 = uIdx / circlePointsLen,
|
1442
|
+
u2 = (uIdx + 1) / circlePointsLen;
|
1443
|
+
uvs.push(u1, height / radius / 2, u2, height / radius / 2, u1, 0, u2, 0);
|
1444
|
+
uIdx++;
|
1445
|
+
}
|
1446
|
+
|
1447
|
+
var position = new Float32Array(points.length + sidePoints.length);
|
1448
|
+
position.set(points, 0);
|
1449
|
+
position.set(sidePoints, points.length);
|
1450
|
+
var normal = generateNormal(indices, position);
|
1451
|
+
return {
|
1452
|
+
points: points,
|
1453
|
+
indices: new Uint32Array(indices),
|
1454
|
+
position: position,
|
1455
|
+
normal: normal,
|
1456
|
+
uv: new Float32Array(uvs)
|
1457
|
+
};
|
1458
|
+
}
|
1459
|
+
|
1460
|
+
export { cylinder, expandLine, extrudePolygons, extrudePolylines };
|
package/index.js
CHANGED
@@ -1,3 +1,4 @@
|
|
1
1
|
import { extrudePolygons } from './src/polygon';
|
2
2
|
import { extrudePolylines, expandLine } from './src/polyline';
|
3
|
-
|
3
|
+
import { cylinder } from './src/cylinder';
|
4
|
+
export { extrudePolygons, extrudePolylines, expandLine, cylinder };
|
package/package.json
CHANGED
package/readme.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# poly-extrude
|
2
2
|
|
3
|
+
|
3
4
|
Extrude polygons/polylines. Born in [maptalks.three](https://github.com/maptalks/maptalks.three) project<br>
|
5
|
+
|
6
|
+
## Examples
|
4
7
|
[building](https://deyihu.github.io/poly-extrude/test/building.html)<br>
|
5
8
|
![](./gallery/building.png)<br>
|
6
9
|
[buildings](https://deyihu.github.io/poly-extrude/test/buildings.html)<br>
|
@@ -11,8 +14,16 @@ Extrude polygons/polylines. Born in [maptalks.three](https://github.com/maptalks
|
|
11
14
|
![](./gallery/street.png)<br>
|
12
15
|
[line-uv](https://deyihu.github.io/poly-extrude/test/line-uv.html)<br>
|
13
16
|
![](./gallery/line-uv.png)
|
17
|
+
[ny-building](https://deyihu.github.io/poly-extrude/test/ny-building.html)<br>
|
18
|
+
![](./gallery/ny-building.png)
|
19
|
+
[cylinder](https://deyihu.github.io/poly-extrude/test/cylinder.html)<br>
|
20
|
+
![](./gallery/cylinder.png)
|
21
|
+
[brige](https://deyihu.github.io/poly-extrude/test/brige.html)<br>
|
22
|
+
![](./gallery/brige.png)
|
23
|
+
[spring](https://deyihu.github.io/poly-extrude/test/spring.html)<br>
|
24
|
+
![](./gallery/spring.png)
|
14
25
|
|
15
|
-
##
|
26
|
+
## Install
|
16
27
|
|
17
28
|
```sh
|
18
29
|
npm i poly-extrude
|
@@ -31,34 +42,79 @@ pnpm i poly-extrude
|
|
31
42
|
### ESM
|
32
43
|
|
33
44
|
```js
|
34
|
-
import {
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
45
|
+
import {
|
46
|
+
extrudePolygons,
|
47
|
+
extrudePolylines,
|
48
|
+
cylinder
|
49
|
+
} from 'poly-extrude';
|
50
|
+
const polygons = [
|
51
|
+
//polygon
|
52
|
+
[
|
53
|
+
//outring
|
54
|
+
[
|
55
|
+
[x, y],
|
56
|
+
[x, y], ...........
|
57
|
+
],
|
58
|
+
//holes
|
59
|
+
[
|
60
|
+
[x, y],
|
61
|
+
[x, y], ...........
|
62
|
+
],
|
63
|
+
........
|
64
|
+
|
65
|
+
],
|
66
|
+
//other polygons
|
67
|
+
......
|
47
68
|
]
|
48
69
|
|
49
|
-
const result = extrudePolygons(polygons,{
|
50
|
-
|
70
|
+
const result = extrudePolygons(polygons, {
|
71
|
+
depth: 2
|
72
|
+
});
|
73
|
+
const {
|
74
|
+
positon,
|
75
|
+
normal,
|
76
|
+
uv,
|
77
|
+
indices
|
78
|
+
} = result;
|
51
79
|
//do something
|
52
80
|
|
53
|
-
const polylines=[
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
81
|
+
const polylines = [
|
82
|
+
// polyline
|
83
|
+
[
|
84
|
+
[x, y],
|
85
|
+
[x, y], ...........
|
86
|
+
],
|
87
|
+
//polyline
|
88
|
+
[
|
89
|
+
[x, y],
|
90
|
+
[x, y], ...........
|
91
|
+
],
|
58
92
|
];
|
59
93
|
|
60
|
-
const result = extrudePolylines(polylines,{
|
61
|
-
|
94
|
+
const result = extrudePolylines(polylines, {
|
95
|
+
depth: 2,
|
96
|
+
lineWidth: 2
|
97
|
+
});
|
98
|
+
const {
|
99
|
+
positon,
|
100
|
+
normal,
|
101
|
+
uv,
|
102
|
+
indices
|
103
|
+
} = result;
|
104
|
+
//do something
|
105
|
+
|
106
|
+
const center = [0, 0];
|
107
|
+
const result = cylinder(center, {
|
108
|
+
radius: 1,
|
109
|
+
height: 2,
|
110
|
+
radialSegments: 6
|
111
|
+
});
|
112
|
+
const {
|
113
|
+
positon,
|
114
|
+
normal,
|
115
|
+
uv,
|
116
|
+
indices
|
117
|
+
} = result;
|
62
118
|
//do something
|
63
119
|
```
|
64
120
|
|
@@ -68,13 +124,19 @@ pnpm i poly-extrude
|
|
68
124
|
<script src="https://unpkg.com/poly-extrude/dist/poly-extrude.js"></script>
|
69
125
|
|
70
126
|
<script>
|
71
|
-
const polygons=[
|
127
|
+
const polygons = [
|
72
128
|
//polygon
|
73
129
|
[
|
74
130
|
//outring
|
75
|
-
[
|
131
|
+
[
|
132
|
+
[x, y],
|
133
|
+
[x, y], ...........
|
134
|
+
],
|
76
135
|
//holes
|
77
|
-
[
|
136
|
+
[
|
137
|
+
[x, y],
|
138
|
+
[x, y], ...........
|
139
|
+
],
|
78
140
|
........
|
79
141
|
|
80
142
|
],
|
@@ -82,19 +144,54 @@ pnpm i poly-extrude
|
|
82
144
|
......
|
83
145
|
]
|
84
146
|
|
85
|
-
const result =
|
86
|
-
|
147
|
+
const result = polyextrude.extrudePolygons(polygons, {
|
148
|
+
depth: 2
|
149
|
+
})
|
150
|
+
const {
|
151
|
+
positon,
|
152
|
+
normal,
|
153
|
+
uv,
|
154
|
+
indices
|
155
|
+
} = result;
|
87
156
|
//do something
|
88
157
|
|
89
|
-
const polylines=[
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
[
|
158
|
+
const polylines = [
|
159
|
+
// polyline
|
160
|
+
[
|
161
|
+
[x, y],
|
162
|
+
[x, y], ...........
|
163
|
+
],
|
164
|
+
//polyline
|
165
|
+
[
|
166
|
+
[x, y],
|
167
|
+
[x, y], ...........
|
168
|
+
],
|
94
169
|
];
|
95
170
|
|
96
|
-
const result = polyextrude.extrudePolylines(polylines,{
|
97
|
-
|
171
|
+
const result = polyextrude.extrudePolylines(polylines, {
|
172
|
+
depth: 2,
|
173
|
+
lineWidth: 2
|
174
|
+
});
|
175
|
+
const {
|
176
|
+
positon,
|
177
|
+
normal,
|
178
|
+
uv,
|
179
|
+
indices
|
180
|
+
} = result;
|
181
|
+
//do something
|
182
|
+
|
183
|
+
const center = [0, 0];
|
184
|
+
const result = polyextrude.cylinder(center, {
|
185
|
+
radius: 1,
|
186
|
+
height: 2,
|
187
|
+
radialSegments: 6
|
188
|
+
});
|
189
|
+
const {
|
190
|
+
positon,
|
191
|
+
normal,
|
192
|
+
uv,
|
193
|
+
indices
|
194
|
+
} = result;
|
98
195
|
//do something
|
99
196
|
</script>
|
100
197
|
```
|
package/src/cylinder.js
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
import { generateNormal } from './util';
|
2
|
+
|
3
|
+
export function cylinder(point, options = {}) {
|
4
|
+
options = Object.assign({}, { radius: 1, height: 2, radialSegments: 6 }, options);
|
5
|
+
const radialSegments = Math.round(Math.max(4, options.radialSegments));
|
6
|
+
const { radius, height } = options;
|
7
|
+
const aRad = 360 / radialSegments / 360 * Math.PI * 2;
|
8
|
+
const circlePointsLen = (radialSegments + 1);
|
9
|
+
const points = new Float32Array(circlePointsLen * 3 * 2);
|
10
|
+
const [centerx, centery] = point;
|
11
|
+
let idx = 0, uIdx = 0;
|
12
|
+
const offset = circlePointsLen * 3, uOffset = circlePointsLen * 2;
|
13
|
+
const indices = [], uvs = [];
|
14
|
+
for (let i = -1; i < radialSegments; i++) {
|
15
|
+
const rad = aRad * i;
|
16
|
+
const x = Math.cos(rad) * radius + centerx, y = Math.sin(rad) * radius + centery;
|
17
|
+
// bottom vertices
|
18
|
+
points[idx] = x;
|
19
|
+
points[idx + 1] = y;
|
20
|
+
points[idx + 2] = 0;
|
21
|
+
|
22
|
+
// top vertices
|
23
|
+
points[idx + offset] = x;
|
24
|
+
points[idx + 1 + offset] = y;
|
25
|
+
points[idx + 2 + offset] = height;
|
26
|
+
|
27
|
+
let u = 0, v = 0;
|
28
|
+
u = 0.5 + x / radius / 2;
|
29
|
+
v = 0.5 + y / radius / 2;
|
30
|
+
uvs[uIdx] = u;
|
31
|
+
uvs[uIdx + 1] = v;
|
32
|
+
uvs[uIdx + uOffset] = u;
|
33
|
+
uvs[uIdx + 1 + uOffset] = v;
|
34
|
+
|
35
|
+
idx += 3;
|
36
|
+
uIdx += 2;
|
37
|
+
if (i > 1) {
|
38
|
+
// bottom indices
|
39
|
+
indices.push(0, i - 1, i);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
idx -= 3;
|
43
|
+
points[idx] = points[0];
|
44
|
+
points[idx + 1] = points[1];
|
45
|
+
points[idx + 2] = points[2];
|
46
|
+
const pointsLen = points.length;
|
47
|
+
points[pointsLen - 3] = points[0];
|
48
|
+
points[pointsLen - 2] = points[1];
|
49
|
+
points[pointsLen - 1] = height;
|
50
|
+
|
51
|
+
const indicesLen = indices.length;
|
52
|
+
// top indices
|
53
|
+
for (let i = 0; i < indicesLen; i++) {
|
54
|
+
const index = indices[i];
|
55
|
+
indices.push(index + circlePointsLen);
|
56
|
+
}
|
57
|
+
|
58
|
+
const sidePoints = new Float32Array((circlePointsLen * 3 * 2 - 6) * 2);
|
59
|
+
let pIndex = -1;
|
60
|
+
idx = circlePointsLen * 2;
|
61
|
+
uIdx = 0;
|
62
|
+
for (let i = 0, len = points.length / 2; i < len - 3; i += 3) {
|
63
|
+
const x1 = points[i], y1 = points[i + 1], x2 = points[i + 3], y2 = points[i + 4];
|
64
|
+
sidePoints[++pIndex] = x1;
|
65
|
+
sidePoints[++pIndex] = y1;
|
66
|
+
sidePoints[++pIndex] = height;
|
67
|
+
sidePoints[++pIndex] = x2;
|
68
|
+
sidePoints[++pIndex] = y2;
|
69
|
+
sidePoints[++pIndex] = height;
|
70
|
+
sidePoints[++pIndex] = x1;
|
71
|
+
sidePoints[++pIndex] = y1;
|
72
|
+
sidePoints[++pIndex] = 0;
|
73
|
+
sidePoints[++pIndex] = x2;
|
74
|
+
sidePoints[++pIndex] = y2;
|
75
|
+
sidePoints[++pIndex] = 0;
|
76
|
+
const a = idx + 2, b = idx + 3, c = idx, d = idx + 1;
|
77
|
+
// indices.push(a, c, b, c, d, b);
|
78
|
+
indices.push(c, a, d, a, b, d);
|
79
|
+
idx += 4;
|
80
|
+
const u1 = uIdx / circlePointsLen, u2 = (uIdx + 1) / circlePointsLen;
|
81
|
+
uvs.push(u1, height / radius / 2, u2, height / radius / 2, u1, 0, u2, 0);
|
82
|
+
uIdx++;
|
83
|
+
}
|
84
|
+
const position = new Float32Array(points.length + sidePoints.length);
|
85
|
+
position.set(points, 0);
|
86
|
+
position.set(sidePoints, points.length);
|
87
|
+
const normal = generateNormal(indices, position);
|
88
|
+
return { points, indices: new Uint32Array(indices), position, normal, uv: new Float32Array(uvs) };
|
89
|
+
}
|
package/src/polyline.js
CHANGED
@@ -26,29 +26,29 @@ function generateTopAndBottom(result, options) {
|
|
26
26
|
while (i < len) {
|
27
27
|
// top left
|
28
28
|
const idx0 = i * 3;
|
29
|
-
const [x1, y1] = leftPoints[i];
|
29
|
+
const [x1, y1, z1] = leftPoints[i];
|
30
30
|
points[idx0] = x1;
|
31
31
|
points[idx0 + 1] = y1;
|
32
|
-
points[idx0 + 2] = z;
|
32
|
+
points[idx0 + 2] = z + z1;
|
33
33
|
|
34
34
|
// top right
|
35
|
-
const [x2, y2] = rightPoints[i];
|
35
|
+
const [x2, y2, z2] = rightPoints[i];
|
36
36
|
const idx1 = len * 3 + idx0;
|
37
37
|
points[idx1] = x2;
|
38
38
|
points[idx1 + 1] = y2;
|
39
|
-
points[idx1 + 2] = z;
|
39
|
+
points[idx1 + 2] = z + z2;
|
40
40
|
|
41
41
|
// bottom left
|
42
42
|
const idx2 = (len * 2) * 3 + idx0;
|
43
43
|
points[idx2] = x1;
|
44
44
|
points[idx2 + 1] = y1;
|
45
|
-
points[idx2 + 2] =
|
45
|
+
points[idx2 + 2] = z1;
|
46
46
|
|
47
47
|
// bottom right
|
48
48
|
const idx3 = (len * 2) * 3 + len * 3 + idx0;
|
49
49
|
points[idx3] = x2;
|
50
50
|
points[idx3 + 1] = y2;
|
51
|
-
points[idx3 + 2] =
|
51
|
+
points[idx3 + 2] = z2;
|
52
52
|
|
53
53
|
i++;
|
54
54
|
}
|
@@ -88,7 +88,7 @@ function generateSides(result, options) {
|
|
88
88
|
|
89
89
|
function addOneSideIndex(v1, v2) {
|
90
90
|
const idx = points.length / 3;
|
91
|
-
points.push(v1[0], v1[1], z, v2[0], v2[1], z, v1[0], v1[1],
|
91
|
+
points.push(v1[0], v1[1], z + v1[2], v2[0], v2[1], z + v2[2], v1[0], v1[1], v1[2], v2[0], v2[1], v2[2]);
|
92
92
|
const a = idx + 2, b = idx + 3, c = idx, d = idx + 1;
|
93
93
|
index.push(a, c, b, c, d, b);
|
94
94
|
generateSideWallUV(uvs, points, a, b, c, d);
|
@@ -180,11 +180,12 @@ export function expandLine(line, options) {
|
|
180
180
|
|
181
181
|
function calOffsetPoint(rad, radius, p) {
|
182
182
|
const [x, y] = p;
|
183
|
+
const z = p[2] || 0;
|
183
184
|
const x1 = Math.cos(rad) * radius, y1 = Math.sin(rad) * radius;
|
184
|
-
const p1 = [x + x1, y + y1];
|
185
|
+
const p1 = [x + x1, y + y1, z];
|
185
186
|
const rad1 = rad += Math.PI;
|
186
187
|
const x2 = Math.cos(rad1) * radius, y2 = Math.sin(rad1) * radius;
|
187
|
-
const p2 = [x + x2, y + y2];
|
188
|
+
const p2 = [x + x2, y + y2, z];
|
188
189
|
return [p1, p2];
|
189
190
|
}
|
190
191
|
|