UNPKG

uix-kit

Version:

A free web kits for fast web design and development, compatible with Bootstrap v5.

200 lines (126 loc) 5.02 kB
/* ************************************* * <!-- 3D Background 2 with three.js --> ************************************* */ import { UixModuleInstance, } from '@uixkit/core/_global/js'; import fragment from "./shader/fragment-custom.glsl"; import vertex from "./shader/vertex-custom.glsl"; export const THREE_BACKGROUND_THREE2 = ( ( module, $, window, document ) => { if ( window.THREE_BACKGROUND_THREE2 === null ) return false; module.THREE_BACKGROUND_THREE2 = module.THREE_BACKGROUND_THREE2 || {}; module.THREE_BACKGROUND_THREE2.version = '0.0.6'; module.THREE_BACKGROUND_THREE2.documentReady = function( $ ) { //Prevent this module from loading in other pages if ( $( '#3D-background-three-canvas2' ).length == 0 || ! Modernizr.webgl ) return false; let sceneSubjects = []; // Import objects and animations dynamically const MainStage = function() { let windowWidth = window.innerWidth, windowHeight = window.innerHeight; const rendererCanvasID = '3D-background-three-canvas2'; // Generate one plane geometries mesh to scene //------------------------------------- let camera, scene, renderer, material, displacementSprite, clock = new THREE.Clock(); const mouseVector = new THREE.Vector2(); let mouseX = 0; let mouseY = 0; function init() { //camera camera = new THREE.PerspectiveCamera( 50, windowWidth / windowHeight, .01, 1000 ); camera.position.set( 0, 0, 1.8 ); //Scene scene = new THREE.Scene(); //WebGL Renderer renderer = new THREE.WebGLRenderer( { canvas : document.getElementById( rendererCanvasID ), //canvas alpha : true, antialias: true } ); renderer.setSize( windowWidth, windowHeight ); // Immediately use the texture for material creation const cloudTexture = new THREE.TextureLoader().load($( '#' + rendererCanvasID ).data( 'filter-texture' )); cloudTexture.wrapS = cloudTexture.wrapT = THREE.RepeatWrapping; material = new THREE.ShaderMaterial({ uniforms: { uTime: { value: 0.0 }, uTexture: { value: cloudTexture }, uSpeed: { value: 0.1 }, uDistortion: { value: 0.2 }, }, fragmentShader: fragment, vertexShader: vertex, transparent: true, // Clouds need to be transparent }); cloudTexture.wrapS = cloudTexture.wrapT = THREE.RepeatWrapping; const geometry = new THREE.SphereGeometry(5, 50, 50, 0, Math.PI * 2, 0, Math.PI * 2); displacementSprite = new THREE.Mesh( geometry, material ); scene.add( displacementSprite ); // Fires when the window changes window.addEventListener( 'resize', onWindowResize, false ); document.addEventListener( 'mousemove', onDocumentMouseMove, false ); } function render() { requestAnimationFrame( render ); const delta = clock.getDelta(); //To set a background color. renderer.setClearColor( 0x000000 ); material.uniforms.uTime.value = clock.getElapsedTime(); for( let i = 0; i < sceneSubjects.length; i++ ) { sceneSubjects[i].update( clock.getElapsedTime()*1 ); } //render the scene to display our scene through the camera's eye. renderer.render( scene, camera ); } function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } function onDocumentMouseMove( event ) { const rect = renderer.domElement.getBoundingClientRect(); displacementSprite.position.z = ( event.clientX - rect.left ) / rect.width * 4 - 1; } function avgArr(arr) { const total = arr.reduce(function(sum, b) { return sum + b }); return (total / arr.length); } function maxArr(arr) { return arr.reduce(function(a, b) { return Math.max(a, b); }) } function degToRad(degrees) { return degrees * Math.PI / 180; } function round(n, digits) { return Number(n.toFixed(digits)); } // //------------------------------------- return { init : init, render : render, getRendererCanvasID : function () { return rendererCanvasID; }, getScene : function () { return scene; }, getCamera : function () { return camera; } }; }(); MainStage.init(); MainStage.render(); }; module.components.documentReady.push( module.THREE_BACKGROUND_THREE2.documentReady ); return class THREE_BACKGROUND_THREE2 { constructor() { this.module = module; } }; })( UixModuleInstance, jQuery, window, document );