Browse Source

Added extrusion support, groups, settings

Luis Fraguada 5 years ago
parent
commit
287b4041dd
1 changed files with 168 additions and 19 deletions
  1. 168 19
      examples/jsm/loaders/3DMLoader.js

+ 168 - 19
examples/jsm/loaders/3DMLoader.js

@@ -149,12 +149,45 @@ Rhino3dmLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 	},
 
+	_createMaterial: function ( material ) {
+
+		if ( material === undefined ) {
+
+			return  new MeshStandardMaterial( { 
+				color: new Color( 1,1,1 ), 
+				metalness: 0.8,
+				name: 'default',
+				side: 2
+			} );
+
+		}
+
+		var _diffuseColor = material.diffuseColor;
+
+		var diffusecolor = new Color( _diffuseColor.r/ 255.0, _diffuseColor.g / 255.0, _diffuseColor.b / 255.0 );
+
+		if ( _diffuseColor.r === 0 && _diffuseColor.g === 0 && _diffuseColor.b === 0 ) {
+			diffusecolor.r = 1;
+			diffusecolor.g = 1;
+			diffusecolor.b = 1;
+		}
+
+		return  new MeshStandardMaterial( { 
+			color: diffusecolor, 
+			metalness: 0.8,
+			name: material.name,
+			side: 2
+		} );
+
+	},
+
 	_createGeometry: function ( data ) {
 
+		console.log(data);
+
 		var object = new Object3D();
 		object.userData['layers'] = data.layers;
-
-		console.log(data);
+		object.userData['groups'] = data.groups;
 
 		var loader = new BufferGeometryLoader();
 
@@ -183,29 +216,43 @@ Rhino3dmLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 					break;
 
 				case 'Mesh':
+				case 'Extrusion':
 
 					geometry = loader.parse( obj.geometry );
 
-					mat = materials[attributes.materialIndex];
-
-					let diffusecolor = new Color(mat.diffuseColor.r/ 255.0, mat.diffuseColor.g / 255.0, mat.diffuseColor.b / 255.0);
-					if ( mat.diffuseColor.r === 0 && mat.diffuseColor.g === 0 && mat.diffuseColor.b === 0) {
-						diffusecolor.r = 1;
-						diffusecolor.g = 1;
-						diffusecolor.b = 1;
-					}
-
-					// check obj type
-					var material = new MeshStandardMaterial( { 
-						color: diffusecolor, 
-						metalness: 0.8,
-						name: mat.name 
-					} );
+					var material = this._createMaterial( materials[attributes.materialIndex] );
 
 					var mesh = new Mesh(geometry, material);
 					mesh.castShadow = attributes.castsShadows;
 					mesh.receiveShadow = attributes.receivesShadows;
 					mesh.userData['attributes'] = attributes;
+					mesh.userData['objectType'] = obj.objectType;
+
+					object.add( mesh );
+
+					break;
+
+				case 'Brep':
+
+					var brepObject = new Object3D();
+
+					var material = this._createMaterial( materials[attributes.materialIndex] );
+
+					for( var j = 0; j < obj.geometry.length; j++ ) {
+
+						geometry = loader.parse( obj.geometry[j] );
+						var mesh = new Mesh(geometry, material);
+						mesh.castShadow = attributes.castsShadows;
+						mesh.receiveShadow = attributes.receivesShadows;
+
+						brepObject.add( mesh );
+
+					}
+
+					brepObject.userData['attributes'] = attributes;
+					brepObject.userData['objectType'] = obj.objectType;
+
+					object.add( brepObject );
 
 					break;
 			}
@@ -406,6 +453,8 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 		var layers = [];
 		var views = [];
 		var namedViews = [];
+		var groups = [];
+		// var strings = [];
 
 		//Handle objects
 
@@ -420,6 +469,21 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 			// TODO: handle other geometry types
 			switch( objectType ) {
 
+				case rhino.ObjectType.Point:
+				case rhino.ObjectType.Light:
+				case rhino.ObjectType.Curve:
+				case rhino.ObjectType.Surface:
+				case rhino.ObjectType.Annotation:
+				case rhino.ObjectType.InstanceReference:
+				case rhino.ObjectType.TextDot:
+				case rhino.ObjectType.Hatch:
+				case rhino.ObjectType.SubD:
+				case rhino.ObjectType.ClipPlane:
+
+					console.warn(`THREE.3DMLoader: TODO: Implement ${objectType.constructor.name}`);
+					
+					break;
+
 				case rhino.ObjectType.PointSet:
 				case rhino.ObjectType.Mesh:
 
@@ -427,6 +491,43 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 
 					break;
 
+				case rhino.ObjectType.Brep:
+
+					var faces = _geometry.faces();
+					geometry = [];
+
+					for (var faceIndex = 0; faceIndex < faces.count; faceIndex++) {
+
+						var face = faces.get( faceIndex );
+						var mesh = face.getMesh( rhino.MeshType.Any );
+
+						if ( mesh ) {
+
+							geometry.push( mesh.toThreejsJSON() );
+							mesh.delete();
+
+						}
+
+						face.delete();
+					}
+
+					faces.delete();
+
+					break;
+
+				case rhino.ObjectType.Extrusion:
+
+					var mesh = _geometry.getMesh(rhino.MeshType.Any);
+
+					if( mesh ) {
+
+						geometry = mesh.toThreejsJSON();
+						mesh.delete();
+
+					} 
+
+					break;
+
 			}
 
 			if( geometry ) {
@@ -498,11 +599,55 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 			_namedView.delete();
 		}
 
-		//TODO: Handle other document stuff like lights, views, etc.
+		// Handle groups
+
+		for( var i = 0; i < doc.groups().count(); i++ ){
+
+			var _group = doc.groups().get( i );
+			var group = extractProperties( _group );
+
+			groups.push( group );
+
+			_group.delete();
+
+		}
+
+		// Handle settings
+
+		var settings = extractProperties( doc.settings() );
+
+		//TODO: Handle other document stuff like dimstyles, instance definitions, bitmaps etc.
+
+		// Handle dimstyles
+		// console.log(`Dimstyle Count: ${doc.dimstyles().count()}`); 
+
+		// Handle bitmaps
+		// console.log(`Bitmap Count: ${doc.bitmaps().count()}`); 
+
+		// Handle instance definitions
+		// console.log(`Instance Definitions Count: ${doc.instanceDefinitions().count()}`); 
+
+		// Handle strings -- this seems to be broken at the moment in rhino3dm
+		// console.log(`Strings Count: ${doc.strings().count()}`); 
+
+		/*
+		for( var i = 0; i < doc.strings().count(); i++ ){
+
+			var _string= doc.strings().get( i );
+
+			console.log(_string);
+			var string = extractProperties( _group );
+
+			strings.push( string );
+
+			_string.delete();
+
+		}
+		*/
 
 		doc.delete();
 
-		return { objects, materials, layers, views, namedViews };
+		return { objects, materials, layers, views, namedViews, groups, settings };
 
 	}
 
@@ -516,6 +661,10 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 
 				result[property] = object[property];
 
+			} else {
+
+				// console.log(`${property}: ${object[property]}`);
+
 			}
 
 		}