|
@@ -14,12 +14,14 @@
|
|
*
|
|
*
|
|
* - Texture 2D
|
|
* - Texture 2D
|
|
* - Texture 2D Groups
|
|
* - Texture 2D Groups
|
|
|
|
+ * - Color Groups (Vertex Colors)
|
|
*/
|
|
*/
|
|
|
|
|
|
import {
|
|
import {
|
|
BufferAttribute,
|
|
BufferAttribute,
|
|
BufferGeometry,
|
|
BufferGeometry,
|
|
ClampToEdgeWrapping,
|
|
ClampToEdgeWrapping,
|
|
|
|
+ Color,
|
|
FileLoader,
|
|
FileLoader,
|
|
Float32BufferAttribute,
|
|
Float32BufferAttribute,
|
|
Group,
|
|
Group,
|
|
@@ -34,6 +36,7 @@ import {
|
|
NearestFilter,
|
|
NearestFilter,
|
|
RepeatWrapping,
|
|
RepeatWrapping,
|
|
TextureLoader,
|
|
TextureLoader,
|
|
|
|
+ VertexColors,
|
|
sRGBEncoding
|
|
sRGBEncoding
|
|
} from "../../../build/three.module.js";
|
|
} 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 ) {
|
|
function parseBasematerialNode( basematerialNode ) {
|
|
|
|
|
|
var basematerialData = {};
|
|
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' ] = {};
|
|
resourcesData[ 'texture2dgroup' ] = {};
|
|
var textures2DGroupNodes = resourcesNode.querySelectorAll( '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 ) {
|
|
function buildDefaultMesh( meshData ) {
|
|
|
|
|
|
var geometry = new BufferGeometry();
|
|
var geometry = new BufferGeometry();
|
|
@@ -917,7 +1022,7 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
|
|
var keys = Object.keys( resourceMap );
|
|
var keys = Object.keys( resourceMap );
|
|
var meshes = [];
|
|
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 resourceId = keys[ i ];
|
|
var triangleProperties = resourceMap[ resourceId ];
|
|
var triangleProperties = resourceMap[ resourceId ];
|
|
@@ -929,9 +1034,9 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
|
|
var basematerials = modelData.resources.basematerials[ resourceId ];
|
|
var basematerials = modelData.resources.basematerials[ resourceId ];
|
|
var newMeshes = buildBasematerialsMeshes( basematerials, triangleProperties, modelData, meshData, textureData, objectData );
|
|
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;
|
|
break;
|
|
@@ -941,6 +1046,11 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
|
|
meshes.push( buildTexturedMesh( texture2dgroup, triangleProperties, modelData, meshData, textureData ) );
|
|
meshes.push( buildTexturedMesh( texture2dgroup, triangleProperties, modelData, meshData, textureData ) );
|
|
break;
|
|
break;
|
|
|
|
|
|
|
|
+ case 'vertexColors':
|
|
|
|
+ var colorgroup = modelData.resources.colorgroup[ resourceId ];
|
|
|
|
+ meshes.push( buildVertexColorMesh( colorgroup, triangleProperties, modelData, meshData, textureData ) );
|
|
|
|
+ break;
|
|
|
|
+
|
|
case 'default':
|
|
case 'default':
|
|
meshes.push( buildDefaultMesh( meshData ) );
|
|
meshes.push( buildDefaultMesh( meshData ) );
|
|
break;
|
|
break;
|
|
@@ -966,6 +1076,10 @@ ThreeMFLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
|
|
|
|
|
|
return 'material';
|
|
return 'material';
|
|
|
|
|
|
|
|
+ } else if ( modelData.resources.colorgroup[ pid ] !== undefined ) {
|
|
|
|
+
|
|
|
|
+ return 'vertexColors';
|
|
|
|
+
|
|
} else if ( pid === 'default' ) {
|
|
} else if ( pid === 'default' ) {
|
|
|
|
|
|
return 'default';
|
|
return 'default';
|