Advertisement
Guest User

Untitled

a guest
Mar 27th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.47 KB | None | 0 0
  1.  
  2. /*
  3. * AUTHOR: Iacopo Sassarini
  4. */
  5.  
  6. if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
  7.  
  8. var VISUALS_VISIBLE = true;
  9.  
  10. var SCALE_FACTOR = 1500;
  11. var CAMERA_BOUND = 200;
  12.  
  13. var NUM_POINTS_SUBSET = 40000;
  14. var NUM_SUBSETS = 7;
  15. var NUM_POINTS = NUM_POINTS_SUBSET * NUM_SUBSETS;
  16.  
  17. var NUM_LEVELS = 5;
  18. var LEVEL_DEPTH = 400;
  19.  
  20. var DEF_BRIGHTNESS = 1;
  21. var DEF_SATURATION = 0.8;
  22.  
  23. var SPRITE_SIZE = Math.ceil(3 * window.innerWidth /1600);
  24.  
  25. // Orbit parameters constraints
  26. var A_MIN = -30;
  27. var A_MAX = 30;
  28. var B_MIN = .2;
  29. var B_MAX = 1.8;
  30. var C_MIN = 5;
  31. var C_MAX = 17;
  32. var D_MIN = 0;
  33. var D_MAX = 10;
  34. var E_MIN = 0;
  35. var E_MAX = 12;
  36.  
  37. // Orbit parameters
  38. var a, b, c, d, e;
  39.  
  40. // Orbit data
  41. var orbit = {
  42. subsets: [],
  43. xMin: 0,
  44. xMax: 0,
  45. yMin: 0,
  46. yMax: 0,
  47. scaleX: 0,
  48. scaleY: 0
  49. }
  50. // Initialize data points
  51. for (var i = 0; i < NUM_SUBSETS; i++){
  52. var subsetPoints = [];
  53. for (var j = 0; j < NUM_POINTS_SUBSET; j++){
  54. subsetPoints[j] = {
  55. x: 0,
  56. y: 0,
  57. vertex: new THREE.Vertex(new THREE.Vector3(0,0,0))
  58. };
  59. }
  60. orbit.subsets.push(subsetPoints);
  61. }
  62.  
  63. var container, stats;
  64. var camera, scene, renderer, composer, hueValues = [];
  65.  
  66. var mouseX = 0, mouseY = 0;
  67.  
  68. var windowHalfX = window.innerWidth / 2;
  69. var windowHalfY = window.innerHeight / 2;
  70.  
  71. var speed = 6;
  72. var rotationSpeed = 0.005;
  73.  
  74. init();
  75. animate();
  76.  
  77. function init() {
  78.  
  79. sprite1 = THREE.ImageUtils.loadTexture( "galaxy.png" );
  80.  
  81. container = document.createElement( 'div' );
  82. document.body.appendChild( container );
  83.  
  84. camera = new THREE.PerspectiveCamera(60, window.innerWidth / window.innerHeight, 1, 3 * SCALE_FACTOR );
  85. camera.position.z = SCALE_FACTOR/2;
  86.  
  87. scene = new THREE.Scene();
  88. scene.fog = new THREE.FogExp2( 0x000000, 0.0012);
  89.  
  90. generateOrbit();
  91.  
  92. for (var s = 0; s < NUM_SUBSETS; s++){hueValues[s] = Math.random();}
  93.  
  94. // Create particle systems
  95. for (var k = 0; k < NUM_LEVELS; k++){
  96. for (var s = 0; s < NUM_SUBSETS; s++){
  97. var geometry = new THREE.Geometry();
  98. for (var i = 0; i < NUM_POINTS_SUBSET; i++){geometry.vertices.push( orbit.subsets[s][i].vertex);}
  99. var materials = new THREE.ParticleBasicMaterial( { size: (SPRITE_SIZE ), map: sprite1, blending: THREE.AdditiveBlending, depthTest: false, transparent : true } );
  100. materials.color.setHSV(hueValues[s], DEF_SATURATION, DEF_BRIGHTNESS);
  101. var particles = new THREE.ParticleSystem( geometry, materials );
  102. particles.myMaterial = materials;
  103. particles.myLevel = k;
  104. particles.mySubset = s;
  105. particles.position.x = 0;
  106. particles.position.y = 0;
  107. particles.position.z = - LEVEL_DEPTH * k - (s * LEVEL_DEPTH / NUM_SUBSETS) + SCALE_FACTOR/2;
  108. particles.needsUpdate = 0;
  109. scene.add( particles );
  110. }
  111. }
  112.  
  113. // Setup renderer and effects
  114. renderer = new THREE.WebGLRenderer( { clearColor: 0x000000, clearAlpha: 1, antialias: false } );
  115. renderer.setSize( window.innerWidth, window.innerHeight );
  116.  
  117. container.appendChild( renderer.domElement );
  118.  
  119. stats = new Stats();
  120. stats.domElement.style.position = 'absolute';
  121. stats.domElement.style.top = '5px';
  122. stats.domElement.style.right = '5px';
  123. container.appendChild( stats.domElement );
  124.  
  125. // Setup listeners
  126. document.addEventListener( 'mousemove', onDocumentMouseMove, false );
  127. document.addEventListener( 'touchstart', onDocumentTouchStart, false );
  128. document.addEventListener( 'touchmove', onDocumentTouchMove, false );
  129. document.addEventListener( 'keydown', onKeyDown, false );
  130. window.addEventListener( 'resize', onWindowResize, false );
  131.  
  132. // Schedule orbit regeneration
  133. setInterval(updateOrbit, 7000);
  134. }
  135.  
  136. function animate() {
  137. requestAnimationFrame( animate );
  138. render();
  139. stats.update();
  140. }
  141.  
  142. function render() {
  143.  
  144. if (camera.position.x >= - CAMERA_BOUND && camera.position.x <= CAMERA_BOUND){
  145. camera.position.x += ( mouseX - camera.position.x ) * 0.05;
  146. if (camera.position.x < - CAMERA_BOUND) camera.position.x = -CAMERA_BOUND;
  147. if (camera.position.x > CAMERA_BOUND) camera.position.x = CAMERA_BOUND;
  148. }
  149. if (camera.position.y >= - CAMERA_BOUND && camera.position.y <= CAMERA_BOUND){
  150. camera.position.y += ( - mouseY - camera.position.y ) * 0.05;
  151. if (camera.position.y < - CAMERA_BOUND) camera.position.y = -CAMERA_BOUND;
  152. if (camera.position.y > CAMERA_BOUND) camera.position.y = CAMERA_BOUND;
  153. }
  154.  
  155. camera.lookAt( scene.position );
  156.  
  157. for( i = 0; i < scene.objects.length; i++ ) {
  158. scene.objects[i].position.z += speed;
  159. scene.objects[i].rotation.z += rotationSpeed;
  160. if (scene.objects[i].position.z > camera.position.z){
  161. scene.objects[i].position.z = - (NUM_LEVELS -1) * LEVEL_DEPTH;
  162. if (scene.objects[i].needsUpdate == 1){
  163. scene.objects[i].geometry.__dirtyVertices = true;
  164. scene.objects[i].myMaterial.color.setHSV( hueValues[scene.objects[i].mySubset], DEF_SATURATION, DEF_BRIGHTNESS);
  165. scene.objects[i].needsUpdate = 0;
  166. }
  167. }
  168. }
  169.  
  170. renderer.render( scene, camera );
  171. }
  172.  
  173. ///////////////////////////////////////////////
  174. // Hopalong Orbit Generator
  175. ///////////////////////////////////////////////
  176. function updateOrbit(){
  177. generateOrbit();
  178. for (var s = 0; s < NUM_SUBSETS; s++){
  179. hueValues[s] = Math.random();
  180. }
  181. for( i = 0; i < scene.objects.length; i++ ) {
  182. scene.objects[i].needsUpdate = 1;
  183. }
  184.  
  185. }
  186.  
  187. function generateOrbit(){
  188. var x, y, z, x1;
  189. var idx = 0;
  190.  
  191. prepareOrbit();
  192.  
  193. // Using local vars should be faster
  194. var al = a;
  195. var bl = b;
  196. var cl = c;
  197. var dl = d;
  198. var el = e;
  199. var subsets = orbit.subsets;
  200. var num_points_subset_l = NUM_POINTS_SUBSET;
  201. var num_points_l = NUM_POINTS;
  202. var scale_factor_l = SCALE_FACTOR;
  203.  
  204. var xMin = 0, xMax = 0, yMin = 0, yMax = 0;
  205.  
  206. for (var s = 0; s < NUM_SUBSETS; s++){
  207.  
  208. // Use a different starting point for each orbit subset
  209. x = s * .005 * (0.5-Math.random());
  210. y = s * .005 * (0.5-Math.random());
  211.  
  212. var curSubset = subsets[s];
  213.  
  214. for (var i = 0; i < num_points_subset_l; i++){
  215.  
  216. // Iteration formula (generalization of the Barry Martin's original one)
  217. z = (dl + Math.sqrt(Math.abs(bl * x - cl)));
  218. if (x > 0) {x1 = y - z;}
  219. else if (x == 0) {x1 = y;}
  220. else {x1 = y + z;}
  221. y = al - x;
  222. x = x1 + el;
  223.  
  224. curSubset[i].x = x;
  225. curSubset[i].y = y;
  226.  
  227. if (x < xMin) {xMin = x;}
  228. else if (x > xMax) {xMax = x;}
  229. if (y < yMin) {yMin = y;}
  230. else if (y > yMax) {yMax = y;}
  231.  
  232. idx++;
  233. }
  234. }
  235.  
  236. var scaleX = 2 * scale_factor_l / (xMax - xMin);
  237. var scaleY = 2 * scale_factor_l / (yMax - yMin);
  238.  
  239. orbit.xMin = xMin;
  240. orbit.xMax = xMax;
  241. orbit.yMin = yMin;
  242. orbit.yMax = yMax;
  243. orbit.scaleX = scaleX;
  244. orbit.scaleY = scaleY;
  245.  
  246. // Normalize and update vertex data
  247. for (var s = 0; s < NUM_SUBSETS; s++){
  248. var curSubset = subsets[s];
  249. for (var i = 0; i < num_points_subset_l; i++){
  250. curSubset[i].vertex.position.x = scaleX * (curSubset[i].x - xMin) - scale_factor_l;
  251. curSubset[i].vertex.position.y = scaleY * (curSubset[i].y - yMin) - scale_factor_l;
  252. }
  253. }
  254. }
  255.  
  256. function prepareOrbit(){
  257. shuffleParams();
  258. orbit.xMin = 0;
  259. orbit.xMax = 0;
  260. orbit.yMin = 0;
  261. orbit.yMax = 0;
  262. }
  263.  
  264. function shuffleParams() {
  265. a = A_MIN + Math.random() * (A_MAX - A_MIN);
  266. b = B_MIN + Math.random() * (B_MAX - B_MIN);
  267. c = C_MIN + Math.random() * (C_MAX - C_MIN);
  268. d = D_MIN + Math.random() * (D_MAX - D_MIN);
  269. e = E_MIN + Math.random() * (E_MAX - E_MIN);
  270. }
  271.  
  272. ///////////////////////////////////////////////
  273. // Event listeners
  274. ///////////////////////////////////////////////
  275. function onDocumentMouseMove( event ) {
  276. mouseX = event.clientX - windowHalfX;
  277. mouseY = event.clientY - windowHalfY;
  278. }
  279.  
  280. function onDocumentTouchStart( event ) {
  281. if ( event.touches.length == 1 ) {
  282. event.preventDefault();
  283. mouseX = event.touches[ 0 ].pageX - windowHalfX;
  284. mouseY = event.touches[ 0 ].pageY - windowHalfY;
  285. }
  286. }
  287.  
  288. function onDocumentTouchMove( event ) {
  289. if ( event.touches.length == 1 ) {
  290. event.preventDefault();
  291. mouseX = event.touches[ 0 ].pageX - windowHalfX;
  292. mouseY = event.touches[ 0 ].pageY - windowHalfY;
  293. }
  294. }
  295.  
  296. function onWindowResize( event ) {
  297. windowHalfX = window.innerWidth / 2;
  298. windowHalfY = window.innerHeight / 2;
  299. camera.aspect = window.innerWidth / window.innerHeight;
  300. camera.updateProjectionMatrix();
  301. renderer.setSize( window.innerWidth, window.innerHeight );
  302. }
  303.  
  304. function onKeyDown(event){
  305. if(event.keyCode == 38 && speed < 20) speed += .5;
  306. else if(event.keyCode == 40 && speed > 0) speed -= .5;
  307. else if(event.keyCode == 37) rotationSpeed += .001;
  308. else if(event.keyCode == 39) rotationSpeed -= .001;
  309. else if(event.keyCode == 72 || event.keyCode == 104) toggleVisuals();
  310. }
  311.  
  312. function showHideAbout() {
  313. if (document.getElementById('about').style.display == "block") {
  314. document.getElementById('about').style.display = "none";
  315. } else {
  316. document.getElementById('about').style.display = "block";
  317. }
  318. }
  319.  
  320. function toggleVisuals(){
  321. if(VISUALS_VISIBLE){
  322. document.getElementById('plusone').style.display = 'none';
  323. document.getElementById('tweet').style.display = 'none';
  324. document.getElementById('fb').style.display = 'none';
  325. document.getElementById('aboutlink').style.display = 'none';
  326. document.getElementById('about').style.display = 'none';
  327. document.getElementById('info').style.display = 'none';
  328. document.getElementById('chaosnebula').style.display = 'none';
  329. stats.domElement.style.display = 'none';
  330. renderer.domElement.style.cursor = "none";
  331. VISUALS_VISIBLE = false;
  332. }
  333. else {
  334. document.getElementById('plusone').style.display = 'block';
  335. document.getElementById('tweet').style.display = 'block';
  336. document.getElementById('fb').style.display = 'block';
  337. document.getElementById('aboutlink').style.display = 'block';
  338. document.getElementById('info').style.display = 'block';
  339. document.getElementById('chaosnebula').style.display = 'block';
  340. stats.domElement.style.display = 'block';
  341. renderer.domElement.style.cursor = "";
  342. VISUALS_VISIBLE = true;
  343. }
  344. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement