poly-extrude 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/poly-extrude.js +128 -100
- package/dist/poly-extrude.js.map +1 -1
- package/dist/poly-extrude.min.js +2 -2
- package/dist/poly-extrude.mjs +128 -100
- package/package.json +1 -1
- package/src/polygon.js +36 -25
- package/src/polyline.js +21 -8
- package/src/util.js +24 -37
package/dist/poly-extrude.mjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* poly-extrude v0.0.
|
2
|
+
* poly-extrude v0.0.5
|
3
3
|
*/
|
4
4
|
var earcut$2 = {exports: {}};
|
5
5
|
|
@@ -725,8 +725,9 @@ function generateNormal(indices, position) {
|
|
725
725
|
var n = [];
|
726
726
|
var len = indices.length;
|
727
727
|
var normals = new Float32Array(position.length);
|
728
|
+
var f = 0;
|
728
729
|
|
729
|
-
|
730
|
+
while (f < len) {
|
730
731
|
// const i1 = indices[f++] * 3;
|
731
732
|
// const i2 = indices[f++] * 3;
|
732
733
|
// const i3 = indices[f++] * 3;
|
@@ -741,30 +742,30 @@ function generateNormal(indices, position) {
|
|
741
742
|
i3 = c * 3;
|
742
743
|
v3Set(p1, position[i1], position[i1 + 1], position[i1 + 2]);
|
743
744
|
v3Set(p2, position[i2], position[i2 + 1], position[i2 + 2]);
|
744
|
-
v3Set(p3, position[i3], position[i3 + 1], position[i3 + 2]);
|
745
|
-
// pB.fromBufferAttribute(positionAttribute, vB);
|
746
|
-
// pC.fromBufferAttribute(positionAttribute, vC);
|
747
|
-
// cb.subVectors(pC, pB);
|
748
|
-
// ab.subVectors(pA, pB);
|
749
|
-
// cb.cross(ab);
|
750
|
-
|
745
|
+
v3Set(p3, position[i3], position[i3 + 1], position[i3 + 2]);
|
751
746
|
v3Sub(v32, p3, p2);
|
752
747
|
v3Sub(v21, p1, p2);
|
753
748
|
v3Cross(n, v32, v21); // Already be weighted by the triangle area
|
754
749
|
|
755
|
-
for (var
|
756
|
-
normals[i1 +
|
757
|
-
normals[i2 +
|
758
|
-
normals[i3 +
|
750
|
+
for (var _i = 0; _i < 3; _i++) {
|
751
|
+
normals[i1 + _i] += n[_i];
|
752
|
+
normals[i2 + _i] += n[_i];
|
753
|
+
normals[i3 + _i] += n[_i];
|
759
754
|
}
|
755
|
+
|
756
|
+
f += 3;
|
760
757
|
}
|
761
758
|
|
762
|
-
|
763
|
-
|
759
|
+
var i = 0;
|
760
|
+
var l = normals.length;
|
761
|
+
|
762
|
+
while (i < l) {
|
763
|
+
v3Set(n, normals[i], normals[i + 1], normals[i + 2]);
|
764
764
|
v3Normalize(n, n);
|
765
|
-
normals[
|
766
|
-
normals[
|
767
|
-
normals[
|
765
|
+
normals[i] = n[0] || 0;
|
766
|
+
normals[i + 1] = n[1] || 0;
|
767
|
+
normals[i + 2] = n[2] || 0;
|
768
|
+
i += 3;
|
768
769
|
}
|
769
770
|
|
770
771
|
return normals;
|
@@ -813,11 +814,14 @@ function merge(results) {
|
|
813
814
|
result.position.set(_position, pOffset);
|
814
815
|
result.normal.set(normal, pOffset);
|
815
816
|
result.uv.set(uv, uvOffset);
|
817
|
+
var j = 0;
|
818
|
+
var len1 = _indices.length;
|
816
819
|
|
817
|
-
|
820
|
+
while (j < len1) {
|
818
821
|
var pIndex = _indices[j] + pCount;
|
819
822
|
result.indices[iIdx] = pIndex;
|
820
823
|
iIdx++;
|
824
|
+
j++;
|
821
825
|
}
|
822
826
|
|
823
827
|
uvOffset += uv.length;
|
@@ -835,39 +839,33 @@ function degToRad(angle) {
|
|
835
839
|
} // https://github.com/mrdoob/three.js/blob/16f13e3b07e31d0e9a00df7c3366bbe0e464588c/src/geometries/ExtrudeGeometry.js?_pjax=%23js-repo-pjax-container#L736
|
836
840
|
|
837
841
|
function generateSideWallUV(uvs, vertices, indexA, indexB, indexC, indexD) {
|
838
|
-
var
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
var
|
843
|
-
var
|
844
|
-
var
|
845
|
-
var
|
846
|
-
var
|
847
|
-
var
|
848
|
-
var
|
849
|
-
var
|
842
|
+
var idx1 = indexA * 3,
|
843
|
+
idx2 = indexB * 3,
|
844
|
+
idx3 = indexC * 3,
|
845
|
+
idx4 = indexD * 3;
|
846
|
+
var a_x = vertices[idx1];
|
847
|
+
var a_y = vertices[idx1 + 1];
|
848
|
+
var a_z = vertices[idx1 + 2];
|
849
|
+
var b_x = vertices[idx2];
|
850
|
+
var b_y = vertices[idx2 + 1];
|
851
|
+
var b_z = vertices[idx2 + 2];
|
852
|
+
var c_x = vertices[idx3];
|
853
|
+
var c_y = vertices[idx3 + 1];
|
854
|
+
var c_z = vertices[idx3 + 2];
|
855
|
+
var d_x = vertices[idx4];
|
856
|
+
var d_y = vertices[idx4 + 1];
|
857
|
+
var d_z = vertices[idx4 + 2];
|
850
858
|
|
851
859
|
if (Math.abs(a_y - b_y) < Math.abs(a_x - b_x)) {
|
852
860
|
uvs.push(a_x, 1 - a_z);
|
853
861
|
uvs.push(b_x, 1 - b_z);
|
854
862
|
uvs.push(c_x, 1 - c_z);
|
855
|
-
uvs.push(d_x, 1 - d_z);
|
856
|
-
// new Vector2(a_x, 1 - a_z),
|
857
|
-
// new Vector2(b_x, 1 - b_z),
|
858
|
-
// new Vector2(c_x, 1 - c_z),
|
859
|
-
// new Vector2(d_x, 1 - d_z)
|
860
|
-
// ];
|
863
|
+
uvs.push(d_x, 1 - d_z);
|
861
864
|
} else {
|
862
865
|
uvs.push(a_y, 1 - a_z);
|
863
866
|
uvs.push(b_y, 1 - b_z);
|
864
867
|
uvs.push(c_y, 1 - c_z);
|
865
|
-
uvs.push(d_y, 1 - d_z);
|
866
|
-
// new Vector2(a_y, 1 - a_z),
|
867
|
-
// new Vector2(b_y, 1 - b_z),
|
868
|
-
// new Vector2(c_y, 1 - c_z),
|
869
|
-
// new Vector2(d_y, 1 - d_z)
|
870
|
-
// ];
|
868
|
+
uvs.push(d_y, 1 - d_z);
|
871
869
|
}
|
872
870
|
}
|
873
871
|
|
@@ -876,34 +874,26 @@ function extrudePolygons(polygons, options) {
|
|
876
874
|
depth: 2
|
877
875
|
}, options);
|
878
876
|
var results = polygons.map(function (polygon) {
|
879
|
-
|
880
|
-
|
881
|
-
|
877
|
+
for (var i = 0, len = polygon.length; i < len; i++) {
|
878
|
+
var ring = polygon[i];
|
879
|
+
valiateRing(ring);
|
882
880
|
|
883
|
-
|
884
|
-
|
885
|
-
|
881
|
+
if (i === 0) {
|
882
|
+
if (!isClockwise(ring)) {
|
883
|
+
polygon[i] = ring.reverse();
|
884
|
+
}
|
885
|
+
} else if (isClockwise(ring)) {
|
886
|
+
polygon[i] = ring.reverse();
|
886
887
|
}
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
var _ring$ = ring[0],
|
891
|
-
x1 = _ring$[0],
|
892
|
-
y1 = _ring$[1],
|
893
|
-
_ring = ring[len - 1],
|
894
|
-
x2 = _ring[0],
|
895
|
-
y2 = _ring[1];
|
896
|
-
|
897
|
-
if (x1 === x2 && y1 === y2) {
|
898
|
-
ring.splice(len - 1, 1);
|
888
|
+
|
889
|
+
if (isClosedRing(ring)) {
|
890
|
+
ring.splice(ring.length - 1, 1);
|
899
891
|
}
|
900
|
-
}
|
892
|
+
}
|
893
|
+
|
901
894
|
var result = flatVertices(polygon, options);
|
902
895
|
result.polygon = polygon;
|
903
|
-
var time = 'earcut';
|
904
|
-
console.time(time);
|
905
896
|
var triangles = earcut$1(result.flatVertices, result.holes, 2);
|
906
|
-
console.timeEnd(time);
|
907
897
|
generateTopAndBottom$1(result, triangles);
|
908
898
|
generateSides$1(result, options);
|
909
899
|
result.position = new Float32Array(result.points);
|
@@ -951,29 +941,32 @@ function generateSides$1(result, options) {
|
|
951
941
|
|
952
942
|
for (var i = 0, len = polygon.length; i < len; i++) {
|
953
943
|
var ring = polygon[i];
|
944
|
+
var j = 0;
|
945
|
+
var len1 = ring.length;
|
954
946
|
|
955
|
-
|
947
|
+
while (j < len1) {
|
956
948
|
var v1 = ring[j];
|
957
949
|
var v2 = ring[j + 1];
|
958
950
|
|
959
951
|
if (j === len1 - 1) {
|
960
952
|
v2 = ring[0];
|
961
|
-
}
|
962
|
-
// p2 = [v2[0], v2[1], options.depth],
|
963
|
-
// p3 = [v1[0], v1[1], 0],
|
964
|
-
// p4 = [v2[0], v2[1], 0];
|
965
|
-
|
953
|
+
}
|
966
954
|
|
967
955
|
var idx = points.length / 3;
|
968
|
-
|
956
|
+
var x1 = v1[0],
|
957
|
+
y1 = v1[1],
|
958
|
+
x2 = v2[0],
|
959
|
+
y2 = v2[1];
|
960
|
+
points.push(x1, y1, 0, x2, y2, 0, x1, y1, z, x2, y2, z);
|
969
961
|
var a = idx,
|
970
962
|
b = idx + 1,
|
971
963
|
c = idx + 2,
|
972
964
|
d = idx + 3; // points.push(p3, p4, p1, p2);
|
973
965
|
|
974
|
-
index.push(a, c, b);
|
975
|
-
|
966
|
+
index.push(a, c, b, c, d, b); // index.push(c, d, b);
|
967
|
+
|
976
968
|
generateSideWallUV(uvs, points, a, b, c, d);
|
969
|
+
j++;
|
977
970
|
}
|
978
971
|
}
|
979
972
|
}
|
@@ -1012,7 +1005,10 @@ function flatVertices(polygon, options) {
|
|
1012
1005
|
holes.push(idx0 / 2);
|
1013
1006
|
}
|
1014
1007
|
|
1015
|
-
|
1008
|
+
var j = 0;
|
1009
|
+
var len1 = ring.length;
|
1010
|
+
|
1011
|
+
while (j < len1) {
|
1016
1012
|
var c = ring[j];
|
1017
1013
|
var x = c[0],
|
1018
1014
|
y = c[1];
|
@@ -1032,6 +1028,7 @@ function flatVertices(polygon, options) {
|
|
1032
1028
|
uvs[uOffset + idx2 + 1] = y;
|
1033
1029
|
idx1 += 3;
|
1034
1030
|
idx2 += 2;
|
1031
|
+
j++;
|
1035
1032
|
}
|
1036
1033
|
}
|
1037
1034
|
|
@@ -1044,6 +1041,23 @@ function flatVertices(polygon, options) {
|
|
1044
1041
|
};
|
1045
1042
|
}
|
1046
1043
|
|
1044
|
+
function valiateRing(ring) {
|
1045
|
+
if (!isClosedRing(ring)) {
|
1046
|
+
ring.push(ring[0]);
|
1047
|
+
}
|
1048
|
+
}
|
1049
|
+
|
1050
|
+
function isClosedRing(ring) {
|
1051
|
+
var len = ring.length;
|
1052
|
+
var _ring$ = ring[0],
|
1053
|
+
x1 = _ring$[0],
|
1054
|
+
y1 = _ring$[1],
|
1055
|
+
_ring = ring[len - 1],
|
1056
|
+
x2 = _ring[0],
|
1057
|
+
y2 = _ring[1];
|
1058
|
+
return x1 === x2 && y1 === y2;
|
1059
|
+
}
|
1060
|
+
|
1047
1061
|
function extrudePolylines(lines, options) {
|
1048
1062
|
options = Object.assign({}, {
|
1049
1063
|
depth: 2,
|
@@ -1072,8 +1086,10 @@ function generateTopAndBottom(result, options) {
|
|
1072
1086
|
uvs = [];
|
1073
1087
|
var leftPoints = result.leftPoints,
|
1074
1088
|
rightPoints = result.rightPoints;
|
1089
|
+
var i = 0,
|
1090
|
+
len = leftPoints.length;
|
1075
1091
|
|
1076
|
-
|
1092
|
+
while (i < len) {
|
1077
1093
|
// top left
|
1078
1094
|
var idx0 = i * 3;
|
1079
1095
|
var _leftPoints$i = leftPoints[i],
|
@@ -1100,32 +1116,41 @@ function generateTopAndBottom(result, options) {
|
|
1100
1116
|
points[idx3] = x2;
|
1101
1117
|
points[idx3 + 1] = y2;
|
1102
1118
|
points[idx3 + 2] = 0;
|
1119
|
+
i++;
|
1103
1120
|
}
|
1104
1121
|
|
1105
|
-
|
1106
|
-
|
1107
|
-
|
1122
|
+
i = 0;
|
1123
|
+
len = points.length;
|
1124
|
+
|
1125
|
+
while (i < len) {
|
1126
|
+
var x = points[i],
|
1127
|
+
y = points[i + 1];
|
1108
1128
|
uvs.push(x, y);
|
1129
|
+
i += 3;
|
1109
1130
|
}
|
1110
1131
|
|
1111
|
-
|
1132
|
+
i = 0;
|
1133
|
+
len = leftPoints.length;
|
1134
|
+
|
1135
|
+
while (i < len - 1) {
|
1112
1136
|
// top
|
1113
1137
|
// left1 left2 right1,right2
|
1114
|
-
var a1 =
|
1115
|
-
b1 =
|
1116
|
-
c1 = a1 +
|
1117
|
-
d1 = b1 +
|
1138
|
+
var a1 = i,
|
1139
|
+
b1 = i + 1,
|
1140
|
+
c1 = a1 + len,
|
1141
|
+
d1 = b1 + len;
|
1118
1142
|
index.push(a1, c1, b1);
|
1119
1143
|
index.push(c1, d1, b1); // bottom
|
1120
1144
|
// left1 left2 right1,right2
|
1121
1145
|
|
1122
|
-
var len2 =
|
1123
|
-
var a2 =
|
1146
|
+
var len2 = len * 2;
|
1147
|
+
var a2 = i + len2,
|
1124
1148
|
b2 = a2 + 1,
|
1125
|
-
c2 = a2 +
|
1126
|
-
d2 = b2 +
|
1149
|
+
c2 = a2 + len,
|
1150
|
+
d2 = b2 + len;
|
1127
1151
|
index.push(a2, c2, b2);
|
1128
1152
|
index.push(c2, d2, b2);
|
1153
|
+
i++;
|
1129
1154
|
}
|
1130
1155
|
|
1131
1156
|
result.index = index;
|
@@ -1148,14 +1173,12 @@ function generateSides(result, options) {
|
|
1148
1173
|
var a = idx,
|
1149
1174
|
b = idx + 1,
|
1150
1175
|
c = idx + 2,
|
1151
|
-
d = idx + 3;
|
1152
|
-
|
1153
|
-
index.push(a, c, b);
|
1154
|
-
index.push(c, d, b);
|
1176
|
+
d = idx + 3;
|
1177
|
+
index.push(a, c, b, c, d, b);
|
1155
1178
|
generateSideWallUV(uvs, points, a, b, c, d);
|
1156
1179
|
}
|
1157
1180
|
|
1158
|
-
for (var i = 0,
|
1181
|
+
for (var i = 0, _len = rings.length; i < _len; i++) {
|
1159
1182
|
var ring = rings[i];
|
1160
1183
|
|
1161
1184
|
if (i > 0) {
|
@@ -1165,19 +1188,23 @@ function generateSides(result, options) {
|
|
1165
1188
|
ring = ring.reverse();
|
1166
1189
|
}
|
1167
1190
|
|
1168
|
-
|
1191
|
+
var j = 0;
|
1192
|
+
var len1 = ring.length - 1;
|
1193
|
+
|
1194
|
+
while (j < len1) {
|
1169
1195
|
var v1 = ring[j];
|
1170
1196
|
var v2 = ring[j + 1];
|
1171
1197
|
addOneSideIndex(v1, v2);
|
1198
|
+
j++;
|
1172
1199
|
}
|
1173
1200
|
}
|
1174
1201
|
|
1175
1202
|
var len = leftPoints.length;
|
1176
1203
|
var vs = [rightPoints[0], leftPoints[0], leftPoints[len - 1], rightPoints[len - 1]];
|
1177
1204
|
|
1178
|
-
for (var
|
1179
|
-
var _v = vs[
|
1180
|
-
_v2 = vs[
|
1205
|
+
for (var _i = 0; _i < vs.length; _i += 2) {
|
1206
|
+
var _v = vs[_i],
|
1207
|
+
_v2 = vs[_i + 1];
|
1181
1208
|
addOneSideIndex(_v, _v2);
|
1182
1209
|
}
|
1183
1210
|
}
|
@@ -1198,8 +1225,9 @@ function expandLine(line, options) {
|
|
1198
1225
|
leftPoints = [],
|
1199
1226
|
rightPoints = [];
|
1200
1227
|
var len = line.length;
|
1228
|
+
var i = 0;
|
1201
1229
|
|
1202
|
-
|
1230
|
+
while (i < len - 1) {
|
1203
1231
|
var _p = line[i],
|
1204
1232
|
_p2 = line[i + 1];
|
1205
1233
|
var dy = _p2[1] - _p[1],
|
@@ -1237,6 +1265,8 @@ function expandLine(line, options) {
|
|
1237
1265
|
leftPoints.push(_op2);
|
1238
1266
|
rightPoints.push(_op);
|
1239
1267
|
}
|
1268
|
+
|
1269
|
+
i++;
|
1240
1270
|
}
|
1241
1271
|
|
1242
1272
|
var rAngle = preAngle;
|
@@ -1301,5 +1331,3 @@ function leftOnLine(p, p1, p2) {
|
|
1301
1331
|
}
|
1302
1332
|
|
1303
1333
|
export { extrudePolygons, extrudePolylines };
|
1304
|
-
|
1305
|
-
typeof console !== 'undefined' && console.log('poly-extrude v0.0.2');
|
package/package.json
CHANGED
package/src/polygon.js
CHANGED
@@ -5,27 +5,23 @@ import { generateNormal, generateSideWallUV, isClockwise, merge } from './util';
|
|
5
5
|
export function extrudePolygons(polygons, options) {
|
6
6
|
options = Object.assign({}, { depth: 2 }, options);
|
7
7
|
const results = polygons.map(polygon => {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
for (let i = 0, len = polygon.length; i < len; i++) {
|
9
|
+
const ring = polygon[i];
|
10
|
+
valiateRing(ring);
|
11
|
+
if (i === 0) {
|
12
|
+
if (!isClockwise(ring)) {
|
13
|
+
polygon[i] = ring.reverse();
|
14
|
+
}
|
15
|
+
} else if (isClockwise(ring)) {
|
16
|
+
polygon[i] = ring.reverse();
|
14
17
|
}
|
15
|
-
|
16
|
-
|
17
|
-
const len = ring.length;
|
18
|
-
const [x1, y1] = ring[0], [x2, y2] = ring[len - 1];
|
19
|
-
if (x1 === x2 && y1 === y2) {
|
20
|
-
ring.splice(len - 1, 1);
|
18
|
+
if (isClosedRing(ring)) {
|
19
|
+
ring.splice(ring.length - 1, 1);
|
21
20
|
}
|
22
|
-
}
|
21
|
+
}
|
23
22
|
const result = flatVertices(polygon, options);
|
24
23
|
result.polygon = polygon;
|
25
|
-
const time = 'earcut';
|
26
|
-
console.time(time);
|
27
24
|
const triangles = earcut(result.flatVertices, result.holes, 2);
|
28
|
-
console.timeEnd(time);
|
29
25
|
generateTopAndBottom(result, triangles);
|
30
26
|
generateSides(result, options);
|
31
27
|
result.position = new Float32Array(result.points);
|
@@ -64,24 +60,24 @@ function generateSides(result, options) {
|
|
64
60
|
const z = options.depth;
|
65
61
|
for (let i = 0, len = polygon.length; i < len; i++) {
|
66
62
|
const ring = polygon[i];
|
67
|
-
|
63
|
+
let j = 0;
|
64
|
+
const len1 = ring.length;
|
65
|
+
while (j < len1) {
|
68
66
|
const v1 = ring[j];
|
69
67
|
let v2 = ring[j + 1];
|
70
68
|
if (j === len1 - 1) {
|
71
69
|
v2 = ring[0];
|
72
70
|
}
|
73
|
-
// const p1 = [v1[0], v1[1], options.depth],
|
74
|
-
// p2 = [v2[0], v2[1], options.depth],
|
75
|
-
// p3 = [v1[0], v1[1], 0],
|
76
|
-
// p4 = [v2[0], v2[1], 0];
|
77
71
|
const idx = points.length / 3;
|
78
|
-
|
72
|
+
const x1 = v1[0], y1 = v1[1], x2 = v2[0], y2 = v2[1];
|
73
|
+
points.push(x1, y1, 0, x2, y2, 0, x1, y1, z, x2, y2, z);
|
79
74
|
const a = idx, b = idx + 1, c = idx + 2, d = idx + 3;
|
80
75
|
// points.push(p3, p4, p1, p2);
|
81
|
-
index.push(a, c, b);
|
82
|
-
index.push(c, d, b);
|
76
|
+
index.push(a, c, b, c, d, b);
|
77
|
+
// index.push(c, d, b);
|
83
78
|
|
84
79
|
generateSideWallUV(uvs, points, a, b, c, d);
|
80
|
+
j++;
|
85
81
|
}
|
86
82
|
}
|
87
83
|
}
|
@@ -110,7 +106,9 @@ function flatVertices(polygon, options) {
|
|
110
106
|
if (i > 0) {
|
111
107
|
holes.push(idx0 / 2);
|
112
108
|
}
|
113
|
-
|
109
|
+
let j = 0;
|
110
|
+
const len1 = ring.length;
|
111
|
+
while (j < len1) {
|
114
112
|
const c = ring[j];
|
115
113
|
const x = c[0], y = c[1];
|
116
114
|
|
@@ -135,6 +133,7 @@ function flatVertices(polygon, options) {
|
|
135
133
|
|
136
134
|
idx1 += 3;
|
137
135
|
idx2 += 2;
|
136
|
+
j++;
|
138
137
|
}
|
139
138
|
}
|
140
139
|
return {
|
@@ -146,3 +145,15 @@ function flatVertices(polygon, options) {
|
|
146
145
|
};
|
147
146
|
|
148
147
|
}
|
148
|
+
|
149
|
+
function valiateRing(ring) {
|
150
|
+
if (!isClosedRing(ring)) {
|
151
|
+
ring.push(ring[0]);
|
152
|
+
}
|
153
|
+
}
|
154
|
+
|
155
|
+
function isClosedRing(ring) {
|
156
|
+
const len = ring.length;
|
157
|
+
const [x1, y1] = ring[0], [x2, y2] = ring[len - 1];
|
158
|
+
return (x1 === x2 && y1 === y2);
|
159
|
+
}
|
package/src/polyline.js
CHANGED
@@ -22,7 +22,8 @@ function generateTopAndBottom(result, options) {
|
|
22
22
|
const z = options.depth;
|
23
23
|
const points = [], index = [], uvs = [];
|
24
24
|
const { leftPoints, rightPoints } = result;
|
25
|
-
|
25
|
+
let i = 0, len = leftPoints.length;
|
26
|
+
while (i < len) {
|
26
27
|
// top left
|
27
28
|
const idx0 = i * 3;
|
28
29
|
const [x1, y1] = leftPoints[i];
|
@@ -48,12 +49,19 @@ function generateTopAndBottom(result, options) {
|
|
48
49
|
points[idx3] = x2;
|
49
50
|
points[idx3 + 1] = y2;
|
50
51
|
points[idx3 + 2] = 0;
|
52
|
+
|
53
|
+
i++;
|
51
54
|
}
|
52
|
-
|
55
|
+
i = 0;
|
56
|
+
len = points.length;
|
57
|
+
while (i < len) {
|
53
58
|
const x = points[i], y = points[i + 1];
|
54
59
|
uvs.push(x, y);
|
60
|
+
i += 3;
|
55
61
|
}
|
56
|
-
|
62
|
+
i = 0;
|
63
|
+
len = leftPoints.length;
|
64
|
+
while (i < len - 1) {
|
57
65
|
// top
|
58
66
|
// left1 left2 right1,right2
|
59
67
|
const a1 = i, b1 = i + 1, c1 = a1 + len, d1 = b1 + len;
|
@@ -66,6 +74,7 @@ function generateTopAndBottom(result, options) {
|
|
66
74
|
const a2 = i + len2, b2 = a2 + 1, c2 = a2 + len, d2 = b2 + len;
|
67
75
|
index.push(a2, c2, b2);
|
68
76
|
index.push(c2, d2, b2);
|
77
|
+
i++;
|
69
78
|
}
|
70
79
|
result.index = index;
|
71
80
|
result.points = points;
|
@@ -76,13 +85,12 @@ function generateSides(result, options) {
|
|
76
85
|
const { points, index, leftPoints, rightPoints, uvs } = result;
|
77
86
|
const z = options.depth;
|
78
87
|
const rings = [leftPoints, rightPoints];
|
88
|
+
|
79
89
|
function addOneSideIndex(v1, v2) {
|
80
90
|
const idx = points.length / 3;
|
81
91
|
points.push(v1[0], v1[1], 0, v2[0], v2[1], 0, v1[0], v1[1], z, v2[0], v2[1], z);
|
82
92
|
const a = idx, b = idx + 1, c = idx + 2, d = idx + 3;
|
83
|
-
|
84
|
-
index.push(a, c, b);
|
85
|
-
index.push(c, d, b);
|
93
|
+
index.push(a, c, b, c, d, b);
|
86
94
|
generateSideWallUV(uvs, points, a, b, c, d);
|
87
95
|
}
|
88
96
|
|
@@ -94,10 +102,13 @@ function generateSides(result, options) {
|
|
94
102
|
});
|
95
103
|
ring = ring.reverse();
|
96
104
|
}
|
97
|
-
|
105
|
+
let j = 0;
|
106
|
+
const len1 = ring.length - 1;
|
107
|
+
while (j < len1) {
|
98
108
|
const v1 = ring[j];
|
99
109
|
const v2 = ring[j + 1];
|
100
110
|
addOneSideIndex(v1, v2);
|
111
|
+
j++;
|
101
112
|
}
|
102
113
|
}
|
103
114
|
const len = leftPoints.length;
|
@@ -115,7 +126,8 @@ function expandLine(line, options) {
|
|
115
126
|
const radius = options.lineWidth / 2;
|
116
127
|
const points = [], leftPoints = [], rightPoints = [];
|
117
128
|
const len = line.length;
|
118
|
-
|
129
|
+
let i = 0;
|
130
|
+
while (i < len - 1) {
|
119
131
|
const p1 = line[i],
|
120
132
|
p2 = line[i + 1];
|
121
133
|
const dy = p2[1] - p1[1],
|
@@ -146,6 +158,7 @@ function expandLine(line, options) {
|
|
146
158
|
leftPoints.push(op2);
|
147
159
|
rightPoints.push(op1);
|
148
160
|
}
|
161
|
+
i++;
|
149
162
|
}
|
150
163
|
let rAngle = preAngle;
|
151
164
|
rAngle -= 90;
|