three-stdlib 2.21.7 → 2.21.8
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/BufferGeometryUtils-903f7ecb.js +1 -0
- package/{BufferGeometryUtils-1a7a235c.js → BufferGeometryUtils-f2288d1c.js} +87 -2
- package/geometries/TextGeometry.cjs.js +1 -1
- package/geometries/TextGeometry.js +16 -10
- package/index.cjs.js +1 -1
- package/index.js +1 -1
- package/modifiers/EdgeSplitModifier.cjs.js +1 -1
- package/modifiers/SimplifyModifier.cjs.js +1 -1
- package/package.json +1 -1
- package/utils/BufferGeometryUtils.cjs.js +1 -1
- package/utils/BufferGeometryUtils.d.ts +1 -0
- package/utils/BufferGeometryUtils.js +85 -1
- package/utils/LDrawUtils.cjs.js +1 -1
- package/utils/LDrawUtils.js +1 -1
- package/BufferGeometryUtils-971dfde3.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e=require("three"),t=require("./types/helpers.cjs.js");const r=(t,r)=>{const n=null!==t[0].index,s=new Set(Object.keys(t[0].attributes)),i=new Set(Object.keys(t[0].morphAttributes)),u={},a={},f=t[0].morphTargetsRelative,l=new e.BufferGeometry;let c=0;if(t.forEach(((e,t)=>{let o=0;if(n!==(null!==e.index))return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+t+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(let r in e.attributes){if(!s.has(r))return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+t+'. All geometries must have compatible attributes; make sure "'+r+'" attribute exists among all geometries, or in none of them.'),null;void 0===u[r]&&(u[r]=[]),u[r].push(e.attributes[r]),o++}if(o!==s.size)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+t+". Make sure all geometries have the same number of attributes."),null;if(f!==e.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+t+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(let r in e.morphAttributes){if(!i.has(r))return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+t+". .morphAttributes must be consistent throughout all geometries."),null;void 0===a[r]&&(a[r]=[]),a[r].push(e.morphAttributes[r])}if(l.userData.mergedUserData=l.userData.mergedUserData||[],l.userData.mergedUserData.push(e.userData),r){let r;if(e.index)r=e.index.count;else{if(void 0===e.attributes.position)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index "+t+". The geometry must have either an index or a position attribute"),null;r=e.attributes.position.count}l.addGroup(c,r,t),c+=r}})),n){let e=0;const r=[];t.forEach((t=>{const o=t.index;for(let t=0;t<o.count;++t)r.push(o.getX(t)+e);e+=t.attributes.position.count})),l.setIndex(r)}for(let e in u){const t=o(u[e]);if(!t)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the "+e+" attribute."),null;l.setAttribute(e,t)}for(let e in a){const t=a[e][0].length;if(0===t)break;l.morphAttributes=l.morphAttributes||{},l.morphAttributes[e]=[];for(let r=0;r<t;++r){const t=[];for(let o=0;o<a[e].length;++o)t.push(a[e][o][r]);const n=o(t);if(!n)return console.error("THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the "+e+" morphAttribute."),null;l.morphAttributes[e].push(n)}}return l},o=t=>{let r,o,n,s=0;if(t.forEach((e=>(void 0===r&&(r=e.array.constructor),r!==e.array.constructor?(console.error("THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes."),null):(void 0===o&&(o=e.itemSize),o!==e.itemSize?(console.error("THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes."),null):(void 0===n&&(n=e.normalized),n!==e.normalized?(console.error("THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes."),null):void(s+=e.array.length)))))),r&&o){const i=new r(s);let u=0;return t.forEach((e=>{i.set(e.array,u),u+=e.array.length})),new e.BufferAttribute(i,o,n)}},n=r=>{let o,n=0,s=0;for(let e=0,t=r.length;e<t;++e){const t=r[e];if(void 0===o&&(o=t.array.constructor),o!==t.array.constructor)return console.error("AttributeBuffers of different types cannot be interleaved"),null;n+=t.array.length,s+=t.itemSize}const i=new e.InterleavedBuffer(new o(n),s);let u=0;const a=[],f=["getX","getY","getZ","getW"],l=["setX","setY","setZ","setW"];for(let o=0,n=r.length;o<n;o++){const n=r[o],s=n.itemSize,c=n.count,m=new e.InterleavedBufferAttribute(i,s,u,n.normalized);a.push(m),u+=s;for(let e=0;e<c;e++)for(let r=0;r<s;r++){t.getWithKey(m,l[r])(e,t.getWithKey(n,f[r])(e))}}return a};function s(e){let t=0;for(let r in e.attributes){const o=e.getAttribute(r);t+=o.count*o.itemSize*o.array.BYTES_PER_ELEMENT}const r=e.getIndex();return t+=r?r.count*r.itemSize*r.array.BYTES_PER_ELEMENT:0,t}function i(t,r=1e-4){r=Math.max(r,Number.EPSILON);const o={},n=t.getIndex(),s=t.getAttribute("position"),i=n?n.count:s.count;let u=0;const a=Object.keys(t.attributes),f={},l={},c=[],m=["getX","getY","getZ","getW"];for(let e=0,r=a.length;e<r;e++){const r=a[e];f[r]=[];const o=t.morphAttributes[r];o&&(l[r]=new Array(o.length).fill(0).map((()=>[])))}const g=Math.log10(1/r),d=Math.pow(10,g);for(let e=0;e<i;e++){const r=n?n.getX(e):e;let s="";for(let e=0,o=a.length;e<o;e++){const o=a[e],n=t.getAttribute(o),i=n.itemSize;for(let e=0;e<i;e++)s+=~~(n[m[e]](r)*d)+","}if(s in o)c.push(o[s]);else{for(let e=0,o=a.length;e<o;e++){const o=a[e],n=t.getAttribute(o),s=t.morphAttributes[o],i=n.itemSize,u=f[o],c=l[o];for(let e=0;e<i;e++){const t=m[e];if(u.push(n[t](r)),s)for(let e=0,o=s.length;e<o;e++)c[e].push(s[e][t](r))}}o[s]=u,c.push(u),u++}}const h=t.clone();for(let r=0,o=a.length;r<o;r++){const o=a[r],n=t.getAttribute(o),s=new n.array.constructor(f[o]),i=new e.BufferAttribute(s,n.itemSize,n.normalized);if(h.setAttribute(o,i),o in l)for(let r=0;r<l[o].length;r++){const n=t.morphAttributes[o][r],s=new n.array.constructor(l[o][r]),i=new e.BufferAttribute(s,n.itemSize,n.normalized);h.morphAttributes[o][r]=i}}return h.setIndex(c),h}function u(t,r){if(r===e.TrianglesDrawMode)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),t;if(r===e.TriangleFanDrawMode||r===e.TriangleStripDrawMode){let o=t.getIndex();if(null===o){const e=[],r=t.getAttribute("position");if(void 0===r)return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),t;for(let t=0;t<r.count;t++)e.push(t);t.setIndex(e),o=t.getIndex()}const n=o.count-2,s=[];if(o)if(r===e.TriangleFanDrawMode)for(let e=1;e<=n;e++)s.push(o.getX(0)),s.push(o.getX(e)),s.push(o.getX(e+1));else for(let e=0;e<n;e++)e%2==0?(s.push(o.getX(e)),s.push(o.getX(e+1)),s.push(o.getX(e+2))):(s.push(o.getX(e+2)),s.push(o.getX(e+1)),s.push(o.getX(e)));s.length/3!==n&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const i=t.clone();return i.setIndex(s),i.clearGroups(),i}return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",r),t}function a(t){if(!0!==t.geometry.isBufferGeometry)return console.error("THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry."),null;const r=new e.Vector3,o=new e.Vector3,n=new e.Vector3,s=new e.Vector3,i=new e.Vector3,u=new e.Vector3,a=new e.Vector3,f=new e.Vector3,l=new e.Vector3;function c(e,t,c,m,g,d,h,b,p){r.fromBufferAttribute(c,d),o.fromBufferAttribute(c,h),n.fromBufferAttribute(c,b);const y=e.morphTargetInfluences;if(t.morphTargets&&m&&y){a.set(0,0,0),f.set(0,0,0),l.set(0,0,0);for(let e=0,t=m.length;e<t;e++){const t=y[e],c=m[e];0!==t&&(s.fromBufferAttribute(c,d),i.fromBufferAttribute(c,h),u.fromBufferAttribute(c,b),g?(a.addScaledVector(s,t),f.addScaledVector(i,t),l.addScaledVector(u,t)):(a.addScaledVector(s.sub(r),t),f.addScaledVector(i.sub(o),t),l.addScaledVector(u.sub(n),t)))}r.add(a),o.add(f),n.add(l)}e.isSkinnedMesh&&(e.boneTransform(d,r),e.boneTransform(h,o),e.boneTransform(b,n)),p[3*d+0]=r.x,p[3*d+1]=r.y,p[3*d+2]=r.z,p[3*h+0]=o.x,p[3*h+1]=o.y,p[3*h+2]=o.z,p[3*b+0]=n.x,p[3*b+1]=n.y,p[3*b+2]=n.z}const m=t.geometry,g=t.material;let d,h,b;const p=m.index,y=m.attributes.position,A=m.morphAttributes.position,B=m.morphTargetsRelative,w=m.attributes.normal,E=m.morphAttributes.position,x=m.groups,T=m.drawRange;let G,V,z,M,S,v,U,R;const X=new Float32Array(y.count*y.itemSize),D=new Float32Array(w.count*w.itemSize);if(null!==p)if(Array.isArray(g))for(G=0,z=x.length;G<z;G++)for(S=x[G],v=g[S.materialIndex],U=Math.max(S.start,T.start),R=Math.min(S.start+S.count,T.start+T.count),V=U,M=R;V<M;V+=3)d=p.getX(V),h=p.getX(V+1),b=p.getX(V+2),c(t,v,y,A,B,d,h,b,X),c(t,v,w,E,B,d,h,b,D);else for(U=Math.max(0,T.start),R=Math.min(p.count,T.start+T.count),G=U,z=R;G<z;G+=3)d=p.getX(G),h=p.getX(G+1),b=p.getX(G+2),c(t,g,y,A,B,d,h,b,X),c(t,g,w,E,B,d,h,b,D);else if(void 0!==y)if(Array.isArray(g))for(G=0,z=x.length;G<z;G++)for(S=x[G],v=g[S.materialIndex],U=Math.max(S.start,T.start),R=Math.min(S.start+S.count,T.start+T.count),V=U,M=R;V<M;V+=3)d=V,h=V+1,b=V+2,c(t,v,y,A,B,d,h,b,X),c(t,v,w,E,B,d,h,b,D);else for(U=Math.max(0,T.start),R=Math.min(y.count,T.start+T.count),G=U,z=R;G<z;G+=3)d=G,h=G+1,b=G+2,c(t,g,y,A,B,d,h,b,X),c(t,g,w,E,B,d,h,b,D);return{positionAttribute:y,normalAttribute:w,morphedPositionAttribute:new e.Float32BufferAttribute(X,3),morphedNormalAttribute:new e.Float32BufferAttribute(D,3)}}function f(t,r=Math.PI/3){const o=Math.cos(r),n=100*(1+1e-10),s=[new e.Vector3,new e.Vector3,new e.Vector3],i=new e.Vector3,u=new e.Vector3,a=new e.Vector3,f=new e.Vector3;function l(e){return`${~~(e.x*n)},${~~(e.y*n)},${~~(e.z*n)}`}const c=t.toNonIndexed(),m=c.attributes.position,g={};for(let t=0,r=m.count/3;t<r;t++){const r=3*t,o=s[0].fromBufferAttribute(m,r+0),n=s[1].fromBufferAttribute(m,r+1),a=s[2].fromBufferAttribute(m,r+2);i.subVectors(a,n),u.subVectors(o,n);const f=(new e.Vector3).crossVectors(i,u).normalize();for(let e=0;e<3;e++){const t=l(s[e]);t in g||(g[t]=[]),g[t].push(f)}}const d=new Float32Array(3*m.count),h=new e.BufferAttribute(d,3,!1);for(let e=0,t=m.count/3;e<t;e++){const t=3*e,r=s[0].fromBufferAttribute(m,t+0),n=s[1].fromBufferAttribute(m,t+1),c=s[2].fromBufferAttribute(m,t+2);i.subVectors(c,n),u.subVectors(r,n),a.crossVectors(i,u).normalize();for(let e=0;e<3;e++){const r=g[l(s[e])];f.set(0,0,0);for(let e=0,t=r.length;e<t;e++){const t=r[e];a.dot(t)>o&&f.add(t)}f.normalize(),h.setXYZ(t+e,f.x,f.y,f.z)}}return c.setAttribute("normal",h),c}var l=Object.freeze({__proto__:null,mergeBufferGeometries:r,mergeBufferAttributes:o,interleaveAttributes:n,estimateBytesUsed:s,mergeVertices:i,toTrianglesDrawMode:u,computeMorphedAttributes:a,toCreasedNormals:f});exports.BufferGeometryUtils=l,exports.computeMorphedAttributes=a,exports.estimateBytesUsed=s,exports.interleaveAttributes=n,exports.mergeBufferAttributes=o,exports.mergeBufferGeometries=r,exports.mergeVertices=i,exports.toCreasedNormals=f,exports.toTrianglesDrawMode=u;
|
|
@@ -639,6 +639,90 @@ function computeMorphedAttributes(object) {
|
|
|
639
639
|
morphedPositionAttribute: morphedPositionAttribute,
|
|
640
640
|
morphedNormalAttribute: morphedNormalAttribute
|
|
641
641
|
};
|
|
642
|
+
} // Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at
|
|
643
|
+
// an angle greater than the crease angle.
|
|
644
|
+
|
|
645
|
+
function toCreasedNormals(geometry, creaseAngle = Math.PI / 3
|
|
646
|
+
/* 60 degrees */
|
|
647
|
+
) {
|
|
648
|
+
const creaseDot = Math.cos(creaseAngle);
|
|
649
|
+
const hashMultiplier = (1 + 1e-10) * 1e2; // reusable vertors
|
|
650
|
+
|
|
651
|
+
const verts = [new Vector3(), new Vector3(), new Vector3()];
|
|
652
|
+
const tempVec1 = new Vector3();
|
|
653
|
+
const tempVec2 = new Vector3();
|
|
654
|
+
const tempNorm = new Vector3();
|
|
655
|
+
const tempNorm2 = new Vector3(); // hashes a vector
|
|
656
|
+
|
|
657
|
+
function hashVertex(v) {
|
|
658
|
+
const x = ~~(v.x * hashMultiplier);
|
|
659
|
+
const y = ~~(v.y * hashMultiplier);
|
|
660
|
+
const z = ~~(v.z * hashMultiplier);
|
|
661
|
+
return `${x},${y},${z}`;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
const resultGeometry = geometry.toNonIndexed();
|
|
665
|
+
const posAttr = resultGeometry.attributes.position;
|
|
666
|
+
const vertexMap = {}; // find all the normals shared by commonly located vertices
|
|
667
|
+
|
|
668
|
+
for (let i = 0, l = posAttr.count / 3; i < l; i++) {
|
|
669
|
+
const i3 = 3 * i;
|
|
670
|
+
const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);
|
|
671
|
+
const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);
|
|
672
|
+
const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);
|
|
673
|
+
tempVec1.subVectors(c, b);
|
|
674
|
+
tempVec2.subVectors(a, b); // add the normal to the map for all vertices
|
|
675
|
+
|
|
676
|
+
const normal = new Vector3().crossVectors(tempVec1, tempVec2).normalize();
|
|
677
|
+
|
|
678
|
+
for (let n = 0; n < 3; n++) {
|
|
679
|
+
const vert = verts[n];
|
|
680
|
+
const hash = hashVertex(vert);
|
|
681
|
+
|
|
682
|
+
if (!(hash in vertexMap)) {
|
|
683
|
+
vertexMap[hash] = [];
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
vertexMap[hash].push(normal);
|
|
687
|
+
}
|
|
688
|
+
} // average normals from all vertices that share a common location if they are within the
|
|
689
|
+
// provided crease threshold
|
|
690
|
+
|
|
691
|
+
|
|
692
|
+
const normalArray = new Float32Array(posAttr.count * 3);
|
|
693
|
+
const normAttr = new BufferAttribute(normalArray, 3, false);
|
|
694
|
+
|
|
695
|
+
for (let i = 0, l = posAttr.count / 3; i < l; i++) {
|
|
696
|
+
// get the face normal for this vertex
|
|
697
|
+
const i3 = 3 * i;
|
|
698
|
+
const a = verts[0].fromBufferAttribute(posAttr, i3 + 0);
|
|
699
|
+
const b = verts[1].fromBufferAttribute(posAttr, i3 + 1);
|
|
700
|
+
const c = verts[2].fromBufferAttribute(posAttr, i3 + 2);
|
|
701
|
+
tempVec1.subVectors(c, b);
|
|
702
|
+
tempVec2.subVectors(a, b);
|
|
703
|
+
tempNorm.crossVectors(tempVec1, tempVec2).normalize(); // average all normals that meet the threshold and set the normal value
|
|
704
|
+
|
|
705
|
+
for (let n = 0; n < 3; n++) {
|
|
706
|
+
const vert = verts[n];
|
|
707
|
+
const hash = hashVertex(vert);
|
|
708
|
+
const otherNormals = vertexMap[hash];
|
|
709
|
+
tempNorm2.set(0, 0, 0);
|
|
710
|
+
|
|
711
|
+
for (let k = 0, lk = otherNormals.length; k < lk; k++) {
|
|
712
|
+
const otherNorm = otherNormals[k];
|
|
713
|
+
|
|
714
|
+
if (tempNorm.dot(otherNorm) > creaseDot) {
|
|
715
|
+
tempNorm2.add(otherNorm);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
tempNorm2.normalize();
|
|
720
|
+
normAttr.setXYZ(i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
resultGeometry.setAttribute('normal', normAttr);
|
|
725
|
+
return resultGeometry;
|
|
642
726
|
}
|
|
643
727
|
|
|
644
728
|
var BufferGeometryUtils = /*#__PURE__*/Object.freeze({
|
|
@@ -649,7 +733,8 @@ var BufferGeometryUtils = /*#__PURE__*/Object.freeze({
|
|
|
649
733
|
estimateBytesUsed: estimateBytesUsed,
|
|
650
734
|
mergeVertices: mergeVertices,
|
|
651
735
|
toTrianglesDrawMode: toTrianglesDrawMode,
|
|
652
|
-
computeMorphedAttributes: computeMorphedAttributes
|
|
736
|
+
computeMorphedAttributes: computeMorphedAttributes,
|
|
737
|
+
toCreasedNormals: toCreasedNormals
|
|
653
738
|
});
|
|
654
739
|
|
|
655
|
-
export { BufferGeometryUtils as B, mergeBufferAttributes as a, mergeVertices as b, computeMorphedAttributes as c, estimateBytesUsed as e, interleaveAttributes as i, mergeBufferGeometries as m, toTrianglesDrawMode as t };
|
|
740
|
+
export { BufferGeometryUtils as B, mergeBufferAttributes as a, mergeVertices as b, computeMorphedAttributes as c, toCreasedNormals as d, estimateBytesUsed as e, interleaveAttributes as i, mergeBufferGeometries as m, toTrianglesDrawMode as t };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");class t extends e.ExtrudeGeometry{constructor(e,t={}){const{bevelEnabled:r=!1,bevelSize:s=8,bevelThickness:i=10,font:l,height:n=50,size:o=100,lineHeight:
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("three");class t extends e.ExtrudeGeometry{constructor(e,t={}){const{bevelEnabled:r=!1,bevelSize:s=8,bevelThickness:i=10,font:l,height:n=50,size:o=100,lineHeight:p=1,letterSpacing:c=0,...h}=t;if(void 0===l)super();else{super(l.generateShapes(e,o,{lineHeight:p,letterSpacing:c}),{...h,bevelEnabled:r,bevelSize:s,bevelThickness:i,depth:n})}this.type="TextGeometry"}}exports.TextBufferGeometry=t,exports.TextGeometry=t;
|
|
@@ -13,16 +13,22 @@ class TextGeometry extends ExtrudeGeometry {
|
|
|
13
13
|
letterSpacing = 0,
|
|
14
14
|
...rest
|
|
15
15
|
} = parameters;
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
|
|
17
|
+
if (font === undefined) {
|
|
18
|
+
super(); // generate default extrude geometry
|
|
19
|
+
} else {
|
|
20
|
+
const shapes = font.generateShapes(text, size, {
|
|
21
|
+
lineHeight,
|
|
22
|
+
letterSpacing
|
|
23
|
+
});
|
|
24
|
+
super(shapes, { ...rest,
|
|
25
|
+
bevelEnabled,
|
|
26
|
+
bevelSize,
|
|
27
|
+
bevelThickness,
|
|
28
|
+
depth: height
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
|
|
26
32
|
this.type = 'TextGeometry';
|
|
27
33
|
}
|
|
28
34
|
|