Egyszerű vezérlők és FPS számláló hozzáadása

Előkészület
    <script src="js/stats.min.js"></script>
    <script src="js/dat.gui.min.js"></script>
    var container;
    var scene, camera, renderer;
    var ctrl, stats;
    var geometryBox, geometrySphere;
    var material;
    var meshBox, meshSphere;
    var eghBox, eghSphere;
    var renderObject, lastRenderObject;

    function addStatsObject() {
        stats = new Stats();
        stats.setMode(0);

        stats.domElement.style.position = 'absolute';
        stats.domElement.style.left = container.offsetLeft + 'px';
        stats.domElement.style.top = container.offsetTop + 'px';
        document.body.appendChild( stats.domElement );
    }

    var meshController = function () {
        this.rotationX = 0.01;
        this.rotationY = 0.005;
        this.colorSolid = material.color.getHex();
        this.colorWire = eghBox.material.color.getHex();
        this.object = 'kocka';
        renderObject = 'kocka';
        lastRenderObject = 'kocka';
    };

    function addControlGui( controlObject ) {
        var gui = new dat.GUI( { autoPlace: false });
        gui.add( controlObject, 'rotationX', -0.01, 0.01);
        gui.add( controlObject, 'rotationY', -0.01, 0.01);
        gui.addColor(controlObject, 'colorSolid');
        gui.addColor(controlObject, 'colorWire');
        gui.add( controlObject, 'object', [ 'kocka', 'gömb' ] );

        gui.domElement.style.position = 'absolute';
        gui.domElement.style.top = container.offsetTop + 'px';
        gui.domElement.style.left = container.offsetLeft + container.width - gui.width + 'px';
        document.body.appendChild( gui.domElement );
    }

    function init() {
        container = document.getElementById( 'myCanvas' );
        renderer = new THREE.WebGLRenderer( { antialias: true, canvas: container } );
        renderer.setSize( container.clientWidth, container.clientHeight );

        scene = new THREE.Scene();
        camera = new THREE.PerspectiveCamera( 75, container.clientWidth / container.clientHeight, 0.1, 1000 );

        geometryBox = new THREE.BoxGeometry( 10, 10, 10 );
        geometrySphere = new THREE.SphereGeometry( 8, 50, 30);
        material = new THREE.MeshBasicMaterial( { color: 0x333388, wireframe: false } );
        meshBox = new THREE.Mesh( geometryBox, material );
        meshSphere = new THREE.Mesh( geometrySphere, material );
        scene.add( meshBox );

        eghBox = new THREE.EdgesHelper( meshBox, 0xffffff );
        eghBox.material.linewidth = 2;
        scene.add( eghBox );
        eghSphere = new THREE.EdgesHelper( meshSphere, 0xffffff );
        eghSphere.material.linewidth = 2;

        camera.position.z = 18;

        ctrl = new meshController();
        addControlGui( ctrl );

        addStatsObject();

        render();
    }

    var render = function () {
        if( lastRenderObject != ctrl.object ) {
            lastRenderObject = ctrl.object;
            scene.remove(scene.children[1]);
            scene.remove(scene.children[0]);
            if( ctrl.object == 'kocka' ) {
                scene.add( meshBox );
                scene.add( eghBox );
            } else {
                scene.add( meshSphere );
                scene.add( eghSphere );
            }
        }

        if( ctrl.object == 'kocka') {
            meshBox.material.color = new THREE.Color( ctrl.colorSolid );
            meshBox.rotation.x += ctrl.rotationX;
            meshBox.rotation.y += ctrl.rotationY;
            eghBox.material.color = new THREE.Color( ctrl.colorWire );
        }

        if( ctrl.object == 'gömb' ) {
            meshSphere.material.color = new THREE.Color( ctrl.colorSolid );
            meshSphere.rotation.x += ctrl.rotationX;
            meshSphere.rotation.y += ctrl.rotationY;
            eghSphere.material.color = new THREE.Color( ctrl.colorWire );
        }

        renderer.render(scene, camera);
        stats.update();
        requestAnimationFrame( render );
    };