Pen Settings

HTML

CSS

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URLs added here will be added as <link>s in order, and before the CSS in the editor. You can use the CSS from another Pen by using its URL and the proper URL extension.

+ add another resource

JavaScript

Babel includes JSX processing.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Packages

Add Packages

Search for and use JavaScript packages from npm here. By selecting a package, an import statement will be added to the top of the JavaScript editor for this package.

Behavior

Save Automatically?

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

Format on Save

If enabled, your code will be formatted when you actively save your Pen. Note: your code becomes un-folded during formatting.

Editor Settings

Code Indentation

Want to change your Syntax Highlighting theme, Fonts and more?

Visit your global Editor Settings.

HTML

              
                <canvas id="app"></canvas>
<script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js'></script><script  src="./script.js"></script>
              
            
!

CSS

              
                #app {
  width: 100vw;
  height: 100vh;
}
              
            
!

JS

              
                
var go_half=0;
var go_left=0,go_right=0,go_up=0,go_down=0;
var player={};
player.position={x:0,y:1.5,z:2,s:0};
player.direction={x:0,y:0,z:-1};
player.angle={z:90,y:0};
var radian=Math.PI/180;


var mouse_sensitive=0.125;

var speed=0.1;
var go_lrc=Math.cos((player.angle.y)*radian)*speed;
var go_lrs=Math.sin((player.angle.y)*radian)*speed;
var go_udc=Math.cos((player.angle.y+90)*radian)*speed;
var go_uds=Math.sin((player.angle.y+90)*radian)*speed;


function lockChangeAlert(){
if(document.pointerLockElement===canvas || document.mozPointerLockElement===canvas){ document.addEventListener("mousemove",updatePosition,false); }
else{ document.removeEventListener("mousemove",updatePosition,false); }
}


function updatePosition(e,move_x,move_y){


// ÅÑËÈ ÍÅÒ move_x, ÇÍÀ×ÈÒ ÏÎÂÎÐÎÒ ÌÛØÊÎÉ
if(move_x==undefined){
player.angle.z+=e.movementY*mouse_sensitive;
player.angle.y-=e.movementX*mouse_sensitive;
}
// ÅÑËÈ ÅÑÒÜ, ÒÎ ÏÎÂÎÐÀ×ÈÂÀÅÌ ÍÀ ÝÒÓ ÂÅËÈ×ÈÍÓ
else{
player.angle.z-=move_y*mouse_sensitive;
player.angle.y+=move_x*mouse_sensitive;
}


if(player.angle.z>170){ player.angle.z=170; }
if(10>player.angle.z){ player.angle.z=10; }


if(player.angle.y>360){ player.angle.y-=360; }
if(player.angle.y<0){ player.angle.y+=360; }


go_lrc=Math.cos(player.angle.y*radian)*speed;
go_lrs=Math.sin(player.angle.y*radian)*speed;
go_udc=Math.cos((player.angle.y+90)*radian)*speed;
go_uds=Math.sin((player.angle.y+90)*radian)*speed;


player.direction.x=Math.cos((-player.angle.y-90)*radian)*(Math.sin(player.angle.z*radian));
player.direction.y=Math.cos(player.angle.z*radian);
player.direction.z=Math.sin((-player.angle.y-90)*radian)*(Math.sin(player.angle.z*radian));
try{
camera.lookAt(player.position.x+player.direction.x,player.position.y+player.direction.y,player.position.z+player.direction.z);
}
catch(e){}

}


function key(which,to){
if(which==65){ go_left=to; }
if(which==87){ go_up=to; }
if(which==68){ go_right=to; }
if(which==83){ go_down=to; }
}


document.onkeydown=function(e){ key((e||window.event).keyCode,1); }
document.onkeyup=function(e){ key((e||window.event).keyCode,0); }


var vs=[];
var fs=[];
var mesh=[];
var tex=[];
var mat=[];


var texture_loader=new THREE.TextureLoader();


