ソースを参照

fix: toCreasedNormals(): call toNonIndexed() only on non-indexed geometries (#26379)

* BufferGeometryUtils.toCreasedNormals(): call `toNonIndexed()` only on indexed geometries

* update BufferGeometry.toCreasedNormals() documentation

* BufferGeometry.toCreasedNormals() documentation: use more common HTML formatting & remove redundant info

* BufferGeometry.toCreasedNormals() documentation: remove redundant compatibility note

* BufferGeometryUtils.toCreasedNormals(): explain the indexed geometry check in code, not JSDoc

* BufferGeometryUtils.toCreasedNormals(): fix typo: vertors => vectors
kpvhn 2 年 前
コミット
1afa3ad0ce

+ 11 - 3
docs/examples/en/utils/BufferGeometryUtils.html

@@ -122,11 +122,19 @@
 		</p>
 
 		<h3>[method:BufferGeometry toCreasedNormals]( [param:BufferGeometry geometry], [param:Number creaseAngle] )</h3>
+		<ul>
+			<li>geometry -- The input geometry.</li>
+			<li>creaseAngle -- The crease angle.</li>
+		</ul>
+
 		<p>
-		geometry -- The input geometry. <br />
-		creaseAngle -- The crease angle. <br /><br />
+		Modifies the supplied geometry if it is non-indexed, otherwise creates a new,
+		non-indexed geometry.
+		</p>
 
-		Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at an angle greater than the crease angle.
+		<p>
+		Returns the geometry with smooth normals everywhere except faces
+		that meet at an angle greater than the crease angle.
 		</p>
 
 		<h3>[method:BufferGeometry toTrianglesDrawMode]( [param:BufferGeometry geometry], [param:TrianglesDrawMode drawMode] )</h3>

+ 10 - 3
docs/examples/zh/utils/BufferGeometryUtils.html

@@ -120,12 +120,19 @@
 		</p>
 
 		<h3>[method:BufferGeometry toCreasedNormals]( [param:BufferGeometry geometry], [param:Number creaseAngle] )</h3>
+		<ul>
+			<li>geometry -- The input geometry.</li>
+			<li>creaseAngle -- The crease angle.</li>
+		</ul>
+
 		<p>
-			geometry -- The input geometry. <br />
-			creaseAngle -- The crease angle.
+			Modifies the supplied geometry if it is non-indexed, otherwise creates a new,
+			non-indexed geometry.
 		</p>
+
 		<p>
-		Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at an angle greater than the crease angle.
+			Returns the geometry with smooth normals everywhere except faces
+			that meet at an angle greater than the crease angle.
 		</p>
 
 		<h3>[method:BufferGeometry toTrianglesDrawMode]( [param:BufferGeometry geometry], [param:TrianglesDrawMode drawMode] )</h3>

+ 13 - 4
examples/jsm/utils/BufferGeometryUtils.js

@@ -1229,14 +1229,21 @@ function mergeGroups( geometry ) {
 }
 
 
-// Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at
-// an angle greater than the crease angle.
+/**
+ * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,
+ * non-indexed geometry. Returns the geometry with smooth normals everywhere except
+ * faces that meet at an angle greater than the crease angle.
+ *
+ * @param {BufferGeometry} geometry
+ * @param {number} [creaseAngle]
+ * @return {BufferGeometry}
+ */
 function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {
 
 	const creaseDot = Math.cos( creaseAngle );
 	const hashMultiplier = ( 1 + 1e-10 ) * 1e2;
 
-	// reusable vertors
+	// reusable vectors
 	const verts = [ new Vector3(), new Vector3(), new Vector3() ];
 	const tempVec1 = new Vector3();
 	const tempVec2 = new Vector3();
@@ -1253,7 +1260,9 @@ function toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */
 
 	}
 
-	const resultGeometry = geometry.toNonIndexed();
+	// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed
+	// and returns the original geometry
+	const resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;
 	const posAttr = resultGeometry.attributes.position;
 	const vertexMap = {};