function intro()
{
    this.start_time = 0;
    this.end_time = 0;

	  this.angularSpeed = 0.2; 
    this.lastTime = 0;
    this.logo = 0;
    this.renderer, this.scene, this.camera;
    this.angleChange;
    this.particles;
    this.composer;
    this.mirror;

    this.aBloomFactor = 1, this.aBloomStrength = 1.5; // Adjust parameters as you want
    this.aEffectCopy;
    this.aEffectBloom;
    this.aRenderModel;

    this.light, this.light0;
    this.renderer, this.scene, this.camera;
    
    this.material;

		var geometry, i, h, color, colors = [], sprite, size;

    this.init = function(renderer, camera)
    {      

      this.renderer = renderer;

      this.scene = new THREE.Scene();

      this.camera = camera;

      
      // var ambient = new THREE.AmbientLight( 0x444444 );
			// scene.add( ambient );


      // Create Particle System ---------------------------------------------------------------------------------------
			geometry = new THREE.Geometry();
      sprite = THREE.ImageUtils.loadTexture("images/particle.png");

      var pMaterial = new THREE.ParticleBasicMaterial({
            color: 0x333333,
            size: 20,
            map: sprite,
            blending: THREE.AdditiveBlending,
            transparent: true
          });

				for (var i = 0; i < 1000; i ++ ) 
				{

					var vertex = new THREE.Vector3();
					vertex.x = 2000 * Math.random() - 1000;
					vertex.y = 2000 * Math.random() - 1000;
					vertex.z = 2000 * Math.random() - 1000;

					geometry.vertices.push( vertex );

					colors[i] = new THREE.Color( 0xffffff );

					// colors[ i ].setHSL( ( vertex.x + 1000 ) / 2000, 1, 0.5 );
					// colors[ i ].setHSL( 1, 1, 1 );

				}

			geometry.colors = colors;			

      this.particles = new THREE.ParticleSystem( geometry, pMaterial);

      // Add particles to sceneGraph
      this.scene.add(this.particles);
      this.particles.sortParticles = true;


      // Create Cubemap -------------------------------------------------------------------------------------------
      var path = "assets/cube/";
			var format = '.jpg';
			var urls = [
					path + 'posx_1' + format, path + 'negx_1' + format,
					path + 'posy_1' + format, path + 'negy_1' + format,
					path + 'posz_1' + format, path + 'negz_1' + format
				];

			var reflectionCube = THREE.ImageUtils.loadTextureCube( urls );
			reflectionCube.format = THREE.RGBFormat;

      var cubeMaterial = new THREE.MeshLambertMaterial( { color: 0xff0000, ambient: 0xff0000, specular: 0xff0000, envMap: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.1 } );

      // Add Synrj logo to sceneGraph ------------------------------------------------------------------------------
      this.logo = create_geometry_0();
      this.logo.material = cubeMaterial;
      
      //this.logo.castshadow = true;
      //this.logo.receiveshadow = true;
      
      this.scene.add(this.logo);

      // Create City Overlay ----------------------------------------------------------------------------------------
      var map = THREE.ImageUtils.loadTexture( 'assets/city1.png' );
			map.wrapS = map.wrapT = THREE.RepeatWrapping;
      map.repeat.set( 3, 1 );

			var material = new THREE.MeshLambertMaterial( { 
        color: 0xffffff, 
        map: map, 
        side: THREE.FrontSide,  
        transparent: true,
        depthTest: false
      } );
      material.opacity = 0.4;
      
      var object = new THREE.Mesh( new THREE.PlaneGeometry( 250, 150, 1, 1 ), material );
      object.position.set( 0, 0, -50 );
      
      this.scene.add( object );               
       

      // Create bloom in order to create glow effet
      var aBloomFactor = 1.5, aBloomStrength = 1.5; // Adjust parameters as you want
      var aEffectBloom = new THREE.BloomPass( aBloomStrength, aBloomFactor * 25.0, aBloomFactor * 4.0, 512 );
     
      // Create the post-effect system
      var aEffectCopy = new THREE.ShaderPass( THREE.CopyShader );
      aEffectCopy.renderToScreen = true;    
      var aRenderModel = new THREE.RenderPass( this.scene, this.camera );
     
      // Create the rendering pass
      this.composer = new THREE.EffectComposer( this.renderer );
      this.composer.addPass( aRenderModel );
      this.composer.addPass( aEffectBloom );
      this.composer.addPass( aEffectCopy );
              


      this.light = new THREE.SpotLight( 0xffffff, 1.25 );
      this.light.position.set(-50, 90, 60);
      this.light.target.position.set( 0, 0, 0);
      //this.light.castShadow = true;
      this.scene.add(this.light);

      this.light1 = new THREE.SpotLight( 0xffffff, 1.25 );
      this.light1.position.set(0, 0, -20);
      this.light1.target.position.set( 0, 0, 0);

    }

    this.setupRenderer = function(){
    
      this.renderer.setClearColor( 0x333333, 0 );
      this.camera.position.z = 100;       
      this.renderer.autoClear  = false;    
    }


    this.render = function(demoFrame)
    {
    	  this.angleChange = this.angularSpeed * demoFrame * 2 * Math.PI / 1000;

        this.particles.rotation.x += demoFrame*0.02;
        this.logo.rotation.y += 0.001;
        // this.logo.rotation.x = Math.sin(demoFrame);        
        
        //this.renderer.render(this.scene, this.camera);
        this.light.position.x = 200.0*Math.cos(demoFrame);
        this.light.position.y = 200.0*Math.sin(demoFrame);

        this.renderer.clear();
        this.composer.render();
    }
}