const canvas = document.querySelector('#app');
const width = canvas.clientWidth;
const height = canvas.clientHeight;


canvas.requestPointerLock=canvas.requestPointerLock || canvas.mozRequestPointerLock;
document.exitPointerLock=document.exitPointerLock || document.mozExitPointerLock;
document.addEventListener("pointerlockchange",lockChangeAlert,false);
document.addEventListener("mozpointerlockchange",lockChangeAlert,false);
canvas.onclick=canvas.requestPointerLock;


const context = canvas.getContext('webgl');
const renderer = new THREE.WebGLRenderer({
  antialias: true,
  alpha: true,
  transparent:true,
  canvas: canvas,
  context: context,
});
renderer.setClearColor(0xB9EEFF,1);
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(width, height, false);


const camera = new THREE.PerspectiveCamera(45,width/height,0.05,100000);
const scene = new THREE.Scene();
const pl1 = new THREE.PointLight(0xFEE3B1, 2);
pl1.position.set(-20,20,20);
scene.add(pl1);
const clock = new THREE.Clock();


tex["one"]=texture_loader.load("data:image/png;base64,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");


tex["two"]=texture_loader.load("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGoWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMxNDUgNzkuMTYzNDk5LCAyMDE4LzA4LzEzLTE2OjQwOjIyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIwLTEwLTA2VDE3OjEwOjAzKzAzOjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMi0wMS0wNlQwOTo0NzowNyswMzowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMi0wMS0wNlQwOTo0NzowNyswMzowMCIgZGM6Zm9ybWF0PSJpbWFnZS9wbmciIHBob3Rvc2hvcDpDb2xvck1vZGU9IjMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODU0MzgzMmUtMTBiMy1kZDRlLWE4ZDQtZWY1ZjcxZWQ5YWI5IiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6ZDA2OWRjYTItNmM4OC01OTRiLThkMjMtMDZlYTc1OWEzNzY2IiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6MWJjZmIxZWUtZjc2OC0wODQxLWI1Y2UtMDYwYjVjZmQ1NjQ0Ij4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDoxYmNmYjFlZS1mNzY4LTA4NDEtYjVjZS0wNjBiNWNmZDU2NDQiIHN0RXZ0OndoZW49IjIwMjAtMTAtMDZUMTc6MTA6MDMrMDM6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE5IChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6ODZhMzU2YTEtZjY1NC1mZDQyLWFhODctNzUyZTlkYzc3ODRlIiBzdEV2dDp3aGVuPSIyMDIyLTAxLTA0VDEzOjIzOjM0KzAzOjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxOSAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPHJkZjpsaSBzdEV2dDphY3Rpb249InNhdmVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjg1NDM4MzJlLTEwYjMtZGQ0ZS1hOGQ0LWVmNWY3MWVkOWFiOSIgc3RFdnQ6d2hlbj0iMjAyMi0wMS0wNlQwOTo0NzowNyswMzowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTkgKFdpbmRvd3MpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PuQrPqkAAB4KSURBVHja5XtplF1Hde63q85056HnuVvdrZZkyZZtWfIo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");


tex["floor"]=texture_loader.load("data:image/png;base64,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");
tex["floor"].wrapS=tex["floor"].wrapT=THREE.RepeatWrapping;
tex["floor"].repeat.set(10,10);

vs["sprite"]=`


attribute vec3 offset;
attribute vec2 scale;
attribute vec4 quaternion;
attribute float rotation;
attribute vec4 color;
attribute float blend;
attribute float texture;
uniform float time;
varying vec2 vUv;
varying vec4 vColor;
varying float vBlend;
varying float num;


void main(){


float angle=time*rotation;
vec3 vRotated=vec3(position.x*scale.x*cos(angle)-position.y*scale.y*sin(angle),position.y*scale.y*cos(angle)+position.x*scale.x*sin(angle),position.z);


vUv=uv;
vColor=color;
vBlend=blend;
num=texture;


vec3 localUpVector=vec3(0.0,1.0,0.0);
vec3 vLook=offset-cameraPosition;
vec3 vRight=normalize(cross(vLook,localUpVector));
vec3 vPosition=vRotated.x*vRight+vRotated.y*localUpVector+vRotated.z;


gl_Position=projectionMatrix*modelViewMatrix*vec4(vPosition+offset,1.0);


}


`;


