/*! * @class bkcore.Utils * * Various useful methods * * @author Thibaut 'BKcore' Despoulain */ /*! * @package bkcore */ var bkcore = bkcore || {}; bkcore.Utils = {}; /** * Creates a bkcore.threejs.Shaders[ "normalV" | "normal" ] material with given parameters */ bkcore.Utils.createNormalMaterial = function(opts) { var shader = bkcore.threejs.Shaders[ opts.perPixel==false ? "normalV" : "normal" ]; var uniforms = THREE.UniformsUtils.clone( shader.uniforms ); uniforms[ "enableDiffuse" ].value = true; uniforms[ "enableSpecular" ].value = true; uniforms[ "enableReflection" ].value = (opts.cube != undefined); uniforms[ "tNormal" ].texture = opts.normal; uniforms[ "tDiffuse" ].texture = opts.diffuse; uniforms[ "tSpecular" ].texture = opts.specular; uniforms[ "uAmbientColor" ].value.setHex(opts.ambient == undefined ? 0x444444 : opts.ambient); uniforms[ "uAmbientColor" ].value.convertGammaToLinear(); uniforms[ "uNormalScale" ].value = opts.normalScale == undefined ? 1.0 : opts.normalScale; if(opts.cube != undefined) { uniforms[ "tCube" ].texture = opts.cube; uniforms[ "uReflectivity" ].value = opts.reflectivity == undefined ? 0.9 : opts.reflectivity; } uniforms[ "uShininess" ].value = opts.shininess == undefined ? 42 : opts.shininess; var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: false }; var material = new THREE.ShaderMaterial( parameters ); material.perPixel = true; material.metal = opts.metal == undefined ? false : opts.metal; return material; } /** * Projects an object origin vector to screen using given camera * @param THREE.Object3D object The object which origin you want to project * @param THREE.Camera camera The camera of the projection * @return THEE.Vector3 Projected verctor */ bkcore.Utils.projectOnScreen = function(object, camera) { var mat = new THREE.Matrix4(); mat.multiply( camera.matrixWorldInverse, object.matrixWorld); mat.multiply( camera.projectionMatrix , mat); var c = mat.n44; var lPos = new THREE.Vector3(mat.n14/c, mat.n24/c, mat.n34/c); lPos.multiplyScalar(0.5); lPos.addScalar(0.5); return lPos; } bkcore.Utils.URLParameters = null; /** * Get an url parameter * @param String name Parameter slug * @return Mixed */ bkcore.Utils.getURLParameter = function(name) { if(bkcore.Utils.URLParameters == null) { var vars = {}; var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) { vars[key] = value; } ); bkcore.Utils.URLParameters = vars; } return bkcore.Utils.URLParameters[name]; } bkcore.Utils.getOffsetTop = function(obj) { var curtop = 0; if (obj.offsetParent) { do { curtop += obj.offsetTop; } while (obj = obj.offsetParent); } else { curtop = obj.offsetTop; } return [curtop]; } /** * Scrolls page to given element id * @param string id The ID of the element */ bkcore.Utils.scrollTo = function(id) { window.scroll( 0, bkcore.Utils.getOffsetTop( document.getElementById(id) ) ); } /** * Add or remove a class from an element * @param string id [description] * @param string cssclass [description] * @param bool active [description] */ bkcore.Utils.updateClass = function(id, cssclass, active) { var element = document.getElementById(id); if(active) element.classList.add(cssclass); else element.classList.remove(cssclass); } /** * PErforms an XMLHttpRequest * @param string url [description] * @param bool postData true = POST, false = GET * @param {Function} callback [description] * @param {Object} data [description] */ bkcore.Utils.request = function(url, postData, callback, data) { var XMLHttpFactories = [ function () {return new XMLHttpRequest()}, function () {return new ActiveXObject("Msxml2.XMLHTTP")}, function () {return new ActiveXObject("Msxml3.XMLHTTP")}, function () {return new ActiveXObject("Microsoft.XMLHTTP")} ]; function createXMLHTTPObject() { var xmlhttp = false; for (var i=0;i