Loop Subdivision (simplified)

by jmchen

HTML

<script src="http://cdnjs.cloudflare.com/ajax/libs/three.js/r70/three.min.js"></script>
<script src="https://dl.dropboxusercontent.com/u/3587259/Code/Threejs/OrbitControls.js">
    
</script>
<script src="http://jyunming-chen.github.io/tutsplus/js/KeyboardState.js"></script>
<script src="http://threejs.org/examples/js/modifiers/SubdivisionModifier.js"></script>

<div id="stats"></div>

CSS

body {
    font-family: Monospace;
    background-color: #f0f0f0;
    margin: 0px;
    overflow: hidden;
}

#stats {
    text-align: right;
    position:absolute;
    bottom: 50px;
    color: #ff0000;
}

JavaScript

var container;
var camera, controls, scene, renderer;
var cube;
var keyboard = new KeyboardState();

var subdivisions = 1;

// start scene

init();
animate();

function nextSubdivision(x) {
    subdivisions = Math.max(0, subdivisions + x);
    addStuff();
}

function loadGeom () {
}

function subdivide () {
}

function addStuff() {

    if (cube) {
        scene.remove(group);
        scene.remove(cube);
    }


    var modifier = new THREE.SubdivisionModifier(subdivisions);

    //geometry = new THREE.BoxGeometry (200, 200, 200, 2, 2, 2);//, materials);
    geometry = new THREE.IcosahedronGeometry (100, 1);//, materials);
    //var meshScale = params.meshScale ? params.meshScale : 1;
	var meshScale = 2;

   /*
   (to-do): call back to do Suzanne.js
   
    var loader2 = new THREE.JSONLoader();
	loader2.load( 'http://threejs.org/examples/obj/Suzanne.js', function ( geom ) {
		geometry = geom.clone();
//				geometriesParams.push({type: 'Suzanne', args: [ ], scale: 100, meshScale:2 });
	} );

    */
    
    // Cloning original geometry for debuging

    smooth = geometry.clone();

    // mergeVertices(); is run in case of duplicated vertices
    smooth.mergeVertices();
    smooth.computeFaceNormals();
    smooth.computeVertexNormals();

    modifier.modify(smooth);


    // assign vertex color based on the Y coordinate
    var faceABCD = "abcd";
    var color, f, p, n, vertexIndex;

    for (i = 0; i < smooth.faces.length; i++) {

        f = smooth.faces[i];


        n = (f instanceof THREE.Face3) ? 3 : 4;

        for (var j = 0; j < n; j++) {

            vertexIndex = f[faceABCD.charAt(j)];

            p = smooth.vertices[vertexIndex];

            color = new THREE.Color(0xffffff);
            color.setHSL((p.y) / 200 + 0.5, 1.0, 0.5);

            f.vertexColors[j] = color;

        }

    }

    // group: the control mesh (geometry: createSomething)
    group = new THREE.Group();
    scene.add(group);

    var material = new THREE.MeshBasicMaterial({
    ...