Преглед изворни кода

initial parsing of layers and views

Luis Fraguada пре 5 година
родитељ
комит
c1ebc34c19
1 измењених фајлова са 114 додато и 75 уклоњено
  1. 114 75
      examples/jsm/loaders/3DMLoader.js

+ 114 - 75
examples/jsm/loaders/3DMLoader.js

@@ -10,10 +10,10 @@ import {
 	Loader,
 	Object3D,
 	MeshStandardMaterial,
-	MeshPhongMaterial,
 	Mesh,
 	Color,
-	RingGeometry
+	Points,
+	PointsMaterial
 } from "../../../build/three.module.js";
 
 var Rhino3dmLoader = function ( manager ) {
@@ -151,10 +151,12 @@ Rhino3dmLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 	_createGeometry: function ( data ) {
 
-		// console.log(data);
-
 		var object = new Object3D();
-		let loader = new BufferGeometryLoader();
+		object.userData['layers'] = data.layers;
+
+		console.log(data);
+
+		var loader = new BufferGeometryLoader();
 
 		var objects = data.objects;
 		var materials = data.materials;
@@ -163,32 +165,50 @@ Rhino3dmLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
 
 			var obj = objects[i];
 
-			var geometry = loader.parse( obj.geometry );
+			//console.log(obj);
+
 			var attributes = obj.attributes;
-			var mat = materials[attributes.materialIndex];
+			var geometry = null;
+			var material = null;
+			
+			switch( obj.objectType ) {
+				case 'PointSet':
 
-			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;
-			}
+					geometry = loader.parse( obj.geometry );
+					material = new PointsMaterial( { sizeAttenuation: true, vertexColors:true } );
+					var points = new Points( geometry, material );
+					points.userData['attributes'] = attributes;
+					object.add(points);
 
-			var material = new MeshStandardMaterial( { 
-				color: diffusecolor, 
-				metalness: 0.8,
-				name: mat.name 
-			} );
+					break;
 
-			var mesh = new Mesh(geometry, material);
-			mesh.castShadow = attributes.castsShadows;
-			mesh.receiveShadow = attributes.receivesShadows;
-			mesh.userData['attributes'] = attributes;
+				case 'Mesh':
 
-			//console.log(mesh);
-			//console.log(mat);
+					geometry = loader.parse( obj.geometry );
 
-			object.add(mesh);
+					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 mesh = new Mesh(geometry, material);
+					mesh.castShadow = attributes.castsShadows;
+					mesh.receiveShadow = attributes.receivesShadows;
+					mesh.userData['attributes'] = attributes;
+
+					break;
+			}
 
 		}
 		
@@ -381,29 +401,29 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 		var arr = new Uint8Array(buffer);
 		var doc = rhino.File3dm.fromByteArray(arr);
 
-		var objects = doc.objects();
-		var materials = doc.materials();
+		var objects = [];
+		var materials = [];
+		var layers = [];
+		var views = [];
+		var namedViews = [];
 
-		var objs = [];
-		var mats = [];
+		//Handle objects
 
-		//Handle document objects
+		for( var i = 0; i < doc.objects().count; i++ ) {
 
-		for( var i = 0; i < objects.count; i++ ) {
-
-			var obj = objects.get(i);
-			var geo = obj.geometry();
-			var attr = obj.attributes();
-			var objectType = geo.objectType;
+			var _object = doc.objects().get(i);
+			var _geometry = _object.geometry();
+			var _attributes = _object.attributes();
+			var objectType = _geometry.objectType;
 			var geometry = null;
 
 			// TODO: handle other geometry types
 			switch( objectType ) {
 
-				case rhino.ObjectType.PointCloud:
+				case rhino.ObjectType.PointSet:
 				case rhino.ObjectType.Mesh:
 
-					geometry = geo.toThreejsJSON();
+					geometry = _geometry.toThreejsJSON();
 
 					break;
 
@@ -411,77 +431,96 @@ Rhino3dmLoader.Rhino3dmWorker = function () {
 
 			if( geometry ) {
 
-				var attributes = {};
+				var attributes = extractProperties( _attributes );
 
-				for ( var property in attr ) {
+				objectType = objectType.constructor.name;
+				objectType = objectType.substring( 11, objectType.length );
 
-					// console.log(`${property}: ${attr[property]}`);
+				objects.push( { geometry, attributes, objectType: objectType } );
 
-					if( typeof attr[property] !== 'function' ){
+			}
 
-						attributes[property] = attr[property];
+			_geometry.delete();
+			_object.delete();
+			
+		}
 
-					} else {
+		//Handle materials
 
-						// TODO: extract data from functions such as user strings
+		for( var i = 0; i < doc.materials().count(); i++) {
 
-					}
-				}
+			var _material = doc.materials().get( i );
+			var materialProperties = extractProperties( _material );
+			var pbMaterialProperties = extractProperties( _material.physicallyBased() );
+			
+			var material = Object.assign(materialProperties, pbMaterialProperties);
 
-				objs.push( { geometry, attributes } );
+			materials.push( material );
+
+			_material.delete();
 
-			}
-			
 		}
 
-		//Handle document materials
+		// Handle layers
 
-		for( var i = 0; i < materials.count(); i++) {
+		for( var i = 0; i < doc.layers().count(); i++) {
 
-			var mat = materials.get( i );
+			var _layer = doc.layers().get( i );
+			var layer = extractProperties( _layer );
 
-			var material = {};
+			layers.push( layer );
 
-			// console.log(mat);
+			_layer.delete();
+			
+		} 
 
-			for ( var property in mat ) { 
+		// Handle views
 
-				//console.log(material.IsPhysicallyBased);
+		for( var i = 0; i < doc.views().count(); i++) {
 
-				if( typeof mat[property] !== 'function' ){
+			var _view = doc.views().get( i );
+			var view = extractProperties( _view );
 
-					material[property] = mat[property];
+			views.push( view );
 
-				} else {
+			_view.delete();
+		}
 
-					// TODO: extract data from functions
-					// console.log(`${property}: ${mat[property]}`);
+		// Handle named views
 
-				}
+		for( var i = 0; i < doc.namedViews().count(); i++) {
 
-			}
+			var _namedView = doc.namedViews().get( i );
+			var namedView = extractProperties( _namedView );
 
-			// extract physically based material properties
-			var pbMat = mat.physicallyBased();
+			namedViews.push( namedView );
 
-			for ( var property in pbMat ) {
+			_namedView.delete();
+		}
 
-				if( typeof mat[property] !== 'function' ){
+		//TODO: Handle other document stuff like lights, views, etc.
 
-					material[property] = pbMat[property];
+		doc.delete();
 
-				}
+		return { objects, materials, layers, views, namedViews };
 
-			}
+	}
 
-			mats.push( material );
+	function extractProperties( object ) {
 
-		}
+		var result = {};
 
-		//TODO: Handle other document stuff like lights, views, etc.
+		for ( var property in object ) {
 
-		return { objects: objs, materials: mats };
+			if( typeof object[property] !== 'function' ){
+
+				result[property] = object[property];
+
+			}
+
+		}
 
+		return result;
 	}
 
 };