├── .gitignore ├── LICENSE ├── README.md ├── assets ├── css │ ├── game.css │ └── mobile.css ├── fonts │ ├── plm65__c-webfont.eot │ ├── plm65__c-webfont.ttf │ ├── plm65__c-webfont.woff │ ├── plm75__c-webfont.eot │ ├── plm75__c-webfont.ttf │ └── plm75__c-webfont.woff ├── img │ ├── 0.png │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ ├── DT.png │ ├── avers.png │ ├── background5.jpg │ ├── chromeexperiments.png │ ├── doge.png │ ├── fav.gif │ ├── fav.png │ ├── fav2.gif │ ├── fbb.png │ ├── fbw.png │ ├── filters.svg │ ├── gpb.png │ ├── gpw.png │ ├── head.png │ ├── head0.png │ ├── hotdot.png │ ├── left.png │ ├── logo.svg │ ├── mobilereset.jpg │ ├── nogame.jpg │ ├── poster.jpg │ ├── right.png │ ├── sphere.png │ ├── twb.png │ ├── tww.png │ ├── vcheck.png │ ├── vkb.png │ └── vkw.png ├── index.html ├── js │ ├── DT.min.js │ ├── DT.min.map │ ├── mobile.min.js │ ├── mobile.min.map │ ├── myYepnope.min.js │ ├── myYepnope.min.map │ └── vendor │ │ ├── jquery.min.js │ │ ├── jquery.min.map │ │ ├── three.min.js │ │ └── yepnope.1.5.4-min.js ├── m │ └── index.html ├── objects │ ├── bonusE1.obj │ ├── bonusE2.obj │ ├── bonusH1.obj │ ├── bonusH2.obj │ ├── bonusI.obj │ └── shield.obj └── sounds │ ├── catchBonus0.mp3 │ ├── catchBonus0.ogg │ ├── catchBonus1.mp3 │ ├── catchBonus1.ogg │ ├── catchBonus2.mp3 │ ├── catchBonus2.ogg │ ├── coin.mp3 │ ├── coin.ogg │ ├── fun.mp3 │ ├── fun.ogg │ ├── gameover.mp3 │ ├── gameover.ogg │ ├── intro.mp3 │ ├── intro.ogg │ ├── invulner.mp3 │ ├── invulner.ogg │ ├── loop.mp3 │ ├── main.mp3 │ ├── main.ogg │ ├── muv8.mp3 │ ├── muv8.ogg │ ├── pause.mp3 │ ├── pause.ogg │ ├── stoneDestroy.mp3 │ ├── stoneDestroy.ogg │ ├── stoneMiss.mp3 │ └── stoneMiss.ogg ├── assets_source ├── Gruntfile.js ├── js │ ├── DT.js │ ├── DT.js.map │ ├── init.js │ ├── mobile.js │ ├── myYepnope.js │ └── vendor │ │ ├── BadTVShader.js │ │ ├── BufferLoader.js │ │ ├── CopyShader.js │ │ ├── CurveExtras.js │ │ ├── Detector.js │ │ ├── EffectComposer.js │ │ ├── MaskPass.js │ │ ├── OBJLoader.js │ │ ├── RenderPass.js │ │ ├── ShaderPass.js │ │ ├── Stats.js │ │ ├── THREEx.FullScreen.js │ │ ├── favico-0.3.4.min.js │ │ ├── fireworks-bundle.js │ │ ├── headtrackr.min.js │ │ ├── jquery.min.js │ │ ├── jquery.qrcode.min.js │ │ ├── three.min.js │ │ ├── threex.rendererstats.js │ │ ├── threex.windowresize.js │ │ └── yepnope.1.5.4-min.js ├── package.json └── scss │ ├── game.scss │ └── mobile.scss ├── package.json └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | ideas 2 | node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 deemidroll 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Digital Trip 2 | ============ 3 | 4 | Play static version 5 | 6 | Server-side features (mobile controls, dogecoins) are not available in static version. Full version is on master branch. 7 | 8 | Description 9 | ----------- 10 | 11 | A story about the latest technologies through a short browser game. It's a fully 3d, based on WebGL, with camera controls, bonuses & cryptocoins. Fancy soundtrack enhances the experience. So the purpose of this non-profit open source project is industry promotion. Enjoy! 12 | 13 | Tecnology 14 | --------- 15 | - WebGL (a JavaScript API for rendering interactive 3D and 2D graphics without the use of plug-ins) 16 | - THREE.js (JavaScript Library which makes WebGL simpler) 17 | 18 | - Web Audio API (JavaScript API which gives full control over sound) 19 | 20 | - WebSocket (a protocol providing full-duplex communications channels over a single TCP connection) 21 | - socket.io (a JavaScript library for realtime web applications) 22 | 23 | - getUserMedia (a JavaScript API, which permits web applications access the user’s webcam and microphone) 24 | - headtrackr.js (a JavaScript library for real-time face tracking and head tracking, tracking the position of a users head in relation to the computer screen, via a web camera and the webRTC/getUserMedia standard) 25 | 26 | - deviceOrientation (an event that fired when fresh data is available from an orientation sensor about the current orientation of the device as compared to the Earth coordinate frame) 27 | 28 | - Dogecoin (an open source peer-to-peer digital currency, favored by Shiba Inus worldwide.) 29 | 30 | 31 | Made in Hot Dot, presentation and credits. 32 | Licensed under MIT. 33 | -------------------------------------------------------------------------------- /assets/css/game.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'plumbcbold'; 3 | src: url('../fonts/plm75__c-webfont.eot'); 4 | src: url('../fonts/plm75__c-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/plm75__c-webfont.woff') format('woff'), url('../fonts/plm75__c-webfont.ttf') format('truetype'); 5 | font-weight: normal; 6 | font-style: normal; } 7 | 8 | @font-face { 9 | font-family: 'plumbmediumcmediumc'; 10 | src: url('../fonts/plm65__c-webfont.eot'); 11 | src: url('../fonts/plm65__c-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/plm65__c-webfont.woff') format('woff'), url('../fonts/plm65__c-webfont.ttf') format('truetype'); 12 | font-weight: normal; 13 | font-style: normal; } 14 | 15 | body { 16 | font-family: "plumbmediumcmediumc", "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 17 | font-weight: 300; 18 | text-transform: uppercase; 19 | margin: 0px; 20 | background-color: #000000; 21 | overflow: hidden; 22 | color: #eee; 23 | text-align: center; 24 | -webkit-font-smoothing: antialiased; 25 | -moz-osx-font-smoothing: grayscale; } 26 | 27 | .score, .bonus { 28 | position: absolute; } 29 | 30 | .hit, .game_over, .pause, .share, .loader, .choose_control, #nogame, .mobile_choosen, .webcam_choosen { 31 | width: 100%; 32 | height: 100%; 33 | display: none; 34 | position: absolute; 35 | left: 0; 36 | top: 0; 37 | text-align: center; } 38 | 39 | .mobile_choosen, .webcam_choosen { 40 | /*display: table;*/ 41 | background-color: #000; 42 | z-index: 4; } 43 | 44 | .webcamcontrol { 45 | width: 100%; 46 | height: 100%; 47 | position: absolute; 48 | left: 0; 49 | top: 0; 50 | text-align: center; } 51 | 52 | #compare, #overlay { 53 | z-index: 4; 54 | display: none; 55 | position: absolute; 56 | left: 50%; 57 | top: 10px; 58 | margin-left: -61px; 59 | border: 2px solid white; } 60 | 61 | #overlay { 62 | z-index: 5; } 63 | 64 | .hit { 65 | /*display: table;*/ 66 | background-color: #BE463C; } 67 | 68 | .game_over { 69 | /*display: table;*/ 70 | z-index: 3; } 71 | 72 | .choose_control { 73 | display: none; 74 | background-color: #000; 75 | z-index: 1; } 76 | 77 | .change_controls { 78 | width: 250px; 79 | height: 36px; 80 | background-color: #fd5439; 81 | position: relative; 82 | left: 50%; 83 | margin-left: -125px; 84 | padding-top: 15px; 85 | font-size: 18px; 86 | letter-spacing: 0.1em; 87 | cursor: pointer; 88 | z-index: 10; 89 | -webkit-transition: background-color 0.4s ease-out 0; 90 | -moz-transition: background-color 0.4s ease-out 0; 91 | -o-transition: background-color 0.4s ease-out 0; 92 | transition: background-color 0.4s ease-out 0; } 93 | .change_controls:hover { 94 | color: #000; 95 | background-color: #fff; 96 | -webkit-transition: background-color 0.4s ease-out 0; 97 | -moz-transition: background-color 0.4s ease-out 0; 98 | -o-transition: background-color 0.4s ease-out 0; 99 | transition: background-color 0.4s ease-out 0; } 100 | 101 | .social { 102 | width: 280px; 103 | height: 52px; 104 | position: relative; 105 | left: 50%; 106 | margin-left: -140px; } 107 | .social > a:first-child div { 108 | background: #4e68b2 url(../img/fbw.png) 50% 50% no-repeat; } 109 | .social > a:first-child div:hover { 110 | background-image: url(../img/fbb.png); } 111 | .social > a:nth-child(2) div { 112 | background: #4195de url(../img/tww.png) 50% 50% no-repeat; } 113 | .social > a:nth-child(2) div:hover { 114 | background-image: url(../img/twb.png); } 115 | .social > a:nth-child(3) div { 116 | background: #38658f url(../img/vkw.png) 50% 50% no-repeat; } 117 | .social > a:nth-child(3) div:hover { 118 | background-image: url(../img/vkb.png); } 119 | .social > a:last-child div { 120 | margin: 0; 121 | background: #ce2f1c url(../img/gpw.png) 50% 50% no-repeat; } 122 | .social > a:last-child div:hover { 123 | background-image: url(../img/gpb.png); } 124 | .social > a div { 125 | width: 52px; 126 | height: 100%; 127 | float: left; 128 | margin-right: 24px; 129 | cursor: pointer; 130 | -webkit-transition: background-color 0.4s ease-out 0; 131 | -moz-transition: background-color 0.4s ease-out 0; 132 | -o-transition: background-color 0.4s ease-out 0; 133 | transition: background-color 0.4s ease-out 0; } 134 | .social > a div:hover { 135 | color: #000; 136 | background-color: #fff; 137 | -webkit-transition: background-color 0.4s ease-out 0; 138 | -moz-transition: background-color 0.4s ease-out 0; 139 | -o-transition: background-color 0.4s ease-out 0; 140 | transition: background-color 0.4s ease-out 0; } 141 | 142 | .pause_control { 143 | width: 280px; 144 | height: 37px; 145 | margin-left: -140px; 146 | background-color: #222; 147 | color: #fff; 148 | -webkit-transition: background-color 0.4s ease-out 0; 149 | -moz-transition: background-color 0.4s ease-out 0; 150 | -o-transition: background-color 0.4s ease-out 0; 151 | transition: background-color 0.4s ease-out 0; } 152 | .pause_control:hover { 153 | color: #000; 154 | background-color: #fff; 155 | -webkit-transition: background-color 0.4s ease-out 0; 156 | -moz-transition: background-color 0.4s ease-out 0; 157 | -o-transition: background-color 0.4s ease-out 0; 158 | transition: background-color 0.4s ease-out 0; } 159 | 160 | .gameover_control { 161 | background-color: #272727; 162 | display: inline-block; 163 | position: static; 164 | margin-right: 4px; 165 | margin-top: 50px; 166 | margin-left: 0; 167 | -webkit-transition: background-color 0.4s ease-out 0; 168 | -moz-transition: background-color 0.4s ease-out 0; 169 | -o-transition: background-color 0.4s ease-out 0; 170 | transition: background-color 0.4s ease-out 0; } 171 | .gameover_control:hover { 172 | color: #000; 173 | background-color: #fff; 174 | -webkit-transition: background-color 0.4s ease-out 0; 175 | -moz-transition: background-color 0.4s ease-out 0; 176 | -o-transition: background-color 0.4s ease-out 0; 177 | transition: background-color 0.4s ease-out 0; } 178 | 179 | .resume { 180 | width: 280px; 181 | height: 37px; 182 | background-color: #fd5439; 183 | color: #000000; 184 | position: relative; 185 | left: 50%; 186 | margin-left: -140px; 187 | padding-top: 15px; 188 | font-size: 18px; 189 | letter-spacing: 0.1em; 190 | cursor: pointer; 191 | z-index: 10; 192 | margin-bottom: 7px; 193 | margin-top: 38px; 194 | -webkit-transition: background-color 0.4s ease-out 0; 195 | -moz-transition: background-color 0.4s ease-out 0; 196 | -o-transition: background-color 0.4s ease-out 0; 197 | transition: background-color 0.4s ease-out 0; } 198 | .resume:hover { 199 | color: #000; 200 | background-color: #fff; 201 | -webkit-transition: background-color 0.4s ease-out 0; 202 | -moz-transition: background-color 0.4s ease-out 0; 203 | -o-transition: background-color 0.4s ease-out 0; 204 | transition: background-color 0.4s ease-out 0; } 205 | 206 | .back { 207 | position: absolute; 208 | left: 0; 209 | top: 0; 210 | width: 100%; 211 | height: 100%; 212 | z-index: -1; } 213 | 214 | .restart { 215 | width: 188px; 216 | height: 36px; 217 | background-color: #272727; 218 | padding-top: 15px; 219 | font-size: 18px; 220 | letter-spacing: 0.1em; 221 | cursor: pointer; 222 | z-index: 10; 223 | display: inline-block; 224 | -webkit-transition: background-color 0.4s ease-out 0; 225 | -moz-transition: background-color 0.4s ease-out 0; 226 | -o-transition: background-color 0.4s ease-out 0; 227 | transition: background-color 0.4s ease-out 0; } 228 | .restart:hover { 229 | color: #000; 230 | background-color: #fff; 231 | -webkit-transition: background-color 0.4s ease-out 0; 232 | -moz-transition: background-color 0.4s ease-out 0; 233 | -o-transition: background-color 0.4s ease-out 0; 234 | transition: background-color 0.4s ease-out 0; } 235 | 236 | .bigfont { 237 | font-size: 3em; } 238 | 239 | .block { 240 | display: block; } 241 | 242 | .gameTimer { 243 | position: absolute; 244 | opacity: 0.5; 245 | left: 170px; 246 | top: 5px; 247 | font-size: 32px; 248 | z-index: 4; } 249 | 250 | #loader { 251 | z-index: 5; } 252 | 253 | #nogame { 254 | display: none; 255 | z-index: 4; 256 | background-color: #fafafa; 257 | background: #fafafa url(../img/nogame.jpg) 0 0 no-repeat; 258 | background-size: cover; 259 | overflow: hidden; } 260 | #nogame > .cont > img { 261 | position: absolute; 262 | top: 50%; 263 | left: 50%; 264 | margin-left: -765px; 265 | margin-top: -498px; 266 | z-index: -1; } 267 | #nogame > .cont > .nogame1 { 268 | color: #fafafa; 269 | font-size: 60px; 270 | letter-spacing: 0.08em; } 271 | #nogame > .cont > .nogame2 { 272 | padding-top: 200px; 273 | color: #fafafa; 274 | font-size: 18px; 275 | letter-spacing: 0.1em; } 276 | #nogame > .cont > .nogame2 > a { 277 | color: #fd5439; 278 | text-decoration: none; } 279 | #nogame > .cont > .nogame2 > a:hover { 280 | text-decoration: underline; } 281 | 282 | 283 | .loader span { 284 | color: #fff; 285 | font-size: 5em; 286 | z-index: 3; } 287 | 288 | #interface { 289 | display: none; } 290 | 291 | #footer { 292 | display: none; 293 | position: absolute; 294 | bottom: 0; 295 | left: 0; 296 | background-color: rgba(0, 0, 0, 0.5); 297 | width: 100%; 298 | height: 84px; 299 | z-index: 5; } 300 | #footer > span { 301 | font-size: 12px; 302 | font-family: 'plumbcbold'; 303 | padding-top: 35px; 304 | padding-left: 35px; 305 | padding-right: 9px; } 306 | 307 | .loadImg { 308 | position: absolute; 309 | top: 50%; 310 | left: 50%; 311 | margin-left: -530px; 312 | margin-top: -350px; } 313 | 314 | .gameover_bg { 315 | position: absolute; 316 | top: 50%; 317 | left: 50%; 318 | margin-left: -765px; 319 | margin-top: -498px; 320 | z-index: -1; } 321 | 322 | .coins { 323 | margin-bottom: 100px; } 324 | 325 | .gameover_message { 326 | color: #fff; 327 | font-size: 40px; 328 | letter-spacing: 0.1em; 329 | line-height: 53px; 330 | margin-bottom: 20px; } 331 | 332 | #gameovermessage { 333 | color: #fff; 334 | font-size: 20px; 335 | letter-spacing: 0.1em; 336 | line-height: 53px; 337 | margin-top: 20px; 338 | position: absolute; 339 | text-align: center; 340 | width: 100%; } 341 | 342 | .left { 343 | float: left; 344 | letter-spacing: 0.29em; } 345 | 346 | .right { 347 | float: right; 348 | letter-spacing: 0.01em; } 349 | .right > a, .right span { 350 | margin-right: 16px; } 351 | 352 | .hotdot { 353 | display: inline-block; 354 | vertical-align: middle; } 355 | 356 | .pause, .share { 357 | /*display: table;*/ 358 | background-color: rgba(0, 0, 0, 0.5); 359 | z-index: 4; } 360 | 361 | .menu { 362 | display: inline-block; 363 | width: 300px; 364 | height: 400px; 365 | border: 1px #ffffff solid; 366 | background-color: #363636; } 367 | 368 | .menu hr { 369 | /*color: #595959;*/ 370 | /*background: #595959;*/ 371 | width: 75%; 372 | /*height: 1px;*/ } 373 | 374 | .menu span { 375 | margin-bottom: 15px; 376 | margin-top: 15px; 377 | font-size: 1.25em; } 378 | 379 | .cont { 380 | display: table-cell; 381 | vertical-align: middle; } 382 | 383 | .error { 384 | font-size: 5em; } 385 | 386 | .helthbar, .score, .bonus { 387 | bottom: 30px; } 388 | 389 | .helthbar { 390 | border: 1px #eee solid; 391 | background-color: #000; 392 | width: 30%; 393 | height: 20px; 394 | left: 35%; 395 | padding: 1px; } 396 | 397 | .helth { 398 | width: 100%; 399 | height: 100%; 400 | background-color: #BE463C; } 401 | 402 | .music_button, .menu_button, .fs_button { 403 | width: 40px; 404 | height: 40px; 405 | border: 1px #ffffff solid; 406 | font-size: 32px; 407 | text-align: center; 408 | cursor: pointer; } 409 | 410 | .fs_button { 411 | z-index: 2; 412 | right: 120px; 413 | top: 30px; } 414 | 415 | .music_button { 416 | z-index: 2; 417 | right: 75px; 418 | top: 30px; } 419 | 420 | .menu_button { 421 | z-index: 0; 422 | right: 30px; 423 | top: 30px; } 424 | 425 | .bonus { 426 | height: 30px; 427 | right: 30px; 428 | font-size: 2em; } 429 | 430 | .score { 431 | width: 207px; 432 | height: 30px; 433 | left: 0; 434 | font-size: 40px; 435 | bottom: 125px; 436 | text-align: right; 437 | color: #fff; } 438 | .score > span { 439 | vertical-align: middle; } 440 | .score > img { 441 | display: inline-block; 442 | vertical-align: middle; 443 | margin-left: 5px; } 444 | 445 | .color { 446 | width: 100px; 447 | height: 100px; 448 | background-color: #fff; 449 | position: absolute; 450 | top: 50%; 451 | right: 0; } 452 | 453 | a { 454 | color: #fd5439; } 455 | 456 | a:hover { 457 | color: #fff; } 458 | 459 | .button:hover { 460 | cursor: pointer; } 461 | 462 | #loader { 463 | display: none; } 464 | 465 | #webgl-error-message { 466 | z-index: 5; } 467 | 468 | #qrcode canvas { 469 | border: 5px solid white; } 470 | 471 | #qrcode { 472 | margin-top: 10px; 473 | margin-bottom: 20px; } 474 | 475 | .logo { 476 | margin-top: 50px; 477 | margin-bottom: 10px; 478 | height: 130px; 479 | overflow: hidden; 480 | z-index: 2; 481 | width: 100%; } 482 | .logo > img { 483 | height: 110px; } 484 | 485 | .byhotdot { 486 | margin-top: -17px; 487 | font-size: 12px; 488 | letter-spacing: 0.15em; } 489 | 490 | .message { 491 | color: #fd5439; 492 | font-size: 30px; 493 | letter-spacing: 0.15em; 494 | margin-top: 153px; } 495 | 496 | .mobile_message { 497 | font-size: 30px; 498 | line-height: 1.5em; 499 | letter-spacing: 0.1em; } 500 | 501 | .webcam_message { 502 | font-size: 40px; 503 | line-height: 1.2em; 504 | letter-spacing: 0.1em; } 505 | 506 | .turn_to_start { 507 | position: relative; 508 | width: 100%; 509 | height: 260px; 510 | font-size: 40px; } 511 | .turn_to_start > span { 512 | position: absolute; 513 | bottom: 50px; 514 | left: 0; 515 | width: 100%; } 516 | 517 | #head { 518 | position: absolute; 519 | top: 50px; 520 | left: 50%; 521 | margin-left: -72px; 522 | display: none; } 523 | 524 | #left_v_check { 525 | position: absolute; 526 | bottom: 50px; 527 | left: 100px; 528 | display: none; } 529 | 530 | #right_v_check { 531 | position: absolute; 532 | bottom: 50px; 533 | right: 100px; 534 | display: none; } 535 | 536 | .mobile_message span { 537 | text-transform: lowercase; } 538 | 539 | .controls { 540 | font-size: 16px; 541 | letter-spacing: 0.2em; 542 | margin-top: -10px; } 543 | .controls div:hover .rect { 544 | background-color: #fff; 545 | -webkit-transition: background-color 0.4s ease-out 0; 546 | -moz-transition: background-color 0.4s ease-out 0; 547 | -o-transition: background-color 0.4s ease-out 0; 548 | transition: background-color 0.4s ease-out 0; } 549 | .controls div:hover .rect .quad { 550 | background-color: #000; 551 | -webkit-transition: background-color 0.4s ease-out 0; 552 | -moz-transition: background-color 0.4s ease-out 0; 553 | -o-transition: background-color 0.4s ease-out 0; 554 | transition: background-color 0.4s ease-out 0; } 555 | .controls .rect { 556 | position: relative; 557 | background-color: #fd5439; 558 | -webkit-transition: background-color 0.4s ease-out 0; 559 | -moz-transition: background-color 0.4s ease-out 0; 560 | -o-transition: background-color 0.4s ease-out 0; 561 | transition: background-color 0.4s ease-out 0; } 562 | .controls .rect > .quad { 563 | background-color: #fff; 564 | -webkit-transition: background-color 0.4s ease-out 0; 565 | -moz-transition: background-color 0.4s ease-out 0; 566 | -o-transition: background-color 0.4s ease-out 0; 567 | transition: background-color 0.4s ease-out 0; 568 | position: absolute; 569 | width: 7px; 570 | height: 7px; } 571 | .controls > .choose_wasd .rect { 572 | width: 112px; 573 | height: 46px; 574 | margin: 52px auto; } 575 | .controls > .choose_wasd .rect .quad1 { 576 | bottom: 17px; 577 | right: 38px; } 578 | .controls > .choose_wasd .rect .quad2 { 579 | bottom: 8px; 580 | right: 47px; } 581 | .controls > .choose_wasd .rect .quad3 { 582 | bottom: 8px; 583 | right: 38px; } 584 | .controls > .choose_wasd .rect .quad4 { 585 | bottom: 8px; 586 | right: 29px; } 587 | .controls > .choose_mobile .rect { 588 | margin: 34px auto; 589 | width: 51px; 590 | height: 82px; } 591 | .controls > .choose_mobile .rect .quad { 592 | bottom: 7px; 593 | right: 21px; 594 | width: 8px; 595 | height: 8px; } 596 | .controls > .choose_webcam .rect { 597 | margin: 43px auto; 598 | width: 89px; 599 | height: 63px; } 600 | .controls > .choose_webcam .rect .quad { 601 | top: 8px; 602 | right: 40px; 603 | width: 8px; 604 | height: 8px; } 605 | .controls > div { 606 | display: inline-block; 607 | position: relative; 608 | width: 125px; 609 | height: 150px; } 610 | .controls > div > span { 611 | position: absolute; 612 | bottom: 0; 613 | left: 0; 614 | width: 100%; } 615 | 616 | .red { 617 | color: #fd5439; } 618 | 619 | .logoLoadControlContainer { 620 | position: absolute; 621 | left: 0; 622 | top: 0; 623 | width: 100%; 624 | height: 100%; 625 | z-index: 1; } 626 | 627 | .buttons { 628 | display: none; } 629 | 630 | #dogecoin { 631 | border: 2px solid #fff; 632 | color: #fff; 633 | width: 226px; 634 | margin-right: 5px; 635 | height: 47px; 636 | background-color: transparent; 637 | font-size: 19px; 638 | font-family: 'plumbmediumcmediumc'; 639 | -webkit-font-smoothing: antialiased; 640 | -moz-osx-font-smoothing: grayscale; 641 | padding-left: 18px; 642 | letter-spacing: 0.05em; } 643 | 644 | #wow { 645 | background-color: #fd5439; 646 | border: none; 647 | color: #fff; 648 | height: 52px; 649 | font-size: 24px; 650 | width: 94px; 651 | font-family: 'plumbmediumcmediumc'; 652 | -webkit-font-smoothing: antialiased; 653 | -moz-osx-font-smoothing: grayscale; 654 | cursor: pointer; 655 | -webkit-transition: background-color 0.4s ease-out 0; 656 | -moz-transition: background-color 0.4s ease-out 0; 657 | -o-transition: background-color 0.4s ease-out 0; 658 | transition: background-color 0.4s ease-out 0; } 659 | #wow:hover { 660 | color: #000; 661 | background-color: #fff; 662 | -webkit-transition: background-color 0.4s ease-out 0; 663 | -moz-transition: background-color 0.4s ease-out 0; 664 | -o-transition: background-color 0.4s ease-out 0; 665 | transition: background-color 0.4s ease-out 0; } 666 | 667 | .show-table { 668 | display: table; } 669 | 670 | a.chromeexperiments { 671 | display: block; 672 | position: absolute; 673 | bottom: 75px; 674 | left: 35px; 675 | margin: 0; 676 | padding: 0; } 677 | a.chromeexperiments img { 678 | margin: 0; 679 | padding: 0; } 680 | -------------------------------------------------------------------------------- /assets/css/mobile.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'plumbmediumcmediumc'; 3 | src: url('../fonts/plm65__c-webfont.eot'); 4 | src: url('../fonts/plm65__c-webfont.eot?#iefix') format('embedded-opentype'), url('../fonts/plm65__c-webfont.woff') format('woff'), url('../fonts/plm65__c-webfont.ttf') format('truetype'); 5 | font-weight: normal; 6 | font-style: normal; } 7 | 8 | body, html { 9 | padding: 0; 10 | margin: 0; 11 | color: #eee; 12 | width: 100%; 13 | height: 100%; 14 | font-family: 'plumbmediumcmediumc', "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 15 | font-weight: 300; 16 | margin: 0px; 17 | background-color: #000000; 18 | overflow: hidden; 19 | text-align: center; 20 | text-transform: uppercase; } 21 | 22 | #controller { 23 | width: 100%; 24 | height: 100%; 25 | background-color: #000; 26 | display: table; } 27 | 28 | #turnLeft { 29 | position: absolute; 30 | bottom: 0; 31 | left: 0; 32 | width: 33%; 33 | height: 100%; 34 | background-color: #000; 35 | z-index: 1; } 36 | #turnLeft > img { 37 | position: absolute; 38 | left: 10%; 39 | top: 50%; 40 | margin-top: -50px; 41 | height: 100px; } 42 | 43 | #turnRight { 44 | position: absolute; 45 | bottom: 0; 46 | right: 0; 47 | width: 33%; 48 | height: 100%; 49 | background-color: #000; 50 | z-index: 1; } 51 | #turnRight > img { 52 | position: absolute; 53 | right: 10%; 54 | top: 50%; 55 | margin-top: -50px; 56 | height: 100px; } 57 | 58 | #sphere { 59 | position: absolute; 60 | bottom: 0; 61 | right: 33%; 62 | width: 33%; 63 | height: 100%; 64 | background-color: #000; 65 | z-index: 2; } 66 | #sphere > img { 67 | position: absolute; 68 | left: 50%; 69 | top: 50%; 70 | margin-left: -70px; 71 | margin-top: -70px; 72 | height: 140px; } 73 | 74 | #socket, #wheel, #preparetostart, #gameover { 75 | width: 100%; 76 | height: 100%; 77 | display: table-cell; 78 | vertical-align: middle; 79 | text-align: center; 80 | overflow: hidden; 81 | display: none; } 82 | 83 | #socket { 84 | z-index: 2; 85 | display: table-cell; } 86 | 87 | #status, #status_fail { 88 | width: 100%; 89 | text-align: center; 90 | position: absolute; 91 | z-index: 3; } 92 | 93 | #status_fail { 94 | top: 10%; 95 | color: red; } 96 | 97 | #preparetostart { 98 | display: none; } 99 | #preparetostart > #start > .push { 100 | position: absolute; 101 | width: 100%; 102 | top: 50%; 103 | font-size: 25px; 104 | margin-top: -0.5em; 105 | text-align: center; 106 | z-index: 1; 107 | color: rgba(255, 255, 255, 0.5); } 108 | 109 | #wheel { 110 | display: none; 111 | z-index: 1; 112 | background-color: #000; } 113 | 114 | #hotdot { 115 | position: absolute; 116 | left: 50%; 117 | margin-left: -10px; 118 | bottom: 20px; } 119 | 120 | #gameCodeInput { 121 | width: 210px; 122 | height: 40px; 123 | background-color: #000; 124 | border: 2px solid #69ffd3; 125 | color: #FFF; 126 | padding-left: 10px; 127 | font-size: 14px; 128 | font-family: 'plumbmediumcmediumc'; 129 | letter-spacing: 0.15em; 130 | vertical-align: middle; 131 | text-transform: uppercase; 132 | border-radius: 0; 133 | box-sizing: border-box; 134 | margin: 10px 6px; } 135 | 136 | #connect { 137 | height: 40px; 138 | width: 100px; 139 | background-color: #fd5439; 140 | color: #fff; 141 | font-size: 14px; 142 | font-family: 'plumbmediumcmediumc'; 143 | letter-spacing: 0.15em; 144 | border: none; 145 | vertical-align: middle; 146 | text-transform: uppercase; 147 | margin: 10px 6px; } 148 | 149 | #start { 150 | position: absolute; 151 | top: 0; 152 | left: 0; 153 | width: 100%; 154 | height: 100%; 155 | background-color: #000; 156 | z-index: 1; } 157 | #start > img { 158 | position: absolute; 159 | left: 50%; 160 | top: 50%; 161 | margin-left: -70px; 162 | margin-top: -70px; 163 | height: 140px; } 164 | 165 | #gameover { 166 | display: none; 167 | position: absolute; 168 | top: 0; 169 | left: 0; 170 | background-color: #000; 171 | background: #000 url(../img/mobilereset.jpg) 0 0 no-repeat; 172 | width: 100%; 173 | height: 100%; 174 | z-index: 1; } 175 | #gameover > #restart { 176 | position: absolute; 177 | left: 50%; 178 | top: 50%; 179 | width: 190px; 180 | height: 62px; 181 | margin-left: -95px; 182 | margin-top: -31px; 183 | background-color: #000; 184 | border: none; 185 | border-radius: 0; 186 | color: #fff; 187 | font-size: 26px; 188 | font-family: 'plumbmediumcmediumc'; 189 | letter-spacing: 0.15em; 190 | text-transform: uppercase; } 191 | -------------------------------------------------------------------------------- /assets/fonts/plm65__c-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/fonts/plm65__c-webfont.eot -------------------------------------------------------------------------------- /assets/fonts/plm65__c-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/fonts/plm65__c-webfont.ttf -------------------------------------------------------------------------------- /assets/fonts/plm65__c-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/fonts/plm65__c-webfont.woff -------------------------------------------------------------------------------- /assets/fonts/plm75__c-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/fonts/plm75__c-webfont.eot -------------------------------------------------------------------------------- /assets/fonts/plm75__c-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/fonts/plm75__c-webfont.ttf -------------------------------------------------------------------------------- /assets/fonts/plm75__c-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/fonts/plm75__c-webfont.woff -------------------------------------------------------------------------------- /assets/img/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/0.png -------------------------------------------------------------------------------- /assets/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/1.png -------------------------------------------------------------------------------- /assets/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/10.png -------------------------------------------------------------------------------- /assets/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/11.png -------------------------------------------------------------------------------- /assets/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/12.png -------------------------------------------------------------------------------- /assets/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/13.png -------------------------------------------------------------------------------- /assets/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/14.png -------------------------------------------------------------------------------- /assets/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/15.png -------------------------------------------------------------------------------- /assets/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/16.png -------------------------------------------------------------------------------- /assets/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/17.png -------------------------------------------------------------------------------- /assets/img/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/18.png -------------------------------------------------------------------------------- /assets/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/2.png -------------------------------------------------------------------------------- /assets/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/3.png -------------------------------------------------------------------------------- /assets/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/4.png -------------------------------------------------------------------------------- /assets/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/5.png -------------------------------------------------------------------------------- /assets/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/6.png -------------------------------------------------------------------------------- /assets/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/7.png -------------------------------------------------------------------------------- /assets/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/8.png -------------------------------------------------------------------------------- /assets/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/9.png -------------------------------------------------------------------------------- /assets/img/DT.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/DT.png -------------------------------------------------------------------------------- /assets/img/avers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/avers.png -------------------------------------------------------------------------------- /assets/img/background5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/background5.jpg -------------------------------------------------------------------------------- /assets/img/chromeexperiments.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/chromeexperiments.png -------------------------------------------------------------------------------- /assets/img/doge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/doge.png -------------------------------------------------------------------------------- /assets/img/fav.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/fav.gif -------------------------------------------------------------------------------- /assets/img/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/fav.png -------------------------------------------------------------------------------- /assets/img/fav2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/fav2.gif -------------------------------------------------------------------------------- /assets/img/fbb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/fbb.png -------------------------------------------------------------------------------- /assets/img/fbw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/fbw.png -------------------------------------------------------------------------------- /assets/img/filters.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /assets/img/gpb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/gpb.png -------------------------------------------------------------------------------- /assets/img/gpw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/gpw.png -------------------------------------------------------------------------------- /assets/img/head.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/head.png -------------------------------------------------------------------------------- /assets/img/head0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/head0.png -------------------------------------------------------------------------------- /assets/img/hotdot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/hotdot.png -------------------------------------------------------------------------------- /assets/img/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/left.png -------------------------------------------------------------------------------- /assets/img/logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 11 | 12 | 15 | 16 | 17 | 20 | 21 | 24 | 25 | 26 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /assets/img/mobilereset.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/mobilereset.jpg -------------------------------------------------------------------------------- /assets/img/nogame.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/nogame.jpg -------------------------------------------------------------------------------- /assets/img/poster.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/poster.jpg -------------------------------------------------------------------------------- /assets/img/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/right.png -------------------------------------------------------------------------------- /assets/img/sphere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/sphere.png -------------------------------------------------------------------------------- /assets/img/twb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/twb.png -------------------------------------------------------------------------------- /assets/img/tww.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/tww.png -------------------------------------------------------------------------------- /assets/img/vcheck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/vcheck.png -------------------------------------------------------------------------------- /assets/img/vkb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/vkb.png -------------------------------------------------------------------------------- /assets/img/vkw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/img/vkw.png -------------------------------------------------------------------------------- /assets/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Digital Trip 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 | 0 24 | 25 |
26 |
27 |
28 | 29 | 30 |
31 |
32 |
33 |
34 |
35 |
36 | 37 | 38 |
39 |
40 |
your web browser actually
doesn't support webgl
41 |
please try again using google chrome
ABOUT THE PROJECT
42 |
43 |
44 | 45 | 46 |
47 | 50 |
by hot dot
51 |
choose controls
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | Keyboard
61 |
62 |
63 |
64 |
65 | Mobile
66 |
67 |
68 |
69 |
70 | Webcam
71 |
72 | 73 |
74 | 75 | 76 |
77 |
78 |
Please open

