Code viewer for World: Cloned Collision World

// Demo of Physijs based World

// From here, with some changes:
// http://chandlerprall.github.io/Physijs/examples/collisions.html




// These 3 have default values, so this section is optional:

AB.clockTick       = 100;    

	// Speed of run: Step every n milliseconds. Default 100.
	
AB.maxSteps        = 2000;    

	// Length of run: Maximum length of run in steps. Default 1000.

AB.screenshotStep  = 200;   
  
	// Take screenshot on this step. (All resources should have finished loading.) Default 50.

	

	
	


const BOXSIZE = 4 ;
const BOXPOS = 10; 		// range of box start positions 

				
const LIGHTRADIUS = BOXSIZE * 5 ;

const startRadius = BOXSIZE * 15 ;
const maxRadius = BOXSIZE * 250 ;



	
	const TEXTURE_FILE_0   	= '/uploads/starter/smiley.png' ;
	const TEXTURE_FILE_1   	= '/uploads/starter/ghost.3.png' ;
	
	
// https://commons.wikimedia.org/wiki/Smiley
	
	
	const TEXTURE_GROUND 	= '/uploads/starter/rocks.jpg' ;

	const SOUND_COLLISION 	= '/uploads/starter/wooden.mp3' ;
 
 // credit:
 // http://soundbible.com/715-Dropped-Wooden-Floor.html
 
 
const SKYCOLOR  = 0xffffcc;    

const HIGH_FRICTION 	= 0.8; 		
const MEDIUM_FRICTION 	= 0.6; 		
	 
const LOW_RESTITUTION 	= 0.3; 		 





function randomfloatAtoB ( A, B )			 
{
 return ( A + ( Math.random() * (B-A) ) );
}

function randomintAtoB ( A, B )			 
{
 return  ( Math.round ( randomfloatAtoB ( A, B ) ) );
}





 	
function World() { 


	var  box_geometry, box_material_0, box_material_1 ;

	var step = 0;

	var currentbox ;
	

function initScene()
{

	// --- Light ------------------------------------------------------------------

	var      light;

	light = new THREE.DirectionalLight( 0xFFFFFF, 1.3 );
	light.position.set( LIGHTRADIUS, startRadius, -LIGHTRADIUS );
	light.target.position.copy( threeworld.scene.position );

	light.castShadow = true;
	
	light.shadow.camera.left = -60;
	light.shadow.camera.top = -60;
	light.shadow.camera.right = 60;
	light.shadow.camera.bottom = 60;
	light.shadow.camera.near = 20;
	light.shadow.camera.far = 200;
	light.shadow.bias = -0.0001
	light.shadow.mapSize.width = light.shadow.mapSize.height = 2048;

	threeworld.scene.add( light );

	

	// --- Ground ------------------------------------------------------------------

	var  ground_material, ground;

	var loader = new THREE.TextureLoader();
	
	ground_material = Physijs.createMaterial(
		new THREE.MeshLambertMaterial({ map: loader.load( TEXTURE_GROUND ) }),
		HIGH_FRICTION,
		LOW_RESTITUTION );

//	ground_material.map.wrapS = ground_material.map.wrapT = THREE.RepeatWrapping;
//	ground_material.map.repeat.set( 3, 3 );
	
	ground = new Physijs.BoxMesh(
		new THREE.BoxGeometry( BOXSIZE*25, 1, BOXSIZE*25 ),
		ground_material,
		0 );					// mass
		
	ground.receiveShadow = true;
	threeworld.scene.add( ground );
	
	
	
	// --- Box ------------------------------------------------------------------

	var loader2 = new THREE.TextureLoader();
	var loader3 = new THREE.TextureLoader();

	box_geometry = new THREE.BoxGeometry( BOXSIZE, BOXSIZE, BOXSIZE );
		
	box_material_0  = Physijs.createMaterial(
					new THREE.MeshLambertMaterial({ map: loader2.load( TEXTURE_FILE_0 ) }), 
					MEDIUM_FRICTION,
					LOW_RESTITUTION	);
						
	box_material_1 = Physijs.createMaterial(
					new THREE.MeshLambertMaterial({ map: loader3.load( TEXTURE_FILE_1 ) }),
					MEDIUM_FRICTION,
					LOW_RESTITUTION	);
	
	createBox();
}



 
function createBox() 		
// creates one random box
{
	var box = new Physijs.BoxMesh (	box_geometry, box_material_0 );
	
	box.collisions = 0;
	box.castShadow = true;
				
	box.position.set(  randomintAtoB(-BOXPOS,BOXPOS),		(BOXPOS * 3),		randomintAtoB(-BOXPOS,BOXPOS)	);
				
	box.rotation.set( 	Math.random() * Math.PI,	Math.random() * Math.PI,	Math.random() * Math.PI		);
				
				
	box.addEventListener( 'collision', function( other_object, relative_velocity, relative_rotation, contact_normal ) 
    // box has collided with `other_object` with an impact speed of `relative_velocity` and a rotational force of `relative_rotation` and at normal `contact_normal`
	{
		// console.log ( relative_velocity );
		var mainImpact = relative_velocity.y;		// impact in direction of gravity 
 		if (  Math.abs(mainImpact) > 4 )			// main impact, not lesser ones as it settles  
		{
			soundCollision();
			this.material = box_material_1;
		}
	});
	
	
	threeworld.scene.add( box );
	
	currentbox = box;
	
	// Create another box in random (m to n) milliseconds time:
	// Note: Put this in createBox, not nextStep - runs on independent timer.
 
	setTimeout( createBox, randomintAtoB ( 20, 21 ) );		 

};



	
function soundCollision()
{
		var x = "<audio    src=" + SOUND_COLLISION + "   autoplay  > </audio>";
		$("#user_span2").html( x );
}





// --- public interface ----------------------------------------------------------------------


	this.endCondition;	
	

	
this.newRun = function() 
{
  this.endCondition = false;

  threeworld.init3d ( startRadius, maxRadius, SKYCOLOR  ); 

			// sets up renderer, scene, camera
		
 
 // can adjust renderer:
 
	threeworld.renderer.shadowMap.enabled = true;
	threeworld.renderer.shadowMapSoft = true;


 // scene is Physijs.Scene, not THREE.Scene
 // can adjust scene - change gravity from default:
 
		threeworld.scene.setGravity ( new THREE.Vector3( 50, -50, 0 ));

  
// multiply mouse scrolls by some factor to speed up/slow down movement:
//	  threehandler.SCROLLFACTOR 	= 0.1;
	  
	  
	initScene();

	threeworld.lookat.copy ( threeworld.scene.position );  
	 
	threeworld.scene.simulate();		// Physics simulate - runs on independent timer to AB nextStep

};



this.nextStep = function()
{
	// nothing to do each step
	// physics simulate runs on independent timer
	// create box runs on another independent timer

	// for camera control, follow current falling box:  
	if ( currentbox )
		threeworld.follow.copy ( currentbox.position );           
	
	step++;
	$("#user_span1").html( "Step: " + step );
};


this.endRun = function()
{
};

 
}