var THREE,my={};function d3flyerMain(type){var version='0.52'
my.type=typeof type!=='undefined'?type:'cube'
my.clrs=[["Blue",'#0000ff'],["Red",'#ff0000'],["Green",'#00cc00'],["Orange",'#FFA500'],["Slate Blue",'#6A5ACD'],["Lime",'#00FF00'],["Spring Green",'#00FF7F'],["Teal",'#008080'],["Gold",'#ffd700'],["Med Purple",'#aa00aa'],["Light Blue",'#ADD8E6'],["Navy",'#000080'],["Purple",'#800080'],["Dark SeaGreen",'#8FBC8F'],["Black",'#000000']];var s=''
s+=`
© 2019 MathsIsFun.com v${version}
`
document.write(s);my.imgHome=(document.domain=='localhost')?'/mathsisfun/images/':'/images/'
sceneSetup()
my.move={speed:0,side:0,up:0,yaw:0,pitch:0,roll:0}
my.yaw={tgt:0,stt:0}
my.pitch={tgt:0,stt:0}
my.moveVector=new THREE.Vector3(0,0,0);my.rotationVector=new THREE.Vector3(0,0,0);my.dragToLook=false;my.autoForward=false;my.mouseStatus=0;window.addEventListener('keydown',keydown,false);window.addEventListener('resize',resize,false);var div=document.getElementById('osd')
div.addEventListener('touchstart',touchStart,false);div.addEventListener('touchmove',touchMove,false);div.addEventListener('touchend',touchEnd,false);div.addEventListener('mousedown',mouseDown,false);div.addEventListener('mousemove',mouseMove,false);div.addEventListener('mouseup',mouseUp,false);resize();osdUpdate()
my.animWhen=0
my.fpsStt=0
animate();}
function osdUpdate(){document.getElementById('osdSpeed').innerHTML=-Math.round(my.move.speed*100)+'%'
document.getElementById('osdYaw').innerHTML=Math.round(my.move.yaw*100)+'%'
document.getElementById('osdPitch').innerHTML=Math.round(my.move.pitch*100)+'%'}
function speedChg(a,val){my.move.speed=-val/100
updateMovementVector()
osdUpdate()}
function sceneSetup(){my.scene=new THREE.Scene();var scene=my.scene
my.camera=new THREE.PerspectiveCamera(55,window.innerWidth/window.innerHeight,0.2,1000);my.camera.eulerOrder="YXZ"
my.tmpQuaternion=new THREE.Quaternion();my.renderer=new THREE.WebGLRenderer();my.renderer.setSize(window.innerWidth,window.innerHeight);my.el=my.renderer.domElement;var div=document.getElementById('anim')
div.appendChild(my.el);var texture=new THREE.TextureLoader().load(my.imgHome+'bg/a7.jpg');var texture2=new THREE.TextureLoader().load(my.imgHome+'bg/singlt12.jpg');var geometry=new THREE.BoxGeometry(2,2,2);var material=new THREE.MeshPhongMaterial({color:0xffffff,specular:0x444444,shininess:90,emissive:0x0,map:texture});var cube=new THREE.Mesh(geometry,material);cube.position.set(10,7,10);scene.add(cube);var geometry=new THREE.BoxGeometry(2,1,1);var material=new THREE.MeshPhongMaterial({color:0xffffff});var cube2=new THREE.Mesh(geometry,material);cube2.position.y+=1;cube2.receiveShadow=true;cube2.castShadow=true;my.polys=getPolyData();my.objs=objsMake(my.type,texture)
var geometry=new THREE.Geometry();var material=new THREE.MeshPhongMaterial({color:0x00ff00});geometry.vertices.push(new THREE.Vector3(-1,0,0));geometry.vertices.push(new THREE.Vector3(0,1,0));geometry.vertices.push(new THREE.Vector3(1,0,0));if(false){var meshFloor=new THREE.Mesh(new THREE.PlaneGeometry(10,10,10,10),new THREE.MeshPhongMaterial({color:0x0000ff,wireframe:false,map:texture2}));meshFloor.rotation.x-=Math.PI/2;meshFloor.receiveShadow=true;my.scene.add(meshFloor);}
if(false){my.poly=new Poly()
my.polyN=2
my.poly.shapeSource="data";my.poly.shapeType=my.polys[my.polyN][0];geometry=polyToGeometry();var material=new THREE.MeshPhongMaterial({color:0x0000ff,specular:0x888888,shininess:40,emissive:0x0,map:texture2});material.side=THREE.DoubleSide;var zz=new THREE.Mesh(geometry,material);zz.position.y+=2
zz.receiveShadow=true;zz.castShadow=true;my.scene.add(zz);my.objs.push(zz)}
var ambientLight=new THREE.AmbientLight(0xffffff,0.8);scene.add(ambientLight);var light=new THREE.PointLight(0xffffee,1.4,200,0.1);light.position.set(60,20,4);light.castShadow=true;light.shadow.camera.near=100;light.shadow.camera.far=250;scene.add(light);if(true){light=new THREE.PointLight(0x00ff00,0.1,18);light.position.set(0,7,6);light.castShadow=true;light.shadow.camera.near=0.1;light.shadow.camera.far=25;scene.add(light);}
var skyGeom=new THREE.SphereBufferGeometry(300,60,60);var texture=new THREE.TextureLoader().load(my.imgHome+'bg/sky7.jpg');var material=new THREE.MeshPhongMaterial({map:texture});var sky=new THREE.Mesh(skyGeom,material);sky.material.side=THREE.BackSide;scene.add(sky);my.camera.position.y=2
my.camera.position.z=4
my.moveVector=new THREE.Vector3(0,0,0);my.rotationVector=new THREE.Vector3(0,0,0);}
function polyToGeometry(){var surfs=my.poly.getSolid();console.log('polyToGeometry',my.poly,surfs)
var geometry=new THREE.Geometry();var joinVertsQ=true
var n=0
var verts=[]
for(var i=0;iMath.abs(face.normal[b]);});var v1=geometry.vertices[face.a];var v2=geometry.vertices[face.b];var v3=geometry.vertices[face.c];geometry.faceVertexUvs[0].push([new THREE.Vector2(v1[components[0]],v1[components[1]]),new THREE.Vector2(v2[components[0]],v2[components[1]]),new THREE.Vector2(v3[components[0]],v3[components[1]])]);});geometry.uvsNeedUpdate=true;}
function objsMake(type,texture){var objs=[];if(type=='pyramids'){for(var i=3;i<=8;i++){var geometry=new THREE.ConeGeometry(1,1.7,i);var clr='#46d'
var material=new THREE.MeshPhongMaterial({color:clr,specular:0x444444,shininess:70,emissive:0x0,map:texture});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(-9+i*2,1.5,2-i*1.1);obj.rotation.x=Math.PI/4
my.scene.add(obj);objs.push(obj);}}
if(type=='prisms'){for(var i=3;i<=8;i++){var geometry=new THREE.CylinderGeometry(0.8,0.8,2,i)
var clr='#46d'
var material=new THREE.MeshPhongMaterial({color:clr,specular:0x888888,shininess:90,emissive:0x0,map:texture});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(-9+i*2,1.5,2-i*1.1);obj.rotation.x=Math.PI/2
my.scene.add(obj);objs.push(obj);}}
if(type=='cube'){var clr=my.clrs[2][1]
var geometry=new THREE.BoxGeometry(1.5,1.5,1.5);var material=new THREE.MeshPhongMaterial({color:0x2194ce,specular:0x111111,shininess:50,emissive:0x0,map:texture});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(0,2,0);obj.receiveShadow=true;obj.castShadow=true;my.scene.add(obj);objs.push(obj);}
if(type=='sphere'){var clr=my.clrs[2][1]
var geometry=new THREE.SphereGeometry(1.2,50,50)
var material=new THREE.MeshPhongMaterial({color:0x2194ce,specular:0x111111,shininess:10,emissive:0x0,map:texture});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(0,2,0);obj.receiveShadow=true;obj.castShadow=true;my.scene.add(obj);objs.push(obj);}
if(type=='torus'){var clr=my.clrs[2][1]
var geometry=new THREE.TorusGeometry(1,0.5,16,100)
var material=new THREE.MeshPhongMaterial({color:0x2194ce,specular:0x111111,shininess:30,emissive:0x0,map:texture});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(0,2,0);obj.receiveShadow=true;obj.castShadow=true;my.scene.add(obj);objs.push(obj);}
if(type=='data'){var clr=my.clrs[2][1]
my.poly=new Poly()
my.polyN=8
my.poly.shapeSource="data";my.poly.shapeType=my.polys[my.polyN][0];var geometry=polyToGeometry();assignUVs(geometry)
geometry.computeFaceNormals();geometry.computeBoundingSphere();texture.wrapS=THREE.RepeatWrapping;texture.wrapT=THREE.RepeatWrapping;var material=new THREE.MeshPhongMaterial({color:0xaaaaaa,specular:0xffffff,shininess:30,emissive:0x0,map:texture,wireframe:false});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(0,2,0);obj.receiveShadow=true;obj.castShadow=true;my.scene.add(obj);objs.push(obj);}
if(type=='cuboid'){var clr=my.clrs[2][1]
var geometry=new THREE.BoxGeometry(4,2,2);texture.wrapS=THREE.RepeatWrapping;texture.wrapT=THREE.RepeatWrapping;texture.repeat.x=2
texture.repeat.y=1
var material=new THREE.MeshPhongMaterial({color:0x2194ce,specular:0x111111,shininess:50,emissive:0x0,map:texture});material.side=THREE.DoubleSide;var obj=new THREE.Mesh(geometry,material);obj.position.set(0,2,0);obj.receiveShadow=true;obj.castShadow=true;my.scene.add(obj);objs.push(obj);}
return objs}
function animate(){var now=performance.now();var animTime=now-my.animWhen;my.animWhen=now;my.move.yaw=0;my.move.roll=0;my.move.pitch=0;var speed=0.5
if(my.mouseStatus==1){my.yaw.stt=performance.now()
if(Math.abs(my.yaw.tgt)<0.001)my.yaw.tgt=0
my.move.yaw=my.yaw.tgt*speed
my.pitch.stt=performance.now()
if(Math.abs(my.pitch.tgt)<0.001)my.pitch.tgt=0
my.move.pitch=-my.pitch.tgt*speed}else{var elapse=(performance.now()-my.yaw.stt)/1000;if(elapse<1){var ease=Math.sqrt(1-elapse)
my.move.yaw=ease*my.yaw.tgt*speed}
elapse=(performance.now()-my.pitch.stt)/1000;if(elapse<1){var ease=Math.sqrt(1-elapse)
my.move.pitch=-ease*my.pitch.tgt*speed}}
osdUpdate()
my.frameNo=loop(my.frameNo,0,60);if(my.frameNo==0){var fps=1000/((performance.now()-my.fpsStt)/60)
my.fpsStt=performance.now()}
if(my.pauseQ){my.pauseFrame++;my.camera.quaternion.slerp(my.toQuat,my.pauseFrame/1000);my.camera.position.y=((100-my.pauseFrame)*my.pauseHeight+my.pauseFrame*2)/100;if(my.pauseFrame>100){my.pauseQ=false;my.camera.quaternion.slerp(my.toQuat,1);my.camera.position.y=2;}}
if(Math.abs(my.camera.rotation.z)>0.03){my.camera.rotation.z*=0.99}
updateRotationVector(animTime);for(var i=0;i0.2?val:0
var val=((ev.clientY-rect.top)-halfHeight)/halfHeight
my.pitch.tgt=Math.abs(val)>0.2?val:0
ev.preventDefault();ev.stopPropagation();}
function updateMovementVector(){my.moveVector.x=my.move.side
my.moveVector.y=my.move.up
my.moveVector.z=my.move.speed}
function updateRotationVector(){my.rotationVector.x=my.move.pitch;my.rotationVector.y=my.move.yaw;my.rotationVector.z=my.move.roll;}
function resize(){my.camera.aspect=window.innerWidth/window.innerHeight;my.domRect=document.getElementById('anim').getBoundingClientRect();my.camera.aspect=my.domRect.width/my.domRect.height
my.camera.updateProjectionMatrix();my.renderer.setSize(my.domRect.width,my.domRect.height)}
function Poly(){this.shapeType='cube';this.shapeSource='calc';this.scale=90;}
Poly.prototype.getSolid=function(){var C=[];switch(this.shapeSource){case "file":case "data":var solid=my.polys[my.polyN][1];var vertices=solid[3];var solidFaces=solid[5];C=[];for(var i=0;imaxNo){currNo=minNo+(currNo-minNo)%range;}
return currNo;}