Animating the 90Tech's logo
A Pen by Renaud ROHLINGER on CodePen.
Animating the 90Tech's logo
A Pen by Renaud ROHLINGER on CodePen.
| var scene = new THREE.Scene(); | |
| var renderer = new THREE.WebGLRenderer(); | |
| var camera = new THREE.PerspectiveCamera(45, 0, 1, 2000); | |
| var mesh = null; | |
| // basic stuff | |
| function initThree () { | |
| renderer.setPixelRatio(window.devicePixelRatio || 1); | |
| renderer.setClearColor(0x161216); | |
| camera.position.y = 0; |
| function resize () { | |
| renderer.height = window.innerHeight; | |
| renderer.width = window.innerWidth; | |
| renderer.setSize(renderer.width, renderer.height); | |
| camera.aspect = renderer.width / renderer.height; | |
| camera.updateProjectionMatrix(); | |
| } |
| function render() { | |
| renderer.render( scene, camera ); | |
| } | |
| function animate() { | |
| // render the 3D scene | |
| render(); | |
| requestAnimationFrame( animate ); | |
| } |
| var mesh = null; | |
| var dummy = new THREE.Object3D(); | |
| var sectionWidth = 200; | |
| function addInstancedMesh() { | |
| // An InstancedMesh of 4 cubes | |
| mesh = new THREE.InstancedMesh(new THREE.BoxBufferGeometry(50,50,50), new THREE.MeshNormalMaterial(), 4); | |
| scene.add(mesh); | |
| setInstancedMeshPositions(mesh); | |
| } |
| function loopFunction() { | |
| var distance = Math.round(camera.position.x / sectionWidth) | |
| if (distance !== this.loopSectionPosition) { | |
| loopSectionPosition = distance | |
| setInstancedMeshPositions(mesh, loopSectionPosition) | |
| } | |
| } | |
| function render() { | |
| // move the camera |
| function setInstancedMeshPositions(mesh, section) { | |
| for ( var i = 0; i < mesh.count; i ++ ) { | |
| var xStaticPosition = -sectionWidth * (i - 1); | |
| var xSectionPosition = sectionWidth * section; | |
| var x = xStaticPosition + xSectionPosition; | |
| dummy.position.set(x, 0, 0); | |
| dummy.updateMatrix(); | |
| mesh.setMatrixAt( i, dummy.matrix ); | |
| } | |
| mesh.instanceMatrix.needsUpdate = true; |
| function setInstancedMeshPositions(mesh, section) { | |
| for ( var i = 0; i < mesh.count; i ++ ) { | |
| var xStaticPosition = -sectionWidth * (i - 1); | |
| var xSectionPosition = sectionWidth * section; | |
| var x = xStaticPosition + xSectionPosition; | |
| dummy.position.set(x, 0, 0); | |
| dummy.updateMatrix(); | |
| mesh.setMatrixAt( i, dummy.matrix ); | |
| } | |
| mesh.instanceMatrix.needsUpdate = true; |
| function setInstancedMeshPositions(mesh, section) { | |
| for ( var i = 0; i < mesh.count; i ++ ) { | |
| var xStaticPosition = -sectionWidth * (i - 1); | |
| var xSectionPosition = sectionWidth * section; | |
| var x = xStaticPosition + xSectionPosition; | |
| dummy.position.set(x, 0, 0); | |
| dummy.updateMatrix(); | |
| mesh.setMatrixAt( i, dummy.matrix ); | |
| } | |
| mesh.instanceMatrix.needsUpdate = true; |
| const getMUIDIndex = (muid: string) => muid === 'muid' | |
| el.material.defines = Object.assign(el.material.defines || {}, { | |
| muid: el.material.id | |
| }) | |
| gl.info.programs?.forEach(program => { | |
| const cacheKeySplited = program.cacheKey.split(',') | |
| console.log(cacheKeySplited[cacheKeySplited.findIndex(getMUIDIndex) + 1]) // will get the material id in the program | |
| }); |