var o3djs=o3djs||{};var goog=goog||{};goog.typedef=true;o3djs.global=this;o3djs.BROWSER_ONLY=true;o3djs.provided_=[];o3djs.provide=function(a){if(o3djs.getObjectByName(a)&&!o3djs.implicitNamespaces_[a]){throw'Namespace "'+a+'" already declared.'}var b=a;while((b=b.substring(0,b.lastIndexOf(".")))){o3djs.implicitNamespaces_[b]=true}o3djs.exportPath_(a);o3djs.provided_.push(a)};o3djs.implicitNamespaces_={};o3djs.exportPath_=function(c,a,f){var d=c.split(".");var e=f||o3djs.global;var b;if(!(d[0] in e)&&e.execScript){e.execScript("var "+d[0])}while(d.length&&(b=d.shift())){if(!d.length&&o3djs.isDef(a)){e[b]=a}else{if(e[b]){e=e[b]}else{e=e[b]={}}}}};o3djs.getObjectByName=function(c,d){var e=c.split(".");var f=d||o3djs.global;for(var a=0;a<e.length;++a){var b=e[a];if(f[b]){f=f[b]}else{return null}}return f};o3djs.require=function(c){var b=document.getElementsByTagName("script").length;if(o3djs.getObjectByName(c)){return}var a=o3djs.getPathFromRule_(c);if(a){o3djs.included_[a]=true;o3djs.writeScripts_()}else{throw new Error("o3djs.require could not find: "+c)}};o3djs.basePath="";o3djs.included_={};o3djs.dependencies_={visited:{},written:{}};o3djs.findBasePath_=function(){var e=o3djs.global.document;if(typeof e=="undefined"){return}if(o3djs.global.BASE_PATH){o3djs.basePath=o3djs.global.BASE_PATH;return}else{o3djs.global.BASE_PATH=null}var a=e.getElementsByTagName("script");for(var c,d=0;c=a[d];d++){var f=c.src;var b=f.length;if(f.substr(b-13)=="o3djs/base.js"){o3djs.basePath=f.substr(0,b-13);return}}};o3djs.writeScriptTag_=function(b){var a=o3djs.global.document;if(typeof a!="undefined"&&!o3djs.dependencies_.written[b]){o3djs.dependencies_.written[b]=true;a.write('<script type="text/javascript" src="'+b+'"><\/script>')}};o3djs.writeScripts_=function(){var a=[];var b={};var f=o3djs.dependencies_;function e(g){if(g in f.written){return}if(g in f.visited){if(!(g in b)){b[g]=true;a.push(g)}return}f.visited[g]=true;if(!(g in b)){b[g]=true;a.push(g)}}for(var d in o3djs.included_){if(!f.written[d]){e(d)}}for(var c=0;c<a.length;c++){if(a[c]){o3djs.writeScriptTag_(o3djs.basePath+a[c])}else{throw Error("Undefined script input")}}};o3djs.getPathFromRule_=function(b){var a=b.split(".");return a.join("/")+".js"};o3djs.findBasePath_();o3djs.isDef=function(a){return typeof a!="undefined"};o3djs.exportSymbol=function(b,a,c){o3djs.exportPath_(b,a,c)};o3djs.v8Initializer_="";o3djs.v8InitializerArgs_=[];o3djs.valueToString_=function(e){switch(typeof(e)){case"undefined":return"undefined";case"string":var g=escape(e);if(g===e){return'"'+e+'"'}else{return'unescape("'+g+'")'}case"object":if(e===null){return"null"}else{if(e instanceof RegExp){var a="new RegExp("+o3djs.valueToString_(e.source)+', "';if(e.global){a+="g"}if(e.ignoreCase){a+="i"}if(e.multiline){a+="m"}a+='")';return a}else{if(o3djs.base.isArray(e)){var d=(e);var a="[";var f="";for(var c=0;c<d.length;++c){a+=f+o3djs.valueToString_(d[c]);f=","}a+="]\n";return a}else{var h=(e);var a="{\n";var f="";for(var b in h){a+=f+'"'+b+'": '+o3djs.valueToString_(h[b]);f=","}a+="}\n";return a}}}default:return e.toString()}};o3djs.namespaceInitializer_=function(d,f,h){var a=f+" = {};\n";for(var e in d){var g=f+"."+e;var c=d[e];if(typeof(c)==="object"&&c!==null&&!o3djs.base.isArray(c)&&!(c instanceof RegExp)){a+=o3djs.namespaceInitializer_(c,g)}else{var b=o3djs.valueToString_(c);if(typeof(c)=="function"&&b.indexOf("o3djs.BROWSER_ONLY")!=-1){b="args_["+h.length+"]";h.push(c)}a+=g+" = "+b+";\n";if(typeof(c)==="function"&&c.prototype){a+=o3djs.namespaceInitializer_(c.prototype,g+".prototype")}}}return a};o3djs.provide("o3djs.base");o3djs.base=o3djs.base||{};o3djs.base.o3d=null;o3djs.base.snapshotProvidedNamespaces=function(){o3djs.v8Initializer_="function(args_) {\n";o3djs.v8InitializerArgs_=[];for(var b=0;b<o3djs.provided_.length;++b){var a=o3djs.getObjectByName(o3djs.provided_[b]);o3djs.v8Initializer_+=o3djs.namespaceInitializer_((a),o3djs.provided_[b],o3djs.v8InitializerArgs_)}o3djs.v8Initializer_+="}\n"};o3djs.base.initV8=function(clientObject){var v8Init=function(initializer,args){var o3djsBrowser=o3djs;o3djs={};o3djs.browser=o3djsBrowser;o3djs.global=(function(){return this})();o3djs.require=function(rule){};o3djs.provide=function(rule){};eval("("+initializer+")")(args);o3djs.base.o3d=plugin.o3d};clientObject.eval(v8Init.toString())(o3djs.v8Initializer_,o3djs.v8InitializerArgs_)};o3djs.base.init=function(a){function c(d){var h={};var g=false;for(var e in d){var f=d[e];if(typeof f=="object"||typeof f=="function"){f=c(f)}if(typeof f!="undefined"){h[e]=f;g=true}}return g?h:undefined}try{o3djs.base.o3d=c(a.o3d)}catch(b){o3djs.base.o3d=a.o3d}o3djs.base.o3d=o3djs.base.o3d||a.o3d};o3djs.base.isArray=function(a){var b=(a);return typeof(a)==="object"&&a!==null&&"length" in b&&"splice" in b};o3djs.base.ready=function(){return o3djs.base.o3d!=null};o3djs.base.maybeDeobfuscateFunctionName_=function(a){return a};o3djs.base.inherit=function(c,b){var a=function(){};a.prototype=b.prototype;c.prototype=new a()};o3djs.base.parseErrorStack=function(d){var g=[];var a;var h;if(!d||!d.stack){return g}var b=d.stack.split("\n");for(var e=0;e<b.length-1;e++){var c=b[e];a=c.match(/^([a-zA-Z0-9_$]*)/)[1];if(a){a=o3djs.base.maybeDeobfuscateFunctionName_(a)}else{a="anonymous"}var j=c.match(/(.*:[0-9]+)$/);h=j&&j[1];if(!h){h="(unknown)"}g[g.length]=a+" : "+h}var f=/^anonymous :/;while(g.length&&f.exec(g[g.length-1])){g.length=g.length-1}return g};o3djs.base.getFunctionName=function(b){var a=b.toString().match(/function(\s*)(\w*)/);if(a&&a.length>=2&&a[2]){return o3djs.base.maybeDeobfuscateFunctionName_(a[2])}return"anonymous"};o3djs.base.formatErrorStack=function(b){var a="";for(var c=0;c<b.length;c++){a+="> "+b[c]+"\n"}return a};o3djs.base.getStackTrace=function(stripCount){var result="";if(typeof(arguments.caller)!="undefined"){for(var a=arguments.caller;a!=null;a=a.caller){result+="> "+o3djs.base.getFunctionName(a.callee)+"\n";if(a.caller==a){result+="*";break}}}else{var testExcp;try{eval("var var;")}catch(testExcp){var stack=o3djs.base.parseErrorStack(testExcp);result+=o3djs.base.formatErrorStack(stack.slice(3+stripCount,stack.length))}}return result};o3djs.base.setErrorHandler=function(a){a.setErrorCallback(function(b){a.clearErrorCallback();alert("ERROR: "+b+"\n"+o3djs.base.getStackTrace(1))})};o3djs.base.IsMSIE=function(){var b=navigator.userAgent.toLowerCase();var a=/msie/.test(b)&&!/opera/.test(b);return a};o3djs.base.IsChrome10=function(){return navigator.userAgent.indexOf("Chrome/1.0")>=0};o3djs.provide("o3djs.util");o3djs.util=o3djs.util||{};o3djs.util.PLUGIN_NAME="O3D Plugin";o3djs.util.REQUIRED_VERSION="0.1.38.0";o3djs.util.PLUGIN_DOWNLOAD_URL="http://tools.google.com/dlpage/o3d";o3djs.util.rendererInitStatus={NO_PLUGIN:-1,UNINITIALIZED:0,SUCCESS:1,OUT_OF_RESOURCES:2,GPU_NOT_UP_TO_SPEC:3,INITIALIZATION_ERROR:4};o3djs.util.curry=function(c){var a=[];for(var b=1;b<arguments.length;++b){a.push(arguments[b])}return function(){var d=a.slice();for(var e=0;e<arguments.length;++e){d.push(arguments[e])}return c.apply(this,d)}};o3djs.util.getCurrentURI=function(){var b=window.location.href;var a=b.lastIndexOf("/");return b.substring(0,a+1)};o3djs.util.getAbsoluteURI=function(a){return o3djs.util.getCurrentURI()+a};o3djs.util.arrayContains=function(c,b){for(var a=0;a<c.length;a++){if(c[a]==b){return true}}return false};o3djs.util.getTransformsInTreeByTags=function(b,j){var e=j.split(",");var d=b.getTransformsInTree();var g=[];for(var a=0;a<d.length;a++){var c=d[a].getParam("collada.tags");if(c){var h=c.value.split(",");for(var f=0;f<h.length;f++){if(o3djs.util.arrayContains(e,h[f])){g[g.length]=d[a];break}}}}return g};o3djs.util.getTransformsInTreeByPrefix=function(a,f){var e=[];var d=a.getTransformsInTree();for(var c=0;c<d.length;c++){var b=d[c];if(b.name.indexOf(f)==0){e[e.length]=b}}return e};o3djs.util.getBoundingBoxOfTree=function(e){var h=e.boundingBox;if(h.valid){return h}var b=o3djs.base.o3d;var k=e.children;for(var g=0;g<k.length;++g){var d=k[g];var l=o3djs.util.getBoundingBoxOfTree(d);if(l.valid){l=l.mul(d.localMatrix);if(h.valid){h=h.add(l)}else{h=l}}}var c=e.shapes;for(var g=0;g<c.length;++g){var a=c[g].elements;for(var f=0;f<a.length;++f){var m=a[f].boundingBox;if(!m.valid){m=a[f].getBoundingBox(0)}if(h.valid){h=h.add(m)}else{h=m}}}return h};o3djs.util.getPowerOfTwoSize=function(b){var a=1;while(b){b=b>>1;a=a<<1}return a};o3djs.util.getPluginVersion=function(){var a=null;var f=null;if(navigator.plugins!=null&&navigator.plugins.length>0){var d=navigator.plugins[o3djs.util.PLUGIN_NAME];if(d){f=d.description}}else{if(o3djs.base.IsMSIE()){try{var b=new ActiveXObject("o3d_host.O3DHostControl");f=b.description}catch(h){}}}if(f){var c=/.*version:(\d+)\.(\d+)\.(\d+)\.(\d+).*/;var g=c.exec(f);if(g&&g.length==5){a=""+parseInt(g[1],10)+"."+parseInt(g[2],10)+"."+parseInt(g[3],10)+"."+parseInt(g[4],10)}}return a};o3djs.util.requiredVersionAvailable=function(e){var b=o3djs.util.getPluginVersion();if(!b){return false}var g=b.split(".");var c=e.split(".");if(c.length>4){throw Error("requiredVersion has more than 4 parts!")}for(var a=0;a<c.length;++a){var d=parseInt(g[a],10);var f=parseInt(c[a],10);if(d<f){return false}if(d>f){return true}}return true};o3djs.util.offerPlugin=function(g,f){var k=f||"div";var b=g||"^o3d";var l=o3djs.util.requiredVersionAvailable("");var a=document.getElementsByTagName(k);var c=false;var h=(l?"This page requires a newer version of the O3D plugin.":"This page requires the O3D plugin to be installed.");var j='<div style="background: lightblue; width: 100%; height: 100%; text-align:center;"><br/><br/>'+h+'<br/><a href="'+o3djs.util.PLUGIN_DOWNLOAD_URL+'">Click here to download.</a></div>';for(var e=0;e<a.length;++e){var d=a[e];if(d.id&&d.id.match(b)){if(d.clientWidth>=200&&d.clientHeight>=200&&d.style.display.toLowerCase()!="none"&&d.style.visibility.toLowerCase()!="hidden"){c=true;d.innerHTML=j}}}if(!c){if(confirm(h+"\n\nClick OK to download.")){window.location=o3djs.util.PLUGIN_DOWNLOAD_URL}}};o3djs.util.informNoGraphics=function(j,k,n,l){var p=l||"div";var b=n||"^o3d";var a=document.getElementsByTagName(p);var d=false;var m;var o;var c="";var f=function(){};var e=function(q){var r="";if(q.length>0){r="<br/><br/><div>More Info:<br/>"+q+"</div>"}return r};if(j==o3djs.util.rendererInitStatus.GPU_NOT_UP_TO_SPEC){m="We are terribly sorry but it appears your graphics card is not able to run o3d. We are working on a solution.";o='<div style="background: lightgray; width: 100%; height: 100%; text-align: center;"><br/><br/>'+m+'<br/><br/><a href="'+o3djs.util.PLUGIN_DOWNLOAD_URL+'">Click Here to go the O3D website</a>'+e(k)+"</div>";c="\n\nClick OK to go to the o3d website.";f=function(){window.location=o3djs.util.PLUGIN_DOWNLOAD_URL}}else{if(j==o3djs.util.rendererInitStatus.OUT_OF_RESOURCES){m="Your graphics system appears to be out of resources. Try closing some applications and then refreshing this page.";o='<div style="background: lightgray; width: 100%; height: 100%; text-align: center;"><br/><br/>'+m+e(k)+"</div>"}else{m="A unknown error has prevented O3D from starting. Try downloading new drivers or checking for OS updates.";o='<div style="background: lightgray; width: 100%; height: 100%; text-align: center;"><br/><br/>'+m+e(k)+"</div>"}}for(var h=0;h<a.length;++h){var g=a[h];if(g.id&&g.id.match(b)){if(g.clientWidth>=200&&g.clientHeight>=200&&g.style.display.toLowerCase()!="none"&&g.style.visibility.toLowerCase()!="hidden"){d=true;g.innerHTML=o}}}if(!d){if(confirm(m+c)){f()}}};o3djs.util.informPluginFailure=function(a,b,d,c){if(a==o3djs.util.rendererInitStatus.NO_PLUGIN){o3djs.util.offerPlugin(d,c)}else{o3djs.util.informNoGraphics(a,b,d,c)}};o3djs.util.getElementContentById=function(b){o3djs.BROWSER_ONLY=true;var a=document.getElementById(b);if(!a){throw"getElementContentById could not find node with id "+b}switch(a.tagName){case"TEXTAREA":return a.value;case"SCRIPT":return a.text;default:throw"getElementContentById does not no how to get content from a "+a.tagName+" element"}};o3djs.util.getElementById=function(a){o3djs.BROWSER_ONLY=true;return document.getElementById(a)};o3djs.util.Engine={BROWSER:0,V8:1};o3djs.util.mainEngine_=o3djs.util.Engine.BROWSER;o3djs.util.setMainEngine=function(a){o3djs.util.mainEngine_=a};o3djs.util.fixFunctionString_=/^\s*function\s+[^\s]+\s*\(([^)]*)\)/;o3djs.util.callV8=function(clientElement,callback,thisArg,args){var functionString=callback.toString();functionString=functionString.replace(o3djs.util.fixFunctionString_,"function($1)");var v8Code="function(thisArg, args) {\n  var localArgs = [];\n  var numArgs = args.length;\n  for (var i = 0; i < numArgs; ++i) {\n    localArgs.push(args[i]);\n  }\n  var func = "+functionString+";\n  return func.apply(thisArg, localArgs);\n}\n";var v8Function=clientElement.eval(v8Code);return v8Function(thisArg,args)};o3djs.util.stripDotDot_=/\/[^\/]+\/\.\./;o3djs.util.toAbsoluteUri=function(c){if(c.indexOf("://")==-1){var d=document.location.toString();var a=d.lastIndexOf("/");if(a!=-1){d=d.substring(0,a)}c=d+"/"+c}do{var b=c;c=c.replace(o3djs.util.stripDotDot_,"")}while(b!==c);return c};o3djs.util.scriptUris_=[];o3djs.util.addScriptUri=function(a){o3djs.util.scriptUris_.push(o3djs.util.toAbsoluteUri(a))};o3djs.util.isScriptUri=function(c){c=o3djs.util.toAbsoluteUri(c);for(var b=0;b<o3djs.util.scriptUris_.length;++b){var a=o3djs.util.scriptUris_[b];if(c.substring(0,a.length)===a){return true}}return false};o3djs.util.isWantedScriptTag_=function(a){return a.id&&a.id.match(/^o3dscript/)};o3djs.util.getScriptTagText_=function(){var c="";var a=document.getElementsByTagName("script");for(var b=0;b<a.length;++b){var d=a[b];if(d.type===""||d.type==="text/javascript"){if("text" in d&&d.text&&o3djs.util.isWantedScriptTag_(d)){c+=d.text}if("src" in d&&d.src&&o3djs.util.isScriptUri(d.src)){c+=o3djs.io.loadTextFileSynchronous(d.src)}}}return c};o3djs.util.createClient=function(b,c,a){c=c||"";a=a||o3djs.util.REQUIRED_VERSION;if(!o3djs.util.requiredVersionAvailable(a)){return null}c+=(c?",":"")+"APIVersion="+a;var d;if(o3djs.base.IsMSIE()){b.innerHTML='<OBJECT WIDTH="100%" HEIGHT="100%"CLASSID="CLSID:9666A772-407E-4F90-BC37-982E8160EB2D"><PARAM name="o3d_features" value="'+c+'"/></OBJECT>';d=b.childNodes[0]}else{d=document.createElement("object");d.type="application/vnd.o3d.auto";d.style.width="100%";d.style.height="100%";d.setAttribute("o3d_features",c);b.appendChild(d)}return d};o3djs.util.makeClients=function(callback,opt_features,opt_requiredVersion,opt_failureCallback,opt_id,opt_tag){var tag=opt_tag||"div";var id=opt_id||"^o3d";opt_failureCallback=opt_failureCallback||o3djs.util.informPluginFailure;opt_requiredVersion=opt_requiredVersion||o3djs.util.REQUIRED_VERSION;if(!o3djs.util.requiredVersionAvailable(opt_requiredVersion)){opt_failureCallback(o3djs.util.rendererInitStatus.NO_PLUGIN,"",id,tag)}else{var clientElements=[];var elements=document.getElementsByTagName(tag);var mainClientElement=null;for(var ee=0;ee<elements.length;++ee){var element=elements[ee];if(element.id&&element.id.match(id)){var features=opt_features;if(!features){var o3d_features=element.getAttribute("o3d_features");if(o3d_features){features=o3d_features}else{features=""}}var objElem=o3djs.util.createClient(element,features);clientElements.push(objElem);if(element.id==="o3d"){mainClientElement=objElem}}}var chromeWorkaround=o3djs.base.IsChrome10();var clearId=window.setInterval(function(){var initStatus=0;var error="";var o3d;for(var cc=0;cc<clientElements.length;++cc){var element=clientElements[cc];o3d=element.o3d;var ready=o3d&&element.client&&element.client.rendererInitStatus>o3djs.util.rendererInitStatus.UNINITIALIZED;if(!ready){if(chromeWorkaround){if(element.style.width!="100%"){element.style.width="100%"}else{element.style.width="1px"}}return}if(chromeWorkaround&&element.style.width!="100%"){element.style.width="100%";return}var status=clientElements[cc].client.rendererInitStatus;if(status>initStatus){initStatus=status;error=clientElements[cc].client.lastError}}window.clearInterval(clearId);if(initStatus>0&&initStatus!=o3d.Renderer.SUCCESS){for(var cc=0;cc<clientElements.length;++cc){var clientElement=clientElements[cc];clientElement.parentNode.removeChild(clientElement)}opt_failureCallback(initStatus,error,id,tag)}else{o3djs.base.snapshotProvidedNamespaces();for(var cc=0;cc<clientElements.length;++cc){o3djs.base.initV8(clientElements[cc]);o3djs.event.startKeyboardEventSynthesis(clientElements[cc]);o3djs.error.setDefaultErrorHandler(clientElements[cc].client)}o3djs.base.init(clientElements[0]);switch(o3djs.util.mainEngine_){case o3djs.util.Engine.BROWSER:callback(clientElements);break;case o3djs.util.Engine.V8:if(!mainClientElement){throw'V8 engine was requested but there is no element with the id "o3d"'}var scriptTagText=o3djs.util.getScriptTagText_();mainClientElement.eval(scriptTagText);o3djs.util.callV8(mainClientElement,callback,o3djs.global,[clientElements]);break;default:throw"Unknown engine "+o3djs.util.mainEngine_}}},10)}};o3djs.provide("o3djs.event");o3djs.event=o3djs.event||{};o3djs.event.appendWithSpace=function(b,a){return(b.length==0)?a:b+" "+a};o3djs.event.appendWithSpaceIf=function(b,c,a){return(b)?o3djs.event.appendWithSpace(c,a):c};o3djs.event.getModifierString=function(e,d,b,c){var a=o3djs.event.appendWithSpaceIf(e,"","Control");a=o3djs.event.appendWithSpaceIf(d,a,"Alt");a=o3djs.event.appendWithSpaceIf(b,a,"Shift");return o3djs.event.appendWithSpaceIf(c,a,"Meta")};o3djs.event.padWithLeadingZeroes=function(b,a){while(b.length<a){b="0"+b}return b};o3djs.event.getKeyIdentifier=function(b,c){if(!b){b=c}switch(b){case 3:case 13:return"Enter";case 37:return"Left";case 39:return"Right";case 38:return"Up";case 40:return"Down"}b=(b>=97&&b<=122)?b-32:b;var a=b.toString(16).toUpperCase();return"U+"+o3djs.event.padWithLeadingZeroes(a,4)};o3djs.event.keyIdentifierToChar=function(a){if(a){switch(a){case"Enter":return 13;case"Left":return 37;case"Right":return 39;case"Up":return 38;case"Down":return 40}if(a.indexOf("U+")==0){return parseInt(a.substr(2).toUpperCase(),16)}}return 0};o3djs.event.getEventKeyChar=function(b){if(!b){b=window.event}var a=0;if(b.keyIdentifier){a=o3djs.event.keyIdentifierToChar(b.keyIdentifier)}if(!a){a=(window.event)?window.event.keyCode:b.charCode}if(!a){a=b.keyCode}return a};o3djs.event.cancel=function(a){if(!a){a=window.event}a.cancelBubble=true;if(a.stopPropagation){a.stopPropagation()}if(a.preventDefault){a.preventDefault()}};o3djs.event.startKeyboardEventSynthesis=function(b){var a=function(c){o3djs.event.onKey(c,b)};o3djs.event.addEventListener(b,"keypress",a);o3djs.event.addEventListener(b,"keydown",a);o3djs.event.addEventListener(b,"keyup",a)};o3djs.event.onKey=function(b,c){var a=o3djs.event.createKeyEvent(b.type,b.charCode,b.keyCode,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey);if(a){if(c.parentNode.dispatchEvent){c.parentNode.dispatchEvent(a)}else{if(c.fireEvent){c.fireEvent("on"+b.type,a)}}}};o3djs.event.createKeyEvent=function(e,g,h,b,c,a,j){var f;var d=o3djs.event.getKeyIdentifier(g,h);if(document.createEvent){f=document.createEvent("KeyboardEvent");if(f.initKeyboardEvent){f.initKeyboardEvent(e,true,true,window,d,0,b,c,a,j);f.charCode=g;if(e=="keypress"){f.keyCode=g}else{f.keyCode=h}}else{if(f.initKeyEvent){f.initKeyEvent(e,true,true,window,b,c,a,j,h,g);f.keyIdentifier=d}}}else{if(document.createEventObject){f=document.createEventObject();f.ctrlKey=b;f.altKey=c;f.shiftKey=a;f.metaKey=j;f.keyCode=g;f.keyIdentifier=d}}f.synthetic=true;return f};o3djs.event.createEventHandler=function(a){return function(e){var d=a.length;for(var b=0;b<d;++b){var c=a[b];if(typeof(c.handleEvent)=="function"){c.handleEvent(e)}else{c(e)}}}};o3djs.event.addEventListener=function(f,e,d){if(!d||typeof(e)!="string"||(typeof(d)!="function"&&typeof(d.handleEvent)!="function")){throw new Error("Invalid argument.")}f.o3d_eventRegistry=f.o3d_eventRegistry||[];var b=f.o3d_eventRegistry;var a=b[e];if(!a||a.length==0){a=b[e]=[];f.client.setEventCallback(e,o3djs.event.createEventHandler(a))}else{for(var c in a){if(a[c]==d){return}}}a.push(d)};o3djs.event.removeEventListener=function(f,e,d){var b=f.o3d_eventRegistry;if(!b){return}var a=b[e];if(!a){return}for(var c in a){if(a[c]==d){if(a.length==1){f.client.clearEventCallback(e)}a.splice(c,1);break}}};o3djs.provide("o3djs.error");o3djs.error=o3djs.error||{};o3djs.error.callbacks_=[];o3djs.error.setErrorHandler=function(b,d){var a=b.clientId;var c=o3djs.error.callbacks_[a];o3djs.error.callbacks_[a]=d;if(d){b.setErrorCallback(d)}else{b.clearErrorCallback()}return c};o3djs.error.setDefaultErrorHandler=function(a){o3djs.error.setErrorHandler(a,function(b){o3djs.error.setErrorHandler(a,null);alert("ERROR: "+b)})};o3djs.error.createErrorCollector=function(a){return new o3djs.error.ErrorCollector(a)};o3djs.error.ErrorCollector=function(a){var b=this;this.client_=a;this.errors=[];this.oldCallback_=o3djs.error.setErrorHandler(a,function(c){b.errors.push(c)})};o3djs.error.ErrorCollector.prototype.finish=function(){o3djs.error.setErrorHandler(this.client_,this.oldCallback_)};o3djs.provide("o3djs.math");o3djs.math=o3djs.math||{};o3djs.math.randomSeed_=0;o3djs.math.RANDOM_RANGE_=Math.pow(2,32);o3djs.math.matrix4=o3djs.math.matrix4||{};o3djs.math.rowMajor=o3djs.math.rowMajor||{};o3djs.math.columnMajor=o3djs.math.columnMajor||{};o3djs.math.errorCheck=o3djs.math.errorCheck||{};o3djs.math.errorCheckFree=o3djs.math.errorCheckFree||{};o3djs.math.Vector2=goog.typedef;o3djs.math.Vector3=goog.typedef;o3djs.math.Vector4=goog.typedef;o3djs.math.Vector=goog.typedef;o3djs.math.Matrix1=goog.typedef;o3djs.math.Matrix2=goog.typedef;o3djs.math.Matrix3=goog.typedef;o3djs.math.Matrix4=goog.typedef;o3djs.math.Matrix=goog.typedef;o3djs.math.pseudoRandom=function(){var a=o3djs.math;return(a.randomSeed_=(134775813*a.randomSeed_+1)%a.RANDOM_RANGE_)/a.RANDOM_RANGE_};o3djs.math.resetPseudoRandom=function(){o3djs.math.randomSeed_=0};o3djs.math.degToRad=function(a){return a*Math.PI/180};o3djs.math.radToDeg=function(a){return a*180/Math.PI};o3djs.math.lerpScalar=function(d,c,e){return(1-e)*d+e*c};o3djs.math.addVector=function(d,c){var g=[];var f=d.length;for(var e=0;e<f;++e){g[e]=d[e]+c[e]}return g};o3djs.math.subVector=function(d,c){var g=[];var f=d.length;for(var e=0;e<f;++e){g[e]=d[e]-c[e]}return g};o3djs.math.lerpVector=function(d,c,g){var h=[];var f=d.length;for(var e=0;e<f;++e){h[e]=(1-g)*d[e]+g*c[e]}return h};o3djs.math.modClamp=function(b,a,c){var d=c||0;if(a<0.00001){return d}b-=d;if(b<0){b-=Math.floor(b/a)*a}else{b=b%a}return b+d};o3djs.math.lerpCircular=function(d,c,f,e){d=o3djs.math.modClamp(d,e);c=o3djs.math.modClamp(c,e);var g=c-d;if(Math.abs(g)>e*0.5){if(g>0){c-=e}else{c+=e}}return o3djs.math.modClamp(o3djs.math.lerpScalar(d,c,f),e)};o3djs.math.lerpRadian=function(d,c,e){return o3djs.math.lerpCircular(d,c,e,Math.PI*2)};o3djs.math.divVectorScalar=function(b,a){var d=[];var e=b.length;for(var c=0;c<e;++c){d[c]=b[c]/a}return d};o3djs.math.dot=function(d,c){var g=0;var f=d.length;for(var e=0;e<f;++e){g+=d[e]*c[e]}return g};o3djs.math.cross=function(d,c){return[d[1]*c[2]-d[2]*c[1],d[2]*c[0]-d[0]*c[2],d[0]*c[1]-d[1]*c[0]]};o3djs.math.length=function(b){var e=0;var d=b.length;for(var c=0;c<d;++c){e+=b[c]*b[c]}return Math.sqrt(e)};o3djs.math.lengthSquared=function(b){var e=0;var d=b.length;for(var c=0;c<d;++c){e+=b[c]*b[c]}return e};o3djs.math.distance=function(d,c){var h=0;var g=d.length;for(var f=0;f<g;++f){var e=d[f]-c[f];h+=e*e}return Math.sqrt(h)};o3djs.math.distanceSquared=function(d,c){var h=0;var g=d.length;for(var f=0;f<g;++f){var e=d[f]-c[f];h+=e*e}return h};o3djs.math.normalize=function(b){var e=[];var f=0;var d=b.length;for(var c=0;c<d;++c){f+=b[c]*b[c]}f=Math.sqrt(f);for(var c=0;c<d;++c){e[c]=b[c]/f}return e};o3djs.math.addMatrix=function(l,k){var c=[];var d=l.length;var m=l[0].length;for(var g=0;g<d;++g){var n=[];var h=l[g];var e=k[g];for(var f=0;f<m;++f){n[f]=h[f]+e[f]}c[g]=n}return c};o3djs.math.subMatrix=function(l,k){var c=[];var d=l.length;var m=l[0].length;for(var g=0;g<d;++g){var n=[];var h=l[g];var e=k[g];for(var f=0;f<m;++f){n[f]=h[f]-e[f]}c[g]=n}return c};o3djs.math.lerpMatrix=function(l,k,n){var c=[];var d=l.length;var m=l[0].length;for(var g=0;g<d;++g){var o=[];var h=l[g];var e=k[g];for(var f=0;f<m;++f){o[f]=(1-n)*h[f]+n*e[f]}c[g]=o}return c};o3djs.math.divMatrixScalar=function(b,c){var g=[];var f=b.length;var a=b[0].length;for(var e=0;e<f;++e){g[e]=[];for(var d=0;d<a;++d){g[e][d]=b[e][d]/c}}return g};o3djs.math.negativeScalar=function(b){return -b};o3djs.math.negativeVector=function(a){var c=[];var d=a.length;for(var b=0;b<d;++b){c[b]=-a[b]}return c};o3djs.math.negativeMatrix=function(b){var f=[];var e=b.length;var a=b[0].length;for(var d=0;d<e;++d){f[d]=[];for(var c=0;c<a;++c){f[d][c]=-b[d][c]}}return f};o3djs.math.copyScalar=function(b){return b};o3djs.math.copyVector=function(a){var c=[];for(var b=0;b<a.length;b++){c[b]=a[b]}return c};o3djs.math.copyMatrix=function(a){var e=[];var d=a.length;for(var c=0;c<d;++c){e[c]=[];for(var b=0;b<a[c].length;b++){e[c][b]=a[c][b]}}return e};o3djs.math.mulScalarScalar=function(d,c){return d*c};o3djs.math.mulScalarVector=function(b,a){var d=[];var e=a.length;for(var c=0;c<e;++c){d[c]=b*a[c]}return d};o3djs.math.mulVectorScalar=function(b,a){return o3djs.math.mulScalarVector(a,b)};o3djs.math.mulScalarMatrix=function(c,b){var g=[];var f=b.length;var a=b[0].length;for(var e=0;e<f;++e){g[e]=[];for(var d=0;d<a;++d){g[e][d]=c*b[e][d]}}return g};o3djs.math.mulMatrixScalar=function(a,b){return o3djs.math.mulScalarMatrix(b,a)};o3djs.math.mulVectorVector=function(d,c){var g=[];var f=d.length;for(var e=0;e<f;++e){g[e]=d[e]*c[e]}return g};o3djs.math.divVectorVector=function(d,c){var g=[];var f=d.length;for(var e=0;e<f;++e){g[e]=d[e]/c[e]}return g};o3djs.math.rowMajor.mulVectorMatrix=function(c,b){var f=[];var a=b[0].length;var g=c.length;for(var e=0;e<a;++e){f[e]=0;for(var d=0;d<g;++d){f[e]+=c[d]*b[d][e]}}return f};o3djs.math.columnMajor.mulVectorMatrix=function(b,a){var g=[];var f=a.length;var h=b.length;for(var d=0;d<f;++d){g[d]=0;var e=a[d];for(var c=0;c<h;++c){g[d]+=b[c]*e[c]}}return g};o3djs.math.mulVectorMatrix=null;o3djs.math.rowMajor.mulMatrixVector=function(b,c){var g=[];var f=b.length;var a=b[0].length;for(var e=0;e<f;++e){g[e]=0;var h=b[e];for(var d=0;d<a;++d){g[e]+=h[d]*c[d]}}return g};o3djs.math.columnMajor.mulMatrixVector=function(b,c){var f=[];var a=b[0].length;var g=c.length;for(var e=0;e<a;++e){f[e]=0;for(var d=0;d<g;++d){f[e]+=c[d]*b[d][e]}}return f};o3djs.math.mulMatrixVector=null;o3djs.math.rowMajor.mulMatrixMatrix2=function(n,l){var f=n[0];var d=n[1];var o=l[0];var m=l[1];var h=f[0];var g=f[1];var q=d[0];var p=d[1];var k=o[0];var j=o[1];var e=m[0];var c=m[1];return[[h*k+g*e,h*j+g*c],[q*k+p*e,q*j+p*c]]};o3djs.math.columnMajor.mulMatrixMatrix2=function(n,l){var f=n[0];var d=n[1];var o=l[0];var m=l[1];var h=f[0];var g=f[1];var q=d[0];var p=d[1];var k=o[0];var j=o[1];var e=m[0];var c=m[1];return[[h*k+q*j,g*k+p*j],[h*e+q*c,g*e+p*c]]};o3djs.math.mulMatrixMatrix2=null;o3djs.math.rowMajor.mulMatrixMatrix3=function(w,v){var C=w[0];var B=w[1];var z=w[2];var l=v[0];var k=v[1];var h=v[2];var A=C[0];var y=C[1];var x=C[2];var j=B[0];var g=B[1];var f=B[2];var r=z[0];var q=z[1];var p=z[2];var o=l[0];var n=l[1];var m=l[2];var u=k[0];var t=k[1];var s=k[2];var e=h[0];var d=h[1];var c=h[2];return[[A*o+y*u+x*e,A*n+y*t+x*d,A*m+y*s+x*c],[j*o+g*u+f*e,j*n+g*t+f*d,j*m+g*s+f*c],[r*o+q*u+p*e,r*n+q*t+p*d,r*m+q*s+p*c]]};o3djs.math.columnMajor.mulMatrixMatrix3=function(w,v){var C=w[0];var B=w[1];var z=w[2];var l=v[0];var k=v[1];var h=v[2];var A=C[0];var y=C[1];var x=C[2];var j=B[0];var g=B[1];var f=B[2];var r=z[0];var q=z[1];var p=z[2];var o=l[0];var n=l[1];var m=l[2];var u=k[0];var t=k[1];var s=k[2];var e=h[0];var d=h[1];var c=h[2];return[[A*o+j*n+r*m,y*o+g*n+q*m,x*o+f*n+p*m],[A*u+j*t+r*s,y*u+g*t+q*s,x*u+f*t+p*s],[A*e+j*d+r*c,y*e+g*d+q*c,x*e+f*d+p*c]]};o3djs.math.mulMatrixMatrix3=null;o3djs.math.rowMajor.mulMatrixMatrix4=function(S,R){var M=S[0];var K=S[1];var J=S[2];var H=S[3];var w=R[0];var v=R[1];var t=R[2];var r=R[3];var B=M[0];var z=M[1];var y=M[2];var x=M[3];var k=K[0];var j=K[1];var h=K[2];var g=K[3];var Q=J[0];var P=J[1];var O=J[2];var N=J[3];var E=H[0];var D=H[1];var C=H[2];var A=H[3];var q=w[0];var o=w[1];var m=w[2];var l=w[3];var f=v[0];var e=v[1];var d=v[2];var c=v[3];var L=t[0];var I=t[1];var G=t[2];var F=t[3];var u=r[0];var s=r[1];var p=r[2];var n=r[3];return[[B*q+z*f+y*L+x*u,B*o+z*e+y*I+x*s,B*m+z*d+y*G+x*p,B*l+z*c+y*F+x*n],[k*q+j*f+h*L+g*u,k*o+j*e+h*I+g*s,k*m+j*d+h*G+g*p,k*l+j*c+h*F+g*n],[Q*q+P*f+O*L+N*u,Q*o+P*e+O*I+N*s,Q*m+P*d+O*G+N*p,Q*l+P*c+O*F+N*n],[E*q+D*f+C*L+A*u,E*o+D*e+C*I+A*s,E*m+D*d+C*G+A*p,E*l+D*c+C*F+A*n]]};o3djs.math.columnMajor.mulMatrixMatrix4=function(S,R){var M=S[0];var K=S[1];var J=S[2];var H=S[3];var w=R[0];var v=R[1];var t=R[2];var r=R[3];var B=M[0];var z=M[1];var y=M[2];var x=M[3];var k=K[0];var j=K[1];var h=K[2];var g=K[3];var Q=J[0];var P=J[1];var O=J[2];var N=J[3];var E=H[0];var D=H[1];var C=H[2];var A=H[3];var q=w[0];var o=w[1];var m=w[2];var l=w[3];var f=v[0];var e=v[1];var d=v[2];var c=v[3];var L=t[0];var I=t[1];var G=t[2];var F=t[3];var u=r[0];var s=r[1];var p=r[2];var n=r[3];return[[B*q+k*o+Q*m+E*l,z*q+j*o+P*m+D*l,y*q+h*o+O*m+C*l,x*q+g*o+N*m+A*l],[B*f+k*e+Q*d+E*c,z*f+j*e+P*d+D*c,y*f+h*e+O*d+C*c,x*f+g*e+N*d+A*c],[B*L+k*I+Q*G+E*F,z*L+j*I+P*G+D*F,y*L+h*I+O*G+C*F,x*L+g*I+N*G+A*F],[B*u+k*s+Q*p+E*n,z*u+j*s+P*p+D*n,y*u+h*s+O*p+C*n,x*u+g*s+N*p+A*n]]};o3djs.math.mulMatrixMatrix4=null;o3djs.math.rowMajor.mulMatrixMatrix=function(m,l){var c=[];var p=m.length;var d=l[0].length;var n=l.length;for(var g=0;g<p;++g){var o=[];var h=m[g];for(var f=0;f<d;++f){o[f]=0;for(var e=0;e<n;++e){o[f]+=h[e]*l[e][f]}}c[g]=o}return c};o3djs.math.columnMajor.mulMatrixMatrix=function(n,m){var c=[];var d=m.length;var p=n[0].length;var h=n.length;for(var l=0;l<d;++l){var o=[];var f=m[l];for(var g=0;g<p;++g){o[g]=0;for(var e=0;e<h;++e){o[g]+=f[e]*n[e][g]}}c[l]=o}return c};o3djs.math.mulMatrixMatrix=null;o3djs.math.rowMajor.column=function(a,b){var e=[];var d=a.length;for(var c=0;c<d;++c){e[c]=a[c][b]}return e};o3djs.math.columnMajor.column=function(a,b){return a[b].slice()};o3djs.math.column=null;o3djs.math.rowMajor.row=function(a,b){return a[b].slice()};o3djs.math.columnMajor.row=function(a,c){var e=[];var d=a.length;for(var b=0;b<d;++b){e[b]=a[b][c]}return e};o3djs.math.row=null;o3djs.math.identity=function(d){var c=[];for(var a=0;a<d;++a){c[a]=[];for(var b=0;b<d;++b){c[a][b]=(b==a)?1:0}}return c};o3djs.math.transpose=function(b){var f=[];var a=b[0].length;var e=b.length;for(var c=0;c<a;++c){f[c]=[];for(var d=0;d<e;++d){f[c][d]=b[d][c]}}return f};o3djs.math.trace=function(a){var d=0;var c=a.length;for(var b=0;b<c;++b){d+=a[b][b]}return d};o3djs.math.det1=function(a){return a[0][0]};o3djs.math.det2=function(a){return a[0][0]*a[1][1]-a[0][1]*a[1][0]};o3djs.math.det3=function(a){return a[2][2]*(a[0][0]*a[1][1]-a[0][1]*a[1][0])-a[2][1]*(a[0][0]*a[1][2]-a[0][2]*a[1][0])+a[2][0]*(a[0][1]*a[1][2]-a[0][2]*a[1][1])};o3djs.math.det4=function(c){var b=c[0][0]*c[1][1]-c[0][1]*c[1][0];var g=c[0][0]*c[1][2]-c[0][2]*c[1][0];var f=c[0][0]*c[1][3]-c[0][3]*c[1][0];var d=c[0][1]*c[1][2]-c[0][2]*c[1][1];var a=c[0][1]*c[1][3]-c[0][3]*c[1][1];var e=c[0][2]*c[1][3]-c[0][3]*c[1][2];return c[3][3]*(c[2][2]*b-c[2][1]*g+c[2][0]*d)-c[3][2]*(c[2][3]*b-c[2][1]*f+c[2][0]*a)+c[3][1]*(c[2][3]*g-c[2][2]*f+c[2][0]*e)-c[3][0]*(c[2][3]*d-c[2][2]*a+c[2][1]*e)};o3djs.math.inverse1=function(a){return[[1/a[0][0]]]};o3djs.math.inverse2=function(a){var b=1/(a[0][0]*a[1][1]-a[0][1]*a[1][0]);return[[b*a[1][1],-b*a[0][1]],[-b*a[1][0],b*a[0][0]]]};o3djs.math.inverse3=function(a){var b=a[1][1]*a[2][2]-a[1][2]*a[2][1];var c=a[0][1]*a[2][2]-a[0][2]*a[2][1];var e=a[0][1]*a[1][2]-a[0][2]*a[1][1];var f=1/(a[0][0]*b-a[1][0]*c+a[2][0]*e);return[[f*b,-f*c,f*e],[-f*(a[1][0]*a[2][2]-a[1][2]*a[2][0]),f*(a[0][0]*a[2][2]-a[0][2]*a[2][0]),-f*(a[0][0]*a[1][2]-a[0][2]*a[1][0])],[f*(a[1][0]*a[2][1]-a[1][1]*a[2][0]),-f*(a[0][0]*a[2][1]-a[0][1]*a[2][0]),f*(a[0][0]*a[1][1]-a[0][1]*a[1][0])]]};o3djs.math.inverse4=function(w){var e=w[2][2]*w[3][3];var c=w[3][2]*w[2][3];var b=w[1][2]*w[3][3];var a=w[3][2]*w[1][3];var G=w[1][2]*w[2][3];var F=w[2][2]*w[1][3];var E=w[0][2]*w[3][3];var D=w[3][2]*w[0][3];var C=w[0][2]*w[2][3];var B=w[2][2]*w[0][3];var r=w[0][2]*w[1][3];var p=w[1][2]*w[0][3];var o=w[2][0]*w[3][1];var n=w[3][0]*w[2][1];var l=w[1][0]*w[3][1];var k=w[3][0]*w[1][1];var j=w[1][0]*w[2][1];var h=w[2][0]*w[1][1];var g=w[0][0]*w[3][1];var f=w[3][0]*w[0][1];var z=w[0][0]*w[2][1];var y=w[2][0]*w[0][1];var x=w[0][0]*w[1][1];var v=w[1][0]*w[0][1];var u=(e*w[1][1]+a*w[2][1]+G*w[3][1])-(c*w[1][1]+b*w[2][1]+F*w[3][1]);var t=(c*w[0][1]+E*w[2][1]+B*w[3][1])-(e*w[0][1]+D*w[2][1]+C*w[3][1]);var s=(b*w[0][1]+D*w[1][1]+r*w[3][1])-(a*w[0][1]+E*w[1][1]+p*w[3][1]);var q=(F*w[0][1]+C*w[1][1]+p*w[2][1])-(G*w[0][1]+B*w[1][1]+r*w[2][1]);var A=1/(w[0][0]*u+w[1][0]*t+w[2][0]*s+w[3][0]*q);return[[A*u,A*t,A*s,A*q],[A*((c*w[1][0]+b*w[2][0]+F*w[3][0])-(e*w[1][0]+a*w[2][0]+G*w[3][0])),A*((e*w[0][0]+D*w[2][0]+C*w[3][0])-(c*w[0][0]+E*w[2][0]+B*w[3][0])),A*((a*w[0][0]+E*w[1][0]+p*w[3][0])-(b*w[0][0]+D*w[1][0]+r*w[3][0])),A*((G*w[0][0]+B*w[1][0]+r*w[2][0])-(F*w[0][0]+C*w[1][0]+p*w[2][0]))],[A*((o*w[1][3]+k*w[2][3]+j*w[3][3])-(n*w[1][3]+l*w[2][3]+h*w[3][3])),A*((n*w[0][3]+g*w[2][3]+y*w[3][3])-(o*w[0][3]+f*w[2][3]+z*w[3][3])),A*((l*w[0][3]+f*w[1][3]+x*w[3][3])-(k*w[0][3]+g*w[1][3]+v*w[3][3])),A*((h*w[0][3]+z*w[1][3]+v*w[2][3])-(j*w[0][3]+y*w[1][3]+x*w[2][3]))],[A*((l*w[2][2]+h*w[3][2]+n*w[1][2])-(j*w[3][2]+o*w[1][2]+k*w[2][2])),A*((z*w[3][2]+o*w[0][2]+f*w[2][2])-(g*w[2][2]+y*w[3][2]+n*w[0][2])),A*((g*w[1][2]+v*w[3][2]+k*w[0][2])-(x*w[3][2]+l*w[0][2]+f*w[1][2])),A*((x*w[2][2]+j*w[0][2]+y*w[1][2])-(z*w[1][2]+v*w[2][2]+h*w[0][2]))]]};o3djs.math.codet=function(j,k,g){var l=j.length;var h=[];var f=0;for(var d=0;d<l-1;++d){if(f==k){f++}h[d]=[];var e=0;for(var c=0;c<l-1;++c){if(e==g){e++}h[d][c]=j[f][e];e++}f++}return o3djs.math.det(h)};o3djs.math.det=function(a){var g=a.length;if(g<=4){return o3djs.math["det"+g](a)}var e=0;var b=1;var f=a[0];var c=a.length;for(var h=0;h<c;h++){e+=b*f[h]*o3djs.math.codet(a,0,h);b*=-1}return e};o3djs.math.inverse=function(a){var g=a.length;if(g<=4){return o3djs.math["inverse"+g](a)}var f=[];var e=a.length;for(var b=0;b<e;++b){f[b]=[];for(var c=0;c<e;++c){f[b][c]=((c+b)%2?-1:1)*o3djs.math.codet(a,c,b)}}return o3djs.math.divMatrixScalar(f,o3djs.math.det(a))};o3djs.math.orthonormalize=function(a){var f=[];var e=a.length;for(var d=0;d<e;++d){var b=a[d];for(var c=0;c<d;++c){b=o3djs.math.subVector(b,o3djs.math.mulScalarVector(o3djs.math.dot(f[c],a[d]),f[c]))}f[d]=o3djs.math.normalize(b)}return f};o3djs.math.matrix4.inverse=function(a){return o3djs.math.inverse4(a)};o3djs.math.matrix4.mul=function(d,c){return o3djs.math.mulMatrixMatrix4(d,c)};o3djs.math.matrix4.det=function(a){return o3djs.math.det4(a)};o3djs.math.matrix4.copy=function(a){return o3djs.math.copyMatrix(a)};o3djs.math.matrix4.setUpper3x3=function(d,c){var g=c[0];var f=c[1];var e=c[2];d[0].splice(0,3,g[0],g[1],g[2]);d[1].splice(0,3,f[0],f[1],f[2]);d[2].splice(0,3,e[0],e[1],e[2]);return d};o3djs.math.matrix4.getUpper3x3=function(a){return[a[0].slice(0,3),a[1].slice(0,3),a[2].slice(0,3)]};o3djs.math.matrix4.setTranslation=function(b,c){b[3].splice(0,4,c[0],c[1],c[2],1);return b};o3djs.math.matrix4.getTranslation=function(a){return a[3].slice(0,3)};o3djs.math.matrix4.transformPoint=function(a,g){var h=g[0];var e=g[1];var c=g[2];var l=a[0];var k=a[1];var j=a[2];var f=a[3];var b=h*l[3]+e*k[3]+c*j[3]+f[3];return[(h*l[0]+e*k[0]+c*j[0]+f[0])/b,(h*l[1]+e*k[1]+c*j[1]+f[1])/b,(h*l[2]+e*k[2]+c*j[2]+f[2])/b]};o3djs.math.matrix4.transformVector4=function(a,f){var g=f[0];var d=f[1];var c=f[2];var b=f[3];var k=a[0];var j=a[1];var h=a[2];var e=a[3];return[g*k[0]+d*j[0]+c*h[0]+b*e[0],g*k[1]+d*j[1]+c*h[1]+b*e[1],g*k[2]+d*j[2]+c*h[2]+b*e[2],g*k[3]+d*j[3]+c*h[3]+b*e[3]]};o3djs.math.matrix4.transformDirection=function(a,e){var f=e[0];var c=e[1];var b=e[2];var j=a[0];var h=a[1];var g=a[2];var d=a[3];return[f*j[0]+c*h[0]+b*g[0],f*j[1]+c*h[1]+b*g[1],f*j[2]+c*h[2]+b*g[2]]};o3djs.math.matrix4.transformNormal=function(c,g){var d=o3djs.math.inverse4(c);var h=g[0];var f=g[1];var e=g[2];var b=d[0];var a=d[1];var k=d[2];var j=d[3];return[h*b[0]+f*b[1]+e*b[2],h*a[0]+f*a[1]+e*a[2],h*k[0]+f*k[1]+e*k[2]]};o3djs.math.matrix4.identity=function(){return[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]};o3djs.math.matrix4.perspective=function(g,c,d,a){var e=Math.tan(0.5*(Math.PI-g));var b=d-a;return[[e/c,0,0,0],[0,e,0,0],[0,0,a/b,-1],[0,0,d*a/b,0]]};o3djs.math.matrix4.orthographic=function(f,c,b,e,d,a){return[[2/(c-f),0,0,0],[0,2/(e-b),0,0],[0,0,1/(d-a),0],[(f+c)/(f-c),(b+e)/(b-e),d/(d-a),1]]};o3djs.math.matrix4.frustum=function(b,f,a,e,d,c){var j=(f-b);var h=(e-a);var g=(d-c);return[[2*d/j,0,0,0],[0,2*d/h,0,0],[(b+f)/j,(e+a)/h,c/g,-1],[0,0,d*c/g,0]]};o3djs.math.matrix4.lookAt=function(b,f,a){var c=o3djs.math.normalize(o3djs.math.subVector(b,f).slice(0,3)).concat(0);var e=o3djs.math.normalize(o3djs.math.cross(a,c)).concat(0);var d=o3djs.math.cross(c,e).concat(0);return o3djs.math.inverse([e,d,c,b.concat(1)])};o3djs.math.matrix4.composition=function(S,R){var M=S[0];var K=S[1];var J=S[2];var H=S[3];var w=R[0];var v=R[1];var t=R[2];var r=R[3];var B=M[0];var z=M[1];var y=M[2];var x=M[3];var k=K[0];var j=K[1];var h=K[2];var g=K[3];var Q=J[0];var P=J[1];var O=J[2];var N=J[3];var E=H[0];var D=H[1];var C=H[2];var A=H[3];var q=w[0];var o=w[1];var m=w[2];var l=w[3];var f=v[0];var e=v[1];var d=v[2];var c=v[3];var L=t[0];var I=t[1];var G=t[2];var F=t[3];var u=r[0];var s=r[1];var p=r[2];var n=r[3];return[[B*q+k*o+Q*m+E*l,z*q+j*o+P*m+D*l,y*q+h*o+O*m+C*l,x*q+g*o+N*m+A*l],[B*f+k*e+Q*d+E*c,z*f+j*e+P*d+D*c,y*f+h*e+O*d+C*c,x*f+g*e+N*d+A*c],[B*L+k*I+Q*G+E*F,z*L+j*I+P*G+D*F,y*L+h*I+O*G+C*F,x*L+g*I+N*G+A*F],[B*u+k*s+Q*p+E*n,z*u+j*s+P*p+D*n,y*u+h*s+O*p+C*n,x*u+g*s+N*p+A*n]]};o3djs.math.matrix4.compose=function(S,R){var M=S[0];var K=S[1];var J=S[2];var H=S[3];var w=R[0];var v=R[1];var t=R[2];var r=R[3];var B=M[0];var z=M[1];var y=M[2];var x=M[3];var k=K[0];var j=K[1];var h=K[2];var g=K[3];var Q=J[0];var P=J[1];var O=J[2];var N=J[3];var E=H[0];var D=H[1];var C=H[2];var A=H[3];var q=w[0];var o=w[1];var m=w[2];var l=w[3];var f=v[0];var e=v[1];var d=v[2];var c=v[3];var L=t[0];var I=t[1];var G=t[2];var F=t[3];var u=r[0];var s=r[1];var p=r[2];var n=r[3];S[0].splice(0,4,B*q+k*o+Q*m+E*l,z*q+j*o+P*m+D*l,y*q+h*o+O*m+C*l,x*q+g*o+N*m+A*l);S[1].splice(0,4,B*f+k*e+Q*d+E*c,z*f+j*e+P*d+D*c,y*f+h*e+O*d+C*c,x*f+g*e+N*d+A*c);S[2].splice(0,4,B*L+k*I+Q*G+E*F,z*L+j*I+P*G+D*F,y*L+h*I+O*G+C*F,x*L+g*I+N*G+A*F),S[3].splice(0,4,B*u+k*s+Q*p+E*n,z*u+j*s+P*p+D*n,y*u+h*s+O*p+C*n,x*u+g*s+N*p+A*n);return S};o3djs.math.matrix4.translation=function(a){return[[1,0,0,0],[0,1,0,0],[0,0,1,0],[a[0],a[1],a[2],1]]};o3djs.math.matrix4.translate=function(x,n){var g=n[0];var f=n[1];var e=n[2];var d=x[0];var c=x[1];var b=x[2];var a=x[3];var u=d[0];var s=d[1];var q=d[2];var o=d[3];var B=c[0];var A=c[1];var z=c[2];var y=c[3];var l=b[0];var k=b[1];var j=b[2];var h=b[3];var w=a[0];var t=a[1];var r=a[2];var p=a[3];a.splice(0,4,u*g+B*f+l*e+w,s*g+A*f+k*e+t,q*g+z*f+j*e+r,o*g+y*f+h*e+p);return x};o3djs.math.matrix4.scaling=function(a){return[[a[0],0,0,0],[0,a[1],0,0],[0,0,a[2],0],[0,0,0,1]]};o3djs.math.matrix4.scale=function(a,e){var f=e[0];var c=e[1];var b=e[2];var j=a[0];var h=a[1];var g=a[2];var d=a[3];j.splice(0,4,f*j[0],f*j[1],f*j[2],f*j[3]);h.splice(0,4,c*h[0],c*h[1],c*h[2],c*h[3]);g.splice(0,4,b*g[0],b*g[1],b*g[2],b*g[3]);return a};o3djs.math.matrix4.rotationX=function(b){var d=Math.cos(b);var a=Math.sin(b);return[[1,0,0,0],[0,d,a,0],[0,-a,d,0],[0,0,0,1]]};o3djs.math.matrix4.rotateX=function(f,g){var t=f[0];var q=f[1];var p=f[2];var o=f[3];var l=q[0];var k=q[1];var j=q[2];var h=q[3];var e=p[0];var d=p[1];var b=p[2];var a=p[3];var n=Math.cos(g);var r=Math.sin(g);q.splice(0,4,n*l+r*e,n*k+r*d,n*j+r*b,n*h+r*a);p.splice(0,4,n*e-r*l,n*d-r*k,n*b-r*j,n*a-r*h);return f};o3djs.math.matrix4.rotationY=function(b){var d=Math.cos(b);var a=Math.sin(b);return[[d,0,-a,0],[0,1,0,0],[a,0,d,0],[0,0,0,1]]};o3djs.math.matrix4.rotateY=function(f,g){var t=f[0];var q=f[1];var p=f[2];var n=f[3];var o=t[0];var l=t[1];var k=t[2];var j=t[3];var e=p[0];var d=p[1];var b=p[2];var a=p[3];var h=Math.cos(g);var r=Math.sin(g);t.splice(0,4,h*o-r*e,h*l-r*d,h*k-r*b,h*j-r*a);p.splice(0,4,h*e+r*o,h*d+r*l,h*b+r*k,h*a+r*j);return f};o3djs.math.matrix4.rotationZ=function(b){var d=Math.cos(b);var a=Math.sin(b);return[[d,a,0,0],[-a,d,0,0],[0,0,1,0],[0,0,0,1]]};o3djs.math.matrix4.rotateZ=function(a,b){var t=a[0];var q=a[1];var p=a[2];var n=a[3];var o=t[0];var l=t[1];var k=t[2];var j=t[3];var g=q[0];var f=q[1];var e=q[2];var d=q[3];var h=Math.cos(b);var r=Math.sin(b);t.splice(0,4,h*o+r*g,h*l+r*f,h*k+r*e,h*j+r*d);q.splice(0,4,h*g-r*o,h*f-r*l,h*e-r*k,h*d-r*j);return a};o3djs.math.matrix4.rotationZYX=function(h){var f=Math.sin(h[0]);var b=Math.cos(h[0]);var d=Math.sin(h[1]);var a=Math.cos(h[1]);var c=Math.sin(h[2]);var j=Math.cos(h[2]);var e=j*d;var g=c*d;return[[j*a,c*a,-d,0],[e*f-c*b,g*f+j*b,a*f,0],[e*b+c*f,g*b-j*f,a*b,0],[0,0,0,1]]};o3djs.math.matrix4.rotateZYX=function(F,C){var l=Math.sin(C[0]);var s=Math.cos(C[0]);var j=Math.sin(C[1]);var r=Math.cos(C[1]);var f=Math.sin(C[2]);var q=Math.cos(C[2]);var D=q*j;var t=f*j;var B=q*r;var A=f*r;var z=-j;var p=D*l-f*s;var o=t*l+q*s;var n=r*l;var P=D*s+f*l;var O=t*s-q*l;var N=r*s;var M=F[0];var L=F[1];var K=F[2];var J=F[3];var g=M[0];var d=M[1];var b=M[2];var a=M[3];var I=L[0];var H=L[1];var G=L[2];var E=L[3];var y=K[0];var x=K[1];var w=K[2];var u=K[3];var k=J[0];var h=J[1];var e=J[2];var c=J[3];M.splice(0,4,B*g+A*I+z*y,B*d+A*H+z*x,B*b+A*G+z*w,B*a+A*E+z*u);L.splice(0,4,p*g+o*I+n*y,p*d+o*H+n*x,p*b+o*G+n*w,p*a+o*E+n*u);K.splice(0,4,P*g+O*I+N*y,P*d+O*H+N*x,P*b+O*G+N*w,P*a+O*E+N*u);return F};o3djs.math.matrix4.axisRotation=function(f,g){var m=f[0];var l=f[1];var k=f[2];var d=Math.sqrt(m*m+l*l+k*k);m/=d;l/=d;k/=d;var a=m*m;var h=l*l;var e=k*k;var j=Math.cos(g);var o=Math.sin(g);var b=1-j;return[[a+(1-a)*j,m*l*b+k*o,m*k*b-l*o,0],[m*l*b-k*o,h+(1-h)*j,l*k*b+m*o,0],[m*k*b+l*o,l*k*b-m*o,e+(1-e)*j,0],[0,0,0,1]]};o3djs.math.matrix4.axisRotate=function(L,r,q){var H=r[0];var G=r[1];var F=r[2];var J=Math.sqrt(H*H+G*G+F*F);H/=J;G/=J;F/=J;var B=H*H;var k=G*G;var Q=F*F;var U=Math.cos(q);var I=Math.sin(q);var t=1-U;var E=B+(1-B)*U;var D=H*G*t+F*I;var C=H*F*t-G*I;var p=H*G*t-F*I;var o=k+(1-k)*U;var l=G*F*t+H*I;var X=H*F*t+G*I;var W=G*F*t-H*I;var V=Q+(1-Q)*U;var T=L[0];var S=L[1];var R=L[2];var P=L[3];var g=T[0];var e=T[1];var b=T[2];var a=T[3];var O=S[0];var N=S[1];var M=S[2];var K=S[3];var A=R[0];var w=R[1];var v=R[2];var u=R[3];var j=P[0];var h=P[1];var f=P[2];var d=P[3];T.splice(0,4,E*g+D*O+C*A,E*e+D*N+C*w,E*b+D*M+C*v,E*a+D*K+C*u);S.splice(0,4,p*g+o*O+l*A,p*e+o*N+l*w,p*b+o*M+l*v,p*a+o*K+l*u);R.splice(0,4,X*g+W*O+V*A,X*e+W*N+V*w,X*b+W*M+V*v,X*a+W*K+V*u);return L};o3djs.math.installRowMajorFunctions=function(){for(var a in o3djs.math.rowMajor){o3djs.math[a]=o3djs.math.rowMajor[a]}};o3djs.math.installColumnMajorFunctions=function(){for(var a in o3djs.math.columnMajor){o3djs.math[a]=o3djs.math.columnMajor[a]}};o3djs.math.installErrorCheckFunctions=function(){for(var a in o3djs.math.errorCheck){o3djs.math[a]=o3djs.math.errorCheck[a]}};o3djs.math.installErrorCheckFreeFunctions=function(){for(var a in o3djs.math.errorCheckFree){o3djs.math[a]=o3djs.math.errorCheckFree[a]}};o3djs.math.installRowMajorFunctions();o3djs.math.installErrorCheckFunctions();o3djs.provide("o3djs.rendergraph");o3djs.rendergraph=o3djs.rendergraph||{};o3djs.rendergraph.createView=function(e,d,c,h,g,b,a,f){return new o3djs.rendergraph.ViewInfo(e,d,c,h,g,b,a,f)};o3djs.rendergraph.createBasicView=function(d,c,b,f,e,a){return o3djs.rendergraph.createView(d,c,b,f,e,a)};o3djs.rendergraph.createExtraView=function(b,a,d,c){return o3djs.rendergraph.createView(b.pack,b.treeRoot,b.renderGraphRoot,d,c,a,b.performanceDrawList,b.zOrderedDrawList)};o3djs.rendergraph.ViewInfo=function(r,q,v,u,m,l,h,j){var f=this;var b=u||[0.5,0.5,0.5,1];var g=m||0;var t=0;var s=r.createObject("Viewport");if(l){s.viewport=l}s.priority=g;var a=r.createObject("ClearBuffer");a.clearColor=b;a.priority=t++;a.parent=s;var p=r.createObject("TreeTraversal");p.priority=t++;p.parent=s;p.transform=q;this.drawPassInfos_=[];this.pack=r;this.renderGraphRoot=v;this.treeRoot=q;this.root=s;this.viewport=s;this.clearBuffer=a;var d=r.createObject("DrawContext");this.drawContext=d;this.treeTraversal=p;this.priority=t;function c(w,x){return f.createDrawPass(w,undefined,undefined,undefined,x)}var o=c(o3djs.base.o3d.DrawList.BY_PERFORMANCE,h);var k=o.state;k.getStateParam("ColorWriteEnable").value=7;var n=c(o3djs.base.o3d.DrawList.BY_Z_ORDER,j);var e=n.state;e.getStateParam("ColorWriteEnable").value=7;e.getStateParam("AlphaBlendEnable").value=true;e.getStateParam("SourceBlendFunction").value=o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA;e.getStateParam("DestinationBlendFunction").value=o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA;e.getStateParam("AlphaTestEnable").value=true;e.getStateParam("AlphaComparisonFunction").value=o3djs.base.o3d.State.CMP_GREATER;e.getStateParam("ColorWriteEnable").value=7;if(v){this.root.parent=v}this.performanceDrawPassInfo=o;this.zOrderedDrawPassInfo=n;this.performanceStateSet=o.stateSet;this.performanceState=k;this.performanceDrawList=o.drawList;this.zOrderedStateSet=n.stateSet;this.zOrderedState=e;this.zOrderedDrawList=n.drawList;this.performanceDrawPass=o.drawPass;this.zOrderedDrawPass=n.drawPass};o3djs.rendergraph.ViewInfo.prototype.destroy=function(a,c){if(a===undefined){a=true}for(var b=0;b<this.drawPassInfos_.length;++b){this.drawPassInfos_[b].destroy()}this.pack.removeObject(this.viewport);this.pack.removeObject(this.clearBuffer);if(a){this.pack.removeObject(this.drawContext)}this.pack.removeObject(this.treeTraversal);this.viewport.parent=null};o3djs.rendergraph.ViewInfo.prototype.createDrawPass=function(c,b,d,a,e){b=b||this.drawContext;a=a||this.viewport;d=(typeof d!=="undefined")?d:this.priority++;var f=o3djs.rendergraph.createDrawPassInfo(this.pack,b,c,a,e);f.root.priority=d;this.treeTraversal.registerDrawList(f.drawList,b,true);this.drawPassInfos_.push(f);return f};o3djs.rendergraph.createDrawPassInfo=function(c,e,b,a,d){return new o3djs.rendergraph.DrawPassInfo(c,e,b,a,d)};o3djs.rendergraph.DrawPassInfo=function(g,b,j,f,h){var e=h?false:true;f=f||null;h=h||g.createObject("DrawList");var c=g.createObject("StateSet");var a=g.createObject("State");c.state=a;c.parent=f;var d=g.createObject("DrawPass");d.drawList=h;d.sortMethod=j;d.parent=c;this.pack=g;this.state=a;this.stateSet=c;this.drawPass=d;this.drawList=h;this.root=c;this.ownDrawList_=e};o3djs.rendergraph.DrawPassInfo.prototype.destroy=function(){if(this.ownDrawList_){this.drawList.parent=null;this.pack_.removeObject(this.drawList)}this.drawPass.parent=null;this.stateSet.parent=null;this.pack.removeObject(this.drawPass);this.pack.removeObject(this.stateSet);this.pack.removeObject(this.state)};o3djs.provide("o3djs.primitives");o3djs.primitives=o3djs.primitives||{};o3djs.primitives.setCullingInfo=function(c){var d=c.getBoundingBox(0);c.boundingBox=d;var b=d.minExtent;var a=d.maxExtent;c.zSortPoint=o3djs.math.divVectorScalar(o3djs.math.addVector(b,a),2)};o3djs.primitives.VertexStreamInfo=function(b,a,c){this.numComponents=b;this.semantic=a;this.semanticIndex=c||0;this.elements=[];this.addElement=function(d,g,f,e){};this.setElement=function(e,d,h,g,f){};this.addElementVector=function(d){};this.setElementVector=function(e,d){};this.getElementVector=function(d){return[]};switch(b){case 1:this.addElement=function(d){this.elements.push(d)};this.getElement=function(d){return this.elements[d]};this.setElement=function(d,e){this.elements[d]=e};break;case 2:this.addElement=function(e,d){this.elements.push(e,d)};this.addElementVector=function(d){this.elements.push(d[0],d[1])};this.getElementVector=function(d){return this.elements.slice(d*b,(d+1)*b)};this.setElement=function(f,e,d){this.elements[f*b+0]=e;this.elements[f*b+1]=d};this.setElementVector=function(e,d){this.elements[e*b+0]=d[0];this.elements[e*b+1]=d[1]};break;case 3:this.addElement=function(f,e,d){this.elements.push(f,e,d)};this.addElementVector=function(d){this.elements.push(d[0],d[1],d[2])};this.getElementVector=function(d){return this.elements.slice(d*b,(d+1)*b)};this.setElement=function(g,f,e,d){this.elements[g*b+0]=f;this.elements[g*b+1]=e;this.elements[g*b+2]=d};this.setElementVector=function(e,d){this.elements[e*b+0]=d[0];this.elements[e*b+1]=d[1];this.elements[e*b+2]=d[2]};break;case 4:this.addElement=function(g,f,e,d){this.elements.push(g,f,e,d)};this.addElementVector=function(d){this.elements.push(d[0],d[1],d[2],d[3])};this.getElementVector=function(d){return this.elements.slice(d*b,(d+1)*b)};this.setElement=function(h,g,f,e,d){this.elements[h*b+0]=g;this.elements[h*b+1]=f;this.elements[h*b+2]=e;this.elements[h*b+3]=d};this.setElementVector=function(e,d){this.elements[e*b+0]=d[0];this.elements[e*b+1]=d[1];this.elements[e*b+2]=d[2];this.elements[e*b+3]=d[3]};break;default:throw"A stream must contain between 1 and 4 components"}};o3djs.primitives.VertexStreamInfo.prototype.numElements=function(){return this.elements.length/this.numComponents};o3djs.primitives.createVertexStreamInfo=function(b,a,c){return new o3djs.primitives.VertexStreamInfo(b,a,c)};o3djs.primitives.VertexInfo=function(){this.streams=[];this.indices=[]};o3djs.primitives.VertexInfo.prototype.addStream=function(b,a,d){this.removeStream(a,d);var c=o3djs.primitives.createVertexStreamInfo(b,a,d);this.streams.push(c);return c};o3djs.primitives.VertexInfo.prototype.findStream=function(a,c){c=c||0;for(var b=0;b<this.streams.length;++b){if(this.streams[b].semantic===a&&this.streams[b].semanticIndex==c){return this.streams[b]}}return null};o3djs.primitives.VertexInfo.prototype.removeStream=function(a,c){c=c||0;for(var b=0;b<this.streams.length;++b){if(this.streams[b].semantic===a&&this.streams[b].semanticIndex==c){this.streams.splice(b,1);return}}};o3djs.primitives.VertexInfo.prototype.numTriangles=function(){return this.indices.length/3};o3djs.primitives.VertexInfo.prototype.addTriangle=function(c,b,a){this.indices.push(c,b,a)};o3djs.primitives.VertexInfo.prototype.getTriangle=function(b){var a=b*3;return[this.indices[a+0],this.indices[a+1],this.indices[a+2]]};o3djs.primitives.VertexInfo.prototype.setTriangle=function(d,e,c,b){var a=d*3;this.indices[a+0]=e;this.indices[a+1]=c;this.indices[a+2]=b};o3djs.primitives.VertexInfo.prototype.validate=function(){var b=this.findStream(o3djs.base.o3d.Stream.POSITION);if(!b){throw"POSITION stream is missing"}var a=b.numElements();for(var d=0;d<this.streams.length;++d){if(this.streams[d].numElements()!==a){throw"Stream "+d+" contains "+this.streams[d].numElements()+" elements whereas the POSITION stream contains "+a}}for(var c=0;c<this.indices.length;++c){if(this.indices[c]<0||this.indices[c]>=a){throw"The index "+this.indices[c]+" is out of range [0, "+a+"]"}}};o3djs.primitives.VertexInfo.prototype.createShape=function(p,h){this.validate();var d=this.findStream(o3djs.base.o3d.Stream.POSITION);var o=d.numElements();var a=p.createObject("Shape");var j=p.createObject("Primitive");var t=p.createObject("StreamBank");j.owner=a;j.streamBank=t;j.material=h;j.numberPrimitives=this.indices.length/3;j.primitiveType=o3djs.base.o3d.Primitive.TRIANGLELIST;j.numberVertices=o;j.createDrawElement(p,null);var l=h.effect.getStreamInfo();for(var k=0;k<l.length;++k){var e=l[k].semantic;var m=l[k].semanticIndex;var g=this.findStream(e,m);if(!g){switch(e){case o3djs.base.o3d.Stream.TANGENT:case o3djs.base.o3d.Stream.BINORMAL:this.addTangentStreams(m);break;case o3djs.base.o3d.Stream.COLOR:g=this.addStream(4,e,m);for(var q=0;q<o;++q){g.addElement(1,1,1,1)}break;default:throw"Missing stream for semantic "+e+" with semantic index "+m}}}var r=p.createObject("VertexBuffer");var n=[];for(var k=0;k<this.streams.length;++k){var c=this.streams[k];var f=(c.semantic==o3djs.base.o3d.Stream.COLOR&&c.numComponents==4)?"UByteNField":"FloatField";n[k]=r.createField(f,c.numComponents);t.setVertexStream(c.semantic,c.semanticIndex,n[k],0)}r.allocateElements(o);for(var k=0;k<this.streams.length;++k){n[k].setAt(0,this.streams[k].elements)}var b=p.createObject("IndexBuffer");b.set(this.indices);j.indexBuffer=b;o3djs.primitives.setCullingInfo(j);return a};o3djs.primitives.VertexInfo.prototype.reorient=function(b){var e=o3djs.math;var g=e.inverse(e.matrix4.getUpper3x3(b));for(var d=0;d<this.streams.length;++d){var f=this.streams[d];if(f.numComponents==3){var a=f.numElements();switch(f.semantic){case o3djs.base.o3d.Stream.POSITION:for(var c=0;c<a;++c){f.setElementVector(c,e.matrix4.transformPoint(b,f.getElementVector(c)))}break;case o3djs.base.o3d.Stream.NORMAL:for(var c=0;c<a;++c){f.setElementVector(c,e.matrix4.transformNormal(b,f.getElementVector(c)))}break;case o3djs.base.o3d.Stream.TANGENT:case o3djs.base.o3d.Stream.BINORMAL:for(var c=0;c<a;++c){f.setElementVector(c,e.matrix4.transformDirection(b,f.getElementVector(c)))}break}}}};o3djs.primitives.VertexInfo.prototype.addTangentStreams=function(h){h=h||0;var d=o3djs.math;this.validate();var g=this.findStream(o3djs.base.o3d.Stream.POSITION);if(!g){throw"Cannot calculate tangent frame because POSITION stream is missing"}if(g.numComponents!=3){throw"Cannot calculate tangent frame because POSITION stream is not 3D"}var j=this.findStream(o3djs.base.o3d.Stream.NORMAL);if(!j){throw"Cannot calculate tangent frame because NORMAL stream is missing"}if(j.numComponents!=3){throw"Cannot calculate tangent frame because NORMAL stream is not 3D"}var D=this.findStream(o3djs.base.o3d.Stream.TEXCOORD,h);if(!D){throw"Cannot calculate tangent frame because TEXCOORD stream "+h+" is missing"}var G={};function u(H){return[Math.round(H[0]),Math.round(H[1]),Math.round(H[2])]}function q(H,I){return u(d.mulVectorScalar(H,100))+","+u(d.mulVectorScalar(I,100))}function f(H,L,K,J){var I=q(H,L);var M=G[I];if(!M){M=[[0,0,0],[0,0,0]]}M=d.addMatrix(M,[K,J]);G[I]=M}function p(H,J){var I=q(H,J);return G[I]}var b=this.numTriangles();for(var C=0;C<b;++C){var m=this.getTriangle(C);var n=[];var k=[];var v=[];for(var B=0;B<3;++B){var o=m[B];n[B]=D.getElementVector(o);k[B]=g.getElementVector(o);v[B]=j.getElementVector(o)}var l=[0,0,0];var x=[0,0,0];for(var a=0;a<3;++a){var t=[k[1][a]-k[0][a],n[1][0]-n[0][0],n[1][1]-n[0][1]];var r=[k[2][a]-k[0][a],n[2][0]-n[0][0],n[2][1]-n[0][1]];var w=d.normalize(d.cross(t,r));if(w[0]==0){w[0]=1}l[a]=-w[1]/w[0];x[a]=-w[2]/w[0]}var y=d.length(l);if(y>0.001){l=d.mulVectorScalar(l,1/y)}var c=d.length(x);if(c>0.001){x=d.mulVectorScalar(x,1/c)}for(var B=0;B<3;++B){f(k[B],v[B],l,x)}}var A=this.addStream(3,o3djs.base.o3d.Stream.TANGENT,h);var e=this.addStream(3,o3djs.base.o3d.Stream.BINORMAL,h);var z=g.numElements();for(var o=0;o<z;++o){var F=g.getElementVector(o);var E=j.getElementVector(o);var s=p(F,E);var l=s[0];l=d.subVector(l,d.mulVectorScalar(E,d.dot(E,l)));var y=d.length(l);if(y>0.001){l=d.mulVectorScalar(l,1/y)}var x=s[1];x=d.subVector(x,d.mulVectorScalar(l,d.dot(l,x)));x=d.subVector(x,d.mulVectorScalar(E,d.dot(E,x)));var c=d.length(x);if(c>0.001){x=d.mulVectorScalar(x,1/c)}A.setElementVector(o,l);e.setElementVector(o,x)}};o3djs.primitives.createVertexInfo=function(){return new o3djs.primitives.VertexInfo()};o3djs.primitives.createSphereVertices=function(c,n,A,h){if(n<=0||A<=0){throw Error("subdivisionAxis and subdivisionHeight must be > 0")}var t=o3djs.primitives.createVertexInfo();var g=t.addStream(3,o3djs.base.o3d.Stream.POSITION);var j=t.addStream(3,o3djs.base.o3d.Stream.NORMAL);var z=t.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);for(var l=0;l<=A;l++){for(var m=0;m<=n;m++){var p=m/n;var o=l/A;var k=2*Math.PI*p;var b=Math.PI*o;var w=Math.sin(k);var q=Math.cos(k);var s=Math.sin(b);var a=Math.cos(b);var f=q*s;var e=a;var d=w*s;g.addElement(c*f,c*e,c*d);j.addElement(f,e,d);z.addElement(1-p,1-o)}}var r=n+1;for(var m=0;m<n;m++){for(var l=0;l<A;l++){t.addTriangle((l+0)*r+m,(l+0)*r+m+1,(l+1)*r+m);t.addTriangle((l+1)*r+m,(l+0)*r+m+1,(l+1)*r+m+1)}}if(h){t.reorient(h)}return t};o3djs.primitives.createSphere=function(d,e,a,g,b,f){var c=o3djs.primitives.createSphereVertices(a,g,b,f);return c.createShape(d,e)};o3djs.primitives.CUBE_FACE_INDICES_=[[3,7,5,1],[0,4,6,2],[6,7,3,2],[0,1,5,4],[5,7,6,4],[2,3,1,0]];o3djs.primitives.createCubeVertices=function(t,l){var c=t/2;var p=[[-c,-c,-c],[+c,-c,-c],[-c,+c,-c],[+c,+c,-c],[-c,-c,+c],[+c,-c,+c],[-c,+c,+c],[+c,+c,+c]];var g=[[+1,+0,+0],[-1,+0,+0],[+0,+1,+0],[+0,-1,+0],[+0,+0,+1],[+0,+0,-1]];var r=[[0,0],[1,0],[1,1],[0,1]];var s=o3djs.primitives.createVertexInfo();var b=s.addStream(3,o3djs.base.o3d.Stream.POSITION);var o=s.addStream(3,o3djs.base.o3d.Stream.NORMAL);var j=s.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);for(var h=0;h<6;++h){var n=o3djs.primitives.CUBE_FACE_INDICES_[h];for(var q=0;q<4;++q){var e=p[n[q]];var m=g[h];var a=r[q];b.addElementVector(e);o.addElementVector(m);j.addElementVector(a);var d=4*h;s.addTriangle(d+0,d+1,d+2);s.addTriangle(d+0,d+2,d+3)}}if(l){s.reorient(l)}return s};o3djs.primitives.createCube=function(c,d,b,e){var a=o3djs.primitives.createCubeVertices(b,e);return a.createShape(c,d)};o3djs.primitives.createBox=function(c,e,d,a,f,g){var b=o3djs.primitives.createCubeVertices(1);b.reorient([[d,0,0,0],[0,a,0,0],[0,0,f,0],[0,0,0,1]]);if(g){b.reorient(g)}return b.createShape(c,e)};o3djs.primitives.createRainbowCube=function(k,h,n,e){var m=o3djs.primitives.createCubeVertices(n,e);var c=m.addStream(4,o3djs.base.o3d.Stream.COLOR);var a=[[1,0,0,1],[0,1,0,1],[0,0,1,1],[1,1,0,1],[0,1,1,1],[1,0,1,1],[0,0.5,0.3,1],[0.3,0,0.5,1]];var j=m.vertices;for(var d=0;d<6;++d){var g=o3djs.primitives.CUBE_FACE_INDICES_[d];for(var l=0;l<4;++l){var b=a[g[l]];c.addElementVector(b)}}return m.createShape(k,h)};o3djs.primitives.createDiscVertices=function(h,k,s,f,t,n){if(k<3){throw Error("divisions must be at least 3")}var C=s?s:1;var j=f?f:0;var u=t?t:1;var v=o3djs.primitives.createVertexInfo();var l=v.addStream(3,o3djs.base.o3d.Stream.POSITION);var p=v.addStream(3,o3djs.base.o3d.Stream.NORMAL);var B=v.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var g=0;if(j==0){l.addElement(0,0,0);p.addElement(0,1,0);B.addElement(0,0);g++}for(var e=Math.max(j,1);e<=C;++e){var m=h*Math.pow(e/C,u);for(var w=0;w<k;++w){var o=2*Math.PI*w/k;var r=m*Math.cos(o);var q=m*Math.sin(o);l.addElement(r,0,q);p.addElement(0,1,0);B.addElement(r,q);if(e>j){var E=g+(w+1)%k;var D=g+w;if(e>1){var A=g+w-k;var y=g+(w+1)%k-k;v.addTriangle(E,D,A);v.addTriangle(E,A,y)}else{v.addTriangle(0,E,D)}}}g+=k}if(n){v.reorient(n)}return v};o3djs.primitives.createDisc=function(h,g,f,c,b,a,d,e){var j=o3djs.primitives.createDiscVertices(f,c,b,a,d,e);return j.createShape(h,g)};o3djs.primitives.createCylinderVertices=function(c,p,t,k,g){if(t<1){throw Error("radialSubdivisions must be 1 or greater")}if(k<1){throw Error("verticalSubdivisions must be 1 or greater")}var s=o3djs.primitives.createVertexInfo();var e=s.addStream(3,o3djs.base.o3d.Stream.POSITION);var h=s.addStream(3,o3djs.base.o3d.Stream.NORMAL);var u=s.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var d=[];var f=[];var r=t+1;for(var q=-2;q<=k+2;++q){var o=c;var m=q/k;var j=p*m;if(q<0){j=0;m=1}else{if(q>k){j=p;m=1}}if(q==-2||q==k+2){o=0;m=0}j-=p/2;for(var n=0;n<r;++n){var a=Math.sin(n*Math.PI*2/t);var b=Math.cos(n*Math.PI*2/t);e.addElement(a*o,j,b*o);h.addElement((q<0||q>k)?0:a,(q<0)?-1:(q>k?1:0),(q<0||q>k)?0:b);u.addElement(n/t,m)}}var l=t*2;for(var q=0;q<k+4;++q){for(var n=0;n<t;++n){s.addTriangle(r*(q+0)+0+n,r*(q+0)+1+n,r*(q+1)+1+n);s.addTriangle(r*(q+0)+0+n,r*(q+1)+1+n,r*(q+1)+0+n)}}if(g){s.reorient(g)}return s};o3djs.primitives.createCylinder=function(d,e,a,f,h,b,g){var c=o3djs.primitives.createCylinderVertices(a,f,h,b,g);return c.createShape(d,e)};o3djs.primitives.createWedgeVertices=function(j,d,e){var k=o3djs.math;var m=o3djs.primitives.createVertexInfo();var a=m.addStream(3,o3djs.base.o3d.Stream.POSITION);var h=m.addStream(3,o3djs.base.o3d.Stream.NORMAL);var f=m.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var c=-d*0.5;var b=d*0.5;var g=[];var n=[];var l=[[j[0][0],j[0][1]],[j[1][0],j[1][1]],[j[2][0],j[2][1]]];g[0]=k.cross(k.normalize([l[1][0]-l[0][0],l[1][1]-l[0][1],c-c]),k.normalize([l[1][0]-l[1][0],l[1][1]-l[1][1],b-c]));g[1]=k.cross(k.normalize([l[2][0]-l[1][0],l[2][1]-l[1][1],c-c]),k.normalize([l[2][0]-l[2][0],l[2][1]-l[2][1],b-c]));g[2]=k.cross([l[0][0]-l[2][0],l[0][1]-l[2][1],c-c],[l[0][0]-l[0][0],l[0][1]-l[0][1],b-c]);a.addElement(l[0][0],l[0][1],c);h.addElement(0,0,-1);f.addElement(0,1);a.addElement(l[1][0],l[1][1],c);h.addElement(0,0,-1);f.addElement(1,0);a.addElement(l[2][0],l[2][1],c);h.addElement(0,0,-1);f.addElement(0,0);a.addElement(l[0][0],l[0][1],b);h.addElement(0,0,1);f.addElement(0,1);a.addElement(l[1][0],l[1][1],b);h.addElement(0,0,1);f.addElement(1,0);a.addElement(l[2][0],l[2][1],b);h.addElement(0,0,1);f.addElement(0,0);a.addElement(l[0][0],l[0][1],c);h.addElement(g[0][0],g[0][1],g[0][2]);f.addElement(0,1);a.addElement(l[1][0],l[1][1],c);h.addElement(g[0][0],g[0][1],g[0][2]);f.addElement(0,0);a.addElement(l[1][0],l[1][1],b);h.addElement(g[0][0],g[0][1],g[0][2]);f.addElement(1,0);a.addElement(l[0][0],l[0][1],b);h.addElement(g[0][0],g[0][1],g[0][2]);f.addElement(1,1);a.addElement(l[1][0],l[1][1],c);h.addElement(g[1][0],g[1][1],g[1][2]);f.addElement(0,1);a.addElement(l[2][0],l[2][1],c);h.addElement(g[1][0],g[1][1],g[1][2]);f.addElement(0,0);a.addElement(l[2][0],l[2][1],b);h.addElement(g[1][0],g[1][1],g[1][2]);f.addElement(1,0);a.addElement(l[1][0],l[1][1],b);h.addElement(g[1][0],g[1][1],g[1][2]);f.addElement(1,1);a.addElement(l[2][0],l[2][1],c);h.addElement(g[2][0],g[2][1],g[2][2]);f.addElement(0,1);a.addElement(l[0][0],l[0][1],c);h.addElement(g[2][0],g[2][1],g[2][2]);f.addElement(0,0);a.addElement(l[0][0],l[0][1],b);h.addElement(g[2][0],g[2][1],g[2][2]);f.addElement(1,0);a.addElement(l[2][0],l[2][1],b);h.addElement(g[2][0],g[2][1],g[2][2]);f.addElement(1,1);var n=[0,2,1,3,4,5,6,7,8,6,8,9,10,11,12,10,12,13,14,15,16,14,16,17];if(e){m.reorient(e)}return m};o3djs.primitives.createWedge=function(b,d,c,e,f){var a=o3djs.primitives.createWedgeVertices(c,e,f);return a.createShape(b,d)};o3djs.primitives.createPrismVertices=function(r,C,d){if(r.length<3){throw Error("there must be 3 or more points")}var a=-0.5*C;var t=0.5*C;var k=[];var p=o3djs.primitives.createVertexInfo();var c=p.addStream(3,o3djs.base.o3d.Stream.POSITION);var e=p.addStream(3,o3djs.base.o3d.Stream.NORMAL);var A=p.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var l=r.length;for(var s=0;s<l;++s){var q=(s+1)%l;var g=r[q][0]-r[s][0];var f=r[q][1]-r[s][1];var b=Math.sqrt(g*g+f*f);k[s]=[f/b,-g/b,0]}var B=r[0][0];var z=r[0][1];var w=r[0][0];var v=r[0][1];for(var s=1;s<l;++s){var g=r[s][0];var f=r[s][1];B=Math.min(B,g);z=Math.min(z,f);w=Math.max(w,g);v=Math.max(v,f)}var h=[];var u=[];var o=w-B;var m=v-z;for(var s=0;s<l;++s){h[s]=[(r[s][0]-B)/o,(r[s][1]-z)/m];u[s]=[(w-r[s][0])/o,(r[s][1]-z)/m]}for(var s=0;s<l;++s){var q=(s+1)%l;c.addElement(r[s][0],r[s][1],a);e.addElement(0,0,-1);A.addElement(u[s][0],u[s][1]);c.addElement(r[s][0],r[s][1],t),e.addElement(0,0,1);A.addElement(h[s][0],h[s][1]);c.addElement(r[s][0],r[s][1],a),e.addElement(k[s][0],k[s][1],k[s][2]);A.addElement(0,1);c.addElement(r[q][0],r[q][1],a),e.addElement(k[s][0],k[s][1],k[s][2]);A.addElement(0,0);c.addElement(r[q][0],r[q][1],t),e.addElement(k[s][0],k[s][1],k[s][2]);A.addElement(1,0);c.addElement(r[s][0],r[s][1],t),e.addElement(k[s][0],k[s][1],k[s][2]);A.addElement(1,1);if(s>0&&s<l-1){p.addTriangle(0,6*(s+1),6*s);p.addTriangle(1,6*s+1,6*(s+1)+1)}p.addTriangle(6*s+2,6*s+3,6*s+4);p.addTriangle(6*s+2,6*s+4,6*s+5)}if(d){p.reorient(d)}return p};o3djs.primitives.createPrism=function(b,d,c,e,f){var a=o3djs.primitives.createPrismVertices(c,e,f);return a.createShape(b,d)};o3djs.primitives.createPlaneVertices=function(a,e,b,f,h){if(b<=0||f<=0){throw Error("subdivisionWidth and subdivisionDepth must be > 0")}var n=o3djs.primitives.createVertexInfo();var c=n.addStream(3,o3djs.base.o3d.Stream.POSITION);var k=n.addStream(3,o3djs.base.o3d.Stream.NORMAL);var g=n.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);for(var j=0;j<=f;j++){for(var l=0;l<=b;l++){var o=l/b;var m=j/f;c.addElement(a*o-a*0.5,0,e*m-e*0.5);k.addElement(0,1,0);g.addElement(o,1-m)}}var d=b+1;for(var j=0;j<f;j++){for(var l=0;l<b;l++){n.addTriangle((j+0)*d+l,(j+1)*d+l,(j+0)*d+l+1);n.addTriangle((j+1)*d+l,(j+1)*d+l+1,(j+0)*d+l+1)}}if(h){n.reorient(h)}return n};o3djs.primitives.createPlane=function(c,e,d,g,a,f,h){var b=o3djs.primitives.createPlaneVertices(d,g,a,f,h);return b.createShape(c,e)};o3djs.primitives.createFadePlane=function(l,h,a,e,b,f,g){var m=o3djs.primitives.createPlaneVertices(a,e,b,f,g);var d=m.addStream(4,o3djs.base.o3d.Stream.COLOR);for(var j=0;j<=f;j++){var c=j/f;for(var k=0;k<=b;k++){d.addElement(1,1,1,c)}}return m.createShape(l,h)};o3djs.provide("o3djs.effect");o3djs.effect=o3djs.effect||{};o3djs.effect.TWO_COLOR_CHECKER_EFFECT_NAME="o3djs.effect.twoColorCheckerEffect";o3djs.effect.TWO_COLOR_CHECKER_FXSTRING="float4x4 worldViewProjection : WORLDVIEWPROJECTION;\nfloat4x4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\nfloat4x4 world : WORLD;\nfloat4 color1;\nfloat4 color2;\nfloat checkSize;\nfloat3 lightWorldPos;\nfloat3 lightColor;\n\nstruct VertexShaderInput {\n  float4 position : POSITION;\n  float4 normal : NORMAL;\n  float2 texcoord : TEXCOORD0;\n};\n\nstruct PixelShaderInput {\n  float4 position : POSITION;\n  float2 texcoord : TEXCOORD0;\n  float3 normal : TEXCOORD1;\n  float3 worldPosition : TEXCOORD2;\n};\n\nfloat4 checker(float2 uv) {\n  float fmodResult = fmod(floor(checkSize * uv.x) + \n                          floor(checkSize * uv.y), 2.0);\n  return (fmodResult < 1) ? color1 : color2;\n}\n\nPixelShaderInput vertexShaderFunction(VertexShaderInput input) {\n  PixelShaderInput output;\n\n  output.position = mul(input.position, worldViewProjection);\n  output.normal = mul(input.normal, worldInverseTranspose).xyz;\n  output.worldPosition = mul(input.position, world).xyz;\n  output.texcoord = input.texcoord;\n  return output;\n}\n\nfloat4 pixelShaderFunction(PixelShaderInput input): COLOR {\n  float3 surfaceToLight = \n      normalize(lightWorldPos - input.worldPosition);\n  float3 worldNormal = normalize(input.normal);\n  float4 check = checker(input.texcoord);\n  float4 directionalIntensity = \n      saturate(dot(worldNormal, surfaceToLight));\n  float4 outColor = directionalIntensity * check;\n  return float4(outColor.rgb, check.a);\n}\n\n// #o3d VertexShaderEntryPoint vertexShaderFunction\n// #o3d PixelShaderEntryPoint pixelShaderFunction\n// #o3d MatrixLoadOrder RowMajor\n";o3djs.effect.COLLADA_LIGHTING_TYPE_PARAM_NAME="collada.lightingType";o3djs.effect.COLLADA_LIGHTING_TYPES={phong:1,lambert:1,blinn:1,constant:1};o3djs.effect.COLLADA_SAMPLER_PARAMETER_PREFIXES=["emissive","ambient","diffuse","specular","bump"];o3djs.effect.isColladaLightingType=function(a){return o3djs.effect.COLLADA_LIGHTING_TYPES[a.toLowerCase()]==1};o3djs.effect.getColladaLightingType=function(a){var b=a.getParam(o3djs.effect.COLLADA_LIGHTING_TYPE_PARAM_NAME);if(b){var c=b.value.toLowerCase();if(o3djs.effect.isColladaLightingType(c)){return c}}return""};o3djs.effect.getNumTexCoordStreamsNeeded=function(c){var g=o3djs.effect.getColladaLightingType(c);if(!o3djs.effect.isColladaLightingType(g)){throw"not a collada standard material"}var d=o3djs.effect.COLLADA_SAMPLER_PARAMETER_PREFIXES;var f=0;for(var e=0;e<d.length;++e){var b=d[e];var a=c.getParam(b+"Sampler");if(a){++f}}return f};o3djs.effect.loadEffect=function(c,a){var b=o3djs.io.loadTextFileSynchronous(a);c.loadFromFXString(b)};o3djs.effect.createEffectFromFile=function(b,a){var c=b.getObjects(a,"o3d.Effect")[0];if(!c){c=b.createObject("Effect");o3djs.effect.loadEffect(c,a);c.name=a}return c};o3djs.effect.buildStandardShaderString=function(v,o){var j=v.getParam("bumpSampler");var n;var E=function(G){var H=G.value;if(!H){return"2D"}switch(H.className){case"o3d.Texture1D":return"1D";case"o3d.Texture2D":return"2D";case"o3d.Texture3D":return"3D";case"o3d.TextureCUBE":return"CUBE";default:return"2D"}};var m=function(G){var I=G.value;if(!I){return"2D"}var H=I.getParam("Texture");if(H){return E(H)}else{return"2D"}};var t=function(){return"uniform float4x4 worldViewProjection : WORLDVIEWPROJECTION;\nuniform float3 lightWorldPos;\nuniform float4 lightColor;\n"};var d=function(){return"uniform float4x4 world : WORLD;\nuniform float4x4 viewInverse : VIEWINVERSE;\nuniform float4x4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\n"};var b=function(L,I,H,K){if(K===undefined){K=true}var G=L.getParam(H+"Sampler");if(G){var J=m(G);I.push(H+J+"Texture");return"sampler"+J+" "+H+"Sampler;\n"}else{if(K){I.push(H+"Color");return"uniform float4 "+H+";\n"}else{return""}}};var u=function(J,H){var G=J.getParam(H+"Sampler");if(G){var I=m(G);return"  float4 "+H+" = tex"+I+"("+H+"Sampler, input."+H+"UV);\n"}else{return""}};var g=function(){return"  // #o3d VertexShaderEntryPoint vertexShaderFunction\n  // #o3d PixelShaderEntryPoint pixelShaderFunction\n  // #o3d MatrixLoadOrder RowMajor\n"};var B=function(H,G){G.push("constant");return t()+b(H,G,"emissive")+r(H,false,false)+"OutVertex vertexShaderFunction(InVertex input) {\n  OutVertex output;\n"+f()+C(H)+"  return output;\n}\nfloat4 pixelShaderFunction(OutVertex input) : COLOR {\n"+u(H,"emissive")+"  return emissive;\n}\n\n"+g()};var c=function(H,G){G.push("lambert");return t()+d()+b(H,G,"emissive")+b(H,G,"ambient")+b(H,G,"diffuse")+b(H,G,"bump",false)+r(H,true,false)+"OutVertex vertexShaderFunction(InVertex input) {\n  OutVertex output;\n"+C(H)+f()+h()+D()+l()+"  return output;\n}\nfloat4 pixelShaderFunction(OutVertex input) : COLOR\n{\n"+u(H,"emissive")+u(H,"ambient")+u(H,"diffuse")+x()+"  float3 surfaceToLight = normalize(input.surfaceToLight);\n  float4 litR = lit(dot(normal, surfaceToLight), 0, 0);\n  return float4((emissive +\n      lightColor * (ambient * diffuse + diffuse * litR.y)).rgb,      diffuse.a);\n}\n\n"+g()};var p=function(H,G){G.push("blinn");return t()+d()+b(H,G,"emissive")+b(H,G,"ambient")+b(H,G,"diffuse")+b(H,G,"specular")+b(H,G,"bump",false)+"uniform float shininess;\nuniform float specularFactor;\n"+r(H,true,true)+"OutVertex vertexShaderFunction(InVertex input) {\n  OutVertex output;\n"+C(H)+f()+h()+D()+a()+l()+"  return output;\n}\nfloat4 pixelShaderFunction(OutVertex input) : COLOR\n{\n"+u(H,"emissive")+u(H,"ambient")+u(H,"diffuse")+u(H,"specular")+x()+"  float3 surfaceToLight = normalize(input.surfaceToLight);\n  float3 surfaceToView = normalize(input.surfaceToView);\n  float3 halfVector = normalize(surfaceToLight + surfaceToView);\n  float4 litR = lit(dot(normal, surfaceToLight), \n                    dot(normal, halfVector), shininess);\n  return float4((emissive +\n  lightColor * (ambient * diffuse + diffuse * litR.y +\n                        + specular * litR.z * specularFactor)).rgb,      diffuse.a);\n}\n\n"+g()};var w=function(H,G){G.push("phong");return t()+d()+b(H,G,"emissive")+b(H,G,"ambient")+b(H,G,"diffuse")+b(H,G,"specular")+b(H,G,"bump",false)+"uniform float shininess;\nuniform float specularFactor;\n"+r(H,true,true)+"OutVertex vertexShaderFunction(InVertex input) {\n  OutVertex output;\n"+C(H)+f()+h()+D()+a()+l()+"  return output;\n}\nfloat4 pixelShaderFunction(OutVertex input) : COLOR\n{\n"+u(H,"emissive")+u(H,"ambient")+u(H,"diffuse")+u(H,"specular")+x()+"  float3 surfaceToLight = normalize(input.surfaceToLight);\n  float3 surfaceToView = normalize(input.surfaceToView);\n  float3 halfVector = normalize(surfaceToLight + surfaceToView);\n  float4 litR = lit(dot(normal, surfaceToLight), \n                    dot(normal, halfVector), shininess);\n  return float4((emissive +\n  lightColor * (ambient * diffuse + diffuse * litR.y +\n                        + specular * litR.z * specularFactor)).rgb,      diffuse.a);\n}\n\n"+g()};var F;var e=function(H,G){if(H.getParam(G+"Sampler")){return"  float2 "+G+"UV : TEXCOORD"+F+++";\n"}else{return""}};var q=function(G){F=0;return e(G,"emissive")+e(G,"ambient")+e(G,"diffuse")+e(G,"specular")};var s=function(H,G){if(H.getParam(G+"Sampler")){return"  output."+G+"UV = input."+G+"UV;\n"}else{return""}};var C=function(G){return s(G,"emissive")+s(G,"ambient")+s(G,"diffuse")+s(G,"specular")+s(G,"bump")};var A=function(){return j?("  float3 tangent      : TANGENT;\n  float3 binormal     : BINORMAL;\n  float2 bumpUV       : TEXCOORD"+F+++";\n"):""};var y=function(){return j?("  float3 tangent      : TEXCOORD"+F+++";\n  float3 binormal     : TEXCOORD"+F+++";\n  float2 bumpUV       : TEXCOORD"+F+++";\n"):""};var f=function(){return"  output.position = mul(input.position, worldViewProjection);\n"};var h=function(){return"  output.normal = mul(float4(input.normal, 0),\n                      worldInverseTranspose).xyz;\n"};var D=function(){return"  output.surfaceToLight = lightWorldPos - \n                          mul(input.position, world).xyz;\n"};var a=function(){return"  output.surfaceToView = (viewInverse[3] - mul(input.position,\n                                               world)).xyz;\n"};var l=function(){return j?("  output.binormal = mul(float4(input.binormal, 0), worldInverseTranspose).xyz;\n  output.tangent = mul(float4(input.tangent, 0), worldInverseTranspose).xyz;\n"):""};var x=function(){return j?("float3x3 tangentToWorld = float3x3(input.tangent,\n                                   input.binormal,\n                                   input.normal);\nfloat3 tangentNormal = tex2D(bumpSampler, input.bumpUV.xy).xyz -\n                       float3(0.5, 0.5, 0.5);\nfloat3 normal = mul(tangentNormal, tangentToWorld);\nnormal = normalize(normal);\n"):"  float3 normal = normalize(input.normal);\n"};var r=function(H,G,J){var I="struct InVertex {\n  float4 position     : POSITION;\n";if(G||J){I+="  float3 normal       : NORMAL;\n"}I+=q(H)+A()+"};\nstruct OutVertex {\n  float4 position     : POSITION;\n"+q(H)+y();if(G||J){I+="  float3 normal        : TEXCOORD"+F+++";\n  float3 surfaceToLight: TEXCOORD"+F+++";\n"}if(J){I+="  float3 surfaceToView : TEXCOORD"+F+++";\n"}I+="};\n";return I};var z;var k=[];if(o=="phong"){z=w(v,k)}else{if(o=="lambert"){z=c(v,k)}else{if(o=="blinn"){z=p(v,k)}else{if(o=="constant"){z=B(v,k)}else{throw ('unknown effect type "'+o+'"')}}}}return{description:k.join("_"),shader:z}};o3djs.effect.getStandardShader=function(c,f,b){var a=o3djs.effect.buildStandardShaderString(f,b);var g=c.getObjectsByClassName("o3d.Effect");for(var e=0;e<g.length;++e){if(g[e].name==a.description&&g[e].source==a.shader){return g[e]}}var d=c.createObject("Effect");if(d){d.name=a.description;if(d.loadFromFXString(a.shader)){return d}c.removeObject(d)}return null};o3djs.effect.attachStandardShader=function(b,d,e,a){var c=o3djs.effect.getStandardShader(b,d,a);if(c){d.effect=c;c.createUniformParameters(d);var f=d.getParam("lightWorldPos");if(!f.inputConnection){f.value=e}var f=d.getParam("lightColor");if(!f.inputConnection){f.value=[1,1,1,1]}return true}else{return false}};o3djs.effect.createUniformParameters=function(h,k,b){k.createUniformParameters(b);var g=k.getParameterInfo();for(var j=0;j<g.length;++j){var c=g[j];if(c.sasClassName.length==0){if(c.numElements>0){var a=h.createObject("ParamArray");var d=b.getParam(c.name);d.value=a;a.resize(c.numElements,c.className);if(c.className=="o3d.ParamSampler"){for(var e=0;e<c.numElements;++e){var f=h.createObject("Sampler");a.getParam(e).value=f}}}else{if(c.className=="o3d.ParamSampler"){var f=h.createObject("Sampler");var d=b.getParam(c.name);d.value=f}}}}};o3djs.effect.createCheckerEffect=function(a){var c=a.getObjects(o3djs.effect.TWO_COLOR_CHECKER_EFFECT_NAME,"o3d.Effect");if(c.length>0){return c[0]}var b=a.createObject("Effect");b.loadFromFXString(o3djs.effect.TWO_COLOR_CHECKER_FXSTRING);b.name=o3djs.effect.TWO_COLOR_CHECKER_EFFECT_NAME;return b};o3djs.provide("o3djs.io");o3djs.io=o3djs.io||{};o3djs.io.createLoadInfo=function(b,a){return new o3djs.io.LoadInfo(b,a)};o3djs.io.LoadInfo=function(b,a){this.request_=b;this.hasStatus_=a;this.streamLength_=0;this.children_=[]};o3djs.io.LoadInfo.prototype.addChild=function(a){this.children_.push(a)};o3djs.io.LoadInfo.prototype.finish=function(){if(this.request_){if(this.hasStatus_){this.streamLength_=this.request_.streamLength}this.request_=null}};o3djs.io.LoadInfo.prototype.getTotalKnownBytesToStreamSoFar=function(){if(!this.streamLength_&&this.request_&&this.hasStatus_){this.streamLength_=this.request_.streamLength}var a=this.streamLength_;for(var b=0;b<this.children_.length;++b){a+=this.children_[b].getTotalKnownBytesToStreamSoFar()}return a};o3djs.io.LoadInfo.prototype.getTotalBytesDownloaded=function(){var a=(this.request_&&this.hasStatus_)?this.request_.bytesReceived:this.streamLength_;for(var b=0;b<this.children_.length;++b){a+=this.children_[b].getTotalBytesDownloaded()}return a};o3djs.io.LoadInfo.prototype.getTotalKnownRequestsToStreamSoFar=function(){var a=1;for(var b=0;b<this.children_.length;++b){a+=this.children_[b].getTotalKnownRequestToStreamSoFar()}return a};o3djs.io.LoadInfo.prototype.getTotalRequestsDownloaded=function(){var a=this.request_?0:1;for(var b=0;b<this.children_.length;++b){a+=this.children_[b].getTotalRequestsDownloaded()}return a};o3djs.io.LoadInfo.prototype.getKnownProgressInfoSoFar=function(){var b=0;var d=this.getTotalKnownBytesToStreamSoFar();var a=this.getTotalBytesDownloaded();if(d>0){b=Math.floor(a/d*100)}var c=(d<1024*1024)?1024:(1024*1024);return{percent:b,downloaded:(a/c).toFixed(2),totalBytes:(d/c).toFixed(2),base:c,suffix:(c==1024?"kb":"mb")}};o3djs.io.loadTextFileSynchronous=function(b){o3djs.BROWSER_ONLY=true;var a='loadTextFileSynchronous failed to load url "'+b+'"';var c;if(!o3djs.base.IsMSIE()&&window.XMLHttpRequest){c=new XMLHttpRequest();if(c.overrideMimeType){c.overrideMimeType("text/plain")}}else{if(window.ActiveXObject){c=new ActiveXObject("MSXML2.XMLHTTP.3.0")}else{throw"XMLHttpRequest is disabled"}}c.open("GET",b,false);c.send(null);if(c.readyState!=4){throw a}return c.responseText};o3djs.io.loadTextFile=function(c,f){o3djs.BROWSER_ONLY=true;var b='loadTextFile failed to load url "'+c+'"';var e;if(!o3djs.base.IsMSIE()&&window.XMLHttpRequest){e=new XMLHttpRequest();if(e.overrideMimeType){e.overrideMimeType("text/plain")}}else{if(window.ActiveXObject){e=new ActiveXObject("MSXML2.XMLHTTP.3.0")}else{throw"XMLHttpRequest is disabled"}}var a=o3djs.io.createLoadInfo(e,false);e.open("GET",c,true);var d=function(){if(e.readyState==4){var h="";var g=e.status==200||e.status==0;if(g){h=e.responseText}a.finish();f(h,g?null:"could not load: "+c)}};e.onreadystatechange=d;e.send(null);return a};o3djs.io.ArchiveInfo=function(c,a,b){var d=this;this.files={};this.pack=c;this.destroyed=false;this.request_=null;function e(f){d.files[f.uri]=f}this.loadInfo=o3djs.io.loadArchiveAdvanced(c,a,e,function(g,f){d.request_=g;b(d,f)})};o3djs.io.ArchiveInfo.prototype.destroy=function(){if(!this.destroyed){this.pack.removeObject(this.request_);this.destroyed=true;this.files={}}};o3djs.io.ArchiveInfo.prototype.getFiles=function(c,d){if(!(c instanceof RegExp)){c=c.replace(/(\W)/g,"\\$&");c=c.replace(/\\\*/g,".*");c=c.replace(/\\\?/g,".");c=new RegExp(c,d?"i":"")}var b=[];for(var a in this.files){if(c.test(a)){b.push(this.files[a])}}return b};o3djs.io.ArchiveInfo.prototype.getFileByURI=function(b,c){if(c){b=b.toLowerCase();for(var a in this.files){if(a.toLowerCase()==b){return this.files[a]}}return undefined}else{return this.files[b]}};o3djs.io.loadArchive=function(d,b,c){var a=new o3djs.io.ArchiveInfo(d,b,c);return a.loadInfo};o3djs.io.loadArchiveAdvanced=function(e,c,g,d){var b='loadArchive failed to load url "'+c+'"';var f=e.createArchiveRequest();var a=o3djs.io.createLoadInfo(f,true);f.open("GET",c);f.onfileavailable=function(){g((f.data))};f.onreadystatechange=function(){if(f.done){a.finish();var j=f.success;var h=null;if(!j){h=f.error;if(!h){h="unknown error loading archive"}}d(f,h)}};f.send();return a};o3djs.io.loadTexture=function(c,b,e){var d=c.createFileRequest("TEXTURE");var a=o3djs.io.createLoadInfo((d),false);d.open("GET",b,true);d.onreadystatechange=function(){if(d.done){var g=d.texture;var h=d.success;var f=d.error;a.finish();c.removeObject(d);if(!h&&!f){f="unknown error loading texture"}e(g,h?null:f)}};d.send();return a};o3djs.provide("o3djs.arcball");o3djs.arcball=o3djs.arcball||{};o3djs.arcball.create=function(a,b){return new o3djs.arcball.ArcBall(a,b)};o3djs.arcball.ArcBall=function(a,b){this.startVector_=[0,0,0];this.endVector_=[0,0,0];this.areaWidth_=a;this.areaHeight_=b};o3djs.arcball.ArcBall.prototype.setAreaSize=function(a,b){this.areaWidth_=a;this.areaHeight_=b};o3djs.arcball.ArcBall.prototype.mapToSphere=function(a){var c=o3djs.math.copyVector(a);c[0]=c[0]/this.areaWidth_*2-1;c[1]=1-c[1]/this.areaHeight_*2;var b=o3djs.math.lengthSquared(c);if(b>1){return o3djs.math.normalize(c).concat(0)}else{return c.concat(Math.sqrt(1-b))}};o3djs.arcball.ArcBall.prototype.click=function(a){this.startVector_=this.mapToSphere(a)};o3djs.arcball.ArcBall.prototype.drag=function(a){this.endVector_=this.mapToSphere(a);return o3djs.math.cross(this.startVector_,this.endVector_).concat(o3djs.math.dot(this.startVector_,this.endVector_))};o3djs.provide("o3djs.quaternions");o3djs.quaternions=o3djs.quaternions||{};o3djs.quaternions.Quaterion=goog.typedef;o3djs.quaternions.mathType=function(b){if(typeof(b)==="number"){return"Scalar"}return"Quaternion"};o3djs.quaternions.copy=function(a){return a.slice()};o3djs.quaternions.negative=function(a){return[-a[0],-a[1],-a[2],-a[3]]};o3djs.quaternions.addQuaternionQuaternion=function(d,c){return[d[0]+c[0],d[1]+c[1],d[2]+c[2],d[3]+c[3]]};o3djs.quaternions.addQuaternionScalar=function(d,c){return d.slice(0,3).concat(d[3]+c)};o3djs.quaternions.addScalarQuaternion=function(d,c){return c.slice(0,3).concat(d+c[3])};o3djs.quaternions.subQuaternionQuaternion=function(d,c){return[d[0]-c[0],d[1]-c[1],d[2]-c[2],d[3]-c[3]]};o3djs.quaternions.subQuaternionScalar=function(d,c){return d.slice(0,3).concat(d[3]-c)};o3djs.quaternions.subScalarQuaternion=function(d,c){return[-c[0],-c[1],-c[2],d-c[3]]};o3djs.quaternions.mulScalarQuaternion=function(a,b){return[a*b[0],a*b[1],a*b[2],a*b[3]]};o3djs.quaternions.mulQuaternionScalar=function(b,a){return[a*b[0],a*b[1],a*b[2],a*b[3]]};o3djs.quaternions.mulQuaternionQuaternion=function(l,k){var h=l[0];var g=l[1];var f=l[2];var j=l[3];var d=k[0];var c=k[1];var m=k[2];var e=k[3];return[j*d+h*e+g*m-f*c,j*c+g*e+f*d-h*m,j*m+f*e+h*c-g*d,j*e-h*d-g*c-f*m]};o3djs.quaternions.divQuaternionQuaternion=function(n,m){var j=n[0];var h=n[1];var g=n[2];var k=n[3];var e=m[0];var c=m[1];var o=m[2];var f=m[3];var l=1/(f*f+e*e+c*c+o*o);return[(j*f-k*e-h*o+g*c)*l,(j*o-k*c+h*f-g*e)*l,(h*e+g*f-k*o-j*c)*l,(k*f+j*e+h*c+g*o)*l]};o3djs.quaternions.divQuaternionScalar=function(b,a){return[b[0]/a,b[1]/a,b[2]/a,b[3]/a]};o3djs.quaternions.divScalarQuaternion=function(f,c){var j=c[0];var h=c[1];var g=c[2];var e=c[3];var k=1/(j*j+h*h+g*g+e*e);return[-f*j*k,-f*h*k,-f*g*k,f*e*k]};o3djs.quaternions.inverse=function(c){var b=c[0];var a=c[1];var g=c[2];var f=c[3];var e=1/(b*b+a*a+g*g+f*f);return[-b*e,-a*e,-g*e,f*e]};o3djs.quaternions.mul=function(d,c){return o3djs.quaternions["mul"+o3djs.quaternions.mathType(d)+o3djs.quaternions.mathType(c)](d,c)};o3djs.quaternions.div=function(d,c){return o3djs.quaternions["div"+o3djs.quaternions.mathType(d)+o3djs.quaternions.mathType(c)](d,c)};o3djs.quaternions.add=function(d,c){return o3djs.quaternions["add"+o3djs.quaternions.mathType(d)+o3djs.quaternions.mathType(c)](d,c)};o3djs.quaternions.sub=function(d,c){return o3djs.quaternions["sub"+o3djs.quaternions.mathType(d)+o3djs.quaternions.mathType(c)](d,c)};o3djs.quaternions.length=function(b){return Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]+b[3]*b[3])};o3djs.quaternions.lengthSquared=function(b){return b[0]*b[0]+b[1]*b[1]+b[2]*b[2]+b[3]*b[3]};o3djs.quaternions.normalize=function(b){var c=1/Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]+b[3]*b[3]);return[b[0]*c,b[1]*c,b[2]*c,b[3]*c]};o3djs.quaternions.conjugate=function(a){return[-a[0],-a[1],-a[2],a[3]]};o3djs.quaternions.rotationX=function(a){return[Math.sin(a/2),0,0,Math.cos(a/2)]};o3djs.quaternions.rotationY=function(a){return[0,Math.sin(a/2),0,Math.cos(a/2)]};o3djs.quaternions.rotationZ=function(a){return[0,0,Math.sin(a/2),Math.cos(a/2)]};o3djs.quaternions.axisRotation=function(b,f){var e=1/Math.sqrt(b[0]*b[0]+b[1]*b[1]+b[2]*b[2]);var a=Math.sin(f/2);var c=Math.cos(f/2);return[a*b[0]*e,a*b[1]*e,a*b[2]*e,c]};o3djs.quaternions.quaternionToRotation=function(s){var r=s[0];var o=s[1];var m=s[2];var t=s[3];var p=t*t;var n=t*r;var l=t*o;var k=t*m;var e=r*t;var c=r*r;var b=r*o;var a=r*m;var x=o*t;var w=o*r;var v=o*o;var u=o*m;var j=m*t;var h=m*r;var g=m*o;var f=m*m;var y=p+c+v+f;return[[(p+c-v-f)/y,2*(k+b)/y,2*(a-l)/y,0],[2*(b-k)/y,(p-c+v-f)/y,2*(n+u)/y,0],[2*(l+a)/y,2*(u-n)/y,(p-c-v+f)/y,0],[0,0,0,1]]};o3djs.quaternions.rotationToQuaternion=function(a){var d;var c;var b;if(a[0][0]>a[1][1]&&a[0][0]>a[2][2]){d=0;c=1;b=2}else{if(a[1][1]>a[0][0]&&a[1][1]>a[2][2]){d=1;c=2;b=0}else{d=2;c=0;b=1}}var e=Math.sqrt(1+a[d][d]-a[c][c]-a[b][b]);var f=[];f[d]=0.5*e;f[c]=0.5*(a[c][d]+a[d][c])/e;f[b]=0.5*(a[d][b]+a[b][d])/e;f[3]=0.5*(a[c][b]-a[b][c])/e;return f};o3djs.provide("o3djs.material");o3djs.material=o3djs.material||{};o3djs.material.hasNonOneAlpha_=function(e,b){var j=false;var a=false;var f=null;var c=e.getParam(b+"Sampler");if(c&&c.isAClassName("o3d.ParamSampler")){j=true;var h=c.value;if(h){f=h.texture}}else{var g=e.getParam(b+"Texture");if(g&&g.isAClassName("o3d.ParamTexture")){j=true;f=g.value}}if(f&&!f.alphaIsOne){a=true}if(!j){var d=e.getParam(b);if(d&&d.isAClassName("o3d.ParamFloat4")){j=true}}return{found:j,nonOneAlpha:a}};o3djs.material.prepareMaterial=function(d,c,f,b){var e=c.performanceDrawList;if(!f.drawList){var g=f.getParam("collada.transparent");if(g&&g.className=="o3d.ParamBoolean"){f.drawList=g.value?c.zOrderedDrawList:c.performanceDrawList}}if(!f.effect){if(!b){var h=o3djs.effect.getColladaLightingType(f);if(h){b=h}}if(b){o3djs.material.attachStandardEffect(d,f,c,b);if(f.drawList==null){var a=o3djs.material.hasNonOneAlpha_(f,"diffuse");if(!a.found){a=o3djs.material.hasNonOneAlpha_(f,"emissive")}if(a.nonOneAlpha){e=c.zOrderedDrawList}}}}if(!f.drawList){f.drawList=e}};o3djs.material.prepareMaterials=function(d,c,a){var b=d.getObjectsByClassName("o3d.Material");for(var e=0;e<b.length;e++){o3djs.material.prepareMaterial(a||d,c,b[e])}};o3djs.material.attachStandardEffect=function(c,d,b,a){if(!d.effect){var e=o3djs.math.matrix4.getTranslation(o3djs.math.inverse(b.drawContext.view));if(!o3djs.effect.attachStandardShader(c,d,e,a)){throw"Could not attach a standard effect"}}};o3djs.material.setDrawListOnMaterials=function(b,d){var a=b.getObjectsByClassName("o3d.Material");for(var e=0;e<a.length;e++){var c=a[e];c.drawList=d}};o3djs.material.createBasicMaterial=function(e,c,h,b){var f=e.createObject("Material");f.drawList=b?c.zOrderedDrawList:c.performanceDrawList;if(h.length){f.createParam("diffuse","ParamFloat4").value=h}else{var a=f.createParam("diffuseSampler","ParamSampler");var d=e.createObject("Sampler");a.value=d;d.texture=h}f.createParam("emissive","ParamFloat4").value=[0,0,0,1];f.createParam("ambient","ParamFloat4").value=[0,0,0,1];f.createParam("specular","ParamFloat4").value=[1,1,1,1];f.createParam("shininess","ParamFloat").value=50;f.createParam("specularFactor","ParamFloat").value=1;f.createParam("lightColor","ParamFloat4").value=[1,1,1,1];var g=f.createParam("lightWorldPos","ParamFloat3");o3djs.material.attachStandardEffect(e,f,c,"phong");g.value=[1000,2000,3000];return f};o3djs.material.createConstantMaterial=function(e,c,g,b){var f=e.createObject("Material");f.drawList=b?c.zOrderedDrawList:c.performanceDrawList;if(g.length){f.createParam("emissive","ParamFloat4").value=g}else{var a=f.createParam("emissiveSampler","ParamSampler");var d=e.createObject("Sampler");a.value=d;d.texture=g}o3djs.material.attachStandardEffect(e,f,c,"constant");return f};o3djs.material.createCheckerMaterial=function(c,b,h,g,a,f){h=h||[0.4,0.5,0.5,1];g=g||[0.6,0.8,0.8,1];f=f||10;var e=o3djs.effect.createCheckerEffect(c);var d=c.createObject("Material");d.effect=e;d.drawList=a?b.zOrderedDrawList:b.performanceDrawList;o3djs.effect.createUniformParameters(c,e,d);d.getParam("color1").value=h;d.getParam("color2").value=g;d.getParam("checkSize").value=f;return d};o3djs.material.createMaterialFromFile=function(b,a,e){var d=o3djs.effect.createEffectFromFile(b,a);var c=b.createObject("Material");c.effect=d;c.drawList=e;o3djs.effect.createUniformParameters(b,d,c);return c};o3djs.material.bindParamsOnMaterial=function(a,e){for(var c in e){var b=e[c];var d=a.getParam(c);if(d&&b.isAClassName(d.className)){d.bind(b)}}};o3djs.material.bindParams=function(b,d){var a=b.getObjectsByClassName("o3d.Material");for(var c=0;c<a.length;++c){o3djs.material.bindParamsOnMaterial(a[c],d)}};o3djs.material.createParams=function(a,b){var e=a.createObject("ParamObject");var d={};for(var c in b){d[c]=e.createParam(c,b[c])}return d};o3djs.material.createStandardParams=function(a){var b={lightColor:"ParamFloat4",lightWorldPos:"ParamFloat3"};return o3djs.material.createParams(a,b)};o3djs.material.createAndBindStandardParams=function(a){var b=o3djs.material.createStandardParams(a);o3djs.material.bindParams(a,b);return b};var jgblue=jgblue||{};jgblue.j3d=jgblue.j3d||{};jgblue.j3d.ASSETS="/s3/j3d/assets/";jgblue.j3d.getTexture=function(a,d){var c=jgblue.j3d.pack.getObjects(a,"o3d.Texture");var b=jgblue.j3d.ASSETS+"textures/";o3djs.io.loadTexture(jgblue.j3d.pack,b+a,function(f,e){if(!e){f.name=a}else{window.console.log(e)}d(f,e)})};jgblue.j3d.getMaterial=function(c){var a=jgblue.j3d;var b=o3djs.material.createMaterialFromFile(a.pack,jgblue.j3d.ASSETS+"shaders/"+c,a.view.performanceDrawList);return b};jgblue.j3d.getTextureMaterial=function(a,b){jgblue.j3d.getTexture(a,function(d){var c=jgblue.j3d.getMaterial("texture-only.shader");jgblue.j3d.sampler.texture=d;c.getParam("texSampler0").value=jgblue.j3d.sampler;b(c)})};jgblue.j3d.Entity=Class.extend({init:function(){this.pos=[0,0,0];this.client=jgblue.j3d;this.oclient=jgblue.j3d.client;this.loc_transform=this.client.pack.createObject("Transform");this.loc_transform.parent=this.client.root;this.rot_transform=this.client.pack.createObject("Transform");this.rot_transform.parent=this.loc_transform},move:function(a,d,c){var b=this.client.clock;this.pos[0]+=(a?a:0*b);this.pos[1]+=(d?d:0*b);this.pos[2]+=(c?c:0*b);this.loc_transform.identity();this.loc_transform.translate(this.pos)},rotateY:function(a){this.rot_transform.identity();this.rot_transform.rotateY(a*this.client.clock)},rotateX:function(a){this.rot_transfo;rm.identity();this.rot_transform.rotateX(a*this.client.clock)},rotate:function(a,d,c){var b=this.client.math.mulVectorScalar([a?a:0,d?d:0,c?c:0],this.client.clock);this.rot_transform.identity();this.rot_transform.rotateZYX(b)},setUpdateFn:function(a){this.update=a},update:function(){}});jgblue.j3d.Primitive=jgblue.j3d.Entity.extend({init:function(a){this._super()},getShape:function(){return this.shape},setTexture:function(a){var b=jgblue.j3d.getTexture(a)}});jgblue.j3d.Cube=jgblue.j3d.Primitive.extend({init:function(d,a){this._super(d,b);var c=this.client.pack;var b;if(a){b=a.getShape()}else{b=o3djs.primitives.createCube(c,d,1)}this.shape=b;this.rot_transform.addShape(b)}});jgblue.j3d.Spacecraft=jgblue.j3d.Entity.extend({init:function(){this._super()}});jgblue.j3d.init=function(a,c){var b=jgblue.j3d;if(a.focusIndicator){b.focusIndicator=$(a.focusIndicator)}b.hasFocus=false;$(document).mousedown(function(){b.lostFocus()});o3djs.util.makeClients(function(d){var e=d[0];b.o3dElement=e;b.o3d=e.o3d;b.math=o3djs.math;b.quaternions=o3djs.quaternions;b.client=e.client;b.clock=0;b.timeMult=1;b.pack=b.client.createPack();b.root=b.pack.createObject("Transform");b.root.parent=b.client.root;b.entities=[];b.view=o3djs.rendergraph.createBasicView(b.pack,b.client.root,b.client.renderGraphRoot,[32/255,37/255,43/255,1]);b.global=o3djs.material.createAndBindStandardParams(b.pack);b.global.lightWorldPos.value=[30,60,40];b.global.lightColor.value=[1,1,1,1];b.sampler=b.pack.createObject("Sampler");b.sampler.minFilter=b.o3d.Sampler.ANISOTROPIC;b.sampler.maxAnisotropy=4;o3djs.event.addEventListener(b.o3dElement,"resize",b.onResize);o3djs.event.addEventListener(b.o3dElement,"mousedown",b.startDragging);o3djs.event.addEventListener(b.o3dElement,"mousemove",b.drag);o3djs.event.addEventListener(b.o3dElement,"mouseup",b.stopDragging);o3djs.event.addEventListener(b.o3dElement,"wheel",b.scroll);b.arcball=o3djs.arcball.create(b.client.width,b.client.height);b.client.renderMode=b.o3d.Client.RENDERMODE_CONTINUOUS;b.initContext();b.client.setRenderCallback(jgblue.j3d.render);if(c){c(b)}})};jgblue.j3d.initContext=function(){var a=jgblue.j3d;a.eyeView=[0,1,5];a.isDragging=false;a.root.identity();a.lastRot=a.math.matrix4.identity();a.thisRot=a.math.matrix4.identity();a.zoomFactor=1.1;a.manualRotate=false;a.onResize();a.view.drawContext.view=a.math.matrix4.lookAt(a.eyeView,[0,0,0],[0,1,0])};jgblue.j3d.onResize=function(){var a=jgblue.j3d;a.view.drawContext.projection=a.math.matrix4.perspective(a.math.degToRad(30),a.client.width/a.client.height,1,5000)};jgblue.j3d.createClient=function(a,b){jgblue.j3d.init(a,b);return jgblue.j3d};jgblue.j3d.createTestMaterial=function(){var b=this.pack.createObject("Effect");var c=document.getElementById("effect").value;b.loadFromFXString(c);var a=this.pack.createObject("Material");a.drawList=this.view.performanceDrawList;a.effect=b;return a};jgblue.j3d.render=function(d){var b=jgblue.j3d;b.clock+=d.elapsedTime*b.timeMult;for(var a=0;a<b.entities.length;++a){var c=b.entities[a];c.update()}};jgblue.j3d.addEntity=function(a){if(a instanceof Array){for(var b=0;b<a.length;++b){this.entities.push(a[b])}}else{this.entities.push(a)}};jgblue.j3d.drag=function(f){var c=jgblue.j3d;if(c.isDragging){var b=c.arcball.drag([f.x,f.y]);var d=c.quaternions.quaternionToRotation(b);c.thisRot=c.math.matrix4.mul(c.lastRot,d);var a=c.root.localMatrix;c.math.matrix4.setUpper3x3(a,c.thisRot);c.root.localMatrix=a;c.client.render()}};jgblue.j3d.setOnDemandRendering=function(a){if(a){jgblue.j3d.client.renderMode=jgblue.j3d.o3d.Client.RENDERMODE_ON_DEMAND}else{jgblue.j3d.client.renderMode=jgblue.j3d.o3d.Client.RENDERMODE_CONTINUOUS}};jgblue.j3d.startDragging=function(b){var a=jgblue.j3d;if(!a.manualRotate){a.manualRotate=true}a.lastRot=jgblue.j3d.thisRot;a.arcball.click([b.x,b.y]);a.isDragging=true;if(!a.hasFocus){a.gotFocus()}};jgblue.j3d.stopDragging=function(a){jgblue.j3d.isDragging=false};jgblue.j3d.gotFocus=function(a){if(jgblue.j3d.focusIndicator){jgblue.j3d.focusIndicator.text("Got Focus")}hasFocus=true};jgblue.j3d.lostFocus=function(a){if(jgblue.j3d.focusIndicator){jgblue.j3d.focusIndicator.text("Lost Focus")}hasFocus=false};jgblue.j3d.scroll=function(b){var a=(b.deltaY<0)?1/jgblue.j3d.zoomFactor:jgblue.j3d.zoomFactor;jgblue.j3d.zoomInOut(a);jgblue.j3d.client.render()};jgblue.j3d.zoomInOut=function(b){var a=jgblue.j3d;for(i=0;i<a.eyeView.length;++i){a.eyeView[i]=a.eyeView[i]/b}a.view.drawContext.view=a.math.matrix4.lookAt(a.eyeView,[0,0,0],[0,1,0])};jgblue.j3d.loadTestScene=function(){var a=jgblue.j3d;jgblue.j3d.getTextureMaterial("me.jpg",function(g){var e=1;var b;for(var d=0;d<e;++d){var f=new jgblue.j3d.Cube(g,b);b=f;f.setUpdateFn(c);a.addEntity(f)}function c(){if(!this.client.manualRotate){this.rotate(0,1)}}a.client.render()})};