|
@@ -15,6 +15,7 @@
|
|
* - Texture 2D
|
|
* - Texture 2D
|
|
* - Texture 2D Groups
|
|
* - Texture 2D Groups
|
|
* - Color Groups (Vertex Colors)
|
|
* - Color Groups (Vertex Colors)
|
|
|
|
+ * - Metallic Display Properties (PBR)
|
|
*/
|
|
*/
|
|
|
|
|
|
THREE.ThreeMFLoader = function ( manager ) {
|
|
THREE.ThreeMFLoader = function ( manager ) {
|
|
@@ -261,6 +262,7 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
|
|
|
|
|
|
var basematerialNode = basematerialNodes[ i ];
|
|
var basematerialNode = basematerialNodes[ i ];
|
|
var basematerialData = parseBasematerialNode( basematerialNode );
|
|
var basematerialData = parseBasematerialNode( basematerialNode );
|
|
|
|
+ basematerialData.index = i; // the order and count of the material nodes form an implicit 0-based index
|
|
basematerialsData.basematerials.push( basematerialData );
|
|
basematerialsData.basematerials.push( basematerialData );
|
|
|
|
|
|
}
|
|
}
|
|
@@ -342,12 +344,41 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ function parseMetallicDisplaypropertiesNode( metallicDisplaypropetiesNode ) {
|
|
|
|
+
|
|
|
|
+ var metallicDisplaypropertiesData = {
|
|
|
|
+ id: metallicDisplaypropetiesNode.getAttribute( 'id' ) // required
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ var metallicNodes = metallicDisplaypropetiesNode.querySelectorAll( 'pbmetallic' );
|
|
|
|
+
|
|
|
|
+ var metallicData = [];
|
|
|
|
+
|
|
|
|
+ for ( var i = 0; i < metallicNodes.length; i ++ ) {
|
|
|
|
+
|
|
|
|
+ var metallicNode = metallicNodes[ i ];
|
|
|
|
+
|
|
|
|
+ metallicData.push( {
|
|
|
|
+ name: metallicNode.getAttribute( 'name' ), // required
|
|
|
|
+ metallicness: parseFloat( metallicNode.getAttribute( 'metallicness' ) ), // required
|
|
|
|
+ roughness: parseFloat( metallicNode.getAttribute( 'roughness' ) ) // required
|
|
|
|
+ } );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ metallicDisplaypropertiesData.data = metallicData;
|
|
|
|
+
|
|
|
|
+ return metallicDisplaypropertiesData;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
function parseBasematerialNode( basematerialNode ) {
|
|
function parseBasematerialNode( basematerialNode ) {
|
|
|
|
|
|
var basematerialData = {};
|
|
var basematerialData = {};
|
|
|
|
|
|
basematerialData[ 'name' ] = basematerialNode.getAttribute( 'name' ); // required
|
|
basematerialData[ 'name' ] = basematerialNode.getAttribute( 'name' ); // required
|
|
basematerialData[ 'displaycolor' ] = basematerialNode.getAttribute( 'displaycolor' ); // required
|
|
basematerialData[ 'displaycolor' ] = basematerialNode.getAttribute( 'displaycolor' ); // required
|
|
|
|
+ basematerialData[ 'displaypropertiesid' ] = basematerialNode.getAttribute( 'displaypropertiesid' );
|
|
|
|
|
|
return basematerialData;
|
|
return basematerialData;
|
|
|
|
|
|
@@ -611,6 +642,19 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
|
|
|
|
|
|
//
|
|
//
|
|
|
|
|
|
|
|
+ resourcesData[ 'pbmetallicdisplayproperties' ] = {};
|
|
|
|
+ var pbmetallicdisplaypropertiesNodes = resourcesNode.querySelectorAll( 'pbmetallicdisplayproperties' );
|
|
|
|
+
|
|
|
|
+ for ( var i = 0; i < pbmetallicdisplaypropertiesNodes.length; i ++ ) {
|
|
|
|
+
|
|
|
|
+ var pbmetallicdisplaypropertiesNode = pbmetallicdisplaypropertiesNodes[ i ];
|
|
|
|
+ var pbmetallicdisplaypropertiesData = parseMetallicDisplaypropertiesNode( pbmetallicdisplaypropertiesNode );
|
|
|
|
+ resourcesData[ 'pbmetallicdisplayproperties' ][ pbmetallicdisplaypropertiesData[ 'id' ] ] = pbmetallicdisplaypropertiesData;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ //
|
|
|
|
+
|
|
resourcesData[ 'texture2dgroup' ] = {};
|
|
resourcesData[ 'texture2dgroup' ] = {};
|
|
var textures2DGroupNodes = resourcesNode.querySelectorAll( 'texture2dgroup' );
|
|
var textures2DGroupNodes = resourcesNode.querySelectorAll( 'texture2dgroup' );
|
|
|
|
|
|
@@ -1159,9 +1203,29 @@ THREE.ThreeMFLoader.prototype = Object.assign( Object.create( THREE.Loader.proto
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- function buildBasematerial( materialData ) {
|
|
|
|
|
|
+ function buildBasematerial( materialData, objects, modelData ) {
|
|
|
|
+
|
|
|
|
+ var material;
|
|
|
|
+
|
|
|
|
+ var displaypropertiesid = materialData.displaypropertiesid;
|
|
|
|
+ var pbmetallicdisplayproperties = modelData.resources.pbmetallicdisplayproperties;
|
|
|
|
+
|
|
|
|
+ if ( displaypropertiesid !== null && pbmetallicdisplayproperties[ displaypropertiesid ] !== undefined ) {
|
|
|
|
|
|
- var material = new THREE.MeshPhongMaterial( { flatShading: true } );
|
|
|
|
|
|
+ // metallic display property, use StandardMaterial
|
|
|
|
+
|
|
|
|
+ var pbmetallicdisplayproperty = pbmetallicdisplayproperties[ displaypropertiesid ];
|
|
|
|
+ var metallicData = pbmetallicdisplayproperty.data[ materialData.index ];
|
|
|
|
+
|
|
|
|
+ material = new THREE.MeshStandardMaterial( { flatShading: true, roughness: metallicData.roughness, metalness: metallicData.metallicness } );
|
|
|
|
+
|
|
|
|
+ } else {
|
|
|
|
+
|
|
|
|
+ // otherwise use PhongMaterial
|
|
|
|
+
|
|
|
|
+ material = new THREE.MeshPhongMaterial( { flatShading: true } );
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
|
|
material.name = materialData.name;
|
|
material.name = materialData.name;
|
|
|
|
|