Pārlūkot izejas kodu

PRWM loader example

kchapelier 8 gadi atpakaļ
vecāks
revīzija
0b247476ef
2 mainītis faili ar 234 papildinājumiem un 0 dzēšanām
  1. 1 0
      examples/files.js
  2. 233 0
      examples/webgl_loader_prwm.html

+ 1 - 0
examples/files.js

@@ -110,6 +110,7 @@ var files = {
 		"webgl_loader_pcd",
 		"webgl_loader_pdb",
 		"webgl_loader_ply",
+		"webgl_loader_prwm",
 		"webgl_loader_ttf",
 		"webgl_loader_sea3d",
 		"webgl_loader_sea3d_hierarchy",

+ 233 - 0
examples/webgl_loader_prwm.html

@@ -0,0 +1,233 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webgl - loaders - PRWM loader</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
+		<style>
+			html, body {
+				padding:0;
+				margin:0;
+				background:#000000;
+			}
+
+			.models {
+				position:absolute;
+				top:10px;
+				left:12px;
+				z-index:2;
+				font-family: "Arial", "Helvetica Neue", "Helvetica", sans-serif;
+				font-size:13px;
+			}
+
+			.notes {
+				position:absolute;
+				left:12px;
+				bottom:10px;
+				z-index:2;
+				font-family: "Arial", "Helvetica Neue", "Helvetica", sans-serif;
+				font-size:13px;
+				text-align:left;
+				color:#FFFFFF;
+				max-width:300px;
+			}
+
+			.notes a, .notes a:visited {
+				color:#FFFFFF;
+			}
+
+			.models strong {
+				color:#FFFFFF;
+				text-transform: uppercase;
+				display:inline-block;
+				min-width:120px;
+			}
+
+			.models a, .models a:visited {
+				color:#FFFFFF;
+				margin-right:12px;
+				text-decoration: none;
+			}
+
+			.models a:hover, .models a:focus {
+				text-decoration: underline;
+			}
+		</style>
+	</head>
+
+	<body>
+
+
+		<div class="models">
+			<strong>Little-Endian</strong>
+			<a class="model" href="./models/prwm/faceted-nefertiti-LE.prwm">Faceted Nefertiti</a>
+			<a class="model" href="./models/prwm/smooth-suzanne-LE.prwm">Smooth Suzanne</a>
+			<a class="model" href="./models/prwm/vive-controller-LE.prwm">Vive Controller</a><br>
+			<strong>Big-Endian</strong>
+			<a class="model" href="./models/prwm/faceted-nefertiti-BE.prwm">Faceted Nefertiti</a>
+			<a class="model" href="./models/prwm/smooth-suzanne-BE.prwm">Smooth Suzanne</a>
+			<a class="model" href="./models/prwm/vive-controller-BE.prwm">Vive Controller</a>
+		</div>
+		<div class="notes">
+			The parsing of PRWM file is especially fast when the endianness of the file is the same as the endianness
+			of the client platform. This platform endianness is <strong id="endianness"></strong>.<br><br>
+			See your console for stats.<br><br>
+			<a href="https://github.com/kchapelier/PRWM" target="_blank">Specifications and implementations</a>
+		</div>
+
+		<script src="../build/three.js"></script>
+		<script src="js/loaders/PRWMLoader.js"></script>
+
+		<script>
+
+			var container;
+
+			var camera, scene, renderer;
+
+			var mouseX = 0, mouseY = 0;
+
+			var windowHalfX = window.innerWidth / 2;
+			var windowHalfY = window.innerHeight / 2;
+
+
+			init();
+			animate();
+
+
+			function init() {
+				document.getElementById('endianness').innerHTML = THREE.PRWMLoader.isBigEndianPlatform() ? 'big-endian' : 'little-endian';
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 2000 );
+				camera.position.z = 250;
+
+				// scene
+
+				scene = new THREE.Scene();
+
+				var ambient = new THREE.AmbientLight( 0x101030 );
+				scene.add( ambient );
+
+				var directionalLight = new THREE.DirectionalLight( 0xffeedd );
+				directionalLight.position.set( 0, 0, 1 );
+				scene.add( directionalLight );
+
+				// model
+
+				var loader = new THREE.PRWMLoader();
+				var material = new THREE.MeshPhongMaterial({});
+				var busy = false;
+				var mesh = null;
+
+				var onProgress = function ( xhr ) {
+					if ( xhr.lengthComputable ) {
+						var percentComplete = xhr.loaded / xhr.total * 100;
+						console.log( Math.round(percentComplete, 2) + '% downloaded' );
+
+						if (xhr.loaded === xhr.total) {
+							console.log('File size: ' + (xhr.total / 1024).toFixed(2) + 'kB');
+							console.timeEnd('Download');
+						}
+					}
+				};
+
+				var onError = function ( xhr ) {
+					busy = false;
+				};
+
+				function loadGeometry (url) {
+					if (busy) return;
+
+					busy = true;
+
+					if (mesh !== null) {
+						scene.remove(mesh);
+						mesh.geometry.dispose();
+					}
+
+					console.log('-- Loading', url);
+					console.time('Download');
+					loader.load( url, function ( geometry ) {
+						mesh = new THREE.Mesh(geometry, material);
+						mesh.scale.set(50,50,50);
+						scene.add( mesh );
+
+						console.log(geometry.index ? 'indexed geometry' : 'non-indexed geometry');
+						console.log('# of vertices: ' + geometry.attributes.position.count);
+						console.log('# of polygons: ' + (geometry.index ? geometry.index.count / 3 : geometry.attributes.position.count / 3));
+						busy = false;
+					}, onProgress, onError );
+				}
+
+
+				//
+
+				renderer = new THREE.WebGLRenderer({ antialias: true });
+				renderer.setPixelRatio( 1 );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				container.appendChild( renderer.domElement );
+
+				document.addEventListener( 'mousemove', onDocumentMouseMove, false );
+
+				//
+
+				document.querySelectorAll('a.model').forEach(function (anchor) {
+					anchor.addEventListener('click', function (e) {
+						e.preventDefault();
+
+						loadGeometry(anchor.href);
+					});
+				});
+
+				//
+
+				loadGeometry('./models/prwm/smooth-suzanne-LE.prwm');
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			function onWindowResize() {
+
+				windowHalfX = window.innerWidth / 2;
+				windowHalfY = window.innerHeight / 2;
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			function onDocumentMouseMove( event ) {
+
+				mouseX = ( event.clientX - windowHalfX ) / 2;
+				mouseY = ( event.clientY - windowHalfY ) / 2;
+
+			}
+
+			//
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+				render();
+
+			}
+
+			function render() {
+
+				camera.position.x += ( mouseX - camera.position.x ) * .05;
+				camera.position.y += ( - mouseY - camera.position.y ) * .05;
+
+				camera.lookAt( scene.position );
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+
+	</body>
+</html>