) webgl failure: ${Q}`)}}class M0 extends v{C;el;frameTimes=[];maxFrameTimes=100;lastFrameTime=0;constructor(C,V="#telemetry"){super(C);this.app=C;if(this.el=document.querySelector(V),this.el&&location.search.includes("telemetry"))this.el.style.display="block"}insertTime(C){if(this.frameTimes.push(C),this.frameTimes.length>this.maxFrameTimes)this.frameTimes.shift()}onStart(){this.lastFrameTime=0,this.frameTimes=[],setInterval(()=>{const C=this.frameTimes.reduce((M,Q)=>M+Q,0)/this.frameTimes.length,V=1000/C;this.el.innerHTML=`${V.toFixed(1)} FPS (${C.toFixed(3)} ms)
bU: ${this.app.registry.onBeforeUpdate.length} | U: ${this.app.registry.onUpdate.length} | aU: ${this.app.registry.onAfterUpdate.length}`},1001)}onAfterUpdate(C){const V=C-this.lastFrameTime;this.insertTime(V),this.lastFrameTime=C}}class Q0{C;canvas;telemetry;gl;registry={onBeforeUpdate:[],onAfterUpdate:[],onUpdate:[],onStart:[],onDraw:[]};constructor(C={}){this.config=C;try{this.canvas=document.querySelector("canvas"),this.canvas.width=window.innerWidth,this.canvas.height=window.innerHeight;const V=this.canvas.getContext("webgl2");if(!V)throw new Error("Canvas was unable to get a webgl2 context");const M=this.gl=V;if(M.viewport(0,0,M.drawingBufferWidth,M.drawingBufferHeight),location.search.includes("telemetry"))this.telemetry=new M0(this)}catch(V){const M=document.querySelector("main");if(M)M.innerHTML="your browser didn't let me set up webgl.
";throw new Error(`Unable to initialize WebGL. Your browser or machine may not support it.\n -> ${V}`)}}get aspect(){return this.canvas.clientWidth/this.canvas.clientHeight}clear(){const C=this.gl;C.clearColor(0,0,0,1),C.clearDepth(1),C.enable(C.DEPTH_TEST),C.depthFunc(C.LEQUAL),C.clear(C.COLOR_BUFFER_BIT|C.DEPTH_BUFFER_BIT)}onBeforeUpdate(C){this.registry.onBeforeUpdate.push(C)}onAfterUpdate(C){this.registry.onAfterUpdate.push(C)}onUpdate(C){this.registry.onUpdate.push(C)}onStart(C){this.registry.onStart.push(C)}onDraw(C){this.registry.onDraw.push(C)}doUpdate(C){this.registry.onBeforeUpdate.forEach((V)=>V(C,this)),this.registry.onUpdate.forEach((V)=>V(C,this)),this.registry.onAfterUpdate.forEach((V)=>V(C,this)),this.registry.onDraw.forEach((V)=>V(C,this))}doStart(C=0){this.clear(),this.registry.onStart.forEach((V)=>V(C,this))}async oneShot(C=0){this.doStart(C),this.doUpdate(C)}async start(){this.doStart();const C=(V)=>{this.doUpdate(V),requestAnimationFrame(C)};requestAnimationFrame(C)}}class I0 extends v{C;V;M;constructor(C,V,M){super(C);this.app=C;this.transform=V;this.renderer=M}onDraw(C){this.renderer.onRenderableUpdate(C,this.transform)}}class y{C;static VERTEX=35633;static FRAGMENT=35632;constructor(C={}){this.config=C}vertexCode="";fragmentCode="";_app;_program=null;get gl(){const C=this._app?.gl;if(!C)throw new Error("GL context not defined at shader compile time.");return C}app(C){return this._app=C,this._program=C.gl.createProgram(),this}vertex(C){return this.vertexCode=C,this}fragment(C){return this.fragmentCode=C,this}attrib(C){return this.gl.getAttribLocation(this._program,C)}uniform(C){return this.gl.getUniformLocation(this._program,C)}attach(C,V){const M=this.gl,Q=M.createShader(C);if(!Q)throw new Error(`failed to init ${oV(C)} shader`);M.shaderSource(Q,V),M.compileShader(Q),M.attachShader(this._program,Q)}compile(){const C=this.gl;this.attach(C.FRAGMENT_SHADER,this.fragmentCode),this.attach(C.VERTEX_SHADER,this.vertexCode)}link(){if(this.gl.linkProgram(this._program),!this.gl.getProgramParameter(this._program,this.gl.LINK_STATUS))throw new Error("Unable to initialize the shader program: "+this.gl.getProgramInfoLog(this._program))}bindAttrib(C,V){this.gl.bindAttribLocation(this._program,C,V)}setupUniforms(C,V,M,Q){const I=Q.toMat4();g.invert(I,I);const{gl:N}=this._app;if(N.useProgram(this._program),N.uniformMatrix4fv(this.uniform("uProjectionMatrix"),!1,V),this.config.time)N.uniform1f(this.uniform("uTime"),C);const Y=g.clone(M.toMat4());g.fromQuat(Y,Q.rotation),g.translate(Y,Y,Q.position),N.uniformMatrix4fv(this.uniform("uModelViewMatrix"),!1,Y)}use(){this._app?.gl.useProgram(this._program)}}var oV=(C)=>{switch(C){case y.FRAGMENT:return"fragment";case y.VERTEX:return"vertex";default:return"some unknown type of"}};var x0=`#version 300 es
-precision highp float;uniform float uTime;uniform float uSinTime;uniform float uCosTime;in vec2 vTextureCoord;out vec4 fragColor;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}void main(){float zComponent=uSinTime*0.001*0.5+0.5;vec3 hsv=rgb2hsv(vec3(vTextureCoord,zComponent));hsv.x+=uTime*0.0001;hsv.y=1.0;hsv.z=1.0;vec3 rgb=hsv2rgb(hsv);fragColor=vec4(rgb,1.0);fragColor=clamp(fragColor,0.0,1.0);}`;var s0=`#version 300 es
+precision highp float;uniform float uTime;in vec2 vTextureCoord;out vec4 fragColor;vec3 rgb2hsv(vec3 c){vec4 K=vec4(0.0,-1.0/3.0,2.0/3.0,-1.0);vec4 p=mix(vec4(c.bg,K.wz),vec4(c.gb,K.xy),step(c.b,c.g));vec4 q=mix(vec4(p.xyw,c.r),vec4(c.r,p.yzx),step(p.x,c.r));float d=q.x-min(q.w,q.y);float e=1.0e-10;return vec3(abs(q.z+(q.w-q.y)/(6.0*d+e)),d/(q.x+e),q.x);}vec3 hsv2rgb(vec3 c){vec4 K=vec4(1.0,2.0/3.0,1.0/3.0,3.0);vec3 p=abs(fract(c.xxx+K.xyz)*6.0-K.www);return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);}void main(){float zComponent=sin(uTime)*0.001*0.5+0.5;vec3 hsv=rgb2hsv(vec3(vTextureCoord,zComponent));hsv.x+=uTime*0.0001;hsv.y=1.0;hsv.z=1.0;vec3 rgb=hsv2rgb(hsv);fragColor=vec4(rgb,1.0);fragColor=clamp(fragColor,0.0,1.0);}`;var s0=`#version 300 es
layout(location=0)in vec4 aVertexPosition;layout(location=1)in vec2 aTextureCoord;uniform mat4 uModelViewMatrix;uniform mat4 uProjectionMatrix;out vec2 vTextureCoord;void main(){gl_Position=uProjectionMatrix*uModelViewMatrix*aVertexPosition;vTextureCoord=aTextureCoord;}`;var m0=(C)=>new y({time:!0}).vertex(s0).fragment(x0).app(C);class N0{C;constructor(C){this.config=C}get name(){return this.config.name}}var CM=new Float32Array([0,2.609,0,-0.368004,2.9959495,0.50652,-0.595448,2.9959495,-0.19346951,0,2.609,0,0.368004,2.9959495,0.50652,0,2.609,0,-0.595448,2.9959495,-0.19346951,0,2.9959495,-0.6260975,0,2.609,0,0.595448,2.9959495,-0.19346951,0,2.609,0,0,3.6220505,0.6260975,-0.595448,3.6220505,0.19346951,-0.368004,3.6220505,-0.50652,0.368004,3.6220505,-0.50652,0.595448,3.6220505,0.19346951,-0.368004,3.6220505,-0.50652,0,4.0090003,0,0,4.0090003,0,0,4.0090003,0,0,4.0090003,0,0,4.0090003,0,1,0,0,0,2.5,0,-0.000000043711392,0,1,-1,0,-0.000000087422784,-0.000000043711392,0,1,0.0000000119248815,0,-1,1,0,0,0.0000000119248815,0,-1,-1,0,-0.000000087422784]),VM=new Uint8Array([0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255,0,1,255,255]),MM=new Float32Array([0.00013659838,0.8180941,0.15755458,0.7272099,0.1575546,0.9089782,0.00013659043,0.6363257,0.15755458,0.54544157,0.0001365666,0.09102075,0.15755455,0.00013656964,0.15755457,0.18190491,0.00013657454,0.2727891,0.15755457,0.36367324,0.00013658249,0.45455742,0.31497157,0.6363257,0.31497157,0.8180941,0.31497154,0.09102073,0.31497154,0.27278906,0.31497154,0.45455742,0.31497157,0.9998634,0.47238955,0.72720987,0.47238958,0.9089782,0.47238955,0.1819049,0.47238955,0.36367324,0.47238955,0.54544157,0.8119813,0.33945516,0.642322,0.16979587,0.8119813,0.00013659486,0.47266275,0.00013660162,0.81198126,0.6790469,0.47266275,0.33972836,0.47266272,0.6790469,0.47266275,0.33945513,0.81198126,0.3397284]),QM=new Float32Array([0,-1,0.00000083803394,-0.5257306,-0.44721383,0.723607,-0.8506533,-0.44721213,-0.2763879,0,-1,0.00000083803394,0.5257306,-0.4472139,0.723607,0,-1,0.00000083803394,-0.8506533,-0.44721213,-0.2763879,0,-0.44721153,-0.89442825,0,-1,0.00000083803394,0.8506533,-0.4472122,-0.27638793,0,-1,0.00000083803394,0,0.44721153,0.89442825,-0.8506533,0.44721216,0.27638793,-0.5257306,0.4472139,-0.72360694,0.5257306,0.4472139,-0.72360694,0.85065323,0.4472122,0.2763879,-0.5257306,0.4472139,-0.72360694,0,1,-0.0000008165459,0,1,-0.0000008165459,0,1,-0.0000008165459,0,1,-0.0000008165459,0,1,-0.0000008165459,0.8999471,-0.43599886,0.00000024163015,-0.00000005150958,1,0,-0.000000030203772,-0.4359989,0.8999472,-0.8999471,-0.4359989,-0.00000024291313,-0.000000030203772,-0.4359989,0.8999472,0,-0.43599886,-0.8999471,0.8999471,-0.43599886,0.00000024163015,0,-0.43599886,-0.8999471,-0.8999471,-0.4359989,-0.00000024291313]),IM=new Uint32Array([0,1,2,1,3,4,5,6,7,8,7,9,10,9,4,1,4,11,2,1,12,7,6,13,9,7,14,4,9,15,1,11,12,2,12,16,7,13,14,9,14,15,4,15,11,12,11,17,16,12,18,14,13,19,15,14,20,11,15,21,22,23,24,24,23,25,26,27,28,25,23,29,29,23,22,26,30,27]),e0=new N0({colors:VM,faces:IM,name:"src/meshes/trianglething.ply",normals:QM,positions:CM,uvs:MM,vertexCount:31});var b=new Q0({fov:45}),NM=new i([0,-2,-6]);new I0(b,new i,new V0(b,e0,m0(b),NM).configure({}));b.start();
diff --git a/src/common-shaders/uv-rainbow.frag b/src/common-shaders/uv-rainbow.frag
index 0d587e0..81ad4c4 100644
--- a/src/common-shaders/uv-rainbow.frag
+++ b/src/common-shaders/uv-rainbow.frag
@@ -2,8 +2,6 @@
precision highp float;
uniform float uTime;
-uniform float uSinTime;
-uniform float uCosTime;
in vec2 vTextureCoord;
out vec4 fragColor;
@@ -25,7 +23,7 @@ vec3 hsv2rgb(vec3 c) {
}
void main() {
- float zComponent = uSinTime * 0.001 * 0.5 + 0.5;
+ float zComponent = sin(uTime) * 0.001 * 0.5 + 0.5;
vec3 hsv = rgb2hsv(vec3(vTextureCoord, zComponent));
hsv.x += uTime * 0.0001;
hsv.y = 1.0;