with your phone or use qr code below
79 |
80 |
change controls
81 |
82 |
83 | 84 | 85 |
86 |
87 |
Please allow access
to your webcam
88 |
89 | 90 | 91 | 92 | 93 |
94 |
change controls
95 |
96 |
97 | 98 | 99 | 104 | 105 | 106 |
107 |
108 | 114 |
resume
115 |
change controls
116 |
117 |
118 |
119 | 120 | 121 |
122 |
123 | 129 |
resume
130 |
131 |
132 |
133 | 134 | 135 |
136 |
137 | 138 |
139 |
140 | 141 | 142 |
143 |
144 |
145 |
Such Ð
146 | 147 | 148 |
149 |
150 |
change controls
151 |
restart
152 |
153 |
154 | 155 | 156 |
157 |
158 |
159 | 160 | 161 | 162 |
163 |
164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | -------------------------------------------------------------------------------- /assets/js/mobile.min.js: -------------------------------------------------------------------------------- 1 | /* Created by deemidroll | deemidroll@gmail.com | 2014 */ 2 | $(function(){function a(b){!i&&b.gamma&&(i=!0),window.removeEventListener("deviceorientation",a,!1),window.removeEventListener("MozOrientation",a,!1)}var b=window.location.origin,c=window.location.hash,d=($("#controller"),$("#gameCodeInput")),e=$("#wheel"),f=$("#gameover"),g=$("#preparetostart"),h=$("#status"),i=!1,j=function(a){var b=document.createElement("div");a="on"+a;var c=a in b;return c||(b.setAttribute(a,"return;"),c="function"==typeof b[a]),b=null,c};window.addEventListener("deviceorientation",a,!1),window.addEventListener("MozOrientation",a,!1),setTimeout(function(){i?h.html("tilt your device to control"):($("#btnLeft").on("touchstart",function(){socket.emit("click",{click:"toTheLeft"})}),$("#btnRight").on("touchstart",function(){socket.emit("click",{click:"toTheRight"})}),h.html("push buttons to control")),j("touchstart")||h.html("sorry your device not supported")},1e3);var k=function(a){socket=io.connect(b),socket.on("welcome",function(){socket.emit("device",{type:"controller",gameCode:a})}),socket.on("message",function(a){"vibr"===a.type&&navigator.vibrate(a.time),"gameover"===a.type&&(e.css({display:"none"}),f.css({display:"table-cell"})),"resetGame"===a.type&&(f.css({display:"none"}),e.css({display:"table-cell"}))}),socket.on("connected",function(){function a(a){var b,c=a.alpha,d=a.beta,e=a.gamma,f=window.orientation;0===f&&(b=e),90===f&&(b=d),-90===f&&(b=-d),socket.emit("turn",{turn:b,g:c})}$("#socket").css({display:"none"}),g.css({display:"table-cell"}),$("#start").click(function(){socket.emit("start",{}),$(this).unbind("click"),g.css({display:"none"}),e.css({display:"table-cell"}),$("#audioloop").trigger("play")}),document.addEventListener("touchmove",function(a){a.preventDefault()},!1),window.addEventListener("deviceorientation",a,!1),window.addEventListener("MozOrientation",a,!1),$("#btnSphere").on("touchstart",function(){socket.emit("click",{click:"pause"}),$("#audioloop").trigger("play")}),$("#restart").click(function(){socket.emit("click",{click:"restart"}),f.css({display:"none"}),e.css({display:"table-cell"}),$("#audioloop").trigger("play")})}),socket.on("fail",function(){$("#status_fail").html("Failed to connect! Check address and code and reload!")}),$(document).unbind("keyup",l)};c&&(k(c.slice(1)),$("#socket").hide());var l=function(a){var b=a.keyCode;13===b&&k(d.val())};$("#connect").click(function(){k(d.val())}),$(document).bind("keyup",l)}); 3 | //# sourceMappingURL=mobile.min.map -------------------------------------------------------------------------------- /assets/js/mobile.min.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"mobile.min.js","sources":["js/vendor/jquery.qrcode.min.js","js/vendor/fireworks-bundle.js"],"names":[],"mappings":";AAAA,EAAA,WCCA,QAAA,GAAA,IACA,GAAA,EAAA,QAAA,GAAA,GACA,OAAA,oBAAA,oBAAA,GAAA,GACA,OAAA,oBAAA,iBAAA,GAAA,GDFA,GAAA,GAAA,OAAA,SAAA,OACA,EAAA,OAAA,SAAA,KAMA,GADA,EAAA,eACA,EAAA,mBACA,EAAA,EAAA,UACA,EAAA,EAAA,aACA,EAAA,EAAA,mBACA,EAAA,EAAA,WACA,GAAA,EAIA,EAAA,SAAA,GACA,GAAA,GAAA,SAAA,cAAA,MACA,GAAA,KAAA,CACA,IAAA,GAAA,IAAA,EAMA,OALA,KACA,EAAA,aAAA,EAAA,WACA,EAAA,kBAAA,GAAA,IAEA,EAAA,KACA,ECrBA,QAAA,iBAAA,oBAAA,GAAA,GACA,OAAA,iBAAA,iBAAA,GAAA,GACA,WAAA,WACA,EASA,EAAA,KAAA,gCARA,EAAA,YAAA,GAAA,aAAA,WACA,OAAA,KAAA,SAAA,MAAA,gBAEA,EAAA,aAAA,GAAA,aAAA,WACA,OAAA,KAAA,SAAA,MAAA,iBAEA,EAAA,KAAA,4BAIA,EAAA,eACA,EAAA,KAAA,oCAEA,IAEA,IAAA,GAAA,SAAA,GACA,OAAA,GAAA,QAAA,GAEA,OAAA,GAAA,UAAA,WAEA,OAAA,KAAA,UAAA,KAAA,aAAA,SAAA,MAEA,OAAA,GAAA,UAAA,SAAA,GACA,SAAA,EAAA,MAEA,UAAA,QAAA,EAAA,MAEA,aAAA,EAAA,OAEA,EAAA,KAAA,QAAA,SACA,EAAA,KAAA,QAAA,gBAEA,cAAA,EAAA,OAEA,EAAA,KAAA,QAAA,SACA,EAAA,KAAA,QAAA,kBAIA,OAAA,GAAA,YAAA,WAiBA,QAAA,GAAA,GACA,GAGA,GAHA,EAAA,EAAA,MACA,EAAA,EAAA,KACA,EAAA,EAAA,MAEA,EAAA,OAAA,WACA,KAAA,IAAA,EAAA,GACA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,GACA,OAAA,KAAA,QAAA,KAAA,EAAA,EAAA,IAxBA,EAAA,WAAA,KAAA,QAAA,SACA,EAAA,KAAA,QAAA,eACA,EAAA,UAAA,MAAA,WACA,OAAA,KAAA,YACA,EAAA,MAAA,OAAA,SACA,EAAA,KAAA,QAAA,SACA,EAAA,KAAA,QAAA,eAEA,EAAA,cAAA,QAAA,UAGA,SAAA,iBAAA,YAAA,SAAA,GACA,EAAA,mBACA,GAcA,OAAA,iBAAA,oBAAA,GAAA,GACA,OAAA,iBAAA,iBAAA,GAAA,GACA,EAAA,cAAA,GAAA,aAAA,WACA,OAAA,KAAA,SAAA,MAAA,UACA,EAAA,cAAA,QAAA,UAEA,EAAA,YAAA,MAAA,WACA,OAAA,KAAA,SAAA,MAAA,YACA,EAAA,KAAA,QAAA,SACA,EAAA,KAAA,QAAA,eACA,EAAA,cAAA,QAAA,YAGA,OAAA,GAAA,OAAA,WACA,EAAA,gBAAA,KAAA,2DAEA,EAAA,UAAA,OAAA,QAAA,GAEA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,WAAA,OAEA,IAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,OACA,MAAA,GACA,EAAA,EAAA,OAGA,GAAA,YAAA,MAAA,WACA,EAAA,EAAA,SAEA,EAAA,UAAA,KAAA,QAAA","sourcesContent":[null,null]} -------------------------------------------------------------------------------- /assets/js/myYepnope.min.js: -------------------------------------------------------------------------------- 1 | /* Created by deemidroll | deemidroll@gmail.com | 2014 */ 2 | $(function(){var a,b=document.getElementById("checkwebgl");if(a=window.WebGLRenderingContext&&(b.getContext("webgl")||b.getContext("webGlCanvas")||b.getContext("moz-webgl")||b.getContext("webkit-3d")||b.getContext("experimental-webgl"))?!0:!1){var c,d=$("body"),e=$(".choose_control"),f=100,g=4;void 0===d[0].style.webkitFilter?(c=!1,e.css({filter:'url(\'data:image/svg+xml;utf8,#blur-overlay')"})):(c=!0,d[0].style.webkitFilter="blur("+f+"px)"),$("#loader").css({display:"table"}),e.css({display:"table"}),yepnope.loadCounter=0,yepnope.percent=0,yepnope.showLoading=function(a){yepnope.percent+=f/g,yepnope.loadCounter+=1,$(".loader").animate({minWidth:Math.round(yepnope.percent)+"px"},{duration:1e3,progress:function(){var b=100*parseInt($(".loader").css("minWidth"),10)/f;$("title").html(Math.floor(b)+"% digital trip"),c&&(d[0].style.webkitFilter="blur("+(f-b)+"px)"),c||b%20!==0||e.css({filter:'url(\'data:image/svg+xml;utf8,#blur-overlay')"}),100===b&&($("title").html("digital trip"),c||b%20!==0||e.css({filter:'url(\'data:image/svg+xml;utf8,#blur-overlay\')'}))},complete:function(){a===g&&DT.runApp()}})},yepnope([{load:["js/vendor/three.min.js","js/DT.min.js","../socket.io/socket.io.js"],callback:{}}])}else $("#nogame").css({display:"table"})}); 3 | //# sourceMappingURL=myYepnope.min.map -------------------------------------------------------------------------------- /assets/js/myYepnope.min.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"myYepnope.min.js","sources":["js/vendor/jquery.qrcode.min.js","js/vendor/fireworks-bundle.js"],"names":[],"mappings":";AAAA,EAAA,WACA,GAAA,GACA,EAAA,SAAA,eAAA,aAWA,IALA,EALA,OAAA,wBAGA,EAAA,WAAA,UAAA,EAAA,WAAA,gBAAA,EAAA,WAAA,cAAA,EAAA,WAAA,cAAA,EAAA,WAAA,wBAEA,GAHA,EAQA,CACA,GAIA,GAJA,EAAA,EAAA,QACA,EAAA,EAAA,mBACA,EAAA,IACA,EAAA,CAGA,UAAA,EAAA,GAAA,MAAA,cACA,GAAA,EACA,EAAA,KAAA,OAAA,iIAAA,EAAA,yCAEA,GAAA,EACA,EAAA,GAAA,MAAA,aAAA,QAAA,EAAA,2CCzBA,EAAA,KAAA,QAAA,UAEA,QAAA,YAAA,EACA,QAAA,QAAA,EACA,QAAA,YAAA,SAAA,GACA,QAAA,SAAA,EAAA,EACA,QAAA,aAAA,EAEA,EAAA,WAAA,SAAA,SAAA,KAAA,MAAA,QAAA,SAAA,OACA,SAAA,IACA,SAAA,WACA,GAAA,GAAA,IAAA,SAAA,EAAA,WAAA,IAAA,YAAA,IAAA,CACA,GAAA,SAAA,KAAA,KAAA,MAAA,GAAA,kBACA,IACA,EAAA,GAAA,MAAA,aAAA,SAAA,EAAA,GAAA,OAEA,GAAA,EAAA,KAAA,GACA,EAAA,KAAA,OAAA,kIAAA,EAAA,GAAA,EAAA,GAAA,GAAA,uCAEA,MAAA,IACA,EAAA,SAAA,KAAA,gBACA,GAAA,EAAA,KAAA,GAAA,EAAA,KAAA,OAAA,wKAGA,SAAA,WACA,IAAA,GACA,GAAA,aAKA,UACA,MACA,yBACA,eACA,6BAEA,mBAGA,GAAA,WAAA,KAAA,QAAA","sourcesContent":[null,null]} -------------------------------------------------------------------------------- /assets/js/vendor/yepnope.1.5.4-min.js: -------------------------------------------------------------------------------- 1 | /*yepnope1.5.x|WTFPL*/ 2 | (function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f 2 | 3 | 4 | digital trip mobile 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 |
18 |
19 | 20 |
21 | 22 | 23 |
24 | 25 | 26 |
27 |
28 |
29 |
30 |
31 | 32 | 33 |
34 | 35 | 36 |
37 | 38 | 39 |
40 |
start
41 |
42 |
43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /assets/objects/shield.obj: -------------------------------------------------------------------------------- 1 | # Blender v2.69 (sub 0) OBJ File: '' 2 | # www.blender.org 3 | mtllib shield5.mtl 4 | v 3.566043 -2.169689 -1.870790 5 | v 3.692634 -2.170709 -1.743620 6 | v 3.556507 -2.296890 -1.742066 7 | v -2.313433 -2.296923 -1.755292 8 | v -2.361920 -2.347214 -1.761918 9 | v -2.520455 -2.166229 -1.881297 10 | v -2.188015 -4.333909 -1.757575 11 | v -2.114091 -4.421419 -1.750901 12 | v -2.305903 -4.495983 -1.876311 13 | v -0.429337 -4.915584 -2.186739 14 | v -0.314214 -4.912241 -2.176280 15 | v -0.314959 -5.052517 -2.354450 16 | v 1.509362 -4.442739 -1.751290 17 | v 1.582553 -4.357444 -1.757806 18 | v 1.701610 -4.521033 -1.876652 19 | v 1.684193 -3.050564 -1.743659 20 | v 1.822465 -2.922831 -1.743659 21 | v 1.813022 -3.051315 -1.872306 22 | v 3.511641 -2.926631 -1.744375 23 | v 3.631464 -3.057841 -1.744375 24 | v 3.499640 -3.057908 -1.875559 25 | v 3.390035 -5.803533 -1.743399 26 | v 3.264151 -5.954840 -1.741316 27 | v 3.265495 -5.827251 -1.867105 28 | v -0.204804 -6.871816 -2.194416 29 | v -0.315409 -6.877708 -2.179532 30 | v -0.315451 -6.783573 -2.351320 31 | v -3.917227 -5.931209 -1.741338 32 | v -4.041688 -5.779063 -1.743395 33 | v -3.917365 -5.803658 -1.867201 34 | v -4.450400 -0.480582 -1.744304 35 | v -4.332766 -0.351059 -1.742895 36 | v -4.321109 -0.480849 -1.874092 37 | v 1.899891 -0.344999 -1.753995 38 | v 1.965232 -0.287136 -1.760276 39 | v 2.087910 -0.474742 -1.879763 40 | v 2.087915 1.175112 -1.761897 41 | v 2.038959 1.225989 -1.755772 42 | v 2.245039 1.357643 -1.881705 43 | v -4.540389 1.225881 -1.742151 44 | v -4.674968 1.352551 -1.743665 45 | v -4.548069 1.353339 -1.871172 46 | v -4.805141 3.089217 -1.744294 47 | v -4.686948 3.218896 -1.743041 48 | v -4.675702 3.088992 -1.874161 49 | v 4.045227 3.088345 -1.874483 50 | v 4.058593 3.218479 -1.743150 51 | v 4.175073 3.088676 -1.744382 52 | v 3.692634 -2.170706 0.147880 53 | v 3.563915 -2.169760 0.276337 54 | v 3.553000 -2.298019 0.147880 55 | v -2.308814 -2.289448 0.166174 56 | v -2.513285 -2.154766 0.288125 57 | v -2.361920 -2.347214 0.166174 58 | v -2.188015 -4.333909 0.161829 59 | v -2.301575 -4.505680 0.283296 60 | v -2.110357 -4.429282 0.161829 61 | v -0.314260 -4.916698 0.146535 62 | v -0.324272 -5.040629 0.253196 63 | v -0.250628 -4.923632 0.156524 64 | v 1.505612 -4.450410 0.162059 65 | v 1.697166 -4.530626 0.283554 66 | v 1.582553 -4.357446 0.162059 67 | v 1.684193 -3.050564 0.147915 68 | v 1.813022 -3.051315 0.276561 69 | v 1.822465 -2.922832 0.147915 70 | v 3.511641 -2.926631 0.148630 71 | v 3.499640 -3.057908 0.279814 72 | v 3.631464 -3.057841 0.148630 73 | v 3.390035 -5.803534 0.147652 74 | v 3.263386 -5.827666 0.272750 75 | v 3.260391 -5.956559 0.147652 76 | v -0.315404 -6.875576 0.134620 77 | v -0.324429 -6.777991 0.267610 78 | v -0.420001 -6.868240 0.149790 79 | v -3.913511 -5.932945 0.147648 80 | v -3.915270 -5.804086 0.272836 81 | v -4.041688 -5.779064 0.147648 82 | v -4.450400 -0.480582 0.148561 83 | v -4.318908 -0.480582 0.279563 84 | v -4.329212 -0.349495 0.148561 85 | v 1.895041 -0.351795 0.164533 86 | v 2.081551 -0.483835 0.286308 87 | v 1.965232 -0.287136 0.164533 88 | v 2.087915 1.175112 0.166154 89 | v 2.238842 1.367629 0.288104 90 | v 2.034609 1.232979 0.166154 91 | v -4.536951 1.224743 0.147922 92 | v -4.546117 1.353268 0.276605 93 | v -4.674968 1.352551 0.147922 94 | v -4.805141 3.089216 0.148553 95 | v -4.673694 3.089224 0.279530 96 | v -4.683768 3.220286 0.148553 97 | v 4.055428 3.219900 0.148641 98 | v 4.043203 3.088599 0.279849 99 | v 4.175073 3.088676 0.148641 100 | v -0.318142 -2.304274 -2.191092 101 | v -0.317415 -2.204289 -2.346444 102 | v -0.315192 -2.290937 0.172839 103 | v -0.315191 -2.190938 0.272839 104 | v -0.423193 -4.921835 0.156521 105 | v -0.338456 -5.071457 0.277263 106 | v -0.243996 -4.917950 -2.187640 107 | v -0.333866 -5.062684 0.272837 108 | v -0.209117 -6.868713 0.149790 109 | v -0.314346 -6.776314 0.270234 110 | v -0.424243 -6.871418 -2.194231 111 | v -0.333379 -6.771159 0.272836 112 | v -0.311938 -0.348367 -2.244082 113 | v -0.312856 -0.448347 -2.358216 114 | v -0.315191 -0.352826 0.172839 115 | v -0.315191 -0.452826 0.272839 116 | v -0.312360 1.224552 -2.231767 117 | v -0.313110 1.324538 -2.355252 118 | v -0.315191 1.231521 0.172839 119 | v -0.315191 1.331520 0.272839 120 | v -0.315192 3.225076 -2.225497 121 | v -0.315191 3.125077 -2.353801 122 | v -0.315191 3.216913 0.172841 123 | v -0.315191 3.116913 0.272840 124 | v 3.549274 -2.153702 -1.731205 125 | v -0.315191 -2.170227 -2.214658 126 | v 3.549274 -2.153702 0.135461 127 | v -0.315191 -2.170227 0.152128 128 | v -2.442208 -2.220109 0.135461 129 | v -2.442208 -2.220109 -1.731205 130 | v -2.255096 -4.467833 -1.731207 131 | v -2.255096 -4.467834 0.135460 132 | v -0.330248 -5.047666 -2.192320 133 | v -0.334695 -5.092554 0.168793 134 | v 1.649619 -4.491272 -1.731207 135 | v 1.649619 -4.491273 0.135460 136 | v 1.827447 -3.066931 -1.731205 137 | v 1.827447 -3.066931 0.135460 138 | v 3.489796 -3.066898 -1.731205 139 | v 3.489796 -3.066898 0.135460 140 | v 3.242291 -5.809793 -1.731207 141 | v 3.242291 -5.809794 0.135460 142 | v -0.314639 -6.754944 -2.200165 143 | v -0.314748 -6.728929 0.168793 144 | v -3.894101 -5.786452 -1.731207 145 | v -3.894101 -5.786453 0.135460 146 | v -4.308612 -0.490100 -1.731205 147 | v -4.308612 -0.490101 0.135462 148 | v -0.315191 -0.473536 -2.235270 149 | v -0.315191 -0.473537 0.152128 150 | v 2.026109 -0.423649 0.135462 151 | v 2.026109 -0.423648 -1.731205 152 | v 2.167970 1.302344 -1.731205 153 | v 2.167970 1.302343 0.135462 154 | v -0.315191 1.352232 -2.230592 155 | v -0.315191 1.352231 0.152129 156 | v -4.531735 1.368800 0.135462 157 | v -4.531735 1.368800 -1.731205 158 | v -4.663338 3.079634 -1.731204 159 | v -4.663338 3.079634 0.135463 160 | v -0.315191 3.096204 -2.228176 161 | v -0.315191 3.096203 0.152130 162 | v 4.033419 3.079678 0.135463 163 | v 4.033419 3.079678 -1.731204 164 | usemtl None 165 | s off 166 | f 1 2 3 167 | f 4 5 6 168 | f 7 8 9 169 | f 10 11 12 170 | f 13 14 15 171 | f 16 17 18 172 | f 19 20 21 173 | f 22 23 24 174 | f 25 26 27 175 | f 28 29 30 176 | f 31 32 33 177 | f 34 35 36 178 | f 37 38 39 179 | f 40 41 42 180 | f 43 44 45 181 | f 46 47 48 182 | f 49 50 51 183 | f 52 53 54 184 | f 55 56 57 185 | f 58 59 60 186 | f 61 62 63 187 | f 64 65 66 188 | f 67 68 69 189 | f 70 71 72 190 | f 73 74 75 191 | f 76 77 78 192 | f 79 80 81 193 | f 82 83 84 194 | f 85 86 87 195 | f 88 89 90 196 | f 91 92 93 197 | f 94 95 96 198 | f 98 1 3 97 199 | f 3 2 49 51 200 | f 52 54 5 4 201 | f 99 100 53 52 202 | f 7 9 6 5 203 | f 55 57 8 7 204 | f 54 53 56 55 205 | f 10 101 58 11 206 | f 57 56 102 101 207 | f 13 15 12 103 208 | f 61 63 14 13 209 | f 62 60 59 104 210 | f 60 62 61 211 | f 16 18 15 14 212 | f 64 66 17 16 213 | f 63 62 65 64 214 | f 19 21 18 17 215 | f 67 69 20 19 216 | f 66 65 68 67 217 | f 22 24 21 20 218 | f 70 72 23 22 219 | f 69 68 71 70 220 | f 25 27 24 23 221 | f 25 105 73 26 222 | f 72 71 106 105 223 | f 28 30 27 107 224 | f 76 78 29 28 225 | f 77 75 74 108 226 | f 75 77 76 227 | f 31 33 30 29 228 | f 79 81 32 31 229 | f 78 77 80 79 230 | f 32 109 110 33 231 | f 82 84 35 34 232 | f 111 112 83 82 233 | f 37 39 36 35 234 | f 85 87 38 37 235 | f 84 83 86 85 236 | f 113 114 39 38 237 | f 88 90 41 40 238 | f 88 115 116 89 239 | f 43 45 42 41 240 | f 91 93 44 43 241 | f 90 89 92 91 242 | f 44 117 118 45 243 | f 94 96 48 47 244 | f 94 119 120 95 245 | f 2 1 46 48 246 | f 96 95 50 49 247 | f 11 103 12 248 | f 26 107 27 249 | f 102 59 58 101 250 | f 106 74 73 105 251 | f 97 4 6 98 252 | f 100 99 51 50 253 | f 11 58 60 103 254 | f 59 102 104 255 | f 26 73 75 107 256 | f 74 106 108 257 | f 109 34 36 110 258 | f 112 111 81 80 259 | f 114 113 40 42 260 | f 115 87 86 116 261 | f 118 117 47 46 262 | f 120 119 93 92 263 | f 10 12 9 8 264 | f 97 3 121 122 265 | f 3 51 123 121 266 | f 51 99 124 123 267 | f 99 52 125 124 268 | f 52 4 126 125 269 | f 4 97 122 126 270 | f 7 5 126 127 271 | f 5 54 125 126 272 | f 54 55 128 125 273 | f 55 7 127 128 274 | f 10 8 127 129 275 | f 8 57 128 127 276 | f 57 101 130 128 277 | f 101 10 129 130 278 | f 13 103 129 131 279 | f 103 60 130 129 280 | f 60 61 132 130 281 | f 61 13 131 132 282 | f 16 14 131 133 283 | f 14 63 132 131 284 | f 63 64 134 132 285 | f 64 16 133 134 286 | f 19 17 133 135 287 | f 17 66 134 133 288 | f 66 67 136 134 289 | f 67 19 135 136 290 | f 22 20 135 137 291 | f 20 69 136 135 292 | f 69 70 138 136 293 | f 70 22 137 138 294 | f 25 23 137 139 295 | f 23 72 138 137 296 | f 72 105 140 138 297 | f 105 25 139 140 298 | f 28 107 139 141 299 | f 107 75 140 139 300 | f 75 76 142 140 301 | f 76 28 141 142 302 | f 31 29 141 143 303 | f 29 78 142 141 304 | f 78 79 144 142 305 | f 79 31 143 144 306 | f 109 32 143 145 307 | f 32 81 144 143 308 | f 81 111 146 144 309 | f 111 82 147 146 310 | f 82 34 148 147 311 | f 34 109 145 148 312 | f 37 35 148 149 313 | f 35 84 147 148 314 | f 84 85 150 147 315 | f 85 37 149 150 316 | f 113 38 149 151 317 | f 38 87 150 149 318 | f 87 115 152 150 319 | f 115 88 153 152 320 | f 88 40 154 153 321 | f 40 113 151 154 322 | f 43 41 154 155 323 | f 41 90 153 154 324 | f 90 91 156 153 325 | f 91 43 155 156 326 | f 117 44 155 157 327 | f 44 93 156 155 328 | f 93 119 158 156 329 | f 119 94 159 158 330 | f 94 47 160 159 331 | f 47 117 157 160 332 | f 2 48 160 121 333 | f 48 96 159 160 334 | f 96 49 123 159 335 | f 49 2 121 123 336 | f 1 98 122 121 337 | f 98 6 126 122 338 | f 6 9 127 126 339 | f 9 12 129 127 340 | f 12 15 131 129 341 | f 15 18 133 131 342 | f 18 21 135 133 343 | f 21 24 137 135 344 | f 24 27 139 137 345 | f 27 30 141 139 346 | f 30 33 143 141 347 | f 33 110 145 143 348 | f 110 36 148 145 349 | f 36 39 149 148 350 | f 39 114 151 149 351 | f 114 42 154 151 352 | f 42 45 155 154 353 | f 45 118 157 155 354 | f 118 46 160 157 355 | f 46 1 121 160 356 | f 53 100 124 125 357 | f 100 50 123 124 358 | f 50 95 159 123 359 | f 95 120 158 159 360 | f 120 92 156 158 361 | f 92 89 153 156 362 | f 89 116 152 153 363 | f 116 86 150 152 364 | f 86 83 147 150 365 | f 83 112 146 147 366 | f 112 80 144 146 367 | f 80 77 142 144 368 | f 77 108 140 142 369 | f 108 106 140 370 | f 106 71 138 140 371 | f 71 68 136 138 372 | f 68 65 134 136 373 | f 65 62 132 134 374 | f 62 104 130 132 375 | f 104 102 130 376 | f 102 56 128 130 377 | f 56 53 125 128 378 | v -0.319083 -9.834706 0.088397 379 | v -0.319083 -9.834706 1.911597 380 | v -0.404336 -9.822839 1.911597 381 | v -0.404336 -9.822839 0.088397 382 | v -0.233518 -9.734917 -0.000003 383 | v -0.318836 -9.746306 -0.000003 384 | v -0.316033 -8.744308 -0.000002 385 | v -0.230715 -8.732917 -0.000002 386 | v -0.233765 -9.823317 0.088397 387 | v -0.233765 -9.823317 1.911597 388 | v -0.404088 -9.734439 -0.000003 389 | v -0.401286 -8.732440 -0.000002 390 | v -5.017029 -7.390148 0.022098 391 | v -5.046782 -7.413828 0.091589 392 | v -0.315843 -8.676476 0.090900 393 | v -0.401100 -8.666141 0.022098 394 | v -6.091434 4.870564 0.022102 395 | v -6.118335 4.894203 0.092282 396 | v -0.420162 4.877737 0.022102 397 | v -0.420175 4.916982 0.091171 398 | v 4.332985 -7.432482 0.022098 399 | v 4.362653 -7.456258 0.091592 400 | v 5.454807 4.894170 0.092282 401 | v 5.427886 4.870553 0.022102 402 | v -0.230530 -8.666617 0.022098 403 | v -0.243317 4.916983 0.091170 404 | v -0.243362 4.877737 0.022102 405 | v -0.315848 -8.678008 0.022098 406 | v -0.331762 4.877737 0.022102 407 | v -0.331713 4.944037 0.000002 408 | v -0.243313 4.944037 0.000002 409 | v -0.420113 4.944037 0.000002 410 | v -5.067964 -7.432590 -0.000002 411 | v -6.140324 4.915346 0.000002 412 | v 5.476806 4.915302 0.000002 413 | v 4.383771 -7.475102 -0.000002 414 | v -0.331746 4.915648 0.091636 415 | v -0.404274 -9.800738 0.022097 416 | v -6.046819 -8.248263 0.022098 417 | v -5.995885 -8.205821 -0.000002 418 | v 5.361355 -8.295485 0.022098 419 | v -0.233704 -9.801216 0.022097 420 | v 5.310569 -8.252866 -0.000002 421 | v 6.638573 5.977992 0.022102 422 | v 6.589653 5.933243 0.000002 423 | v -7.251564 5.933198 0.000002 424 | v -7.300454 5.977981 0.022102 425 | v -0.419352 5.970808 0.022102 426 | v -0.419401 5.904508 0.000002 427 | v -0.242552 5.970808 0.022102 428 | v -0.242601 5.904508 0.000002 429 | v -0.319021 -9.812606 0.022097 430 | v -0.330952 5.970808 0.022102 431 | v -0.331001 5.904508 0.000002 432 | v -5.978577 -8.285909 0.088398 433 | v -6.012698 -8.267086 0.055248 434 | v 5.327144 -8.314098 0.055248 435 | v 5.292934 -8.332712 0.088398 436 | v 6.642797 5.941425 0.055252 437 | v 6.647021 5.904858 0.088402 438 | v 5.386143 -8.221642 0.088398 439 | v 5.373749 -8.258564 0.055248 440 | v -7.264403 5.985444 0.055252 441 | v -7.228351 5.992908 0.088402 442 | v -0.419336 5.992908 0.088402 443 | v -6.059177 -8.211308 0.055248 444 | v -6.071537 -8.174351 0.088398 445 | v -7.309011 5.904847 0.088402 446 | v -7.304733 5.941414 0.055252 447 | v -0.242536 5.992908 0.088402 448 | v 6.566480 5.992908 0.088402 449 | v 6.602526 5.985449 0.055252 450 | v -0.330936 5.992908 0.088402 451 | v 6.624928 5.904857 1.977902 452 | v 5.364797 -8.227397 1.977898 453 | v 5.386143 -8.221642 1.911598 454 | v 6.647021 5.904858 1.911602 455 | v 6.550824 5.816803 2.000002 456 | v 5.300762 -8.244659 1.999998 457 | v -0.314916 -8.342708 -0.636575 458 | v -0.357135 -8.314749 -0.612173 459 | v -0.357146 -8.292673 -0.635177 460 | v -0.272728 -8.314988 -0.612086 461 | v -0.272681 -8.337064 -0.589081 462 | v -0.399354 -8.286791 -0.587771 463 | v -4.697095 -7.123153 0.048864 464 | v -4.636465 -7.071443 0.013369 465 | v -0.399377 -8.242640 -0.633779 466 | v -5.721357 4.531281 0.049345 467 | v -5.650086 4.465083 0.015282 468 | v -0.418055 4.531266 -1.134652 469 | v -0.417927 4.465022 -1.154040 470 | v -0.245444 4.531266 -1.134650 471 | v 5.057323 4.531281 0.049314 472 | v 4.985970 4.465078 0.015161 473 | v -0.245399 4.465022 -1.154037 474 | v 4.013536 -7.164001 0.048850 475 | v 3.953002 -7.111996 0.013314 476 | v -0.230540 -8.287269 -0.587596 477 | v -0.230635 -8.243117 -0.633604 478 | v -0.331750 4.531267 -1.144275 479 | v -0.331663 4.465023 -1.163648 480 | v -0.357124 -8.336824 -0.589169 481 | v -0.399332 -8.330942 -0.541763 482 | v -0.272775 -8.292912 -0.635090 483 | v -0.230446 -8.331420 -0.541587 484 | v -4.717306 -7.140390 0.119629 485 | v -5.745113 4.553348 0.119632 486 | v -0.418182 4.553348 -1.069256 487 | v -0.245376 4.553348 -1.069254 488 | v 5.081108 4.553348 0.119632 489 | v 4.033714 -7.181335 0.119628 490 | v -0.331779 4.553348 -1.078883 491 | v -7.284567 5.963429 0.055252 492 | v -7.291238 5.954318 1.961332 493 | v -7.292717 5.970891 1.911602 494 | v -7.309011 5.904847 1.911602 495 | v -7.268682 5.948878 0.088402 496 | v -7.228351 5.992908 1.911602 497 | v -7.226323 5.970808 1.977908 498 | v -0.419336 5.970808 1.977902 499 | v -0.419336 5.992908 1.911602 500 | v -6.050223 -8.180224 1.977898 501 | v -7.286804 5.904592 1.977902 502 | v -6.071537 -8.174352 1.911598 503 | v -0.242536 5.992908 1.911602 504 | v -0.242536 5.970808 1.977902 505 | v 6.492698 5.970893 1.994263 506 | v 6.544384 5.992908 1.977050 507 | v -0.330936 5.970808 1.977902 508 | v -0.330936 5.992908 1.911602 509 | v -7.220241 5.904508 2.000003 510 | v -0.419336 5.904508 2.000003 511 | v -5.986282 -8.197845 1.999998 512 | v -0.242536 5.904508 2.000003 513 | v 6.470252 5.904850 2.000003 514 | v -0.330936 5.904508 2.000003 515 | v 6.622662 5.963437 0.055252 516 | v 6.606750 5.948883 0.088402 517 | v 6.635669 5.970894 1.908804 518 | v 6.608718 5.970894 1.977689 519 | v 6.534595 5.882841 2.000002 520 | v 6.568939 5.960809 1.990703 521 | v 6.585896 5.992908 1.900408 522 | v -6.035938 -8.239197 0.055248 523 | v 5.350446 -8.286331 0.055248 524 | v -5.997294 -8.280748 1.900403 525 | v -6.049106 -8.244981 1.908799 526 | v -6.025056 -8.230129 0.088398 527 | v -0.399983 -9.801764 1.977897 528 | v -5.977805 -8.264637 1.982752 529 | v -5.967785 -8.288884 1.931014 530 | v 5.339538 -8.277178 0.088398 531 | v 5.363597 -8.292171 1.908799 532 | v 5.311680 -8.327657 1.900403 533 | v 5.292189 -8.311428 1.982752 534 | v -0.238000 -9.802218 1.977897 535 | v 5.282125 -8.335628 1.931014 536 | v -0.319023 -9.813188 1.977897 537 | v 5.346981 -8.296653 1.965544 538 | v -6.032515 -8.249555 1.965544 539 | v -0.386925 -9.738544 1.999997 540 | v -0.250704 -9.738925 1.999997 541 | v -0.318842 -9.748632 1.999997 542 | v 5.309234 -8.328316 1.928481 543 | v -5.994852 -8.281421 1.928481 544 | v -0.419405 5.884943 0.102820 545 | v -7.214220 5.888121 0.095234 546 | v 6.558011 5.900733 0.100346 547 | v -0.242532 5.883731 0.105801 548 | v -0.330968 5.885462 0.107448 549 | v -7.205345 5.891054 1.897927 550 | v -0.419336 5.898038 1.879980 551 | v -0.242394 5.900921 1.872376 552 | v 6.526717 5.871633 1.907143 553 | v -0.330936 5.898038 1.879980 554 | v 5.271754 -8.227908 1.900313 555 | v -0.419336 5.872887 1.905133 556 | v -5.961861 -8.175270 1.900140 557 | v -0.242476 5.878351 1.903484 558 | v -0.330936 5.872883 1.905134 559 | v -0.318753 -9.716875 1.902528 560 | v -0.318768 -9.721805 0.100625 561 | v -5.958999 -8.177328 0.099925 562 | v 5.273728 -8.224211 0.099921 563 | v -0.319417 -8.238572 -0.583050 564 | v -0.320231 -8.288486 -0.584491 565 | v -0.320171 -8.282723 -0.537041 566 | v -0.314861 -8.224503 -0.527509 567 | v -4.621706 -7.065105 0.132869 568 | v -5.645470 4.474213 0.134851 569 | v -0.407455 4.448235 -1.048210 570 | v -0.255987 4.448209 -1.048217 571 | v 4.981370 4.474234 0.134788 572 | v 3.938283 -7.105750 0.132877 573 | v -0.331722 4.447775 -1.057280 574 | usemtl None 575 | s off 576 | f 161 162 163 164 577 | f 165 166 167 168 578 | f 162 161 169 170 579 | f 171 172 167 166 580 | f 173 174 175 176 581 | f 177 178 174 173 582 | f 179 180 178 177 583 | f 181 182 183 184 584 | f 185 175 182 181 585 | f 184 183 186 187 586 | f 175 185 188 587 | f 187 189 190 191 588 | f 188 176 175 589 | f 189 179 192 190 590 | f 172 193 173 176 591 | f 193 194 177 173 592 | f 177 194 192 179 593 | f 195 196 181 184 594 | f 196 168 185 181 595 | f 191 195 184 187 596 | f 185 167 188 597 | f 197 189 187 186 598 | f 188 167 176 599 | f 180 179 189 197 600 | f 198 199 200 171 601 | f 201 202 165 203 602 | f 204 201 203 205 603 | f 206 207 208 209 604 | f 199 207 206 200 605 | f 210 204 205 211 606 | f 202 212 166 165 607 | f 208 213 214 209 608 | f 166 212 198 171 609 | f 213 210 211 214 610 | f 198 164 215 216 611 | f 217 218 169 202 612 | f 219 220 221 222 613 | f 223 224 225 208 614 | f 226 227 228 229 615 | f 210 230 231 232 616 | f 202 161 212 617 | f 225 233 213 208 618 | f 212 161 198 619 | f 233 230 210 213 620 | f 234 235 236 237 621 | f 238 239 235 234 622 | f 240 241 242 623 | f 240 243 244 624 | f 245 246 247 248 625 | f 246 249 250 247 626 | f 250 249 251 252 627 | f 253 254 255 256 628 | f 254 257 258 255 629 | f 258 257 259 260 630 | f 252 251 261 262 631 | f 261 253 256 262 632 | f 263 241 240 633 | f 245 241 263 264 634 | f 245 248 242 241 635 | f 265 243 240 636 | f 259 243 265 260 637 | f 259 266 244 243 638 | f 264 267 246 245 639 | f 267 268 249 246 640 | f 249 268 269 251 641 | f 270 271 254 253 642 | f 271 272 257 254 643 | f 272 266 259 257 644 | f 251 269 273 261 645 | f 273 270 253 261 646 | f 223 207 274 647 | f 278 276 279 224 648 | f 280 281 282 279 649 | f 283 284 277 285 650 | f 286 287 288 289 651 | f 281 290 291 282 652 | f 290 287 286 291 653 | f 207 229 274 654 | f 229 278 274 655 | f 274 278 223 656 | f 284 280 275 657 | f 275 280 276 658 | f 228 277 276 278 659 | f 292 293 281 280 660 | f 294 292 284 283 661 | f 295 296 288 287 662 | f 293 297 290 281 663 | f 297 295 287 290 664 | f 219 204 298 665 | f 299 300 237 220 666 | f 300 301 234 237 667 | f 302 303 288 296 668 | f 288 303 301 289 669 | f 204 232 298 670 | f 232 299 298 671 | f 298 299 219 672 | f 299 231 304 300 673 | f 304 289 301 300 674 | f 234 303 302 238 675 | f 303 234 301 676 | f 226 199 305 677 | f 217 201 306 678 | f 310 311 312 163 679 | f 313 314 315 218 680 | f 316 317 170 318 681 | f 317 319 162 170 682 | f 162 319 310 163 683 | f 316 320 235 239 684 | f 235 320 314 236 685 | f 308 321 283 285 686 | f 283 321 311 294 687 | f 199 216 305 688 | f 216 309 305 689 | f 305 309 226 690 | f 201 222 306 691 | f 222 313 306 692 | f 306 313 217 693 | f 322 294 311 310 694 | f 221 236 314 313 695 | f 316 239 323 317 696 | f 317 323 324 319 697 | f 324 322 310 319 698 | f 316 318 325 320 699 | f 325 315 314 320 700 | f 308 307 326 321 701 | f 326 312 311 321 702 | f 327 225 224 328 703 | f 329 231 230 330 704 | f 331 233 225 327 705 | f 330 230 233 331 706 | f 328 224 279 332 707 | f 332 279 282 333 708 | f 334 286 289 335 709 | f 333 282 291 336 710 | f 336 291 286 334 711 | f 335 304 231 329 712 | f 304 335 289 713 | f 337 239 238 335 714 | f 338 293 292 332 715 | f 332 292 294 339 716 | f 335 296 295 340 717 | f 341 297 293 338 718 | f 340 295 297 341 719 | f 296 335 302 720 | f 302 335 238 721 | f 339 294 322 342 722 | f 342 323 239 337 723 | f 323 342 324 724 | f 324 342 322 725 | f 343 165 168 175 726 | f 175 172 171 343 727 | f 186 191 190 197 728 | f 197 190 192 180 729 | f 174 193 172 175 730 | f 178 194 193 174 731 | f 180 192 194 178 732 | f 182 196 195 183 733 | f 175 168 196 182 734 | f 183 195 191 186 735 | f 343 171 200 344 736 | f 345 203 165 343 737 | f 329 205 203 345 738 | f 328 206 209 327 739 | f 344 200 206 328 740 | f 330 211 205 329 741 | f 327 209 214 331 742 | f 331 214 211 330 743 | f 328 228 227 344 744 | f 339 285 277 332 745 | f 332 277 228 328 746 | f 344 227 285 339 747 | f 345 221 220 329 748 | f 335 237 236 337 749 | f 329 220 237 335 750 | f 337 236 221 345 751 | f 343 164 163 342 752 | f 344 215 164 343 753 | f 339 307 215 344 754 | f 342 163 312 339 755 | f 307 339 326 756 | f 326 339 312 757 | f 342 170 169 343 758 | f 343 169 218 345 759 | f 345 218 315 337 760 | f 337 318 170 342 761 | f 318 337 325 762 | f 325 337 315 763 | f 346 347 240 242 764 | f 348 347 240 244 765 | f 349 248 247 350 766 | f 350 247 250 351 767 | f 351 250 252 352 768 | f 353 256 255 354 769 | f 354 255 258 355 770 | f 355 258 260 349 771 | f 352 252 262 356 772 | f 356 262 256 353 773 | f 240 347 348 263 774 | f 349 264 263 348 775 | f 346 242 248 349 776 | f 240 347 346 265 777 | f 349 260 265 346 778 | f 348 244 266 349 779 | f 350 267 264 349 780 | f 351 268 267 350 781 | f 352 269 268 351 782 | f 354 271 270 353 783 | f 355 272 271 354 784 | f 349 266 272 355 785 | f 356 273 269 352 786 | f 353 270 273 356 787 | s 1 788 | f 307 308 309 215 789 | f 285 227 309 308 790 | -------------------------------------------------------------------------------- /assets/sounds/catchBonus0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/catchBonus0.mp3 -------------------------------------------------------------------------------- /assets/sounds/catchBonus0.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/catchBonus0.ogg -------------------------------------------------------------------------------- /assets/sounds/catchBonus1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/catchBonus1.mp3 -------------------------------------------------------------------------------- /assets/sounds/catchBonus1.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/catchBonus1.ogg -------------------------------------------------------------------------------- /assets/sounds/catchBonus2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/catchBonus2.mp3 -------------------------------------------------------------------------------- /assets/sounds/catchBonus2.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/catchBonus2.ogg -------------------------------------------------------------------------------- /assets/sounds/coin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/coin.mp3 -------------------------------------------------------------------------------- /assets/sounds/coin.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/coin.ogg -------------------------------------------------------------------------------- /assets/sounds/fun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/fun.mp3 -------------------------------------------------------------------------------- /assets/sounds/fun.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/fun.ogg -------------------------------------------------------------------------------- /assets/sounds/gameover.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/gameover.mp3 -------------------------------------------------------------------------------- /assets/sounds/gameover.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/gameover.ogg -------------------------------------------------------------------------------- /assets/sounds/intro.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/intro.mp3 -------------------------------------------------------------------------------- /assets/sounds/intro.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/intro.ogg -------------------------------------------------------------------------------- /assets/sounds/invulner.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/invulner.mp3 -------------------------------------------------------------------------------- /assets/sounds/invulner.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/invulner.ogg -------------------------------------------------------------------------------- /assets/sounds/loop.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/loop.mp3 -------------------------------------------------------------------------------- /assets/sounds/main.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/main.mp3 -------------------------------------------------------------------------------- /assets/sounds/main.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/main.ogg -------------------------------------------------------------------------------- /assets/sounds/muv8.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/muv8.mp3 -------------------------------------------------------------------------------- /assets/sounds/muv8.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/muv8.ogg -------------------------------------------------------------------------------- /assets/sounds/pause.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/pause.mp3 -------------------------------------------------------------------------------- /assets/sounds/pause.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/pause.ogg -------------------------------------------------------------------------------- /assets/sounds/stoneDestroy.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/stoneDestroy.mp3 -------------------------------------------------------------------------------- /assets/sounds/stoneDestroy.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/stoneDestroy.ogg -------------------------------------------------------------------------------- /assets/sounds/stoneMiss.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/stoneMiss.mp3 -------------------------------------------------------------------------------- /assets/sounds/stoneMiss.ogg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/htdt/digital_trip/47f911cc593ba6b59e8a5a3899ac0bfa5de5e2b5/assets/sounds/stoneMiss.ogg -------------------------------------------------------------------------------- /assets_source/Gruntfile.js: -------------------------------------------------------------------------------- 1 | // ██████╗ ██████╗ ██╗ ██╗███╗ ██╗████████╗███████╗██╗██╗ ███████╗ ██╗███████╗ 2 | // ██╔════╝ ██╔══██╗██║ ██║████╗ ██║╚══██╔══╝██╔════╝██║██║ ██╔════╝ ██║██╔════╝ 3 | // ██║ ███╗██████╔╝██║ ██║██╔██╗ ██║ ██║ █████╗ ██║██║ █████╗ ██║███████╗ 4 | // ██║ ██║██╔══██╗██║ ██║██║╚██╗██║ ██║ ██╔══╝ ██║██║ ██╔══╝ ██ ██║╚════██║ 5 | // ╚██████╔╝██║ ██║╚██████╔╝██║ ╚████║ ██║ ██║ ██║███████╗███████╗██╗╚█████╔╝███████║ 6 | // ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚═╝ ╚════╝ ╚══════╝ 7 | 8 | module.exports = function(grunt) { 9 | grunt.initConfig({ 10 | pkg: grunt.file.readJSON('package.json'), 11 | sass: { 12 | dist: { 13 | files: { 14 | '../assets/css/game.css': 'scss/game.scss', 15 | '../assets/css/mobile.css': 'scss/mobile.scss' 16 | } 17 | }, 18 | options: { 19 | sourcemap: 'true' 20 | } 21 | }, 22 | watch: { 23 | options: { 24 | livereload: true, 25 | }, 26 | css: { 27 | files: 'scss/*.scss', 28 | tasks: ['newer:sass'], 29 | }, 30 | js: { 31 | files: ['js/*.js', 'js/*/*.js', '../assets/js/tests/tests.js'], 32 | tasks: ['process'], 33 | }, 34 | html: { 35 | files: '../assets/index.html', 36 | }, 37 | // config: { 38 | // files: ['package.json', 'Gruntfile.js'], 39 | // tasks: ['exit'] 40 | // }, 41 | }, 42 | concat_sourcemap: { 43 | options: { 44 | sourcesContent: true 45 | }, 46 | target: { 47 | files: { 48 | '../assets_source/js/DT.js': [ 49 | // '../assets/js/DT.js': [ 50 | // QR code 51 | 'js/vendor/jquery.qrcode.min.js', 52 | // Particle system 53 | 'js/vendor/fireworks-bundle.js', 54 | // Detector 55 | 'js/vendor/Detector.js', 56 | // Resize 57 | 'js/vendor/threex.windowresize.js', 58 | // Stats 59 | 'js/vendor/Stats.js', 60 | 'js/vendor/threex.rendererstats.js', 61 | // Curves 62 | 'js/vendor/CurveExtras.js', 63 | // Sound 64 | 'js/vendor/BufferLoader.js', 65 | // Webcam control 66 | 'js/vendor/headtrackr.min.js', 67 | // External objects 68 | 'js/vendor/OBJLoader.js', 69 | // Full screen 70 | 'js/vendor/THREEx.FullScreen.js', 71 | // Postprocessing 72 | 'js/vendor/CopyShader.js', 73 | 'js/vendor/EffectComposer.js', 74 | 'js/vendor/RenderPass.js', 75 | 'js/vendor/MaskPass.js', 76 | 'js/vendor/ShaderPass.js', 77 | 'js/vendor/BadTVShader.js', 78 | // Game init 79 | 'js/init.js', 80 | ] 81 | } 82 | } 83 | }, 84 | uglify: { 85 | dist: { 86 | options: { 87 | sourceMap: true, 88 | sourceMapIncludeSources: true, 89 | sourceMapIn: '../assets_source/js/DT.js.map', 90 | banner: '/* Created by deemidroll | deemidroll@gmail.com | 2014 */', 91 | }, 92 | files: { 93 | '../assets/js/DT.min.js': ['../assets_source/js/DT.js'], 94 | '../assets/js/myYepnope.min.js': ['js/myYepnope.js'], 95 | '../assets/js/mobile.min.js': ['js/mobile.js'], 96 | } 97 | } 98 | }, 99 | }); 100 | grunt.loadNpmTasks('grunt-sass'); 101 | grunt.loadNpmTasks('grunt-contrib-watch'); 102 | grunt.loadNpmTasks('grunt-concat-sourcemap'); 103 | grunt.loadNpmTasks('grunt-contrib-uglify'); 104 | grunt.loadNpmTasks('grunt-newer'); 105 | grunt.registerTask('process', 106 | ['concat_sourcemap', 107 | 'uglify' 108 | ]); 109 | grunt.registerTask('default', 110 | ['sass', 111 | 'concat_sourcemap', 112 | 'uglify', 113 | 'watch']); 114 | } -------------------------------------------------------------------------------- /assets_source/js/mobile.js: -------------------------------------------------------------------------------- 1 | $(function() { 2 | // Game config 3 | var server = window.location.origin, 4 | hash = window.location.hash, 5 | leftBreakThreshold = -3, 6 | leftTurnThreshold = -20, 7 | rightBreakThreshold = 3, 8 | rightTurnThreshold = 20, 9 | controller = $('#controller'), 10 | $gameCodeInput = $('#gameCodeInput'), 11 | $wheel = $('#wheel'), 12 | $gameover = $('#gameover'), 13 | $preparetostart = $('#preparetostart'), 14 | $status = $('#status'), 15 | turned = false; 16 | 17 | // Technique from Juriy Zaytsev 18 | // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ 19 | var eventSupported = function( eventName ) { 20 | var el = document.createElement('div'); 21 | eventName = 'on' + eventName; 22 | var isSupported = (eventName in el); 23 | if ( !isSupported ) { 24 | el.setAttribute(eventName, 'return;'); 25 | isSupported = typeof el[eventName] === 'function'; 26 | } 27 | el = null; 28 | return isSupported; 29 | }; 30 | // device orientation 31 | function orientationTest (event) { 32 | if (!turned && event.gamma) turned = true; 33 | window.removeEventListener('deviceorientation', orientationTest, false); 34 | window.removeEventListener('MozOrientation', orientationTest, false); 35 | } 36 | window.addEventListener('deviceorientation', orientationTest, false); 37 | window.addEventListener('MozOrientation', orientationTest, false); 38 | setTimeout(function () { 39 | if (!turned) { 40 | $('#btnLeft').on('touchstart',function () { 41 | socket.emit('click', {'click':'toTheLeft'}); 42 | }); 43 | $('#btnRight').on('touchstart',function () { 44 | socket.emit('click', {'click':'toTheRight'}); 45 | }); 46 | $status.html('push buttons to control'); 47 | } else { 48 | $status.html('tilt your device to control'); 49 | } 50 | if (!eventSupported('touchstart')) { 51 | $status.html('sorry your device not supported'); 52 | } 53 | }, 1000); 54 | // When connect is pushed, establish socket connection 55 | var connect = function(gameCode) { 56 | socket = io.connect(server); 57 | // When server replies with initial welcome... 58 | socket.on('welcome', function(data) { 59 | // Send 'controller' device type with our entered game code 60 | socket.emit('device', {'type':'controller', 'gameCode':gameCode}); 61 | }); 62 | socket.on('message', function(data) { 63 | if (data.type === 'vibr') { 64 | // console.log('vibtare', data.time); 65 | navigator.vibrate(data.time); 66 | } 67 | if (data.type === 'gameover') { 68 | // console.log('gameover'); 69 | $wheel.css({display: 'none'}); 70 | $gameover.css({display: 'table-cell'}); 71 | } 72 | if (data.type === 'resetGame') { 73 | // console.log('resetGame'); 74 | $gameover.css({display: 'none'}); 75 | $wheel.css({display: 'table-cell'}); 76 | } 77 | }); 78 | // When game code is validated, we can begin playing... 79 | socket.on('connected', function(data) { 80 | // css {display: 'none'}game code input, and css {display: 'table-cell'}the vehicle $wheel UI 81 | $('#socket').css({display: 'none'}); 82 | $preparetostart.css({display: 'table-cell'}); 83 | $('#start').click(function () { 84 | socket.emit('start', {}); 85 | $(this).unbind('click'); 86 | $preparetostart.css({display: 'none'}); 87 | $wheel.css({display: 'table-cell'}); 88 | // Audio loop - hack for prevent screen sleep 89 | $('#audioloop').trigger('play'); 90 | }); 91 | // Prevent touchmove event from cancelling the 'touchend' event above 92 | document.addEventListener('touchmove', function(event) { 93 | event.preventDefault(); 94 | }, false); 95 | 96 | function orientationHandler (event) { 97 | var a = event.alpha, // 'direction' 98 | b = event.beta, // left/right 'tilt' 99 | g = event.gamma; // forward/back 'tilt' 100 | var turn, 101 | ori = window.orientation; 102 | if (ori === 0) turn = g; 103 | if (ori === 90) turn = b; 104 | if (ori === -90) turn = -b; 105 | socket.emit('turn', {'turn':turn, 'g':a}); 106 | } 107 | // Steer the vehicle based on the phone orientation 108 | window.addEventListener('deviceorientation', orientationHandler, false); 109 | window.addEventListener('MozOrientation', orientationHandler, false); 110 | $('#btnSphere').on('touchstart',function () { 111 | socket.emit('click', {'click':'pause'}); 112 | $('#audioloop').trigger('play'); 113 | }); 114 | $('#restart').click(function () { 115 | socket.emit('click', {'click':'restart'}); 116 | $gameover.css({display: 'none'}); 117 | $wheel.css({display: 'table-cell'}); 118 | $('#audioloop').trigger('play'); 119 | }); 120 | }); 121 | socket.on('fail', function() { 122 | $('#status_fail').html('Failed to connect! Check address and code and reload!'); 123 | }); 124 | $(document).unbind('keyup', connnectOnEnter); 125 | }; 126 | if (hash) { 127 | connect(hash.slice(1)); 128 | $('#socket').hide(); 129 | } 130 | var connnectOnEnter = function (event) { 131 | var k = event.keyCode; 132 | if (k === 13) { 133 | connect($gameCodeInput.val()); 134 | } 135 | }; 136 | $('#connect').click(function () { 137 | connect($gameCodeInput.val()); 138 | }); 139 | $(document).bind('keyup', connnectOnEnter); 140 | }); -------------------------------------------------------------------------------- /assets_source/js/myYepnope.js: -------------------------------------------------------------------------------- 1 | $(function () { 2 | var isWebGLSupported, 3 | canvas = document.getElementById('checkwebgl'); 4 | if (!window.WebGLRenderingContext) { 5 | // Browser has no idea what WebGL is 6 | isWebGLSupported = false; 7 | } else if (canvas.getContext("webgl") || canvas.getContext("webGlCanvas") || canvas.getContext("moz-webgl") || canvas.getContext("webkit-3d") || canvas.getContext("experimental-webgl")) { 8 | // Can get context 9 | isWebGLSupported = true; 10 | } else { 11 | // Can't get context 12 | isWebGLSupported = false; 13 | } 14 | if (isWebGLSupported) { 15 | var $body = $('body'), 16 | $cc = $('.choose_control'), 17 | maxBlur = 100, 18 | steps = 4, 19 | isWebkitBlurSupported; 20 | 21 | if ($body[0].style.webkitFilter === undefined) { 22 | isWebkitBlurSupported = false; 23 | $cc.css({filter: "url('data:image/svg+xml;utf8,#blur-overlay')"}); 24 | } else { 25 | isWebkitBlurSupported = true; 26 | $body[0].style.webkitFilter = 'blur(' + maxBlur + 'px)'; 27 | } 28 | 29 | $('#loader').css({display: 'table'}); 30 | $cc.css({display: 'table'}); 31 | 32 | yepnope.loadCounter = 0; 33 | yepnope.percent = 0; 34 | yepnope.showLoading = function (n) { 35 | yepnope.percent += maxBlur/steps; 36 | yepnope.loadCounter += 1; 37 | 38 | $(".loader").animate({minWidth: Math.round(yepnope.percent)+"px"}, { 39 | duration: 1000, 40 | progress: function () { 41 | var current = parseInt($(".loader").css("minWidth"), 10) * 100/maxBlur; 42 | $("title").html(Math.floor(current) + "% " + "digital trip"); 43 | if (isWebkitBlurSupported) { 44 | $body[0].style.webkitFilter = 'blur('+ (maxBlur - current)+ 'px)'; 45 | } 46 | if (!isWebkitBlurSupported && current % 20 === 0) { 47 | $cc.css({filter: "url('data:image/svg+xml;utf8,#blur-overlay')"}); 48 | } 49 | if (current === 100) { 50 | $("title").html("digital trip"); 51 | if (!isWebkitBlurSupported && current % 20 === 0) $cc.css({filter: "url('data:image/svg+xml;utf8,#blur-overlay')"}); 52 | } 53 | }, 54 | complete: function () { 55 | if (n === steps) { 56 | DT.runApp(); 57 | } 58 | } 59 | }); 60 | }; 61 | yepnope([{ 62 | load: [ 63 | "js/vendor/three.min.js", 64 | "js/DT.min.js", 65 | "../socket.io/socket.io.js" 66 | ], 67 | callback: {} 68 | }]); 69 | } else { 70 | $('#nogame').css({display: 'table'}); 71 | } 72 | }); -------------------------------------------------------------------------------- /assets_source/js/vendor/BadTVShader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Felix Turner / www.airtight.cc / @felixturner 3 | * 4 | * Bad TV Shader 5 | * Simulates a bad TV via horizontal distortion and vertical roll 6 | * Uses Ashima WebGl Noise: https://github.com/ashima/webgl-noise 7 | * 8 | * time: steadily increasing float passed in 9 | * distortion: amount of thick distortion 10 | * distortion2: amount of fine grain distortion 11 | * speed: distortion vertical travel speed 12 | * rollSpeed: vertical roll speed 13 | * 14 | * The MIT License 15 | * 16 | * Copyright (c) 2014 Felix Turner 17 | * 18 | * Permission is hereby granted, free of charge, to any person obtaining a copy 19 | * of this software and associated documentation files (the "Software"), to deal 20 | * in the Software without restriction, including without limitation the rights 21 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 22 | * copies of the Software, and to permit persons to whom the Software is 23 | * furnished to do so, subject to the following conditions: 24 | * 25 | * The above copyright notice and this permission notice shall be included in 26 | * all copies or substantial portions of the Software. 27 | * 28 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 29 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 30 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 31 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 32 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 33 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 34 | * THE SOFTWARE. 35 | * 36 | */ 37 | 38 | THREE.BadTVShader = { 39 | uniforms: { 40 | "tDiffuse": { type: "t", value: null }, 41 | "time": { type: "f", value: 0.0 }, 42 | "distortion": { type: "f", value: 3.0 }, 43 | "distortion2": { type: "f", value: 5.0 }, 44 | "speed": { type: "f", value: 0.2 }, 45 | "rollSpeed": { type: "f", value: 0.1 }, 46 | }, 47 | 48 | vertexShader: [ 49 | "varying vec2 vUv;", 50 | "void main() {", 51 | "vUv = uv;", 52 | "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", 53 | "}" 54 | 55 | ].join("\n"), 56 | 57 | fragmentShader: [ 58 | 59 | "uniform sampler2D tDiffuse;", 60 | "uniform float time;", 61 | "uniform float distortion;", 62 | "uniform float distortion2;", 63 | "uniform float speed;", 64 | "uniform float rollSpeed;", 65 | "varying vec2 vUv;", 66 | 67 | // Start Ashima 2D Simplex Noise 68 | 69 | "vec3 mod289(vec3 x) {", 70 | " return x - floor(x * (1.0 / 289.0)) * 289.0;", 71 | "}", 72 | 73 | "vec2 mod289(vec2 x) {", 74 | " return x - floor(x * (1.0 / 289.0)) * 289.0;", 75 | "}", 76 | 77 | "vec3 permute(vec3 x) {", 78 | " return mod289(((x*34.0)+1.0)*x);", 79 | "}", 80 | 81 | "float snoise(vec2 v)", 82 | " {", 83 | " const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0", 84 | " 0.366025403784439, // 0.5*(sqrt(3.0)-1.0)", 85 | " -0.577350269189626, // -1.0 + 2.0 * C.x", 86 | " 0.024390243902439); // 1.0 / 41.0", 87 | " vec2 i = floor(v + dot(v, C.yy) );", 88 | " vec2 x0 = v - i + dot(i, C.xx);", 89 | 90 | " vec2 i1;", 91 | " i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);", 92 | " vec4 x12 = x0.xyxy + C.xxzz;", 93 | " x12.xy -= i1;", 94 | 95 | " i = mod289(i); // Avoid truncation effects in permutation", 96 | " vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 ))", 97 | " + i.x + vec3(0.0, i1.x, 1.0 ));", 98 | 99 | " vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0);", 100 | " m = m*m ;", 101 | " m = m*m ;", 102 | 103 | " vec3 x = 2.0 * fract(p * C.www) - 1.0;", 104 | " vec3 h = abs(x) - 0.5;", 105 | " vec3 ox = floor(x + 0.5);", 106 | " vec3 a0 = x - ox;", 107 | 108 | " m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h );", 109 | 110 | " vec3 g;", 111 | " g.x = a0.x * x0.x + h.x * x0.y;", 112 | " g.yz = a0.yz * x12.xz + h.yz * x12.yw;", 113 | " return 130.0 * dot(m, g);", 114 | "}", 115 | 116 | // End Ashima 2D Simplex Noise 117 | 118 | "void main() {", 119 | 120 | "vec2 p = vUv;", 121 | "float ty = time*speed;", 122 | "float yt = p.y - ty;", 123 | 124 | //smooth distortion 125 | "float offset = snoise(vec2(yt*3.0,0.0))*0.2;", 126 | // boost distortion 127 | "offset = pow( offset*distortion,3.0)/distortion;", 128 | //add fine grain distortion 129 | "offset += snoise(vec2(yt*50.0,0.0))*distortion2*0.001;", 130 | //combine distortion on X with roll on Y 131 | "gl_FragColor = texture2D(tDiffuse, vec2(fract(p.x + offset),fract(p.y-time*rollSpeed) ));", 132 | 133 | "}" 134 | 135 | ].join("\n") 136 | 137 | }; 138 | -------------------------------------------------------------------------------- /assets_source/js/vendor/BufferLoader.js: -------------------------------------------------------------------------------- 1 | function BufferLoader(context, urlList, callback) { 2 | this.context = context; 3 | this.urlList = urlList; 4 | this.onload = callback; 5 | this.bufferList = new Array(); 6 | this.loadCount = 0; 7 | } 8 | 9 | BufferLoader.prototype.loadBuffer = function(url, index) { 10 | // Load buffer asynchronously 11 | var request = new XMLHttpRequest(); 12 | request.open("GET", url, true); 13 | request.responseType = "arraybuffer"; 14 | 15 | var loader = this; 16 | 17 | request.onload = function() { 18 | // Asynchronously decode the audio file data in request.response 19 | loader.context.decodeAudioData( 20 | request.response, 21 | function(buffer) { 22 | if (!buffer) { 23 | alert('error decoding file data: ' + url); 24 | return; 25 | } 26 | loader.bufferList[index] = buffer; 27 | if (++loader.loadCount == loader.urlList.length) 28 | loader.onload(loader.bufferList); 29 | } 30 | ); 31 | } 32 | 33 | request.onerror = function() { 34 | alert('BufferLoader: XHR error'); 35 | } 36 | 37 | request.send(); 38 | } 39 | 40 | BufferLoader.prototype.load = function() { 41 | for (var i = 0; i < this.urlList.length; ++i) 42 | this.loadBuffer(this.urlList[i], i); 43 | } -------------------------------------------------------------------------------- /assets_source/js/vendor/CopyShader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author alteredq / http://alteredqualia.com/ 3 | * 4 | * Full-screen textured quad shader 5 | */ 6 | 7 | THREE.CopyShader = { 8 | 9 | uniforms: { 10 | 11 | "tDiffuse": { type: "t", value: null }, 12 | "opacity": { type: "f", value: 1.0 } 13 | 14 | }, 15 | 16 | vertexShader: [ 17 | 18 | "varying vec2 vUv;", 19 | 20 | "void main() {", 21 | 22 | "vUv = uv;", 23 | "gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );", 24 | 25 | "}" 26 | 27 | ].join("\n"), 28 | 29 | fragmentShader: [ 30 | 31 | "uniform float opacity;", 32 | 33 | "uniform sampler2D tDiffuse;", 34 | 35 | "varying vec2 vUv;", 36 | 37 | "void main() {", 38 | 39 | "vec4 texel = texture2D( tDiffuse, vUv );", 40 | "gl_FragColor = opacity * texel;", 41 | 42 | "}" 43 | 44 | ].join("\n") 45 | 46 | }; 47 | -------------------------------------------------------------------------------- /assets_source/js/vendor/CurveExtras.js: -------------------------------------------------------------------------------- 1 | /* 2 | * A bunch of parametric curves 3 | * @author zz85 4 | * 5 | * Formulas collected from various sources 6 | * http://mathworld.wolfram.com/HeartCurve.html 7 | * http://mathdl.maa.org/images/upload_library/23/stemkoski/knots/page6.html 8 | * http://en.wikipedia.org/wiki/Viviani%27s_curve 9 | * http://mathdl.maa.org/images/upload_library/23/stemkoski/knots/page4.html 10 | * http://www.mi.sanu.ac.rs/vismath/taylorapril2011/Taylor.pdf 11 | * http://prideout.net/blog/?p=44 12 | */ 13 | 14 | // Lets define some curves 15 | THREE.Curves = {}; 16 | 17 | 18 | THREE.Curves.GrannyKnot = THREE.Curve.create( function(){}, 19 | 20 | function(t) { 21 | t = 2 * Math.PI * t; 22 | 23 | var x = -0.22 * Math.cos(t) - 1.28 * Math.sin(t) - 0.44 * Math.cos(3 * t) - 0.78 * Math.sin(3 * t); 24 | var y = -0.1 * Math.cos(2 * t) - 0.27 * Math.sin(2 * t) + 0.38 * Math.cos(4 * t) + 0.46 * Math.sin(4 * t); 25 | var z = 0.7 * Math.cos(3 * t) - 0.4 * Math.sin(3 * t); 26 | return new THREE.Vector3(x, y, z).multiplyScalar(20); 27 | } 28 | ); 29 | 30 | THREE.Curves.HeartCurve = THREE.Curve.create( 31 | 32 | function(s) { 33 | 34 | this.scale = (s === undefined) ? 5 : s; 35 | 36 | }, 37 | 38 | function(t) { 39 | 40 | t *= 2 * Math.PI; 41 | 42 | var tx = 16 * Math.pow(Math.sin(t), 3); 43 | var ty = 13 * Math.cos(t) - 5 * Math.cos(2 * t) - 2 * Math.cos(3 * t) - Math.cos(4 * t), tz = 0; 44 | 45 | return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); 46 | 47 | } 48 | 49 | ); 50 | 51 | 52 | 53 | // Viviani's Curve 54 | THREE.Curves.VivianiCurve = THREE.Curve.create( 55 | 56 | function(radius) { 57 | 58 | this.radius = radius; 59 | }, 60 | 61 | function(t) { 62 | 63 | t = t * 4 * Math.PI; // Normalized to 0..1 64 | var a = this.radius / 2; 65 | var tx = a * (1 + Math.cos(t)), 66 | ty = a * Math.sin(t), 67 | tz = 2 * a * Math.sin(t / 2); 68 | 69 | return new THREE.Vector3(tx, ty, tz); 70 | 71 | } 72 | 73 | ); 74 | 75 | 76 | THREE.Curves.KnotCurve = THREE.Curve.create( 77 | 78 | function() { 79 | 80 | }, 81 | 82 | function(t) { 83 | 84 | t *= 2 * Math.PI; 85 | 86 | var R = 10; 87 | var s = 50; 88 | var tx = s * Math.sin(t), 89 | ty = Math.cos(t) * (R + s * Math.cos(t)), 90 | tz = Math.sin(t) * (R + s * Math.cos(t)); 91 | 92 | return new THREE.Vector3(tx, ty, tz); 93 | 94 | } 95 | 96 | ); 97 | 98 | THREE.Curves.HelixCurve = THREE.Curve.create( 99 | 100 | function() { 101 | 102 | }, 103 | 104 | function(t) { 105 | 106 | var a = 30; // radius 107 | var b = 150; //height 108 | var t2 = 2 * Math.PI * t * b / 30; 109 | var tx = Math.cos(t2) * a, 110 | ty = Math.sin(t2) * a, 111 | tz = b * t; 112 | 113 | return new THREE.Vector3(tx, ty, tz); 114 | 115 | } 116 | 117 | ); 118 | 119 | THREE.Curves.TrefoilKnot = THREE.Curve.create( 120 | 121 | function(s) { 122 | 123 | this.scale = (s === undefined) ? 10 : s; 124 | 125 | }, 126 | 127 | function(t) { 128 | 129 | t *= Math.PI * 2; 130 | var tx = (2 + Math.cos(3 * t)) * Math.cos(2 * t), 131 | ty = (2 + Math.cos(3 * t)) * Math.sin(2 * t), 132 | tz = Math.sin(3 * t); 133 | 134 | return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); 135 | 136 | } 137 | 138 | ); 139 | 140 | THREE.Curves.TorusKnot = THREE.Curve.create( 141 | 142 | function(s) { 143 | 144 | this.scale = (s === undefined) ? 10 : s; 145 | 146 | }, 147 | 148 | function(t) { 149 | 150 | var p = 3, 151 | q = 4; 152 | t *= Math.PI * 2; 153 | var tx = (2 + Math.cos(q * t)) * Math.cos(p * t), 154 | ty = (2 + Math.cos(q * t)) * Math.sin(p * t), 155 | tz = Math.sin(q * t); 156 | 157 | return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); 158 | 159 | } 160 | 161 | ); 162 | 163 | 164 | THREE.Curves.CinquefoilKnot = THREE.Curve.create( 165 | 166 | function(s) { 167 | 168 | this.scale = (s === undefined) ? 10 : s; 169 | 170 | }, 171 | 172 | function(t) { 173 | 174 | var p = 2, 175 | q = 5; 176 | t *= Math.PI * 2; 177 | var tx = (2 + Math.cos(q * t)) * Math.cos(p * t), 178 | ty = (2 + Math.cos(q * t)) * Math.sin(p * t), 179 | tz = Math.sin(q * t); 180 | 181 | return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); 182 | 183 | } 184 | 185 | ); 186 | 187 | 188 | THREE.Curves.TrefoilPolynomialKnot = THREE.Curve.create( 189 | 190 | function(s) { 191 | 192 | this.scale = (s === undefined) ? 10 : s; 193 | 194 | }, 195 | 196 | function(t) { 197 | 198 | t = t * 4 - 2; 199 | var tx = Math.pow(t, 3) - 3 * t, 200 | ty = Math.pow(t, 4) - 4 * t * t, 201 | tz = 1 / 5 * Math.pow(t, 5) - 2 * t; 202 | 203 | return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); 204 | 205 | } 206 | 207 | ); 208 | 209 | // var scaleTo = function(x, y) { 210 | // var r = y - x; 211 | // return function(t) { 212 | // t * r + x; 213 | // }; 214 | // } 215 | var scaleTo = function(x, y, t) { 216 | 217 | var r = y - x; 218 | return t * r + x; 219 | 220 | } 221 | 222 | THREE.Curves.FigureEightPolynomialKnot = THREE.Curve.create( 223 | 224 | function(s) { 225 | 226 | this.scale = (s === undefined) ? 1 : s; 227 | 228 | }, 229 | 230 | function(t) { 231 | 232 | t = scaleTo(-4, 4, t); 233 | var tx = 2 / 5 * t * (t * t - 7) * (t * t - 10), 234 | ty = Math.pow(t, 4) - 13 * t * t, 235 | tz = 1 / 10 * t * (t * t - 4) * (t * t - 9) * (t * t - 12); 236 | 237 | return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); 238 | 239 | } 240 | 241 | ); 242 | 243 | THREE.Curves.DecoratedTorusKnot4a = THREE.Curve.create( 244 | 245 | function(s) { 246 | 247 | this.scale = (s === undefined) ? 40 : s; 248 | 249 | }, 250 | 251 | function(t) { 252 | 253 | t *= Math.PI * 2; 254 | var 255 | x = Math.cos(2 * t) * (1 + 0.6 * (Math.cos(5 * t) + 0.75 * Math.cos(10 * t))), 256 | y = Math.sin(2 * t) * (1 + 0.6 * (Math.cos(5 * t) + 0.75 * Math.cos(10 * t))), 257 | z = 0.35 * Math.sin(5 * t); 258 | 259 | return new THREE.Vector3(x, y, z).multiplyScalar(this.scale); 260 | 261 | } 262 | 263 | ); 264 | 265 | 266 | THREE.Curves.DecoratedTorusKnot4b = THREE.Curve.create( 267 | 268 | function(s) { 269 | 270 | this.scale = (s === undefined) ? 40 : s; 271 | 272 | }, 273 | 274 | function(t) { 275 | var fi = t * Math.PI * 2; 276 | var x = Math.cos(2 * fi) * (1 + 0.45 * Math.cos(3 * fi) + 0.4 * Math.cos(9 * fi)), 277 | y = Math.sin(2 * fi) * (1 + 0.45 * Math.cos(3 * fi) + 0.4 * Math.cos(9 * fi)), 278 | z = 0.2 * Math.sin(9 * fi); 279 | 280 | return new THREE.Vector3(x, y, z).multiplyScalar(this.scale); 281 | 282 | } 283 | 284 | ); 285 | 286 | 287 | THREE.Curves.DecoratedTorusKnot5a = THREE.Curve.create( 288 | 289 | function(s) { 290 | 291 | this.scale = (s === undefined) ? 40 : s; 292 | 293 | }, 294 | 295 | function(t) { 296 | 297 | var fi = t * Math.PI * 2; 298 | var x = Math.cos(3 * fi) * (1 + 0.3 * Math.cos(5 * fi) + 0.5 * Math.cos(10 * fi)), 299 | y = Math.sin(3 * fi) * (1 + 0.3 * Math.cos(5 * fi) + 0.5 * Math.cos(10 * fi)), 300 | z = 0.2 * Math.sin(20 * fi); 301 | 302 | return new THREE.Vector3(x, y, z).multiplyScalar(this.scale); 303 | 304 | } 305 | 306 | ); 307 | 308 | THREE.Curves.DecoratedTorusKnot5c = THREE.Curve.create( 309 | 310 | function(s) { 311 | 312 | this.scale = (s === undefined) ? 40 : s; 313 | 314 | }, 315 | 316 | function(t) { 317 | 318 | var fi = t * Math.PI * 2; 319 | var x = Math.cos(4 * fi) * (1 + 0.5 * (Math.cos(5 * fi) + 0.4 * Math.cos(20 * fi))), 320 | y = Math.sin(4 * fi) * (1 + 0.5 * (Math.cos(5 * fi) + 0.4 * Math.cos(20 * fi))), 321 | z = 0.35 * Math.sin(15 * fi); 322 | 323 | return new THREE.Vector3(x, y, z).multiplyScalar(this.scale); 324 | 325 | } 326 | 327 | ); -------------------------------------------------------------------------------- /assets_source/js/vendor/Detector.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author alteredq / http://alteredqualia.com/ 3 | * @author mr.doob / http://mrdoob.com/ 4 | */ 5 | 6 | var Detector = { 7 | 8 | canvas: !! window.CanvasRenderingContext2D, 9 | webgl: ( function () { try { return !! window.WebGLRenderingContext && !! document.createElement( 'canvas' ).getContext( 'experimental-webgl' ); } catch( e ) { return false; } } )(), 10 | workers: !! window.Worker, 11 | fileapi: window.File && window.FileReader && window.FileList && window.Blob, 12 | 13 | getWebGLErrorMessage: function () { 14 | 15 | var element = document.createElement( 'div' ); 16 | element.id = 'webgl-error-message'; 17 | element.style.fontFamily = 'monospace'; 18 | element.style.fontSize = '13px'; 19 | element.style.fontWeight = 'normal'; 20 | element.style.textAlign = 'center'; 21 | element.style.background = '#fff'; 22 | element.style.color = '#000'; 23 | element.style.padding = '1.5em'; 24 | element.style.width = '400px'; 25 | element.style.margin = '5em auto 0'; 26 | 27 | if ( ! this.webgl ) { 28 | 29 | element.innerHTML = window.WebGLRenderingContext ? [ 30 | 'Your graphics card does not seem to support WebGL.
', 31 | 'Find out how to get it here.' 32 | ].join( '\n' ) : [ 33 | 'Your browser does not seem to support WebGL.
', 34 | 'Find out how to get it here.' 35 | ].join( '\n' ); 36 | 37 | } 38 | 39 | return element; 40 | 41 | }, 42 | 43 | addGetWebGLMessage: function ( parameters ) { 44 | 45 | var parent, id, element; 46 | 47 | parameters = parameters || {}; 48 | 49 | parent = parameters.parent !== undefined ? parameters.parent : document.body; 50 | id = parameters.id !== undefined ? parameters.id : 'oldie'; 51 | 52 | element = Detector.getWebGLErrorMessage(); 53 | element.id = id; 54 | 55 | parent.appendChild( element ); 56 | 57 | } 58 | 59 | }; 60 | -------------------------------------------------------------------------------- /assets_source/js/vendor/EffectComposer.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author alteredq / http://alteredqualia.com/ 3 | */ 4 | 5 | THREE.EffectComposer = function ( renderer, renderTarget ) { 6 | 7 | this.renderer = renderer; 8 | 9 | if ( renderTarget === undefined ) { 10 | 11 | var width = window.innerWidth || 1; 12 | var height = window.innerHeight || 1; 13 | var parameters = { minFilter: THREE.LinearFilter, magFilter: THREE.LinearFilter, format: THREE.RGBFormat, stencilBuffer: false }; 14 | 15 | renderTarget = new THREE.WebGLRenderTarget( width, height, parameters ); 16 | 17 | } 18 | 19 | this.renderTarget1 = renderTarget; 20 | this.renderTarget2 = renderTarget.clone(); 21 | 22 | this.writeBuffer = this.renderTarget1; 23 | this.readBuffer = this.renderTarget2; 24 | 25 | this.passes = []; 26 | 27 | if ( THREE.CopyShader === undefined ) 28 | console.error( "THREE.EffectComposer relies on THREE.CopyShader" ); 29 | 30 | this.copyPass = new THREE.ShaderPass( THREE.CopyShader ); 31 | 32 | }; 33 | 34 | THREE.EffectComposer.prototype = { 35 | 36 | swapBuffers: function() { 37 | 38 | var tmp = this.readBuffer; 39 | this.readBuffer = this.writeBuffer; 40 | this.writeBuffer = tmp; 41 | 42 | }, 43 | 44 | addPass: function ( pass ) { 45 | 46 | this.passes.push( pass ); 47 | 48 | }, 49 | 50 | insertPass: function ( pass, index ) { 51 | 52 | this.passes.splice( index, 0, pass ); 53 | 54 | }, 55 | 56 | render: function ( delta ) { 57 | 58 | this.writeBuffer = this.renderTarget1; 59 | this.readBuffer = this.renderTarget2; 60 | 61 | var maskActive = false; 62 | 63 | var pass, i, il = this.passes.length; 64 | 65 | for ( i = 0; i < il; i ++ ) { 66 | 67 | pass = this.passes[ i ]; 68 | 69 | if ( !pass.enabled ) continue; 70 | 71 | pass.render( this.renderer, this.writeBuffer, this.readBuffer, delta, maskActive ); 72 | 73 | if ( pass.needsSwap ) { 74 | 75 | if ( maskActive ) { 76 | 77 | var context = this.renderer.context; 78 | 79 | context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff ); 80 | 81 | this.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, delta ); 82 | 83 | context.stencilFunc( context.EQUAL, 1, 0xffffffff ); 84 | 85 | } 86 | 87 | this.swapBuffers(); 88 | 89 | } 90 | 91 | if ( pass instanceof THREE.MaskPass ) { 92 | 93 | maskActive = true; 94 | 95 | } else if ( pass instanceof THREE.ClearMaskPass ) { 96 | 97 | maskActive = false; 98 | 99 | } 100 | 101 | } 102 | 103 | }, 104 | 105 | reset: function ( renderTarget ) { 106 | 107 | if ( renderTarget === undefined ) { 108 | 109 | renderTarget = this.renderTarget1.clone(); 110 | 111 | renderTarget.width = window.innerWidth; 112 | renderTarget.height = window.innerHeight; 113 | 114 | } 115 | 116 | this.renderTarget1 = renderTarget; 117 | this.renderTarget2 = renderTarget.clone(); 118 | 119 | this.writeBuffer = this.renderTarget1; 120 | this.readBuffer = this.renderTarget2; 121 | 122 | }, 123 | 124 | setSize: function ( width, height ) { 125 | 126 | var renderTarget = this.renderTarget1.clone(); 127 | 128 | renderTarget.width = width; 129 | renderTarget.height = height; 130 | 131 | this.reset( renderTarget ); 132 | 133 | } 134 | 135 | }; 136 | -------------------------------------------------------------------------------- /assets_source/js/vendor/MaskPass.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author alteredq / http://alteredqualia.com/ 3 | */ 4 | 5 | THREE.MaskPass = function ( scene, camera ) { 6 | 7 | this.scene = scene; 8 | this.camera = camera; 9 | 10 | this.enabled = true; 11 | this.clear = true; 12 | this.needsSwap = false; 13 | 14 | this.inverse = false; 15 | 16 | }; 17 | 18 | THREE.MaskPass.prototype = { 19 | 20 | render: function ( renderer, writeBuffer, readBuffer, delta ) { 21 | 22 | var context = renderer.context; 23 | 24 | // don't update color or depth 25 | 26 | context.colorMask( false, false, false, false ); 27 | context.depthMask( false ); 28 | 29 | // set up stencil 30 | 31 | var writeValue, clearValue; 32 | 33 | if ( this.inverse ) { 34 | 35 | writeValue = 0; 36 | clearValue = 1; 37 | 38 | } else { 39 | 40 | writeValue = 1; 41 | clearValue = 0; 42 | 43 | } 44 | 45 | context.enable( context.STENCIL_TEST ); 46 | context.stencilOp( context.REPLACE, context.REPLACE, context.REPLACE ); 47 | context.stencilFunc( context.ALWAYS, writeValue, 0xffffffff ); 48 | context.clearStencil( clearValue ); 49 | 50 | // draw into the stencil buffer 51 | 52 | renderer.render( this.scene, this.camera, readBuffer, this.clear ); 53 | renderer.render( this.scene, this.camera, writeBuffer, this.clear ); 54 | 55 | // re-enable update of color and depth 56 | 57 | context.colorMask( true, true, true, true ); 58 | context.depthMask( true ); 59 | 60 | // only render where stencil is set to 1 61 | 62 | context.stencilFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1 63 | context.stencilOp( context.KEEP, context.KEEP, context.KEEP ); 64 | 65 | } 66 | 67 | }; 68 | 69 | 70 | THREE.ClearMaskPass = function () { 71 | 72 | this.enabled = true; 73 | 74 | }; 75 | 76 | THREE.ClearMaskPass.prototype = { 77 | 78 | render: function ( renderer, writeBuffer, readBuffer, delta ) { 79 | 80 | var context = renderer.context; 81 | 82 | context.disable( context.STENCIL_TEST ); 83 | 84 | } 85 | 86 | }; 87 | -------------------------------------------------------------------------------- /assets_source/js/vendor/OBJLoader.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author mrdoob / http://mrdoob.com/ 3 | */ 4 | 5 | THREE.OBJLoader = function ( manager ) { 6 | 7 | this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager; 8 | 9 | }; 10 | 11 | THREE.OBJLoader.prototype = { 12 | 13 | constructor: THREE.OBJLoader, 14 | 15 | load: function ( url, onLoad, onProgress, onError ) { 16 | 17 | var scope = this; 18 | 19 | var loader = new THREE.XHRLoader( scope.manager ); 20 | loader.setCrossOrigin( this.crossOrigin ); 21 | loader.load( url, function ( text ) { 22 | 23 | onLoad( scope.parse( text ) ); 24 | 25 | } ); 26 | 27 | }, 28 | 29 | parse: function ( text ) { 30 | 31 | function vector( x, y, z ) { 32 | 33 | return new THREE.Vector3( parseFloat( x ), parseFloat( y ), parseFloat( z ) ); 34 | 35 | } 36 | 37 | function uv( u, v ) { 38 | 39 | return new THREE.Vector2( parseFloat( u ), parseFloat( v ) ); 40 | 41 | } 42 | 43 | function face3( a, b, c, normals ) { 44 | 45 | return new THREE.Face3( a, b, c, normals ); 46 | 47 | } 48 | 49 | var object = new THREE.Object3D(); 50 | var geometry, material, mesh; 51 | 52 | function parseVertexIndex( index ) { 53 | 54 | index = parseInt( index ); 55 | 56 | return index >= 0 ? index - 1 : index + vertices.length; 57 | 58 | } 59 | 60 | function parseNormalIndex( index ) { 61 | 62 | index = parseInt( index ); 63 | 64 | return index >= 0 ? index - 1 : index + normals.length; 65 | 66 | } 67 | 68 | function parseUVIndex( index ) { 69 | 70 | index = parseInt( index ); 71 | 72 | return index >= 0 ? index - 1 : index + uvs.length; 73 | 74 | } 75 | 76 | function add_face( a, b, c, normals_inds ) { 77 | 78 | if ( normals_inds === undefined ) { 79 | 80 | geometry.faces.push( face3( 81 | vertices[ parseVertexIndex( a ) ] - 1, 82 | vertices[ parseVertexIndex( b ) ] - 1, 83 | vertices[ parseVertexIndex( c ) ] - 1 84 | ) ); 85 | 86 | } else { 87 | 88 | geometry.faces.push( face3( 89 | vertices[ parseVertexIndex( a ) ] - 1, 90 | vertices[ parseVertexIndex( b ) ] - 1, 91 | vertices[ parseVertexIndex( c ) ] - 1, 92 | [ 93 | normals[ parseNormalIndex( normals_inds[ 0 ] ) ].clone(), 94 | normals[ parseNormalIndex( normals_inds[ 1 ] ) ].clone(), 95 | normals[ parseNormalIndex( normals_inds[ 2 ] ) ].clone() 96 | ] 97 | ) ); 98 | 99 | } 100 | 101 | } 102 | 103 | function add_uvs( a, b, c ) { 104 | 105 | geometry.faceVertexUvs[ 0 ].push( [ 106 | uvs[ parseUVIndex( a ) ].clone(), 107 | uvs[ parseUVIndex( b ) ].clone(), 108 | uvs[ parseUVIndex( c ) ].clone() 109 | ] ); 110 | 111 | } 112 | 113 | function handle_face_line(faces, uvs, normals_inds) { 114 | 115 | if ( faces[ 3 ] === undefined ) { 116 | 117 | add_face( faces[ 0 ], faces[ 1 ], faces[ 2 ], normals_inds ); 118 | 119 | if ( uvs !== undefined && uvs.length > 0 ) { 120 | 121 | add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 2 ] ); 122 | 123 | } 124 | 125 | } else { 126 | 127 | if ( normals_inds !== undefined && normals_inds.length > 0 ) { 128 | 129 | add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ], [ normals_inds[ 0 ], normals_inds[ 1 ], normals_inds[ 3 ] ] ); 130 | add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ], [ normals_inds[ 1 ], normals_inds[ 2 ], normals_inds[ 3 ] ] ); 131 | 132 | } else { 133 | 134 | add_face( faces[ 0 ], faces[ 1 ], faces[ 3 ] ); 135 | add_face( faces[ 1 ], faces[ 2 ], faces[ 3 ] ); 136 | 137 | } 138 | 139 | if ( uvs !== undefined && uvs.length > 0 ) { 140 | 141 | add_uvs( uvs[ 0 ], uvs[ 1 ], uvs[ 3 ] ); 142 | add_uvs( uvs[ 1 ], uvs[ 2 ], uvs[ 3 ] ); 143 | 144 | } 145 | 146 | } 147 | 148 | } 149 | 150 | // create mesh if no objects in text 151 | 152 | if ( /^o /gm.test( text ) === false ) { 153 | 154 | geometry = new THREE.Geometry(); 155 | material = new THREE.MeshLambertMaterial(); 156 | mesh = new THREE.Mesh( geometry, material ); 157 | object.add( mesh ); 158 | 159 | } 160 | 161 | var vertices = []; 162 | var normals = []; 163 | var uvs = []; 164 | 165 | // v float float float 166 | 167 | var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; 168 | 169 | // vn float float float 170 | 171 | var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; 172 | 173 | // vt float float 174 | 175 | var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/; 176 | 177 | // f vertex vertex vertex ... 178 | 179 | var face_pattern1 = /f( +-?\d+)( +-?\d+)( +-?\d+)( +-?\d+)?/; 180 | 181 | // f vertex/uv vertex/uv vertex/uv ... 182 | 183 | var face_pattern2 = /f( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+))?/; 184 | 185 | // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... 186 | 187 | var face_pattern3 = /f( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))( +(-?\d+)\/(-?\d+)\/(-?\d+))?/; 188 | 189 | // f vertex//normal vertex//normal vertex//normal ... 190 | 191 | var face_pattern4 = /f( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))( +(-?\d+)\/\/(-?\d+))?/ 192 | 193 | // 194 | 195 | var lines = text.split( '\n' ); 196 | 197 | for ( var i = 0; i < lines.length; i ++ ) { 198 | 199 | var line = lines[ i ]; 200 | line = line.trim(); 201 | 202 | var result; 203 | 204 | if ( line.length === 0 || line.charAt( 0 ) === '#' ) { 205 | 206 | continue; 207 | 208 | } else if ( ( result = vertex_pattern.exec( line ) ) !== null ) { 209 | 210 | // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] 211 | 212 | vertices.push( 213 | geometry.vertices.push( 214 | vector( 215 | result[ 1 ], result[ 2 ], result[ 3 ] 216 | ) 217 | ) 218 | ); 219 | 220 | } else if ( ( result = normal_pattern.exec( line ) ) !== null ) { 221 | 222 | // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] 223 | 224 | normals.push( 225 | vector( 226 | result[ 1 ], result[ 2 ], result[ 3 ] 227 | ) 228 | ); 229 | 230 | } else if ( ( result = uv_pattern.exec( line ) ) !== null ) { 231 | 232 | // ["vt 0.1 0.2", "0.1", "0.2"] 233 | 234 | uvs.push( 235 | uv( 236 | result[ 1 ], result[ 2 ] 237 | ) 238 | ); 239 | 240 | } else if ( ( result = face_pattern1.exec( line ) ) !== null ) { 241 | 242 | // ["f 1 2 3", "1", "2", "3", undefined] 243 | 244 | handle_face_line( 245 | [ result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ] ] 246 | ); 247 | 248 | } else if ( ( result = face_pattern2.exec( line ) ) !== null ) { 249 | 250 | // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] 251 | 252 | handle_face_line( 253 | [ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces 254 | [ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //uv 255 | ); 256 | 257 | } else if ( ( result = face_pattern3.exec( line ) ) !== null ) { 258 | 259 | // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined] 260 | 261 | handle_face_line( 262 | [ result[ 2 ], result[ 6 ], result[ 10 ], result[ 14 ] ], //faces 263 | [ result[ 3 ], result[ 7 ], result[ 11 ], result[ 15 ] ], //uv 264 | [ result[ 4 ], result[ 8 ], result[ 12 ], result[ 16 ] ] //normal 265 | ); 266 | 267 | } else if ( ( result = face_pattern4.exec( line ) ) !== null ) { 268 | 269 | // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] 270 | 271 | handle_face_line( 272 | [ result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ] ], //faces 273 | [ ], //uv 274 | [ result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ] ] //normal 275 | ); 276 | 277 | } else if ( /^o /.test( line ) ) { 278 | 279 | geometry = new THREE.Geometry(); 280 | material = new THREE.MeshLambertMaterial(); 281 | 282 | mesh = new THREE.Mesh( geometry, material ); 283 | mesh.name = line.substring( 2 ).trim(); 284 | object.add( mesh ); 285 | 286 | } else if ( /^g /.test( line ) ) { 287 | 288 | // group 289 | 290 | } else if ( /^usemtl /.test( line ) ) { 291 | 292 | // material 293 | 294 | material.name = line.substring( 7 ).trim(); 295 | 296 | } else if ( /^mtllib /.test( line ) ) { 297 | 298 | // mtl file 299 | 300 | } else if ( /^s /.test( line ) ) { 301 | 302 | // smooth shading 303 | 304 | } else { 305 | 306 | // console.log( "THREE.OBJLoader: Unhandled line " + line ); 307 | 308 | } 309 | 310 | } 311 | 312 | var children = object.children; 313 | 314 | for ( var i = 0, l = children.length; i < l; i ++ ) { 315 | 316 | var geometry = children[ i ].geometry; 317 | 318 | geometry.computeFaceNormals(); 319 | geometry.computeBoundingSphere(); 320 | 321 | } 322 | 323 | return object; 324 | 325 | } 326 | 327 | }; -------------------------------------------------------------------------------- /assets_source/js/vendor/RenderPass.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author alteredq / http://alteredqualia.com/ 3 | */ 4 | 5 | THREE.RenderPass = function ( scene, camera, overrideMaterial, clearColor, clearAlpha ) { 6 | 7 | this.scene = scene; 8 | this.camera = camera; 9 | 10 | this.overrideMaterial = overrideMaterial; 11 | 12 | this.clearColor = clearColor; 13 | this.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 1; 14 | 15 | this.oldClearColor = new THREE.Color(); 16 | this.oldClearAlpha = 1; 17 | 18 | this.enabled = true; 19 | this.clear = true; 20 | this.needsSwap = false; 21 | 22 | }; 23 | 24 | THREE.RenderPass.prototype = { 25 | 26 | render: function ( renderer, writeBuffer, readBuffer, delta ) { 27 | 28 | this.scene.overrideMaterial = this.overrideMaterial; 29 | 30 | if ( this.clearColor ) { 31 | 32 | this.oldClearColor.copy( renderer.getClearColor() ); 33 | this.oldClearAlpha = renderer.getClearAlpha(); 34 | 35 | renderer.setClearColor( this.clearColor, this.clearAlpha ); 36 | 37 | } 38 | 39 | renderer.render( this.scene, this.camera, readBuffer, this.clear ); 40 | 41 | if ( this.clearColor ) { 42 | 43 | renderer.setClearColor( this.oldClearColor, this.oldClearAlpha ); 44 | 45 | } 46 | 47 | this.scene.overrideMaterial = null; 48 | 49 | } 50 | 51 | }; 52 | -------------------------------------------------------------------------------- /assets_source/js/vendor/ShaderPass.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author alteredq / http://alteredqualia.com/ 3 | */ 4 | 5 | THREE.ShaderPass = function ( shader, textureID ) { 6 | 7 | this.textureID = ( textureID !== undefined ) ? textureID : "tDiffuse"; 8 | 9 | this.uniforms = THREE.UniformsUtils.clone( shader.uniforms ); 10 | 11 | this.material = new THREE.ShaderMaterial( { 12 | 13 | uniforms: this.uniforms, 14 | vertexShader: shader.vertexShader, 15 | fragmentShader: shader.fragmentShader 16 | 17 | } ); 18 | 19 | this.renderToScreen = false; 20 | 21 | this.enabled = true; 22 | this.needsSwap = true; 23 | this.clear = false; 24 | 25 | 26 | this.camera = new THREE.OrthographicCamera( -1, 1, 1, -1, 0, 1 ); 27 | this.scene = new THREE.Scene(); 28 | 29 | this.quad = new THREE.Mesh( new THREE.PlaneGeometry( 2, 2 ), null ); 30 | this.scene.add( this.quad ); 31 | 32 | }; 33 | 34 | THREE.ShaderPass.prototype = { 35 | 36 | render: function ( renderer, writeBuffer, readBuffer, delta ) { 37 | 38 | if ( this.uniforms[ this.textureID ] ) { 39 | 40 | this.uniforms[ this.textureID ].value = readBuffer; 41 | 42 | } 43 | 44 | this.quad.material = this.material; 45 | 46 | if ( this.renderToScreen ) { 47 | 48 | renderer.render( this.scene, this.camera ); 49 | 50 | } else { 51 | 52 | renderer.render( this.scene, this.camera, writeBuffer, this.clear ); 53 | 54 | } 55 | 56 | } 57 | 58 | }; 59 | -------------------------------------------------------------------------------- /assets_source/js/vendor/Stats.js: -------------------------------------------------------------------------------- 1 | // stats.js - http://github.com/mrdoob/stats.js 2 | var Stats=function(){var l=Date.now(),m=l,g=0,n=Infinity,o=0,h=0,p=Infinity,q=0,r=0,s=0,f=document.createElement("div");f.id="stats";f.addEventListener("mousedown",function(b){b.preventDefault();t(++s%2)},!1);f.style.cssText="width:80px;opacity:0.9;cursor:pointer";var a=document.createElement("div");a.id="fps";a.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#002";f.appendChild(a);var i=document.createElement("div");i.id="fpsText";i.style.cssText="color:#0ff;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px"; 3 | i.innerHTML="FPS";a.appendChild(i);var c=document.createElement("div");c.id="fpsGraph";c.style.cssText="position:relative;width:74px;height:30px;background-color:#0ff";for(a.appendChild(c);74>c.children.length;){var j=document.createElement("span");j.style.cssText="width:1px;height:30px;float:left;background-color:#113";c.appendChild(j)}var d=document.createElement("div");d.id="ms";d.style.cssText="padding:0 0 3px 3px;text-align:left;background-color:#020;display:none";f.appendChild(d);var k=document.createElement("div"); 4 | k.id="msText";k.style.cssText="color:#0f0;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px";k.innerHTML="MS";d.appendChild(k);var e=document.createElement("div");e.id="msGraph";e.style.cssText="position:relative;width:74px;height:30px;background-color:#0f0";for(d.appendChild(e);74>e.children.length;)j=document.createElement("span"),j.style.cssText="width:1px;height:30px;float:left;background-color:#131",e.appendChild(j);var t=function(b){s=b;switch(s){case 0:a.style.display= 5 | "block";d.style.display="none";break;case 1:a.style.display="none",d.style.display="block"}};return{REVISION:11,domElement:f,setMode:t,begin:function(){l=Date.now()},end:function(){var b=Date.now();g=b-l;n=Math.min(n,g);o=Math.max(o,g);k.textContent=g+" MS ("+n+"-"+o+")";var a=Math.min(30,30-30*(g/200));e.appendChild(e.firstChild).style.height=a+"px";r++;b>m+1E3&&(h=Math.round(1E3*r/(b-m)),p=Math.min(p,h),q=Math.max(q,h),i.textContent=h+" FPS ("+p+"-"+q+")",a=Math.min(30,30-30*(h/100)),c.appendChild(c.firstChild).style.height= 6 | a+"px",m=b,r=0);return b},update:function(){l=this.end()}}}; 7 | -------------------------------------------------------------------------------- /assets_source/js/vendor/THREEx.FullScreen.js: -------------------------------------------------------------------------------- 1 | // This THREEx helper makes it easy to handle the fullscreen API 2 | // * it hides the prefix for each browser 3 | // * it hides the little discrepencies of the various vendor API 4 | // * at the time of this writing (nov 2011) it is available in 5 | // [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html), 6 | // [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and 7 | // [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API). 8 | 9 | // 10 | // # Code 11 | 12 | // 13 | 14 | /** @namespace */ 15 | var THREEx = THREEx || {}; 16 | THREEx.FullScreen = THREEx.FullScreen || {}; 17 | 18 | /** 19 | * test if it is possible to have fullscreen 20 | * 21 | * @returns {Boolean} true if fullscreen API is available, false otherwise 22 | */ 23 | THREEx.FullScreen.available = function() 24 | { 25 | return this._hasWebkitFullScreen || this._hasMozFullScreen; 26 | } 27 | 28 | /** 29 | * test if fullscreen is currently activated 30 | * 31 | * @returns {Boolean} true if fullscreen is currently activated, false otherwise 32 | */ 33 | THREEx.FullScreen.activated = function() 34 | { 35 | if( this._hasWebkitFullScreen ){ 36 | return document.webkitIsFullScreen; 37 | }else if( this._hasMozFullScreen ){ 38 | return document.mozFullScreen; 39 | }else{ 40 | console.assert(false); 41 | } 42 | } 43 | 44 | /** 45 | * Request fullscreen on a given element 46 | * @param {DomElement} element to make fullscreen. optional. default to document.body 47 | */ 48 | THREEx.FullScreen.request = function(element) 49 | { 50 | element = element || document.body; 51 | if( this._hasWebkitFullScreen ){ 52 | element.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); 53 | }else if( this._hasMozFullScreen ){ 54 | element.mozRequestFullScreen(); 55 | }else{ 56 | console.assert(false); 57 | } 58 | } 59 | 60 | /** 61 | * Cancel fullscreen 62 | */ 63 | THREEx.FullScreen.cancel = function() 64 | { 65 | if( this._hasWebkitFullScreen ){ 66 | document.webkitCancelFullScreen(); 67 | }else if( this._hasMozFullScreen ){ 68 | document.mozCancelFullScreen(); 69 | }else{ 70 | console.assert(false); 71 | } 72 | } 73 | 74 | 75 | // internal functions to know which fullscreen API implementation is available 76 | THREEx.FullScreen._hasWebkitFullScreen = 'webkitCancelFullScreen' in document ? true : false; 77 | THREEx.FullScreen._hasMozFullScreen = 'mozCancelFullScreen' in document ? true : false; 78 | 79 | /** 80 | * Bind a key to renderer screenshot 81 | */ 82 | THREEx.FullScreen.bindKey = function(opts){ 83 | opts = opts || {}; 84 | var charCode = opts.charCode || 'f'.charCodeAt(0); 85 | var dblclick = opts.dblclick !== undefined ? opts.dblclick : false; 86 | var element = opts.element 87 | 88 | var toggle = function(){ 89 | if( THREEx.FullScreen.activated() ){ 90 | THREEx.FullScreen.cancel(); 91 | }else{ 92 | THREEx.FullScreen.request(element); 93 | } 94 | } 95 | 96 | // callback to handle keypress 97 | var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }; 98 | var onKeyPress = __bind(function(event){ 99 | // return now if the KeyPress isnt for the proper charCode 100 | if( event.which !== charCode ) return; 101 | // toggle fullscreen 102 | toggle(); 103 | }, this); 104 | 105 | // listen to keypress 106 | // NOTE: for firefox it seems mandatory to listen to document directly 107 | document.addEventListener('keypress', onKeyPress, false); 108 | // listen to dblclick 109 | dblclick && document.addEventListener('dblclick', toggle, false); 110 | 111 | return { 112 | unbind : function(){ 113 | document.removeEventListener('keypress', onKeyPress, false); 114 | dblclick && document.removeEventListener('dblclick', toggle, false); 115 | } 116 | }; 117 | } 118 | -------------------------------------------------------------------------------- /assets_source/js/vendor/favico-0.3.4.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license MIT 3 | * @fileOverview Favico animations 4 | * @author Miroslav Magda, http://blog.ejci.net 5 | * @version 0.3.4 6 | */ 7 | !function(){var e=function(e){"use strict";function t(e){if(e.paused||e.ended||w)return!1;try{f.clearRect(0,0,h,s),f.drawImage(e,0,0,h,s)}catch(o){}p=setTimeout(t,k.duration,e),R.setIcon(c)}function o(e){var t=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;e=e.replace(t,function(e,t,o,n){return t+t+o+o+n+n});var o=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(e);return o?{r:parseInt(o[1],16),g:parseInt(o[2],16),b:parseInt(o[3],16)}:!1}function n(e,t){var o,n={};for(o in e)n[o]=e[o];for(o in t)n[o]=t[o];return n}function i(){return document.hidden||document.msHidden||document.webkitHidden||document.mozHidden}e=e?e:{};var r,a,s,h,c,f,l,d,u,y,g,w,m,x,p,b={bgColor:"#d00",textColor:"#fff",fontFamily:"sans-serif",fontStyle:"bold",type:"circle",position:"down",animation:"slide",elementId:!1};m={},m.ff=/firefox/i.test(navigator.userAgent.toLowerCase()),m.chrome=/chrome/i.test(navigator.userAgent.toLowerCase()),m.opera=/opera/i.test(navigator.userAgent.toLowerCase()),m.ie=/msie/i.test(navigator.userAgent.toLowerCase())||/trident/i.test(navigator.userAgent.toLowerCase()),m.supported=m.chrome||m.ff||m.opera;var v=[];g=function(){},d=w=!1;var C=function(){r=n(b,e),r.bgColor=o(r.bgColor),r.textColor=o(r.textColor),r.position=r.position.toLowerCase(),r.animation=k.types[""+r.animation]?r.animation:b.animation;var t=r.position.indexOf("up")>-1,i=r.position.indexOf("left")>-1;if(t||i)for(var d=0;d0?l.height:32,h=l.width>0?l.width:32,c.height=s,c.width=h,f=c.getContext("2d"),M.ready()}):(l.setAttribute("src",""),s=32,h=32,l.height=s,l.width=h,c.height=s,c.width=h,f=c.getContext("2d"),M.ready())}catch(y){throw"Error initializing favico. Message: "+y.message}},M={};M.ready=function(){d=!0,M.reset(),g()},M.reset=function(){d&&(v=[],u=!1,f.clearRect(0,0,h,s),f.drawImage(l,0,0,h,s),R.setIcon(c),window.clearTimeout(x),window.clearTimeout(p))},M.start=function(){if(d&&!y){var e=function(){u=v[0],y=!1,v.length>0&&(v.shift(),M.start())};if(v.length>0){y=!0;var t=function(){["type","animation","bgColor","textColor","fontFamily","fontStyle"].forEach(function(e){e in v[0].options&&(r[e]=v[0].options[e])}),k.run(v[0].options,function(){e()},!1)};u?k.run(u.options,function(){t()},!0):t()}}};var I={},A=function(e){return e.n="number"==typeof e.n?Math.abs(0|e.n):e.n,e.x=h*e.x,e.y=s*e.y,e.w=h*e.w,e.h=s*e.h,e.len=(""+e.n).length,e};I.circle=function(e){e=A(e);var t=!1;2===e.len?(e.x=e.x-.4*e.w,e.w=1.4*e.w,t=!0):e.len>=3&&(e.x=e.x-.65*e.w,e.w=1.65*e.w,t=!0),f.clearRect(0,0,h,s),f.drawImage(l,0,0,h,s),f.beginPath(),f.font=r.fontStyle+" "+Math.floor(e.h*(e.n>99?.85:1))+"px "+r.fontFamily,f.textAlign="center",t?(f.moveTo(e.x+e.w/2,e.y),f.lineTo(e.x+e.w-e.h/2,e.y),f.quadraticCurveTo(e.x+e.w,e.y,e.x+e.w,e.y+e.h/2),f.lineTo(e.x+e.w,e.y+e.h-e.h/2),f.quadraticCurveTo(e.x+e.w,e.y+e.h,e.x+e.w-e.h/2,e.y+e.h),f.lineTo(e.x+e.h/2,e.y+e.h),f.quadraticCurveTo(e.x,e.y+e.h,e.x,e.y+e.h-e.h/2),f.lineTo(e.x,e.y+e.h/2),f.quadraticCurveTo(e.x,e.y,e.x+e.h/2,e.y)):f.arc(e.x+e.w/2,e.y+e.h/2,e.h/2,0,2*Math.PI),f.fillStyle="rgba("+r.bgColor.r+","+r.bgColor.g+","+r.bgColor.b+","+e.o+")",f.fill(),f.closePath(),f.beginPath(),f.stroke(),f.fillStyle="rgba("+r.textColor.r+","+r.textColor.g+","+r.textColor.b+","+e.o+")","number"==typeof e.n&&e.n>999?f.fillText((e.n>9999?9:Math.floor(e.n/1e3))+"k+",Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.2*e.h)):f.fillText(e.n,Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.15*e.h)),f.closePath()},I.rectangle=function(e){e=A(e);var t=!1;2===e.len?(e.x=e.x-.4*e.w,e.w=1.4*e.w,t=!0):e.len>=3&&(e.x=e.x-.65*e.w,e.w=1.65*e.w,t=!0),f.clearRect(0,0,h,s),f.drawImage(l,0,0,h,s),f.beginPath(),f.font="bold "+Math.floor(e.h*(e.n>99?.9:1))+"px sans-serif",f.textAlign="center",f.fillStyle="rgba("+r.bgColor.r+","+r.bgColor.g+","+r.bgColor.b+","+e.o+")",f.fillRect(e.x,e.y,e.w,e.h),f.fillStyle="rgba("+r.textColor.r+","+r.textColor.g+","+r.textColor.b+","+e.o+")","number"==typeof e.n&&e.len>3?f.fillText((e.n>9999?9:Math.floor(e.n/1e3))+"k+",Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.2*e.h)):f.fillText(e.n,Math.floor(e.x+e.w/2),Math.floor(e.y+e.h-.15*e.h)),f.closePath()};var E=function(e,t){t=("string"==typeof t?{animation:t}:t)||{},g=function(){try{if("number"==typeof e?e>0:""!==e){var n={type:"badge",options:{n:e}};if("animation"in t&&k.types[""+t.animation]&&(n.options.animation=""+t.animation),"type"in t&&I[""+t.type]&&(n.options.type=""+t.type),["bgColor","textColor"].forEach(function(e){e in t&&(n.options[e]=o(t[e]))}),["fontStyle","fontFamily"].forEach(function(e){e in t&&(n.options[e]=t[e])}),v.push(n),v.length>100)throw"Too many badges requests in queue.";M.start()}else M.reset()}catch(i){throw"Error setting badge. Message: "+i.message}},d&&g()},T=function(e){g=function(){try{var t=e.width,o=e.height,n=document.createElement("img"),i=o/s>t/h?t/h:o/s;n.setAttribute("src",e.getAttribute("src")),n.height=o/i,n.width=t/i,f.clearRect(0,0,h,s),f.drawImage(n,0,0,h,s),R.setIcon(c)}catch(r){throw"Error setting image. Message: "+r.message}},d&&g()},L=function(e){g=function(){try{if("stop"===e)return w=!0,M.reset(),void(w=!1);e.addEventListener("play",function(){t(this)},!1)}catch(o){throw"Error setting video. Message: "+o.message}},d&&g()},U=function(e){if(window.URL&&window.URL.createObjectURL||(window.URL=window.URL||{},window.URL.createObjectURL=function(e){return e}),m.supported){var o=!1;navigator.getUserMedia=navigator.getUserMedia||navigator.oGetUserMedia||navigator.msGetUserMedia||navigator.mozGetUserMedia||navigator.webkitGetUserMedia,g=function(){try{if("stop"===e)return w=!0,M.reset(),void(w=!1);o=document.createElement("video"),o.width=h,o.height=s,navigator.getUserMedia({video:!0,audio:!1},function(e){o.src=URL.createObjectURL(e),o.play(),t(o)},function(){})}catch(n){throw"Error setting webcam. Message: "+n.message}},d&&g()}},R={};R.getIcon=function(){var e=!1,t="",o=function(){for(var e=document.getElementsByTagName("head")[0].getElementsByTagName("link"),t=e.length,o=t-1;o>=0;o--)if(/(^|\s)icon(\s|$)/i.test(e[o].getAttribute("rel")))return e[o];return!1};if(r.elementId?(e=document.getElementById(r.elementId),e.setAttribute("href",e.getAttribute("src"))):(e=o(),e===!1&&(e=document.createElement("link"),e.setAttribute("rel","icon"),document.getElementsByTagName("head")[0].appendChild(e))),t=r.elementId?e.src:e.href,-1===t.indexOf(document.location.hostname))throw new Error("Error setting favicon. Favicon image is on different domain (Icon: "+t+", Domain: "+document.location.hostname+")");return e.setAttribute("type","image/png"),e},R.setIcon=function(e){var t=e.toDataURL("image/png");if(r.elementId)document.getElementById(r.elementId).setAttribute("src",t);else if(m.ff||m.opera){var o=a;a=document.createElement("link"),m.opera&&a.setAttribute("rel","icon"),a.setAttribute("rel","icon"),a.setAttribute("type","image/png"),document.getElementsByTagName("head")[0].appendChild(a),a.setAttribute("href",t),o.parentNode&&o.parentNode.removeChild(o)}else a.setAttribute("href",t)};var k={};return k.duration=40,k.types={},k.types.fade=[{x:.4,y:.4,w:.6,h:.6,o:0},{x:.4,y:.4,w:.6,h:.6,o:.1},{x:.4,y:.4,w:.6,h:.6,o:.2},{x:.4,y:.4,w:.6,h:.6,o:.3},{x:.4,y:.4,w:.6,h:.6,o:.4},{x:.4,y:.4,w:.6,h:.6,o:.5},{x:.4,y:.4,w:.6,h:.6,o:.6},{x:.4,y:.4,w:.6,h:.6,o:.7},{x:.4,y:.4,w:.6,h:.6,o:.8},{x:.4,y:.4,w:.6,h:.6,o:.9},{x:.4,y:.4,w:.6,h:.6,o:1}],k.types.none=[{x:.4,y:.4,w:.6,h:.6,o:1}],k.types.pop=[{x:1,y:1,w:0,h:0,o:1},{x:.9,y:.9,w:.1,h:.1,o:1},{x:.8,y:.8,w:.2,h:.2,o:1},{x:.7,y:.7,w:.3,h:.3,o:1},{x:.6,y:.6,w:.4,h:.4,o:1},{x:.5,y:.5,w:.5,h:.5,o:1},{x:.4,y:.4,w:.6,h:.6,o:1}],k.types.popFade=[{x:.75,y:.75,w:0,h:0,o:0},{x:.65,y:.65,w:.1,h:.1,o:.2},{x:.6,y:.6,w:.2,h:.2,o:.4},{x:.55,y:.55,w:.3,h:.3,o:.6},{x:.5,y:.5,w:.4,h:.4,o:.8},{x:.45,y:.45,w:.5,h:.5,o:.9},{x:.4,y:.4,w:.6,h:.6,o:1}],k.types.slide=[{x:.4,y:1,w:.6,h:.6,o:1},{x:.4,y:.9,w:.6,h:.6,o:1},{x:.4,y:.9,w:.6,h:.6,o:1},{x:.4,y:.8,w:.6,h:.6,o:1},{x:.4,y:.7,w:.6,h:.6,o:1},{x:.4,y:.6,w:.6,h:.6,o:1},{x:.4,y:.5,w:.6,h:.6,o:1},{x:.4,y:.4,w:.6,h:.6,o:1}],k.run=function(e,t,o,a){var s=k.types[i()?"none":r.animation];return a=o===!0?"undefined"!=typeof a?a:s.length-1:"undefined"!=typeof a?a:0,t=t?t:function(){},a=0?(I[r.type](n(e,s[a])),x=setTimeout(function(){o?a-=1:a+=1,k.run(e,t,o,a)},k.duration),R.setIcon(c),void 0):void t()},C(),{badge:E,video:L,image:T,webcam:U,reset:M.reset}};"undefined"!=typeof define&&define.amd?define([],function(){return e}):"undefined"!=typeof module&&module.exports?module.exports=e:this.Favico=e}(); -------------------------------------------------------------------------------- /assets_source/js/vendor/jquery.qrcode.min.js: -------------------------------------------------------------------------------- 1 | (function(r){r.fn.qrcode=function(h){var s;function u(a){this.mode=s;this.data=a}function o(a,c){this.typeNumber=a;this.errorCorrectLevel=c;this.modules=null;this.moduleCount=0;this.dataCache=null;this.dataList=[]}function q(a,c){if(void 0==a.length)throw Error(a.length+"/"+c);for(var d=0;da||this.moduleCount<=a||0>c||this.moduleCount<=c)throw Error(a+","+c);return this.modules[a][c]},getModuleCount:function(){return this.moduleCount},make:function(){if(1>this.typeNumber){for(var a=1,a=1;40>a;a++){for(var c=p.getRSBlocks(a,this.errorCorrectLevel),d=new t,b=0,e=0;e=d;d++)if(!(-1>=a+d||this.moduleCount<=a+d))for(var b=-1;7>=b;b++)-1>=c+b||this.moduleCount<=c+b||(this.modules[a+d][c+b]= 5 | 0<=d&&6>=d&&(0==b||6==b)||0<=b&&6>=b&&(0==d||6==d)||2<=d&&4>=d&&2<=b&&4>=b?!0:!1)},getBestMaskPattern:function(){for(var a=0,c=0,d=0;8>d;d++){this.makeImpl(!0,d);var b=j.getLostPoint(this);if(0==d||a>b)a=b,c=d}return c},createMovieClip:function(a,c,d){a=a.createEmptyMovieClip(c,d);this.make();for(c=0;c=f;f++)for(var i=-2;2>=i;i++)this.modules[b+f][e+i]=-2==f||2==f||-2==i||2==i||0==f&&0==i?!0:!1}},setupTypeNumber:function(a){for(var c= 7 | j.getBCHTypeNumber(this.typeNumber),d=0;18>d;d++){var b=!a&&1==(c>>d&1);this.modules[Math.floor(d/3)][d%3+this.moduleCount-8-3]=b}for(d=0;18>d;d++)b=!a&&1==(c>>d&1),this.modules[d%3+this.moduleCount-8-3][Math.floor(d/3)]=b},setupTypeInfo:function(a,c){for(var d=j.getBCHTypeInfo(this.errorCorrectLevel<<3|c),b=0;15>b;b++){var e=!a&&1==(d>>b&1);6>b?this.modules[b][8]=e:8>b?this.modules[b+1][8]=e:this.modules[this.moduleCount-15+b][8]=e}for(b=0;15>b;b++)e=!a&&1==(d>>b&1),8>b?this.modules[8][this.moduleCount- 8 | b-1]=e:9>b?this.modules[8][15-b-1+1]=e:this.modules[8][15-b-1]=e;this.modules[this.moduleCount-8][8]=!a},mapData:function(a,c){for(var d=-1,b=this.moduleCount-1,e=7,f=0,i=this.moduleCount-1;0g;g++)if(null==this.modules[b][i-g]){var n=!1;f>>e&1));j.getMask(c,b,i-g)&&(n=!n);this.modules[b][i-g]=n;e--; -1==e&&(f++,e=7)}b+=d;if(0>b||this.moduleCount<=b){b-=d;d=-d;break}}}};o.PAD0=236;o.PAD1=17;o.createData=function(a,c,d){for(var c=p.getRSBlocks(a, 9 | c),b=new t,e=0;e8*a)throw Error("code length overflow. ("+b.getLengthInBits()+">"+8*a+")");for(b.getLengthInBits()+4<=8*a&&b.put(0,4);0!=b.getLengthInBits()%8;)b.putBit(!1);for(;!(b.getLengthInBits()>=8*a);){b.put(o.PAD0,8);if(b.getLengthInBits()>=8*a)break;b.put(o.PAD1,8)}return o.createBytes(b,c)};o.createBytes=function(a,c){for(var d= 10 | 0,b=0,e=0,f=Array(c.length),i=Array(c.length),g=0;g>>=1;return c},getPatternPosition:function(a){return j.PATTERN_POSITION_TABLE[a-1]},getMask:function(a,c,d){switch(a){case 0:return 0==(c+d)%2;case 1:return 0==c%2;case 2:return 0==d%3;case 3:return 0==(c+d)%3;case 4:return 0==(Math.floor(c/2)+Math.floor(d/3))%2;case 5:return 0==c*d%2+c*d%3;case 6:return 0==(c*d%2+c*d%3)%2;case 7:return 0==(c*d%3+(c+d)%2)%2;default:throw Error("bad maskPattern:"+ 14 | a);}},getErrorCorrectPolynomial:function(a){for(var c=new q([1],0),d=0;dc)switch(a){case 1:return 10;case 2:return 9;case s:return 8;case 8:return 8;default:throw Error("mode:"+a);}else if(27>c)switch(a){case 1:return 12;case 2:return 11;case s:return 16;case 8:return 10;default:throw Error("mode:"+a);}else if(41>c)switch(a){case 1:return 14;case 2:return 13;case s:return 16;case 8:return 12;default:throw Error("mode:"+ 15 | a);}else throw Error("type:"+c);},getLostPoint:function(a){for(var c=a.getModuleCount(),d=0,b=0;b=g;g++)if(!(0>b+g||c<=b+g))for(var h=-1;1>=h;h++)0>e+h||c<=e+h||0==g&&0==h||i==a.isDark(b+g,e+h)&&f++;5a)throw Error("glog("+a+")");return l.LOG_TABLE[a]},gexp:function(a){for(;0>a;)a+=255;for(;256<=a;)a-=255;return l.EXP_TABLE[a]},EXP_TABLE:Array(256), 17 | LOG_TABLE:Array(256)},m=0;8>m;m++)l.EXP_TABLE[m]=1<m;m++)l.EXP_TABLE[m]=l.EXP_TABLE[m-4]^l.EXP_TABLE[m-5]^l.EXP_TABLE[m-6]^l.EXP_TABLE[m-8];for(m=0;255>m;m++)l.LOG_TABLE[l.EXP_TABLE[m]]=m;q.prototype={get:function(a){return this.num[a]},getLength:function(){return this.num.length},multiply:function(a){for(var c=Array(this.getLength()+a.getLength()-1),d=0;d 18 | this.getLength()-a.getLength())return this;for(var c=l.glog(this.get(0))-l.glog(a.get(0)),d=Array(this.getLength()),b=0;b>>7-a%8&1)},put:function(a,c){for(var d=0;d>>c-d-1&1))},getLengthInBits:function(){return this.length},putBit:function(a){var c=Math.floor(this.length/8);this.buffer.length<=c&&this.buffer.push(0);a&&(this.buffer[c]|=128>>>this.length%8);this.length++}};"string"===typeof h&&(h={text:h});h=r.extend({},{render:"canvas",width:256,height:256,typeNumber:-1, 26 | correctLevel:2,background:"#ffffff",foreground:"#000000"},h);return this.each(function(){var a;if("canvas"==h.render){a=new o(h.typeNumber,h.correctLevel);a.addData(h.text);a.make();var c=document.createElement("canvas");c.width=h.width;c.height=h.height;for(var d=c.getContext("2d"),b=h.width/a.getModuleCount(),e=h.height/a.getModuleCount(),f=0;f").css("width",h.width+"px").css("height",h.height+"px").css("border","0px").css("border-collapse","collapse").css("background-color",h.background);d=h.width/a.getModuleCount();b=h.height/a.getModuleCount();for(e=0;e").css("height",b+"px").appendTo(c);for(i=0;i").css("width", 28 | d+"px").css("background-color",a.isDark(e,i)?h.foreground:h.background).appendTo(f)}}a=c;jQuery(a).appendTo(this)})}})(jQuery); 29 | -------------------------------------------------------------------------------- /assets_source/js/vendor/threex.rendererstats.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @author mrdoob / http://mrdoob.com/ 3 | * @author jetienne / http://jetienne.com/ 4 | */ 5 | /** @namespace */ 6 | var THREEx = THREEx || {} 7 | 8 | /** 9 | * provide info on THREE.WebGLRenderer 10 | * 11 | * @param {Object} renderer the renderer to update 12 | * @param {Object} Camera the camera to update 13 | */ 14 | THREEx.RendererStats = function (){ 15 | 16 | var msMin = 100; 17 | var msMax = 0; 18 | 19 | var container = document.createElement( 'div' ); 20 | container.style.cssText = 'width:80px;opacity:0.9;cursor:pointer'; 21 | 22 | var msDiv = document.createElement( 'div' ); 23 | msDiv.style.cssText = 'padding:0 0 3px 3px;text-align:left;background-color:#200;'; 24 | container.appendChild( msDiv ); 25 | 26 | var msText = document.createElement( 'div' ); 27 | msText.style.cssText = 'color:#f00;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px'; 28 | msText.innerHTML= 'WebGLRenderer'; 29 | msDiv.appendChild( msText ); 30 | 31 | var msTexts = []; 32 | var nLines = 9; 33 | for(var i = 0; i < nLines; i++){ 34 | msTexts[i] = document.createElement( 'div' ); 35 | msTexts[i].style.cssText = 'color:#f00;background-color:#311;font-family:Helvetica,Arial,sans-serif;font-size:9px;font-weight:bold;line-height:15px'; 36 | msDiv.appendChild( msTexts[i] ); 37 | msTexts[i].innerHTML= '-'; 38 | } 39 | 40 | 41 | var lastTime = Date.now(); 42 | return { 43 | domElement: container, 44 | 45 | update: function(webGLRenderer){ 46 | // sanity check 47 | console.assert(webGLRenderer instanceof THREE.WebGLRenderer) 48 | 49 | // refresh only 30time per second 50 | if( Date.now() - lastTime < 1000/30 ) return; 51 | lastTime = Date.now() 52 | 53 | var i = 0; 54 | msTexts[i++].textContent = "== Memory ====="; 55 | msTexts[i++].textContent = "Programs: " + webGLRenderer.info.memory.programs; 56 | msTexts[i++].textContent = "Geometries: "+webGLRenderer.info.memory.geometries; 57 | msTexts[i++].textContent = "Textures: " + webGLRenderer.info.memory.textures; 58 | 59 | msTexts[i++].textContent = "== Render ====="; 60 | msTexts[i++].textContent = "Calls: " + webGLRenderer.info.render.calls; 61 | msTexts[i++].textContent = "Vertices: " + webGLRenderer.info.render.vertices; 62 | msTexts[i++].textContent = "Faces: " + webGLRenderer.info.render.faces; 63 | msTexts[i++].textContent = "Points: " + webGLRenderer.info.render.points; 64 | } 65 | } 66 | }; -------------------------------------------------------------------------------- /assets_source/js/vendor/threex.windowresize.js: -------------------------------------------------------------------------------- 1 | // This THREEx helper makes it easy to handle window resize. 2 | // It will update renderer and camera when window is resized. 3 | // 4 | // # Usage 5 | // 6 | // **Step 1**: Start updating renderer and camera 7 | // 8 | // ```var windowResize = new THREEx.WindowResize(aRenderer, aCamera)``` 9 | // 10 | // **Step 2**: stop updating renderer and camera 11 | // 12 | // ```windowResize.destroy()``` 13 | // # Code 14 | 15 | // 16 | 17 | /** @namespace */ 18 | var THREEx = THREEx || {} 19 | 20 | /** 21 | * Update renderer and camera when the window is resized 22 | * 23 | * @param {Object} renderer the renderer to update 24 | * @param {Object} Camera the camera to update 25 | */ 26 | THREEx.WindowResize = function(renderer, camera){ 27 | var callback = function(){ 28 | // notify the renderer of the size change 29 | renderer.setSize( window.innerWidth, window.innerHeight ) 30 | // update the camera 31 | camera.aspect = window.innerWidth / window.innerHeight 32 | camera.updateProjectionMatrix() 33 | } 34 | // bind the resize event 35 | window.addEventListener('resize', callback, false) 36 | // return .stop() the function to stop watching window resize 37 | return { 38 | trigger : function(){ 39 | callback() 40 | }, 41 | /** 42 | * Stop watching window resize 43 | */ 44 | destroy : function(){ 45 | window.removeEventListener('resize', callback) 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /assets_source/js/vendor/yepnope.1.5.4-min.js: -------------------------------------------------------------------------------- 1 | /*yepnope1.5.x|WTFPL*/ 2 | (function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f#blur-overlay'); 94 | background-color: #000; 95 | z-index: 1; 96 | } 97 | 98 | .change_controls { 99 | width: 250px; 100 | height: 36px; 101 | background-color: #fd5439; 102 | position: relative; 103 | left: 50%; 104 | margin-left: -125px; 105 | padding-top: 15px; 106 | font-size: 18px; 107 | letter-spacing: 0.1em; 108 | cursor: pointer; 109 | z-index: 10; 110 | -webkit-transition: background-color 0.4s ease-out 0; 111 | -moz-transition: background-color 0.4s ease-out 0; 112 | -o-transition: background-color 0.4s ease-out 0; 113 | transition: background-color 0.4s ease-out 0; 114 | // -webkit-transition: color 0.4s ease-out 0; 115 | // -moz-transition: color 0.4s ease-out 0; 116 | // -o-transition: color 0.4s ease-out 0; 117 | // transition: color 0.4s ease-out 0; 118 | &:hover { 119 | color: #000; 120 | background-color: #fff; 121 | -webkit-transition: background-color 0.4s ease-out 0; 122 | -moz-transition: background-color 0.4s ease-out 0; 123 | -o-transition: background-color 0.4s ease-out 0; 124 | transition: background-color 0.4s ease-out 0; 125 | // -webkit-transition: color 0.4s ease-out 0; 126 | // -moz-transition: color 0.4s ease-out 0; 127 | // -o-transition: color 0.4s ease-out 0; 128 | // transition: color 0.4s ease-out 0; 129 | } 130 | } 131 | 132 | .social { 133 | width: 280px; 134 | height: 52px; 135 | position: relative; 136 | left: 50%; 137 | margin-left: -140px; 138 | > a:first-child div { 139 | background: #4e68b2 url(../img/fbw.png) 50% 50% no-repeat; 140 | &:hover { 141 | background-image: url(../img/fbb.png); 142 | } 143 | } 144 | > a:nth-child(2) div { 145 | background: #4195de url(../img/tww.png) 50% 50% no-repeat; 146 | &:hover { 147 | background-image: url(../img/twb.png); 148 | } 149 | } 150 | > a:nth-child(3) div { 151 | background: #38658f url(../img/vkw.png) 50% 50% no-repeat; 152 | &:hover { 153 | background-image: url(../img/vkb.png); 154 | } 155 | } 156 | > a:last-child div { 157 | margin: 0; 158 | background: #ce2f1c url(../img/gpw.png) 50% 50% no-repeat; 159 | &:hover { 160 | background-image: url(../img/gpb.png); 161 | } 162 | } 163 | > a div { 164 | width: 52px; 165 | height: 100%; 166 | float: left; 167 | margin-right: 24px; 168 | cursor: pointer; 169 | -webkit-transition: background-color 0.4s ease-out 0; 170 | -moz-transition: background-color 0.4s ease-out 0; 171 | -o-transition: background-color 0.4s ease-out 0; 172 | transition: background-color 0.4s ease-out 0; 173 | &:hover { 174 | color: #000; 175 | background-color: #fff; 176 | -webkit-transition: background-color 0.4s ease-out 0; 177 | -moz-transition: background-color 0.4s ease-out 0; 178 | -o-transition: background-color 0.4s ease-out 0; 179 | transition: background-color 0.4s ease-out 0; 180 | } 181 | } 182 | } 183 | 184 | .pause_control { 185 | width: 280px; 186 | height: 37px; 187 | margin-left: -140px; 188 | background-color: #222; 189 | color: #fff; 190 | -webkit-transition: background-color 0.4s ease-out 0; 191 | -moz-transition: background-color 0.4s ease-out 0; 192 | -o-transition: background-color 0.4s ease-out 0; 193 | transition: background-color 0.4s ease-out 0; 194 | // -webkit-transition: color 0.4s ease-out 0; 195 | // -moz-transition: color 0.4s ease-out 0; 196 | // -o-transition: color 0.4s ease-out 0; 197 | // transition: color 0.4s ease-out 0; 198 | &:hover { 199 | color: #000; 200 | background-color: #fff; 201 | -webkit-transition: background-color 0.4s ease-out 0; 202 | -moz-transition: background-color 0.4s ease-out 0; 203 | -o-transition: background-color 0.4s ease-out 0; 204 | transition: background-color 0.4s ease-out 0; 205 | // -webkit-transition: color 0.4s ease-out 0; 206 | // -moz-transition: color 0.4s ease-out 0; 207 | // -o-transition: color 0.4s ease-out 0; 208 | // transition: color 0.4s ease-out 0; 209 | } 210 | } 211 | .gameover_control { 212 | background-color: #272727; 213 | display: inline-block; 214 | position: static; 215 | margin-right: 4px; 216 | margin-top: 50px; 217 | margin-left: 0; 218 | -webkit-transition: background-color 0.4s ease-out 0; 219 | -moz-transition: background-color 0.4s ease-out 0; 220 | -o-transition: background-color 0.4s ease-out 0; 221 | transition: background-color 0.4s ease-out 0; 222 | // -webkit-transition: color 0.4s ease-out 0; 223 | // -moz-transition: color 0.4s ease-out 0; 224 | // -o-transition: color 0.4s ease-out 0; 225 | // transition: color 0.4s ease-out 0; 226 | &:hover { 227 | color: #000; 228 | background-color: #fff; 229 | -webkit-transition: background-color 0.4s ease-out 0; 230 | -moz-transition: background-color 0.4s ease-out 0; 231 | -o-transition: background-color 0.4s ease-out 0; 232 | transition: background-color 0.4s ease-out 0; 233 | // -webkit-transition: color 0.4s ease-out 0; 234 | // -moz-transition: color 0.4s ease-out 0; 235 | // -o-transition: color 0.4s ease-out 0; 236 | // transition: color 0.4s ease-out 0; 237 | } 238 | } 239 | .resume { 240 | width: 280px; 241 | height: 37px; 242 | background-color: #fd5439; 243 | color: #000000; 244 | position: relative; 245 | left: 50%; 246 | margin-left: -140px; 247 | padding-top: 15px; 248 | font-size: 18px; 249 | letter-spacing: 0.1em; 250 | cursor: pointer; 251 | z-index: 10; 252 | margin-bottom: 7px; 253 | margin-top: 38px; 254 | -webkit-transition: background-color 0.4s ease-out 0; 255 | -moz-transition: background-color 0.4s ease-out 0; 256 | -o-transition: background-color 0.4s ease-out 0; 257 | transition: background-color 0.4s ease-out 0; 258 | // -webkit-transition: color 0.4s ease-out 0; 259 | // -moz-transition: color 0.4s ease-out 0; 260 | // -o-transition: color 0.4s ease-out 0; 261 | // transition: color 0.4s ease-out 0; 262 | &:hover { 263 | color: #000; 264 | background-color: #fff; 265 | -webkit-transition: background-color 0.4s ease-out 0; 266 | -moz-transition: background-color 0.4s ease-out 0; 267 | -o-transition: background-color 0.4s ease-out 0; 268 | transition: background-color 0.4s ease-out 0; 269 | // -webkit-transition: color 0.4s ease-out 0; 270 | // -moz-transition: color 0.4s ease-out 0; 271 | // -o-transition: color 0.4s ease-out 0; 272 | // transition: color 0.4s ease-out 0; 273 | } 274 | } 275 | 276 | .back { 277 | position: absolute; 278 | left: 0; 279 | top: 0; 280 | // background-color: #fff; 281 | width: 100%; 282 | height: 100%; 283 | z-index: -1; 284 | } 285 | 286 | .restart { 287 | width: 188px; 288 | height: 36px; 289 | background-color: #272727; 290 | padding-top: 15px; 291 | font-size: 18px; 292 | letter-spacing: 0.1em; 293 | cursor: pointer; 294 | z-index: 10; 295 | display: inline-block; 296 | -webkit-transition: background-color 0.4s ease-out 0; 297 | -moz-transition: background-color 0.4s ease-out 0; 298 | -o-transition: background-color 0.4s ease-out 0; 299 | transition: background-color 0.4s ease-out 0; 300 | // -webkit-transition: color 0.4s ease-out 0; 301 | // -moz-transition: color 0.4s ease-out 0; 302 | // -o-transition: color 0.4s ease-out 0; 303 | // transition: color 0.4s ease-out 0; 304 | &:hover { 305 | color: #000; 306 | background-color: #fff; 307 | -webkit-transition: background-color 0.4s ease-out 0; 308 | -moz-transition: background-color 0.4s ease-out 0; 309 | -o-transition: background-color 0.4s ease-out 0; 310 | transition: background-color 0.4s ease-out 0; 311 | // -webkit-transition: color 0.4s ease-out 0; 312 | // -moz-transition: color 0.4s ease-out 0; 313 | // -o-transition: color 0.4s ease-out 0; 314 | // transition: color 0.4s ease-out 0; 315 | } 316 | } 317 | 318 | .bigfont { 319 | font-size: 3em; 320 | } 321 | 322 | .block { 323 | display: block; 324 | } 325 | 326 | .gameTimer { 327 | position: absolute; 328 | opacity: 0.5; 329 | left: 170px; 330 | top: 5px; 331 | font-size: 32px; 332 | z-index: 4; 333 | } 334 | 335 | #loader { 336 | // display: none; 337 | // background-color: rgba(0,0,0,0.8); 338 | z-index: 5; 339 | } 340 | 341 | #nogame { 342 | display: none; 343 | z-index: 4; 344 | background-color: #fafafa; 345 | background: #fafafa url(../img/nogame.jpg) 0 0 no-repeat; 346 | background-size: cover; 347 | overflow: hidden; 348 | >.cont { 349 | 350 | >img { 351 | position: absolute; 352 | top: 50%; 353 | left: 50%; 354 | margin-left: -765px; 355 | margin-top: -498px; 356 | // width: 100%; 357 | // height: inherit; 358 | z-index: -1; 359 | } 360 | >.nogame1 { 361 | color: #fafafa; 362 | font-size: 60px; 363 | letter-spacing: 0.08em; 364 | } 365 | >.nogame2 { 366 | padding-top: 200px; 367 | color: #fafafa; 368 | font-size: 18px; 369 | letter-spacing: 0.1em; 370 | >a { 371 | color: #fd5439; 372 | text-decoration: none; 373 | &:hover { 374 | text-decoration: underline; 375 | } 376 | } 377 | } 378 | } 379 | } 380 | 381 | .startGame { 382 | } 383 | 384 | .loader span { 385 | color: #fff; 386 | font-size: 5em; 387 | z-index: 3; 388 | } 389 | #interface { 390 | display: none; 391 | } 392 | #footer { 393 | display: none; 394 | position: absolute; 395 | bottom: 0; 396 | left: 0; 397 | background-color: rgba(0,0,0,0.5); 398 | width: 100%; 399 | height: 84px; 400 | z-index: 5; 401 | >span { 402 | font-size: 12px; 403 | font-family: 'plumbcbold'; 404 | 405 | padding-top: 35px; 406 | padding-left: 35px; 407 | padding-right: 9px; 408 | } 409 | } 410 | 411 | .loadImg { 412 | position: absolute; 413 | top: 50%; 414 | left: 50%; 415 | margin-left: -530px; 416 | margin-top: -350px; 417 | } 418 | .gameover_bg { 419 | position: absolute; 420 | top: 50%; 421 | left: 50%; 422 | margin-left: -765px; 423 | margin-top: -498px; 424 | z-index: -1; 425 | } 426 | .coins { 427 | margin-bottom: 100px; 428 | } 429 | .gameover_message { 430 | color: #fff; 431 | font-size: 40px; 432 | letter-spacing: 0.1em; 433 | line-height: 53px; 434 | margin-bottom: 20px; 435 | } 436 | #gameovermessage { 437 | color: #fff; 438 | font-size: 20px; 439 | letter-spacing: 0.1em; 440 | line-height: 53px; 441 | margin-top: 20px; 442 | position: absolute; 443 | text-align: center; 444 | width: 100%; 445 | } 446 | .left { 447 | float: left; 448 | letter-spacing: 0.29em; 449 | } 450 | 451 | .right { 452 | float: right; 453 | letter-spacing: 0.01em; 454 | > a, span { 455 | margin-right: 16px; 456 | } 457 | } 458 | 459 | .hotdot { 460 | display: inline-block; 461 | vertical-align: middle; 462 | } 463 | 464 | .pause, .share { 465 | /*display: table;*/ 466 | background-color: rgba(0,0,0,0.5); 467 | z-index: 4; 468 | } 469 | 470 | .menu { 471 | display: inline-block; 472 | width: 300px; 473 | height: 400px; 474 | border: 1px #ffffff solid; 475 | background-color: #363636; 476 | } 477 | 478 | .menu hr { 479 | /*color: #595959;*/ 480 | /*background: #595959;*/ 481 | width: 75%; 482 | /*height: 1px;*/ 483 | } 484 | 485 | .menu span { 486 | margin-bottom: 15px; 487 | margin-top: 15px; 488 | font-size: 1.25em; 489 | } 490 | 491 | .cont { 492 | display: table-cell; 493 | vertical-align: middle; 494 | } 495 | 496 | .error { 497 | font-size: 5em; 498 | } 499 | 500 | .helthbar, .score, .bonus { 501 | bottom: 30px; 502 | } 503 | 504 | .helthbar { 505 | border: 1px #eee solid; 506 | background-color: #000; 507 | width: 30%; 508 | height: 20px; 509 | left: 35%; 510 | padding: 1px; 511 | } 512 | 513 | .helth { 514 | width: 100%; 515 | height: 100%; 516 | background-color: #BE463C; 517 | } 518 | 519 | 520 | .music_button, .menu_button, .fs_button { 521 | width: 40px; 522 | height: 40px; 523 | border: 1px #ffffff solid; 524 | font-size: 32px; 525 | text-align: center; 526 | cursor: pointer; 527 | } 528 | 529 | .fs_button { 530 | z-index: 2; 531 | right: 120px; 532 | top: 30px; 533 | } 534 | 535 | .music_button { 536 | z-index: 2; 537 | right: 75px; 538 | top: 30px; 539 | } 540 | 541 | .menu_button { 542 | z-index: 0; 543 | right: 30px; 544 | top: 30px; 545 | } 546 | 547 | .bonus { 548 | height: 30px; 549 | right: 30px; 550 | font-size: 2em; 551 | } 552 | 553 | .score { 554 | width: 207px; 555 | height: 30px; 556 | left: 0; 557 | font-size: 40px; 558 | bottom: 125px; 559 | text-align: right; 560 | color: #fff; 561 | > span { 562 | vertical-align: middle; 563 | } 564 | > img { 565 | display: inline-block; 566 | vertical-align: middle; 567 | margin-left: 5px; 568 | } 569 | } 570 | 571 | .color { 572 | width: 100px; 573 | height: 100px; 574 | background-color: #fff; 575 | position: absolute; 576 | top: 50%; 577 | right: 0; 578 | } 579 | 580 | a { 581 | color: #fd5439; 582 | } 583 | 584 | a:hover { 585 | color: #fff; 586 | } 587 | 588 | .button:hover { 589 | cursor: pointer; 590 | } 591 | 592 | #loader { 593 | display: none; 594 | } 595 | 596 | #webgl-error-message { 597 | z-index: 5; 598 | } 599 | 600 | #qrcode canvas { 601 | border: 5px solid white; 602 | } 603 | #qrcode { 604 | margin-top: 10px; 605 | margin-bottom: 20px; 606 | } 607 | .logo { 608 | // position: absolute; 609 | margin-top: 50px; 610 | margin-bottom: 10px; 611 | height: 130px; 612 | overflow: hidden; 613 | z-index: 2; 614 | width: 100%; 615 | > img { 616 | height: 110px; 617 | } 618 | } 619 | 620 | .byhotdot { 621 | margin-top: -17px; 622 | font-size: 12px; 623 | letter-spacing: 0.15em; 624 | } 625 | .message { 626 | color: #fd5439; 627 | font-size: 30px; 628 | letter-spacing: 0.15em; 629 | margin-top: 153px; 630 | } 631 | 632 | .mobile_message { 633 | font-size: 30px; 634 | line-height: 1.5em; 635 | letter-spacing: 0.1em; 636 | } 637 | .webcam_message { 638 | font-size: 40px; 639 | line-height: 1.2em; 640 | letter-spacing: 0.1em; 641 | } 642 | .turn_to_start { 643 | position: relative; 644 | width: 100%; 645 | height: 260px; 646 | font-size: 40px; 647 | >span { 648 | position: absolute; 649 | bottom: 50px; 650 | left: 0; 651 | width: 100%; 652 | } 653 | } 654 | #head { 655 | position: absolute; 656 | top: 50px; 657 | left: 50%; 658 | margin-left: -72px; 659 | display: none; 660 | } 661 | #left_v_check { 662 | position: absolute; 663 | bottom: 50px; 664 | left: 100px; 665 | display: none; 666 | } 667 | #right_v_check { 668 | position: absolute; 669 | bottom: 50px; 670 | right: 100px; 671 | display: none; 672 | } 673 | .mobile_message span{ 674 | text-transform: lowercase; 675 | } 676 | 677 | .controls { 678 | font-size: 16px; 679 | letter-spacing: 0.2em; 680 | margin-top: -10px; 681 | div:hover .rect { 682 | background-color: #fff; 683 | -webkit-transition: background-color 0.4s ease-out 0; 684 | -moz-transition: background-color 0.4s ease-out 0; 685 | -o-transition: background-color 0.4s ease-out 0; 686 | transition: background-color 0.4s ease-out 0; 687 | } 688 | div:hover .rect .quad { 689 | background-color: #000; 690 | -webkit-transition: background-color 0.4s ease-out 0; 691 | -moz-transition: background-color 0.4s ease-out 0; 692 | -o-transition: background-color 0.4s ease-out 0; 693 | transition: background-color 0.4s ease-out 0; 694 | } 695 | .rect { 696 | position: relative; 697 | background-color: #fd5439; 698 | -webkit-transition: background-color 0.4s ease-out 0; 699 | -moz-transition: background-color 0.4s ease-out 0; 700 | -o-transition: background-color 0.4s ease-out 0; 701 | transition: background-color 0.4s ease-out 0; 702 | > .quad { 703 | background-color: #fff; 704 | -webkit-transition: background-color 0.4s ease-out 0; 705 | -moz-transition: background-color 0.4s ease-out 0; 706 | -o-transition: background-color 0.4s ease-out 0; 707 | transition: background-color 0.4s ease-out 0; 708 | position: absolute; 709 | width: 7px; 710 | height: 7px; 711 | } 712 | } 713 | >.choose_wasd { 714 | .rect { 715 | width: 112px; 716 | height: 46px; 717 | margin: 52px auto; 718 | .quad1 { 719 | bottom: 17px; 720 | right: 38px; 721 | } 722 | .quad2 { 723 | bottom: 8px; 724 | right: 47px; 725 | } 726 | .quad3 { 727 | bottom: 8px; 728 | right: 38px; 729 | } 730 | .quad4 { 731 | bottom: 8px; 732 | right: 29px; 733 | } 734 | } 735 | } 736 | >.choose_mobile { 737 | .rect { 738 | margin: 34px auto; 739 | width: 51px; 740 | height: 82px; 741 | .quad { 742 | bottom: 7px; 743 | right: 21px; 744 | width: 8px; 745 | height: 8px; 746 | } 747 | } 748 | } 749 | >.choose_webcam { 750 | .rect { 751 | margin: 43px auto; 752 | width: 89px; 753 | height: 63px; 754 | .quad { 755 | top: 8px; 756 | right: 40px; 757 | width: 8px; 758 | height: 8px; 759 | } 760 | } 761 | } 762 | >div { 763 | display: inline-block; 764 | position: relative; 765 | width: 125px; 766 | height: 150px; 767 | >span{ 768 | position: absolute; 769 | bottom: 0; 770 | left: 0; 771 | width: 100%; 772 | } 773 | } 774 | } 775 | .red { 776 | color: #fd5439; 777 | } 778 | .logoLoadControlContainer { 779 | position: absolute; 780 | left: 0; 781 | top: 0; 782 | width: 100%; 783 | height: 100%; 784 | z-index: 1; 785 | } 786 | .buttons { 787 | display: none; 788 | } 789 | #dogecoin { 790 | border: 2px solid #fff; 791 | color: #fff; 792 | width: 226px; 793 | margin-right: 5px; 794 | height: 47px; 795 | background-color: transparent; 796 | font-size: 19px; 797 | font-family: 'plumbmediumcmediumc'; 798 | -webkit-font-smoothing: antialiased; 799 | -moz-osx-font-smoothing: grayscale; 800 | padding-left: 18px; 801 | letter-spacing: 0.05em; 802 | } 803 | #wow { 804 | background-color: #fd5439; 805 | border: none; 806 | color: #fff; 807 | height: 52px; 808 | font-size: 24px; 809 | width: 94px; 810 | font-family: 'plumbmediumcmediumc'; 811 | -webkit-font-smoothing: antialiased; 812 | -moz-osx-font-smoothing: grayscale; 813 | cursor: pointer; 814 | -webkit-transition: background-color 0.4s ease-out 0; 815 | -moz-transition: background-color 0.4s ease-out 0; 816 | -o-transition: background-color 0.4s ease-out 0; 817 | transition: background-color 0.4s ease-out 0; 818 | // -webkit-transition: color 0.4s ease-out 0; 819 | // -moz-transition: color 0.4s ease-out 0; 820 | // -o-transition: color 0.4s ease-out 0; 821 | // transition: color 0.4s ease-out 0; 822 | &:hover { 823 | color: #000; 824 | background-color: #fff; 825 | -webkit-transition: background-color 0.4s ease-out 0; 826 | -moz-transition: background-color 0.4s ease-out 0; 827 | -o-transition: background-color 0.4s ease-out 0; 828 | transition: background-color 0.4s ease-out 0; 829 | // -webkit-transition: color 0.4s ease-out 0; 830 | // -moz-transition: color 0.4s ease-out 0; 831 | // -o-transition: color 0.4s ease-out 0; 832 | // transition: color 0.4s ease-out 0; 833 | } 834 | } 835 | 836 | .show-table { 837 | display: table; 838 | } 839 | 840 | a.chromeexperiments { 841 | display: block; 842 | position: absolute; 843 | bottom: 75px; 844 | left: 35px; 845 | margin: 0; 846 | padding: 0; 847 | img { 848 | margin: 0; 849 | padding: 0; 850 | } 851 | } -------------------------------------------------------------------------------- /assets_source/scss/mobile.scss: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'plumbmediumcmediumc'; 3 | src: url('../fonts/plm65__c-webfont.eot'); 4 | src: url('../fonts/plm65__c-webfont.eot?#iefix') format('embedded-opentype'), 5 | url('../fonts/plm65__c-webfont.woff') format('woff'), 6 | url('../fonts/plm65__c-webfont.ttf') format('truetype'); 7 | font-weight: normal; 8 | font-style: normal; 9 | } 10 | 11 | body,html { 12 | padding:0; 13 | margin:0; 14 | color: #eee; 15 | width:100%; 16 | height:100%; 17 | font-family: 'plumbmediumcmediumc', "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; 18 | font-weight: 300; 19 | margin: 0px; 20 | background-color: #000000; 21 | overflow: hidden; 22 | text-align: center; 23 | text-transform: uppercase; 24 | } 25 | 26 | #controller{ 27 | width:100%; 28 | height:100%; 29 | background-color: #000; 30 | display: table; 31 | } 32 | 33 | #turnLeft{ 34 | position:absolute; 35 | bottom:0; 36 | left:0; 37 | width:33%; 38 | height: 100%; 39 | background-color: #000; 40 | z-index: 1; 41 | >img { 42 | position: absolute; 43 | left: 10%; 44 | top: 50%; 45 | margin-top: -50px; 46 | height: 100px; 47 | } 48 | } 49 | 50 | #turnRight{ 51 | position:absolute; 52 | bottom:0; 53 | right:0; 54 | width:33%; 55 | height: 100%; 56 | background-color: #000; 57 | z-index: 1; 58 | >img { 59 | position: absolute; 60 | right: 10%; 61 | top: 50%; 62 | margin-top: -50px; 63 | height: 100px; 64 | } 65 | } 66 | #sphere{ 67 | position:absolute; 68 | bottom:0; 69 | right:33%; 70 | width:33%; 71 | height: 100%; 72 | background-color: #000; 73 | z-index: 2; 74 | >img { 75 | position: absolute; 76 | left: 50%; 77 | top: 50%; 78 | margin-left: -70px; 79 | margin-top: -70px; 80 | height: 140px; 81 | } 82 | } 83 | 84 | #socket, #wheel, #preparetostart, #gameover{ 85 | width: 100%; 86 | height: 100%; 87 | display: table-cell; 88 | vertical-align: middle; 89 | text-align: center; 90 | overflow: hidden; 91 | display: none; 92 | } 93 | 94 | #socket { 95 | z-index: 2; 96 | display: table-cell; 97 | } 98 | 99 | #status, #status_fail{ 100 | width: 100%; 101 | text-align: center; 102 | position: absolute; 103 | z-index: 3; 104 | } 105 | 106 | #status_fail { 107 | top: 10%; 108 | color: red; 109 | } 110 | 111 | #preparetostart { 112 | display: none; 113 | > #start > .push { 114 | position: absolute; 115 | width: 100%; 116 | top: 50%; 117 | font-size: 25px; 118 | margin-top: -0.5em; 119 | text-align: center; 120 | z-index: 1; 121 | color: rgba(255,255,255,0.5); 122 | } 123 | } 124 | 125 | #wheel { 126 | display: none; 127 | z-index: 1; 128 | background-color: #000; 129 | } 130 | 131 | #hotdot{ 132 | position: absolute; 133 | left: 50%; 134 | margin-left: -10px; 135 | bottom: 20px; 136 | } 137 | 138 | #gameCodeInput { 139 | width: 210px; 140 | height: 40px; 141 | background-color: #000; 142 | border: 2px solid #69ffd3; 143 | color: #FFF; 144 | padding-left: 10px; 145 | font-size: 14px; 146 | font-family: 'plumbmediumcmediumc'; 147 | letter-spacing: 0.15em; 148 | vertical-align: middle; 149 | text-transform: uppercase; 150 | border-radius: 0; 151 | box-sizing: border-box; 152 | margin: 10px 6px; 153 | } 154 | 155 | #connect { 156 | height: 40px; 157 | width: 100px; 158 | background-color: #fd5439; 159 | color: #fff; 160 | font-size: 14px; 161 | font-family: 'plumbmediumcmediumc'; 162 | letter-spacing: 0.15em; 163 | border: none; 164 | vertical-align: middle; 165 | text-transform: uppercase; 166 | margin: 10px 6px; 167 | } 168 | 169 | #start { 170 | position:absolute; 171 | top:0; 172 | left:0; 173 | width:100%; 174 | height: 100%; 175 | background-color: #000; 176 | z-index: 1; 177 | >img { 178 | position: absolute; 179 | left: 50%; 180 | top: 50%; 181 | margin-left: -70px; 182 | margin-top: -70px; 183 | height: 140px; 184 | } 185 | } 186 | #gameover { 187 | display: none; 188 | position:absolute; 189 | top:0; 190 | left:0; 191 | background-color: #000; 192 | background: #000 url(../img/mobilereset.jpg) 0 0 no-repeat; 193 | width: 100%; 194 | height: 100%; 195 | z-index: 1; 196 | // >img { 197 | // position: absolute; 198 | // left: 0; 199 | // top: 0; 200 | // // margin-top: -280px; 201 | // // margin-left: -300px; 202 | // width: 727px; 203 | // height: 740px; 204 | // } 205 | >#restart{ 206 | position: absolute; 207 | left: 50%; 208 | top: 50%; 209 | width: 190px; 210 | height: 62px; 211 | margin-left: -95px; 212 | margin-top: -31px; 213 | background-color: #000; 214 | border: none; 215 | border-radius: 0; 216 | color: #fff; 217 | font-size: 26px; 218 | font-family: 'plumbmediumcmediumc'; 219 | letter-spacing: 0.15em; 220 | text-transform: uppercase; 221 | } 222 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "DT", 3 | "version": "0.0.0", 4 | "description": "A WebGL game using Web Audio API", 5 | "main": "server.js", 6 | "dependencies": { 7 | "dogeapi": "^2.0.1", 8 | "express": "^3.4.8", 9 | "hookshot": "^0.0.2", 10 | "mongoose": "^3.8.12", 11 | "node-dogecoin": "^0.3.9", 12 | "socket.io": "^0.9.16" 13 | }, 14 | "devDependencies": {}, 15 | "scripts": { 16 | "test": "echo \"Error: no test specified\" && exit 1", 17 | "start": "node server.js" 18 | }, 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/deemidroll/digital_trip.git" 22 | }, 23 | "author": "deemidroll", 24 | "license": "ISC", 25 | "bugs": { 26 | "url": "https://github.com/deemidroll/digital_trip/issues" 27 | }, 28 | "homepage": "https://github.com/deemidroll/digital_trip" 29 | } 30 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | // ███████╗███████╗██████╗ ██╗ ██╗███████╗██████╗ ██╗███████╗ 2 | // ██╔════╝██╔════╝██╔══██╗██║ ██║██╔════╝██╔══██╗ ██║██╔════╝ 3 | // ███████╗█████╗ ██████╔╝██║ ██║█████╗ ██████╔╝ ██║███████╗ 4 | // ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██╔══╝ ██╔══██╗ ██ ██║╚════██║ 5 | // ███████║███████╗██║ ██║ ╚████╔╝ ███████╗██║ ██║██╗╚█████╔╝███████║ 6 | // ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚════╝ ╚══════╝ 7 | // Dependencies 8 | var express = require('express'), 9 | io = require('socket.io'), 10 | mongoose = require('mongoose'), 11 | dogecoin = require('node-dogecoin')(), 12 | hookshot = require('hookshot'); 13 | 14 | // Set up app with Express framework 15 | var app = express(); 16 | 17 | // Create server 18 | var server = app.listen(80, function() { 19 | console.log('Listening on port %d', server.address().port); 20 | }); 21 | 22 | // Configure the app 23 | app.configure(function() { 24 | app.use(express.cookieParser()); 25 | // set a cookie 26 | app.use(function (req, res, next) { 27 | // check if client sent cookie 28 | var cookie = req.cookies.UID; 29 | if (cookie === undefined) { 30 | // no: gen a new cookie 31 | cookie = genCookie(); 32 | // console.log('cookie have created successfully'); 33 | } else { 34 | // yes, cookie was already present 35 | // console.log('cookie exists', cookie); 36 | } 37 | // refresh cookie 38 | res.cookie('UID', cookie, { maxAge: 900000 }); 39 | next(); // <-- important! 40 | }); 41 | 42 | app.use('/', express.static('assets/')); 43 | app.use('/webhook', hookshot('refs/heads/master', 'git pull')); 44 | app.use(/\/m\/#\d{6}/, express.static('assets/')); 45 | }); 46 | 47 | // Connect DB 48 | mongoose.connect('mongodb://127.0.0.1:27017/DTdb'); 49 | 50 | var Schema = mongoose.Schema; 51 | 52 | var clientsSchema = new Schema({ 53 | cookieUID: String, 54 | clientId: String, 55 | clientIp: String, 56 | gameCode: String, 57 | timeStart: Number, 58 | timeEnd: Number, 59 | coinsCollect: Number, 60 | maxCoinsCheck: Boolean, 61 | checkup: Boolean, 62 | paymentRequest: Number, 63 | gamesInSession: Number, 64 | }); 65 | 66 | var Client = mongoose.model('Client', clientsSchema); 67 | 68 | var db = mongoose.connection; 69 | db.on('error', console.error.bind(console, 'connection error:')); 70 | db.once('open', function callback () { 71 | console.log('connected to db', db.name); 72 | }); 73 | 74 | // node-dogecoin 75 | dogecoin.auth('dogecoinrpc', 'BCStFnenZDA6rmDygTdST6HW2jCz2YpVWEnVfvAangTk'); 76 | 77 | dogecoin.exec('getbalance', function(err, balance) { 78 | console.log(err, balance); 79 | }) 80 | // service functions 81 | var genCookie = function () { 82 | var randomNumber=Math.random().toString(); 83 | return randomNumber.substring(2,randomNumber.length); 84 | }; 85 | var genRandomFloorBetween = function (min, max) { 86 | var rand = min - 0.5 + Math.random()*(max-min+1); 87 | rand = Math.round(rand); 88 | return rand; 89 | }; 90 | var genGameCode = function () { 91 | var code = genRandomFloorBetween(0, 999999).toString(); 92 | while (code.length < 6) { 93 | code = '0' + code; 94 | } 95 | return code; 96 | }; 97 | var checkClient = function (clients, currentClient) { 98 | console.log("Handle clients from Array[" + clients.length + "]") 99 | var IPcounter = 0, 100 | UIDcounter = 0, 101 | IPpaymentsCounter = 0, 102 | UIDpaymentsCounter = 0, 103 | IPtimeCounter = 60 * 1000, 104 | UIDtimeCounter = 0, 105 | data = {}, 106 | checkup = null; 107 | 108 | clients.forEach(function(client, i) { 109 | 110 | if (client.clientIp === currentClient.clientIp) { 111 | IPcounter++; 112 | if (client.paymentRequest) { 113 | IPpaymentsCounter += client.paymentRequest; 114 | if (currentClient.timeEnd && currentClient.clientId !== client.clientId) { 115 | IPtimeCounter = Math.min(IPtimeCounter, currentClient.timeEnd - client.timeEnd); 116 | } 117 | } 118 | } 119 | if (client.cookieUID === currentClient.cookieUID) { 120 | UIDcounter++; 121 | if (client.paymentRequest) { 122 | UIDpaymentsCounter += client.paymentRequest; 123 | } 124 | } 125 | // console.log("handle client #" + i); 126 | }); 127 | console.log('IPtimeCounter', IPtimeCounter); 128 | if (currentClient.checkup === false || 129 | currentClient.maxCoinsCheck === false || 130 | // IPcounter > 10000 || 131 | // UIDcounter > 1000 || 132 | IPpaymentsCounter > 1000 || 133 | UIDpaymentsCounter > 100 || 134 | IPtimeCounter < 20 * 1000) { 135 | checkup = false; 136 | } else { 137 | checkup = true; 138 | } 139 | // console.log('emit socket message in ' + currentClient.gameCode + ' with type paymentCheck, checkup: ' + checkup); 140 | // if(currentClient.gameCode && currentClient.gameCode in socketCodes) { 141 | // socketCodes[currentClient.gameCode].emit('message', {type: 'paymentCheck', checkup: checkup}); 142 | // } 143 | console.log( 144 | 'checkup', currentClient.checkup === false, 145 | 'maxCoinsCheck', currentClient.maxCoinsCheck === false, 146 | 'IPcounter', IPcounter > 1000, 147 | 'UIDcounter', UIDcounter > 100, 148 | 'IPpaymentsCounter', IPpaymentsCounter > 20, 149 | 'UIDpaymentsCounter', UIDpaymentsCounter > 5, 150 | 'IPtimeCounter', IPtimeCounter < 20 * 1000, 151 | 'IPtimeCounter', IPtimeCounter); 152 | return checkup; 153 | }; 154 | 155 | var checkCoins = function (timeStart, timeEnd, coinsCollect) { 156 | var time = (timeEnd - timeStart)/1000, 157 | maxCoins = calcMaxCoins(time); 158 | // if client recieve more coins than it may 159 | return coinsCollect <= maxCoins; 160 | }; 161 | 162 | var calcMaxCoins = function (time) { 163 | var speedStart = 1/60, 164 | acceleration = 1/2500, 165 | maxPath = 0, 166 | maxCoins = 0, 167 | t = 0.25, // coins position in the tube 168 | dt = 0.004, // coins position offset 169 | n = 10; // number of coins in a row 170 | 171 | maxPath = (speedStart + acceleration * Math.sqrt(time * 60)) * time; 172 | 173 | maxCoins = Math.round((maxPath / (t + dt * (n - 1)) * n)*0.02); 174 | console.log('time:' + time, 'maxCoins:' + maxCoins, 'maxPath:' + maxPath); 175 | return Math.min(maxCoins, 30); 176 | }; 177 | // var checkUID = function (uid) {}; 178 | // var checkIp = function (ip) {}; 179 | 180 | 181 | // Tell Socket.io to pay attention 182 | io = io.listen(server, { log: false }); 183 | 184 | // Sockets object to save game code -> socked associations 185 | var socketCodes = {}; 186 | 187 | // When a client connects... 188 | io.sockets.on('connection', function(socket) { 189 | // Confirm the connection 190 | socket.emit('welcome', {}); 191 | 192 | socket.on('message', function (data) { 193 | // ...emit a 'message' event to every other socket 194 | for (var socket in io.sockets.sockets) { 195 | if (io.sockets.sockets.hasOwnProperty(socket)) { 196 | if (io.sockets.sockets[socket].gameCode === data.gameCode) { 197 | io.sockets.sockets[socket].emit('message', data); 198 | } 199 | } 200 | } 201 | if (data.type === 'gamestarted') { 202 | var timeStart = Date.now(); 203 | // update client in clients collection 204 | Client.findOne({'clientId': data.sessionid}).exec(function(err, client) { 205 | if (err) { 206 | console.log('Error:', err); 207 | return; 208 | } 209 | if (client) { 210 | client.timeStart = timeStart; 211 | client.gamesInSession += 1; 212 | client.save(function (err) { 213 | if (err) console.log("Error: could not save client timeStart"); 214 | }); 215 | } 216 | }); 217 | } 218 | if (data.type === 'gameover') { 219 | // update client in clients collection 220 | var timeEnd = Date.now(); 221 | Client.findOne({'clientId': data.sessionid}).exec(function(err, client) { 222 | if (err) { 223 | console.log('Error:', err); 224 | return; 225 | } 226 | if (client) { 227 | client.timeEnd = timeEnd; 228 | client.coinsCollect = data.coinsCollect; 229 | client.maxCoinsCheck = checkCoins(client.timeStart, client.timeEnd, client.coinsCollect); 230 | client.save(function (err) { 231 | if (err) console.log("Error: could not save client timeEnd data", err); 232 | }); 233 | } 234 | }); 235 | } 236 | if (data.type === 'checkup') { 237 | Client.findOne({'clientId': data.sessionid}).exec(function(err, client) { 238 | if (err) { 239 | console.log('Error:', err); 240 | return; 241 | } 242 | if (client) { 243 | Client.find({ $or: [{'clientIp': client.clientIp}, {'cookieUID': client.cookieUID}]}).exec(function(err, clients) { 244 | if (err) { 245 | console.log('Error:', err); 246 | return; 247 | } 248 | if (client.coinsCollect === 0) { 249 | socketCodes[client.gameCode].emit('transactionMessage', {type: 'transactionFail', error: 'can not send 0 dogecoin'}); 250 | return; 251 | } 252 | client.paymentRequest += 1; 253 | client.checkup = checkClient(clients, client); 254 | client.save(function (err) { 255 | if (err) console.log("Error: could not save client checkup"); 256 | }); 257 | if (client.checkup) { 258 | socketCodes[client.gameCode].emit('paymentMessage', {type: 'transactionStart'}); 259 | // instance.withdraw(client.coinsCollect, data.dogecoinId, 7085, function (error, transaction) { 260 | // if(error) { 261 | // // Handle error 262 | // console.log(error, client.gameCode); 263 | // socketCodes[client.gameCode].emit('transactionMessage', {type: 'transactionFail', error: error}); 264 | // } else { 265 | // console.log(transaction); 266 | // socketCodes[client.gameCode].emit('transactionMessage', {type: 'transactionComplete', transactionid: transaction}); 267 | // } 268 | // }); 269 | dogecoin.exec('sendtoaddress', data.dogecoinId, client.coinsCollect, 'Digital Trip payment', 'from Digital Trip', function(error, transaction) { 270 | console.log(error, transaction); 271 | if(error) { 272 | // Handle error 273 | console.log(error, client.gameCode); 274 | socketCodes[client.gameCode].emit('transactionMessage', {type: 'transactionFail', error: error}); 275 | } else { 276 | console.log(client.coinsCollect, transaction); 277 | socketCodes[client.gameCode].emit('transactionMessage', {type: 'transactionComplete', transactionid: transaction}); 278 | } 279 | }) 280 | } else { 281 | console.log('checkup nope'); 282 | socketCodes[client.gameCode].emit('paymentMessage', {type: 'transactionDenied'}); 283 | } 284 | }); 285 | } 286 | }); 287 | } 288 | }); 289 | 290 | // Receive the client device type 291 | socket.on('device', function(data) { 292 | // if client is a browser game 293 | if(data.type == 'game') { 294 | // Generate a code 295 | var gameCode = genGameCode(); 296 | // Ensure uniqueness 297 | while(gameCode in socketCodes) { 298 | gameCode = genGameCode(); 299 | } 300 | 301 | // Store game code -> socket association 302 | socketCodes[gameCode] = io.sockets.sockets[socket.id]; 303 | socket.gameCode = gameCode; 304 | 305 | // Tell game client to initialize 306 | // and show the game code to the user 307 | socket.emit('initialize', gameCode); 308 | // insert data into MongoDB 309 | Client.findOne({'clientId': socket.id}).exec(function(err, client) { 310 | if(!err) { 311 | if(!client) { 312 | client = new Client({ 313 | cookieUID: data.cookieUID, 314 | clientId: socket.id, 315 | clientIp: socket.handshake.address.address, 316 | gameCode: gameCode, 317 | paymentRequest: 0, 318 | gamesInSession: 0, 319 | }); 320 | } else { 321 | client.gamesInSession += 1; 322 | } 323 | client.save(function(err) { 324 | if (err) console.log("Error: could not save client on start"); 325 | }); 326 | } 327 | }); 328 | 329 | } else if(data.type == 'controller') { // if client is a phone controller 330 | // if game code is valid... 331 | if(data.gameCode in socketCodes) { 332 | // save the game code for controller commands 333 | socket.gameCode = data.gameCode; 334 | // initialize the controller 335 | socket.emit('connected', {}); 336 | 337 | // start the game 338 | if(data.gameCode && data.gameCode in socketCodes) { 339 | socketCodes[data.gameCode].emit('connected', {}); 340 | } 341 | socket.emit('message', {type: 'vibr', time: 100}); 342 | } else { // else game code is invalid, send fail message and disconnect 343 | socket.emit('fail', {}); 344 | socket.emit('message', {type: 'vibr', time: 1000}); 345 | socket.disconnect(); 346 | } 347 | } 348 | }); 349 | // send accelerate command to game client 350 | socket.on('accelerate', function(data) { 351 | var bAccelerate = data.accelerate; 352 | if(socket.gameCode && socket.gameCode in socketCodes) { 353 | socketCodes[socket.gameCode].emit('accelerate', bAccelerate); 354 | } 355 | }); 356 | // send turn command to game client 357 | socket.on('turn', function(data) { 358 | if(socket.gameCode && socket.gameCode in socketCodes) { 359 | socketCodes[socket.gameCode].emit('turn', data.turn); 360 | } 361 | }); 362 | // send click command to game client 363 | socket.on('click', function(data) { 364 | if(socket.gameCode && socket.gameCode in socketCodes) { 365 | socketCodes[socket.gameCode].emit('click', data.click); 366 | } 367 | }); 368 | // send start command to game client 369 | socket.on('start', function(data) { 370 | if(socket.gameCode && socket.gameCode in socketCodes) { 371 | socketCodes[socket.gameCode].emit('start', data); 372 | } 373 | }); 374 | // send disconnect command to game client 375 | socket.on('disconnect', function(data) { 376 | if(socket.gameCode && socket.gameCode in socketCodes) { 377 | socketCodes[socket.gameCode].emit('disconnectController', data); 378 | } 379 | }); 380 | }); 381 | // When a client disconnects... 382 | io.sockets.on('disconnect', function(socket) { 383 | // remove game code -> socket association on disconnect 384 | if(socket.gameCode && socket.gameCode in socketCodes) { 385 | delete socketCodes[socket.gameCode]; 386 | } 387 | }); 388 | --------------------------------------------------------------------------------