فهرست منبع

adding incomplete loader work

Luis Fraguada 5 سال پیش
والد
کامیت
8a7585dbd6

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 8 - 0
examples/jsm/libs/rhino3dm/rhino3dm.js


BIN
examples/jsm/libs/rhino3dm/rhino3dm.wasm


+ 174 - 0
examples/jsm/loaders/3DMLoader.js

@@ -0,0 +1,174 @@
+/**
+ * @author Luis Fraguada / https://github.com/fraguada
+ */
+
+import {
+	BufferAttribute,
+	BufferGeometry,
+	FileLoader,
+	Loader
+} from "../../../build/three.module.js";
+
+var Rhino3dmLoader = function ( manager ) {
+
+    Loader.call( this, manager );
+
+	this.libraryPath = '';
+	this.libraryPending = null;
+	this.libraryBinary = null;
+
+};
+
+Rhino3dmLoader.prototype = Object.assign( Object.create( Loader.prototype ), {
+
+    constructor: Rhino3dmLoader,
+
+    setLibraryPath: function ( path ) {
+
+		this.libraryPath = path;
+
+		return this;
+
+	},
+
+	load: function ( url, onLoad, onProgress, onError ) {
+
+		var scope = this;
+
+		var path = ( this.path !== undefined ) ? this.path : LoaderUtils.extractUrlBase( url );
+
+		var loader = new FileLoader( scope.manager );
+
+		loader.load( url, function ( text ) {
+
+			try {
+
+				scope.parse( text, path, onLoad, onError );
+
+			} catch ( e ) {
+
+				if ( onError !== undefined ) {
+
+					onError( e );
+
+				} else {
+
+					throw e;
+
+				}
+
+			}
+
+		}, onProgress, onError );
+
+	},
+
+	parse: function ( ) {
+
+		// parsing logic goes here
+		console.log('3dm parsing');
+
+	},
+
+	_initLibrary: function () {
+
+		if ( ! this.libraryPending ) {
+
+			// Load transcoder wrapper.
+			var jsLoader = new FileLoader( this.manager );
+			jsLoader.setPath( this.transcoderPath );
+			var jsContent = new Promise( ( resolve, reject ) => {
+
+				jsLoader.load( 'rhino3dm.js', resolve, undefined, reject );
+
+			} );
+
+			// Load transcoder WASM binary.
+			var binaryLoader = new FileLoader( this.manager );
+			binaryLoader.setPath( this.transcoderPath );
+			binaryLoader.setResponseType( 'arraybuffer' );
+			var binaryContent = new Promise( ( resolve, reject ) => {
+
+				binaryLoader.load( 'rhino3dm.wasm', resolve, undefined, reject );
+
+			} );
+
+			this.libraryPending = Promise.all( [ jsContent, binaryContent ] )
+				.then( ( [ jsContent, binaryContent ] ) => {
+
+					var fn = Rhino3dmLoader.Rhino3dmWorker.toString();
+
+					var body = [
+						'/* rhino3dm.js */',
+						jsContent,
+						'/* worker */',
+						fn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )
+					].join( '\n' );
+
+					this.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );
+					this.libraryBinary = binaryContent;
+
+				} );
+
+		}
+
+		return this.libraryPending;
+
+	}
+} );
+
+/* WEB WORKER */
+
+Rhino3dmLoader.Rhino3dmWorker = function () {
+
+	var libraryConfig;
+	var libraryPending;
+
+	onmessage = function ( e ) {
+
+		var message = e.data;
+
+		switch ( message.type ) {
+
+			case 'init':
+				libraryPending = new Promise( function ( resolve/*, reject*/ ) {
+
+					libraryPending.onModuleLoaded = function ( draco ) {
+
+						// Module is Promise-like. Wrap before resolving to avoid loop.
+						resolve( { rhino3dm: rhino3dm } );
+
+					};
+
+					DracoDecoderModule( decoderConfig );
+
+				} );
+				break;
+			case 'decode':
+				break;
+		}
+	}
+
+	function init( wasmBinary ) {
+
+		var rhino3dmModule;
+		transcoderPending = new Promise( ( resolve ) => {
+
+			rhino3dmModule = { wasmBinary, onRuntimeInitialized: resolve };
+			BASIS( rhino3dmModule );
+
+		} ).then( () => {
+
+			var { BasisFile, initializeBasis } = rhino3dmModule;
+
+			_BasisFile = BasisFile;
+
+			initializeBasis();
+
+		} );
+
+	}
+
+};
+
+export { Rhino3dmLoader };

+ 95 - 0
examples/webgl_loader_3dm.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webgl - loaders - Rhino 3DM loader</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<link type="text/css" rel="stylesheet" href="main.css">
+	</head>
+
+	<body>
+		<div id="info">
+			<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - 3DS loader
+		</div>
+
+		<script type="module">
+
+			import * as THREE from '../build/three.module.js';
+
+			import { TrackballControls } from './jsm/controls/TrackballControls.js';
+			import { Rhino3dmLoader } from './jsm/loaders/3dmLoader.js';
+
+			var container, controls;
+			var camera, scene, renderer;
+
+			init();
+			animate();
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				camera = new THREE.PerspectiveCamera( 60, window.innerWidth / window.innerHeight, 0.1, 10 );
+				camera.position.z = 2;
+
+				scene = new THREE.Scene();
+				scene.add( new THREE.HemisphereLight() );
+
+				var directionalLight = new THREE.DirectionalLight( 0xffeedd );
+				directionalLight.position.set( 0, 0, 2 );
+				scene.add( directionalLight );
+
+				var loader = new Rhino3dmLoader( );
+				
+				loader.load( 'models/3ds/portalgun/portalgun.3ds', function ( object ) {
+
+                    /*
+					object.traverse( function ( child ) {
+
+						if ( child.isMesh ) {
+
+							child.material.normalMap = normal;
+
+						}
+
+					} );
+
+					scene.add( object );
+                    */
+
+                } );
+                
+                
+				renderer = new THREE.WebGLRenderer();
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				container.appendChild( renderer.domElement );
+
+				controls = new TrackballControls( camera, renderer.domElement );
+
+				window.addEventListener( 'resize', resize, false );
+
+			}
+
+			function resize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			function animate() {
+
+				controls.update();
+				renderer.render( scene, camera );
+
+				requestAnimationFrame( animate );
+
+			}
+		</script>
+
+	</body>
+</html>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است