فهرست منبع

VTKLoader: fix float reading too greedy

* Fixes the reading of positions, normals, and colors.
The patFloat3 regexp is too greedy, and tends to over-read
after a section is over. This problem especially occurs when
there is a `METADATA` or `FIELD` section in the middle of the file.
David Peicho 5 سال پیش
والد
کامیت
a6ef5493f1
2فایلهای تغییر یافته به همراه17 افزوده شده و 0 حذف شده
  1. 9 0
      examples/js/loaders/VTKLoader.js
  2. 8 0
      examples/jsm/loaders/VTKLoader.js

+ 9 - 0
examples/js/loaders/VTKLoader.js

@@ -52,6 +52,9 @@ THREE.VTKLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
 
 			var result;
 
+			// pattern for detecting the end of a number sequence
+			var patWord = /^[^\d.\s-]+/;
+
 			// pattern for reading vertices, 3 floats or integers
 			var pat3Floats = /(\-?\d+\.?[\d\-\+e]*)\s+(\-?\d+\.?[\d\-\+e]*)\s+(\-?\d+\.?[\d\-\+e]*)/g;
 
@@ -105,6 +108,8 @@ THREE.VTKLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
 					// get the vertices
 					while ( ( result = pat3Floats.exec( line ) ) !== null ) {
 
+						if ( patWord.exec( line ) !== null ) break;
+
 						var x = parseFloat( result[ 1 ] );
 						var y = parseFloat( result[ 2 ] );
 						var z = parseFloat( result[ 3 ] );
@@ -183,6 +188,8 @@ THREE.VTKLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
 
 						while ( ( result = pat3Floats.exec( line ) ) !== null ) {
 
+							if ( patWord.exec( line ) !== null ) break;
+
 							var r = parseFloat( result[ 1 ] );
 							var g = parseFloat( result[ 2 ] );
 							var b = parseFloat( result[ 3 ] );
@@ -196,6 +203,8 @@ THREE.VTKLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype
 
 						while ( ( result = pat3Floats.exec( line ) ) !== null ) {
 
+							if ( patWord.exec( line ) !== null ) break;
+
 							var nx = parseFloat( result[ 1 ] );
 							var ny = parseFloat( result[ 2 ] );
 							var nz = parseFloat( result[ 3 ] );

+ 8 - 0
examples/jsm/loaders/VTKLoader.js

@@ -62,6 +62,8 @@ VTKLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 			var result;
 
+			var patWord = /^[^0-9.\s-]+/;
+
 			// pattern for reading vertices, 3 floats or integers
 			var pat3Floats = /(\-?\d+\.?[\d\-\+e]*)\s+(\-?\d+\.?[\d\-\+e]*)\s+(\-?\d+\.?[\d\-\+e]*)/g;
 
@@ -115,6 +117,8 @@ VTKLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 					// get the vertices
 					while ( ( result = pat3Floats.exec( line ) ) !== null ) {
 
+						if ( patWord.exec( line ) !== null ) break;
+
 						var x = parseFloat( result[ 1 ] );
 						var y = parseFloat( result[ 2 ] );
 						var z = parseFloat( result[ 3 ] );
@@ -193,6 +197,8 @@ VTKLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 						while ( ( result = pat3Floats.exec( line ) ) !== null ) {
 
+							if ( patWord.exec( line ) !== null ) break;
+
 							var r = parseFloat( result[ 1 ] );
 							var g = parseFloat( result[ 2 ] );
 							var b = parseFloat( result[ 3 ] );
@@ -206,6 +212,8 @@ VTKLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 						while ( ( result = pat3Floats.exec( line ) ) !== null ) {
 
+							if ( patWord.exec( line ) !== null ) break;
+
 							var nx = parseFloat( result[ 1 ] );
 							var ny = parseFloat( result[ 2 ] );
 							var nz = parseFloat( result[ 3 ] );