|
44 | 44 | <body>
|
45 | 45 | <div id="info">
|
46 | 46 | <a href="https://github.com/zeux/meshoptimizer" target="_blank" rel="noopener">meshoptimizer</a>
|
| 47 | +<div id="ratio"></div> |
47 | 48 | </div>
|
48 | 49 |
|
49 | 50 | <script type="module">
|
|
298 | 299 | MeshoptSimplifier.ready.then(function () {
|
299 | 300 | MeshoptSimplifier.useExperimentalFeatures = true;
|
300 | 301 |
|
| 302 | +var rnum = 0; |
| 303 | +var rden = 0; |
| 304 | + |
301 | 305 | var triangles = 0;
|
302 | 306 | var vertices = 0;
|
303 | 307 | var error = 0;
|
304 | 308 |
|
305 | 309 | var threshold = Math.pow(10, -settings.errorThresholdLog10);
|
306 | 310 |
|
307 | 311 | if (settings.autoLod) {
|
308 |
| -// subtract 1 because we assume model radius is 1.0, so this is a distance-to-sphere |
309 |
| -// ideally this should actually use the real radius :) but we rescale the model to fit a unit box |
310 |
| -var distance = Math.max(camera.position.distanceTo(model.position) - 1, 0); |
| 312 | +// compute distance to model sphere |
| 313 | +// ideally this should actually use the real radius and center :) but we rescale/center the model when loading |
| 314 | +var center = new THREE.Vector3(); |
| 315 | +var radius = 1; |
| 316 | +var distance = Math.max(camera.position.distanceTo(center) - radius, 0); |
311 | 317 | var loderrortarget = 1e-3; // ~1 pixel at 1k x 1k
|
312 | 318 |
|
313 | 319 | // note: we are currently cutting corners wrt handling the actual mesh scale
|
|
343 | 349 | error = Math.max(error, err); // note: we are ignoring the possibility of different mesh scales atm
|
344 | 350 | triangles += tri;
|
345 | 351 | vertices += object.geometry.attributes.position.count;
|
| 352 | +rnum += tri; |
| 353 | +rden += object.original.index.count / 3; |
346 | 354 | }
|
347 | 355 | if (object.isPoints) {
|
348 | 356 | simplifyPoints(object.geometry);
|
349 | 357 |
|
350 |
| -vertices += object.geometry.attributes.position.count; |
| 358 | +vertices += object.geometry.index.count; |
| 359 | +rnum += object.geometry.index.count; |
| 360 | +rden += object.geometry.attributes.position.count; |
351 | 361 | }
|
352 | 362 | });
|
353 | 363 |
|
354 | 364 | settings.stats.triangles = triangles;
|
355 | 365 | settings.stats.vertices = vertices;
|
356 | 366 | settings.stats.error = error.toExponential(3);
|
| 367 | + |
| 368 | +document.getElementById('ratio').innerText = ((rnum / rden) * 100).toFixed(1) + '%'; |
357 | 369 | });
|
358 | 370 | }
|
359 | 371 |
|
|
460 | 472 | camera.position.z = 3.0;
|
461 | 473 |
|
462 | 474 | controls = new OrbitControls(camera, renderer.domElement);
|
463 |
| -controls.addEventListener('change', simplify); |
| 475 | + |
| 476 | +controls.addEventListener('change', function () { |
| 477 | +if (settings.autoLod) { |
| 478 | +simplify(); |
| 479 | +} |
| 480 | +}); |
464 | 481 |
|
465 | 482 | scene = new THREE.Scene();
|
466 | 483 | scene.background = new THREE.Color(0x300a24);
|
|
0 commit comments