Path: blob/main/projects/HexGL/bkcore.coffee/Utils.coffee
4626 views
###1Various useful methods23@class bkcore.Utils4@author Thibaut 'BKcore' Despoulain <http://bkcore.com>5###6class Utils78###9Creates a bkcore.threejs.Shaders["normalV"|"normal"] material10with given parameters11###12@createNormalMaterial = (opts)->1314opts ?= {}15opts.ambient ?= 0x44444416opts.normalScale ?= 1.017opts.reflectivity ?= 0.918opts.shininess ?= 4219opts.metal ?= false2021shadername = if opts.perPixel then "normalV" else "normal"22shader = bkcore.threejs.Shaders[shadername]23uniforms = THREE.UniformsUtils.clone(shader.uniforms)2425uniforms["enableDiffuse"].value = true26uniforms["enableSpecular"].value = true27uniforms["enableReflection"].value = !!opts.cube28uniforms["tNormal"].texture = opts.normal29uniforms["tDiffuse"].texture = opts.diffuse30uniforms["tSpecular"].texture = opts.specular31uniforms["uAmbientColor"].value.setHex(opts.ambient)32uniforms["uAmbientColor"].value.convertGammaToLinear()33uniforms["uNormalScale"].value = opts.normalScale3435if opts.cube?36uniforms["tCube"].texture = opts.cube37uniforms["uReflectivity"].value = opts.reflectivity3839parameters = {40fragmentShader: shader.fragmentShader41vertexShader: shader.vertexShader42uniforms: uniforms43lights: true44fog: false45}4647material = new THREE.ShaderMaterial(parameters)48material.perPixel = true49material.metal = opts.metal5051return material5253###54Projects an object origin vector to screen using given camera55@param THREE.Object3D object The object which origin you want to project56@param THREE.Camera camera The camera of the projection57@return THEE.Vector3 Projected verctor58###59@projectOnScreen: (object, camera)->6061mat = new THREE.Matrix4()62mat.multiply(camera.matrixWorldInverse, object.matrixWorld)63mat.multiply(camera.projectionMatrix , mat)6465c = mat.n4466lPos = new THREE.Vector3(mat.n14/c, mat.n24/c, mat.n34/c)67return lPos.multiplyScalar(0.5).addScalar(0.5)6869###70Get an url parameter71@param String name Parameter slug72@return Mixed73###74@URLParameters: null75@getURLParameter: (name)->7677if !@URLParameters?78@URLParameters = {}79window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, (m, key, val)=>80@URLParameters[key] = val81)8283return @URLParameters[name]8485###86Get top offset of an element87@param obj HTMLElement88###89@getOffsetTop: (obj)->9091curtop = obj.offsetTop9293if obj.offsetParent94while obj = obj.offsetParent95curtop += obj.offsetTop9697return curtop9899###100Scrolls page to given element id101@param string id The ID of the element102###103@scrollTo: (id)->104105window.scroll(0, @getOffsetTop(document.getElementById(id)))106107###108Add or remove a class from an element109@param string id [description]110@param string cssclass [description]111@param bool active [description]112###113@updateClass: (id, cssclass, active)->114115e = document.getElementById(id)116return unless e?117118if active119e.classList.add(cssclass)120else121e.classList.remove(cssclass)122123###124Performs an XMLHttpRequest125@param string url [description]126@param bool postData true = POST, false = GET127@param {Function} callback [description]128@param {Object} data [description]129###130@request: (url, postData, callback, data)->131132XMLHttpFactories = [133()-> return new XMLHttpRequest()134()-> return new ActiveXObject("Msxml2.XMLHTTP")135()-> return new ActiveXObject("Msxml3.XMLHTTP")136()-> return new ActiveXObject("Microsoft.XMLHTTP")137]138139createXMLHTTPObject = () ->140141xmlhttp = false142143for i in [0..XMLHttpFactories.length]144try145xmlhttp = XMLHttpFactories[i]()146catch e147continue148break149150return xmlhttp151152req = createXMLHTTPObject()153return unless req?154155method = if postData? then "POST" else "GET"156157qdata = "o=bk"158if data?159for i, val of data160qdata += "&"+i+"="+val161url += "?"+qdata if postData?162163req.open(method,url,true)164165if postData?166req.setRequestHeader('Content-type','application/x-www-form-urlencoded')167168req.onreadystatechange = () ->169return unless req.readyState is 4170return unless req.status is 200 or req.status is 304171callback?(req)172173req.send(qdata)174175return req176177###178Checks whether the device supports Touch input179###180@isTouchDevice: ()->181182return ('ontouchstart' of window) or183(navigator.MaxTouchPoints > 0) or184(navigator.msMaxTouchPoints > 0)185186###187Exports188@package bkcore189###190exports = exports ? @191exports.bkcore ||= {}192exports.bkcore.Utils = Utils193194