(function r(f){/in/(document.readyState)?setTimeout(r,9,f):f()})(function(){
var i, imax, j, jmax;
var stage, stats, timer, sprite, light;
var frameRate = 60;
var m,t,cubeMaterials = [];
var el = document.getElementById("three-stage");
var isDown, isDrag, dragPoint, startAngle, tween;
var sizeW = 21, sizeH = 7, rows = 11, cols = 11;
var panels = [];
var panelMatNormal = new THREE.MeshBasicMaterial({color: 0x5555FF, opacity: 0.6});
var panelMatActive = new THREE.MeshBasicMaterial({color: 0x5555FF, opacity: 0.9});
//ステージ
var stage = new FieldStage(el, 520, 390, {x:sizeW, y:sizeH, z:sizeW}, false);
stage.distance = 1000;
//get material
function getMaterial(texture){
if(stage.useWebgl()){
return new THREE.MeshLambertMaterial({map: texture});
}
return new THREE.MeshBasicMaterial({map: texture});
};
// reset all panels
function clearSelectPanel(){
var i;
for(i in panels){
panels[i].visible = false;
}
};
//cycle engine
function update(){
TWEEN.update();
stage.update();
stats.update();
stage.getRenderer().render(stage.getScene(), stage.getCamera());
};
//Cubeの各面のマテリアル
//No.1
m = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture001.png\'));
t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture001_top.png\'));
cubeMaterials.push([
m, // right
m, // left
t, // top
m, // bottom
m, // back
m // front
]);
//No.2
t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture002_top.png\'));
cubeMaterials.push([
m, // right
m, // left
t, // top
m, // bottom
m, // back
m // front
]);
//No.3
t = getMaterial(THREE.ImageUtils.loadTexture(\'images/texture003_top.png\'));
cubeMaterials.push([
m, // right
m, // left
t, // top
m, // bottom
m, // back
m // front
]);
//フィールドデータ生成
var mtx = new FieldGenerator(cols, rows)
.add("h", [0.5, 0.4, 0.1])
.add("t", [0.3, 0.5, 0.2])
.get();
stage.makeWalls(mtx, cubeMaterials);
//ライティング (webgl only)
var defLight = new THREE.AmbientLight(0x333333);
stage.getScene().addLight(defLight);
light = new THREE.PointLight(0xFFFFFF, 3, 250);
light.position.set(0, 150, 0);
stage.getScene().addLight(light);
//インターフェイスパネル
var pm;
var pl = - cols * sizeW / 2 + sizeW / 2;
var pt = - rows * sizeW / 2 + sizeW / 2;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
pm = new THREE.Mesh(new THREE.Plane(sizeW, sizeW, 1, 1), panelMatNormal);
pm.rotation.x = -90 * Math.PI / 180;
pm.position.set(j * sizeW + pl, (mtx[i][j].h+1) * sizeH + 0.5, i * sizeW + pt);
pm.visible = false;
pm.isPanel = true;
panels.push(pm);
stage.getScene().addObject(pm);
}
}
//mouse events
$(el).mousedown(function(e){
e.preventDefault();
dragPoint = new THREE.Vector2(e.pageX, e.pageY);
startAngle = stage.cameraAngle3.clone();
if(tween) tween.stop();
isDown = true;
});
$(el).mousewheel(function(e, delta){
e.preventDefault();
stage.distance += delta * 100;
stage.distance = Math.max(Math.min(stage.distance, 1800), 400);
});
$(document).mouseup(function(e){
isDown = false;
isDrag = false;
var xx = stage.cameraAngle3.x + 45;
xx = Math.round(xx/90) * 90 - 45;
var yy = Math.floor(stage.cameraAngle3.y/10) * 10;
yy = Math.min(Math.max(yy, 15), 50);
tween = new TWEEN.Tween(stage.cameraAngle3)
.to({
x: xx,
y: yy,
z: xx
}, 1000)
.easing(TWEEN.Easing.Elastic.EaseOut)
.start();
});
$(document).mousemove(function(e){
clearSelectPanel();
if(!isDrag){
var i, list, xx, yy, mouse3D;
xx = (e.offsetX || e.layerX) / stage.stageWidth;
yy = -(e.offsetY || e.layerY) / stage.stageHeight;
mouse3D = stage.getProjector().unprojectVector(
new THREE.Vector3(
xx * 2 - 1,
yy * 2 + 1,
0.5
),
stage.getCamera()
);
stage.getRay().direction = mouse3D.subSelf(stage.getCamera().position).normalize();
list = stage.getRay().intersectScene(stage.getScene());
for(i in list){
if(list[i].object.isPanel){
list[i].object.visible = true;
break;
}
}
}
if(isDown){
stage.cameraAngle3.x = (dragPoint.x - e.pageX) / 5 + startAngle.x;
stage.cameraAngle3.y = (e.pageY - dragPoint.y) / 10 + startAngle.y;
stage.cameraAngle3.y = Math.min(Math.max(stage.cameraAngle3.y, 10), 55);
stage.cameraAngle3.z = (dragPoint.x - e.pageX) / 5 + startAngle.z;
if(!isDrag && Math.abs(dragPoint.x - e.pageX) + Math.abs(e.pageY - dragPoint.y) > 5){
isDrag = true;
}
}
});
//Stats SetUp
stats = new Stats();
stats.domElement.style.position = \'absolute\';
stats.domElement.style.top = \'0px\';
stats.domElement.style.zIndex = 100;
el.appendChild(stats.domElement);
document.getElementById("renderer").innerHTML = stage.useWebgl() ? "WebGLRenderer" : "CanvasRenderer" ;
//cycle engine start
timer = setInterval(update, 1000 / frameRate);
});