fs["sprite"]=`


const int count=2;
uniform sampler2D map[count];
varying vec2 vUv;
varying vec4 vColor;
varying float vBlend;
varying float num;


void main(){


if(num==0.0){ gl_FragColor=texture2D(map[0],vUv)*vColor; }
else if(num==1.0){ gl_FragColor=texture2D(map[1],vUv)*vColor; }


gl_FragColor.rgb*=gl_FragColor.a;
gl_FragColor.a*=vBlend;


}


`;


var particles=[];


function particles_update(){


particles=[];


var max_1=particles_flare_a.length;
particles.length=max_1;
for(var n=0;n<max_1;n++){
particles[n]=particles_flare_a[n];
}


var count=particles.length;
var item=camera.position;
var x=item.x;
var y=item.y;
var z=item.z;


for(var n=0;n<count;n++){
var item=particles[n].offset;
particles[n].d=Math.sqrt(Math.pow((x-item[0]),2)+Math.pow((y-item[1]),2)+Math.pow((z-item[2]),2));
}


particles.sort((a,b)=>b.d-a.d);


var offset=new Float32Array(count*3);
var scale=new Float32Array(count*2);
var quaternion=new Float32Array(count*4);
var rotation=new Float32Array(count);
var color=new Float32Array(count*4);
var blend=new Float32Array(count);
var texture=new Float32Array(count);


for(var n=0;n<count;n++){


// 1 VALUE
var item=particles[n];
rotation[n]=item.rotation;
texture[n]=item.texture;
blend[n]=item.blend;


// 2 VALUE
var p=n*2;
var one=p+1;
var i_scale=item.scale;
scale[p]=i_scale[0];
scale[one]=i_scale[1];


// 3 VALUE
var p=n*3;
var one=p+1;
var two=p+2;
var i_offset=item.offset;
offset[p]=i_offset[0];
offset[one]=i_offset[1];
offset[two]=i_offset[2];


// 4 VALUE
var p=n*4;
var one=p+1;
var two=p+2;
var three=p+3;
var i_color=item.color;
color[p]=i_color[0];
color[one]=i_color[1];
color[two]=i_color[2];
color[three]=i_color[3];
var i_quaternion=item.quaternion;
quaternion[p]=i_quaternion[0];
quaternion[one]=i_quaternion[1];
quaternion[two]=i_quaternion[2];
quaternion[three]=i_quaternion[3];


}


var item=mesh["sprite"].geometry.attributes;
item.offset=new THREE.InstancedBufferAttribute(offset,3).setUsage(THREE.DynamicDrawUsage);
item.scale=new THREE.InstancedBufferAttribute(scale,2).setUsage(THREE.DynamicDrawUsage);
item.quaternion=new THREE.InstancedBufferAttribute(quaternion,4).setUsage(THREE.DynamicDrawUsage);
item.rotation=new THREE.InstancedBufferAttribute(rotation,1).setUsage(THREE.DynamicDrawUsage);
item.color=new THREE.InstancedBufferAttribute(color,4).setUsage(THREE.DynamicDrawUsage);
item.blend=new THREE.InstancedBufferAttribute(blend,1).setUsage(THREE.DynamicDrawUsage);
item.texture=new THREE.InstancedBufferAttribute(texture,1).setUsage(THREE.DynamicDrawUsage);


mesh["sprite"].geometry._maxInstanceCount=count;


}


