提交 9ad3cd6b 编写于 作者: A Alex Weiss

PlyLoader: Added support for binary ply files.

上级 b60cf2cb
...@@ -70,11 +70,10 @@ THREE.PLYLoader.prototype = { ...@@ -70,11 +70,10 @@ THREE.PLYLoader.prototype = {
}, },
isASCII: function(buf){ isASCII: function( data ){
var header = this.parseHeader( buf ); var header = this.parseHeader( this.bin2str( data ) );
// currently only supports ASCII encoded files.
return header.format === "ascii"; return header.format === "ascii";
}, },
...@@ -83,7 +82,7 @@ THREE.PLYLoader.prototype = { ...@@ -83,7 +82,7 @@ THREE.PLYLoader.prototype = {
if ( data instanceof ArrayBuffer ) { if ( data instanceof ArrayBuffer ) {
return this.isASCII( this.bin2str( data ) ) return this.isASCII( data )
? this.parseASCII( this.bin2str( data ) ) ? this.parseASCII( this.bin2str( data ) )
: this.parseBinary( data ); : this.parseBinary( data );
...@@ -97,7 +96,7 @@ THREE.PLYLoader.prototype = { ...@@ -97,7 +96,7 @@ THREE.PLYLoader.prototype = {
parseHeader: function ( data ) { parseHeader: function ( data ) {
var patternHeader = /ply([\s\S]*)end_header/; var patternHeader = /ply([\s\S]*)end_header\n/;
var headerText = ""; var headerText = "";
if ( ( result = patternHeader.exec( data ) ) != null ) { if ( ( result = patternHeader.exec( data ) ) != null ) {
headerText = result [ 1 ]; headerText = result [ 1 ];
...@@ -106,6 +105,7 @@ THREE.PLYLoader.prototype = { ...@@ -106,6 +105,7 @@ THREE.PLYLoader.prototype = {
var header = new Object(); var header = new Object();
header.comments = []; header.comments = [];
header.elements = []; header.elements = [];
header.headerLength = result[0].length;
var lines = headerText.split( '\n' ); var lines = headerText.split( '\n' );
var currentElement = undefined; var currentElement = undefined;
...@@ -250,7 +250,7 @@ THREE.PLYLoader.prototype = { ...@@ -250,7 +250,7 @@ THREE.PLYLoader.prototype = {
var lines = body.split( '\n' ); var lines = body.split( '\n' );
var currentElement = 0; var currentElement = 0;
var currentElementCount = 0; var currentElementCount = 0;
var useColor = false; geometry.useColor = false;
for ( var i = 0; i < lines.length; i ++ ) { for ( var i = 0; i < lines.length; i ++ ) {
...@@ -267,7 +267,44 @@ THREE.PLYLoader.prototype = { ...@@ -267,7 +267,44 @@ THREE.PLYLoader.prototype = {
var element = this.parseASCIIElement( header.elements[currentElement].properties, line ); var element = this.parseASCIIElement( header.elements[currentElement].properties, line );
if ( header.elements[currentElement].name === "vertex" ) { this.handleElement( geometry, header.elements[currentElement].name, element );
currentElementCount++;
}
return this.postProcess( geometry );
},
postProcess: function ( geometry ) {
if ( geometry.useColor ) {
for ( var i = 0; i < geometry.faces.length; i ++ ) {
geometry.faces[i].vertexColors = [
geometry.colors[geometry.faces[i].a],
geometry.colors[geometry.faces[i].b],
geometry.colors[geometry.faces[i].c]
];
}
geometry.elementsNeedUpdate = true;
}
geometry.computeCentroids();
geometry.computeBoundingSphere();
return geometry;
},
handleElement: function ( geometry, elementName, element ) {
if ( elementName === "vertex" ) {
geometry.vertices.push( geometry.vertices.push(
new THREE.Vector3( element.x, element.y, element.z ) new THREE.Vector3( element.x, element.y, element.z )
...@@ -275,7 +312,7 @@ THREE.PLYLoader.prototype = { ...@@ -275,7 +312,7 @@ THREE.PLYLoader.prototype = {
if ( 'red' in element && 'green' in element && 'blue' in element ) { if ( 'red' in element && 'green' in element && 'blue' in element ) {
useColor = true; geometry.useColor = true;
color = new THREE.Color(); color = new THREE.Color();
color.setRGB( element.red / 255.0, element.green / 255.0, element.blue / 255.0 ); color.setRGB( element.red / 255.0, element.green / 255.0, element.blue / 255.0 );
...@@ -283,7 +320,7 @@ THREE.PLYLoader.prototype = { ...@@ -283,7 +320,7 @@ THREE.PLYLoader.prototype = {
} }
} else if ( header.elements[currentElement].name === "face" ) { } else if ( elementName === "face" ) {
geometry.faces.push( geometry.faces.push(
new THREE.Face3( element.vertex_indices[0], element.vertex_indices[1], element.vertex_indices[2] ) new THREE.Face3( element.vertex_indices[0], element.vertex_indices[1], element.vertex_indices[2] )
...@@ -291,37 +328,90 @@ THREE.PLYLoader.prototype = { ...@@ -291,37 +328,90 @@ THREE.PLYLoader.prototype = {
} }
currentElementCount++; },
binaryRead: function ( dataview, at, type, little_endian ) {
switch( type ) {
// corespondences for non-specific length types here match rply:
case 'int8': case 'char': return [ dataview.getInt8( at ), 1 ];
case 'uint8': case 'uchar': return [ dataview.getUint8( at ), 1 ];
case 'int16': case 'short': return [ dataview.getInt16( at, little_endian ), 2 ];
case 'uint16': case 'ushort': return [ dataview.getUint16( at, little_endian ), 2 ];
case 'int32': case 'int': return [ dataview.getInt32( at, little_endian ), 4 ];
case 'uint32': case 'uint': return [ dataview.getUint32( at, little_endian ), 4 ];
case 'float32': case 'float': return [ dataview.getFloat32( at, little_endian ), 4 ];
case 'float64': case 'double': return [ dataview.getFloat64( at, little_endian ), 8 ];
} }
if ( useColor ) { },
for ( var i = 0; i < geometry.faces.length; i ++ ) { binaryReadElement: function ( dataview, at, properties, little_endian ) {
geometry.faces[i].vertexColors = [ var element = Object();
geometry.colors[geometry.faces[i].a], var result, read = 0;
geometry.colors[geometry.faces[i].b],
geometry.colors[geometry.faces[i].c] for ( var i = 0; i < properties.length; i ++ ) {
];
if ( properties[i].type === "list" ) {
var list = [];
result = this.binaryRead( dataview, at+read, properties[i].countType, little_endian );
var n = result[0];
read += result[1];
for ( j = 0; j < n; j ++ ) {
result = this.binaryRead( dataview, at+read, properties[i].itemType, little_endian );
list.push( result[0] );
read += result[1];
} }
geometry.elementsNeedUpdate = true; element[ properties[i].name ] = list;
} else {
result = this.binaryRead( dataview, at+read, properties[i].type, little_endian );
element[ properties[i].name ] = result[0];
read += result[1];
} }
geometry.computeCentroids(); }
geometry.computeBoundingSphere();
return geometry; return [ element, read ];
}, },
parseBinary: function (buf) { parseBinary: function ( data ) {
var geometry = new THREE.Geometry();
var header = this.parseHeader( this.bin2str( data ) );
var little_endian = (header.format === "binary_little_endian");
var body = new DataView( data, header.headerLength );
var result, loc = 0;
for ( var currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {
for ( var currentElementCount = 0; currentElementCount < header.elements[currentElement].count; currentElementCount ++ ) {
result = this.binaryReadElement( body, loc, header.elements[currentElement].properties, little_endian );
loc += result[1];
var element = result[0];
this.handleElement( geometry, header.elements[currentElement].name, element );
}
}
// not supported yet return this.postProcess( geometry );
console.error('Not supported yet.');
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册