diff options
Diffstat (limited to 'demos/webgl/glge.js')
| -rw-r--r-- | demos/webgl/glge.js | 7883 |
1 files changed, 0 insertions, 7883 deletions
diff --git a/demos/webgl/glge.js b/demos/webgl/glge.js deleted file mode 100644 index b51f3dcd..00000000 --- a/demos/webgl/glge.js +++ /dev/null @@ -1,7883 +0,0 @@ -/* -GLGE WebGL Graphics Engine -Copyright (c) 2010, Paul Brunt -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of GLGE nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL PAUL BRUNT BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/** - * @fileOverview - * @name glge.js - * @author me@paulbrunt.co.uk - */ - - - - if(!window["GLGE"]){ - /** - * @namespace Holds the functionality of the library - */ - window["GLGE"]={}; -} - -(function(GLGE){ - - -/** -* Function to augment one object with another -* @param {object} obj1 Source Object -* @param {object} obj2 Destination Object -*/ -GLGE.augment=function(obj1,obj2){ - for(proto in obj1.prototype){ - obj2.prototype[proto]=obj1.prototype[proto]; - } -} - - -/** -* Moves all GLGE function to global -**/ -GLGE.makeGlobal=function(){ - for(var key in GLGE){ - window[key]=GLGE[key]; - } -} - -GLGE.New=function(createclass){ - if(GLGE[createclass].prototype.className!=""){ - return new GLGE[createclass](); - }else{ - return false; - } -} - -/** -* @constant -* @description Enumeration for TRUE -*/ -GLGE.TRUE=1; -/** -* @constant -* @description Enumeration for FALSE -*/ -GLGE.FALSE=0; - - -/** -* @constant -* @description Enumeration for tri rendering -*/ -GLGE.DRAW_TRIS=1; -/** -* @constant -* @description Enumeration for line rendering -*/ -GLGE.DRAW_LINES=2; - -/** -* @constant -* @description Enumeration for line loop rendering -*/ -GLGE.DRAW_LINELOOPS=3; -/** -* @constant -* @description Enumeration for line loop rendering -*/ -GLGE.DRAW_LINESTRIPS=4; -/** -* @constant -* @description Enumeration for point rendering -*/ -GLGE.DRAW_POINTS=5; - - -/** -* @constant -* @description Enumeration for rendering using default shader -*/ -GLGE.RENDER_DEFAULT=0; - -/** -* @constant -* @description Enumeration for rendering using shadow shader -*/ -GLGE.RENDER_SHADOW=1; - -/** -* @constant -* @description Enumeration for rendering using pick shader -*/ -GLGE.RENDER_PICK=2; - -/** -* @constant -* @description Enumeration for rendering using normal shader -*/ -GLGE.RENDER_NORMAL=3; - -/** -* @constant -* @description Enumeration for no rendering -*/ -GLGE.RENDER_NULL=4; - -/** -* @constant -* @description Enumeration for box bound text picking -*/ -GLGE.TEXT_BOXPICK=1; -/** -* @constant -* @description Enumeration for text bound text picking -*/ -GLGE.TEXT_TEXTPICK=1; - -/** -* @constant -* @description Enumeration for euler rotaions mode -*/ -GLGE.P_EULER=1; - -/** -* @constant -* @description Enumeration for quaternions mode -*/ -GLGE.P_QUAT=2; - -/** -* @constant -* @description Enumeration for matrix rotation mode -*/ -GLGE.P_MATRIX=3; - -/** -* @constant -* @description Enumeration for no value -*/ -GLGE.NONE=0; - -/** -* @constant -* @description Enumeration for X-Axis -*/ -GLGE.XAXIS=1; -/** -* @constant -* @description Enumeration for Y-Axis -*/ -GLGE.YAXIS=2; -/** -* @constant -* @description Enumeration for Z-Axis -*/ -GLGE.ZAXIS=3; - -/** -* @constant -* @description Enumeration for +X-Axis -*/ -GLGE.POS_XAXIS=1; -/** -* @constant -* @description Enumeration for -X-Axis -*/ -GLGE.NEG_XAXIS=2; -/** -* @constant -* @description Enumeration for +Y-Axis -*/ -GLGE.POS_YAXIS=3; -/** -* @constant -* @description Enumeration for -Y-Axis -*/ -GLGE.NEG_YAXIS=4; -/** -* @constant -* @description Enumeration for +Z-Axis -*/ -GLGE.POS_ZAXIS=5; -/** -* @constant -* @description Enumeration for -Z-Axis -*/ -GLGE.NEG_ZAXIS=6; - -/** -* @constant -* @description Linear blending function -*/ -GLGE.LINEAR_BLEND=function(value){ - return value; -} -/** -* @constant -* @description Quadratic blending function -*/ -GLGE.QUAD_BLEND=function(value){ - return value*value; -} -/** -* @constant -* @description Special blending function -*/ -GLGE.SPECIAL_BLEND=function(value){ - value=value*(2-value); - return value*value; -} - - -GLGE.error=function(error){ - alert(error); -} - -/** -* @namespace Holds the global asset store -*/ -GLGE.Assets={}; -GLGE.Assets.assets={}; - -GLGE.Assets.createUUID=function(){ - var data=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]; - var data2=["8","9","A","B"]; - uuid=""; - for(var i=0;i<38;i++){ - switch(i){ - case 8:uuid=uuid+"-";break; - case 13:uuid=uuid+"-";break; - case 18:uuid=uuid+"-";break; - case 14:uuid=uuid+"4";break; - case 19:uuid=uuid+data2[Math.round(Math.random()*3)];break; - default:uuid=uuid+data[Math.round(Math.random()*15)];break; - } - } - return uuid; -} -/** -* @function registers a new asset -*/ -GLGE.Assets.registerAsset=function(obj,uid){ - if(!uid){ - uid=GLGE.Assets.createUUID(); - }; - obj.uid=uid; - GLGE.Assets.assets[uid]=obj; -} -/** -* @function removes an asset -*/ -GLGE.Assets.unregisterAsset=function(uid){ - delete GLGE.Assets.assets[uid]; -} -/** -* @function finds an asset by uid -*/ -GLGE.Assets.get=function(uid){ - var value=GLGE.Assets.assets[uid]; - if(value){ - return value; - }else{ - return false; - } -} - -/** -* @function hashing function -* @private -*/ -GLGE.fastHash=function(str){ - var s1=0;var s2=0;var s3=0;var s4=0;var s5=0;var s6=0; - var c1=0;var c2=0;var c3=0;var c4=0;var c5=0;var c6=0; - var i=0; - var length=str.length; - str+="000000"; - while(i<length){ - c1=str.charCodeAt(i++);c2=str.charCodeAt(i++);c3=str.charCodeAt(i++); - c4=str.charCodeAt(i++);c5=str.charCodeAt(i++);c6=str.charCodeAt(i++); - s1=(s5+c1+c2)%255;s2=(s6+c2+c3)%255;s3=(s1+c3+c4)%255; - s4=(s2+c4+c5)%255;s5=(s3+c5+c6)%255;s6=(s4+c6+c1)%255; - } - var r=[String.fromCharCode(s1),String.fromCharCode(s2),String.fromCharCode(s3), - String.fromCharCode(s4),String.fromCharCode(s5),String.fromCharCode(s6)]; - return r.join(''); -} -/** -* @function check if shader is already created if not then create it -* @private -*/ -GLGE.getGLShader=function(gl,type,str){ - var hash=GLGE.fastHash(str); - if(!gl.shaderCache) gl.shaderCache={}; - if(!gl.shaderCache[hash]){ - var shader=gl.createShader(type); - gl.shaderSource(shader, str); - gl.compileShader(shader); - if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) { - alert(gl.getShaderInfoLog(shader)); - return; - } - gl.shaderCache[hash]=shader; - } - return gl.shaderCache[hash]; -} - -/** -* @function tries to re use programs -* @private -*/ -GLGE.getGLProgram=function(gl,vShader,fShader){ - if(!gl.programCache) gl.programCache=[]; - var programCache=gl.programCache; - for(var i=0; i<programCache.length;i++){ - if(programCache[i].fShader==fShader && programCache[i].vShader==vShader){ - return programCache[i].program; - } - } - var program=gl.createProgram(); - gl.attachShader(program, vShader); - gl.attachShader(program, fShader); - gl.linkProgram(program); - programCache.push({vShader:vShader,fShader:fShader,program:program}); - if(!program.uniformDetails){ - program.uniformDetails={}; - var uniforms = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS); - for (var i=0;i<uniforms;++i) { - var info=gl.getActiveUniform(program, i); - program.uniformDetails[info.name]={loc:GLGE.getUniformLocation(gl,program,info.name),info:info}; - } - } - return program; -} - - -/** -* function to cache the uniform locations -* @param {glcontext} the gl context of the program -* @param {program} the shader program -* @param {string} the uniform name -* @private -*/ -GLGE.getUniformLocation=function(gl,program, uniform){ - /*if(program.uniformDetails[uniform]){ - return program.uniformDetails[uniform].loc; - }else{ - return gl.getUniformLocation(program, uniform); - }*/ - if(!program.uniformCache) program.uniformCache={}; - if(!program.uniformChecked) program.uniformChecked={}; - if(!program.uniformChecked[uniform]){ - program.uniformCache[uniform]=gl.getUniformLocation(program, uniform); - program.uniformChecked[uniform]=true; - } - return program.uniformCache[uniform]; -}; -/** -* function to cache the attribute locations -* @param {glcontext} the gl context of the program -* @param {program} the shader program -* @param {string} the attribe name -* @private -*/ -GLGE.getAttribLocation=function(gl,program, attrib){ - if(!program.attribCache) program.attribCache={}; - if(!program.attribCache[attrib]){ - program.attribCache[attrib]=gl.getAttribLocation(program, attrib); - } - return program.attribCache[attrib]; -} - -/** -* @class class to implelemnt quick notation -*/ -GLGE.QuickNotation=function(){ -} -/** -* Call to set properties and add children to an object -* @example myObject._({LocX:10,LocY:20},child1,child2,.....); -*/ -GLGE.QuickNotation.prototype._=function(){ - var argument; - for(var i=0; i<arguments.length;i++){ - argument=arguments[i]; - if(typeof argument=="object"){ - if(argument.className && this["add"+argument.className]){ - this["add"+argument.className](argument); - }else{ - for(var key in argument){ - if(this["set"+key]){ - this["set"+key](argument[key]); - } - } - } - } - } - return this; -} - -/** -* @namespace GLGE Messaging System -*/ -GLGE.Message={}; -/** -* @function parses messages and updates the scene graph -*/ -GLGE.Message.parseMessage=function(msg){ - switch(msg.command){ - case "create": - var obj=new GLGE[msg.type](msg.uid); - this.setAttributes(obj,msg.attributes); - if(msg.children) GLGE.Message.addChildren(obj,msg.children); - return obj; - break; - case "update": - var obj=GLGE.Assets.get(msg.uid); - this.setAttributes(obj,msg.attributes); - if(msg.add) GLGE.Message.addChildren(obj,msg.add); - if(msg.remove) GLGE.Message.removeChildren(obj,msg.remove); - return obj; - break; - } - return null; -} -/** -* @function parses the attributes from a message -* @private -*/ -GLGE.Message.setAttributes=function(obj,attribs){ - if(attribs){ - for(var attrib in attribs){ - if(obj["set"+attrib]){ - //check to see if the attribute has to be parsed as a message - if(attribs[attrib].command){ - attribs[attrib]=GLGE.Message.parseMessage(attribs[attrib]); - } - obj["set"+attrib](attribs[attrib]); - } - } - } - return this; -} -/** -* @function parses the children to add -* @private -*/ -GLGE.Message.addChildren=function(obj,children){ - if(!(children instanceof Array)) children=[children]; - for(var i=0;i<children.length;i++){ - if(children[i].command){ - var asset=GLGE.Message.parseMessage(children[i]); - }else{ - var asset=GLGE.Assets.get(children[i]); - } - obj["add"+asset.className](asset); - } -} -/** -* @function parses the children to remove -* @private -*/ -GLGE.Message.removeChildren=function(obj,children){ - if(!(children instanceof Array)) children=[children]; - for(var i=0;i<children.length;i++){ - var asset=GLGE.Assets.get(children[i]); - obj["add"+asset.className](asset); - } -} - -GLGE.Message.toLoad=[]; -GLGE.Message.messageLoader=function(url,callback,priority){ - GLGE.Message.toLoad.push([url,callback,priority]); - if(GLGE.Message.toLoad.length==1) GLGE.Message.loadMessages(); -} -GLGE.Message.loadMessages=function(){ - //TODO: use priority - var nextDoc=GLGE.Message.toLoad.pop(); - var req=new XMLHttpRequest(); - req.onreadystatechange = function() { - if(this.readyState == 4){ - if(this.status == 200 || this.status==0){ - nextDoc[1](this.responseText); - }else{ - GLGE.error("Error loading Document: "+nextDoc[0]+" status "+this.status); - } - } - } - req.open("GET", nextDoc[0], true); - req.send(""); - if(GLGE.Message.toLoad.length>0) GLGE.Message.loadMessages(); -} - - - -/** -* function to parse a colour input into RGB eg #ff00ff, red, rgb(100,100,100) -* @param {string} color the color to parse -*/ -GLGE.colorParse=function(color){ - var red,green,blue,alpha; - //defines the color names - var color_names = { - aliceblue: 'f0f8ff', antiquewhite: 'faebd7', aqua: '00ffff', - aquamarine: '7fffd4', azure: 'f0ffff', beige: 'f5f5dc', - bisque: 'ffe4c4', black: '000000', blanchedalmond: 'ffebcd', - blue: '0000ff', blueviolet: '8a2be2', brown: 'a52a2a', - burlywood: 'deb887', cadetblue: '5f9ea0', chartreuse: '7fff00', - chocolate: 'd2691e', coral: 'ff7f50', cornflowerblue: '6495ed', - cornsilk: 'fff8dc', crimson: 'dc143c', cyan: '00ffff', - darkblue: '00008b', darkcyan: '008b8b', darkgoldenrod: 'b8860b', - darkgray: 'a9a9a9', darkgreen: '006400', darkkhaki: 'bdb76b', - darkmagenta: '8b008b', darkolivegreen: '556b2f', darkorange: 'ff8c00', - darkorchid: '9932cc', darkred: '8b0000', darksalmon: 'e9967a', - darkseagreen: '8fbc8f', darkslateblue: '483d8b', darkslategray: '2f4f4f', - darkturquoise: '00ced1', darkviolet: '9400d3', deeppink: 'ff1493', - deepskyblue: '00bfff', dimgray: '696969', dodgerblue: '1e90ff', - feldspar: 'd19275', firebrick: 'b22222', floralwhite: 'fffaf0', - forestgreen: '228b22', fuchsia: 'ff00ff', gainsboro: 'dcdcdc', - ghostwhite: 'f8f8ff', gold: 'ffd700', goldenrod: 'daa520', - gray: '808080', green: '008000', greenyellow: 'adff2f', - honeydew: 'f0fff0', hotpink: 'ff69b4', indianred : 'cd5c5c', - indigo : '4b0082', ivory: 'fffff0', khaki: 'f0e68c', - lavender: 'e6e6fa', lavenderblush: 'fff0f5', lawngreen: '7cfc00', - lemonchiffon: 'fffacd', lightblue: 'add8e6', lightcoral: 'f08080', - lightcyan: 'e0ffff', lightgoldenrodyellow: 'fafad2', lightgrey: 'd3d3d3', - lightgreen: '90ee90', lightpink: 'ffb6c1', lightsalmon: 'ffa07a', - lightseagreen: '20b2aa', lightskyblue: '87cefa', lightslateblue: '8470ff', - lightslategray: '778899', lightsteelblue: 'b0c4de', lightyellow: 'ffffe0', - lime: '00ff00', limegreen: '32cd32', linen: 'faf0e6', - magenta: 'ff00ff', maroon: '800000', mediumaquamarine: '66cdaa', - mediumblue: '0000cd', mediumorchid: 'ba55d3', mediumpurple: '9370d8', - mediumseagreen: '3cb371', mediumslateblue: '7b68ee', mediumspringgreen: '00fa9a', - mediumturquoise: '48d1cc', mediumvioletred: 'c71585', midnightblue: '191970', - mintcream: 'f5fffa', mistyrose: 'ffe4e1', moccasin: 'ffe4b5', - navajowhite: 'ffdead', navy: '000080', oldlace: 'fdf5e6', - olive: '808000', olivedrab: '6b8e23', orange: 'ffa500', - orangered: 'ff4500', orchid: 'da70d6', palegoldenrod: 'eee8aa', - palegreen: '98fb98', paleturquoise: 'afeeee', palevioletred: 'd87093', - papayawhip: 'ffefd5', peachpuff: 'ffdab9', peru: 'cd853f', - pink: 'ffc0cb', plum: 'dda0dd', powderblue: 'b0e0e6', - purple: '800080', red: 'ff0000', rosybrown: 'bc8f8f', - royalblue: '4169e1', saddlebrown: '8b4513', salmon: 'fa8072', - sandybrown: 'f4a460', seagreen: '2e8b57', seashell: 'fff5ee', - sienna: 'a0522d', silver: 'c0c0c0', skyblue: '87ceeb', - slateblue: '6a5acd', slategray: '708090', snow: 'fffafa', - springgreen: '00ff7f', steelblue: '4682b4', tan: 'd2b48c', - teal: '008080', thistle: 'd8bfd8', tomato: 'ff6347', - turquoise: '40e0d0', violet: 'ee82ee', violetred: 'd02090', - wheat: 'f5deb3', white: 'ffffff', whitesmoke: 'f5f5f5', - yellow: 'ffff00', yellowgreen: '9acd32' - }; - if(color_names[color]) color="#"+color_names[color]; - if(color.substr && color.substr(0,1)=="#"){ - color=color.substr(1); - if(color.length==8){ - red=parseInt("0x"+color.substr(0,2))/255; - green=parseInt("0x"+color.substr(2,2))/255; - blue=parseInt("0x"+color.substr(4,2))/255; - alpha=parseInt("0x"+color.substr(6,2))/255; - }else if(color.length==4){ - red=parseInt("0x"+color.substr(0,1))/15; - green=parseInt("0x"+color.substr(1,1))/15; - blue=parseInt("0x"+color.substr(2,1))/15; - alpha=parseInt("0x"+color.substr(3,1))/15; - }else if(color.length==6){ - red=parseInt("0x"+color.substr(0,2))/255; - green=parseInt("0x"+color.substr(2,2))/255; - blue=parseInt("0x"+color.substr(4,2))/255; - alpha=1; - }else if(color.length==3){ - red=parseInt("0x"+color.substr(0,1))/15; - green=parseInt("0x"+color.substr(1,1))/15; - blue=parseInt("0x"+color.substr(2,1))/15; - alpha=1; - } - }else if(color.substr && color.substr(0,4)=="rgb("){ - var colors=color.substr(4).split(","); - red=parseInt(colors[0])/255; - green=parseInt(colors[1])/255; - blue=parseInt(colors[2])/255; - alpha=1; - }else if(color.substr && color.substr(0,5)=="rgba("){ - var colors=color.substr(4).split(","); - red=parseInt(colors[0])/255; - green=parseInt(colors[1])/255; - blue=parseInt(colors[2])/255; - alpha=parseInt(colors[3])/255; - }else{ - red=0; - green=0; - blue=0; - alpha=0; - } - return {r:red,g:green,b:blue,a:alpha}; -} - - -/** -* @class A class to load json fragments from remote location or string -**/ -GLGE.JSONLoader=function(){ -} -GLGE.JSONLoader.prototype.downloadPriority=0; -/** -* Loads a json fragment from a url -* @param {string} url The URL to load -**/ -GLGE.JSONLoader.prototype.setJSONSrc=function(url){ - var GLGEObj=this; - GLGE.Message.messageLoader(url,function(text){ - GLGEObj.setJSONString(text); - },this.downloadPriority); -} -/** -* Loads a json fragment from a string -* @param {string} string The URL to load -**/ -GLGE.JSONLoader.prototype.setJSONString=function(string){ - var message = JSON.parse(string); - //check to make sure this is the correct class type - if(message.type==this.className){ - message.uid=this.uid; - //we don't want to create a new one we want to update this one - message.command="update"; - GLGE.Message.parseMessage(message); - } -} -/** -* Sets the download priority -* @param {number} value The download priority -**/ -GLGE.JSONLoader.prototype.setDownloadPriority=function(value){ - this.downloadPriority=value; -} -/** -* Gets the download priority -* @returns {number} The download priority -**/ -GLGE.JSONLoader.prototype.getDownloadPriority=function(){ - return this.downloadPriority; -} - - -/** -* @class A events class -**/ -GLGE.Events=function(){ -} -/** -* Fires an event -* @param {string} event The name of the event to fire -* @param {object} data the events data -**/ -GLGE.Events.prototype.fireEvent=function(event,data){ - if(this.events && this.events[event]){ - var events=this.events[event]; - for(var i=0;i<events.length;i++){ - events[i].call(this,data); - } - } -} -/** -* Adds an event listener -* @param {string} event The name of the event to listen for -* @param {function} fn the event callback -**/ -GLGE.Events.prototype.addEventListener=function(event,fn){ - if(!this.events) this.events={}; - if(!this.events[event]) this.events[event]=[]; - this.events[event].push(fn); -} -/** -* Removes an event listener -* @param {function} fn the event callback to remove -**/ -GLGE.Events.prototype.removeEventListener=function(event,fn){ - var idx=this.events[event].indexOf(fn); - if(idx!=-1) this.events[event].splice(idx,1); -} - -/** -* @class Document class to load scene, object, mesh etc from an external XML file -* @param {string} url URL of the resource to load -*/ -GLGE.Document=function(){ - this.listeners=[]; - this.documents=[]; -} -GLGE.Document.prototype.listeners=null; -GLGE.Document.prototype.documents=null; -GLGE.Document.prototype.rootURL=null; -GLGE.Document.prototype.loadCount=0; -/** -* This is just a fix for a bug in webkit -* @param {string} id the id name to get -* @returns {object} node with teh specified id -* @private -*/ -GLGE.Document.prototype.getElementById=function(id){ - var tags=this.getElementsByTagName("*"); - for(var i=0; i<tags.length;i++){ - if(tags[i].getAttribute("id")==id){ - return tags[i]; - break; - } - } - return null; -} -/** -* Gets the absolute path given an import path and the path it's relative to -* @param {string} path the path to get the absolute path for -* @param {string} relativeto the path the supplied path is relativeto -* @returns {string} absolute path -* @private -*/ -GLGE.Document.prototype.getAbsolutePath=function(path,relativeto){ - if(path.substr(0,7)=="http://" || path.substr(0,7)=="file://" || path.substr(0,7)=="https://"){ - return path; - } - else - { - if(!relativeto){ - relativeto=window.location.href; - } - //find the path compoents - var bits=relativeto.split("/"); - var domain=bits[2]; - var proto=bits[0]; - var initpath=[]; - for(var i=3;i<bits.length-1;i++){ - initpath.push(bits[i]); - } - //relative to domain - if(path.substr(0,1)=="/"){ - initpath=[]; - } - var locpath=path.split("/"); - for(i=0;i<locpath.length;i++){ - if(locpath[i]=="..") initpath.pop(); - else if(locpath[i]!="") initpath.push(locpath[i]); - } - return proto+"//"+domain+"/"+initpath.join("/"); - } -} -/** -* Loads the root document -* @param {string} url URL of the resource to load -*/ -GLGE.Document.prototype.load=function(url){ - this.documents=[]; - this.rootURL=url; - this.loadDocument(url,null); -} -/** -* Loads an additional documents into the collection -* @param {string} url URL of the resource to load -* @param {string} relativeto the path the URL is relative to, null for default -*/ -GLGE.Document.prototype.loadDocument=function(url,relativeto){ - this.loadCount++; - url=this.getAbsolutePath(url,relativeto); - var req = new XMLHttpRequest(); - if(req) { - req.docurl=url; - req.docObj=this; - req.overrideMimeType("text/xml"); - req.onreadystatechange = function() { - if(this.readyState == 4) - { - if(this.status == 200 || this.status==0){ - this.responseXML.getElementById=this.docObj.getElementById; - this.docObj.loaded(this.docurl,this.responseXML); - }else{ - GLGE.error("Error loading Document: "+this.docurl+" status "+this.status); - } - } - }; - req.open("GET", url, true); - req.send(""); - } -} -/** -* Trigered when a document has finished loading -* @param {string} url the absolute url of the document that has loaded -* @param {XMLDoc} responceXML the xml document that has finished loading -* @private -*/ -GLGE.Document.prototype.loaded=function(url,responceXML){ - this.loadCount--; - this.documents[url]={xml:responceXML}; - var imports=responceXML.getElementsByTagName("import"); - for(var i=0; i<imports.length;i++){ - if(!this.documents[this.getAbsolutePath(imports[i].getAttribute("url"),url)]){ - this.documents[this.getAbsolutePath(imports[i].getAttribute("url"),url)]={}; - this.loadDocument(imports[i].getAttribute("url"),url); - } - } - if(this.loadCount==0){ - this.finishedLoading(); - } -} -/** -* Called when all documents have finished loading -* @private -*/ -GLGE.Document.prototype.finishedLoading=function(){ - for(var i=0; i<this.listeners.length;i++){ - this.listeners[i](this.listeners.rootURL); - } - this["onLoad"](); -} -/** -* Called when all documents have finished loading -* @event -*/ -GLGE.Document.prototype["onLoad"]=function(){}; -/** -* Converts and attribute name into a class name -* @param {string} name attribute name to convert -* @private -*/ -GLGE.Document.prototype.classString=function(name){ - if(!name) return false; - var names=name.split("_"); - var converted=""; - for(var i=0;i<names.length;i++){ - converted=converted+names[i][0].toUpperCase()+names[i].substr(1); - } - return converted; -} -/** -* Sets the properties of an object based on the attributes of the corresponding dom element -* @param {object} Obj the DOM element to apply the attributes of -* @private -*/ -GLGE.Document.prototype.setProperties=function(Obj){ - var set_method; - var attribute_name; - var value; - for(var i=0; i<Obj.attributes.length; i++){ - value=false; - set_method="set"+this.classString(Obj.attributes[i].nodeName); - - if(Obj.attributes[i].value[0]=="#"){ - value=this.getElement(Obj.attributes[i].value.substr(1),true); - } - if(!value){ - //if this is a GLGE contsant then set the constant value otherwise just literal - if(typeof(GLGE[Obj.attributes[i].value]) != "undefined"){ - value=GLGE[Obj.attributes[i].value]; - } - else - { - value=Obj.attributes[i].value; - } - } - - if(Obj.object[set_method]) Obj.object[set_method](value); - //if a uid is set in the xml doc then make sure it's registered correctly in the assets - if(Obj.attributes[i].nodeName=="uid"){ - GLGE.Assets.unregisterAsset(Obj.object.uid); - Obj.object.uid=Obj.attributes[i].value; - GLGE.Assets.registerAsset(Obj.object,Obj.attributes[i].value); - } - } -} -/** -* Adds child objects -* @param {object} Obj the DOM element to apply the children of -* @private -*/ -GLGE.Document.prototype.addChildren=function(Obj){ - //loop though and add the children - var add_method; - var child=Obj.firstChild; - while(child){ - add_method="add"+this.classString(child.tagName); - if(Obj.object[add_method]) Obj.object[add_method](this.getElement(child)); - child=child.nextSibling; - } -} -/** -* Gets an object from the XML document based on the dom element -* @param {string|domelement} ele the id of the element to get or the dom node -*/ -GLGE.Document.prototype.getElement=function(ele,noerrors){ - var docele,doc; - if(typeof(ele)=="string"){ - for(doc in this.documents){ - if(this.documents[doc].xml){ - docele=this.documents[doc].xml.getElementById(ele); - if(docele){ - ele=docele; - break; - } - } - } - } - if(typeof(ele)=="string"){ - //if element is still a string at this point there there is an issue - if(!noerrors) GLGE.error("Element "+ele+" not found in document"); - return false; - } - else - { - if(this["get"+this.classString(ele.tagName)]){ - return this["get"+this.classString(ele.tagName)](ele); - } - else - { - return this.getDefault(ele); - } - } -} -/** -* Parses the dom element and creates any objects that are required -* @param {domelement} ele the element to create the objects from -* @private -*/ -GLGE.Document.prototype.getDefault=function(ele){ - if(!ele.object){ - if(GLGE[this.classString(ele.tagName)]){ - ele.object=new GLGE[this.classString(ele.tagName)](); - this.setProperties(ele); - this.addChildren(ele); - } - else - { - GLGE.error("XML Parse Error: GLGE Object not found"); - } - } - return ele.object; -} -/** -* Parses the dom element and creates a texture -* @param {domelement} ele the element to create the objects from -* @private -*/ -GLGE.Document.prototype.getTexture=function(ele){ - if(!ele.object){ - var rel=this.getAbsolutePath(this.rootURL,null); - ele.object=new GLGE[this.classString(ele.tagName)]; - ele.object.setSrc(this.getAbsolutePath(ele.getAttribute("src"),rel)); - ele.removeAttribute("src"); - this.setProperties(ele); - } - return ele.object; -} -GLGE.Document.prototype.getTextureVideo=GLGE.Document.prototype.getTexture; - -/** -* Parses a document node into an array -* @param {node} the node to parse -* @private -*/ -GLGE.Document.prototype.parseArray=function(node){ - var child=node.firstChild; - var prev=""; - var output=[]; - var currentArray; - var i; - while(child){ - currentArray=(prev+child.nodeValue).split(","); - child=child.nextSibling; - if(currentArray[0]=="") currentArray.unshift(); - if(child) prev=currentArray.pop(); - for(i=0;i<currentArray.length;i++) output.push(currentArray[i]); - } - return output; -} - -/** -* Parses the mesh dom to create the mesh object -* @param {domelement} ele the element to create the mesh from -* @private -*/ -GLGE.Document.prototype.getMesh=function(ele){ - if(!ele.object){ - ele.object=new GLGE.Mesh(); - this.setProperties(ele); - var child=ele.firstChild; - while(child){ - switch(child.tagName){ - case "positions": - ele.object.setPositions(this.parseArray(child)); - break; - case "normals": - ele.object.setNormals(this.parseArray(child)); - break; - case "uv1": - ele.object.setUV(this.parseArray(child)); - break; - case "uv2": - ele.object.setUV2(this.parseArray(child)); - break; - case "faces": - ele.object.setFaces(this.parseArray(child)); - break; - case "joint_names": - var names=this.parseArray(child); - var jointObjects=[]; - for(var i=0;i<names.length;i++){ - if(names[i].substr(0,1)=="#"){ - jointObjects.push(this.getElement(names[i].substr(1))); - }else{ - jointObjects.push(names[i]); - } - } - ele.object.setJoints(jointObjects); - break; - case "bind_matrix": - var mats=this.parseArray(child); - var invBind=[]; - for(var i=0;i<mats.length;i++){ - invBind.push(GLGE.Mat4(mats[i].split(" "))); - } - ele.object.setInvBindMatrix(invBind); - break; - case "joints": - ele.object.setVertexJoints(this.parseArray(child),child.getAttribute("count")); - break; - case "weights": - ele.object.setVertexWeights(this.parseArray(child),child.getAttribute("count")); - break; - } - child=child.nextSibling; - } - } - return ele.object; -} - -/** -* Adds a listener to be called when all documents have finished loading -* @param {function} listener the function to call when all loading in complete -*/ -GLGE.Document.prototype.addLoadListener=function(listener){ - this.listeners.append(listener); -} -/** -* Removes a load listener -* @param {function} listener Listener to remove -*/ -GLGE.Document.prototype.removeLoadListener=function(listener){ - for(var i=0; i<this.listeners.length; i++){ - if(this.listeners[i]===listener) this.listeners.splice(i,1); - } -} - -/** -* loads xml from a script tag -* @param {string} id the id of the element to load -*/ -GLGE.Document.prototype.parseScript=function(id){ - this.rootURL=window.location.toString(); - var xmlScript = document.getElementById(id); - if (!xmlScript) { - return null; - } - - var str = ""; - var k = xmlScript.firstChild; - while (k) { - if (k.nodeType == 3) { - str += k.textContent; - } - k = k.nextSibling; - } - - var parser=new DOMParser(); - var xmlDoc=parser.parseFromString(str,"text/xml"); - xmlDoc.getElementById=this.getElementById; - - this.documents["#"+id]={xml:xmlDoc}; - - var imports=xmlDoc.getElementsByTagName("import"); - for(var i=0; i<imports.length;i++){ - if(!this.documents[this.getAbsolutePath(imports[i].getAttribute("url"),url)]){ - this.documents[this.getAbsolutePath(imports[i].getAttribute("url"),url)]={}; - this.loadDocument(imports[i].getAttribute("url")); - } - } - if(this.loadCount==0){ - this.finishedLoading(); - } -} - - - -/** -* @class Abstract class to agument objects that requires position, rotation and scale. -*/ -GLGE.Placeable=function(){ -} -GLGE.Placeable.prototype.locX=0; -GLGE.Placeable.prototype.locY=0; -GLGE.Placeable.prototype.locZ=0; -GLGE.Placeable.prototype.dLocX=0; -GLGE.Placeable.prototype.dLocY=0; -GLGE.Placeable.prototype.dLocZ=0; -GLGE.Placeable.prototype.quatX=0; -GLGE.Placeable.prototype.quatY=0; -GLGE.Placeable.prototype.quatZ=0; -GLGE.Placeable.prototype.quatW=0; -GLGE.Placeable.prototype.rotX=0; -GLGE.Placeable.prototype.rotY=0; -GLGE.Placeable.prototype.rotZ=0; -GLGE.Placeable.prototype.dRotX=0; -GLGE.Placeable.prototype.dRotY=0; -GLGE.Placeable.prototype.dRotZ=0; -GLGE.Placeable.prototype.scaleX=1; -GLGE.Placeable.prototype.scaleY=1; -GLGE.Placeable.prototype.scaleZ=1; -GLGE.Placeable.prototype.dScaleX=0; -GLGE.Placeable.prototype.dScaleY=0; -GLGE.Placeable.prototype.dScaleZ=0; -GLGE.Placeable.prototype.matrix=null; -GLGE.Placeable.prototype.rotOrder=GLGE.ROT_XYZ; -GLGE.Placeable.prototype.lookAt=null; -GLGE.Placeable.prototype.mode=GLGE.P_EULER; - - - -/** -* Gets the root node object -* @returns {object} -*/ -GLGE.Placeable.prototype.getRoot=function(){ - if(this.type==GLGE.G_ROOT){ - return this; - }else if(this.parent){ - var value=this.parent.getRoot(); - if(!value) return this; - else return value; - }else{ - return this; - } -} -/** -* Gets the id string of this text -* @returns {string} -*/ -GLGE.Placeable.prototype.getRef=function(){ - if(this.id){ - return this.id; - }else if(this.parent){ - return this.parent.getRef(); - }else{ - return null; - } -} -/** -* Sets the id string -* @param {string} id The id string -*/ -GLGE.Placeable.prototype.setId=function(id){ - this.id=id; - return this; -} -/** -* Gets the id string of this text -* @returns {string} -*/ -GLGE.Placeable.prototype.getId=function(){ - return this.id -} -/** -* gets the object or poisition being looking at -* @param {array|object} value the location/object -*/ -GLGE.Placeable.prototype.getLookat=function(){ - return this.lookAt; -} -/** -* sets the look at for this object, will be updated every frame -* @param {array|object} value the location/objec to look at -*/ -GLGE.Placeable.prototype.setLookat=function(value){ - this.lookAt=value; - return this; -} -/** -* Points the object in the direction of the coords or placeable value -* @param {array|object} value the location/objec to look at -*/ -GLGE.Placeable.prototype.Lookat=function(value){ - var objpos; - var pos=this.getPosition(); - if(value.getPosition){ - objpos=value.getPosition(); - }else{ - objpos={x:value[0],y:value[1],z:value[2]}; - } - - var coord=[pos.x-objpos.x,pos.y-objpos.y,pos.z-objpos.z]; - var zvec=GLGE.toUnitVec3(coord); - var xvec=GLGE.toUnitVec3(GLGE.crossVec3([0,0,1],zvec)); - var yvec=GLGE.toUnitVec3(GLGE.crossVec3(zvec,xvec)); - this.setRotMatrix(GLGE.Mat4([xvec[0], yvec[0], zvec[0], 0, - xvec[1], yvec[1], zvec[1], 0, - xvec[2], yvec[2], zvec[2], 0, - 0, 0, 0, 1])); -} -/** -* Gets the euler rotation order -* @returns {number} the objects rotation matrix -*/ -GLGE.Placeable.prototype.getRotOrder=function(){ - return this.rotOrder; -} -/** -* Sets the euler rotation order -* @param {number} value the order to rotate GLGE.ROT_XYZ,GLGE.ROT_XZY,etc.. -*/ -GLGE.Placeable.prototype.setRotOrder=function(value){ - this.rotOrder=value; - this.matrix=null; - this.rotmatrix=null; - return this; -} -/** -* Gets the rotaion matrix -* @returns {matrix} the objects rotation matrix -*/ -GLGE.Placeable.prototype.getRotMatrix=function(){ - if(!this.rotmatrix){ - var rotation=this.getRotation(); - if(this.mode==GLGE.P_EULER) this.rotmatrix=GLGE.rotateMatrix(rotation.x,rotation.y,rotation.z,this.rotOrder); - if(this.mode==GLGE.P_QUAT) this.rotmatrix=GLGE.quatRotation(rotation.x,rotation.y,rotation.z,rotation.w); - } - return this.rotmatrix; -} -/** -* Sets the rotation matrix -* @param {matrix} the objects rotation matrix -*/ -GLGE.Placeable.prototype.setRotMatrix=function(matrix){ - this.mode=GLGE.P_MATRIX; - this.rotmatrix=matrix; - this.updateMatrix(); - return this; -} -/** -* Sets the x location of the object -* @param {number} value The value to assign to the x position -*/ -GLGE.Placeable.prototype.setLocX=function(value){this.locX=value; this.updateMatrix();return this;} -/** -* Sets the y location of the object -* @param {number} value The value to assign to the y position -*/ -GLGE.Placeable.prototype.setLocY=function(value){this.locY=value;this.updateMatrix();return this;} -/** -* Sets the z location of the object -* @param {number} value The value to assign to the z position -*/ -GLGE.Placeable.prototype.setLocZ=function(value){this.locZ=value;this.updateMatrix();return this;} -/** -* Sets the location of the object -* @param {number} x The value to assign to the x position -* @param {number} y The value to assign to the y position -* @param {number} z The value to assign to the z position -*/ -GLGE.Placeable.prototype.setLoc=function(x,y,z){this.locX=x;this.locY=y;this.locZ=z;this.updateMatrix();return this;} -/** -* Sets the x location displacement of the object, usefull for animation -* @param {number} value The value to assign to the x displacement -*/ -GLGE.Placeable.prototype.setDLocX=function(value){this.dLocX=value;this.updateMatrix();return this;} -/** -* Sets the y location displacement of the object, usefull for animation -* @param {number} value The value to assign to the y displacement -*/ -GLGE.Placeable.prototype.setDLocY=function(value){this.dLocY=value;this.updateMatrix();return this;} -/** -* Sets the z location displacement of the object, usefull for animation -* @param {number} value The value to assign to the z displacement -*/ -GLGE.Placeable.prototype.setDLocZ=function(value){this.dLocZ=value;this.updateMatrix();return this;} -/** -* Sets the location displacement of the object, useful for animation -* @param {number} x The value to assign to the x position -* @param {number} y The value to assign to the y position -* @param {number} z The value to assign to the z position -*/ -GLGE.Placeable.prototype.setDLoc=function(x,y,z){this.dLocX=x;this.dLocY=y;this.dLocZ=z;this.updateMatrix();return this;} -/** -* Sets the x quat value -* @param {number} value the x quat value -*/ -GLGE.Placeable.prototype.setQuatX=function(value){this.mode=GLGE.P_QUAT;this.quatX=parseFloat(value);this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the y quat value -* @param {number} value the y quat value -*/ -GLGE.Placeable.prototype.setQuatY=function(value){this.mode=GLGE.P_QUAT;this.quatY=parseFloat(value);this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the z quat value -* @param {number} value the z quat value -*/ -GLGE.Placeable.prototype.setQuatZ=function(value){this.mode=GLGE.P_QUAT;this.quatZ=parseFloat(value);this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the w quat value -* @param {number} value the w quat value -*/ -GLGE.Placeable.prototype.setQuatW=function(value){this.mode=GLGE.P_QUAT;this.quatW=parseFloat(value);this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the quaternions -* @param {number} x The value to assign to the x -* @param {number} y The value to assign to the y -* @param {number} z The value to assign to the z -* @param {number} w The value to assign to the w -*/ -GLGE.Placeable.prototype.setQuat=function(x,y,z,w){this.mode=GLGE.P_QUAT;this.quatX=x;this.quatY=y;this.quatZ=z;this.quatW=w;this.updateMatrix();this.rotmatrix=null;return this;} - -/** -* Sets the x rotation of the object -* @param {number} value The value to assign to the x rotation -*/ -GLGE.Placeable.prototype.setRotX=function(value){this.mode=GLGE.P_EULER;this.rotX=value;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the y rotation of the object -* @param {number} value The value to assign to the y rotation -*/ -GLGE.Placeable.prototype.setRotY=function(value){this.mode=GLGE.P_EULER;this.rotY=value;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the z rotation of the object -* @param {number} value The value to assign to the z rotation -*/ -GLGE.Placeable.prototype.setRotZ=function(value){this.mode=GLGE.P_EULER;this.rotZ=value;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the rotation of the object -* @param {number} x The value to assign to the x rotation -* @param {number} y The value to assign to the y rotation -* @param {number} z The value to assign to the z rotation -*/ -GLGE.Placeable.prototype.setRot=function(x,y,z){this.mode=GLGE.P_EULER;this.rotX=x;this.rotY=y;this.rotZ=z;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the x rotation displacement of the object, usefull for animation -* @param {number} value The value to assign to the x displacement -*/ -GLGE.Placeable.prototype.setDRotX=function(value){this.mode=GLGE.P_EULER;this.dRotX=value;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the y rotation displacement of the object, usefull for animation -* @param {number} value The value to assign to the y displacement -*/ -GLGE.Placeable.prototype.setDRotY=function(value){this.mode=GLGE.P_EULER;this.dRotY=value;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the z rotation displacement of the object, usefull for animation -* @param {number} value The value to assign to the z displacement -*/ -GLGE.Placeable.prototype.setDRotZ=function(value){this.mode=GLGE.P_EULER;this.dRotZ=value;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the rotation displacement of the object, useful for animation -* @param {number} x The value to assign to the x rotation -* @param {number} y The value to assign to the y rotation -* @param {number} z The value to assign to the z rotation -*/ -GLGE.Placeable.prototype.setDRot=function(x,y,z){this.mode=GLGE.P_EULER;this.dRotX=x;this.dRotY=y;this.dRotZ=z;this.updateMatrix();this.rotmatrix=null;return this;} -/** -* Sets the x scale of the object -* @param {number} value The value to assign to the x scale -*/ -GLGE.Placeable.prototype.setScaleX=function(value){this.scaleX=value;this.updateMatrix();return this;} -/** -* Sets the y scale of the object -* @param {number} value The value to assign to the y scale -*/ -GLGE.Placeable.prototype.setScaleY=function(value){this.scaleY=value;this.updateMatrix();return this;} -/** -* Sets the z scale of the object -* @param {number} value The value to assign to the z scale -*/ -GLGE.Placeable.prototype.setScaleZ=function(value){this.scaleZ=value;this.updateMatrix();return this;} -/** -* Sets the scale of the object -* @param {number} x The value to assign to the x scale -* @param {number} y The value to assign to the y scale -* @param {number} z The value to assign to the z scale -*/ -GLGE.Placeable.prototype.setScale=function(x,y,z){if(!y){y=x;z=x}; this.scaleX=x;this.scaleY=y;this.scaleZ=z;this.updateMatrix();return this;} -/** -* Sets the x scale displacement of the object, usefull for animation -* @param {number} value The value to assign to the x displacement -*/ -GLGE.Placeable.prototype.setDScaleX=function(value){this.dScaleX=value;this.updateMatrix();return this;} -/** -* Sets the y scale displacement of the object, usefull for animation -* @param {number} value The value to assign to the y displacement -*/ -GLGE.Placeable.prototype.setDScaleY=function(value){this.dScaleY=value;this.updateMatrix();return this;} -/** -* Sets the z scale displacement of the object, usefull for animation -* @param {number} value The value to assign to the z displacement -*/ -GLGE.Placeable.prototype.setDScaleZ=function(value){this.dScaleZ=value;this.updateMatrix();return this;} -/** -* Sets the scale displacement of the object, useful for animation -* @param {number} x The value to assign to the x scale -* @param {number} y The value to assign to the y scale -* @param {number} z The value to assign to the z scale -*/ -GLGE.Placeable.prototype.setDScale=function(x,y,z){this.dScaleX=x;this.dScaleY=y;this.dScaleZ=z;this.updateMatrix();return this;} -/** -* Gets the x location of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getLocX=function(){return this.locX;} -/** -* Gets the y location of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getLocY=function(){return this.locY;} -/** -* Gets the z location of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getLocZ=function(){return this.locZ;} -/** -* Gets the x location displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDLocX=function(){return this.dLocX;} -/** -* Gets the y location displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDLocY=function(){return this.dLocY;} -/** -* Gets the z location displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDLocZ=function(){return this.dLocZ;} -/** -* Gets the x quat of the rotation -* @returns {number} -*/ -GLGE.Placeable.prototype.getQuatX=function(){return this.quatX;} -/** -* Gets the y quat of the rotation -* @returns {number} -*/ -GLGE.Placeable.prototype.getQuatY=function(){return this.quatY;} -/** -* Gets the z quat of the rotation -* @returns {number} -*/ -GLGE.Placeable.prototype.getQuatZ=function(){return this.quatZ;} -/** -* Gets the w quat of the rotation -* @returns {number} -*/ -GLGE.Placeable.prototype.getQuatW=function(){return this.quatW;} -/** -* Gets the x rotation of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getRotX=function(){return this.rotX;} -/** -* Gets the y rotation of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getRotY=function(){return this.rotY;} -/** -* Gets the z rotation of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getRotZ=function(){return this.rotZ;} -/** -* Gets the x rotaional displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDRotX=function(){return this.dRotX;} -/** -* Gets the y rotaional displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDRotY=function(){return this.dRotY;} -/** -* Gets the z rotaional displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDRotZ=function(){return this.dRotZ;} -/** -* Gets the x scale of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getScaleX=function(){return this.scaleX;} -/** -* Gets the y scale of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getScaleY=function(){return this.scaleY;} -/** -* Gets the z scale of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getScaleZ=function(){return this.scaleZ;} -/** -* Gets the x scale displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDScaleX=function(){return this.dScaleX;} -/** -* Gets the y scale displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDScaleY=function(){return this.dScaleY;} -/** -* Gets the z scale displacement of the object -* @returns {number} -*/ -GLGE.Placeable.prototype.getDScaleZ=function(){return this.dScaleZ;} -/** -* Gets the position of the object -* @returns {array} -*/ -GLGE.Placeable.prototype.getPosition=function(){ - var position={}; - position.x=parseFloat(this.locX)+parseFloat(this.dLocX); - position.y=parseFloat(this.locY)+parseFloat(this.dLocY); - position.z=parseFloat(this.locZ)+parseFloat(this.dLocZ); - return position; -} -/** -* Gets the rotation of the object -* @returns {object} -*/ -GLGE.Placeable.prototype.getRotation=function(){ - var rotation={}; - if(this.mode==GLGE.P_EULER){ - rotation.x=parseFloat(this.rotX)+parseFloat(this.dRotX); - rotation.y=parseFloat(this.rotY)+parseFloat(this.dRotY); - rotation.z=parseFloat(this.rotZ)+parseFloat(this.dRotZ); - } - if(this.mode==GLGE.P_QUAT){ - rotation.x=parseFloat(this.quatX); - rotation.y=parseFloat(this.quatY); - rotation.z=parseFloat(this.quatZ); - rotation.w=parseFloat(this.quatW); - } - return rotation; -} -/** -* Gets the scale of the object -* @returns {object} -*/ -GLGE.Placeable.prototype.getScale=function(){ - var scale={}; - scale.x=parseFloat(this.scaleX)+parseFloat(this.dScaleX); - scale.y=parseFloat(this.scaleY)+parseFloat(this.dScaleY); - scale.z=parseFloat(this.scaleZ)+parseFloat(this.dScaleZ); - return scale; -} -/** -* Updates the model matrix -* @private -*/ -GLGE.Placeable.prototype.updateMatrix=function(){ - this.matrix=null; - if(this.children){ - for(var i=0;i<this.children.length;i++){ - this.children[i].updateMatrix(); - } - } -} -/** -* Gets the model matrix to transform the model within the world -*/ -GLGE.Placeable.prototype.getModelMatrix=function(){ - if(!this.matrix){ - this.invmatrix=null; - this.transmatrix=null; - this.transinvmatrix=null; - var position=this.getPosition(); - var scale=this.getScale(); - var matrix=GLGE.mulMat4(GLGE.translateMatrix(position.x,position.y,position.z),GLGE.mulMat4(this.getRotMatrix(),GLGE.scaleMatrix(scale.x,scale.y,scale.z))); - if(this.parent) matrix=GLGE.mulMat4(this.parent.getModelMatrix(),matrix); - this.matrix=matrix; - } - return this.matrix; -} -/** -* Gets the model inverse matrix to transform the model within the world -*/ -GLGE.Placeable.prototype.getInverseModelMatrix=function(){ - if(!this.matrix){ - this.getModelMatrix(); - } - if(!this.invmatrix){ - this.invmatrix=GLGE.transposeMat4(this.matrix); - } - return this.invmatrix; -} -/** -* Gets the model transposed matrix to transform the model within the world -*/ -GLGE.Placeable.prototype.getTransposeModelMatrix=function(){ - if(!this.matrix){ - this.getModelMatrix(); - } - if(!this.transmatrix){ - this.transmatrix=GLGE.transposeMat4(this.matrix); - } - return this.transmatrix; -} -/** -* Gets the model inverse transposed matrix to transform the model within the world -*/ -GLGE.Placeable.prototype.getTransposeInverseModelMatrix=function(){ - if(!this.matrix){ - this.getModelMatrix(); - } - if(!this.transinvmatrix){ - this.invtransmatrix=GLGE.transposeMat4(this.getInverseModelMatrix()); - } - return this.transinvmatrix; -} - -/** -* @class Animation class to agument animatiable objects -* @augments GLGE.Events -*/ -GLGE.Animatable=function(){ -} -/** - * @name GLGE.Animatable#animFinished - * @event - * @param {object} data - */ -GLGE.augment(GLGE.Events,GLGE.Animatable); - -GLGE.Animatable.prototype.animationStart=null; -GLGE.Animatable.prototype.animation=null; -GLGE.Animatable.prototype.blendStart=0; -GLGE.Animatable.prototype.blendTime=0; -GLGE.Animatable.prototype.lastFrame=null; -GLGE.Animatable.prototype.frameRate=25; -GLGE.Animatable.prototype.loop=GLGE.TRUE; -GLGE.Animatable.prototype.paused=GLGE.FALSE; -GLGE.Animatable.prototype.pausedTime=null; -GLGE.Animatable.prototype.blendFunction=GLGE.LINEAR_BLEND; - -/** -* Creates and sets an animation to blend to the properties. Useful for blending to a specific location for example: -* blendto({LocX:10,LocY:5,LocZ:10},2000); -* @param {object} properties The properties to blend -* @param {number} duration the duration of the blend -* @param {function} blendFunction[optional] the function used for blending defaults to GLGE.LINEAR_BLEND -*/ -GLGE.Animatable.prototype.blendTo=function(properties,duration,blendFunction){ - if(!blendFunction) blendFunction=GLGE.LINEAR_BLEND; - var animation=new GLGE.AnimationVector(); - var curve; - var point; - for(prop in properties){ - curve=new GLGE.AnimationCurve(); - curve.setChannel(prop); - point=new GLGE.LinearPoint(); - point.setX(1); - point.setY(properties[prop]); - curve.addPoint(point); - animation.addAnimationCurve(curve); - } - this.setBlendFunction(blendFunction); - this.setAnimation(animation,duration); - return this; -} -/** -* Sets the animation blending function -* @param {function} value The blending function -*/ -GLGE.Animatable.prototype.setBlendFunction=function(value){ - this.blendFunction=value; - return this; -} -/** -* Gets the animation blending function -* @returns {function} the blending function -*/ -GLGE.Animatable.prototype.getBlendFunction=function(){ - return this.blendFunction; -} - -/** -* Sets the name of this object used for skinning -* @param {String} value The name to set -*/ -GLGE.Animatable.prototype.setName=function(value){ - this.name=value; - return this; -} -/** -* Gets the name of this object used for skinning -* @returns {String} the name -*/ -GLGE.Animatable.prototype.getName=function(){ - return this.name; -} -/** -* gets the frame at the specified time -* @param {number} now the current time -*/ - GLGE.Animatable.prototype.getFrameNumber=function(now){ - var frame; - if(!now) now=parseInt(new Date().getTime()); - if(this.animation.frames>1){ - if(this.loop){ - frame=((parseFloat(now)-parseFloat(this.animationStart))/1000*this.frameRate)%(this.animation.frames-1)+1; - }else{ - frame=((parseFloat(now)-parseFloat(this.animationStart))/1000*this.frameRate)+1; - if(frame>=this.animation.frames){ - frame=this.animation.frames; - } - } - }else{ - frame=1; - } - - return Math.round(frame); -} - - /** -* gets the initial values for the animation vector for blending -* @param {GLGE.AnimationVector} animation The animation -* @private -*/ - GLGE.Animatable.prototype.getInitialValues=function(animation,time){ - var initValues={}; - - if(this.animation){ - this.lastFrame=null; - this.animate(time,true); - } - - for(var property in animation.curves){ - if(this["get"+property]){ - initValues[property]=this["get"+property](); - } - } - - return initValues; -} - -/** -* update animated properties on this object -*/ -GLGE.Animatable.prototype.animate=function(now,nocache){ - if(!this.paused && this.animation){ - if(!now) now=parseInt(new Date().getTime()); - var frame=this.getFrameNumber(now); - - if(!this.animation.animationCache) this.animation.animationCache={}; - if(frame!=this.lastFrame || this.blendTime!=0){ - this.lastFrame=frame; - if(this.blendTime==0){ - if(!this.animation.animationCache[frame] || nocache){ - this.animation.animationCache[frame]=[]; - for(property in this.animation.curves){ - if(this["set"+property]){ - var value=this.animation.curves[property].getValue(parseFloat(frame)); - switch(property){ - case "QuatX": - case "QuatY": - case "QuatZ": - case "QuatW": - case "RotX": - case "RotY": - case "RotZ": - var rot=true; - break; - default: - this.animation.animationCache[frame].push({property:property,value:value}); - break; - } - this["set"+property](value); - } - } - if(rot){ - value=this.getRotMatrix(); - this.animation.animationCache[frame].push({property:"RotMatrix",value:value}); - } - }else{ - var cache=this.animation.animationCache[frame]; - for(var i=0;i<cache.length;i++){ - if(this["set"+cache[i].property]) this["set"+cache[i].property](cache[i].value); - } - } - }else{ - var time=now-this.animationStart; - if(time<this.blendTime){ - var blendfactor=time/this.blendTime; - blendfactor=this.blendFunction(blendfactor); - for(property in this.animation.curves){ - if(this["set"+property]){ - var value=this.animation.curves[property].getValue(parseFloat(frame)); - value=value*blendfactor+this.blendInitValues[property]*(1-blendfactor); - this["set"+property](value); - } - } - }else{ - this.blendTime=0; - } - } - } - } - if(this.children){ - for(var i=0; i<this.children.length;i++){ - if(this.children[i].animate){ - this.children[i].animate(now,nocache); - } - } - } - if(this.animation && !this.animFinished && this.blendTime==0 && this.animation.frames==frame && !nocache){ - this.animFinished=true; - this.fireEvent("animFinished",{}); - } -} -/** -* Sets the animation vector of this object -* @param {GLGE.AnimationVector} animationVector the animation to apply to this object -* @param {number} blendDuration [Optional] the time in milliseconds to blend into this animation -* @param {number} starttime [Optional] the starting time of the animation -*/ -GLGE.Animatable.prototype.setAnimation=function(animationVector,blendDuration,starttime){ - if(starttime==null) starttime=parseInt(new Date().getTime()); - if(!blendDuration) blendDuration=0; - if(blendDuration>0){ - this.blendInitValues=this.getInitialValues(animationVector,starttime); - this.blendTime=blendDuration; - } - this.animationStart=starttime; - this.lastFrame=null; - this.animation=animationVector; - this.animFinished=false; - return this; -} -/** -* Gets the animation vector of this object -* @returns {AnimationVector} -*/ -GLGE.Animatable.prototype.getAnimation=function(){ - return this.animation; -} -/** -* Sets the frame rate of the animation -* @param {number} value the frame rate to set -*/ -GLGE.Animatable.prototype.setFrameRate=function(value){ - this.frameRate=value; - return this; -} -/** -* Gets the frame rate of the animation -* @return {number} the current frame rate -*/ -GLGE.Animatable.prototype.getFrameRate=function(){ - return this.frameRate; -} -/** -* Sets the loop flag to GLGE.TRUE or GLGE.FALSE -* @param {boolean} value -*/ -GLGE.Animatable.prototype.setLoop=function(value){ - this.loop=value; - return this; -} -/** -* Gets the loop flag -* @return {boolean} -*/ -GLGE.Animatable.prototype.getLoop=function(){ - return this.loop; -} -/** -* @function is looping? @see GLGE.Animatable#getLoop -*/ -GLGE.Animatable.prototype.isLooping=GLGE.Animatable.prototype.getLoop; - -/** -* Sets the paused flag to GLGE.TRUE or GLGE.FALSE -* @param {boolean} value -*/ -GLGE.Animatable.prototype.setPaused=function(value){ - if(value) this.pauseTime=parseInt(new Date().getTime()); - else this.animationStart=this.animationStart+(parseInt(new Date().getTime())-this.pauseTime); - this.paused=value; - return this; -} -/** -* Gets the paused flag -* @return {boolean} -*/ -GLGE.Animatable.prototype.getPaused=function(){ - return this.paused; -} -/** -* Toggles the paused flag -* @return {boolean} returns the resulting flag state -*/ -GLGE.Animatable.prototype.togglePaused=function(){ - this.setPaused(!this.getPaused()); - return this.paused; -} -closure_export(); - - -/** -* @class A bezier class to add points to the Animation Curve -* @param {string} uid a unique string to identify this object -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.BezTriple=function(uid){ - GLGE.Assets.registerAsset(this,uid); -}; -GLGE.augment(GLGE.QuickNotation,GLGE.BezTriple); -GLGE.augment(GLGE.JSONLoader,GLGE.BezTriple); - -GLGE.BezTriple.prototype.className="BezTriple"; -/** -* set the x1-coord -* @param {number} x x1-coord control point -*/ -GLGE.BezTriple.prototype.setX1=function(x){ - this.x1=parseFloat(x); - return this; -}; -/** -* set the y1-coord -* @param {number} y y1-coord control point -*/ -GLGE.BezTriple.prototype.setY1=function(y){ - this.y1=parseFloat(y); - return this; -}; -/** -* set the x2-coord -* @param {number} x x2-coord control point -*/ -GLGE.BezTriple.prototype.setX2=function(x){ - this.x=parseFloat(x); - return this; -}; -/** -* set the y2-coord -* @param {number} y y2-coord control point -*/ -GLGE.BezTriple.prototype.setY2=function(y){ - this.y=parseFloat(y); - return this; -}; -/** -* set the x3-coord -* @param {number} x x3-coord control point -*/ -GLGE.BezTriple.prototype.setX3=function(x){ - this.x3=parseFloat(x); - return this; -}; -/** -* set the y3-coord -* @param {number} y y3-coord control point -*/ -GLGE.BezTriple.prototype.setY3=function(y){ - this.y3=parseFloat(y); - return this; -}; - - -/** -* @class A LinearPoint class to add points to the Animation Curve -* @param {string} uid unique string for this class -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.LinearPoint=function(uid){ - GLGE.Assets.registerAsset(this,uid); -}; -GLGE.augment(GLGE.QuickNotation,GLGE.LinearPoint); -GLGE.augment(GLGE.JSONLoader,GLGE.LinearPoint); -GLGE.LinearPoint.prototype.className="LinearPoint"; -/** -* set the x-coord -* @param {number} x x-coord control point -*/ -GLGE.LinearPoint.prototype.setX=function(x){ - this.x=parseFloat(x); - return this; -}; -/** -* set the y-coord -* @param {number} y y-coord control point -*/ -GLGE.LinearPoint.prototype.setY=function(y){ - this.y=parseFloat(y); - return this; -}; - - -/** -* @class A StepPoint class to add points to the Animation Curve -* @param {number} x x-coord control point -* @param {object} value value of control point -*/ -GLGE.StepPoint=function(x,value){ - this.x=parseFloat(x); - this.y=value; -}; - -/** -* @class A curve which interpolates between control points -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.AnimationCurve=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.keyFrames=[]; - this.solutions={}; -}; -GLGE.augment(GLGE.QuickNotation,GLGE.AnimationCurve); -GLGE.augment(GLGE.JSONLoader,GLGE.AnimationCurve); -GLGE.AnimationCurve.prototype.className="AnimationCurve"; -GLGE.AnimationCurve.prototype.keyFrames=null; -/** -* Adds a point to the curve -* @param {object} point The point to add -* @returns {Number} Index of the newly added point -*/ -GLGE.AnimationCurve.prototype.addPoint=function(point){ - this.keyFrames.push(point); - return this.keyFrames.length-1; -}; -GLGE.AnimationCurve.prototype.addStepPoint=GLGE.AnimationCurve.prototype.addPoint; -GLGE.AnimationCurve.prototype.addLinearPoint=GLGE.AnimationCurve.prototype.addPoint; -GLGE.AnimationCurve.prototype.addBezTriple=GLGE.AnimationCurve.prototype.addPoint; -/** -* Get the value of the curve at any point -* @param {Number} frame The frame(x-coord) to return the value for -* @returns {Number} The value of the curve at the given point -*/ -GLGE.AnimationCurve.prototype.coord=function(x,y){ - return {x:x,y:y} -} -/** -* Sets the animation channel this curve animates -* @param {string} channel The property to animate -*/ -GLGE.AnimationCurve.prototype.setChannel=function(channel){ - this.channel=channel -} -GLGE.AnimationCurve.prototype.getValue=function(frame){ - var startKey; - var endKey; - var preStartKey; - var preEndKey; - if(frame<this.keyFrames[0].x) return this.keyFrames[0].y; - for(var i=0; i<this.keyFrames.length;i++){ - if(this.keyFrames[i].x==frame){ - return this.keyFrames[i].y; - } - if(this.keyFrames[i].x<=frame && (startKey==undefined || this.keyFrames[i].x>this.keyFrames[startKey].x)){ - preStartKey=startKey; - startKey=i; - }else if(this.keyFrames[i].x<=frame && (preStartKey==undefined || this.keyFrames[i].x>this.keyFrames[preStartKey].x)){ - preStartKey=i; - } - if(this.keyFrames[i].x>frame && (endKey==undefined || this.keyFrames[i].x<=this.keyFrames[endKey].x)){ - preEndKey=endKey; - endKey=i; - }else if(this.keyFrames[i].x>frame && (preEndKey==undefined || this.keyFrames[i].x<=this.keyFrames[preEndKey].x)){ - preEndKey=i; - } - } - if(startKey==undefined){ - startKey=endKey; - endKey=preEndKey; - } - if(endKey==undefined){ - endKey=startKey; - startKey=preStartKey; - } - if(this.keyFrames[startKey] instanceof GLGE.BezTriple && this.keyFrames[endKey] instanceof GLGE.BezTriple){ - var C1=this.coord(this.keyFrames[startKey].x,this.keyFrames[startKey].y); - var C2=this.coord(this.keyFrames[startKey].x3,this.keyFrames[startKey].y3); - var C3=this.coord(this.keyFrames[endKey].x1,this.keyFrames[endKey].y1); - var C4=this.coord(this.keyFrames[endKey].x,this.keyFrames[endKey].y); - return this.atX(frame,C1,C2,C3,C4).y; - } - if(this.keyFrames[startKey] instanceof GLGE.LinearPoint && this.keyFrames[endKey] instanceof GLGE.BezTriple){ - var C1=this.coord(this.keyFrames[startKey].x,this.keyFrames[startKey].y); - var C2=this.coord(this.keyFrames[endKey].x1,this.keyFrames[endKey].y1); - var C3=this.coord(this.keyFrames[endKey].x1,this.keyFrames[endKey].y1); - var C4=this.coord(this.keyFrames[endKey].x,this.keyFrames[endKey].y); - return this.atX(frame,C1,C2,C3,C4).y; - } - if(this.keyFrames[startKey] instanceof GLGE.BezTriple && this.keyFrames[endKey] instanceof GLGE.LinearPoint){ - var C1=this.coord(this.keyFrames[startKey].x,this.keyFrames[startKey].y); - var C2=this.coord(this.keyFrames[startKey].x3,this.keyFrames[startKey].y3); - var C3=this.coord(this.keyFrames[startKey].x3,this.keyFrames[startKey].y3); - var C4=this.coord(this.keyFrames[endKey].x,this.keyFrames[endKey].y); - return this.atX(frame,C1,C2,C3,C4).y; - } - if(this.keyFrames[startKey] instanceof GLGE.LinearPoint && this.keyFrames[endKey] instanceof GLGE.LinearPoint){ - var value=(frame-this.keyFrames[startKey].x)*(this.keyFrames[endKey].y-this.keyFrames[startKey].y)/(this.keyFrames[endKey].x-this.keyFrames[startKey].x)+this.keyFrames[startKey].y; - return value; - } - if(this.keyFrames[startKey] instanceof GLGE.StepPoint){ - return this.keyFrames[startKey].y - } - if(!this.keyFrames.preStartKey) this.keyFrames.preStartKey=this.keyFrames[0].y; - return this.keyFrames.preStartKey; -}; -/** -* Function used to calculate bezier curve -* @private -*/ -GLGE.AnimationCurve.prototype.B1=function(t) { return t*t*t }; -/** -* Function used to calculate bezier curve -* @private -*/ -GLGE.AnimationCurve.prototype.B2=function(t) { return 3*t*t*(1-t) }; -/** -* Function used to calculate bezier curve -* @private -*/ -GLGE.AnimationCurve.prototype.B3=function(t) { return 3*t*(1-t)*(1-t) }; -/** -* Function used to calculate bezier curve -* @private -*/ -GLGE.AnimationCurve.prototype.B4=function(t) { return (1-t)*(1-t)*(1-t) }; -/** -* Gets the value of a bezier curve at a given point -* @private -*/ -GLGE.AnimationCurve.prototype.getBezier=function(t,C1,C2,C3,C4) { - var pos = {}; - pos.x = C1.x*this.B1(t) + C2.x*this.B2(t) + C3.x*this.B3(t) + C4.x*this.B4(t); - pos.y = C1.y*this.B1(t) + C2.y*this.B2(t) + C3.y*this.B3(t) + C4.y*this.B4(t); - return pos; -}; -/** -* Solves cubic equation to get the parametic value of the curve at a specified point -* @private -*/ -GLGE.AnimationCurve.prototype.Quad3Solve=function(a,b,c,d){ - ref=a+"-"+b+"-"+"-"+c+"-"+d; - if(this.solutions[ref]){ - return this.solutions[ref]; - } - else - { - b /= a;c /= a;d /= a; - var q, r, d1, s, t, t1, r13; - q = (3.0*c - (b*b))/9.0; - r = -(27.0*d) + b*(9.0*c - 2.0*(b*b)); - r /= 54.0; - t1 = (b/3.0); - discrim = q*q*q + r*r; - result=[]; - - if (discrim > 0) { - // one real, two complex - s = r + Math.sqrt(discrim); - s = ((s < 0) ? -Math.pow(-s, (1.0/3.0)) : Math.pow(s, (1.0/3.0))); - t = r - Math.sqrt(discrim); - t = ((t < 0) ? -Math.pow(-t, (1.0/3.0)) : Math.pow(t, (1.0/3.0))); - result[0] = -t1 + s + t; - t1 = t1 + (s + t)/2.0; - result[1] = result[2] = -t1; - t1 = Math.sqrt(3.0)*(-t + s)/2; - } - else if (discrim == 0){ - // All roots real - r13 = ((r < 0) ? -Math.pow(-r,(1.0/3.0)) : Math.pow(r,(1.0/3.0))); - result[1] = -t1 + 2.0*r13; - result[1] = result[2] = -(r13 + t1); - } - else - { - q = -q; - d1 = q*q*q; - d1 = Math.acos(r/Math.sqrt(1)); - r13 = 2.0*Math.sqrt(q); - - - result[0] = -t1 + r13*Math.cos(d1/3.0); - result[1] = -t1 + r13*Math.cos((d1 + 2.0*Math.PI)/3.0); - result[2] = -t1 + r13*Math.cos((d1 + 4.0*Math.PI)/3.0); - } - var toreturn=false; - //determine which is the correct result - if(result[0]>=0 && result[0]<=1) toreturn=result[0]; - if(!toreturn && result[1]>=0 && result[1]<=1) toreturn=result[1]; - if(!toreturn && result[2]>=0 && result[2]<=1) toreturn=result[2]; - //cache result for next time - this.solutions[ref]=toreturn; - - return toreturn; - } -}; -/** -* Get the value of the a single bezier curve -* @param {Number} x xcoord of point to get -* @param {Number} C1 First bezier control point -* @param {Number} C2 Second bezier control point -* @param {Number} C3 Third bezier control point -* @param {Number} C4 Forth bezier control point -* @returns {Number} The value of the curve at the given x -*/ -GLGE.AnimationCurve.prototype.atX=function(x,C1,C2,C3,C4){ - a=C1.x-C2.x*3+C3.x*3-C4.x; - b=C2.x*3-C3.x*6+C4.x*3; - c=C3.x*3-C4.x*3; - d=C4.x-x; - return this.getBezier(this.Quad3Solve(a,b,c,d),C1,C2,C3,C4); -}; - -/** -* @class The AnimationVectors class allows you to specify the 2D Animation curves that define specific channels of animation within the engine. -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.AnimationVector=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.curves=[]; -} -GLGE.augment(GLGE.QuickNotation,GLGE.AnimationVector); -GLGE.augment(GLGE.JSONLoader,GLGE.AnimationVector); -GLGE.AnimationVector.prototype.curves=[]; -GLGE.AnimationVector.prototype.frames=250; - -/** -* Adds an Animation Curve to a channel -* @param {String} channel The name of the curve to be added -* @param {GLGE.AnimationCurve} curve The animation curve to add -*/ -GLGE.AnimationVector.prototype.addAnimationCurve=function(curve){ - this.curves[curve.channel]=curve; - return this; -} -/** -* Removes an Animation Curve form a channel -* @param {String} channel The name of the curve to be removed -*/ -GLGE.AnimationVector.prototype.removeAnimationCurve=function(name){ - delete(this.curves[name]); -} -/** -* Sets the number of frames in the animation -* @param {number} value The number of frames in the animation -*/ -GLGE.AnimationVector.prototype.setFrames=function(value){ - this.frames=value; - return this; -} -/** -* Sets the number of frames in the animation -* @returns {number} The number of frames in the animation -*/ -GLGE.AnimationVector.prototype.getFrames=function(){ - return this.frames; -} - - -/** -* @constant -* @description Enumeration for node group type -*/ -GLGE.G_NODE=1; -/** -* @constant -* @description Enumeration for root group type -*/ -GLGE.G_ROOT=2; -/** -* @class Group class to allow object transform hierarchies -* @augments GLGE.Animatable -* @augments GLGE.Placeable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Group=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.children=[]; -} -GLGE.augment(GLGE.Placeable,GLGE.Group); -GLGE.augment(GLGE.Animatable,GLGE.Group); -GLGE.augment(GLGE.QuickNotation,GLGE.Group); -GLGE.augment(GLGE.JSONLoader,GLGE.Group); -GLGE.Group.prototype.children=null; -GLGE.Group.prototype.className="Group"; -GLGE.Group.prototype.type=GLGE.G_NODE; -/** -* Sets the action for this Group -* @param {GLGE.Action} action the action to apply -*/ -GLGE.Group.prototype.setAction=function(action,blendTime,loop){ - action.start(blendTime,loop,this.getNames()); - return this; -} -/** -* Gets the name of the object and names of any sub objects -* @returns an object of name -*/ -GLGE.Group.prototype.getNames=function(names){ - if(!names) names={}; - var thisname=this.getName(); - if(thisname!="") names[thisname]=this; - for(var i=0;i<this.children.length;i++){ - if(this.children[i].getNames){ - this.children[i].getNames(names); - } - } - return names; -} -/** -* Gets the bounding volume for this group -* @returns {GLGE.BoundingVolume} -*/ -GLGE.Group.prototype.getBoundingVolume=function(){ - this.boundingVolume=new GLGE.BoundingVolume(0,0,0,0,0,0); - for(var i=0; i<this.children.length;i++){ - if(this.children[i].getBoundingVolume){ - this.boundingVolume.addBoundingVolume(this.children[i].getBoundingVolume()); - }else if(this.children[i].getLocX){ - //if now bounding rec for this child but has a position then assume a point such as a light - var x=parseFloat(this.children[i].getLocX()); - var y=parseFloat(this.children[i].getLocY()); - var z=parseFloat(this.children[i].getLocZ()); - this.boundingVolume.addBoundingVolume(new GLGE.BoundingVolume(x,x,y,y,z,z)); - } - } - this.boundingVolume.applyMatrixScale(this.getModelMatrix()); - - return this.boundingVolume; -} -/** -* Gets a list of all objects in this group -* @param {array} pointer to an array [optional] -* @returns {GLGE.Object[]} an array of GLGE.Objects -*/ -GLGE.Group.prototype.getObjects=function(objects){ - if(!objects) objects=[]; - for(var i=0; i<this.children.length;i++){ - if(this.children[i].className=="Object" || this.children[i].className=="Text" || this.children[i].toRender){ - if(this.children[i].renderFirst) objects.unshift(this.children[i]); - else objects.push(this.children[i]); - }else if(this.children[i].getObjects){ - this.children[i].getObjects(objects); - } - } - return objects; -} -/** -* Gets a list of all lights in this group -* @param {array} pointer to an array [optional] -* @returns {GLGE.Lights[]} an array of GLGE.Lights -*/ -GLGE.Group.prototype.getLights=function(lights){ - if(!lights) lights=[]; - for(var i=0; i<this.children.length;i++){ - if(this.children[i].className=="Light"){ - lights.push(this.children[i]); - }else if(this.children[i].getLights){ - this.children[i].getLights(lights); - } - } - return lights; -} - - -/** -* Adds a new object to this group -* @param {object} object the object to add to this group -*/ -GLGE.Group.prototype.addChild=function(object){ - if(object.parent) object.parent.removeChild(object); - object.matrix=null; //clear any cache - object.parent=this; - this.children.push(object); - return this; -} -GLGE.Group.prototype.addObject=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addObjectInstance=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addGroup=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addText=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addSkeleton=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addLight=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addCamera=GLGE.Group.prototype.addChild; -GLGE.Group.prototype.addWavefront=GLGE.Group.prototype.addChild; -/** -* Removes an object or sub group from this group -* @param {object} object the item to remove -*/ -GLGE.Group.prototype.removeChild=function(object){ - for(var i=0;i<this.children.length;i++){ - if(this.children[i]==object){ - this.children.splice(i, 1); - if(this.scene && this.scene["remove"+object.className]){ - this.scene["remove"+object.className](object); - } - break; - } - } -} -/** -* Gets an array of all children in this group -*/ -GLGE.Group.prototype.getChildren=function(){ - return this.children; -} -/** -* Initiallize all the GL stuff needed to render to screen -* @private -*/ -GLGE.Group.prototype.GLInit=function(gl){ - this.gl=gl; - for(var i=0;i<this.children.length;i++){ - if(this.children[i].GLInit){ - this.children[i].GLInit(gl); - } - } -} -/** -* Renders the group to the render buffer -* @private -*/ -GLGE.Group.prototype.GLRender=function(gl,renderType){ - //animate this object - if(renderType==GLGE.RENDER_DEFAULT){ - if(this.animation) this.animate(); - } - if(!this.gl){ - this.GLInit(gl); - } - for(var i=0;i<this.children.length;i++){ - if(this.children[i].GLRender){ - this.children[i].GLRender(gl,renderType); - } - } -} - - -closure_export(); - -/** -* @class Class defining a channel of animation for an action -* @param {string} uid a unique reference string for this object -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.ActionChannel=function(uid){ - GLGE.Assets.registerAsset(this,uid); -} -GLGE.augment(GLGE.QuickNotation,GLGE.ActionChannel); -GLGE.augment(GLGE.JSONLoader,GLGE.ActionChannel); -/** -* Sets the name/object of the bone channel -* @param {string} name the name of the bone channel -*/ -GLGE.ActionChannel.prototype.setTarget=function(object){ - this.target=object; -}; -/** -* Sets the animation for this channel -* @param {GLGE.AnimationVector} animation the animation vector for this channel -*/ -GLGE.ActionChannel.prototype.setAnimation=function(animation){ - this.animation=animation; -}; -/** -* Gets the name/object of the bone channel -* @returns {string} the name of the bone channel -*/ -GLGE.ActionChannel.prototype.getTarget=function(){ - return this.target; -}; -/** -* Gets the animation vector for this channel -* @returns {GLGE.AnimationVector} the animation vector for this channel -*/ -GLGE.ActionChannel.prototype.getAnimation=function(){ - return this.animation; -}; - -/** -* @class Class to describe and action on a skeleton -* @param {string} uid a unique reference string for this object -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Action=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.channels=[]; -}; -GLGE.augment(GLGE.QuickNotation,GLGE.Action); -GLGE.augment(GLGE.JSONLoader,GLGE.Action); -/** - * @name Action#animFinished - * @event - * @param {object} data - */ -GLGE.augment(GLGE.Events,GLGE.Action); - -/** -* Starts playing the action -*/ -GLGE.Action.prototype.start=function(blendTime,loop,names){ - if(!loop) loop=false; - if(!blendTime) blendTime=0; - var channels=this.channels; - var start=(new Date()).getTime(); - this.animFinished=false; - - for(var i=0;i<channels.length;i++){ - var animation=channels[i].getAnimation(); - var action=this; - var channel=channels[i]; - var target=channel.getTarget(); - if(typeof target=="string"){ - if(names && names[target]){ - target=names[target]; - } - } - var closure={}; - closure.finishEvent=function(data){ - target.removeEventListener("animFinished",closure.finishEvent); - if(!action.animFinished && target.animation==animation){ - action.fireEvent("animFinished",{}); - action.animFinished=true; - } - } - target.addEventListener("animFinished",closure.finishEvent); - - target.setAnimation(animation,blendTime,start); - target.setLoop(loop); - - } -}; -/** -* Adds and action channel to this action -* @param {GLGE.ActionChannel} channel the channel to be added -*/ -GLGE.Action.prototype.addActionChannel=function(channel){ - this.channels.push(channel); - return this; -}; -/** -* Removes and action channel to this action -* @param {GLGE.ActionChannel} channel the channel to be removed -*/ -GLGE.Action.prototype.removeActionChannel=function(channel){ - for(var i=0;i<this.channels.length;i++){ - if(this.channels[i]==channels){ - this.channels.splice(i,1); - break; - } - } -}; - - - -/** -* @class Text that can be rendered in a scene -* @augments GLGE.Animatable -* @augments GLGE.Placeable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Text=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.canvas=document.createElement("canvas"); - this.color={r:1.0,g:1.0,b:1.0}; -} -GLGE.augment(GLGE.Placeable,GLGE.Text); -GLGE.augment(GLGE.Animatable,GLGE.Text); -GLGE.augment(GLGE.QuickNotation,GLGE.Text); -GLGE.augment(GLGE.JSONLoader,GLGE.Text); -GLGE.Text.prototype.className="Text"; -GLGE.Text.prototype.zTrans=true; -GLGE.Text.prototype.canvas=null; -GLGE.Text.prototype.aspect=1.0; -GLGE.Text.prototype.color=null; -GLGE.Text.prototype.text=""; -GLGE.Text.prototype.font="Times"; -GLGE.Text.prototype.size=100; -GLGE.Text.prototype.pickType=GLGE.TEXT_TEXTPICK; - -/** -* Gets the pick type for this text -* @returns {string} the pick type -*/ -GLGE.Text.prototype.getPickType=function(){ - return this.pickType; -}; -/** -* Sets the pick type GLGE.TEXT_BOXPICK for picking based on bound box or GLGE.TEXT_TEXTPICK for pixel perfect text picking -* @param {Number} value the picking type -*/ -GLGE.Text.prototype.setPickType=function(value){ - this.pickType=value; - return this; -}; -/** -* Gets the font of the text -* @returns {string} the font of the text -*/ -GLGE.Text.prototype.getFont=function(){ - return this.size; -}; -/** -* Sets the font of the text -* @param {Number} value the font of the text -*/ -GLGE.Text.prototype.setFont=function(value){ - this.font=value; - if(this.gl) this.updateCanvas(this.gl); - return this; -}; -/** -* Gets the size of the text -* @returns {string} the size of the text -*/ -GLGE.Text.prototype.getSize=function(){ - return this.size; -}; -/** -* Sets the size of the text -* @param {Number} value the size of the text -*/ -GLGE.Text.prototype.setSize=function(value){ - this.size=value; - if(this.gl) this.updateCanvas(this.gl); - return this; -}; -/** -* Gets the rendered text -* @returns {string} the text rendered -*/ -GLGE.Text.prototype.getText=function(){ - return this.text; -}; -/** -* Sets the text to be rendered -* @param {Number} value the text to render -*/ -GLGE.Text.prototype.setText=function(value){ - this.text=value; - if(this.gl) this.updateCanvas(this.gl); - return this; -}; -/** -* Sets the base colour of the text -* @param {string} color The colour of the material -*/ -GLGE.Text.prototype.setColor=function(color){ - color=GLGE.colorParse(color); - this.color={r:color.r,g:color.g,b:color.b}; - return this; -}; -/** -* Sets the red base colour of the text -* @param {Number} r The new red level 0-1 -*/ -GLGE.Text.prototype.setColorR=function(value){ - this.color.r=value; - return this; -}; -/** -* Sets the green base colour of the text -* @param {Number} g The new green level 0-1 -*/ -GLGE.Text.prototype.setColorG=function(value){ - this.color.g=value; - return this; -}; -/** -* Sets the blue base colour of the text -* @param {Number} b The new blue level 0-1 -*/ -GLGE.Text.prototype.setColorB=function(value){ - this.color.b=value; - return this; -}; -/** -* Gets the current base color of the text -* @return {[r,g,b]} The current base color -*/ -GLGE.Text.prototype.getColor=function(){ - return this.color; - return this; -}; - -/** -* Sets the Z Transparency of this text -* @param {boolean} value Does this object need blending? -*/ -GLGE.Text.prototype.setZtransparent=function(value){ - this.zTrans=value; - return this; -} -/** -* Gets the z transparency -* @returns boolean -*/ -GLGE.Text.prototype.isZtransparent=function(){ - return this.zTrans; -} -/** -* Creates the shader program for the object -* @private -*/ -GLGE.Text.prototype.GLGenerateShader=function(gl){ - if(this.GLShaderProgram) gl.deleteProgram(this.GLShaderProgram); - - //Vertex Shader - var vertexStr=""; - vertexStr+="attribute vec3 position;\n"; - vertexStr+="attribute vec2 uvcoord;\n"; - vertexStr+="varying vec2 texcoord;\n"; - vertexStr+="uniform mat4 Matrix;\n"; - vertexStr+="uniform mat4 PMatrix;\n"; - vertexStr+="varying vec4 pos;\n"; - - vertexStr+="void main(void){\n"; - vertexStr+="texcoord=uvcoord;\n"; - vertexStr+="pos = Matrix * vec4(position,1.0);\n"; - vertexStr+="gl_Position = PMatrix * pos;\n"; - vertexStr+="}\n"; - - //Fragment Shader - var fragStr="#ifdef GL_ES\nprecision highp float;\n#endif\n"; - fragStr=fragStr+"uniform sampler2D TEXTURE;\n"; - fragStr=fragStr+"varying vec2 texcoord;\n"; - fragStr=fragStr+"varying vec4 pos;\n"; - fragStr=fragStr+"uniform float far;\n"; - fragStr=fragStr+"uniform int picktype;\n"; - fragStr=fragStr+"uniform vec3 pickcolor;\n"; - fragStr=fragStr+"uniform vec3 color;\n"; - fragStr=fragStr+"void main(void){\n"; - fragStr=fragStr+"float alpha=texture2D(TEXTURE,texcoord).a;\n"; - fragStr=fragStr+"if(picktype=="+GLGE.TEXT_BOXPICK+"){gl_FragColor = vec4(pickcolor,1.0);}" - fragStr=fragStr+"else if(picktype=="+GLGE.TEXT_TEXTPICK+"){gl_FragColor = vec4(pickcolor,alpha);}" - fragStr=fragStr+"else{gl_FragColor = vec4(color.rgb*alpha,alpha);};\n"; - fragStr=fragStr+"}\n"; - - this.GLFragmentShader=gl.createShader(gl.FRAGMENT_SHADER); - this.GLVertexShader=gl.createShader(gl.VERTEX_SHADER); - - - gl.shaderSource(this.GLFragmentShader, fragStr); - gl.compileShader(this.GLFragmentShader); - if (!gl.getShaderParameter(this.GLFragmentShader, gl.COMPILE_STATUS)) { - GLGE.error(gl.getShaderInfoLog(this.GLFragmentShader)); - return; - } - - //set and compile the vertex shader - //need to set str - gl.shaderSource(this.GLVertexShader, vertexStr); - gl.compileShader(this.GLVertexShader); - if (!gl.getShaderParameter(this.GLVertexShader, gl.COMPILE_STATUS)) { - GLGE.error(gl.getShaderInfoLog(this.GLVertexShader)); - return; - } - - this.GLShaderProgram = gl.createProgram(); - gl.attachShader(this.GLShaderProgram, this.GLVertexShader); - gl.attachShader(this.GLShaderProgram, this.GLFragmentShader); - gl.linkProgram(this.GLShaderProgram); -} -/** -* Initiallize all the GL stuff needed to render to screen -* @private -*/ -GLGE.Text.prototype.GLInit=function(gl){ - this.gl=gl; - this.createPlane(gl); - this.GLGenerateShader(gl); - - this.glTexture=gl.createTexture(); - this.updateCanvas(gl); -} -/** -* Updates the canvas texture -* @private -*/ -GLGE.Text.prototype.updateCanvas=function(gl){ - var canvas = this.canvas; - canvas.width=1; - canvas.height=this.size*1.2; - var ctx = canvas.getContext("2d"); - ctx.font = this.size+"px "+this.font; - canvas.width=ctx.measureText(this.text).width; - canvas.height=this.size*1.2; - ctx = canvas.getContext("2d"); - ctx.textBaseline="top"; - ctx.font = this.size+"px "+this.font; - this.aspect=canvas.width/canvas.height; - ctx.fillText(this.text, 0, 0); - - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - //TODO: fix this when minefield is upto spec - try{gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);} - catch(e){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas,null);} - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); - gl.generateMipmap(gl.TEXTURE_2D); - gl.bindTexture(gl.TEXTURE_2D, null); -} - -/** -* Renders the text to the render buffer -* @private -*/ -GLGE.Text.prototype.GLRender=function(gl,renderType,pickindex){ - if(!this.gl){ - this.GLInit(gl); - } - if(renderType==GLGE.RENDER_DEFAULT || renderType==GLGE.RENDER_PICK){ - //if look at is set then look - if(this.lookAt) this.Lookat(this.lookAt); - - gl.useProgram(this.GLShaderProgram); - - var attribslot; - //disable all the attribute initially arrays - do I really need this? - for(var i=0; i<8; i++) gl.disableVertexAttribArray(i); - attribslot=GLGE.getAttribLocation(gl,this.GLShaderProgram, "position"); - - gl.bindBuffer(gl.ARRAY_BUFFER, this.posBuffer); - gl.enableVertexAttribArray(attribslot); - gl.vertexAttribPointer(attribslot, this.posBuffer.itemSize, gl.FLOAT, false, 0, 0); - - attribslot=GLGE.getAttribLocation(gl,this.GLShaderProgram, "uvcoord"); - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - gl.enableVertexAttribArray(attribslot); - gl.vertexAttribPointer(attribslot, this.uvBuffer.itemSize, gl.FLOAT, false, 0, 0); - - gl.activeTexture(gl["TEXTURE0"]); - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - gl.uniform1i(GLGE.getUniformLocation(gl,this.GLShaderProgram, "TEXTURE"), 0); - - if(!pickindex) pickindex=0; - var b = pickindex >> 16 & 0xFF; - var g = pickindex >> 8 & 0xFF; - var r = pickindex & 0xFF; - gl.uniform3f(GLGE.getUniformLocation(gl,this.GLShaderProgram, "pickcolor"), r/255,g/255,b/255); - - if(renderType==GLGE.RENDER_PICK){ - gl.uniform1i(GLGE.getUniformLocation(gl,this.GLShaderProgram, "picktype"), this.pickType); - }else{ - gl.uniform1i(GLGE.getUniformLocation(gl,this.GLShaderProgram, "picktype"), 0); - } - - if(!this.GLShaderProgram.glarrays) this.GLShaderProgram.glarrays={}; - - - //generate and set the modelView matrix - var scalefactor=this.size/100; - var mMatrix=GLGE.mulMat4(gl.scene.camera.getViewMatrix(),GLGE.mulMat4(this.getModelMatrix(),GLGE.scaleMatrix(this.aspect*scalefactor,scalefactor,scalefactor))); - var mUniform = GLGE.getUniformLocation(gl,this.GLShaderProgram, "Matrix"); - if(!this.GLShaderProgram.glarrays.mMatrix) this.GLShaderProgram.glarrays.mMatrix=new Float32Array(mMatrix); - else GLGE.mat4gl(mMatrix,this.GLShaderProgram.glarrays.mMatrix); - gl.uniformMatrix4fv(mUniform, true, this.GLShaderProgram.glarrays.mMatrix); - - var mUniform = GLGE.getUniformLocation(gl,this.GLShaderProgram, "PMatrix"); - - if(!this.GLShaderProgram.glarrays.pMatrix) this.GLShaderProgram.glarrays.pMatrix=new Float32Array(gl.scene.camera.getProjectionMatrix()); - else GLGE.mat4gl(gl.scene.camera.getProjectionMatrix(),this.GLShaderProgram.glarrays.pMatrix); - gl.uniformMatrix4fv(mUniform, true, this.GLShaderProgram.glarrays.pMatrix); - - - var farUniform = GLGE.getUniformLocation(gl,this.GLShaderProgram, "far"); - gl.uniform1f(farUniform, gl.scene.camera.getFar()); - //set the color - gl.uniform3f(GLGE.getUniformLocation(gl,this.GLShaderProgram, "color"), this.color.r,this.color.g,this.color.b); - - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.GLfaces); - gl.drawElements(gl.TRIANGLES, this.GLfaces.numItems, gl.UNSIGNED_SHORT, 0); - } -} -/** -* creates the plane mesh to draw -* @private -*/ -GLGE.Text.prototype.createPlane=function(gl){ - //create the vertex positions - if(!this.posBuffer) this.posBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, this.posBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1,1,0,-1,1,0,-1,-1,0,1,-1,0]), gl.STATIC_DRAW); - this.posBuffer.itemSize = 3; - this.posBuffer.numItems = 4; - //create the vertex uv coords - if(!this.uvBuffer) this.uvBuffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, this.uvBuffer); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([0,0,1,0,1,1,0,1]), gl.STATIC_DRAW); - this.uvBuffer.itemSize = 2; - this.uvBuffer.numItems = 4; - //create the faces - if(!this.GLfaces) this.GLfaces = gl.createBuffer(); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.GLfaces); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array([0,1,2,2,3,0]), gl.STATIC_DRAW); - this.GLfaces.itemSize = 1; - this.GLfaces.numItems = 6; -} - - - -/** -* @class Creates a new load for a multimaterial -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.ObjectLod=function(uid){ - GLGE.Assets.registerAsset(this,uid); -} -GLGE.augment(GLGE.QuickNotation,GLGE.ObjectLod); -GLGE.augment(GLGE.JSONLoader,GLGE.ObjectLod); -GLGE.ObjectLod.prototype.mesh=null; -GLGE.ObjectLod.prototype.className="ObjectLod"; -GLGE.ObjectLod.prototype.material=null; -GLGE.ObjectLod.prototype.program=null; -GLGE.ObjectLod.prototype.GLShaderProgramPick=null; -GLGE.ObjectLod.prototype.GLShaderProgramShadow=null; -GLGE.ObjectLod.prototype.GLShaderProgram=null; -GLGE.ObjectLod.prototype.pixelSize=0; - -/** -* sets the mesh -* @param {GLGE.Mesh} mesh -*/ -GLGE.ObjectLod.prototype.setMesh=function(mesh){ - if(typeof mesh=="string") mesh=GLGE.Assets.get(mesh); - - //remove event listener from current material - if(this.mesh){ - this.mesh.removeEventListener("shaderupdate",this.meshupdated); - } - var multiMaterial=this; - this.meshupdated=function(event){ - multiMaterial.GLShaderProgram=null; - }; - //set event listener for new material - mesh.addEventListener("shaderupdate",this.meshupdated); - - this.GLShaderProgram=null; - this.mesh=mesh; - return this; -} -/** -* gets the mesh -* @returns {GLGE.Mesh} -*/ -GLGE.ObjectLod.prototype.getMesh=function(){ - return this.mesh; -} -/** -* sets the material -* @param {GLGE.Material} material -*/ -GLGE.ObjectLod.prototype.setMaterial=function(material){ - if(typeof material=="string") material=GLGE.Assets.get(material); - - //remove event listener from current material - if(this.material){ - this.material.removeEventListener("shaderupdate",this.materialupdated); - } - var ObjectLOD=this; - this.materialupdated=function(event){ - ObjectLOD.GLShaderProgram=null; - }; - //set event listener for new material - material.addEventListener("shaderupdate",this.materialupdated); - - this.GLShaderProgram=null; - this.material=material; - return this; -} -/** -* gets the material -* @returns {GLGE.Material} -*/ -GLGE.ObjectLod.prototype.getMaterial=function(){ - return this.material; -} - -/** -* gets the pixelsize limit for this lod -* @returns {number} -*/ -GLGE.ObjectLod.prototype.getPixelSize=function(){ - return this.pixelSize; -} -/** -* sets the pixelsize limit for this lod -* @returns {number} -*/ -GLGE.ObjectLod.prototype.setPixelSize=function(value){ - this.pixelSize=value; -} - - -/** -* @class Creates a new mesh/material to add to an object -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.MultiMaterial=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.lods=[new GLGE.ObjectLod] -} -GLGE.augment(GLGE.QuickNotation,GLGE.MultiMaterial); -GLGE.augment(GLGE.JSONLoader,GLGE.MultiMaterial); -GLGE.MultiMaterial.prototype.className="MultiMaterial"; -/** -* sets the mesh -* @param {GLGE.Mesh} mesh -*/ -GLGE.MultiMaterial.prototype.setMesh=function(mesh){ - this.lods[0].setMesh(mesh); - return this; -} -/** -* gets the mesh -* @returns {GLGE.Mesh} -*/ -GLGE.MultiMaterial.prototype.getMesh=function(){ - return this.lods[0].getMesh(); -} -/** -* sets the material -* @param {GLGE.Material} material -*/ -GLGE.MultiMaterial.prototype.setMaterial=function(material){ - this.lods[0].setMaterial(material); - return this; -} -/** -* gets the material -* @returns {GLGE.Material} -*/ -GLGE.MultiMaterial.prototype.getMaterial=function(){ - return this.lods[0].getMaterial(); -} - -/** -* returns the load for a given pixel size -* @param {number} pixelsize the current pixel size of the object -* @returns {GLGE.ObjectLod} -*/ -GLGE.MultiMaterial.prototype.getLOD=function(pixelsize){ - var currentSize=0; - var currentLOD=this.lods[0]; - if(this.lods.length>1){ - for(var i=0; i<this.lods.length;i++){ - var size=this.lods[i].pixelSize - if(size>currentSize && size<pixelsize){ - currentSize=size; - currentLOD=this.lods[i]; - } - } - } - return currentLOD; -} - -/** -* adds a lod to this multimaterial -* @param {GLGE.ObjectLod} lod the lod to add -*/ -GLGE.MultiMaterial.prototype.addObjectLod=function(lod){ - this.lods.push(lod); - return this; -} - -/** -* removes a lod to this multimaterial -* @param {GLGE.ObjectLod} lod the lod to remove -*/ -GLGE.MultiMaterial.prototype.removeObjectLod=function(lod){ - var idx=this.lods.indexOf(lod); - if(idx) this.lods.splice(idx,1); - return this; -} - - - -/** -* @class An additional instance of an object that can be rendered in a scene -* @augments GLGE.Animatable -* @augments GLGE.Placeable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.ObjectInstance=function(uid){ - GLGE.Assets.registerAsset(this,uid); -} -GLGE.augment(GLGE.Placeable,GLGE.ObjectInstance); -GLGE.augment(GLGE.Animatable,GLGE.ObjectInstance); -GLGE.augment(GLGE.QuickNotation,GLGE.ObjectInstance); -GLGE.augment(GLGE.JSONLoader,GLGE.ObjectInstance); -GLGE.ObjectInstance.prototype.parentObject=null; -GLGE.ObjectInstance.prototype.className="ObjectInstance"; -/** -* Sets the parent object to instance -* @param {GLGE.Object} value the object to instance -*/ -GLGE.ObjectInstance.prototype.setObject=function(value){ - if(this.parentObject) this.parentObject.removeInstance(this); - this.parentObject=value; - value.addInstance(this); - return this; -} -/** -* Gets the Object being instanced -* @returns boolean -*/ -GLGE.ObjectInstance.prototype.getObject=function(){ - return this.parentObject; -} - - - - -/** -* @class An object that can be rendered in a scene -* @augments GLGE.Animatable -* @augments GLGE.Placeable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Object=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.multimaterials=[]; - this.instances=[]; -} -GLGE.augment(GLGE.Placeable,GLGE.Object); -GLGE.augment(GLGE.Animatable,GLGE.Object); -GLGE.augment(GLGE.QuickNotation,GLGE.Object); -GLGE.augment(GLGE.JSONLoader,GLGE.Object); -GLGE.Object.prototype.className="Object"; -GLGE.Object.prototype.mesh=null; -GLGE.Object.prototype.skeleton=null; -GLGE.Object.prototype.scene=null; -GLGE.Object.prototype.transformMatrix=GLGE.identMatrix(); -GLGE.Object.prototype.material=null; -GLGE.Object.prototype.gl=null; -GLGE.Object.prototype.multimaterials=null; -GLGE.Object.prototype.instances=null; -GLGE.Object.prototype.zTrans=false; -GLGE.Object.prototype.id=""; -GLGE.Object.prototype.pickable=true; -GLGE.Object.prototype.drawType=GLGE.DRAW_TRIS; -GLGE.Object.prototype.pointSize=1; - -//shadow fragment -var shfragStr=[]; -shfragStr.push("#ifdef GL_ES\nprecision highp float;\n#endif\n"); -shfragStr.push("void main(void)\n"); -shfragStr.push("{\n"); -shfragStr.push("vec4 rgba=fract((gl_FragCoord.z/gl_FragCoord.w)/10000.0 * vec4(16777216.0, 65536.0, 256.0, 1.0));\n"); -shfragStr.push("gl_FragColor=rgba-rgba.rrgb*vec4(0.0,0.00390625,0.00390625,0.00390625);\n"); -shfragStr.push("}\n"); -GLGE.Object.prototype.shfragStr=shfragStr.join(""); - -//normal fragment -var nfragStr=[]; -nfragStr.push("#ifdef GL_ES\nprecision highp float;\n#endif\n"); -nfragStr.push("varying vec3 n;\n"); -nfragStr.push("void main(void)\n"); -nfragStr.push("{\n"); -nfragStr.push("gl_FragColor=vec4(n,1.0);\n"); -nfragStr.push("}\n"); -GLGE.Object.prototype.nfragStr=nfragStr.join(""); - -//picking fragment -var pkfragStr=[]; -pkfragStr.push("#ifdef GL_ES\nprecision highp float;\n#endif\n"); -pkfragStr.push("uniform float far;\n"); -pkfragStr.push("uniform vec3 pickcolor;\n"); -pkfragStr.push("varying vec3 n;\n"); -pkfragStr.push("varying vec4 UVCoord;\n"); -pkfragStr.push("void main(void)\n"); -pkfragStr.push("{\n"); -pkfragStr.push("float Xcoord = gl_FragCoord.x+0.5;\n"); -pkfragStr.push("if(Xcoord>0.0) gl_FragColor = vec4(pickcolor,1.0);\n"); -pkfragStr.push("if(Xcoord>1.0) gl_FragColor = vec4(n,1.0);\n"); -pkfragStr.push("if(Xcoord>2.0){"); -pkfragStr.push("vec3 rgb=fract((gl_FragCoord.z/gl_FragCoord.w) * vec3(65536.0, 256.0, 1.0));\n"); -pkfragStr.push("gl_FragColor=vec4(rgb-rgb.rrg*vec3(0.0,0.00390625,0.00390625),1.0);\n"); -pkfragStr.push("}"); -//x tex coord -pkfragStr.push("if(Xcoord>3.0){"); -pkfragStr.push("vec3 rgb=fract(UVCoord.x * vec3(65536.0, 256.0, 1.0));\n"); -pkfragStr.push("gl_FragColor=vec4(rgb-rgb.rrg*vec3(0.0,0.00390625,0.00390625),1.0);\n"); -pkfragStr.push("}"); -//y tex coord -pkfragStr.push("if(Xcoord>4.0){"); -pkfragStr.push("vec3 rgb=fract(UVCoord.y * vec3(65536.0, 256.0, 1.0));\n"); -pkfragStr.push("gl_FragColor=vec4(rgb-rgb.rrg*vec3(0.0,0.00390625,0.00390625),1.0);\n"); -pkfragStr.push("}"); -pkfragStr.push("}\n"); -GLGE.Object.prototype.pkfragStr=pkfragStr.join(""); - - -/** -* Gets the objects draw type -*/ -GLGE.Object.prototype.getDrawType=function(){ - return this.drawType; -} -/** -* Sets the objects draw type -* @param {GLGE.number} value the draw type of this object -*/ -GLGE.Object.prototype.setDrawType=function(value){ - this.drawType=value; - return this; -} - -/** -* Gets the objects draw point size -*/ -GLGE.Object.prototype.getPointSize=function(){ - return this.pointSize; -} -/** -* Sets the objects draw points size -* @param {GLGE.number} value the point size to render -*/ -GLGE.Object.prototype.setPointSize=function(value){ - this.pointSize=parseFloat(value); - return this; -} - - -/** -* Gets the objects skeleton -* @returns GLGE.Group -*/ -GLGE.Object.prototype.getSkeleton=function(){ - return this.skeleton; -} -/** -* Sets the objects skeleton -* @param {GLGE.Group} value the skeleton group to set -*/ -GLGE.Object.prototype.setSkeleton=function(value){ - this.skeleton=value; - this.bones=value.getNames(); - return this; -} - -GLGE.Object.prototype.getBoundingVolume=function(){ - var multimaterials=this.multimaterials; - this.boundingVolume=new GLGE.BoundingVolume(0,0,0,0,0,0); - for(var i=0;i<multimaterials.length;i++){ - this.boundingVolume.addBoundingVolume(multimaterials[i].lods[0].mesh.getBoundingVolume()); - } - this.boundingVolume.applyMatrixScale(this.getModelMatrix()); - - return this.boundingVolume; -} - -/** -* Sets the Z Transparency of this object -* @param {boolean} value Does this object need blending? -*/ -GLGE.Object.prototype.setZtransparent=function(value){ - this.zTrans=value; - return this; -} -/** -* Gets the z transparency -* @returns boolean -*/ -GLGE.Object.prototype.isZtransparent=function(){ - return this.zTrans; -} - -/** -* Adds a new instance of this object -* @param {GLGE.ObjectInstance} value the instance to add -*/ -GLGE.Object.prototype.addInstance=function(value){ - this.instances.push(value); - return this; -} - -/** -* Removes an instance of this object -* @param {GLGE.ObjectInstance} value the instance to remove -*/ -GLGE.Object.prototype.removeInstance=function(value){ - for(var i=0; i<this.instances;i++){ - if(this.instance==value) this.instances.splice(i); - } -} - -/** -* Sets the material associated with the object -* @param GLGE.Material -*/ -GLGE.Object.prototype.setMaterial=function(material,idx){ - if(typeof material=="string") material=GLGE.Assets.get(material); - if(!idx) idx=0; - if(!this.multimaterials[idx]) this.multimaterials[idx]=new GLGE.MultiMaterial(); - if(this.multimaterials[idx].getMaterial()!=material){ - this.multimaterials[idx].setMaterial(material); - this.updateProgram(); - } - return this; -} -/** -* Gets the material associated with the object -* @returns GLGE.Material -*/ -GLGE.Object.prototype.getMaterial=function(idx){ - if(!idx) idx=0; - if(this.multimaterials[idx]) { - return this.multimaterials[idx].getMaterial(); - }else{ - return false; - } -} -/** -* Sets the mesh associated with the object -* @param GLGE.Mesh -*/ -GLGE.Object.prototype.setMesh=function(mesh,idx){ - if(typeof mesh=="string") mesh=GLGE.Assets.get(mesh); - if(!idx) idx=0; - if(!this.multimaterials[idx]) this.multimaterials.push(new GLGE.MultiMaterial()); - this.multimaterials[idx].setMesh(mesh); - return this; -} -/** -* Gets the mesh associated with the object -* @returns GLGE.Mesh -*/ -GLGE.Object.prototype.getMesh=function(idx){ - if(!idx) idx=0; - if(this.multimaterials[idx]) { - this.multimaterials[idx].getMesh(); - }else{ - return false; - } -} -/** -* Initiallize all the GL stuff needed to render to screen -* @private -*/ -GLGE.Object.prototype.GLInit=function(gl){ - this.gl=gl; -} -/** -* Cleans up all the GL stuff we sets -* @private -*/ -GLGE.Object.prototype.GLDestory=function(gl){ -} -/** -* Updates the GL shader program for the object -* @private -*/ -GLGE.Object.prototype.updateProgram=function(){ - for(var i=0; i<this.multimaterials.length;i++){ - this.multimaterials[i].GLShaderProgram=null; - } -} -/** -* Adds another material to this object -* @returns GLGE.Material -*/ -GLGE.Object.prototype.addMultiMaterial=function(multimaterial){ - if(typeof multimaterial=="string") multimaterial=GLGE.Assets.get(multimaterial); - this.multimaterials.push(multimaterial); -} -/** -* gets all of the objects materials and meshes -* @returns array of GLGE.MultiMaterial objects -*/ -GLGE.Object.prototype.getMultiMaterials=function(){ - return this.multimaterials; -} -/** -* Creates the shader program for the object -* @private -*/ -GLGE.Object.prototype.GLGenerateShader=function(gl){ - //create the programs strings - //Vertex Shader - var UV=joints1=joints2=false; - var lights=gl.lights; - var vertexStr=[]; - var tangent=false; - if(!this.mesh.normals) this.mesh.calcNormals(); - for(var i=0;i<this.mesh.buffers.length;i++){ - if(this.mesh.buffers[i].name=="tangent") tangent=true; - if(this.mesh.buffers[i].size>1){ - vertexStr.push("attribute vec"+this.mesh.buffers[i].size+" "+this.mesh.buffers[i].name+";\n"); - }else{ - vertexStr.push("attribute float "+this.mesh.buffers[i].name+";\n"); - } - if(this.mesh.buffers[i].name=="UV") UV=true; - if(this.mesh.buffers[i].name=="joints1") joints1=this.mesh.buffers[i]; - if(this.mesh.buffers[i].name=="joints2") joints2=this.mesh.buffers[i]; - } - vertexStr.push("uniform mat4 worldView;\n"); - vertexStr.push("uniform mat4 projection;\n"); - vertexStr.push("uniform mat4 view;\n"); - vertexStr.push("uniform mat4 worldInverseTranspose;\n"); - vertexStr.push("uniform mat4 envMat;\n"); - - for(var i=0; i<lights.length;i++){ - vertexStr.push("uniform vec3 lightpos"+i+";\n"); - vertexStr.push("uniform vec3 lightdir"+i+";\n"); - vertexStr.push("uniform mat4 lightmat"+i+";\n"); - vertexStr.push("varying vec4 spotcoord"+i+";\n"); - } - - vertexStr.push("varying vec3 eyevec;\n"); - for(var i=0; i<lights.length;i++){ - vertexStr.push("varying vec3 lightvec"+i+";\n"); - vertexStr.push("varying vec3 tlightvec"+i+";\n"); - vertexStr.push("varying float lightdist"+i+";\n"); - } - - if(this.mesh.joints && this.mesh.joints.length>0){ - vertexStr.push("uniform mat4 jointMat["+(this.mesh.joints.length)+"];\n"); - vertexStr.push("uniform mat4 jointNMat["+(this.mesh.joints.length)+"];\n"); - } - - if(this.material) vertexStr.push(this.material.getVertexVarying(vertexStr)); - - vertexStr.push("varying vec3 n;\n"); - vertexStr.push("varying vec3 b;\n"); - vertexStr.push("varying vec3 t;\n"); - - vertexStr.push("varying vec4 UVCoord;\n"); - vertexStr.push("varying vec3 OBJCoord;\n"); - vertexStr.push("varying vec3 tang;\n"); - vertexStr.push("varying vec3 teyevec;\n"); - - vertexStr.push("void main(void)\n"); - vertexStr.push("{\n"); - if(UV) vertexStr.push("UVCoord=UV;\n"); - vertexStr.push("OBJCoord = position;\n"); - vertexStr.push("vec4 pos = vec4(0.0, 0.0, 0.0, 1.0);\n"); - vertexStr.push("vec4 norm = vec4(0.0, 0.0, 0.0, 1.0);\n"); - vertexStr.push("vec4 tang4 = vec4(0.0, 0.0, 0.0, 1.0);\n"); - - if(joints1){ - if(joints1.size==1){ - vertexStr.push("pos += jointMat[int(joints1)]*vec4(position,1.0)*weights1;\n"); - vertexStr.push("norm += jointNMat[int(joints1)]*vec4(normal,1.0)*weights1;\n"); - if(tangent) vertexStr.push("tang4 += jointNMat[int(joints1)]*vec4(tangent,1.0)*weights1;\n"); - }else{ - for(var i=0;i<joints1.size;i++){ - vertexStr.push("pos += jointMat[int(joints1["+i+"])]*vec4(position,1.0)*weights1["+i+"];\n"); - vertexStr.push("norm += jointNMat[int(joints1["+i+"])]*vec4(normal,1.0)*weights1["+i+"];\n"); - if(tangent) vertexStr.push("tang4 += jointNMat[int(joints1["+i+"])]*vec4(tangent,1.0)*weights1["+i+"];\n"); - } - } - if(joints2){ - if(joints2.size==1){ - vertexStr.push("pos += jointMat[int(joints2)]*vec4(position,1.0)*weights2;\n"); - vertexStr.push("norm += jointNMat[int(joints2)]*vec4(normal,1.0)*weights2;\n"); - if(tangent) vertexStr.push("tang4 += jointNMat[int(joints2)]*vec4(tangent,1.0)*weights2;\n"); - }else{ - for(var i=0;i<joints2.size;i++){ - vertexStr.push("pos += jointMat[int(joints2["+i+"])]*vec4(position,1.0)*weights2["+i+"];\n"); - vertexStr.push("norm += jointNMat[int(joints2["+i+"])]*vec4(normal,1.0)*weights2["+i+"];\n"); - if(tangent) vertexStr.push("tang4 += jointNMat[int(joints2["+i+"])]*vec4(tangent,1.0)*weights2["+i+"];\n"); - } - } - } - - for(var i=0; i<lights.length;i++){ - vertexStr.push("spotcoord"+i+"=lightmat"+i+"*vec4(pos.xyz,1.0);\n"); - } - vertexStr.push("pos = worldView * vec4(pos.xyz, 1.0);\n"); - vertexStr.push("norm = worldInverseTranspose * vec4(norm.xyz, 1.0);\n"); - if(tangent) vertexStr.push("tang = (worldInverseTranspose*vec4(tang4.xyz,1.0)).xyz;\n"); - }else{ - for(var i=0; i<lights.length;i++){ - vertexStr.push("spotcoord"+i+"=lightmat"+i+"*vec4(position,1.0);\n"); - } - vertexStr.push("pos = worldView * vec4(position, 1.0);\n"); - vertexStr.push("norm = worldInverseTranspose * vec4(normal, 1.0);\n"); - if(tangent) vertexStr.push("tang = (worldInverseTranspose*vec4(tangent,1.0)).xyz;\n"); - } - - vertexStr.push("gl_Position = projection * pos;\n"); - vertexStr.push("gl_PointSize="+(this.pointSize.toFixed(5))+";\n"); - - vertexStr.push("eyevec = -pos.xyz;\n"); - - vertexStr.push("t = normalize(tang);"); - vertexStr.push("n = normalize(norm.rgb);"); - vertexStr.push("b = normalize(cross(n,t));"); - if(tangent){ - vertexStr.push("teyevec.x = dot(eyevec, t);"); - vertexStr.push("teyevec.y = dot(eyevec, b);"); - vertexStr.push("teyevec.z = dot(eyevec, n);"); - }else{ - vertexStr.push("teyevec = eyevec;"); - } - - for(var i=0; i<lights.length;i++){ - if(lights[i].getType()==GLGE.L_DIR){ - vertexStr.push("vec3 tmplightvec"+i+" = -lightdir"+i+";\n"); - }else{ - vertexStr.push("vec3 tmplightvec"+i+" = -(lightpos"+i+"-pos.xyz);\n"); - } - //tan space stuff - if(tangent){ - vertexStr.push("tlightvec"+i+".x = dot(tmplightvec"+i+", t);"); - vertexStr.push("tlightvec"+i+".y = dot(tmplightvec"+i+", b);"); - vertexStr.push("tlightvec"+i+".z = dot(tmplightvec"+i+", n);"); - - }else{ - vertexStr.push("tlightvec"+i+" = tmplightvec"+i+";"); - } - vertexStr.push("lightvec"+i+" = tmplightvec"+i+";"); - - - vertexStr.push("lightdist"+i+" = length(lightpos"+i+".xyz-pos.xyz);\n"); - } - if(this.material) vertexStr.push(this.material.getLayerCoords(vertexStr)); - vertexStr.push("}\n"); - - vertexStr=vertexStr.join(""); - - //Fragment Shader - if(!this.material){ - var fragStr=[]; - fragStr.push("void main(void)\n"); - fragStr.push("{\n"); - fragStr.push("gl_FragColor = vec4(1.0,1.0,1.0,1.0);\n"); - fragStr.push("}\n"); - fragStr=fragStr.join(""); - } - else - { - fragStr=this.material.getFragmentShader(lights); - } - - this.GLFragmentShaderNormal=GLGE.getGLShader(gl,gl.FRAGMENT_SHADER,this.nfragStr); - this.GLFragmentShaderShadow=GLGE.getGLShader(gl,gl.FRAGMENT_SHADER,this.shfragStr); - this.GLFragmentShaderPick=GLGE.getGLShader(gl,gl.FRAGMENT_SHADER,this.pkfragStr); - this.GLFragmentShader=GLGE.getGLShader(gl,gl.FRAGMENT_SHADER,fragStr); - this.GLVertexShader=GLGE.getGLShader(gl,gl.VERTEX_SHADER,vertexStr); - - this.GLShaderProgramPick=GLGE.getGLProgram(gl,this.GLVertexShader,this.GLFragmentShaderPick); - this.GLShaderProgramShadow=GLGE.getGLProgram(gl,this.GLVertexShader,this.GLFragmentShaderShadow); - this.GLShaderProgramNormal=GLGE.getGLProgram(gl,this.GLVertexShader,this.GLFragmentShaderNormal); - this.GLShaderProgram=GLGE.getGLProgram(gl,this.GLVertexShader,this.GLFragmentShader); -} -/** -* creates shader programs; -* @param multimaterial the multimaterial object to create the shader programs for -* @private -*/ -GLGE.Object.prototype.createShaders=function(multimaterial){ - if(this.gl){ - this.mesh=multimaterial.mesh; - this.material=multimaterial.material; - this.GLGenerateShader(this.gl); - multimaterial.GLShaderProgramPick=this.GLShaderProgramPick; - multimaterial.GLShaderProgramShadow=this.GLShaderProgramShadow; - multimaterial.GLShaderProgram=this.GLShaderProgram; - } -} -/** -* Sets the shader program uniforms ready for rendering -* @private -*/ -GLGE.Object.prototype.GLUniforms=function(gl,renderType,pickindex){ - var program; - switch(renderType){ - case GLGE.RENDER_DEFAULT: - program=this.GLShaderProgram; - break; - case GLGE.RENDER_SHADOW: - program=this.GLShaderProgramShadow; - break; - case GLGE.RENDER_NORMAL: - program=this.GLShaderProgramNormal; - break; - case GLGE.RENDER_PICK: - program=this.GLShaderProgramPick; - var b = pickindex >> 16 & 0xFF; - var g = pickindex >> 8 & 0xFF; - var r = pickindex & 0xFF; - gl.uniform3f(GLGE.getUniformLocation(gl,program, "pickcolor"), r/255,g/255,b/255); - break; - } - - - if(!program.caches) program.caches={}; - if(!program.glarrays) program.glarrays={}; - - if(program.caches.far!=gl.scene.camera.far){ - gl.uniform1f(GLGE.getUniformLocation(gl,program, "far"), gl.scene.camera.far); - program.caches.far=gl.scene.camera.far; - } - if(renderType==GLGE.RENDER_DEFAULT){ - if(program.caches.ambientColor!=gl.scene.ambientColor){ - gl.uniform3f(GLGE.getUniformLocation(gl,program, "amb"), gl.scene.ambientColor.r,gl.scene.ambientColor.g,gl.scene.ambientColor.b); - program.caches.ambientColor=gl.scene.ambientColor; - } - if(program.caches.fogFar!=gl.scene.fogFar){ - gl.uniform1f(GLGE.getUniformLocation(gl,program, "fogfar"), gl.scene.fogFar); - program.caches.fogFar=gl.scene.fogFar; - } - if(program.caches.fogNear!=gl.scene.fogNear){ - gl.uniform1f(GLGE.getUniformLocation(gl,program, "fognear"), gl.scene.fogNear); - program.caches.fogNear=gl.scene.fogNear; - } - if(program.caches.fogType!=gl.scene.fogType){ - gl.uniform1i(GLGE.getUniformLocation(gl,program, "fogtype"), gl.scene.fogType); - program.caches.fogType=gl.scene.fogType; - } - if(program.caches.fogType!=gl.scene.fogcolor){ - gl.uniform3f(GLGE.getUniformLocation(gl,program, "fogcolor"), gl.scene.fogColor.r,gl.scene.fogColor.g,gl.scene.fogColor.b); - program.caches.fogcolor=gl.scene.fogcolor; - } - } - - - - var cameraMatrix=gl.scene.camera.getViewMatrix(); - var modelMatrix=this.getModelMatrix(); - if(!program.caches.mvMatrix) program.caches.mvMatrix={cameraMatrix:null,modelMatrix:null}; - var mvCache=program.caches.mvMatrix; - - if(mvCache.camerMatrix!=cameraMatrix || mvCache.modelMatrix!=modelMatrix){ - try{ - //generate and set the modelView matrix - if(!this.caches.mvMatrix) this.caches.mvMatrix=GLGE.mulMat4(cameraMatrix,modelMatrix); - mvMatrix=this.caches.mvMatrix; - - var mvUniform = GLGE.getUniformLocation(gl,program, "worldView"); - if(!program.glarrays.mvMatrix) program.glarrays.mvMatrix=new Float32Array(mvMatrix); - else GLGE.mat4gl(mvMatrix,program.glarrays.mvMatrix); - gl.uniformMatrix4fv(mvUniform, true, program.glarrays.mvMatrix); - - - //invCamera matrix - if(!this.caches.envMat){ - var envMat = GLGE.inverseMat4(mvMatrix); - envMat[3]=0; - envMat[7]=0; - envMat[11]=0; - this.caches.envMat = envMat; - } - envMat=this.caches.envMat; - var icUniform = GLGE.getUniformLocation(gl,program, "envMat"); - - if(!program.glarrays.envMat) program.glarrays.envMat=new Float32Array(envMat); - else GLGE.mat4gl(envMat,program.glarrays.envMat); - gl.uniformMatrix4fv(icUniform, true, program.glarrays.envMat); - - //normalising matrix - if(!this.caches.normalMatrix){ - var normalMatrix = GLGE.inverseMat4(mvMatrix); - this.caches.normalMatrix = normalMatrix; - } - normalMatrix=this.caches.normalMatrix; - var nUniform = GLGE.getUniformLocation(gl,program, "worldInverseTranspose"); - - if(!program.glarrays.normalMatrix) program.glarrays.normalMatrix=new Float32Array(normalMatrix); - else GLGE.mat4gl(normalMatrix,program.glarrays.normalMatrix); - gl.uniformMatrix4fv(nUniform, false, program.glarrays.normalMatrix); - - var cUniform = GLGE.getUniformLocation(gl,program, "view"); - if(!program.glarrays.cameraMatrix) program.glarrays.cameraMatrix=new Float32Array(cameraMatrix); - else GLGE.mat4gl(cameraMatrix,program.glarrays.cameraMatrix); - gl.uniformMatrix4fv(cUniform, true, program.glarrays.cameraMatrix); - - mvCache.camerMatrix=cameraMatrix; - mvCache.modelMatrix!=modelMatrix; - }catch(e){} - } - - try{ - var pUniform = GLGE.getUniformLocation(gl,program, "projection"); - if(!program.glarrays.pMatrix) program.glarrays.pMatrix=new Float32Array(gl.scene.camera.getProjectionMatrix()); - else GLGE.mat4gl(gl.scene.camera.getProjectionMatrix(),program.glarrays.pMatrix); - gl.uniformMatrix4fv(pUniform, true, program.glarrays.pMatrix); - }catch(e){} - - //light - //dont' need lighting for picking - if(renderType==GLGE.RENDER_DEFAULT){ - var pos,lpos; - var lights=gl.lights - if(!program.caches.lights) program.caches.lights=[]; - if(!program.glarrays.lights) program.glarrays.lights=[]; - if(!this.caches.lights) this.caches.lights=[]; - var lightCache=program.caches.lights; - for(var i=0; i<lights.length;i++){ - if(!lightCache[i]) lightCache[i]={modelMatrix:null,cameraMatrix:null}; - if(lightCache[i].modelMatrix!=modelMatrix || lightCache[i].cameraMatrix!=cameraMatrix){ - if(!this.caches.lights[i])this.caches.lights[i]={}; - - if(!this.caches.lights[i].pos) this.caches.lights[i].pos=GLGE.mulMat4Vec4(GLGE.mulMat4(cameraMatrix,lights[i].getModelMatrix()),[0,0,0,1]); - pos=this.caches.lights[i].pos; - gl.uniform3f(GLGE.getUniformLocation(gl,program, "lightpos"+i), pos[0],pos[1],pos[2]); - - - if(!this.caches.lights[i].lpos) this.caches.lights[i].lpos=GLGE.mulMat4Vec4(GLGE.mulMat4(cameraMatrix,lights[i].getModelMatrix()),[0,0,1,1]); - lpos=this.caches.lights[i].lpos; - gl.uniform3f(GLGE.getUniformLocation(gl,program, "lightdir"+i),lpos[0]-pos[0],lpos[1]-pos[1],lpos[2]-pos[2]); - - if(lights[i].s_cache){ - try{ - var lightmat=GLGE.mulMat4(lights[i].s_cache.smatrix,modelMatrix); - if(!program.glarrays.lights[i]) program.glarrays.lights[i]=new Float32Array(lightmat); - else GLGE.mat4gl(lightmat,program.glarrays.lights[i]); - gl.uniformMatrix4fv(GLGE.getUniformLocation(gl,program, "lightmat"+i), true,program.glarrays.lights[i]); - lightCache[i].modelMatrix=modelMatrix; - lightCache[i].cameraMatrix=cameraMatrix; - }catch(e){} - }else{ - lightCache[i].modelMatrix=modelMatrix; - lightCache[i].cameraMatrix=cameraMatrix; - } - } - } - } - - if(this.mesh.joints){ - if(!program.caches.joints) program.caches.joints=[]; - if(!program.glarrays.joints) program.glarrays.joints=[]; - if(!program.glarrays.jointsinv) program.glarrays.jointsinv=[]; - var jointCache=program.caches.joints; - var ident=GLGE.identMatrix(); - for(i=0;i<this.mesh.joints.length;i++){ - if(!jointCache[i]) jointCache[i]={modelMatrix:null,invBind:null}; - if(typeof this.mesh.joints[i]=="string"){ - if(this.bones){ - var modelMatrix=this.bones[this.mesh.joints[i]].getModelMatrix(); - } - }else{ - var modelMatrix=this.mesh.joints[i].getModelMatrix(); - } - var invBind=this.mesh.invBind[i]; - if(jointCache[i].modelMatrix!=modelMatrix || jointCache[i].invBind!=invBind){ - try{ - var jointmat=GLGE.mulMat4(modelMatrix,invBind); - if(!program.glarrays.joints[i]) program.glarrays.joints[i]=new Float32Array(jointmat); - else GLGE.mat4gl(jointmat,program.glarrays.joints[i]); - if(!program.glarrays.jointsinv[i]) program.glarrays.jointsinv[i]=new Float32Array(GLGE.inverseMat4(jointmat)); - else GLGE.mat4gl(GLGE.inverseMat4(jointmat),program.glarrays.jointsinv[i]); - gl.uniformMatrix4fv(GLGE.getUniformLocation(gl,program, "jointMat["+i+"]"), true,program.glarrays.joints[i]); - gl.uniformMatrix4fv(GLGE.getUniformLocation(gl,program, "jointNMat["+i+"]"), false,program.glarrays.jointsinv[i]); - jointCache[i].modelMatrix=modelMatrix; - jointCache[i].invBind=invBind; - }catch(e){} - } - } - } - - - if(this.material && renderType==GLGE.RENDER_DEFAULT) this.material.textureUniforms(gl,program,lights,this); -} -/** -* Renders the object to the screen -* @private -*/ -GLGE.Object.prototype.GLRender=function(gl,renderType,pickindex){ - if(!this.gl) this.GLInit(gl); - - //if look at is set then look - if(this.lookAt) this.Lookat(this.lookAt); - - //animate this object - if(renderType==GLGE.RENDER_DEFAULT){ - if(this.animation) this.animate(); - } - this.caches={}; - for(var n=0;n<this.instances.length;n++){ - this.instances[n].caches={}; - } - - //get pixel size of object - //TODO: only do this when it's needed!!!! - var camerapos=gl.scene.camera.getPosition(); - var modelpos=this.getPosition(); - var dist=GLGE.lengthVec3([camerapos.x-modelpos.x,camerapos.y-modelpos.y,camerapos.z-modelpos.z]); - dist=GLGE.mulMat4Vec4(gl.scene.camera.getProjectionMatrix(),[this.getBoundingVolume().getSphereRadius(),0,-dist,1]); - var pixelsize=dist[0]/dist[3]*gl.scene.renderer.canvas.width; - - for(var i=0; i<this.multimaterials.length;i++){ - var lod=this.multimaterials[i].getLOD(pixelsize); - - if(lod.mesh && lod.mesh.loaded){ - if(renderType==GLGE.RENDER_NULL){ - if(lod.material) lod.material.registerPasses(gl,this); - break; - } - if(!this.multimaterials[i].GLShaderProgram){ - this.createShaders(lod); - }else{ - this.GLShaderProgramPick=lod.GLShaderProgramPick; - this.GLShaderProgramShadow=lod.GLShaderProgramShadow; - this.GLShaderProgram=lod.GLShaderProgram; - } - this.mesh=lod.mesh; - this.material=lod.material; - - var drawType; - switch(this.drawType){ - case GLGE.DRAW_LINES: - drawType=gl.LINES; - break; - case GLGE.DRAW_POINTS: - drawType=gl.POINTS; - break; - case GLGE.DRAW_LINELOOPS: - drawType=gl.LINE_LOOP; - break; - case GLGE.DRAW_LINESTRIPS: - drawType=gl.LINE_STRIP; - break; - default: - drawType=gl.TRIANGLES; - break; - } - - switch(renderType){ - case GLGE.RENDER_DEFAULT: - gl.useProgram(this.GLShaderProgram); - this.mesh.GLAttributes(gl,this.GLShaderProgram); - break; - case GLGE.RENDER_SHADOW: - gl.useProgram(this.GLShaderProgramShadow); - this.mesh.GLAttributes(gl,this.GLShaderProgramShadow); - break; - case GLGE.RENDER_NORMAL: - gl.useProgram(this.GLShaderProgramNormal); - this.mesh.GLAttributes(gl,this.GLShaderProgramNormal); - break; - case GLGE.RENDER_PICK: - gl.useProgram(this.GLShaderProgramPick); - this.mesh.GLAttributes(gl,this.GLShaderProgramPick); - drawType=gl.TRIANGLES; - break; - } - //render the object - this.GLUniforms(gl,renderType,pickindex); - if(this.mesh.GLfaces){ - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.mesh.GLfaces); - gl.drawElements(drawType, this.mesh.GLfaces.numItems, gl.UNSIGNED_SHORT, 0); - }else{ - gl.drawArrays(drawType, 0, this.mesh.positions.length/3); - } - - var matrix=this.matrix; - var caches=this.caches; - for(var n=0;n<this.instances.length;n++){ - this.matrix=this.instances[n].getModelMatrix(); - this.caches=this.instances[n].caches; - this.GLUniforms(gl,renderType,pickindex); - if(this.mesh.GLfaces){ - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.mesh.GLfaces); - gl.drawElements(drawType, this.mesh.GLfaces.numItems, gl.UNSIGNED_SHORT, 0); - }else{ - gl.drawArrays(drawType, 0, this.mesh.positions.length/3); - } - } - - this.matrix=matrix; - this.caches=caches; - } - } -} - - - -/** -* @class Creates a new mesh -* @see GLGE.Object -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -* @augments GLGE.Events -*/ -GLGE.Mesh=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.GLbuffers=[]; - this.buffers=[]; - this.UV=[]; - this.boneWeights=[]; - this.setBuffers=[]; - this.faces={}; -} -GLGE.augment(GLGE.QuickNotation,GLGE.Mesh); -GLGE.augment(GLGE.JSONLoader,GLGE.Mesh); -GLGE.augment(GLGE.Events,GLGE.Mesh); -GLGE.Mesh.prototype.gl=null; -GLGE.Mesh.prototype.className="Mesh"; -GLGE.Mesh.prototype.GLbuffers=null; -GLGE.Mesh.prototype.buffers=null; -GLGE.Mesh.prototype.setBuffers=null; -GLGE.Mesh.prototype.GLfaces=null; -GLGE.Mesh.prototype.faces=null; -GLGE.Mesh.prototype.UV=null; -GLGE.Mesh.prototype.joints=null; -GLGE.Mesh.prototype.invBind=null; -GLGE.Mesh.prototype.loaded=false; -/** - * @name GLGE.Mesh#shaderupdate - * @event fired when the shader needs updating - * @param {object} data - */ - -/** -* Gets the bounding volume for the mesh -* @returns {GLGE.BoundingVolume} -*/ -GLGE.Mesh.prototype.getBoundingVolume=function(){ - if(!this.boundingVolume){ - var minX,maxX,minY,maxY,minZ,maxZ; - for(var i=0;i<this.buffers.length;i++){ - if(this.buffers[i].name=="position") var positions=this.buffers[i].data; - } - for(var i=0;i<positions.length;i=i+3){ - if(i==0){ - minX=maxX=positions[i]; - minY=maxY=positions[i+1]; - minZ=maxZ=positions[i+2]; - }else{ - minX=Math.min(minX,positions[i]); - maxX=Math.max(maxX,positions[i]); - minY=Math.min(minY,positions[i+1]); - maxY=Math.max(maxY,positions[i+1]); - minZ=Math.min(minZ,positions[i+2]); - maxZ=Math.max(maxZ,positions[i+2]); - } - } - this.boundingVolume=new GLGE.BoundingVolume(minX,maxX,minY,maxY,minZ,maxZ); - } - return this.boundingVolume; -} -/** -* Sets the joints -* @param {string[]} jsArray set joint objects -*/ -GLGE.Mesh.prototype.setJoints=function(jsArray){ - this.joints=jsArray; - this.fireEvent("shaderupdate",{}); - return this; -} -/** -* Sets the inverse bind matrix for each joint -* @param {GLGE.Matrix[]} jsArray set joint names -*/ -GLGE.Mesh.prototype.setInvBindMatrix=function(jsArray){ - this.invBind=jsArray; - this.fireEvent("shaderupdate",{}); - return this; -} -/** -* Sets the joint channels for each vertex -* @param {Number[]} jsArray The 1 dimentional array of bones -* @param {Number} num the number of chanels in this mesh -*/ -GLGE.Mesh.prototype.setVertexJoints=function(jsArray,num){ - if(num<4){ - this.setBuffer("joints1",jsArray,num); - }else{ - var jsArray1=[]; - var jsArray2=[]; - for(var i=0;i<jsArray.length;i++){ - if(i%num<4){ - jsArray1.push(jsArray[i]); - }else{ - jsArray2.push(jsArray[i]); - } - } - this.setBuffer("joints1",jsArray1,4); - this.setBuffer("joints2",jsArray2,num%4); - } - this.fireEvent("shaderupdate",{}); - return this; -} -/** -* Sets the joint weights on each vertex -* @param {Number[]} jsArray The 1 dimentional array of weights -* @param {Number} num the number of chanels in this mesh -*/ -GLGE.Mesh.prototype.setVertexWeights=function(jsArray,num){ - //normalize the weights! - for(var i=0;i<jsArray.length;i=i+parseInt(num)){ - var total=0; - for(var n=0;n<num;n++){ - total+=parseFloat(jsArray[i+n]); - } - for(var n=0;n<num;n++){ - jsArray[i+n]=jsArray[i+n]/total; - } - } - - if(num<4){ - this.setBuffer("weights1",jsArray,num); - }else{ - var jsArray1=[]; - var jsArray2=[]; - for(var i=0;i<jsArray.length;i++){ - if(i%num<4){ - jsArray1.push(jsArray[i]); - }else{ - jsArray2.push(jsArray[i]); - } - } - this.setBuffer("weights1",jsArray1,4); - this.setBuffer("weights2",jsArray2,num%4); - } - this.fireEvent("shaderupdate",{}); - return this; -} -/** -* Set the UV coord for the first UV layer -* @param {Number[]} jsArray the UV coords in a 1 dimentional array -*/ -GLGE.Mesh.prototype.setUV=function(jsArray){ - var idx=0; - for(var i=0; i<jsArray.length;i=i+2){ - this.UV[idx]=jsArray[i]; - this.UV[idx+1]=jsArray[i+1]; - if(!this.UV[idx+2]) this.UV[idx+2]=0; - if(!this.UV[idx+3]) this.UV[idx+3]=0; - idx=idx+4; - } - this.setBuffer("UV",this.UV,4); - return this; -} -/** -* Set the UV coord for the second UV layer -* @param {Number[]} jsArray the UV coords in a 1 dimentional array -*/ -GLGE.Mesh.prototype.setUV2=function(jsArray){ - var idx=0; - for(var i=0; i<jsArray.length;i=i+2){ - if(!this.UV[idx]) this.UV[idx]=0; - if(!this.UV[idx+1]) this.UV[idx+1]=0; - this.UV[idx+2]=jsArray[i]; - this.UV[idx+3]=jsArray[i+1]; - idx=idx+4; - } - this.setBuffer("UV",this.UV,4); - return this; -} -/** -* Sets the positions of the verticies -* @param {Number[]} jsArray The 1 dimentional array of positions -*/ -GLGE.Mesh.prototype.setPositions=function(jsArray){ - this.loaded=true; - this.positions=jsArray; - this.setBuffer("position",jsArray,3); - return this; -} -/** -* Sets the normals of the verticies -* @param {Number[]} jsArray The 1 dimentional array of normals -*/ -GLGE.Mesh.prototype.setNormals=function(jsArray){ - this.normals=jsArray; - this.setBuffer("normal",jsArray,3); - return this; -} -/** -* Sets a buffer for the -* @param {String} boneName The name of the bone -* @param {Number[]} jsArray The 1 dimentional array of weights -* @private -*/ -GLGE.Mesh.prototype.setBuffer=function(bufferName,jsArray,size){ - //make sure all jsarray items are floats - for(var i=0;i<jsArray.length;i++) jsArray[i]=parseFloat(jsArray[i]); - var buffer; - for(var i=0;i<this.buffers.length;i++){ - if(this.buffers[i].name==bufferName) buffer=i; - } - if(!buffer){ - this.buffers.push({name:bufferName,data:jsArray,size:size,GL:false}); - } - else - { - this.buffers[buffer]={name:bufferName,data:jsArray,size:size,GL:false}; - } - return this; -} -/** -* Sets the faces for this mesh -* @param {Number[]} jsArray The 1 dimentional array of normals -*/ -GLGE.Mesh.prototype.setFaces=function(jsArray){ - this.faces={data:jsArray,GL:false}; - //if at this point calculate normals if we haven't got them yet - if(!this.normals) this.calcNormals(); - - //add a tangent buffer - for(var i=0;i<this.buffers.length;i++){ - if(this.buffers[i].name=="position") var position=this.buffers[i].data; - if(this.buffers[i].name=="UV") var uv=this.buffers[i].data; - if(this.buffers[i].name=="normal") var normal=this.buffers[i].data; - } - - - if(position && uv){ - var tangentArray=[]; - var data={}; - var ref; - for(var i=0;i<this.faces.data.length;i=i+3){ - var p1=[position[(parseInt(this.faces.data[i]))*3],position[(parseInt(this.faces.data[i]))*3+1],position[(parseInt(this.faces.data[i]))*3+2]]; - var p2=[position[(parseInt(this.faces.data[i+1]))*3],position[(parseInt(this.faces.data[i+1]))*3+1],position[(parseInt(this.faces.data[i+1]))*3+2]]; - var p3=[position[(parseInt(this.faces.data[i+2]))*3],position[(parseInt(this.faces.data[i+2]))*3+1],position[(parseInt(this.faces.data[i+2]))*3+2]]; - - var n1=[normal[(parseInt(this.faces.data[i]))*3],normal[(parseInt(this.faces.data[i]))*3+1],normal[(parseInt(this.faces.data[i]))*3+2]]; - var n2=[normal[(parseInt(this.faces.data[i+1]))*3],normal[(parseInt(this.faces.data[i+1]))*3+1],normal[(parseInt(this.faces.data[i+1]))*3+2]]; - var n3=[normal[(parseInt(this.faces.data[i+2]))*3],normal[(parseInt(this.faces.data[i+2]))*3+1],normal[(parseInt(this.faces.data[i+2]))*3+2]]; - - var p21=[p2[0]-p1[0],p2[1]-p1[1],p2[2]-p1[2]]; - var p31=[p3[0]-p1[0],p3[1]-p1[1],p3[2]-p1[2]]; - var uv21=[uv[(parseInt(this.faces.data[i+1]))*4]-uv[(parseInt(this.faces.data[i]))*4],uv[(parseInt(this.faces.data[i+1]))*4+1]-uv[(parseInt(this.faces.data[i]))*4+1]]; - var uv31=[uv[(parseInt(this.faces.data[i+2]))*4]-uv[(parseInt(this.faces.data[i]))*4],uv[(parseInt(this.faces.data[i+2]))*4+1]-uv[(parseInt(this.faces.data[i]))*4+1]]; - - - - var tangent=GLGE.toUnitVec3([p21[0]*uv31[1]-p31[0]*uv21[01], - p21[1]*uv31[1]-p31[1]*uv21[1], - p21[2]*uv31[1]-p31[2]*uv21[1]]); - - var cp = uv21[1] * uv31[0] - uv21[0] * uv31[1]; - if ( cp != 0.0 ) tangent=GLGE.toUnitVec3(GLGE.scaleVec3(tangent,1/cp)); - - if(data[[p1[0],p1[1],p1[2],n1[0],n1[1],n1[2]].join(",")]){ - tang=data[[p1[0],p1[1],p1[2],n1[0],n1[1],n1[2]].join(",")]; - tang.vec=GLGE.scaleVec3(GLGE.addVec3(GLGE.scaleVec3(tang.vec,tang.weight),tangent),1/(tang.weight)); - tang.weight++; - }else{ - data[[p1[0],p1[1],p1[2],n1[0],n1[1],n1[2]].join(",")]={vec:tangent,weight:1}; - } - if(data[[p2[0],p2[1],p2[2],n2[0],n2[1],n2[2]].join(",")]){ - tang=data[[p2[0],p2[1],p2[2],n2[0],n2[1],n2[2]].join(",")]; - tang.vec=GLGE.scaleVec3(GLGE.addVec3(GLGE.scaleVec3(tang.vec,tang.weight),tangent),1/(tang.weight+1)); - tang.weight++; - }else{ - data[[p2[0],p2[1],p2[2],n2[0],n2[1],n2[2]].join(",")]={vec:tangent,weight:1}; - } - if(data[[p3[0],p3[1],p3[2],n3[0],n3[1],n3[2]].join(",")]){ - tang=data[[p3[0],p3[1],p3[2],n3[0],n3[1],n3[2]].join(",")]; - tang.vec=GLGE.scaleVec3(GLGE.addVec3(GLGE.scaleVec3(tang.vec,tang.weight),tangent),1/(tang.weight+1)); - tang.weight++; - }else{ - data[[p3[0],p3[1],p3[2],n3[0],n3[1],n3[2]].join(",")]={vec:tangent,weight:1}; - } - } - for(var i=0;i<position.length/3;i++){ - var p1=[position[i*3],position[i*3+1],position[i*3+2]]; - var n1=[normal[i*3],normal[i*3+1],normal[i*3+2]]; - t=data[[p1[0],p1[1],p1[2],n1[0],n1[1],n1[2]].join(",")].vec; - if(t){ - tangentArray[i*3]=t[0]; - tangentArray[i*3+1]=t[1]; - tangentArray[i*3+2]=t[2]; - } - } - this.setBuffer("tangent",tangentArray,3); - } - return this; -} -/** -* Sets the faces for this mesh -* @param {Number[]} jsArray The 1 dimentional array of normals -* @private -*/ -GLGE.Mesh.prototype.GLSetFaceBuffer=function(gl){ - if(!this.GLfaces) this.GLfaces = gl.createBuffer(); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.GLfaces); - gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(this.faces.data), gl.STATIC_DRAW); - this.GLfaces.itemSize = 1; - this.GLfaces.numItems = this.faces.data.length; -} -/** -* Sets up a GL Buffer -* @param {WebGLContext} gl The context being drawn on -* @param {String} bufferName The name of the buffer to create -* @param {Number[]} jsArray The data to add to the buffer -* @param {Number} size Size of a single element within the array -* @private -*/ -GLGE.Mesh.prototype.GLSetBuffer=function(gl,bufferName,jsArray,size){ - if(!this.GLbuffers[bufferName]) this.GLbuffers[bufferName] = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, this.GLbuffers[bufferName]); - gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(jsArray), gl.STATIC_DRAW); - this.GLbuffers[bufferName].itemSize = size; - this.GLbuffers[bufferName].numItems = jsArray.length/size; -}; -/** -* Calculates the normals for this mesh -* @private -*/ -GLGE.Mesh.prototype.calcNormals=function(){ - var normals=[]; - var positions=this.positions; - var faces=this.faces.data; - if(!faces){ - faces=[]; - for(var i=0;i<positions.length/3;i++) faces[i]=i; - } - for(var i=0;i<faces.length;i=i+3){ - var v1=[positions[faces[i]*3],positions[faces[i]*3+1],positions[faces[i]*3+2]]; - var v2=[positions[faces[i+1]*3],positions[faces[i+1]*3+1],positions[faces[i+1]*3+2]]; - var v3=[positions[faces[i+2]*3],positions[faces[i+2]*3+1],positions[faces[i+2]*3+2]]; - var vec1=GLGE.subVec3(v2,v1); - var vec2=GLGE.subVec3(v3,v1); - var norm=GLGE.toUnitVec3(GLGE.crossVec3(vec1,vec2)); - if(normals[faces[i]]==undefined) normals[faces[i]]=[]; - normals[faces[i]].push(norm); - if(normals[faces[i+1]]==undefined) normals[faces[i+1]]=[]; - normals[faces[i+1]].push(norm); - if(normals[faces[i+2]]==undefined) normals[faces[i+2]]=[]; - normals[faces[i+2]].push(norm); - } - var norms=[]; - for(i=0;i<normals.length;i++){ - var x=0,y=0,z=0; - if(normals[i]!=undefined){ - for(var j=0;j<normals[i].length;j++){ - x+=normals[i][j][0]; - y+=normals[i][j][1]; - z+=normals[i][j][2]; - } - x/=normals[i].length; - y/=normals[i].length; - z/=normals[i].length; - norms[i*3]=x; - norms[i*3+1]=y; - norms[i*3+2]=z; - } - } - this.setNormals(norms); -} -/** -* Sets the Attributes for this mesh -* @param {WebGLContext} gl The context being drawn on -* @private -*/ -GLGE.Mesh.prototype.GLAttributes=function(gl,shaderProgram){ - //if at this point we have no normals set then calculate them - if(!this.normals) this.calcNormals(); - - //disable all the attribute initially arrays - do I really need this? - for(var i=0; i<8; i++) gl.disableVertexAttribArray(i); - //check if the faces have been updated - if(!this.faces.GL && this.faces.data && this.faces.data.length>0){ - this.GLSetFaceBuffer(gl); - this.faces.GL=true; - } - //loop though the buffers - for(i=0; i<this.buffers.length;i++){ - if(!this.buffers[i].GL){ - this.GLSetBuffer(gl,this.buffers[i].name,this.buffers[i].data,this.buffers[i].size); - this.buffers[i].GL=true; - } - attribslot=GLGE.getAttribLocation(gl,shaderProgram, this.buffers[i].name); - if(attribslot>-1){ - gl.bindBuffer(gl.ARRAY_BUFFER, this.GLbuffers[this.buffers[i].name]); - gl.enableVertexAttribArray(attribslot); - gl.vertexAttribPointer(attribslot, this.GLbuffers[this.buffers[i].name].itemSize, gl.FLOAT, false, 0, 0); - } - } -} - - - -/** -* @class Creates a new light source to be added to a scene -* @property {Boolean} diffuse Dose this light source effect diffuse shading -* @property {Boolean} specular Dose this light source effect specular shading -* @augments GLGE.Animatable -* @augments GLGE.Placeable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Light=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.color={r:1,g:1,b:1}; -} -GLGE.augment(GLGE.Placeable,GLGE.Light); -GLGE.augment(GLGE.Animatable,GLGE.Light); -GLGE.augment(GLGE.QuickNotation,GLGE.Light); -GLGE.augment(GLGE.JSONLoader,GLGE.Light); -GLGE.Light.prototype.className="Light"; -/** -* @constant -* @description Enumeration for an point light source -*/ -GLGE.L_POINT=1; -/** -* @constant -* @description Enumeration for an directional light source -*/ -GLGE.L_DIR=2; -/** -* @constant -* @description Enumeration for an spot light source -*/ -GLGE.L_SPOT=3; - -GLGE.Light.prototype.constantAttenuation=1; -GLGE.Light.prototype.linearAttenuation=0.002; -GLGE.Light.prototype.quadraticAttenuation=0.0008; -GLGE.Light.prototype.spotCosCutOff=0.95; -GLGE.Light.prototype.spotPMatrix=null; -GLGE.Light.prototype.spotExponent=10; -GLGE.Light.prototype.color=null; -GLGE.Light.prototype.diffuse=true; -GLGE.Light.prototype.specular=true; -GLGE.Light.prototype.samples=0; -GLGE.Light.prototype.softness=0.01; -GLGE.Light.prototype.type=GLGE.L_POINT; -GLGE.Light.prototype.frameBuffer=null; -GLGE.Light.prototype.renderBuffer=null; -GLGE.Light.prototype.texture=null; -GLGE.Light.prototype.bufferHeight=256; -GLGE.Light.prototype.bufferWidth=256; -GLGE.Light.prototype.shadowBias=2.0; -GLGE.Light.prototype.castShadows=false; -/** -* Gets the spot lights projection matrix -* @returns the lights spot projection matrix -* @private -*/ -GLGE.Light.prototype.getPMatrix=function(){ - if(!this.spotPMatrix){ - var far; - if(this.scene && this.scene.camera) far=this.scene.camera.far; - else far=1000; - this.spotPMatrix=GLGE.makePerspective(Math.acos(this.spotCosCutOff)/3.14159*360, 1.0, 0.1, far); - } - return this.spotPMatrix; -} -/** -* Sets the shadow casting flag -* @param {number} value should cast shadows? -*/ -GLGE.Light.prototype.setCastShadows=function(value){ - this.castShadows=value; - return this; -} -/** -* Gets the shadow casting flag -* @returns {number} true if casts shadows -*/ -GLGE.Light.prototype.getCastShadows=function(){ - return this.castShadows; - return this; -} -/** -* Sets the shadow bias -* @param {number} value The shadow bias -*/ -GLGE.Light.prototype.setShadowBias=function(value){ - this.shadowBias=value; - return this; -} -/** -* Gets the shadow bias -* @returns {number} The shadow buffer bias -*/ -GLGE.Light.prototype.getShadowBias=function(){ - return this.shadowBias; -} - -/** -* Sets the number of samples for this shadow -* @param {number} value The number of samples to perform -*/ -GLGE.Light.prototype.setShadowSamples=function(value){ - this.samples=value; - return this; -} -/** -* Gets the number of samples for this shadow -* @returns {number} The number of samples -*/ -GLGE.Light.prototype.getShadowSamples=function(){ - return this.samples; -} -/** -* Sets the shadow softness -* @param {number} value The number of samples to perform -*/ -GLGE.Light.prototype.setShadowSoftness=function(value){ - this.softness=value; - return this; -} -/** -* Gets the shadow softness -* @returns {number} The softness of the shadows -*/ -GLGE.Light.prototype.getShadowSamples=function(){ - return this.softness; -} -/** -* Sets the shadow buffer width -* @param {number} value The shadow buffer width -*/ -GLGE.Light.prototype.setBufferWidth=function(value){ - this.bufferWidth=value; - return this; -} -/** -* Gets the shadow buffer width -* @returns {number} The shadow buffer width -*/ -GLGE.Light.prototype.getBufferHeight=function(){ - return this.bufferHeight; -} -/** -* Sets the shadow buffer width -* @param {number} value The shadow buffer width -*/ -GLGE.Light.prototype.setBufferHeight=function(value){ - this.bufferHeight=value; - return this; -} -/** -* Gets the shadow buffer width -* @returns {number} The shadow buffer width -*/ -GLGE.Light.prototype.getBufferWidth=function(){ - return this.bufferWidth; -} -/** -* Sets the spot light cut off -* @param {number} value The cos of the angle to limit -*/ -GLGE.Light.prototype.setSpotCosCutOff=function(value){ - this.spotPMatrix=null; - this.spotCosCutOff=value; - return this; -} -/** -* Gets the spot light cut off -* @returns {number} The cos of the limiting angle -*/ -GLGE.Light.prototype.getSpotCosCutOff=function(){ - return this.spotCosCutOff; -} -/** -* Sets the spot light exponent -* @param {number} value The spot lights exponent -*/ -GLGE.Light.prototype.setSpotExponent=function(value){ - this.spotExponent=value; - return this; -} -/** -* Gets the spot light exponent -* @returns {number} The exponent of the spot light -*/ -GLGE.Light.prototype.getSpotExponent=function(){ - return this.spotExponent; -} -/** -* Sets the light sources Attenuation -* @returns {Object} The components of the light sources attenuation -*/ -GLGE.Light.prototype.getAttenuation=function(constant,linear,quadratic){ - var attenuation={}; - attenuation.constant=this.constantAttenuation; - attenuation.linear=this.linearAttenuation; - attenuation.quadratic=this.quadraticAttenuation; - return attenuation; -} -/** -* Sets the light sources Attenuation -* @param {Number} constant The constant part of the attenuation -* @param {Number} linear The linear part of the attenuation -* @param {Number} quadratic The quadratic part of the attenuation -*/ -GLGE.Light.prototype.setAttenuation=function(constant,linear,quadratic){ - this.constantAttenuation=constant; - this.linearAttenuation=linear; - this.quadraticAttenuation=quadratic; - return this; -} -/** -* Sets the light sources constant attenuation -* @param {Number} value The constant part of the attenuation -*/ -GLGE.Light.prototype.setAttenuationConstant=function(value){ - this.constantAttenuation=value; - return this; -} -/** -* Sets the light sources linear attenuation -* @param {Number} value The linear part of the attenuation -*/ -GLGE.Light.prototype.setAttenuationLinear=function(value){ - this.linearAttenuation=value; - return this; -} -/** -* Sets the light sources quadratic attenuation -* @param {Number} value The quadratic part of the attenuation -*/ -GLGE.Light.prototype.setAttenuationQuadratic=function(value){ - this.quadraticAttenuation=value; - return this; -} - -/** -* Sets the color of the light source -* @param {string} color The color of the light -*/ -GLGE.Light.prototype.setColor=function(color){ - color=GLGE.colorParse(color); - this.color={r:color.r,g:color.g,b:color.b}; - return this; -} -/** -* Sets the red color of the light source -* @param {Number} value The new red level 0-1 -*/ -GLGE.Light.prototype.setColorR=function(value){ - this.color.r=value; - return this; -} -/** -* Sets the green color of the light source -* @param {Number} value The new green level 0-1 -*/ -GLGE.Light.prototype.setColorG=function(value){ - this.color.g=value; - return this; -} -/** -* Sets the blue color of the light source -* @param {Number} value The new blue level 0-1 -*/ -GLGE.Light.prototype.setColorB=function(value){ - this.color.b=value; - return this; -} -/** -* Gets the current color of the light source -* @return {[r,g,b]} The current position -*/ -GLGE.Light.prototype.getColor=function(){ - return this.color; -} -/** -* Gets the type of the light -* @return {Number} The type of the light source eg GLGE.L_POINT -*/ -GLGE.Light.prototype.getType=function(){ - return this.type; -} -/** -* Sets the type of the light -* @param {Number} type The type of the light source eg GLGE.L_POINT -*/ -GLGE.Light.prototype.setType=function(type){ - this.type=type; - return this; -} -/** -* init for the rendering -* @private -*/ -GLGE.Light.prototype.GLInit=function(gl){ - this.gl=gl; - if(this.type==GLGE.L_SPOT && !this.texture){ - this.createSpotBuffer(gl); - } -} -/** -* Sets up the WebGL needed to render the depth map for this light source. Only used for spot lights which produce shadows -* @private -*/ -GLGE.Light.prototype.createSpotBuffer=function(gl){ - this.frameBuffer = gl.createFramebuffer(); - this.renderBuffer = gl.createRenderbuffer(); - this.texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.texture); - - try { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.bufferWidth, this.bufferHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } catch (e) { - var tex = new Uint8Array(this.bufferWidth * this.bufferHeight * 4); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.bufferWidth, this.bufferHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, tex); - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer); - gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16, this.bufferWidth, this.bufferHeight); - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.texture, 0); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.renderBuffer); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); -} - -/** -* @constant -* @description Enumeration for a perspective camera -*/ -GLGE.C_PERSPECTIVE=1; -/** -* @constant -* @description Enumeration for a orthographic camera -*/ -GLGE.C_ORTHO=2; - -/** -* @class Creates a new camera object -* @augments GLGE.Animatable -* @augments GLGE.Placeable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Camera=function(uid){ - GLGE.Assets.registerAsset(this,uid); -}; -GLGE.augment(GLGE.Placeable,GLGE.Camera); -GLGE.augment(GLGE.Animatable,GLGE.Camera); -GLGE.augment(GLGE.QuickNotation,GLGE.Camera); -GLGE.augment(GLGE.JSONLoader,GLGE.Camera); -GLGE.Camera.prototype.className="Camera"; -GLGE.Camera.prototype.fovy=35; -GLGE.Camera.prototype.aspect=1.0; -GLGE.Camera.prototype.near=0.1; -GLGE.Camera.prototype.far=1000.0; -GLGE.Camera.prototype.orthoscale=5; -GLGE.Camera.prototype.type=GLGE.C_PERSPECTIVE; -GLGE.Camera.prototype.pMatrix=null; - -/** -* Method gets the orthographic scale for the camers -* @return {Matrix} Returns the orthographic scale -*/ -GLGE.Camera.prototype.getOrthoScale=function(){ - if(this.type==GLGE.C_ORTHO) { - return this.orthoscale - }else{ - GLGE.error("You may only get a scale for a orthographic camera"); - return 1; - } -}; -/** -* Method sets the orthographic scale for the camers -* @param {number} scale The new orthographic scale -*/ -GLGE.Camera.prototype.setOrthoScale=function(scale){ - if(this.type==GLGE.C_ORTHO) { - this.orthoscale=scale; - this.pMatrix=null; - } - else - { - GLGE.error("You may only set a scale for a orthographic camera"); - } - return this; -}; - -/** -* Method gets the far drawing distance -* @return {Matrix} Returns the cameras far draw distance -*/ -GLGE.Camera.prototype.getFar=function(){ - return this.far; -}; -/** -* Method sets the far draw distance of the camera -* @param {number} distance The far draw distance -*/ -GLGE.Camera.prototype.setFar=function(distance){ - this.far=distance; - return this; -}; - -/** -* Method gets the near drawing distance -* @return {Matrix} Returns the cameras near draw distance -*/ -GLGE.Camera.prototype.getNear=function(){ - return this.near; -}; -/** -* Method sets the near draw distance of the camera -* @param {number} distance The near draw distance -*/ -GLGE.Camera.prototype.setNear=function(distance){ - this.near=distance; - return this; -}; - -/** -* Method gets the current camera type -* @return {Matrix} Returns the camera type -*/ -GLGE.Camera.prototype.getType=function(){ - return this.type -}; -/** -* Method sets the type of camera GLGE.C_PERSPECTIVE or GLGE.C_ORTHO -* @param {number} type The type of this camera -*/ -GLGE.Camera.prototype.setType=function(type){ - if(type==GLGE.C_PERSPECTIVE || type==GLGE.C_ORTHO){ - this.type=type; - this.pMatrix=null; - }else{ - GLGE.error("unsuported camera type"); - } - return this; -}; - -/** -* Method gets the current yfov if the camera type is GLGE.C_PERSPECTIVE -* @return {Matrix} Returns the yfov -*/ -GLGE.Camera.prototype.getFovY=function(){ - if(this.type==GLGE.C_PERSPECTIVE) { - return this.fovy - }else{ - GLGE.error("You may only get a yfov for a perspective camera"); - return 1; - } -}; -/** -* Method sets the yfov of the camera -* @param {number} yfov The new yfov of the camera -*/ -GLGE.Camera.prototype.setFovY=function(fovy){ - if(this.type==GLGE.C_PERSPECTIVE) { - this.fovy=fovy; - this.ymax=null; - this.pMatrix=null; - } - else - { - GLGE.error("You may only set a yfov for a perspective camera"); - } - return this; -}; - -/** -* Method gets the current aspect if the camera type is GLGE.C_PERSPECTIVE -* @return {Matrix} Returns the yfov -*/ -GLGE.Camera.prototype.getAspect=function(){ - if(this.type==GLGE.C_PERSPECTIVE || this.type==GLGE.C_ORTHO) { - return this.aspect - } - else - { - GLGE.error("You may only set a aspect for a perspective or orthographic camera"); - return 1; - } -}; -/** -* Method sets the aspect of the camera -* @param {number} aspect The new projection matrix -*/ -GLGE.Camera.prototype.setAspect=function(aspect){ - if(this.type==GLGE.C_PERSPECTIVE || this.type==GLGE.C_ORTHO) { - this.aspect=aspect; - this.pMatrix=null; - } - else - { - GLGE.error("You may only set a aspect for a perspective or orthographic camera"); - } - return this; -}; - - -/** -* Method gets the current projection matrix of this camera -* @return {Matrix} Returns the camera projection matrix -*/ -GLGE.Camera.prototype.getProjectionMatrix=function(){ - if(!this.pMatrix){ - switch(this.type){ - case GLGE.C_PERSPECTIVE: - this.pMatrix=GLGE.makePerspective(this.fovy, this.aspect, this.near, this.far); - break; - case GLGE.C_ORTHO: - this.pMatrix=GLGE.makeOrtho(-this.orthoscale*this.aspect,this.orthoscale*this.aspect,-this.orthoscale,this.orthoscale, this.near, this.far); - break; - } - } - return this.pMatrix; -}; -/** -* Method generates the projection matrix based on the -* camera paramaters -* @param {Matrix} projection The new projection matrix -*/ -GLGE.Camera.prototype.setProjectionMatrix=function(projection){ - this.pMatrix=projection; - return this; -}; -/** -* Method generates the cameras view matrix -* @return Returns the view matrix based on this camera -* @type Matrix -*/ -GLGE.Camera.prototype.updateMatrix=function(){ - var position=this.getPosition(); - var vMatrix=GLGE.translateMatrix(position.x,position.y,position.z); - vMatrix=GLGE.mulMat4(vMatrix,this.getRotMatrix()); - if(this.parent) vMatrix=GLGE.mulMat4(this.parent.getModelMatrix(),vMatrix); - this.matrix=GLGE.inverseMat4(vMatrix); -}; -/** -* Method generates the cameras view matrix -* @return Returns the view matrix based on this camera -* @type Matrix -*/ -GLGE.Camera.prototype.getViewMatrix=function(){ - if(!this.matrix || !this.rotmatrix) this.updateMatrix(); - return this.matrix; -}; - - - -/** -* @constant -* @description Enumeration for no fog -*/ -GLGE.FOG_NONE=1; -/** -* @constant -* @description Enumeration for linear fall off fog -*/ -GLGE.FOG_LINEAR=2; -/** -* @constant -* @description Enumeration for exponential fall off fog -*/ -GLGE.FOG_QUADRATIC=3; - -/** -* @class Scene class containing the camera, lights and objects -* @augments GLGE.Group -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Scene=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.children=[]; - this.camera=new GLGE.Camera(); - this.backgroundColor={r:1,g:1,b:1,a:1}; - this.ambientColor={r:0,g:0,b:0}; - this.fogColor={r:0.5,g:0.5,b:0.5}; - this.passes=[]; -} -GLGE.augment(GLGE.Group,GLGE.Scene); -GLGE.augment(GLGE.QuickNotation,GLGE.Scene); -GLGE.augment(GLGE.JSONLoader,GLGE.Scene); -GLGE.Scene.prototype.camera=null; -GLGE.Scene.prototype.className="Scene"; -GLGE.Scene.prototype.renderer=null; -GLGE.Scene.prototype.backgroundColor=null; -GLGE.Scene.prototype.filter=null; -GLGE.Scene.prototype.fogColor=null; -GLGE.Scene.prototype.ambientColor=null; -GLGE.Scene.prototype.fogNear=10; -GLGE.Scene.prototype.fogFar=80; -GLGE.Scene.prototype.fogType=GLGE.FOG_NONE; -GLGE.Scene.prototype.passes=null; - -/** -* Gets the fog falloff type -* @returns {number} the far falloff type -*/ -GLGE.Scene.prototype.getFogType=function(){ - return this.fogType; -} -/** -* Sets the scenes fog falloff type -* @param {number} type The fog falloff type FOG_NONE,FOG_LINEAR,FOG_QUADRATIC -*/ -GLGE.Scene.prototype.setFogType=function(type){ - this.fogType=type; - return this; -} - -/** -* Gets the far fog distance -* @returns {number} the far distance of the fog -*/ -GLGE.Scene.prototype.getFogFar=function(){ - return this.fogFar; -} -/** -* Sets the scenes fog far distance -* @param {number} dist The fog far distance -*/ -GLGE.Scene.prototype.setFogFar=function(dist){ - this.fogFar=dist; - return this; -} - -/** -* Gets the near fog distance -* @returns {number} the near distance of the fog -*/ -GLGE.Scene.prototype.getFogNear=function(){ - return this.fogNear; -} -/** -* Sets the scenes fog near distance -* @param {number} dist The fog near distance -*/ -GLGE.Scene.prototype.setFogNear=function(dist){ - this.fogNear=dist; - return this; -} - -/** -* Gets the fog color -* @returns {object} An assoiative array r,g,b -*/ -GLGE.Scene.prototype.getFogColor=function(){ - return this.fogColor; -} -/** -* Sets the scenes fog color -* @param {string} color The fog color -*/ -GLGE.Scene.prototype.setFogColor=function(color){ - color=GLGE.colorParse(color); - this.fogColor={r:color.r,g:color.g,b:color.b}; - return this; -} - -/** -* Gets the scenes background color -* @returns {object} An assoiative array r,g,b -*/ -GLGE.Scene.prototype.getBackgroundColor=function(){ - return this.backgroundColor; -} -/** -* Sets the scenes background color -* @param {string} color The backgorund color -*/ -GLGE.Scene.prototype.setBackgroundColor=function(color){ - color=GLGE.colorParse(color); - this.backgroundColor={r:color.r,g:color.g,b:color.b,a:color.a}; - return this; -} -/** -* Gets the scenes ambient light -* @returns {object} An assoiative array r,g,b -*/ -GLGE.Scene.prototype.getAmbientColor=function(){ - return this.ambientColor; -} - -/** -* Sets the scenes ambient light -* @param {string} color The ambient light color -*/ -GLGE.Scene.prototype.setAmbientColor=function(color){ - color=GLGE.colorParse(color); - this.ambientColor={r:color.r,g:color.g,b:color.b}; - if(this.renderer){ - this.renderer.gl.clearColor(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b, 1.0); - } - return this; -} -/** -* Sets the scenes ambient light -* @param {number} value the red componenent of the ambient light 0-1 -*/ -GLGE.Scene.prototype.setAmbientColorR=function(value){ - this.ambientColor.r=value; - return this; -} -/** -* Sets the scenes ambient light -* @param {number} value the green componenent of the ambient light 0-1 -*/ -GLGE.Scene.prototype.setAmbientColorG=function(value){ - this.ambientColor.g=value; - return this; -} -/** -* Sets the scenes ambient light -* @param {number} value the blue componenent of the ambient light 0-1 -*/ -GLGE.Scene.prototype.setAmbientColorB=function(value){ - this.ambientColor.b=value; - return this; -} - -/** -* Sets the active camera for this scene -* @property {GLGE.Camera} object The object to be added -*/ -GLGE.Scene.prototype.setCamera=function(camera){ - if(typeof camera=="string") camera=GLGE.Assets.get(camera); - this.camera=camera; - return this; -} -/** -* Gets the scenes active camera -* @returns {GLGE.Camera} The current camera -*/ -GLGE.Scene.prototype.getCamera=function(){ - return this.camera; -} -/** -* used to initialize all the WebGL buffers etc need for this scene -* @private -*/ -GLGE.Scene.prototype.GLInit=function(gl){ - this.gl=gl; - gl.lights=this.getLights(); - //sets the camera aspect to same aspect as the canvas - this.camera.setAspect(this.renderer.canvas.width/this.renderer.canvas.height); - - //this.createPickBuffer(gl); - this.renderer.gl.clearColor(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b, 1.0); - - for(var i=0;i<this.children;i++){ - if(this.children[i].GLInit) children[i].GLInit(gl); - } -} -/** -* used to clean up all the WebGL buffers etc need for this scene -* @private -*/ -GLGE.Scene.prototype.GLDestroy=function(gl){ -} -/** -* sort function -*/ -GLGE.Scene.sortFunc=function(a,b){ - return a.zdepth-b.zdepth; -} -/** -* z sorts the objects -* @private -*/ -GLGE.Scene.prototype.zSort=function(gl,objects){ - var cameraMatrix=gl.scene.camera.getViewMatrix(); - var transMatrix; - for(var i=0;i<objects.length;i++){ - transMatrix=GLGE.mulMat4(cameraMatrix,objects[i].getModelMatrix()); - objects[i].zdepth=transMatrix[11]; - } - objects.sort(GLGE.Scene.sortFunc); - return objects; -} -/** -* sets the 2d filter to apply -* @param {GLGE.Filter2d} filter the filter to apply when rendering the scene -*/ -GLGE.Scene.prototype.setFilter2d=function(value){ - this.filter=value; - return this; -} -/** -* gets the 2d filter being applied apply -* @returns {GLGE.Filter2d} -*/ -GLGE.Scene.prototype.getFilter2d=function(filter){ - return this.filter; -} -/** -* gets the scenes frame buffer -* @private -*/ -GLGE.Scene.prototype.getFrameBuffer=function(gl){ - if(this.filter) return this.filter.getFrameBuffer(gl); - return null; -} -/** -* culls objects from the scene -* @private -*/ -GLGE.Scene.prototype.cull=function(renderobjects,camera,projection){ - return renderobjects; -} - -/** -* renders the scene -* @private -*/ -GLGE.Scene.prototype.render=function(gl){ - //if look at is set then look - if(this.camera.lookAt) this.camera.Lookat(this.camera.lookAt); - - this.animate(); - - var lights=gl.lights; - gl.scene=this; - - gl.disable(gl.BLEND); - - this.framebuffer=this.getFrameBuffer(gl); - - var renderObjects=this.getObjects(); - //shadow stuff - for(var i=0; i<lights.length;i++){ - if(lights[i].castShadows){ - if(!lights[i].gl) lights[i].GLInit(gl); - gl.bindFramebuffer(gl.FRAMEBUFFER, lights[i].frameBuffer); - - - gl.viewport(0,0,lights[i].bufferWidth,lights[i].bufferHeight); - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - var cameraMatrix=this.camera.matrix; - var cameraPMatrix=this.camera.getProjectionMatrix(); - if(!lights[i].s_cache) lights[i].s_cache={}; - if(lights[i].s_cache.pmatrix!=lights[i].getPMatrix() || lights[i].s_cache.mvmatrix!=lights[i].getModelMatrix()){ - lights[i].s_cache.pmatrix=lights[i].getPMatrix(); - lights[i].s_cache.mvmatrix=lights[i].getModelMatrix(); - lights[i].s_cache.imvmatrix=GLGE.inverseMat4(lights[i].getModelMatrix()); - lights[i].s_cache.smatrix=GLGE.mulMat4(lights[i].getPMatrix(),lights[i].s_cache.imvmatrix); - } - this.camera.setProjectionMatrix(lights[i].s_cache.pmatrix); - this.camera.matrix=lights[i].s_cache.imvmatrix; - //draw shadows - for(var n=0; n<renderObjects.length;n++){ - renderObjects[n].GLRender(gl, GLGE.RENDER_SHADOW,n); - } - gl.flush(); - this.camera.matrix=cameraMatrix; - this.camera.setProjectionMatrix(cameraPMatrix); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - } - } - if(this.camera.animation) this.camera.animate(); - - //null render pass to findout what else needs rendering - this.getPasses(gl,renderObjects); - - //first off render the passes - var cameraMatrix=this.camera.matrix; - var cameraPMatrix=this.camera.getProjectionMatrix(); - this.allowPasses=false; - while(this.passes.length>0){ - var pass=this.passes.pop(); - gl.bindFramebuffer(gl.FRAMEBUFFER, pass.frameBuffer); - this.camera.matrix=pass.cameraMatrix; - this.camera.setProjectionMatrix(pass.projectionMatrix); - this.renderPass(gl,renderObjects,pass.width,pass.height); - } - - this.camera.matrix=cameraMatrix; - this.camera.setProjectionMatrix(cameraPMatrix); - - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer); - this.renderPass(gl,renderObjects,this.renderer.canvas.width,this.renderer.canvas.height); - - this.applyFilter(gl,renderObjects,null); - - this.allowPasses=true; - -} -/** -* gets the passes needed to render this scene -* @private -*/ -GLGE.Scene.prototype.getPasses=function(gl,renderObjects){ - for(var i=0; i<renderObjects.length;i++){ - renderObjects[i].GLRender(gl,GLGE.RENDER_NULL); - } -} - -/** -* renders the scene -* @private -*/ -GLGE.Scene.prototype.renderPass=function(gl,renderObjects,width,height,type){ - if(!type) type=GLGE.RENDER_DEFAULT; - - gl.clearDepth(1.0); - gl.depthFunc(gl.LEQUAL); - gl.viewport(0,0,width,height); - - gl.clearColor(this.backgroundColor.r, this.backgroundColor.g, this.backgroundColor.b, this.backgroundColor.a); - - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT); - var transObjects=[]; - gl.disable(gl.BLEND); - for(var i=0; i<renderObjects.length;i++){ - if(!renderObjects[i].zTrans) renderObjects[i].GLRender(gl,type); - else transObjects.push(renderObjects[i]) - } - - gl.enable(gl.BLEND); - transObjects=this.zSort(gl,transObjects); - for(var i=0; i<transObjects.length;i++){ - transObjects[i].GLRender(gl, type); - } -} - -GLGE.Scene.prototype.applyFilter=function(gl,renderObject,framebuffer){ - if(this.filter && this.filter.renderDepth){ - gl.clearDepth(1.0); - gl.depthFunc(gl.LEQUAL); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.filter.getDepthBuffer(gl)); - this.renderPass(gl,renderObject,this.filter.getDepthBufferWidth(), this.filter.getDepthBufferHeight(),GLGE.RENDER_SHADOW); - } - - if(this.filter && this.filter.renderNormal){ - gl.clearDepth(1.0); - gl.depthFunc(gl.LEQUAL); - gl.bindFramebuffer(gl.FRAMEBUFFER, this.filter.getNormalBuffer(gl)); - this.renderPass(gl,renderObject,this.filter.getNormalBufferWidth(),this.filter.getNormalBufferHeight(),GLGE.RENDER_NORMAL); - } - - if(this.filter) this.filter.GLRender(gl,framebuffer); -} - -/** -* Adds and additional render pass to the scene for RTT, reflections and refractions -* @private -*/ -GLGE.Scene.prototype.addRenderPass=function(frameBuffer,cameraMatrix,projectionMatrix,width,height){ - if(this.allowPasses) this.passes.push({frameBuffer:frameBuffer, cameraMatrix:cameraMatrix, projectionMatrix:projectionMatrix, height:height, width:width}); - return this; -} -/** -* Sets up the WebGL needed create a picking frame and render buffer -* @private -*/ -/*GLGE.Scene.prototype.createPickBuffer=function(gl){ - this.framePickBuffer = gl.createFramebuffer(); - this.renderPickBufferD = gl.createRenderbuffer(); - this.renderPickBufferC = gl.createRenderbuffer(); - //this.pickTexture = gl.createTexture(); - //gl.bindTexture(gl.TEXTURE_2D, this.pickTexture); - - //TODO update when null is accepted - /* try { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 4, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } catch (e) { - var tex = new WebGLUnsignedByteArray(4*1*4); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 4,1, 0, gl.RGBA, gl.UNSIGNED_BYTE, tex); - } - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.framePickBuffer); - gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderPickBufferD); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16,4, 1); - //gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.pickTexture, 0); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.renderPickBufferD); - - - gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderPickBufferC); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.RGBA,4, 1); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this.renderPickBufferC); - - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.bindTexture(gl.TEXTURE_2D, null); -}*/ - -/** -* ray query from origin in the given direction -* @param origin the source of the ray -* @param direction the direction of the ray -*/ -GLGE.Scene.prototype.ray=function(origin,direction){ - - var gl=this.renderer.gl; - var origmatrix=this.camera.matrix; - var origpmatrix=this.camera.pMatrix; - - this.camera.matrix=GLGE.inverseMat4(GLGE.Mat4([direction[2], direction[1], direction[0], origin[0], - direction[0], direction[2], direction[1], origin[1], - direction[1], direction[0], direction[2], origin[2], - 0, 0, 0, 1])); - - if(!this.pickPMatrix) this.pickPMatrix=GLGE.makeOrtho(-0.0001,0.0001,-0.0001,0.0001,this.camera.near,this.camera.far); - this.camera.pMatrix=this.pickPMatrix; - gl.viewport(0,0,8,1); - gl.clear(gl.DEPTH_BUFFER_BIT); - gl.disable(gl.BLEND); - gl.scene=this; - var objects=this.getObjects(); - for(var i=0; i<objects.length;i++){ - if(objects[i].pickable) objects[i].GLRender(gl,GLGE.RENDER_PICK,i+1); - } - gl.flush(); - - var data = new Uint8Array(8 * 1 * 4); - gl.readPixels(0, 0, 8, 1, gl.RGBA,gl.UNSIGNED_BYTE, data); - - - var norm=[data[4]/255,data[5]/255,data[6]/255]; - var normalsize=Math.sqrt(norm[0]*norm[0]+norm[1]*norm[1]+norm[2]*norm[2])*0.5; - norm=[norm[0]/normalsize-1,norm[1]/normalsize-1,norm[2]/normalsize-1]; - var obj=objects[data[0]+data[1]*256+data[2]*65536-1]; - - var dist=(data[10]/255+0.00390625*data[9]/255+0.0000152587890625*data[8]/255)*this.camera.far; - var tex=[]; - tex[0]=(data[14]/255+0.00390625*data[13]/255+0.0000152587890625*data[12]/255); - tex[1]=(data[18]/255+0.00390625*data[17]/255+0.0000152587890625*data[16]/255); - - - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.viewport(0,0,this.renderer.canvas.width,this.renderer.canvas.height); - - //revert the view matrix - this.camera.matrix=origmatrix; - this.camera.pMatrix=origpmatrix; - return {object:obj,distance:dist,coord:[origin[0]-direction[0]*dist,origin[1]-direction[1]*dist,origin[2]-direction[2]*dist],normal:norm,texture:tex}; -} - -/** -* Picks and object from canvas coords -* @param x the canvas x coord to pick -* @param y the canvas y coord to pick -*/ -GLGE.Scene.prototype.pick=function(x,y){ - if(!this.camera){ - GLGE.error("No camera set for picking"); - return false; - }else if(this.camera.matrix && this.camera.pMatrix){ - xcoord = -( ( ( 2 * x ) / this.renderer.canvas.width ) - 1 ) / this.camera.pMatrix[0]; - ycoord =( ( ( 2 * y ) / this.renderer.canvas.height ) - 1 ) / this.camera.pMatrix[5]; - zcoord = 1; - var coord=[xcoord,ycoord,zcoord,0]; - coord=GLGE.mulMat4Vec4(GLGE.inverseMat4(this.camera.matrix),coord); - var cameraPos=this.camera.getPosition(); - var origin=[cameraPos.x,cameraPos.y,cameraPos.z]; - return this.ray(origin,coord); - - }else{ - return false; - } - -} - -/** -* @class Sets the scene to render -* @param {GLGE.Scene} scene The scene to be rendered -*/ -GLGE.Renderer=function(canvas,error){ - this.canvas=canvas; - try { - this.gl = canvas.getContext("experimental-webgl",{alpha:true,depth:true,stencil:true,antialias:true,premultipliedAlpha:true}); - } catch(e) {} - if(!this.gl) { - if(!error){ - var div=document.createElement("div"); - div.setAttribute("style","position: absolute; top: 10px; left: 10px; font-family: sans-serif; font-size: 14px; padding: 10px;background-color: #fcffcb;color: #800; width: 200px; border:2px solid #f00"); - div.innerHTML="Cannot detect webgl, please download a <b><a href='http://www.khronos.org/webgl/wiki/Getting_a_WebGL_Implementation'>compatible browser</a></b>"; - document.getElementsByTagName("body")[0].appendChild(div); - throw "cannot create webgl context"; - }else{ - error(); - throw "cannot create webgl context"; - } - } - //firefox is doing something here? - try{ - this.gl.canvas=canvas; - }catch(e){}; - //this.gl = WebGLDebugUtils.makeDebugContext(this.gl); - //this.gl.setTracing(true); - - //chome compatibility - //TODO: Remove this when chome is right - if (!this.gl.getProgramParameter) - { - this.gl.getProgramParameter = this.gl.getProgrami - } - if (!this.gl.getShaderParameter) - { - this.gl.getShaderParameter = this.gl.getShaderi - } - // End of Chrome compatibility code - - this.gl.uniformMatrix4fvX=this.gl.uniformMatrix4fv - this.gl.uniformMatrix4fv=function(uniform,transpose,array){ - if(!transpose){ - this.uniformMatrix4fvX(uniform,false,array); - }else{ - GLGE.mat4gl(GLGE.transposeMat4(array),array); - this.uniformMatrix4fvX(uniform,false,array); - } - } - var gl=this.gl; - - /*this.gl.texImage2Dx=this.gl.texImage2D; - this.gl.texImage2D=function(){ - if(arguments.length==9){ - gl.texImage2Dx(arguments[0], arguments[1], arguments[2],arguments[3],arguments[4],arguments[5],arguments[6],arguments[7],arguments[8]); - }else{ - gl.texImage2Dx(arguments[0], arguments[1], arguments[5],false,false); - } - }*/ - - - //set up defaults - this.gl.clearDepth(1.0); - this.gl.clearStencil(0); - this.gl.enable(this.gl.DEPTH_TEST); - - //this.gl.enable(this.gl.CULL_FACE); - - this.gl.depthFunc(this.gl.LEQUAL); - this.gl.blendFuncSeparate(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA,this.gl.ZERO,this.gl.ONE); -}; -GLGE.Renderer.prototype.gl=null; -GLGE.Renderer.prototype.scene=null; -/** -* Gets the scene which is set to be rendered -* @returns the current render scene -*/ -GLGE.Renderer.prototype.getScene=function(){ - return this.scene; -}; -/** -* Sets the scene to render -* @param {GLGE.Scene} scene The scene to be rendered -*/ -GLGE.Renderer.prototype.setScene=function(scene){ - scene.renderer=this; - this.scene=scene; - scene.GLInit(this.gl); - return this; -}; -/** -* Renders the current scene to the canvas -*/ -GLGE.Renderer.prototype.render=function(){ - this.scene.render(this.gl); - //if this is the first ever pass then render twice to fill shadow buffers - if(!this.rendered){ - this.scene.render(this.gl); - this.rendered=true; - } -}; - - -/** -* @class A texture to be included in a material -* @param {string} uid the unique id for this texture -* @see GLGE.Material -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.Texture=function(uid){ - GLGE.Assets.registerAsset(this,uid); -} -GLGE.augment(GLGE.QuickNotation,GLGE.Texture); -GLGE.augment(GLGE.JSONLoader,GLGE.Texture); -GLGE.Texture.prototype.className="Texture"; -GLGE.Texture.prototype.image=null; -GLGE.Texture.prototype.glTexture=null; -GLGE.Texture.prototype.url=null; -/** -* Gets the textures used by the layer -* @return {string} The textures image url -*/ -GLGE.Texture.prototype.getSrc=function(){ - return this.url; -}; - -/** -* Sets the textures image location -* @param {string} url the texture image url -*/ -GLGE.Texture.prototype.setSrc=function(url){ - this.url=url; - this.state=0; - this.image=new Image(); - var texture=this; - this.image.onload = function(){ - texture.state=1; - } - this.image.src=url; - if(this.glTexture && this.gl){ - this.gl.deleteTexture(this.glTexture); - this.glTexture=null; - } - return this; -}; - -/** -* Sets the textures image location -* @private -**/ -GLGE.Texture.prototype.doTexture=function(gl){ - this.gl=gl; - //create the texture if it's not already created - if(!this.glTexture) this.glTexture=gl.createTexture(); - //if the image is loaded then set in the texture data - if(this.state==1){ - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE,this.image); - gl.generateMipmap(gl.TEXTURE_2D); - gl.bindTexture(gl.TEXTURE_2D, null); - this.state=2; - } - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT); - - if(this.state==2) return true; - else return false; -} - -/** -* @class A canvase texture to be included in a material -* @param {string} uid the unique id for this texture -* @see GLGE.Material -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.TextureCanvas=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.canvas=document.createElement("canvas"); -} -GLGE.augment(GLGE.QuickNotation,GLGE.TextureCanvas); -GLGE.augment(GLGE.JSONLoader,GLGE.TextureCanvas); -GLGE.TextureCanvas.prototype.className="TextureCanvas"; -GLGE.TextureCanvas.prototype.glTexture=null; -/** -* Gets the canvas used by the texture -* @return {canvas} The textures image url -*/ -GLGE.TextureCanvas.prototype.getCanvas=function(){ - return this.canvas; -}; -/** -* Sets the canvas used by the texture -* @param {canvas} canvas The canvas to use -*/ -GLGE.TextureCanvas.prototype.setCanvas=function(canvas){ - this.canvas=canvas; - return this; -}; -/** -* Sets the canvas height -* @param {number} value The canvas height -*/ -GLGE.TextureCanvas.prototype.setHeight=function(value){ - this.canvas.height=value; - return this; -}; -/** -* Sets the canvas width -* @param {number} value The canvas width -*/ -GLGE.TextureCanvas.prototype.setWidth=function(value){ - this.canvas.width=value; - return this; -}; - -/** -* gets the canvas height -* @returns {number} The canvas height -*/ -GLGE.TextureCanvas.prototype.getHeight=function(){ - return this.canvas.height; -}; -/** -* gets the canvas width -* @returns {number} The canvas width -*/ -GLGE.TextureCanvas.prototype.getWidth=function(){ - return this.canvas.width; -}; - -/** -* does the canvas texture GL stuff -* @private -**/ -GLGE.TextureCanvas.prototype.doTexture=function(gl){ - this.gl=gl; - //create the texture if it's not already created - if(!this.glTexture){ - this.glTexture=gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - this.updateCanvas(gl); - }else{ - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - this.updateCanvas(gl); - } - - - return true; -} -/** -* Updates the canvas texture -* @private -*/ -GLGE.TextureCanvas.prototype.updateCanvas=function(gl){ - var canvas = this.canvas; - - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - //TODO: fix this when minefield is upto spec - try{gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas);} - catch(e){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, canvas,null);} - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.generateMipmap(gl.TEXTURE_2D); -} - - -/** -* @class A video texture to be included in a material -* @param {string} uid the unique id for this texture -* @see GLGE.Material -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.TextureVideo=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.video=document.createElement("video"); - this.video.style.display="none"; - this.video.setAttribute("loop","loop"); - this.video.autoplay=true; - //looping isn't working in firefox so quick fix! - this.video.addEventListener("ended", function() { this.play(); }, true); - //video needs to be part of page to work for some reason :-s - document.getElementsByTagName("body")[0].appendChild(this.video); - //used to get webkit working - this.canvas=document.createElement("canvas"); - this.ctx=this.canvas.getContext("2d"); - -} -GLGE.augment(GLGE.QuickNotation,GLGE.TextureVideo); -GLGE.augment(GLGE.JSONLoader,GLGE.TextureVideo); -GLGE.TextureVideo.prototype.className="TextureVideo"; -GLGE.TextureVideo.prototype.glTexture=null; -/** -* Gets the canvas used by the texture -* @return {video} The textures image url -*/ -GLGE.TextureVideo.prototype.getVideo=function(){ - return this.video; -}; -/** -* Sets the video used by the texture -* @param {video} canvas The canvas to use -*/ -GLGE.TextureVideo.prototype.setVideo=function(video){ - this.video=video; - return this; -}; - -/** -* Sets the source used for the video -* @param {string} src The URL of the video -*/ -GLGE.TextureVideo.prototype.setSrc=function(src){ - this.video.src=src; - return this; -}; -/** -* gets the source used for the video -* @returns {string} The URL of the video -*/ -GLGE.TextureVideo.prototype.getSrc=function(src){ - return this.video.src; -}; - -/** -* does the canvas texture GL stuff -* @private -**/ -GLGE.TextureVideo.prototype.doTexture=function(gl){ - this.gl=gl; - //create the texture if it's not already created - if(!this.glTexture){ - this.glTexture=gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - this.updateTexture(gl); - }else{ - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - this.updateTexture(gl); - } - - - return true; -} -/** -* Updates the canvas texture -* @private -*/ -GLGE.TextureVideo.prototype.updateTexture=function(gl){ - var video = this.video; - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - //TODO: fix this when minefield is upto spec - if(video.readyState>0){ - if(video.height<=0){ - video.style.display=""; - video.height=video.offsetHeight; - video.width=video.offsetWidth; - video.style.display="none"; - } - this.canvas.height=video.height; - this.canvas.width=video.width; - this.ctx.drawImage(video, 0, 0); - try{gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.canvas);} - catch(e){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.canvas,null);} - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.generateMipmap(gl.TEXTURE_2D); - - /* - use when video is working in webkit - try{gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video);} - catch(e){gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, video,null);} - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.generateMipmap(gl.TEXTURE_2D); - */ - } -} - - - -/** -* @class A reflection texture will reflect in a plane for a specified transform -* @param {string} uid the unique id for this texture -* @see GLGE.Material -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.TextureCamera=function(uid){ - GLGE.Assets.registerAsset(this,uid); -} -GLGE.augment(GLGE.QuickNotation,GLGE.TextureCamera); -GLGE.augment(GLGE.JSONLoader,GLGE.TextureCamera); -GLGE.TextureCamera.prototype.className="Texture"; -GLGE.TextureCamera.prototype.texture=null; -GLGE.TextureCamera.prototype.glTexture=null; -GLGE.TextureCamera.prototype.object=null; -GLGE.TextureCamera.prototype.camera=null; -GLGE.TextureCamera.prototype.bufferHeight=0; -GLGE.TextureCamera.prototype.bufferWidth=0; -GLGE.TextureCamera.prototype.mirrorAxis=GLGE.NONE; -GLGE.TextureCamera.prototype.clipAxis=GLGE.NONE; - -/** -* sets the RTT render buffer width -* @param {number} buffer width -**/ -GLGE.TextureCamera.prototype.setBufferWidth=function(width){ - this.bufferWidth=width; - this.update=true; - return this; -} -/** -* gets the RTT render buffer width -* @returns the width -**/ -GLGE.TextureCamera.prototype.getBufferWidth=function(){ - return this.bufferWidth; -} - -/** -* sets the RTT render buffer height -* @param {number} buffer height -**/ -GLGE.TextureCamera.prototype.setBufferHeight=function(height){ - this.bufferHeight=height; - this.update=true; - return this; -} -/** -* gets the RTT render buffer height -* @returns the height -**/ -GLGE.TextureCamera.prototype.getBufferHeight=function(){ - return this.bufferHeight; -} - -/** -* sets the RTT clip axis -* @param {number} the axis -**/ -GLGE.TextureCamera.prototype.setClipAxis=function(camera){ - this.clipAxis=camera; - return this; -} -/** -* gets the RTT clip axis -* @returns the axis -**/ -GLGE.TextureCamera.prototype.getClipAxis=function(){ - return this.clipAxis; -} - -/** -* sets the RTT mirror axis -* @param {number} the axis -**/ -GLGE.TextureCamera.prototype.setMirrorAxis=function(camera){ - this.mirrorAxis=camera; - return this; -} -/** -* gets the RTT mirror axis -* @returns the axis -**/ -GLGE.TextureCamera.prototype.getMirrorAxis=function(){ - return this.mirrorAxis; -} - -/** -* sets the RTT camera to use -* @param {GLGE.Camera} the source camera -**/ -GLGE.TextureCamera.prototype.setCamera=function(camera){ - this.camera=camera; - return this; -} -/** -* gets the RTT source camera -* @returns {GLGE.Camera} the source camera -**/ -GLGE.TextureCamera.prototype.getCamera=function(){ - return this.camera; -} - -/** -* does what is needed to get the texture -* @private -**/ -GLGE.TextureCamera.prototype.doTexture=function(gl,object){ - if(this.camera){ - this.gl=gl; - var modelmatrix=object.getModelMatrix(); - var pmatrix=gl.scene.camera.getProjectionMatrix(); - var cameramatrix=this.camera.getViewMatrix(); - var matrix; - - if(this.mirrorAxis){ - switch(this.mirrorAxis){ - case GLGE.XAXIS: - matrix=GLGE.mulMat4(GLGE.mulMat4(GLGE.mulMat4(cameramatrix,modelmatrix),GLGE.scaleMatrix(-1,1,1)),GLGE.inverseMat4(modelmatrix)); - break; - case GLGE.YAXIS: - matrix=GLGE.mulMat4(GLGE.mulMat4(GLGE.mulMat4(cameramatrix,modelmatrix),GLGE.scaleMatrix(1,-1,1)),GLGE.inverseMat4(modelmatrix)); - break; - case GLGE.ZAXIS: - matrix=GLGE.mulMat4(GLGE.mulMat4(GLGE.mulMat4(cameramatrix,modelmatrix),GLGE.scaleMatrix(1,1,-1)),GLGE.inverseMat4(modelmatrix)); - break; - } - }else{ - matrix=cameramatrix; - } - - if(this.clipAxis){ - var clipplane - switch(this.clipAxis){ - case GLGE.NEG_XAXIS: - var dirnorm=GLGE.toUnitVec3([-modelmatrix[0],-modelmatrix[4],-modelmatrix[8]]); - clipplane=[dirnorm[0],dirnorm[1],dirnorm[2],-GLGE.dotVec3([modelmatrix[3],modelmatrix[7],modelmatrix[11]],dirnorm)]; - break; - case GLGE.POS_XAXIS: - var dirnorm=GLGE.toUnitVec3([modelmatrix[0],modelmatrix[4],modelmatrix[8]]); - clipplane=[dirnorm[0],dirnorm[1],dirnorm[2],-GLGE.dotVec3([modelmatrix[3],modelmatrix[7],modelmatrix[11]],dirnorm)]; - break; - case GLGE.NEG_YAXIS: - var dirnorm=GLGE.toUnitVec3([-modelmatrix[1],-modelmatrix[5],-modelmatrix[9]]); - clipplane=[dirnorm[0],dirnorm[1],dirnorm[2],-GLGE.dotVec3([modelmatrix[3],modelmatrix[7],modelmatrix[11]],dirnorm)]; - break; - case GLGE.POS_YAXIS: - var dirnorm=GLGE.toUnitVec3([modelmatrix[1],modelmatrix[5],modelmatrix[9]]); - clipplane=[dirnorm[0],dirnorm[1],dirnorm[2],-GLGE.dotVec3([modelmatrix[3],modelmatrix[7],modelmatrix[11]],dirnorm)]; - break; - case GLGE.NEG_ZAXIS: - var dirnorm=GLGE.toUnitVec3([-modelmatrix[2],-modelmatrix[6],-modelmatrix[10]]); - clipplane=[dirnorm[0],dirnorm[1],dirnorm[2],-GLGE.dotVec3([modelmatrix[3],modelmatrix[7],modelmatrix[11]],dirnorm)+0.001]; - break; - case GLGE.POS_ZAXIS: - var dirnorm=GLGE.toUnitVec3([modelmatrix[2],modelmatrix[6],modelmatrix[10]]); - clipplane=[dirnorm[0],dirnorm[1],dirnorm[2],-GLGE.dotVec3([modelmatrix[3],modelmatrix[7],modelmatrix[11]],dirnorm)+0.001]; - break; - } - - var itmvp=GLGE.transposeMat4(GLGE.inverseMat4(GLGE.mulMat4(pmatrix,matrix))); - - clipplane=GLGE.mulMat4Vec4(itmvp,clipplane); - clipplane=GLGE.scaleVec4(clipplane,pmatrix[10]); - clipplane[3] -= 1; - if(clipplane[2]<0) GLGE.scaleVec4(clipplane,-1); - var suffix=[ 1,0,0,0, - 0,1,0,0, - clipplane[0],clipplane[1],clipplane[2],clipplane[3], - 0,0,0,1]; - pmatrix=GLGE.mulMat4(suffix,pmatrix); - } - var height=(!this.bufferHeight ? gl.scene.renderer.canvas.height : this.bufferHeight); - var width=(!this.bufferWidth ? gl.scene.renderer.canvas.width : this.bufferWidth); - - //create the texture if it's not already created - if(!this.glTexture || this.update){ - this.createFrameBuffer(gl); - gl.scene.addRenderPass(this.frameBuffer,matrix, gl.scene.camera.getProjectionMatrix(),width,height); - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - this.update=false; - return false; - }else{ - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - gl.scene.addRenderPass(this.frameBuffer,matrix, pmatrix,width,height); - return true; - } - }else{ - return false; - } -} -GLGE.TextureCamera.prototype.registerPasses=GLGE.TextureCamera.prototype.doTexture; -/** -* Creates the frame buffer for our texture -* @private -*/ -GLGE.TextureCamera.prototype.createFrameBuffer=function(gl){ - var height=(!this.bufferHeight ? gl.scene.renderer.canvas.height : this.bufferHeight); - var width=(!this.bufferWidth ? gl.scene.renderer.canvas.width : this.bufferWidth); - - if(!this.frameBuffer) this.frameBuffer = gl.createFramebuffer(); - if(!this.renderBuffer) this.renderBuffer = gl.createRenderbuffer(); - if(!this.glTexture) this.glTexture=gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, this.glTexture); - - var tex = new Uint8Array(width*height*4); - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width,height, 0, gl.RGBA, gl.UNSIGNED_BYTE, tex); - - gl.bindFramebuffer(gl.FRAMEBUFFER, this.frameBuffer); - - gl.bindRenderbuffer(gl.RENDERBUFFER, this.renderBuffer); - //dpeth stencil doesn't seem to work in either webkit or mozilla so don't use for now - reflected particles will be messed up! - //gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL,width, height); - //gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, this.renderBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16,width, height); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.renderBuffer); - - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.glTexture, 0); - - gl.bindRenderbuffer(gl.RENDERBUFFER, null); - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.bindTexture(gl.TEXTURE_2D, null); -} - - - - -/** -* @class A texture to be included in a material -* @param {string} uid the unique id for this texture -* @see GLGE.Material -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -*/ -GLGE.TextureCube=function(uid){ - GLGE.Assets.registerAsset(this,uid); -} -GLGE.augment(GLGE.QuickNotation,GLGE.TextureCube); -GLGE.augment(GLGE.JSONLoader,GLGE.TextureCube); -GLGE.TextureCube.prototype.className="TextureCube"; -GLGE.TextureCube.prototype.posX=null; -GLGE.TextureCube.prototype.negX=null; -GLGE.TextureCube.prototype.posY=null; -GLGE.TextureCube.prototype.negY=null; -GLGE.TextureCube.prototype.posZ=null; -GLGE.TextureCube.prototype.negZ=null; -GLGE.TextureCube.prototype.texture=null; -GLGE.TextureCube.prototype.glTexture=null; -GLGE.TextureCube.prototype.loadState=0; -/** -* Sets the url for a given image -* @param {string} url the texture image url -* @param {string} image the image element to load -*/ -GLGE.TextureCube.prototype.setSrc=function(url,image,mask){ - this.url=url; - this.state=0; - this[image]=new Image(); - var texture=this; - this[image].onload = function(){ - texture.loadState+=mask; - } - this[image].src=url; - if(this.glTexture && this.gl) { - this.gl.deleteTexture(this.glTexture); - this.glTexture=null; - } - return this; -} - -/** -* Sets the positive X cube image -* @param {string} url the texture image url -*/ -GLGE.TextureCube.prototype.setSrcPosX=function(url){ - this.setSrc(url,"posX",1); - return this; -}; -/** -* Sets the negative X cube image -* @param {string} url the texture image url -*/ -GLGE.TextureCube.prototype.setSrcNegX=function(url){ - this.setSrc(url,"negX",2); - return this; -}; -/** -* Sets the positive Y cube image -* @param {string} url the texture image url -*/ -GLGE.TextureCube.prototype.setSrcPosY=function(url){ - this.setSrc(url,"posY",4); - return this; -}; -/** -* Sets the negative Y cube image -* @param {string} url the texture image url -*/ -GLGE.TextureCube.prototype.setSrcNegY=function(url){ - this.setSrc(url,"negY",8); - return this; -}; -/** -* Sets the positive Z cube image -* @param {string} url the texture image url -*/ -GLGE.TextureCube.prototype.setSrcPosZ=function(url){ - this.setSrc(url,"posZ",16); - return this; -}; -/** -* Sets the negative Z cube image -* @param {string} url the texture image url -*/ -GLGE.TextureCube.prototype.setSrcNegZ=function(url){ - this.setSrc(url,"negZ",32); - return this; -}; - -/** -* Sets the textures image location -* @private -**/ -GLGE.TextureCube.prototype.doTexture=function(gl){ - this.gl=gl; - //create the texture if it's not already created - if(!this.glTexture) this.glTexture=gl.createTexture(); - //if the image is loaded then set in the texture data - gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.glTexture); - if(this.loadState==63 && this.state==0){ - gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.posX); - gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.negX); - gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.posY); - gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.negY); - gl.texImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.posZ); - gl.texImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, this.negZ); - gl.generateMipmap(gl.TEXTURE_CUBE_MAP); - gl.bindTexture(gl.TEXTURE_CUBE_MAP, null); - this.state=1; - } - gl.bindTexture(gl.TEXTURE_CUBE_MAP, this.glTexture); - if(this.state==1) return true; - else return false; -} - - -/** -* @class The material layer describes how to apply this layer to the material -* @see GLGE.Material -* @augments GLGE.Animatable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -* @augments GLGE.Events -*/ -GLGE.MaterialLayer=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.blendMode=GLGE.BL_MIX; -}; -GLGE.augment(GLGE.Animatable,GLGE.MaterialLayer); -GLGE.augment(GLGE.QuickNotation,GLGE.MaterialLayer); -GLGE.augment(GLGE.JSONLoader,GLGE.MaterialLayer); -GLGE.augment(GLGE.Events,GLGE.MaterialLayer); -/** - * @name GLGE.MaterialLayer#shaderupdated - * @event Fires when a change will result in a change to the GLSL shader - * @param {object} data - */ - -GLGE.MaterialLayer.prototype.className="MaterialLayer"; -GLGE.MaterialLayer.prototype.texture=null; -GLGE.MaterialLayer.prototype.blendMode=null; -GLGE.MaterialLayer.prototype.mapto=GLGE.M_COLOR; -GLGE.MaterialLayer.prototype.mapinput=GLGE.UV1; -GLGE.MaterialLayer.prototype.scaleX=1; -GLGE.MaterialLayer.prototype.offsetX=0; -GLGE.MaterialLayer.prototype.rotX=0; -GLGE.MaterialLayer.prototype.scaleY=1; -GLGE.MaterialLayer.prototype.offsetY=0; -GLGE.MaterialLayer.prototype.rotY=0; -GLGE.MaterialLayer.prototype.scaleZ=1; -GLGE.MaterialLayer.prototype.offsetZ=0; -GLGE.MaterialLayer.prototype.rotZ=0; -GLGE.MaterialLayer.prototype.dScaleX=0; -GLGE.MaterialLayer.prototype.dOffsetX=0; -GLGE.MaterialLayer.prototype.dRotX=0; -GLGE.MaterialLayer.prototype.dScaleY=0; -GLGE.MaterialLayer.prototype.dOffsetY=0; -GLGE.MaterialLayer.prototype.dRotY=0; -GLGE.MaterialLayer.prototype.dScaleZ=0; -GLGE.MaterialLayer.prototype.dOffsetZ=0; -GLGE.MaterialLayer.prototype.dRotZ=0; -GLGE.MaterialLayer.prototype.alpha=1; -GLGE.MaterialLayer.prototype.height=0.05; -GLGE.MaterialLayer.prototype.matrix=null; - -/** -* Gets the textures used by the layer -* @return {GLGE.Texture} The current shininess of the material -*/ -GLGE.MaterialLayer.prototype.getMatrix=function(){ - if(!this.matrix){ - var offset=this.getOffset(); - var scale=this.getScale(); - var rotation=this.getRotation(); - this.matrix=GLGE.mulMat4(GLGE.mulMat4(GLGE.translateMatrix(offset.x,offset.y,offset.z),GLGE.scaleMatrix(scale.x,scale.y,scale.z)),GLGE.rotateMatrix(rotation.x,rotation.y,rotation.z)); - } - return this.matrix; -}; -/** -* Sets the height for this layer, currently only used for parallax mapping -* @param {number} the height of this layer -*/ -GLGE.MaterialLayer.prototype.setHeight=function(value){ - this.height=value; - return this; -}; -/** -* Gets the height for this layer, currently only used for parallax mapping -* @return {number} the height of this layer -*/ -GLGE.MaterialLayer.prototype.getHeight=function(){ - return this.height; -}; - -/** -* Sets the textures alpha blending value -* @param {number} the alpha for this layer -*/ -GLGE.MaterialLayer.prototype.setAlpha=function(value){ - this.alpha=value; - return this; -}; -/** -* Gets the textures alpha blending value -* @return {number} the alpha for this layer -*/ -GLGE.MaterialLayer.prototype.getAlpha=function(){ - return this.alpha; -}; - -/** -* Sets the textures used by the layer -* @param {GLGE.Texture} value the teture to associate with this layer -*/ -GLGE.MaterialLayer.prototype.setTexture=function(value){ - if(typeof value=="string") value=GLGE.Assets.get(value); - this.texture=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the textures used by the layer -* @return {GLGE.Texture} The current shininess of the material -*/ -GLGE.MaterialLayer.prototype.getTexture=function(){ - return this.texture; -}; -/** -* Sets the flag for how this layer maps to the material -* @param {Number} value the flags to set for this layer -*/ -GLGE.MaterialLayer.prototype.setMapto=function(value){ - this.mapto=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the flag representing the way the layer maps to the material -* @return {Number} The flags currently set for this layer -*/ -GLGE.MaterialLayer.prototype.getMapto=function(){ - return this.mapto; -}; -/** -* Sets the texture coordinate system -* @param {Number} value the mapping to use -*/ -GLGE.MaterialLayer.prototype.setMapinput=function(value){ - this.mapinput=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the texture coordinate system -* @return {Number} The current mapping -*/ -GLGE.MaterialLayer.prototype.getMapinput=function(){ - return this.mapinput; -}; - -/** -* Gets the layers texture offset -* @return {object} the current offset -*/ -GLGE.MaterialLayer.prototype.getOffset=function(){ - var offset={}; - offset.x=parseFloat(this.getOffsetX())+parseFloat(this.getDOffsetX()); - offset.y=parseFloat(this.getOffsetY())+parseFloat(this.getDOffsetY()); - offset.z=parseFloat(this.getOffsetZ())+parseFloat(this.getDOffsetZ()); - return offset; -}; - -/** -* Gets the layers texture rotation -* @return {object} the current rotation -*/ -GLGE.MaterialLayer.prototype.getRotation=function(){ - var rotation={}; - rotation.x=parseFloat(this.getRotX())+parseFloat(this.getDRotX()); - rotation.y=parseFloat(this.getRotY())+parseFloat(this.getDRotY()); - rotation.z=parseFloat(this.getRotZ())+parseFloat(this.getDRotZ()); - return rotation; -}; - -/** -* Gets the layers texture scale -* @return {object} the current scale -*/ -GLGE.MaterialLayer.prototype.getScale=function(){ - var scale={}; - scale.x=parseFloat(this.getScaleX())+parseFloat(this.getDScaleX()); - scale.y=parseFloat(this.getScaleY())+parseFloat(this.getDScaleY()); - scale.z=parseFloat(this.getScaleZ())+parseFloat(this.getDScaleZ()); - return scale; -}; - -/** -* Sets the layers texture X offset -* @param {Number} value the amount to offset the texture -*/ -GLGE.MaterialLayer.prototype.setOffsetX=function(value){ - this.matrix=null; - this.offsetX=value; - return this; -}; -/** -* Gets the layers texture X offset -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getOffsetX=function(){ - return this.offsetX; -}; -/** -* Sets the layers texture Y offset -* @param {Number} value the amount to offset the texture -*/ -GLGE.MaterialLayer.prototype.setOffsetY=function(value){ - this.matrix=null; - this.offsetY=value; - return this; -}; -/** -* Gets the layers texture Y offset -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getOffsetY=function(){ - return this.offsetY; -}; -/** -* Sets the layers texture Z offset -* @param {Number} value the amount to offset the texture -*/ -GLGE.MaterialLayer.prototype.setOffsetZ=function(value){ - this.matrix=null; - this.offsetZ=value; - return this; -}; -/** -* Gets the layers texture Z offset -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getOffsetZ=function(){ - return this.offsetZ; -}; -/** -* Sets the layers texture X displacment offset, useful for animation -* @param {Number} value the amount to offset the texture -*/ -GLGE.MaterialLayer.prototype.setDOffsetX=function(value){ - this.matrix=null; - this.dOffsetX=value; - return this; -}; -/** -* Gets the layers texture X displacment offset, useful for animation -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getDOffsetX=function(){ - return this.dOffsetX; -}; -/** -* Sets the layers texture Y displacment offset, useful for animation -* @param {Number} value the amount to offset the texture -*/ -GLGE.MaterialLayer.prototype.setDOffsetY=function(value){ - this.matrix=null; - this.dOffsetY=value; - return this; -}; -/** -* Gets the layers texture Y displacment offset, useful for animation -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getDOffsetY=function(){ - return this.dOffsetY; -}; -/** -* Sets the layers texture Z displacment offset, useful for animation -* @param {Number} value the amount to offset the texture -*/ -GLGE.MaterialLayer.prototype.setDOffsetZ=function(value){ - this.matrix=null; - this.dOffsetZ=value; - return this; -}; -/** -* Gets the layers texture X displacment offset, useful for animation -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getDOffsetZ=function(){ - return this.dOffsetZ; -}; -/** -* Sets the layers texture X scale -* @param {Number} value the amount to scale the texture -*/ -GLGE.MaterialLayer.prototype.setScaleX=function(value){ - this.matrix=null; - this.scaleX=value; - return this; -}; -/** -* Gets the layers texture X scale -* @return {Number} the current scale -*/ -GLGE.MaterialLayer.prototype.getScaleX=function(){ - return this.scaleX; -}; -/** -* Sets the layers texture Y scale -* @param {Number} value the amount to scale the texture -*/ -GLGE.MaterialLayer.prototype.setScaleY=function(value){ - this.matrix=null; - this.scaleY=value; - return this; -}; -/** -* Gets the layers texture Y scale -* @return {Number} the current scale -*/ -GLGE.MaterialLayer.prototype.getScaleY=function(){ - return this.scaleY; -}; -/** -* Sets the layers texture Z scale -* @param {Number} value the amount to scale the texture -*/ -GLGE.MaterialLayer.prototype.setScaleZ=function(value){ - this.matrix=null; - this.scaleZ=value; - return this; -}; -/** -* Gets the layers texture Z offset -* @return {Number} the current offset -*/ -GLGE.MaterialLayer.prototype.getScaleZ=function(){ - return this.scaleZ; -}; -/** -* Sets the layers texture X displacment scale, useful for animation -* @param {Number} value the amount to scale the texture -*/ -GLGE.MaterialLayer.prototype.setDScaleX=function(value){ - this.matrix=null; - this.dScaleX=value; - return this; -}; -/** -* Gets the layers texture X displacment scale, useful for animation -* @return {Number} the current scale -*/ -GLGE.MaterialLayer.prototype.getDScaleX=function(){ - return this.dScaleX; -}; -/** -* Sets the layers texture Y displacment scale, useful for animation -* @param {Number} value the amount to scale the texture -*/ -GLGE.MaterialLayer.prototype.setDScaleY=function(value){ - this.matrix=null; - this.dScaleY=value; - return this; -}; -/** -* Gets the layers texture Y displacment scale, useful for animation -* @return {Number} the current scale -*/ -GLGE.MaterialLayer.prototype.getDScaleY=function(){ - return this.dScaleY; -}; -/** -* Sets the layers texture Z displacment scale, useful for animation -* @param {Number} value the amount to scale the texture -*/ -GLGE.MaterialLayer.prototype.setDScaleZ=function(value){ - this.matrix=null; - this.dScaleZ=value; - return this; -}; -/** -* Gets the layers texture X displacment scale, useful for animation -* @return {Number} the current scale -*/ -GLGE.MaterialLayer.prototype.getDScaleZ=function(){ - return this.dScaleZ; -}; - - -/** -* Sets the layers texture X Rotation -* @param {Number} value the amount to roate the texture -*/ -GLGE.MaterialLayer.prototype.setRotX=function(value){ - this.matrix=null; - this.rotX=value; - return this; -}; -/** -* Gets the layers texture X rotate -* @return {Number} the current rotate -*/ -GLGE.MaterialLayer.prototype.getRotX=function(){ - return this.rotX; -}; -/** -* Sets the layers texture Y rotate -* @param {Number} value the amount to rotate the texture -*/ -GLGE.MaterialLayer.prototype.setRotY=function(value){ - this.matrix=null; - this.rotY=value; - return this; -}; -/** -* Gets the layers texture Y rotate -* @return {Number} the current rotate -*/ -GLGE.MaterialLayer.prototype.getRotY=function(){ - return this.rotY; -}; -/** -* Sets the layers texture Z rotate -* @param {Number} value the amount to rotate the texture -*/ -GLGE.MaterialLayer.prototype.setRotZ=function(value){ - this.matrix=null; - this.rotZ=value; - return this; -}; -/** -* Gets the layers texture Z rotate -* @return {Number} the current rotate -*/ -GLGE.MaterialLayer.prototype.getRotZ=function(){ - return this.rotZ; -}; -/** -* Sets the layers texture X displacment rotation, useful for animation -* @param {Number} value the amount to rotation the texture -*/ -GLGE.MaterialLayer.prototype.setDRotX=function(value){ - this.matrix=null; - this.dRotX=value; - return this; -}; -/** -* Gets the layers texture X displacment rotation, useful for animation -* @return {Number} the current rotation -*/ -GLGE.MaterialLayer.prototype.getDRotX=function(){ - return this.dRotX; -}; -/** -* Sets the layers texture Y displacment rotation, useful for animation -* @param {Number} value the amount to rotaion the texture -*/ -GLGE.MaterialLayer.prototype.setDRotY=function(value){ - this.matrix=null; - this.dRotY=value; - return this; -}; -/** -* Gets the layers texture Y displacment rotation, useful for animation -* @return {Number} the current rotation -*/ -GLGE.MaterialLayer.prototype.getDRotY=function(){ - return this.dRotY; -}; -/** -* Sets the layers texture Z displacment rotation, useful for animation -* @param {Number} value the amount to rotation the texture -*/ -GLGE.MaterialLayer.prototype.setDRotZ=function(value){ - this.matrix=null; - this.dRotZ=value; - return this; -}; -/** -* Gets the layers texture X displacment rotation, useful for animation -* @return {Number} the current rotation -*/ -GLGE.MaterialLayer.prototype.getDRotZ=function(){ - return this.dRotZ; -}; - -/** -* Sets the layers blending mode -* @param {Number} value the blend mode for the layer -*/ -GLGE.MaterialLayer.prototype.setBlendMode=function(value){ - this.blendMode=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the layers tblending mode -* @return {Number} the blend mode for the layer -*/ -GLGE.MaterialLayer.prototype.getBlendMode=function(){ - return this.blendMode; -}; - - - - -/** -* @class The Material class creates materials to be applied to objects in the graphics engine -* @see GLGE.Object -* @augments GLGE.Animatable -* @augments GLGE.QuickNotation -* @augments GLGE.JSONLoader -* @augments GLGE.Events -*/ -GLGE.Material=function(uid){ - GLGE.Assets.registerAsset(this,uid); - this.layers=[]; - this.layerlisteners=[]; - this.textures=[]; - this.lights=[]; - this.color={r:1,g:1,b:1,a:1}; - this.specColor={r:1,g:1,b:1}; - this.reflect=0.8; - this.shine=10; - this.specular=1; - this.emit=0; - this.alpha=1; -}; -GLGE.augment(GLGE.Animatable,GLGE.Material); -GLGE.augment(GLGE.QuickNotation,GLGE.Material); -GLGE.augment(GLGE.JSONLoader,GLGE.Material); -GLGE.augment(GLGE.Events,GLGE.Material); - - -/** - * @name GLGE.Material#shaderupdate - * @event fires when the shader for this material needs updating - * @param {object} data - */ - -/** -* @constant -* @description Flag for material colour -*/ -GLGE.M_COLOR=1; -/** -* @constant -* @description Flag for material normal -*/ -GLGE.M_NOR=2; -/** -* @constant -* @description Flag for material alpha -*/ -GLGE.M_ALPHA=4; -/** -* @constant -* @description Flag for material specular color -*/ -GLGE.M_SPECCOLOR=8; -/** -* @constant -* @description Flag for material specular cvalue -*/ -GLGE.M_SPECULAR=16; -/** -* @constant -* @description Flag for material shineiness -*/ -GLGE.M_SHINE=32; -/** -* @constant -* @description Flag for material reflectivity -*/ -GLGE.M_REFLECT=64; -/** -* @constant -* @description Flag for material emision -*/ -GLGE.M_EMIT=128; -/** -* @constant -* @description Flag for material alpha -*/ -GLGE.M_ALPHA=256; -/** -* @constant -* @description Flag for masking with textures red value -*/ -GLGE.M_MSKR=512; -/** -* @constant -* @description Flag for masking with textures green value -*/ -GLGE.M_MSKG=1024; -/** -* @constant -* @description Flag for masking with textures blue value -*/ -GLGE.M_MSKB=2048; -/** -* @constant -* @description Flag for masking with textures alpha value -*/ -GLGE.M_MSKA=4096; -/** -* @constant -* @description Flag for mapping of the height in parallax mapping -*/ -GLGE.M_HEIGHT=8192; - -/** -* @constant -* @description Enumeration for first UV layer -*/ -GLGE.UV1=0; -/** -* @constant -* @description Enumeration for second UV layer -*/ -GLGE.UV2=1; -/** -* @constant -* @description Enumeration for normal texture coords -*/ -GLGE.MAP_NORM=3; - -/** -* @constant -* @description Enumeration for object texture coords -*/ -GLGE.MAP_OBJ=4; - -/** -* @constant -* @description Enumeration for reflection coords -*/ -GLGE.MAP_REF=5; - -/** -* @constant -* @description Enumeration for environment coords -*/ -GLGE.MAP_ENV=6; - -/** -* @constant -* @description Enumeration for view coords -*/ -GLGE.MAP_VIEW=7; - -/** -* @constant -* @description Enumeration for mix blending mode -*/ -GLGE.BL_MIX=0; - -/** -* @constant -* @description Enumeration for mix blending mode -*/ -GLGE.BL_MUL=1; - -GLGE.Material.prototype.layers=null; -GLGE.Material.prototype.className="Material"; -GLGE.Material.prototype.textures=null; -GLGE.Material.prototype.color=null; -GLGE.Material.prototype.specColor=null; -GLGE.Material.prototype.specular=null; -GLGE.Material.prototype.emit=null; -GLGE.Material.prototype.shine=null; -GLGE.Material.prototype.reflect=null; -GLGE.Material.prototype.lights=null; -GLGE.Material.prototype.alpha=null; -GLGE.Material.prototype.shadow=true; -/** -* Sets the flag indicateing the material should or shouldn't recieve shadows -* @param {boolean} value The recieving shadow flag -*/ -GLGE.Material.prototype.setShadow=function(value){ - this.shadow=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* gets the show flag -* @returns {boolean} The shadow flag -*/ -GLGE.Material.prototype.getShadow=function(value){ - return this.shadow; -}; -/** -* Sets the base colour of the material -* @param {string} color The colour of the material -*/ -GLGE.Material.prototype.setColor=function(color){ - if(!color.r){ - color=GLGE.colorParse(color); - } - this.color={r:color.r,g:color.g,b:color.b}; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Sets the red base colour of the material -* @param {Number} r The new red level 0-1 -*/ -GLGE.Material.prototype.setColorR=function(value){ - this.color.r=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Sets the green base colour of the material -* @param {Number} g The new green level 0-1 -*/ -GLGE.Material.prototype.setColorG=function(value){ - this.color.g=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Sets the blue base colour of the material -* @param {Number} b The new blue level 0-1 -*/ -GLGE.Material.prototype.setColorB=function(value){ - this.color.b=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the current base color of the material -* @return {[r,g,b]} The current base color -*/ -GLGE.Material.prototype.getColor=function(){ - return this.color; -}; -/** -* Sets the base specular colour of the material -* @param {string} color The new specular colour -*/ -GLGE.Material.prototype.setSpecularColor=function(color){ - if(!color.r){ - color=GLGE.colorParse(color); - } - this.specColor={r:color.r,g:color.g,b:color.b}; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the current base specular color of the material -* @return {[r,g,b]} The current base specular color -*/ -GLGE.Material.prototype.getSpecularColor=function(){ - return this.specColor; -}; -/** -* Sets the alpha of the material -* @param {Number} value how much alpha -*/ -GLGE.Material.prototype.setAlpha=function(value){ - this.alpha=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the alpha of the material -* @return {Number} The current alpha of the material -*/ -GLGE.Material.prototype.getAlpha=function(){ - return this.alpha; -}; -/** -* Sets the specular of the material -* @param {Number} value how much specular -*/ -GLGE.Material.prototype.setSpecular=function(value){ - this.specular=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the specular of the material -* @return {Number} The current specular of the material -*/ -GLGE.Material.prototype.getSpecular=function(){ - return this.specular; -}; -/** -* Sets the shininess of the material -* @param {Number} value how much shine -*/ -GLGE.Material.prototype.setShininess=function(value){ - this.shine=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the shininess of the material -* @return {Number} The current shininess of the material -*/ -GLGE.Material.prototype.getShininess=function(){ - return this.shine; -}; -/** -* Sets how much the material should emit -* @param {Number} value how much to emit (0-1) -*/ -GLGE.Material.prototype.setEmit=function(value){ - this.emit=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the amount this material emits -* @return {Number} The emit value for the material -*/ -GLGE.Material.prototype.getEmit=function(){ - return this.emit; -}; -/** -* Sets reflectivity of the material -* @param {Number} value how much to reflect (0-1) -*/ -GLGE.Material.prototype.setReflectivity=function(value){ - this.reflect=value; - this.fireEvent("shaderupdate",{}); - return this; -}; -/** -* Gets the materials reflectivity -* @return {Number} The reflectivity of the material -*/ -GLGE.Material.prototype.getReflectivity=function(){ - return this.reflect; -}; - -/** -* Add a new layer to the material -* @param {MaterialLayer} layer The material layer to add to the material -*/ -GLGE.Material.prototype.addMaterialLayer=function(layer){ - if(typeof layer=="string") layer=GLGE.Assets.get(layer); - this.layers.push(layer); - var material=this; - var listener=function(event){ - material.fireEvent("shaderupdate",{}); - }; - this.layerlisteners.push(listener); - layer.addEventListener("shaderupdate",listener); - this.fireEvent("shaderupdate",{}); - return this; -}; - -/** -* Removes a layer from the material -* @param {MaterialLayer} layer The material layer to remove -*/ -GLGE.Material.prototype.removeMaterialLayer=function(layer){ - var idx=this.layers.indexOf(layer); - if(idx>=0){ - this.layers.splice(idx,1); - layer.removeEventListener("shaderupdate",this.layerlisteners[idx]); - this.layerlisteners.splice(idx,1); - this.fireEvent("shaderupdate",{}); - } - return this; -}; - -/** -* Gets all the materials layers -* @returns {GLGE.MaterialLayer[]} all of the layers contained within this material -*/ -GLGE.Material.prototype.getLayers=function(){ - return this.layers; -}; -/** -* Generate the code required to calculate the texture coords for each layer -* @private -*/ -GLGE.Material.prototype.getLayerCoords=function(){ - var shader=[]; - shader.push("vec4 texturePos;\n"); - for(i=0; i<this.layers.length;i++){ - shader.push("textureCoords"+i+"=vec3(0.0,0.0,0.0);\n"); - - if(this.layers[i].mapinput==GLGE.UV1 || this.layers[i].mapinput==GLGE.UV2){ - shader.push("texturePos=vec4(vec2(UVCoord["+(this.layers[i].mapinput*2)+"],(1.0-UVCoord["+(this.layers[i].mapinput*2+1)+"])),1.0,1.0);\n"); - } - - if(this.layers[i].mapinput==GLGE.MAP_NORM){ - shader.push("texturePos=vec4(normalize(n.xyz),1.0);\n"); - } - if(this.layers[i].mapinput==GLGE.MAP_OBJ){ - shader.push("texturePos=vec4(normalize(OBJCoord.xyz),1.0);\n"); - } - - if(this.layers[i].mapinput==GLGE.MAP_REF){ - //will need to do in fragment to take the normal maps into account! - shader.push("texturePos=vec4(reflect(normalize(eyevec.xyz),normalize(n.xyz)),1.0);\n"); - } - - - - if(this.layers[i].mapinput==GLGE.MAP_ENV){ - //will need to do in fragment to take the normal maps into account! - shader.push("texturePos=envMat * vec4(reflect(normalize(eyevec.xyz),normalize(n.xyz)),1.0);\n"); - } - - shader.push("textureCoords"+i+"=(layer"+i+"Matrix * texturePos).xyz;\n"); - - } - - return shader.join(""); -} -/** -* Generate the fragment shader program for this material -* @private -*/ -GLGE.Material.prototype.getVertexVarying=function(){ - var shader=[]; - for(i=0; i<this.layers.length;i++){ - shader.push("uniform mat4 layer"+i+"Matrix;\n"); - shader.push("varying vec3 textureCoords"+i+";\n"); - } - return shader.join(""); -} - -GLGE.Material.prototype.registerPasses=function(gl,object){ - for(var i=0; i<this.textures.length;i++){ - if(this.textures[i].registerPasses) this.textures[i].registerPasses(gl,object); - } -} - -/** -* Generate the fragment shader program for this material -* @private -*/ -GLGE.Material.prototype.getFragmentShader=function(lights){ - var shader="#ifdef GL_ES\nprecision mediump float;\n#endif\n"; - var tangent=false; - for(var i=0; i<lights.length;i++){ - if(lights[i].type==GLGE.L_POINT || lights[i].type==GLGE.L_SPOT || lights[i].type==GLGE.L_DIR){ - shader=shader+"varying vec3 lightvec"+i+";\n"; - shader=shader+"varying vec3 tlightvec"+i+";\n"; - shader=shader+"varying vec3 lightpos"+i+";\n"; - shader=shader+"varying vec3 tlightdir"+i+";\n"; - shader=shader+"varying float lightdist"+i+";\n"; - shader=shader+"varying vec2 spotCoords"+i+";\n"; - } - } - shader=shader+"varying vec3 n;\n"; - shader=shader+"varying vec3 b;\n"; - shader=shader+"varying vec3 t;\n"; - shader=shader+"varying vec4 UVCoord;\n"; - shader=shader+"varying vec3 eyevec;\n"; - shader=shader+"varying vec3 OBJCoord;\n"; - shader=shader+"varying vec3 teyevec;\n"; - - //texture uniforms - for(var i=0; i<this.textures.length;i++){ - if(this.textures[i].className=="Texture") shader=shader+"uniform sampler2D TEXTURE"+i+";\n"; - if(this.textures[i].className=="TextureCanvas") shader=shader+"uniform sampler2D TEXTURE"+i+";\n"; - if(this.textures[i].className=="TextureVideo") shader=shader+"uniform sampler2D TEXTURE"+i+";\n"; - if(this.textures[i].className=="TextureCube") shader=shader+"uniform samplerCube TEXTURE"+i+";\n"; - } - - var cnt=0; - var shadowlights=[]; - var num; - for(var i=0; i<lights.length;i++){ - shader=shader+"uniform vec3 lightcolor"+i+";\n"; - shader=shader+"uniform vec3 lightAttenuation"+i+";\n"; - shader=shader+"uniform float spotCosCutOff"+i+";\n"; - shader=shader+"uniform float spotExp"+i+";\n"; - shader=shader+"uniform vec3 lightdir"+i+";\n"; - shader=shader+"uniform mat4 lightmat"+i+";\n"; - shader=shader+"uniform float shadowbias"+i+";\n"; - shader=shader+"uniform int shadowsamples"+i+";\n"; - shader=shader+"uniform float shadowsoftness"+i+";\n"; - shader=shader+"uniform bool castshadows"+i+";\n"; - shader=shader+"varying vec4 spotcoord"+i+";\n"; - if(lights[i].getCastShadows() && this.shadow){ - num=this.textures.length+(cnt++); - shader=shader+"uniform sampler2D TEXTURE"+num+";\n"; - shadowlights[i]=num; - } - } - for(i=0; i<this.layers.length;i++){ - shader=shader+"varying vec3 textureCoords"+i+";\n"; - shader=shader+"uniform float layeralpha"+i+";\n"; - if((this.layers[i].mapto & GLGE.M_HEIGHT) == GLGE.M_HEIGHT){ - shader=shader+"uniform float layerheight"+i+";\n"; - } - } - - shader=shader+"uniform vec4 baseColor;\n"; - shader=shader+"uniform vec3 specColor;\n"; - shader=shader+"uniform float shine;\n"; - shader=shader+"uniform float specular;\n"; - shader=shader+"uniform float reflective;\n"; - shader=shader+"uniform float emit;\n"; - shader=shader+"uniform float alpha;\n"; - shader=shader+"uniform vec3 amb;\n"; - shader=shader+"uniform float fognear;\n"; - shader=shader+"uniform float fogfar;\n"; - shader=shader+"uniform int fogtype;\n"; - shader=shader+"uniform vec3 fogcolor;\n"; - shader=shader+"uniform float far;\n"; - shader=shader+"uniform mat4 worldInverseTranspose;\n"; - shader=shader+"uniform mat4 projection;\n"; - - shader=shader+"void main(void)\n"; - shader=shader+"{\n"; - shader=shader+"float att;\n"; - shader=shader+"int texture;\n"; - shader=shader+"float mask=1.0;\n"; - shader=shader+"float spec=specular;\n"; - shader=shader+"vec3 specC=specColor;\n"; - shader=shader+"vec4 view;\n"; - shader=shader+"vec3 textureCoords=vec3(0.0,0.0,0.0);\n"; - shader=shader+"float ref=reflective;\n"; - shader=shader+"float sh=shine;\n"; - shader=shader+"float em=emit;\n"; - shader=shader+"float al=alpha;\n"; - shader=shader+"vec4 normalmap= vec4(n,0.0);\n" - shader=shader+"vec4 color = baseColor;"; //set the initial color - shader=shader+"float pheight=0.0;\n" - shader=shader+"vec3 textureHeight=vec3(0.0,0.0,0.0);\n"; - for(i=0; i<this.layers.length;i++){ - shader=shader+"textureCoords=textureCoords"+i+"+textureHeight;\n"; - shader=shader+"mask=layeralpha"+i+"*mask;\n"; - - if(this.layers[i].mapinput==GLGE.MAP_VIEW){ - //will need to do in fragment to take the normal maps into account! - shader=shader+"view=projection * vec4(-eyevec,1.0);\n"; - shader=shader+"textureCoords=view.xyz/view.w*0.5+0.5;\n"; - shader=shader+"textureCoords=textureCoords+textureHeight;\n"; - } - - if(this.layers[i].getTexture().className=="Texture" || this.layers[i].getTexture().className=="TextureCanvas" || this.layers[i].getTexture().className=="TextureVideo" ){ - var txcoord="xy"; - var sampletype="2D"; - }else{ - var txcoord="xyz"; - var sampletype="Cube"; - } - - if((this.layers[i].mapto & GLGE.M_COLOR) == GLGE.M_COLOR){ - if(this.layers[i].blendMode==GLGE.BL_MUL){ - shader=shader+"color = color*(1.0-mask) + color*texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+")*mask;\n"; - } - else - { - shader=shader+"color = color*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+")*mask;\n"; - } - } - - if((this.layers[i].mapto & GLGE.M_HEIGHT) == GLGE.M_HEIGHT){ - //do paralax stuff - shader=shader+"pheight = texture2D(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").x;\n"; - shader=shader+"textureHeight =vec3((layerheight"+i+"* (pheight-0.5) * normalize(teyevec).xy*vec2(1.0,-1.0)),0.0);\n"; - } - if((this.layers[i].mapto & GLGE.M_SPECCOLOR) == GLGE.M_SPECCOLOR){ - shader=shader+"specC = specC*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").rgb*mask;\n"; - } - if((this.layers[i].mapto & GLGE.M_MSKR) == GLGE.M_MSKR){ - shader=shader+"mask = texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").r;\n"; - } - if((this.layers[i].mapto & GLGE.M_MSKG) == GLGE.M_MSKG){ - shader=shader+"mask = texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").g;\n"; - } - if((this.layers[i].mapto & GLGE.M_MSKB) == GLGE.M_MSKB){ - shader=shader+"mask = texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").b;\n"; - } - if((this.layers[i].mapto & GLGE.M_MSKA) == GLGE.M_MSKA){ - shader=shader+"mask = texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").a;\n"; - } - if((this.layers[i].mapto & GLGE.M_SPECULAR) == GLGE.M_SPECULAR){ - shader=shader+"spec = spec*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").r*mask;\n"; - } - if((this.layers[i].mapto & GLGE.M_REFLECT) == GLGE.M_REFLECT){ - shader=shader+"ref = ref*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").g*mask;\n"; - } - if((this.layers[i].mapto & GLGE.M_SHINE) == GLGE.M_SHINE){ - shader=shader+"sh = sh*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").b*mask*255.0;\n"; - } - if((this.layers[i].mapto & GLGE.M_EMIT) == GLGE.M_EMIT){ - shader=shader+"em = em*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").r*mask;\n"; - } - if((this.layers[i].mapto & GLGE.M_NOR) == GLGE.M_NOR){ - shader=shader+"normalmap = normalmap*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+")*mask;\n"; - tangent=true; - } - if((this.layers[i].mapto & GLGE.M_ALPHA) == GLGE.M_ALPHA){ - shader=shader+"al = al*(1.0-mask) + texture"+sampletype+"(TEXTURE"+this.layers[i].texture.idx+", textureCoords."+txcoord+").a*mask;\n"; - } - } - if(tangent){ - shader=shader+"vec3 normal = normalize(normalmap.rgb)*2.0-1.0;\n"; - }else{ - shader=shader+"vec3 normal = normalize(n);\n"; - } - - shader=shader+"vec3 lightvalue=amb;\n"; - shader=shader+"vec3 specvalue=vec3(0.0,0.0,0.0);\n"; - shader=shader+"float dotN,spotEffect;"; - shader=shader+"vec3 lightvec=vec3(0.0,0.0,0.0);"; - shader=shader+"vec3 viewvec=vec3(0.0,0.0,0.0);"; - shader=shader+"float spotmul=0.0;"; - shader=shader+"float spotsampleX=0.0;"; - shader=shader+"float spotsampleY=0.0;"; - shader=shader+"float totalweight=0.0;"; - shader=shader+"int cnt=0;"; - shader=shader+"vec2 spotoffset=vec2(0.0,0.0);"; - for(var i=0; i<lights.length;i++){ - - if(tangent){ - shader=shader+"lightvec=tlightvec"+i+"*vec3(-1.0,-1.0,1.0);\n"; - shader=shader+"normal.z=(normal.z+1.0)/2.0;\n"; - shader=shader+"viewvec=teyevec*vec3(-1.0,-1.0,1.0);\n"; - }else{ - shader=shader+"lightvec=lightvec"+i+";\n"; - shader=shader+"viewvec=eyevec;\n"; - } - - if(lights[i].type==GLGE.L_POINT){ - shader=shader+"dotN=max(dot(normal,normalize(-lightvec)),0.0);\n"; - shader=shader+"if(dotN>0.0){\n"; - shader=shader+"att = 1.0 / (lightAttenuation"+i+"[0] + lightAttenuation"+i+"[1] * lightdist"+i+" + lightAttenuation"+i+"[2] * lightdist"+i+" * lightdist"+i+");\n"; - if(lights[i].diffuse){ - shader=shader+"lightvalue += att * dotN * lightcolor"+i+";\n"; - } - if(lights[i].specular){ - shader=shader+"specvalue += att * specC * lightcolor"+i+" * spec * pow(max(dot(reflect(normalize(lightvec), normal),normalize(viewvec)),0.0), sh);\n"; - } - - shader=shader+"}\n"; - - - } - shader=shader+"spotEffect = 0.0;\n"; - if(lights[i].type==GLGE.L_SPOT){ - shader=shader+"spotEffect = dot(normalize(lightdir"+i+"), normalize(-lightvec"+i+"));"; - shader=shader+"if (spotEffect > spotCosCutOff"+i+") {\n"; - shader=shader+"spotEffect = pow(spotEffect, spotExp"+i+");"; - //spot shadow stuff - if(lights[i].getCastShadows() && this.shadow){ - shader=shader+"if(castshadows"+i+"){\n"; - shader=shader+"vec4 dist=texture2D(TEXTURE"+shadowlights[i]+", (((spotcoord"+i+".xy)/spotcoord"+i+".w)+1.0)/2.0);\n"; - shader=shader+"float depth = dot(dist, vec4(0.000000059604644775390625,0.0000152587890625,0.00390625,1.0))*10000.0;\n"; - shader=shader+"spotmul=0.0;\n"; - shader=shader+"totalweight=0.0;\n"; - shader=shader+"if((depth+shadowbias"+i+"-length(lightvec"+i+"))<0.0) {spotmul=1.0; totalweight=1.0;}\n"; - shader=shader+"if(shadowsamples"+i+">0){\n"; - shader=shader+"for(cnt=0; cnt<4; cnt++){;\n"; - shader=shader+"spotsampleX=-0.707106781;spotsampleY=-0.707106781;\n"; - shader=shader+"if(cnt==0 || cnt==3) spotsampleX=0.707106781;\n"; - shader=shader+"if(cnt==1 || cnt==3) spotsampleY=0.707106781;\n"; - shader=shader+"spotoffset=vec2(spotsampleX,spotsampleY)*0.5;\n"; - shader=shader+"dist=texture2D(TEXTURE"+shadowlights[i]+", (((spotcoord"+i+".xy)/spotcoord"+i+".w)+1.0)/2.0+spotoffset*shadowsoftness"+i+");\n"; - shader=shader+"depth = dot(dist, vec4(0.000000059604644775390625,0.0000152587890625,0.00390625,1.0))*100.0;\n"; - shader=shader+"if((depth+shadowbias"+i+"-length(lightvec"+i+"))<0.0){\n"; - shader=shader+"spotmul+=length(spotoffset);\n"; - shader=shader+"}\n"; - shader=shader+"totalweight+=length(spotoffset);\n"; - shader=shader+"};\n"; - shader=shader+"};\n"; - shader=shader+"if(totalweight!=spotmul){\n"; - shader=shader+"spotmul=0.0;\n"; - shader=shader+"totalweight=0.0;\n"; - shader=shader+"for(cnt=0; cnt<shadowsamples"+i+"*2; cnt++){;\n"; - shader=shader+"spotsampleX=(fract(sin(dot(spotcoord"+i+".xy + vec2(float(cnt)),vec2(12.9898,78.233))) * 43758.5453)-0.5)*2.0;\n"; //generate random number - shader=shader+"spotsampleY=(fract(sin(dot(spotcoord"+i+".yz + vec2(float(cnt)),vec2(12.9898,78.233))) * 43758.5453)-0.5)*2.0;\n"; //generate random number - shader=shader+"spotoffset=vec2(spotsampleX,spotsampleY);\n"; - shader=shader+"dist=texture2D(TEXTURE"+shadowlights[i]+", (((spotcoord"+i+".xy)/spotcoord"+i+".w)+1.0)/2.0+spotoffset*shadowsoftness"+i+");\n"; - shader=shader+"depth = dot(dist, vec4(0.000000059604644775390625,0.0000152587890625,0.00390625,1.0))*100.0;\n"; - shader=shader+"if((depth+shadowbias"+i+"-length(lightvec"+i+"))<0.0){\n"; - shader=shader+"spotmul+=length(spotoffset);\n"; - shader=shader+"}\n"; - shader=shader+"totalweight+=length(spotoffset);\n"; - shader=shader+"};\n"; - shader=shader+"}\n"; - - shader=shader+"if(totalweight>0.0) spotEffect=spotEffect*pow(1.0-spotmul/totalweight,3.0);\n"; - shader=shader+"}"; - } - - - shader=shader+"dotN=max(dot(normal,normalize(-lightvec)),0.0);\n"; - shader=shader+"if(dotN>0.0){\n"; - shader=shader+"att = spotEffect / (lightAttenuation"+i+"[0] + lightAttenuation"+i+"[1] * lightdist"+i+" + lightAttenuation"+i+"[2] * lightdist"+i+" * lightdist"+i+");\n"; - if(lights[i].diffuse){ - shader=shader+"lightvalue += att * dotN * lightcolor"+i+";\n"; - } - if(lights[i].specular){ - shader=shader+"specvalue += att * specC * lightcolor"+i+" * spec * pow(max(dot(reflect(normalize(lightvec), normal),normalize(viewvec)),0.0), sh);\n"; - } - shader=shader+"}\n}\n"; - } - if(lights[i].type==GLGE.L_DIR){ - shader=shader+"dotN=max(dot(normal,-normalize(lightvec)),0.0);\n"; - shader=shader+"if(dotN>0.0){\n"; - if(lights[i].diffuse){ - shader=shader+"lightvalue += dotN * lightcolor"+i+";\n"; - } - if(lights[i].specular){ - shader=shader+"specvalue += specC * lightcolor"+i+" * spec * pow(max(dot(reflect(normalize(lightvec), normal),normalize(viewvec)),0.0), sh);\n"; - } - shader=shader+"}\n"; - } - } - shader=shader+"float fogfact=1.0;"; - shader=shader+"if(fogtype=="+GLGE.FOG_QUADRATIC+") fogfact=clamp(pow(max((fogfar - length(eyevec)) / (fogfar - fognear),0.0),2.0),0.0,1.0);\n"; - shader=shader+"if(fogtype=="+GLGE.FOG_LINEAR+") fogfact=clamp((fogfar - length(eyevec)) / (fogfar - fognear),0.0,1.0);\n"; - - shader=shader+"lightvalue = (lightvalue)*ref;\n"; - shader=shader+"if(em>0.0){lightvalue=vec3(1.0,1.0,1.0); fogfact=1.0;}\n"; - shader=shader+"gl_FragColor =vec4(specvalue.rgb+color.rgb*(em+1.0)*lightvalue.rgb,al)*fogfact+vec4(fogcolor,al)*(1.0-fogfact);\n"; - //shader=shader+"gl_FragColor =texture2D(TEXTURE"+shadowlights[0]+", (((spotcoord0.xy)/spotcoord"+i+".w)+1.0)/2.0+textureHeight);\n"; - - shader=shader+"}\n"; - return shader; -}; -/** -* Set the uniforms needed to render this material -* @private -*/ -GLGE.Material.prototype.textureUniforms=function(gl,shaderProgram,lights,object){ - if(this.animation) this.animate(); - if(shaderProgram.caches.baseColor!=this.color){ - gl.uniform4f(GLGE.getUniformLocation(gl,shaderProgram, "baseColor"), this.color.r,this.color.g,this.color.b,this.color.a); - shaderProgram.caches.baseColor=this.color; - } - if(shaderProgram.caches.specColor!=this.specColor){ - gl.uniform3f(GLGE.getUniformLocation(gl,shaderProgram, "specColor"), this.specColor.r,this.specColor.g,this.specColor.b); - shaderProgram.caches.specColor=this.specColor; - } - if(shaderProgram.caches.specular!=this.specular){ - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "specular"), this.specular); - shaderProgram.caches.specular=this.specular; - } - if(shaderProgram.caches.shine!=this.shine){ - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "shine"), this.shine); - shaderProgram.caches.shine=this.shine; - } - if(shaderProgram.caches.reflect!=this.reflect){ - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "reflective"), this.reflect); - shaderProgram.caches.reflect=this.reflect; - } - if(shaderProgram.caches.emit!=this.emit){ - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "emit"), this.emit); - shaderProgram.caches.emit=this.emit; - } - if(shaderProgram.caches.alpha!=this.alpha){ - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "alpha"), this.alpha); - shaderProgram.caches.alpha=this.alpha; - } - - var cnt=0; - var num=0; - for(var i=0; i<lights.length;i++){ - gl.uniform3f(GLGE.getUniformLocation(gl,shaderProgram, "lightcolor"+i), lights[i].color.r,lights[i].color.g,lights[i].color.b); - gl.uniform3f(GLGE.getUniformLocation(gl,shaderProgram, "lightAttenuation"+i), lights[i].constantAttenuation,lights[i].linearAttenuation,lights[i].quadraticAttenuation); - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "spotCosCutOff"+i), lights[i].spotCosCutOff); - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "spotExp"+i), lights[i].spotExponent); - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "shadowbias"+i), lights[i].shadowBias); - gl.uniform1i(GLGE.getUniformLocation(gl,shaderProgram, "castshadows"+i), lights[i].castShadows); - gl.uniform1i(GLGE.getUniformLocation(gl,shaderProgram, "shadowsamples"+i), lights[i].samples); - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "shadowsoftness"+i), lights[i].softness); - - //shadow code - if(lights[i].getCastShadows() && this.shadow && this.emit==0) { - num=this.textures.length+(cnt++); - gl.activeTexture(gl["TEXTURE"+num]); - gl.bindTexture(gl.TEXTURE_2D, lights[i].texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); - gl.generateMipmap(gl.TEXTURE_2D); - - gl.uniform1i(GLGE.getUniformLocation(gl,shaderProgram, "TEXTURE"+num), num); - } - - - } - - if(!shaderProgram.glarrays.layermat) shaderProgram.glarrays.layermat=[]; - - - - var scale,offset; - for(i=0; i<this.layers.length;i++){ - if(this.layers[i].animation) this.layers[i].animate(); - scale=this.layers[i].getScale(); - offset=this.layers[i].getOffset(); - if(!shaderProgram.glarrays.layermat[i]) shaderProgram.glarrays.layermat[i]=new Float32Array(this.layers[i].getMatrix()); - else GLGE.mat4gl(this.layers[i].getMatrix(),shaderProgram.glarrays.layermat[i]); - - try{gl.uniformMatrix4fv(GLGE.getUniformLocation(gl,shaderProgram, "layer"+i+"Matrix"), true, shaderProgram.glarrays.layermat[i]);}catch(e){} - - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "layeralpha"+i), this.layers[i].getAlpha()); - gl.uniform1f(GLGE.getUniformLocation(gl,shaderProgram, "layerheight"+i), this.layers[i].getHeight()); - } - - for(var i=0; i<this.textures.length;i++){ - - gl.activeTexture(gl["TEXTURE"+i]); - if(this.textures[i].doTexture(gl,object)){ - } - gl.uniform1i(GLGE.getUniformLocation(gl,shaderProgram, "TEXTURE"+i), i); - } - -}; -/** -* Adds a new texture to this material -* @param {String} image URL of the image to be used by the texture -* @return {Number} index of the new texture -*/ -GLGE.Material.prototype.addTexture=function(texture){ - if(typeof texture=="string") texture=GLGE.Assets.get(texture); - this.textures.push(texture); - texture.idx=this.textures.length-1; - this.fireEvent("shaderupdate",{}); - return this; -}; -GLGE.Material.prototype.addTextureCube=GLGE.Material.prototype.addTexture; -GLGE.Material.prototype.addTextureCamera=GLGE.Material.prototype.addTexture; -GLGE.Material.prototype.addTextureCanvas=GLGE.Material.prototype.addTexture; -GLGE.Material.prototype.addTextureVideo=GLGE.Material.prototype.addTexture; - - - - -/** -* Closure Export -*/ -function closure_export(){ -if(GLGE.Message){ - GLGE["Message"]=GLGE.Message; - GLGE.Message["parseMessage"]=GLGE.Message.parseMessage; -} - -if(GLGE.Document){ - GLGE["Document"]=GLGE.Document - GLGE.Document.prototype["getElementById"]=GLGE.Document.prototype.getElementById; - GLGE.Document.prototype["getElement"]=GLGE.Document.prototype.getElement; - GLGE.Document.prototype["load"]=GLGE.Document.prototype.load; - GLGE.Document.prototype["loadDocument"]=GLGE.Document.prototype.loadDocument; - GLGE.Document.prototype["onLoad"]=GLGE.Document.prototype.onLoad; - GLGE.Document.prototype["addLoadListener"]=GLGE.Document.prototype.addLoadListener; - GLGE.Document.prototype["removeLoadListener"]=GLGE.Document.prototype.removeLoadListener; -} - - -if(GLGE.Placeable){ - GLGE["Placeable"]=GLGE.Placeable; - GLGE.Placeable.prototype["getRoot"]=GLGE.Placeable.prototype.getRoot; - GLGE.Placeable.prototype["getRef"]=GLGE.Placeable.prototype.getRef; - GLGE.Placeable.prototype["setId"]=GLGE.Placeable.prototype.setId; - GLGE.Placeable.prototype["getId"]=GLGE.Placeable.prototype.getId; - GLGE.Placeable.prototype["getLookat"]=GLGE.Placeable.prototype.getLookat; - GLGE.Placeable.prototype["setLookat"]=GLGE.Placeable.prototype.setLookat; - GLGE.Placeable.prototype["Lookat"]=GLGE.Placeable.prototype.Lookat; - GLGE.Placeable.prototype["getRotOrder"]=GLGE.Placeable.prototype.getRotOrder; - GLGE.Placeable.prototype["setRotOrder"]=GLGE.Placeable.prototype.setRotOrder; - GLGE.Placeable.prototype["getRotMatrix"]=GLGE.Placeable.prototype.getRotMatrix; - GLGE.Placeable.prototype["setRotMatrix"]=GLGE.Placeable.prototype.setRotMatrix; - GLGE.Placeable.prototype["setLocX"]=GLGE.Placeable.prototype.setLocX; - GLGE.Placeable.prototype["setLocY"]=GLGE.Placeable.prototype.setLocY; - GLGE.Placeable.prototype["setLocZ"]=GLGE.Placeable.prototype.setLocZ; - GLGE.Placeable.prototype["setLoc"]=GLGE.Placeable.prototype.setLoc; - GLGE.Placeable.prototype["setDLocX"]=GLGE.Placeable.prototype.setDLocX; - GLGE.Placeable.prototype["setDLocY"]=GLGE.Placeable.prototype.setDLocY; - GLGE.Placeable.prototype["setDLocZ"]=GLGE.Placeable.prototype.setDLocZ; - GLGE.Placeable.prototype["setDLoc"]=GLGE.Placeable.prototype.setDLoc; - GLGE.Placeable.prototype["setQuatX"]=GLGE.Placeable.prototype.setQuatX; - GLGE.Placeable.prototype["setQuatY"]=GLGE.Placeable.prototype.setQuatY; - GLGE.Placeable.prototype["setQuatZ"]=GLGE.Placeable.prototype.setQuatZ; - GLGE.Placeable.prototype["setQuatW"]=GLGE.Placeable.prototype.setQuatW; - GLGE.Placeable.prototype["setQuat"]=GLGE.Placeable.prototype.setQuat; - GLGE.Placeable.prototype["setRotX"]=GLGE.Placeable.prototype.setRotX; - GLGE.Placeable.prototype["setRotY"]=GLGE.Placeable.prototype.setRotY; - GLGE.Placeable.prototype["setRotZ"]=GLGE.Placeable.prototype.setRotZ; - GLGE.Placeable.prototype["setRot"]=GLGE.Placeable.prototype.setRot; - GLGE.Placeable.prototype["setDRotX"]=GLGE.Placeable.prototype.setDRotX; - GLGE.Placeable.prototype["setDRotY"]=GLGE.Placeable.prototype.setDRotY; - GLGE.Placeable.prototype["setDRotZ"]=GLGE.Placeable.prototype.setDRotZ; - GLGE.Placeable.prototype["setDRot"]=GLGE.Placeable.prototype.setDRot; - GLGE.Placeable.prototype["setScaleX"]=GLGE.Placeable.prototype.setScaleX; - GLGE.Placeable.prototype["setScaleY"]=GLGE.Placeable.prototype.setScaleY; - GLGE.Placeable.prototype["setScaleZ"]=GLGE.Placeable.prototype.setScaleZ; - GLGE.Placeable.prototype["setScale"]=GLGE.Placeable.prototype.setScale; - GLGE.Placeable.prototype["setDScaleX"]=GLGE.Placeable.prototype.setDScaleX; - GLGE.Placeable.prototype["setDScaleY"]=GLGE.Placeable.prototype.setDScaleY; - GLGE.Placeable.prototype["setDScaleZ"]=GLGE.Placeable.prototype.setDScaleZ; - GLGE.Placeable.prototype["setDScale"]=GLGE.Placeable.prototype.setDScale; - GLGE.Placeable.prototype["getLocX"]=GLGE.Placeable.prototype.getLocX; - GLGE.Placeable.prototype["getLocY"]=GLGE.Placeable.prototype.getLocY; - GLGE.Placeable.prototype["getLocZ"]=GLGE.Placeable.prototype.getLocZ; - GLGE.Placeable.prototype["getDLocX"]=GLGE.Placeable.prototype.getDLocX; - GLGE.Placeable.prototype["getDLocY"]=GLGE.Placeable.prototype.getDLocY; - GLGE.Placeable.prototype["getDLocZ"]=GLGE.Placeable.prototype.getDLocZ; - GLGE.Placeable.prototype["getQuatX"]=GLGE.Placeable.prototype.getQuatX; - GLGE.Placeable.prototype["getQuatY"]=GLGE.Placeable.prototype.getQuatY; - GLGE.Placeable.prototype["getQuatZ"]=GLGE.Placeable.prototype.getQuatZ; - GLGE.Placeable.prototype["getQuatW"]=GLGE.Placeable.prototype.getQuatW; - GLGE.Placeable.prototype["getRotX"]=GLGE.Placeable.prototype.getRotX; - GLGE.Placeable.prototype["getRotY"]=GLGE.Placeable.prototype.getRotY; - GLGE.Placeable.prototype["getRotZ"]=GLGE.Placeable.prototype.getRotZ; - GLGE.Placeable.prototype["getDRotX"]=GLGE.Placeable.prototype.getDRotX; - GLGE.Placeable.prototype["getDRotY"]=GLGE.Placeable.prototype.getDRotY; - GLGE.Placeable.prototype["getDRotZ"]=GLGE.Placeable.prototype.getDRotZ; - GLGE.Placeable.prototype["getScaleX"]=GLGE.Placeable.prototype.getScaleX; - GLGE.Placeable.prototype["getScaleY"]=GLGE.Placeable.prototype.getScaleY; - GLGE.Placeable.prototype["getScaleZ"]=GLGE.Placeable.prototype.getScaleZ; - GLGE.Placeable.prototype["getDScaleX"]=GLGE.Placeable.prototype.getDScaleX; - GLGE.Placeable.prototype["getDScaleY"]=GLGE.Placeable.prototype.getDScaleY; - GLGE.Placeable.prototype["getDScaleZ"]=GLGE.Placeable.prototype.getDScaleZ; - GLGE.Placeable.prototype["getPosition"]=GLGE.Placeable.prototype.getPosition; - GLGE.Placeable.prototype["getRotation"]=GLGE.Placeable.prototype.getRotation; - GLGE.Placeable.prototype["getScale"]=GLGE.Placeable.prototype.getScale; - GLGE.Placeable.prototype["getModelMatrix"]=GLGE.Placeable.prototype.getModelMatrix; -} - -if(GLGE.Animatable){ - GLGE["Animatable"]=GLGE.Animatable; - GLGE.Animatable.prototype["animationStart"]=GLGE.Animatable.prototype.animationStart; - GLGE.Animatable.prototype["animate"]=GLGE.Animatable.prototype.animate; - GLGE.Animatable.prototype["setAnimation"]=GLGE.Animatable.prototype.setAnimation; - GLGE.Animatable.prototype["getAnimation"]=GLGE.Animatable.prototype.getAnimation; - GLGE.Animatable.prototype["setFrameRate"]=GLGE.Animatable.prototype.setFrameRate; - GLGE.Animatable.prototype["getFrameRate"]=GLGE.Animatable.prototype.getFrameRate; - GLGE.Animatable.prototype["setLoop"]=GLGE.Animatable.prototype.setLoop; - GLGE.Animatable.prototype["getLoop"]=GLGE.Animatable.prototype.getLoop; - GLGE.Animatable.prototype["isLooping"]=GLGE.Animatable.prototype.isLooping; - GLGE.Animatable.prototype["setPaused"]=GLGE.Animatable.prototype.setPaused; - GLGE.Animatable.prototype["getPaused"]=GLGE.Animatable.prototype.getPaused; - GLGE.Animatable.prototype["togglePaused"]=GLGE.Animatable.prototype.togglePaused; -} - -if(GLGE.BezTriple){ - GLGE["BezTriple"]=GLGE.BezTriple; - GLGE.BezTriple.prototype["className"]=GLGE.BezTriple.prototype.className; - GLGE.BezTriple.prototype["setX1"]=GLGE.BezTriple.prototype.setX1; - GLGE.BezTriple.prototype["setY1"]=GLGE.BezTriple.prototype.setY1; - GLGE.BezTriple.prototype["setX2"]=GLGE.BezTriple.prototype.setX2; - GLGE.BezTriple.prototype["setY2"]=GLGE.BezTriple.prototype.setY2; - GLGE.BezTriple.prototype["setX3"]=GLGE.BezTriple.prototype.setX3; - GLGE.BezTriple.prototype["setY4"]=GLGE.BezTriple.prototype.setY4; -} - -if(GLGE.LinearPoint){ - GLGE["LinearPoint"]=GLGE.LinearPoint; - GLGE.LinearPoint.prototype["className"]=GLGE.LinearPoint.prototype.className; - GLGE.LinearPoint.prototype["setX"]=GLGE.LinearPoint.prototype.setX; - GLGE.LinearPoint.prototype["setY"]=GLGE.LinearPoint.prototype.setY; -} - -if(GLGE.StepPoint){ - GLGE["StepPoint"]=GLGE.StepPoint; - //missing here? -} - -if(GLGE.AnimationCurve){ - GLGE["AnimationCurve"]=GLGE.AnimationCurve; - GLGE.AnimationCurve.prototype["className"]=GLGE.AnimationCurve.prototype.className; - GLGE.AnimationCurve.prototype["addPoint"]=GLGE.AnimationCurve.prototype.addPoint; - GLGE.AnimationCurve.prototype["getValue"]=GLGE.AnimationCurve.prototype.getValue; -} - -if(GLGE.AnimationVector){ - GLGE["AnimationVector"]=GLGE.AnimationVector; - GLGE.AnimationVector.prototype["addCurve"]=GLGE.AnimationVector.prototype.addCurve; - GLGE.AnimationVector.prototype["removeCurve"]=GLGE.AnimationVector.prototype.removeCurve; - GLGE.AnimationVector.prototype["setFrames"]=GLGE.AnimationVector.prototype.setFrames; - GLGE.AnimationVector.prototype["getFrames"]=GLGE.AnimationVector.prototype.getFrames; -} -if(GLGE.augment){ - GLGE["augment"]=GLGE.augment; -} - -GLGE["G_NODE"]=GLGE.G_NODE; -GLGE["G_ROOT"]=GLGE.G_ROOT; - -if(GLGE.Group){ - GLGE["Group"]=GLGE.Group; - GLGE.Group.prototype["children"]=GLGE.Group.prototype.children; - GLGE.Group.prototype["className"]=GLGE.Group.prototype.className; - GLGE.Group.prototype["type"]=GLGE.Group.prototype.type; - GLGE.Group.prototype["getObjects"]=GLGE.Group.prototype.getObjects; - GLGE.Group.prototype["getLights"]=GLGE.Group.prototype.getLights; - GLGE.Group.prototype["addChild"]=GLGE.Group.prototype.addChild; - GLGE.Group.prototype["addObject"]=GLGE.Group.prototype.addObject; - GLGE.Group.prototype["addGroup"]=GLGE.Group.prototype.addGroup; - GLGE.Group.prototype["addText"]=GLGE.Group.prototype.addText; - GLGE.Group.prototype["addSkeleton"]=GLGE.Group.prototype.addSkeleton; - GLGE.Group.prototype["addLight"]=GLGE.Group.prototype.addLight; - GLGE.Group.prototype["addCamera"]=GLGE.Group.prototype.addCamera; - GLGE.Group.prototype["removeChild"]=GLGE.Group.prototype.removeChild; - GLGE.Group.prototype["getChildren"]=GLGE.Group.prototype.getChildren; -} - -if(GLGE.Text){ - GLGE["Text"]=GLGE.Text; - GLGE.Text.prototype["className"]=GLGE.Text.prototype.className; - GLGE.Text.prototype["getPickType"]=GLGE.Text.prototype.getPickType; - GLGE.Text.prototype["setPickType"]=GLGE.Text.prototype.setPickType; - GLGE.Text.prototype["getFont"]=GLGE.Text.prototype.getFont; - GLGE.Text.prototype["setFont"]=GLGE.Text.prototype.setFont; - GLGE.Text.prototype["getSize"]=GLGE.Text.prototype.getSize; - GLGE.Text.prototype["setSize"]=GLGE.Text.prototype.setSize; - GLGE.Text.prototype["getText"]=GLGE.Text.prototype.getText; - GLGE.Text.prototype["setText"]=GLGE.Text.prototype.setText; - GLGE.Text.prototype["setColor"]=GLGE.Text.prototype.setColor; - GLGE.Text.prototype["setColorR"]=GLGE.Text.prototype.setColorR; - GLGE.Text.prototype["setColorG"]=GLGE.Text.prototype.setColorG; - GLGE.Text.prototype["setColorB"]=GLGE.Text.prototype.setColorB; - GLGE.Text.prototype["getColor"]=GLGE.Text.prototype.getColor; - GLGE.Text.prototype["setZtransparent"]=GLGE.Text.prototype.setZtransparent; - GLGE.Text.prototype["isZtransparent"]=GLGE.Text.prototype.isZtransparent; -} - -if(GLGE.MultiMaterial){ - GLGE["MultiMaterial"]=GLGE.MultiMaterial; - GLGE.MultiMaterial.prototype["className"]=GLGE.MultiMaterial.prototype.className; - GLGE.MultiMaterial.prototype["setMesh"]=GLGE.MultiMaterial.prototype.setMesh; - GLGE.MultiMaterial.prototype["getMesh"]=GLGE.MultiMaterial.prototype.getMesh; - GLGE.MultiMaterial.prototype["setMaterial"]=GLGE.MultiMaterial.prototype.setMaterial; - GLGE.MultiMaterial.prototype["getMaterial"]=GLGE.MultiMaterial.prototype.getMaterial; -} - -if(GLGE.Object instanceof Object){ - GLGE["Object"]=GLGE.Object; - GLGE.Object.prototype["className"]=GLGE.Object.prototype.className; - GLGE.Object.prototype["setZtransparent"]=GLGE.Object.prototype.setZtransparent; - GLGE.Object.prototype["isZtransparent"]=GLGE.Object.prototype.isZtransparent; - GLGE.Object.prototype["setSkeleton"]=GLGE.Object.prototype.setSkeleton; - GLGE.Object.prototype["getSkeleton"]=GLGE.Object.prototype.getSkeleton; - GLGE.Object.prototype["setMaterial"]=GLGE.Object.prototype.setMaterial; - GLGE.Object.prototype["getMaterial"]=GLGE.Object.prototype.getMaterial; - GLGE.Object.prototype["setMesh"]=GLGE.Object.prototype.setMesh; - GLGE.Object.prototype["getMesh"]=GLGE.Object.prototype.getMesh; - GLGE.Object.prototype["addMultiMaterial"]=GLGE.Object.prototype.addMultiMaterial; - GLGE.Object.prototype["getMultiMaterials"]=GLGE.Object.prototype.getMultiMaterials; -} - -if(GLGE.Mesh){ - GLGE["Mesh"]=GLGE.Mesh; - GLGE.Mesh.prototype["className"]=GLGE.Mesh.prototype.className; - GLGE.Mesh.prototype["setJoints"]=GLGE.Mesh.prototype.setJoints; - GLGE.Mesh.prototype["setInvBindMatrix"]=GLGE.Mesh.prototype.setInvBindMatrix; - GLGE.Mesh.prototype["setVertexJoints"]=GLGE.Mesh.prototype.setVertexJoints; - GLGE.Mesh.prototype["setVertexWeights"]=GLGE.Mesh.prototype.setVertexWeights; - GLGE.Mesh.prototype["setUV"]=GLGE.Mesh.prototype.setUV; - GLGE.Mesh.prototype["setUV2"]=GLGE.Mesh.prototype.setUV2; - GLGE.Mesh.prototype["setPositions"]=GLGE.Mesh.prototype.setPositions; - GLGE.Mesh.prototype["setNormals"]=GLGE.Mesh.prototype.setNormals; - GLGE.Mesh.prototype["setBuffer"]=GLGE.Mesh.prototype.setBuffer; - GLGE.Mesh.prototype["setFaces"]=GLGE.Mesh.prototype.setFaces; - GLGE.Mesh.prototype["addObject"]=GLGE.Mesh.prototype.addObject; - GLGE.Mesh.prototype["removeObject"]=GLGE.Mesh.prototype.removeObject; -} - -GLGE["L_POINT"]=GLGE.L_POINT; -GLGE["L_DIR"]=GLGE.L_DIR; -GLGE["L_SPOT"]=GLGE.L_SPOT; - -if(GLGE.Light){ - GLGE["Light"]=GLGE.Light; - GLGE.Light.prototype["className"]=GLGE.Light.prototype.className; - GLGE.Light.prototype["getPMatrix"]=GLGE.Light.prototype.getPMatrix; - GLGE.Light.prototype["setCastShadows"]=GLGE.Light.prototype.setCastShadows; - GLGE.Light.prototype["getCastShadows"]=GLGE.Light.prototype.getCastShadows; - GLGE.Light.prototype["setShadowBias"]=GLGE.Light.prototype.setShadowBias; - GLGE.Light.prototype["getShadowBias"]=GLGE.Light.prototype.getShadowBias; - GLGE.Light.prototype["setBufferWidth"]=GLGE.Light.prototype.setBufferWidth; - GLGE.Light.prototype["getBufferHeight"]=GLGE.Light.prototype.getBufferHeight; - GLGE.Light.prototype["setBufferHeight"]=GLGE.Light.prototype.setBufferHeight; - GLGE.Light.prototype["getBufferWidth"]=GLGE.Light.prototype.getBufferWidth; - GLGE.Light.prototype["setSpotCosCutOff"]=GLGE.Light.prototype.setSpotCosCutOff; - GLGE.Light.prototype["getSpotCosCutOff"]=GLGE.Light.prototype.getSpotCosCutOff; - GLGE.Light.prototype["setSpotExponent"]=GLGE.Light.prototype.setSpotExponent; - GLGE.Light.prototype["getSpotExponent"]=GLGE.Light.prototype.getSpotExponent; - GLGE.Light.prototype["getAttenuation"]=GLGE.Light.prototype.getAttenuation; - GLGE.Light.prototype["setAttenuation"]=GLGE.Light.prototype.setAttenuation; - GLGE.Light.prototype["setAttenuationConstant"]=GLGE.Light.prototype.setAttenuationConstant; - GLGE.Light.prototype["setAttenuationLinear"]=GLGE.Light.prototype.setAttenuationLinear; - GLGE.Light.prototype["setAttenuationQuadratic"]=GLGE.Light.prototype.setAttenuationQuadratic; - GLGE.Light.prototype["setColor"]=GLGE.Light.prototype.setColor; - GLGE.Light.prototype["setColorR"]=GLGE.Light.prototype.setColorR; - GLGE.Light.prototype["setColorG"]=GLGE.Light.prototype.setColorG; - GLGE.Light.prototype["setColorB"]=GLGE.Light.prototype.setColorB; - GLGE.Light.prototype["getColor"]=GLGE.Light.prototype.getColor; - GLGE.Light.prototype["getType"]=GLGE.Light.prototype.getType; - GLGE.Light.prototype["setType"]=GLGE.Light.prototype.setType; -} - -GLGE["C_PERSPECTIVE"]=GLGE.C_PERSPECTIVE; -GLGE["C_ORTHO"]=GLGE.C_ORTHO; - -if(GLGE.Camera){ - GLGE["Camera"]=GLGE.Camera; - GLGE.Camera.prototype["className"]=GLGE.Camera.prototype.className; - GLGE.Camera.prototype["getOrthoScale"]=GLGE.Camera.prototype.getOrthoScale; - GLGE.Camera.prototype["setOrthoScale"]=GLGE.Camera.prototype.setOrthoScale; - GLGE.Camera.prototype["getFar"]=GLGE.Camera.prototype.getFar; - GLGE.Camera.prototype["setFar"]=GLGE.Camera.prototype.setFar; - GLGE.Camera.prototype["getNear"]=GLGE.Camera.prototype.getNear; - GLGE.Camera.prototype["setNear"]=GLGE.Camera.prototype.setNear; - GLGE.Camera.prototype["getType"]=GLGE.Camera.prototype.getType; - GLGE.Camera.prototype["setType"]=GLGE.Camera.prototype.setType; - GLGE.Camera.prototype["getFovY"]=GLGE.Camera.prototype.getFovY; - GLGE.Camera.prototype["setFovY"]=GLGE.Camera.prototype.setFovY; - GLGE.Camera.prototype["getAspect"]=GLGE.Camera.prototype.getAspect; - GLGE.Camera.prototype["setAspect"]=GLGE.Camera.prototype.setAspect; - GLGE.Camera.prototype["getProjectionMatrix"]=GLGE.Camera.prototype.getProjectionMatrix; - GLGE.Camera.prototype["setProjectionMatrix"]=GLGE.Camera.prototype.setProjectionMatrix; - GLGE.Camera.prototype["getViewMatrix"]=GLGE.Camera.prototype.getViewMatrix; -} - -GLGE["FOG_NONE"]=GLGE.FOG_NONE; -GLGE["FOG_LINEAR"]=GLGE.FOG_LINEAR -GLGE["FOG_QUADRATIC"]=GLGE.FOG_QUADRATIC; - -if(GLGE.Scene){ - GLGE["Scene"]=GLGE.Scene; - GLGE.Scene.prototype["className"]=GLGE.Scene.prototype.className; - GLGE.Scene.prototype["getFogType"]=GLGE.Scene.prototype.getFogType; - GLGE.Scene.prototype["setFogType"]=GLGE.Scene.prototype.setFogType; - GLGE.Scene.prototype["getFogFar"]=GLGE.Scene.prototype.getFogFar; - GLGE.Scene.prototype["setFogFar"]=GLGE.Scene.prototype.setFogFar; - GLGE.Scene.prototype["getFogNear"]=GLGE.Scene.prototype.getFogNear; - GLGE.Scene.prototype["setFogNear"]=GLGE.Scene.prototype.setFogNear; - GLGE.Scene.prototype["getFogColor"]=GLGE.Scene.prototype.getFogColor; - GLGE.Scene.prototype["setFogColor"]=GLGE.Scene.prototype.setFogColor; - GLGE.Scene.prototype["getBackgroundColor"]=GLGE.Scene.prototype.getBackgroundColor; - GLGE.Scene.prototype["setBackgroundColor"]=GLGE.Scene.prototype.setBackgroundColor; - GLGE.Scene.prototype["getAmbientColor"]=GLGE.Scene.prototype.getAmbientColor; - GLGE.Scene.prototype["setAmbientColor"]=GLGE.Scene.prototype.setAmbientColor; - GLGE.Scene.prototype["setAmbientColorR"]=GLGE.Scene.prototype.setAmbientColorR; - GLGE.Scene.prototype["setAmbientColorG"]=GLGE.Scene.prototype.setAmbientColorG; - GLGE.Scene.prototype["setAmbientColorB"]=GLGE.Scene.prototype.setAmbientColorB; - GLGE.Scene.prototype["setCamera"]=GLGE.Scene.prototype.setCamera; - GLGE.Scene.prototype["getCamera"]=GLGE.Scene.prototype.getCamera; - GLGE.Scene.prototype["render"]=GLGE.Scene.prototype.render; - GLGE.Scene.prototype["ray"]=GLGE.Scene.prototype.ray; - GLGE.Scene.prototype["pick"]=GLGE.Scene.prototype.pick; -} - -if(GLGE.Renderer){ - GLGE["Renderer"]=GLGE.Renderer; - GLGE.Renderer.prototype["getScene"]=GLGE.Renderer.prototype.getScene; - GLGE.Renderer.prototype["setScene"]=GLGE.Renderer.prototype.setScene; - GLGE.Renderer.prototype["render"]=GLGE.Renderer.prototype.render; -} - -if(GLGE.Texture){ - GLGE["Texture"]=GLGE.Texture; - GLGE.Texture.prototype["className"]=GLGE.Texture.prototype.className; - GLGE.Texture.prototype["getSrc"]=GLGE.Texture.prototype.getSrc; - GLGE.Texture.prototype["setSrc"]=GLGE.Texture.prototype.setSrc; -} - -if(GLGE.MaterialLayer){ - GLGE["MaterialLayer"]=GLGE.MaterialLayer; - GLGE.MaterialLayer.prototype["className"]=GLGE.MaterialLayer.prototype.className; - GLGE.MaterialLayer.prototype["getMatrix"]=GLGE.MaterialLayer.prototype.getMatrix; - GLGE.MaterialLayer.prototype["setTexture"]=GLGE.MaterialLayer.prototype.setTexture; - GLGE.MaterialLayer.prototype["getTexture"]=GLGE.MaterialLayer.prototype.getTexture; - GLGE.MaterialLayer.prototype["setMapto"]=GLGE.MaterialLayer.prototype.setMapto; - GLGE.MaterialLayer.prototype["getMapto"]=GLGE.MaterialLayer.prototype.getMapto; - GLGE.MaterialLayer.prototype["setMapinput"]=GLGE.MaterialLayer.prototype.setMapinput; - GLGE.MaterialLayer.prototype["getMapinput"]=GLGE.MaterialLayer.prototype.getMapinput; - GLGE.MaterialLayer.prototype["getOffset"]=GLGE.MaterialLayer.prototype.getOffset; - GLGE.MaterialLayer.prototype["getRotation"]=GLGE.MaterialLayer.prototype.getRotation; - GLGE.MaterialLayer.prototype["getScale"]=GLGE.MaterialLayer.prototype.getScale; - GLGE.MaterialLayer.prototype["setOffsetX"]=GLGE.MaterialLayer.prototype.setOffsetX; - GLGE.MaterialLayer.prototype["getOffsetX"]=GLGE.MaterialLayer.prototype.getOffsetX; - GLGE.MaterialLayer.prototype["setOffsetY"]=GLGE.MaterialLayer.prototype.setOffsetY; - GLGE.MaterialLayer.prototype["getOffsetY"]=GLGE.MaterialLayer.prototype.getOffsetY; - GLGE.MaterialLayer.prototype["setOffsetZ"]=GLGE.MaterialLayer.prototype.setOffsetZ; - GLGE.MaterialLayer.prototype["getOffsetZ"]=GLGE.MaterialLayer.prototype.getOffsetZ; - GLGE.MaterialLayer.prototype["setDOffsetX"]=GLGE.MaterialLayer.prototype.setDOffsetX; - GLGE.MaterialLayer.prototype["getDOffsetX"]=GLGE.MaterialLayer.prototype.getDOffsetX; - GLGE.MaterialLayer.prototype["setDOffsetY"]=GLGE.MaterialLayer.prototype.setDOffsetY; - GLGE.MaterialLayer.prototype["getDOffsetY"]=GLGE.MaterialLayer.prototype.getDOffsetY; - GLGE.MaterialLayer.prototype["setDOffsetZ"]=GLGE.MaterialLayer.prototype.setDOffsetZ; - GLGE.MaterialLayer.prototype["getDOffsetZ"]=GLGE.MaterialLayer.prototype.getDOffsetZ; - GLGE.MaterialLayer.prototype["setScaleX"]=GLGE.MaterialLayer.prototype.setScaleX; - GLGE.MaterialLayer.prototype["getScaleX"]=GLGE.MaterialLayer.prototype.getScaleX; - GLGE.MaterialLayer.prototype["setScaleY"]=GLGE.MaterialLayer.prototype.setScaleY; - GLGE.MaterialLayer.prototype["getScaleY"]=GLGE.MaterialLayer.prototype.getScaleY; - GLGE.MaterialLayer.prototype["setScaleZ"]=GLGE.MaterialLayer.prototype.setScaleZ; - GLGE.MaterialLayer.prototype["getScaleZ"]=GLGE.MaterialLayer.prototype.getScaleZ; - GLGE.MaterialLayer.prototype["setDScaleX"]=GLGE.MaterialLayer.prototype.setDScaleX; - GLGE.MaterialLayer.prototype["getDScaleX"]=GLGE.MaterialLayer.prototype.getDScaleX; - GLGE.MaterialLayer.prototype["setDScaleY"]=GLGE.MaterialLayer.prototype.setDScaleY; - GLGE.MaterialLayer.prototype["getDScaleY"]=GLGE.MaterialLayer.prototype.getDScaleY; - GLGE.MaterialLayer.prototype["setDScaleZ"]=GLGE.MaterialLayer.prototype.setDScaleZ; - GLGE.MaterialLayer.prototype["getDScaleZ"]=GLGE.MaterialLayer.prototype.getDScaleZ; - GLGE.MaterialLayer.prototype["setRotX"]=GLGE.MaterialLayer.prototype.setRotX; - GLGE.MaterialLayer.prototype["getRotX"]=GLGE.MaterialLayer.prototype.getRotX; - GLGE.MaterialLayer.prototype["setRotY"]=GLGE.MaterialLayer.prototype.setRotY; - GLGE.MaterialLayer.prototype["getRotY"]=GLGE.MaterialLayer.prototype.getRotY; - GLGE.MaterialLayer.prototype["setRotZ"]=GLGE.MaterialLayer.prototype.setRotZ; - GLGE.MaterialLayer.prototype["getRotZ"]=GLGE.MaterialLayer.prototype.getRotZ; - GLGE.MaterialLayer.prototype["setDRotX"]=GLGE.MaterialLayer.prototype.setDRotX; - GLGE.MaterialLayer.prototype["getDRotX"]=GLGE.MaterialLayer.prototype.getDRotX; - GLGE.MaterialLayer.prototype["setDRotY"]=GLGE.MaterialLayer.prototype.setDRotY; - GLGE.MaterialLayer.prototype["getDRotY"]=GLGE.MaterialLayer.prototype.getDRotY; - GLGE.MaterialLayer.prototype["setDRotZ"]=GLGE.MaterialLayer.prototype.setDRotZ; - GLGE.MaterialLayer.prototype["getDRotZ"]=GLGE.MaterialLayer.prototype.getDRotZ; - GLGE.MaterialLayer.prototype["setBlendMode"]=GLGE.MaterialLayer.prototype.setBlendMode; - GLGE.MaterialLayer.prototype["getBlendMode"]=GLGE.MaterialLayer.prototype.getBlendMode; -} - -GLGE["M_COLOR"]=GLGE.M_COLOR; -GLGE["M_NOR"]=GLGE.M_NOR; -GLGE["M_ALPHA"]=GLGE.M_ALPHA; -GLGE["M_SPECCOLOR"]=GLGE.M_SPECCOLOR; -GLGE["M_SPECULAR"]=GLGE.M_SPECULAR; -GLGE["M_SHINE"]=GLGE.M_SHINE; -GLGE["M_REFLECT"]=GLGE.M_REFLECT; -GLGE["M_EMIT"]=GLGE.M_EMIT; -GLGE["M_ALPHA"]=GLGE.M_ALPHA; -GLGE["M_MSKR"]=GLGE.M_MSKR; -GLGE["M_MSKG"]=GLGE.M_MSKG; -GLGE["M_MSKB"]=GLGE.M_MSKB; -GLGE["M_MSKA"]=GLGE.M_MSKA; -GLGE["M_HEIGHT"]=GLGE.M_HEIGHT; -GLGE["UV1"]=GLGE.UV1; -GLGE["UV2"]=GLGE.UV2; -GLGE["MAP_NORM"]=GLGE.MAP_NORM; -GLGE["MAP_OBJ"]=GLGE.MAP_OBJ; -GLGE["BL_MIX"]=GLGE.BL_MIX; -GLGE["BL_MUL"]=GLGE.BL_MUL; - -if(GLGE.Material){ - GLGE["Material"]=GLGE.Material; - GLGE.Material.prototype["className"]=GLGE.Material.prototype.className; - GLGE.Material.prototype["setShadow"]=GLGE.Material.prototype.setShadow; - GLGE.Material.prototype["getShadow"]=GLGE.Material.prototype.getShadow; - GLGE.Material.prototype["setColor"]=GLGE.Material.prototype.setColor; - GLGE.Material.prototype["setColorR"]=GLGE.Material.prototype.setColorR; - GLGE.Material.prototype["setColorG"]=GLGE.Material.prototype.setColorG; - GLGE.Material.prototype["setColorB"]=GLGE.Material.prototype.setColorB; - GLGE.Material.prototype["getColor"]=GLGE.Material.prototype.getColor; - GLGE.Material.prototype["setSpecularColor"]=GLGE.Material.prototype.setSpecularColor; - GLGE.Material.prototype["getSpecularColor"]=GLGE.Material.prototype.getSpecularColor; - GLGE.Material.prototype["setAlpha"]=GLGE.Material.prototype.setAlpha; - GLGE.Material.prototype["getAlpha"]=GLGE.Material.prototype.getAlpha; - GLGE.Material.prototype["setSpecular"]=GLGE.Material.prototype.setSpecular; - GLGE.Material.prototype["getSpecular"]=GLGE.Material.prototype.getSpecular; - GLGE.Material.prototype["setShininess"]=GLGE.Material.prototype.setShininess; - GLGE.Material.prototype["getShininess"]=GLGE.Material.prototype.getShininess; - GLGE.Material.prototype["setEmit"]=GLGE.Material.prototype.setEmit; - GLGE.Material.prototype["getEmit"]=GLGE.Material.prototype.getEmit; - GLGE.Material.prototype["setReflectivity"]=GLGE.Material.prototype.setReflectivity; - GLGE.Material.prototype["getReflectivity"]=GLGE.Material.prototype.getReflectivity; - GLGE.Material.prototype["addMaterialLayer"]=GLGE.Material.prototype.addMaterialLayer; - GLGE.Material.prototype["getLayers"]=GLGE.Material.prototype.getLayers; - GLGE.Material.prototype["addTexture"]=GLGE.Material.prototype.addTexture; -} -} -closure_export(); - - -})(window["GLGE"]); - - |
