100 lines
3.1 KiB
JavaScript
100 lines
3.1 KiB
JavaScript
let i = 0;
|
|
|
|
/**
|
|
* Preload textures to GPU that are not visible from the start..
|
|
* three.js renderer by default will not upload textures from non-visible entities.
|
|
*/
|
|
AFRAME.registerComponent('gpu-preloader', {
|
|
play: function () {
|
|
this.preloadMineEnvMaps();
|
|
|
|
setTimeout(() => {
|
|
this.preloadBeamMap();
|
|
this.preloadBeatEnvMap();
|
|
this.preloadCutParticles();
|
|
this.preloadKeyboard();
|
|
this.preloadMissMap();
|
|
this.preloadPlayButton();
|
|
this.preloadSearchPrevPage();
|
|
this.preloadWallMap();
|
|
this.preloadWrongMap();
|
|
}, 1000);
|
|
},
|
|
|
|
preloadBeamMap: function () {
|
|
const beams = document.querySelector('[beams]');
|
|
this.preloadTexture(beams.components.beams.texture);
|
|
},
|
|
|
|
preloadBeatEnvMap: function () {
|
|
const beat = document.querySelector('#beatContainer [mixin~="beat"]');
|
|
beat.object3D.traverse(node => {
|
|
if (!node.material) { return; }
|
|
if (node.material.envMap) {
|
|
this.preloadTexture(node.material.envMap);
|
|
}
|
|
if (node.material.map) {
|
|
this.preloadTexture(node.material.map);
|
|
}
|
|
});
|
|
},
|
|
|
|
preloadCutParticles: function () {
|
|
const particles = document.querySelector('#saberParticles');
|
|
this.preloadTexture(particles.components.particleplayer.material.map);
|
|
},
|
|
|
|
preloadKeyboard: function () {
|
|
const keyboard = document.getElementById('keyboard').components['super-keyboard'];
|
|
this.preloadTexture(keyboard.kbImg.getObject3D('mesh').material.map);
|
|
this.preloadTexture(keyboard.keyColorPlane.getObject3D('mesh').material.map);
|
|
},
|
|
|
|
preloadMineEnvMaps: function () {
|
|
const stageColors = this.el.sceneEl.components['stage-colors'];
|
|
this.el.sceneEl.addEventListener('mineredenvmaploaded', () => {
|
|
this.preloadTexture(stageColors.mineEnvMap.red);
|
|
});
|
|
this.el.sceneEl.addEventListener('mineblueenvmaploaded', () => {
|
|
this.preloadTexture(stageColors.mineEnvMap.blue);
|
|
});
|
|
},
|
|
|
|
preloadMissMap: function () {
|
|
const miss = document.querySelector('#missLeft');
|
|
this.preloadTexture(miss.getObject3D('mesh').material.map);
|
|
},
|
|
|
|
preloadPlayButton: function () {
|
|
const playButton = document.querySelector('#playButton');
|
|
this.preloadTexture(playButton.getObject3D('mesh').material.map);
|
|
},
|
|
|
|
preloadSearchPrevPage : function () {
|
|
const prevPage = document.querySelector('#searchPrevPage');
|
|
this.preloadTexture(prevPage.children[0].getObject3D('mesh').material.map);
|
|
},
|
|
|
|
preloadWallMap: function () {
|
|
const wall = document.querySelector('a-entity[wall]');
|
|
this.preloadTexture(wall.getObject3D('mesh').material.uniforms.tex.value);
|
|
},
|
|
|
|
preloadWrongMap: function () {
|
|
const wrong = document.querySelector('#wrongLeft');
|
|
this.preloadTexture(wrong.getObject3D('mesh').material.map);
|
|
},
|
|
|
|
preloadTexture: function (texture) {
|
|
if (!texture || !texture.image) {
|
|
console.warn('[gpu-preloader] Error preloading texture', texture);
|
|
return;
|
|
}
|
|
if (!texture.image.complete) {
|
|
console.warn('[gpu-preloader] Error preloading, image not loaded', texture);
|
|
return;
|
|
}
|
|
this.el.renderer.setTexture2D(texture, i++ % 8);
|
|
}
|
|
});
|