var geometry=new THREE.InstancedBufferGeometry();
geometry.setAttribute('position',new THREE.Float32BufferAttribute(new Float32Array([-0.5,0.5,0,-0.5,-0.5,0,0.5,0.5,0,0.5,-0.5,0,0.5,0.5,0,-0.5,-0.5,0]),3));
geometry.setAttribute('uv',new THREE.Float32BufferAttribute(new Float32Array([0,1,0,0,1,1,1,0,1,1,0,0]),2));
geometry.setAttribute('offset',new THREE.InstancedBufferAttribute(new Float32Array(),3));
geometry.setAttribute('scale',new THREE.InstancedBufferAttribute(new Float32Array(),2));
geometry.setAttribute('quaternion',new THREE.InstancedBufferAttribute(new Float32Array(),4));
geometry.setAttribute('rotation',new THREE.InstancedBufferAttribute(new Float32Array(),1));
geometry.setAttribute('color',new THREE.InstancedBufferAttribute(new Float32Array(),4));
geometry.setAttribute('blend',new THREE.InstancedBufferAttribute(new Float32Array(),1));
geometry.setAttribute('texture',new THREE.InstancedBufferAttribute(new Float32Array(),1));


mat["sprite"]=new THREE.ShaderMaterial({
uniforms:{
map:{value:[tex["one"],tex["two"]]},
time:{value:0}
},
vertexShader:vs["sprite"],
fragmentShader:fs["sprite"],
side:THREE.DoubleSide,
transparent:true,
depthWrite:false,
blending:THREE.CustomBlending,
blendEquation:THREE.AddEquation,
blendSrc:THREE.OneFactor,
blendDst:THREE.OneMinusSrcAlphaFactor
});


mesh["sprite"]=new THREE.Mesh(geometry,mat["sprite"]);
mesh["sprite"].frustumCulled=false;
mesh["sprite"].matrixAutoUpdate=false;
mesh["sprite"].updateMatrixWorld=function(){};
scene.add(mesh["sprite"]);


var particles_flare_a=[];


particles_flare_a.push({offset:[10,2,0],scale:[4,4],quaternion:[0,0,0,1],rotation:0,color:[1,1,1,1],blend:1,texture:1});


for(var n=0;n<100;n++){
particles_flare_a.push({offset:[Math.random()*20-10,0.5,Math.random()*20-10],scale:[1,1],quaternion:[0,0,0,1],rotation:10,color:[Math.random()*0.1,Math.random()*0.1,Math.random()*0.1,1],blend:1,texture:0});
}


for(var n=0;n<100;n++){
var scale=Math.random()*0.5+0.5;
particles_flare_a.push({offset:[Math.random()*20-10,scale/2,Math.random()*20-10],scale:[scale,scale],quaternion:[0,0,0,1],rotation:0,color:[1,1,1,1],blend:1,texture:1});
}


mat["floor"]=new THREE.MeshStandardMaterial({
map:tex["floor"],bumpMap:tex["floor"],bumpScale:0.005,metalness:0.16
})


mesh["floor"]=new THREE.Mesh(new THREE.BoxBufferGeometry(20,1,20),mat["floor"]);
mesh["floor"].position.y=-0.5;
scene.add(mesh["floor"]);



function loop(){


requestAnimationFrame(loop);
const delta=clock.getDelta();
particles_update();
mat["sprite"].uniforms.time.value=clock.elapsedTime;


go_half=0;


if(go_left==1){ go_half++;  }
if(go_right==1){ go_half++; ; }
if(go_up==1){ go_half++; }
if(go_down==1){ go_half++;  }


if(go_half>1){ go_half=0.68; }


if(go_left==1){ player.position.x-=go_lrc*go_half; player.position.z+=go_lrs*go_half; }
if(go_right==1){ player.position.x+=go_lrc*go_half; player.position.z-=go_lrs*go_half; }
if(go_up==1){ player.position.x+=go_udc*go_half; player.position.z-=go_uds*go_half; }
if(go_down==1){  player.position.x-=go_udc*go_half; player.position.z+=go_uds*go_half; }


camera.position.set(player.position.x,player.position.y,player.position.z);


renderer.render(scene, camera);


}


loop();
              
            
!
999px

Console