|
@@ -20,6 +20,7 @@
|
|
|
import { OrbitControls } from './jsm/controls/OrbitControls.js';
|
|
|
import { GeometryCompressionUtils } from './jsm/utils/GeometryCompressionUtils.js';
|
|
|
import { BufferGeometryUtils } from './jsm/utils/BufferGeometryUtils.js';
|
|
|
+ import { TeapotBufferGeometry } from './jsm/geometries/TeapotBufferGeometry.js';
|
|
|
import { GUI } from './jsm/libs/dat.gui.module.js';
|
|
|
|
|
|
var statsEnabled = true;
|
|
@@ -32,6 +33,7 @@
|
|
|
|
|
|
// options
|
|
|
var data = {
|
|
|
+ "model": "Icosahedron",
|
|
|
"wireframe": false,
|
|
|
"texture": false,
|
|
|
"detail": 4,
|
|
@@ -104,36 +106,43 @@
|
|
|
|
|
|
//
|
|
|
|
|
|
- var ballGeom = newGeometry();
|
|
|
+ var geom = newGeometry(data);
|
|
|
|
|
|
- var ballMesh = new THREE.Mesh( ballGeom, meshMaterial );
|
|
|
- var ballLineSegments = new THREE.LineSegments( new THREE.WireframeGeometry( ballGeom ), lineMaterial );
|
|
|
- ballLineSegments.visible = data.wireframe;
|
|
|
+ var mesh = new THREE.Mesh( geom, meshMaterial );
|
|
|
+ var lineSegments = new THREE.LineSegments( new THREE.WireframeGeometry( geom ), lineMaterial );
|
|
|
+ lineSegments.visible = data.wireframe;
|
|
|
|
|
|
- scene.add( ballMesh );
|
|
|
- scene.add( ballLineSegments );
|
|
|
+ scene.add( mesh );
|
|
|
+ scene.add( lineSegments );
|
|
|
|
|
|
//
|
|
|
|
|
|
gui = new GUI();
|
|
|
gui.width = 350;
|
|
|
|
|
|
- function newGeometry() {
|
|
|
+ function newGeometry(data) {
|
|
|
|
|
|
- var geom = new THREE.IcosahedronBufferGeometry( radius, data.detail );
|
|
|
- // var geom = new THREE.CylinderBufferGeometry( 5, 5, 20, 32 );
|
|
|
- // var geom = new THREE.OctahedronBufferGeometry( radius, data.detail );
|
|
|
- // var geom = new THREE.BoxBufferGeometry(radius, radius, radius, data.detail, data.detail, data.detail);
|
|
|
- return geom;
|
|
|
+ switch (data.model) {
|
|
|
+ case "Icosahedron":
|
|
|
+ return new THREE.IcosahedronBufferGeometry( radius, data.detail );
|
|
|
+ case "Cylinder":
|
|
|
+ return new THREE.CylinderBufferGeometry( radius, radius, radius * 2, data.detail * 6 );
|
|
|
+ case "Teapot":
|
|
|
+ return new TeapotBufferGeometry( radius, data.detail * 3, true, true, true, true, true );
|
|
|
+ case "TorusKnot":
|
|
|
+ return new THREE.TorusKnotBufferGeometry( radius, 10, data.detail * 20, data.detail * 6, 3, 4 );
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
function generateGeometry() {
|
|
|
|
|
|
+ geom = newGeometry(data);
|
|
|
+
|
|
|
updateGroupGeometry(
|
|
|
- ballMesh,
|
|
|
- ballLineSegments,
|
|
|
- newGeometry(),
|
|
|
+ mesh,
|
|
|
+ lineSegments,
|
|
|
+ geom,
|
|
|
data );
|
|
|
|
|
|
}
|
|
@@ -141,16 +150,17 @@
|
|
|
// updateLineSegments
|
|
|
function updateLineSegments() {
|
|
|
|
|
|
- ballLineSegments.visible = data.wireframe;
|
|
|
+ lineSegments.visible = data.wireframe;
|
|
|
|
|
|
}
|
|
|
|
|
|
var folder = gui.addFolder( 'Scene' );
|
|
|
- folder.open();
|
|
|
+ folder.add( data, 'model', ["Icosahedron", "Cylinder", "TorusKnot", "Teapot"] ).onChange( generateGeometry );
|
|
|
folder.add( data, 'wireframe', false ).onChange( updateLineSegments );
|
|
|
folder.add( data, 'texture', false ).onChange( generateGeometry );
|
|
|
- folder.add( data, 'detail', 0, 6, 1 ).onChange( generateGeometry );
|
|
|
+ folder.add( data, 'detail', 1, 8, 1 ).onChange( generateGeometry );
|
|
|
folder.add( data, 'rotationSpeed', 0, 0.5, 0.1 );
|
|
|
+ folder.open();
|
|
|
|
|
|
folder = gui.addFolder( 'Position Compression' );
|
|
|
folder.add( data, 'QuantizePosEncoding', false ).onChange( generateGeometry );
|
|
@@ -167,7 +177,7 @@
|
|
|
folder = gui.addFolder( 'Memory Info' );
|
|
|
folder.open();
|
|
|
memoryDisplay = folder.add( data, 'totalGPUMemory', "0 bytes" );
|
|
|
- computeGPUMemory( ballMesh );
|
|
|
+ computeGPUMemory( mesh );
|
|
|
|
|
|
//
|
|
|
|
|
@@ -233,6 +243,7 @@
|
|
|
|
|
|
}
|
|
|
|
|
|
+ // dispose first
|
|
|
lineSegments.geometry.dispose();
|
|
|
mesh.geometry.dispose();
|
|
|
|
|
@@ -265,8 +276,10 @@
|
|
|
|
|
|
|
|
|
function computeGPUMemory( mesh ) {
|
|
|
+
|
|
|
// Use BufferGeometryUtils to do memory calculation
|
|
|
memoryDisplay.setValue( BufferGeometryUtils.estimateBytesUsed(mesh.geometry) + " bytes");
|
|
|
+
|
|
|
}
|
|
|
|
|
|
</script>
|