document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. (function r(f){/in/(document.readyState)?setTimeout(r,9,f):f()})(function(){
  2.     var MODE_DEFAULT = 0;
  3.     var MODE_SELECT = 1;
  4.     var MOVE_LIMIT = 6;
  5.     var i, imax, j, jmax, mtx, mode = MODE_DEFAULT;
  6.     var stage, stats, timer, sprite, light;
  7.     var frameRate = 60;
  8.     var m,t,s,cubeMaterial,cubeMaterials = [];
  9.     var el = document.getElementById("three-stage");
  10.     var isDown, isDrag, dragPoint, startAngle, tween;
  11.     var sizeW = 21, sizeH = 7, rows = 11, cols = 11;
  12.     var panels = [];
  13.     var panelMatNormal = new THREE.MeshBasicMaterial({color: 0x5555FF, opacity: 0.6});
  14.     var panelMatActive = new THREE.MeshBasicMaterial({color: 0xFF5555, opacity: 0.6});
  15.     var cube, angle = 0;
  16.  
  17.     //ステージ
  18.     var stage = new FieldStage(el, 520, 390, {x:sizeW, y:sizeH, z:sizeW}, false);
  19.     stage.distance = 1000;
  20.  
  21.     //get material
  22.     function getMaterial(texture, texture2, isBasic){
  23.         if(stage.useWebgl() && !isBasic){
  24.             return new THREE.MeshLambertMaterial({map: texture});
  25.         }
  26.         return new THREE.MeshBasicMaterial({map: (stage.useWebgl() ? texture : texture2 || texture)});
  27.     };
  28.  
  29.     // reset all panels
  30.     function clearSelectPanel(){
  31.         var i,j;
  32.         for (i = 0; i < rows; i++) {
  33.             for (j = 0; j < cols; j++) {
  34.                 switch(mode){
  35.                     case MODE_SELECT:
  36.                         panels[i][j].materials[0] = panelMatNormal;
  37.                         break;
  38.                     default:
  39.                         panels[i][j].materials[0] = panelMatNormal;
  40.                         panels[i][j].visible = false;
  41.                         break;
  42.                 }
  43.             }
  44.         }
  45.     };
  46.  
  47.     //cycle engine
  48.     function update(){
  49.         TWEEN.update();
  50.         light.position.x = cube.getMesh().position.x;
  51.         light.position.y = cube.getMesh().position.y + sizeW;
  52.         light.position.z = cube.getMesh().position.z;
  53.         stage.update(cube.getMesh().position);
  54.         stats.update();
  55.         stage.getRenderer().render(stage.getScene(), stage.getCamera());
  56.     };
  57.  
  58.  
  59.     //Cubeの各面のマテリアル
  60.     //No.1
  61.     m = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture001.png\'));
  62.     t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture001_top.png\'));
  63.     cubeMaterials.push([
  64.         m, // right
  65.         m, // left
  66.         t, // top
  67.         m, // bottom
  68.         m, // back
  69.         m  // front
  70.     ]);
  71.  
  72.     //No.2
  73.     t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture002_top.png\'));
  74.     cubeMaterials.push([
  75.         m, // right
  76.         m, // left
  77.         t, // top
  78.         m, // bottom
  79.         m, // back
  80.         m  // front
  81.     ]);
  82.  
  83.     //No.3
  84.     t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture003_top.png\'));
  85.     cubeMaterials.push([
  86.         m, // right
  87.         m, // left
  88.         t, // top
  89.         m, // bottom
  90.         m, // back
  91.         m  // front
  92.     ]);
  93.  
  94.     //No.4
  95.     t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture004_top.png\'));
  96.     cubeMaterials.push([
  97.         m, // right
  98.         m, // left
  99.         t, // top
  100.         m, // bottom
  101.         m, // back
  102.         m  // front
  103.     ]);
  104.  
  105.     //Cube
  106.     m = getMaterial(
  107.         THREE.ImageUtils.loadTexture(\'images/cube001.png\'),
  108.         THREE.ImageUtils.loadTexture(\'images/cube002.png\'),
  109.         true
  110.     );
  111.     cubeMaterial = [
  112.         m, // right
  113.         m, // left
  114.         m, // top
  115.         m, // bottom
  116.         m, // back
  117.         m // front
  118.     ];
  119.  
  120.  
  121.     //フィールドデータ生成
  122.     mtx = new FieldGenerator(cols, rows)
  123.                 .add("h", [0.3, 0.4, 0.3])
  124.                 .add("t", [0.3, 0.35, 0.3, 0.05])
  125.                 .get();
  126.     var r2 = Math.floor(rows/2);
  127.     var c2 = Math.floor(cols/2);
  128.     mtx[r2][c2].h = 1;
  129.     mtx[r2][c2].t = 1;
  130.     stage.makeWalls(mtx, cubeMaterials);
  131.  
  132.     //mr.cube
  133.     cube = new MrCube(sizeW, cubeMaterial, mtx);
  134.     cube.cellY = sizeH;
  135.     cube.setTo(c2, r2);
  136.     stage.getScene().addObject(cube.getMesh());
  137.  
  138.     //ライティング (webgl only)
  139.     var defLight = new THREE.AmbientLight(0x333333);
  140.     stage.getScene().addLight(defLight);
  141.     light = new THREE.PointLight(0xFFFFFF, 3, 250);
  142.     light.position.set(0, 150, 0);
  143.     stage.getScene().addLight(light);
  144.  
  145.     //インターフェイスパネル
  146.     var pm;
  147.     var pl = - cols * sizeW / 2 + sizeW / 2;
  148.     var pt = - rows * sizeW / 2 + sizeW / 2;
  149.     for (i = 0; i < rows; i++) {
  150.         panels[i] = [];
  151.         for (j = 0; j < cols; j++) {
  152.             pm = new THREE.Mesh(new THREE.Plane(sizeW, sizeW, 1, 1), panelMatNormal);
  153.             pm.rotation.x = -90 * Math.PI / 180;
  154.             pm.position.set(j * sizeW + pl, (mtx[i][j].h+1) * sizeH + 0.5, i * sizeW + pt);
  155.             pm.visible = false;
  156.             pm.isPanel = true;
  157.             pm.x = j;
  158.             pm.y = i;
  159.             panels[i][j] = pm;
  160.             stage.getScene().addObject(pm);
  161.         }
  162.     }
  163.  
  164.     //mouse events
  165.     $(el).mousedown(function(e){
  166.         e.preventDefault();
  167.         dragPoint = new THREE.Vector2(e.pageX, e.pageY);
  168.         startAngle = stage.cameraAngle3.clone();
  169.         if(tween) tween.stop();
  170.         isDown = true;
  171.     });
  172.     $(el).mousewheel(function(e, delta){
  173.         e.preventDefault();
  174.         stage.distance += delta * 100;
  175.         stage.distance = Math.max(Math.min(stage.distance, 1800), 400);
  176.     });
  177.     $(document).mouseup(function(e){
  178.         clearSelectPanel();
  179.         if(!isDrag && !cube.isQueing){
  180.             var i, s, list;
  181.             list = stage.getRay().intersectScene(stage.getScene());
  182.             for(i in list){
  183.                 if(list[i].object.isPanel){
  184.                     s = list[i].object;
  185.                     break;
  186.                 }
  187.             }
  188.             if(s){
  189.                 switch(mode){
  190.                     case MODE_SELECT:
  191.                         mode = MODE_DEFAULT;
  192.                         if(s.visible){
  193.                             cube.isQueing = true;
  194.                             list =  RouteSearch.search(
  195.                                 new RouteSearch.Point(cube.x, cube.y),
  196.                                 new RouteSearch.Point(s.x, s.y),
  197.                                 mtx,
  198.                                 1
  199.                             );
  200.                             list.shift();
  201.                             cube.setQueAndPlay(list);
  202.                         }
  203.                         clearSelectPanel();
  204.                         break;
  205.                     default:
  206.                         if(s.x == cube.x && s.y == cube.y){
  207.                             mode = MODE_SELECT;
  208.                             list =  RouteSearch.searchByLimit(
  209.                                 new RouteSearch.Point(cube.x, cube.y),
  210.                                 MOVE_LIMIT,
  211.                                 mtx,
  212.                                 1
  213.                             );
  214.                             for(i in list){
  215.                                 panels[list[i].y][list[i].x].visible = true;
  216.                             }
  217.                         }
  218.                         break;
  219.                 }
  220.             }
  221.         }
  222.         var xx = stage.cameraAngle3.x + 45;
  223.         xx = Math.round(xx/90) * 90 - 45;
  224.         angle = ((360 - (xx - 45)) / 90) % 4;
  225.         if(angle < 0) angle += 4;
  226.         var yy = Math.floor(stage.cameraAngle3.y/10) * 10;
  227.         yy = Math.min(Math.max(yy, 15), 50);
  228.         tween = new TWEEN.Tween(stage.cameraAngle3)
  229.             .to({
  230.                 x: xx,
  231.                 y: yy,
  232.                 z: xx
  233.             }, 1000)
  234.             .easing(TWEEN.Easing.Elastic.EaseOut)
  235.             .start();
  236.  
  237.         isDown = false;
  238.         isDrag = false;
  239.     });
  240.     $(document).mousemove(function(e){
  241.         if(!isDrag){
  242.             clearSelectPanel();
  243.             var i, list, xx, yy, mouse3D;
  244.             xx = (e.offsetX || e.layerX) / stage.stageWidth;
  245.             yy = -(e.offsetY || e.layerY) / stage.stageHeight;
  246.             mouse3D = stage.getProjector().unprojectVector(
  247.                 new THREE.Vector3(
  248.                     xx * 2 - 1,
  249.                     yy * 2 + 1,
  250.                     0.5
  251.                 ),
  252.                 stage.getCamera()
  253.             );
  254.             stage.getRay().direction = mouse3D.subSelf(stage.getCamera().position).normalize();
  255.             list = stage.getRay().intersectScene(stage.getScene());
  256.             for(i in list){
  257.                 if(list[i].object.isPanel){
  258.                     switch(mode){
  259.                         case MODE_SELECT:
  260.                             list[i].object.materials[0] = panelMatActive;
  261.                             break;
  262.                         default:
  263.                             list[i].object.visible = true;
  264.                             break;
  265.                     }
  266.                     break;
  267.                 }
  268.             }
  269.         }
  270.         if(isDown){
  271.             stage.cameraAngle3.x = (dragPoint.x - e.pageX) / 5 + startAngle.x;
  272.             stage.cameraAngle3.y = (e.pageY - dragPoint.y) / 10 + startAngle.y;
  273.             stage.cameraAngle3.y = Math.min(Math.max(stage.cameraAngle3.y, 10), 55);
  274.             stage.cameraAngle3.z = (dragPoint.x - e.pageX) / 5 + startAngle.z;
  275.             if(!isDrag && Math.abs(dragPoint.x - e.pageX) + Math.abs(e.pageY - dragPoint.y) > 5){
  276.                 isDrag = true;
  277.             }
  278.         }
  279.     });
  280.  
  281.  
  282.     //Stats SetUp
  283.     stats = new Stats();
  284.     stats.domElement.style.position = \'absolute\';
  285.     stats.domElement.style.top = \'0px\';
  286.     stats.domElement.style.zIndex = 100;
  287.     el.appendChild(stats.domElement);
  288.     document.getElementById("renderer").innerHTML = stage.useWebgl() ? "WebGLRenderer" : "CanvasRenderer" ;
  289.  
  290.     //cycle engine start
  291.     timer = setInterval(update, 1000 / frameRate);
  292. });
');