|
@@ -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;
|
|
|
}
|
|
|
|
|
|
};
|