Files
three.js/examples/webgl_lensflares.html
T
alteredq 4be5880b0f Made SpritePlugin and LensFlare plugins default.
Also some refactoring in plugins.

Still not really satisfied with a solution, will need to handle somehow ordering of plugins (both among them and with respect to rest of rendering, this would be needed for example to be able to redo shadow maps as a plugin).
2011-11-18 17:19:10 +01:00

262 lines
6.3 KiB
HTML

<!DOCTYPE HTML>
<html lang="en">
<head>
<title>three.js webgl - lensflares</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<style type="text/css">
body {
background:#000;
padding:0;
margin:0;
font-weight: bold;
overflow:hidden;
}
#info {
position: absolute;
top: 10px; width: 100%;
color: #ffffff;
padding: 5px;
font-family: Monospace;
font-size: 13px;
text-align: center;
z-index:100;
}
a {
color: orange;
text-decoration: none;
}
a:hover {
color: #0080ff;
}
</style>
</head>
<body>
<div id="info">
<a href="http://github.com/mrdoob/three.js" target="_blank">three.js</a> - lensflares -
textures from <a href="http://ro.me">ro.me</a> - fly with WASD/RF/QE + mouse
</div>
<script src="../build/Three.js"></script>
<script src="js/RequestAnimationFrame.js"></script>
<script src="js/Stats.js"></script>
<script>
var container, stats;
var camera, scene, renderer;
var clock = new THREE.Clock();
var composer;
init();
animate();
function init() {
container = document.createElement( 'div' );
document.body.appendChild( container );
// camera
camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 15000 );
camera.position.z = 250;
controls = new THREE.FlyControls( camera );
controls.movementSpeed = 2500;
controls.domElement = container;
controls.rollSpeed = Math.PI / 6;
controls.autoForward = false;
controls.dragToLook = false
// scene
scene = new THREE.Scene();
scene.add( camera );
scene.fog = new THREE.Fog( 0x000000, 3500, 15000 );
scene.fog.color.setHSV( 0.51, 0.6, 0.025 );
// world
var s = 250;
var cube = new THREE.CubeGeometry( s, s, s );
var material = new THREE.MeshPhongMaterial( { ambient: 0x333333, color: 0xffffff, specular: 0xffffff, shininess: 50, perPixel: true } );
for ( var i = 0; i < 3000; i ++ ) {
var mesh = new THREE.Mesh( cube, material );
mesh.position.x = 8000 * ( 2.0 * Math.random() - 1.0 );
mesh.position.y = 8000 * ( 2.0 * Math.random() - 1.0 );
mesh.position.z = 8000 * ( 2.0 * Math.random() - 1.0 );
mesh.rotation.x = Math.random() * Math.PI;
mesh.rotation.y = Math.random() * Math.PI;
mesh.rotation.z = Math.random() * Math.PI;
mesh.matrixAutoUpdate = false;
mesh.updateMatrix();
scene.add( mesh );
}
// lights
var ambient = new THREE.AmbientLight( 0xffffff );
ambient.color.setHSV( 0.1, 0.5, 0.3 );
scene.add( ambient );
var dirLight = new THREE.DirectionalLight( 0xffffff, 0.125 );
dirLight.position.set( 0, -1, 0 ).normalize();
scene.add( dirLight );
dirLight.color.setHSV( 0.1, 0.725, 0.9 );
// lens flares
var textureFlare0 = THREE.ImageUtils.loadTexture( "textures/lensflare/lensflare0.png" );
var textureFlare2 = THREE.ImageUtils.loadTexture( "textures/lensflare/lensflare2.png" );
var textureFlare3 = THREE.ImageUtils.loadTexture( "textures/lensflare/lensflare3.png" );
addLight( 0.55, 0.825, 0.99, 5000, 0, -1000 );
addLight( 0.08, 0.825, 0.99, 0, 0, -1000 );
addLight( 0.995, 0.025, 0.99, 5000, 5000, -1000 );
function addLight( h, s, v, x, y, z ) {
var light = new THREE.PointLight( 0xffffff, 1.5, 4500 );
light.position.set( x, y, z );
scene.add( light );
light.color.setHSV( h, s, v );
var flareColor = new THREE.Color( 0xffffff );
flareColor.copy( light.color );
THREE.ColorUtils.adjustHSV( flareColor, 0, -0.5, 0.5 );
var lensFlare = new THREE.LensFlare( textureFlare0, 700, 0.0, THREE.AdditiveBlending, flareColor );
lensFlare.add( textureFlare2, 512, 0.0, THREE.AdditiveBlending );
lensFlare.add( textureFlare2, 512, 0.0, THREE.AdditiveBlending );
lensFlare.add( textureFlare2, 512, 0.0, THREE.AdditiveBlending );
lensFlare.add( textureFlare3, 60, 0.6, THREE.AdditiveBlending );
lensFlare.add( textureFlare3, 70, 0.7, THREE.AdditiveBlending );
lensFlare.add( textureFlare3, 120, 0.9, THREE.AdditiveBlending );
lensFlare.add( textureFlare3, 70, 1.0, THREE.AdditiveBlending );
lensFlare.customUpdateCallback = lensFlareUpdateCallback;
lensFlare.position = light.position;
scene.add( lensFlare );
}
// renderer
renderer = new THREE.WebGLRenderer( { antialias: true, maxLights: 8 } );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setClearColor( scene.fog.color, 1 );
container.appendChild( renderer.domElement );
//
renderer.gammaInput = true;
renderer.gammaOutput = true;
renderer.physicallyBasedShading = true;
// stats
stats = new Stats();
stats.domElement.style.position = 'absolute';
stats.domElement.style.top = '0px';
stats.domElement.style.zIndex = 100;
container.appendChild( stats.domElement );
stats.domElement.children[ 0 ].children[ 0 ].style.color = "#aaa";
stats.domElement.children[ 0 ].style.background = "transparent";
stats.domElement.children[ 0 ].children[ 1 ].style.display = "none";
// events
window.addEventListener( 'resize', onWindowResize, false );
}
//
function lensFlareUpdateCallback( object ) {
var f, fl = object.lensFlares.length;
var flare;
var vecX = -object.positionScreen.x * 2;
var vecY = -object.positionScreen.y * 2;
for( f = 0; f < fl; f++ ) {
flare = object.lensFlares[ f ];
flare.x = object.positionScreen.x + vecX * flare.distance;
flare.y = object.positionScreen.y + vecY * flare.distance;
flare.rotation = 0;
}
object.lensFlares[ 2 ].y += 0.025;
object.lensFlares[ 3 ].rotation = object.positionScreen.x * 0.5 + 45 * Math.PI / 180;
}
//
function onWindowResize( event ) {
renderer.setSize( window.innerWidth, window.innerHeight );
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
}
//
function animate() {
requestAnimationFrame( animate );
render();
stats.update();
}
function render() {
var delta = clock.getDelta();
controls.update( delta );
renderer.render( scene, camera );
}
</script>
</body>
</html>