
var o3djs=o3djs||{};var goog=goog||{};goog.typedef=true;o3djs.global=this;o3djs.BROWSER_ONLY=true;o3djs.provided_=[];o3djs.provide=function(name){if(o3djs.getObjectByName(name)&&!o3djs.implicitNamespaces_[name]){return;}
var namespace=name;while((namespace=namespace.substring(0,namespace.lastIndexOf('.')))){o3djs.implicitNamespaces_[namespace]=true;}
o3djs.exportPath_(name);o3djs.provided_.push(name);};o3djs.implicitNamespaces_={};o3djs.exportPath_=function(name,opt_object,opt_objectToExportTo){var parts=name.split('.');var cur=opt_objectToExportTo||o3djs.global;var part;if(!(parts[0]in cur)&&cur.execScript){cur.execScript('var '+parts[0]);}
while(parts.length&&(part=parts.shift())){if(!parts.length&&o3djs.isDef(opt_object)){cur[part]=opt_object;}else if(cur[part]){cur=cur[part];}else{cur=cur[part]={};}}};o3djs.getObjectByName=function(name,opt_obj){var parts=name.split('.');var cur=opt_obj||o3djs.global;for(var pp=0;pp<parts.length;++pp){var part=parts[pp];if(cur[part]){cur=cur[part];}else{return null;}}
return cur;};o3djs.require=function(rule){if(o3djs.getObjectByName(rule)){return;}
var path=o3djs.getPathFromRule_(rule);if(path){o3djs.included_[path]=true;o3djs.writeScripts_();}else{throw new Error('o3djs.require could not find: '+rule);}};o3djs.basePath='';o3djs.included_={};o3djs.dependencies_={visited:{},written:{}};o3djs.findBasePath_=function(){var doc=o3djs.global.document;if(typeof doc=='undefined'){return;}
if(o3djs.global.BASE_PATH){o3djs.basePath=o3djs.global.BASE_PATH;return;}else{o3djs.global.BASE_PATH=null;}
var scripts=doc.getElementsByTagName('script');for(var script,i=0;script=scripts[i];i++){var src=script.src;var l=src.length;if(src.substr(l-13)=='o3djs/base.js'){o3djs.basePath=src.substr(0,l-13);return;}}};o3djs.writeScriptTag_=function(src){var doc=o3djs.global.document;if(typeof doc!='undefined'&&!o3djs.dependencies_.written[src]){o3djs.dependencies_.written[src]=true;doc.write('<script type="text/javascript" src="'+
src+'"></'+'script>');}};o3djs.writeScripts_=function(){var scripts=[];var seenScript={};var deps=o3djs.dependencies_;function visitNode(path){if(path in deps.written){return;}
if(path in deps.visited){if(!(path in seenScript)){seenScript[path]=true;scripts.push(path);}
return;}
deps.visited[path]=true;if(!(path in seenScript)){seenScript[path]=true;scripts.push(path);}}
for(var path in o3djs.included_){if(!deps.written[path]){visitNode(path);}}
for(var i=0;i<scripts.length;i++){if(scripts[i]){o3djs.writeScriptTag_(o3djs.basePath+scripts[i]);}else{throw Error('Undefined script input');}}};o3djs.getPathFromRule_=function(rule){var parts=rule.split('.');return parts.join('/')+'.js';};o3djs.findBasePath_();o3djs.isDef=function(val){return typeof val!='undefined';};o3djs.exportSymbol=function(publicPath,object,opt_objectToExportTo){o3djs.exportPath_(publicPath,object,opt_objectToExportTo);};o3djs.v8Initializer_='';o3djs.v8InitializerArgs_=[];o3djs.valueToString_=function(value){switch(typeof(value)){case'undefined':return'undefined';case'string':var escaped=escape(value);if(escaped===value){return'"'+value+'"';}else{return'unescape("'+escaped+'")';}
case'object':if(value===null){return'null';}else{if(value instanceof RegExp){var result='new RegExp('+o3djs.valueToString_(value.source)+', "';if(value.global){result+='g';}
if(value.ignoreCase){result+='i';}
if(value.multiline){result+='m';}
result+='")';return result;}else if(o3djs.base.isArray(value)){var valueAsArray=(value);var result='[';var separator='';for(var i=0;i<valueAsArray.length;++i){result+=separator+o3djs.valueToString_(valueAsArray[i]);separator=',';}
result+=']\n';return result;}else{var valueAsObject=(value);var result='{\n';var separator='';for(var propertyName in valueAsObject){result+=separator+'"'+propertyName+'": '+
o3djs.valueToString_(valueAsObject[propertyName]);separator=',';}
result+='}\n';return result;}}
default:return value.toString()}};o3djs.namespaceInitializer_=function(namespaceObject,namespaceName,opt_args){var result=namespaceName+' = {};\n';for(var propertyName in namespaceObject){var propertyNamespaceName=namespaceName+'.'+propertyName;var propertyValue=namespaceObject[propertyName];if(typeof(propertyValue)==='object'&&propertyValue!==null&&!o3djs.base.isArray(propertyValue)&&!(propertyValue instanceof RegExp)){result+=o3djs.namespaceInitializer_(propertyValue,propertyNamespaceName);}else{var valueAsString=o3djs.valueToString_(propertyValue);if(typeof(propertyValue)=='function'&&valueAsString.indexOf('o3djs.BROWSER_ONLY')!=-1){valueAsString='args_['+opt_args.length+']';opt_args.push(propertyValue);}
result+=propertyNamespaceName+' = '+valueAsString+';\n';if(typeof(propertyValue)==='function'&&propertyValue.prototype){result+=o3djs.namespaceInitializer_(propertyValue.prototype,propertyNamespaceName+'.prototype');}}}
return result;};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 i=0;i<o3djs.provided_.length;++i){var object=o3djs.getObjectByName(o3djs.provided_[i]);o3djs.v8Initializer_+=o3djs.namespaceInitializer_((object),o3djs.provided_[i],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(clientObject){function recursivelyCopyProperties(object){var copy={};var hasProperties=false;for(var key in object){var property=object[key];if(typeof property=='object'||typeof property=='function'){property=recursivelyCopyProperties(property);}
if(typeof property!='undefined'){copy[key]=property;hasProperties=true;}}
return hasProperties?copy:undefined;}
try{o3djs.base.o3d=recursivelyCopyProperties(clientObject.o3d);}catch(e){o3djs.base.o3d=clientObject.o3d;}
o3djs.base.o3d=o3djs.base.o3d||clientObject.o3d;};o3djs.base.isArray=function(value){var valueAsObject=(value);return typeof(value)==='object'&&value!==null&&'length'in valueAsObject&&'splice'in valueAsObject;};o3djs.base.ready=function(){return o3djs.base.o3d!=null;};o3djs.base.maybeDeobfuscateFunctionName_=function(name){return name;};o3djs.base.parseErrorStack=function(excp){var stack=[];var name;var line;if(!excp||!excp.stack){return stack;}
var stacklist=excp.stack.split('\n');for(var i=0;i<stacklist.length-1;i++){var framedata=stacklist[i];name=framedata.match(/^([a-zA-Z0-9_$]*)/)[1];if(name){name=o3djs.base.maybeDeobfuscateFunctionName_(name);}else{name='anonymous';}
var result=framedata.match(/(.*:[0-9]+)$/);line=result&&result[1];if(!line){line='(unknown)';}
stack[stack.length]=name+' : '+line}
var omitRegexp=/^anonymous :/;while(stack.length&&omitRegexp.exec(stack[stack.length-1])){stack.length=stack.length-1;}
return stack;};o3djs.base.getFunctionName=function(aFunction){var regexpResult=aFunction.toString().match(/function(\s*)(\w*)/);if(regexpResult&&regexpResult.length>=2&&regexpResult[2]){return o3djs.base.maybeDeobfuscateFunctionName_(regexpResult[2]);}
return'anonymous';};o3djs.base.formatErrorStack=function(stack){var result='';for(var i=0;i<stack.length;i++){result+='> '+stack[i]+'\n';}
return result;};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(client){client.setErrorCallback(function(msg){client.clearErrorCallback();alert('ERROR: '+msg+'\n'+o3djs.base.getStackTrace(1));});};o3djs.base.IsMSIE=function(){var ua=navigator.userAgent.toLowerCase();var msie=/msie/.test(ua)&&!/opera/.test(ua);return msie;};o3djs.base.IsChrome10=function(){return navigator.userAgent.indexOf('Chrome/1.0')>=0;};o3djs.provide('o3djs.canvas');o3djs.require('o3djs.effect');o3djs.require('o3djs.primitives');o3djs.canvas=o3djs.canvas||{};o3djs.canvas.create=function(pack,root,viewInfo){return new o3djs.canvas.CanvasInfo(pack,root,viewInfo);};o3djs.canvas.FX_STRING='float4x4 worldViewProjection : WORLDVIEWPROJECTION;\n'+'sampler texSampler0;\n'+'struct VertexShaderInput {\n'+' float4 position : POSITION;\n'+' float2 texcoord : TEXCOORD0;\n'+'};\n'+'struct PixelShaderInput {\n'+'  float4 position : POSITION;\n'+'  float2 texcoord : TEXCOORD0;\n'+'};\n'+'PixelShaderInput vertexShaderFunction(VertexShaderInput input) {\n'+'  PixelShaderInput output;\n'+'  output.position = mul(input.position, worldViewProjection);\n'+'  output.texcoord = input.texcoord;\n'+'  return output;\n'+'}\n'+'float4 pixelShaderFunction(PixelShaderInput input): COLOR {\n'+'  return tex2D(texSampler0, input.texcoord);\n'+'}\n'+'// #o3d VertexShaderEntryPoint vertexShaderFunction\n'+'// #o3d PixelShaderEntryPoint pixelShaderFunction\n'+'// #o3d MatrixLoadOrder RowMajor\n';o3djs.canvas.CanvasInfo=function(pack,root,viewInfo){this.pack=pack;this.viewInfo=viewInfo;this.root=root;this.effect=this.pack.createObject('Effect');this.effect.loadFromFXString(o3djs.canvas.FX_STRING);this.transparentMaterial=this.pack.createObject('Material');this.opaqueMaterial=this.pack.createObject('Material');this.transparentMaterial.effect=this.effect;this.opaqueMaterial.effect=this.effect;this.transparentMaterial.drawList=viewInfo.zOrderedDrawList;this.opaqueMaterial.drawList=viewInfo.performanceDrawList;this.transparentState=this.pack.createObject('State');this.transparentState.getStateParam('AlphaBlendEnable').value=true;this.transparentState.getStateParam('SourceBlendFunction').value=o3djs.base.o3d.State.BLENDFUNC_ONE;this.transparentState.getStateParam('DestinationBlendFunction').value=o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA;this.transparentMaterial.state=this.transparentState;this.transparentQuadShape=o3djs.primitives.createPlane(this.pack,this.transparentMaterial,1,1,1,1,[[1,0,0,0],[0,0,1,0],[0,-1,0,0],[0,0,0,1]]);this.opaqueQuadShape=o3djs.primitives.createPlane(this.pack,this.opaqueMaterial,1,1,1,1,[[1,0,0,0],[0,0,1,0],[0,-1,0,0],[0,0,0,1]]);};o3djs.canvas.CanvasQuad=function(canvasInfo,width,height,transparent,opt_parent){this.canvasInfo=canvasInfo;var parentTransform=opt_parent||canvasInfo.root;this.transform=canvasInfo.pack.createObject('Transform');this.transform.parent=parentTransform;this.scaleTransform=canvasInfo.pack.createObject('Transform');this.scaleTransform.parent=this.transform;this.texture=canvasInfo.pack.createTexture2D(width,height,o3djs.base.o3d.Texture.ARGB8,1,false);this.canvas=canvasInfo.pack.createObject('Canvas');this.canvas.setSize(width,height);this.sampler=canvasInfo.pack.createObject('Sampler');this.sampler.addressModeU=o3djs.base.o3d.Sampler.CLAMP;this.sampler.addressModeV=o3djs.base.o3d.Sampler.CLAMP;this.paramSampler=this.scaleTransform.createParam('texSampler0','ParamSampler');this.paramSampler.value=this.sampler;this.sampler.texture=this.texture;if(transparent){this.scaleTransform.addShape(canvasInfo.transparentQuadShape);}else{this.scaleTransform.addShape(canvasInfo.opaqueQuadShape);}
this.scaleTransform.translate(width/2,height/2,0);this.scaleTransform.scale(width,-height,1);};o3djs.canvas.CanvasQuad.prototype.updateTexture=function(){this.canvas.copyToTexture(this.texture);};o3djs.canvas.CanvasInfo.prototype.createXYQuad=function(topX,topY,z,width,height,transparent,opt_parent){var canvasQuad=new o3djs.canvas.CanvasQuad(this,width,height,transparent,opt_parent);canvasQuad.transform.translate(topX,topY,z);return canvasQuad;};o3djs.canvas.CanvasInfo.prototype.createQuad=function(width,height,transparent,opt_parent){return new o3djs.canvas.CanvasQuad(this,width,height,transparent,opt_parent);};o3djs.provide('o3djs.dump');o3djs.dump=o3djs.dump||{};o3djs.dump.dumpXYZ_=function(label,object,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+label+' : '+object[0]+', '+
object[1]+', '+object[2]+'\n');};o3djs.dump.dumpXYZW_=function(label,object,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+label+' : '+
object[0]+', '+
object[1]+', '+
object[2]+', '+
object[3]+'\n');};o3djs.dump.getFunctionName_=function(theFunction){if(theFunction.name){return theFunction.name;}
var definition=theFunction.toString();var name=definition.substring(definition.indexOf('function')+8,definition.indexOf('('));if(name){return name;}
return'*anonymous*';};o3djs.dump.getSignature_=function(theFunction){var signature=o3djs.dump.getFunctionName_(theFunction);signature+='(';for(var x=0;x<theFunction.arguments.length;x++){var nextArgument=theFunction.arguments[x];if(nextArgument.length>30){nextArgument=nextArgument.substring(0,30)+'...';}
signature+="'"+nextArgument+"'";if(x<theFunction.arguments.length-1){signature+=', ';}}
signature+=')';return signature;};o3djs.dump.dump=function(string){o3djs.BROWSER_ONLY=true;if(window.dump){window.dump(string);}else if(window.console&&window.console.log){window.console.log(string);}};o3djs.dump.getMatrixAsString=function(matrix,opt_prefix){opt_prefix=opt_prefix||'';var result=opt_prefix+'[';for(var i=0;1;++i){var mi=matrix[i];result+='[';for(var j=0;1;++j){result+=mi[j];if(j<mi.length-1){result+=', ';}else{result+=']';break;}}
if(i<matrix.length-1){result+='\n';result+=opt_prefix;}else{break;}}
result+=']';return result;};o3djs.dump.dumpPoint3=function(label,point3,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpXYZ_(label,point3,opt_prefix);};o3djs.dump.dumpFloat3=function(label,float3,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpXYZ_(label,float3,opt_prefix);};o3djs.dump.dumpVector3=function(label,vector3,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpXYZ_(label,vector3,opt_prefix);};o3djs.dump.dumpFloat4=function(label,float4,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpXYZW_(label,float4,opt_prefix);};o3djs.dump.dumpVector4=function(label,vector4,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpXYZW_(label,vector4,opt_prefix);};o3djs.dump.dumpMatrix=function(label,matrix,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+label+' :\n'+
o3djs.dump.getMatrixAsString(matrix,opt_prefix+'    ')+'\n');};o3djs.dump.dumpBoundingBox=function(label,boundingBox,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+label+' :\n');o3djs.dump.dumpPoint3('min : ',boundingBox.minExtent,opt_prefix+'    ');o3djs.dump.dumpPoint3('max : ',boundingBox.maxExtent,opt_prefix+'    ');};o3djs.dump.getParamValueAsString=function(param,opt_prefix){opt_prefix=opt_prefix||'';var value='*unknown*';if(param.isAClassName('o3d.ParamFloat')){value=param.value.toString();}else if(param.isAClassName('o3d.ParamFloat2')){value='['+param.value[0]+', '+
param.value[1]+']';}else if(param.isAClassName('o3d.ParamFloat3')){value='['+param.value[0]+', '+
param.value[1]+', '+
param.value[2]+']';}else if(param.isAClassName('o3d.ParamFloat4')){value='['+param.value[0]+', '+
param.value[1]+', '+
param.value[2]+', '+
param.value[3]+']';}else if(param.isAClassName('o3d.ParamInteger')){value=param.value.toString();}else if(param.isAClassName('o3d.ParamBoolean')){value=param.value.toString();}else if(param.isAClassName('o3d.ParamMatrix4')){value='\n'+o3djs.dump.getMatrixAsString(param.value,opt_prefix+'    ');}else if(param.isAClassName('o3d.ParamString')){value=param.value;}else if(param.isAClassName('o3d.ParamTexture')){value=param.value;value='texture : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamSampler')){value=param.value;value='sampler : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamMaterial')){value=param.value;value='material : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamEffect')){value=param.value;value='effect : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamState')){value=param.value;value='state : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamTransform')){value=param.value;value='transform : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamDrawList')){value=param.value;value='drawlist : "'+(value?value.name:'NULL')+'"';}else if(param.isAClassName('o3d.ParamDrawContext')){value=param.value;value='drawcontext : "'+(value?value.name:'NULL')+'"';}
return value;};o3djs.dump.dumpParam=function(param,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+param.className+' : "'+param.name+'" : '+
o3djs.dump.getParamValueAsString(param,opt_prefix)+'\n');};o3djs.dump.dumpParams=function(param_object,opt_prefix){opt_prefix=opt_prefix||'';var params=param_object.params;for(var p=0;p<params.length;p++){o3djs.dump.dumpParam(params[p],opt_prefix);}};o3djs.dump.dumpParamObject=function(param_object,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+param_object.className+' : "'+
param_object.name+'"\n');o3djs.dump.dumpParams(param_object,opt_prefix+'    ');};o3djs.dump.dumpStream=function(stream,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+'semantic: '+stream.semantic+', index: '+stream.semanticIndex+', dataType: '+stream.dataType+', field: '+stream.field.name+'\n');};o3djs.dump.dumpElement=function(element,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+'------------ Element --------------\n');o3djs.dump.dump(opt_prefix+'Element: "'+element.name+'"\n');o3djs.dump.dump(opt_prefix+'  --Params--\n');o3djs.dump.dumpParams(element,opt_prefix+'  ');o3djs.dump.dump(opt_prefix+'  --DrawElements--\n');var drawElements=element.drawElements;for(var g=0;g<drawElements.length;g++){var drawElement=drawElements[g]
o3djs.dump.dumpParamObject(drawElement,opt_prefix+'    ');}
if(element.isAClassName('o3d.Primitive')){o3djs.dump.dump(opt_prefix+'  primitive type: '+element.primitiveType+'\n');o3djs.dump.dump(opt_prefix+'  number vertices: '+element.numberVertices+'\n');o3djs.dump.dump(opt_prefix+'  number primitives: '+element.numberPrimitives+'\n');var streamBank=element.streamBank;if(streamBank){var streams=streamBank.vertexStreams;for(var ss=0;ss<streams.length;ss++){var stream=streams[ss];o3djs.dump.dump(opt_prefix+'  stream '+ss+': ');o3djs.dump.dumpStream(stream);}}}};o3djs.dump.dumpShape=function(shape,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+'------------ Shape --------------\n');o3djs.dump.dump(opt_prefix+'Shape: "'+shape.name+'"\n');o3djs.dump.dump(opt_prefix+'  --Params--\n');o3djs.dump.dumpParams(shape,opt_prefix+'  ');o3djs.dump.dump(opt_prefix+'  --Elements--\n');var elements=shape.elements;for(var p=0;p<elements.length;p++){var element=elements[p];o3djs.dump.dumpElement(element,opt_prefix+'    ');}};o3djs.dump.dumpTexture=function(texture,opt_prefix){opt_prefix=opt_prefix||'';var uri='';var param=texture.getParam('uri');if(param){uri=param.value;}
o3djs.dump.dump(opt_prefix+texture.className+' : "'+texture.name+'" uri : "'+uri+'" width: '+texture.width+' height: '+texture.height+' alphaIsOne: '+texture.alphaIsOne+'\n');};o3djs.dump.dumpTransform=function(transform,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+'----------- Transform -------------\n');o3djs.dump.dump(opt_prefix+'Transform: '+transform.name+'"\n');o3djs.dump.dump(opt_prefix+'  --Local Matrix--\n');o3djs.dump.dump(o3djs.dump.getMatrixAsString(transform.localMatrix,opt_prefix+'    ')+'\n');o3djs.dump.dump(opt_prefix+'  --Params--\n');o3djs.dump.dumpParams(transform,opt_prefix+'  ');o3djs.dump.dump(opt_prefix+'  --Shapes--\n');var shapes=transform.shapes;for(var s=0;s<shapes.length;s++){var shape=shapes[s];o3djs.dump.dumpNamedObjectName(shape,opt_prefix+'  ');}};o3djs.dump.dumpTransformTree=function(transform,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpTransform(transform,opt_prefix);var child_prefix=opt_prefix+'    ';var children=transform.children;for(var c=0;c<children.length;c++){o3djs.dump.dumpTransformTree(children[c],child_prefix);}};o3djs.dump.dumpTransformList=function(transform_list){o3djs.dump.dump(transform_list.length+' transforms in list!!!\n');for(var i=0;i<transform_list.length;i++){o3djs.dump.dumpTransform(transform_list[i]);}};o3djs.dump.dumpNamedObjectName=function(namedObject,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+namedObject.className+' : "'+namedObject.name+'"\n');};o3djs.dump.dumpRenderNode=function(render_node,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dump(opt_prefix+'----------- Render Node -----------\n');o3djs.dump.dumpNamedObjectName(render_node,opt_prefix);o3djs.dump.dump(opt_prefix+'  --Params--\n');o3djs.dump.dumpParams(render_node,opt_prefix+'  ');};o3djs.dump.dumpRenderNodeTree=function(render_node,opt_prefix){opt_prefix=opt_prefix||'';o3djs.dump.dumpRenderNode(render_node,opt_prefix);var child_prefix=opt_prefix+'    ';var children=render_node.children;for(var c=0;c<children.length;c++){o3djs.dump.dumpRenderNodeTree(children[c],child_prefix);}};o3djs.dump.dumpStackTrace=function(){o3djs.dump.dump('Stack trace:\n');var nextCaller=arguments.callee.caller;while(nextCaller){o3djs.dump.dump(o3djs.dump.getSignature_(nextCaller)+'\n');nextCaller=nextCaller.caller;}
o3djs.dump.dump('\n\n');};o3djs.provide('o3djs.effect');o3djs.require('o3djs.io');o3djs.effect=o3djs.effect||{};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(lightingType){return o3djs.effect.COLLADA_LIGHTING_TYPES[lightingType.toLowerCase()]==1;};o3djs.effect.getColladaLightingType=function(material){var lightingTypeParam=material.getParam(o3djs.effect.COLLADA_LIGHTING_TYPE_PARAM_NAME);if(lightingTypeParam){var lightingType=lightingTypeParam.value.toLowerCase();if(o3djs.effect.isColladaLightingType(lightingType)){return lightingType;}}
return'';};o3djs.effect.getNumTexCoordStreamsNeeded=function(material){var lightingType=o3djs.effect.getColladaLightingType(material);if(!o3djs.effect.isColladaLightingType(lightingType)){throw'not a collada standard material';}
var colladaSamplers=o3djs.effect.COLLADA_SAMPLER_PARAMETER_PREFIXES;var numTexCoordStreamsNeeded=0
for(var cc=0;cc<colladaSamplers.length;++cc){var samplerPrefix=colladaSamplers[cc];var samplerParam=material.getParam(samplerPrefix+'Sampler');if(samplerParam){++numTexCoordStreamsNeeded;}}
return numTexCoordStreamsNeeded;};o3djs.effect.loadEffect=function(effect,url){var fxString=o3djs.io.loadTextFileSynchronous(url);effect.loadFromFXString(fxString);};o3djs.effect.createEffectFromFile=function(pack,url){var effect=pack.getObjects(url,'o3d.Effect')[0];if(!effect){effect=pack.createObject('Effect');o3djs.effect.loadEffect(effect,url);effect.name=url;}
return effect;};o3djs.effect.buildStandardShaderString=function(material,effectType){var bumpSampler=material.getParam('bumpSampler');var getTextureType=function(textureParam){var texture=textureParam.value;if(!texture)return'2D';switch(texture.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 getSamplerType=function(samplerParam){var sampler=samplerParam.value;if(!sampler)return'2D';var textureParam=sampler.getParam('Texture');if(textureParam)
return getTextureType(textureParam);else
return'2D';};var buildCommonUniforms=function(){return'uniform float4x4 worldViewProjection : WORLDVIEWPROJECTION;\n'+'uniform float fogStart;\n'+'uniform float fogRange;\n'+'uniform float fogMin;\n'+'uniform float fogMax;\n'+'uniform float3 fogColor;\n'+'uniform float3 lightWorldPos;\n'+'uniform float4 lightColor;\n'+'uniform float3 playerPos;\n'+'uniform float time;\n'};var buildLightingUniforms=function(){return'uniform float4x4 world : WORLD;\n'+'uniform float4x4 viewInverse : VIEWINVERSE;\n'+'uniform float4x4 worldInverseTranspose : WORLDINVERSETRANSPOSE;\n';};var buildColorParam=function(material,descriptions,name,opt_addColorParam){if(opt_addColorParam===undefined){opt_addColorParam=true;}
var samplerParam=material.getParam(name+'Sampler');if(samplerParam){var type=getSamplerType(samplerParam);descriptions.push(name+type+'Texture');return'sampler'+type+' '+name+'Sampler;\n'}else if(opt_addColorParam){descriptions.push(name+'Color');return'uniform float4 '+name+';\n';}else{return'';}};var getColorParam=function(material,name){var samplerParam=material.getParam(name+'Sampler');if(samplerParam){var type=getSamplerType(samplerParam);return'  float4 '+name+' = tex'+type+'('+name+'Sampler, input.diffuseUV);\n'}else{return'';}};var buildEntryPoints=function(){return'  // #o3d VertexShaderEntryPoint vertexShaderFunction\n'+'  // #o3d PixelShaderEntryPoint pixelShaderFunction\n'+'  // #o3d MatrixLoadOrder RowMajor\n';};var buildConstantShaderString=function(material,descriptions){descriptions.push('constant');return buildCommonUniforms()+
buildColorParam(material,descriptions,'emissive')+
buildVertexDecls(material,false,false)+'OutVertex vertexShaderFunction(InVertex input) {\n'+'  OutVertex output;\n'+
positionVertexShaderCode()+
g_posstr+
buildUVPassthroughs(material)+'  return output;\n'+'}\n'+'float4 pixelShaderFunction(OutVertex input) : COLOR {\n'+
getColorParam(material,'emissive')+'  return emissive;\n'+'}\n'+'\n'+
buildEntryPoints();};var buildLambertShaderString=function(material,descriptions){descriptions.push('lambert');return buildCommonUniforms()+
buildLightingUniforms()+
buildColorParam(material,descriptions,'emissive')+
buildColorParam(material,descriptions,'ambient')+
buildColorParam(material,descriptions,'diffuse')+
buildColorParam(material,descriptions,'bump',false)+
buildVertexDecls(material,true,false)+'OutVertex vertexShaderFunction(InVertex input) {\n'+'  OutVertex output;\n'+
buildUVPassthroughs(material)+
g_posstr+
positionVertexShaderCode()+
normalVertexShaderCode()+
surfaceToLightVertexShaderCode()+
bumpVertexShaderCode()+'  return output;\n'+'}\n'+'float4 pixelShaderFunction(OutVertex input) : COLOR\n'+'{\n'+
getColorParam(material,'emissive')+
getColorParam(material,'ambient')+
getColorParam(material,'diffuse')+
getNormalShaderCode()+'  float3 surfaceToLight = normalize(input.surfaceToLight);\n'+'  float4 litR = lit(dot(normal, surfaceToLight), 0, 0);\n'+'  float4 total_color = float4((emissive +\n'+'      lightColor * (ambient * diffuse + diffuse * litR.y)).rgb,'+'      diffuse.a);\n'+
g_fogstr+'}\n'+'\n'+
buildEntryPoints();};var buildBlinnShaderString=function(material,descriptions){descriptions.push('blinn');return buildCommonUniforms()+
buildLightingUniforms()+
buildColorParam(material,descriptions,'emissive')+
buildColorParam(material,descriptions,'ambient')+
buildColorParam(material,descriptions,'diffuse')+
buildColorParam(material,descriptions,'specular')+
buildColorParam(material,descriptions,'bump',false)+'uniform float shininess;\n'+'uniform float specularFactor;\n'+
buildVertexDecls(material,true,true)+'OutVertex vertexShaderFunction(InVertex input) {\n'+'  OutVertex output;\n'+
g_posstr+
buildUVPassthroughs(material)+
positionVertexShaderCode()+
normalVertexShaderCode()+
surfaceToLightVertexShaderCode()+
surfaceToViewVertexShaderCode()+
bumpVertexShaderCode()+'  return output;\n'+'}\n'+'float4 pixelShaderFunction(OutVertex input) : COLOR\n'+'{\n'+
getColorParam(material,'emissive')+
getColorParam(material,'ambient')+
getColorParam(material,'diffuse')+
getColorParam(material,'specular')+
getNormalShaderCode()+'  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'+'  float4 total_color = float4((emissive +\n'+'  lightColor * (ambient * diffuse + diffuse * litR.y +\n'+'                        + specular * litR.z * specularFactor)).rgb,'+'      diffuse.a);\n'+
g_fogstr+'}\n'+'\n'+
buildEntryPoints();};var buildPhongShaderString=function(material,descriptions){descriptions.push('phong');return buildCommonUniforms()+
buildLightingUniforms()+
buildColorParam(material,descriptions,'emissive')+
buildColorParam(material,descriptions,'ambient')+
buildColorParam(material,descriptions,'diffuse')+
buildColorParam(material,descriptions,'specular')+
buildColorParam(material,descriptions,'bump',false)+'uniform float shininess;\n'+'uniform float specularFactor;\n'+
buildVertexDecls(material,true,true)+'OutVertex vertexShaderFunction(InVertex input) {\n'+'  OutVertex output;\n'+
g_posstr+
buildUVPassthroughs(material)+
positionVertexShaderCode()+
normalVertexShaderCode()+
surfaceToLightVertexShaderCode()+
surfaceToViewVertexShaderCode()+
bumpVertexShaderCode()+'  return output;\n'+'}\n'+'float4 pixelShaderFunction(OutVertex input) : COLOR\n'+'{\n'+
getColorParam(material,'emissive')+
getColorParam(material,'ambient')+
getColorParam(material,'diffuse')+
getColorParam(material,'specular')+
getNormalShaderCode()+'  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'+'  float4 total_color = ((emissive +\n'+'  lightColor * (ambient * diffuse + diffuse * litR.y +\n'+'                        + specular * litR.z * specularFactor)).rgb,'+'      diffuse.a);\n'+
g_fogstr+'}\n'+'\n'+
buildEntryPoints();};var interpolant;var buildTexCoord=function(material,name){if(material.getParam(name+'Sampler')){return'  float2 '+name+'UV : TEXCOORD'+interpolant+++';\n';}else{return'';}};var buildTexCoords=function(material){interpolant=0;return buildTexCoord(material,'diffuse');};var buildUVPassthrough=function(material,name){if(material.getParam(name+'Sampler')){return'  output.'+name+'UV = input.'+name+'UV;\n';}else{return'';}};var buildUVPassthroughs=function(material){return buildUVPassthrough(material,'diffuse');};var buildBumpInputCoords=function(){return bumpSampler?('  float3 tangent      : TANGENT;\n'+'  float3 binormal     : BINORMAL;\n'):'';};var buildBumpOutputCoords=function(){return bumpSampler?('  float3 tangent      : TEXCOORD'+interpolant+++';\n'+'  float3 binormal     : TEXCOORD'+interpolant+++';\n'):'';};var positionVertexShaderCode=function(){return'  output.position = mul(input.position, worldViewProjection);\n';};var normalVertexShaderCode=function(){return'  output.normal = mul(float4(input.normal, 0),\n'+'                      worldInverseTranspose).xyz;\n';};var surfaceToLightVertexShaderCode=function(){return'  output.surfaceToLight = lightWorldPos - \n'+'                          mul(input.position, world).xyz;\n';};var surfaceToViewVertexShaderCode=function(){return'  output.surfaceToView = (viewInverse[3] - mul(input.position,\n'+'                                               world)).xyz;\n';};var bumpVertexShaderCode=function(){return bumpSampler?('  output.binormal = '+'mul(float4(input.binormal, 0), worldInverseTranspose).xyz;\n'+'  output.tangent = '+'mul(float4(input.tangent, 0), worldInverseTranspose).xyz;\n'):'';};var getNormalShaderCode=function(){return bumpSampler?('float3x3 tangentToWorld = float3x3(input.tangent,\n'+'                                   input.binormal,\n'+'                                   input.normal);\n'+'float3 tangentNormal = tex2D(bumpSampler, input.diffuseUV.xy).xyz -\n'+'                       float3(0.5, 0.5, 0.5);\n'+'float3 normal = mul(tangentNormal, tangentToWorld);\n'+'normal = normalize(normal);\n'):'  float3 normal = normalize(input.normal);\n';};var buildVertexDecls=function(material,diffuse,specular){var str='struct InVertex {\n'+'  float4 position     : POSITION;\n';if(diffuse||specular){str+='  float3 normal       : NORMAL;\n';}
str+=buildTexCoords(material)+
buildBumpInputCoords()+'};\n'+'struct OutVertex {\n'+'  float4 position     : POSITION;\n'+'  float3 worldPosition : TEXCOORD7;\n'+
buildTexCoords(material)+
buildBumpOutputCoords();if(diffuse||specular){str+='  float3 normal        : TEXCOORD'+interpolant+++';\n'+'  float3 surfaceToLight: TEXCOORD'+interpolant+++';\n';}
if(specular){str+='  float3 surfaceToView : TEXCOORD'+interpolant+++';\n';}
str+='};\n'
return str;};var str;var descriptions=[];if(effectType=='phong'){str=buildPhongShaderString(material,descriptions);}else if(effectType=='lambert'){str=buildLambertShaderString(material,descriptions);}else if(effectType=='blinn'){str=buildBlinnShaderString(material,descriptions);}else if(effectType=='constant'){str=buildConstantShaderString(material,descriptions);}else{throw('unknown effect type "'+effectType+'"');}
return{description:descriptions.join('_'),shader:str};};o3djs.effect.getStandardShader=function(pack,material,effectType){var record=o3djs.effect.buildStandardShaderString(material,effectType);var effects=pack.getObjectsByClassName('o3d.Effect');for(var ii=0;ii<effects.length;++ii){if(effects[ii].name==record.description&&effects[ii].source==record.shader){return effects[ii];}}
var effect=pack.createObject('Effect');if(effect){effect.name=record.description;if(effect.loadFromFXString(record.shader)){return effect;}
pack.removeObject(effect);}
return null;};o3djs.effect.attachStandardShader=function(pack,material,lightPos,effectType){var effect=o3djs.effect.getStandardShader(pack,material,effectType);if(effect){material.effect=effect;effect.createUniformParameters(material);var param=material.getParam('lightWorldPos');if(!param.inputConnection){param.value=lightPos;}
var param=material.getParam('lightColor');if(!param.inputConnection){param.value=[1,1,1,1];}
return true;}else{return false;}};var g_posstr='output.worldPosition = mul(input.position, world).xyz;\n';var g_fogstr='float pos_val = input.worldPosition.y - fogStart;\n'+'float pos_t = saturate(pos_val / fogRange);\n'+'float fog = lerp(fogMax, fogMin, pos_t);\n'+'return float4(lerp(total_color.rgb, fogColor, fog), total_color.a);\n';var g_fogstr0='return total_color;\n';o3djs.provide('o3djs.element');o3djs.require('o3djs.math');o3djs.element=o3djs.element||{};o3djs.element.setBoundingBoxAndZSortPoint=function(element){var boundingBox=element.getBoundingBox(0);var minExtent=boundingBox.minExtent;var maxExtent=boundingBox.maxExtent;element.boundingBox=boundingBox;element.cull=true;element.zSortPoint=o3djs.math.divVectorScalar(o3djs.math.addVector(minExtent,maxExtent),2);};o3djs.element.addMissingTexCoordStreams=function(element){if(element.isAClassName('o3d.Primitive')){var material=(element.material);var streamBank=element.streamBank;var lightingType=o3djs.effect.getColladaLightingType(material);if(lightingType){var numTexCoordStreamsNeeded=o3djs.effect.getNumTexCoordStreamsNeeded(material);var streams=streamBank.vertexStreams;var lastTexCoordStream=null;var numTexCoordStreams=0;for(var ii=0;ii<streams.length;++ii){var stream=streams[ii];if(stream.semantic==o3djs.base.o3d.Stream.TEXCOORD){lastTexCoordStream=stream;++numTexCoordStreams;}}
for(var ii=numTexCoordStreams;ii<numTexCoordStreamsNeeded;++ii){streamBank.setVertexStream(lastTexCoordStream.semantic,lastTexCoordStream.semanticIndex+ii-numTexCoordStreams+1,lastTexCoordStream.field,lastTexCoordStream.startIndex);}}}};o3djs.element.duplicateElement=function(pack,sourceElement){var newElement=pack.createObject(sourceElement.className);newElement.copyParams(sourceElement);if(sourceElement.isAClassName('o3d.Primitive')){newElement.indexBuffer=sourceElement.indexBuffer;newElement.startIndex=sourceElement.startIndex;newElement.primitiveType=sourceElement.primitiveType;newElement.numberVertices=sourceElement.numberVertices;newElement.numberPrimitives=sourceElement.numberPrimitives;}
return newElement;};o3djs.provide('o3djs.error');o3djs.error=o3djs.error||{};o3djs.error.callbacks_=[];o3djs.error.setErrorHandler=function(client,callback){var clientId=client.clientId;var old_callback=o3djs.error.callbacks_[clientId];o3djs.error.callbacks_[clientId]=callback;if(callback){client.setErrorCallback(callback);}else{client.clearErrorCallback();}
return old_callback;};o3djs.error.setDefaultErrorHandler=function(client){o3djs.error.setErrorHandler(client,function(msg){o3djs.error.setErrorHandler(client,null);alert('ERROR: '+msg);});};o3djs.error.createErrorCollector=function(client){return new o3djs.error.ErrorCollector(client);};o3djs.error.ErrorCollector=function(client){var that=this;this.client_=client;this.errors=[];this.oldCallback_=o3djs.error.setErrorHandler(client,function(msg){that.errors.push(msg);});};o3djs.error.ErrorCollector.prototype.finish=function(){o3djs.error.setErrorHandler(this.client_,this.oldCallback_);};o3djs.provide('o3djs.event');o3djs.event=o3djs.event||{};o3djs.event.appendWithSpace=function(inStr,extraStr){return(inStr.length==0)?extraStr:inStr+' '+extraStr;};o3djs.event.appendWithSpaceIf=function(state,inStr,extraStr){return(state)?o3djs.event.appendWithSpace(inStr,extraStr):inStr;};o3djs.event.getModifierString=function(control,alt,shift,meta){var modStr=o3djs.event.appendWithSpaceIf(control,'','Control');modStr=o3djs.event.appendWithSpaceIf(alt,modStr,'Alt');modStr=o3djs.event.appendWithSpaceIf(shift,modStr,'Shift');return o3djs.event.appendWithSpaceIf(meta,modStr,'Meta');};o3djs.event.padWithLeadingZeroes=function(str,to_length){while(str.length<to_length)
str='0'+str;return str;};o3djs.event.getKeyIdentifier=function(charCode,keyCode){if(!charCode){charCode=keyCode;}
switch(charCode){case 3:case 13:return'Enter';case 37:return'Left';case 39:return'Right';case 38:return'Up';case 40:return'Down';}
charCode=(charCode>=97&&charCode<=122)?charCode-32:charCode;var keyStr=charCode.toString(16).toUpperCase();return'U+'+o3djs.event.padWithLeadingZeroes(keyStr,4);};o3djs.event.keyIdentifierToChar=function(keyIdent){if(keyIdent){switch(keyIdent){case'Enter':return 13;case'Left':return 37;case'Right':return 39;case'Up':return 38;case'Down':return 40;}
if(keyIdent.indexOf('U+')==0)
return parseInt(keyIdent.substr(2).toUpperCase(),16);}
return 0;};o3djs.event.getEventKeyChar=function(event){if(!event){event=window.event;}
var charCode=0;if(event.keyIdentifier)
charCode=o3djs.event.keyIdentifierToChar(event.keyIdentifier);if(!charCode)
charCode=(window.event)?window.event.keyCode:event.charCode;if(!charCode)
charCode=event.keyCode;return charCode;};o3djs.event.cancel=function(event){if(!event)
event=window.event;event.cancelBubble=true;if(event.stopPropagation)
event.stopPropagation();if(event.preventDefault)
event.preventDefault();};o3djs.event.startKeyboardEventSynthesis=function(pluginObject){var handler=function(event){o3djs.event.onKey(event,pluginObject);};o3djs.event.addEventListener(pluginObject,'keypress',handler);o3djs.event.addEventListener(pluginObject,'keydown',handler);o3djs.event.addEventListener(pluginObject,'keyup',handler);};o3djs.event.onKey=function(event,pluginObject){var k_evt=o3djs.event.createKeyEvent(event.type,event.charCode,event.keyCode,event.ctrlKey,event.altKey,event.shiftKey,event.metaKey);if(k_evt){if(pluginObject.parentNode.dispatchEvent){pluginObject.parentNode.dispatchEvent(k_evt);}else if(pluginObject.fireEvent){pluginObject.fireEvent('on'+event.type,k_evt);}}};o3djs.event.createKeyEvent=function(eventName,charCode,keyCode,control,alt,shift,meta){var k_evt;var keyIdentifier=o3djs.event.getKeyIdentifier(charCode,keyCode);if(document.createEvent){k_evt=document.createEvent('KeyboardEvent');if(k_evt.initKeyboardEvent){k_evt.initKeyboardEvent(eventName,true,true,window,keyIdentifier,0,control,alt,shift,meta);k_evt.charCode=charCode;if(eventName=='keypress')
k_evt.keyCode=charCode;else
k_evt.keyCode=keyCode;}else if(k_evt.initKeyEvent){k_evt.initKeyEvent(eventName,true,true,window,control,alt,shift,meta,keyCode,charCode);k_evt.keyIdentifier=keyIdentifier;}}else if(document.createEventObject){k_evt=document.createEventObject();k_evt.ctrlKey=control;k_evt.altKey=alt;k_evt.shiftKey=shift;k_evt.metaKey=meta;k_evt.keyCode=charCode;k_evt.keyIdentifier=keyIdentifier;}
k_evt.synthetic=true;return k_evt;};o3djs.event.createEventHandler=function(listenerSet){return function(event){var length=listenerSet.length;for(var index=0;index<length;++index){var handler=listenerSet[index];if(typeof(handler.handleEvent)=='function'){handler.handleEvent(event);}else{handler(event);}}}};o3djs.event.addEventListener=function(pluginObject,type,handler){if(!handler||typeof(type)!='string'||(typeof(handler)!='function'&&typeof(handler.handleEvent)!='function')){throw new Error('Invalid argument.');}
pluginObject.o3d_eventRegistry=pluginObject.o3d_eventRegistry||[];var registry=pluginObject.o3d_eventRegistry;var listenerSet=registry[type];if(!listenerSet||listenerSet.length==0){listenerSet=registry[type]=[];pluginObject.client.setEventCallback(type,o3djs.event.createEventHandler(listenerSet));}else{for(var index in listenerSet){if(listenerSet[index]==handler){return;}}}
listenerSet.push(handler);};o3djs.event.removeEventListener=function(pluginObject,type,handler){var registry=pluginObject.o3d_eventRegistry;if(!registry){return;}
var listenerSet=registry[type];if(!listenerSet){return;}
for(var index in listenerSet){if(listenerSet[index]==handler){if(listenerSet.length==1){pluginObject.client.clearEventCallback(type);}
listenerSet.splice(index,1);break;}}};o3djs.provide('o3djs.fps');o3djs.require('o3djs.rendergraph');o3djs.require('o3djs.canvas');o3djs.require('o3djs.math');o3djs.require('o3djs.primitives');o3djs.fps=o3djs.fps||{};o3djs.fps.NUM_FRAMES_TO_AVERAGE=16;o3djs.fps.PERF_BAR_COLORS=[[0,0,1,1],[0,1,0,1],[1,1,0,1],[1,0.5,0,1],[1,0,0,1]];o3djs.fps.CONST_COLOR_EFFECT='float4x4 worldViewProjection : WorldViewProjection;\n'+'float4 color;\n'+'struct a2v {\n'+' float4 pos : POSITION;\n'+'};\n'+'struct v2f {\n'+'  float4 pos : POSITION;\n'+'};\n'+'v2f vsMain(a2v IN) {\n'+'  v2f OUT;\n'+'  OUT.pos = mul(IN.pos, worldViewProjection);\n'+'  return OUT;\n'+'}\n'+'float4 psMain(v2f IN): COLOR {\n'+'  return color;\n'+'}\n'+'// #o3d VertexShaderEntryPoint vsMain\n'+'// #o3d PixelShaderEntryPoint psMain\n'+'// #o3d MatrixLoadOrder RowMajor\n';o3djs.fps.createFPSManager=function(pack,clientWidth,clientHeight,opt_parent){return new o3djs.fps.FPSManager(pack,clientWidth,clientHeight,opt_parent);};o3djs.fps.FPSManager=function(pack,clientWidth,clientHeight,opt_parent){this.totalTime_=0.0;this.totalActiveTime_=0.0;this.timeTable_=[];this.activeTimeTable_=[];this.timeTableCursor_=0;for(var tt=0;tt<o3djs.fps.NUM_FRAMES_TO_AVERAGE;++tt){this.timeTable_[tt]=0.0;this.activeTimeTable_[tt]=0.0;}
this.root_=pack.createObject('Transform');this.viewInfo=o3djs.rendergraph.createBasicView(pack,this.root_,opt_parent);this.viewInfo.root.priority=100000;this.viewInfo.clearBuffer.clearColorFlag=false;this.viewInfo.zOrderedState.getStateParam('CullMode').value=o3djs.base.o3d.State.CULL_NONE;this.viewInfo.drawContext.view=o3djs.math.matrix4.lookAt([0,0,1],[0,0,0],[0,1,0]);this.canvasLib_=o3djs.canvas.create(pack,this.root_,this.viewInfo);this.paint_=pack.createObject('CanvasPaint');this.fpsQuad=this.canvasLib_.createXYQuad(0,0,-1,64,32,true);this.colorEffect_=pack.createObject('Effect');this.colorEffect_.loadFromFXString(o3djs.fps.CONST_COLOR_EFFECT);this.colorMaterial_=pack.createObject('Material');this.colorMaterial_.effect=this.colorEffect_;this.colorMaterial_.drawList=this.viewInfo.zOrderedDrawList;this.colorEffect_.createUniformParameters(this.colorMaterial_);this.colorMaterial_.getParam('color').value=[1,1,1,1];this.colorQuadShape_=o3djs.primitives.createPlane(pack,this.colorMaterial_,1,1,1,1,[[1,0,0,0],[0,0,1,0],[0,-1,0,0],[0.5,0.5,0,1]]);var barXOffset=10;var barYOffset=2;var barWidth=clientWidth-barXOffset*2;var barHeight=7;this.numPerfBars_=o3djs.fps.PERF_BAR_COLORS.length-1;this.perfBarRoot_=pack.createObject('Transform');this.perfBarRoot_.parent=this.root_;this.perfBarBack_=new o3djs.fps.ColorRect(pack,this.colorQuadShape_,this.perfBarRoot_,barXOffset,barYOffset,-3,barWidth,barHeight,[0,0,0,1]);this.perfMarker_=[];for(var ii=0;ii<this.numPerfBars_;++ii){this.perfMarker_[ii]=new o3djs.fps.ColorRect(pack,this.colorQuadShape_,this.perfBarRoot_,barXOffset+barWidth/(this.numPerfBars_+1)*(ii+1),barYOffset-1,-1,1,barHeight+2,[1,1,1,1]);}
this.perfBar_=new o3djs.fps.ColorRect(pack,this.colorQuadShape_,this.perfBarRoot_,barXOffset+1,barYOffset+1,-2,1,barHeight-2,[1,1,0,1]);this.perfBarWidth_=barWidth-2;this.perfBarHeight_=barHeight-2;this.perfBarXOffset_=barXOffset;this.perfBarYOffset_=barYOffset;this.resize(clientWidth,clientHeight);this.setPosition(10,10);};o3djs.fps.FPSManager.prototype.setPosition=function(x,y){this.fpsQuad.transform.identity();this.fpsQuad.transform.translate(x,y,-1);};o3djs.fps.FPSManager.prototype.setVisible=function(visible){this.viewInfo.root.active=visible;};o3djs.fps.FPSManager.prototype.setPerfVisible=function(visible){this.perfBarRoot_.visible=visible;};o3djs.fps.FPSManager.prototype.resize=function(clientWidth,clientHeight){this.viewInfo.drawContext.projection=o3djs.math.matrix4.orthographic(0+0.5,clientWidth+0.5,clientHeight+0.5,0+0.5,0.001,1000);var barWidth=clientWidth-this.perfBarXOffset_*2;this.perfBarBack_.setSize(barWidth,this.perfBarHeight_);for(var ii=0;ii<this.numPerfBars_;++ii){this.perfMarker_[ii].setPosition(this.perfBarXOffset_+barWidth/(this.numPerfBars_+1)*(ii+1),this.perfBarYOffset_-1);}
this.perfBarWidth_=barWidth-2;};o3djs.fps.FPSManager.prototype.update=function(renderEvent){var elapsedTime=renderEvent.elapsedTime;var activeTime=renderEvent.activeTime;this.totalTime_+=elapsedTime-this.timeTable_[this.timeTableCursor_];this.totalActiveTime_+=activeTime-this.activeTimeTable_[this.timeTableCursor_];this.timeTable_[this.timeTableCursor_]=elapsedTime;this.activeTimeTable_[this.timeTableCursor_]=activeTime;++this.timeTableCursor_;if(this.timeTableCursor_==o3djs.fps.NUM_FRAMES_TO_AVERAGE){this.timeTableCursor_=0;}
var fps=''+
Math.floor((1.0/(this.totalTime_/o3djs.fps.NUM_FRAMES_TO_AVERAGE))+0.5)+' : '+Math.floor(1.0/elapsedTime+0.5);var canvas=this.fpsQuad.canvas;canvas.clear([0,0,0,0]);var paint=this.paint_;canvas.saveMatrix();paint.setOutline(3,[0,0,0,1]);paint.textAlign=o3djs.base.o3d.CanvasPaint.LEFT;paint.textSize=12;paint.textTypeface='Arial';paint.color=[1,1,0,1];canvas.drawText(fps,2,16,paint);canvas.restoreMatrix();this.fpsQuad.updateTexture();var frames=this.totalActiveTime_/o3djs.fps.NUM_FRAMES_TO_AVERAGE/(1/60.0);var colorIndex=Math.min(frames,o3djs.fps.PERF_BAR_COLORS.length-1);colorIndex=Math.floor(Math.max(colorIndex,0));if(!isNaN(colorIndex)){this.perfBar_.setColor(o3djs.fps.PERF_BAR_COLORS[colorIndex]);this.perfBar_.setSize(frames*this.perfBarWidth_/this.numPerfBars_,this.perfBarHeight_);}};o3djs.fps.ColorRect=function(pack,shape,parent,x,y,z,width,height,color){this.transform_=pack.createObject('Transform');this.colorParam_=this.transform_.createParam('color','ParamFloat4');this.transform_.addShape(shape);this.transform_.parent=parent;this.width_=0;this.height_=0;this.x_=0;this.y_=0;this.z_=z;this.setPosition(x,y);this.setSize(width,height);this.setColor(color);};o3djs.fps.ColorRect.prototype.updateTransform_=function(){this.transform_.identity();this.transform_.translate(this.x_,this.y_,this.z_);this.transform_.scale(this.width_,this.height_,1);};o3djs.fps.ColorRect.prototype.setPosition=function(x,y){this.x_=x;this.y_=y;this.updateTransform_();};o3djs.fps.ColorRect.prototype.setSize=function(width,height){this.width_=width;this.height_=height;this.updateTransform_();};o3djs.fps.ColorRect.prototype.setColor=function(color){this.colorParam_.value=color;};o3djs.provide('o3djs.io');o3djs.io=o3djs.io||{};o3djs.io.createLoadInfo=function(opt_request,opt_hasStatus){return new o3djs.io.LoadInfo(opt_request,opt_hasStatus);};o3djs.io.LoadInfo=function(opt_request,opt_hasStatus){this.request_=opt_request;this.hasStatus_=opt_hasStatus;this.streamLength_=0;this.children_=[];};o3djs.io.LoadInfo.prototype.addChild=function(loadInfo){this.children_.push(loadInfo);};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 total=this.streamLength_;for(var cc=0;cc<this.children_.length;++cc){total+=this.children_[cc].getTotalKnownBytesToStreamSoFar();}
return total;};o3djs.io.LoadInfo.prototype.getTotalBytesDownloaded=function(){var total=(this.request_&&this.hasStatus_)?this.request_.bytesReceived:this.streamLength_;for(var cc=0;cc<this.children_.length;++cc){total+=this.children_[cc].getTotalBytesDownloaded();}
return total;};o3djs.io.LoadInfo.prototype.getTotalKnownRequestsToStreamSoFar=function(){var total=1;for(var cc=0;cc<this.children_.length;++cc){total+=this.children_[cc].getTotalKnownRequestToStreamSoFar();}
return total;};o3djs.io.LoadInfo.prototype.getTotalRequestsDownloaded=function(){var total=this.request_?0:1;for(var cc=0;cc<this.children_.length;++cc){total+=this.children_[cc].getTotalRequestsDownloaded();}
return total;};o3djs.io.LoadInfo.prototype.getKnownProgressInfoSoFar=function(){var percent=0;var bytesToDownload=this.getTotalKnownBytesToStreamSoFar();var bytesDownloaded=this.getTotalBytesDownloaded();if(bytesToDownload>0){percent=Math.floor(bytesDownloaded/bytesToDownload*100);}
var base=(bytesToDownload<1024*1024)?1024:(1024*1024);return{percent:percent,downloaded:(bytesDownloaded/base).toFixed(2),totalBytes:(bytesToDownload/base).toFixed(2),base:base,suffix:(base==1024?'kb':'mb')}};o3djs.io.loadTextFileSynchronous=function(url){o3djs.BROWSER_ONLY=true;var error='loadTextFileSynchronous failed to load url "'+url+'"';var request;if(!o3djs.base.IsMSIE()&&window.XMLHttpRequest){request=new XMLHttpRequest();if(request.overrideMimeType){request.overrideMimeType('text/plain');}}else if(window.ActiveXObject){request=new ActiveXObject('MSXML2.XMLHTTP.3.0');}else{throw'XMLHttpRequest is disabled';}
request.open('GET',url,false);request.send(null);if(request.readyState!=4){throw error;}
return request.responseText;};o3djs.io.loadTextFile=function(url,callback){o3djs.BROWSER_ONLY=true;var error='loadTextFile failed to load url "'+url+'"';var request;if(!o3djs.base.IsMSIE()&&window.XMLHttpRequest){request=new XMLHttpRequest();if(request.overrideMimeType){request.overrideMimeType('text/plain');}}else if(window.ActiveXObject){request=new ActiveXObject('MSXML2.XMLHTTP.3.0');}else{throw'XMLHttpRequest is disabled';}
var loadInfo=o3djs.io.createLoadInfo(request,false);request.open('GET',url,true);var finish=function(){if(request.readyState==4){var text='';var success=request.status==200||request.status==0;if(success){text=request.responseText;}
loadInfo.finish();callback(text,success?null:'could not load: '+url);}};request.onreadystatechange=finish;request.send(null);return loadInfo;};o3djs.io.ArchiveInfo=function(pack,url,onFinished){var that=this;this.files={};this.pack=pack;this.destroyed=false;this.request_=null;function addFile(rawData){that.files[rawData.uri]=rawData;}
this.loadInfo=o3djs.io.loadArchiveAdvanced(pack,url,addFile,function(request,exception){that.request_=request;onFinished(that,exception);});};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(uri,opt_caseInsensitive){if(!(uri instanceof RegExp)){uri=uri.replace(/(\W)/g,'\\$&');uri=uri.replace(/\\\*/g,'.*');uri=uri.replace(/\\\?/g,'.');uri=new RegExp(uri,opt_caseInsensitive?'i':'');}
var files=[];for(var key in this.files){if(uri.test(key)){files.push(this.files[key]);}}
return files;};o3djs.io.ArchiveInfo.prototype.getFileByURI=function(uri,opt_caseInsensitive){if(opt_caseInsensitive){uri=uri.toLowerCase();for(var key in this.files){if(key.toLowerCase()==uri){return this.files[key];}}
return undefined;}else{return this.files[uri];}};o3djs.io.loadArchive=function(pack,url,onFinished){var archiveInfo=new o3djs.io.ArchiveInfo(pack,url,onFinished);return archiveInfo.loadInfo;};o3djs.io.loadArchiveAdvanced=function(pack,url,onFileAvailable,onFinished){var error='loadArchive failed to load url "'+url+'"';var request=pack.createArchiveRequest();var loadInfo=o3djs.io.createLoadInfo(request,true);request.open('GET',url);request.onfileavailable=function(){onFileAvailable((request.data));};request.onreadystatechange=function(){if(request.done){loadInfo.finish();var success=request.success;var exception=null;if(!success){exception=request.error;if(!exception){exception='unknown error loading archive';}}
onFinished(request,exception);}};request.send();return loadInfo;};o3djs.io.loadTexture=function(pack,url,callback){var request=pack.createFileRequest('TEXTURE');var loadInfo=o3djs.io.createLoadInfo((request),false);request.open('GET',url,true);request.onreadystatechange=function(){if(request.done){var texture=request.texture;var success=request.success;var exception=request.error;loadInfo.finish();pack.removeObject(request);if(!success&&!exception){exception='unknown error loading texture';}
callback(texture,success?null:exception);}};request.send();return loadInfo;};o3djs.io.loadXmlDoc=function(filename)
{o3djs.BROWSER_ONLY=true;if(window.XMLHttpRequest&&!o3djs.base.IsMSIE())
{var request=new XMLHttpRequest();request.open("GET",filename,false);request.send(null);return request.responseXML;}
else
{var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async=false;xmlDoc.load(filename);return xmlDoc;}}
o3djs.provide('o3djs.loader');o3djs.require('o3djs.io');o3djs.require('o3djs.scene');o3djs.loader=o3djs.loader||{};o3djs.loader.Loader=function(onFinished){this.count_=1;this.onFinished_=onFinished;this.loadInfo=o3djs.io.createLoadInfo();};o3djs.loader.createLoader=function(onFinished){return new o3djs.loader.Loader(onFinished);};o3djs.loader.Loader.prototype.loadTexture=function(pack,url,opt_onTextureLoaded){var that=this;++this.count_;var loadInfo=o3djs.io.loadTexture(pack,url,function(texture,exception){if(opt_onTextureLoaded){opt_onTextureLoaded(texture,exception);}
that.countDown_();});this.loadInfo.addChild(loadInfo);};o3djs.loader.Loader.prototype.loadScene=function(client,pack,parent,url,opt_onSceneLoaded,opt_options){var that=this;++this.count_;var loadInfo=o3djs.scene.loadScene(client,pack,parent,url,function(pack,parent,exception){if(opt_onSceneLoaded){opt_onSceneLoaded(pack,parent,exception);}
that.countDown_();},opt_options);this.loadInfo.addChild(loadInfo);};o3djs.loader.Loader.prototype.loadTextFile=function(url,onTextLoaded){var that=this;++this.count_;var loadInfo=o3djs.io.loadTextFile(url,function(string,exception){onTextLoaded(string,exception);that.countDown_();});this.loadInfo.addChild(loadInfo);};o3djs.loader.Loader.prototype.createLoader=function(onFinished){var that=this;++this.count_;var loader=o3djs.loader.createLoader(function(){onFinished();that.countDown_();});this.loadInfo.addChild(loader.loadInfo);return loader;};o3djs.loader.Loader.prototype.countDown_=function(){--this.count_;if(this.count_===0){this.onFinished_();}};o3djs.loader.Loader.prototype.finish=function(){this.countDown_();};o3djs.provide('o3djs.material');o3djs.require('o3djs.math');o3djs.require('o3djs.effect');o3djs.material=o3djs.material||{};o3djs.material.hasNonOneAlpha_=function(material,name){var found=false;var nonOneAlpha=false;var texture=null;var samplerParam=material.getParam(name+'Sampler');if(samplerParam&&samplerParam.isAClassName('o3d.ParamSampler')){found=true;var sampler=samplerParam.value;if(sampler){texture=sampler.texture;}}else{var textureParam=material.getParam(name+'Texture');if(textureParam&&textureParam.isAClassName('o3d.ParamTexture')){found=true;texture=textureParam.value;}}
if(texture&&!texture.alphaIsOne){nonOneAlpha=true;}
if(!found){var colorParam=material.getParam(name);if(colorParam&&colorParam.isAClassName('o3d.ParamFloat4')){found=true;}}
return{found:found,nonOneAlpha:nonOneAlpha};};o3djs.material.prepareMaterial=function(pack,viewInfo,material,opt_effectType){var drawList=viewInfo.performanceDrawList;if(!material.drawList){var param=material.getParam('collada.transparent');if(param&&param.className=='o3d.ParamBoolean'){material.drawList=param.value?viewInfo.zOrderedDrawList:viewInfo.performanceDrawList;}}
if(!material.effect){if(!opt_effectType){var lightingType=o3djs.effect.getColladaLightingType(material);if(lightingType){opt_effectType=lightingType;}}
if(opt_effectType){o3djs.material.attachStandardEffect(pack,material,viewInfo,opt_effectType);if(material.drawList==null){var result=o3djs.material.hasNonOneAlpha_(material,'diffuse');if(!result.found){result=o3djs.material.hasNonOneAlpha_(material,'emissive');}
if(result.nonOneAlpha){drawList=viewInfo.zOrderedDrawList;}}}}
if(!material.drawList){material.drawList=drawList;}};o3djs.material.prepareMaterials=function(pack,viewInfo,opt_effectPack){var materials=pack.getObjectsByClassName('o3d.Material');for(var mm=0;mm<materials.length;mm++){o3djs.material.prepareMaterial(opt_effectPack||pack,viewInfo,materials[mm]);}};o3djs.material.attachStandardEffect=function(pack,material,viewInfo,effectType){if(!material.effect){var lightPos=o3djs.math.matrix4.getTranslation(o3djs.math.inverse(viewInfo.drawContext.view));if(!o3djs.effect.attachStandardShader(pack,material,lightPos,effectType)){throw'Could not attach a standard effect';}}};o3djs.material.setDrawListOnMaterials=function(pack,drawList){var materials=pack.getObjectsByClassName('o3d.Material');for(var mm=0;mm<materials.length;mm++){var material=materials[mm];material.drawList=drawList;}};o3djs.material.createBasicMaterial=function(pack,viewInfo,colorOrTexture,opt_transparent){var material=pack.createObject('Material');material.drawList=opt_transparent?viewInfo.zOrderedDrawList:viewInfo.performanceDrawList;if(colorOrTexture.length){material.createParam('diffuse','ParamFloat4').value=colorOrTexture;}else{var paramSampler=material.createParam('diffuseSampler','ParamSampler');var sampler=pack.createObject('Sampler');paramSampler.value=sampler;sampler.texture=colorOrTexture;}
material.createParam('emissive','ParamFloat4').value=[0,0,0,1];material.createParam('ambient','ParamFloat4').value=[0,0,0,1];material.createParam('specular','ParamFloat4').value=[1,1,1,1];material.createParam('shininess','ParamFloat').value=50;material.createParam('specularFactor','ParamFloat').value=1;material.createParam('lightColor','ParamFloat4').value=[1,1,1,1];var lightPositionParam=material.createParam('lightWorldPos','ParamFloat3');o3djs.material.attachStandardEffect(pack,material,viewInfo,'phong');lightPositionParam.value=[1000,2000,3000];return material;};o3djs.material.createMaterialFromFile=function(pack,url,drawList){var effect=o3djs.effect.createEffectFromFile(pack,url);var material=pack.createObject('Material');material.effect=effect;material.drawList=drawList;effect.createUniformParameters(material);return material;};o3djs.material.bindParamsOnMaterial=function(material,params){for(var paramName in params){var sourceParam=params[paramName];var param=material.getParam(paramName);if(param&&sourceParam.isAClassName(param.className)){param.bind(sourceParam);}}};o3djs.material.bindParams=function(pack,params){var materials=pack.getObjectsByClassName('o3d.Material');for(var mm=0;mm<materials.length;++mm){o3djs.material.bindParamsOnMaterial(materials[mm],params);}};o3djs.material.createParams=function(pack,paramSpec){var paramObject=pack.createObject('ParamObject');var params={};for(var paramName in paramSpec){params[paramName]=paramObject.createParam(paramName,paramSpec[paramName]);}
return params;};o3djs.material.createStandardParams=function(pack){var paramSpec={'lightColor':'ParamFloat4','lightWorldPos':'ParamFloat3'};return o3djs.material.createParams(pack,paramSpec);};o3djs.material.createAndBindStandardParams=function(pack){var params=o3djs.material.createStandardParams(pack);o3djs.material.bindParams(pack,params);return params;};o3djs.provide('o3djs.math');o3djs.math=o3djs.math||{};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.degToRad=function(degrees){return degrees*Math.PI/180;};o3djs.math.radToDeg=function(radians){return radians*180/Math.PI;};o3djs.math.lerpScalar=function(a,b,t){return(1-t)*a+t*b;};o3djs.math.addVector=function(a,b){var r=[];var aLength=a.length;for(var i=0;i<aLength;++i)
r[i]=a[i]+b[i];return r;};o3djs.math.subVector=function(a,b){var r=[];var aLength=a.length;for(var i=0;i<aLength;++i)
r[i]=a[i]-b[i];return r;};o3djs.math.lerpVector=function(a,b,t){var r=[];var aLength=a.length;for(var i=0;i<aLength;++i)
r[i]=(1-t)*a[i]+t*b[i];return r;};o3djs.math.modClamp=function(v,range,opt_rangeStart){var start=opt_rangeStart||0;if(range<0.00001){return start;}
v-=start;if(v<0){v-=Math.floor(v/range)*range;}else{v=v%range;}
return v+start;};o3djs.math.lerpCircular=function(a,b,t,range){a=o3djs.math.modClamp(a,range);b=o3djs.math.modClamp(b,range);var delta=b-a;if(Math.abs(delta)>range*0.5){if(delta>0){b-=range;}else{b+=range;}}
return o3djs.math.modClamp(o3djs.math.lerpScalar(a,b,t),range);};o3djs.math.lerpRadian=function(a,b,t){return o3djs.math.lerpCircular(a,b,t,Math.PI*2);};o3djs.math.divVectorScalar=function(v,k){var r=[];var vLength=v.length;for(var i=0;i<vLength;++i)
r[i]=v[i]/k;return r;};o3djs.math.dot=function(a,b){var r=0.0;var aLength=a.length;for(var i=0;i<aLength;++i)
r+=a[i]*b[i];return r;};o3djs.math.cross=function(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]];};o3djs.math.length=function(a){var r=0.0;var aLength=a.length;for(var i=0;i<aLength;++i)
r+=a[i]*a[i];return Math.sqrt(r);};o3djs.math.lengthSquared=function(a){var r=0.0;var aLength=a.length;for(var i=0;i<aLength;++i)
r+=a[i]*a[i];return r;};o3djs.math.distance=function(a,b){var r=0.0;var aLength=a.length;for(var i=0;i<aLength;++i){var t=a[i]-b[i];r+=t*t;}
return Math.sqrt(r);};o3djs.math.distanceSquared=function(a,b){var r=0.0;var aLength=a.length;for(var i=0;i<aLength;++i){var t=a[i]-b[i];r+=t*t;}
return r;};o3djs.math.normalize=function(a){var r=[];var n=0.0;var aLength=a.length;for(var i=0;i<aLength;++i)
n+=a[i]*a[i];n=Math.sqrt(n);for(var i=0;i<aLength;++i)
r[i]=a[i]/n;return r;};o3djs.math.addMatrix=function(a,b){var r=[];var aLength=a.length;var a0Length=a[0].length;for(var i=0;i<aLength;++i){var row=[];var ai=a[i];var bi=b[i];for(var j=0;j<a0Length;++j)
row[j]=ai[j]+bi[j];r[i]=row;}
return r;};o3djs.math.subMatrix=function(a,b){var r=[];var aLength=a.length;var a0Length=a[0].length;for(var i=0;i<aLength;++i){var row=[];var ai=a[i];var bi=b[i];for(var j=0;j<a0Length;++j)
row[j]=ai[j]-bi[j];r[i]=row;}
return r;};o3djs.math.lerpMatrix=function(a,b,t){var r=[];var aLength=a.length;var a0Length=a[0].length;for(var i=0;i<aLength;++i){var row=[];var ai=a[i];var bi=b[i];for(var j=0;j<a0Length;++j)
row[j]=(1-t)*ai[j]+t*bi[j];r[i]=row;}
return r;};o3djs.math.divMatrixScalar=function(m,k){var r=[];var mLength=m.length;var m0Length=m[0].length;for(var i=0;i<mLength;++i){r[i]=[];for(var j=0;j<m0Length;++j)
r[i][j]=m[i][j]/k;}
return r;};o3djs.math.negativeScalar=function(a){return-a;};o3djs.math.negativeVector=function(v){var r=[];var vLength=v.length;for(var i=0;i<vLength;++i){r[i]=-v[i];}
return r;};o3djs.math.negativeMatrix=function(m){var r=[];var mLength=m.length;var m0Length=m[0].length;for(var i=0;i<mLength;++i){r[i]=[];for(var j=0;j<m0Length;++j)
r[i][j]=-m[i][j];}
return r;};o3djs.math.copyScalar=function(a){return a;};o3djs.math.copyVector=function(v){var r=[];for(var i=0;i<v.length;i++)
r[i]=v[i];return r;};o3djs.math.copyMatrix=function(m){var r=[];var mLength=m.length;for(var i=0;i<mLength;++i){r[i]=[];for(var j=0;j<m[i].length;j++){r[i][j]=m[i][j];}}
return r;};o3djs.math.mulScalarScalar=function(a,b){return a*b;};o3djs.math.mulScalarVector=function(k,v){var r=[];var vLength=v.length;for(var i=0;i<vLength;++i){r[i]=k*v[i];}
return r;};o3djs.math.mulVectorScalar=function(v,k){return o3djs.math.mulScalarVector(k,v);};o3djs.math.mulScalarMatrix=function(k,m){var r=[];var mLength=m.length;var m0Length=m[0].length;for(var i=0;i<mLength;++i){r[i]=[];for(var j=0;j<m0Length;++j)
r[i][j]=k*m[i][j];}
return r;};o3djs.math.mulMatrixScalar=function(m,k){return o3djs.math.mulScalarMatrix(k,m);};o3djs.math.mulVectorVector=function(a,b){var r=[];var aLength=a.length;for(var i=0;i<aLength;++i)
r[i]=a[i]*b[i];return r;};o3djs.math.divVectorVector=function(a,b){var r=[];var aLength=a.length;for(var i=0;i<aLength;++i)
r[i]=a[i]*b[i];return r;};o3djs.math.rowMajor.mulVectorMatrix=function(v,m){var r=[];var m0Length=m[0].length;var vLength=v.length;for(var i=0;i<m0Length;++i){r[i]=0.0;for(var j=0;j<vLength;++j)
r[i]+=v[j]*m[j][i];}
return r;};o3djs.math.columnMajor.mulVectorMatrix=function(v,m){var r=[];var mLength=m.length;var vLength=v.length;for(var i=0;i<mLength;++i){r[i]=0.0;var column=m[i];for(var j=0;j<vLength;++j)
r[i]+=v[j]*column[j];}
return r;};o3djs.math.mulVectorMatrix=null;o3djs.math.rowMajor.mulMatrixVector=function(m,v){var r=[];var mLength=m.length;var m0Length=m[0].length;for(var i=0;i<mLength;++i){r[i]=0.0;var row=m[i];for(var j=0;j<m0Length;++j)
r[i]+=row[j]*v[j];}
return r;};o3djs.math.columnMajor.mulMatrixVector=function(m,v){var r=[];var m0Length=m[0].length;var vLength=v.length;for(var i=0;i<m0Length;++i){r[i]=0.0;for(var j=0;j<vLength;++j)
r[i]+=v[j]*m[j][i];}
return r;};o3djs.math.mulMatrixVector=null;o3djs.math.rowMajor.mulMatrixMatrix2=function(a,b){var a0=a[0];var a1=a[1];var b0=b[0];var b1=b[1];var a00=a0[0];var a01=a0[1];var a10=a1[0];var a11=a1[1];var b00=b0[0];var b01=b0[1];var b10=b1[0];var b11=b1[1];return[[a00*b00+a01*b10,a00*b01+a01*b11],[a10*b00+a11*b10,a10*b01+a11*b11]];};o3djs.math.columnMajor.mulMatrixMatrix2=function(a,b){var a0=a[0];var a1=a[1];var b0=b[0];var b1=b[1];var a00=a0[0];var a01=a0[1];var a10=a1[0];var a11=a1[1];var b00=b0[0];var b01=b0[1];var b10=b1[0];var b11=b1[1];return[[a00*b00+a10*b01,a01*b00+a11*b01],[a00*b10+a10*b11,a01*b10+a11*b11]];};o3djs.math.mulMatrixMatrix2=null;o3djs.math.rowMajor.mulMatrixMatrix3=function(a,b){var a0=a[0];var a1=a[1];var a2=a[2];var b0=b[0];var b1=b[1];var b2=b[2];var a00=a0[0];var a01=a0[1];var a02=a0[2];var a10=a1[0];var a11=a1[1];var a12=a1[2];var a20=a2[0];var a21=a2[1];var a22=a2[2];var b00=b0[0];var b01=b0[1];var b02=b0[2];var b10=b1[0];var b11=b1[1];var b12=b1[2];var b20=b2[0];var b21=b2[1];var b22=b2[2];return[[a00*b00+a01*b10+a02*b20,a00*b01+a01*b11+a02*b21,a00*b02+a01*b12+a02*b22],[a10*b00+a11*b10+a12*b20,a10*b01+a11*b11+a12*b21,a10*b02+a11*b12+a12*b22],[a20*b00+a21*b10+a22*b20,a20*b01+a21*b11+a22*b21,a20*b02+a21*b12+a22*b22]];};o3djs.math.columnMajor.mulMatrixMatrix3=function(a,b){var a0=a[0];var a1=a[1];var a2=a[2];var b0=b[0];var b1=b[1];var b2=b[2];var a00=a0[0];var a01=a0[1];var a02=a0[2];var a10=a1[0];var a11=a1[1];var a12=a1[2];var a20=a2[0];var a21=a2[1];var a22=a2[2];var b00=b0[0];var b01=b0[1];var b02=b0[2];var b10=b1[0];var b11=b1[1];var b12=b1[2];var b20=b2[0];var b21=b2[1];var b22=b2[2];return[[a00*b00+a10*b01+a20*b02,a01*b00+a11*b01+a21*b02,a02*b00+a12*b01+a22*b02],[a00*b10+a10*b11+a20*b12,a01*b10+a11*b11+a21*b12,a02*b10+a12*b11+a22*b12],[a00*b20+a10*b21+a20*b22,a01*b20+a11*b21+a21*b22,a02*b20+a12*b21+a22*b22]];};o3djs.math.mulMatrixMatrix3=null;o3djs.math.rowMajor.mulMatrixMatrix4=function(a,b){var a0=a[0];var a1=a[1];var a2=a[2];var a3=a[3];var b0=b[0];var b1=b[1];var b2=b[2];var b3=b[3];var a00=a0[0];var a01=a0[1];var a02=a0[2];var a03=a0[3];var a10=a1[0];var a11=a1[1];var a12=a1[2];var a13=a1[3];var a20=a2[0];var a21=a2[1];var a22=a2[2];var a23=a2[3];var a30=a3[0];var a31=a3[1];var a32=a3[2];var a33=a3[3];var b00=b0[0];var b01=b0[1];var b02=b0[2];var b03=b0[3];var b10=b1[0];var b11=b1[1];var b12=b1[2];var b13=b1[3];var b20=b2[0];var b21=b2[1];var b22=b2[2];var b23=b2[3];var b30=b3[0];var b31=b3[1];var b32=b3[2];var b33=b3[3];return[[a00*b00+a01*b10+a02*b20+a03*b30,a00*b01+a01*b11+a02*b21+a03*b31,a00*b02+a01*b12+a02*b22+a03*b32,a00*b03+a01*b13+a02*b23+a03*b33],[a10*b00+a11*b10+a12*b20+a13*b30,a10*b01+a11*b11+a12*b21+a13*b31,a10*b02+a11*b12+a12*b22+a13*b32,a10*b03+a11*b13+a12*b23+a13*b33],[a20*b00+a21*b10+a22*b20+a23*b30,a20*b01+a21*b11+a22*b21+a23*b31,a20*b02+a21*b12+a22*b22+a23*b32,a20*b03+a21*b13+a22*b23+a23*b33],[a30*b00+a31*b10+a32*b20+a33*b30,a30*b01+a31*b11+a32*b21+a33*b31,a30*b02+a31*b12+a32*b22+a33*b32,a30*b03+a31*b13+a32*b23+a33*b33]];};o3djs.math.columnMajor.mulMatrixMatrix4=function(a,b){var a0=a[0];var a1=a[1];var a2=a[2];var a3=a[3];var b0=b[0];var b1=b[1];var b2=b[2];var b3=b[3];var a00=a0[0];var a01=a0[1];var a02=a0[2];var a03=a0[3];var a10=a1[0];var a11=a1[1];var a12=a1[2];var a13=a1[3];var a20=a2[0];var a21=a2[1];var a22=a2[2];var a23=a2[3];var a30=a3[0];var a31=a3[1];var a32=a3[2];var a33=a3[3];var b00=b0[0];var b01=b0[1];var b02=b0[2];var b03=b0[3];var b10=b1[0];var b11=b1[1];var b12=b1[2];var b13=b1[3];var b20=b2[0];var b21=b2[1];var b22=b2[2];var b23=b2[3];var b30=b3[0];var b31=b3[1];var b32=b3[2];var b33=b3[3];return[[a00*b00+a10*b01+a20*b02+a30*b03,a01*b00+a11*b01+a21*b02+a31*b03,a02*b00+a12*b01+a22*b02+a32*b03,a03*b00+a13*b01+a23*b02+a33*b03],[a00*b10+a10*b11+a20*b12+a30*b13,a01*b10+a11*b11+a21*b12+a31*b13,a02*b10+a12*b11+a22*b12+a32*b13,a03*b10+a13*b11+a23*b12+a33*b13],[a00*b20+a10*b21+a20*b22+a30*b23,a01*b20+a11*b21+a21*b22+a31*b23,a02*b20+a12*b21+a22*b22+a32*b23,a03*b20+a13*b21+a23*b22+a33*b23],[a00*b30+a10*b31+a20*b32+a30*b33,a01*b30+a11*b31+a21*b32+a31*b33,a02*b30+a12*b31+a22*b32+a32*b33,a03*b30+a13*b31+a23*b32+a33*b33]];};o3djs.math.mulMatrixMatrix4=null;o3djs.math.rowMajor.mulMatrixMatrix=function(a,b){var r=[];var aRows=a.length;var bColumns=b[0].length;var bRows=b.length;for(var i=0;i<aRows;++i){var v=[];var ai=a[i];for(var j=0;j<bColumns;++j){v[j]=0.0;for(var k=0;k<bRows;++k)
v[j]+=ai[k]*b[k][j];}
r[i]=v;}
return r;};o3djs.math.columnMajor.mulMatrixMatrix=function(a,b){var r=[];var bColumns=b.length;var aRows=a[0].length;var aColumns=a.length;for(var i=0;i<bColumns;++i){var v=[];var bi=b[i];for(var j=0;j<aRows;++j){v[j]=0.0;for(var k=0;k<aColumns;++k)
v[j]+=bi[k]*a[k][j];}
r[i]=v;}
return r;};o3djs.math.mulMatrixMatrix=null;o3djs.math.rowMajor.column=function(m,j){var r=[];var mLength=m.length;for(var i=0;i<mLength;++i){r[i]=m[i][j];}
return r;};o3djs.math.columnMajor.column=function(m,j){return m[j].slice();};o3djs.math.column=null;o3djs.math.rowMajor.row=function(m,i){return m[i].slice();};o3djs.math.columnMajor.row=function(m,i){var r=[];var mLength=m.length;for(var j=0;j<mLength;++j){r[j]=m[j][i];}
return r;};o3djs.math.row=null;o3djs.math.identity=function(n){var r=[];for(var j=0;j<n;++j){r[j]=[];for(var i=0;i<n;++i)
r[j][i]=(i==j)?1:0;}
return r;};o3djs.math.transpose=function(m){var r=[];var m0Length=m[0].length;var mLength=m.length;for(var j=0;j<m0Length;++j){r[j]=[];for(var i=0;i<mLength;++i)
r[j][i]=m[i][j];}
return r;};o3djs.math.trace=function(m){var r=0.0;var mLength=m.length;for(var i=0;i<mLength;++i)
r+=m[i][i];return r;};o3djs.math.det1=function(m){return m[0][0];};o3djs.math.det2=function(m){return m[0][0]*m[1][1]-m[0][1]*m[1][0];};o3djs.math.det3=function(m){return m[2][2]*(m[0][0]*m[1][1]-m[0][1]*m[1][0])-
m[2][1]*(m[0][0]*m[1][2]-m[0][2]*m[1][0])+
m[2][0]*(m[0][1]*m[1][2]-m[0][2]*m[1][1]);};o3djs.math.det4=function(m){var t01=m[0][0]*m[1][1]-m[0][1]*m[1][0];var t02=m[0][0]*m[1][2]-m[0][2]*m[1][0];var t03=m[0][0]*m[1][3]-m[0][3]*m[1][0];var t12=m[0][1]*m[1][2]-m[0][2]*m[1][1];var t13=m[0][1]*m[1][3]-m[0][3]*m[1][1];var t23=m[0][2]*m[1][3]-m[0][3]*m[1][2];return m[3][3]*(m[2][2]*t01-m[2][1]*t02+m[2][0]*t12)-
m[3][2]*(m[2][3]*t01-m[2][1]*t03+m[2][0]*t13)+
m[3][1]*(m[2][3]*t02-m[2][2]*t03+m[2][0]*t23)-
m[3][0]*(m[2][3]*t12-m[2][2]*t13+m[2][1]*t23);};o3djs.math.inverse1=function(m){return[[1.0/m[0][0]]];};o3djs.math.inverse2=function(m){var d=1.0/(m[0][0]*m[1][1]-m[0][1]*m[1][0]);return[[d*m[1][1],-d*m[0][1]],[-d*m[1][0],d*m[0][0]]];};o3djs.math.inverse3=function(m){var t00=m[1][1]*m[2][2]-m[1][2]*m[2][1];var t10=m[0][1]*m[2][2]-m[0][2]*m[2][1];var t20=m[0][1]*m[1][2]-m[0][2]*m[1][1];var d=1.0/(m[0][0]*t00-m[1][0]*t10+m[2][0]*t20);return[[d*t00,-d*t10,d*t20],[-d*(m[1][0]*m[2][2]-m[1][2]*m[2][0]),d*(m[0][0]*m[2][2]-m[0][2]*m[2][0]),-d*(m[0][0]*m[1][2]-m[0][2]*m[1][0])],[d*(m[1][0]*m[2][1]-m[1][1]*m[2][0]),-d*(m[0][0]*m[2][1]-m[0][1]*m[2][0]),d*(m[0][0]*m[1][1]-m[0][1]*m[1][0])]];};o3djs.math.inverse4=function(m){var tmp_0=m[2][2]*m[3][3];var tmp_1=m[3][2]*m[2][3];var tmp_2=m[1][2]*m[3][3];var tmp_3=m[3][2]*m[1][3];var tmp_4=m[1][2]*m[2][3];var tmp_5=m[2][2]*m[1][3];var tmp_6=m[0][2]*m[3][3];var tmp_7=m[3][2]*m[0][3];var tmp_8=m[0][2]*m[2][3];var tmp_9=m[2][2]*m[0][3];var tmp_10=m[0][2]*m[1][3];var tmp_11=m[1][2]*m[0][3];var tmp_12=m[2][0]*m[3][1];var tmp_13=m[3][0]*m[2][1];var tmp_14=m[1][0]*m[3][1];var tmp_15=m[3][0]*m[1][1];var tmp_16=m[1][0]*m[2][1];var tmp_17=m[2][0]*m[1][1];var tmp_18=m[0][0]*m[3][1];var tmp_19=m[3][0]*m[0][1];var tmp_20=m[0][0]*m[2][1];var tmp_21=m[2][0]*m[0][1];var tmp_22=m[0][0]*m[1][1];var tmp_23=m[1][0]*m[0][1];var t0=(tmp_0*m[1][1]+tmp_3*m[2][1]+tmp_4*m[3][1])-
(tmp_1*m[1][1]+tmp_2*m[2][1]+tmp_5*m[3][1]);var t1=(tmp_1*m[0][1]+tmp_6*m[2][1]+tmp_9*m[3][1])-
(tmp_0*m[0][1]+tmp_7*m[2][1]+tmp_8*m[3][1]);var t2=(tmp_2*m[0][1]+tmp_7*m[1][1]+tmp_10*m[3][1])-
(tmp_3*m[0][1]+tmp_6*m[1][1]+tmp_11*m[3][1]);var t3=(tmp_5*m[0][1]+tmp_8*m[1][1]+tmp_11*m[2][1])-
(tmp_4*m[0][1]+tmp_9*m[1][1]+tmp_10*m[2][1]);var d=1.0/(m[0][0]*t0+m[1][0]*t1+m[2][0]*t2+m[3][0]*t3);return[[d*t0,d*t1,d*t2,d*t3],[d*((tmp_1*m[1][0]+tmp_2*m[2][0]+tmp_5*m[3][0])-
(tmp_0*m[1][0]+tmp_3*m[2][0]+tmp_4*m[3][0])),d*((tmp_0*m[0][0]+tmp_7*m[2][0]+tmp_8*m[3][0])-
(tmp_1*m[0][0]+tmp_6*m[2][0]+tmp_9*m[3][0])),d*((tmp_3*m[0][0]+tmp_6*m[1][0]+tmp_11*m[3][0])-
(tmp_2*m[0][0]+tmp_7*m[1][0]+tmp_10*m[3][0])),d*((tmp_4*m[0][0]+tmp_9*m[1][0]+tmp_10*m[2][0])-
(tmp_5*m[0][0]+tmp_8*m[1][0]+tmp_11*m[2][0]))],[d*((tmp_12*m[1][3]+tmp_15*m[2][3]+tmp_16*m[3][3])-
(tmp_13*m[1][3]+tmp_14*m[2][3]+tmp_17*m[3][3])),d*((tmp_13*m[0][3]+tmp_18*m[2][3]+tmp_21*m[3][3])-
(tmp_12*m[0][3]+tmp_19*m[2][3]+tmp_20*m[3][3])),d*((tmp_14*m[0][3]+tmp_19*m[1][3]+tmp_22*m[3][3])-
(tmp_15*m[0][3]+tmp_18*m[1][3]+tmp_23*m[3][3])),d*((tmp_17*m[0][3]+tmp_20*m[1][3]+tmp_23*m[2][3])-
(tmp_16*m[0][3]+tmp_21*m[1][3]+tmp_22*m[2][3]))],[d*((tmp_14*m[2][2]+tmp_17*m[3][2]+tmp_13*m[1][2])-
(tmp_16*m[3][2]+tmp_12*m[1][2]+tmp_15*m[2][2])),d*((tmp_20*m[3][2]+tmp_12*m[0][2]+tmp_19*m[2][2])-
(tmp_18*m[2][2]+tmp_21*m[3][2]+tmp_13*m[0][2])),d*((tmp_18*m[1][2]+tmp_23*m[3][2]+tmp_15*m[0][2])-
(tmp_22*m[3][2]+tmp_14*m[0][2]+tmp_19*m[1][2])),d*((tmp_22*m[2][2]+tmp_16*m[0][2]+tmp_21*m[1][2])-
(tmp_20*m[1][2]+tmp_23*m[2][2]+tmp_17*m[0][2]))]];};o3djs.math.codet=function(a,x,y){var size=a.length;var b=[];var ai=0;for(var bi=0;bi<size-1;++bi){if(ai==x)
ai++;b[bi]=[];var aj=0;for(var bj=0;bj<size-1;++bj){if(aj==y)
aj++;b[bi][bj]=a[ai][aj];aj++;}
ai++;}
return o3djs.math.det(b);};o3djs.math.det=function(m){var d=m.length;if(d<=4){return o3djs.math['det'+d](m);}
var r=0.0;var sign=1;var row=m[0];var mLength=m.length;for(var y=0;y<mLength;y++){r+=sign*row[y]*o3djs.math.codet(m,0,y);sign*=-1;}
return r;};o3djs.math.inverse=function(m){var d=m.length;if(d<=4){return o3djs.math['inverse'+d](m);}
var r=[];var size=m.length;for(var j=0;j<size;++j){r[j]=[];for(var i=0;i<size;++i)
r[j][i]=((i+j)%2?-1:1)*o3djs.math.codet(m,i,j);}
return o3djs.math.divMatrixScalar(r,o3djs.math.det(m));};o3djs.math.orthonormalize=function(m){var r=[];var mLength=m.length;for(var i=0;i<mLength;++i){var v=m[i];for(var j=0;j<i;++j){v=o3djs.math.subVector(v,o3djs.math.mulScalarVector(o3djs.math.dot(r[j],m[i]),r[j]));}
r[i]=o3djs.math.normalize(v);}
return r;};o3djs.math.matrix4.inverse=function(m){return o3djs.math.inverse4(m);};o3djs.math.matrix4.mul=function(a,b){return o3djs.math.mulMatrixMatrix4(a,b);};o3djs.math.matrix4.det=function(m){return o3djs.math.det4(m);};o3djs.math.matrix4.copy=function(m){return o3djs.math.copyMatrix(m);};o3djs.math.matrix4.setUpper3x3=function(a,b){var b0=b[0];var b1=b[1];var b2=b[2];a[0].splice(0,3,b0[0],b0[1],b0[2]);a[1].splice(0,3,b1[0],b1[1],b1[2]);a[2].splice(0,3,b2[0],b2[1],b2[2]);return a;};o3djs.math.matrix4.getUpper3x3=function(m){return[m[0].slice(0,3),m[1].slice(0,3),m[2].slice(0,3)];};o3djs.math.matrix4.setTranslation=function(a,v){a[3].splice(0,4,v[0],v[1],v[2],1);return a;};o3djs.math.matrix4.getTranslation=function(m){return m[3].slice(0,3);};o3djs.math.matrix4.transformPoint=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var d=v0*m0[3]+v1*m1[3]+v2*m2[3]+m3[3];return[(v0*m0[0]+v1*m1[0]+v2*m2[0]+m3[0])/d,(v0*m0[1]+v1*m1[1]+v2*m2[1]+m3[1])/d,(v0*m0[2]+v1*m1[2]+v2*m2[2]+m3[2])/d];};o3djs.math.matrix4.transformVector4=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];var v3=v[3];var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];return[v0*m0[0]+v1*m1[0]+v2*m2[0]+v3*m3[0],v0*m0[1]+v1*m1[1]+v2*m2[1]+v3*m3[1],v0*m0[2]+v1*m1[2]+v2*m2[2]+v3*m3[2],v0*m0[3]+v1*m1[3]+v2*m2[3]+v3*m3[3]];};o3djs.math.matrix4.transformDirection=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];return[v0*m0[0]+v1*m1[0]+v2*m2[0],v0*m0[1]+v1*m1[1]+v2*m2[1],v0*m0[2]+v1*m1[2]+v2*m2[2]];};o3djs.math.matrix4.transformNormal=function(m,v){var mInverse=o3djs.math.inverse4(m);var v0=v[0];var v1=v[1];var v2=v[2];var mi0=mInverse[0];var mi1=mInverse[1];var mi2=mInverse[2];var mi3=mInverse[3];return[v0*mi0[0]+v1*mi0[1]+v2*mi0[2],v0*mi1[0]+v1*mi1[1]+v2*mi1[2],v0*mi2[0]+v1*mi2[1]+v2*mi2[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(angle,aspect,near,far){var f=Math.tan(0.5*(Math.PI-angle));var range=near-far;return[[f/aspect,0,0,0],[0,f,0,0],[0,0,far/range,-1],[0,0,near*far/range,0]];};o3djs.math.matrix4.orthographic=function(left,right,bottom,top,near,far){return[[2/(right-left),0,0,0],[0,2/(top-bottom),0,0],[0,0,1/(near-far),0],[(left+right)/(left-right),(bottom+top)/(bottom-top),near/(near-far),1]];};o3djs.math.matrix4.frustum=function(left,right,bottom,top,near,far){var dx=(right-left);var dy=(top-bottom);var dz=(near-far);return[[2*near/dx,0,0,0],[0,2*near/dy,0,0],[(left+right)/dx,(top+bottom)/dy,far/dz,-1],[0,0,near*far/dz,0]];};o3djs.math.matrix4.lookAt=function(eye,target,up){var vz=o3djs.math.normalize(o3djs.math.subVector(eye,target).slice(0,3)).concat(0);var vx=o3djs.math.normalize(o3djs.math.cross(up,vz)).concat(0);var vy=o3djs.math.cross(vz,vx).concat(0);return o3djs.math.inverse([vx,vy,vz,eye.concat(1)]);};o3djs.math.matrix4.composition=function(a,b){var a0=a[0];var a1=a[1];var a2=a[2];var a3=a[3];var b0=b[0];var b1=b[1];var b2=b[2];var b3=b[3];var a00=a0[0];var a01=a0[1];var a02=a0[2];var a03=a0[3];var a10=a1[0];var a11=a1[1];var a12=a1[2];var a13=a1[3];var a20=a2[0];var a21=a2[1];var a22=a2[2];var a23=a2[3];var a30=a3[0];var a31=a3[1];var a32=a3[2];var a33=a3[3];var b00=b0[0];var b01=b0[1];var b02=b0[2];var b03=b0[3];var b10=b1[0];var b11=b1[1];var b12=b1[2];var b13=b1[3];var b20=b2[0];var b21=b2[1];var b22=b2[2];var b23=b2[3];var b30=b3[0];var b31=b3[1];var b32=b3[2];var b33=b3[3];return[[a00*b00+a10*b01+a20*b02+a30*b03,a01*b00+a11*b01+a21*b02+a31*b03,a02*b00+a12*b01+a22*b02+a32*b03,a03*b00+a13*b01+a23*b02+a33*b03],[a00*b10+a10*b11+a20*b12+a30*b13,a01*b10+a11*b11+a21*b12+a31*b13,a02*b10+a12*b11+a22*b12+a32*b13,a03*b10+a13*b11+a23*b12+a33*b13],[a00*b20+a10*b21+a20*b22+a30*b23,a01*b20+a11*b21+a21*b22+a31*b23,a02*b20+a12*b21+a22*b22+a32*b23,a03*b20+a13*b21+a23*b22+a33*b23],[a00*b30+a10*b31+a20*b32+a30*b33,a01*b30+a11*b31+a21*b32+a31*b33,a02*b30+a12*b31+a22*b32+a32*b33,a03*b30+a13*b31+a23*b32+a33*b33]];};o3djs.math.matrix4.compose=function(a,b){var a0=a[0];var a1=a[1];var a2=a[2];var a3=a[3];var b0=b[0];var b1=b[1];var b2=b[2];var b3=b[3];var a00=a0[0];var a01=a0[1];var a02=a0[2];var a03=a0[3];var a10=a1[0];var a11=a1[1];var a12=a1[2];var a13=a1[3];var a20=a2[0];var a21=a2[1];var a22=a2[2];var a23=a2[3];var a30=a3[0];var a31=a3[1];var a32=a3[2];var a33=a3[3];var b00=b0[0];var b01=b0[1];var b02=b0[2];var b03=b0[3];var b10=b1[0];var b11=b1[1];var b12=b1[2];var b13=b1[3];var b20=b2[0];var b21=b2[1];var b22=b2[2];var b23=b2[3];var b30=b3[0];var b31=b3[1];var b32=b3[2];var b33=b3[3];a[0].splice(0,4,a00*b00+a10*b01+a20*b02+a30*b03,a01*b00+a11*b01+a21*b02+a31*b03,a02*b00+a12*b01+a22*b02+a32*b03,a03*b00+a13*b01+a23*b02+a33*b03);a[1].splice(0,4,a00*b10+a10*b11+a20*b12+a30*b13,a01*b10+a11*b11+a21*b12+a31*b13,a02*b10+a12*b11+a22*b12+a32*b13,a03*b10+a13*b11+a23*b12+a33*b13);a[2].splice(0,4,a00*b20+a10*b21+a20*b22+a30*b23,a01*b20+a11*b21+a21*b22+a31*b23,a02*b20+a12*b21+a22*b22+a32*b23,a03*b20+a13*b21+a23*b22+a33*b23),a[3].splice(0,4,a00*b30+a10*b31+a20*b32+a30*b33,a01*b30+a11*b31+a21*b32+a31*b33,a02*b30+a12*b31+a22*b32+a32*b33,a03*b30+a13*b31+a23*b32+a33*b33);return a;};o3djs.math.matrix4.translation=function(v){return[[1,0,0,0],[0,1,0,0],[0,0,1,0],[v[0],v[1],v[2],1]];};o3djs.math.matrix4.translate=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var m00=m0[0];var m01=m0[1];var m02=m0[2];var m03=m0[3];var m10=m1[0];var m11=m1[1];var m12=m1[2];var m13=m1[3];var m20=m2[0];var m21=m2[1];var m22=m2[2];var m23=m2[3];var m30=m3[0];var m31=m3[1];var m32=m3[2];var m33=m3[3];m3.splice(0,4,m00*v0+m10*v1+m20*v2+m30,m01*v0+m11*v1+m21*v2+m31,m02*v0+m12*v1+m22*v2+m32,m03*v0+m13*v1+m23*v2+m33);return m;};o3djs.math.matrix4.scaling=function(v){return[[v[0],0,0,0],[0,v[1],0,0],[0,0,v[2],0],[0,0,0,1]];};o3djs.math.matrix4.scale=function(m,v){var v0=v[0];var v1=v[1];var v2=v[2];var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];m0.splice(0,4,v0*m0[0],v0*m0[1],v0*m0[2],v0*m0[3]);m1.splice(0,4,v1*m1[0],v1*m1[1],v1*m1[2],v1*m1[3]);m2.splice(0,4,v2*m2[0],v2*m2[1],v2*m2[2],v2*m2[3]);return m;};o3djs.math.matrix4.rotationX=function(angle){var c=Math.cos(angle);var s=Math.sin(angle);return[[1,0,0,0],[0,c,s,0],[0,-s,c,0],[0,0,0,1]];};o3djs.math.matrix4.rotateX=function(m,angle){var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var m10=m1[0];var m11=m1[1];var m12=m1[2];var m13=m1[3];var m20=m2[0];var m21=m2[1];var m22=m2[2];var m23=m2[3];var c=Math.cos(angle);var s=Math.sin(angle);m1.splice(0,4,c*m10+s*m20,c*m11+s*m21,c*m12+s*m22,c*m13+s*m23);m2.splice(0,4,c*m20-s*m10,c*m21-s*m11,c*m22-s*m12,c*m23-s*m13);return m;};o3djs.math.matrix4.rotationY=function(angle){var c=Math.cos(angle);var s=Math.sin(angle);return[[c,0,-s,0],[0,1,0,0],[s,0,c,0],[0,0,0,1]];};o3djs.math.matrix4.rotateY=function(m,angle){var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var m00=m0[0];var m01=m0[1];var m02=m0[2];var m03=m0[3];var m20=m2[0];var m21=m2[1];var m22=m2[2];var m23=m2[3];var c=Math.cos(angle);var s=Math.sin(angle);m0.splice(0,4,c*m00-s*m20,c*m01-s*m21,c*m02-s*m22,c*m03-s*m23);m2.splice(0,4,c*m20+s*m00,c*m21+s*m01,c*m22+s*m02,c*m23+s*m03);return m;};o3djs.math.matrix4.rotationZ=function(angle){var c=Math.cos(angle);var s=Math.sin(angle);return[[c,s,0,0],[-s,c,0,0],[0,0,1,0],[0,0,0,1]];};o3djs.math.matrix4.rotateZ=function(m,angle){var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var m00=m0[0];var m01=m0[1];var m02=m0[2];var m03=m0[3];var m10=m1[0];var m11=m1[1];var m12=m1[2];var m13=m1[3];var c=Math.cos(angle);var s=Math.sin(angle);m0.splice(0,4,c*m00+s*m10,c*m01+s*m11,c*m02+s*m12,c*m03+s*m13);m1.splice(0,4,c*m10-s*m00,c*m11-s*m01,c*m12-s*m02,c*m13-s*m03);return m;};o3djs.math.matrix4.rotationZYX=function(v){var sinx=Math.sin(v[0]);var cosx=Math.cos(v[0]);var siny=Math.sin(v[1]);var cosy=Math.cos(v[1]);var sinz=Math.sin(v[2]);var cosz=Math.cos(v[2]);var coszsiny=cosz*siny;var sinzsiny=sinz*siny;return[[cosz*cosy,sinz*cosy,-siny,0],[coszsiny*sinx-sinz*cosx,sinzsiny*sinx+cosz*cosx,cosy*sinx,0],[coszsiny*cosx+sinz*sinx,sinzsiny*cosx-cosz*sinx,cosy*cosx,0],[0,0,0,1]];};o3djs.math.matrix4.rotateZYX=function(m,v){var sinX=Math.sin(v[0]);var cosX=Math.cos(v[0]);var sinY=Math.sin(v[1]);var cosY=Math.cos(v[1]);var sinZ=Math.sin(v[2]);var cosZ=Math.cos(v[2]);var cosZSinY=cosZ*sinY;var sinZSinY=sinZ*sinY;var r00=cosZ*cosY;var r01=sinZ*cosY;var r02=-sinY;var r10=cosZSinY*sinX-sinZ*cosX;var r11=sinZSinY*sinX+cosZ*cosX;var r12=cosY*sinX;var r20=cosZSinY*cosX+sinZ*sinX;var r21=sinZSinY*cosX-cosZ*sinX;var r22=cosY*cosX;var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var m00=m0[0];var m01=m0[1];var m02=m0[2];var m03=m0[3];var m10=m1[0];var m11=m1[1];var m12=m1[2];var m13=m1[3];var m20=m2[0];var m21=m2[1];var m22=m2[2];var m23=m2[3];var m30=m3[0];var m31=m3[1];var m32=m3[2];var m33=m3[3];m0.splice(0,4,r00*m00+r01*m10+r02*m20,r00*m01+r01*m11+r02*m21,r00*m02+r01*m12+r02*m22,r00*m03+r01*m13+r02*m23);m1.splice(0,4,r10*m00+r11*m10+r12*m20,r10*m01+r11*m11+r12*m21,r10*m02+r11*m12+r12*m22,r10*m03+r11*m13+r12*m23);m2.splice(0,4,r20*m00+r21*m10+r22*m20,r20*m01+r21*m11+r22*m21,r20*m02+r21*m12+r22*m22,r20*m03+r21*m13+r22*m23);return m;};o3djs.math.matrix4.axisRotation=function(axis,angle){var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angle);var s=Math.sin(angle);var oneMinusCosine=1-c;return[[xx+(1-xx)*c,x*y*oneMinusCosine+z*s,x*z*oneMinusCosine-y*s,0],[x*y*oneMinusCosine-z*s,yy+(1-yy)*c,y*z*oneMinusCosine+x*s,0],[x*z*oneMinusCosine+y*s,y*z*oneMinusCosine-x*s,zz+(1-zz)*c,0],[0,0,0,1]];};o3djs.math.matrix4.axisRotate=function(m,axis,angle){var x=axis[0];var y=axis[1];var z=axis[2];var n=Math.sqrt(x*x+y*y+z*z);x/=n;y/=n;z/=n;var xx=x*x;var yy=y*y;var zz=z*z;var c=Math.cos(angle);var s=Math.sin(angle);var oneMinusCosine=1-c;var r00=xx+(1-xx)*c;var r01=x*y*oneMinusCosine+z*s;var r02=x*z*oneMinusCosine-y*s;var r10=x*y*oneMinusCosine-z*s;var r11=yy+(1-yy)*c;var r12=y*z*oneMinusCosine+x*s;var r20=x*z*oneMinusCosine+y*s;var r21=y*z*oneMinusCosine-x*s;var r22=zz+(1-zz)*c;var m0=m[0];var m1=m[1];var m2=m[2];var m3=m[3];var m00=m0[0];var m01=m0[1];var m02=m0[2];var m03=m0[3];var m10=m1[0];var m11=m1[1];var m12=m1[2];var m13=m1[3];var m20=m2[0];var m21=m2[1];var m22=m2[2];var m23=m2[3];var m30=m3[0];var m31=m3[1];var m32=m3[2];var m33=m3[3];m0.splice(0,4,r00*m00+r01*m10+r02*m20,r00*m01+r01*m11+r02*m21,r00*m02+r01*m12+r02*m22,r00*m03+r01*m13+r02*m23);m1.splice(0,4,r10*m00+r11*m10+r12*m20,r10*m01+r11*m11+r12*m21,r10*m02+r11*m12+r12*m22,r10*m03+r11*m13+r12*m23);m2.splice(0,4,r20*m00+r21*m10+r22*m20,r20*m01+r21*m11+r22*m21,r20*m02+r21*m12+r22*m22,r20*m03+r21*m13+r22*m23);return m;};o3djs.math.installRowMajorFunctions=function(){for(var f in o3djs.math.rowMajor){o3djs.math[f]=o3djs.math.rowMajor[f];}};o3djs.math.installColumnMajorFunctions=function(){for(var f in o3djs.math.columnMajor){o3djs.math[f]=o3djs.math.columnMajor[f];}};o3djs.math.installErrorCheckFunctions=function(){for(var f in o3djs.math.errorCheck){o3djs.math[f]=o3djs.math.errorCheck[f];}};o3djs.math.installErrorCheckFreeFunctions=function(){for(var f in o3djs.math.errorCheckFree){o3djs.math[f]=o3djs.math.errorCheckFree[f];}}
o3djs.math.installRowMajorFunctions();o3djs.math.installErrorCheckFunctions();o3djs.provide('o3djs.pack');o3djs.require('o3djs.material');o3djs.require('o3djs.shape');o3djs.pack=o3djs.pack||{};o3djs.pack.preparePack=function(pack,viewInfo,opt_effectPack){o3djs.material.prepareMaterials(pack,viewInfo,opt_effectPack);o3djs.shape.prepareShapes(pack);};o3djs.provide('o3djs.particles');o3djs.require('o3djs.math');o3djs.particles=o3djs.particles||{};o3djs.particles.ParticleStateIds={BLEND:0,ADD:1,BLEND_PREMULTIPLY:2,BLEND_NO_ALPHA:3,SUBTRACT:4,INVERSE:5};o3djs.particles.FX_STRINGS=[{name:'particle3d',fxString:''+'float4x4 worldViewProjection : WORLDVIEWPROJECTION;\n'+'float4x4 world : WORLD;\n'+'float3 worldVelocity;\n'+'float3 worldAcceleration;\n'+'float timeRange;\n'+'float time;\n'+'float timeOffset;\n'+'float frameDuration;\n'+'float numFrames;\n'+'\n'+'// We need to implement 1D!\n'+'sampler rampSampler;\n'+'sampler colorSampler;\n'+'\n'+'struct VertexShaderInput {\n'+'  float4 uvLifeTimeFrameStart : POSITION; // uv, lifeTime, frameStart\n'+'  float4 positionStartTime : TEXCOORD0;    // position.xyz, startTime\n'+'  float4 velocityStartSize : TEXCOORD1;   // velocity.xyz, startSize\n'+'  float4 accelerationEndSize : TEXCOORD2; // acceleration.xyz, endSize\n'+'  float4 spinStartSpinSpeed : TEXCOORD3;  // spinStart.x, spinSpeed.y\n'+'  float4 orientation : TEXCOORD4;  // orientation\n'+'  float4 colorMult : COLOR; //\n'+'};\n'+'\n'+'struct PixelShaderInput {\n'+'  float4 position : POSITION;\n'+'  float2 texcoord : TEXCOORD0;\n'+'  float1 percentLife : TEXCOORD1;\n'+'  float4 colorMult: TEXCOORD2;\n'+'};\n'+'\n'+'PixelShaderInput vertexShaderFunction(VertexShaderInput input) {\n'+'  PixelShaderInput output;\n'+'\n'+'  float2 uv = input.uvLifeTimeFrameStart.xy;\n'+'  float lifeTime = input.uvLifeTimeFrameStart.z;\n'+'  float frameStart = input.uvLifeTimeFrameStart.w;\n'+'  float3 position = input.positionStartTime.xyz;\n'+'  float startTime = input.positionStartTime.w;\n'+'  float3 velocity = mul(float4(input.velocityStartSize.xyz, 0),\n'+'                        world).xyz + worldVelocity;\n'+'  float startSize = input.velocityStartSize.w;\n'+'  float3 acceleration = mul(float4(input.accelerationEndSize.xyz, 0),\n'+'                            world).xyz + worldAcceleration;\n'+'  float endSize = input.accelerationEndSize.w;\n'+'  float spinStart = input.spinStartSpinSpeed.x;\n'+'  float spinSpeed = input.spinStartSpinSpeed.y;\n'+'\n'+'  float localTime = fmod((time - timeOffset - startTime), timeRange);\n'+'  float percentLife = localTime / lifeTime;\n'+'\n'+'  float frame = fmod(floor(localTime / frameDuration + frameStart),\n'+'                     numFrames);\n'+'  float uOffset = frame / numFrames;\n'+'  float u = uOffset + (uv.x + 0.5) * (1 / numFrames);\n'+'\n'+'  output.texcoord = float2(u, uv.y + 0.5);\n'+'  output.colorMult = input.colorMult;\n'+'\n'+'  float size = lerp(startSize, endSize, percentLife);\n'+'  float s = sin(spinStart + spinSpeed * localTime);\n'+'  float c = cos(spinStart + spinSpeed * localTime);\n'+'\n'+'  float4 rotatedPoint = float4((uv.x * c + uv.y * s) * size, 0,\n'+'                               (uv.x * s - uv.y * c) * size, 1);\n'+'  float3 center = velocity * localTime +\n'+'                  acceleration * localTime * localTime + \n'+'                  position;\n'+'  \n'+'      float4 q2 = input.orientation + input.orientation;\n'+'      float4 qx = input.orientation.xxxw * q2.xyzx;\n'+'      float4 qy = input.orientation.xyyw * q2.xyzy;\n'+'      float4 qz = input.orientation.xxzw * q2.xxzz;\n'+'  \n'+'      float4x4 localMatrix = float4x4(\n'+'        (1.0f - qy.y) - qz.z, \n'+'        qx.y + qz.w, \n'+'        qx.z - qy.w,\n'+'        0,\n'+'  \n'+'        qx.y - qz.w, \n'+'        (1.0f - qx.x) - qz.z, \n'+'        qy.z + qx.w,\n'+'        0,\n'+'  \n'+'        qx.z + qy.w, \n'+'        qy.z - qx.w, \n'+'        (1.0f - qx.x) - qy.y,\n'+'        0,\n'+'  \n'+'        center.x, center.y, center.z, 1);\n'+'  rotatedPoint = mul(rotatedPoint, localMatrix);\n'+'  output.position = mul(rotatedPoint, worldViewProjection);\n'+'  output.percentLife = percentLife;\n'+'  return output;\n'+'}\n'+'\n'+'float4 pixelShaderFunction(PixelShaderInput input): COLOR {\n'+'  float4 colorMult = tex2D(rampSampler, \n'+'                           float2(input.percentLife, 0.5)) *\n'+'                     input.colorMult;\n'+'  float4 color = tex2D(colorSampler, input.texcoord) * colorMult;\n'+'  return color;\n'+'}\n'+'\n'+'// #o3d VertexShaderEntryPoint vertexShaderFunction\n'+'// #o3d PixelShaderEntryPoint pixelShaderFunction\n'+'// #o3d MatrixLoadOrder RowMajor\n'},{name:'particle2d',fxString:''+'float4x4 viewProjection : VIEWPROJECTION;\n'+'float4x4 world : WORLD;\n'+'float4x4 viewInverse : VIEWINVERSE;\n'+'float3 worldVelocity;\n'+'float3 worldAcceleration;\n'+'float timeRange;\n'+'float time;\n'+'float timeOffset;\n'+'float frameDuration;\n'+'float numFrames;\n'+'\n'+'// We need to implement 1D!\n'+'sampler rampSampler;\n'+'sampler colorSampler;\n'+'\n'+'struct VertexShaderInput {\n'+'  float4 uvLifeTimeFrameStart : POSITION; // uv, lifeTime, frameStart\n'+'  float4 positionStartTime : TEXCOORD0;    // position.xyz, startTime\n'+'  float4 velocityStartSize : TEXCOORD1;   // velocity.xyz, startSize\n'+'  float4 accelerationEndSize : TEXCOORD2; // acceleration.xyz, endSize\n'+'  float4 spinStartSpinSpeed : TEXCOORD3;  // spinStart.x, spinSpeed.y\n'+'  float4 colorMult : COLOR; //\n'+'};\n'+'\n'+'struct PixelShaderInput {\n'+'  float4 position : POSITION;\n'+'  float2 texcoord : TEXCOORD0;\n'+'  float1 percentLife : TEXCOORD1;\n'+'  float4 colorMult: TEXCOORD2;\n'+'};\n'+'\n'+'PixelShaderInput vertexShaderFunction(VertexShaderInput input) {\n'+'  PixelShaderInput output;\n'+'\n'+'  float2 uv = input.uvLifeTimeFrameStart.xy;\n'+'  float lifeTime = input.uvLifeTimeFrameStart.z;\n'+'  float frameStart = input.uvLifeTimeFrameStart.w;\n'+'  float3 position = input.positionStartTime.xyz;\n'+'  float startTime = input.positionStartTime.w;\n'+'  float3 velocity = mul(float4(input.velocityStartSize.xyz, 0),\n'+'                        world).xyz + worldVelocity;\n'+'  float startSize = input.velocityStartSize.w;\n'+'  float3 acceleration = mul(float4(input.accelerationEndSize.xyz, 0),\n'+'                            world).xyz + worldAcceleration;\n'+'  float endSize = input.accelerationEndSize.w;\n'+'  float spinStart = input.spinStartSpinSpeed.x;\n'+'  float spinSpeed = input.spinStartSpinSpeed.y;\n'+'\n'+'  float localTime = fmod((time - timeOffset - startTime), timeRange);\n'+'  float percentLife = localTime / lifeTime;\n'+'\n'+'  float frame = fmod(floor(localTime / frameDuration + frameStart),\n'+'                     numFrames);\n'+'  float uOffset = frame / numFrames;\n'+'  float u = uOffset + (uv.x + 0.5) * (1 / numFrames);\n'+'\n'+'  output.texcoord = float2(u, uv.y + 0.5);\n'+'  output.colorMult = input.colorMult;\n'+'\n'+'  float3 basisX = viewInverse[0].xyz;\n'+'  float3 basisZ = viewInverse[1].xyz;\n'+'\n'+'  float size = lerp(startSize, endSize, percentLife);\n'+'  float s = sin(spinStart + spinSpeed * localTime);\n'+'  float c = cos(spinStart + spinSpeed * localTime);\n'+'\n'+'  float2 rotatedPoint = float2(uv.x * c + uv.y * s, \n'+'                               -uv.x * s + uv.y * c);\n'+'  float3 localPosition = float3(basisX * rotatedPoint.x +\n'+'                                basisZ * rotatedPoint.y) * size +\n'+'                         velocity * localTime +\n'+'                         acceleration * localTime * localTime + \n'+'                         position;\n'+'\n'+'  output.position = mul(float4(localPosition + world[3].xyz, 1), \n'+'                        viewProjection);\n'+'  output.percentLife = percentLife;\n'+'  return output;\n'+'}\n'+'\n'+'float4 pixelShaderFunction(PixelShaderInput input): COLOR {\n'+'  float4 colorMult = tex2D(rampSampler, \n'+'                           float2(input.percentLife, 0.5)) *\n'+'                     input.colorMult;\n'+'  float4 color = tex2D(colorSampler, input.texcoord) * colorMult;\n'+'  return color;\n'+'}\n'+'\n'+'// #o3d VertexShaderEntryPoint vertexShaderFunction\n'+'// #o3d PixelShaderEntryPoint pixelShaderFunction\n'+'// #o3d MatrixLoadOrder RowMajor\n'}];o3djs.particles.createParticleSystem=function(pack,viewInfo,opt_clockParam,opt_randomFunction){return new o3djs.particles.ParticleSystem(pack,viewInfo,opt_clockParam,opt_randomFunction);};o3djs.particles.ParticleSystem=function(pack,viewInfo,opt_clockParam,opt_randomFunction){var o3d=o3djs.base.o3d;var particleStates=[];var effects=[];for(var ee=0;ee<o3djs.particles.FX_STRINGS.length;++ee){var info=o3djs.particles.FX_STRINGS[ee];var effect=pack.createObject('Effect');effect.name=info.name;effect.loadFromFXString(info.fxString);effects.push(effect);}
var stateInfos={};stateInfos[o3djs.particles.ParticleStateIds.BLEND]={'SourceBlendFunction':o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA,'DestinationBlendFunction':o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA};stateInfos[o3djs.particles.ParticleStateIds.ADD]={'SourceBlendFunction':o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA,'DestinationBlendFunction':o3djs.base.o3d.State.BLENDFUNC_ONE};stateInfos[o3djs.particles.ParticleStateIds.BLEND_PREMULTIPLY]={'SourceBlendFunction':o3djs.base.o3d.State.BLENDFUNC_ONE,'DestinationBlendFunction':o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA};stateInfos[o3djs.particles.ParticleStateIds.BLEND_NO_ALPHA]={'SourceBlendFunction':o3djs.base.o3d.State.BLENDFUNC_SOURCE_COLOR,'DestinationBlendFunction':o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_COLOR};stateInfos[o3djs.particles.ParticleStateIds.SUBTRACT]={'SourceBlendFunction':o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA,'DestinationBlendFunction':o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA,'BlendEquation':o3djs.base.o3d.State.BLEND_REVERSE_SUBTRACT};stateInfos[o3djs.particles.ParticleStateIds.INVERSE]={'SourceBlendFunction':o3djs.base.o3d.State.BLENDFUNC_INVERSE_DESTINATION_COLOR,'DestinationBlendFunction':o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_COLOR};for(var key in o3djs.particles.ParticleStateIds){var state=pack.createObject('State');var id=o3djs.particles.ParticleStateIds[key];particleStates[id]=state;state.getStateParam('ZWriteEnable').value=false;state.getStateParam('CullMode').value=o3d.State.CULL_NONE;var info=stateInfos[id];for(var stateName in info){state.getStateParam(stateName).value=info[stateName];}}
var colorTexture=pack.createTexture2D(8,8,o3d.Texture.ARGB8,1,false);var pixelBase=[0,0.20,0.70,1,0.70,0.20,0,0];var pixels=[];for(var yy=0;yy<8;++yy){for(var xx=0;xx<8;++xx){var pixel=pixelBase[xx]*pixelBase[yy];pixels.push(pixel,pixel,pixel,pixel);}}
colorTexture.set(0,pixels);var rampTexture=pack.createTexture2D(3,1,o3d.Texture.ARGB8,1,false);rampTexture.set(0,[1,1,1,1,1,1,1,0.5,1,1,1,0]);if(!opt_clockParam){this.counter_=pack.createObject('SecondCounter');opt_clockParam=this.counter_.getParam('count');}
this.randomFunction_=opt_randomFunction||function(){return Math.random();};this.particleStates=particleStates;this.clockParam=opt_clockParam;this.pack=pack;this.viewInfo=viewInfo;this.effects=effects;this.defaultColorTexture=colorTexture;this.defaultRampTexture=rampTexture;};o3djs.particles.ParticleSpec=function(){this.numParticles=1;this.numFrames=1;this.frameDuration=1;this.frameStart=0;this.frameStartRange=0;this.timeRange=99999999;this.startTime=null;this.lifeTime=1;this.lifeTimeRange=0;this.startSize=1;this.startSizeRange=0;this.endSize=1;this.endSizeRange=0;this.position=[0,0,0];this.positionRange=[0,0,0];this.velocity=[0,0,0];this.velocityRange=[0,0,0];this.acceleration=[0,0,0];this.accelerationRange=[0,0,0];this.spinStart=0;this.spinStartRange=0;this.spinSpeed=0;this.spinSpeedRange=0;this.colorMult=[1,1,1,1];this.colorMultRange=[0,0,0,0];this.worldVelocity=[0,0,0];this.worldAcceleration=[0,0,0];this.billboard=true;this.orientation=[0,0,0,1];};o3djs.particles.ParticleSystem.prototype.createParticleEmitter=function(opt_texture,opt_clockParam){return new o3djs.particles.ParticleEmitter(this,opt_texture,opt_clockParam);};o3djs.particles.ParticleEmitter=function(particleSystem,opt_texture,opt_clockParam){opt_clockParam=opt_clockParam||particleSystem.clockParam;var o3d=o3djs.base.o3d;var pack=particleSystem.pack;var viewInfo=particleSystem.viewInfo;var material=pack.createObject('Material');material.name='particles';material.drawList=viewInfo.zOrderedDrawList;material.effect=particleSystem.effects[1];particleSystem.effects[1].createUniformParameters(material);material.getParam('time').bind(opt_clockParam);var rampSampler=pack.createObject('Sampler');rampSampler.texture=particleSystem.defaultRampTexture;rampSampler.addressModeU=o3d.Sampler.CLAMP;var colorSampler=pack.createObject('Sampler');colorSampler.texture=opt_texture||particleSystem.defaultColorTexture;colorSampler.addressModeU=o3d.Sampler.CLAMP;colorSampler.addressModeV=o3d.Sampler.CLAMP;material.getParam('rampSampler').value=rampSampler;material.getParam('colorSampler').value=colorSampler;var vertexBuffer=pack.createObject('VertexBuffer');var uvLifeTimeFrameStartField=vertexBuffer.createField('FloatField',4);var positionStartTimeField=vertexBuffer.createField('FloatField',4);var velocityStartSizeField=vertexBuffer.createField('FloatField',4);var accelerationEndSizeField=vertexBuffer.createField('FloatField',4);var spinStartSpinSpeedField=vertexBuffer.createField('FloatField',4);var orientationField=vertexBuffer.createField('FloatField',4);var colorMultField=vertexBuffer.createField('FloatField',4);var indexBuffer=pack.createObject('IndexBuffer');var streamBank=pack.createObject('StreamBank');streamBank.setVertexStream(o3d.Stream.POSITION,0,uvLifeTimeFrameStartField,0);streamBank.setVertexStream(o3d.Stream.TEXCOORD,0,positionStartTimeField,0);streamBank.setVertexStream(o3d.Stream.TEXCOORD,1,velocityStartSizeField,0);streamBank.setVertexStream(o3d.Stream.TEXCOORD,2,accelerationEndSizeField,0);streamBank.setVertexStream(o3d.Stream.TEXCOORD,3,spinStartSpinSpeedField,0);streamBank.setVertexStream(o3d.Stream.TEXCOORD,4,orientationField,0);streamBank.setVertexStream(o3d.Stream.COLOR,0,colorMultField,0);var shape=pack.createObject('Shape');var primitive=pack.createObject('Primitive');primitive.material=material;primitive.owner=shape;primitive.streamBank=streamBank;primitive.indexBuffer=indexBuffer;primitive.primitiveType=o3d.Primitive.TRIANGLELIST;primitive.createDrawElement(pack,null);this.vertexBuffer_=vertexBuffer;this.uvLifeTimeFrameStartField_=uvLifeTimeFrameStartField;this.positionStartTimeField_=positionStartTimeField;this.velocityStartSizeField_=velocityStartSizeField;this.accelerationEndSizeField_=accelerationEndSizeField;this.spinStartSpinSpeedField_=spinStartSpinSpeedField;this.orientationField_=orientationField;this.colorMultField_=colorMultField;this.indexBuffer_=indexBuffer;this.streamBank_=streamBank;this.primitive_=primitive;this.rampSampler_=rampSampler;this.rampTexture_=particleSystem.defaultRampTexture;this.colorSampler_=colorSampler;this.particleSystem=particleSystem;this.shape=shape;this.material=material;this.clockParam=opt_clockParam;};o3djs.particles.ParticleEmitter.prototype.setState=function(stateId){this.material.state=this.particleSystem.particleStates[stateId];};o3djs.particles.ParticleEmitter.prototype.setColorRamp=function(colorRamp){var width=colorRamp.length/4;if(width%1!=0){throw'colorRamp must have multiple of 4 entries';}
if(this.rampTexture_==this.particleSystem.defaultRampTexture){this.rampTexture_=null;}
if(this.rampTexture_&&this.rampTexture_.width!=width){this.particleSystem.pack.removeObject(this.rampTexture_);this.rampTexture_=null;}
if(!this.rampTexture_){this.rampTexture_=this.particleSystem.pack.createTexture2D(width,1,o3djs.base.o3d.Texture.ARGB8,1,false);}
this.rampTexture_.set(0,colorRamp);this.rampSampler_.texture=this.rampTexture_;};o3djs.particles.ParticleEmitter.prototype.setParameters=function(parameters,opt_perParticleParamSetter){var defaults=new o3djs.particles.ParticleSpec();for(var key in parameters){if(typeof defaults[key]==='undefined'){throw'unknown particle parameter "'+key+'"';}
defaults[key]=parameters[key];}
var numParticles=defaults.numParticles;var uvLifeTimeFrameStart=[];var positionStartTime=[];var velocityStartSize=[];var accelerationEndSize=[];var spinStartSpinSpeed=[];var orientation=[];var colorMults=[];this.material.effect=this.particleSystem.effects[defaults.billboard?1:0];this.material.getParam('timeRange').value=defaults.timeRange;this.material.getParam('numFrames').value=defaults.numFrames;this.material.getParam('frameDuration').value=defaults.frameDuration;this.material.getParam('worldVelocity').value=defaults.worldVelocity;this.material.getParam('worldAcceleration').value=defaults.worldAcceleration;var corners=[[-0.5,-0.5],[+0.5,-0.5],[+0.5,+0.5],[-0.5,+0.5]];var random=this.particleSystem.randomFunction_;var plusMinus=function(range){return(random()-0.5)*range*2;};var plusMinusVector=function(range){var v=[];for(var ii=0;ii<range.length;++ii){v.push(plusMinus(range[ii]));}
return v;};for(var ii=0;ii<numParticles;++ii){if(opt_perParticleParamSetter){opt_perParticleParamSetter(ii,defaults);}
var pLifeTime=defaults.lifeTime;var pStartTime=(defaults.startTime===null)?(ii*defaults.lifeTime/numParticles):defaults.startTime;var pFrameStart=defaults.frameStart+plusMinus(defaults.frameStartRange);var pPosition=o3djs.math.addVector(defaults.position,plusMinusVector(defaults.positionRange));var pVelocity=o3djs.math.addVector(defaults.velocity,plusMinusVector(defaults.velocityRange));var pAcceleration=o3djs.math.addVector(defaults.acceleration,plusMinusVector(defaults.accelerationRange));var pColorMult=o3djs.math.addVector(defaults.colorMult,plusMinusVector(defaults.colorMultRange));var pSpinStart=defaults.spinStart+plusMinus(defaults.spinStartRange);var pSpinSpeed=defaults.spinSpeed+plusMinus(defaults.spinSpeedRange);var pStartSize=defaults.startSize+plusMinus(defaults.startSizeRange);var pEndSize=defaults.endSize+plusMinus(defaults.endSizeRange);var pOrientation=defaults.orientation;for(var jj=0;jj<4;++jj){uvLifeTimeFrameStart.push(corners[jj][0],corners[jj][1],pLifeTime,pFrameStart);positionStartTime.push(pPosition[0],pPosition[1],pPosition[2],pStartTime);velocityStartSize.push(pVelocity[0],pVelocity[1],pVelocity[2],pStartSize);accelerationEndSize.push(pAcceleration[0],pAcceleration[1],pAcceleration[2],pEndSize);spinStartSpinSpeed.push(pSpinStart,pSpinSpeed,0,0);orientation.push(pOrientation[0],pOrientation[1],pOrientation[2],pOrientation[3]);colorMults.push(pColorMult[0],pColorMult[1],pColorMult[2],pColorMult[3]);}}
if(this.vertexBuffer_.numElements!=numParticles*4){this.vertexBuffer_.allocateElements(numParticles*4);var indices=[];for(var ii=0;ii<numParticles;++ii){var startIndex=ii*4
indices.push(startIndex+0,startIndex+1,startIndex+2);indices.push(startIndex+0,startIndex+2,startIndex+3);}
this.indexBuffer_.set(indices);}
this.uvLifeTimeFrameStartField_.setAt(0,uvLifeTimeFrameStart);this.positionStartTimeField_.setAt(0,positionStartTime);this.velocityStartSizeField_.setAt(0,velocityStartSize);this.accelerationEndSizeField_.setAt(0,accelerationEndSize);this.spinStartSpinSpeedField_.setAt(0,spinStartSpinSpeed);this.orientationField_.setAt(0,orientation);this.colorMultField_.setAt(0,colorMults);this.primitive_.numberPrimitives=numParticles*2;this.primitive_.numberVertices=numParticles*4;};o3djs.particles.ParticleEmitter.prototype.createOneShot=function(opt_parent){return new o3djs.particles.OneShot(this,opt_parent);};o3djs.particles.OneShot=function(emitter,opt_parent){var pack=emitter.particleSystem.pack;this.emitter_=emitter;this.transform=pack.createObject('Transform');this.transform.visible=false;this.transform.addShape(emitter.shape);this.timeOffsetParam_=this.transform.createParam('timeOffset','ParamFloat');if(opt_parent){this.setParent(opt_parent);}};o3djs.particles.OneShot.prototype.setParent=function(parent){this.transform.parent=parent;};o3djs.particles.OneShot.prototype.trigger=function(opt_position,opt_parent){if(opt_parent){this.setParent(opt_parent);}
if(opt_position){this.transform.identity();this.transform.translate(opt_position);}
this.transform.visible=true;this.timeOffsetParam_.value=this.emitter_.clockParam.value;};o3djs.provide('o3djs.picking');o3djs.require('o3djs.math');o3djs.require('o3djs.dump');o3djs.picking=o3djs.picking||{};o3djs.picking.Ray=goog.typedef;o3djs.picking.createPickInfo=function(shapeInfo,rayIntersectionInfo,worldIntersectionPosition){return new o3djs.picking.PickInfo(shapeInfo,rayIntersectionInfo,worldIntersectionPosition);};o3djs.picking.createShapeInfo=function(shape,parent){return new o3djs.picking.ShapeInfo(shape,parent);};o3djs.picking.createTransformInfo=function(transform,parent){return new o3djs.picking.TransformInfo(transform,parent);};o3djs.picking.clientPositionToWorldRayEx=function(clientXPosition,clientYPosition,view,projection,clientWidth,clientHeight){var inverseViewProjectionMatrix=o3djs.math.inverse(o3djs.math.matrix4.composition(projection,view));var normScreenX=clientXPosition/(clientWidth*0.5)-1;var normScreenY=-(clientYPosition/(clientHeight*0.5)-1);return{near:o3djs.math.matrix4.transformPoint(inverseViewProjectionMatrix,[normScreenX,normScreenY,0]),far:o3djs.math.matrix4.transformPoint(inverseViewProjectionMatrix,[normScreenX,normScreenY,1])};};o3djs.picking.clientPositionToWorldRay=function(clientXPosition,clientYPosition,drawContext,clientWidth,clientHeight){return o3djs.picking.clientPositionToWorldRayEx(clientXPosition,clientYPosition,drawContext.view,drawContext.projection,clientWidth,clientHeight);};o3djs.picking.dprint=function(msg){};o3djs.picking.dprintPoint3=function(label,float3,prefix){};o3djs.picking.dprintBoundingBox=function(label,boundingBox,opt_prefix){};o3djs.picking.dumpRayIntersectionInfo=function(label,rayIntersectionInfo){o3djs.picking.dprint(label+' : valid = '+
rayIntersectionInfo.valid+' : intersected = '+
rayIntersectionInfo.intersected);if(rayIntersectionInfo.intersected){o3djs.picking.dprint(' : pos: '+
rayIntersectionInfo.position[0]+', '+
rayIntersectionInfo.position[1]+', '+
rayIntersectionInfo.position[2]+', ');}
o3djs.picking.dprint('\n');};o3djs.picking.PickInfo=function(shapeInfo,rayIntersectionInfo,worldIntersectionPosition){this.shapeInfo=shapeInfo;this.rayIntersectionInfo=rayIntersectionInfo;this.worldIntersectionPosition=worldIntersectionPosition};o3djs.picking.ShapeInfo=function(shape,parent){this.shape=shape;this.parent=parent;this.boundingBox=null;this.update();};o3djs.picking.ShapeInfo.prototype.getBoundingBox=function(){return this.boundingBox;};o3djs.picking.ShapeInfo.prototype.update=function(){var elements=this.shape.elements;if(elements.length>0){this.boundingBox=elements[0].getBoundingBox(0);for(var ee=1;ee<elements.length;ee++){this.boundingBox=this.boundingBox.add(elements[ee].getBoundingBox(0));}}};o3djs.picking.ShapeInfo.prototype.pick=function(worldRay){var worldMatrix=this.parent.transform.getUpdatedWorldMatrix()
var inverseWorldMatrix=o3djs.math.inverse(worldMatrix);var relativeNear=o3djs.math.matrix4.transformPoint(inverseWorldMatrix,worldRay.near);var relativeFar=o3djs.math.matrix4.transformPoint(inverseWorldMatrix,worldRay.far);var rayIntersectionInfo=this.boundingBox.intersectRay(relativeNear,relativeFar);o3djs.picking.dumpRayIntersectionInfo('SHAPE(box): '+this.shape.name,rayIntersectionInfo);if(rayIntersectionInfo.intersected){var elements=this.shape.elements;for(var e=0;e<elements.length;e++){var element=elements[e];rayIntersectionInfo=element.intersectRay(0,o3djs.base.o3d.State.CULL_CCW,relativeNear,relativeFar);o3djs.picking.dumpRayIntersectionInfo('SHAPE(tris): '+this.shape.name+' : element '+element.name,rayIntersectionInfo);if(rayIntersectionInfo.intersected){var worldIntersectionPosition=o3djs.math.matrix4.transformPoint(worldMatrix,rayIntersectionInfo.position);return o3djs.picking.createPickInfo(this,rayIntersectionInfo,worldIntersectionPosition);}}}
return null;};o3djs.picking.ShapeInfo.prototype.dump=function(prefix){o3djs.picking.dprint(prefix+'SHAPE: '+this.shape.name+'\n');o3djs.picking.dprintPoint3('bb min',this.boundingBox.minExtent,prefix+'    ');o3djs.picking.dprintPoint3('bb max',this.boundingBox.maxExtent,prefix+'    ');};o3djs.picking.TransformInfo=function(transform,parent){this.childTransformInfos={};this.shapeInfos={};this.transform=transform;this.parent=parent;this.boundingBox=null;};o3djs.picking.TransformInfo.prototype.getBoundingBox=function(){return this.boundingBox;};o3djs.picking.TransformInfo.prototype.update=function(){var newChildTransformInfos={};var newShapeInfos={};var children=this.transform.children;for(var c=0;c<children.length;c++){var child=children[c];var pickable=child.getParam('pickable');if(pickable&&!pickable.value)
continue;var transformInfo=this.childTransformInfos[child.clientId];if(!transformInfo){transformInfo=o3djs.picking.createTransformInfo(child,this);}else{transformInfo.boundingBox=null;}
transformInfo.update();newChildTransformInfos[child.clientId]=transformInfo;}
var shapes=this.transform.shapes;for(var s=0;s<shapes.length;s++){var shape=shapes[s];var shapeInfo=this.shapeInfos[shape.clientId];if(!shapeInfo){shapeInfo=o3djs.picking.createShapeInfo(shape,this);}else{}
newShapeInfos[shape.clientId]=shapeInfo;}
this.childTransformInfos=newChildTransformInfos;this.shapeInfos=newShapeInfos;var boundingBox=null;for(var key in newShapeInfos){var shapeInfo=newShapeInfos[key];var box=shapeInfo.getBoundingBox().mul(this.transform.localMatrix);if(!boundingBox){boundingBox=box;}else if(box){boundingBox=boundingBox.add(box);}}
for(var key in newChildTransformInfos){var transformInfo=newChildTransformInfos[key];var box=transformInfo.getBoundingBox();if(box){if(!boundingBox){boundingBox=box.mul(this.transform.localMatrix);}else{boundingBox=boundingBox.add(box.mul(this.transform.localMatrix));}}}
this.boundingBox=boundingBox;};o3djs.picking.TransformInfo.prototype.pick=function(worldRay){if(this.boundingBox){var inverseWorldMatrix=o3djs.math.matrix4.identity();if(this.parent){inverseWorldMatrix=o3djs.math.inverse(this.parent.transform.getUpdatedWorldMatrix());}
var relativeNear=o3djs.math.matrix4.transformPoint(inverseWorldMatrix,worldRay.near);var relativeFar=o3djs.math.matrix4.transformPoint(inverseWorldMatrix,worldRay.far);var rayIntersectionInfo=this.boundingBox.intersectRay(relativeNear,relativeFar);o3djs.picking.dumpRayIntersectionInfo('TRANSFORM(box): '+this.transform.name,rayIntersectionInfo);if(rayIntersectionInfo.intersected){var closestPickInfo=null;var minDistance=-1;for(var key in this.childTransformInfos){var transformInfo=this.childTransformInfos[key];var pickInfo=transformInfo.pick(worldRay);if(pickInfo){var distance=o3djs.math.lengthSquared(o3djs.math.subVector(worldRay.near,pickInfo.worldIntersectionPosition));if(!closestPickInfo||distance<minDistance){minDistance=distance;closestPickInfo=pickInfo;}}}
for(var key in this.shapeInfos){var shapeInfo=this.shapeInfos[key];var pickInfo=shapeInfo.pick(worldRay);if(pickInfo){var distance=o3djs.math.lengthSquared(o3djs.math.subVector(worldRay.near,pickInfo.worldIntersectionPosition));if(!closestPickInfo||distance<minDistance){minDistance=distance;closestPickInfo=pickInfo;}}}
return closestPickInfo;}}
return null;};o3djs.picking.TransformInfo.prototype.dump=function(prefix){prefix=prefix||'';o3djs.picking.dprint(prefix+'TRANSFORM: '+this.transform.name+'\n');if(this.boundingBox){o3djs.picking.dprintPoint3('bb min',this.boundingBox.minExtent,prefix+'    ');o3djs.picking.dprintPoint3('bb max',this.boundingBox.maxExtent,prefix+'    ');}else{o3djs.picking.dprint(prefix+'    bb *NA*\n');}
o3djs.picking.dprint(prefix+'--Shapes--\n');for(var key in this.shapeInfos){var shapeInfo=this.shapeInfos[key];shapeInfo.dump(prefix+'    ');}
o3djs.picking.dprint(prefix+'--Children--\n');for(var key in this.childTransformInfos){var transformInfo=this.childTransformInfos[key];transformInfo.dump(prefix+'    ');}};o3djs.provide('o3djs.primitives');o3djs.require('o3djs.math');o3djs.primitives=o3djs.primitives||{};o3djs.primitives.setCullingInfo=function(primitive){var box=primitive.getBoundingBox(0);primitive.boundingBox=box;var minExtent=box.minExtent;var maxExtent=box.maxExtent;primitive.zSortPoint=o3djs.math.divVectorScalar(o3djs.math.addVector(minExtent,maxExtent),2);};o3djs.primitives.VertexStreamInfo=function(numComponents,semantic,opt_semanticIndex){this.numComponents=numComponents;this.semantic=semantic;this.semanticIndex=opt_semanticIndex||0;this.elements=[];this.addElement=function(value1,opt_value2,opt_value3,opt_value4){};this.setElement=function(index,value1,opt_value2,opt_value3,opt_value4){};this.addElementVector=function(vector){};this.setElementVector=function(index,vector){};this.getElementVector=function(index){return[];};switch(numComponents){case 1:this.addElement=function(value){this.elements.push(value);}
this.getElement=function(index){return this.elements[index];}
this.setElement=function(index,value){this.elements[index]=value;}
break;case 2:this.addElement=function(value0,value1){this.elements.push(value0,value1);}
this.addElementVector=function(vector){this.elements.push(vector[0],vector[1]);}
this.getElementVector=function(index){return this.elements.slice(index*numComponents,(index+1)*numComponents);}
this.setElement=function(index,value0,value1){this.elements[index*numComponents+0]=value0;this.elements[index*numComponents+1]=value1;}
this.setElementVector=function(index,vector){this.elements[index*numComponents+0]=vector[0];this.elements[index*numComponents+1]=vector[1];}
break;case 3:this.addElement=function(value0,value1,value2){this.elements.push(value0,value1,value2);}
this.addElementVector=function(vector){this.elements.push(vector[0],vector[1],vector[2]);}
this.getElementVector=function(index){return this.elements.slice(index*numComponents,(index+1)*numComponents);}
this.setElement=function(index,value0,value1,value2){this.elements[index*numComponents+0]=value0;this.elements[index*numComponents+1]=value1;this.elements[index*numComponents+2]=value2;}
this.setElementVector=function(index,vector){this.elements[index*numComponents+0]=vector[0];this.elements[index*numComponents+1]=vector[1];this.elements[index*numComponents+2]=vector[2];}
break;case 4:this.addElement=function(value0,value1,value2,value3){this.elements.push(value0,value1,value2,value3);}
this.addElementVector=function(vector){this.elements.push(vector[0],vector[1],vector[2],vector[3]);}
this.getElementVector=function(index){return this.elements.slice(index*numComponents,(index+1)*numComponents);}
this.setElement=function(index,value0,value1,value2,value3){this.elements[index*numComponents+0]=value0;this.elements[index*numComponents+1]=value1;this.elements[index*numComponents+2]=value2;this.elements[index*numComponents+3]=value3;}
this.setElementVector=function(index,vector){this.elements[index*numComponents+0]=vector[0];this.elements[index*numComponents+1]=vector[1];this.elements[index*numComponents+2]=vector[2];this.elements[index*numComponents+3]=vector[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(numComponents,semantic,opt_semanticIndex){return new o3djs.primitives.VertexStreamInfo(numComponents,semantic,opt_semanticIndex);};o3djs.primitives.VertexInfo=function(){this.streams=[];this.indices=[];};o3djs.primitives.VertexInfo.prototype.addStream=function(numComponents,semantic,opt_semanticIndex){this.removeStream(semantic,opt_semanticIndex);var stream=o3djs.primitives.createVertexStreamInfo(numComponents,semantic,opt_semanticIndex);this.streams.push(stream);return stream;};o3djs.primitives.VertexInfo.prototype.findStream=function(semantic,opt_semanticIndex){opt_semanticIndex=opt_semanticIndex||0;for(var i=0;i<this.streams.length;++i){if(this.streams[i].semantic===semantic&&this.streams[i].semanticIndex==opt_semanticIndex){return this.streams[i];}}
return null;};o3djs.primitives.VertexInfo.prototype.removeStream=function(semantic,opt_semanticIndex){opt_semanticIndex=opt_semanticIndex||0;for(var i=0;i<this.streams.length;++i){if(this.streams[i].semantic===semantic&&this.streams[i].semanticIndex==opt_semanticIndex){this.streams.splice(i,1);return;}}};o3djs.primitives.VertexInfo.prototype.numTriangles=function(){return this.indices.length/3;};o3djs.primitives.VertexInfo.prototype.addTriangle=function(index1,index2,index3){this.indices.push(index1,index2,index3);};o3djs.primitives.VertexInfo.prototype.getTriangle=function(triangleIndex){var indexIndex=triangleIndex*3;return[this.indices[indexIndex+0],this.indices[indexIndex+1],this.indices[indexIndex+2]];};o3djs.primitives.VertexInfo.prototype.setTriangle=function(triangleIndex,index1,index2,index3){var indexIndex=triangleIndex*3;this.indices[indexIndex+0]=index1;this.indices[indexIndex+1]=index2;this.indices[indexIndex+2]=index3;};o3djs.primitives.VertexInfo.prototype.validate=function(){var positionStream=this.findStream(o3djs.base.o3d.Stream.POSITION);if(!positionStream)
throw'POSITION stream is missing';var numElements=positionStream.numElements();for(var s=0;s<this.streams.length;++s){if(this.streams[s].numElements()!==numElements){throw'Stream '+s+' contains '+this.streams[s].numElements()+' elements whereas the POSITION stream contains '+numElements;}}
for(var i=0;i<this.indices.length;++i){if(this.indices[i]<0||this.indices[i]>=numElements){throw'The index '+this.indices[i]+' is out of range [0, '+
numElements+']';}}};o3djs.primitives.VertexInfo.prototype.createShape=function(pack,material){this.validate();var positionStream=this.findStream(o3djs.base.o3d.Stream.POSITION);var numVertices=positionStream.numElements();var shape=pack.createObject('Shape');var primitive=pack.createObject('Primitive');var streamBank=pack.createObject('StreamBank');primitive.owner=shape;primitive.streamBank=streamBank;primitive.material=material;primitive.numberPrimitives=this.indices.length/3;primitive.primitiveType=o3djs.base.o3d.Primitive.TRIANGLELIST;primitive.numberVertices=numVertices;primitive.createDrawElement(pack,null);var streamInfos=material.effect.getStreamInfo();for(var s=0;s<streamInfos.length;++s){var semantic=streamInfos[s].semantic;var semanticIndex=streamInfos[s].semanticIndex;var requiredStream=this.findStream(semantic,semanticIndex);if(!requiredStream){switch(semantic){case o3djs.base.o3d.Stream.TANGENT:case o3djs.base.o3d.Stream.BINORMAL:this.addTangentStreams(semanticIndex);break;case o3djs.base.o3d.Stream.COLOR:requiredStream=this.addStream(4,semantic,semanticIndex);for(var i=0;i<numVertices;++i){requiredStream.addElement(1,1,1,1);}
break;default:throw'Missing stream for semantic '+semantic+' with semantic index '+semanticIndex;}}}
var vertexBuffer=pack.createObject('VertexBuffer');var fields=[];for(var s=0;s<this.streams.length;++s){var stream=this.streams[s];var fieldType=(stream.semantic==o3djs.base.o3d.Stream.COLOR&&stream.numComponents==4)?'UByteNField':'FloatField';fields[s]=vertexBuffer.createField(fieldType,stream.numComponents);streamBank.setVertexStream(stream.semantic,stream.semanticIndex,fields[s],0);}
vertexBuffer.allocateElements(numVertices);for(var s=0;s<this.streams.length;++s){fields[s].setAt(0,this.streams[s].elements);}
var indexBuffer=pack.createObject('IndexBuffer');indexBuffer.set(this.indices);primitive.indexBuffer=indexBuffer;o3djs.primitives.setCullingInfo(primitive);return shape;};o3djs.primitives.VertexInfo.prototype.reorient=function(matrix){var math=o3djs.math;var matrixInverse=math.inverse(math.matrix4.getUpper3x3(matrix));for(var s=0;s<this.streams.length;++s){var stream=this.streams[s];if(stream.numComponents==3){var numElements=stream.numElements();switch(stream.semantic){case o3djs.base.o3d.Stream.POSITION:for(var i=0;i<numElements;++i){stream.setElementVector(i,math.matrix4.transformPoint(matrix,stream.getElementVector(i)));}
break;case o3djs.base.o3d.Stream.NORMAL:for(var i=0;i<numElements;++i){stream.setElementVector(i,math.matrix4.transformNormal(matrix,stream.getElementVector(i)));}
break;case o3djs.base.o3d.Stream.TANGENT:case o3djs.base.o3d.Stream.BINORMAL:for(var i=0;i<numElements;++i){stream.setElementVector(i,math.matrix4.transformDirection(matrix,stream.getElementVector(i)));}
break;}}}};o3djs.primitives.VertexInfo.prototype.addTangentStreams=function(opt_semanticIndex){opt_semanticIndex=opt_semanticIndex||0;var math=o3djs.math;this.validate();var positionStream=this.findStream(o3djs.base.o3d.Stream.POSITION);if(!positionStream)
throw'Cannot calculate tangent frame because POSITION stream is missing';if(positionStream.numComponents!=3)
throw'Cannot calculate tangent frame because POSITION stream is not 3D';var normalStream=this.findStream(o3djs.base.o3d.Stream.NORMAL);if(!normalStream)
throw'Cannot calculate tangent frame because NORMAL stream is missing';if(normalStream.numComponents!=3)
throw'Cannot calculate tangent frame because NORMAL stream is not 3D';var texCoordStream=this.findStream(o3djs.base.o3d.Stream.TEXCOORD,opt_semanticIndex);if(!texCoordStream)
throw'Cannot calculate tangent frame because TEXCOORD stream '+
opt_semanticIndex+' is missing';var tangentFrames={};function roundVector(v){return[Math.round(v[0]),Math.round(v[1]),Math.round(v[2])];}
function tangentFrameKey(position,normal){return roundVector(math.mulVectorScalar(position,100))+','+
roundVector(math.mulVectorScalar(normal,100));}
function addTangentFrame(position,normal,tangent,binormal){var key=tangentFrameKey(position,normal);var frame=tangentFrames[key];if(!frame){frame=[[0,0,0],[0,0,0]];}
frame=math.addMatrix(frame,[tangent,binormal]);tangentFrames[key]=frame;}
function getTangentFrame(position,normal){var key=tangentFrameKey(position,normal);return tangentFrames[key];}
var numTriangles=this.numTriangles();for(var triangleIndex=0;triangleIndex<numTriangles;++triangleIndex){var vertexIndices=this.getTriangle(triangleIndex);var uvs=[];var positions=[];var normals=[];for(var i=0;i<3;++i){var vertexIndex=vertexIndices[i];uvs[i]=texCoordStream.getElementVector(vertexIndex);positions[i]=positionStream.getElementVector(vertexIndex);normals[i]=normalStream.getElementVector(vertexIndex);}
var tangent=[0,0,0];var binormal=[0,0,0];for(var axis=0;axis<3;++axis){var edge1=[positions[1][axis]-positions[0][axis],uvs[1][0]-uvs[0][0],uvs[1][1]-uvs[0][1]];var edge2=[positions[2][axis]-positions[0][axis],uvs[2][0]-uvs[0][0],uvs[2][1]-uvs[0][1]];var edgeCross=math.normalize(math.cross(edge1,edge2));if(edgeCross[0]==0){edgeCross[0]=1;}
tangent[axis]=-edgeCross[1]/edgeCross[0];binormal[axis]=-edgeCross[2]/edgeCross[0];}
var tangentLength=math.length(tangent);if(tangentLength>0.001){tangent=math.mulVectorScalar(tangent,1/tangentLength);}
var binormalLength=math.length(binormal);if(binormalLength>0.001){binormal=math.mulVectorScalar(binormal,1/binormalLength);}
for(var i=0;i<3;++i){addTangentFrame(positions[i],normals[i],tangent,binormal);}}
var tangentStream=this.addStream(3,o3djs.base.o3d.Stream.TANGENT,opt_semanticIndex);var binormalStream=this.addStream(3,o3djs.base.o3d.Stream.BINORMAL,opt_semanticIndex);var numVertices=positionStream.numElements();for(var vertexIndex=0;vertexIndex<numVertices;++vertexIndex){var position=positionStream.getElementVector(vertexIndex);var normal=normalStream.getElementVector(vertexIndex);var frame=getTangentFrame(position,normal);var tangent=frame[0];tangent=math.subVector(tangent,math.mulVectorScalar(normal,math.dot(normal,tangent)));var tangentLength=math.length(tangent);if(tangentLength>0.001){tangent=math.mulVectorScalar(tangent,1/tangentLength);}
var binormal=frame[1];binormal=math.subVector(binormal,math.mulVectorScalar(tangent,math.dot(tangent,binormal)));binormal=math.subVector(binormal,math.mulVectorScalar(normal,math.dot(normal,binormal)));var binormalLength=math.length(binormal);if(binormalLength>0.001){binormal=math.mulVectorScalar(binormal,1/binormalLength);}
tangentStream.setElementVector(vertexIndex,tangent);binormalStream.setElementVector(vertexIndex,binormal);}};o3djs.primitives.createVertexInfo=function(){return new o3djs.primitives.VertexInfo();};o3djs.primitives.createSphereVertices=function(radius,subdivisionsAxis,subdivisionsHeight,opt_matrix){if(subdivisionsAxis<=0||subdivisionsHeight<=0){throw Error('subdivisionAxis and subdivisionHeight must be > 0');}
var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);for(var y=0;y<=subdivisionsHeight;y++){for(var x=0;x<=subdivisionsAxis;x++){var u=x/subdivisionsAxis;var v=y/subdivisionsHeight;var theta=2*Math.PI*u;var phi=Math.PI*v;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);var sinPhi=Math.sin(phi);var cosPhi=Math.cos(phi);var ux=cosTheta*sinPhi;var uy=cosPhi;var uz=sinTheta*sinPhi;positionStream.addElement(radius*ux,radius*uy,radius*uz);normalStream.addElement(ux,uy,uz);texCoordStream.addElement(1-u,1-v);}}
var numVertsAround=subdivisionsAxis+1;for(var x=0;x<subdivisionsAxis;x++){for(var y=0;y<subdivisionsHeight;y++){vertexInfo.addTriangle((y+0)*numVertsAround+x,(y+0)*numVertsAround+x+1,(y+1)*numVertsAround+x);vertexInfo.addTriangle((y+1)*numVertsAround+x,(y+0)*numVertsAround+x+1,(y+1)*numVertsAround+x+1);}}
if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createSphere=function(pack,material,radius,subdivisionsAxis,subdivisionsHeight,opt_matrix){var vertexInfo=o3djs.primitives.createSphereVertices(radius,subdivisionsAxis,subdivisionsHeight,opt_matrix);return vertexInfo.createShape(pack,material);};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(size,opt_matrix){var k=size/2;var cornerVertices=[[-k,-k,-k],[+k,-k,-k],[-k,+k,-k],[+k,+k,-k],[-k,-k,+k],[+k,-k,+k],[-k,+k,+k],[+k,+k,+k]];var faceNormals=[[+1,+0,+0],[-1,+0,+0],[+0,+1,+0],[+0,-1,+0],[+0,+0,+1],[+0,+0,-1]];var uvCoords=[[0,0],[1,0],[1,1],[0,1]];var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);for(var f=0;f<6;++f){var faceIndices=o3djs.primitives.CUBE_FACE_INDICES_[f];for(var v=0;v<4;++v){var position=cornerVertices[faceIndices[v]];var normal=faceNormals[f];var uv=uvCoords[v];positionStream.addElementVector(position);normalStream.addElementVector(normal);texCoordStream.addElementVector(uv);var offset=4*f;vertexInfo.addTriangle(offset+0,offset+1,offset+2);vertexInfo.addTriangle(offset+0,offset+2,offset+3);}}
if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createCube=function(pack,material,size,opt_matrix){var vertexInfo=o3djs.primitives.createCubeVertices(size,opt_matrix);return vertexInfo.createShape(pack,material);};o3djs.primitives.createBox=function(pack,material,width,height,depth,opt_matrix){var vertexInfo=o3djs.primitives.createCubeVertices(1);vertexInfo.reorient([[width,0,0,0],[0,height,0,0],[0,0,depth,0],[0,0,0,1]]);if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo.createShape(pack,material);};o3djs.primitives.createRainbowCube=function(pack,material,size,opt_matrix){var vertexInfo=o3djs.primitives.createCubeVertices(size,opt_matrix);var colorStream=vertexInfo.addStream(4,o3djs.base.o3d.Stream.COLOR);var colors=[[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,.5,.3,1],[.3,0,.5,1]];var vertices=vertexInfo.vertices;for(var f=0;f<6;++f){var faceIndices=o3djs.primitives.CUBE_FACE_INDICES_[f];for(var v=0;v<4;++v){var color=colors[faceIndices[v]];colorStream.addElementVector(color);}}
return vertexInfo.createShape(pack,material);};o3djs.primitives.createDiscVertices=function(radius,divisions,opt_stacks,opt_startStack,opt_stackPower,opt_matrix){if(divisions<3){throw Error('divisions must be at least 3');}
var stacks=opt_stacks?opt_stacks:1;var startStack=opt_startStack?opt_startStack:0;var stackPower=opt_stackPower?opt_stackPower:1;var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var firstIndex=0;if(startStack==0){positionStream.addElement(0,0,0);normalStream.addElement(0,1,0);texCoordStream.addElement(0,0);firstIndex++;}
for(var currentStack=Math.max(startStack,1);currentStack<=stacks;++currentStack){var stackRadius=radius*Math.pow(currentStack/stacks,stackPower);for(var i=0;i<divisions;++i){var theta=2.0*Math.PI*i/divisions;var x=stackRadius*Math.cos(theta);var z=stackRadius*Math.sin(theta);positionStream.addElement(x,0,z);normalStream.addElement(0,1,0);texCoordStream.addElement(x,z);if(currentStack>startStack){var a=firstIndex+(i+1)%divisions;var b=firstIndex+i;if(currentStack>1){var c=firstIndex+i-divisions;var d=firstIndex+(i+1)%divisions-divisions;vertexInfo.addTriangle(a,b,c);vertexInfo.addTriangle(a,c,d);}else{vertexInfo.addTriangle(0,a,b);}}}
firstIndex+=divisions;}
if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createDisc=function(pack,material,radius,divisions,stacks,startStack,stackPower,opt_matrix){var vertexInfo=o3djs.primitives.createDiscVertices(radius,divisions,stacks,startStack,stackPower,opt_matrix);return vertexInfo.createShape(pack,material);};o3djs.primitives.createCylinderVertices=function(radius,height,radialSubdivisions,verticalSubdivisions,opt_matrix){if(radialSubdivisions<1){throw Error('radialSubdivisions must be 1 or greater');}
if(verticalSubdivisions<1){throw Error('verticalSubdivisions must be 1 or greater');}
var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var indices=[];var vertices=[];var vertsAroundEdge=radialSubdivisions+1;for(var yy=-2;yy<=verticalSubdivisions+2;++yy){var ringRadius=radius;var v=yy/verticalSubdivisions
var y=height*v;if(yy<0){y=0;v=1;}else if(yy>verticalSubdivisions){y=height;v=1;}
if(yy==-2||yy==verticalSubdivisions+2){ringRadius=0;v=0;}
y-=height/2;for(var ii=0;ii<vertsAroundEdge;++ii){var sin=Math.sin(ii*Math.PI*2/radialSubdivisions);var cos=Math.cos(ii*Math.PI*2/radialSubdivisions);positionStream.addElement(sin*ringRadius,y,cos*ringRadius);normalStream.addElement((yy<0||yy>verticalSubdivisions)?0:sin,(yy<0)?-1:(yy>verticalSubdivisions?1:0),(yy<0||yy>verticalSubdivisions)?0:cos);texCoordStream.addElement(ii/radialSubdivisions,v);}}
var trisAround=radialSubdivisions*2;for(var yy=0;yy<verticalSubdivisions+4;++yy){for(var ii=0;ii<radialSubdivisions;++ii){vertexInfo.addTriangle(vertsAroundEdge*(yy+0)+0+ii,vertsAroundEdge*(yy+0)+1+ii,vertsAroundEdge*(yy+1)+1+ii);vertexInfo.addTriangle(vertsAroundEdge*(yy+0)+0+ii,vertsAroundEdge*(yy+1)+1+ii,vertsAroundEdge*(yy+1)+0+ii);}}
if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createCylinder=function(pack,material,radius,depth,radialSubdivisions,verticalSubdivisions,opt_matrix){var vertexInfo=o3djs.primitives.createCylinderVertices(radius,depth,radialSubdivisions,verticalSubdivisions,opt_matrix);return vertexInfo.createShape(pack,material);};o3djs.primitives.createWedgeVertices=function(inPoints,depth,opt_matrix){var math=o3djs.math;var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var z1=-depth*0.5;var z2=depth*0.5;var face=[];var indices=[];var points=[[inPoints[0][0],inPoints[0][1]],[inPoints[1][0],inPoints[1][1]],[inPoints[2][0],inPoints[2][1]]];face[0]=math.cross(math.normalize([points[1][0]-points[0][0],points[1][1]-points[0][1],z1-z1]),math.normalize([points[1][0]-points[1][0],points[1][1]-points[1][1],z2-z1]));face[1]=math.cross(math.normalize([points[2][0]-points[1][0],points[2][1]-points[1][1],z1-z1]),math.normalize([points[2][0]-points[2][0],points[2][1]-points[2][1],z2-z1]));face[2]=math.cross([points[0][0]-points[2][0],points[0][1]-points[2][1],z1-z1],[points[0][0]-points[0][0],points[0][1]-points[0][1],z2-z1]);positionStream.addElement(points[0][0],points[0][1],z1);normalStream.addElement(0,0,-1);texCoordStream.addElement(0,1);positionStream.addElement(points[1][0],points[1][1],z1);normalStream.addElement(0,0,-1);texCoordStream.addElement(1,0);positionStream.addElement(points[2][0],points[2][1],z1);normalStream.addElement(0,0,-1);texCoordStream.addElement(0,0);positionStream.addElement(points[0][0],points[0][1],z2);normalStream.addElement(0,0,1);texCoordStream.addElement(0,1);positionStream.addElement(points[1][0],points[1][1],z2);normalStream.addElement(0,0,1);texCoordStream.addElement(1,0);positionStream.addElement(points[2][0],points[2][1],z2);normalStream.addElement(0,0,1);texCoordStream.addElement(0,0);positionStream.addElement(points[0][0],points[0][1],z1);normalStream.addElement(face[0][0],face[0][1],face[0][2]);texCoordStream.addElement(0,1);positionStream.addElement(points[1][0],points[1][1],z1);normalStream.addElement(face[0][0],face[0][1],face[0][2]);texCoordStream.addElement(0,0);positionStream.addElement(points[1][0],points[1][1],z2);normalStream.addElement(face[0][0],face[0][1],face[0][2]);texCoordStream.addElement(1,0);positionStream.addElement(points[0][0],points[0][1],z2);normalStream.addElement(face[0][0],face[0][1],face[0][2]);texCoordStream.addElement(1,1);positionStream.addElement(points[1][0],points[1][1],z1);normalStream.addElement(face[1][0],face[1][1],face[1][2]);texCoordStream.addElement(0,1);positionStream.addElement(points[2][0],points[2][1],z1);normalStream.addElement(face[1][0],face[1][1],face[1][2]);texCoordStream.addElement(0,0);positionStream.addElement(points[2][0],points[2][1],z2);normalStream.addElement(face[1][0],face[1][1],face[1][2]);texCoordStream.addElement(1,0);positionStream.addElement(points[1][0],points[1][1],z2);normalStream.addElement(face[1][0],face[1][1],face[1][2]);texCoordStream.addElement(1,1);positionStream.addElement(points[2][0],points[2][1],z1);normalStream.addElement(face[2][0],face[2][1],face[2][2]);texCoordStream.addElement(0,1);positionStream.addElement(points[0][0],points[0][1],z1);normalStream.addElement(face[2][0],face[2][1],face[2][2]);texCoordStream.addElement(0,0);positionStream.addElement(points[0][0],points[0][1],z2);normalStream.addElement(face[2][0],face[2][1],face[2][2]);texCoordStream.addElement(1,0);positionStream.addElement(points[2][0],points[2][1],z2);normalStream.addElement(face[2][0],face[2][1],face[2][2]);texCoordStream.addElement(1,1);var indices=[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(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createWedge=function(pack,material,points,depth,opt_matrix){var vertexInfo=o3djs.primitives.createWedgeVertices(points,depth,opt_matrix);return vertexInfo.createShape(pack,material);};o3djs.primitives.createPrismVertices=function(points,depth,opt_matrix){if(points.length<3){throw Error('there must be 3 or more points');}
var backZ=-0.5*depth;var frontZ=0.5*depth;var normals=[];var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);var n=points.length;for(var i=0;i<n;++i){var j=(i+1)%n;var x=points[j][0]-points[i][0];var y=points[j][1]-points[i][1];var length=Math.sqrt(x*x+y*y);normals[i]=[y/length,-x/length,0];}
var minX=points[0][0];var minY=points[0][1];var maxX=points[0][0];var maxY=points[0][1];for(var i=1;i<n;++i){var x=points[i][0];var y=points[i][1];minX=Math.min(minX,x);minY=Math.min(minY,y);maxX=Math.max(maxX,x);maxY=Math.max(maxY,y);}
var frontUV=[];var backUV=[];var rangeX=maxX-minX;var rangeY=maxY-minY;for(var i=0;i<n;++i){frontUV[i]=[(points[i][0]-minX)/rangeX,(points[i][1]-minY)/rangeY];backUV[i]=[(maxX-points[i][0])/rangeX,(points[i][1]-minY)/rangeY];}
for(var i=0;i<n;++i){var j=(i+1)%n;positionStream.addElement(points[i][0],points[i][1],backZ);normalStream.addElement(0,0,-1);texCoordStream.addElement(backUV[i][0],backUV[i][1]);positionStream.addElement(points[i][0],points[i][1],frontZ),normalStream.addElement(0,0,1);texCoordStream.addElement(frontUV[i][0],frontUV[i][1]);positionStream.addElement(points[i][0],points[i][1],backZ),normalStream.addElement(normals[i][0],normals[i][1],normals[i][2]);texCoordStream.addElement(0,1);positionStream.addElement(points[j][0],points[j][1],backZ),normalStream.addElement(normals[i][0],normals[i][1],normals[i][2]);texCoordStream.addElement(0,0);positionStream.addElement(points[j][0],points[j][1],frontZ),normalStream.addElement(normals[i][0],normals[i][1],normals[i][2]);texCoordStream.addElement(1,0);positionStream.addElement(points[i][0],points[i][1],frontZ),normalStream.addElement(normals[i][0],normals[i][1],normals[i][2]);texCoordStream.addElement(1,1);if(i>0&&i<n-1){vertexInfo.addTriangle(0,6*(i+1),6*i);vertexInfo.addTriangle(1,6*i+1,6*(i+1)+1);}
vertexInfo.addTriangle(6*i+2,6*i+3,6*i+4);vertexInfo.addTriangle(6*i+2,6*i+4,6*i+5);}
if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createPrism=function(pack,material,points,depth,opt_matrix){var vertexInfo=o3djs.primitives.createPrismVertices(points,depth,opt_matrix);return vertexInfo.createShape(pack,material);};o3djs.primitives.createPlaneVertices=function(width,depth,subdivisionsWidth,subdivisionsDepth,opt_matrix){if(subdivisionsWidth<=0||subdivisionsDepth<=0){throw Error('subdivisionWidth and subdivisionDepth must be > 0');}
var vertexInfo=o3djs.primitives.createVertexInfo();var positionStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.POSITION);var normalStream=vertexInfo.addStream(3,o3djs.base.o3d.Stream.NORMAL);var texCoordStream=vertexInfo.addStream(2,o3djs.base.o3d.Stream.TEXCOORD,0);for(var z=0;z<=subdivisionsDepth;z++){for(var x=0;x<=subdivisionsWidth;x++){var u=x/subdivisionsWidth;var v=z/subdivisionsDepth;positionStream.addElement(width*u-width*0.5,0,depth*v-depth*0.5);normalStream.addElement(0,1,0);texCoordStream.addElement(u,1-v);}}
var numVertsAcross=subdivisionsWidth+1;for(var z=0;z<subdivisionsDepth;z++){for(var x=0;x<subdivisionsWidth;x++){vertexInfo.addTriangle((z+0)*numVertsAcross+x,(z+1)*numVertsAcross+x,(z+0)*numVertsAcross+x+1);vertexInfo.addTriangle((z+1)*numVertsAcross+x,(z+1)*numVertsAcross+x+1,(z+0)*numVertsAcross+x+1);}}
if(opt_matrix){vertexInfo.reorient(opt_matrix);}
return vertexInfo;};o3djs.primitives.createPlane=function(pack,material,width,depth,subdivisionsWidth,subdivisionsDepth,opt_matrix){var vertexInfo=o3djs.primitives.createPlaneVertices(width,depth,subdivisionsWidth,subdivisionsDepth,opt_matrix);return vertexInfo.createShape(pack,material);};o3djs.primitives.createFadePlane=function(pack,material,width,depth,subdivisionsWidth,subdivisionsDepth,opt_matrix){var vertexInfo=o3djs.primitives.createPlaneVertices(width,depth,subdivisionsWidth,subdivisionsDepth,opt_matrix);var colorStream=vertexInfo.addStream(4,o3djs.base.o3d.Stream.COLOR);for(var z=0;z<=subdivisionsDepth;z++){var alpha=z/subdivisionsDepth;for(var x=0;x<=subdivisionsWidth;x++){colorStream.addElement(1,1,1,alpha);}}
return vertexInfo.createShape(pack,material);};o3djs.provide('o3djs.quaternions');o3djs.quaternions=o3djs.quaternions||{};o3djs.quaternions.Quaterion=goog.typedef;o3djs.quaternions.mathType=function(a){if(typeof(a)==='number')
return'Scalar';return'Quaternion';};o3djs.quaternions.copy=function(q){return q.slice();};o3djs.quaternions.negative=function(q){return[-q[0],-q[1],-q[2],-q[3]];};o3djs.quaternions.addQuaternionQuaternion=function(a,b){return[a[0]+b[0],a[1]+b[1],a[2]+b[2],a[3]+b[3]];};o3djs.quaternions.addQuaternionScalar=function(a,b){return a.slice(0,3).concat(a[3]+b);};o3djs.quaternions.addScalarQuaternion=function(a,b){return b.slice(0,3).concat(a+b[3]);};o3djs.quaternions.subQuaternionQuaternion=function(a,b){return[a[0]-b[0],a[1]-b[1],a[2]-b[2],a[3]-b[3]];};o3djs.quaternions.subQuaternionScalar=function(a,b){return a.slice(0,3).concat(a[3]-b);};o3djs.quaternions.subScalarQuaternion=function(a,b){return[-b[0],-b[1],-b[2],a-b[3]];};o3djs.quaternions.mulScalarQuaternion=function(k,q){return[k*q[0],k*q[1],k*q[2],k*q[3]];};o3djs.quaternions.mulQuaternionScalar=function(q,k){return[k*q[0],k*q[1],k*q[2],k*q[3]];};o3djs.quaternions.mulQuaternionQuaternion=function(a,b){var aX=a[0];var aY=a[1];var aZ=a[2];var aW=a[3];var bX=b[0];var bY=b[1];var bZ=b[2];var bW=b[3];return[aW*bX+aX*bW+aY*bZ-aZ*bY,aW*bY+aY*bW+aZ*bX-aX*bZ,aW*bZ+aZ*bW+aX*bY-aY*bX,aW*bW-aX*bX-aY*bY-aZ*bZ];};o3djs.quaternions.divQuaternionQuaternion=function(a,b){var aX=a[0];var aY=a[1];var aZ=a[2];var aW=a[3];var bX=b[0];var bY=b[1];var bZ=b[2];var bW=b[3];var d=1/(bW*bW+bX*bX+bY*bY+bZ*bZ);return[(aX*bW-aW*bX-aY*bZ+aZ*bY)*d,(aX*bZ-aW*bY+aY*bW-aZ*bX)*d,(aY*bX+aZ*bW-aW*bZ-aX*bY)*d,(aW*bW+aX*bX+aY*bY+aZ*bZ)*d];};o3djs.quaternions.divQuaternionScalar=function(q,k){return[q[0]/k,q[1]/k,q[2]/k,q[3]/k];};o3djs.quaternions.divScalarQuaternion=function(a,b){var b0=b[0];var b1=b[1];var b2=b[2];var b3=b[3];var d=1/(b0*b0+b1*b1+b2*b2+b3*b3);return[-a*b0*d,-a*b1*d,-a*b2*d,a*b3*d];};o3djs.quaternions.inverse=function(q){var q0=q[0];var q1=q[1];var q2=q[2];var q3=q[3];var d=1/(q0*q0+q1*q1+q2*q2+q3*q3);return[-q0*d,-q1*d,-q2*d,q3*d];};o3djs.quaternions.mul=function(a,b){return o3djs.quaternions['mul'+o3djs.quaternions.mathType(a)+
o3djs.quaternions.mathType(b)](a,b);};o3djs.quaternions.div=function(a,b){return o3djs.quaternions['div'+o3djs.quaternions.mathType(a)+
o3djs.quaternions.mathType(b)](a,b);};o3djs.quaternions.add=function(a,b){return o3djs.quaternions['add'+o3djs.quaternions.mathType(a)+
o3djs.quaternions.mathType(b)](a,b);};o3djs.quaternions.sub=function(a,b){return o3djs.quaternions['sub'+o3djs.quaternions.mathType(a)+
o3djs.quaternions.mathType(b)](a,b);};o3djs.quaternions.length=function(a){return Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3]);};o3djs.quaternions.lengthSquared=function(a){return a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3];};o3djs.quaternions.normalize=function(a){var d=1/Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]+a[3]*a[3]);return[a[0]*d,a[1]*d,a[2]*d,a[3]*d];};o3djs.quaternions.conjugate=function(q){return[-q[0],-q[1],-q[2],q[3]];};o3djs.quaternions.rotationX=function(angle){return[Math.sin(angle/2),0,0,Math.cos(angle/2)];};o3djs.quaternions.rotationY=function(angle){return[0,Math.sin(angle/2),0,Math.cos(angle/2)];};o3djs.quaternions.rotationZ=function(angle){return[0,0,Math.sin(angle/2),Math.cos(angle/2)];};o3djs.quaternions.axisRotation=function(axis,angle){var d=1/Math.sqrt(axis[0]*axis[0]+
axis[1]*axis[1]+
axis[2]*axis[2]);var sin=Math.sin(angle/2);var cos=Math.cos(angle/2);return[sin*axis[0]*d,sin*axis[1]*d,sin*axis[2]*d,cos];};o3djs.quaternions.quaternionToRotation=function(q){var qX=q[0];var qY=q[1];var qZ=q[2];var qW=q[3];var qWqW=qW*qW;var qWqX=qW*qX;var qWqY=qW*qY;var qWqZ=qW*qZ;var qXqW=qX*qW;var qXqX=qX*qX;var qXqY=qX*qY;var qXqZ=qX*qZ;var qYqW=qY*qW;var qYqX=qY*qX;var qYqY=qY*qY;var qYqZ=qY*qZ;var qZqW=qZ*qW;var qZqX=qZ*qX;var qZqY=qZ*qY;var qZqZ=qZ*qZ;var d=qWqW+qXqX+qYqY+qZqZ;return[[(qWqW+qXqX-qYqY-qZqZ)/d,2*(qWqZ+qXqY)/d,2*(qXqZ-qWqY)/d,0],[2*(qXqY-qWqZ)/d,(qWqW-qXqX+qYqY-qZqZ)/d,2*(qWqX+qYqZ)/d,0],[2*(qWqY+qXqZ)/d,2*(qYqZ-qWqX)/d,(qWqW-qXqX-qYqY+qZqZ)/d,0],[0,0,0,1]];};o3djs.quaternions.rotationToQuaternion=function(m){var u;var v;var w;if(m[0][0]>m[1][1]&&m[0][0]>m[2][2]){u=0;v=1;w=2;}else if(m[1][1]>m[0][0]&&m[1][1]>m[2][2]){u=1;v=2;w=0;}else{u=2;v=0;w=1;}
var r=Math.sqrt(1+m[u][u]-m[v][v]-m[w][w]);var q=[];q[u]=0.5*r;q[v]=0.5*(m[v][u]+m[u][v])/r;q[w]=0.5*(m[u][w]+m[w][u])/r;q[3]=0.5*(m[v][w]-m[w][v])/r;return q;};o3djs.provide('o3djs.rendergraph');o3djs.rendergraph=o3djs.rendergraph||{};o3djs.rendergraph.createView=function(pack,treeRoot,opt_parent,opt_clearColor,opt_priority,opt_viewport,opt_performanceDrawList,opt_zOrderedDrawList){return new o3djs.rendergraph.ViewInfo(pack,treeRoot,opt_parent,opt_clearColor,opt_priority,opt_viewport,opt_performanceDrawList,opt_zOrderedDrawList);};o3djs.rendergraph.createBasicView=function(pack,treeRoot,opt_parent,opt_clearColor,opt_priority,opt_viewport){return o3djs.rendergraph.createView(pack,treeRoot,opt_parent,opt_clearColor,opt_priority,opt_viewport);};o3djs.rendergraph.createExtraView=function(viewInfo,opt_viewport,opt_clearColor,opt_priority){return o3djs.rendergraph.createView(viewInfo.pack,viewInfo.treeRoot,viewInfo.renderGraphRoot,opt_clearColor,opt_priority,opt_viewport,viewInfo.performanceDrawList,viewInfo.zOrderedDrawList);};o3djs.rendergraph.ViewInfo=function(pack,treeRoot,opt_parent,opt_clearColor,opt_priority,opt_viewport,opt_performanceDrawList,opt_zOrderedDrawList){var clearColor=opt_clearColor||[0.5,0.5,0.5,1.0];var viewPriority=opt_priority||0;var priority=0;var viewport=pack.createObject('Viewport');if(opt_viewport){viewport.viewport=opt_viewport;}
viewport.priority=viewPriority;var clearBuffer=pack.createObject('ClearBuffer');clearBuffer.clearColor=clearColor;clearBuffer.priority=priority++;clearBuffer.parent=viewport;var performanceDrawList;if(opt_performanceDrawList){performanceDrawList=opt_performanceDrawList;this.ownPerformanceDrawList_=false;}else{performanceDrawList=pack.createObject('DrawList');this.ownPerformanceDrawList_=true;}
var zOrderedDrawList;if(opt_zOrderedDrawList){zOrderedDrawList=opt_zOrderedDrawList;this.ownZOrderedDrawList_=false;}else{zOrderedDrawList=pack.createObject('DrawList');this.ownZOrderedDrawList_=true;}
var drawContext=pack.createObject('DrawContext');var treeTraversal=pack.createObject('TreeTraversal');treeTraversal.priority=priority++;treeTraversal.parent=viewport;var performanceStateSet=pack.createObject('StateSet');var performanceState=pack.createObject('State');performanceStateSet.state=performanceState;performanceStateSet.priority=priority++;performanceStateSet.parent=viewport;performanceState.getStateParam('ColorWriteEnable').value=7;var performanceDrawPass=pack.createObject('DrawPass');performanceDrawPass.drawList=performanceDrawList;performanceDrawPass.parent=performanceStateSet;var zOrderedStateSet=pack.createObject('StateSet');var zOrderedState=pack.createObject('State');zOrderedState.getStateParam('AlphaBlendEnable').value=true;zOrderedState.getStateParam('SourceBlendFunction').value=o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA;zOrderedState.getStateParam('DestinationBlendFunction').value=o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA;zOrderedState.getStateParam('AlphaTestEnable').value=true;zOrderedState.getStateParam('AlphaComparisonFunction').value=o3djs.base.o3d.State.CMP_GREATER;zOrderedState.getStateParam('ColorWriteEnable').value=7;zOrderedStateSet.state=zOrderedState;zOrderedStateSet.priority=priority++;zOrderedStateSet.parent=viewport;var zOrderedDrawPass=pack.createObject('DrawPass');zOrderedDrawPass.drawList=zOrderedDrawList;zOrderedDrawPass.sortMethod=o3djs.base.o3d.DrawList.BY_Z_ORDER;zOrderedDrawPass.parent=zOrderedStateSet;treeTraversal.registerDrawList(performanceDrawList,drawContext,true);treeTraversal.registerDrawList(zOrderedDrawList,drawContext,true);treeTraversal.transform=treeRoot;this.pack=pack;this.renderGraphRoot=opt_parent;this.treeRoot=treeRoot;this.root=viewport;this.viewport=viewport;this.clearBuffer=clearBuffer;this.performanceStateSet=performanceStateSet;this.performanceState=performanceState;this.performanceDrawList=performanceDrawList;this.zOrderedStateSet=zOrderedStateSet;this.zOrderedState=zOrderedState;this.zOrderedDrawList=zOrderedDrawList;this.drawContext=drawContext;this.treeTraversal=treeTraversal;this.performanceDrawPass=performanceDrawPass;this.zOrderedDrawPass=zOrderedDrawPass;this.priority=priority;if(opt_parent){this.root.parent=opt_parent;}};o3djs.rendergraph.ViewInfo.prototype.destroy=function(opt_destroyDrawContext,opt_destroyDrawList){if(opt_destroyDrawContext===undefined){opt_destroyDrawContext=true;}
if(opt_destroyDrawList===undefined){opt_destroyDrawList=true;}
this.pack.removeObject(this.viewport);this.pack.removeObject(this.clearBuffer);if(this.ownPerformanceDrawList_&&opt_destroyDrawList){this.pack.removeObject(this.performanceDrawList);}
if(this.ownZOrderedDrawList_&&opt_destroyDrawList){this.pack.removeObject(this.zOrderedDrawList);}
if(opt_destroyDrawContext){this.pack.removeObject(this.drawContext);}
this.pack.removeObject(this.treeTraversal);this.pack.removeObject(this.performanceDrawPass);this.pack.removeObject(this.zOrderedDrawPass);this.viewport.parent=null;};o3djs.provide('o3djs.scene');o3djs.require('o3djs.io');o3djs.require('o3djs.serialization');o3djs.scene=o3djs.scene||{};o3djs.scene.loadScene=function(client,pack,parent,url,callback,opt_options){function onFinished(archiveInfo,exception){if(!exception){var finishCallback=function(pack,parent,exception){if(!g_archive[url])
{archiveInfo.destroy();}
else
{g_archive[url].archive=archiveInfo;}
callback(pack,parent,exception);};o3djs.serialization.deserializeArchive(archiveInfo,'scene.json',client,pack,parent,finishCallback,opt_options);}else{archiveInfo.destroy();callback(pack,parent,exception);}}
if(!g_archive[url]||!g_archive[url].archive)
{return o3djs.io.loadArchive(pack,url,onFinished);}
else
{onFinished(g_archive[url].archive,null);}};o3djs.provide('o3djs.serialization');o3djs.require('o3djs.error');o3djs.serialization=o3djs.serialization||{};o3djs.serialization.supportedVersion=5;o3djs.serialization.Options=goog.typedef;o3djs.serialization.Deserializer=function(pack,json){this.pack=pack;this.json=json;this.archiveInfo=null;this.createCallbacks={'o3d.VertexBuffer':function(deserializer,json){var object=deserializer.pack.createObject('o3d.VertexBuffer');if('custom'in json){var rawData=deserializer.archiveInfo.getFileByURI('vertex-buffers.bin');object.set(rawData,json.custom.binaryRange[0],json.custom.binaryRange[1]-json.custom.binaryRange[0]);for(var i=0;i<json.custom.fields.length;++i){deserializer.addObject(json.custom.fields[i],object.fields[i]);}}
return object;},'o3d.SourceBuffer':function(deserializer,json){var object=deserializer.pack.createObject('o3d.SourceBuffer');if('custom'in json){var rawData=deserializer.archiveInfo.getFileByURI('vertex-buffers.bin');object.set(rawData,json.custom.binaryRange[0],json.custom.binaryRange[1]-json.custom.binaryRange[0]);for(var i=0;i<json.custom.fields.length;++i){deserializer.addObject(json.custom.fields[i],object.fields[i]);}}
return object;},'o3d.IndexBuffer':function(deserializer,json){var object=deserializer.pack.createObject('o3d.IndexBuffer');if('custom'in json){var rawData=deserializer.archiveInfo.getFileByURI('index-buffers.bin');object.set(rawData,json.custom.binaryRange[0],json.custom.binaryRange[1]-json.custom.binaryRange[0]);for(var i=0;i<json.custom.fields.length;++i){deserializer.addObject(json.custom.fields[i],object.fields[i]);}}
return object;},'o3d.Texture2D':function(deserializer,json){if('o3d.uri'in json.params){var uri=json.params['o3d.uri'].value;if(uri.charAt(0)=='*')
{uri=uri.substr(1);var texture=g_textures[uri];if(!texture)
errormsg('external texture linkage broken: '+uri);return texture;}
var rawData=deserializer.archiveInfo.getFileByURI(uri);if(!rawData){errormsg('Could not find texture '+uri+' in the archive');throw'Could not find texture '+uri+' in the archive';}
return deserializer.pack.createTextureFromRawData(rawData,true);}else{return deserializer.pack.createTexture2D(json.custom.width,json.custom.height,json.custom.format,json.custom.levels,json.custom.renderSurfacesEnabled);}},'o3d.TextureCUBE':function(deserializer,json){if('o3d.uri'in json.params){var uri=json.params['o3d.uri'].value;var rawData=deserializer.archiveInfo.getFileByURI(uri);if(!rawData){throw'Could not find texture '+uri+' in the archive';}
return deserializer.pack.createTextureFromRawData(rawData,true);}else{return deserializer.pack.createTextureCUBE(json.custom.edgeLength,json.custom.format,json.custom.levels,json.custom.renderSurfacesEnabled);}}};this.initCallbacks={'o3d.Curve':function(deserializer,object,json){if('custom'in json){var rawData=deserializer.archiveInfo.getFileByURI('curve-keys.bin');object.set(rawData,json.custom.binaryRange[0],json.custom.binaryRange[1]-json.custom.binaryRange[0]);}},'o3d.Effect':function(deserializer,object,json){var uriParam=object.getParam('o3d.uri');if(uriParam){var rawData=deserializer.archiveInfo.getFileByURI(uriParam.value);if(!rawData){throw'Cannot find shader '+uriParam.value+' in archive.';}
if(!object.loadFromFXString(rawData.stringValue)){throw'Cannot load shader '+uriParam.value+' in archive.';}}},'o3d.Skin':function(deserializer,object,json){if('custom'in json){var rawData=deserializer.archiveInfo.getFileByURI('skins.bin');object.set(rawData,json.custom.binaryRange[0],json.custom.binaryRange[1]-json.custom.binaryRange[0]);}},'o3d.SkinEval':function(deserializer,object,json){if('custom'in json){for(var i=0;i<json.custom.vertexStreams.length;++i){var streamJson=json.custom.vertexStreams[i];var field=deserializer.getObjectById(streamJson.stream.field);object.setVertexStream(streamJson.stream.semantic,streamJson.stream.semanticIndex,field,streamJson.stream.startIndex);if('bind'in streamJson){var source=deserializer.getObjectById(streamJson.bind);object.bindStream(source,streamJson.stream.semantic,streamJson.stream.semanticIndex);}}}},'o3d.StreamBank':function(deserializer,object,json){if('custom'in json){for(var i=0;i<json.custom.vertexStreams.length;++i){var streamJson=json.custom.vertexStreams[i];var field=deserializer.getObjectById(streamJson.stream.field);object.setVertexStream(streamJson.stream.semantic,streamJson.stream.semanticIndex,field,streamJson.stream.startIndex);if('bind'in streamJson){var source=deserializer.getObjectById(streamJson.bind);object.bindStream(source,streamJson.stream.semantic,streamJson.stream.semanticIndex);}}}}};if(!('version'in json)){throw'Version in JSON file was missing.';}
if(json.version<o3djs.serialization.supportedVersion){throw'Version in JSON file was '+json.version+' but expected at least version '+
o3djs.serialization.supportedVersion+'.';}
if(!('objects'in json)){throw'Objects array in JSON file was missing.';}
this.objectsById_=[null];this.objectsByIndex_=[];this.classNames_=[];for(var className in json.objects){this.classNames_.push(className);}
this.phase_=0;this.nextClassIndex_=0;this.nextObjectIndex_=0;this.globalObjectIndex_=0;};o3djs.serialization.Deserializer.prototype.getObjectById=function(id){return this.objectsById_[id];};o3djs.serialization.Deserializer.prototype.addObject=function(id,object){this.objectsById_[id]=object;};o3djs.serialization.Deserializer.prototype.deserializeValue=function(valueJson){if(typeof(valueJson)==='object'){if(valueJson===null){return null;}
var valueAsObject=(valueJson);if('length'in valueAsObject){for(var i=0;i!=valueAsObject.length;++i){valueAsObject[i]=this.deserializeValue(valueAsObject[i]);}
return valueAsObject;}
var refId=valueAsObject['ref'];if(refId!==undefined){var referenced=this.objectsById_[refId];if(referenced===undefined){throw'Could not find object with id '+refId+'.';}
return referenced;}}
return valueJson;};o3djs.serialization.Deserializer.prototype.setParamValue_=function(object,paramName,propertyJson){var param=object.getParam(paramName);if(param===null)
return;var valueJson=propertyJson['value'];if(valueJson!==undefined){param.value=this.deserializeValue(valueJson);}
var bindId=propertyJson['bind'];if(bindId!==undefined){var referenced=this.objectsById_[bindId];if(referenced===undefined){throw'Could not find output param with id '+bindId+'.';}
param.bind(referenced);}};o3djs.serialization.Deserializer.prototype.createAndIdentifyParam_=function(object,paramName,propertyJson){var propertyClass=propertyJson['class'];var param;if(propertyClass!==undefined){param=object.createParam(paramName,propertyClass);}else{param=object.getParam(paramName);}
var paramId=propertyJson['id'];if(paramId!==undefined&&param!==null){this.objectsById_[paramId]=param;}};o3djs.serialization.Deserializer.prototype.createObjectsPhase_=function(amountOfWork){for(;this.nextClassIndex_<this.classNames_.length;++this.nextClassIndex_){var className=this.classNames_[this.nextClassIndex_];var classJson=this.json.objects[className];var numObjects=classJson.length;for(;this.nextObjectIndex_<numObjects;++this.nextObjectIndex_){if(amountOfWork--<=0)
return;var objectJson=classJson[this.nextObjectIndex_];var object=undefined;if('id'in objectJson){object=this.objectsById_[objectJson.id];}
if(object===undefined){if(className in this.createCallbacks){object=this.createCallbacks[className](this,objectJson);}else{object=this.pack.createObject(className);}}
this.objectsByIndex_[this.globalObjectIndex_++]=object;if('id'in objectJson){this.objectsById_[objectJson.id]=object;}
if('params'in objectJson){if('length'in objectJson.params){for(var paramIndex=0;paramIndex!=objectJson.params.length;++paramIndex){var paramJson=objectJson.params[paramIndex];this.createAndIdentifyParam_(object,paramIndex,paramJson);}}else{for(var paramName in objectJson.params){var paramJson=objectJson.params[paramName];this.createAndIdentifyParam_(object,paramName,paramJson);}}}}
this.nextObjectIndex_=0;}
if(this.nextClassIndex_===this.classNames_.length){this.nextClassIndex_=0;this.nextObjectIndex_=0;this.globalObjectIndex_=0;++this.phase_;}};o3djs.serialization.Deserializer.prototype.setPropertiesPhase_=function(amountOfWork){for(;this.nextClassIndex_<this.classNames_.length;++this.nextClassIndex_){var className=this.classNames_[this.nextClassIndex_];var classJson=this.json.objects[className];var numObjects=classJson.length;for(;this.nextObjectIndex_<numObjects;++this.nextObjectIndex_){if(amountOfWork--<=0)
return;var objectJson=classJson[this.nextObjectIndex_];var object=this.objectsByIndex_[this.globalObjectIndex_++];if('properties'in objectJson){for(var propertyName in objectJson.properties){if(propertyName in object){var propertyJson=objectJson.properties[propertyName];var propertyValue=this.deserializeValue(propertyJson);object[propertyName]=propertyValue;}};}
if('params'in objectJson){if('length'in objectJson.params){for(var paramIndex=0;paramIndex!=objectJson.params.length;++paramIndex){var paramJson=objectJson.params[paramIndex];this.setParamValue_((object),paramIndex,paramJson);}}else{for(var paramName in objectJson.params){var paramJson=objectJson.params[paramName];this.setParamValue_((object),paramName,paramJson);}}}
if(className in this.initCallbacks){this.initCallbacks[className](this,object,objectJson);}}
this.nextObjectIndex_=0;}
if(this.nextClassIndex_===this.classNames_.length){this.nextClassIndex_=0;this.nextObjectIndex_=0;this.globalObjectIndex_=0;++this.phase_;}};o3djs.serialization.Deserializer.prototype.run=function(opt_amountOfWork){if(!opt_amountOfWork){while(this.run(10000)){}
return false;}else{switch(this.phase_){case 0:this.createObjectsPhase_(opt_amountOfWork);break;case 1:this.setPropertiesPhase_(opt_amountOfWork);break;}
return this.phase_<2;}};o3djs.serialization.Deserializer.prototype.runBackground=function(client,pack,time,callback){var workToDo=this.json.objects.length*2;var timerCallbacks=time*60;var amountPerCallback=workToDo/timerCallbacks;var intervalId;var that=this;function deserializeMore(){var exception=null;var finished=false;var failed=false;var errorCollector=o3djs.error.createErrorCollector(client);try{finished=!that.run(amountPerCallback);}catch(e){failed=true;finished=true;exception=e;}
if(errorCollector.errors.length>0){finished=true;exception=errorCollector.errors.join('\n')+
(exception?('\n'+exception.toString()):'');}
errorCollector.finish();if(finished){window.clearInterval(intervalId);callback(pack,exception);}}
intervalId=window.setInterval(deserializeMore,1000/60);};o3djs.serialization.createDeserializer=function(pack,json){return new o3djs.serialization.Deserializer(pack,json);};o3djs.serialization.deserialize=function(pack,json){var deserializer=o3djs.serialization.createDeserializer(pack,json);deserializer.run();};o3djs.serialization.deserializeArchive=function(archiveInfo,sceneJsonUri,client,pack,parent,callback,opt_options){opt_options=opt_options||{};var jsonFile=archiveInfo.getFileByURI(sceneJsonUri);if(!jsonFile){throw'Could not find '+sceneJsonUri+' in archive';}
var parsed=eval('('+jsonFile.stringValue+')');var deserializer=o3djs.serialization.createDeserializer(pack,parsed);deserializer.addObject(parsed.o3d_rootObject_root,parent);deserializer.archiveInfo=archiveInfo;var finishCallback=function(pack,exception){if(!exception){var objects=pack.getObjects('o3d.animSourceOwner','o3d.ParamObject');if(objects.length>0){if(opt_options.opt_animSource){var animSource=objects[0].getParam('animSource');var outputConnections=animSource.outputConnections;for(var ii=0;ii<outputConnections.length;++ii){outputConnections[ii].bind(opt_options.opt_animSource);}}
for(var ii=0;ii<objects.length;++ii){pack.removeObject(objects[ii]);}}}
callback(pack,parent,exception);};if(opt_options.opt_async){deserializer.runBackground(client,pack,5,finishCallback);}else{var exception=null;var errorCollector=o3djs.error.createErrorCollector(client);try{deserializer.run();}catch(e){exception=e;}
if(errorCollector.errors.length>0){exception=errorCollector.errors.join('\n')+
(exception?('\n'+exception.toString()):'');}
errorCollector.finish();finishCallback(pack,exception);}};o3djs.provide('o3djs.shape');o3djs.require('o3djs.math');o3djs.require('o3djs.element');o3djs.shape=o3djs.shape||{};o3djs.shape.addMissingTexCoordStreams=function(shape){var elements=shape.elements;for(var ee=0;ee<elements.length;++ee){var element=elements[ee];o3djs.element.addMissingTexCoordStreams(element);}};o3djs.shape.setBoundingBoxesAndZSortPoints=function(shape){var elements=shape.elements;for(var ee=0;ee<elements.length;++ee){var element=elements[ee];o3djs.element.setBoundingBoxAndZSortPoint(element);}};o3djs.shape.prepareShape=function(pack,shape){shape.createDrawElements(pack,null);o3djs.shape.setBoundingBoxesAndZSortPoints(shape);o3djs.shape.addMissingTexCoordStreams(shape);};o3djs.shape.prepareShapes=function(pack){var shapes=pack.getObjectsByClassName('o3d.Shape');for(var ss=0;ss<shapes.length;++ss){o3djs.shape.prepareShape(pack,shapes[ss]);}};o3djs.shape.deleteDuplicateShape=function(shape,pack){var elements=shape.elements;for(var ee=0;ee<elements.length;ee++){var element=elements[ee];var drawElements=element.drawElements;for(var dd=0;dd<drawElements.length;dd++){var drawElement=drawElements[dd];pack.removeObject(drawElement);}
pack.removeObject(element);}
pack.removeObject(shape);};o3djs.shape.duplicateShape=function(pack,source){var newShape=pack.createObject('Shape');var elements=source.elements;for(var ee=0;ee<elements.length;ee++){var newElement=o3djs.element.duplicateElement(pack,elements[ee]);newElement.owner=newShape;}
newShape.createDrawElements(pack,null);return newShape;};o3djs.provide('o3djs.util');o3djs.require('o3djs.io');o3djs.require('o3djs.event');o3djs.require('o3djs.error');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(func){var outerArgs=[];for(var i=1;i<arguments.length;++i){outerArgs.push(arguments[i]);}
return function(){var innerArgs=outerArgs.slice();for(var i=0;i<arguments.length;++i){innerArgs.push(arguments[i]);}
return func.apply(this,innerArgs);}}
o3djs.util.getCurrentURI=function(){var path=window.location.href;var index=path.lastIndexOf('/');return path.substring(0,index+1);};o3djs.util.getAbsoluteURI=function(uri){return o3djs.util.getCurrentURI()+uri;};o3djs.util.arrayContains=function(array,value){for(var i=0;i<array.length;i++){if(array[i]==value){return true;}}
return false;};o3djs.util.getTransformsInTreeByTags=function(treeRoot,searchTags){var splitTags=searchTags.split(',');var transforms=treeRoot.getTransformsInTree();var found=[];for(var n=0;n<transforms.length;n++){var tagParam=transforms[n].getParam('collada.tags');if(tagParam){var tags=tagParam.value.split(',');for(var t=0;t<tags.length;t++){if(o3djs.util.arrayContains(splitTags,tags[t])){found[found.length]=transforms[n];break;}}}}
return found;};o3djs.util.getTransformsInTreeByPrefix=function(treeRoot,prefix){var found=[];var transforms=treeRoot.getTransformsInTree();for(var ii=0;ii<transforms.length;ii++){var transform=transforms[ii];if(transform.name.indexOf(prefix)==0){found[found.length]=transform;}}
return found;};o3djs.util.getBoundingBoxOfTree=function(treeRoot){var box=treeRoot.boundingBox;if(box.valid){return box;}
var o3d=o3djs.base.o3d;var transforms=treeRoot.children;for(var i=0;i<transforms.length;++i){var transform=transforms[i];var childBox=o3djs.util.getBoundingBoxOfTree(transform);if(childBox.valid){childBox=childBox.mul(transform.localMatrix);if(box.valid){box=box.add(childBox);}else{box=childBox;}}}
var shapes=treeRoot.shapes;for(var i=0;i<shapes.length;++i){var elements=shapes[i].elements;for(var j=0;j<elements.length;++j){var elementBox=elements[j].boundingBox;if(!elementBox.valid){elementBox=elements[j].getBoundingBox(0);}
if(box.valid){box=box.add(elementBox);}else{box=elementBox;}}}
return box;};o3djs.util.getPowerOfTwoSize=function(size){var powerOfTwo=1;while(size){size=size>>1;powerOfTwo=powerOfTwo<<1;}
return powerOfTwo;};o3djs.util.getPluginVersion=function(){var version=null;var description=null;if(navigator.plugins!=null&&navigator.plugins.length>0){var plugin=navigator.plugins[o3djs.util.PLUGIN_NAME];if(plugin){description=plugin.description;}}else if(o3djs.base.IsMSIE()){try{var activeXObject=new ActiveXObject('o3d_host.O3DHostControl');description=activeXObject.description;}catch(e){}}
if(description){var re=/.*version:(\d+)\.(\d+)\.(\d+)\.(\d+).*/;var parts=re.exec(description);if(parts&&parts.length==5){version=''+parseInt(parts[1],10)+'.'+
parseInt(parts[2],10)+'.'+
parseInt(parts[3],10)+'.'+
parseInt(parts[4],10);}}
return version;};o3djs.util.requiredVersionAvailable=function(requiredVersion){var version=o3djs.util.getPluginVersion();if(!version){return false;}
var haveParts=version.split('.');var requiredParts=requiredVersion.split('.');if(requiredParts.length>4){throw Error('requiredVersion has more than 4 parts!');}
for(var pp=0;pp<requiredParts.length;++pp){var have=parseInt(haveParts[pp],10);var required=parseInt(requiredParts[pp],10);if(have<required){return false;}
if(have>required){return true;}}
return true;};o3djs.util.offerPlugin=function(opt_id,opt_tag){var tag=opt_tag||'div';var id=opt_id||'^o3d';var havePlugin=o3djs.util.requiredVersionAvailable('');var elements=document.getElementsByTagName(tag);var addedMessage=false;var subMessage=(havePlugin?'This page requires a newer version of the O3D plugin.':'This page requires the O3D plugin to be installed.');var message='<div style="background: lightblue; width: 100%; height: 100%; '+'text-align:center;">'+'<br/><br/>'+subMessage+'<br/>'+'<a href="'+o3djs.util.PLUGIN_DOWNLOAD_URL+'">Click here to download.</a>'+'</div>'
for(var ee=0;ee<elements.length;++ee){var element=elements[ee];if(element.id&&element.id.match(id)){if(element.clientWidth>=200&&element.clientHeight>=200&&element.style.display.toLowerCase()!='none'&&element.style.visibility.toLowerCase()!='hidden'){addedMessage=true;element.innerHTML=message;}}}
if(!addedMessage){if(confirm(subMessage+'\n\nClick OK to download.')){window.location=o3djs.util.PLUGIN_DOWNLOAD_URL;}}};o3djs.util.informNoGraphics=function(initStatus,error,opt_id,opt_tag){var tag=opt_tag||'div';var id=opt_id||'^o3d';var elements=document.getElementsByTagName(tag);var addedMessage=false;var subMessage;var message;var alertMessage='';var alertFunction=function(){};var moreInfo=function(error){var html='';if(error.length>0){html=''+'<br/><br/><div>More Info:<br/>'+error+'</div>';}
return html;};if(initStatus==o3djs.util.rendererInitStatus.GPU_NOT_UP_TO_SPEC){subMessage='We are terribly sorry but it appears your graphics card is not '+'able to run o3d. We are working on a solution.';message='<div style="background: lightgray; width: 100%; height: 100%; '+'text-align: center;">'+'<br/><br/>'+subMessage+'<br/><br/><a href="'+o3djs.util.PLUGIN_DOWNLOAD_URL+'">Click Here to go the O3D website</a>'+
moreInfo(error)+'</div>';alertMessage='\n\nClick OK to go to the o3d website.';alertFunction=function(){window.location=o3djs.util.PLUGIN_DOWNLOAD_URL;};}else if(initStatus==o3djs.util.rendererInitStatus.OUT_OF_RESOURCES){subMessage='Your graphics system appears to be out of resources. Try closing '+'some applications and then refreshing this page.';message='<div style="background: lightgray; width: 100%; height: 100%; '+'text-align: center;">'+'<br/><br/>'+subMessage+
moreInfo(error)+'</div>';}else{subMessage='A unknown error has prevented O3D from starting. Try downloading '+'new drivers or checking for OS updates.';message='<div style="background: lightgray; width: 100%; height: 100%; '+'text-align: center;">'+'<br/><br/>'+subMessage+
moreInfo(error)+'</div>';}
for(var ee=0;ee<elements.length;++ee){var element=elements[ee];if(element.id&&element.id.match(id)){if(element.clientWidth>=200&&element.clientHeight>=200&&element.style.display.toLowerCase()!='none'&&element.style.visibility.toLowerCase()!='hidden'){addedMessage=true;element.innerHTML=message;}}}
if(!addedMessage){if(confirm(subMessage+alertMessage)){alertFunction();}}};o3djs.util.informPluginFailure=function(initStatus,error,opt_id,opt_tag){if(initStatus==o3djs.util.rendererInitStatus.NO_PLUGIN){o3djs.util.offerPlugin(opt_id,opt_tag);}else{o3djs.util.informNoGraphics(initStatus,error,opt_id,opt_tag);}};o3djs.util.getElementContentById=function(id){o3djs.BROWSER_ONLY=true;var node=document.getElementById(id);if(!node){throw'getElementContentById could not find node with id '+id;}
switch(node.tagName){case'TEXTAREA':return node.value;case'SCRIPT':return node.text;default:throw'getElementContentById does not no how to get content from a '+
node.tagName+' element';}};o3djs.util.getElementById=function(id){o3djs.BROWSER_ONLY=true;return document.getElementById(id);};o3djs.util.Engine={BROWSER:0,V8:1};o3djs.util.mainEngine_=o3djs.util.Engine.BROWSER;o3djs.util.setMainEngine=function(engine){o3djs.util.mainEngine_=engine;};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(uri){if(uri.indexOf('://')==-1){var baseUri=document.location.toString();var lastSlash=baseUri.lastIndexOf('/');if(lastSlash!=-1){baseUri=baseUri.substring(0,lastSlash);}
uri=baseUri+'/'+uri;}
do{var lastUri=uri;uri=uri.replace(o3djs.util.stripDotDot_,'');}while(lastUri!==uri);return uri;};o3djs.util.scriptUris_=[];o3djs.util.addScriptUri=function(uri){o3djs.util.scriptUris_.push(o3djs.util.toAbsoluteUri(uri));};o3djs.util.isScriptUri=function(uri){uri=o3djs.util.toAbsoluteUri(uri);for(var i=0;i<o3djs.util.scriptUris_.length;++i){var scriptUri=o3djs.util.scriptUris_[i];if(uri.substring(0,scriptUri.length)===scriptUri){return true;}}
return false;};o3djs.util.getScriptTagText_=function(){var scriptTagText='';var scriptElements=document.getElementsByTagName('script');for(var i=0;i<scriptElements.length;++i){var scriptElement=scriptElements[i];if(scriptElement.type===''||scriptElement.type==='text/javascript'){if('text'in scriptElement&&scriptElement.text){scriptTagText+=scriptElement.text;}
if('src'in scriptElement&&scriptElement.src&&o3djs.util.isScriptUri(scriptElement.src)){scriptTagText+=o3djs.io.loadTextFileSynchronous(scriptElement.src);}}}
return scriptTagText;};o3djs.util.createClient=function(element,opt_features,opt_requestVersion){opt_features=opt_features||'';opt_requestVersion=opt_requestVersion||o3djs.util.REQUIRED_VERSION;if(!o3djs.util.requiredVersionAvailable(opt_requestVersion)){return null;}
opt_features+=(opt_features?',':'')+'APIVersion='+
opt_requestVersion;var objElem;if(o3djs.base.IsMSIE()){element.innerHTML='<OBJECT '+'WIDTH="100%" HEIGHT="100%"'+'CLASSID="CLSID:9666A772-407E-4F90-BC37-982E8160EB2D">'+'<PARAM name="o3d_features" value="'+opt_features+'"/>'+'</OBJECT>';objElem=element.childNodes[0];}else{objElem=document.createElement('object');objElem.type='application/vnd.o3d.auto';objElem.style.width='100%';objElem.style.height='100%';objElem.setAttribute('o3d_features',opt_features);element.appendChild(objElem);}
return objElem;};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;if(!o3d){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);}}};