未验证 提交 f0b64a9b 编写于 作者: M Michael Herzog 提交者: GitHub

Merge pull request #17847 from Mugen87/dev11

3MFLoader: Add support for vertex colors.
......@@ -14,6 +14,7 @@
*
* - Texture 2D
* - Texture 2D Groups
* - Color Groups (Vertex Colors)
*/
THREE.ThreeMFLoader = function ( manager ) {
......@@ -311,6 +312,36 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
}
function parseColorGroupNodes( colorGroupNode ) {
var colorGroupData = {
id: colorGroupNode.getAttribute( 'id' ), // required
displaypropertiesid: colorGroupNode.getAttribute( 'displaypropertiesid' )
};
var colorNodes = colorGroupNode.querySelectorAll( 'color' );
var colors = [];
var colorObject = new THREE.Color();
for ( var i = 0; i < colorNodes.length; i ++ ) {
var colorNode = colorNodes[ i ];
var color = colorNode.getAttribute( 'color' );
colorObject.setStyle( color.substring( 0, 7 ) );
colorObject.convertSRGBToLinear(); // color is in sRGB
colors.push( colorObject.r, colorObject.g, colorObject.b );
}
colorGroupData[ 'colors' ] = new Float32Array( colors );
return colorGroupData;
}
function parseBasematerialNode( basematerialNode ) {
var basematerialData = {};
......@@ -567,6 +598,19 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
//
resourcesData[ 'colorgroup' ] = {};
var colorGroupNodes = resourcesNode.querySelectorAll( 'colorgroup' );
for ( var i = 0; i < colorGroupNodes.length; i ++ ) {
var colorGroupNode = colorGroupNodes[ i ];
var colorGroupData = parseColorGroupNodes( colorGroupNode );
resourcesData[ 'colorgroup' ][ colorGroupData[ 'id' ] ] = colorGroupData;
}
//
resourcesData[ 'texture2dgroup' ] = {};
var textures2DGroupNodes = resourcesNode.querySelectorAll( 'texture2dgroup' );
......@@ -877,6 +921,65 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
}
function buildVertexColorMesh( colorgroup, triangleProperties, modelData, meshData ) {
// geometry
var geometry = new THREE.BufferGeometry();
var positionData = [];
var colorData = [];
var vertices = meshData.vertices;
var colors = colorgroup.colors;
for ( var i = 0, l = triangleProperties.length; i < l; i ++ ) {
var triangleProperty = triangleProperties[ i ];
positionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 0 ] );
positionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 1 ] );
positionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 2 ] );
positionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 0 ] );
positionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 1 ] );
positionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 2 ] );
positionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 0 ] );
positionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 1 ] );
positionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 2 ] );
//
colorData.push( colors[ ( triangleProperty.p1 * 3 ) + 0 ] );
colorData.push( colors[ ( triangleProperty.p1 * 3 ) + 1 ] );
colorData.push( colors[ ( triangleProperty.p1 * 3 ) + 3 ] );
colorData.push( colors[ ( triangleProperty.p2 * 3 ) + 0 ] );
colorData.push( colors[ ( triangleProperty.p2 * 3 ) + 1 ] );
colorData.push( colors[ ( triangleProperty.p2 * 3 ) + 2 ] );
colorData.push( colors[ ( triangleProperty.p3 * 3 ) + 0 ] );
colorData.push( colors[ ( triangleProperty.p3 * 3 ) + 1 ] );
colorData.push( colors[ ( triangleProperty.p3 * 3 ) + 2 ] );
}
geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( positionData, 3 ) );
geometry.setAttribute( 'color', new THREE.Float32BufferAttribute( colorData, 3 ) );
// material
var material = new THREE.MeshPhongMaterial( { vertexColors: THREE.VertexColors } );
// mesh
var mesh = new THREE.Mesh( geometry, material );
return mesh;
}
function buildDefaultMesh( meshData ) {
var geometry = new THREE.BufferGeometry();
......@@ -896,7 +999,7 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
var keys = Object.keys( resourceMap );
var meshes = [];
for ( var i = 0; i < keys.length; i ++ ) {
for ( var i = 0, il = keys.length; i < il; i ++ ) {
var resourceId = keys[ i ];
var triangleProperties = resourceMap[ resourceId ];
......@@ -908,9 +1011,9 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
var basematerials = modelData.resources.basematerials[ resourceId ];
var newMeshes = buildBasematerialsMeshes( basematerials, triangleProperties, modelData, meshData, textureData, objectData );
for ( var i = 0, l = newMeshes.length; i < l; i ++ ) {
for ( var j = 0, jl = newMeshes.length; j < jl; j ++ ) {
meshes.push( newMeshes[ i ] );
meshes.push( newMeshes[ j ] );
}
break;
......@@ -920,6 +1023,11 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
meshes.push( buildTexturedMesh( texture2dgroup, triangleProperties, modelData, meshData, textureData ) );
break;
case 'vertexColors':
var colorgroup = modelData.resources.colorgroup[ resourceId ];
meshes.push( buildVertexColorMesh( colorgroup, triangleProperties, modelData, meshData, textureData ) );
break;
case 'default':
meshes.push( buildDefaultMesh( meshData ) );
break;
......@@ -945,6 +1053,10 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
return 'material';
} else if ( modelData.resources.colorgroup[ pid ] !== undefined ) {
return 'vertexColors';
} else if ( pid === 'default' ) {
return 'default';
......
......@@ -14,12 +14,14 @@
*
* - Texture 2D
* - Texture 2D Groups
* - Color Groups (Vertex Colors)
*/
import {
BufferAttribute,
BufferGeometry,
ClampToEdgeWrapping,
Color,
FileLoader,
Float32BufferAttribute,
Group,
......@@ -34,6 +36,7 @@ import {
NearestFilter,
RepeatWrapping,
TextureLoader,
VertexColors,
sRGBEncoding
} from "../../../build/three.module.js";
......@@ -332,6 +335,36 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
}
function parseColorGroupNodes( colorGroupNode ) {
var colorGroupData = {
id: colorGroupNode.getAttribute( 'id' ), // required
displaypropertiesid: colorGroupNode.getAttribute( 'displaypropertiesid' )
};
var colorNodes = colorGroupNode.querySelectorAll( 'color' );
var colors = [];
var colorObject = new Color();
for ( var i = 0; i < colorNodes.length; i ++ ) {
var colorNode = colorNodes[ i ];
var color = colorNode.getAttribute( 'color' );
colorObject.setStyle( color.substring( 0, 7 ) );
colorObject.convertSRGBToLinear(); // color is in sRGB
colors.push( colorObject.r, colorObject.g, colorObject.b );
}
colorGroupData[ 'colors' ] = new Float32Array( colors );
return colorGroupData;
}
function parseBasematerialNode( basematerialNode ) {
var basematerialData = {};
......@@ -588,6 +621,19 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
//
resourcesData[ 'colorgroup' ] = {};
var colorGroupNodes = resourcesNode.querySelectorAll( 'colorgroup' );
for ( var i = 0; i < colorGroupNodes.length; i ++ ) {
var colorGroupNode = colorGroupNodes[ i ];
var colorGroupData = parseColorGroupNodes( colorGroupNode );
resourcesData[ 'colorgroup' ][ colorGroupData[ 'id' ] ] = colorGroupData;
}
//
resourcesData[ 'texture2dgroup' ] = {};
var textures2DGroupNodes = resourcesNode.querySelectorAll( 'texture2dgroup' );
......@@ -898,6 +944,65 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
}
function buildVertexColorMesh( colorgroup, triangleProperties, modelData, meshData ) {
// geometry
var geometry = new BufferGeometry();
var positionData = [];
var colorData = [];
var vertices = meshData.vertices;
var colors = colorgroup.colors;
for ( var i = 0, l = triangleProperties.length; i < l; i ++ ) {
var triangleProperty = triangleProperties[ i ];
positionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 0 ] );
positionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 1 ] );
positionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 2 ] );
positionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 0 ] );
positionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 1 ] );
positionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 2 ] );
positionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 0 ] );
positionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 1 ] );
positionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 2 ] );
//
colorData.push( colors[ ( triangleProperty.p1 * 3 ) + 0 ] );
colorData.push( colors[ ( triangleProperty.p1 * 3 ) + 1 ] );
colorData.push( colors[ ( triangleProperty.p1 * 3 ) + 3 ] );
colorData.push( colors[ ( triangleProperty.p2 * 3 ) + 0 ] );
colorData.push( colors[ ( triangleProperty.p2 * 3 ) + 1 ] );
colorData.push( colors[ ( triangleProperty.p2 * 3 ) + 2 ] );
colorData.push( colors[ ( triangleProperty.p3 * 3 ) + 0 ] );
colorData.push( colors[ ( triangleProperty.p3 * 3 ) + 1 ] );
colorData.push( colors[ ( triangleProperty.p3 * 3 ) + 2 ] );
}
geometry.setAttribute( 'position', new Float32BufferAttribute( positionData, 3 ) );
geometry.setAttribute( 'color', new Float32BufferAttribute( colorData, 3 ) );
// material
var material = new MeshPhongMaterial( { vertexColors: VertexColors } );
// mesh
var mesh = new Mesh( geometry, material );
return mesh;
}
function buildDefaultMesh( meshData ) {
var geometry = new BufferGeometry();
......@@ -917,7 +1022,7 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
var keys = Object.keys( resourceMap );
var meshes = [];
for ( var i = 0; i < keys.length; i ++ ) {
for ( var i = 0, il = keys.length; i < il; i ++ ) {
var resourceId = keys[ i ];
var triangleProperties = resourceMap[ resourceId ];
......@@ -929,9 +1034,9 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
var basematerials = modelData.resources.basematerials[ resourceId ];
var newMeshes = buildBasematerialsMeshes( basematerials, triangleProperties, modelData, meshData, textureData, objectData );
for ( var i = 0, l = newMeshes.length; i < l; i ++ ) {
for ( var j = 0, jl = newMeshes.length; j < jl; j ++ ) {
meshes.push( newMeshes[ i ] );
meshes.push( newMeshes[ j ] );
}
break;
......@@ -941,6 +1046,11 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
meshes.push( buildTexturedMesh( texture2dgroup, triangleProperties, modelData, meshData, textureData ) );
break;
case 'vertexColors':
var colorgroup = modelData.resources.colorgroup[ resourceId ];
meshes.push( buildVertexColorMesh( colorgroup, triangleProperties, modelData, meshData, textureData ) );
break;
case 'default':
meshes.push( buildDefaultMesh( meshData ) );
break;
......@@ -966,6 +1076,10 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
return 'material';
} else if ( modelData.resources.colorgroup[ pid ] !== undefined ) {
return 'vertexColors';
} else if ( pid === 'default' ) {
return 'default';
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册