poly-extrude 0.0.9 → 0.2.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/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
|
<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
|
<br>
|
12
15
|
[line-uv](https://deyihu.github.io/poly-extrude/test/line-uv.html)<br>
|
13
16
|

|
17
|
+
[ny-building](https://deyihu.github.io/poly-extrude/test/ny-building.html)<br>
|
18
|
+

|
19
|
+
[cylinder](https://deyihu.github.io/poly-extrude/test/cylinder.html)<br>
|
20
|
+

|
21
|
+
[brige](https://deyihu.github.io/poly-extrude/test/brige.html)<br>
|
22
|
+

|
23
|
+
[spring](https://deyihu.github.io/poly-extrude/test/spring.html)<br>
|
24
|
+

|
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
|
|