Skip to content

Instantly share code, notes, and snippets.

@axemclion
Last active February 6, 2017 23:45
Show Gist options
  • Save axemclion/bb2cb17401845cc401817c191a44c8b6 to your computer and use it in GitHub Desktop.
Save axemclion/bb2cb17401845cc401817c191a44c8b6 to your computer and use it in GitHub Desktop.
ReactVR-DBMonster
This file has been truncated, but you can view the full file.
(function(global) {
global.__DEV__=true;
global.__BUNDLE_START_TIME__=Date.now();
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
'use strict';
global.require=_require;
global.__d=define;
var modules=Object.create(null);
if(__DEV__){
var verboseNamesToModuleIds=Object.create(null);
}
function define(moduleId,factory){
if(moduleId in modules){
return;
}
modules[moduleId]={
factory:factory,
hasError:false,
isInitialized:false,
exports:undefined};
if(__DEV__){
modules[moduleId].hot=createHotReloadingObject();
var verboseName=modules[moduleId].verboseName=arguments[2];
verboseNamesToModuleIds[verboseName]=moduleId;
}
}
function _require(moduleId){
var module=__DEV__?
modules[moduleId]||modules[verboseNamesToModuleIds[moduleId]]:
modules[moduleId];
return module&&module.isInitialized?
module.exports:
guardedLoadModule(moduleId,module);
}
var inGuard=false;
function guardedLoadModule(moduleId,module){
if(!inGuard&&global.ErrorUtils){
inGuard=true;
var returnValue=void 0;
try{
returnValue=loadModuleImplementation(moduleId,module);
}catch(e){
global.ErrorUtils.reportFatalError(e);
}
inGuard=false;
return returnValue;
}else{
return loadModuleImplementation(moduleId,module);
}
}
function loadModuleImplementation(moduleId,module){
var nativeRequire=global.nativeRequire;
if(!module&&nativeRequire){
nativeRequire(moduleId);
module=modules[moduleId];
}
if(__DEV__&&!module){
module=modules[verboseNamesToModuleIds[moduleId]];
if(module){
console.warn(
'Requiring module \''+moduleId+'\' by name is only supported for '+
'debugging purposes and will break in production');
}
}
if(!module){
throw unknownModuleError(moduleId);
}
if(module.hasError){
throw moduleThrewError(moduleId);
}
if(__DEV__){var
Systrace=_require.Systrace;
}
module.isInitialized=true;
var exports=module.exports={};var _module=
module,factory=_module.factory;
try{
if(__DEV__){
Systrace.beginEvent('JS_require_'+(module.verboseName||moduleId));
}
var moduleObject={exports:exports};
if(__DEV__&&module.hot){
moduleObject.hot=module.hot;
}
factory(global,_require,moduleObject,exports);
if(!__DEV__){
module.factory=undefined;
}
if(__DEV__){
Systrace.endEvent();
}
return module.exports=moduleObject.exports;
}catch(e){
module.hasError=true;
module.isInitialized=false;
module.exports=undefined;
throw e;
}
}
function unknownModuleError(id){
var message='Requiring unknown module "'+id+'".';
if(__DEV__){
message+=
'If you are sure the module is there, try restarting the packager or running "npm install".';
}
return Error(message);
}
function moduleThrewError(id){
return Error('Requiring module "'+id+'", which threw an exception.');
}
if(__DEV__){var
createHotReloadingObject;(function(){_require.Systrace={beginEvent:function beginEvent(){},endEvent:function endEvent(){}};createHotReloadingObject=function createHotReloadingObject(){
var hot={
acceptCallback:null,
accept:function accept(callback){hot.acceptCallback=callback;}};
return hot;
};
var acceptAll=function acceptAll(dependentModules,inverseDependencies){
if(!dependentModules||dependentModules.length===0){
return true;
}
var notAccepted=dependentModules.filter(
function(module){return!accept(module,undefined,inverseDependencies);});
var parents=[];
for(var i=0;i<notAccepted.length;i++){
if(inverseDependencies[notAccepted[i]].length===0){
return false;
}
parents.pushAll(inverseDependencies[notAccepted[i]]);
}
return acceptAll(parents,inverseDependencies);
};
var accept=function accept(id,factory,inverseDependencies){
var mod=modules[id];
if(!mod){
define(id,factory);
return true;
}var
hot=mod.hot;
if(!hot){
console.warn(
'Cannot accept module because Hot Module Replacement '+
'API was not installed.');
return false;
}
if(factory){
mod.factory=factory;
}
mod.hasError=false;
mod.isInitialized=false;
_require(id);
if(hot.acceptCallback){
hot.acceptCallback();
return true;
}else{
if(!inverseDependencies){
throw new Error('Undefined `inverseDependencies`');
}
return acceptAll(inverseDependencies[id],inverseDependencies);
}
};
global.__accept=accept;})();
}
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
Object.assign=function(target,sources){
if(__DEV__){
if(target==null){
throw new TypeError('Object.assign target cannot be null or undefined');
}
if(typeof target!=='object'&&typeof target!=='function'){
throw new TypeError(
'In this environment the target of assign MUST be an object.'+
'This error is a performance optimization and not spec compliant.');
}
}
for(var nextIndex=1;nextIndex<arguments.length;nextIndex++){
var nextSource=arguments[nextIndex];
if(nextSource==null){
continue;
}
if(__DEV__){
if(typeof nextSource!=='object'&&
typeof nextSource!=='function'){
throw new TypeError(
'In this environment the sources for assign MUST be an object.'+
'This error is a performance optimization and not spec compliant.');
}
}
for(var key in nextSource){
if(__DEV__){
var hasOwnProperty=Object.prototype.hasOwnProperty;
if(!hasOwnProperty.call(nextSource,key)){
throw new TypeError(
'One of the sources for assign has an enumerable key on the '+
'prototype chain. This is an edge case that we do not support. '+
'This error is a performance optimization and not spec compliant.');
}
}
target[key]=nextSource[key];
}
}
return target;
};
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
var inspect=function(){
function inspect(obj,opts){
var ctx={
seen:[],
stylize:stylizeNoColor};
return formatValue(ctx,obj,opts.depth);
}
function stylizeNoColor(str,styleType){
return str;
}
function arrayToHash(array){
var hash={};
array.forEach(function(val,idx){
hash[val]=true;
});
return hash;
}
function formatValue(ctx,value,recurseTimes){
var primitive=formatPrimitive(ctx,value);
if(primitive){
return primitive;
}
var keys=Object.keys(value);
var visibleKeys=arrayToHash(keys);
if(isError(value)&&(
keys.indexOf('message')>=0||keys.indexOf('description')>=0)){
return formatError(value);
}
if(keys.length===0){
if(isFunction(value)){
var name=value.name?': '+value.name:'';
return ctx.stylize('[Function'+name+']','special');
}
if(isRegExp(value)){
return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
}
if(isDate(value)){
return ctx.stylize(Date.prototype.toString.call(value),'date');
}
if(isError(value)){
return formatError(value);
}
}
var base='',array=false,braces=['{','}'];
if(isArray(value)){
array=true;
braces=['[',']'];
}
if(isFunction(value)){
var n=value.name?': '+value.name:'';
base=' [Function'+n+']';
}
if(isRegExp(value)){
base=' '+RegExp.prototype.toString.call(value);
}
if(isDate(value)){
base=' '+Date.prototype.toUTCString.call(value);
}
if(isError(value)){
base=' '+formatError(value);
}
if(keys.length===0&&(!array||value.length==0)){
return braces[0]+base+braces[1];
}
if(recurseTimes<0){
if(isRegExp(value)){
return ctx.stylize(RegExp.prototype.toString.call(value),'regexp');
}else{
return ctx.stylize('[Object]','special');
}
}
ctx.seen.push(value);
var output;
if(array){
output=formatArray(ctx,value,recurseTimes,visibleKeys,keys);
}else{
output=keys.map(function(key){
return formatProperty(ctx,value,recurseTimes,visibleKeys,key,array);
});
}
ctx.seen.pop();
return reduceToSingleString(output,base,braces);
}
function formatPrimitive(ctx,value){
if(isUndefined(value))
return ctx.stylize('undefined','undefined');
if(isString(value)){
var simple='\''+JSON.stringify(value).replace(/^"|"$/g,'').
replace(/'/g,"\\'").
replace(/\\"/g,'"')+'\'';
return ctx.stylize(simple,'string');
}
if(isNumber(value))
return ctx.stylize(''+value,'number');
if(isBoolean(value))
return ctx.stylize(''+value,'boolean');
if(isNull(value))
return ctx.stylize('null','null');
}
function formatError(value){
return'['+Error.prototype.toString.call(value)+']';
}
function formatArray(ctx,value,recurseTimes,visibleKeys,keys){
var output=[];
for(var i=0,l=value.length;i<l;++i){
if(hasOwnProperty(value,String(i))){
output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
String(i),true));
}else{
output.push('');
}
}
keys.forEach(function(key){
if(!key.match(/^\d+$/)){
output.push(formatProperty(ctx,value,recurseTimes,visibleKeys,
key,true));
}
});
return output;
}
function formatProperty(ctx,value,recurseTimes,visibleKeys,key,array){
var name,str,desc;
desc=Object.getOwnPropertyDescriptor(value,key)||{value:value[key]};
if(desc.get){
if(desc.set){
str=ctx.stylize('[Getter/Setter]','special');
}else{
str=ctx.stylize('[Getter]','special');
}
}else{
if(desc.set){
str=ctx.stylize('[Setter]','special');
}
}
if(!hasOwnProperty(visibleKeys,key)){
name='['+key+']';
}
if(!str){
if(ctx.seen.indexOf(desc.value)<0){
if(isNull(recurseTimes)){
str=formatValue(ctx,desc.value,null);
}else{
str=formatValue(ctx,desc.value,recurseTimes-1);
}
if(str.indexOf('\n')>-1){
if(array){
str=str.split('\n').map(function(line){
return' '+line;
}).join('\n').substr(2);
}else{
str='\n'+str.split('\n').map(function(line){
return' '+line;
}).join('\n');
}
}
}else{
str=ctx.stylize('[Circular]','special');
}
}
if(isUndefined(name)){
if(array&&key.match(/^\d+$/)){
return str;
}
name=JSON.stringify(''+key);
if(name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)){
name=name.substr(1,name.length-2);
name=ctx.stylize(name,'name');
}else{
name=name.replace(/'/g,"\\'").
replace(/\\"/g,'"').
replace(/(^"|"$)/g,"'");
name=ctx.stylize(name,'string');
}
}
return name+': '+str;
}
function reduceToSingleString(output,base,braces){
var numLinesEst=0;
var length=output.reduce(function(prev,cur){
numLinesEst++;
if(cur.indexOf('\n')>=0)numLinesEst++;
return prev+cur.replace(/\u001b\[\d\d?m/g,'').length+1;
},0);
if(length>60){
return braces[0]+(
base===''?'':base+'\n ')+
' '+
output.join(',\n ')+
' '+
braces[1];
}
return braces[0]+base+' '+output.join(', ')+' '+braces[1];
}
function isArray(ar){
return Array.isArray(ar);
}
function isBoolean(arg){
return typeof arg==='boolean';
}
function isNull(arg){
return arg===null;
}
function isNullOrUndefined(arg){
return arg==null;
}
function isNumber(arg){
return typeof arg==='number';
}
function isString(arg){
return typeof arg==='string';
}
function isSymbol(arg){
return typeof arg==='symbol';
}
function isUndefined(arg){
return arg===void 0;
}
function isRegExp(re){
return isObject(re)&&objectToString(re)==='[object RegExp]';
}
function isObject(arg){
return typeof arg==='object'&&arg!==null;
}
function isDate(d){
return isObject(d)&&objectToString(d)==='[object Date]';
}
function isError(e){
return isObject(e)&&(
objectToString(e)==='[object Error]'||e instanceof Error);
}
function isFunction(arg){
return typeof arg==='function';
}
function isPrimitive(arg){
return arg===null||
typeof arg==='boolean'||
typeof arg==='number'||
typeof arg==='string'||
typeof arg==='symbol'||
typeof arg==='undefined';
}
function objectToString(o){
return Object.prototype.toString.call(o);
}
function hasOwnProperty(obj,prop){
return Object.prototype.hasOwnProperty.call(obj,prop);
}
return inspect;
}();
var OBJECT_COLUMN_NAME='(index)';
var LOG_LEVELS={
trace:0,
info:1,
warn:2,
error:3};
function setupConsole(global){
if(!global.nativeLoggingHook){
return;
}
function getNativeLogFunction(level){
return function(){
var str=void 0;
if(arguments.length===1&&typeof arguments[0]==='string'){
str=arguments[0];
}else{
str=Array.prototype.map.call(arguments,function(arg){
return inspect(arg,{depth:10});
}).join(', ');
}
var logLevel=level;
if(str.slice(0,9)==='Warning: '&&logLevel>=LOG_LEVELS.error){
logLevel=LOG_LEVELS.warn;
}
global.nativeLoggingHook(str,logLevel);
};
}
function repeat(element,n){
return Array.apply(null,Array(n)).map(function(){return element;});
};
function consoleTablePolyfill(rows){
if(!Array.isArray(rows)){
var data=rows;
rows=[];
for(var key in data){
if(data.hasOwnProperty(key)){
var row=data[key];
row[OBJECT_COLUMN_NAME]=key;
rows.push(row);
}
}
}
if(rows.length===0){
global.nativeLoggingHook('',LOG_LEVELS.info);
return;
}
var columns=Object.keys(rows[0]).sort();
var stringRows=[];
var columnWidths=[];
columns.forEach(function(k,i){
columnWidths[i]=k.length;
for(var j=0;j<rows.length;j++){
var cellStr=(rows[j][k]||'?').toString();
stringRows[j]=stringRows[j]||[];
stringRows[j][i]=cellStr;
columnWidths[i]=Math.max(columnWidths[i],cellStr.length);
}
});
function joinRow(row,space){
var cells=row.map(function(cell,i){
var extraSpaces=repeat(' ',columnWidths[i]-cell.length).join('');
return cell+extraSpaces;
});
space=space||' ';
return cells.join(space+'|'+space);
};
var separators=columnWidths.map(function(columnWidth){
return repeat('-',columnWidth).join('');
});
var separatorRow=joinRow(separators,'-');
var header=joinRow(columns);
var table=[header,separatorRow];
for(var i=0;i<rows.length;i++){
table.push(joinRow(stringRows[i]));
}
global.nativeLoggingHook('\n'+table.join('\n'),LOG_LEVELS.info);
}
var originalConsole=global.console;
var descriptor=Object.getOwnPropertyDescriptor(global,'console');
if(descriptor){
Object.defineProperty(global,'originalConsole',descriptor);
}
global.console={
error:getNativeLogFunction(LOG_LEVELS.error),
info:getNativeLogFunction(LOG_LEVELS.info),
log:getNativeLogFunction(LOG_LEVELS.info),
warn:getNativeLogFunction(LOG_LEVELS.warn),
trace:getNativeLogFunction(LOG_LEVELS.trace),
debug:getNativeLogFunction(LOG_LEVELS.trace),
table:consoleTablePolyfill};
if(__DEV__&&originalConsole){
Object.keys(console).forEach(function(methodName){
var reactNativeMethod=console[methodName];
if(originalConsole[methodName]){
console[methodName]=function(){
originalConsole[methodName].apply(originalConsole,arguments);
reactNativeMethod.apply(console,arguments);
};
}
});
}
}
if(typeof module!=='undefined'){
module.exports=setupConsole;
}else{
setupConsole(global);
}
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
var _inGuard=0;
var _globalHandler=function onError(e){
throw e;
};
var ErrorUtils={
setGlobalHandler:function setGlobalHandler(fun){
_globalHandler=fun;
},
getGlobalHandler:function getGlobalHandler(){
return _globalHandler;
},
reportError:function reportError(error){
_globalHandler&&_globalHandler(error);
},
reportFatalError:function reportFatalError(error){
_globalHandler&&_globalHandler(error,true);
},
applyWithGuard:function applyWithGuard(fun,context,args){
try{
_inGuard++;
return fun.apply(context,args);
}catch(e){
ErrorUtils.reportError(e);
}finally{
_inGuard--;
}
},
applyWithGuardIfNeeded:function applyWithGuardIfNeeded(fun,context,args){
if(ErrorUtils.inGuard()){
return fun.apply(context,args);
}else{
ErrorUtils.applyWithGuard(fun,context,args);
}
},
inGuard:function inGuard(){
return _inGuard;
},
guard:function guard(fun,name,context){
if(typeof fun!=='function'){
console.warn('A function must be passed to ErrorUtils.guard, got ',fun);
return null;
}
name=name||fun.name||'<generated guard>';
function guarded(){
return(
ErrorUtils.applyWithGuard(
fun,
context||this,
arguments,
null,
name));
}
return guarded;
}};
global.ErrorUtils=ErrorUtils;
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
if(Number.EPSILON===undefined){
Object.defineProperty(Number,'EPSILON',{
value:Math.pow(2,-52)});
}
if(Number.MAX_SAFE_INTEGER===undefined){
Object.defineProperty(Number,'MAX_SAFE_INTEGER',{
value:Math.pow(2,53)-1});
}
if(Number.MIN_SAFE_INTEGER===undefined){
Object.defineProperty(Number,'MIN_SAFE_INTEGER',{
value:-(Math.pow(2,53)-1)});
}
if(!Number.isNaN){(function(){
var globalIsNaN=global.isNaN;
Object.defineProperty(Number,'isNaN',{
configurable:true,
enumerable:false,
value:function isNaN(value){
return typeof value==='number'&&globalIsNaN(value);
},
writable:true});})();
}
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
if(!String.prototype.startsWith){
String.prototype.startsWith=function(search){
'use strict';
if(this==null){
throw TypeError();
}
var string=String(this);
var pos=arguments.length>1?
Number(arguments[1])||0:0;
var start=Math.min(Math.max(pos,0),string.length);
return string.indexOf(String(search),pos)===start;
};
}
if(!String.prototype.endsWith){
String.prototype.endsWith=function(search){
'use strict';
if(this==null){
throw TypeError();
}
var string=String(this);
var stringLength=string.length;
var searchString=String(search);
var pos=arguments.length>1?
Number(arguments[1])||0:stringLength;
var end=Math.min(Math.max(pos,0),stringLength);
var start=end-searchString.length;
if(start<0){
return false;
}
return string.lastIndexOf(searchString,start)===start;
};
}
if(!String.prototype.repeat){
String.prototype.repeat=function(count){
'use strict';
if(this==null){
throw TypeError();
}
var string=String(this);
count=Number(count)||0;
if(count<0||count===Infinity){
throw RangeError();
}
if(count===1){
return string;
}
var result='';
while(count){
if(count&1){
result+=string;
}
if(count>>=1){
string+=string;
}
}
return result;
};
}
if(!String.prototype.includes){
String.prototype.includes=function(search,start){
'use strict';
if(typeof start!=='number'){
start=0;
}
if(start+search.length>this.length){
return false;
}else{
return this.indexOf(search,start)!==-1;
}
};
}
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
function findIndex(predicate,context){
if(this==null){
throw new TypeError(
'Array.prototype.findIndex called on null or undefined');
}
if(typeof predicate!=='function'){
throw new TypeError('predicate must be a function');
}
var list=Object(this);
var length=list.length>>>0;
for(var i=0;i<length;i++){
if(predicate.call(context,list[i],i,list)){
return i;
}
}
return-1;
}
if(!Array.prototype.findIndex){
Object.defineProperty(Array.prototype,'findIndex',{
enumerable:false,
writable:true,
configurable:true,
value:findIndex});
}
if(!Array.prototype.find){
Object.defineProperty(Array.prototype,'find',{
enumerable:false,
writable:true,
configurable:true,
value:function value(predicate,context){
if(this==null){
throw new TypeError(
'Array.prototype.find called on null or undefined');
}
var index=findIndex.call(this,predicate,context);
return index===-1?undefined:this[index];
}});
}
if(!Array.prototype.includes){
Object.defineProperty(Array.prototype,'includes',{
enumerable:false,
writable:true,
configurable:true,
value:function value(searchElement){
var O=Object(this);
var len=parseInt(O.length)||0;
if(len===0){
return false;
}
var n=parseInt(arguments[1])||0;
var k;
if(n>=0){
k=n;
}else{
k=len+n;
if(k<0){
k=0;
}
}
var currentElement;
while(k<len){
currentElement=O[k];
if(searchElement===currentElement||
searchElement!==searchElement&&currentElement!==currentElement){
return true;
}
k++;
}
return false;
}});
}
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
if(!Array.from){
Array.from=function(arrayLike){
if(arrayLike==null){
throw new TypeError('Object is null or undefined');
}
var mapFn=arguments[1];
var thisArg=arguments[2];
var C=this;
var items=Object(arrayLike);
var symbolIterator=typeof Symbol==='function'?typeof Symbol==='function'?
Symbol.iterator:'@@iterator':
'@@iterator';
var mapping=typeof mapFn==='function';
var usingIterator=typeof items[symbolIterator]==='function';
var key=0;
var ret;
var value;
if(usingIterator){
ret=typeof C==='function'?
new C():
[];
var it=items[symbolIterator]();
var next;
while(!(next=it.next()).done){
value=next.value;
if(mapping){
value=mapFn.call(thisArg,value,key);
}
ret[key]=value;
key+=1;
}
ret.length=key;
return ret;
}
var len=items.length;
if(isNaN(len)||len<0){
len=0;
}
ret=typeof C==='function'?
new C(len):
new Array(len);
while(key<len){
value=items[key];
if(mapping){
value=mapFn.call(thisArg,value,key);
}
ret[key]=value;
key+=1;
}
ret.length=key;
return ret;
};
}
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
(function(){
var hasOwnProperty=Object.prototype.hasOwnProperty;
if(typeof Object.entries!=='function'){
Object.entries=function(object){
if(object==null){
throw new TypeError('Object.entries called on non-object');
}
var entries=[];
for(var key in object){
if(hasOwnProperty.call(object,key)){
entries.push([key,object[key]]);
}
}
return entries;
};
}
if(typeof Object.values!=='function'){
Object.values=function(object){
if(object==null){
throw new TypeError('Object.values called on non-object');
}
var values=[];
for(var key in object){
if(hasOwnProperty.call(object,key)){
values.push(object[key]);
}
}
return values;
};
}
})();
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
(function(global) {
var babelHelpers=global.babelHelpers={};
babelHelpers.createRawReactElement=function(){
var REACT_ELEMENT_TYPE=typeof Symbol==="function"&&(typeof Symbol==="function"?Symbol.for:"@@for")&&(typeof Symbol==="function"?Symbol.for:"@@for")("react.element")||0xeac7;
return function createRawReactElement(type,key,props){
return{
$$typeof:REACT_ELEMENT_TYPE,
type:type,
key:key,
ref:null,
props:props,
_owner:null};
};
}();
babelHelpers.classCallCheck=function(instance,Constructor){
if(!(instance instanceof Constructor)){
throw new TypeError("Cannot call a class as a function");
}
};
babelHelpers.createClass=function(){
function defineProperties(target,props){
for(var i=0;i<props.length;i++){
var descriptor=props[i];
descriptor.enumerable=descriptor.enumerable||false;
descriptor.configurable=true;
if("value"in descriptor)descriptor.writable=true;
Object.defineProperty(target,descriptor.key,descriptor);
}
}
return function(Constructor,protoProps,staticProps){
if(protoProps)defineProperties(Constructor.prototype,protoProps);
if(staticProps)defineProperties(Constructor,staticProps);
return Constructor;
};
}();
babelHelpers.defineProperty=function(obj,key,value){
if(key in obj){
Object.defineProperty(obj,key,{
value:value,
enumerable:true,
configurable:true,
writable:true});
}else{
obj[key]=value;
}
return obj;
};
babelHelpers._extends=babelHelpers.extends=Object.assign||function(target){
for(var i=1;i<arguments.length;i++){
var source=arguments[i];
for(var key in source){
if(Object.prototype.hasOwnProperty.call(source,key)){
target[key]=source[key];
}
}
}
return target;
};
babelHelpers.get=function get(object,property,receiver){
if(object===null)object=Function.prototype;
var desc=Object.getOwnPropertyDescriptor(object,property);
if(desc===undefined){
var parent=Object.getPrototypeOf(object);
if(parent===null){
return undefined;
}else{
return get(parent,property,receiver);
}
}else if("value"in desc){
return desc.value;
}else{
var getter=desc.get;
if(getter===undefined){
return undefined;
}
return getter.call(receiver);
}
};
babelHelpers.inherits=function(subClass,superClass){
if(typeof superClass!=="function"&&superClass!==null){
throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);
}
subClass.prototype=Object.create(superClass&&superClass.prototype,{
constructor:{
value:subClass,
enumerable:false,
writable:true,
configurable:true}});
if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;
};
babelHelpers.interopRequireDefault=function(obj){
return obj&&obj.__esModule?obj:{
default:obj};
};
babelHelpers.interopRequireWildcard=function(obj){
if(obj&&obj.__esModule){
return obj;
}else{
var newObj={};
if(obj!=null){
for(var key in obj){
if(Object.prototype.hasOwnProperty.call(obj,key))newObj[key]=obj[key];
}
}
newObj.default=obj;
return newObj;
}
};
babelHelpers.objectWithoutProperties=function(obj,keys){
var target={};
for(var i in obj){
if(keys.indexOf(i)>=0)continue;
if(!Object.prototype.hasOwnProperty.call(obj,i))continue;
target[i]=obj[i];
}
return target;
};
babelHelpers.possibleConstructorReturn=function(self,call){
if(!self){
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call&&(typeof call==="object"||typeof call==="function")?call:self;
};
babelHelpers.slicedToArray=function(){
function sliceIterator(arr,i){
var _arr=[];
var _n=true;
var _d=false;
var _e=undefined;
try{
for(var _i=arr[typeof Symbol==="function"?Symbol.iterator:"@@iterator"](),_s;!(_n=(_s=_i.next()).done);_n=true){
_arr.push(_s.value);
if(i&&_arr.length===i)break;
}
}catch(err){
_d=true;
_e=err;
}finally{
try{
if(!_n&&_i["return"])_i["return"]();
}finally{
if(_d)throw _e;
}
}
return _arr;
}
return function(arr,i){
if(Array.isArray(arr)){
return arr;
}else if((typeof Symbol==="function"?Symbol.iterator:"@@iterator")in Object(arr)){
return sliceIterator(arr,i);
}else{
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
};
}();
babelHelpers.taggedTemplateLiteral=function(strings,raw){
return Object.freeze(Object.defineProperties(strings,{
raw:{
value:Object.freeze(raw)}}));
};
babelHelpers.toArray=function(arr){
return Array.isArray(arr)?arr:Array.from(arr);
};
babelHelpers.toConsumableArray=function(arr){
if(Array.isArray(arr)){
for(var i=0,arr2=Array(arr.length);i<arr.length;i++){arr2[i]=arr[i];}
return arr2;
}else{
return Array.from(arr);
}
};
})(typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : this);
__d(0 /* DBMonster/vr/client.js */, function(global, require, module, exports) {
var _reactVrWeb=require(12 /* ./../custom-react-vr/react-vr-web */);
function init(bundle,parent,options){
var vr=new _reactVrWeb.VRInstance(bundle,'DBMonster',parent,babelHelpers.extends({},
options));
vr.render=function(){
};
vr.start();
return vr;
}
window.ReactVR={init:init};
}, "DBMonster/vr/client.js");
__d(12 /* ReactVRApp */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});exports.VRInstance=exports.ReactNativeContext=exports.Module=exports.createRootView=exports.bundleFromRoot=undefined;
var _bundleFromRoot=require(13 /* ./js/bundleFromRoot */);var _bundleFromRoot2=babelHelpers.interopRequireDefault(_bundleFromRoot);
var _createRootView=require(14 /* ./js/createRootView */);var _createRootView2=babelHelpers.interopRequireDefault(_createRootView);
var _Module=require(17 /* ./js/Modules/Module */);var _Module2=babelHelpers.interopRequireDefault(_Module);
var _VRInstance=require(87 /* ./js/VRInstance */);var _VRInstance2=babelHelpers.interopRequireDefault(_VRInstance);
var _ReactNativeContext=require(15 /* ./js/ReactNativeContext */);exports.
bundleFromRoot=_bundleFromRoot2.default;exports.
createRootView=_createRootView2.default;exports.
Module=_Module2.default;exports.
ReactNativeContext=_ReactNativeContext.ReactNativeContext;exports.
VRInstance=_VRInstance2.default;
}, "ReactVRApp");
__d(13 /* react-vr-web/js/bundleFromRoot.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});exports.default=
bundleFromRoot;function bundleFromRoot(root){
var path=location.pathname;
if(!path.endsWith('/')){
path=path.substr(0,path.lastIndexOf('/'));
}else{
path=path.substr(0,path.length-1);
}
return location.protocol+'//'+location.host+path+'/'+root;
}
}, "react-vr-web/js/bundleFromRoot.js");
__d(14 /* react-vr-web/js/createRootView.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});exports.default=
createRootView;var _ReactNativeContext=require(15 /* ./ReactNativeContext */);var DEVTOOLS_FLAG=/\bdevtools\b/;var HOTRELOAD_FLAG=/\bhotreload\b/;var BRIDGE_CODE='\nvar Status = undefined;\n\nonmessage = function(e) {\n var msg = JSON.parse(e.data);\n if (!msg || !msg.cmd) {\n return;\n }\n if (msg.cmd === \'moduleConfig\' ) {\n __fbBatchedBridgeConfig = msg.moduleConfig;\n Status = \'moduleConfig\';\n } else\n if (msg.cmd === \'bundle\' && Status === \'moduleConfig\') {\n try {\n importScripts(msg.bundleName);\n Status = \'bundle\';\n } catch (e) {\n console.warn(e);\n var xmlhttp = new XMLHttpRequest();\n xmlhttp.open("GET", msg.bundleName, true);\n xmlhttp.onreadystatechange=function() {\n if (xmlhttp.readyState == 4) {\n var result = JSON.parse(xmlhttp.responseText);\n if (result) {\n if (result.type === \'UnableToResolveError\' || result.type === \'NotFoundError\') {\n console.warn(result.message);\n } else {\n if (result.snippet) {\n // remove all color characters and split the lines for improved clarity\n result.snippet = result.snippet.replace(/\\u001b\\[.*?m/g, \'\').split(\'\\n\');\n }\n if (result.filename && result.filename.indexOf(\':\') <= 2) {\n result.filename = \'file:///\' + result.filename;\n }\n if (result.errors) {\n for (var i=0; i<result.errors.length; i++) {\n var error = result.errors[i];\n if (error.filename && error.filename.indexOf(\':\') <= 2) {\n error.filename = \'file:///\' + error.filename;\n }\n }\n }\n console.warn(JSON.stringify(result, undefined, 2));\n }\n }\n }\n }\n xmlhttp.send(null);\n }\n } else if (Status === \'bundle\') {\n if (msg.cmd === \'exec\') {\n var results = __fbBatchedBridge.callFunctionReturnFlushedQueue.apply(null, [msg.module, msg.function, msg.args]);\n try {\n postMessage(JSON.stringify({cmd: \'exec\', results: results}));\n } catch (e) {\n console.warn(e);\n console.warn(msg);\n console.warn(JSON.stringify(results))\n }\n } else\n if (msg.cmd === \'invoke\') {\n var results = __fbBatchedBridge.invokeCallbackAndReturnFlushedQueue.apply(null, [msg.id, msg.args]);\n try {\n postMessage(JSON.stringify({cmd: \'exec\', results: results}));\n } catch (e) {\n console.warn(e);\n console.warn(msg);\n console.warn(JSON.stringify(results))\n }\n } else\n if (msg.cmd === \'flush\') {\n var results = __fbBatchedBridge.flushedQueue.apply(null);\n try {\n postMessage(JSON.stringify({cmd: \'exec\', results: results}));\n } catch (e) {\n console.warn(e);\n console.warn(msg);\n console.warn(JSON.stringify(results))\n }\n }\n }\n}\n';if(__DEV__){if(DEVTOOLS_FLAG.test(location.search)){BRIDGE_CODE+='__DEVTOOLS__ = true;\n';if(window.__REACT_DEVTOOLS_GLOBAL_HOOK__){console.log('We detected that you have the React Devtools extension installed. '+'Please note that at this time, React VR is only compatible with the '+'standalone React Native Inspector that ships with Nuclide.');}}}function createRootView(guisys,name){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};
if(!guisys){
throw new Error('ReactVR Root View must attach to an OVRUI GUI!');
}
if(!name||typeof name!=='string'){
throw new Error(
'ReactVR Root View must have a module name to mount');
}
var initialProps=options.initialProps||{};
var contextOptions={
isLowLatency:options.isLowLatency};
if(options.assetRoot){
contextOptions.assetRoot=options.assetRoot;
}
if(HOTRELOAD_FLAG.test(location.search)){
contextOptions.enableHotReload=true;
}
if(options.enableHotReload){
contextOptions.enableHotReload=options.enableHotReload;
}
var bundleURL=options.bundle||'../index.bundle?platform=vr';
if(contextOptions.enableHotReload){
bundleURL+='&hot=true';
}
var bridgeCodeBlob=new Blob([BRIDGE_CODE]);
var rn=new _ReactNativeContext.ReactNativeContext(
guisys,
URL.createObjectURL(bridgeCodeBlob),
contextOptions);
if(Array.isArray(options.nativeModules)){
for(var _iterator=options.nativeModules,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[typeof Symbol==='function'?Symbol.iterator:'@@iterator']();;){var _ref;if(_isArray){if(_i>=_iterator.length)break;_ref=_iterator[_i++];}else{_i=_iterator.next();if(_i.done)break;_ref=_i.value;}var module=_ref;
rn.registerModule(module);
}
}
rn.init(bundleURL);
rn.createRootView(name,initialProps);
return{
context:rn,
frame:function frame(camera){
rn.frame(camera);
}};
}
}, "react-vr-web/js/createRootView.js");
__d(15 /* react-vr-web/js/ReactNativeContext.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});exports.ReactNativeContext=undefined;
var _AndroidConstants=require(16 /* ./Modules/AndroidConstants */);var _AndroidConstants2=babelHelpers.interopRequireDefault(_AndroidConstants);
var _AsyncLocalStorage=require(18 /* ./Modules/AsyncLocalStorage */);var _AsyncLocalStorage2=babelHelpers.interopRequireDefault(_AsyncLocalStorage);
var _ExternalAssets=require(19 /* ./Modules/ExternalAssets */);var _ExternalAssets2=babelHelpers.interopRequireDefault(_ExternalAssets);
var _History=require(20 /* ./Modules/History */);var _History2=babelHelpers.interopRequireDefault(_History);
var _LinkingManager=require(21 /* ./Modules/LinkingManager */);var _LinkingManager2=babelHelpers.interopRequireDefault(_LinkingManager);
var _Networking=require(22 /* ./Modules/Networking */);var _Networking2=babelHelpers.interopRequireDefault(_Networking);
var _RCTResourceManager=require(23 /* ./Utils/RCTResourceManager */);
var _RCTInputControls=require(24 /* ./Utils/RCTInputControls */);
var _RCTHeadModel=require(53 /* ./Utils/RCTHeadModel */);
var _RCTVideoModule=require(54 /* ./Modules/RCTVideoModule */);var _RCTVideoModule2=babelHelpers.interopRequireDefault(_RCTVideoModule);
var _RCTAudioModule=require(55 /* ./Modules/RCTAudioModule */);var _RCTAudioModule2=babelHelpers.interopRequireDefault(_RCTAudioModule);
var _Timing=require(60 /* ./Modules/Timing */);var _Timing2=babelHelpers.interopRequireDefault(_Timing);
var _UIManager=require(61 /* ./Modules/UIManager */);var _UIManager2=babelHelpers.interopRequireDefault(_UIManager);
var _WebSocketModule=require(83 /* ./Modules/WebSocketModule */);var _WebSocketModule2=babelHelpers.interopRequireDefault(_WebSocketModule);
var _ReactVRConstants=require(84 /* ./Modules/ReactVRConstants */);var _ReactVRConstants2=babelHelpers.interopRequireDefault(_ReactVRConstants);
var _RCTExceptionsManager=require(85 /* ./Modules/RCTExceptionsManager */);var _RCTExceptionsManager2=babelHelpers.interopRequireDefault(_RCTExceptionsManager);
var _RCTSourceCode=require(86 /* ./Modules/RCTSourceCode */);var _RCTSourceCode2=babelHelpers.interopRequireDefault(_RCTSourceCode);
var _ovrui=require(25 /* ovrui */);var OVRUI=babelHelpers.interopRequireWildcard(_ovrui);
var _three=require(30 /* three */);var THREE=babelHelpers.interopRequireWildcard(_three);
var ROOT_VIEW_INCREMENT=10;
function replaceHiddenAttributes(key,value){
if(key.charAt&&key.charAt(0)==='_'){
return undefined;
}else{
return value;
}
}
function describe(ctx){
var remoteModuleConfig=[];
for(var m in ctx.modules){
var module=ctx.modules[m]._describe();
if(__DEV__){
console.log(module);
}
remoteModuleConfig.push(module);
}
return remoteModuleConfig;
}var
ReactNativeContext=exports.ReactNativeContext=function(){
function ReactNativeContext(guiSys,bridgeURL){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};babelHelpers.classCallCheck(this,ReactNativeContext);
this.modules=[];
this.currentRootTag=1;
this.worker=new Worker(bridgeURL);
this.guiSys=guiSys;
this.messages=[];
this.isLowLatency=!!options.isLowLatency;
this.enableHotReload=!!options.enableHotReload;
this.lastHit=null;
this.lastHitType=OVRUI.GuiSysHitType.GAZE;
this.UIManager=new _UIManager2.default(this,guiSys);
this.Timing=new _Timing2.default(this);
this.RCTResourceManager=new _RCTResourceManager.RCTResourceManager();
this.RCTInputControls=new _RCTInputControls.RCTInputControls(this,guiSys);
this.HeadModel=new _RCTHeadModel.RCTHeadModel(this);
this.VideoModule=new _RCTVideoModule2.default(this);
this.AudioModule=new _RCTAudioModule2.default(this);
this._moduleForTag=[];
this._cameraParentFromTag=[];
this.registerModule(this.UIManager);
this.registerModule(new _AndroidConstants2.default(this));
this.registerModule(new _AsyncLocalStorage2.default(this));
this.registerModule(new _History2.default(this));
this.registerModule(new _Networking2.default(this));
this.registerModule(new _LinkingManager2.default(this));
this.registerModule(this.Timing);
this.registerModule(this.VideoModule);
this.registerModule(this.AudioModule);
this.registerModule(new _WebSocketModule2.default(this));
this.registerModule(new _ReactVRConstants2.default());
this.registerModule(new _RCTExceptionsManager2.default());
this.registerModule(new _RCTSourceCode2.default());
this.registerModule(new _ExternalAssets2.default(options.assetRoot));
guiSys.eventDispatcher.addEventListener('GuiSysEvent',this._onGuiSysEvent.bind(this));
guiSys.eventDispatcher.addEventListener('UIViewEvent',this._onUIViewEvent.bind(this));
(function(self){
self.worker.onmessage=function(e)
{
var msg=JSON.parse(e.data);
if(!msg||!msg.cmd){
return;
}
if(msg.cmd==='exec'){
var results=msg.results;
if(results&&results.length){
self.messages.push(results);
}
}
};
})(this);
}babelHelpers.createClass(ReactNativeContext,[{key:'init',value:function init(
bundle){
this.worker.postMessage(
JSON.stringify({cmd:'moduleConfig',moduleConfig:{
remoteModuleConfig:describe(this)}},
replaceHiddenAttributes));
this.worker.postMessage(JSON.stringify({cmd:'bundle',bundleName:bundle}));
if(this.enableHotReload){
var bundleURL=new URL(bundle);
console.warn('HotReload on '+bundle);
this.callFunction(
'HMRClient',
'enable',
[
'vr',
bundleURL.pathname.toString().substr(1),
bundleURL.hostname,
bundleURL.port]);
}
}},{key:'shutdown',value:function shutdown()
{
for(var m in this.modules){
this.modules[m].shutdown&&this.modules[m].shutdown();
}
}},{key:'createRootView',value:function createRootView(
module,props){
var tag=this.currentRootTag;
this.currentRootTag+=ROOT_VIEW_INCREMENT;
this.worker.postMessage(JSON.stringify({
cmd:'exec',
module:'AppRegistry',
function:'runApplication',
args:[module,{initialProps:props,rootTag:tag}]}));
this._moduleForTag[tag]=module;
this._cameraParentFromTag[tag]=new THREE.Object3D();
this.UIManager.createRootView(tag);
return tag;
}},{key:'updateRootView',value:function updateRootView(
tag,props){
this.worker.postMessage(JSON.stringify({
cmd:'exec',
module:'AppRegistry',
function:'runApplication',
args:[this._moduleForTag[tag],{initialProps:props,rootTag:tag}]}));
}},{key:'destroyRootView',value:function destroyRootView(
tag){
delete this._moduleForTag[tag];
var cameraParent=this._cameraParentFromTag[tag];
if(cameraParent){
for(var _iterator=cameraParent.children,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[typeof Symbol==='function'?Symbol.iterator:'@@iterator']();;){var _ref;if(_isArray){if(_i>=_iterator.length)break;_ref=_iterator[_i++];}else{_i=_iterator.next();if(_i.done)break;_ref=_i.value;}var child=_ref;
cameraParent.remove(child);
}
delete this._cameraParentFromTag[tag];
}
this.worker.postMessage(JSON.stringify({
cmd:'exec',
module:'AppRegistry',
function:'unmountApplicationComponentAtRootTag',
args:[tag]}));
}},{key:'_onGuiSysEvent',value:function _onGuiSysEvent(
event){
switch(event.eventType){
case OVRUI.GuiSysEventType.HIT_CHANGED:
if(this.lastHit!==event.args.currentHit||this.lastHitType!==event.args.currentHitType){
this.lastHit=event.args.currentHit;
this.lastHitType=event.args.currentHitType;
}
break;
default:
break;}
}},{key:'_onUIViewEvent',value:function _onUIViewEvent(
event){
switch(event.eventType){
case OVRUI.UIViewEventType.FOCUS_LOST:
{
var viewTag=event.view?this.getHitTag(event.view):undefined;
var targetTag=event.args.target?this.getHitTag(event.args.target):undefined;
if(viewTag){
if(event.args.hitType===OVRUI.GuiSysHitType.GAZE){
this.callFunction(
'RCTEventEmitter',
'receiveEvent',
[viewTag,'topGazeExit',[targetTag]]);
}
if(event.args.hitType===OVRUI.GuiSysHitType.MOUSE){
this.callFunction(
'RCTEventEmitter',
'receiveEvent',
[viewTag,'topMouseExit',[targetTag]]);
}
this.callFunction(
'RCTEventEmitter',
'receiveEvent',
[viewTag,'topExit',[targetTag]]);
}
}
break;
case OVRUI.UIViewEventType.FOCUS_GAINED:
{
var _viewTag=event.view?this.getHitTag(event.view):undefined;
var _targetTag=event.args.target?this.getHitTag(event.args.target):undefined;
if(_viewTag){
if(event.args.hitType===OVRUI.GuiSysHitType.GAZE){
this.callFunction(
'RCTEventEmitter',
'receiveEvent',
[_viewTag,'topGazeEnter',[_targetTag]]);
}
if(event.args.hitType===OVRUI.GuiSysHitType.MOUSE){
this.callFunction(
'RCTEventEmitter',
'receiveEvent',
[_viewTag,'topMouseEnter',[_targetTag]]);
}
this.callFunction(
'RCTEventEmitter',
'receiveEvent',
[_viewTag,'topEnter',[_targetTag]]);
}
}
break;
default:
break;}
}},{key:'frame',value:function frame(
camera,rootTag){
var frameStart=window.performance?performance.now():Date.now();
this.Timing&&this.Timing.frame(frameStart);
this.worker.postMessage(JSON.stringify({
cmd:'flush'}));
for(var index in this.messages){
var results=this.messages[index];
if(results&&results.length>=3){
var moduleIndex=results[0];
var funcIndex=results[1];
var params=results[2];
for(var i=0;i<moduleIndex.length;i++)
{
this.modules[moduleIndex[i]].
_functionMap[funcIndex[i]].
apply(this.modules[moduleIndex[i]],params[i]);
}
}
}
this.messages=[];
this.UIManager&&this.UIManager.frame();
this.HeadModel&&this.HeadModel.frame(camera);
this.VideoModule&&this.VideoModule.frame();
this.AudioModule&&this.AudioModule.frame(camera);
this._applySceneTransform(camera,rootTag);
this.Timing&&this.Timing.idle(frameStart);
}},{key:'_applySceneTransform',value:function _applySceneTransform(
camera,rootTag){
var worldMatrix=this.UIManager.getSceneCameraTransform(rootTag);
var cameraParent=this._cameraParentFromTag[rootTag];
if(!worldMatrix||!cameraParent){
return;
}
if(camera.parent&&camera.parent.uuid!==cameraParent.uuid){
console.warn('Camera object already has a parent; '+
'Use of \'transform\' property on <Scene> will have no effect.');
this._cameraParentFromTag[rootTag]=null;
return;
}
if(cameraParent.children.length===0){
cameraParent.add(camera);
}
cameraParent.matrixAutoUpdate=false;
cameraParent.matrix.fromArray(worldMatrix);
cameraParent.updateMatrixWorld(true);
}},{key:'getHitTag',value:function getHitTag(
hit){
while(hit){
if(hit.tag){
return hit.tag;
}
hit=hit.parent;
}
return undefined;
}},{key:'callFunction',value:function callFunction(
moduleName,functionName,args){
this.worker.postMessage(JSON.stringify({
cmd:'exec',
module:moduleName,
function:functionName,
args:args}));
}},{key:'invokeCallback',value:function invokeCallback(
id,args){
this.worker.postMessage(JSON.stringify({
cmd:'invoke',
id:id,
args:args}));
}},{key:'registerModule',value:function registerModule(
module){
this.modules.push(module);
}}]);return ReactNativeContext;}();
}, "react-vr-web/js/ReactNativeContext.js");
__d(16 /* react-vr-web/js/Modules/AndroidConstants.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});
var _Module2=require(17 /* ./Module */);var _Module3=babelHelpers.interopRequireDefault(_Module2);var
AndroidConstants=function(_Module){babelHelpers.inherits(AndroidConstants,_Module);
function AndroidConstants(){babelHelpers.classCallCheck(this,AndroidConstants);var _this=babelHelpers.possibleConstructorReturn(this,(AndroidConstants.__proto__||Object.getPrototypeOf(AndroidConstants)).call(this,
'AndroidConstants'));
_this.Version=22;return _this;
}return AndroidConstants;}(_Module3.default);exports.default=AndroidConstants;
}, "react-vr-web/js/Modules/AndroidConstants.js");
__d(17 /* react-vr-web/js/Modules/Module.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});var
Module=function(){
function Module(name){babelHelpers.classCallCheck(this,Module);
if(name.startsWith('RCT')){
name=name.substr(3);
}
this.name=name;
this._functionMap=[];
}babelHelpers.createClass(Module,[{key:'getName',value:function getName()
{
return this.name;
}},{key:'_describe',value:function _describe()
{
var constants={};
var functions=[];
var promiseFunctions=[];
var syncFunctions=[];
var methodID=0;
var proto=Object.getPrototypeOf(this);
var protoMembers=Object.getOwnPropertyNames(proto);
for(var _iterator=protoMembers,_isArray=Array.isArray(_iterator),_i=0,_iterator=_isArray?_iterator:_iterator[typeof Symbol==='function'?Symbol.iterator:'@@iterator']();;){var _ref;if(_isArray){if(_i>=_iterator.length)break;_ref=_iterator[_i++];}else{_i=_iterator.next();if(_i.done)break;_ref=_i.value;}var attr=_ref;
var member=proto[attr];
if(
attr[0]==='_'||
attr==='constructor'||
typeof member!=='function')
{
continue;
}
var name=attr;
if(name[0]==='$'){
name=name.substring(1);
promiseFunctions.push(methodID);
}
this._functionMap[methodID]=member;
functions.push(name);
methodID++;
}
for(var _attr in this){
var member=this[_attr];
if(_attr[0]==='_'||typeof member==='function'){
continue;
}
constants[_attr]=member;
}
return[
this.name,
constants,
functions,
promiseFunctions,
syncFunctions];
}}]);return Module;}();exports.default=Module;
}, "react-vr-web/js/Modules/Module.js");
__d(18 /* react-vr-web/js/Modules/AsyncLocalStorage.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});
var _Module2=require(17 /* ./Module */);var _Module3=babelHelpers.interopRequireDefault(_Module2);var
AsyncLocalStorage=function(_Module){babelHelpers.inherits(AsyncLocalStorage,_Module);
function AsyncLocalStorage(rnctx){babelHelpers.classCallCheck(this,AsyncLocalStorage);var _this=babelHelpers.possibleConstructorReturn(this,(AsyncLocalStorage.__proto__||Object.getPrototypeOf(AsyncLocalStorage)).call(this,
'AsyncLocalStorage'));
_this._rnctx=rnctx;
_this._db=null;return _this;
}babelHelpers.createClass(AsyncLocalStorage,[{key:'_prepareDB',value:function _prepareDB()
{var _this2=this;
return new Promise(function(resolve,reject){
if(_this2._db){
return resolve(_this2._db);
}
var request=window.indexedDB.open('AsyncStorage',1);
request.onerror=function(event){
reject({
message:'Error opening database'});
};
request.onupgradeneeded=function(event){
var db=event.target.result;
_this2._db=db;
db.createObjectStore('pairs',{keyPath:'key'});
resolve(db);
};
request.onsuccess=function(event){
var db=event.target.result;
_this2._db=db;
resolve(db);
};
});
}},{key:'_getRow',value:function _getRow(
objectStore,key){
return new Promise(function(resolve,reject){
var request=objectStore.get(key);
request.onerror=function(event){
reject({
message:event.target.error.name,
key:key});
};
request.onsuccess=function(event){
var row=event.target.result;
if(!row){
resolve([key,undefined]);
}else{
resolve([row.key,row.value]);
}
};
});
}},{key:'_putRow',value:function _putRow(
objectStore,
row)
{
return new Promise(function(resolve,reject){
var request=objectStore.put(row);
request.onerror=function(event){
reject({
message:event.target.error.name,
key:row.key});
};
request.onsuccess=function(){
resolve();
};
});
}},{key:'_deleteRow',value:function _deleteRow(
objectStore,
key)
{
return new Promise(function(resolve,reject){
var request=objectStore.delete(key);
request.onerror=function(event){
reject({
message:event.target.error.name,
key:key});
};
request.onsuccess=function(){
resolve();
};
});
}},{key:'multiGet',value:function multiGet(
keys,cb){var _this3=this;
this._prepareDB().then(function(db){
var transaction=db.transaction(['pairs']);
var objectStore=transaction.objectStore('pairs');
var gets=[];
keys.forEach(function(key){return gets.push(_this3._getRow(objectStore,key));});
return Promise.all(gets);
}).then(function(rows){
_this3._rnctx.invokeCallback(cb,[undefined,rows]);
},function(err){
_this3._rnctx.invokeCallback(cb,[err]);
});
}},{key:'multiSet',value:function multiSet(
pairs,cb){var _this4=this;
this._prepareDB().then(function(db){
var transaction=db.transaction(['pairs'],'readwrite');
var objectStore=transaction.objectStore('pairs');
var puts=[];
pairs.forEach(function(pair){
var row={key:pair[0],value:pair[1]};
puts.push(_this4._putRow(objectStore,row));
});
return Promise.all(puts);
}).then(function(){
_this4._rnctx.invokeCallback(cb,[]);
},function(err){
_this4._rnctx.invokeCallback(cb,[err]);
});
}},{key:'multiRemove',value:function multiRemove(
keys,cb){var _this5=this;
this._prepareDB().then(function(db){
var transaction=db.transaction(['pairs'],'readwrite');
var objectStore=transaction.objectStore('pairs');
var deletes=[];
keys.forEach(function(key){return deletes.push(_this5._deleteRow(objectStore,key));});
return Promise.all(deletes);
}).then(function(){
_this5._rnctx.invokeCallback(cb,[]);
},function(err){
_this5._rnctx.invokeCallback(cb,[err]);
});
}},{key:'clear',value:function clear(
cb){var _this6=this;
this._prepareDB().then(function(db){
return new Promise(function(resolve,reject){
var transaction=db.transaction(['pairs'],'readwrite');
var objectStore=transaction.objectStore('pairs');
var request=objectStore.clear();
request.onerror=function(event){
reject({
message:event.target.error.name});
};
request.onsuccess=function(){
resolve();
};
});
}).then(function(){
_this6._rnctx.invokeCallback(cb,[]);
},function(err){
_this6._rnctx.invokeCallback(cb,[err]);
});
}},{key:'getAllKeys',value:function getAllKeys(
cb){var _this7=this;
this._prepareDB().then(function(db){
return new Promise(function(resolve,reject){
var transaction=db.transaction(['pairs']);
var objectStore=transaction.objectStore('pairs');
var request=objectStore.openCursor();
var keys=[];
request.onerror=function(event){
reject({
message:event.target.error.name});
};
request.onsuccess=function(event){
var cursor=event.target.result;
if(cursor){
keys.push(cursor.key);
cursor.continue();
}else{
resolve(keys);
}
};
});
}).then(function(keys){
_this7._rnctx.invokeCallback(cb,[undefined,keys]);
},function(err){
_this7._rnctx.invokeCallback(cb,[err]);
});
}}]);return AsyncLocalStorage;}(_Module3.default);exports.default=AsyncLocalStorage;
}, "react-vr-web/js/Modules/AsyncLocalStorage.js");
__d(19 /* react-vr-web/js/Modules/ExternalAssets.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});
var _Module2=require(17 /* ./Module */);var _Module3=babelHelpers.interopRequireDefault(_Module2);var
ExternalAssets=function(_Module){babelHelpers.inherits(ExternalAssets,_Module);
function ExternalAssets(assetRoot){babelHelpers.classCallCheck(this,ExternalAssets);var _this=babelHelpers.possibleConstructorReturn(this,(ExternalAssets.__proto__||Object.getPrototypeOf(ExternalAssets)).call(this,
'ExternalAssets'));
_this.assetRoot=assetRoot;return _this;
}return ExternalAssets;}(_Module3.default);exports.default=ExternalAssets;
}, "react-vr-web/js/Modules/ExternalAssets.js");
__d(20 /* react-vr-web/js/Modules/History.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});
var _Module2=require(17 /* ./Module */);var _Module3=babelHelpers.interopRequireDefault(_Module2);var
History=function(_Module){babelHelpers.inherits(History,_Module);
function History(rnctx){babelHelpers.classCallCheck(this,History);var _this=babelHelpers.possibleConstructorReturn(this,(History.__proto__||Object.getPrototypeOf(History)).call(this,
'History'));
_this._rnctx=rnctx;
window.addEventListener('popstate',function(event){
_this._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['historyPopState',{state:event.state}]);
});return _this;
}babelHelpers.createClass(History,[{key:'$length',value:function $length(
success){
this._rnctx.invokeCallback(success,[window.history.length]);
}},{key:'$state',value:function $state(
success){
this._rnctx.invokeCallback(success,[window.history.state]);
}},{key:'$back',value:function $back(
success){
window.history.back();
this._rnctx.invokeCallback(success,[true]);
}},{key:'$forward',value:function $forward(
success){
window.history.forward();
this._rnctx.invokeCallback(success,[true]);
}},{key:'$go',value:function $go(
delta,success){
window.history.go(delta);
this._rnctx.invokeCallback(success,[true]);
}},{key:'$pushState',value:function $pushState()
{var _ref2,_ref3;
if(arguments.length<4){var _ref;
this._rnctx.invokeCallback((_ref=
arguments.length-1,arguments.length<=_ref?undefined:arguments[_ref]),
[new Error('pushState requires at least two arguments')]);
return;
}
var state=arguments.length<=0?undefined:arguments[0];
var title=arguments.length<=1?undefined:arguments[1];
var success=(_ref2=arguments.length-2,arguments.length<=_ref2?undefined:arguments[_ref2]);
var fail=(_ref3=arguments.length-1,arguments.length<=_ref3?undefined:arguments[_ref3]);
var url=arguments.length===4?undefined:arguments.length<=2?undefined:arguments[2];
try{
window.history.pushState(state,title,url);
this._rnctx.invokeCallback(success,[true]);
}catch(e){
this._rnctx.invokeCallback(fail,[e]);
}
}},{key:'$replaceState',value:function $replaceState()
{var _ref5,_ref6;
if(arguments.length<4){var _ref4;
this._rnctx.invokeCallback((_ref4=
arguments.length-1,arguments.length<=_ref4?undefined:arguments[_ref4]),
[new Error('replaceState requires at least two arguments')]);
return;
}
var state=arguments.length<=0?undefined:arguments[0];
var title=arguments.length<=1?undefined:arguments[1];
var success=(_ref5=arguments.length-2,arguments.length<=_ref5?undefined:arguments[_ref5]);
var fail=(_ref6=arguments.length-1,arguments.length<=_ref6?undefined:arguments[_ref6]);
var url=arguments.length===4?undefined:arguments.length<=2?undefined:arguments[2];
try{
window.history.pushState(state,title,url);
this._rnctx.invokeCallback(success,[true]);
}catch(e){
this._rnctx.invokeCallback(fail,[e]);
}
}}]);return History;}(_Module3.default);exports.default=History;
}, "react-vr-web/js/Modules/History.js");
__d(21 /* react-vr-web/js/Modules/LinkingManager.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});
var _Module2=require(17 /* ./Module */);var _Module3=babelHelpers.interopRequireDefault(_Module2);var
LinkingManager=function(_Module){babelHelpers.inherits(LinkingManager,_Module);
function LinkingManager(rnctx){babelHelpers.classCallCheck(this,LinkingManager);var _this=babelHelpers.possibleConstructorReturn(this,(LinkingManager.__proto__||Object.getPrototypeOf(LinkingManager)).call(this,
'LinkingManager'));
_this._rnctx=rnctx;return _this;
}babelHelpers.createClass(LinkingManager,[{key:'$openURL',value:function $openURL(
url,success,fail){
window.location=new URL(url,window.location).toString();
this._rnctx.invokeCallback(success,[true]);
}},{key:'$canOpenURL',value:function $canOpenURL(
url,success,fail){
this._rnctx.invokeCallback(success,[true]);
}}]);return LinkingManager;}(_Module3.default);exports.default=LinkingManager;
}, "react-vr-web/js/Modules/LinkingManager.js");
__d(22 /* react-vr-web/js/Modules/Networking.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});
var _Module2=require(17 /* ./Module */);var _Module3=babelHelpers.interopRequireDefault(_Module2);var
Networking=function(_Module){babelHelpers.inherits(Networking,_Module);
function Networking(rnctx){babelHelpers.classCallCheck(this,Networking);var _this=babelHelpers.possibleConstructorReturn(this,(Networking.__proto__||Object.getPrototypeOf(Networking)).call(this,
'Networking'));
_this._rnctx=rnctx;return _this;
}babelHelpers.createClass(Networking,[{key:'sendRequest',value:function sendRequest(
method,
url,
requestId,
headers,
data,
responseType,
useIncrementalUpdates,
timeout)
{var _this2=this;
method=method.toUpperCase();
if(
method!=='GET'&&
method!=='POST'&&
method!=='PATCH'&&
method!=='PUT'&&
method!=='DELETE')
{
throw new Error('Invalid method type');
}
var options={
method:method,
headers:headers};
if(method==='POST'&&data){
if(data.string){
options.body=data.string;
}else if(data.formData){
var form=new FormData();
for(var i=0;i<data.formData.length;i++){
form.append(data.formData[i].fieldName,data.formData[i].string);
}
options.body=form;
}else if(data.string){
options.body=data.string;
}
}
var request=new Request(url,options);
fetch(request,options).then(function(response){
_this2._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['didReceiveNetworkResponse',[requestId,response.status,[]]]);
return responseType==='text'?
response.text().then(function(text){return _this2._handleText(requestId,text);}):
response.blob().then(function(blob){return _this2._handleBase64(requestId,blob);});
}).catch(function(res){
console.error(res);
});
}},{key:'_handleText',value:function _handleText(
requestId,responseData){
this._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['didReceiveNetworkData',[requestId,responseData]]);
this._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['didCompleteNetworkResponse',[requestId,null]]);
}},{key:'_handleBase64',value:function _handleBase64(
requestId,responseData){var _this3=this;
var reader=new FileReader();
reader.onload=function(event){
var index=event.target.result.indexOf(';base64,');
index=index>=0?index+8:index;
_this3._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['didReceiveNetworkData',[requestId,event.target.result.slice(index)]]);
_this3._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['didCompleteNetworkResponse',[requestId,null]]);
};
reader.readAsDataURL(responseData);
}}]);return Networking;}(_Module3.default);exports.default=Networking;
}, "react-vr-web/js/Modules/Networking.js");
__d(23 /* react-vr-web/js/Utils/RCTResourceManager.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});exports.
RCTResourceManager=RCTResourceManager;function RCTResourceManager(){
this._resourceDictionaries={};
this._resourceListener={};
for(var protocol in this._validProtocols){
this._resourceDictionaries[protocol]={};
};
}
RCTResourceManager.prototype=babelHelpers.extends(Object.create(Object.prototype),{
constructor:RCTResourceManager,
_validProtocols:{
MonoTexture:'MonoTexture',
StereoTextures:'StereoTextures'},
isValidProtocol:function isValidProtocol(protocol){
return this._validProtocols[protocol]===protocol;
},
isValidUrl:function isValidUrl(url){
var parsed=this.parseUrl(url);
return parsed.protocol&&parsed.handle&&this.isValidProtocol(parsed.protocol);
},
parseUrl:function parseUrl(url){
var protocol=undefined;
var handle=undefined;
if(url){
var spiltPos=url.indexOf('://');
if(spiltPos>-1){
protocol=url.slice(0,spiltPos);
handle=url.slice(spiltPos+3);
}
}
return{
protocol:protocol,
handle:handle};
},
genUrl:function genUrl(protocol,handle){
return protocol+'://'+handle;
},
addListener:function addListener(url,listener){
if(listener){
if(this._resourceListener[url]===undefined){
this._resourceListener[url]=[];
}
if(this._resourceListener[url].indexOf(listener)===-1){
this._resourceListener[url].push(listener);
}
}
},
removeListener:function removeListener(url,listener){
var listenerArray=this._resourceListener[url];
if(listenerArray!==undefined&&listener!==undefined){
var index=listenerArray.indexOf(listener);
if(index!==-1){
listenerArray.splice(index,1);
}
}
},
_dispatchUpdate:function _dispatchUpdate(protocol,handle){
var url=this.genUrl(protocol,handle);
if(this._resourceListener[url]){
for(var i=0;i<this._resourceListener[url].length;i++){
var listener=this._resourceListener[url][i];
listener(url);
};
}
},
addResource:function addResource(protocol,handle,resource){
if(!this.isValidProtocol()){
return;
}
this._resourceDictionaries[protocol][handle]=resource;
this._dispatchUpdate(protocol,handle);
},
getResource:function getResource(protocol,handle){
if(!this.isValidProtocol()){
return undefined;
}
if(this._resourceDictionaries[protocol]){
return this._resourceDictionaries[protocol][handle];
}else{
return undefined;
}
},
removeResource:function removeResource(protocol,handle){
if(!this.isValidProtocol()){
return;
}
if(this._resourceDictionaries[protocol]){
delete this._resourceDictionaries[protocol][handle];
this._dispatchUpdate(protocol,handle);
}
}});
}, "react-vr-web/js/Utils/RCTResourceManager.js");
__d(24 /* react-vr-web/js/Utils/RCTInputControls.js */, function(global, require, module, exports) {Object.defineProperty(exports,"__esModule",{value:true});exports.
RCTInputControls=RCTInputControls;var _ovrui=require(25 /* ovrui */);var OVRUI=babelHelpers.interopRequireWildcard(_ovrui);function RCTInputControls(rnctx,guiSys){
this._rnctx=rnctx;
this._guiSys=guiSys;
guiSys.eventDispatcher.addEventListener('GuiSysEvent',this._onInputEvent.bind(this));
}
RCTInputControls.prototype=babelHelpers.extends(Object.create(Object.prototype),{
constructor:RCTInputControls,
_onInputEvent:function _onInputEvent(event){
if(event.eventType!==OVRUI.GuiSysEventType.INPUT_EVENT){
return;
}
var target=this._rnctx.lastHit?
this._rnctx.getHitTag(this._rnctx.lastHit):
null;
if(target){
if(this._rnctx.lastHitType===OVRUI.GuiSysHitType.GAZE){
this._rnctx.callFunction(
'RCTEventEmitter',
'receiveEvent',
[target,'topGazeInput',{
inputEvent:event.args.inputEvent,
target:target}]);
}
if(this._rnctx.lastHitType===OVRUI.GuiSysHitType.MOUSE){
this._rnctx.callFunction(
'RCTEventEmitter',
'receiveEvent',
[target,'topMouseInput',{
inputEvent:event.args.inputEvent,
target:target}]);
}
this._rnctx.callFunction(
'RCTEventEmitter',
'receiveEvent',
[target,'topInput',{
inputEvent:event.args.inputEvent,
target:target}]);
if(this.isConfirmEvent(event.args.inputEvent)){
this._rnctx.callFunction(
'RCTEventEmitter',
'receiveEvent',
[target,'topChange',[]]);
}
}
this._rnctx.callFunction(
'RCTDeviceEventEmitter',
'emit',
['onReceivedInputEvent',event.args.inputEvent,target]);
},
isConfirmEvent:function isConfirmEvent(event){
return event.type==='GamepadInputEvent'&&event.buttonId===0&&event.keyEventType==='keyup'||
event.type==='KeyboardInputEvent'&&event.code==='Space'&&event.keyEventType==='keyup';
}});
}, "react-vr-web/js/Utils/RCTInputControls.js");
__d(25 /* ovrui/index.js */, function(global, require, module, exports) {
module.exports=require(26 /* ./lib/OVRUI */);
}, "ovrui/index.js");
__d(26 /* ovrui/lib/OVRUI.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
exports.Player=exports.Overlay=exports.CSSBorderGeometry=exports.MergedBufferGeometry=exports.FourByFourRectGeometry=exports.UIView=exports.UIViewEvent=exports.UIViewEventType=exports.GuiSysHitType=exports.GuiSysEvent=exports.GuiSysEventType=exports.GuiSys=exports.SDFFONT_MARKER_COLOR=exports.TOP=exports.RIGHT_LINE=exports.RIGHT=exports.LEFT=exports.CENTER_LINE=exports.CENTER_FIXEDHEIGHT=exports.CENTER=exports.BOTTOM=exports.BASELINE=exports.wrapLines=exports.measureText=exports.loadFont=exports.BitmapFontGeometry=exports.VREffect=exports.VRControls=exports.DeviceOrientationControls=exports.AppControls=undefined;
var _AppControls=require(27 /* ./Control/AppControls */);
var _AppControls2=_interopRequireDefault(_AppControls);
var _DeviceOrientationControls=require(28 /* ./Control/DeviceOrientationControls */);
var _DeviceOrientationControls2=_interopRequireDefault(_DeviceOrientationControls);
var _VRControls=require(32 /* ./Control/VRControls */);
var _VRControls2=_interopRequireDefault(_VRControls);
var _VREffect=require(33 /* ./Control/VREffect */);
var _VREffect2=_interopRequireDefault(_VREffect);
var _FourByFourRect=require(34 /* ./FourByFourRect/FourByFourRect */);
var _MergedBufferGeometry=require(35 /* ./FourByFourRect/MergedBufferGeometry */);
var _CSSBorderGeometry=require(36 /* ./FourByFourRect/CSSBorderGeometry */);
var _SDFFont=require(37 /* ./SDFFont/SDFFont */);
var _GuiSys=require(39 /* ./UIView/GuiSys */);
var _GuiSys2=_interopRequireDefault(_GuiSys);
var _GuiSysEvent=require(45 /* ./UIView/GuiSysEvent */);
var _UIView=require(47 /* ./UIView/UIView */);
var _UIView2=_interopRequireDefault(_UIView);
var _Player=require(48 /* ./Player/Player */);
var _Player2=_interopRequireDefault(_Player);
var _Overlay=require(50 /* ./Player/Overlay */);
var _Overlay2=_interopRequireDefault(_Overlay);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
exports.AppControls=_AppControls2.default;
exports.DeviceOrientationControls=_DeviceOrientationControls2.default;
exports.VRControls=_VRControls2.default;
exports.VREffect=_VREffect2.default;
exports.BitmapFontGeometry=_SDFFont.BitmapFontGeometry;
exports.loadFont=_SDFFont.loadFont;
exports.measureText=_SDFFont.measureText;
exports.wrapLines=_SDFFont.wrapLines;
exports.BASELINE=_SDFFont.BASELINE;
exports.BOTTOM=_SDFFont.BOTTOM;
exports.CENTER=_SDFFont.CENTER;
exports.CENTER_FIXEDHEIGHT=_SDFFont.CENTER_FIXEDHEIGHT;
exports.CENTER_LINE=_SDFFont.CENTER_LINE;
exports.LEFT=_SDFFont.LEFT;
exports.RIGHT=_SDFFont.RIGHT;
exports.RIGHT_LINE=_SDFFont.RIGHT_LINE;
exports.TOP=_SDFFont.TOP;
exports.SDFFONT_MARKER_COLOR=_SDFFont.SDFFONT_MARKER_COLOR;
exports.GuiSys=_GuiSys2.default;
exports.GuiSysEventType=_GuiSysEvent.GuiSysEventType;
exports.GuiSysEvent=_GuiSysEvent.GuiSysEvent;
exports.GuiSysHitType=_GuiSysEvent.GuiSysHitType;
exports.UIViewEventType=_GuiSysEvent.UIViewEventType;
exports.UIViewEvent=_GuiSysEvent.UIViewEvent;
exports.UIView=_UIView2.default;
exports.FourByFourRectGeometry=_FourByFourRect.FourByFourRectGeometry;
exports.MergedBufferGeometry=_MergedBufferGeometry.MergedBufferGeometry;
exports.CSSBorderGeometry=_CSSBorderGeometry.CSSBorderGeometry;
exports.Overlay=_Overlay2.default;
exports.Player=_Player2.default;
}, "ovrui/lib/OVRUI.js");
__d(27 /* ovrui/lib/Control/AppControls.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();
var _DeviceOrientationControls=require(28 /* ./DeviceOrientationControls */);
var _DeviceOrientationControls2=_interopRequireDefault(_DeviceOrientationControls);
var _MousePanControls=require(31 /* ./MousePanControls */);
var _MousePanControls2=_interopRequireDefault(_MousePanControls);
var _VRControls=require(32 /* ./VRControls */);
var _VRControls2=_interopRequireDefault(_VRControls);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
var AppControls=function(){
function AppControls(camera,target){
_classCallCheck(this,AppControls);
this._camera=camera;
this.nonVRControls=_DeviceOrientationControls2.default.isSupported()?new _DeviceOrientationControls2.default(camera):new _MousePanControls2.default(camera,target);
}
_createClass(AppControls,[{
key:'setVRDisplay',
value:function setVRDisplay(vrDisplay){
if(!vrDisplay){
throw new Error('When calling setVRDisplay a non-null value is expected.');
}
this.vrControls=new _VRControls2.default(this._camera,vrDisplay);
}},
{
key:'setCamera',
value:function setCamera(camera){
this._camera=camera;
this.nonVRControls.camera=camera;
this.nonVRControls.resetRotation(camera.rotation.x,camera.rotation.y,camera.rotation.z);
if(this.vrControls){
this.vrControls.camera=camera;
}
}},
{
key:'resetRotation',
value:function resetRotation(x,y,z){
this.nonVRControls.resetRotation(x,y,z);
}},
{
key:'frame',
value:function frame(frameOptions){
if(this.vrControls){
var display=this.vrControls.vrDisplay;
if(display&&display.isPresenting){
return this.vrControls.update(frameOptions);
}
}
this.nonVRControls.update(frameOptions);
}}]);
return AppControls;
}();
exports.default=AppControls;
}, "ovrui/lib/Control/AppControls.js");
__d(28 /* ovrui/lib/Control/DeviceOrientationControls.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();
var _ThreeShim=require(29 /* ../ThreeShim */);
var _ThreeShim2=_interopRequireDefault(_ThreeShim);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
var Z_UNIT=new _ThreeShim2.default.Vector3(0,0,1);
var SCREEN_ROTATION=new _ThreeShim2.default.Quaternion(-Math.sqrt(0.5),0,0,Math.sqrt(0.5));
var orientationRotation=new _ThreeShim2.default.Quaternion();
var euler=new _ThreeShim2.default.Euler();
function getScreenOrientation(){
var orientation=screen.orientation||screen.mozOrientation||screen.msOrientation||{};
var angle=orientation.angle||window.orientation||0;
return _ThreeShim2.default.Math.degToRad(angle);
}
var DeviceOrientationControls=function(){
function DeviceOrientationControls(camera){
_classCallCheck(this,DeviceOrientationControls);
this.camera=camera;
this.enabled=true;
this.screenOrientation=getScreenOrientation();
this.deviceOrientation={};
this.orientationChangeHandler=this.orientationChangeHandler.bind(this);
this.deviceOrientationHandler=this.deviceOrientationHandler.bind(this);
this.connect();
}
_createClass(DeviceOrientationControls,[{
key:'connect',
value:function connect(){
this.screenOrientation=getScreenOrientation();
window.addEventListener('orientationchange',this.orientationChangeHandler);
window.addEventListener('deviceorientation',this.deviceOrientationHandler);
this.enabled=true;
}},
{
key:'disconnect',
value:function disconnect(){
window.removeEventListener('orientationchange',this.orientationChangeHandler);
window.removeEventListener('deviceorientation',this.deviceOrientationHandler);
this.enabled=false;
}},
{
key:'orientationChangeHandler',
value:function orientationChangeHandler(){
this.screenOrientation=getScreenOrientation();
}},
{
key:'deviceOrientationHandler',
value:function deviceOrientationHandler(event){
this.deviceOrientation.alpha=_ThreeShim2.default.Math.degToRad(event.alpha);
this.deviceOrientation.beta=_ThreeShim2.default.Math.degToRad(event.beta);
this.deviceOrientation.gamma=_ThreeShim2.default.Math.degToRad(event.gamma);
}},
{
key:'resetRotation',
value:function resetRotation(x,y,z){
}},
{
key:'update',
value:function update(){
if(!this.enabled){
return;
}
var alpha=this.deviceOrientation.alpha||0;
var beta=this.deviceOrientation.beta||0;
var gamma=this.deviceOrientation.gamma||0;
var orient=this.screenOrientation;
var quaternion=this.camera.quaternion;
euler.set(beta,alpha,-gamma,'YXZ');
quaternion.setFromEuler(euler);
quaternion.multiply(SCREEN_ROTATION);
orientationRotation.setFromAxisAngle(Z_UNIT,-orient);
quaternion.multiply(orientationRotation);
}}],
[{
key:'isSupported',
value:function isSupported(){
return'DeviceOrientationEvent'in window&&/Mobi/i.test(navigator.userAgent);
}}]);
return DeviceOrientationControls;
}();
exports.default=DeviceOrientationControls;
}, "ovrui/lib/Control/DeviceOrientationControls.js");
__d(29 /* ovrui/lib/ThreeShim.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
var THREE=window&&window.THREE||require(30 /* three */);
if(!THREE){
throw new Error('Could not find Three.js! Make sure you\'ve included the appropriate .js file');
}
exports.default=THREE;
}, "ovrui/lib/ThreeShim.js");
__d(30 /* three/build/three.js */, function(global, require, module, exports) {(function(global,factory){
typeof exports==='object'&&typeof module!=='undefined'?factory(exports):
typeof define==='function'&&define.amd?define(['exports'],factory):
factory(global.THREE=global.THREE||{});
})(this,function(exports){'use strict';
if(Number.EPSILON===undefined){
Number.EPSILON=Math.pow(2,-52);
}
if(Math.sign===undefined){
Math.sign=function(x){
return x<0?-1:x>0?1:+x;
};
}
if(Function.prototype.name===undefined){
Object.defineProperty(Function.prototype,'name',{
get:function get(){
return this.toString().match(/^\s*function\s*(\S*)\s*\(/)[1];
}});
}
if(Object.assign===undefined){
(function(){
Object.assign=function(target){
'use strict';
if(target===undefined||target===null){
throw new TypeError('Cannot convert undefined or null to object');
}
var output=Object(target);
for(var index=1;index<arguments.length;index++){
var source=arguments[index];
if(source!==undefined&&source!==null){
for(var nextKey in source){
if(Object.prototype.hasOwnProperty.call(source,nextKey)){
output[nextKey]=source[nextKey];
}
}
}
}
return output;
};
})();
}
function EventDispatcher(){}
babelHelpers.extends(EventDispatcher.prototype,{
addEventListener:function addEventListener(type,listener){
if(this._listeners===undefined)this._listeners={};
var listeners=this._listeners;
if(listeners[type]===undefined){
listeners[type]=[];
}
if(listeners[type].indexOf(listener)===-1){
listeners[type].push(listener);
}
},
hasEventListener:function hasEventListener(type,listener){
if(this._listeners===undefined)return false;
var listeners=this._listeners;
if(listeners[type]!==undefined&&listeners[type].indexOf(listener)!==-1){
return true;
}
return false;
},
removeEventListener:function removeEventListener(type,listener){
if(this._listeners===undefined)return;
var listeners=this._listeners;
var listenerArray=listeners[type];
if(listenerArray!==undefined){
var index=listenerArray.indexOf(listener);
if(index!==-1){
listenerArray.splice(index,1);
}
}
},
dispatchEvent:function dispatchEvent(event){
if(this._listeners===undefined)return;
var listeners=this._listeners;
var listenerArray=listeners[event.type];
if(listenerArray!==undefined){
event.target=this;
var array=[],i=0;
var length=listenerArray.length;
for(i=0;i<length;i++){
array[i]=listenerArray[i];
}
for(i=0;i<length;i++){
array[i].call(this,event);
}
}
}});
var REVISION='80';
var MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};
var CullFaceNone=0;
var CullFaceBack=1;
var CullFaceFront=2;
var CullFaceFrontBack=3;
var FrontFaceDirectionCW=0;
var FrontFaceDirectionCCW=1;
var BasicShadowMap=0;
var PCFShadowMap=1;
var PCFSoftShadowMap=2;
var FrontSide=0;
var BackSide=1;
var DoubleSide=2;
var FlatShading=1;
var SmoothShading=2;
var NoColors=0;
var FaceColors=1;
var VertexColors=2;
var NoBlending=0;
var NormalBlending=1;
var AdditiveBlending=2;
var SubtractiveBlending=3;
var MultiplyBlending=4;
var CustomBlending=5;
var AddEquation=100;
var SubtractEquation=101;
var ReverseSubtractEquation=102;
var MinEquation=103;
var MaxEquation=104;
var ZeroFactor=200;
var OneFactor=201;
var SrcColorFactor=202;
var OneMinusSrcColorFactor=203;
var SrcAlphaFactor=204;
var OneMinusSrcAlphaFactor=205;
var DstAlphaFactor=206;
var OneMinusDstAlphaFactor=207;
var DstColorFactor=208;
var OneMinusDstColorFactor=209;
var SrcAlphaSaturateFactor=210;
var NeverDepth=0;
var AlwaysDepth=1;
var LessDepth=2;
var LessEqualDepth=3;
var EqualDepth=4;
var GreaterEqualDepth=5;
var GreaterDepth=6;
var NotEqualDepth=7;
var MultiplyOperation=0;
var MixOperation=1;
var AddOperation=2;
var NoToneMapping=0;
var LinearToneMapping=1;
var ReinhardToneMapping=2;
var Uncharted2ToneMapping=3;
var CineonToneMapping=4;
var UVMapping=300;
var CubeReflectionMapping=301;
var CubeRefractionMapping=302;
var EquirectangularReflectionMapping=303;
var EquirectangularRefractionMapping=304;
var SphericalReflectionMapping=305;
var CubeUVReflectionMapping=306;
var CubeUVRefractionMapping=307;
var RepeatWrapping=1000;
var ClampToEdgeWrapping=1001;
var MirroredRepeatWrapping=1002;
var NearestFilter=1003;
var NearestMipMapNearestFilter=1004;
var NearestMipMapLinearFilter=1005;
var LinearFilter=1006;
var LinearMipMapNearestFilter=1007;
var LinearMipMapLinearFilter=1008;
var UnsignedByteType=1009;
var ByteType=1010;
var ShortType=1011;
var UnsignedShortType=1012;
var IntType=1013;
var UnsignedIntType=1014;
var FloatType=1015;
var HalfFloatType=1016;
var UnsignedShort4444Type=1017;
var UnsignedShort5551Type=1018;
var UnsignedShort565Type=1019;
var UnsignedInt248Type=1020;
var AlphaFormat=1021;
var RGBFormat=1022;
var RGBAFormat=1023;
var LuminanceFormat=1024;
var LuminanceAlphaFormat=1025;
var RGBEFormat=RGBAFormat;
var DepthFormat=1026;
var DepthStencilFormat=1027;
var RGB_S3TC_DXT1_Format=2001;
var RGBA_S3TC_DXT1_Format=2002;
var RGBA_S3TC_DXT3_Format=2003;
var RGBA_S3TC_DXT5_Format=2004;
var RGB_PVRTC_4BPPV1_Format=2100;
var RGB_PVRTC_2BPPV1_Format=2101;
var RGBA_PVRTC_4BPPV1_Format=2102;
var RGBA_PVRTC_2BPPV1_Format=2103;
var RGB_ETC1_Format=2151;
var LoopOnce=2200;
var LoopRepeat=2201;
var LoopPingPong=2202;
var InterpolateDiscrete=2300;
var InterpolateLinear=2301;
var InterpolateSmooth=2302;
var ZeroCurvatureEnding=2400;
var ZeroSlopeEnding=2401;
var WrapAroundEnding=2402;
var TrianglesDrawMode=0;
var TriangleStripDrawMode=1;
var TriangleFanDrawMode=2;
var LinearEncoding=3000;
var sRGBEncoding=3001;
var GammaEncoding=3007;
var RGBEEncoding=3002;
var LogLuvEncoding=3003;
var RGBM7Encoding=3004;
var RGBM16Encoding=3005;
var RGBDEncoding=3006;
var BasicDepthPacking=3200;
var RGBADepthPacking=3201;
exports.Math={
DEG2RAD:Math.PI/180,
RAD2DEG:180/Math.PI,
generateUUID:function(){
var chars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
var uuid=new Array(36);
var rnd=0,r;
return function generateUUID(){
for(var i=0;i<36;i++){
if(i===8||i===13||i===18||i===23){
uuid[i]='-';
}else if(i===14){
uuid[i]='4';
}else{
if(rnd<=0x02)rnd=0x2000000+Math.random()*0x1000000|0;
r=rnd&0xf;
rnd=rnd>>4;
uuid[i]=chars[i===19?r&0x3|0x8:r];
}
}
return uuid.join('');
};
}(),
clamp:function clamp(value,min,max){
return Math.max(min,Math.min(max,value));
},
euclideanModulo:function euclideanModulo(n,m){
return(n%m+m)%m;
},
mapLinear:function mapLinear(x,a1,a2,b1,b2){
return b1+(x-a1)*(b2-b1)/(a2-a1);
},
smoothstep:function smoothstep(x,min,max){
if(x<=min)return 0;
if(x>=max)return 1;
x=(x-min)/(max-min);
return x*x*(3-2*x);
},
smootherstep:function smootherstep(x,min,max){
if(x<=min)return 0;
if(x>=max)return 1;
x=(x-min)/(max-min);
return x*x*x*(x*(x*6-15)+10);
},
random16:function random16(){
console.warn('THREE.Math.random16() has been deprecated. Use Math.random() instead.');
return Math.random();
},
randInt:function randInt(low,high){
return low+Math.floor(Math.random()*(high-low+1));
},
randFloat:function randFloat(low,high){
return low+Math.random()*(high-low);
},
randFloatSpread:function randFloatSpread(range){
return range*(0.5-Math.random());
},
degToRad:function degToRad(degrees){
return degrees*exports.Math.DEG2RAD;
},
radToDeg:function radToDeg(radians){
return radians*exports.Math.RAD2DEG;
},
isPowerOfTwo:function isPowerOfTwo(value){
return(value&value-1)===0&&value!==0;
},
nearestPowerOfTwo:function nearestPowerOfTwo(value){
return Math.pow(2,Math.round(Math.log(value)/Math.LN2));
},
nextPowerOfTwo:function nextPowerOfTwo(value){
value--;
value|=value>>1;
value|=value>>2;
value|=value>>4;
value|=value>>8;
value|=value>>16;
value++;
return value;
}};
function Vector2(x,y){
this.x=x||0;
this.y=y||0;
}
Vector2.prototype={
constructor:Vector2,
isVector2:true,
get width(){
return this.x;
},
set width(value){
this.x=value;
},
get height(){
return this.y;
},
set height(value){
this.y=value;
},
set:function set(x,y){
this.x=x;
this.y=y;
return this;
},
setScalar:function setScalar(scalar){
this.x=scalar;
this.y=scalar;
return this;
},
setX:function setX(x){
this.x=x;
return this;
},
setY:function setY(y){
this.y=y;
return this;
},
setComponent:function setComponent(index,value){
switch(index){
case 0:this.x=value;break;
case 1:this.y=value;break;
default:throw new Error('index is out of range: '+index);}
},
getComponent:function getComponent(index){
switch(index){
case 0:return this.x;
case 1:return this.y;
default:throw new Error('index is out of range: '+index);}
},
clone:function clone(){
return new this.constructor(this.x,this.y);
},
copy:function copy(v){
this.x=v.x;
this.y=v.y;
return this;
},
add:function add(v,w){
if(w!==undefined){
console.warn('THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
return this.addVectors(v,w);
}
this.x+=v.x;
this.y+=v.y;
return this;
},
addScalar:function addScalar(s){
this.x+=s;
this.y+=s;
return this;
},
addVectors:function addVectors(a,b){
this.x=a.x+b.x;
this.y=a.y+b.y;
return this;
},
addScaledVector:function addScaledVector(v,s){
this.x+=v.x*s;
this.y+=v.y*s;
return this;
},
sub:function sub(v,w){
if(w!==undefined){
console.warn('THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
return this.subVectors(v,w);
}
this.x-=v.x;
this.y-=v.y;
return this;
},
subScalar:function subScalar(s){
this.x-=s;
this.y-=s;
return this;
},
subVectors:function subVectors(a,b){
this.x=a.x-b.x;
this.y=a.y-b.y;
return this;
},
multiply:function multiply(v){
this.x*=v.x;
this.y*=v.y;
return this;
},
multiplyScalar:function multiplyScalar(scalar){
if(isFinite(scalar)){
this.x*=scalar;
this.y*=scalar;
}else{
this.x=0;
this.y=0;
}
return this;
},
divide:function divide(v){
this.x/=v.x;
this.y/=v.y;
return this;
},
divideScalar:function divideScalar(scalar){
return this.multiplyScalar(1/scalar);
},
min:function min(v){
this.x=Math.min(this.x,v.x);
this.y=Math.min(this.y,v.y);
return this;
},
max:function max(v){
this.x=Math.max(this.x,v.x);
this.y=Math.max(this.y,v.y);
return this;
},
clamp:function clamp(min,max){
this.x=Math.max(min.x,Math.min(max.x,this.x));
this.y=Math.max(min.y,Math.min(max.y,this.y));
return this;
},
clampScalar:function(){
var min,max;
return function clampScalar(minVal,maxVal){
if(min===undefined){
min=new Vector2();
max=new Vector2();
}
min.set(minVal,minVal);
max.set(maxVal,maxVal);
return this.clamp(min,max);
};
}(),
clampLength:function clampLength(min,max){
var length=this.length();
return this.multiplyScalar(Math.max(min,Math.min(max,length))/length);
},
floor:function floor(){
this.x=Math.floor(this.x);
this.y=Math.floor(this.y);
return this;
},
ceil:function ceil(){
this.x=Math.ceil(this.x);
this.y=Math.ceil(this.y);
return this;
},
round:function round(){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
return this;
},
roundToZero:function roundToZero(){
this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);
this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);
return this;
},
negate:function negate(){
this.x=-this.x;
this.y=-this.y;
return this;
},
dot:function dot(v){
return this.x*v.x+this.y*v.y;
},
lengthSq:function lengthSq(){
return this.x*this.x+this.y*this.y;
},
length:function length(){
return Math.sqrt(this.x*this.x+this.y*this.y);
},
lengthManhattan:function lengthManhattan(){
return Math.abs(this.x)+Math.abs(this.y);
},
normalize:function normalize(){
return this.divideScalar(this.length());
},
angle:function angle(){
var angle=Math.atan2(this.y,this.x);
if(angle<0)angle+=2*Math.PI;
return angle;
},
distanceTo:function distanceTo(v){
return Math.sqrt(this.distanceToSquared(v));
},
distanceToSquared:function distanceToSquared(v){
var dx=this.x-v.x,dy=this.y-v.y;
return dx*dx+dy*dy;
},
distanceToManhattan:function distanceToManhattan(v){
return Math.abs(this.x-v.x)+Math.abs(this.y-v.y);
},
setLength:function setLength(length){
return this.multiplyScalar(length/this.length());
},
lerp:function lerp(v,alpha){
this.x+=(v.x-this.x)*alpha;
this.y+=(v.y-this.y)*alpha;
return this;
},
lerpVectors:function lerpVectors(v1,v2,alpha){
return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);
},
equals:function equals(v){
return v.x===this.x&&v.y===this.y;
},
fromArray:function fromArray(array,offset){
if(offset===undefined)offset=0;
this.x=array[offset];
this.y=array[offset+1];
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
array[offset]=this.x;
array[offset+1]=this.y;
return array;
},
fromAttribute:function fromAttribute(attribute,index,offset){
if(offset===undefined)offset=0;
index=index*attribute.itemSize+offset;
this.x=attribute.array[index];
this.y=attribute.array[index+1];
return this;
},
rotateAround:function rotateAround(center,angle){
var c=Math.cos(angle),s=Math.sin(angle);
var x=this.x-center.x;
var y=this.y-center.y;
this.x=x*c-y*s+center.x;
this.y=x*s+y*c+center.y;
return this;
}};
function Texture(image,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding){
Object.defineProperty(this,'id',{value:TextureIdCount()});
this.uuid=exports.Math.generateUUID();
this.name='';
this.sourceFile='';
this.image=image!==undefined?image:Texture.DEFAULT_IMAGE;
this.mipmaps=[];
this.mapping=mapping!==undefined?mapping:Texture.DEFAULT_MAPPING;
this.wrapS=wrapS!==undefined?wrapS:ClampToEdgeWrapping;
this.wrapT=wrapT!==undefined?wrapT:ClampToEdgeWrapping;
this.magFilter=magFilter!==undefined?magFilter:LinearFilter;
this.minFilter=minFilter!==undefined?minFilter:LinearMipMapLinearFilter;
this.anisotropy=anisotropy!==undefined?anisotropy:1;
this.format=format!==undefined?format:RGBAFormat;
this.type=type!==undefined?type:UnsignedByteType;
this.offset=new Vector2(0,0);
this.repeat=new Vector2(1,1);
this.generateMipmaps=true;
this.premultiplyAlpha=false;
this.flipY=true;
this.unpackAlignment=4;
this.encoding=encoding!==undefined?encoding:LinearEncoding;
this.version=0;
this.onUpdate=null;
}
Texture.DEFAULT_IMAGE=undefined;
Texture.DEFAULT_MAPPING=UVMapping;
Texture.prototype={
constructor:Texture,
isTexture:true,
set needsUpdate(value){
if(value===true)this.version++;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(source){
this.image=source.image;
this.mipmaps=source.mipmaps.slice(0);
this.mapping=source.mapping;
this.wrapS=source.wrapS;
this.wrapT=source.wrapT;
this.magFilter=source.magFilter;
this.minFilter=source.minFilter;
this.anisotropy=source.anisotropy;
this.format=source.format;
this.type=source.type;
this.offset.copy(source.offset);
this.repeat.copy(source.repeat);
this.generateMipmaps=source.generateMipmaps;
this.premultiplyAlpha=source.premultiplyAlpha;
this.flipY=source.flipY;
this.unpackAlignment=source.unpackAlignment;
this.encoding=source.encoding;
return this;
},
toJSON:function toJSON(meta){
if(meta.textures[this.uuid]!==undefined){
return meta.textures[this.uuid];
}
function getDataURL(image){
var canvas;
if(image.toDataURL!==undefined){
canvas=image;
}else{
canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');
canvas.width=image.width;
canvas.height=image.height;
canvas.getContext('2d').drawImage(image,0,0,image.width,image.height);
}
if(canvas.width>2048||canvas.height>2048){
return canvas.toDataURL('image/jpeg',0.6);
}else{
return canvas.toDataURL('image/png');
}
}
var output={
metadata:{
version:4.4,
type:'Texture',
generator:'Texture.toJSON'},
uuid:this.uuid,
name:this.name,
mapping:this.mapping,
repeat:[this.repeat.x,this.repeat.y],
offset:[this.offset.x,this.offset.y],
wrap:[this.wrapS,this.wrapT],
minFilter:this.minFilter,
magFilter:this.magFilter,
anisotropy:this.anisotropy,
flipY:this.flipY};
if(this.image!==undefined){
var image=this.image;
if(image.uuid===undefined){
image.uuid=exports.Math.generateUUID();
}
if(meta.images[image.uuid]===undefined){
meta.images[image.uuid]={
uuid:image.uuid,
url:getDataURL(image)};
}
output.image=image.uuid;
}
meta.textures[this.uuid]=output;
return output;
},
dispose:function dispose(){
this.dispatchEvent({type:'dispose'});
},
transformUv:function transformUv(uv){
if(this.mapping!==UVMapping)return;
uv.multiply(this.repeat);
uv.add(this.offset);
if(uv.x<0||uv.x>1){
switch(this.wrapS){
case RepeatWrapping:
uv.x=uv.x-Math.floor(uv.x);
break;
case ClampToEdgeWrapping:
uv.x=uv.x<0?0:1;
break;
case MirroredRepeatWrapping:
if(Math.abs(Math.floor(uv.x)%2)===1){
uv.x=Math.ceil(uv.x)-uv.x;
}else{
uv.x=uv.x-Math.floor(uv.x);
}
break;}
}
if(uv.y<0||uv.y>1){
switch(this.wrapT){
case RepeatWrapping:
uv.y=uv.y-Math.floor(uv.y);
break;
case ClampToEdgeWrapping:
uv.y=uv.y<0?0:1;
break;
case MirroredRepeatWrapping:
if(Math.abs(Math.floor(uv.y)%2)===1){
uv.y=Math.ceil(uv.y)-uv.y;
}else{
uv.y=uv.y-Math.floor(uv.y);
}
break;}
}
if(this.flipY){
uv.y=1-uv.y;
}
}};
babelHelpers.extends(Texture.prototype,EventDispatcher.prototype);
var count=0;
function TextureIdCount(){return count++;};
function Matrix4(){
this.elements=new Float32Array([
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1]);
if(arguments.length>0){
console.error('THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.');
}
}
Matrix4.prototype={
constructor:Matrix4,
isMatrix4:true,
set:function set(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){
var te=this.elements;
te[0]=n11;te[4]=n12;te[8]=n13;te[12]=n14;
te[1]=n21;te[5]=n22;te[9]=n23;te[13]=n24;
te[2]=n31;te[6]=n32;te[10]=n33;te[14]=n34;
te[3]=n41;te[7]=n42;te[11]=n43;te[15]=n44;
return this;
},
identity:function identity(){
this.set(
1,0,0,0,
0,1,0,0,
0,0,1,0,
0,0,0,1);
return this;
},
clone:function clone(){
return new Matrix4().fromArray(this.elements);
},
copy:function copy(m){
this.elements.set(m.elements);
return this;
},
copyPosition:function copyPosition(m){
var te=this.elements;
var me=m.elements;
te[12]=me[12];
te[13]=me[13];
te[14]=me[14];
return this;
},
extractBasis:function extractBasis(xAxis,yAxis,zAxis){
xAxis.setFromMatrixColumn(this,0);
yAxis.setFromMatrixColumn(this,1);
zAxis.setFromMatrixColumn(this,2);
return this;
},
makeBasis:function makeBasis(xAxis,yAxis,zAxis){
this.set(
xAxis.x,yAxis.x,zAxis.x,0,
xAxis.y,yAxis.y,zAxis.y,0,
xAxis.z,yAxis.z,zAxis.z,0,
0,0,0,1);
return this;
},
extractRotation:function(){
var v1;
return function extractRotation(m){
if(v1===undefined)v1=new Vector3();
var te=this.elements;
var me=m.elements;
var scaleX=1/v1.setFromMatrixColumn(m,0).length();
var scaleY=1/v1.setFromMatrixColumn(m,1).length();
var scaleZ=1/v1.setFromMatrixColumn(m,2).length();
te[0]=me[0]*scaleX;
te[1]=me[1]*scaleX;
te[2]=me[2]*scaleX;
te[4]=me[4]*scaleY;
te[5]=me[5]*scaleY;
te[6]=me[6]*scaleY;
te[8]=me[8]*scaleZ;
te[9]=me[9]*scaleZ;
te[10]=me[10]*scaleZ;
return this;
};
}(),
makeRotationFromEuler:function makeRotationFromEuler(euler){
if((euler&&euler.isEuler)===false){
console.error('THREE.Matrix: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.');
}
var te=this.elements;
var x=euler.x,y=euler.y,z=euler.z;
var a=Math.cos(x),b=Math.sin(x);
var c=Math.cos(y),d=Math.sin(y);
var e=Math.cos(z),f=Math.sin(z);
if(euler.order==='XYZ'){
var ae=a*e,af=a*f,be=b*e,bf=b*f;
te[0]=c*e;
te[4]=-c*f;
te[8]=d;
te[1]=af+be*d;
te[5]=ae-bf*d;
te[9]=-b*c;
te[2]=bf-ae*d;
te[6]=be+af*d;
te[10]=a*c;
}else if(euler.order==='YXZ'){
var ce=c*e,cf=c*f,de=d*e,df=d*f;
te[0]=ce+df*b;
te[4]=de*b-cf;
te[8]=a*d;
te[1]=a*f;
te[5]=a*e;
te[9]=-b;
te[2]=cf*b-de;
te[6]=df+ce*b;
te[10]=a*c;
}else if(euler.order==='ZXY'){
var ce=c*e,cf=c*f,de=d*e,df=d*f;
te[0]=ce-df*b;
te[4]=-a*f;
te[8]=de+cf*b;
te[1]=cf+de*b;
te[5]=a*e;
te[9]=df-ce*b;
te[2]=-a*d;
te[6]=b;
te[10]=a*c;
}else if(euler.order==='ZYX'){
var ae=a*e,af=a*f,be=b*e,bf=b*f;
te[0]=c*e;
te[4]=be*d-af;
te[8]=ae*d+bf;
te[1]=c*f;
te[5]=bf*d+ae;
te[9]=af*d-be;
te[2]=-d;
te[6]=b*c;
te[10]=a*c;
}else if(euler.order==='YZX'){
var ac=a*c,ad=a*d,bc=b*c,bd=b*d;
te[0]=c*e;
te[4]=bd-ac*f;
te[8]=bc*f+ad;
te[1]=f;
te[5]=a*e;
te[9]=-b*e;
te[2]=-d*e;
te[6]=ad*f+bc;
te[10]=ac-bd*f;
}else if(euler.order==='XZY'){
var ac=a*c,ad=a*d,bc=b*c,bd=b*d;
te[0]=c*e;
te[4]=-f;
te[8]=d*e;
te[1]=ac*f+bd;
te[5]=a*e;
te[9]=ad*f-bc;
te[2]=bc*f-ad;
te[6]=b*e;
te[10]=bd*f+ac;
}
te[3]=0;
te[7]=0;
te[11]=0;
te[12]=0;
te[13]=0;
te[14]=0;
te[15]=1;
return this;
},
makeRotationFromQuaternion:function makeRotationFromQuaternion(q){
var te=this.elements;
var x=q.x,y=q.y,z=q.z,w=q.w;
var x2=x+x,y2=y+y,z2=z+z;
var xx=x*x2,xy=x*y2,xz=x*z2;
var yy=y*y2,yz=y*z2,zz=z*z2;
var wx=w*x2,wy=w*y2,wz=w*z2;
te[0]=1-(yy+zz);
te[4]=xy-wz;
te[8]=xz+wy;
te[1]=xy+wz;
te[5]=1-(xx+zz);
te[9]=yz-wx;
te[2]=xz-wy;
te[6]=yz+wx;
te[10]=1-(xx+yy);
te[3]=0;
te[7]=0;
te[11]=0;
te[12]=0;
te[13]=0;
te[14]=0;
te[15]=1;
return this;
},
lookAt:function(){
var x,y,z;
return function lookAt(eye,target,up){
if(x===undefined){
x=new Vector3();
y=new Vector3();
z=new Vector3();
}
var te=this.elements;
z.subVectors(eye,target).normalize();
if(z.lengthSq()===0){
z.z=1;
}
x.crossVectors(up,z).normalize();
if(x.lengthSq()===0){
z.z+=0.0001;
x.crossVectors(up,z).normalize();
}
y.crossVectors(z,x);
te[0]=x.x;te[4]=y.x;te[8]=z.x;
te[1]=x.y;te[5]=y.y;te[9]=z.y;
te[2]=x.z;te[6]=y.z;te[10]=z.z;
return this;
};
}(),
multiply:function multiply(m,n){
if(n!==undefined){
console.warn('THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.');
return this.multiplyMatrices(m,n);
}
return this.multiplyMatrices(this,m);
},
premultiply:function premultiply(m){
return this.multiplyMatrices(m,this);
},
multiplyMatrices:function multiplyMatrices(a,b){
var ae=a.elements;
var be=b.elements;
var te=this.elements;
var a11=ae[0],a12=ae[4],a13=ae[8],a14=ae[12];
var a21=ae[1],a22=ae[5],a23=ae[9],a24=ae[13];
var a31=ae[2],a32=ae[6],a33=ae[10],a34=ae[14];
var a41=ae[3],a42=ae[7],a43=ae[11],a44=ae[15];
var b11=be[0],b12=be[4],b13=be[8],b14=be[12];
var b21=be[1],b22=be[5],b23=be[9],b24=be[13];
var b31=be[2],b32=be[6],b33=be[10],b34=be[14];
var b41=be[3],b42=be[7],b43=be[11],b44=be[15];
te[0]=a11*b11+a12*b21+a13*b31+a14*b41;
te[4]=a11*b12+a12*b22+a13*b32+a14*b42;
te[8]=a11*b13+a12*b23+a13*b33+a14*b43;
te[12]=a11*b14+a12*b24+a13*b34+a14*b44;
te[1]=a21*b11+a22*b21+a23*b31+a24*b41;
te[5]=a21*b12+a22*b22+a23*b32+a24*b42;
te[9]=a21*b13+a22*b23+a23*b33+a24*b43;
te[13]=a21*b14+a22*b24+a23*b34+a24*b44;
te[2]=a31*b11+a32*b21+a33*b31+a34*b41;
te[6]=a31*b12+a32*b22+a33*b32+a34*b42;
te[10]=a31*b13+a32*b23+a33*b33+a34*b43;
te[14]=a31*b14+a32*b24+a33*b34+a34*b44;
te[3]=a41*b11+a42*b21+a43*b31+a44*b41;
te[7]=a41*b12+a42*b22+a43*b32+a44*b42;
te[11]=a41*b13+a42*b23+a43*b33+a44*b43;
te[15]=a41*b14+a42*b24+a43*b34+a44*b44;
return this;
},
multiplyToArray:function multiplyToArray(a,b,r){
var te=this.elements;
this.multiplyMatrices(a,b);
r[0]=te[0];r[1]=te[1];r[2]=te[2];r[3]=te[3];
r[4]=te[4];r[5]=te[5];r[6]=te[6];r[7]=te[7];
r[8]=te[8];r[9]=te[9];r[10]=te[10];r[11]=te[11];
r[12]=te[12];r[13]=te[13];r[14]=te[14];r[15]=te[15];
return this;
},
multiplyScalar:function multiplyScalar(s){
var te=this.elements;
te[0]*=s;te[4]*=s;te[8]*=s;te[12]*=s;
te[1]*=s;te[5]*=s;te[9]*=s;te[13]*=s;
te[2]*=s;te[6]*=s;te[10]*=s;te[14]*=s;
te[3]*=s;te[7]*=s;te[11]*=s;te[15]*=s;
return this;
},
applyToVector3Array:function(){
var v1;
return function applyToVector3Array(array,offset,length){
if(v1===undefined)v1=new Vector3();
if(offset===undefined)offset=0;
if(length===undefined)length=array.length;
for(var i=0,j=offset;i<length;i+=3,j+=3){
v1.fromArray(array,j);
v1.applyMatrix4(this);
v1.toArray(array,j);
}
return array;
};
}(),
applyToBuffer:function(){
var v1;
return function applyToBuffer(buffer,offset,length){
if(v1===undefined)v1=new Vector3();
if(offset===undefined)offset=0;
if(length===undefined)length=buffer.length/buffer.itemSize;
for(var i=0,j=offset;i<length;i++,j++){
v1.x=buffer.getX(j);
v1.y=buffer.getY(j);
v1.z=buffer.getZ(j);
v1.applyMatrix4(this);
buffer.setXYZ(v1.x,v1.y,v1.z);
}
return buffer;
};
}(),
determinant:function determinant(){
var te=this.elements;
var n11=te[0],n12=te[4],n13=te[8],n14=te[12];
var n21=te[1],n22=te[5],n23=te[9],n24=te[13];
var n31=te[2],n32=te[6],n33=te[10],n34=te[14];
var n41=te[3],n42=te[7],n43=te[11],n44=te[15];
return(
n41*(
+n14*n23*n32-
n13*n24*n32-
n14*n22*n33+
n12*n24*n33+
n13*n22*n34-
n12*n23*n34)+
n42*(
+n11*n23*n34-
n11*n24*n33+
n14*n21*n33-
n13*n21*n34+
n13*n24*n31-
n14*n23*n31)+
n43*(
+n11*n24*n32-
n11*n22*n34-
n14*n21*n32+
n12*n21*n34+
n14*n22*n31-
n12*n24*n31)+
n44*(
-n13*n22*n31-
n11*n23*n32+
n11*n22*n33+
n13*n21*n32-
n12*n21*n33+
n12*n23*n31));
},
transpose:function transpose(){
var te=this.elements;
var tmp;
tmp=te[1];te[1]=te[4];te[4]=tmp;
tmp=te[2];te[2]=te[8];te[8]=tmp;
tmp=te[6];te[6]=te[9];te[9]=tmp;
tmp=te[3];te[3]=te[12];te[12]=tmp;
tmp=te[7];te[7]=te[13];te[13]=tmp;
tmp=te[11];te[11]=te[14];te[14]=tmp;
return this;
},
flattenToArrayOffset:function flattenToArrayOffset(array,offset){
console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated "+
"- just use .toArray instead.");
return this.toArray(array,offset);
},
getPosition:function(){
var v1;
return function getPosition(){
if(v1===undefined)v1=new Vector3();
console.warn('THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.');
return v1.setFromMatrixColumn(this,3);
};
}(),
setPosition:function setPosition(v){
var te=this.elements;
te[12]=v.x;
te[13]=v.y;
te[14]=v.z;
return this;
},
getInverse:function getInverse(m,throwOnDegenerate){
var te=this.elements,
me=m.elements,
n11=me[0],n21=me[1],n31=me[2],n41=me[3],
n12=me[4],n22=me[5],n32=me[6],n42=me[7],
n13=me[8],n23=me[9],n33=me[10],n43=me[11],
n14=me[12],n24=me[13],n34=me[14],n44=me[15],
t11=n23*n34*n42-n24*n33*n42+n24*n32*n43-n22*n34*n43-n23*n32*n44+n22*n33*n44,
t12=n14*n33*n42-n13*n34*n42-n14*n32*n43+n12*n34*n43+n13*n32*n44-n12*n33*n44,
t13=n13*n24*n42-n14*n23*n42+n14*n22*n43-n12*n24*n43-n13*n22*n44+n12*n23*n44,
t14=n14*n23*n32-n13*n24*n32-n14*n22*n33+n12*n24*n33+n13*n22*n34-n12*n23*n34;
var det=n11*t11+n21*t12+n31*t13+n41*t14;
if(det===0){
var msg="THREE.Matrix4.getInverse(): can't invert matrix, determinant is 0";
if(throwOnDegenerate===true){
throw new Error(msg);
}else{
console.warn(msg);
}
return this.identity();
}
var detInv=1/det;
te[0]=t11*detInv;
te[1]=(n24*n33*n41-n23*n34*n41-n24*n31*n43+n21*n34*n43+n23*n31*n44-n21*n33*n44)*detInv;
te[2]=(n22*n34*n41-n24*n32*n41+n24*n31*n42-n21*n34*n42-n22*n31*n44+n21*n32*n44)*detInv;
te[3]=(n23*n32*n41-n22*n33*n41-n23*n31*n42+n21*n33*n42+n22*n31*n43-n21*n32*n43)*detInv;
te[4]=t12*detInv;
te[5]=(n13*n34*n41-n14*n33*n41+n14*n31*n43-n11*n34*n43-n13*n31*n44+n11*n33*n44)*detInv;
te[6]=(n14*n32*n41-n12*n34*n41-n14*n31*n42+n11*n34*n42+n12*n31*n44-n11*n32*n44)*detInv;
te[7]=(n12*n33*n41-n13*n32*n41+n13*n31*n42-n11*n33*n42-n12*n31*n43+n11*n32*n43)*detInv;
te[8]=t13*detInv;
te[9]=(n14*n23*n41-n13*n24*n41-n14*n21*n43+n11*n24*n43+n13*n21*n44-n11*n23*n44)*detInv;
te[10]=(n12*n24*n41-n14*n22*n41+n14*n21*n42-n11*n24*n42-n12*n21*n44+n11*n22*n44)*detInv;
te[11]=(n13*n22*n41-n12*n23*n41-n13*n21*n42+n11*n23*n42+n12*n21*n43-n11*n22*n43)*detInv;
te[12]=t14*detInv;
te[13]=(n13*n24*n31-n14*n23*n31+n14*n21*n33-n11*n24*n33-n13*n21*n34+n11*n23*n34)*detInv;
te[14]=(n14*n22*n31-n12*n24*n31-n14*n21*n32+n11*n24*n32+n12*n21*n34-n11*n22*n34)*detInv;
te[15]=(n12*n23*n31-n13*n22*n31+n13*n21*n32-n11*n23*n32-n12*n21*n33+n11*n22*n33)*detInv;
return this;
},
scale:function scale(v){
var te=this.elements;
var x=v.x,y=v.y,z=v.z;
te[0]*=x;te[4]*=y;te[8]*=z;
te[1]*=x;te[5]*=y;te[9]*=z;
te[2]*=x;te[6]*=y;te[10]*=z;
te[3]*=x;te[7]*=y;te[11]*=z;
return this;
},
getMaxScaleOnAxis:function getMaxScaleOnAxis(){
var te=this.elements;
var scaleXSq=te[0]*te[0]+te[1]*te[1]+te[2]*te[2];
var scaleYSq=te[4]*te[4]+te[5]*te[5]+te[6]*te[6];
var scaleZSq=te[8]*te[8]+te[9]*te[9]+te[10]*te[10];
return Math.sqrt(Math.max(scaleXSq,scaleYSq,scaleZSq));
},
makeTranslation:function makeTranslation(x,y,z){
this.set(
1,0,0,x,
0,1,0,y,
0,0,1,z,
0,0,0,1);
return this;
},
makeRotationX:function makeRotationX(theta){
var c=Math.cos(theta),s=Math.sin(theta);
this.set(
1,0,0,0,
0,c,-s,0,
0,s,c,0,
0,0,0,1);
return this;
},
makeRotationY:function makeRotationY(theta){
var c=Math.cos(theta),s=Math.sin(theta);
this.set(
c,0,s,0,
0,1,0,0,
-s,0,c,0,
0,0,0,1);
return this;
},
makeRotationZ:function makeRotationZ(theta){
var c=Math.cos(theta),s=Math.sin(theta);
this.set(
c,-s,0,0,
s,c,0,0,
0,0,1,0,
0,0,0,1);
return this;
},
makeRotationAxis:function makeRotationAxis(axis,angle){
var c=Math.cos(angle);
var s=Math.sin(angle);
var t=1-c;
var x=axis.x,y=axis.y,z=axis.z;
var tx=t*x,ty=t*y;
this.set(
tx*x+c,tx*y-s*z,tx*z+s*y,0,
tx*y+s*z,ty*y+c,ty*z-s*x,0,
tx*z-s*y,ty*z+s*x,t*z*z+c,0,
0,0,0,1);
return this;
},
makeScale:function makeScale(x,y,z){
this.set(
x,0,0,0,
0,y,0,0,
0,0,z,0,
0,0,0,1);
return this;
},
compose:function compose(position,quaternion,scale){
this.makeRotationFromQuaternion(quaternion);
this.scale(scale);
this.setPosition(position);
return this;
},
decompose:function(){
var vector,matrix;
return function decompose(position,quaternion,scale){
if(vector===undefined){
vector=new Vector3();
matrix=new Matrix4();
}
var te=this.elements;
var sx=vector.set(te[0],te[1],te[2]).length();
var sy=vector.set(te[4],te[5],te[6]).length();
var sz=vector.set(te[8],te[9],te[10]).length();
var det=this.determinant();
if(det<0){
sx=-sx;
}
position.x=te[12];
position.y=te[13];
position.z=te[14];
matrix.elements.set(this.elements);
var invSX=1/sx;
var invSY=1/sy;
var invSZ=1/sz;
matrix.elements[0]*=invSX;
matrix.elements[1]*=invSX;
matrix.elements[2]*=invSX;
matrix.elements[4]*=invSY;
matrix.elements[5]*=invSY;
matrix.elements[6]*=invSY;
matrix.elements[8]*=invSZ;
matrix.elements[9]*=invSZ;
matrix.elements[10]*=invSZ;
quaternion.setFromRotationMatrix(matrix);
scale.x=sx;
scale.y=sy;
scale.z=sz;
return this;
};
}(),
makeFrustum:function makeFrustum(left,right,bottom,top,near,far){
var te=this.elements;
var x=2*near/(right-left);
var y=2*near/(top-bottom);
var a=(right+left)/(right-left);
var b=(top+bottom)/(top-bottom);
var c=-(far+near)/(far-near);
var d=-2*far*near/(far-near);
te[0]=x;te[4]=0;te[8]=a;te[12]=0;
te[1]=0;te[5]=y;te[9]=b;te[13]=0;
te[2]=0;te[6]=0;te[10]=c;te[14]=d;
te[3]=0;te[7]=0;te[11]=-1;te[15]=0;
return this;
},
makePerspective:function makePerspective(fov,aspect,near,far){
var ymax=near*Math.tan(exports.Math.DEG2RAD*fov*0.5);
var ymin=-ymax;
var xmin=ymin*aspect;
var xmax=ymax*aspect;
return this.makeFrustum(xmin,xmax,ymin,ymax,near,far);
},
makeOrthographic:function makeOrthographic(left,right,top,bottom,near,far){
var te=this.elements;
var w=1.0/(right-left);
var h=1.0/(top-bottom);
var p=1.0/(far-near);
var x=(right+left)*w;
var y=(top+bottom)*h;
var z=(far+near)*p;
te[0]=2*w;te[4]=0;te[8]=0;te[12]=-x;
te[1]=0;te[5]=2*h;te[9]=0;te[13]=-y;
te[2]=0;te[6]=0;te[10]=-2*p;te[14]=-z;
te[3]=0;te[7]=0;te[11]=0;te[15]=1;
return this;
},
equals:function equals(matrix){
var te=this.elements;
var me=matrix.elements;
for(var i=0;i<16;i++){
if(te[i]!==me[i])return false;
}
return true;
},
fromArray:function fromArray(array){
this.elements.set(array);
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
var te=this.elements;
array[offset]=te[0];
array[offset+1]=te[1];
array[offset+2]=te[2];
array[offset+3]=te[3];
array[offset+4]=te[4];
array[offset+5]=te[5];
array[offset+6]=te[6];
array[offset+7]=te[7];
array[offset+8]=te[8];
array[offset+9]=te[9];
array[offset+10]=te[10];
array[offset+11]=te[11];
array[offset+12]=te[12];
array[offset+13]=te[13];
array[offset+14]=te[14];
array[offset+15]=te[15];
return array;
}};
function Quaternion(x,y,z,w){
this._x=x||0;
this._y=y||0;
this._z=z||0;
this._w=w!==undefined?w:1;
}
Quaternion.prototype={
constructor:Quaternion,
get x(){
return this._x;
},
set x(value){
this._x=value;
this.onChangeCallback();
},
get y(){
return this._y;
},
set y(value){
this._y=value;
this.onChangeCallback();
},
get z(){
return this._z;
},
set z(value){
this._z=value;
this.onChangeCallback();
},
get w(){
return this._w;
},
set w(value){
this._w=value;
this.onChangeCallback();
},
set:function set(x,y,z,w){
this._x=x;
this._y=y;
this._z=z;
this._w=w;
this.onChangeCallback();
return this;
},
clone:function clone(){
return new this.constructor(this._x,this._y,this._z,this._w);
},
copy:function copy(quaternion){
this._x=quaternion.x;
this._y=quaternion.y;
this._z=quaternion.z;
this._w=quaternion.w;
this.onChangeCallback();
return this;
},
setFromEuler:function setFromEuler(euler,update){
if((euler&&euler.isEuler)===false){
throw new Error('THREE.Quaternion: .setFromEuler() now expects a Euler rotation rather than a Vector3 and order.');
}
var c1=Math.cos(euler._x/2);
var c2=Math.cos(euler._y/2);
var c3=Math.cos(euler._z/2);
var s1=Math.sin(euler._x/2);
var s2=Math.sin(euler._y/2);
var s3=Math.sin(euler._z/2);
var order=euler.order;
if(order==='XYZ'){
this._x=s1*c2*c3+c1*s2*s3;
this._y=c1*s2*c3-s1*c2*s3;
this._z=c1*c2*s3+s1*s2*c3;
this._w=c1*c2*c3-s1*s2*s3;
}else if(order==='YXZ'){
this._x=s1*c2*c3+c1*s2*s3;
this._y=c1*s2*c3-s1*c2*s3;
this._z=c1*c2*s3-s1*s2*c3;
this._w=c1*c2*c3+s1*s2*s3;
}else if(order==='ZXY'){
this._x=s1*c2*c3-c1*s2*s3;
this._y=c1*s2*c3+s1*c2*s3;
this._z=c1*c2*s3+s1*s2*c3;
this._w=c1*c2*c3-s1*s2*s3;
}else if(order==='ZYX'){
this._x=s1*c2*c3-c1*s2*s3;
this._y=c1*s2*c3+s1*c2*s3;
this._z=c1*c2*s3-s1*s2*c3;
this._w=c1*c2*c3+s1*s2*s3;
}else if(order==='YZX'){
this._x=s1*c2*c3+c1*s2*s3;
this._y=c1*s2*c3+s1*c2*s3;
this._z=c1*c2*s3-s1*s2*c3;
this._w=c1*c2*c3-s1*s2*s3;
}else if(order==='XZY'){
this._x=s1*c2*c3-c1*s2*s3;
this._y=c1*s2*c3-s1*c2*s3;
this._z=c1*c2*s3+s1*s2*c3;
this._w=c1*c2*c3+s1*s2*s3;
}
if(update!==false)this.onChangeCallback();
return this;
},
setFromAxisAngle:function setFromAxisAngle(axis,angle){
var halfAngle=angle/2,s=Math.sin(halfAngle);
this._x=axis.x*s;
this._y=axis.y*s;
this._z=axis.z*s;
this._w=Math.cos(halfAngle);
this.onChangeCallback();
return this;
},
setFromRotationMatrix:function setFromRotationMatrix(m){
var te=m.elements,
m11=te[0],m12=te[4],m13=te[8],
m21=te[1],m22=te[5],m23=te[9],
m31=te[2],m32=te[6],m33=te[10],
trace=m11+m22+m33,
s;
if(trace>0){
s=0.5/Math.sqrt(trace+1.0);
this._w=0.25/s;
this._x=(m32-m23)*s;
this._y=(m13-m31)*s;
this._z=(m21-m12)*s;
}else if(m11>m22&&m11>m33){
s=2.0*Math.sqrt(1.0+m11-m22-m33);
this._w=(m32-m23)/s;
this._x=0.25*s;
this._y=(m12+m21)/s;
this._z=(m13+m31)/s;
}else if(m22>m33){
s=2.0*Math.sqrt(1.0+m22-m11-m33);
this._w=(m13-m31)/s;
this._x=(m12+m21)/s;
this._y=0.25*s;
this._z=(m23+m32)/s;
}else{
s=2.0*Math.sqrt(1.0+m33-m11-m22);
this._w=(m21-m12)/s;
this._x=(m13+m31)/s;
this._y=(m23+m32)/s;
this._z=0.25*s;
}
this.onChangeCallback();
return this;
},
setFromUnitVectors:function(){
var v1,r;
var EPS=0.000001;
return function setFromUnitVectors(vFrom,vTo){
if(v1===undefined)v1=new Vector3();
r=vFrom.dot(vTo)+1;
if(r<EPS){
r=0;
if(Math.abs(vFrom.x)>Math.abs(vFrom.z)){
v1.set(-vFrom.y,vFrom.x,0);
}else{
v1.set(0,-vFrom.z,vFrom.y);
}
}else{
v1.crossVectors(vFrom,vTo);
}
this._x=v1.x;
this._y=v1.y;
this._z=v1.z;
this._w=r;
return this.normalize();
};
}(),
inverse:function inverse(){
return this.conjugate().normalize();
},
conjugate:function conjugate(){
this._x*=-1;
this._y*=-1;
this._z*=-1;
this.onChangeCallback();
return this;
},
dot:function dot(v){
return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w;
},
lengthSq:function lengthSq(){
return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w;
},
length:function length(){
return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w);
},
normalize:function normalize(){
var l=this.length();
if(l===0){
this._x=0;
this._y=0;
this._z=0;
this._w=1;
}else{
l=1/l;
this._x=this._x*l;
this._y=this._y*l;
this._z=this._z*l;
this._w=this._w*l;
}
this.onChangeCallback();
return this;
},
multiply:function multiply(q,p){
if(p!==undefined){
console.warn('THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.');
return this.multiplyQuaternions(q,p);
}
return this.multiplyQuaternions(this,q);
},
premultiply:function premultiply(q){
return this.multiplyQuaternions(q,this);
},
multiplyQuaternions:function multiplyQuaternions(a,b){
var qax=a._x,qay=a._y,qaz=a._z,qaw=a._w;
var qbx=b._x,qby=b._y,qbz=b._z,qbw=b._w;
this._x=qax*qbw+qaw*qbx+qay*qbz-qaz*qby;
this._y=qay*qbw+qaw*qby+qaz*qbx-qax*qbz;
this._z=qaz*qbw+qaw*qbz+qax*qby-qay*qbx;
this._w=qaw*qbw-qax*qbx-qay*qby-qaz*qbz;
this.onChangeCallback();
return this;
},
slerp:function slerp(qb,t){
if(t===0)return this;
if(t===1)return this.copy(qb);
var x=this._x,y=this._y,z=this._z,w=this._w;
var cosHalfTheta=w*qb._w+x*qb._x+y*qb._y+z*qb._z;
if(cosHalfTheta<0){
this._w=-qb._w;
this._x=-qb._x;
this._y=-qb._y;
this._z=-qb._z;
cosHalfTheta=-cosHalfTheta;
}else{
this.copy(qb);
}
if(cosHalfTheta>=1.0){
this._w=w;
this._x=x;
this._y=y;
this._z=z;
return this;
}
var sinHalfTheta=Math.sqrt(1.0-cosHalfTheta*cosHalfTheta);
if(Math.abs(sinHalfTheta)<0.001){
this._w=0.5*(w+this._w);
this._x=0.5*(x+this._x);
this._y=0.5*(y+this._y);
this._z=0.5*(z+this._z);
return this;
}
var halfTheta=Math.atan2(sinHalfTheta,cosHalfTheta);
var ratioA=Math.sin((1-t)*halfTheta)/sinHalfTheta,
ratioB=Math.sin(t*halfTheta)/sinHalfTheta;
this._w=w*ratioA+this._w*ratioB;
this._x=x*ratioA+this._x*ratioB;
this._y=y*ratioA+this._y*ratioB;
this._z=z*ratioA+this._z*ratioB;
this.onChangeCallback();
return this;
},
equals:function equals(quaternion){
return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w;
},
fromArray:function fromArray(array,offset){
if(offset===undefined)offset=0;
this._x=array[offset];
this._y=array[offset+1];
this._z=array[offset+2];
this._w=array[offset+3];
this.onChangeCallback();
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
array[offset]=this._x;
array[offset+1]=this._y;
array[offset+2]=this._z;
array[offset+3]=this._w;
return array;
},
onChange:function onChange(callback){
this.onChangeCallback=callback;
return this;
},
onChangeCallback:function onChangeCallback(){}};
babelHelpers.extends(Quaternion,{
slerp:function slerp(qa,qb,qm,t){
return qm.copy(qa).slerp(qb,t);
},
slerpFlat:function slerpFlat(
dst,dstOffset,src0,srcOffset0,src1,srcOffset1,t){
var x0=src0[srcOffset0+0],
y0=src0[srcOffset0+1],
z0=src0[srcOffset0+2],
w0=src0[srcOffset0+3],
x1=src1[srcOffset1+0],
y1=src1[srcOffset1+1],
z1=src1[srcOffset1+2],
w1=src1[srcOffset1+3];
if(w0!==w1||x0!==x1||y0!==y1||z0!==z1){
var s=1-t,
cos=x0*x1+y0*y1+z0*z1+w0*w1,
dir=cos>=0?1:-1,
sqrSin=1-cos*cos;
if(sqrSin>Number.EPSILON){
var sin=Math.sqrt(sqrSin),
len=Math.atan2(sin,cos*dir);
s=Math.sin(s*len)/sin;
t=Math.sin(t*len)/sin;
}
var tDir=t*dir;
x0=x0*s+x1*tDir;
y0=y0*s+y1*tDir;
z0=z0*s+z1*tDir;
w0=w0*s+w1*tDir;
if(s===1-t){
var f=1/Math.sqrt(x0*x0+y0*y0+z0*z0+w0*w0);
x0*=f;
y0*=f;
z0*=f;
w0*=f;
}
}
dst[dstOffset]=x0;
dst[dstOffset+1]=y0;
dst[dstOffset+2]=z0;
dst[dstOffset+3]=w0;
}});
function Vector3(x,y,z){
this.x=x||0;
this.y=y||0;
this.z=z||0;
}
Vector3.prototype={
constructor:Vector3,
isVector3:true,
set:function set(x,y,z){
this.x=x;
this.y=y;
this.z=z;
return this;
},
setScalar:function setScalar(scalar){
this.x=scalar;
this.y=scalar;
this.z=scalar;
return this;
},
setX:function setX(x){
this.x=x;
return this;
},
setY:function setY(y){
this.y=y;
return this;
},
setZ:function setZ(z){
this.z=z;
return this;
},
setComponent:function setComponent(index,value){
switch(index){
case 0:this.x=value;break;
case 1:this.y=value;break;
case 2:this.z=value;break;
default:throw new Error('index is out of range: '+index);}
},
getComponent:function getComponent(index){
switch(index){
case 0:return this.x;
case 1:return this.y;
case 2:return this.z;
default:throw new Error('index is out of range: '+index);}
},
clone:function clone(){
return new this.constructor(this.x,this.y,this.z);
},
copy:function copy(v){
this.x=v.x;
this.y=v.y;
this.z=v.z;
return this;
},
add:function add(v,w){
if(w!==undefined){
console.warn('THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
return this.addVectors(v,w);
}
this.x+=v.x;
this.y+=v.y;
this.z+=v.z;
return this;
},
addScalar:function addScalar(s){
this.x+=s;
this.y+=s;
this.z+=s;
return this;
},
addVectors:function addVectors(a,b){
this.x=a.x+b.x;
this.y=a.y+b.y;
this.z=a.z+b.z;
return this;
},
addScaledVector:function addScaledVector(v,s){
this.x+=v.x*s;
this.y+=v.y*s;
this.z+=v.z*s;
return this;
},
sub:function sub(v,w){
if(w!==undefined){
console.warn('THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
return this.subVectors(v,w);
}
this.x-=v.x;
this.y-=v.y;
this.z-=v.z;
return this;
},
subScalar:function subScalar(s){
this.x-=s;
this.y-=s;
this.z-=s;
return this;
},
subVectors:function subVectors(a,b){
this.x=a.x-b.x;
this.y=a.y-b.y;
this.z=a.z-b.z;
return this;
},
multiply:function multiply(v,w){
if(w!==undefined){
console.warn('THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.');
return this.multiplyVectors(v,w);
}
this.x*=v.x;
this.y*=v.y;
this.z*=v.z;
return this;
},
multiplyScalar:function multiplyScalar(scalar){
if(isFinite(scalar)){
this.x*=scalar;
this.y*=scalar;
this.z*=scalar;
}else{
this.x=0;
this.y=0;
this.z=0;
}
return this;
},
multiplyVectors:function multiplyVectors(a,b){
this.x=a.x*b.x;
this.y=a.y*b.y;
this.z=a.z*b.z;
return this;
},
applyEuler:function(){
var quaternion;
return function applyEuler(euler){
if((euler&&euler.isEuler)===false){
console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');
}
if(quaternion===undefined)quaternion=new Quaternion();
return this.applyQuaternion(quaternion.setFromEuler(euler));
};
}(),
applyAxisAngle:function(){
var quaternion;
return function applyAxisAngle(axis,angle){
if(quaternion===undefined)quaternion=new Quaternion();
return this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle));
};
}(),
applyMatrix3:function applyMatrix3(m){
var x=this.x,y=this.y,z=this.z;
var e=m.elements;
this.x=e[0]*x+e[3]*y+e[6]*z;
this.y=e[1]*x+e[4]*y+e[7]*z;
this.z=e[2]*x+e[5]*y+e[8]*z;
return this;
},
applyMatrix4:function applyMatrix4(m){
var x=this.x,y=this.y,z=this.z;
var e=m.elements;
this.x=e[0]*x+e[4]*y+e[8]*z+e[12];
this.y=e[1]*x+e[5]*y+e[9]*z+e[13];
this.z=e[2]*x+e[6]*y+e[10]*z+e[14];
return this;
},
applyProjection:function applyProjection(m){
var x=this.x,y=this.y,z=this.z;
var e=m.elements;
var d=1/(e[3]*x+e[7]*y+e[11]*z+e[15]);
this.x=(e[0]*x+e[4]*y+e[8]*z+e[12])*d;
this.y=(e[1]*x+e[5]*y+e[9]*z+e[13])*d;
this.z=(e[2]*x+e[6]*y+e[10]*z+e[14])*d;
return this;
},
applyQuaternion:function applyQuaternion(q){
var x=this.x,y=this.y,z=this.z;
var qx=q.x,qy=q.y,qz=q.z,qw=q.w;
var ix=qw*x+qy*z-qz*y;
var iy=qw*y+qz*x-qx*z;
var iz=qw*z+qx*y-qy*x;
var iw=-qx*x-qy*y-qz*z;
this.x=ix*qw+iw*-qx+iy*-qz-iz*-qy;
this.y=iy*qw+iw*-qy+iz*-qx-ix*-qz;
this.z=iz*qw+iw*-qz+ix*-qy-iy*-qx;
return this;
},
project:function(){
var matrix;
return function project(camera){
if(matrix===undefined)matrix=new Matrix4();
matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld));
return this.applyProjection(matrix);
};
}(),
unproject:function(){
var matrix;
return function unproject(camera){
if(matrix===undefined)matrix=new Matrix4();
matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix));
return this.applyProjection(matrix);
};
}(),
transformDirection:function transformDirection(m){
var x=this.x,y=this.y,z=this.z;
var e=m.elements;
this.x=e[0]*x+e[4]*y+e[8]*z;
this.y=e[1]*x+e[5]*y+e[9]*z;
this.z=e[2]*x+e[6]*y+e[10]*z;
return this.normalize();
},
divide:function divide(v){
this.x/=v.x;
this.y/=v.y;
this.z/=v.z;
return this;
},
divideScalar:function divideScalar(scalar){
return this.multiplyScalar(1/scalar);
},
min:function min(v){
this.x=Math.min(this.x,v.x);
this.y=Math.min(this.y,v.y);
this.z=Math.min(this.z,v.z);
return this;
},
max:function max(v){
this.x=Math.max(this.x,v.x);
this.y=Math.max(this.y,v.y);
this.z=Math.max(this.z,v.z);
return this;
},
clamp:function clamp(min,max){
this.x=Math.max(min.x,Math.min(max.x,this.x));
this.y=Math.max(min.y,Math.min(max.y,this.y));
this.z=Math.max(min.z,Math.min(max.z,this.z));
return this;
},
clampScalar:function(){
var min,max;
return function clampScalar(minVal,maxVal){
if(min===undefined){
min=new Vector3();
max=new Vector3();
}
min.set(minVal,minVal,minVal);
max.set(maxVal,maxVal,maxVal);
return this.clamp(min,max);
};
}(),
clampLength:function clampLength(min,max){
var length=this.length();
return this.multiplyScalar(Math.max(min,Math.min(max,length))/length);
},
floor:function floor(){
this.x=Math.floor(this.x);
this.y=Math.floor(this.y);
this.z=Math.floor(this.z);
return this;
},
ceil:function ceil(){
this.x=Math.ceil(this.x);
this.y=Math.ceil(this.y);
this.z=Math.ceil(this.z);
return this;
},
round:function round(){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
this.z=Math.round(this.z);
return this;
},
roundToZero:function roundToZero(){
this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);
this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);
this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z);
return this;
},
negate:function negate(){
this.x=-this.x;
this.y=-this.y;
this.z=-this.z;
return this;
},
dot:function dot(v){
return this.x*v.x+this.y*v.y+this.z*v.z;
},
lengthSq:function lengthSq(){
return this.x*this.x+this.y*this.y+this.z*this.z;
},
length:function length(){
return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);
},
lengthManhattan:function lengthManhattan(){
return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z);
},
normalize:function normalize(){
return this.divideScalar(this.length());
},
setLength:function setLength(length){
return this.multiplyScalar(length/this.length());
},
lerp:function lerp(v,alpha){
this.x+=(v.x-this.x)*alpha;
this.y+=(v.y-this.y)*alpha;
this.z+=(v.z-this.z)*alpha;
return this;
},
lerpVectors:function lerpVectors(v1,v2,alpha){
return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);
},
cross:function cross(v,w){
if(w!==undefined){
console.warn('THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.');
return this.crossVectors(v,w);
}
var x=this.x,y=this.y,z=this.z;
this.x=y*v.z-z*v.y;
this.y=z*v.x-x*v.z;
this.z=x*v.y-y*v.x;
return this;
},
crossVectors:function crossVectors(a,b){
var ax=a.x,ay=a.y,az=a.z;
var bx=b.x,by=b.y,bz=b.z;
this.x=ay*bz-az*by;
this.y=az*bx-ax*bz;
this.z=ax*by-ay*bx;
return this;
},
projectOnVector:function projectOnVector(vector){
var scalar=vector.dot(this)/vector.lengthSq();
return this.copy(vector).multiplyScalar(scalar);
},
projectOnPlane:function(){
var v1;
return function projectOnPlane(planeNormal){
if(v1===undefined)v1=new Vector3();
v1.copy(this).projectOnVector(planeNormal);
return this.sub(v1);
};
}(),
reflect:function(){
var v1;
return function reflect(normal){
if(v1===undefined)v1=new Vector3();
return this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)));
};
}(),
angleTo:function angleTo(v){
var theta=this.dot(v)/Math.sqrt(this.lengthSq()*v.lengthSq());
return Math.acos(exports.Math.clamp(theta,-1,1));
},
distanceTo:function distanceTo(v){
return Math.sqrt(this.distanceToSquared(v));
},
distanceToSquared:function distanceToSquared(v){
var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;
return dx*dx+dy*dy+dz*dz;
},
distanceToManhattan:function distanceToManhattan(v){
return Math.abs(this.x-v.x)+Math.abs(this.y-v.y)+Math.abs(this.z-v.z);
},
setFromSpherical:function setFromSpherical(s){
var sinPhiRadius=Math.sin(s.phi)*s.radius;
this.x=sinPhiRadius*Math.sin(s.theta);
this.y=Math.cos(s.phi)*s.radius;
this.z=sinPhiRadius*Math.cos(s.theta);
return this;
},
setFromMatrixPosition:function setFromMatrixPosition(m){
return this.setFromMatrixColumn(m,3);
},
setFromMatrixScale:function setFromMatrixScale(m){
var sx=this.setFromMatrixColumn(m,0).length();
var sy=this.setFromMatrixColumn(m,1).length();
var sz=this.setFromMatrixColumn(m,2).length();
this.x=sx;
this.y=sy;
this.z=sz;
return this;
},
setFromMatrixColumn:function setFromMatrixColumn(m,index){
if(typeof m==='number'){
console.warn('THREE.Vector3: setFromMatrixColumn now expects ( matrix, index ).');
var temp=m;
m=index;
index=temp;
}
return this.fromArray(m.elements,index*4);
},
equals:function equals(v){
return v.x===this.x&&v.y===this.y&&v.z===this.z;
},
fromArray:function fromArray(array,offset){
if(offset===undefined)offset=0;
this.x=array[offset];
this.y=array[offset+1];
this.z=array[offset+2];
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
array[offset]=this.x;
array[offset+1]=this.y;
array[offset+2]=this.z;
return array;
},
fromAttribute:function fromAttribute(attribute,index,offset){
if(offset===undefined)offset=0;
index=index*attribute.itemSize+offset;
this.x=attribute.array[index];
this.y=attribute.array[index+1];
this.z=attribute.array[index+2];
return this;
}};
function SpritePlugin(renderer,sprites){
var gl=renderer.context;
var state=renderer.state;
var vertexBuffer,elementBuffer;
var program,attributes,uniforms;
var texture;
var spritePosition=new Vector3();
var spriteRotation=new Quaternion();
var spriteScale=new Vector3();
function init(){
var vertices=new Float32Array([
-0.5,-0.5,0,0,
0.5,-0.5,1,0,
0.5,0.5,1,1,
-0.5,0.5,0,1]);
var faces=new Uint16Array([
0,1,2,
0,2,3]);
vertexBuffer=gl.createBuffer();
elementBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,faces,gl.STATIC_DRAW);
program=createProgram();
attributes={
position:gl.getAttribLocation(program,'position'),
uv:gl.getAttribLocation(program,'uv')};
uniforms={
uvOffset:gl.getUniformLocation(program,'uvOffset'),
uvScale:gl.getUniformLocation(program,'uvScale'),
rotation:gl.getUniformLocation(program,'rotation'),
scale:gl.getUniformLocation(program,'scale'),
color:gl.getUniformLocation(program,'color'),
map:gl.getUniformLocation(program,'map'),
opacity:gl.getUniformLocation(program,'opacity'),
modelViewMatrix:gl.getUniformLocation(program,'modelViewMatrix'),
projectionMatrix:gl.getUniformLocation(program,'projectionMatrix'),
fogType:gl.getUniformLocation(program,'fogType'),
fogDensity:gl.getUniformLocation(program,'fogDensity'),
fogNear:gl.getUniformLocation(program,'fogNear'),
fogFar:gl.getUniformLocation(program,'fogFar'),
fogColor:gl.getUniformLocation(program,'fogColor'),
alphaTest:gl.getUniformLocation(program,'alphaTest')};
var canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');
canvas.width=8;
canvas.height=8;
var context=canvas.getContext('2d');
context.fillStyle='white';
context.fillRect(0,0,8,8);
texture=new Texture(canvas);
texture.needsUpdate=true;
}
this.render=function(scene,camera){
if(sprites.length===0)return;
if(program===undefined){
init();
}
gl.useProgram(program);
state.initAttributes();
state.enableAttribute(attributes.position);
state.enableAttribute(attributes.uv);
state.disableUnusedAttributes();
state.disable(gl.CULL_FACE);
state.enable(gl.BLEND);
gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
gl.vertexAttribPointer(attributes.position,2,gl.FLOAT,false,2*8,0);
gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,false,2*8,8);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer);
gl.uniformMatrix4fv(uniforms.projectionMatrix,false,camera.projectionMatrix.elements);
state.activeTexture(gl.TEXTURE0);
gl.uniform1i(uniforms.map,0);
var oldFogType=0;
var sceneFogType=0;
var fog=scene.fog;
if(fog){
gl.uniform3f(uniforms.fogColor,fog.color.r,fog.color.g,fog.color.b);
if(fog&&fog.isFog){
gl.uniform1f(uniforms.fogNear,fog.near);
gl.uniform1f(uniforms.fogFar,fog.far);
gl.uniform1i(uniforms.fogType,1);
oldFogType=1;
sceneFogType=1;
}else if(fog&&fog.isFogExp2){
gl.uniform1f(uniforms.fogDensity,fog.density);
gl.uniform1i(uniforms.fogType,2);
oldFogType=2;
sceneFogType=2;
}
}else{
gl.uniform1i(uniforms.fogType,0);
oldFogType=0;
sceneFogType=0;
}
for(var i=0,l=sprites.length;i<l;i++){
var sprite=sprites[i];
sprite.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,sprite.matrixWorld);
sprite.z=-sprite.modelViewMatrix.elements[14];
}
sprites.sort(painterSortStable);
var scale=[];
for(var i=0,l=sprites.length;i<l;i++){
var sprite=sprites[i];
var material=sprite.material;
if(material.visible===false)continue;
gl.uniform1f(uniforms.alphaTest,material.alphaTest);
gl.uniformMatrix4fv(uniforms.modelViewMatrix,false,sprite.modelViewMatrix.elements);
sprite.matrixWorld.decompose(spritePosition,spriteRotation,spriteScale);
scale[0]=spriteScale.x;
scale[1]=spriteScale.y;
var fogType=0;
if(scene.fog&&material.fog){
fogType=sceneFogType;
}
if(oldFogType!==fogType){
gl.uniform1i(uniforms.fogType,fogType);
oldFogType=fogType;
}
if(material.map!==null){
gl.uniform2f(uniforms.uvOffset,material.map.offset.x,material.map.offset.y);
gl.uniform2f(uniforms.uvScale,material.map.repeat.x,material.map.repeat.y);
}else{
gl.uniform2f(uniforms.uvOffset,0,0);
gl.uniform2f(uniforms.uvScale,1,1);
}
gl.uniform1f(uniforms.opacity,material.opacity);
gl.uniform3f(uniforms.color,material.color.r,material.color.g,material.color.b);
gl.uniform1f(uniforms.rotation,material.rotation);
gl.uniform2fv(uniforms.scale,scale);
state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst);
state.setDepthTest(material.depthTest);
state.setDepthWrite(material.depthWrite);
if(material.map){
renderer.setTexture2D(material.map,0);
}else{
renderer.setTexture2D(texture,0);
}
gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);
}
state.enable(gl.CULL_FACE);
renderer.resetGLState();
};
function createProgram(){
var program=gl.createProgram();
var vertexShader=gl.createShader(gl.VERTEX_SHADER);
var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(vertexShader,[
'precision '+renderer.getPrecision()+' float;',
'uniform mat4 modelViewMatrix;',
'uniform mat4 projectionMatrix;',
'uniform float rotation;',
'uniform vec2 scale;',
'uniform vec2 uvOffset;',
'uniform vec2 uvScale;',
'attribute vec2 position;',
'attribute vec2 uv;',
'varying vec2 vUV;',
'void main() {',
'vUV = uvOffset + uv * uvScale;',
'vec2 alignedPosition = position * scale;',
'vec2 rotatedPosition;',
'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',
'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',
'vec4 finalPosition;',
'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',
'finalPosition.xy += rotatedPosition;',
'finalPosition = projectionMatrix * finalPosition;',
'gl_Position = finalPosition;',
'}'].
join('\n'));
gl.shaderSource(fragmentShader,[
'precision '+renderer.getPrecision()+' float;',
'uniform vec3 color;',
'uniform sampler2D map;',
'uniform float opacity;',
'uniform int fogType;',
'uniform vec3 fogColor;',
'uniform float fogDensity;',
'uniform float fogNear;',
'uniform float fogFar;',
'uniform float alphaTest;',
'varying vec2 vUV;',
'void main() {',
'vec4 texture = texture2D( map, vUV );',
'if ( texture.a < alphaTest ) discard;',
'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',
'if ( fogType > 0 ) {',
'float depth = gl_FragCoord.z / gl_FragCoord.w;',
'float fogFactor = 0.0;',
'if ( fogType == 1 ) {',
'fogFactor = smoothstep( fogNear, fogFar, depth );',
'} else {',
'const float LOG2 = 1.442695;',
'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',
'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',
'}',
'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',
'}',
'}'].
join('\n'));
gl.compileShader(vertexShader);
gl.compileShader(fragmentShader);
gl.attachShader(program,vertexShader);
gl.attachShader(program,fragmentShader);
gl.linkProgram(program);
return program;
}
function painterSortStable(a,b){
if(a.renderOrder!==b.renderOrder){
return a.renderOrder-b.renderOrder;
}else if(a.z!==b.z){
return b.z-a.z;
}else{
return b.id-a.id;
}
}
}
function Box2(min,max){
this.min=min!==undefined?min:new Vector2(+Infinity,+Infinity);
this.max=max!==undefined?max:new Vector2(-Infinity,-Infinity);
}
Box2.prototype={
constructor:Box2,
set:function set(min,max){
this.min.copy(min);
this.max.copy(max);
return this;
},
setFromPoints:function setFromPoints(points){
this.makeEmpty();
for(var i=0,il=points.length;i<il;i++){
this.expandByPoint(points[i]);
}
return this;
},
setFromCenterAndSize:function(){
var v1=new Vector2();
return function setFromCenterAndSize(center,size){
var halfSize=v1.copy(size).multiplyScalar(0.5);
this.min.copy(center).sub(halfSize);
this.max.copy(center).add(halfSize);
return this;
};
}(),
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(box){
this.min.copy(box.min);
this.max.copy(box.max);
return this;
},
makeEmpty:function makeEmpty(){
this.min.x=this.min.y=+Infinity;
this.max.x=this.max.y=-Infinity;
return this;
},
isEmpty:function isEmpty(){
return this.max.x<this.min.x||this.max.y<this.min.y;
},
center:function center(optionalTarget){
var result=optionalTarget||new Vector2();
return result.addVectors(this.min,this.max).multiplyScalar(0.5);
},
size:function size(optionalTarget){
var result=optionalTarget||new Vector2();
return result.subVectors(this.max,this.min);
},
expandByPoint:function expandByPoint(point){
this.min.min(point);
this.max.max(point);
return this;
},
expandByVector:function expandByVector(vector){
this.min.sub(vector);
this.max.add(vector);
return this;
},
expandByScalar:function expandByScalar(scalar){
this.min.addScalar(-scalar);
this.max.addScalar(scalar);
return this;
},
containsPoint:function containsPoint(point){
if(point.x<this.min.x||point.x>this.max.x||
point.y<this.min.y||point.y>this.max.y){
return false;
}
return true;
},
containsBox:function containsBox(box){
if(this.min.x<=box.min.x&&box.max.x<=this.max.x&&
this.min.y<=box.min.y&&box.max.y<=this.max.y){
return true;
}
return false;
},
getParameter:function getParameter(point,optionalTarget){
var result=optionalTarget||new Vector2();
return result.set(
(point.x-this.min.x)/(this.max.x-this.min.x),
(point.y-this.min.y)/(this.max.y-this.min.y));
},
intersectsBox:function intersectsBox(box){
if(box.max.x<this.min.x||box.min.x>this.max.x||
box.max.y<this.min.y||box.min.y>this.max.y){
return false;
}
return true;
},
clampPoint:function clampPoint(point,optionalTarget){
var result=optionalTarget||new Vector2();
return result.copy(point).clamp(this.min,this.max);
},
distanceToPoint:function(){
var v1=new Vector2();
return function distanceToPoint(point){
var clampedPoint=v1.copy(point).clamp(this.min,this.max);
return clampedPoint.sub(point).length();
};
}(),
intersect:function intersect(box){
this.min.max(box.min);
this.max.min(box.max);
return this;
},
union:function union(box){
this.min.min(box.min);
this.max.max(box.max);
return this;
},
translate:function translate(offset){
this.min.add(offset);
this.max.add(offset);
return this;
},
equals:function equals(box){
return box.min.equals(this.min)&&box.max.equals(this.max);
}};
function LensFlarePlugin(renderer,flares){
var gl=renderer.context;
var state=renderer.state;
var vertexBuffer,elementBuffer;
var shader,program,attributes,uniforms;
var tempTexture,occlusionTexture;
function init(){
var vertices=new Float32Array([
-1,-1,0,0,
1,-1,1,0,
1,1,1,1,
-1,1,0,1]);
var faces=new Uint16Array([
0,1,2,
0,2,3]);
vertexBuffer=gl.createBuffer();
elementBuffer=gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,faces,gl.STATIC_DRAW);
tempTexture=gl.createTexture();
occlusionTexture=gl.createTexture();
state.bindTexture(gl.TEXTURE_2D,tempTexture);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGB,16,16,0,gl.RGB,gl.UNSIGNED_BYTE,null);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);
state.bindTexture(gl.TEXTURE_2D,occlusionTexture);
gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,16,16,0,gl.RGBA,gl.UNSIGNED_BYTE,null);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);
gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);
shader={
vertexShader:[
"uniform lowp int renderType;",
"uniform vec3 screenPosition;",
"uniform vec2 scale;",
"uniform float rotation;",
"uniform sampler2D occlusionMap;",
"attribute vec2 position;",
"attribute vec2 uv;",
"varying vec2 vUV;",
"varying float vVisibility;",
"void main() {",
"vUV = uv;",
"vec2 pos = position;",
"if ( renderType == 2 ) {",
"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );",
"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );",
"vVisibility = visibility.r / 9.0;",
"vVisibility *= 1.0 - visibility.g / 9.0;",
"vVisibility *= visibility.b / 9.0;",
"vVisibility *= 1.0 - visibility.a / 9.0;",
"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;",
"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;",
"}",
"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );",
"}"].
join("\n"),
fragmentShader:[
"uniform lowp int renderType;",
"uniform sampler2D map;",
"uniform float opacity;",
"uniform vec3 color;",
"varying vec2 vUV;",
"varying float vVisibility;",
"void main() {",
"if ( renderType == 0 ) {",
"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );",
"} else if ( renderType == 1 ) {",
"gl_FragColor = texture2D( map, vUV );",
"} else {",
"vec4 texture = texture2D( map, vUV );",
"texture.a *= opacity * vVisibility;",
"gl_FragColor = texture;",
"gl_FragColor.rgb *= color;",
"}",
"}"].
join("\n")};
program=createProgram(shader);
attributes={
vertex:gl.getAttribLocation(program,"position"),
uv:gl.getAttribLocation(program,"uv")};
uniforms={
renderType:gl.getUniformLocation(program,"renderType"),
map:gl.getUniformLocation(program,"map"),
occlusionMap:gl.getUniformLocation(program,"occlusionMap"),
opacity:gl.getUniformLocation(program,"opacity"),
color:gl.getUniformLocation(program,"color"),
scale:gl.getUniformLocation(program,"scale"),
rotation:gl.getUniformLocation(program,"rotation"),
screenPosition:gl.getUniformLocation(program,"screenPosition")};
}
this.render=function(scene,camera,viewport){
if(flares.length===0)return;
var tempPosition=new Vector3();
var invAspect=viewport.w/viewport.z,
halfViewportWidth=viewport.z*0.5,
halfViewportHeight=viewport.w*0.5;
var size=16/viewport.w,
scale=new Vector2(size*invAspect,size);
var screenPosition=new Vector3(1,1,0),
screenPositionPixels=new Vector2(1,1);
var validArea=new Box2();
validArea.min.set(0,0);
validArea.max.set(viewport.z-16,viewport.w-16);
if(program===undefined){
init();
}
gl.useProgram(program);
state.initAttributes();
state.enableAttribute(attributes.vertex);
state.enableAttribute(attributes.uv);
state.disableUnusedAttributes();
gl.uniform1i(uniforms.occlusionMap,0);
gl.uniform1i(uniforms.map,1);
gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer);
gl.vertexAttribPointer(attributes.vertex,2,gl.FLOAT,false,2*8,0);
gl.vertexAttribPointer(attributes.uv,2,gl.FLOAT,false,2*8,8);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,elementBuffer);
state.disable(gl.CULL_FACE);
state.setDepthWrite(false);
for(var i=0,l=flares.length;i<l;i++){
size=16/viewport.w;
scale.set(size*invAspect,size);
var flare=flares[i];
tempPosition.set(flare.matrixWorld.elements[12],flare.matrixWorld.elements[13],flare.matrixWorld.elements[14]);
tempPosition.applyMatrix4(camera.matrixWorldInverse);
tempPosition.applyProjection(camera.projectionMatrix);
screenPosition.copy(tempPosition);
screenPositionPixels.x=viewport.x+screenPosition.x*halfViewportWidth+halfViewportWidth-8;
screenPositionPixels.y=viewport.y+screenPosition.y*halfViewportHeight+halfViewportHeight-8;
if(validArea.containsPoint(screenPositionPixels)===true){
state.activeTexture(gl.TEXTURE0);
state.bindTexture(gl.TEXTURE_2D,null);
state.activeTexture(gl.TEXTURE1);
state.bindTexture(gl.TEXTURE_2D,tempTexture);
gl.copyTexImage2D(gl.TEXTURE_2D,0,gl.RGB,screenPositionPixels.x,screenPositionPixels.y,16,16,0);
gl.uniform1i(uniforms.renderType,0);
gl.uniform2f(uniforms.scale,scale.x,scale.y);
gl.uniform3f(uniforms.screenPosition,screenPosition.x,screenPosition.y,screenPosition.z);
state.disable(gl.BLEND);
state.enable(gl.DEPTH_TEST);
gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);
state.activeTexture(gl.TEXTURE0);
state.bindTexture(gl.TEXTURE_2D,occlusionTexture);
gl.copyTexImage2D(gl.TEXTURE_2D,0,gl.RGBA,screenPositionPixels.x,screenPositionPixels.y,16,16,0);
gl.uniform1i(uniforms.renderType,1);
state.disable(gl.DEPTH_TEST);
state.activeTexture(gl.TEXTURE1);
state.bindTexture(gl.TEXTURE_2D,tempTexture);
gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);
flare.positionScreen.copy(screenPosition);
if(flare.customUpdateCallback){
flare.customUpdateCallback(flare);
}else{
flare.updateLensFlares();
}
gl.uniform1i(uniforms.renderType,2);
state.enable(gl.BLEND);
for(var j=0,jl=flare.lensFlares.length;j<jl;j++){
var sprite=flare.lensFlares[j];
if(sprite.opacity>0.001&&sprite.scale>0.001){
screenPosition.x=sprite.x;
screenPosition.y=sprite.y;
screenPosition.z=sprite.z;
size=sprite.size*sprite.scale/viewport.w;
scale.x=size*invAspect;
scale.y=size;
gl.uniform3f(uniforms.screenPosition,screenPosition.x,screenPosition.y,screenPosition.z);
gl.uniform2f(uniforms.scale,scale.x,scale.y);
gl.uniform1f(uniforms.rotation,sprite.rotation);
gl.uniform1f(uniforms.opacity,sprite.opacity);
gl.uniform3f(uniforms.color,sprite.color.r,sprite.color.g,sprite.color.b);
state.setBlending(sprite.blending,sprite.blendEquation,sprite.blendSrc,sprite.blendDst);
renderer.setTexture2D(sprite.texture,1);
gl.drawElements(gl.TRIANGLES,6,gl.UNSIGNED_SHORT,0);
}
}
}
}
state.enable(gl.CULL_FACE);
state.enable(gl.DEPTH_TEST);
state.setDepthWrite(true);
renderer.resetGLState();
};
function createProgram(shader){
var program=gl.createProgram();
var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);
var vertexShader=gl.createShader(gl.VERTEX_SHADER);
var prefix="precision "+renderer.getPrecision()+" float;\n";
gl.shaderSource(fragmentShader,prefix+shader.fragmentShader);
gl.shaderSource(vertexShader,prefix+shader.vertexShader);
gl.compileShader(fragmentShader);
gl.compileShader(vertexShader);
gl.attachShader(program,fragmentShader);
gl.attachShader(program,vertexShader);
gl.linkProgram(program);
return program;
}
}
function CubeTexture(images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding){
images=images!==undefined?images:[];
mapping=mapping!==undefined?mapping:CubeReflectionMapping;
Texture.call(this,images,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);
this.flipY=false;
}
CubeTexture.prototype=Object.create(Texture.prototype);
CubeTexture.prototype.constructor=CubeTexture;
CubeTexture.prototype.isCubeTexture=true;
Object.defineProperty(CubeTexture.prototype,'images',{
get:function get(){
return this.image;
},
set:function set(value){
this.image=value;
}});
var emptyTexture=new Texture();
var emptyCubeTexture=new CubeTexture();
function UniformContainer(){
this.seq=[];
this.map={};
}
var arrayCacheF32=[];
var arrayCacheI32=[];
function flatten(array,nBlocks,blockSize){
var firstElem=array[0];
if(firstElem<=0||firstElem>0)return array;
var n=nBlocks*blockSize,
r=arrayCacheF32[n];
if(r===undefined){
r=new Float32Array(n);
arrayCacheF32[n]=r;
}
if(nBlocks!==0){
firstElem.toArray(r,0);
for(var i=1,offset=0;i!==nBlocks;++i){
offset+=blockSize;
array[i].toArray(r,offset);
}
}
return r;
}
function allocTexUnits(renderer,n){
var r=arrayCacheI32[n];
if(r===undefined){
r=new Int32Array(n);
arrayCacheI32[n]=r;
}
for(var i=0;i!==n;++i){
r[i]=renderer.allocTextureUnit();}
return r;
}
function setValue1f(gl,v){gl.uniform1f(this.addr,v);}
function setValue1i(gl,v){gl.uniform1i(this.addr,v);}
function setValue2fv(gl,v){
if(v.x===undefined)gl.uniform2fv(this.addr,v);else
gl.uniform2f(this.addr,v.x,v.y);
}
function setValue3fv(gl,v){
if(v.x!==undefined)
gl.uniform3f(this.addr,v.x,v.y,v.z);else
if(v.r!==undefined)
gl.uniform3f(this.addr,v.r,v.g,v.b);else
gl.uniform3fv(this.addr,v);
}
function setValue4fv(gl,v){
if(v.x===undefined)gl.uniform4fv(this.addr,v);else
gl.uniform4f(this.addr,v.x,v.y,v.z,v.w);
}
function setValue2fm(gl,v){
gl.uniformMatrix2fv(this.addr,false,v.elements||v);
}
function setValue3fm(gl,v){
gl.uniformMatrix3fv(this.addr,false,v.elements||v);
}
function setValue4fm(gl,v){
gl.uniformMatrix4fv(this.addr,false,v.elements||v);
}
function setValueT1(gl,v,renderer){
var unit=renderer.allocTextureUnit();
gl.uniform1i(this.addr,unit);
renderer.setTexture2D(v||emptyTexture,unit);
}
function setValueT6(gl,v,renderer){
var unit=renderer.allocTextureUnit();
gl.uniform1i(this.addr,unit);
renderer.setTextureCube(v||emptyCubeTexture,unit);
}
function setValue2iv(gl,v){gl.uniform2iv(this.addr,v);}
function setValue3iv(gl,v){gl.uniform3iv(this.addr,v);}
function setValue4iv(gl,v){gl.uniform4iv(this.addr,v);}
function getSingularSetter(type){
switch(type){
case 0x1406:return setValue1f;
case 0x8b50:return setValue2fv;
case 0x8b51:return setValue3fv;
case 0x8b52:return setValue4fv;
case 0x8b5a:return setValue2fm;
case 0x8b5b:return setValue3fm;
case 0x8b5c:return setValue4fm;
case 0x8b5e:return setValueT1;
case 0x8b60:return setValueT6;
case 0x1404:case 0x8b56:return setValue1i;
case 0x8b53:case 0x8b57:return setValue2iv;
case 0x8b54:case 0x8b58:return setValue3iv;
case 0x8b55:case 0x8b59:return setValue4iv;}
}
function setValue1fv(gl,v){gl.uniform1fv(this.addr,v);}
function setValue1iv(gl,v){gl.uniform1iv(this.addr,v);}
function setValueV2a(gl,v){
gl.uniform2fv(this.addr,flatten(v,this.size,2));
}
function setValueV3a(gl,v){
gl.uniform3fv(this.addr,flatten(v,this.size,3));
}
function setValueV4a(gl,v){
gl.uniform4fv(this.addr,flatten(v,this.size,4));
}
function setValueM2a(gl,v){
gl.uniformMatrix2fv(this.addr,false,flatten(v,this.size,4));
}
function setValueM3a(gl,v){
gl.uniformMatrix3fv(this.addr,false,flatten(v,this.size,9));
}
function setValueM4a(gl,v){
gl.uniformMatrix4fv(this.addr,false,flatten(v,this.size,16));
}
function setValueT1a(gl,v,renderer){
var n=v.length,
units=allocTexUnits(renderer,n);
gl.uniform1iv(this.addr,units);
for(var i=0;i!==n;++i){
renderer.setTexture2D(v[i]||emptyTexture,units[i]);
}
}
function setValueT6a(gl,v,renderer){
var n=v.length,
units=allocTexUnits(renderer,n);
gl.uniform1iv(this.addr,units);
for(var i=0;i!==n;++i){
renderer.setTextureCube(v[i]||emptyCubeTexture,units[i]);
}
}
function getPureArraySetter(type){
switch(type){
case 0x1406:return setValue1fv;
case 0x8b50:return setValueV2a;
case 0x8b51:return setValueV3a;
case 0x8b52:return setValueV4a;
case 0x8b5a:return setValueM2a;
case 0x8b5b:return setValueM3a;
case 0x8b5c:return setValueM4a;
case 0x8b5e:return setValueT1a;
case 0x8b60:return setValueT6a;
case 0x1404:case 0x8b56:return setValue1iv;
case 0x8b53:case 0x8b57:return setValue2iv;
case 0x8b54:case 0x8b58:return setValue3iv;
case 0x8b55:case 0x8b59:return setValue4iv;}
}
function SingleUniform(id,activeInfo,addr){
this.id=id;
this.addr=addr;
this.setValue=getSingularSetter(activeInfo.type);
}
function PureArrayUniform(id,activeInfo,addr){
this.id=id;
this.addr=addr;
this.size=activeInfo.size;
this.setValue=getPureArraySetter(activeInfo.type);
}
function StructuredUniform(id){
this.id=id;
UniformContainer.call(this);
}
StructuredUniform.prototype.setValue=function(gl,value){
var seq=this.seq;
for(var i=0,n=seq.length;i!==n;++i){
var u=seq[i];
u.setValue(gl,value[u.id]);
}
};
var RePathPart=/([\w\d_]+)(\])?(\[|\.)?/g;
function addUniform(container,uniformObject){
container.seq.push(uniformObject);
container.map[uniformObject.id]=uniformObject;
}
function parseUniform(activeInfo,addr,container){
var path=activeInfo.name,
pathLength=path.length;
RePathPart.lastIndex=0;
for(;;){
var match=RePathPart.exec(path),
matchEnd=RePathPart.lastIndex,
id=match[1],
idIsIndex=match[2]===']',
subscript=match[3];
if(idIsIndex)id=id|0;
if(subscript===undefined||
subscript==='['&&matchEnd+2===pathLength){
addUniform(container,subscript===undefined?
new SingleUniform(id,activeInfo,addr):
new PureArrayUniform(id,activeInfo,addr));
break;
}else{
var map=container.map,
next=map[id];
if(next===undefined){
next=new StructuredUniform(id);
addUniform(container,next);
}
container=next;
}
}
}
function WebGLUniforms(gl,program,renderer){
UniformContainer.call(this);
this.renderer=renderer;
var n=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);
for(var i=0;i!==n;++i){
var info=gl.getActiveUniform(program,i),
path=info.name,
addr=gl.getUniformLocation(program,path);
parseUniform(info,addr,this);
}
}
WebGLUniforms.prototype.setValue=function(gl,name,value){
var u=this.map[name];
if(u!==undefined)u.setValue(gl,value,this.renderer);
};
WebGLUniforms.prototype.set=function(gl,object,name){
var u=this.map[name];
if(u!==undefined)u.setValue(gl,object[name],this.renderer);
};
WebGLUniforms.prototype.setOptional=function(gl,object,name){
var v=object[name];
if(v!==undefined)this.setValue(gl,name,v);
};
WebGLUniforms.upload=function(gl,seq,values,renderer){
for(var i=0,n=seq.length;i!==n;++i){
var u=seq[i],
v=values[u.id];
if(v.needsUpdate!==false){
u.setValue(gl,v.value,renderer);
}
}
};
WebGLUniforms.seqWithValue=function(seq,values){
var r=[];
for(var i=0,n=seq.length;i!==n;++i){
var u=seq[i];
if(u.id in values)r.push(u);
}
return r;
};
WebGLUniforms.splitDynamic=function(seq,values){
var r=null,
n=seq.length,
w=0;
for(var i=0;i!==n;++i){
var u=seq[i],
v=values[u.id];
if(v&&v.dynamic===true){
if(r===null)r=[];
r.push(u);
}else{
if(w<i)seq[w]=u;
++w;
}
}
if(w<n)seq.length=w;
return r;
};
WebGLUniforms.evalDynamic=function(seq,values,object,camera){
for(var i=0,n=seq.length;i!==n;++i){
var v=values[seq[i].id],
f=v.onUpdateCallback;
if(f!==undefined)f.call(v,object,camera);
}
};
function WebGLTextures(_gl,extensions,state,properties,capabilities,paramThreeToGL,info){
var _infoMemory=info.memory;
var _isWebGL2=typeof WebGL2RenderingContext!=='undefined'&&_gl instanceof WebGL2RenderingContext;
function clampToMaxSize(image,maxSize){
if(image.width>maxSize||image.height>maxSize){
var scale=maxSize/Math.max(image.width,image.height);
var canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');
canvas.width=Math.floor(image.width*scale);
canvas.height=Math.floor(image.height*scale);
var context=canvas.getContext('2d');
context.drawImage(image,0,0,image.width,image.height,0,0,canvas.width,canvas.height);
console.warn('THREE.WebGLRenderer: image is too big ('+image.width+'x'+image.height+'). Resized to '+canvas.width+'x'+canvas.height,image);
return canvas;
}
return image;
}
function isPowerOfTwo(image){
return exports.Math.isPowerOfTwo(image.width)&&exports.Math.isPowerOfTwo(image.height);
}
function makePowerOfTwo(image){
if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement){
var canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');
canvas.width=exports.Math.nearestPowerOfTwo(image.width);
canvas.height=exports.Math.nearestPowerOfTwo(image.height);
var context=canvas.getContext('2d');
context.drawImage(image,0,0,canvas.width,canvas.height);
console.warn('THREE.WebGLRenderer: image is not power of two ('+image.width+'x'+image.height+'). Resized to '+canvas.width+'x'+canvas.height,image);
return canvas;
}
return image;
}
function textureNeedsPowerOfTwo(texture){
if(texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping)return true;
if(texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter)return true;
return false;
}
function filterFallback(f){
if(f===NearestFilter||f===NearestMipMapNearestFilter||f===NearestMipMapLinearFilter){
return _gl.NEAREST;
}
return _gl.LINEAR;
}
function onTextureDispose(event){
var texture=event.target;
texture.removeEventListener('dispose',onTextureDispose);
deallocateTexture(texture);
_infoMemory.textures--;
}
function onRenderTargetDispose(event){
var renderTarget=event.target;
renderTarget.removeEventListener('dispose',onRenderTargetDispose);
deallocateRenderTarget(renderTarget);
_infoMemory.textures--;
}
function deallocateTexture(texture){
var textureProperties=properties.get(texture);
if(texture.image&&textureProperties.__image__webglTextureCube){
_gl.deleteTexture(textureProperties.__image__webglTextureCube);
}else{
if(textureProperties.__webglInit===undefined)return;
_gl.deleteTexture(textureProperties.__webglTexture);
}
properties.delete(texture);
}
function deallocateRenderTarget(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
var textureProperties=properties.get(renderTarget.texture);
if(!renderTarget)return;
if(textureProperties.__webglTexture!==undefined){
_gl.deleteTexture(textureProperties.__webglTexture);
}
if(renderTarget.depthTexture){
renderTarget.depthTexture.dispose();
}
if(renderTarget&&renderTarget.isWebGLRenderTargetCube){
for(var i=0;i<6;i++){
_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer[i]);
if(renderTargetProperties.__webglDepthbuffer)_gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer[i]);
}
}else{
_gl.deleteFramebuffer(renderTargetProperties.__webglFramebuffer);
if(renderTargetProperties.__webglDepthbuffer)_gl.deleteRenderbuffer(renderTargetProperties.__webglDepthbuffer);
}
properties.delete(renderTarget.texture);
properties.delete(renderTarget);
}
function setTexture2D(texture,slot){
var textureProperties=properties.get(texture);
if(texture.version>0&&textureProperties.__version!==texture.version){
var image=texture.image;
if(image===undefined){
console.warn('THREE.WebGLRenderer: Texture marked for update but image is undefined',texture);
}else if(image.complete===false){
console.warn('THREE.WebGLRenderer: Texture marked for update but image is incomplete',texture);
}else{
uploadTexture(textureProperties,texture,slot);
return;
}
}
state.activeTexture(_gl.TEXTURE0+slot);
state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);
}
function setTextureCube(texture,slot){
var textureProperties=properties.get(texture);
if(texture.image.length===6){
if(texture.version>0&&textureProperties.__version!==texture.version){
if(!textureProperties.__image__webglTextureCube){
texture.addEventListener('dispose',onTextureDispose);
textureProperties.__image__webglTextureCube=_gl.createTexture();
_infoMemory.textures++;
}
state.activeTexture(_gl.TEXTURE0+slot);
state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube);
_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);
var isCompressed=texture&&texture.isCompressedTexture;
var isDataTexture=texture.image[0]&&texture.image[0].isDataTexture;
var cubeImage=[];
for(var i=0;i<6;i++){
if(!isCompressed&&!isDataTexture){
cubeImage[i]=clampToMaxSize(texture.image[i],capabilities.maxCubemapSize);
}else{
cubeImage[i]=isDataTexture?texture.image[i].image:texture.image[i];
}
}
var image=cubeImage[0],
isPowerOfTwoImage=isPowerOfTwo(image),
glFormat=paramThreeToGL(texture.format),
glType=paramThreeToGL(texture.type);
setTextureParameters(_gl.TEXTURE_CUBE_MAP,texture,isPowerOfTwoImage);
for(var i=0;i<6;i++){
if(!isCompressed){
if(isDataTexture){
state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,cubeImage[i].width,cubeImage[i].height,0,glFormat,glType,cubeImage[i].data);
}else{
state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,0,glFormat,glFormat,glType,cubeImage[i]);
}
}else{
var mipmap,mipmaps=cubeImage[i].mipmaps;
for(var j=0,jl=mipmaps.length;j<jl;j++){
mipmap=mipmaps[j];
if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){
if(state.getCompressedTextureFormats().indexOf(glFormat)>-1){
state.compressedTexImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,mipmap.data);
}else{
console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()");
}
}else{
state.texImage2D(_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,j,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);
}
}
}
}
if(texture.generateMipmaps&&isPowerOfTwoImage){
_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP);
}
textureProperties.__version=texture.version;
if(texture.onUpdate)texture.onUpdate(texture);
}else{
state.activeTexture(_gl.TEXTURE0+slot);
state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__image__webglTextureCube);
}
}
}
function setTextureCubeDynamic(texture,slot){
state.activeTexture(_gl.TEXTURE0+slot);
state.bindTexture(_gl.TEXTURE_CUBE_MAP,properties.get(texture).__webglTexture);
}
function setTextureParameters(textureType,texture,isPowerOfTwoImage){
var extension;
if(isPowerOfTwoImage){
_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,paramThreeToGL(texture.wrapS));
_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,paramThreeToGL(texture.wrapT));
_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,paramThreeToGL(texture.magFilter));
_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,paramThreeToGL(texture.minFilter));
}else{
_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_S,_gl.CLAMP_TO_EDGE);
_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,_gl.CLAMP_TO_EDGE);
if(texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping){
console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.',texture);
}
_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,filterFallback(texture.magFilter));
_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,filterFallback(texture.minFilter));
if(texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter){
console.warn('THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.',texture);
}
}
extension=extensions.get('EXT_texture_filter_anisotropic');
if(extension){
if(texture.type===FloatType&&extensions.get('OES_texture_float_linear')===null)return;
if(texture.type===HalfFloatType&&extensions.get('OES_texture_half_float_linear')===null)return;
if(texture.anisotropy>1||properties.get(texture).__currentAnisotropy){
_gl.texParameterf(textureType,extension.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(texture.anisotropy,capabilities.getMaxAnisotropy()));
properties.get(texture).__currentAnisotropy=texture.anisotropy;
}
}
}
function uploadTexture(textureProperties,texture,slot){
if(textureProperties.__webglInit===undefined){
textureProperties.__webglInit=true;
texture.addEventListener('dispose',onTextureDispose);
textureProperties.__webglTexture=_gl.createTexture();
_infoMemory.textures++;
}
state.activeTexture(_gl.TEXTURE0+slot);
state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);
_gl.pixelStorei(_gl.UNPACK_FLIP_Y_WEBGL,texture.flipY);
_gl.pixelStorei(_gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,texture.premultiplyAlpha);
_gl.pixelStorei(_gl.UNPACK_ALIGNMENT,texture.unpackAlignment);
var image=clampToMaxSize(texture.image,capabilities.maxTextureSize);
if(textureNeedsPowerOfTwo(texture)&&isPowerOfTwo(image)===false){
image=makePowerOfTwo(image);
}
var isPowerOfTwoImage=isPowerOfTwo(image),
glFormat=paramThreeToGL(texture.format),
glType=paramThreeToGL(texture.type);
setTextureParameters(_gl.TEXTURE_2D,texture,isPowerOfTwoImage);
var mipmap,mipmaps=texture.mipmaps;
if(texture&&texture.isDepthTexture){
var internalFormat=_gl.DEPTH_COMPONENT;
if(texture.type===FloatType){
if(!_isWebGL2)throw new Error('Float Depth Texture only supported in WebGL2.0');
internalFormat=_gl.DEPTH_COMPONENT32F;
}else if(_isWebGL2){
internalFormat=_gl.DEPTH_COMPONENT16;
}
if(texture.format===DepthStencilFormat){
internalFormat=_gl.DEPTH_STENCIL;
}
state.texImage2D(_gl.TEXTURE_2D,0,internalFormat,image.width,image.height,0,glFormat,glType,null);
}else if(texture&&texture.isDataTexture){
if(mipmaps.length>0&&isPowerOfTwoImage){
for(var i=0,il=mipmaps.length;i<il;i++){
mipmap=mipmaps[i];
state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);
}
texture.generateMipmaps=false;
}else{
state.texImage2D(_gl.TEXTURE_2D,0,glFormat,image.width,image.height,0,glFormat,glType,image.data);
}
}else if(texture&&texture.isCompressedTexture){
for(var i=0,il=mipmaps.length;i<il;i++){
mipmap=mipmaps[i];
if(texture.format!==RGBAFormat&&texture.format!==RGBFormat){
if(state.getCompressedTextureFormats().indexOf(glFormat)>-1){
state.compressedTexImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,mipmap.data);
}else{
console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");
}
}else{
state.texImage2D(_gl.TEXTURE_2D,i,glFormat,mipmap.width,mipmap.height,0,glFormat,glType,mipmap.data);
}
}
}else{
if(mipmaps.length>0&&isPowerOfTwoImage){
for(var i=0,il=mipmaps.length;i<il;i++){
mipmap=mipmaps[i];
state.texImage2D(_gl.TEXTURE_2D,i,glFormat,glFormat,glType,mipmap);
}
texture.generateMipmaps=false;
}else{
state.texImage2D(_gl.TEXTURE_2D,0,glFormat,glFormat,glType,image);
}
}
if(texture.generateMipmaps&&isPowerOfTwoImage)_gl.generateMipmap(_gl.TEXTURE_2D);
textureProperties.__version=texture.version;
if(texture.onUpdate)texture.onUpdate(texture);
}
function setupFrameBufferTexture(framebuffer,renderTarget,attachment,textureTarget){
var glFormat=paramThreeToGL(renderTarget.texture.format);
var glType=paramThreeToGL(renderTarget.texture.type);
state.texImage2D(textureTarget,0,glFormat,renderTarget.width,renderTarget.height,0,glFormat,glType,null);
_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);
_gl.framebufferTexture2D(_gl.FRAMEBUFFER,attachment,textureTarget,properties.get(renderTarget.texture).__webglTexture,0);
_gl.bindFramebuffer(_gl.FRAMEBUFFER,null);
}
function setupRenderBufferStorage(renderbuffer,renderTarget){
_gl.bindRenderbuffer(_gl.RENDERBUFFER,renderbuffer);
if(renderTarget.depthBuffer&&!renderTarget.stencilBuffer){
_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_COMPONENT16,renderTarget.width,renderTarget.height);
_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer);
}else if(renderTarget.depthBuffer&&renderTarget.stencilBuffer){
_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.DEPTH_STENCIL,renderTarget.width,renderTarget.height);
_gl.framebufferRenderbuffer(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.RENDERBUFFER,renderbuffer);
}else{
_gl.renderbufferStorage(_gl.RENDERBUFFER,_gl.RGBA4,renderTarget.width,renderTarget.height);
}
_gl.bindRenderbuffer(_gl.RENDERBUFFER,null);
}
function setupDepthTexture(framebuffer,renderTarget){
var isCube=renderTarget&&renderTarget.isWebGLRenderTargetCube;
if(isCube)throw new Error('Depth Texture with cube render targets is not supported!');
_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);
if(!(renderTarget.depthTexture&&renderTarget.depthTexture.isDepthTexture)){
throw new Error('renderTarget.depthTexture must be an instance of THREE.DepthTexture');
}
if(!properties.get(renderTarget.depthTexture).__webglTexture||
renderTarget.depthTexture.image.width!==renderTarget.width||
renderTarget.depthTexture.image.height!==renderTarget.height){
renderTarget.depthTexture.image.width=renderTarget.width;
renderTarget.depthTexture.image.height=renderTarget.height;
renderTarget.depthTexture.needsUpdate=true;
}
setTexture2D(renderTarget.depthTexture,0);
var webglDepthTexture=properties.get(renderTarget.depthTexture).__webglTexture;
if(renderTarget.depthTexture.format===DepthFormat){
_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.DEPTH_ATTACHMENT,_gl.TEXTURE_2D,webglDepthTexture,0);
}else if(renderTarget.depthTexture.format===DepthStencilFormat){
_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.DEPTH_STENCIL_ATTACHMENT,_gl.TEXTURE_2D,webglDepthTexture,0);
}else{
throw new Error('Unknown depthTexture format');
}
}
function setupDepthRenderbuffer(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
var isCube=renderTarget&&renderTarget.isWebGLRenderTargetCube;
if(renderTarget.depthTexture){
if(isCube)throw new Error('target.depthTexture not supported in Cube render targets');
setupDepthTexture(renderTargetProperties.__webglFramebuffer,renderTarget);
}else{
if(isCube){
renderTargetProperties.__webglDepthbuffer=[];
for(var i=0;i<6;i++){
_gl.bindFramebuffer(_gl.FRAMEBUFFER,renderTargetProperties.__webglFramebuffer[i]);
renderTargetProperties.__webglDepthbuffer[i]=_gl.createRenderbuffer();
setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer[i],renderTarget);
}
}else{
_gl.bindFramebuffer(_gl.FRAMEBUFFER,renderTargetProperties.__webglFramebuffer);
renderTargetProperties.__webglDepthbuffer=_gl.createRenderbuffer();
setupRenderBufferStorage(renderTargetProperties.__webglDepthbuffer,renderTarget);
}
}
_gl.bindFramebuffer(_gl.FRAMEBUFFER,null);
}
function setupRenderTarget(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
var textureProperties=properties.get(renderTarget.texture);
renderTarget.addEventListener('dispose',onRenderTargetDispose);
textureProperties.__webglTexture=_gl.createTexture();
_infoMemory.textures++;
var isCube=renderTarget&&renderTarget.isWebGLRenderTargetCube;
var isTargetPowerOfTwo=isPowerOfTwo(renderTarget);
if(isCube){
renderTargetProperties.__webglFramebuffer=[];
for(var i=0;i<6;i++){
renderTargetProperties.__webglFramebuffer[i]=_gl.createFramebuffer();
}
}else{
renderTargetProperties.__webglFramebuffer=_gl.createFramebuffer();
}
if(isCube){
state.bindTexture(_gl.TEXTURE_CUBE_MAP,textureProperties.__webglTexture);
setTextureParameters(_gl.TEXTURE_CUBE_MAP,renderTarget.texture,isTargetPowerOfTwo);
for(var i=0;i<6;i++){
setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer[i],renderTarget,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+i);
}
if(renderTarget.texture.generateMipmaps&&isTargetPowerOfTwo)_gl.generateMipmap(_gl.TEXTURE_CUBE_MAP);
state.bindTexture(_gl.TEXTURE_CUBE_MAP,null);
}else{
state.bindTexture(_gl.TEXTURE_2D,textureProperties.__webglTexture);
setTextureParameters(_gl.TEXTURE_2D,renderTarget.texture,isTargetPowerOfTwo);
setupFrameBufferTexture(renderTargetProperties.__webglFramebuffer,renderTarget,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_2D);
if(renderTarget.texture.generateMipmaps&&isTargetPowerOfTwo)_gl.generateMipmap(_gl.TEXTURE_2D);
state.bindTexture(_gl.TEXTURE_2D,null);
}
if(renderTarget.depthBuffer){
setupDepthRenderbuffer(renderTarget);
}
}
function updateRenderTargetMipmap(renderTarget){
var texture=renderTarget.texture;
if(texture.generateMipmaps&&isPowerOfTwo(renderTarget)&&
texture.minFilter!==NearestFilter&&
texture.minFilter!==LinearFilter){
var target=renderTarget&&renderTarget.isWebGLRenderTargetCube?_gl.TEXTURE_CUBE_MAP:_gl.TEXTURE_2D;
var webglTexture=properties.get(texture).__webglTexture;
state.bindTexture(target,webglTexture);
_gl.generateMipmap(target);
state.bindTexture(target,null);
}
}
this.setTexture2D=setTexture2D;
this.setTextureCube=setTextureCube;
this.setTextureCubeDynamic=setTextureCubeDynamic;
this.setupRenderTarget=setupRenderTarget;
this.updateRenderTargetMipmap=updateRenderTargetMipmap;
}
function Vector4(x,y,z,w){
this.x=x||0;
this.y=y||0;
this.z=z||0;
this.w=w!==undefined?w:1;
}
Vector4.prototype={
constructor:Vector4,
isVector4:true,
set:function set(x,y,z,w){
this.x=x;
this.y=y;
this.z=z;
this.w=w;
return this;
},
setScalar:function setScalar(scalar){
this.x=scalar;
this.y=scalar;
this.z=scalar;
this.w=scalar;
return this;
},
setX:function setX(x){
this.x=x;
return this;
},
setY:function setY(y){
this.y=y;
return this;
},
setZ:function setZ(z){
this.z=z;
return this;
},
setW:function setW(w){
this.w=w;
return this;
},
setComponent:function setComponent(index,value){
switch(index){
case 0:this.x=value;break;
case 1:this.y=value;break;
case 2:this.z=value;break;
case 3:this.w=value;break;
default:throw new Error('index is out of range: '+index);}
},
getComponent:function getComponent(index){
switch(index){
case 0:return this.x;
case 1:return this.y;
case 2:return this.z;
case 3:return this.w;
default:throw new Error('index is out of range: '+index);}
},
clone:function clone(){
return new this.constructor(this.x,this.y,this.z,this.w);
},
copy:function copy(v){
this.x=v.x;
this.y=v.y;
this.z=v.z;
this.w=v.w!==undefined?v.w:1;
return this;
},
add:function add(v,w){
if(w!==undefined){
console.warn('THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.');
return this.addVectors(v,w);
}
this.x+=v.x;
this.y+=v.y;
this.z+=v.z;
this.w+=v.w;
return this;
},
addScalar:function addScalar(s){
this.x+=s;
this.y+=s;
this.z+=s;
this.w+=s;
return this;
},
addVectors:function addVectors(a,b){
this.x=a.x+b.x;
this.y=a.y+b.y;
this.z=a.z+b.z;
this.w=a.w+b.w;
return this;
},
addScaledVector:function addScaledVector(v,s){
this.x+=v.x*s;
this.y+=v.y*s;
this.z+=v.z*s;
this.w+=v.w*s;
return this;
},
sub:function sub(v,w){
if(w!==undefined){
console.warn('THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.');
return this.subVectors(v,w);
}
this.x-=v.x;
this.y-=v.y;
this.z-=v.z;
this.w-=v.w;
return this;
},
subScalar:function subScalar(s){
this.x-=s;
this.y-=s;
this.z-=s;
this.w-=s;
return this;
},
subVectors:function subVectors(a,b){
this.x=a.x-b.x;
this.y=a.y-b.y;
this.z=a.z-b.z;
this.w=a.w-b.w;
return this;
},
multiplyScalar:function multiplyScalar(scalar){
if(isFinite(scalar)){
this.x*=scalar;
this.y*=scalar;
this.z*=scalar;
this.w*=scalar;
}else{
this.x=0;
this.y=0;
this.z=0;
this.w=0;
}
return this;
},
applyMatrix4:function applyMatrix4(m){
var x=this.x,y=this.y,z=this.z,w=this.w;
var e=m.elements;
this.x=e[0]*x+e[4]*y+e[8]*z+e[12]*w;
this.y=e[1]*x+e[5]*y+e[9]*z+e[13]*w;
this.z=e[2]*x+e[6]*y+e[10]*z+e[14]*w;
this.w=e[3]*x+e[7]*y+e[11]*z+e[15]*w;
return this;
},
divideScalar:function divideScalar(scalar){
return this.multiplyScalar(1/scalar);
},
setAxisAngleFromQuaternion:function setAxisAngleFromQuaternion(q){
this.w=2*Math.acos(q.w);
var s=Math.sqrt(1-q.w*q.w);
if(s<0.0001){
this.x=1;
this.y=0;
this.z=0;
}else{
this.x=q.x/s;
this.y=q.y/s;
this.z=q.z/s;
}
return this;
},
setAxisAngleFromRotationMatrix:function setAxisAngleFromRotationMatrix(m){
var angle,x,y,z,
epsilon=0.01,
epsilon2=0.1,
te=m.elements,
m11=te[0],m12=te[4],m13=te[8],
m21=te[1],m22=te[5],m23=te[9],
m31=te[2],m32=te[6],m33=te[10];
if(Math.abs(m12-m21)<epsilon&&
Math.abs(m13-m31)<epsilon&&
Math.abs(m23-m32)<epsilon){
if(Math.abs(m12+m21)<epsilon2&&
Math.abs(m13+m31)<epsilon2&&
Math.abs(m23+m32)<epsilon2&&
Math.abs(m11+m22+m33-3)<epsilon2){
this.set(1,0,0,0);
return this;
}
angle=Math.PI;
var xx=(m11+1)/2;
var yy=(m22+1)/2;
var zz=(m33+1)/2;
var xy=(m12+m21)/4;
var xz=(m13+m31)/4;
var yz=(m23+m32)/4;
if(xx>yy&&xx>zz){
if(xx<epsilon){
x=0;
y=0.707106781;
z=0.707106781;
}else{
x=Math.sqrt(xx);
y=xy/x;
z=xz/x;
}
}else if(yy>zz){
if(yy<epsilon){
x=0.707106781;
y=0;
z=0.707106781;
}else{
y=Math.sqrt(yy);
x=xy/y;
z=yz/y;
}
}else{
if(zz<epsilon){
x=0.707106781;
y=0.707106781;
z=0;
}else{
z=Math.sqrt(zz);
x=xz/z;
y=yz/z;
}
}
this.set(x,y,z,angle);
return this;
}
var s=Math.sqrt((m32-m23)*(m32-m23)+
(m13-m31)*(m13-m31)+
(m21-m12)*(m21-m12));
if(Math.abs(s)<0.001)s=1;
this.x=(m32-m23)/s;
this.y=(m13-m31)/s;
this.z=(m21-m12)/s;
this.w=Math.acos((m11+m22+m33-1)/2);
return this;
},
min:function min(v){
this.x=Math.min(this.x,v.x);
this.y=Math.min(this.y,v.y);
this.z=Math.min(this.z,v.z);
this.w=Math.min(this.w,v.w);
return this;
},
max:function max(v){
this.x=Math.max(this.x,v.x);
this.y=Math.max(this.y,v.y);
this.z=Math.max(this.z,v.z);
this.w=Math.max(this.w,v.w);
return this;
},
clamp:function clamp(min,max){
this.x=Math.max(min.x,Math.min(max.x,this.x));
this.y=Math.max(min.y,Math.min(max.y,this.y));
this.z=Math.max(min.z,Math.min(max.z,this.z));
this.w=Math.max(min.w,Math.min(max.w,this.w));
return this;
},
clampScalar:function(){
var min,max;
return function clampScalar(minVal,maxVal){
if(min===undefined){
min=new Vector4();
max=new Vector4();
}
min.set(minVal,minVal,minVal,minVal);
max.set(maxVal,maxVal,maxVal,maxVal);
return this.clamp(min,max);
};
}(),
floor:function floor(){
this.x=Math.floor(this.x);
this.y=Math.floor(this.y);
this.z=Math.floor(this.z);
this.w=Math.floor(this.w);
return this;
},
ceil:function ceil(){
this.x=Math.ceil(this.x);
this.y=Math.ceil(this.y);
this.z=Math.ceil(this.z);
this.w=Math.ceil(this.w);
return this;
},
round:function round(){
this.x=Math.round(this.x);
this.y=Math.round(this.y);
this.z=Math.round(this.z);
this.w=Math.round(this.w);
return this;
},
roundToZero:function roundToZero(){
this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x);
this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y);
this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z);
this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w);
return this;
},
negate:function negate(){
this.x=-this.x;
this.y=-this.y;
this.z=-this.z;
this.w=-this.w;
return this;
},
dot:function dot(v){
return this.x*v.x+this.y*v.y+this.z*v.z+this.w*v.w;
},
lengthSq:function lengthSq(){
return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w;
},
length:function length(){
return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);
},
lengthManhattan:function lengthManhattan(){
return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w);
},
normalize:function normalize(){
return this.divideScalar(this.length());
},
setLength:function setLength(length){
return this.multiplyScalar(length/this.length());
},
lerp:function lerp(v,alpha){
this.x+=(v.x-this.x)*alpha;
this.y+=(v.y-this.y)*alpha;
this.z+=(v.z-this.z)*alpha;
this.w+=(v.w-this.w)*alpha;
return this;
},
lerpVectors:function lerpVectors(v1,v2,alpha){
return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);
},
equals:function equals(v){
return v.x===this.x&&v.y===this.y&&v.z===this.z&&v.w===this.w;
},
fromArray:function fromArray(array,offset){
if(offset===undefined)offset=0;
this.x=array[offset];
this.y=array[offset+1];
this.z=array[offset+2];
this.w=array[offset+3];
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
array[offset]=this.x;
array[offset+1]=this.y;
array[offset+2]=this.z;
array[offset+3]=this.w;
return array;
},
fromAttribute:function fromAttribute(attribute,index,offset){
if(offset===undefined)offset=0;
index=index*attribute.itemSize+offset;
this.x=attribute.array[index];
this.y=attribute.array[index+1];
this.z=attribute.array[index+2];
this.w=attribute.array[index+3];
return this;
}};
function WebGLState(gl,extensions,paramThreeToGL){
function ColorBuffer(){
var locked=false;
var color=new Vector4();
var currentColorMask=null;
var currentColorClear=new Vector4();
return{
setMask:function setMask(colorMask){
if(currentColorMask!==colorMask&&!locked){
gl.colorMask(colorMask,colorMask,colorMask,colorMask);
currentColorMask=colorMask;
}
},
setLocked:function setLocked(lock){
locked=lock;
},
setClear:function setClear(r,g,b,a){
color.set(r,g,b,a);
if(currentColorClear.equals(color)===false){
gl.clearColor(r,g,b,a);
currentColorClear.copy(color);
}
},
reset:function reset(){
locked=false;
currentColorMask=null;
currentColorClear.set(0,0,0,1);
}};
}
function DepthBuffer(){
var locked=false;
var currentDepthMask=null;
var currentDepthFunc=null;
var currentDepthClear=null;
return{
setTest:function setTest(depthTest){
if(depthTest){
enable(gl.DEPTH_TEST);
}else{
disable(gl.DEPTH_TEST);
}
},
setMask:function setMask(depthMask){
if(currentDepthMask!==depthMask&&!locked){
gl.depthMask(depthMask);
currentDepthMask=depthMask;
}
},
setFunc:function setFunc(depthFunc){
if(currentDepthFunc!==depthFunc){
if(depthFunc){
switch(depthFunc){
case NeverDepth:
gl.depthFunc(gl.NEVER);
break;
case AlwaysDepth:
gl.depthFunc(gl.ALWAYS);
break;
case LessDepth:
gl.depthFunc(gl.LESS);
break;
case LessEqualDepth:
gl.depthFunc(gl.LEQUAL);
break;
case EqualDepth:
gl.depthFunc(gl.EQUAL);
break;
case GreaterEqualDepth:
gl.depthFunc(gl.GEQUAL);
break;
case GreaterDepth:
gl.depthFunc(gl.GREATER);
break;
case NotEqualDepth:
gl.depthFunc(gl.NOTEQUAL);
break;
default:
gl.depthFunc(gl.LEQUAL);}
}else{
gl.depthFunc(gl.LEQUAL);
}
currentDepthFunc=depthFunc;
}
},
setLocked:function setLocked(lock){
locked=lock;
},
setClear:function setClear(depth){
if(currentDepthClear!==depth){
gl.clearDepth(depth);
currentDepthClear=depth;
}
},
reset:function reset(){
locked=false;
currentDepthMask=null;
currentDepthFunc=null;
currentDepthClear=null;
}};
}
function StencilBuffer(){
var locked=false;
var currentStencilMask=null;
var currentStencilFunc=null;
var currentStencilRef=null;
var currentStencilFuncMask=null;
var currentStencilFail=null;
var currentStencilZFail=null;
var currentStencilZPass=null;
var currentStencilClear=null;
return{
setTest:function setTest(stencilTest){
if(stencilTest){
enable(gl.STENCIL_TEST);
}else{
disable(gl.STENCIL_TEST);
}
},
setMask:function setMask(stencilMask){
if(currentStencilMask!==stencilMask&&!locked){
gl.stencilMask(stencilMask);
currentStencilMask=stencilMask;
}
},
setFunc:function setFunc(stencilFunc,stencilRef,stencilMask){
if(currentStencilFunc!==stencilFunc||
currentStencilRef!==stencilRef||
currentStencilFuncMask!==stencilMask){
gl.stencilFunc(stencilFunc,stencilRef,stencilMask);
currentStencilFunc=stencilFunc;
currentStencilRef=stencilRef;
currentStencilFuncMask=stencilMask;
}
},
setOp:function setOp(stencilFail,stencilZFail,stencilZPass){
if(currentStencilFail!==stencilFail||
currentStencilZFail!==stencilZFail||
currentStencilZPass!==stencilZPass){
gl.stencilOp(stencilFail,stencilZFail,stencilZPass);
currentStencilFail=stencilFail;
currentStencilZFail=stencilZFail;
currentStencilZPass=stencilZPass;
}
},
setLocked:function setLocked(lock){
locked=lock;
},
setClear:function setClear(stencil){
if(currentStencilClear!==stencil){
gl.clearStencil(stencil);
currentStencilClear=stencil;
}
},
reset:function reset(){
locked=false;
currentStencilMask=null;
currentStencilFunc=null;
currentStencilRef=null;
currentStencilFuncMask=null;
currentStencilFail=null;
currentStencilZFail=null;
currentStencilZPass=null;
currentStencilClear=null;
}};
}
var colorBuffer=new ColorBuffer();
var depthBuffer=new DepthBuffer();
var stencilBuffer=new StencilBuffer();
var maxVertexAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
var newAttributes=new Uint8Array(maxVertexAttributes);
var enabledAttributes=new Uint8Array(maxVertexAttributes);
var attributeDivisors=new Uint8Array(maxVertexAttributes);
var capabilities={};
var compressedTextureFormats=null;
var currentBlending=null;
var currentBlendEquation=null;
var currentBlendSrc=null;
var currentBlendDst=null;
var currentBlendEquationAlpha=null;
var currentBlendSrcAlpha=null;
var currentBlendDstAlpha=null;
var currentPremultipledAlpha=false;
var currentFlipSided=null;
var currentCullFace=null;
var currentLineWidth=null;
var currentPolygonOffsetFactor=null;
var currentPolygonOffsetUnits=null;
var currentScissorTest=null;
var maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
var currentTextureSlot=null;
var currentBoundTextures={};
var currentScissor=new Vector4();
var currentViewport=new Vector4();
function createTexture(type,target,count){
var data=new Uint8Array(4);
var texture=gl.createTexture();
gl.bindTexture(type,texture);
gl.texParameteri(type,gl.TEXTURE_MIN_FILTER,gl.NEAREST);
gl.texParameteri(type,gl.TEXTURE_MAG_FILTER,gl.NEAREST);
for(var i=0;i<count;i++){
gl.texImage2D(target+i,0,gl.RGBA,1,1,0,gl.RGBA,gl.UNSIGNED_BYTE,data);
}
return texture;
}
var emptyTextures={};
emptyTextures[gl.TEXTURE_2D]=createTexture(gl.TEXTURE_2D,gl.TEXTURE_2D,1);
emptyTextures[gl.TEXTURE_CUBE_MAP]=createTexture(gl.TEXTURE_CUBE_MAP,gl.TEXTURE_CUBE_MAP_POSITIVE_X,6);
function init(){
clearColor(0,0,0,1);
clearDepth(1);
clearStencil(0);
enable(gl.DEPTH_TEST);
setDepthFunc(LessEqualDepth);
setFlipSided(false);
setCullFace(CullFaceBack);
enable(gl.CULL_FACE);
enable(gl.BLEND);
setBlending(NormalBlending);
}
function initAttributes(){
for(var i=0,l=newAttributes.length;i<l;i++){
newAttributes[i]=0;
}
}
function enableAttribute(attribute){
newAttributes[attribute]=1;
if(enabledAttributes[attribute]===0){
gl.enableVertexAttribArray(attribute);
enabledAttributes[attribute]=1;
}
if(attributeDivisors[attribute]!==0){
var extension=extensions.get('ANGLE_instanced_arrays');
extension.vertexAttribDivisorANGLE(attribute,0);
attributeDivisors[attribute]=0;
}
}
function enableAttributeAndDivisor(attribute,meshPerAttribute,extension){
newAttributes[attribute]=1;
if(enabledAttributes[attribute]===0){
gl.enableVertexAttribArray(attribute);
enabledAttributes[attribute]=1;
}
if(attributeDivisors[attribute]!==meshPerAttribute){
extension.vertexAttribDivisorANGLE(attribute,meshPerAttribute);
attributeDivisors[attribute]=meshPerAttribute;
}
}
function disableUnusedAttributes(){
for(var i=0,l=enabledAttributes.length;i!==l;++i){
if(enabledAttributes[i]!==newAttributes[i]){
gl.disableVertexAttribArray(i);
enabledAttributes[i]=0;
}
}
}
function enable(id){
if(capabilities[id]!==true){
gl.enable(id);
capabilities[id]=true;
}
}
function disable(id){
if(capabilities[id]!==false){
gl.disable(id);
capabilities[id]=false;
}
}
function getCompressedTextureFormats(){
if(compressedTextureFormats===null){
compressedTextureFormats=[];
if(extensions.get('WEBGL_compressed_texture_pvrtc')||
extensions.get('WEBGL_compressed_texture_s3tc')||
extensions.get('WEBGL_compressed_texture_etc1')){
var formats=gl.getParameter(gl.COMPRESSED_TEXTURE_FORMATS);
for(var i=0;i<formats.length;i++){
compressedTextureFormats.push(formats[i]);
}
}
}
return compressedTextureFormats;
}
function setBlending(blending,blendEquation,blendSrc,blendDst,blendEquationAlpha,blendSrcAlpha,blendDstAlpha,premultipliedAlpha){
if(blending!==NoBlending){
enable(gl.BLEND);
}else{
disable(gl.BLEND);
currentBlending=blending;
return;
}
if(blending!==currentBlending||premultipliedAlpha!==currentPremultipledAlpha){
if(blending===AdditiveBlending){
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ONE,gl.ONE,gl.ONE,gl.ONE);
}else{
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.SRC_ALPHA,gl.ONE);
}
}else if(blending===SubtractiveBlending){
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ZERO,gl.ZERO,gl.ONE_MINUS_SRC_COLOR,gl.ONE_MINUS_SRC_ALPHA);
}else{
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.ZERO,gl.ONE_MINUS_SRC_COLOR);
}
}else if(blending===MultiplyBlending){
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ZERO,gl.SRC_COLOR,gl.ZERO,gl.SRC_ALPHA);
}else{
gl.blendEquation(gl.FUNC_ADD);
gl.blendFunc(gl.ZERO,gl.SRC_COLOR);
}
}else{
if(premultipliedAlpha){
gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);
gl.blendFuncSeparate(gl.ONE,gl.ONE_MINUS_SRC_ALPHA,gl.ONE,gl.ONE_MINUS_SRC_ALPHA);
}else{
gl.blendEquationSeparate(gl.FUNC_ADD,gl.FUNC_ADD);
gl.blendFuncSeparate(gl.SRC_ALPHA,gl.ONE_MINUS_SRC_ALPHA,gl.ONE,gl.ONE_MINUS_SRC_ALPHA);
}
}
currentBlending=blending;
currentPremultipledAlpha=premultipliedAlpha;
}
if(blending===CustomBlending){
blendEquationAlpha=blendEquationAlpha||blendEquation;
blendSrcAlpha=blendSrcAlpha||blendSrc;
blendDstAlpha=blendDstAlpha||blendDst;
if(blendEquation!==currentBlendEquation||blendEquationAlpha!==currentBlendEquationAlpha){
gl.blendEquationSeparate(paramThreeToGL(blendEquation),paramThreeToGL(blendEquationAlpha));
currentBlendEquation=blendEquation;
currentBlendEquationAlpha=blendEquationAlpha;
}
if(blendSrc!==currentBlendSrc||blendDst!==currentBlendDst||blendSrcAlpha!==currentBlendSrcAlpha||blendDstAlpha!==currentBlendDstAlpha){
gl.blendFuncSeparate(paramThreeToGL(blendSrc),paramThreeToGL(blendDst),paramThreeToGL(blendSrcAlpha),paramThreeToGL(blendDstAlpha));
currentBlendSrc=blendSrc;
currentBlendDst=blendDst;
currentBlendSrcAlpha=blendSrcAlpha;
currentBlendDstAlpha=blendDstAlpha;
}
}else{
currentBlendEquation=null;
currentBlendSrc=null;
currentBlendDst=null;
currentBlendEquationAlpha=null;
currentBlendSrcAlpha=null;
currentBlendDstAlpha=null;
}
}
function setColorWrite(colorWrite){
colorBuffer.setMask(colorWrite);
}
function setDepthTest(depthTest){
depthBuffer.setTest(depthTest);
}
function setDepthWrite(depthWrite){
depthBuffer.setMask(depthWrite);
}
function setDepthFunc(depthFunc){
depthBuffer.setFunc(depthFunc);
}
function setStencilTest(stencilTest){
stencilBuffer.setTest(stencilTest);
}
function setStencilWrite(stencilWrite){
stencilBuffer.setMask(stencilWrite);
}
function setStencilFunc(stencilFunc,stencilRef,stencilMask){
stencilBuffer.setFunc(stencilFunc,stencilRef,stencilMask);
}
function setStencilOp(stencilFail,stencilZFail,stencilZPass){
stencilBuffer.setOp(stencilFail,stencilZFail,stencilZPass);
}
function setFlipSided(flipSided){
if(currentFlipSided!==flipSided){
if(flipSided){
gl.frontFace(gl.CW);
}else{
gl.frontFace(gl.CCW);
}
currentFlipSided=flipSided;
}
}
function setCullFace(cullFace){
if(cullFace!==CullFaceNone){
enable(gl.CULL_FACE);
if(cullFace!==currentCullFace){
if(cullFace===CullFaceBack){
gl.cullFace(gl.BACK);
}else if(cullFace===CullFaceFront){
gl.cullFace(gl.FRONT);
}else{
gl.cullFace(gl.FRONT_AND_BACK);
}
}
}else{
disable(gl.CULL_FACE);
}
currentCullFace=cullFace;
}
function setLineWidth(width){
if(width!==currentLineWidth){
gl.lineWidth(width);
currentLineWidth=width;
}
}
function setPolygonOffset(polygonOffset,factor,units){
if(polygonOffset){
enable(gl.POLYGON_OFFSET_FILL);
if(currentPolygonOffsetFactor!==factor||currentPolygonOffsetUnits!==units){
gl.polygonOffset(factor,units);
currentPolygonOffsetFactor=factor;
currentPolygonOffsetUnits=units;
}
}else{
disable(gl.POLYGON_OFFSET_FILL);
}
}
function getScissorTest(){
return currentScissorTest;
}
function setScissorTest(scissorTest){
currentScissorTest=scissorTest;
if(scissorTest){
enable(gl.SCISSOR_TEST);
}else{
disable(gl.SCISSOR_TEST);
}
}
function activeTexture(webglSlot){
if(webglSlot===undefined)webglSlot=gl.TEXTURE0+maxTextures-1;
if(currentTextureSlot!==webglSlot){
gl.activeTexture(webglSlot);
currentTextureSlot=webglSlot;
}
}
function bindTexture(webglType,webglTexture){
if(currentTextureSlot===null){
activeTexture();
}
var boundTexture=currentBoundTextures[currentTextureSlot];
if(boundTexture===undefined){
boundTexture={type:undefined,texture:undefined};
currentBoundTextures[currentTextureSlot]=boundTexture;
}
if(boundTexture.type!==webglType||boundTexture.texture!==webglTexture){
gl.bindTexture(webglType,webglTexture||emptyTextures[webglType]);
boundTexture.type=webglType;
boundTexture.texture=webglTexture;
}
}
function compressedTexImage2D(){
try{
gl.compressedTexImage2D.apply(gl,arguments);
}catch(error){
console.error(error);
}
}
function texImage2D(){
try{
gl.texImage2D.apply(gl,arguments);
}catch(error){
console.error(error);
}
}
function clearColor(r,g,b,a){
colorBuffer.setClear(r,g,b,a);
}
function clearDepth(depth){
depthBuffer.setClear(depth);
}
function clearStencil(stencil){
stencilBuffer.setClear(stencil);
}
function scissor(scissor){
if(currentScissor.equals(scissor)===false){
gl.scissor(scissor.x,scissor.y,scissor.z,scissor.w);
currentScissor.copy(scissor);
}
}
function viewport(viewport){
if(currentViewport.equals(viewport)===false){
gl.viewport(viewport.x,viewport.y,viewport.z,viewport.w);
currentViewport.copy(viewport);
}
}
function reset(){
for(var i=0;i<enabledAttributes.length;i++){
if(enabledAttributes[i]===1){
gl.disableVertexAttribArray(i);
enabledAttributes[i]=0;
}
}
capabilities={};
compressedTextureFormats=null;
currentTextureSlot=null;
currentBoundTextures={};
currentBlending=null;
currentFlipSided=null;
currentCullFace=null;
colorBuffer.reset();
depthBuffer.reset();
stencilBuffer.reset();
}
return{
buffers:{
color:colorBuffer,
depth:depthBuffer,
stencil:stencilBuffer},
init:init,
initAttributes:initAttributes,
enableAttribute:enableAttribute,
enableAttributeAndDivisor:enableAttributeAndDivisor,
disableUnusedAttributes:disableUnusedAttributes,
enable:enable,
disable:disable,
getCompressedTextureFormats:getCompressedTextureFormats,
setBlending:setBlending,
setColorWrite:setColorWrite,
setDepthTest:setDepthTest,
setDepthWrite:setDepthWrite,
setDepthFunc:setDepthFunc,
setStencilTest:setStencilTest,
setStencilWrite:setStencilWrite,
setStencilFunc:setStencilFunc,
setStencilOp:setStencilOp,
setFlipSided:setFlipSided,
setCullFace:setCullFace,
setLineWidth:setLineWidth,
setPolygonOffset:setPolygonOffset,
getScissorTest:getScissorTest,
setScissorTest:setScissorTest,
activeTexture:activeTexture,
bindTexture:bindTexture,
compressedTexImage2D:compressedTexImage2D,
texImage2D:texImage2D,
clearColor:clearColor,
clearDepth:clearDepth,
clearStencil:clearStencil,
scissor:scissor,
viewport:viewport,
reset:reset};
}
function WebGLRenderTarget(width,height,options){
this.uuid=exports.Math.generateUUID();
this.width=width;
this.height=height;
this.scissor=new Vector4(0,0,width,height);
this.scissorTest=false;
this.viewport=new Vector4(0,0,width,height);
options=options||{};
if(options.minFilter===undefined)options.minFilter=LinearFilter;
this.texture=new Texture(undefined,undefined,options.wrapS,options.wrapT,options.magFilter,options.minFilter,options.format,options.type,options.anisotropy,options.encoding);
this.depthBuffer=options.depthBuffer!==undefined?options.depthBuffer:true;
this.stencilBuffer=options.stencilBuffer!==undefined?options.stencilBuffer:true;
this.depthTexture=options.depthTexture!==undefined?options.depthTexture:null;
}
babelHelpers.extends(WebGLRenderTarget.prototype,EventDispatcher.prototype,{
isWebGLRenderTarget:true,
setSize:function setSize(width,height){
if(this.width!==width||this.height!==height){
this.width=width;
this.height=height;
this.dispose();
}
this.viewport.set(0,0,width,height);
this.scissor.set(0,0,width,height);
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(source){
this.width=source.width;
this.height=source.height;
this.viewport.copy(source.viewport);
this.texture=source.texture.clone();
this.depthBuffer=source.depthBuffer;
this.stencilBuffer=source.stencilBuffer;
this.depthTexture=source.depthTexture;
return this;
},
dispose:function dispose(){
this.dispatchEvent({type:'dispose'});
}});
function Material(){
Object.defineProperty(this,'id',{value:MaterialIdCount()});
this.uuid=exports.Math.generateUUID();
this.name='';
this.type='Material';
this.fog=true;
this.lights=true;
this.blending=NormalBlending;
this.side=FrontSide;
this.shading=SmoothShading;
this.vertexColors=NoColors;
this.opacity=1;
this.transparent=false;
this.blendSrc=SrcAlphaFactor;
this.blendDst=OneMinusSrcAlphaFactor;
this.blendEquation=AddEquation;
this.blendSrcAlpha=null;
this.blendDstAlpha=null;
this.blendEquationAlpha=null;
this.depthFunc=LessEqualDepth;
this.depthTest=true;
this.depthWrite=true;
this.clippingPlanes=null;
this.clipShadows=false;
this.colorWrite=true;
this.precision=null;
this.polygonOffset=false;
this.polygonOffsetFactor=0;
this.polygonOffsetUnits=0;
this.alphaTest=0;
this.premultipliedAlpha=false;
this.overdraw=0;
this.visible=true;
this._needsUpdate=true;
}
Material.prototype={
constructor:Material,
isMaterial:true,
get needsUpdate(){
return this._needsUpdate;
},
set needsUpdate(value){
if(value===true)this.update();
this._needsUpdate=value;
},
setValues:function setValues(values){
if(values===undefined)return;
for(var key in values){
var newValue=values[key];
if(newValue===undefined){
console.warn("THREE.Material: '"+key+"' parameter is undefined.");
continue;
}
var currentValue=this[key];
if(currentValue===undefined){
console.warn("THREE."+this.type+": '"+key+"' is not a property of this material.");
continue;
}
if(currentValue&&currentValue.isColor){
currentValue.set(newValue);
}else if(currentValue&&currentValue.isVector3&&newValue&&newValue.isVector3){
currentValue.copy(newValue);
}else if(key==='overdraw'){
this[key]=Number(newValue);
}else{
this[key]=newValue;
}
}
},
toJSON:function toJSON(meta){
var isRoot=meta===undefined;
if(isRoot){
meta={
textures:{},
images:{}};
}
var data={
metadata:{
version:4.4,
type:'Material',
generator:'Material.toJSON'}};
data.uuid=this.uuid;
data.type=this.type;
if(this.name!=='')data.name=this.name;
if(this.color&&this.color.isColor)data.color=this.color.getHex();
if(this.roughness!==undefined)data.roughness=this.roughness;
if(this.metalness!==undefined)data.metalness=this.metalness;
if(this.emissive&&this.emissive.isColor)data.emissive=this.emissive.getHex();
if(this.specular&&this.specular.isColor)data.specular=this.specular.getHex();
if(this.shininess!==undefined)data.shininess=this.shininess;
if(this.map&&this.map.isTexture)data.map=this.map.toJSON(meta).uuid;
if(this.alphaMap&&this.alphaMap.isTexture)data.alphaMap=this.alphaMap.toJSON(meta).uuid;
if(this.lightMap&&this.lightMap.isTexture)data.lightMap=this.lightMap.toJSON(meta).uuid;
if(this.bumpMap&&this.bumpMap.isTexture){
data.bumpMap=this.bumpMap.toJSON(meta).uuid;
data.bumpScale=this.bumpScale;
}
if(this.normalMap&&this.normalMap.isTexture){
data.normalMap=this.normalMap.toJSON(meta).uuid;
data.normalScale=this.normalScale.toArray();
}
if(this.displacementMap&&this.displacementMap.isTexture){
data.displacementMap=this.displacementMap.toJSON(meta).uuid;
data.displacementScale=this.displacementScale;
data.displacementBias=this.displacementBias;
}
if(this.roughnessMap&&this.roughnessMap.isTexture)data.roughnessMap=this.roughnessMap.toJSON(meta).uuid;
if(this.metalnessMap&&this.metalnessMap.isTexture)data.metalnessMap=this.metalnessMap.toJSON(meta).uuid;
if(this.emissiveMap&&this.emissiveMap.isTexture)data.emissiveMap=this.emissiveMap.toJSON(meta).uuid;
if(this.specularMap&&this.specularMap.isTexture)data.specularMap=this.specularMap.toJSON(meta).uuid;
if(this.envMap&&this.envMap.isTexture){
data.envMap=this.envMap.toJSON(meta).uuid;
data.reflectivity=this.reflectivity;
}
if(this.size!==undefined)data.size=this.size;
if(this.sizeAttenuation!==undefined)data.sizeAttenuation=this.sizeAttenuation;
if(this.blending!==NormalBlending)data.blending=this.blending;
if(this.shading!==SmoothShading)data.shading=this.shading;
if(this.side!==FrontSide)data.side=this.side;
if(this.vertexColors!==NoColors)data.vertexColors=this.vertexColors;
if(this.opacity<1)data.opacity=this.opacity;
if(this.transparent===true)data.transparent=this.transparent;
data.depthFunc=this.depthFunc;
data.depthTest=this.depthTest;
data.depthWrite=this.depthWrite;
if(this.alphaTest>0)data.alphaTest=this.alphaTest;
if(this.premultipliedAlpha===true)data.premultipliedAlpha=this.premultipliedAlpha;
if(this.wireframe===true)data.wireframe=this.wireframe;
if(this.wireframeLinewidth>1)data.wireframeLinewidth=this.wireframeLinewidth;
if(this.wireframeLinecap!=='round')data.wireframeLinecap=this.wireframeLinecap;
if(this.wireframeLinejoin!=='round')data.wireframeLinejoin=this.wireframeLinejoin;
data.skinning=this.skinning;
data.morphTargets=this.morphTargets;
function extractFromCache(cache){
var values=[];
for(var key in cache){
var data=cache[key];
delete data.metadata;
values.push(data);
}
return values;
}
if(isRoot){
var textures=extractFromCache(meta.textures);
var images=extractFromCache(meta.images);
if(textures.length>0)data.textures=textures;
if(images.length>0)data.images=images;
}
return data;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(source){
this.name=source.name;
this.fog=source.fog;
this.lights=source.lights;
this.blending=source.blending;
this.side=source.side;
this.shading=source.shading;
this.vertexColors=source.vertexColors;
this.opacity=source.opacity;
this.transparent=source.transparent;
this.blendSrc=source.blendSrc;
this.blendDst=source.blendDst;
this.blendEquation=source.blendEquation;
this.blendSrcAlpha=source.blendSrcAlpha;
this.blendDstAlpha=source.blendDstAlpha;
this.blendEquationAlpha=source.blendEquationAlpha;
this.depthFunc=source.depthFunc;
this.depthTest=source.depthTest;
this.depthWrite=source.depthWrite;
this.colorWrite=source.colorWrite;
this.precision=source.precision;
this.polygonOffset=source.polygonOffset;
this.polygonOffsetFactor=source.polygonOffsetFactor;
this.polygonOffsetUnits=source.polygonOffsetUnits;
this.alphaTest=source.alphaTest;
this.premultipliedAlpha=source.premultipliedAlpha;
this.overdraw=source.overdraw;
this.visible=source.visible;
this.clipShadows=source.clipShadows;
var srcPlanes=source.clippingPlanes,
dstPlanes=null;
if(srcPlanes!==null){
var n=srcPlanes.length;
dstPlanes=new Array(n);
for(var i=0;i!==n;++i){
dstPlanes[i]=srcPlanes[i].clone();}
}
this.clippingPlanes=dstPlanes;
return this;
},
update:function update(){
this.dispatchEvent({type:'update'});
},
dispose:function dispose(){
this.dispatchEvent({type:'dispose'});
}};
babelHelpers.extends(Material.prototype,EventDispatcher.prototype);
var count$1=0;
function MaterialIdCount(){return count$1++;};
exports.UniformsUtils={
merge:function merge(uniforms){
var merged={};
for(var u=0;u<uniforms.length;u++){
var tmp=this.clone(uniforms[u]);
for(var p in tmp){
merged[p]=tmp[p];
}
}
return merged;
},
clone:function clone(uniforms_src){
var uniforms_dst={};
for(var u in uniforms_src){
uniforms_dst[u]={};
for(var p in uniforms_src[u]){
var parameter_src=uniforms_src[u][p];
if(parameter_src&&parameter_src.isColor||
parameter_src&&parameter_src.isVector2||
parameter_src&&parameter_src.isVector3||
parameter_src&&parameter_src.isVector4||
parameter_src&&parameter_src.isMatrix3||
parameter_src&&parameter_src.isMatrix4||
parameter_src&&parameter_src.isTexture){
uniforms_dst[u][p]=parameter_src.clone();
}else if(Array.isArray(parameter_src)){
uniforms_dst[u][p]=parameter_src.slice();
}else{
uniforms_dst[u][p]=parameter_src;
}
}
}
return uniforms_dst;
}};
function ShaderMaterial(parameters){
Material.call(this);
this.type='ShaderMaterial';
this.defines={};
this.uniforms={};
this.vertexShader='void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}';
this.fragmentShader='void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}';
this.linewidth=1;
this.wireframe=false;
this.wireframeLinewidth=1;
this.fog=false;
this.lights=false;
this.clipping=false;
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.extensions={
derivatives:false,
fragDepth:false,
drawBuffers:false,
shaderTextureLOD:false};
this.defaultAttributeValues={
'color':[1,1,1],
'uv':[0,0],
'uv2':[0,0]};
this.index0AttributeName=undefined;
if(parameters!==undefined){
if(parameters.attributes!==undefined){
console.error('THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.');
}
this.setValues(parameters);
}
}
ShaderMaterial.prototype=Object.create(Material.prototype);
ShaderMaterial.prototype.constructor=ShaderMaterial;
ShaderMaterial.prototype.isShaderMaterial=true;
ShaderMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.fragmentShader=source.fragmentShader;
this.vertexShader=source.vertexShader;
this.uniforms=exports.UniformsUtils.clone(source.uniforms);
this.defines=source.defines;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.lights=source.lights;
this.clipping=source.clipping;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
this.extensions=source.extensions;
return this;
};
ShaderMaterial.prototype.toJSON=function(meta){
var data=Material.prototype.toJSON.call(this,meta);
data.uniforms=this.uniforms;
data.vertexShader=this.vertexShader;
data.fragmentShader=this.fragmentShader;
return data;
};
var alphamap_fragment="#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n";
var alphamap_pars_fragment="#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n";
var alphatest_fragment="#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n";
var aomap_fragment="#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n";
var aomap_pars_fragment="#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif";
var begin_vertex="\nvec3 transformed = vec3( position );\n";
var beginnormal_vertex="\nvec3 objectNormal = vec3( normal );\n";
var bsdfs="bool testLightInRange( const in float lightDistance, const in float cutoffDistance ) {\n\treturn any( bvec2( cutoffDistance == 0.0, lightDistance < cutoffDistance ) );\n}\nfloat punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t\t}\n\t\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n";
var bumpmap_pars_fragment="#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n";
var clipping_planes_fragment="#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n#endif\n";
var clipping_planes_pars_fragment="#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n";
var clipping_planes_pars_vertex="#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n";
var clipping_planes_vertex="#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n";
var color_fragment="#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif";
var color_pars_fragment="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n";
var color_pars_vertex="#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif";
var color_vertex="#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif";
var common="#define PI 3.14159265359\n#define PI2 6.28318530718\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\n";
var cube_uv_reflection_fragment="#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1 (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale = bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n";
var defaultnormal_vertex="#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n";
var displacementmap_pars_vertex="#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n";
var displacementmap_vertex="#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n";
var emissivemap_fragment="#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n";
var emissivemap_pars_fragment="#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n";
var encodings_fragment=" gl_FragColor = linearToOutputTexel( gl_FragColor );\n";
var encodings_pars_fragment="\nvec4 LinearToLinear( in vec4 value ) {\n return value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n return vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n return vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n return vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n return vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n float maxComponent = max( max( value.r, value.g ), value.b );\n float fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n return vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n M = ceil( M * 255.0 ) / 255.0;\n return vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n return vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n float maxRGB = max( value.x, max( value.g, value.b ) );\n float D = max( maxRange / maxRGB, 1.0 );\n D = min( floor( D ) / 255.0, 1.0 );\n return vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n vec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n Xp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n vec4 vResult;\n vResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n float Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n vResult.w = fract(Le);\n vResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n return vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n float Le = value.z * 255.0 + value.w;\n vec3 Xp_Y_XYZp;\n Xp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n Xp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n Xp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n vec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n return vec4( max(vRGB, 0.0), 1.0 );\n}\n";
var envmap_fragment="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n";
var envmap_pars_fragment="#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntenstiy;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n";
var envmap_pars_vertex="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n";
var envmap_vertex="#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n";
var fog_fragment="#ifdef USE_FOG\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tfloat depth = gl_FragDepthEXT / gl_FragCoord.w;\n\t#else\n\t\tfloat depth = gl_FragCoord.z / gl_FragCoord.w;\n\t#endif\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * depth * depth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, depth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n";
var fog_pars_fragment="#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif";
var lightmap_fragment="#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n";
var lightmap_pars_fragment="#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif";
var lights_lambert_vertex="vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n";
var lights_pars="uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tif ( testLightInRange( lightDistance, pointLight.distance ) ) {\n\t\t\tdirectLight.color = pointLight.color;\n\t\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( all( bvec2( angleCos > spotLight.coneCos, testLightInRange( lightDistance, spotLight.distance ) ) ) ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\t#include <normal_flip>\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = flipNormal * vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\t#include <normal_flip>\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = flipNormal * normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n";
var lights_phong_fragment="BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n";
var lights_phong_pars_fragment="varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n";
var lights_physical_fragment="PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n";
var lights_physical_pars_fragment="struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material ) GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n";
var lights_template="\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t \tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\t\t\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n";
var logdepthbuf_fragment="#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif";
var logdepthbuf_pars_fragment="#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n";
var logdepthbuf_pars_vertex="#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif";
var logdepthbuf_vertex="#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n";
var map_fragment="#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n";
var map_pars_fragment="#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n";
var map_particle_fragment="#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";
var map_particle_pars_fragment="#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n";
var metalnessmap_fragment="float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.r;\n#endif\n";
var metalnessmap_pars_fragment="#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif";
var morphnormal_vertex="#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n";
var morphtarget_pars_vertex="#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif";
var morphtarget_vertex="#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n";
var normal_flip="#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n";
var normal_fragment="#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal ) * flipNormal;\n#endif\n#ifdef USE_NORMALMAP\n\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n";
var normalmap_pars_fragment="#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\n\t\tvec3 N = normalize( surf_norm );\n\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\tmapN.xy = normalScale * mapN.xy;\n\t\tmat3 tsn = mat3( S, T, N );\n\t\treturn normalize( tsn * mapN );\n\t}\n#endif\n";
var packing="vec3 packNormalToRGB( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n return 1.0 - 2.0 * rgb.xyz;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n return ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n return linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n return (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n return ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n";
var premultiplied_alpha_fragment="#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n";
var project_vertex="#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n";
var roughnessmap_fragment="float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.r;\n#endif\n";
var roughnessmap_pars_fragment="#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif";
var shadowmap_pars_fragment="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\treturn (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n";
var shadowmap_pars_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n";
var shadowmap_vertex="#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n";
var shadowmask_pars_fragment="float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n";
var skinbase_vertex="#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif";
var skinning_pars_vertex="#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureWidth;\n\t\tuniform int boneTextureHeight;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureWidth ) );\n\t\t\tfloat y = floor( j / float( boneTextureWidth ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureWidth );\n\t\t\tfloat dy = 1.0 / float( boneTextureHeight );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n";
var skinning_vertex="#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\tskinned = bindMatrixInverse * skinned;\n#endif\n";
var skinnormal_vertex="#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n";
var specularmap_fragment="float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif";
var specularmap_pars_fragment="#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif";
var tonemapping_fragment="#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n";
var tonemapping_pars_fragment="#define saturate(a) clamp( a, 0.0, 1.0 )\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n return toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n return saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n color *= toneMappingExposure;\n color = max( vec3( 0.0 ), color - 0.004 );\n return pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n";
var uv_pars_fragment="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif";
var uv_pars_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform vec4 offsetRepeat;\n#endif\n";
var uv_vertex="#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif";
var uv2_pars_fragment="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif";
var uv2_pars_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif";
var uv2_vertex="#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif";
var worldpos_vertex="#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n";
var cube_frag="uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n";
var cube_vert="varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
var depth_frag="#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n";
var depth_vert="#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
var distanceRGBA_frag="uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include <common>\n#include <packing>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n";
var distanceRGBA_vert="varying vec4 vWorldPosition;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <skinbase_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition;\n}\n";
var equirect_frag="uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 0.5 );\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n";
var equirect_vert="varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n";
var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight;\n\treflectedLight.directDiffuse = vec3( 0.0 );\n\treflectedLight.directSpecular = vec3( 0.0 );\n\treflectedLight.indirectDiffuse = diffuseColor.rgb;\n\treflectedLight.indirectSpecular = vec3( 0.0 );\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var meshbasic_vert="#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n}\n";
var meshlambert_frag="uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <normal_flip>\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n}\n";
var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n}\n";
var meshphysical_frag="#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nuniform float envMapIntensity;\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <lights_pars>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_flip>\n\t#include <normal_fragment>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_template>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n";
var normal_frag="uniform float opacity;\nvarying vec3 vNormal;\n#include <common>\n#include <packing>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tgl_FragColor = vec4( packNormalToRGB( vNormal ), opacity );\n\t#include <logdepthbuf_fragment>\n}\n";
var normal_vert="varying vec3 vNormal;\n#include <common>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvNormal = normalize( normalMatrix * normal );\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n";
var points_frag="uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n";
var points_vert="uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n";
var shadow_frag="uniform float opacity;\n#include <common>\n#include <packing>\n#include <bsdfs>\n#include <lights_pars>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n";
var shadow_vert="#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n}\n";
var ShaderChunk={
alphamap_fragment:alphamap_fragment,
alphamap_pars_fragment:alphamap_pars_fragment,
alphatest_fragment:alphatest_fragment,
aomap_fragment:aomap_fragment,
aomap_pars_fragment:aomap_pars_fragment,
begin_vertex:begin_vertex,
beginnormal_vertex:beginnormal_vertex,
bsdfs:bsdfs,
bumpmap_pars_fragment:bumpmap_pars_fragment,
clipping_planes_fragment:clipping_planes_fragment,
clipping_planes_pars_fragment:clipping_planes_pars_fragment,
clipping_planes_pars_vertex:clipping_planes_pars_vertex,
clipping_planes_vertex:clipping_planes_vertex,
color_fragment:color_fragment,
color_pars_fragment:color_pars_fragment,
color_pars_vertex:color_pars_vertex,
color_vertex:color_vertex,
common:common,
cube_uv_reflection_fragment:cube_uv_reflection_fragment,
defaultnormal_vertex:defaultnormal_vertex,
displacementmap_pars_vertex:displacementmap_pars_vertex,
displacementmap_vertex:displacementmap_vertex,
emissivemap_fragment:emissivemap_fragment,
emissivemap_pars_fragment:emissivemap_pars_fragment,
encodings_fragment:encodings_fragment,
encodings_pars_fragment:encodings_pars_fragment,
envmap_fragment:envmap_fragment,
envmap_pars_fragment:envmap_pars_fragment,
envmap_pars_vertex:envmap_pars_vertex,
envmap_vertex:envmap_vertex,
fog_fragment:fog_fragment,
fog_pars_fragment:fog_pars_fragment,
lightmap_fragment:lightmap_fragment,
lightmap_pars_fragment:lightmap_pars_fragment,
lights_lambert_vertex:lights_lambert_vertex,
lights_pars:lights_pars,
lights_phong_fragment:lights_phong_fragment,
lights_phong_pars_fragment:lights_phong_pars_fragment,
lights_physical_fragment:lights_physical_fragment,
lights_physical_pars_fragment:lights_physical_pars_fragment,
lights_template:lights_template,
logdepthbuf_fragment:logdepthbuf_fragment,
logdepthbuf_pars_fragment:logdepthbuf_pars_fragment,
logdepthbuf_pars_vertex:logdepthbuf_pars_vertex,
logdepthbuf_vertex:logdepthbuf_vertex,
map_fragment:map_fragment,
map_pars_fragment:map_pars_fragment,
map_particle_fragment:map_particle_fragment,
map_particle_pars_fragment:map_particle_pars_fragment,
metalnessmap_fragment:metalnessmap_fragment,
metalnessmap_pars_fragment:metalnessmap_pars_fragment,
morphnormal_vertex:morphnormal_vertex,
morphtarget_pars_vertex:morphtarget_pars_vertex,
morphtarget_vertex:morphtarget_vertex,
normal_flip:normal_flip,
normal_fragment:normal_fragment,
normalmap_pars_fragment:normalmap_pars_fragment,
packing:packing,
premultiplied_alpha_fragment:premultiplied_alpha_fragment,
project_vertex:project_vertex,
roughnessmap_fragment:roughnessmap_fragment,
roughnessmap_pars_fragment:roughnessmap_pars_fragment,
shadowmap_pars_fragment:shadowmap_pars_fragment,
shadowmap_pars_vertex:shadowmap_pars_vertex,
shadowmap_vertex:shadowmap_vertex,
shadowmask_pars_fragment:shadowmask_pars_fragment,
skinbase_vertex:skinbase_vertex,
skinning_pars_vertex:skinning_pars_vertex,
skinning_vertex:skinning_vertex,
skinnormal_vertex:skinnormal_vertex,
specularmap_fragment:specularmap_fragment,
specularmap_pars_fragment:specularmap_pars_fragment,
tonemapping_fragment:tonemapping_fragment,
tonemapping_pars_fragment:tonemapping_pars_fragment,
uv_pars_fragment:uv_pars_fragment,
uv_pars_vertex:uv_pars_vertex,
uv_vertex:uv_vertex,
uv2_pars_fragment:uv2_pars_fragment,
uv2_pars_vertex:uv2_pars_vertex,
uv2_vertex:uv2_vertex,
worldpos_vertex:worldpos_vertex,
cube_frag:cube_frag,
cube_vert:cube_vert,
depth_frag:depth_frag,
depth_vert:depth_vert,
distanceRGBA_frag:distanceRGBA_frag,
distanceRGBA_vert:distanceRGBA_vert,
equirect_frag:equirect_frag,
equirect_vert:equirect_vert,
linedashed_frag:linedashed_frag,
linedashed_vert:linedashed_vert,
meshbasic_frag:meshbasic_frag,
meshbasic_vert:meshbasic_vert,
meshlambert_frag:meshlambert_frag,
meshlambert_vert:meshlambert_vert,
meshphong_frag:meshphong_frag,
meshphong_vert:meshphong_vert,
meshphysical_frag:meshphysical_frag,
meshphysical_vert:meshphysical_vert,
normal_frag:normal_frag,
normal_vert:normal_vert,
points_frag:points_frag,
points_vert:points_vert,
shadow_frag:shadow_frag,
shadow_vert:shadow_vert};
function Color(r,g,b){
if(g===undefined&&b===undefined){
return this.set(r);
}
return this.setRGB(r,g,b);
}
Color.prototype={
constructor:Color,
isColor:true,
r:1,g:1,b:1,
set:function set(value){
if(value&&value.isColor){
this.copy(value);
}else if(typeof value==='number'){
this.setHex(value);
}else if(typeof value==='string'){
this.setStyle(value);
}
return this;
},
setScalar:function setScalar(scalar){
this.r=scalar;
this.g=scalar;
this.b=scalar;
},
setHex:function setHex(hex){
hex=Math.floor(hex);
this.r=(hex>>16&255)/255;
this.g=(hex>>8&255)/255;
this.b=(hex&255)/255;
return this;
},
setRGB:function setRGB(r,g,b){
this.r=r;
this.g=g;
this.b=b;
return this;
},
setHSL:function(){
function hue2rgb(p,q,t){
if(t<0)t+=1;
if(t>1)t-=1;
if(t<1/6)return p+(q-p)*6*t;
if(t<1/2)return q;
if(t<2/3)return p+(q-p)*6*(2/3-t);
return p;
}
return function setHSL(h,s,l){
h=exports.Math.euclideanModulo(h,1);
s=exports.Math.clamp(s,0,1);
l=exports.Math.clamp(l,0,1);
if(s===0){
this.r=this.g=this.b=l;
}else{
var p=l<=0.5?l*(1+s):l+s-l*s;
var q=2*l-p;
this.r=hue2rgb(q,p,h+1/3);
this.g=hue2rgb(q,p,h);
this.b=hue2rgb(q,p,h-1/3);
}
return this;
};
}(),
setStyle:function setStyle(style){
function handleAlpha(string){
if(string===undefined)return;
if(parseFloat(string)<1){
console.warn('THREE.Color: Alpha component of '+style+' will be ignored.');
}
}
var m;
if(m=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(style)){
var color;
var name=m[1];
var components=m[2];
switch(name){
case'rgb':
case'rgba':
if(color=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){
this.r=Math.min(255,parseInt(color[1],10))/255;
this.g=Math.min(255,parseInt(color[2],10))/255;
this.b=Math.min(255,parseInt(color[3],10))/255;
handleAlpha(color[5]);
return this;
}
if(color=/^(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){
this.r=Math.min(100,parseInt(color[1],10))/100;
this.g=Math.min(100,parseInt(color[2],10))/100;
this.b=Math.min(100,parseInt(color[3],10))/100;
handleAlpha(color[5]);
return this;
}
break;
case'hsl':
case'hsla':
if(color=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(components)){
var h=parseFloat(color[1])/360;
var s=parseInt(color[2],10)/100;
var l=parseInt(color[3],10)/100;
handleAlpha(color[5]);
return this.setHSL(h,s,l);
}
break;}
}else if(m=/^\#([A-Fa-f0-9]+)$/.exec(style)){
var hex=m[1];
var size=hex.length;
if(size===3){
this.r=parseInt(hex.charAt(0)+hex.charAt(0),16)/255;
this.g=parseInt(hex.charAt(1)+hex.charAt(1),16)/255;
this.b=parseInt(hex.charAt(2)+hex.charAt(2),16)/255;
return this;
}else if(size===6){
this.r=parseInt(hex.charAt(0)+hex.charAt(1),16)/255;
this.g=parseInt(hex.charAt(2)+hex.charAt(3),16)/255;
this.b=parseInt(hex.charAt(4)+hex.charAt(5),16)/255;
return this;
}
}
if(style&&style.length>0){
var hex=exports.ColorKeywords[style];
if(hex!==undefined){
this.setHex(hex);
}else{
console.warn('THREE.Color: Unknown color '+style);
}
}
return this;
},
clone:function clone(){
return new this.constructor(this.r,this.g,this.b);
},
copy:function copy(color){
this.r=color.r;
this.g=color.g;
this.b=color.b;
return this;
},
copyGammaToLinear:function copyGammaToLinear(color,gammaFactor){
if(gammaFactor===undefined)gammaFactor=2.0;
this.r=Math.pow(color.r,gammaFactor);
this.g=Math.pow(color.g,gammaFactor);
this.b=Math.pow(color.b,gammaFactor);
return this;
},
copyLinearToGamma:function copyLinearToGamma(color,gammaFactor){
if(gammaFactor===undefined)gammaFactor=2.0;
var safeInverse=gammaFactor>0?1.0/gammaFactor:1.0;
this.r=Math.pow(color.r,safeInverse);
this.g=Math.pow(color.g,safeInverse);
this.b=Math.pow(color.b,safeInverse);
return this;
},
convertGammaToLinear:function convertGammaToLinear(){
var r=this.r,g=this.g,b=this.b;
this.r=r*r;
this.g=g*g;
this.b=b*b;
return this;
},
convertLinearToGamma:function convertLinearToGamma(){
this.r=Math.sqrt(this.r);
this.g=Math.sqrt(this.g);
this.b=Math.sqrt(this.b);
return this;
},
getHex:function getHex(){
return this.r*255<<16^this.g*255<<8^this.b*255<<0;
},
getHexString:function getHexString(){
return('000000'+this.getHex().toString(16)).slice(-6);
},
getHSL:function getHSL(optionalTarget){
var hsl=optionalTarget||{h:0,s:0,l:0};
var r=this.r,g=this.g,b=this.b;
var max=Math.max(r,g,b);
var min=Math.min(r,g,b);
var hue,saturation;
var lightness=(min+max)/2.0;
if(min===max){
hue=0;
saturation=0;
}else{
var delta=max-min;
saturation=lightness<=0.5?delta/(max+min):delta/(2-max-min);
switch(max){
case r:hue=(g-b)/delta+(g<b?6:0);break;
case g:hue=(b-r)/delta+2;break;
case b:hue=(r-g)/delta+4;break;}
hue/=6;
}
hsl.h=hue;
hsl.s=saturation;
hsl.l=lightness;
return hsl;
},
getStyle:function getStyle(){
return'rgb('+(this.r*255|0)+','+(this.g*255|0)+','+(this.b*255|0)+')';
},
offsetHSL:function offsetHSL(h,s,l){
var hsl=this.getHSL();
hsl.h+=h;hsl.s+=s;hsl.l+=l;
this.setHSL(hsl.h,hsl.s,hsl.l);
return this;
},
add:function add(color){
this.r+=color.r;
this.g+=color.g;
this.b+=color.b;
return this;
},
addColors:function addColors(color1,color2){
this.r=color1.r+color2.r;
this.g=color1.g+color2.g;
this.b=color1.b+color2.b;
return this;
},
addScalar:function addScalar(s){
this.r+=s;
this.g+=s;
this.b+=s;
return this;
},
sub:function sub(color){
this.r=Math.max(0,this.r-color.r);
this.g=Math.max(0,this.g-color.g);
this.b=Math.max(0,this.b-color.b);
return this;
},
multiply:function multiply(color){
this.r*=color.r;
this.g*=color.g;
this.b*=color.b;
return this;
},
multiplyScalar:function multiplyScalar(s){
this.r*=s;
this.g*=s;
this.b*=s;
return this;
},
lerp:function lerp(color,alpha){
this.r+=(color.r-this.r)*alpha;
this.g+=(color.g-this.g)*alpha;
this.b+=(color.b-this.b)*alpha;
return this;
},
equals:function equals(c){
return c.r===this.r&&c.g===this.g&&c.b===this.b;
},
fromArray:function fromArray(array,offset){
if(offset===undefined)offset=0;
this.r=array[offset];
this.g=array[offset+1];
this.b=array[offset+2];
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
array[offset]=this.r;
array[offset+1]=this.g;
array[offset+2]=this.b;
return array;
},
toJSON:function toJSON(){
return this.getHex();
}};
exports.ColorKeywords={'aliceblue':0xF0F8FF,'antiquewhite':0xFAEBD7,'aqua':0x00FFFF,'aquamarine':0x7FFFD4,'azure':0xF0FFFF,
'beige':0xF5F5DC,'bisque':0xFFE4C4,'black':0x000000,'blanchedalmond':0xFFEBCD,'blue':0x0000FF,'blueviolet':0x8A2BE2,
'brown':0xA52A2A,'burlywood':0xDEB887,'cadetblue':0x5F9EA0,'chartreuse':0x7FFF00,'chocolate':0xD2691E,'coral':0xFF7F50,
'cornflowerblue':0x6495ED,'cornsilk':0xFFF8DC,'crimson':0xDC143C,'cyan':0x00FFFF,'darkblue':0x00008B,'darkcyan':0x008B8B,
'darkgoldenrod':0xB8860B,'darkgray':0xA9A9A9,'darkgreen':0x006400,'darkgrey':0xA9A9A9,'darkkhaki':0xBDB76B,'darkmagenta':0x8B008B,
'darkolivegreen':0x556B2F,'darkorange':0xFF8C00,'darkorchid':0x9932CC,'darkred':0x8B0000,'darksalmon':0xE9967A,'darkseagreen':0x8FBC8F,
'darkslateblue':0x483D8B,'darkslategray':0x2F4F4F,'darkslategrey':0x2F4F4F,'darkturquoise':0x00CED1,'darkviolet':0x9400D3,
'deeppink':0xFF1493,'deepskyblue':0x00BFFF,'dimgray':0x696969,'dimgrey':0x696969,'dodgerblue':0x1E90FF,'firebrick':0xB22222,
'floralwhite':0xFFFAF0,'forestgreen':0x228B22,'fuchsia':0xFF00FF,'gainsboro':0xDCDCDC,'ghostwhite':0xF8F8FF,'gold':0xFFD700,
'goldenrod':0xDAA520,'gray':0x808080,'green':0x008000,'greenyellow':0xADFF2F,'grey':0x808080,'honeydew':0xF0FFF0,'hotpink':0xFF69B4,
'indianred':0xCD5C5C,'indigo':0x4B0082,'ivory':0xFFFFF0,'khaki':0xF0E68C,'lavender':0xE6E6FA,'lavenderblush':0xFFF0F5,'lawngreen':0x7CFC00,
'lemonchiffon':0xFFFACD,'lightblue':0xADD8E6,'lightcoral':0xF08080,'lightcyan':0xE0FFFF,'lightgoldenrodyellow':0xFAFAD2,'lightgray':0xD3D3D3,
'lightgreen':0x90EE90,'lightgrey':0xD3D3D3,'lightpink':0xFFB6C1,'lightsalmon':0xFFA07A,'lightseagreen':0x20B2AA,'lightskyblue':0x87CEFA,
'lightslategray':0x778899,'lightslategrey':0x778899,'lightsteelblue':0xB0C4DE,'lightyellow':0xFFFFE0,'lime':0x00FF00,'limegreen':0x32CD32,
'linen':0xFAF0E6,'magenta':0xFF00FF,'maroon':0x800000,'mediumaquamarine':0x66CDAA,'mediumblue':0x0000CD,'mediumorchid':0xBA55D3,
'mediumpurple':0x9370DB,'mediumseagreen':0x3CB371,'mediumslateblue':0x7B68EE,'mediumspringgreen':0x00FA9A,'mediumturquoise':0x48D1CC,
'mediumvioletred':0xC71585,'midnightblue':0x191970,'mintcream':0xF5FFFA,'mistyrose':0xFFE4E1,'moccasin':0xFFE4B5,'navajowhite':0xFFDEAD,
'navy':0x000080,'oldlace':0xFDF5E6,'olive':0x808000,'olivedrab':0x6B8E23,'orange':0xFFA500,'orangered':0xFF4500,'orchid':0xDA70D6,
'palegoldenrod':0xEEE8AA,'palegreen':0x98FB98,'paleturquoise':0xAFEEEE,'palevioletred':0xDB7093,'papayawhip':0xFFEFD5,'peachpuff':0xFFDAB9,
'peru':0xCD853F,'pink':0xFFC0CB,'plum':0xDDA0DD,'powderblue':0xB0E0E6,'purple':0x800080,'red':0xFF0000,'rosybrown':0xBC8F8F,
'royalblue':0x4169E1,'saddlebrown':0x8B4513,'salmon':0xFA8072,'sandybrown':0xF4A460,'seagreen':0x2E8B57,'seashell':0xFFF5EE,
'sienna':0xA0522D,'silver':0xC0C0C0,'skyblue':0x87CEEB,'slateblue':0x6A5ACD,'slategray':0x708090,'slategrey':0x708090,'snow':0xFFFAFA,
'springgreen':0x00FF7F,'steelblue':0x4682B4,'tan':0xD2B48C,'teal':0x008080,'thistle':0xD8BFD8,'tomato':0xFF6347,'turquoise':0x40E0D0,
'violet':0xEE82EE,'wheat':0xF5DEB3,'white':0xFFFFFF,'whitesmoke':0xF5F5F5,'yellow':0xFFFF00,'yellowgreen':0x9ACD32};
var UniformsLib={
common:{
diffuse:{value:new Color(0xeeeeee)},
opacity:{value:1.0},
map:{value:null},
offsetRepeat:{value:new Vector4(0,0,1,1)},
specularMap:{value:null},
alphaMap:{value:null},
envMap:{value:null},
flipEnvMap:{value:-1},
reflectivity:{value:1.0},
refractionRatio:{value:0.98}},
aomap:{
aoMap:{value:null},
aoMapIntensity:{value:1}},
lightmap:{
lightMap:{value:null},
lightMapIntensity:{value:1}},
emissivemap:{
emissiveMap:{value:null}},
bumpmap:{
bumpMap:{value:null},
bumpScale:{value:1}},
normalmap:{
normalMap:{value:null},
normalScale:{value:new Vector2(1,1)}},
displacementmap:{
displacementMap:{value:null},
displacementScale:{value:1},
displacementBias:{value:0}},
roughnessmap:{
roughnessMap:{value:null}},
metalnessmap:{
metalnessMap:{value:null}},
fog:{
fogDensity:{value:0.00025},
fogNear:{value:1},
fogFar:{value:2000},
fogColor:{value:new Color(0xffffff)}},
lights:{
ambientLightColor:{value:[]},
directionalLights:{value:[],properties:{
direction:{},
color:{},
shadow:{},
shadowBias:{},
shadowRadius:{},
shadowMapSize:{}}},
directionalShadowMap:{value:[]},
directionalShadowMatrix:{value:[]},
spotLights:{value:[],properties:{
color:{},
position:{},
direction:{},
distance:{},
coneCos:{},
penumbraCos:{},
decay:{},
shadow:{},
shadowBias:{},
shadowRadius:{},
shadowMapSize:{}}},
spotShadowMap:{value:[]},
spotShadowMatrix:{value:[]},
pointLights:{value:[],properties:{
color:{},
position:{},
decay:{},
distance:{},
shadow:{},
shadowBias:{},
shadowRadius:{},
shadowMapSize:{}}},
pointShadowMap:{value:[]},
pointShadowMatrix:{value:[]},
hemisphereLights:{value:[],properties:{
direction:{},
skyColor:{},
groundColor:{}}}},
points:{
diffuse:{value:new Color(0xeeeeee)},
opacity:{value:1.0},
size:{value:1.0},
scale:{value:1.0},
map:{value:null},
offsetRepeat:{value:new Vector4(0,0,1,1)}}};
var ShaderLib={
basic:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.common,
UniformsLib.aomap,
UniformsLib.fog]),
vertexShader:ShaderChunk.meshbasic_vert,
fragmentShader:ShaderChunk.meshbasic_frag},
lambert:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.common,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive:{value:new Color(0x000000)}}]),
vertexShader:ShaderChunk.meshlambert_vert,
fragmentShader:ShaderChunk.meshlambert_frag},
phong:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.common,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive:{value:new Color(0x000000)},
specular:{value:new Color(0x111111)},
shininess:{value:30}}]),
vertexShader:ShaderChunk.meshphong_vert,
fragmentShader:ShaderChunk.meshphong_frag},
standard:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.common,
UniformsLib.aomap,
UniformsLib.lightmap,
UniformsLib.emissivemap,
UniformsLib.bumpmap,
UniformsLib.normalmap,
UniformsLib.displacementmap,
UniformsLib.roughnessmap,
UniformsLib.metalnessmap,
UniformsLib.fog,
UniformsLib.lights,
{
emissive:{value:new Color(0x000000)},
roughness:{value:0.5},
metalness:{value:0},
envMapIntensity:{value:1}}]),
vertexShader:ShaderChunk.meshphysical_vert,
fragmentShader:ShaderChunk.meshphysical_frag},
points:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.points,
UniformsLib.fog]),
vertexShader:ShaderChunk.points_vert,
fragmentShader:ShaderChunk.points_frag},
dashed:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.common,
UniformsLib.fog,
{
scale:{value:1},
dashSize:{value:1},
totalSize:{value:2}}]),
vertexShader:ShaderChunk.linedashed_vert,
fragmentShader:ShaderChunk.linedashed_frag},
depth:{
uniforms:exports.UniformsUtils.merge([
UniformsLib.common,
UniformsLib.displacementmap]),
vertexShader:ShaderChunk.depth_vert,
fragmentShader:ShaderChunk.depth_frag},
normal:{
uniforms:{
opacity:{value:1.0}},
vertexShader:ShaderChunk.normal_vert,
fragmentShader:ShaderChunk.normal_frag},
cube:{
uniforms:{
tCube:{value:null},
tFlip:{value:-1},
opacity:{value:1.0}},
vertexShader:ShaderChunk.cube_vert,
fragmentShader:ShaderChunk.cube_frag},
equirect:{
uniforms:{
tEquirect:{value:null},
tFlip:{value:-1}},
vertexShader:ShaderChunk.equirect_vert,
fragmentShader:ShaderChunk.equirect_frag},
distanceRGBA:{
uniforms:{
lightPos:{value:new Vector3()}},
vertexShader:ShaderChunk.distanceRGBA_vert,
fragmentShader:ShaderChunk.distanceRGBA_frag}};
ShaderLib.physical={
uniforms:exports.UniformsUtils.merge([
ShaderLib.standard.uniforms,
{
clearCoat:{value:0},
clearCoatRoughness:{value:0}}]),
vertexShader:ShaderChunk.meshphysical_vert,
fragmentShader:ShaderChunk.meshphysical_frag};
function MeshDepthMaterial(parameters){
Material.call(this);
this.type='MeshDepthMaterial';
this.depthPacking=BasicDepthPacking;
this.skinning=false;
this.morphTargets=false;
this.map=null;
this.alphaMap=null;
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.wireframe=false;
this.wireframeLinewidth=1;
this.fog=false;
this.lights=false;
this.setValues(parameters);
}
MeshDepthMaterial.prototype=Object.create(Material.prototype);
MeshDepthMaterial.prototype.constructor=MeshDepthMaterial;
MeshDepthMaterial.prototype.isMeshDepthMaterial=true;
MeshDepthMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.depthPacking=source.depthPacking;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.map=source.map;
this.alphaMap=source.alphaMap;
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
return this;
};
function Box3(min,max){
this.min=min!==undefined?min:new Vector3(+Infinity,+Infinity,+Infinity);
this.max=max!==undefined?max:new Vector3(-Infinity,-Infinity,-Infinity);
}
Box3.prototype={
constructor:Box3,
isBox3:true,
set:function set(min,max){
this.min.copy(min);
this.max.copy(max);
return this;
},
setFromArray:function setFromArray(array){
var minX=+Infinity;
var minY=+Infinity;
var minZ=+Infinity;
var maxX=-Infinity;
var maxY=-Infinity;
var maxZ=-Infinity;
for(var i=0,l=array.length;i<l;i+=3){
var x=array[i];
var y=array[i+1];
var z=array[i+2];
if(x<minX)minX=x;
if(y<minY)minY=y;
if(z<minZ)minZ=z;
if(x>maxX)maxX=x;
if(y>maxY)maxY=y;
if(z>maxZ)maxZ=z;
}
this.min.set(minX,minY,minZ);
this.max.set(maxX,maxY,maxZ);
},
setFromPoints:function setFromPoints(points){
this.makeEmpty();
for(var i=0,il=points.length;i<il;i++){
this.expandByPoint(points[i]);
}
return this;
},
setFromCenterAndSize:function(){
var v1=new Vector3();
return function setFromCenterAndSize(center,size){
var halfSize=v1.copy(size).multiplyScalar(0.5);
this.min.copy(center).sub(halfSize);
this.max.copy(center).add(halfSize);
return this;
};
}(),
setFromObject:function(){
var v1=new Vector3();
return function setFromObject(object){
var scope=this;
object.updateMatrixWorld(true);
this.makeEmpty();
object.traverse(function(node){
var geometry=node.geometry;
if(geometry!==undefined){
if(geometry&&geometry.isGeometry){
var vertices=geometry.vertices;
for(var i=0,il=vertices.length;i<il;i++){
v1.copy(vertices[i]);
v1.applyMatrix4(node.matrixWorld);
scope.expandByPoint(v1);
}
}else if(geometry&&geometry.isBufferGeometry){
var attribute=geometry.attributes.position;
if(attribute!==undefined){
var array,offset,stride;
if(attribute&&attribute.isInterleavedBufferAttribute){
array=attribute.data.array;
offset=attribute.offset;
stride=attribute.data.stride;
}else{
array=attribute.array;
offset=0;
stride=3;
}
for(var i=offset,il=array.length;i<il;i+=stride){
v1.fromArray(array,i);
v1.applyMatrix4(node.matrixWorld);
scope.expandByPoint(v1);
}
}
}
}
});
return this;
};
}(),
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(box){
this.min.copy(box.min);
this.max.copy(box.max);
return this;
},
makeEmpty:function makeEmpty(){
this.min.x=this.min.y=this.min.z=+Infinity;
this.max.x=this.max.y=this.max.z=-Infinity;
return this;
},
isEmpty:function isEmpty(){
return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z;
},
center:function center(optionalTarget){
var result=optionalTarget||new Vector3();
return result.addVectors(this.min,this.max).multiplyScalar(0.5);
},
size:function size(optionalTarget){
var result=optionalTarget||new Vector3();
return result.subVectors(this.max,this.min);
},
expandByPoint:function expandByPoint(point){
this.min.min(point);
this.max.max(point);
return this;
},
expandByVector:function expandByVector(vector){
this.min.sub(vector);
this.max.add(vector);
return this;
},
expandByScalar:function expandByScalar(scalar){
this.min.addScalar(-scalar);
this.max.addScalar(scalar);
return this;
},
containsPoint:function containsPoint(point){
if(point.x<this.min.x||point.x>this.max.x||
point.y<this.min.y||point.y>this.max.y||
point.z<this.min.z||point.z>this.max.z){
return false;
}
return true;
},
containsBox:function containsBox(box){
if(this.min.x<=box.min.x&&box.max.x<=this.max.x&&
this.min.y<=box.min.y&&box.max.y<=this.max.y&&
this.min.z<=box.min.z&&box.max.z<=this.max.z){
return true;
}
return false;
},
getParameter:function getParameter(point,optionalTarget){
var result=optionalTarget||new Vector3();
return result.set(
(point.x-this.min.x)/(this.max.x-this.min.x),
(point.y-this.min.y)/(this.max.y-this.min.y),
(point.z-this.min.z)/(this.max.z-this.min.z));
},
intersectsBox:function intersectsBox(box){
if(box.max.x<this.min.x||box.min.x>this.max.x||
box.max.y<this.min.y||box.min.y>this.max.y||
box.max.z<this.min.z||box.min.z>this.max.z){
return false;
}
return true;
},
intersectsSphere:function(){
var closestPoint;
return function intersectsSphere(sphere){
if(closestPoint===undefined)closestPoint=new Vector3();
this.clampPoint(sphere.center,closestPoint);
return closestPoint.distanceToSquared(sphere.center)<=sphere.radius*sphere.radius;
};
}(),
intersectsPlane:function intersectsPlane(plane){
var min,max;
if(plane.normal.x>0){
min=plane.normal.x*this.min.x;
max=plane.normal.x*this.max.x;
}else{
min=plane.normal.x*this.max.x;
max=plane.normal.x*this.min.x;
}
if(plane.normal.y>0){
min+=plane.normal.y*this.min.y;
max+=plane.normal.y*this.max.y;
}else{
min+=plane.normal.y*this.max.y;
max+=plane.normal.y*this.min.y;
}
if(plane.normal.z>0){
min+=plane.normal.z*this.min.z;
max+=plane.normal.z*this.max.z;
}else{
min+=plane.normal.z*this.max.z;
max+=plane.normal.z*this.min.z;
}
return min<=plane.constant&&max>=plane.constant;
},
clampPoint:function clampPoint(point,optionalTarget){
var result=optionalTarget||new Vector3();
return result.copy(point).clamp(this.min,this.max);
},
distanceToPoint:function(){
var v1=new Vector3();
return function distanceToPoint(point){
var clampedPoint=v1.copy(point).clamp(this.min,this.max);
return clampedPoint.sub(point).length();
};
}(),
getBoundingSphere:function(){
var v1=new Vector3();
return function getBoundingSphere(optionalTarget){
var result=optionalTarget||new Sphere();
result.center=this.center();
result.radius=this.size(v1).length()*0.5;
return result;
};
}(),
intersect:function intersect(box){
this.min.max(box.min);
this.max.min(box.max);
if(this.isEmpty())this.makeEmpty();
return this;
},
union:function union(box){
this.min.min(box.min);
this.max.max(box.max);
return this;
},
applyMatrix4:function(){
var points=[
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3(),
new Vector3()];
return function applyMatrix4(matrix){
if(this.isEmpty())return this;
points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix);
points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix);
points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix);
points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix);
points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix);
points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix);
points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix);
points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix);
this.setFromPoints(points);
return this;
};
}(),
translate:function translate(offset){
this.min.add(offset);
this.max.add(offset);
return this;
},
equals:function equals(box){
return box.min.equals(this.min)&&box.max.equals(this.max);
}};
function Sphere(center,radius){
this.center=center!==undefined?center:new Vector3();
this.radius=radius!==undefined?radius:0;
}
Sphere.prototype={
constructor:Sphere,
set:function set(center,radius){
this.center.copy(center);
this.radius=radius;
return this;
},
setFromPoints:function(){
var box=new Box3();
return function setFromPoints(points,optionalCenter){
var center=this.center;
if(optionalCenter!==undefined){
center.copy(optionalCenter);
}else{
box.setFromPoints(points).center(center);
}
var maxRadiusSq=0;
for(var i=0,il=points.length;i<il;i++){
maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(points[i]));
}
this.radius=Math.sqrt(maxRadiusSq);
return this;
};
}(),
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(sphere){
this.center.copy(sphere.center);
this.radius=sphere.radius;
return this;
},
empty:function empty(){
return this.radius<=0;
},
containsPoint:function containsPoint(point){
return point.distanceToSquared(this.center)<=this.radius*this.radius;
},
distanceToPoint:function distanceToPoint(point){
return point.distanceTo(this.center)-this.radius;
},
intersectsSphere:function intersectsSphere(sphere){
var radiusSum=this.radius+sphere.radius;
return sphere.center.distanceToSquared(this.center)<=radiusSum*radiusSum;
},
intersectsBox:function intersectsBox(box){
return box.intersectsSphere(this);
},
intersectsPlane:function intersectsPlane(plane){
return Math.abs(this.center.dot(plane.normal)-plane.constant)<=this.radius;
},
clampPoint:function clampPoint(point,optionalTarget){
var deltaLengthSq=this.center.distanceToSquared(point);
var result=optionalTarget||new Vector3();
result.copy(point);
if(deltaLengthSq>this.radius*this.radius){
result.sub(this.center).normalize();
result.multiplyScalar(this.radius).add(this.center);
}
return result;
},
getBoundingBox:function getBoundingBox(optionalTarget){
var box=optionalTarget||new Box3();
box.set(this.center,this.center);
box.expandByScalar(this.radius);
return box;
},
applyMatrix4:function applyMatrix4(matrix){
this.center.applyMatrix4(matrix);
this.radius=this.radius*matrix.getMaxScaleOnAxis();
return this;
},
translate:function translate(offset){
this.center.add(offset);
return this;
},
equals:function equals(sphere){
return sphere.center.equals(this.center)&&sphere.radius===this.radius;
}};
function Matrix3(){
this.elements=new Float32Array([
1,0,0,
0,1,0,
0,0,1]);
if(arguments.length>0){
console.error('THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.');
}
}
Matrix3.prototype={
constructor:Matrix3,
isMatrix3:true,
set:function set(n11,n12,n13,n21,n22,n23,n31,n32,n33){
var te=this.elements;
te[0]=n11;te[1]=n21;te[2]=n31;
te[3]=n12;te[4]=n22;te[5]=n32;
te[6]=n13;te[7]=n23;te[8]=n33;
return this;
},
identity:function identity(){
this.set(
1,0,0,
0,1,0,
0,0,1);
return this;
},
clone:function clone(){
return new this.constructor().fromArray(this.elements);
},
copy:function copy(m){
var me=m.elements;
this.set(
me[0],me[3],me[6],
me[1],me[4],me[7],
me[2],me[5],me[8]);
return this;
},
setFromMatrix4:function setFromMatrix4(m){
var me=m.elements;
this.set(
me[0],me[4],me[8],
me[1],me[5],me[9],
me[2],me[6],me[10]);
return this;
},
applyToVector3Array:function(){
var v1;
return function applyToVector3Array(array,offset,length){
if(v1===undefined)v1=new Vector3();
if(offset===undefined)offset=0;
if(length===undefined)length=array.length;
for(var i=0,j=offset;i<length;i+=3,j+=3){
v1.fromArray(array,j);
v1.applyMatrix3(this);
v1.toArray(array,j);
}
return array;
};
}(),
applyToBuffer:function(){
var v1;
return function applyToBuffer(buffer,offset,length){
if(v1===undefined)v1=new Vector3();
if(offset===undefined)offset=0;
if(length===undefined)length=buffer.length/buffer.itemSize;
for(var i=0,j=offset;i<length;i++,j++){
v1.x=buffer.getX(j);
v1.y=buffer.getY(j);
v1.z=buffer.getZ(j);
v1.applyMatrix3(this);
buffer.setXYZ(v1.x,v1.y,v1.z);
}
return buffer;
};
}(),
multiplyScalar:function multiplyScalar(s){
var te=this.elements;
te[0]*=s;te[3]*=s;te[6]*=s;
te[1]*=s;te[4]*=s;te[7]*=s;
te[2]*=s;te[5]*=s;te[8]*=s;
return this;
},
determinant:function determinant(){
var te=this.elements;
var a=te[0],b=te[1],c=te[2],
d=te[3],e=te[4],f=te[5],
g=te[6],h=te[7],i=te[8];
return a*e*i-a*f*h-b*d*i+b*f*g+c*d*h-c*e*g;
},
getInverse:function getInverse(matrix,throwOnDegenerate){
if(matrix&&matrix.isMatrix4){
console.error("THREE.Matrix3.getInverse no longer takes a Matrix4 argument.");
}
var me=matrix.elements,
te=this.elements,
n11=me[0],n21=me[1],n31=me[2],
n12=me[3],n22=me[4],n32=me[5],
n13=me[6],n23=me[7],n33=me[8],
t11=n33*n22-n32*n23,
t12=n32*n13-n33*n12,
t13=n23*n12-n22*n13,
det=n11*t11+n21*t12+n31*t13;
if(det===0){
var msg="THREE.Matrix3.getInverse(): can't invert matrix, determinant is 0";
if(throwOnDegenerate===true){
throw new Error(msg);
}else{
console.warn(msg);
}
return this.identity();
}
var detInv=1/det;
te[0]=t11*detInv;
te[1]=(n31*n23-n33*n21)*detInv;
te[2]=(n32*n21-n31*n22)*detInv;
te[3]=t12*detInv;
te[4]=(n33*n11-n31*n13)*detInv;
te[5]=(n31*n12-n32*n11)*detInv;
te[6]=t13*detInv;
te[7]=(n21*n13-n23*n11)*detInv;
te[8]=(n22*n11-n21*n12)*detInv;
return this;
},
transpose:function transpose(){
var tmp,m=this.elements;
tmp=m[1];m[1]=m[3];m[3]=tmp;
tmp=m[2];m[2]=m[6];m[6]=tmp;
tmp=m[5];m[5]=m[7];m[7]=tmp;
return this;
},
flattenToArrayOffset:function flattenToArrayOffset(array,offset){
console.warn("THREE.Matrix3: .flattenToArrayOffset is deprecated "+
"- just use .toArray instead.");
return this.toArray(array,offset);
},
getNormalMatrix:function getNormalMatrix(matrix4){
return this.setFromMatrix4(matrix4).getInverse(this).transpose();
},
transposeIntoArray:function transposeIntoArray(r){
var m=this.elements;
r[0]=m[0];
r[1]=m[3];
r[2]=m[6];
r[3]=m[1];
r[4]=m[4];
r[5]=m[7];
r[6]=m[2];
r[7]=m[5];
r[8]=m[8];
return this;
},
fromArray:function fromArray(array){
this.elements.set(array);
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
var te=this.elements;
array[offset]=te[0];
array[offset+1]=te[1];
array[offset+2]=te[2];
array[offset+3]=te[3];
array[offset+4]=te[4];
array[offset+5]=te[5];
array[offset+6]=te[6];
array[offset+7]=te[7];
array[offset+8]=te[8];
return array;
}};
function Plane(normal,constant){
this.normal=normal!==undefined?normal:new Vector3(1,0,0);
this.constant=constant!==undefined?constant:0;
}
Plane.prototype={
constructor:Plane,
set:function set(normal,constant){
this.normal.copy(normal);
this.constant=constant;
return this;
},
setComponents:function setComponents(x,y,z,w){
this.normal.set(x,y,z);
this.constant=w;
return this;
},
setFromNormalAndCoplanarPoint:function setFromNormalAndCoplanarPoint(normal,point){
this.normal.copy(normal);
this.constant=-point.dot(this.normal);
return this;
},
setFromCoplanarPoints:function(){
var v1=new Vector3();
var v2=new Vector3();
return function setFromCoplanarPoints(a,b,c){
var normal=v1.subVectors(c,b).cross(v2.subVectors(a,b)).normalize();
this.setFromNormalAndCoplanarPoint(normal,a);
return this;
};
}(),
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(plane){
this.normal.copy(plane.normal);
this.constant=plane.constant;
return this;
},
normalize:function normalize(){
var inverseNormalLength=1.0/this.normal.length();
this.normal.multiplyScalar(inverseNormalLength);
this.constant*=inverseNormalLength;
return this;
},
negate:function negate(){
this.constant*=-1;
this.normal.negate();
return this;
},
distanceToPoint:function distanceToPoint(point){
return this.normal.dot(point)+this.constant;
},
distanceToSphere:function distanceToSphere(sphere){
return this.distanceToPoint(sphere.center)-sphere.radius;
},
projectPoint:function projectPoint(point,optionalTarget){
return this.orthoPoint(point,optionalTarget).sub(point).negate();
},
orthoPoint:function orthoPoint(point,optionalTarget){
var perpendicularMagnitude=this.distanceToPoint(point);
var result=optionalTarget||new Vector3();
return result.copy(this.normal).multiplyScalar(perpendicularMagnitude);
},
intersectLine:function(){
var v1=new Vector3();
return function intersectLine(line,optionalTarget){
var result=optionalTarget||new Vector3();
var direction=line.delta(v1);
var denominator=this.normal.dot(direction);
if(denominator===0){
if(this.distanceToPoint(line.start)===0){
return result.copy(line.start);
}
return undefined;
}
var t=-(line.start.dot(this.normal)+this.constant)/denominator;
if(t<0||t>1){
return undefined;
}
return result.copy(direction).multiplyScalar(t).add(line.start);
};
}(),
intersectsLine:function intersectsLine(line){
var startSign=this.distanceToPoint(line.start);
var endSign=this.distanceToPoint(line.end);
return startSign<0&&endSign>0||endSign<0&&startSign>0;
},
intersectsBox:function intersectsBox(box){
return box.intersectsPlane(this);
},
intersectsSphere:function intersectsSphere(sphere){
return sphere.intersectsPlane(this);
},
coplanarPoint:function coplanarPoint(optionalTarget){
var result=optionalTarget||new Vector3();
return result.copy(this.normal).multiplyScalar(-this.constant);
},
applyMatrix4:function(){
var v1=new Vector3();
var m1=new Matrix3();
return function applyMatrix4(matrix,optionalNormalMatrix){
var referencePoint=this.coplanarPoint(v1).applyMatrix4(matrix);
var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix);
var normal=this.normal.applyMatrix3(normalMatrix).normalize();
this.constant=-referencePoint.dot(normal);
return this;
};
}(),
translate:function translate(offset){
this.constant=this.constant-offset.dot(this.normal);
return this;
},
equals:function equals(plane){
return plane.normal.equals(this.normal)&&plane.constant===this.constant;
}};
function Frustum(p0,p1,p2,p3,p4,p5){
this.planes=[
p0!==undefined?p0:new Plane(),
p1!==undefined?p1:new Plane(),
p2!==undefined?p2:new Plane(),
p3!==undefined?p3:new Plane(),
p4!==undefined?p4:new Plane(),
p5!==undefined?p5:new Plane()];
}
Frustum.prototype={
constructor:Frustum,
set:function set(p0,p1,p2,p3,p4,p5){
var planes=this.planes;
planes[0].copy(p0);
planes[1].copy(p1);
planes[2].copy(p2);
planes[3].copy(p3);
planes[4].copy(p4);
planes[5].copy(p5);
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(frustum){
var planes=this.planes;
for(var i=0;i<6;i++){
planes[i].copy(frustum.planes[i]);
}
return this;
},
setFromMatrix:function setFromMatrix(m){
var planes=this.planes;
var me=m.elements;
var me0=me[0],me1=me[1],me2=me[2],me3=me[3];
var me4=me[4],me5=me[5],me6=me[6],me7=me[7];
var me8=me[8],me9=me[9],me10=me[10],me11=me[11];
var me12=me[12],me13=me[13],me14=me[14],me15=me[15];
planes[0].setComponents(me3-me0,me7-me4,me11-me8,me15-me12).normalize();
planes[1].setComponents(me3+me0,me7+me4,me11+me8,me15+me12).normalize();
planes[2].setComponents(me3+me1,me7+me5,me11+me9,me15+me13).normalize();
planes[3].setComponents(me3-me1,me7-me5,me11-me9,me15-me13).normalize();
planes[4].setComponents(me3-me2,me7-me6,me11-me10,me15-me14).normalize();
planes[5].setComponents(me3+me2,me7+me6,me11+me10,me15+me14).normalize();
return this;
},
intersectsObject:function(){
var sphere=new Sphere();
return function intersectsObject(object){
var geometry=object.geometry;
if(geometry.boundingSphere===null)
geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere).
applyMatrix4(object.matrixWorld);
return this.intersectsSphere(sphere);
};
}(),
intersectsSprite:function(){
var sphere=new Sphere();
return function intersectsSprite(sprite){
sphere.center.set(0,0,0);
sphere.radius=0.7071067811865476;
sphere.applyMatrix4(sprite.matrixWorld);
return this.intersectsSphere(sphere);
};
}(),
intersectsSphere:function intersectsSphere(sphere){
var planes=this.planes;
var center=sphere.center;
var negRadius=-sphere.radius;
for(var i=0;i<6;i++){
var distance=planes[i].distanceToPoint(center);
if(distance<negRadius){
return false;
}
}
return true;
},
intersectsBox:function(){
var p1=new Vector3(),
p2=new Vector3();
return function intersectsBox(box){
var planes=this.planes;
for(var i=0;i<6;i++){
var plane=planes[i];
p1.x=plane.normal.x>0?box.min.x:box.max.x;
p2.x=plane.normal.x>0?box.max.x:box.min.x;
p1.y=plane.normal.y>0?box.min.y:box.max.y;
p2.y=plane.normal.y>0?box.max.y:box.min.y;
p1.z=plane.normal.z>0?box.min.z:box.max.z;
p2.z=plane.normal.z>0?box.max.z:box.min.z;
var d1=plane.distanceToPoint(p1);
var d2=plane.distanceToPoint(p2);
if(d1<0&&d2<0){
return false;
}
}
return true;
};
}(),
containsPoint:function containsPoint(point){
var planes=this.planes;
for(var i=0;i<6;i++){
if(planes[i].distanceToPoint(point)<0){
return false;
}
}
return true;
}};
function WebGLShadowMap(_renderer,_lights,_objects,capabilities){
var _gl=_renderer.context,
_state=_renderer.state,
_frustum=new Frustum(),
_projScreenMatrix=new Matrix4(),
_lightShadows=_lights.shadows,
_shadowMapSize=new Vector2(),
_maxShadowMapSize=new Vector2(capabilities.maxTextureSize,capabilities.maxTextureSize),
_lookTarget=new Vector3(),
_lightPositionWorld=new Vector3(),
_renderList=[],
_MorphingFlag=1,
_SkinningFlag=2,
_NumberOfMaterialVariants=(_MorphingFlag|_SkinningFlag)+1,
_depthMaterials=new Array(_NumberOfMaterialVariants),
_distanceMaterials=new Array(_NumberOfMaterialVariants),
_materialCache={};
var cubeDirections=[
new Vector3(1,0,0),new Vector3(-1,0,0),new Vector3(0,0,1),
new Vector3(0,0,-1),new Vector3(0,1,0),new Vector3(0,-1,0)];
var cubeUps=[
new Vector3(0,1,0),new Vector3(0,1,0),new Vector3(0,1,0),
new Vector3(0,1,0),new Vector3(0,0,1),new Vector3(0,0,-1)];
var cube2DViewPorts=[
new Vector4(),new Vector4(),new Vector4(),
new Vector4(),new Vector4(),new Vector4()];
var depthMaterialTemplate=new MeshDepthMaterial();
depthMaterialTemplate.depthPacking=RGBADepthPacking;
depthMaterialTemplate.clipping=true;
var distanceShader=ShaderLib["distanceRGBA"];
var distanceUniforms=exports.UniformsUtils.clone(distanceShader.uniforms);
for(var i=0;i!==_NumberOfMaterialVariants;++i){
var useMorphing=(i&_MorphingFlag)!==0;
var useSkinning=(i&_SkinningFlag)!==0;
var depthMaterial=depthMaterialTemplate.clone();
depthMaterial.morphTargets=useMorphing;
depthMaterial.skinning=useSkinning;
_depthMaterials[i]=depthMaterial;
var distanceMaterial=new ShaderMaterial({
defines:{
'USE_SHADOWMAP':''},
uniforms:distanceUniforms,
vertexShader:distanceShader.vertexShader,
fragmentShader:distanceShader.fragmentShader,
morphTargets:useMorphing,
skinning:useSkinning,
clipping:true});
_distanceMaterials[i]=distanceMaterial;
}
var scope=this;
this.enabled=false;
this.autoUpdate=true;
this.needsUpdate=false;
this.type=PCFShadowMap;
this.renderReverseSided=true;
this.renderSingleSided=true;
this.render=function(scene,camera){
if(scope.enabled===false)return;
if(scope.autoUpdate===false&&scope.needsUpdate===false)return;
if(_lightShadows.length===0)return;
_state.clearColor(1,1,1,1);
_state.disable(_gl.BLEND);
_state.setDepthTest(true);
_state.setScissorTest(false);
var faceCount,isPointLight;
for(var i=0,il=_lightShadows.length;i<il;i++){
var light=_lightShadows[i];
var shadow=light.shadow;
if(shadow===undefined){
console.warn('THREE.WebGLShadowMap:',light,'has no shadow.');
continue;
}
var shadowCamera=shadow.camera;
_shadowMapSize.copy(shadow.mapSize);
_shadowMapSize.min(_maxShadowMapSize);
if(light&&light.isPointLight){
faceCount=6;
isPointLight=true;
var vpWidth=_shadowMapSize.x;
var vpHeight=_shadowMapSize.y;
cube2DViewPorts[0].set(vpWidth*2,vpHeight,vpWidth,vpHeight);
cube2DViewPorts[1].set(0,vpHeight,vpWidth,vpHeight);
cube2DViewPorts[2].set(vpWidth*3,vpHeight,vpWidth,vpHeight);
cube2DViewPorts[3].set(vpWidth,vpHeight,vpWidth,vpHeight);
cube2DViewPorts[4].set(vpWidth*3,0,vpWidth,vpHeight);
cube2DViewPorts[5].set(vpWidth,0,vpWidth,vpHeight);
_shadowMapSize.x*=4.0;
_shadowMapSize.y*=2.0;
}else{
faceCount=1;
isPointLight=false;
}
if(shadow.map===null){
var pars={minFilter:NearestFilter,magFilter:NearestFilter,format:RGBAFormat};
shadow.map=new WebGLRenderTarget(_shadowMapSize.x,_shadowMapSize.y,pars);
shadowCamera.updateProjectionMatrix();
}
if(shadow&&shadow.isSpotLightShadow){
shadow.update(light);
}
var shadowMap=shadow.map;
var shadowMatrix=shadow.matrix;
_lightPositionWorld.setFromMatrixPosition(light.matrixWorld);
shadowCamera.position.copy(_lightPositionWorld);
_renderer.setRenderTarget(shadowMap);
_renderer.clear();
for(var face=0;face<faceCount;face++){
if(isPointLight){
_lookTarget.copy(shadowCamera.position);
_lookTarget.add(cubeDirections[face]);
shadowCamera.up.copy(cubeUps[face]);
shadowCamera.lookAt(_lookTarget);
var vpDimensions=cube2DViewPorts[face];
_state.viewport(vpDimensions);
}else{
_lookTarget.setFromMatrixPosition(light.target.matrixWorld);
shadowCamera.lookAt(_lookTarget);
}
shadowCamera.updateMatrixWorld();
shadowCamera.matrixWorldInverse.getInverse(shadowCamera.matrixWorld);
shadowMatrix.set(
0.5,0.0,0.0,0.5,
0.0,0.5,0.0,0.5,
0.0,0.0,0.5,0.5,
0.0,0.0,0.0,1.0);
shadowMatrix.multiply(shadowCamera.projectionMatrix);
shadowMatrix.multiply(shadowCamera.matrixWorldInverse);
_projScreenMatrix.multiplyMatrices(shadowCamera.projectionMatrix,shadowCamera.matrixWorldInverse);
_frustum.setFromMatrix(_projScreenMatrix);
_renderList.length=0;
projectObject(scene,camera,shadowCamera);
for(var j=0,jl=_renderList.length;j<jl;j++){
var object=_renderList[j];
var geometry=_objects.update(object);
var material=object.material;
if(material&&material.isMultiMaterial){
var groups=geometry.groups;
var materials=material.materials;
for(var k=0,kl=groups.length;k<kl;k++){
var group=groups[k];
var groupMaterial=materials[group.materialIndex];
if(groupMaterial.visible===true){
var depthMaterial=getDepthMaterial(object,groupMaterial,isPointLight,_lightPositionWorld);
_renderer.renderBufferDirect(shadowCamera,null,geometry,depthMaterial,object,group);
}
}
}else{
var depthMaterial=getDepthMaterial(object,material,isPointLight,_lightPositionWorld);
_renderer.renderBufferDirect(shadowCamera,null,geometry,depthMaterial,object,null);
}
}
}
}
var clearColor=_renderer.getClearColor(),
clearAlpha=_renderer.getClearAlpha();
_renderer.setClearColor(clearColor,clearAlpha);
scope.needsUpdate=false;
};
function getDepthMaterial(object,material,isPointLight,lightPositionWorld){
var geometry=object.geometry;
var result=null;
var materialVariants=_depthMaterials;
var customMaterial=object.customDepthMaterial;
if(isPointLight){
materialVariants=_distanceMaterials;
customMaterial=object.customDistanceMaterial;
}
if(!customMaterial){
var useMorphing=false;
if(material.morphTargets){
if(geometry&&geometry.isBufferGeometry){
useMorphing=geometry.morphAttributes&&geometry.morphAttributes.position&&geometry.morphAttributes.position.length>0;
}else if(geometry&&geometry.isGeometry){
useMorphing=geometry.morphTargets&&geometry.morphTargets.length>0;
}
}
var useSkinning=object.isSkinnedMesh&&material.skinning;
var variantIndex=0;
if(useMorphing)variantIndex|=_MorphingFlag;
if(useSkinning)variantIndex|=_SkinningFlag;
result=materialVariants[variantIndex];
}else{
result=customMaterial;
}
if(_renderer.localClippingEnabled&&
material.clipShadows===true&&
material.clippingPlanes.length!==0){
var keyA=result.uuid,keyB=material.uuid;
var materialsForVariant=_materialCache[keyA];
if(materialsForVariant===undefined){
materialsForVariant={};
_materialCache[keyA]=materialsForVariant;
}
var cachedMaterial=materialsForVariant[keyB];
if(cachedMaterial===undefined){
cachedMaterial=result.clone();
materialsForVariant[keyB]=cachedMaterial;
}
result=cachedMaterial;
}
result.visible=material.visible;
result.wireframe=material.wireframe;
var side=material.side;
if(scope.renderSingleSided&&side==DoubleSide){
side=FrontSide;
}
if(scope.renderReverseSided){
if(side===FrontSide)side=BackSide;else
if(side===BackSide)side=FrontSide;
}
result.side=side;
result.clipShadows=material.clipShadows;
result.clippingPlanes=material.clippingPlanes;
result.wireframeLinewidth=material.wireframeLinewidth;
result.linewidth=material.linewidth;
if(isPointLight&&result.uniforms.lightPos!==undefined){
result.uniforms.lightPos.value.copy(lightPositionWorld);
}
return result;
}
function projectObject(object,camera,shadowCamera){
if(object.visible===false)return;
var visible=(object.layers.mask&camera.layers.mask)!==0;
if(visible&&(object.isMesh||object.isLine||object.isPoints)){
if(object.castShadow&&(object.frustumCulled===false||_frustum.intersectsObject(object)===true)){
var material=object.material;
if(material.visible===true){
object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse,object.matrixWorld);
_renderList.push(object);
}
}
}
var children=object.children;
for(var i=0,l=children.length;i<l;i++){
projectObject(children[i],camera,shadowCamera);
}
}
}
function addLineNumbers(string){
var lines=string.split('\n');
for(var i=0;i<lines.length;i++){
lines[i]=i+1+': '+lines[i];
}
return lines.join('\n');
}
function WebGLShader(gl,type,string){
var shader=gl.createShader(type);
gl.shaderSource(shader,string);
gl.compileShader(shader);
if(gl.getShaderParameter(shader,gl.COMPILE_STATUS)===false){
console.error('THREE.WebGLShader: Shader couldn\'t compile.');
}
if(gl.getShaderInfoLog(shader)!==''){
console.warn('THREE.WebGLShader: gl.getShaderInfoLog()',type===gl.VERTEX_SHADER?'vertex':'fragment',gl.getShaderInfoLog(shader),addLineNumbers(string));
}
return shader;
}
function WebGLProperties(){
var properties={};
return{
get:function get(object){
var uuid=object.uuid;
var map=properties[uuid];
if(map===undefined){
map={};
properties[uuid]=map;
}
return map;
},
delete:function _delete(object){
delete properties[object.uuid];
},
clear:function clear(){
properties={};
}};
}
var programIdCount=0;
function getEncodingComponents(encoding){
switch(encoding){
case LinearEncoding:
return['Linear','( value )'];
case sRGBEncoding:
return['sRGB','( value )'];
case RGBEEncoding:
return['RGBE','( value )'];
case RGBM7Encoding:
return['RGBM','( value, 7.0 )'];
case RGBM16Encoding:
return['RGBM','( value, 16.0 )'];
case RGBDEncoding:
return['RGBD','( value, 256.0 )'];
case GammaEncoding:
return['Gamma','( value, float( GAMMA_FACTOR ) )'];
default:
throw new Error('unsupported encoding: '+encoding);}
}
function getTexelDecodingFunction(functionName,encoding){
var components=getEncodingComponents(encoding);
return"vec4 "+functionName+"( vec4 value ) { return "+components[0]+"ToLinear"+components[1]+"; }";
}
function getTexelEncodingFunction(functionName,encoding){
var components=getEncodingComponents(encoding);
return"vec4 "+functionName+"( vec4 value ) { return LinearTo"+components[0]+components[1]+"; }";
}
function getToneMappingFunction(functionName,toneMapping){
var toneMappingName;
switch(toneMapping){
case LinearToneMapping:
toneMappingName="Linear";
break;
case ReinhardToneMapping:
toneMappingName="Reinhard";
break;
case Uncharted2ToneMapping:
toneMappingName="Uncharted2";
break;
case CineonToneMapping:
toneMappingName="OptimizedCineon";
break;
default:
throw new Error('unsupported toneMapping: '+toneMapping);}
return"vec3 "+functionName+"( vec3 color ) { return "+toneMappingName+"ToneMapping( color ); }";
}
function generateExtensions(extensions,parameters,rendererExtensions){
extensions=extensions||{};
var chunks=[
extensions.derivatives||parameters.envMapCubeUV||parameters.bumpMap||parameters.normalMap||parameters.flatShading?'#extension GL_OES_standard_derivatives : enable':'',
(extensions.fragDepth||parameters.logarithmicDepthBuffer)&&rendererExtensions.get('EXT_frag_depth')?'#extension GL_EXT_frag_depth : enable':'',
extensions.drawBuffers&&rendererExtensions.get('WEBGL_draw_buffers')?'#extension GL_EXT_draw_buffers : require':'',
(extensions.shaderTextureLOD||parameters.envMap)&&rendererExtensions.get('EXT_shader_texture_lod')?'#extension GL_EXT_shader_texture_lod : enable':''];
return chunks.filter(filterEmptyLine).join('\n');
}
function generateDefines(defines){
var chunks=[];
for(var name in defines){
var value=defines[name];
if(value===false)continue;
chunks.push('#define '+name+' '+value);
}
return chunks.join('\n');
}
function fetchAttributeLocations(gl,program,identifiers){
var attributes={};
var n=gl.getProgramParameter(program,gl.ACTIVE_ATTRIBUTES);
for(var i=0;i<n;i++){
var info=gl.getActiveAttrib(program,i);
var name=info.name;
attributes[name]=gl.getAttribLocation(program,name);
}
return attributes;
}
function filterEmptyLine(string){
return string!=='';
}
function replaceLightNums(string,parameters){
return string.
replace(/NUM_DIR_LIGHTS/g,parameters.numDirLights).
replace(/NUM_SPOT_LIGHTS/g,parameters.numSpotLights).
replace(/NUM_POINT_LIGHTS/g,parameters.numPointLights).
replace(/NUM_HEMI_LIGHTS/g,parameters.numHemiLights);
}
function parseIncludes(string){
var pattern=/#include +<([\w\d.]+)>/g;
function replace(match,include){
var replace=ShaderChunk[include];
if(replace===undefined){
throw new Error('Can not resolve #include <'+include+'>');
}
return parseIncludes(replace);
}
return string.replace(pattern,replace);
}
function unrollLoops(string){
var pattern=/for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;
function replace(match,start,end,snippet){
var unroll='';
for(var i=parseInt(start);i<parseInt(end);i++){
unroll+=snippet.replace(/\[ i \]/g,'[ '+i+' ]');
}
return unroll;
}
return string.replace(pattern,replace);
}
function WebGLProgram(renderer,code,material,parameters){
var gl=renderer.context;
var extensions=material.extensions;
var defines=material.defines;
var vertexShader=material.__webglShader.vertexShader;
var fragmentShader=material.__webglShader.fragmentShader;
var shadowMapTypeDefine='SHADOWMAP_TYPE_BASIC';
if(parameters.shadowMapType===PCFShadowMap){
shadowMapTypeDefine='SHADOWMAP_TYPE_PCF';
}else if(parameters.shadowMapType===PCFSoftShadowMap){
shadowMapTypeDefine='SHADOWMAP_TYPE_PCF_SOFT';
}
var envMapTypeDefine='ENVMAP_TYPE_CUBE';
var envMapModeDefine='ENVMAP_MODE_REFLECTION';
var envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';
if(parameters.envMap){
switch(material.envMap.mapping){
case CubeReflectionMapping:
case CubeRefractionMapping:
envMapTypeDefine='ENVMAP_TYPE_CUBE';
break;
case CubeUVReflectionMapping:
case CubeUVRefractionMapping:
envMapTypeDefine='ENVMAP_TYPE_CUBE_UV';
break;
case EquirectangularReflectionMapping:
case EquirectangularRefractionMapping:
envMapTypeDefine='ENVMAP_TYPE_EQUIREC';
break;
case SphericalReflectionMapping:
envMapTypeDefine='ENVMAP_TYPE_SPHERE';
break;}
switch(material.envMap.mapping){
case CubeRefractionMapping:
case EquirectangularRefractionMapping:
envMapModeDefine='ENVMAP_MODE_REFRACTION';
break;}
switch(material.combine){
case MultiplyOperation:
envMapBlendingDefine='ENVMAP_BLENDING_MULTIPLY';
break;
case MixOperation:
envMapBlendingDefine='ENVMAP_BLENDING_MIX';
break;
case AddOperation:
envMapBlendingDefine='ENVMAP_BLENDING_ADD';
break;}
}
var gammaFactorDefine=renderer.gammaFactor>0?renderer.gammaFactor:1.0;
var customExtensions=generateExtensions(extensions,parameters,renderer.extensions);
var customDefines=generateDefines(defines);
var program=gl.createProgram();
var prefixVertex,prefixFragment;
if(material.isRawShaderMaterial){
prefixVertex=[
customDefines,
'\n'].
filter(filterEmptyLine).join('\n');
prefixFragment=[
customExtensions,
customDefines,
'\n'].
filter(filterEmptyLine).join('\n');
}else{
prefixVertex=[
'precision '+parameters.precision+' float;',
'precision '+parameters.precision+' int;',
'#define SHADER_NAME '+material.__webglShader.name,
customDefines,
parameters.supportsVertexTextures?'#define VERTEX_TEXTURES':'',
'#define GAMMA_FACTOR '+gammaFactorDefine,
'#define MAX_BONES '+parameters.maxBones,
parameters.map?'#define USE_MAP':'',
parameters.envMap?'#define USE_ENVMAP':'',
parameters.envMap?'#define '+envMapModeDefine:'',
parameters.lightMap?'#define USE_LIGHTMAP':'',
parameters.aoMap?'#define USE_AOMAP':'',
parameters.emissiveMap?'#define USE_EMISSIVEMAP':'',
parameters.bumpMap?'#define USE_BUMPMAP':'',
parameters.normalMap?'#define USE_NORMALMAP':'',
parameters.displacementMap&&parameters.supportsVertexTextures?'#define USE_DISPLACEMENTMAP':'',
parameters.specularMap?'#define USE_SPECULARMAP':'',
parameters.roughnessMap?'#define USE_ROUGHNESSMAP':'',
parameters.metalnessMap?'#define USE_METALNESSMAP':'',
parameters.alphaMap?'#define USE_ALPHAMAP':'',
parameters.vertexColors?'#define USE_COLOR':'',
parameters.flatShading?'#define FLAT_SHADED':'',
parameters.skinning?'#define USE_SKINNING':'',
parameters.useVertexTexture?'#define BONE_TEXTURE':'',
parameters.morphTargets?'#define USE_MORPHTARGETS':'',
parameters.morphNormals&&parameters.flatShading===false?'#define USE_MORPHNORMALS':'',
parameters.doubleSided?'#define DOUBLE_SIDED':'',
parameters.flipSided?'#define FLIP_SIDED':'',
'#define NUM_CLIPPING_PLANES '+parameters.numClippingPlanes,
parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',
parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',
parameters.sizeAttenuation?'#define USE_SIZEATTENUATION':'',
parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',
parameters.logarithmicDepthBuffer&&renderer.extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'',
'uniform mat4 modelMatrix;',
'uniform mat4 modelViewMatrix;',
'uniform mat4 projectionMatrix;',
'uniform mat4 viewMatrix;',
'uniform mat3 normalMatrix;',
'uniform vec3 cameraPosition;',
'attribute vec3 position;',
'attribute vec3 normal;',
'attribute vec2 uv;',
'#ifdef USE_COLOR',
' attribute vec3 color;',
'#endif',
'#ifdef USE_MORPHTARGETS',
' attribute vec3 morphTarget0;',
' attribute vec3 morphTarget1;',
' attribute vec3 morphTarget2;',
' attribute vec3 morphTarget3;',
' #ifdef USE_MORPHNORMALS',
' attribute vec3 morphNormal0;',
' attribute vec3 morphNormal1;',
' attribute vec3 morphNormal2;',
' attribute vec3 morphNormal3;',
' #else',
' attribute vec3 morphTarget4;',
' attribute vec3 morphTarget5;',
' attribute vec3 morphTarget6;',
' attribute vec3 morphTarget7;',
' #endif',
'#endif',
'#ifdef USE_SKINNING',
' attribute vec4 skinIndex;',
' attribute vec4 skinWeight;',
'#endif',
'\n'].
filter(filterEmptyLine).join('\n');
prefixFragment=[
customExtensions,
'precision '+parameters.precision+' float;',
'precision '+parameters.precision+' int;',
'#define SHADER_NAME '+material.__webglShader.name,
customDefines,
parameters.alphaTest?'#define ALPHATEST '+parameters.alphaTest:'',
'#define GAMMA_FACTOR '+gammaFactorDefine,
parameters.useFog&&parameters.fog?'#define USE_FOG':'',
parameters.useFog&&parameters.fogExp?'#define FOG_EXP2':'',
parameters.map?'#define USE_MAP':'',
parameters.envMap?'#define USE_ENVMAP':'',
parameters.envMap?'#define '+envMapTypeDefine:'',
parameters.envMap?'#define '+envMapModeDefine:'',
parameters.envMap?'#define '+envMapBlendingDefine:'',
parameters.lightMap?'#define USE_LIGHTMAP':'',
parameters.aoMap?'#define USE_AOMAP':'',
parameters.emissiveMap?'#define USE_EMISSIVEMAP':'',
parameters.bumpMap?'#define USE_BUMPMAP':'',
parameters.normalMap?'#define USE_NORMALMAP':'',
parameters.specularMap?'#define USE_SPECULARMAP':'',
parameters.roughnessMap?'#define USE_ROUGHNESSMAP':'',
parameters.metalnessMap?'#define USE_METALNESSMAP':'',
parameters.alphaMap?'#define USE_ALPHAMAP':'',
parameters.vertexColors?'#define USE_COLOR':'',
parameters.flatShading?'#define FLAT_SHADED':'',
parameters.doubleSided?'#define DOUBLE_SIDED':'',
parameters.flipSided?'#define FLIP_SIDED':'',
'#define NUM_CLIPPING_PLANES '+parameters.numClippingPlanes,
parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',
parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',
parameters.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":'',
parameters.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":'',
parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',
parameters.logarithmicDepthBuffer&&renderer.extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'',
parameters.envMap&&renderer.extensions.get('EXT_shader_texture_lod')?'#define TEXTURE_LOD_EXT':'',
'uniform mat4 viewMatrix;',
'uniform vec3 cameraPosition;',
parameters.toneMapping!==NoToneMapping?"#define TONE_MAPPING":'',
parameters.toneMapping!==NoToneMapping?ShaderChunk['tonemapping_pars_fragment']:'',
parameters.toneMapping!==NoToneMapping?getToneMappingFunction("toneMapping",parameters.toneMapping):'',
parameters.outputEncoding||parameters.mapEncoding||parameters.envMapEncoding||parameters.emissiveMapEncoding?ShaderChunk['encodings_pars_fragment']:'',
parameters.mapEncoding?getTexelDecodingFunction('mapTexelToLinear',parameters.mapEncoding):'',
parameters.envMapEncoding?getTexelDecodingFunction('envMapTexelToLinear',parameters.envMapEncoding):'',
parameters.emissiveMapEncoding?getTexelDecodingFunction('emissiveMapTexelToLinear',parameters.emissiveMapEncoding):'',
parameters.outputEncoding?getTexelEncodingFunction("linearToOutputTexel",parameters.outputEncoding):'',
parameters.depthPacking?"#define DEPTH_PACKING "+material.depthPacking:'',
'\n'].
filter(filterEmptyLine).join('\n');
}
vertexShader=parseIncludes(vertexShader,parameters);
vertexShader=replaceLightNums(vertexShader,parameters);
fragmentShader=parseIncludes(fragmentShader,parameters);
fragmentShader=replaceLightNums(fragmentShader,parameters);
if(!material.isShaderMaterial){
vertexShader=unrollLoops(vertexShader);
fragmentShader=unrollLoops(fragmentShader);
}
var vertexGlsl=prefixVertex+vertexShader;
var fragmentGlsl=prefixFragment+fragmentShader;
var glVertexShader=WebGLShader(gl,gl.VERTEX_SHADER,vertexGlsl);
var glFragmentShader=WebGLShader(gl,gl.FRAGMENT_SHADER,fragmentGlsl);
gl.attachShader(program,glVertexShader);
gl.attachShader(program,glFragmentShader);
if(material.index0AttributeName!==undefined){
gl.bindAttribLocation(program,0,material.index0AttributeName);
}else if(parameters.morphTargets===true){
gl.bindAttribLocation(program,0,'position');
}
gl.linkProgram(program);
var programLog=gl.getProgramInfoLog(program);
var vertexLog=gl.getShaderInfoLog(glVertexShader);
var fragmentLog=gl.getShaderInfoLog(glFragmentShader);
var runnable=true;
var haveDiagnostics=true;
if(gl.getProgramParameter(program,gl.LINK_STATUS)===false){
runnable=false;
console.error('THREE.WebGLProgram: shader error: ',gl.getError(),'gl.VALIDATE_STATUS',gl.getProgramParameter(program,gl.VALIDATE_STATUS),'gl.getProgramInfoLog',programLog,vertexLog,fragmentLog);
}else if(programLog!==''){
console.warn('THREE.WebGLProgram: gl.getProgramInfoLog()',programLog);
}else if(vertexLog===''||fragmentLog===''){
haveDiagnostics=false;
}
if(haveDiagnostics){
this.diagnostics={
runnable:runnable,
material:material,
programLog:programLog,
vertexShader:{
log:vertexLog,
prefix:prefixVertex},
fragmentShader:{
log:fragmentLog,
prefix:prefixFragment}};
}
gl.deleteShader(glVertexShader);
gl.deleteShader(glFragmentShader);
var cachedUniforms;
this.getUniforms=function(){
if(cachedUniforms===undefined){
cachedUniforms=
new WebGLUniforms(gl,program,renderer);
}
return cachedUniforms;
};
var cachedAttributes;
this.getAttributes=function(){
if(cachedAttributes===undefined){
cachedAttributes=fetchAttributeLocations(gl,program);
}
return cachedAttributes;
};
this.destroy=function(){
gl.deleteProgram(program);
this.program=undefined;
};
Object.defineProperties(this,{
uniforms:{
get:function get(){
console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().');
return this.getUniforms();
}},
attributes:{
get:function get(){
console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().');
return this.getAttributes();
}}});
this.id=programIdCount++;
this.code=code;
this.usedTimes=1;
this.program=program;
this.vertexShader=glVertexShader;
this.fragmentShader=glFragmentShader;
return this;
}
function WebGLPrograms(renderer,capabilities){
var programs=[];
var shaderIDs={
MeshDepthMaterial:'depth',
MeshNormalMaterial:'normal',
MeshBasicMaterial:'basic',
MeshLambertMaterial:'lambert',
MeshPhongMaterial:'phong',
MeshStandardMaterial:'physical',
MeshPhysicalMaterial:'physical',
LineBasicMaterial:'basic',
LineDashedMaterial:'dashed',
PointsMaterial:'points'};
var parameterNames=[
"precision","supportsVertexTextures","map","mapEncoding","envMap","envMapMode","envMapEncoding",
"lightMap","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","displacementMap","specularMap",
"roughnessMap","metalnessMap",
"alphaMap","combine","vertexColors","fog","useFog","fogExp",
"flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning",
"maxBones","useVertexTexture","morphTargets","morphNormals",
"maxMorphTargets","maxMorphNormals","premultipliedAlpha",
"numDirLights","numPointLights","numSpotLights","numHemiLights",
"shadowMapEnabled","shadowMapType","toneMapping",'physicallyCorrectLights',
"alphaTest","doubleSided","flipSided","numClippingPlanes","depthPacking"];
function allocateBones(object){
if(capabilities.floatVertexTextures&&object&&object.skeleton&&object.skeleton.useVertexTexture){
return 1024;
}else{
var nVertexUniforms=capabilities.maxVertexUniforms;
var nVertexMatrices=Math.floor((nVertexUniforms-20)/4);
var maxBones=nVertexMatrices;
if(object!==undefined&&object&&object.isSkinnedMesh){
maxBones=Math.min(object.skeleton.bones.length,maxBones);
if(maxBones<object.skeleton.bones.length){
console.warn('WebGLRenderer: too many bones - '+object.skeleton.bones.length+', this GPU supports just '+maxBones+' (try OpenGL instead of ANGLE)');
}
}
return maxBones;
}
}
function getTextureEncodingFromMap(map,gammaOverrideLinear){
var encoding;
if(!map){
encoding=LinearEncoding;
}else if(map&&map.isTexture){
encoding=map.encoding;
}else if(map&&map.isWebGLRenderTarget){
console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.");
encoding=map.texture.encoding;
}
if(encoding===LinearEncoding&&gammaOverrideLinear){
encoding=GammaEncoding;
}
return encoding;
}
this.getParameters=function(material,lights,fog,nClipPlanes,object){
var shaderID=shaderIDs[material.type];
var maxBones=allocateBones(object);
var precision=renderer.getPrecision();
if(material.precision!==null){
precision=capabilities.getMaxPrecision(material.precision);
if(precision!==material.precision){
console.warn('THREE.WebGLProgram.getParameters:',material.precision,'not supported, using',precision,'instead.');
}
}
var currentRenderTarget=renderer.getCurrentRenderTarget();
var parameters={
shaderID:shaderID,
precision:precision,
supportsVertexTextures:capabilities.vertexTextures,
outputEncoding:getTextureEncodingFromMap(!currentRenderTarget?null:currentRenderTarget.texture,renderer.gammaOutput),
map:!!material.map,
mapEncoding:getTextureEncodingFromMap(material.map,renderer.gammaInput),
envMap:!!material.envMap,
envMapMode:material.envMap&&material.envMap.mapping,
envMapEncoding:getTextureEncodingFromMap(material.envMap,renderer.gammaInput),
envMapCubeUV:!!material.envMap&&(material.envMap.mapping===CubeUVReflectionMapping||material.envMap.mapping===CubeUVRefractionMapping),
lightMap:!!material.lightMap,
aoMap:!!material.aoMap,
emissiveMap:!!material.emissiveMap,
emissiveMapEncoding:getTextureEncodingFromMap(material.emissiveMap,renderer.gammaInput),
bumpMap:!!material.bumpMap,
normalMap:!!material.normalMap,
displacementMap:!!material.displacementMap,
roughnessMap:!!material.roughnessMap,
metalnessMap:!!material.metalnessMap,
specularMap:!!material.specularMap,
alphaMap:!!material.alphaMap,
combine:material.combine,
vertexColors:material.vertexColors,
fog:!!fog,
useFog:material.fog,
fogExp:fog&&fog.isFogExp2,
flatShading:material.shading===FlatShading,
sizeAttenuation:material.sizeAttenuation,
logarithmicDepthBuffer:capabilities.logarithmicDepthBuffer,
skinning:material.skinning,
maxBones:maxBones,
useVertexTexture:capabilities.floatVertexTextures&&object&&object.skeleton&&object.skeleton.useVertexTexture,
morphTargets:material.morphTargets,
morphNormals:material.morphNormals,
maxMorphTargets:renderer.maxMorphTargets,
maxMorphNormals:renderer.maxMorphNormals,
numDirLights:lights.directional.length,
numPointLights:lights.point.length,
numSpotLights:lights.spot.length,
numHemiLights:lights.hemi.length,
numClippingPlanes:nClipPlanes,
shadowMapEnabled:renderer.shadowMap.enabled&&object.receiveShadow&&lights.shadows.length>0,
shadowMapType:renderer.shadowMap.type,
toneMapping:renderer.toneMapping,
physicallyCorrectLights:renderer.physicallyCorrectLights,
premultipliedAlpha:material.premultipliedAlpha,
alphaTest:material.alphaTest,
doubleSided:material.side===DoubleSide,
flipSided:material.side===BackSide,
depthPacking:material.depthPacking!==undefined?material.depthPacking:false};
return parameters;
};
this.getProgramCode=function(material,parameters){
var array=[];
if(parameters.shaderID){
array.push(parameters.shaderID);
}else{
array.push(material.fragmentShader);
array.push(material.vertexShader);
}
if(material.defines!==undefined){
for(var name in material.defines){
array.push(name);
array.push(material.defines[name]);
}
}
for(var i=0;i<parameterNames.length;i++){
array.push(parameters[parameterNames[i]]);
}
return array.join();
};
this.acquireProgram=function(material,parameters,code){
var program;
for(var p=0,pl=programs.length;p<pl;p++){
var programInfo=programs[p];
if(programInfo.code===code){
program=programInfo;
++program.usedTimes;
break;
}
}
if(program===undefined){
program=new WebGLProgram(renderer,code,material,parameters);
programs.push(program);
}
return program;
};
this.releaseProgram=function(program){
if(--program.usedTimes===0){
var i=programs.indexOf(program);
programs[i]=programs[programs.length-1];
programs.pop();
program.destroy();
}
};
this.programs=programs;
}
function BufferAttribute(array,itemSize,normalized){
if(Array.isArray(array)){
throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');
}
this.uuid=exports.Math.generateUUID();
this.array=array;
this.itemSize=itemSize;
this.normalized=normalized===true;
this.dynamic=false;
this.updateRange={offset:0,count:-1};
this.version=0;
}
BufferAttribute.prototype={
constructor:BufferAttribute,
isBufferAttribute:true,
get count(){
return this.array.length/this.itemSize;
},
set needsUpdate(value){
if(value===true)this.version++;
},
setDynamic:function setDynamic(value){
this.dynamic=value;
return this;
},
copy:function copy(source){
this.array=new source.array.constructor(source.array);
this.itemSize=source.itemSize;
this.normalized=source.normalized;
this.dynamic=source.dynamic;
return this;
},
copyAt:function copyAt(index1,attribute,index2){
index1*=this.itemSize;
index2*=attribute.itemSize;
for(var i=0,l=this.itemSize;i<l;i++){
this.array[index1+i]=attribute.array[index2+i];
}
return this;
},
copyArray:function copyArray(array){
this.array.set(array);
return this;
},
copyColorsArray:function copyColorsArray(colors){
var array=this.array,offset=0;
for(var i=0,l=colors.length;i<l;i++){
var color=colors[i];
if(color===undefined){
console.warn('THREE.BufferAttribute.copyColorsArray(): color is undefined',i);
color=new Color();
}
array[offset++]=color.r;
array[offset++]=color.g;
array[offset++]=color.b;
}
return this;
},
copyIndicesArray:function copyIndicesArray(indices){
var array=this.array,offset=0;
for(var i=0,l=indices.length;i<l;i++){
var index=indices[i];
array[offset++]=index.a;
array[offset++]=index.b;
array[offset++]=index.c;
}
return this;
},
copyVector2sArray:function copyVector2sArray(vectors){
var array=this.array,offset=0;
for(var i=0,l=vectors.length;i<l;i++){
var vector=vectors[i];
if(vector===undefined){
console.warn('THREE.BufferAttribute.copyVector2sArray(): vector is undefined',i);
vector=new Vector2();
}
array[offset++]=vector.x;
array[offset++]=vector.y;
}
return this;
},
copyVector3sArray:function copyVector3sArray(vectors){
var array=this.array,offset=0;
for(var i=0,l=vectors.length;i<l;i++){
var vector=vectors[i];
if(vector===undefined){
console.warn('THREE.BufferAttribute.copyVector3sArray(): vector is undefined',i);
vector=new Vector3();
}
array[offset++]=vector.x;
array[offset++]=vector.y;
array[offset++]=vector.z;
}
return this;
},
copyVector4sArray:function copyVector4sArray(vectors){
var array=this.array,offset=0;
for(var i=0,l=vectors.length;i<l;i++){
var vector=vectors[i];
if(vector===undefined){
console.warn('THREE.BufferAttribute.copyVector4sArray(): vector is undefined',i);
vector=new Vector4();
}
array[offset++]=vector.x;
array[offset++]=vector.y;
array[offset++]=vector.z;
array[offset++]=vector.w;
}
return this;
},
set:function set(value,offset){
if(offset===undefined)offset=0;
this.array.set(value,offset);
return this;
},
getX:function getX(index){
return this.array[index*this.itemSize];
},
setX:function setX(index,x){
this.array[index*this.itemSize]=x;
return this;
},
getY:function getY(index){
return this.array[index*this.itemSize+1];
},
setY:function setY(index,y){
this.array[index*this.itemSize+1]=y;
return this;
},
getZ:function getZ(index){
return this.array[index*this.itemSize+2];
},
setZ:function setZ(index,z){
this.array[index*this.itemSize+2]=z;
return this;
},
getW:function getW(index){
return this.array[index*this.itemSize+3];
},
setW:function setW(index,w){
this.array[index*this.itemSize+3]=w;
return this;
},
setXY:function setXY(index,x,y){
index*=this.itemSize;
this.array[index+0]=x;
this.array[index+1]=y;
return this;
},
setXYZ:function setXYZ(index,x,y,z){
index*=this.itemSize;
this.array[index+0]=x;
this.array[index+1]=y;
this.array[index+2]=z;
return this;
},
setXYZW:function setXYZW(index,x,y,z,w){
index*=this.itemSize;
this.array[index+0]=x;
this.array[index+1]=y;
this.array[index+2]=z;
this.array[index+3]=w;
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
}};
function Int8Attribute(array,itemSize){
return new BufferAttribute(new Int8Array(array),itemSize);
}
function Uint8Attribute(array,itemSize){
return new BufferAttribute(new Uint8Array(array),itemSize);
}
function Uint8ClampedAttribute(array,itemSize){
return new BufferAttribute(new Uint8ClampedArray(array),itemSize);
}
function Int16Attribute(array,itemSize){
return new BufferAttribute(new Int16Array(array),itemSize);
}
function Uint16Attribute(array,itemSize){
return new BufferAttribute(new Uint16Array(array),itemSize);
}
function Int32Attribute(array,itemSize){
return new BufferAttribute(new Int32Array(array),itemSize);
}
function Uint32Attribute(array,itemSize){
return new BufferAttribute(new Uint32Array(array),itemSize);
}
function Float32Attribute(array,itemSize){
return new BufferAttribute(new Float32Array(array),itemSize);
}
function Float64Attribute(array,itemSize){
return new BufferAttribute(new Float64Array(array),itemSize);
}
function DynamicBufferAttribute(array,itemSize){
console.warn('THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.');
return new BufferAttribute(array,itemSize).setDynamic(true);
}
function Face3(a,b,c,normal,color,materialIndex){
this.a=a;
this.b=b;
this.c=c;
this.normal=normal&&normal.isVector3?normal:new Vector3();
this.vertexNormals=Array.isArray(normal)?normal:[];
this.color=color&&color.isColor?color:new Color();
this.vertexColors=Array.isArray(color)?color:[];
this.materialIndex=materialIndex!==undefined?materialIndex:0;
}
Face3.prototype={
constructor:Face3,
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(source){
this.a=source.a;
this.b=source.b;
this.c=source.c;
this.normal.copy(source.normal);
this.color.copy(source.color);
this.materialIndex=source.materialIndex;
for(var i=0,il=source.vertexNormals.length;i<il;i++){
this.vertexNormals[i]=source.vertexNormals[i].clone();
}
for(var i=0,il=source.vertexColors.length;i<il;i++){
this.vertexColors[i]=source.vertexColors[i].clone();
}
return this;
}};
function Euler(x,y,z,order){
this._x=x||0;
this._y=y||0;
this._z=z||0;
this._order=order||Euler.DefaultOrder;
}
Euler.RotationOrders=['XYZ','YZX','ZXY','XZY','YXZ','ZYX'];
Euler.DefaultOrder='XYZ';
Euler.prototype={
constructor:Euler,
isEuler:true,
get x(){
return this._x;
},
set x(value){
this._x=value;
this.onChangeCallback();
},
get y(){
return this._y;
},
set y(value){
this._y=value;
this.onChangeCallback();
},
get z(){
return this._z;
},
set z(value){
this._z=value;
this.onChangeCallback();
},
get order(){
return this._order;
},
set order(value){
this._order=value;
this.onChangeCallback();
},
set:function set(x,y,z,order){
this._x=x;
this._y=y;
this._z=z;
this._order=order||this._order;
this.onChangeCallback();
return this;
},
clone:function clone(){
return new this.constructor(this._x,this._y,this._z,this._order);
},
copy:function copy(euler){
this._x=euler._x;
this._y=euler._y;
this._z=euler._z;
this._order=euler._order;
this.onChangeCallback();
return this;
},
setFromRotationMatrix:function setFromRotationMatrix(m,order,update){
var clamp=exports.Math.clamp;
var te=m.elements;
var m11=te[0],m12=te[4],m13=te[8];
var m21=te[1],m22=te[5],m23=te[9];
var m31=te[2],m32=te[6],m33=te[10];
order=order||this._order;
if(order==='XYZ'){
this._y=Math.asin(clamp(m13,-1,1));
if(Math.abs(m13)<0.99999){
this._x=Math.atan2(-m23,m33);
this._z=Math.atan2(-m12,m11);
}else{
this._x=Math.atan2(m32,m22);
this._z=0;
}
}else if(order==='YXZ'){
this._x=Math.asin(-clamp(m23,-1,1));
if(Math.abs(m23)<0.99999){
this._y=Math.atan2(m13,m33);
this._z=Math.atan2(m21,m22);
}else{
this._y=Math.atan2(-m31,m11);
this._z=0;
}
}else if(order==='ZXY'){
this._x=Math.asin(clamp(m32,-1,1));
if(Math.abs(m32)<0.99999){
this._y=Math.atan2(-m31,m33);
this._z=Math.atan2(-m12,m22);
}else{
this._y=0;
this._z=Math.atan2(m21,m11);
}
}else if(order==='ZYX'){
this._y=Math.asin(-clamp(m31,-1,1));
if(Math.abs(m31)<0.99999){
this._x=Math.atan2(m32,m33);
this._z=Math.atan2(m21,m11);
}else{
this._x=0;
this._z=Math.atan2(-m12,m22);
}
}else if(order==='YZX'){
this._z=Math.asin(clamp(m21,-1,1));
if(Math.abs(m21)<0.99999){
this._x=Math.atan2(-m23,m22);
this._y=Math.atan2(-m31,m11);
}else{
this._x=0;
this._y=Math.atan2(m13,m33);
}
}else if(order==='XZY'){
this._z=Math.asin(-clamp(m12,-1,1));
if(Math.abs(m12)<0.99999){
this._x=Math.atan2(m32,m22);
this._y=Math.atan2(m13,m11);
}else{
this._x=Math.atan2(-m23,m33);
this._y=0;
}
}else{
console.warn('THREE.Euler: .setFromRotationMatrix() given unsupported order: '+order);
}
this._order=order;
if(update!==false)this.onChangeCallback();
return this;
},
setFromQuaternion:function(){
var matrix;
return function setFromQuaternion(q,order,update){
if(matrix===undefined)matrix=new Matrix4();
matrix.makeRotationFromQuaternion(q);
return this.setFromRotationMatrix(matrix,order,update);
};
}(),
setFromVector3:function setFromVector3(v,order){
return this.set(v.x,v.y,v.z,order||this._order);
},
reorder:function(){
var q=new Quaternion();
return function reorder(newOrder){
q.setFromEuler(this);
return this.setFromQuaternion(q,newOrder);
};
}(),
equals:function equals(euler){
return euler._x===this._x&&euler._y===this._y&&euler._z===this._z&&euler._order===this._order;
},
fromArray:function fromArray(array){
this._x=array[0];
this._y=array[1];
this._z=array[2];
if(array[3]!==undefined)this._order=array[3];
this.onChangeCallback();
return this;
},
toArray:function toArray(array,offset){
if(array===undefined)array=[];
if(offset===undefined)offset=0;
array[offset]=this._x;
array[offset+1]=this._y;
array[offset+2]=this._z;
array[offset+3]=this._order;
return array;
},
toVector3:function toVector3(optionalResult){
if(optionalResult){
return optionalResult.set(this._x,this._y,this._z);
}else{
return new Vector3(this._x,this._y,this._z);
}
},
onChange:function onChange(callback){
this.onChangeCallback=callback;
return this;
},
onChangeCallback:function onChangeCallback(){}};
function Layers(){
this.mask=1;
}
Layers.prototype={
constructor:Layers,
set:function set(channel){
this.mask=1<<channel;
},
enable:function enable(channel){
this.mask|=1<<channel;
},
toggle:function toggle(channel){
this.mask^=1<<channel;
},
disable:function disable(channel){
this.mask&=~(1<<channel);
},
test:function test(layers){
return(this.mask&layers.mask)!==0;
}};
function Object3D(){
Object.defineProperty(this,'id',{value:Object3DIdCount()});
this.uuid=exports.Math.generateUUID();
this.name='';
this.type='Object3D';
this.parent=null;
this.children=[];
this.up=Object3D.DefaultUp.clone();
var position=new Vector3();
var rotation=new Euler();
var quaternion=new Quaternion();
var scale=new Vector3(1,1,1);
function onRotationChange(){
quaternion.setFromEuler(rotation,false);
}
function onQuaternionChange(){
rotation.setFromQuaternion(quaternion,undefined,false);
}
rotation.onChange(onRotationChange);
quaternion.onChange(onQuaternionChange);
Object.defineProperties(this,{
position:{
enumerable:true,
value:position},
rotation:{
enumerable:true,
value:rotation},
quaternion:{
enumerable:true,
value:quaternion},
scale:{
enumerable:true,
value:scale},
modelViewMatrix:{
value:new Matrix4()},
normalMatrix:{
value:new Matrix3()}});
this.matrix=new Matrix4();
this.matrixWorld=new Matrix4();
this.matrixAutoUpdate=Object3D.DefaultMatrixAutoUpdate;
this.matrixWorldNeedsUpdate=false;
this.layers=new Layers();
this.visible=true;
this.castShadow=false;
this.receiveShadow=false;
this.frustumCulled=true;
this.renderOrder=0;
this.userData={};
}
Object3D.DefaultUp=new Vector3(0,1,0);
Object3D.DefaultMatrixAutoUpdate=true;
babelHelpers.extends(Object3D.prototype,EventDispatcher.prototype,{
isObject3D:true,
applyMatrix:function applyMatrix(matrix){
this.matrix.multiplyMatrices(matrix,this.matrix);
this.matrix.decompose(this.position,this.quaternion,this.scale);
},
setRotationFromAxisAngle:function setRotationFromAxisAngle(axis,angle){
this.quaternion.setFromAxisAngle(axis,angle);
},
setRotationFromEuler:function setRotationFromEuler(euler){
this.quaternion.setFromEuler(euler,true);
},
setRotationFromMatrix:function setRotationFromMatrix(m){
this.quaternion.setFromRotationMatrix(m);
},
setRotationFromQuaternion:function setRotationFromQuaternion(q){
this.quaternion.copy(q);
},
rotateOnAxis:function(){
var q1=new Quaternion();
return function rotateOnAxis(axis,angle){
q1.setFromAxisAngle(axis,angle);
this.quaternion.multiply(q1);
return this;
};
}(),
rotateX:function(){
var v1=new Vector3(1,0,0);
return function rotateX(angle){
return this.rotateOnAxis(v1,angle);
};
}(),
rotateY:function(){
var v1=new Vector3(0,1,0);
return function rotateY(angle){
return this.rotateOnAxis(v1,angle);
};
}(),
rotateZ:function(){
var v1=new Vector3(0,0,1);
return function rotateZ(angle){
return this.rotateOnAxis(v1,angle);
};
}(),
translateOnAxis:function(){
var v1=new Vector3();
return function translateOnAxis(axis,distance){
v1.copy(axis).applyQuaternion(this.quaternion);
this.position.add(v1.multiplyScalar(distance));
return this;
};
}(),
translateX:function(){
var v1=new Vector3(1,0,0);
return function translateX(distance){
return this.translateOnAxis(v1,distance);
};
}(),
translateY:function(){
var v1=new Vector3(0,1,0);
return function translateY(distance){
return this.translateOnAxis(v1,distance);
};
}(),
translateZ:function(){
var v1=new Vector3(0,0,1);
return function translateZ(distance){
return this.translateOnAxis(v1,distance);
};
}(),
localToWorld:function localToWorld(vector){
return vector.applyMatrix4(this.matrixWorld);
},
worldToLocal:function(){
var m1=new Matrix4();
return function worldToLocal(vector){
return vector.applyMatrix4(m1.getInverse(this.matrixWorld));
};
}(),
lookAt:function(){
var m1=new Matrix4();
return function lookAt(vector){
m1.lookAt(vector,this.position,this.up);
this.quaternion.setFromRotationMatrix(m1);
};
}(),
add:function add(object){
if(arguments.length>1){
for(var i=0;i<arguments.length;i++){
this.add(arguments[i]);
}
return this;
}
if(object===this){
console.error("THREE.Object3D.add: object can't be added as a child of itself.",object);
return this;
}
if(object&&object.isObject3D){
if(object.parent!==null){
object.parent.remove(object);
}
object.parent=this;
object.dispatchEvent({type:'added'});
this.children.push(object);
}else{
console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",object);
}
return this;
},
remove:function remove(object){
if(arguments.length>1){
for(var i=0;i<arguments.length;i++){
this.remove(arguments[i]);
}
}
var index=this.children.indexOf(object);
if(index!==-1){
object.parent=null;
object.dispatchEvent({type:'removed'});
this.children.splice(index,1);
}
},
getObjectById:function getObjectById(id){
return this.getObjectByProperty('id',id);
},
getObjectByName:function getObjectByName(name){
return this.getObjectByProperty('name',name);
},
getObjectByProperty:function getObjectByProperty(name,value){
if(this[name]===value)return this;
for(var i=0,l=this.children.length;i<l;i++){
var child=this.children[i];
var object=child.getObjectByProperty(name,value);
if(object!==undefined){
return object;
}
}
return undefined;
},
getWorldPosition:function getWorldPosition(optionalTarget){
var result=optionalTarget||new Vector3();
this.updateMatrixWorld(true);
return result.setFromMatrixPosition(this.matrixWorld);
},
getWorldQuaternion:function(){
var position=new Vector3();
var scale=new Vector3();
return function getWorldQuaternion(optionalTarget){
var result=optionalTarget||new Quaternion();
this.updateMatrixWorld(true);
this.matrixWorld.decompose(position,result,scale);
return result;
};
}(),
getWorldRotation:function(){
var quaternion=new Quaternion();
return function getWorldRotation(optionalTarget){
var result=optionalTarget||new Euler();
this.getWorldQuaternion(quaternion);
return result.setFromQuaternion(quaternion,this.rotation.order,false);
};
}(),
getWorldScale:function(){
var position=new Vector3();
var quaternion=new Quaternion();
return function getWorldScale(optionalTarget){
var result=optionalTarget||new Vector3();
this.updateMatrixWorld(true);
this.matrixWorld.decompose(position,quaternion,result);
return result;
};
}(),
getWorldDirection:function(){
var quaternion=new Quaternion();
return function getWorldDirection(optionalTarget){
var result=optionalTarget||new Vector3();
this.getWorldQuaternion(quaternion);
return result.set(0,0,1).applyQuaternion(quaternion);
};
}(),
raycast:function raycast(){},
traverse:function traverse(callback){
callback(this);
var children=this.children;
for(var i=0,l=children.length;i<l;i++){
children[i].traverse(callback);
}
},
traverseVisible:function traverseVisible(callback){
if(this.visible===false)return;
callback(this);
var children=this.children;
for(var i=0,l=children.length;i<l;i++){
children[i].traverseVisible(callback);
}
},
traverseAncestors:function traverseAncestors(callback){
var parent=this.parent;
if(parent!==null){
callback(parent);
parent.traverseAncestors(callback);
}
},
updateMatrix:function updateMatrix(){
this.matrix.compose(this.position,this.quaternion,this.scale);
this.matrixWorldNeedsUpdate=true;
},
updateMatrixWorld:function updateMatrixWorld(force){
if(this.matrixAutoUpdate===true)this.updateMatrix();
if(this.matrixWorldNeedsUpdate===true||force===true){
if(this.parent===null){
this.matrixWorld.copy(this.matrix);
}else{
this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix);
}
this.matrixWorldNeedsUpdate=false;
force=true;
}
var children=this.children;
for(var i=0,l=children.length;i<l;i++){
children[i].updateMatrixWorld(force);
}
},
toJSON:function toJSON(meta){
var isRootObject=meta===undefined||meta==='';
var output={};
if(isRootObject){
meta={
geometries:{},
materials:{},
textures:{},
images:{}};
output.metadata={
version:4.4,
type:'Object',
generator:'Object3D.toJSON'};
}
var object={};
object.uuid=this.uuid;
object.type=this.type;
if(this.name!=='')object.name=this.name;
if(JSON.stringify(this.userData)!=='{}')object.userData=this.userData;
if(this.castShadow===true)object.castShadow=true;
if(this.receiveShadow===true)object.receiveShadow=true;
if(this.visible===false)object.visible=false;
object.matrix=this.matrix.toArray();
if(this.geometry!==undefined){
if(meta.geometries[this.geometry.uuid]===undefined){
meta.geometries[this.geometry.uuid]=this.geometry.toJSON(meta);
}
object.geometry=this.geometry.uuid;
}
if(this.material!==undefined){
if(meta.materials[this.material.uuid]===undefined){
meta.materials[this.material.uuid]=this.material.toJSON(meta);
}
object.material=this.material.uuid;
}
if(this.children.length>0){
object.children=[];
for(var i=0;i<this.children.length;i++){
object.children.push(this.children[i].toJSON(meta).object);
}
}
if(isRootObject){
var geometries=extractFromCache(meta.geometries);
var materials=extractFromCache(meta.materials);
var textures=extractFromCache(meta.textures);
var images=extractFromCache(meta.images);
if(geometries.length>0)output.geometries=geometries;
if(materials.length>0)output.materials=materials;
if(textures.length>0)output.textures=textures;
if(images.length>0)output.images=images;
}
output.object=object;
return output;
function extractFromCache(cache){
var values=[];
for(var key in cache){
var data=cache[key];
delete data.metadata;
values.push(data);
}
return values;
}
},
clone:function clone(recursive){
return new this.constructor().copy(this,recursive);
},
copy:function copy(source,recursive){
if(recursive===undefined)recursive=true;
this.name=source.name;
this.up.copy(source.up);
this.position.copy(source.position);
this.quaternion.copy(source.quaternion);
this.scale.copy(source.scale);
this.matrix.copy(source.matrix);
this.matrixWorld.copy(source.matrixWorld);
this.matrixAutoUpdate=source.matrixAutoUpdate;
this.matrixWorldNeedsUpdate=source.matrixWorldNeedsUpdate;
this.visible=source.visible;
this.castShadow=source.castShadow;
this.receiveShadow=source.receiveShadow;
this.frustumCulled=source.frustumCulled;
this.renderOrder=source.renderOrder;
this.userData=JSON.parse(JSON.stringify(source.userData));
if(recursive===true){
for(var i=0;i<source.children.length;i++){
var child=source.children[i];
this.add(child.clone());
}
}
return this;
}});
var count$3=0;
function Object3DIdCount(){return count$3++;};
function Geometry(){
Object.defineProperty(this,'id',{value:GeometryIdCount()});
this.uuid=exports.Math.generateUUID();
this.name='';
this.type='Geometry';
this.vertices=[];
this.colors=[];
this.faces=[];
this.faceVertexUvs=[[]];
this.morphTargets=[];
this.morphNormals=[];
this.skinWeights=[];
this.skinIndices=[];
this.lineDistances=[];
this.boundingBox=null;
this.boundingSphere=null;
this.elementsNeedUpdate=false;
this.verticesNeedUpdate=false;
this.uvsNeedUpdate=false;
this.normalsNeedUpdate=false;
this.colorsNeedUpdate=false;
this.lineDistancesNeedUpdate=false;
this.groupsNeedUpdate=false;
}
babelHelpers.extends(Geometry.prototype,EventDispatcher.prototype,{
isGeometry:true,
applyMatrix:function applyMatrix(matrix){
var normalMatrix=new Matrix3().getNormalMatrix(matrix);
for(var i=0,il=this.vertices.length;i<il;i++){
var vertex=this.vertices[i];
vertex.applyMatrix4(matrix);
}
for(var i=0,il=this.faces.length;i<il;i++){
var face=this.faces[i];
face.normal.applyMatrix3(normalMatrix).normalize();
for(var j=0,jl=face.vertexNormals.length;j<jl;j++){
face.vertexNormals[j].applyMatrix3(normalMatrix).normalize();
}
}
if(this.boundingBox!==null){
this.computeBoundingBox();
}
if(this.boundingSphere!==null){
this.computeBoundingSphere();
}
this.verticesNeedUpdate=true;
this.normalsNeedUpdate=true;
return this;
},
rotateX:function(){
var m1;
return function rotateX(angle){
if(m1===undefined)m1=new Matrix4();
m1.makeRotationX(angle);
this.applyMatrix(m1);
return this;
};
}(),
rotateY:function(){
var m1;
return function rotateY(angle){
if(m1===undefined)m1=new Matrix4();
m1.makeRotationY(angle);
this.applyMatrix(m1);
return this;
};
}(),
rotateZ:function(){
var m1;
return function rotateZ(angle){
if(m1===undefined)m1=new Matrix4();
m1.makeRotationZ(angle);
this.applyMatrix(m1);
return this;
};
}(),
translate:function(){
var m1;
return function translate(x,y,z){
if(m1===undefined)m1=new Matrix4();
m1.makeTranslation(x,y,z);
this.applyMatrix(m1);
return this;
};
}(),
scale:function(){
var m1;
return function scale(x,y,z){
if(m1===undefined)m1=new Matrix4();
m1.makeScale(x,y,z);
this.applyMatrix(m1);
return this;
};
}(),
lookAt:function(){
var obj;
return function lookAt(vector){
if(obj===undefined)obj=new Object3D();
obj.lookAt(vector);
obj.updateMatrix();
this.applyMatrix(obj.matrix);
};
}(),
fromBufferGeometry:function fromBufferGeometry(geometry){
var scope=this;
var indices=geometry.index!==null?geometry.index.array:undefined;
var attributes=geometry.attributes;
var positions=attributes.position.array;
var normals=attributes.normal!==undefined?attributes.normal.array:undefined;
var colors=attributes.color!==undefined?attributes.color.array:undefined;
var uvs=attributes.uv!==undefined?attributes.uv.array:undefined;
var uvs2=attributes.uv2!==undefined?attributes.uv2.array:undefined;
if(uvs2!==undefined)this.faceVertexUvs[1]=[];
var tempNormals=[];
var tempUVs=[];
var tempUVs2=[];
for(var i=0,j=0;i<positions.length;i+=3,j+=2){
scope.vertices.push(new Vector3(positions[i],positions[i+1],positions[i+2]));
if(normals!==undefined){
tempNormals.push(new Vector3(normals[i],normals[i+1],normals[i+2]));
}
if(colors!==undefined){
scope.colors.push(new Color(colors[i],colors[i+1],colors[i+2]));
}
if(uvs!==undefined){
tempUVs.push(new Vector2(uvs[j],uvs[j+1]));
}
if(uvs2!==undefined){
tempUVs2.push(new Vector2(uvs2[j],uvs2[j+1]));
}
}
function addFace(a,b,c,materialIndex){
var vertexNormals=normals!==undefined?[tempNormals[a].clone(),tempNormals[b].clone(),tempNormals[c].clone()]:[];
var vertexColors=colors!==undefined?[scope.colors[a].clone(),scope.colors[b].clone(),scope.colors[c].clone()]:[];
var face=new Face3(a,b,c,vertexNormals,vertexColors,materialIndex);
scope.faces.push(face);
if(uvs!==undefined){
scope.faceVertexUvs[0].push([tempUVs[a].clone(),tempUVs[b].clone(),tempUVs[c].clone()]);
}
if(uvs2!==undefined){
scope.faceVertexUvs[1].push([tempUVs2[a].clone(),tempUVs2[b].clone(),tempUVs2[c].clone()]);
}
}
if(indices!==undefined){
var groups=geometry.groups;
if(groups.length>0){
for(var i=0;i<groups.length;i++){
var group=groups[i];
var start=group.start;
var count=group.count;
for(var j=start,jl=start+count;j<jl;j+=3){
addFace(indices[j],indices[j+1],indices[j+2],group.materialIndex);
}
}
}else{
for(var i=0;i<indices.length;i+=3){
addFace(indices[i],indices[i+1],indices[i+2]);
}
}
}else{
for(var i=0;i<positions.length/3;i+=3){
addFace(i,i+1,i+2);
}
}
this.computeFaceNormals();
if(geometry.boundingBox!==null){
this.boundingBox=geometry.boundingBox.clone();
}
if(geometry.boundingSphere!==null){
this.boundingSphere=geometry.boundingSphere.clone();
}
return this;
},
center:function center(){
this.computeBoundingBox();
var offset=this.boundingBox.center().negate();
this.translate(offset.x,offset.y,offset.z);
return offset;
},
normalize:function normalize(){
this.computeBoundingSphere();
var center=this.boundingSphere.center;
var radius=this.boundingSphere.radius;
var s=radius===0?1:1.0/radius;
var matrix=new Matrix4();
matrix.set(
s,0,0,-s*center.x,
0,s,0,-s*center.y,
0,0,s,-s*center.z,
0,0,0,1);
this.applyMatrix(matrix);
return this;
},
computeFaceNormals:function computeFaceNormals(){
var cb=new Vector3(),ab=new Vector3();
for(var f=0,fl=this.faces.length;f<fl;f++){
var face=this.faces[f];
var vA=this.vertices[face.a];
var vB=this.vertices[face.b];
var vC=this.vertices[face.c];
cb.subVectors(vC,vB);
ab.subVectors(vA,vB);
cb.cross(ab);
cb.normalize();
face.normal.copy(cb);
}
},
computeVertexNormals:function computeVertexNormals(areaWeighted){
if(areaWeighted===undefined)areaWeighted=true;
var v,vl,f,fl,face,vertices;
vertices=new Array(this.vertices.length);
for(v=0,vl=this.vertices.length;v<vl;v++){
vertices[v]=new Vector3();
}
if(areaWeighted){
var vA,vB,vC;
var cb=new Vector3(),ab=new Vector3();
for(f=0,fl=this.faces.length;f<fl;f++){
face=this.faces[f];
vA=this.vertices[face.a];
vB=this.vertices[face.b];
vC=this.vertices[face.c];
cb.subVectors(vC,vB);
ab.subVectors(vA,vB);
cb.cross(ab);
vertices[face.a].add(cb);
vertices[face.b].add(cb);
vertices[face.c].add(cb);
}
}else{
for(f=0,fl=this.faces.length;f<fl;f++){
face=this.faces[f];
vertices[face.a].add(face.normal);
vertices[face.b].add(face.normal);
vertices[face.c].add(face.normal);
}
}
for(v=0,vl=this.vertices.length;v<vl;v++){
vertices[v].normalize();
}
for(f=0,fl=this.faces.length;f<fl;f++){
face=this.faces[f];
var vertexNormals=face.vertexNormals;
if(vertexNormals.length===3){
vertexNormals[0].copy(vertices[face.a]);
vertexNormals[1].copy(vertices[face.b]);
vertexNormals[2].copy(vertices[face.c]);
}else{
vertexNormals[0]=vertices[face.a].clone();
vertexNormals[1]=vertices[face.b].clone();
vertexNormals[2]=vertices[face.c].clone();
}
}
if(this.faces.length>0){
this.normalsNeedUpdate=true;
}
},
computeMorphNormals:function computeMorphNormals(){
var i,il,f,fl,face;
for(f=0,fl=this.faces.length;f<fl;f++){
face=this.faces[f];
if(!face.__originalFaceNormal){
face.__originalFaceNormal=face.normal.clone();
}else{
face.__originalFaceNormal.copy(face.normal);
}
if(!face.__originalVertexNormals)face.__originalVertexNormals=[];
for(i=0,il=face.vertexNormals.length;i<il;i++){
if(!face.__originalVertexNormals[i]){
face.__originalVertexNormals[i]=face.vertexNormals[i].clone();
}else{
face.__originalVertexNormals[i].copy(face.vertexNormals[i]);
}
}
}
var tmpGeo=new Geometry();
tmpGeo.faces=this.faces;
for(i=0,il=this.morphTargets.length;i<il;i++){
if(!this.morphNormals[i]){
this.morphNormals[i]={};
this.morphNormals[i].faceNormals=[];
this.morphNormals[i].vertexNormals=[];
var dstNormalsFace=this.morphNormals[i].faceNormals;
var dstNormalsVertex=this.morphNormals[i].vertexNormals;
var faceNormal,vertexNormals;
for(f=0,fl=this.faces.length;f<fl;f++){
faceNormal=new Vector3();
vertexNormals={a:new Vector3(),b:new Vector3(),c:new Vector3()};
dstNormalsFace.push(faceNormal);
dstNormalsVertex.push(vertexNormals);
}
}
var morphNormals=this.morphNormals[i];
tmpGeo.vertices=this.morphTargets[i].vertices;
tmpGeo.computeFaceNormals();
tmpGeo.computeVertexNormals();
var faceNormal,vertexNormals;
for(f=0,fl=this.faces.length;f<fl;f++){
face=this.faces[f];
faceNormal=morphNormals.faceNormals[f];
vertexNormals=morphNormals.vertexNormals[f];
faceNormal.copy(face.normal);
vertexNormals.a.copy(face.vertexNormals[0]);
vertexNormals.b.copy(face.vertexNormals[1]);
vertexNormals.c.copy(face.vertexNormals[2]);
}
}
for(f=0,fl=this.faces.length;f<fl;f++){
face=this.faces[f];
face.normal=face.__originalFaceNormal;
face.vertexNormals=face.__originalVertexNormals;
}
},
computeTangents:function computeTangents(){
console.warn('THREE.Geometry: .computeTangents() has been removed.');
},
computeLineDistances:function computeLineDistances(){
var d=0;
var vertices=this.vertices;
for(var i=0,il=vertices.length;i<il;i++){
if(i>0){
d+=vertices[i].distanceTo(vertices[i-1]);
}
this.lineDistances[i]=d;
}
},
computeBoundingBox:function computeBoundingBox(){
if(this.boundingBox===null){
this.boundingBox=new Box3();
}
this.boundingBox.setFromPoints(this.vertices);
},
computeBoundingSphere:function computeBoundingSphere(){
if(this.boundingSphere===null){
this.boundingSphere=new Sphere();
}
this.boundingSphere.setFromPoints(this.vertices);
},
merge:function merge(geometry,matrix,materialIndexOffset){
if((geometry&&geometry.isGeometry)===false){
console.error('THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.',geometry);
return;
}
var normalMatrix,
vertexOffset=this.vertices.length,
vertices1=this.vertices,
vertices2=geometry.vertices,
faces1=this.faces,
faces2=geometry.faces,
uvs1=this.faceVertexUvs[0],
uvs2=geometry.faceVertexUvs[0];
if(materialIndexOffset===undefined)materialIndexOffset=0;
if(matrix!==undefined){
normalMatrix=new Matrix3().getNormalMatrix(matrix);
}
for(var i=0,il=vertices2.length;i<il;i++){
var vertex=vertices2[i];
var vertexCopy=vertex.clone();
if(matrix!==undefined)vertexCopy.applyMatrix4(matrix);
vertices1.push(vertexCopy);
}
for(i=0,il=faces2.length;i<il;i++){
var face=faces2[i],faceCopy,normal,color,
faceVertexNormals=face.vertexNormals,
faceVertexColors=face.vertexColors;
faceCopy=new Face3(face.a+vertexOffset,face.b+vertexOffset,face.c+vertexOffset);
faceCopy.normal.copy(face.normal);
if(normalMatrix!==undefined){
faceCopy.normal.applyMatrix3(normalMatrix).normalize();
}
for(var j=0,jl=faceVertexNormals.length;j<jl;j++){
normal=faceVertexNormals[j].clone();
if(normalMatrix!==undefined){
normal.applyMatrix3(normalMatrix).normalize();
}
faceCopy.vertexNormals.push(normal);
}
faceCopy.color.copy(face.color);
for(var j=0,jl=faceVertexColors.length;j<jl;j++){
color=faceVertexColors[j];
faceCopy.vertexColors.push(color.clone());
}
faceCopy.materialIndex=face.materialIndex+materialIndexOffset;
faces1.push(faceCopy);
}
for(i=0,il=uvs2.length;i<il;i++){
var uv=uvs2[i],uvCopy=[];
if(uv===undefined){
continue;
}
for(var j=0,jl=uv.length;j<jl;j++){
uvCopy.push(uv[j].clone());
}
uvs1.push(uvCopy);
}
},
mergeMesh:function mergeMesh(mesh){
if((mesh&&mesh.isMesh)===false){
console.error('THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.',mesh);
return;
}
mesh.matrixAutoUpdate&&mesh.updateMatrix();
this.merge(mesh.geometry,mesh.matrix);
},
mergeVertices:function mergeVertices(){
var verticesMap={};
var unique=[],changes=[];
var v,key;
var precisionPoints=4;
var precision=Math.pow(10,precisionPoints);
var i,il,face;
var indices,j,jl;
for(i=0,il=this.vertices.length;i<il;i++){
v=this.vertices[i];
key=Math.round(v.x*precision)+'_'+Math.round(v.y*precision)+'_'+Math.round(v.z*precision);
if(verticesMap[key]===undefined){
verticesMap[key]=i;
unique.push(this.vertices[i]);
changes[i]=unique.length-1;
}else{
changes[i]=changes[verticesMap[key]];
}
}
var faceIndicesToRemove=[];
for(i=0,il=this.faces.length;i<il;i++){
face=this.faces[i];
face.a=changes[face.a];
face.b=changes[face.b];
face.c=changes[face.c];
indices=[face.a,face.b,face.c];
var dupIndex=-1;
for(var n=0;n<3;n++){
if(indices[n]===indices[(n+1)%3]){
dupIndex=n;
faceIndicesToRemove.push(i);
break;
}
}
}
for(i=faceIndicesToRemove.length-1;i>=0;i--){
var idx=faceIndicesToRemove[i];
this.faces.splice(idx,1);
for(j=0,jl=this.faceVertexUvs.length;j<jl;j++){
this.faceVertexUvs[j].splice(idx,1);
}
}
var diff=this.vertices.length-unique.length;
this.vertices=unique;
return diff;
},
sortFacesByMaterialIndex:function sortFacesByMaterialIndex(){
var faces=this.faces;
var length=faces.length;
for(var i=0;i<length;i++){
faces[i]._id=i;
}
function materialIndexSort(a,b){
return a.materialIndex-b.materialIndex;
}
faces.sort(materialIndexSort);
var uvs1=this.faceVertexUvs[0];
var uvs2=this.faceVertexUvs[1];
var newUvs1,newUvs2;
if(uvs1&&uvs1.length===length)newUvs1=[];
if(uvs2&&uvs2.length===length)newUvs2=[];
for(var i=0;i<length;i++){
var id=faces[i]._id;
if(newUvs1)newUvs1.push(uvs1[id]);
if(newUvs2)newUvs2.push(uvs2[id]);
}
if(newUvs1)this.faceVertexUvs[0]=newUvs1;
if(newUvs2)this.faceVertexUvs[1]=newUvs2;
},
toJSON:function toJSON(){
var data={
metadata:{
version:4.4,
type:'Geometry',
generator:'Geometry.toJSON'}};
data.uuid=this.uuid;
data.type=this.type;
if(this.name!=='')data.name=this.name;
if(this.parameters!==undefined){
var parameters=this.parameters;
for(var key in parameters){
if(parameters[key]!==undefined)data[key]=parameters[key];
}
return data;
}
var vertices=[];
for(var i=0;i<this.vertices.length;i++){
var vertex=this.vertices[i];
vertices.push(vertex.x,vertex.y,vertex.z);
}
var faces=[];
var normals=[];
var normalsHash={};
var colors=[];
var colorsHash={};
var uvs=[];
var uvsHash={};
for(var i=0;i<this.faces.length;i++){
var face=this.faces[i];
var hasMaterial=true;
var hasFaceUv=false;
var hasFaceVertexUv=this.faceVertexUvs[0][i]!==undefined;
var hasFaceNormal=face.normal.length()>0;
var hasFaceVertexNormal=face.vertexNormals.length>0;
var hasFaceColor=face.color.r!==1||face.color.g!==1||face.color.b!==1;
var hasFaceVertexColor=face.vertexColors.length>0;
var faceType=0;
faceType=setBit(faceType,0,0);
faceType=setBit(faceType,1,hasMaterial);
faceType=setBit(faceType,2,hasFaceUv);
faceType=setBit(faceType,3,hasFaceVertexUv);
faceType=setBit(faceType,4,hasFaceNormal);
faceType=setBit(faceType,5,hasFaceVertexNormal);
faceType=setBit(faceType,6,hasFaceColor);
faceType=setBit(faceType,7,hasFaceVertexColor);
faces.push(faceType);
faces.push(face.a,face.b,face.c);
faces.push(face.materialIndex);
if(hasFaceVertexUv){
var faceVertexUvs=this.faceVertexUvs[0][i];
faces.push(
getUvIndex(faceVertexUvs[0]),
getUvIndex(faceVertexUvs[1]),
getUvIndex(faceVertexUvs[2]));
}
if(hasFaceNormal){
faces.push(getNormalIndex(face.normal));
}
if(hasFaceVertexNormal){
var vertexNormals=face.vertexNormals;
faces.push(
getNormalIndex(vertexNormals[0]),
getNormalIndex(vertexNormals[1]),
getNormalIndex(vertexNormals[2]));
}
if(hasFaceColor){
faces.push(getColorIndex(face.color));
}
if(hasFaceVertexColor){
var vertexColors=face.vertexColors;
faces.push(
getColorIndex(vertexColors[0]),
getColorIndex(vertexColors[1]),
getColorIndex(vertexColors[2]));
}
}
function setBit(value,position,enabled){
return enabled?value|1<<position:value&~(1<<position);
}
function getNormalIndex(normal){
var hash=normal.x.toString()+normal.y.toString()+normal.z.toString();
if(normalsHash[hash]!==undefined){
return normalsHash[hash];
}
normalsHash[hash]=normals.length/3;
normals.push(normal.x,normal.y,normal.z);
return normalsHash[hash];
}
function getColorIndex(color){
var hash=color.r.toString()+color.g.toString()+color.b.toString();
if(colorsHash[hash]!==undefined){
return colorsHash[hash];
}
colorsHash[hash]=colors.length;
colors.push(color.getHex());
return colorsHash[hash];
}
function getUvIndex(uv){
var hash=uv.x.toString()+uv.y.toString();
if(uvsHash[hash]!==undefined){
return uvsHash[hash];
}
uvsHash[hash]=uvs.length/2;
uvs.push(uv.x,uv.y);
return uvsHash[hash];
}
data.data={};
data.data.vertices=vertices;
data.data.normals=normals;
if(colors.length>0)data.data.colors=colors;
if(uvs.length>0)data.data.uvs=[uvs];
data.data.faces=faces;
return data;
},
clone:function clone(){
return new Geometry().copy(this);
},
copy:function copy(source){
this.vertices=[];
this.faces=[];
this.faceVertexUvs=[[]];
var vertices=source.vertices;
for(var i=0,il=vertices.length;i<il;i++){
this.vertices.push(vertices[i].clone());
}
var faces=source.faces;
for(var i=0,il=faces.length;i<il;i++){
this.faces.push(faces[i].clone());
}
for(var i=0,il=source.faceVertexUvs.length;i<il;i++){
var faceVertexUvs=source.faceVertexUvs[i];
if(this.faceVertexUvs[i]===undefined){
this.faceVertexUvs[i]=[];
}
for(var j=0,jl=faceVertexUvs.length;j<jl;j++){
var uvs=faceVertexUvs[j],uvsCopy=[];
for(var k=0,kl=uvs.length;k<kl;k++){
var uv=uvs[k];
uvsCopy.push(uv.clone());
}
this.faceVertexUvs[i].push(uvsCopy);
}
}
return this;
},
dispose:function dispose(){
this.dispatchEvent({type:'dispose'});
}});
var count$2=0;
function GeometryIdCount(){return count$2++;};
function DirectGeometry(){
Object.defineProperty(this,'id',{value:GeometryIdCount()});
this.uuid=exports.Math.generateUUID();
this.name='';
this.type='DirectGeometry';
this.indices=[];
this.vertices=[];
this.normals=[];
this.colors=[];
this.uvs=[];
this.uvs2=[];
this.groups=[];
this.morphTargets={};
this.skinWeights=[];
this.skinIndices=[];
this.boundingBox=null;
this.boundingSphere=null;
this.verticesNeedUpdate=false;
this.normalsNeedUpdate=false;
this.colorsNeedUpdate=false;
this.uvsNeedUpdate=false;
this.groupsNeedUpdate=false;
}
babelHelpers.extends(DirectGeometry.prototype,EventDispatcher.prototype,{
computeBoundingBox:Geometry.prototype.computeBoundingBox,
computeBoundingSphere:Geometry.prototype.computeBoundingSphere,
computeFaceNormals:function computeFaceNormals(){
console.warn('THREE.DirectGeometry: computeFaceNormals() is not a method of this type of geometry.');
},
computeVertexNormals:function computeVertexNormals(){
console.warn('THREE.DirectGeometry: computeVertexNormals() is not a method of this type of geometry.');
},
computeGroups:function computeGroups(geometry){
var group;
var groups=[];
var materialIndex;
var faces=geometry.faces;
for(var i=0;i<faces.length;i++){
var face=faces[i];
if(face.materialIndex!==materialIndex){
materialIndex=face.materialIndex;
if(group!==undefined){
group.count=i*3-group.start;
groups.push(group);
}
group={
start:i*3,
materialIndex:materialIndex};
}
}
if(group!==undefined){
group.count=i*3-group.start;
groups.push(group);
}
this.groups=groups;
},
fromGeometry:function fromGeometry(geometry){
var faces=geometry.faces;
var vertices=geometry.vertices;
var faceVertexUvs=geometry.faceVertexUvs;
var hasFaceVertexUv=faceVertexUvs[0]&&faceVertexUvs[0].length>0;
var hasFaceVertexUv2=faceVertexUvs[1]&&faceVertexUvs[1].length>0;
var morphTargets=geometry.morphTargets;
var morphTargetsLength=morphTargets.length;
var morphTargetsPosition;
if(morphTargetsLength>0){
morphTargetsPosition=[];
for(var i=0;i<morphTargetsLength;i++){
morphTargetsPosition[i]=[];
}
this.morphTargets.position=morphTargetsPosition;
}
var morphNormals=geometry.morphNormals;
var morphNormalsLength=morphNormals.length;
var morphTargetsNormal;
if(morphNormalsLength>0){
morphTargetsNormal=[];
for(var i=0;i<morphNormalsLength;i++){
morphTargetsNormal[i]=[];
}
this.morphTargets.normal=morphTargetsNormal;
}
var skinIndices=geometry.skinIndices;
var skinWeights=geometry.skinWeights;
var hasSkinIndices=skinIndices.length===vertices.length;
var hasSkinWeights=skinWeights.length===vertices.length;
for(var i=0;i<faces.length;i++){
var face=faces[i];
this.vertices.push(vertices[face.a],vertices[face.b],vertices[face.c]);
var vertexNormals=face.vertexNormals;
if(vertexNormals.length===3){
this.normals.push(vertexNormals[0],vertexNormals[1],vertexNormals[2]);
}else{
var normal=face.normal;
this.normals.push(normal,normal,normal);
}
var vertexColors=face.vertexColors;
if(vertexColors.length===3){
this.colors.push(vertexColors[0],vertexColors[1],vertexColors[2]);
}else{
var color=face.color;
this.colors.push(color,color,color);
}
if(hasFaceVertexUv===true){
var vertexUvs=faceVertexUvs[0][i];
if(vertexUvs!==undefined){
this.uvs.push(vertexUvs[0],vertexUvs[1],vertexUvs[2]);
}else{
console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ',i);
this.uvs.push(new Vector2(),new Vector2(),new Vector2());
}
}
if(hasFaceVertexUv2===true){
var vertexUvs=faceVertexUvs[1][i];
if(vertexUvs!==undefined){
this.uvs2.push(vertexUvs[0],vertexUvs[1],vertexUvs[2]);
}else{
console.warn('THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ',i);
this.uvs2.push(new Vector2(),new Vector2(),new Vector2());
}
}
for(var j=0;j<morphTargetsLength;j++){
var morphTarget=morphTargets[j].vertices;
morphTargetsPosition[j].push(morphTarget[face.a],morphTarget[face.b],morphTarget[face.c]);
}
for(var j=0;j<morphNormalsLength;j++){
var morphNormal=morphNormals[j].vertexNormals[i];
morphTargetsNormal[j].push(morphNormal.a,morphNormal.b,morphNormal.c);
}
if(hasSkinIndices){
this.skinIndices.push(skinIndices[face.a],skinIndices[face.b],skinIndices[face.c]);
}
if(hasSkinWeights){
this.skinWeights.push(skinWeights[face.a],skinWeights[face.b],skinWeights[face.c]);
}
}
this.computeGroups(geometry);
this.verticesNeedUpdate=geometry.verticesNeedUpdate;
this.normalsNeedUpdate=geometry.normalsNeedUpdate;
this.colorsNeedUpdate=geometry.colorsNeedUpdate;
this.uvsNeedUpdate=geometry.uvsNeedUpdate;
this.groupsNeedUpdate=geometry.groupsNeedUpdate;
return this;
},
dispose:function dispose(){
this.dispatchEvent({type:'dispose'});
}});
function BufferGeometry(){
Object.defineProperty(this,'id',{value:GeometryIdCount()});
this.uuid=exports.Math.generateUUID();
this.name='';
this.type='BufferGeometry';
this.index=null;
this.attributes={};
this.morphAttributes={};
this.groups=[];
this.boundingBox=null;
this.boundingSphere=null;
this.drawRange={start:0,count:Infinity};
}
babelHelpers.extends(BufferGeometry.prototype,EventDispatcher.prototype,{
isBufferGeometry:true,
getIndex:function getIndex(){
return this.index;
},
setIndex:function setIndex(index){
this.index=index;
},
addAttribute:function addAttribute(name,attribute){
if((attribute&&attribute.isBufferAttribute)===false&&(attribute&&attribute.isInterleavedBufferAttribute)===false){
console.warn('THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).');
this.addAttribute(name,new BufferAttribute(arguments[1],arguments[2]));
return;
}
if(name==='index'){
console.warn('THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.');
this.setIndex(attribute);
return;
}
this.attributes[name]=attribute;
return this;
},
getAttribute:function getAttribute(name){
return this.attributes[name];
},
removeAttribute:function removeAttribute(name){
delete this.attributes[name];
return this;
},
addGroup:function addGroup(start,count,materialIndex){
this.groups.push({
start:start,
count:count,
materialIndex:materialIndex!==undefined?materialIndex:0});
},
clearGroups:function clearGroups(){
this.groups=[];
},
setDrawRange:function setDrawRange(start,count){
this.drawRange.start=start;
this.drawRange.count=count;
},
applyMatrix:function applyMatrix(matrix){
var position=this.attributes.position;
if(position!==undefined){
matrix.applyToVector3Array(position.array);
position.needsUpdate=true;
}
var normal=this.attributes.normal;
if(normal!==undefined){
var normalMatrix=new Matrix3().getNormalMatrix(matrix);
normalMatrix.applyToVector3Array(normal.array);
normal.needsUpdate=true;
}
if(this.boundingBox!==null){
this.computeBoundingBox();
}
if(this.boundingSphere!==null){
this.computeBoundingSphere();
}
return this;
},
rotateX:function(){
var m1;
return function rotateX(angle){
if(m1===undefined)m1=new Matrix4();
m1.makeRotationX(angle);
this.applyMatrix(m1);
return this;
};
}(),
rotateY:function(){
var m1;
return function rotateY(angle){
if(m1===undefined)m1=new Matrix4();
m1.makeRotationY(angle);
this.applyMatrix(m1);
return this;
};
}(),
rotateZ:function(){
var m1;
return function rotateZ(angle){
if(m1===undefined)m1=new Matrix4();
m1.makeRotationZ(angle);
this.applyMatrix(m1);
return this;
};
}(),
translate:function(){
var m1;
return function translate(x,y,z){
if(m1===undefined)m1=new Matrix4();
m1.makeTranslation(x,y,z);
this.applyMatrix(m1);
return this;
};
}(),
scale:function(){
var m1;
return function scale(x,y,z){
if(m1===undefined)m1=new Matrix4();
m1.makeScale(x,y,z);
this.applyMatrix(m1);
return this;
};
}(),
lookAt:function(){
var obj;
return function lookAt(vector){
if(obj===undefined)obj=new Object3D();
obj.lookAt(vector);
obj.updateMatrix();
this.applyMatrix(obj.matrix);
};
}(),
center:function center(){
this.computeBoundingBox();
var offset=this.boundingBox.center().negate();
this.translate(offset.x,offset.y,offset.z);
return offset;
},
setFromObject:function setFromObject(object){
var geometry=object.geometry;
if(object&&object.isPoints||object&&object.isLine){
var positions=new Float32Attribute(geometry.vertices.length*3,3);
var colors=new Float32Attribute(geometry.colors.length*3,3);
this.addAttribute('position',positions.copyVector3sArray(geometry.vertices));
this.addAttribute('color',colors.copyColorsArray(geometry.colors));
if(geometry.lineDistances&&geometry.lineDistances.length===geometry.vertices.length){
var lineDistances=new Float32Attribute(geometry.lineDistances.length,1);
this.addAttribute('lineDistance',lineDistances.copyArray(geometry.lineDistances));
}
if(geometry.boundingSphere!==null){
this.boundingSphere=geometry.boundingSphere.clone();
}
if(geometry.boundingBox!==null){
this.boundingBox=geometry.boundingBox.clone();
}
}else if(object&&object.isMesh){
if(geometry&&geometry.isGeometry){
this.fromGeometry(geometry);
}
}
return this;
},
updateFromObject:function updateFromObject(object){
var geometry=object.geometry;
if(object&&object.isMesh){
var direct=geometry.__directGeometry;
if(geometry.elementsNeedUpdate===true){
direct=undefined;
geometry.elementsNeedUpdate=false;
}
if(direct===undefined){
return this.fromGeometry(geometry);
}
direct.verticesNeedUpdate=geometry.verticesNeedUpdate;
direct.normalsNeedUpdate=geometry.normalsNeedUpdate;
direct.colorsNeedUpdate=geometry.colorsNeedUpdate;
direct.uvsNeedUpdate=geometry.uvsNeedUpdate;
direct.groupsNeedUpdate=geometry.groupsNeedUpdate;
geometry.verticesNeedUpdate=false;
geometry.normalsNeedUpdate=false;
geometry.colorsNeedUpdate=false;
geometry.uvsNeedUpdate=false;
geometry.groupsNeedUpdate=false;
geometry=direct;
}
var attribute;
if(geometry.verticesNeedUpdate===true){
attribute=this.attributes.position;
if(attribute!==undefined){
attribute.copyVector3sArray(geometry.vertices);
attribute.needsUpdate=true;
}
geometry.verticesNeedUpdate=false;
}
if(geometry.normalsNeedUpdate===true){
attribute=this.attributes.normal;
if(attribute!==undefined){
attribute.copyVector3sArray(geometry.normals);
attribute.needsUpdate=true;
}
geometry.normalsNeedUpdate=false;
}
if(geometry.colorsNeedUpdate===true){
attribute=this.attributes.color;
if(attribute!==undefined){
attribute.copyColorsArray(geometry.colors);
attribute.needsUpdate=true;
}
geometry.colorsNeedUpdate=false;
}
if(geometry.uvsNeedUpdate){
attribute=this.attributes.uv;
if(attribute!==undefined){
attribute.copyVector2sArray(geometry.uvs);
attribute.needsUpdate=true;
}
geometry.uvsNeedUpdate=false;
}
if(geometry.lineDistancesNeedUpdate){
attribute=this.attributes.lineDistance;
if(attribute!==undefined){
attribute.copyArray(geometry.lineDistances);
attribute.needsUpdate=true;
}
geometry.lineDistancesNeedUpdate=false;
}
if(geometry.groupsNeedUpdate){
geometry.computeGroups(object.geometry);
this.groups=geometry.groups;
geometry.groupsNeedUpdate=false;
}
return this;
},
fromGeometry:function fromGeometry(geometry){
geometry.__directGeometry=new DirectGeometry().fromGeometry(geometry);
return this.fromDirectGeometry(geometry.__directGeometry);
},
fromDirectGeometry:function fromDirectGeometry(geometry){
var positions=new Float32Array(geometry.vertices.length*3);
this.addAttribute('position',new BufferAttribute(positions,3).copyVector3sArray(geometry.vertices));
if(geometry.normals.length>0){
var normals=new Float32Array(geometry.normals.length*3);
this.addAttribute('normal',new BufferAttribute(normals,3).copyVector3sArray(geometry.normals));
}
if(geometry.colors.length>0){
var colors=new Float32Array(geometry.colors.length*3);
this.addAttribute('color',new BufferAttribute(colors,3).copyColorsArray(geometry.colors));
}
if(geometry.uvs.length>0){
var uvs=new Float32Array(geometry.uvs.length*2);
this.addAttribute('uv',new BufferAttribute(uvs,2).copyVector2sArray(geometry.uvs));
}
if(geometry.uvs2.length>0){
var uvs2=new Float32Array(geometry.uvs2.length*2);
this.addAttribute('uv2',new BufferAttribute(uvs2,2).copyVector2sArray(geometry.uvs2));
}
if(geometry.indices.length>0){
var TypeArray=geometry.vertices.length>65535?Uint32Array:Uint16Array;
var indices=new TypeArray(geometry.indices.length*3);
this.setIndex(new BufferAttribute(indices,1).copyIndicesArray(geometry.indices));
}
this.groups=geometry.groups;
for(var name in geometry.morphTargets){
var array=[];
var morphTargets=geometry.morphTargets[name];
for(var i=0,l=morphTargets.length;i<l;i++){
var morphTarget=morphTargets[i];
var attribute=new Float32Attribute(morphTarget.length*3,3);
array.push(attribute.copyVector3sArray(morphTarget));
}
this.morphAttributes[name]=array;
}
if(geometry.skinIndices.length>0){
var skinIndices=new Float32Attribute(geometry.skinIndices.length*4,4);
this.addAttribute('skinIndex',skinIndices.copyVector4sArray(geometry.skinIndices));
}
if(geometry.skinWeights.length>0){
var skinWeights=new Float32Attribute(geometry.skinWeights.length*4,4);
this.addAttribute('skinWeight',skinWeights.copyVector4sArray(geometry.skinWeights));
}
if(geometry.boundingSphere!==null){
this.boundingSphere=geometry.boundingSphere.clone();
}
if(geometry.boundingBox!==null){
this.boundingBox=geometry.boundingBox.clone();
}
return this;
},
computeBoundingBox:function computeBoundingBox(){
if(this.boundingBox===null){
this.boundingBox=new Box3();
}
var positions=this.attributes.position.array;
if(positions!==undefined){
this.boundingBox.setFromArray(positions);
}else{
this.boundingBox.makeEmpty();
}
if(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z)){
console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this);
}
},
computeBoundingSphere:function(){
var box=new Box3();
var vector=new Vector3();
return function computeBoundingSphere(){
if(this.boundingSphere===null){
this.boundingSphere=new Sphere();
}
var positions=this.attributes.position;
if(positions){
var array=positions.array;
var center=this.boundingSphere.center;
box.setFromArray(array);
box.center(center);
var maxRadiusSq=0;
for(var i=0,il=array.length;i<il;i+=3){
vector.fromArray(array,i);
maxRadiusSq=Math.max(maxRadiusSq,center.distanceToSquared(vector));
}
this.boundingSphere.radius=Math.sqrt(maxRadiusSq);
if(isNaN(this.boundingSphere.radius)){
console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this);
}
}
};
}(),
computeFaceNormals:function computeFaceNormals(){
},
computeVertexNormals:function computeVertexNormals(){
var index=this.index;
var attributes=this.attributes;
var groups=this.groups;
if(attributes.position){
var positions=attributes.position.array;
if(attributes.normal===undefined){
this.addAttribute('normal',new BufferAttribute(new Float32Array(positions.length),3));
}else{
var array=attributes.normal.array;
for(var i=0,il=array.length;i<il;i++){
array[i]=0;
}
}
var normals=attributes.normal.array;
var vA,vB,vC,
pA=new Vector3(),
pB=new Vector3(),
pC=new Vector3(),
cb=new Vector3(),
ab=new Vector3();
if(index){
var indices=index.array;
if(groups.length===0){
this.addGroup(0,indices.length);
}
for(var j=0,jl=groups.length;j<jl;++j){
var group=groups[j];
var start=group.start;
var count=group.count;
for(var i=start,il=start+count;i<il;i+=3){
vA=indices[i+0]*3;
vB=indices[i+1]*3;
vC=indices[i+2]*3;
pA.fromArray(positions,vA);
pB.fromArray(positions,vB);
pC.fromArray(positions,vC);
cb.subVectors(pC,pB);
ab.subVectors(pA,pB);
cb.cross(ab);
normals[vA]+=cb.x;
normals[vA+1]+=cb.y;
normals[vA+2]+=cb.z;
normals[vB]+=cb.x;
normals[vB+1]+=cb.y;
normals[vB+2]+=cb.z;
normals[vC]+=cb.x;
normals[vC+1]+=cb.y;
normals[vC+2]+=cb.z;
}
}
}else{
for(var i=0,il=positions.length;i<il;i+=9){
pA.fromArray(positions,i);
pB.fromArray(positions,i+3);
pC.fromArray(positions,i+6);
cb.subVectors(pC,pB);
ab.subVectors(pA,pB);
cb.cross(ab);
normals[i]=cb.x;
normals[i+1]=cb.y;
normals[i+2]=cb.z;
normals[i+3]=cb.x;
normals[i+4]=cb.y;
normals[i+5]=cb.z;
normals[i+6]=cb.x;
normals[i+7]=cb.y;
normals[i+8]=cb.z;
}
}
this.normalizeNormals();
attributes.normal.needsUpdate=true;
}
},
merge:function merge(geometry,offset){
if((geometry&&geometry.isBufferGeometry)===false){
console.error('THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.',geometry);
return;
}
if(offset===undefined)offset=0;
var attributes=this.attributes;
for(var key in attributes){
if(geometry.attributes[key]===undefined)continue;
var attribute1=attributes[key];
var attributeArray1=attribute1.array;
var attribute2=geometry.attributes[key];
var attributeArray2=attribute2.array;
var attributeSize=attribute2.itemSize;
for(var i=0,j=attributeSize*offset;i<attributeArray2.length;i++,j++){
attributeArray1[j]=attributeArray2[i];
}
}
return this;
},
normalizeNormals:function normalizeNormals(){
var normals=this.attributes.normal.array;
var x,y,z,n;
for(var i=0,il=normals.length;i<il;i+=3){
x=normals[i];
y=normals[i+1];
z=normals[i+2];
n=1.0/Math.sqrt(x*x+y*y+z*z);
normals[i]*=n;
normals[i+1]*=n;
normals[i+2]*=n;
}
},
toNonIndexed:function toNonIndexed(){
if(this.index===null){
console.warn('THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.');
return this;
}
var geometry2=new BufferGeometry();
var indices=this.index.array;
var attributes=this.attributes;
for(var name in attributes){
var attribute=attributes[name];
var array=attribute.array;
var itemSize=attribute.itemSize;
var array2=new array.constructor(indices.length*itemSize);
var index=0,index2=0;
for(var i=0,l=indices.length;i<l;i++){
index=indices[i]*itemSize;
for(var j=0;j<itemSize;j++){
array2[index2++]=array[index++];
}
}
geometry2.addAttribute(name,new BufferAttribute(array2,itemSize));
}
return geometry2;
},
toJSON:function toJSON(){
var data={
metadata:{
version:4.4,
type:'BufferGeometry',
generator:'BufferGeometry.toJSON'}};
data.uuid=this.uuid;
data.type=this.type;
if(this.name!=='')data.name=this.name;
if(this.parameters!==undefined){
var parameters=this.parameters;
for(var key in parameters){
if(parameters[key]!==undefined)data[key]=parameters[key];
}
return data;
}
data.data={attributes:{}};
var index=this.index;
if(index!==null){
var array=Array.prototype.slice.call(index.array);
data.data.index={
type:index.array.constructor.name,
array:array};
}
var attributes=this.attributes;
for(var key in attributes){
var attribute=attributes[key];
var array=Array.prototype.slice.call(attribute.array);
data.data.attributes[key]={
itemSize:attribute.itemSize,
type:attribute.array.constructor.name,
array:array,
normalized:attribute.normalized};
}
var groups=this.groups;
if(groups.length>0){
data.data.groups=JSON.parse(JSON.stringify(groups));
}
var boundingSphere=this.boundingSphere;
if(boundingSphere!==null){
data.data.boundingSphere={
center:boundingSphere.center.toArray(),
radius:boundingSphere.radius};
}
return data;
},
clone:function clone(){
return new BufferGeometry().copy(this);
},
copy:function copy(source){
var index=source.index;
if(index!==null){
this.setIndex(index.clone());
}
var attributes=source.attributes;
for(var name in attributes){
var attribute=attributes[name];
this.addAttribute(name,attribute.clone());
}
var groups=source.groups;
for(var i=0,l=groups.length;i<l;i++){
var group=groups[i];
this.addGroup(group.start,group.count,group.materialIndex);
}
return this;
},
dispose:function dispose(){
this.dispatchEvent({type:'dispose'});
}});
BufferGeometry.MaxIndex=65535;
function WebGLGeometries(gl,properties,info){
var geometries={};
function onGeometryDispose(event){
var geometry=event.target;
var buffergeometry=geometries[geometry.id];
if(buffergeometry.index!==null){
deleteAttribute(buffergeometry.index);
}
deleteAttributes(buffergeometry.attributes);
geometry.removeEventListener('dispose',onGeometryDispose);
delete geometries[geometry.id];
var property=properties.get(geometry);
if(property.wireframe){
deleteAttribute(property.wireframe);
}
properties.delete(geometry);
var bufferproperty=properties.get(buffergeometry);
if(bufferproperty.wireframe){
deleteAttribute(bufferproperty.wireframe);
}
properties.delete(buffergeometry);
info.memory.geometries--;
}
function getAttributeBuffer(attribute){
if(attribute.isInterleavedBufferAttribute){
return properties.get(attribute.data).__webglBuffer;
}
return properties.get(attribute).__webglBuffer;
}
function deleteAttribute(attribute){
var buffer=getAttributeBuffer(attribute);
if(buffer!==undefined){
gl.deleteBuffer(buffer);
removeAttributeBuffer(attribute);
}
}
function deleteAttributes(attributes){
for(var name in attributes){
deleteAttribute(attributes[name]);
}
}
function removeAttributeBuffer(attribute){
if(attribute.isInterleavedBufferAttribute){
properties.delete(attribute.data);
}else{
properties.delete(attribute);
}
}
return{
get:function get(object){
var geometry=object.geometry;
if(geometries[geometry.id]!==undefined){
return geometries[geometry.id];
}
geometry.addEventListener('dispose',onGeometryDispose);
var buffergeometry;
if(geometry.isBufferGeometry){
buffergeometry=geometry;
}else if(geometry.isGeometry){
if(geometry._bufferGeometry===undefined){
geometry._bufferGeometry=new BufferGeometry().setFromObject(object);
}
buffergeometry=geometry._bufferGeometry;
}
geometries[geometry.id]=buffergeometry;
info.memory.geometries++;
return buffergeometry;
}};
}
function WebGLObjects(gl,properties,info){
var geometries=new WebGLGeometries(gl,properties,info);
function update(object){
var geometry=geometries.get(object);
if(object.geometry.isGeometry){
geometry.updateFromObject(object);
}
var index=geometry.index;
var attributes=geometry.attributes;
if(index!==null){
updateAttribute(index,gl.ELEMENT_ARRAY_BUFFER);
}
for(var name in attributes){
updateAttribute(attributes[name],gl.ARRAY_BUFFER);
}
var morphAttributes=geometry.morphAttributes;
for(var name in morphAttributes){
var array=morphAttributes[name];
for(var i=0,l=array.length;i<l;i++){
updateAttribute(array[i],gl.ARRAY_BUFFER);
}
}
return geometry;
}
function updateAttribute(attribute,bufferType){
var data=attribute.isInterleavedBufferAttribute?attribute.data:attribute;
var attributeProperties=properties.get(data);
if(attributeProperties.__webglBuffer===undefined){
createBuffer(attributeProperties,data,bufferType);
}else if(attributeProperties.version!==data.version){
updateBuffer(attributeProperties,data,bufferType);
}
}
function createBuffer(attributeProperties,data,bufferType){
attributeProperties.__webglBuffer=gl.createBuffer();
gl.bindBuffer(bufferType,attributeProperties.__webglBuffer);
var usage=data.dynamic?gl.DYNAMIC_DRAW:gl.STATIC_DRAW;
gl.bufferData(bufferType,data.array,usage);
attributeProperties.version=data.version;
}
function updateBuffer(attributeProperties,data,bufferType){
gl.bindBuffer(bufferType,attributeProperties.__webglBuffer);
if(data.dynamic===false||data.updateRange.count===-1){
gl.bufferSubData(bufferType,0,data.array);
}else if(data.updateRange.count===0){
console.error('THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.');
}else{
gl.bufferSubData(bufferType,data.updateRange.offset*data.array.BYTES_PER_ELEMENT,
data.array.subarray(data.updateRange.offset,data.updateRange.offset+data.updateRange.count));
data.updateRange.count=0;
}
attributeProperties.version=data.version;
}
function getAttributeBuffer(attribute){
if(attribute.isInterleavedBufferAttribute){
return properties.get(attribute.data).__webglBuffer;
}
return properties.get(attribute).__webglBuffer;
}
function getWireframeAttribute(geometry){
var property=properties.get(geometry);
if(property.wireframe!==undefined){
return property.wireframe;
}
var indices=[];
var index=geometry.index;
var attributes=geometry.attributes;
var position=attributes.position;
if(index!==null){
var edges={};
var array=index.array;
for(var i=0,l=array.length;i<l;i+=3){
var a=array[i+0];
var b=array[i+1];
var c=array[i+2];
if(checkEdge(edges,a,b))indices.push(a,b);
if(checkEdge(edges,b,c))indices.push(b,c);
if(checkEdge(edges,c,a))indices.push(c,a);
}
}else{
var array=attributes.position.array;
for(var i=0,l=array.length/3-1;i<l;i+=3){
var a=i+0;
var b=i+1;
var c=i+2;
indices.push(a,b,b,c,c,a);
}
}
var TypeArray=position.count>65535?Uint32Array:Uint16Array;
var attribute=new BufferAttribute(new TypeArray(indices),1);
updateAttribute(attribute,gl.ELEMENT_ARRAY_BUFFER);
property.wireframe=attribute;
return attribute;
}
function checkEdge(edges,a,b){
if(a>b){
var tmp=a;
a=b;
b=tmp;
}
var list=edges[a];
if(list===undefined){
edges[a]=[b];
return true;
}else if(list.indexOf(b)===-1){
list.push(b);
return true;
}
return false;
}
return{
getAttributeBuffer:getAttributeBuffer,
getWireframeAttribute:getWireframeAttribute,
update:update};
}
function WebGLLights(){
var lights={};
return{
get:function get(light){
if(lights[light.id]!==undefined){
return lights[light.id];
}
var uniforms;
switch(light.type){
case'DirectionalLight':
uniforms={
direction:new Vector3(),
color:new Color(),
shadow:false,
shadowBias:0,
shadowRadius:1,
shadowMapSize:new Vector2()};
break;
case'SpotLight':
uniforms={
position:new Vector3(),
direction:new Vector3(),
color:new Color(),
distance:0,
coneCos:0,
penumbraCos:0,
decay:0,
shadow:false,
shadowBias:0,
shadowRadius:1,
shadowMapSize:new Vector2()};
break;
case'PointLight':
uniforms={
position:new Vector3(),
color:new Color(),
distance:0,
decay:0,
shadow:false,
shadowBias:0,
shadowRadius:1,
shadowMapSize:new Vector2()};
break;
case'HemisphereLight':
uniforms={
direction:new Vector3(),
skyColor:new Color(),
groundColor:new Color()};
break;}
lights[light.id]=uniforms;
return uniforms;
}};
}
function WebGLCapabilities(gl,extensions,parameters){
var maxAnisotropy;
function getMaxAnisotropy(){
if(maxAnisotropy!==undefined)return maxAnisotropy;
var extension=extensions.get('EXT_texture_filter_anisotropic');
if(extension!==null){
maxAnisotropy=gl.getParameter(extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT);
}else{
maxAnisotropy=0;
}
return maxAnisotropy;
}
function getMaxPrecision(precision){
if(precision==='highp'){
if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.HIGH_FLOAT).precision>0&&
gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.HIGH_FLOAT).precision>0){
return'highp';
}
precision='mediump';
}
if(precision==='mediump'){
if(gl.getShaderPrecisionFormat(gl.VERTEX_SHADER,gl.MEDIUM_FLOAT).precision>0&&
gl.getShaderPrecisionFormat(gl.FRAGMENT_SHADER,gl.MEDIUM_FLOAT).precision>0){
return'mediump';
}
}
return'lowp';
}
var precision=parameters.precision!==undefined?parameters.precision:'highp';
var maxPrecision=getMaxPrecision(precision);
if(maxPrecision!==precision){
console.warn('THREE.WebGLRenderer:',precision,'not supported, using',maxPrecision,'instead.');
precision=maxPrecision;
}
var logarithmicDepthBuffer=parameters.logarithmicDepthBuffer===true&&!!extensions.get('EXT_frag_depth');
var maxTextures=gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);
var maxVertexTextures=gl.getParameter(gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS);
var maxTextureSize=gl.getParameter(gl.MAX_TEXTURE_SIZE);
var maxCubemapSize=gl.getParameter(gl.MAX_CUBE_MAP_TEXTURE_SIZE);
var maxAttributes=gl.getParameter(gl.MAX_VERTEX_ATTRIBS);
var maxVertexUniforms=gl.getParameter(gl.MAX_VERTEX_UNIFORM_VECTORS);
var maxVaryings=gl.getParameter(gl.MAX_VARYING_VECTORS);
var maxFragmentUniforms=gl.getParameter(gl.MAX_FRAGMENT_UNIFORM_VECTORS);
var vertexTextures=maxVertexTextures>0;
var floatFragmentTextures=!!extensions.get('OES_texture_float');
var floatVertexTextures=vertexTextures&&floatFragmentTextures;
return{
getMaxAnisotropy:getMaxAnisotropy,
getMaxPrecision:getMaxPrecision,
precision:precision,
logarithmicDepthBuffer:logarithmicDepthBuffer,
maxTextures:maxTextures,
maxVertexTextures:maxVertexTextures,
maxTextureSize:maxTextureSize,
maxCubemapSize:maxCubemapSize,
maxAttributes:maxAttributes,
maxVertexUniforms:maxVertexUniforms,
maxVaryings:maxVaryings,
maxFragmentUniforms:maxFragmentUniforms,
vertexTextures:vertexTextures,
floatFragmentTextures:floatFragmentTextures,
floatVertexTextures:floatVertexTextures};
}
function WebGLExtensions(gl){
var extensions={};
return{
get:function get(name){
if(extensions[name]!==undefined){
return extensions[name];
}
var extension;
switch(name){
case'WEBGL_depth_texture':
extension=gl.getExtension('WEBGL_depth_texture')||gl.getExtension('MOZ_WEBGL_depth_texture')||gl.getExtension('WEBKIT_WEBGL_depth_texture');
break;
case'EXT_texture_filter_anisotropic':
extension=gl.getExtension('EXT_texture_filter_anisotropic')||gl.getExtension('MOZ_EXT_texture_filter_anisotropic')||gl.getExtension('WEBKIT_EXT_texture_filter_anisotropic');
break;
case'WEBGL_compressed_texture_s3tc':
extension=gl.getExtension('WEBGL_compressed_texture_s3tc')||gl.getExtension('MOZ_WEBGL_compressed_texture_s3tc')||gl.getExtension('WEBKIT_WEBGL_compressed_texture_s3tc');
break;
case'WEBGL_compressed_texture_pvrtc':
extension=gl.getExtension('WEBGL_compressed_texture_pvrtc')||gl.getExtension('WEBKIT_WEBGL_compressed_texture_pvrtc');
break;
case'WEBGL_compressed_texture_etc1':
extension=gl.getExtension('WEBGL_compressed_texture_etc1');
break;
default:
extension=gl.getExtension(name);}
if(extension===null){
console.warn('THREE.WebGLRenderer: '+name+' extension not supported.');
}
extensions[name]=extension;
return extension;
}};
}
function WebGLIndexedBufferRenderer(gl,extensions,infoRender){
var mode;
function setMode(value){
mode=value;
}
var type,size;
function setIndex(index){
if(index.array instanceof Uint32Array&&extensions.get('OES_element_index_uint')){
type=gl.UNSIGNED_INT;
size=4;
}else{
type=gl.UNSIGNED_SHORT;
size=2;
}
}
function render(start,count){
gl.drawElements(mode,count,type,start*size);
infoRender.calls++;
infoRender.vertices+=count;
if(mode===gl.TRIANGLES)infoRender.faces+=count/3;
}
function renderInstances(geometry,start,count){
var extension=extensions.get('ANGLE_instanced_arrays');
if(extension===null){
console.error('THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
return;
}
extension.drawElementsInstancedANGLE(mode,count,type,start*size,geometry.maxInstancedCount);
infoRender.calls++;
infoRender.vertices+=count*geometry.maxInstancedCount;
if(mode===gl.TRIANGLES)infoRender.faces+=geometry.maxInstancedCount*count/3;
}
return{
setMode:setMode,
setIndex:setIndex,
render:render,
renderInstances:renderInstances};
}
function WebGLClipping(){
var scope=this,
globalState=null,
numGlobalPlanes=0,
localClippingEnabled=false,
renderingShadows=false,
plane=new Plane(),
viewNormalMatrix=new Matrix3(),
uniform={value:null,needsUpdate:false};
this.uniform=uniform;
this.numPlanes=0;
this.init=function(planes,enableLocalClipping,camera){
var enabled=
planes.length!==0||
enableLocalClipping||
numGlobalPlanes!==0||
localClippingEnabled;
localClippingEnabled=enableLocalClipping;
globalState=projectPlanes(planes,camera,0);
numGlobalPlanes=planes.length;
return enabled;
};
this.beginShadows=function(){
renderingShadows=true;
projectPlanes(null);
};
this.endShadows=function(){
renderingShadows=false;
resetGlobalState();
};
this.setState=function(planes,clipShadows,camera,cache,fromCache){
if(!localClippingEnabled||
planes===null||planes.length===0||
renderingShadows&&!clipShadows){
if(renderingShadows){
projectPlanes(null);
}else{
resetGlobalState();
}
}else{
var nGlobal=renderingShadows?0:numGlobalPlanes,
lGlobal=nGlobal*4,
dstArray=cache.clippingState||null;
uniform.value=dstArray;
dstArray=projectPlanes(planes,camera,lGlobal,fromCache);
for(var i=0;i!==lGlobal;++i){
dstArray[i]=globalState[i];
}
cache.clippingState=dstArray;
this.numPlanes+=nGlobal;
}
};
function resetGlobalState(){
if(uniform.value!==globalState){
uniform.value=globalState;
uniform.needsUpdate=numGlobalPlanes>0;
}
scope.numPlanes=numGlobalPlanes;
}
function projectPlanes(planes,camera,dstOffset,skipTransform){
var nPlanes=planes!==null?planes.length:0,
dstArray=null;
if(nPlanes!==0){
dstArray=uniform.value;
if(skipTransform!==true||dstArray===null){
var flatSize=dstOffset+nPlanes*4,
viewMatrix=camera.matrixWorldInverse;
viewNormalMatrix.getNormalMatrix(viewMatrix);
if(dstArray===null||dstArray.length<flatSize){
dstArray=new Float32Array(flatSize);
}
for(var i=0,i4=dstOffset;
i!==nPlanes;++i,i4+=4){
plane.copy(planes[i]).
applyMatrix4(viewMatrix,viewNormalMatrix);
plane.normal.toArray(dstArray,i4);
dstArray[i4+3]=plane.constant;
}
}
uniform.value=dstArray;
uniform.needsUpdate=true;
}
scope.numPlanes=nPlanes;
return dstArray;
}
}
function WebGLBufferRenderer(gl,extensions,infoRender){
var mode;
function setMode(value){
mode=value;
}
function render(start,count){
gl.drawArrays(mode,start,count);
infoRender.calls++;
infoRender.vertices+=count;
if(mode===gl.TRIANGLES)infoRender.faces+=count/3;
}
function renderInstances(geometry){
var extension=extensions.get('ANGLE_instanced_arrays');
if(extension===null){
console.error('THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
return;
}
var position=geometry.attributes.position;
var count=0;
if(position&&position.isInterleavedBufferAttribute){
count=position.data.count;
extension.drawArraysInstancedANGLE(mode,0,count,geometry.maxInstancedCount);
}else{
count=position.count;
extension.drawArraysInstancedANGLE(mode,0,count,geometry.maxInstancedCount);
}
infoRender.calls++;
infoRender.vertices+=count*geometry.maxInstancedCount;
if(mode===gl.TRIANGLES)infoRender.faces+=geometry.maxInstancedCount*count/3;
}
return{
setMode:setMode,
render:render,
renderInstances:renderInstances};
}
function WebGLRenderTargetCube(width,height,options){
WebGLRenderTarget.call(this,width,height,options);
this.activeCubeFace=0;
this.activeMipMapLevel=0;
}
WebGLRenderTargetCube.prototype=Object.create(WebGLRenderTarget.prototype);
WebGLRenderTargetCube.prototype.constructor=WebGLRenderTargetCube;
WebGLRenderTargetCube.prototype.isWebGLRenderTargetCube=true;
function BoxBufferGeometry(width,height,depth,widthSegments,heightSegments,depthSegments){
BufferGeometry.call(this);
this.type='BoxBufferGeometry';
this.parameters={
width:width,
height:height,
depth:depth,
widthSegments:widthSegments,
heightSegments:heightSegments,
depthSegments:depthSegments};
var scope=this;
widthSegments=Math.floor(widthSegments)||1;
heightSegments=Math.floor(heightSegments)||1;
depthSegments=Math.floor(depthSegments)||1;
var vertexCount=calculateVertexCount(widthSegments,heightSegments,depthSegments);
var indexCount=calculateIndexCount(widthSegments,heightSegments,depthSegments);
var indices=new(indexCount>65535?Uint32Array:Uint16Array)(indexCount);
var vertices=new Float32Array(vertexCount*3);
var normals=new Float32Array(vertexCount*3);
var uvs=new Float32Array(vertexCount*2);
var vertexBufferOffset=0;
var uvBufferOffset=0;
var indexBufferOffset=0;
var numberOfVertices=0;
var groupStart=0;
buildPlane('z','y','x',-1,-1,depth,height,width,depthSegments,heightSegments,0);
buildPlane('z','y','x',1,-1,depth,height,-width,depthSegments,heightSegments,1);
buildPlane('x','z','y',1,1,width,depth,height,widthSegments,depthSegments,2);
buildPlane('x','z','y',1,-1,width,depth,-height,widthSegments,depthSegments,3);
buildPlane('x','y','z',1,-1,width,height,depth,widthSegments,heightSegments,4);
buildPlane('x','y','z',-1,-1,width,height,-depth,widthSegments,heightSegments,5);
this.setIndex(new BufferAttribute(indices,1));
this.addAttribute('position',new BufferAttribute(vertices,3));
this.addAttribute('normal',new BufferAttribute(normals,3));
this.addAttribute('uv',new BufferAttribute(uvs,2));
function calculateVertexCount(w,h,d){
var vertices=0;
vertices+=(w+1)*(h+1)*2;
vertices+=(w+1)*(d+1)*2;
vertices+=(d+1)*(h+1)*2;
return vertices;
}
function calculateIndexCount(w,h,d){
var index=0;
index+=w*h*2;
index+=w*d*2;
index+=d*h*2;
return index*6;
}
function buildPlane(u,v,w,udir,vdir,width,height,depth,gridX,gridY,materialIndex){
var segmentWidth=width/gridX;
var segmentHeight=height/gridY;
var widthHalf=width/2;
var heightHalf=height/2;
var depthHalf=depth/2;
var gridX1=gridX+1;
var gridY1=gridY+1;
var vertexCounter=0;
var groupCount=0;
var vector=new Vector3();
for(var iy=0;iy<gridY1;iy++){
var y=iy*segmentHeight-heightHalf;
for(var ix=0;ix<gridX1;ix++){
var x=ix*segmentWidth-widthHalf;
vector[u]=x*udir;
vector[v]=y*vdir;
vector[w]=depthHalf;
vertices[vertexBufferOffset]=vector.x;
vertices[vertexBufferOffset+1]=vector.y;
vertices[vertexBufferOffset+2]=vector.z;
vector[u]=0;
vector[v]=0;
vector[w]=depth>0?1:-1;
normals[vertexBufferOffset]=vector.x;
normals[vertexBufferOffset+1]=vector.y;
normals[vertexBufferOffset+2]=vector.z;
uvs[uvBufferOffset]=ix/gridX;
uvs[uvBufferOffset+1]=1-iy/gridY;
vertexBufferOffset+=3;
uvBufferOffset+=2;
vertexCounter+=1;
}
}
for(iy=0;iy<gridY;iy++){
for(ix=0;ix<gridX;ix++){
var a=numberOfVertices+ix+gridX1*iy;
var b=numberOfVertices+ix+gridX1*(iy+1);
var c=numberOfVertices+(ix+1)+gridX1*(iy+1);
var d=numberOfVertices+(ix+1)+gridX1*iy;
indices[indexBufferOffset]=a;
indices[indexBufferOffset+1]=b;
indices[indexBufferOffset+2]=d;
indices[indexBufferOffset+3]=b;
indices[indexBufferOffset+4]=c;
indices[indexBufferOffset+5]=d;
indexBufferOffset+=6;
groupCount+=6;
}
}
scope.addGroup(groupStart,groupCount,materialIndex);
groupStart+=groupCount;
numberOfVertices+=vertexCounter;
}
}
BoxBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
BoxBufferGeometry.prototype.constructor=BoxBufferGeometry;
function Ray(origin,direction){
this.origin=origin!==undefined?origin:new Vector3();
this.direction=direction!==undefined?direction:new Vector3();
}
Ray.prototype={
constructor:Ray,
set:function set(origin,direction){
this.origin.copy(origin);
this.direction.copy(direction);
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(ray){
this.origin.copy(ray.origin);
this.direction.copy(ray.direction);
return this;
},
at:function at(t,optionalTarget){
var result=optionalTarget||new Vector3();
return result.copy(this.direction).multiplyScalar(t).add(this.origin);
},
lookAt:function lookAt(v){
this.direction.copy(v).sub(this.origin).normalize();
return this;
},
recast:function(){
var v1=new Vector3();
return function recast(t){
this.origin.copy(this.at(t,v1));
return this;
};
}(),
closestPointToPoint:function closestPointToPoint(point,optionalTarget){
var result=optionalTarget||new Vector3();
result.subVectors(point,this.origin);
var directionDistance=result.dot(this.direction);
if(directionDistance<0){
return result.copy(this.origin);
}
return result.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
},
distanceToPoint:function distanceToPoint(point){
return Math.sqrt(this.distanceSqToPoint(point));
},
distanceSqToPoint:function(){
var v1=new Vector3();
return function distanceSqToPoint(point){
var directionDistance=v1.subVectors(point,this.origin).dot(this.direction);
if(directionDistance<0){
return this.origin.distanceToSquared(point);
}
v1.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);
return v1.distanceToSquared(point);
};
}(),
distanceSqToSegment:function(){
var segCenter=new Vector3();
var segDir=new Vector3();
var diff=new Vector3();
return function distanceSqToSegment(v0,v1,optionalPointOnRay,optionalPointOnSegment){
segCenter.copy(v0).add(v1).multiplyScalar(0.5);
segDir.copy(v1).sub(v0).normalize();
diff.copy(this.origin).sub(segCenter);
var segExtent=v0.distanceTo(v1)*0.5;
var a01=-this.direction.dot(segDir);
var b0=diff.dot(this.direction);
var b1=-diff.dot(segDir);
var c=diff.lengthSq();
var det=Math.abs(1-a01*a01);
var s0,s1,sqrDist,extDet;
if(det>0){
s0=a01*b1-b0;
s1=a01*b0-b1;
extDet=segExtent*det;
if(s0>=0){
if(s1>=-extDet){
if(s1<=extDet){
var invDet=1/det;
s0*=invDet;
s1*=invDet;
sqrDist=s0*(s0+a01*s1+2*b0)+s1*(a01*s0+s1+2*b1)+c;
}else{
s1=segExtent;
s0=Math.max(0,-(a01*s1+b0));
sqrDist=-s0*s0+s1*(s1+2*b1)+c;
}
}else{
s1=-segExtent;
s0=Math.max(0,-(a01*s1+b0));
sqrDist=-s0*s0+s1*(s1+2*b1)+c;
}
}else{
if(s1<=-extDet){
s0=Math.max(0,-(-a01*segExtent+b0));
s1=s0>0?-segExtent:Math.min(Math.max(-segExtent,-b1),segExtent);
sqrDist=-s0*s0+s1*(s1+2*b1)+c;
}else if(s1<=extDet){
s0=0;
s1=Math.min(Math.max(-segExtent,-b1),segExtent);
sqrDist=s1*(s1+2*b1)+c;
}else{
s0=Math.max(0,-(a01*segExtent+b0));
s1=s0>0?segExtent:Math.min(Math.max(-segExtent,-b1),segExtent);
sqrDist=-s0*s0+s1*(s1+2*b1)+c;
}
}
}else{
s1=a01>0?-segExtent:segExtent;
s0=Math.max(0,-(a01*s1+b0));
sqrDist=-s0*s0+s1*(s1+2*b1)+c;
}
if(optionalPointOnRay){
optionalPointOnRay.copy(this.direction).multiplyScalar(s0).add(this.origin);
}
if(optionalPointOnSegment){
optionalPointOnSegment.copy(segDir).multiplyScalar(s1).add(segCenter);
}
return sqrDist;
};
}(),
intersectSphere:function(){
var v1=new Vector3();
return function intersectSphere(sphere,optionalTarget){
v1.subVectors(sphere.center,this.origin);
var tca=v1.dot(this.direction);
var d2=v1.dot(v1)-tca*tca;
var radius2=sphere.radius*sphere.radius;
if(d2>radius2)return null;
var thc=Math.sqrt(radius2-d2);
var t0=tca-thc;
var t1=tca+thc;
if(t0<0&&t1<0)return null;
if(t0<0)return this.at(t1,optionalTarget);
return this.at(t0,optionalTarget);
};
}(),
intersectsSphere:function intersectsSphere(sphere){
return this.distanceToPoint(sphere.center)<=sphere.radius;
},
distanceToPlane:function distanceToPlane(plane){
var denominator=plane.normal.dot(this.direction);
if(denominator===0){
if(plane.distanceToPoint(this.origin)===0){
return 0;
}
return null;
}
var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;
return t>=0?t:null;
},
intersectPlane:function intersectPlane(plane,optionalTarget){
var t=this.distanceToPlane(plane);
if(t===null){
return null;
}
return this.at(t,optionalTarget);
},
intersectsPlane:function intersectsPlane(plane){
var distToPoint=plane.distanceToPoint(this.origin);
if(distToPoint===0){
return true;
}
var denominator=plane.normal.dot(this.direction);
if(denominator*distToPoint<0){
return true;
}
return false;
},
intersectBox:function intersectBox(box,optionalTarget){
var tmin,tmax,tymin,tymax,tzmin,tzmax;
var invdirx=1/this.direction.x,
invdiry=1/this.direction.y,
invdirz=1/this.direction.z;
var origin=this.origin;
if(invdirx>=0){
tmin=(box.min.x-origin.x)*invdirx;
tmax=(box.max.x-origin.x)*invdirx;
}else{
tmin=(box.max.x-origin.x)*invdirx;
tmax=(box.min.x-origin.x)*invdirx;
}
if(invdiry>=0){
tymin=(box.min.y-origin.y)*invdiry;
tymax=(box.max.y-origin.y)*invdiry;
}else{
tymin=(box.max.y-origin.y)*invdiry;
tymax=(box.min.y-origin.y)*invdiry;
}
if(tmin>tymax||tymin>tmax)return null;
if(tymin>tmin||tmin!==tmin)tmin=tymin;
if(tymax<tmax||tmax!==tmax)tmax=tymax;
if(invdirz>=0){
tzmin=(box.min.z-origin.z)*invdirz;
tzmax=(box.max.z-origin.z)*invdirz;
}else{
tzmin=(box.max.z-origin.z)*invdirz;
tzmax=(box.min.z-origin.z)*invdirz;
}
if(tmin>tzmax||tzmin>tmax)return null;
if(tzmin>tmin||tmin!==tmin)tmin=tzmin;
if(tzmax<tmax||tmax!==tmax)tmax=tzmax;
if(tmax<0)return null;
return this.at(tmin>=0?tmin:tmax,optionalTarget);
},
intersectsBox:function(){
var v=new Vector3();
return function intersectsBox(box){
return this.intersectBox(box,v)!==null;
};
}(),
intersectTriangle:function(){
var diff=new Vector3();
var edge1=new Vector3();
var edge2=new Vector3();
var normal=new Vector3();
return function intersectTriangle(a,b,c,backfaceCulling,optionalTarget){
edge1.subVectors(b,a);
edge2.subVectors(c,a);
normal.crossVectors(edge1,edge2);
var DdN=this.direction.dot(normal);
var sign;
if(DdN>0){
if(backfaceCulling)return null;
sign=1;
}else if(DdN<0){
sign=-1;
DdN=-DdN;
}else{
return null;
}
diff.subVectors(this.origin,a);
var DdQxE2=sign*this.direction.dot(edge2.crossVectors(diff,edge2));
if(DdQxE2<0){
return null;
}
var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));
if(DdE1xQ<0){
return null;
}
if(DdQxE2+DdE1xQ>DdN){
return null;
}
var QdN=-sign*diff.dot(normal);
if(QdN<0){
return null;
}
return this.at(QdN/DdN,optionalTarget);
};
}(),
applyMatrix4:function applyMatrix4(matrix4){
this.direction.add(this.origin).applyMatrix4(matrix4);
this.origin.applyMatrix4(matrix4);
this.direction.sub(this.origin);
this.direction.normalize();
return this;
},
equals:function equals(ray){
return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction);
}};
function Line3(start,end){
this.start=start!==undefined?start:new Vector3();
this.end=end!==undefined?end:new Vector3();
}
Line3.prototype={
constructor:Line3,
set:function set(start,end){
this.start.copy(start);
this.end.copy(end);
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(line){
this.start.copy(line.start);
this.end.copy(line.end);
return this;
},
center:function center(optionalTarget){
var result=optionalTarget||new Vector3();
return result.addVectors(this.start,this.end).multiplyScalar(0.5);
},
delta:function delta(optionalTarget){
var result=optionalTarget||new Vector3();
return result.subVectors(this.end,this.start);
},
distanceSq:function distanceSq(){
return this.start.distanceToSquared(this.end);
},
distance:function distance(){
return this.start.distanceTo(this.end);
},
at:function at(t,optionalTarget){
var result=optionalTarget||new Vector3();
return this.delta(result).multiplyScalar(t).add(this.start);
},
closestPointToPointParameter:function(){
var startP=new Vector3();
var startEnd=new Vector3();
return function closestPointToPointParameter(point,clampToLine){
startP.subVectors(point,this.start);
startEnd.subVectors(this.end,this.start);
var startEnd2=startEnd.dot(startEnd);
var startEnd_startP=startEnd.dot(startP);
var t=startEnd_startP/startEnd2;
if(clampToLine){
t=exports.Math.clamp(t,0,1);
}
return t;
};
}(),
closestPointToPoint:function closestPointToPoint(point,clampToLine,optionalTarget){
var t=this.closestPointToPointParameter(point,clampToLine);
var result=optionalTarget||new Vector3();
return this.delta(result).multiplyScalar(t).add(this.start);
},
applyMatrix4:function applyMatrix4(matrix){
this.start.applyMatrix4(matrix);
this.end.applyMatrix4(matrix);
return this;
},
equals:function equals(line){
return line.start.equals(this.start)&&line.end.equals(this.end);
}};
function Triangle(a,b,c){
this.a=a!==undefined?a:new Vector3();
this.b=b!==undefined?b:new Vector3();
this.c=c!==undefined?c:new Vector3();
}
Triangle.normal=function(){
var v0=new Vector3();
return function normal(a,b,c,optionalTarget){
var result=optionalTarget||new Vector3();
result.subVectors(c,b);
v0.subVectors(a,b);
result.cross(v0);
var resultLengthSq=result.lengthSq();
if(resultLengthSq>0){
return result.multiplyScalar(1/Math.sqrt(resultLengthSq));
}
return result.set(0,0,0);
};
}();
Triangle.barycoordFromPoint=function(){
var v0=new Vector3();
var v1=new Vector3();
var v2=new Vector3();
return function barycoordFromPoint(point,a,b,c,optionalTarget){
v0.subVectors(c,a);
v1.subVectors(b,a);
v2.subVectors(point,a);
var dot00=v0.dot(v0);
var dot01=v0.dot(v1);
var dot02=v0.dot(v2);
var dot11=v1.dot(v1);
var dot12=v1.dot(v2);
var denom=dot00*dot11-dot01*dot01;
var result=optionalTarget||new Vector3();
if(denom===0){
return result.set(-2,-1,-1);
}
var invDenom=1/denom;
var u=(dot11*dot02-dot01*dot12)*invDenom;
var v=(dot00*dot12-dot01*dot02)*invDenom;
return result.set(1-u-v,v,u);
};
}();
Triangle.containsPoint=function(){
var v1=new Vector3();
return function containsPoint(point,a,b,c){
var result=Triangle.barycoordFromPoint(point,a,b,c,v1);
return result.x>=0&&result.y>=0&&result.x+result.y<=1;
};
}();
Triangle.prototype={
constructor:Triangle,
set:function set(a,b,c){
this.a.copy(a);
this.b.copy(b);
this.c.copy(c);
return this;
},
setFromPointsAndIndices:function setFromPointsAndIndices(points,i0,i1,i2){
this.a.copy(points[i0]);
this.b.copy(points[i1]);
this.c.copy(points[i2]);
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(triangle){
this.a.copy(triangle.a);
this.b.copy(triangle.b);
this.c.copy(triangle.c);
return this;
},
area:function(){
var v0=new Vector3();
var v1=new Vector3();
return function area(){
v0.subVectors(this.c,this.b);
v1.subVectors(this.a,this.b);
return v0.cross(v1).length()*0.5;
};
}(),
midpoint:function midpoint(optionalTarget){
var result=optionalTarget||new Vector3();
return result.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3);
},
normal:function normal(optionalTarget){
return Triangle.normal(this.a,this.b,this.c,optionalTarget);
},
plane:function plane(optionalTarget){
var result=optionalTarget||new Plane();
return result.setFromCoplanarPoints(this.a,this.b,this.c);
},
barycoordFromPoint:function barycoordFromPoint(point,optionalTarget){
return Triangle.barycoordFromPoint(point,this.a,this.b,this.c,optionalTarget);
},
containsPoint:function containsPoint(point){
return Triangle.containsPoint(point,this.a,this.b,this.c);
},
closestPointToPoint:function(){
var plane,edgeList,projectedPoint,closestPoint;
return function closestPointToPoint(point,optionalTarget){
if(plane===undefined){
plane=new Plane();
edgeList=[new Line3(),new Line3(),new Line3()];
projectedPoint=new Vector3();
closestPoint=new Vector3();
}
var result=optionalTarget||new Vector3();
var minDistance=Infinity;
plane.setFromCoplanarPoints(this.a,this.b,this.c);
plane.projectPoint(point,projectedPoint);
if(this.containsPoint(projectedPoint)===true){
result.copy(projectedPoint);
}else{
edgeList[0].set(this.a,this.b);
edgeList[1].set(this.b,this.c);
edgeList[2].set(this.c,this.a);
for(var i=0;i<edgeList.length;i++){
edgeList[i].closestPointToPoint(projectedPoint,true,closestPoint);
var distance=projectedPoint.distanceToSquared(closestPoint);
if(distance<minDistance){
minDistance=distance;
result.copy(closestPoint);
}
}
}
return result;
};
}(),
equals:function equals(triangle){
return triangle.a.equals(this.a)&&triangle.b.equals(this.b)&&triangle.c.equals(this.c);
}};
function MeshBasicMaterial(parameters){
Material.call(this);
this.type='MeshBasicMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.specularMap=null;
this.alphaMap=null;
this.envMap=null;
this.combine=MultiplyOperation;
this.reflectivity=1;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.lights=false;
this.setValues(parameters);
}
MeshBasicMaterial.prototype=Object.create(Material.prototype);
MeshBasicMaterial.prototype.constructor=MeshBasicMaterial;
MeshBasicMaterial.prototype.isMeshBasicMaterial=true;
MeshBasicMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.map=source.map;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.specularMap=source.specularMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.combine=source.combine;
this.reflectivity=source.reflectivity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
return this;
};
function Mesh(geometry,material){
Object3D.call(this);
this.type='Mesh';
this.geometry=geometry!==undefined?geometry:new BufferGeometry();
this.material=material!==undefined?material:new MeshBasicMaterial({color:Math.random()*0xffffff});
this.drawMode=TrianglesDrawMode;
this.updateMorphTargets();
}
Mesh.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Mesh,
isMesh:true,
setDrawMode:function setDrawMode(value){
this.drawMode=value;
},
copy:function copy(source){
Object3D.prototype.copy.call(this,source);
this.drawMode=source.drawMode;
return this;
},
updateMorphTargets:function updateMorphTargets(){
if(this.geometry.morphTargets!==undefined&&this.geometry.morphTargets.length>0){
this.morphTargetBase=-1;
this.morphTargetInfluences=[];
this.morphTargetDictionary={};
for(var m=0,ml=this.geometry.morphTargets.length;m<ml;m++){
this.morphTargetInfluences.push(0);
this.morphTargetDictionary[this.geometry.morphTargets[m].name]=m;
}
}
},
getMorphTargetIndexByName:function getMorphTargetIndexByName(name){
if(this.morphTargetDictionary[name]!==undefined){
return this.morphTargetDictionary[name];
}
console.warn('THREE.Mesh.getMorphTargetIndexByName: morph target '+name+' does not exist. Returning 0.');
return 0;
},
raycast:function(){
var inverseMatrix=new Matrix4();
var ray=new Ray();
var sphere=new Sphere();
var vA=new Vector3();
var vB=new Vector3();
var vC=new Vector3();
var tempA=new Vector3();
var tempB=new Vector3();
var tempC=new Vector3();
var uvA=new Vector2();
var uvB=new Vector2();
var uvC=new Vector2();
var barycoord=new Vector3();
var intersectionPoint=new Vector3();
var intersectionPointWorld=new Vector3();
function uvIntersection(point,p1,p2,p3,uv1,uv2,uv3){
Triangle.barycoordFromPoint(point,p1,p2,p3,barycoord);
uv1.multiplyScalar(barycoord.x);
uv2.multiplyScalar(barycoord.y);
uv3.multiplyScalar(barycoord.z);
uv1.add(uv2).add(uv3);
return uv1.clone();
}
function checkIntersection(object,raycaster,ray,pA,pB,pC,point){
var intersect;
var material=object.material;
if(material.side===BackSide){
intersect=ray.intersectTriangle(pC,pB,pA,true,point);
}else{
intersect=ray.intersectTriangle(pA,pB,pC,material.side!==DoubleSide,point);
}
if(intersect===null)return null;
intersectionPointWorld.copy(point);
intersectionPointWorld.applyMatrix4(object.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(intersectionPointWorld);
if(distance<raycaster.near||distance>raycaster.far)return null;
return{
distance:distance,
point:intersectionPointWorld.clone(),
object:object};
}
function checkBufferGeometryIntersection(object,raycaster,ray,positions,uvs,a,b,c){
vA.fromArray(positions,a*3);
vB.fromArray(positions,b*3);
vC.fromArray(positions,c*3);
var intersection=checkIntersection(object,raycaster,ray,vA,vB,vC,intersectionPoint);
if(intersection){
if(uvs){
uvA.fromArray(uvs,a*2);
uvB.fromArray(uvs,b*2);
uvC.fromArray(uvs,c*2);
intersection.uv=uvIntersection(intersectionPoint,vA,vB,vC,uvA,uvB,uvC);
}
intersection.face=new Face3(a,b,c,Triangle.normal(vA,vB,vC));
intersection.faceIndex=a;
}
return intersection;
}
return function raycast(raycaster,intersects){
var geometry=this.geometry;
var material=this.material;
var matrixWorld=this.matrixWorld;
if(material===undefined)return;
if(geometry.boundingSphere===null)geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere);
sphere.applyMatrix4(matrixWorld);
if(raycaster.ray.intersectsSphere(sphere)===false)return;
inverseMatrix.getInverse(matrixWorld);
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
if(geometry.boundingBox!==null){
if(ray.intersectsBox(geometry.boundingBox)===false)return;
}
var uvs,intersection;
if(geometry&&geometry.isBufferGeometry){
var a,b,c;
var index=geometry.index;
var attributes=geometry.attributes;
var positions=attributes.position.array;
if(attributes.uv!==undefined){
uvs=attributes.uv.array;
}
if(index!==null){
var indices=index.array;
for(var i=0,l=indices.length;i<l;i+=3){
a=indices[i];
b=indices[i+1];
c=indices[i+2];
intersection=checkBufferGeometryIntersection(this,raycaster,ray,positions,uvs,a,b,c);
if(intersection){
intersection.faceIndex=Math.floor(i/3);
intersects.push(intersection);
}
}
}else{
for(var i=0,l=positions.length;i<l;i+=9){
a=i/3;
b=a+1;
c=a+2;
intersection=checkBufferGeometryIntersection(this,raycaster,ray,positions,uvs,a,b,c);
if(intersection){
intersection.index=a;
intersects.push(intersection);
}
}
}
}else if(geometry&&geometry.isGeometry){
var fvA,fvB,fvC;
var isFaceMaterial=material&&material.isMultiMaterial;
var materials=isFaceMaterial===true?material.materials:null;
var vertices=geometry.vertices;
var faces=geometry.faces;
var faceVertexUvs=geometry.faceVertexUvs[0];
if(faceVertexUvs.length>0)uvs=faceVertexUvs;
for(var f=0,fl=faces.length;f<fl;f++){
var face=faces[f];
var faceMaterial=isFaceMaterial===true?materials[face.materialIndex]:material;
if(faceMaterial===undefined)continue;
fvA=vertices[face.a];
fvB=vertices[face.b];
fvC=vertices[face.c];
if(faceMaterial.morphTargets===true){
var morphTargets=geometry.morphTargets;
var morphInfluences=this.morphTargetInfluences;
vA.set(0,0,0);
vB.set(0,0,0);
vC.set(0,0,0);
for(var t=0,tl=morphTargets.length;t<tl;t++){
var influence=morphInfluences[t];
if(influence===0)continue;
var targets=morphTargets[t].vertices;
vA.addScaledVector(tempA.subVectors(targets[face.a],fvA),influence);
vB.addScaledVector(tempB.subVectors(targets[face.b],fvB),influence);
vC.addScaledVector(tempC.subVectors(targets[face.c],fvC),influence);
}
vA.add(fvA);
vB.add(fvB);
vC.add(fvC);
fvA=vA;
fvB=vB;
fvC=vC;
}
intersection=checkIntersection(this,raycaster,ray,fvA,fvB,fvC,intersectionPoint);
if(intersection){
if(uvs){
var uvs_f=uvs[f];
uvA.copy(uvs_f[0]);
uvB.copy(uvs_f[1]);
uvC.copy(uvs_f[2]);
intersection.uv=uvIntersection(intersectionPoint,fvA,fvB,fvC,uvA,uvB,uvC);
}
intersection.face=face;
intersection.faceIndex=f;
intersects.push(intersection);
}
}
}
};
}(),
clone:function clone(){
return new this.constructor(this.geometry,this.material).copy(this);
}});
function PlaneBufferGeometry(width,height,widthSegments,heightSegments){
BufferGeometry.call(this);
this.type='PlaneBufferGeometry';
this.parameters={
width:width,
height:height,
widthSegments:widthSegments,
heightSegments:heightSegments};
var width_half=width/2;
var height_half=height/2;
var gridX=Math.floor(widthSegments)||1;
var gridY=Math.floor(heightSegments)||1;
var gridX1=gridX+1;
var gridY1=gridY+1;
var segment_width=width/gridX;
var segment_height=height/gridY;
var vertices=new Float32Array(gridX1*gridY1*3);
var normals=new Float32Array(gridX1*gridY1*3);
var uvs=new Float32Array(gridX1*gridY1*2);
var offset=0;
var offset2=0;
for(var iy=0;iy<gridY1;iy++){
var y=iy*segment_height-height_half;
for(var ix=0;ix<gridX1;ix++){
var x=ix*segment_width-width_half;
vertices[offset]=x;
vertices[offset+1]=-y;
normals[offset+2]=1;
uvs[offset2]=ix/gridX;
uvs[offset2+1]=1-iy/gridY;
offset+=3;
offset2+=2;
}
}
offset=0;
var indices=new(vertices.length/3>65535?Uint32Array:Uint16Array)(gridX*gridY*6);
for(var iy=0;iy<gridY;iy++){
for(var ix=0;ix<gridX;ix++){
var a=ix+gridX1*iy;
var b=ix+gridX1*(iy+1);
var c=ix+1+gridX1*(iy+1);
var d=ix+1+gridX1*iy;
indices[offset]=a;
indices[offset+1]=b;
indices[offset+2]=d;
indices[offset+3]=b;
indices[offset+4]=c;
indices[offset+5]=d;
offset+=6;
}
}
this.setIndex(new BufferAttribute(indices,1));
this.addAttribute('position',new BufferAttribute(vertices,3));
this.addAttribute('normal',new BufferAttribute(normals,3));
this.addAttribute('uv',new BufferAttribute(uvs,2));
}
PlaneBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
PlaneBufferGeometry.prototype.constructor=PlaneBufferGeometry;
function Camera(){
Object3D.call(this);
this.type='Camera';
this.matrixWorldInverse=new Matrix4();
this.projectionMatrix=new Matrix4();
}
Camera.prototype=Object.create(Object3D.prototype);
Camera.prototype.constructor=Camera;
Camera.prototype.isCamera=true;
Camera.prototype.getWorldDirection=function(){
var quaternion=new Quaternion();
return function getWorldDirection(optionalTarget){
var result=optionalTarget||new Vector3();
this.getWorldQuaternion(quaternion);
return result.set(0,0,-1).applyQuaternion(quaternion);
};
}();
Camera.prototype.lookAt=function(){
var m1=new Matrix4();
return function lookAt(vector){
m1.lookAt(this.position,vector,this.up);
this.quaternion.setFromRotationMatrix(m1);
};
}();
Camera.prototype.clone=function(){
return new this.constructor().copy(this);
};
Camera.prototype.copy=function(source){
Object3D.prototype.copy.call(this,source);
this.matrixWorldInverse.copy(source.matrixWorldInverse);
this.projectionMatrix.copy(source.projectionMatrix);
return this;
};
function PerspectiveCamera(fov,aspect,near,far){
Camera.call(this);
this.type='PerspectiveCamera';
this.fov=fov!==undefined?fov:50;
this.zoom=1;
this.near=near!==undefined?near:0.1;
this.far=far!==undefined?far:2000;
this.focus=10;
this.aspect=aspect!==undefined?aspect:1;
this.view=null;
this.filmGauge=35;
this.filmOffset=0;
this.updateProjectionMatrix();
}
PerspectiveCamera.prototype=babelHelpers.extends(Object.create(Camera.prototype),{
constructor:PerspectiveCamera,
isPerspectiveCamera:true,
copy:function copy(source){
Camera.prototype.copy.call(this,source);
this.fov=source.fov;
this.zoom=source.zoom;
this.near=source.near;
this.far=source.far;
this.focus=source.focus;
this.aspect=source.aspect;
this.view=source.view===null?null:babelHelpers.extends({},source.view);
this.filmGauge=source.filmGauge;
this.filmOffset=source.filmOffset;
return this;
},
setFocalLength:function setFocalLength(focalLength){
var vExtentSlope=0.5*this.getFilmHeight()/focalLength;
this.fov=exports.Math.RAD2DEG*2*Math.atan(vExtentSlope);
this.updateProjectionMatrix();
},
getFocalLength:function getFocalLength(){
var vExtentSlope=Math.tan(exports.Math.DEG2RAD*0.5*this.fov);
return 0.5*this.getFilmHeight()/vExtentSlope;
},
getEffectiveFOV:function getEffectiveFOV(){
return exports.Math.RAD2DEG*2*Math.atan(
Math.tan(exports.Math.DEG2RAD*0.5*this.fov)/this.zoom);
},
getFilmWidth:function getFilmWidth(){
return this.filmGauge*Math.min(this.aspect,1);
},
getFilmHeight:function getFilmHeight(){
return this.filmGauge/Math.max(this.aspect,1);
},
setViewOffset:function setViewOffset(fullWidth,fullHeight,x,y,width,height){
this.aspect=fullWidth/fullHeight;
this.view={
fullWidth:fullWidth,
fullHeight:fullHeight,
offsetX:x,
offsetY:y,
width:width,
height:height};
this.updateProjectionMatrix();
},
clearViewOffset:function clearViewOffset(){
this.view=null;
this.updateProjectionMatrix();
},
updateProjectionMatrix:function updateProjectionMatrix(){
var near=this.near,
top=near*Math.tan(
exports.Math.DEG2RAD*0.5*this.fov)/this.zoom,
height=2*top,
width=this.aspect*height,
left=-0.5*width,
view=this.view;
if(view!==null){
var fullWidth=view.fullWidth,
fullHeight=view.fullHeight;
left+=view.offsetX*width/fullWidth;
top-=view.offsetY*height/fullHeight;
width*=view.width/fullWidth;
height*=view.height/fullHeight;
}
var skew=this.filmOffset;
if(skew!==0)left+=near*skew/this.getFilmWidth();
this.projectionMatrix.makeFrustum(
left,left+width,top-height,top,near,this.far);
},
toJSON:function toJSON(meta){
var data=Object3D.prototype.toJSON.call(this,meta);
data.object.fov=this.fov;
data.object.zoom=this.zoom;
data.object.near=this.near;
data.object.far=this.far;
data.object.focus=this.focus;
data.object.aspect=this.aspect;
if(this.view!==null)data.object.view=babelHelpers.extends({},this.view);
data.object.filmGauge=this.filmGauge;
data.object.filmOffset=this.filmOffset;
return data;
}});
function OrthographicCamera(left,right,top,bottom,near,far){
Camera.call(this);
this.type='OrthographicCamera';
this.zoom=1;
this.view=null;
this.left=left;
this.right=right;
this.top=top;
this.bottom=bottom;
this.near=near!==undefined?near:0.1;
this.far=far!==undefined?far:2000;
this.updateProjectionMatrix();
}
OrthographicCamera.prototype=babelHelpers.extends(Object.create(Camera.prototype),{
constructor:OrthographicCamera,
isOrthographicCamera:true,
copy:function copy(source){
Camera.prototype.copy.call(this,source);
this.left=source.left;
this.right=source.right;
this.top=source.top;
this.bottom=source.bottom;
this.near=source.near;
this.far=source.far;
this.zoom=source.zoom;
this.view=source.view===null?null:babelHelpers.extends({},source.view);
return this;
},
setViewOffset:function setViewOffset(fullWidth,fullHeight,x,y,width,height){
this.view={
fullWidth:fullWidth,
fullHeight:fullHeight,
offsetX:x,
offsetY:y,
width:width,
height:height};
this.updateProjectionMatrix();
},
clearViewOffset:function clearViewOffset(){
this.view=null;
this.updateProjectionMatrix();
},
updateProjectionMatrix:function updateProjectionMatrix(){
var dx=(this.right-this.left)/(2*this.zoom);
var dy=(this.top-this.bottom)/(2*this.zoom);
var cx=(this.right+this.left)/2;
var cy=(this.top+this.bottom)/2;
var left=cx-dx;
var right=cx+dx;
var top=cy+dy;
var bottom=cy-dy;
if(this.view!==null){
var zoomW=this.zoom/(this.view.width/this.view.fullWidth);
var zoomH=this.zoom/(this.view.height/this.view.fullHeight);
var scaleW=(this.right-this.left)/this.view.width;
var scaleH=(this.top-this.bottom)/this.view.height;
left+=scaleW*(this.view.offsetX/zoomW);
right=left+scaleW*(this.view.width/zoomW);
top-=scaleH*(this.view.offsetY/zoomH);
bottom=top-scaleH*(this.view.height/zoomH);
}
this.projectionMatrix.makeOrthographic(left,right,top,bottom,this.near,this.far);
},
toJSON:function toJSON(meta){
var data=Object3D.prototype.toJSON.call(this,meta);
data.object.zoom=this.zoom;
data.object.left=this.left;
data.object.right=this.right;
data.object.top=this.top;
data.object.bottom=this.bottom;
data.object.near=this.near;
data.object.far=this.far;
if(this.view!==null)data.object.view=babelHelpers.extends({},this.view);
return data;
}});
function WebGLRenderer(parameters){
console.log('THREE.WebGLRenderer',REVISION);
parameters=parameters||{};
var _canvas=parameters.canvas!==undefined?parameters.canvas:document.createElementNS('http://www.w3.org/1999/xhtml','canvas'),
_context=parameters.context!==undefined?parameters.context:null,
_alpha=parameters.alpha!==undefined?parameters.alpha:false,
_depth=parameters.depth!==undefined?parameters.depth:true,
_stencil=parameters.stencil!==undefined?parameters.stencil:true,
_antialias=parameters.antialias!==undefined?parameters.antialias:false,
_premultipliedAlpha=parameters.premultipliedAlpha!==undefined?parameters.premultipliedAlpha:true,
_preserveDrawingBuffer=parameters.preserveDrawingBuffer!==undefined?parameters.preserveDrawingBuffer:false;
var lights=[];
var opaqueObjects=[];
var opaqueObjectsLastIndex=-1;
var transparentObjects=[];
var transparentObjectsLastIndex=-1;
var morphInfluences=new Float32Array(8);
var sprites=[];
var lensFlares=[];
this.domElement=_canvas;
this.context=null;
this.autoClear=true;
this.autoClearColor=true;
this.autoClearDepth=true;
this.autoClearStencil=true;
this.sortObjects=true;
this.clippingPlanes=[];
this.localClippingEnabled=false;
this.gammaFactor=2.0;
this.gammaInput=false;
this.gammaOutput=false;
this.physicallyCorrectLights=false;
this.toneMapping=LinearToneMapping;
this.toneMappingExposure=1.0;
this.toneMappingWhitePoint=1.0;
this.maxMorphTargets=8;
this.maxMorphNormals=4;
var _this=this,
_currentProgram=null,
_currentRenderTarget=null,
_currentFramebuffer=null,
_currentMaterialId=-1,
_currentGeometryProgram='',
_currentCamera=null,
_currentScissor=new Vector4(),
_currentScissorTest=null,
_currentViewport=new Vector4(),
_usedTextureUnits=0,
_clearColor=new Color(0x000000),
_clearAlpha=0,
_width=_canvas.width,
_height=_canvas.height,
_pixelRatio=1,
_scissor=new Vector4(0,0,_width,_height),
_scissorTest=false,
_viewport=new Vector4(0,0,_width,_height),
_frustum=new Frustum(),
_clipping=new WebGLClipping(),
_clippingEnabled=false,
_localClippingEnabled=false,
_sphere=new Sphere(),
_projScreenMatrix=new Matrix4(),
_vector3=new Vector3(),
_lights={
hash:'',
ambient:[0,0,0],
directional:[],
directionalShadowMap:[],
directionalShadowMatrix:[],
spot:[],
spotShadowMap:[],
spotShadowMatrix:[],
point:[],
pointShadowMap:[],
pointShadowMatrix:[],
hemi:[],
shadows:[]},
_infoRender={
calls:0,
vertices:0,
faces:0,
points:0};
this.info={
render:_infoRender,
memory:{
geometries:0,
textures:0},
programs:null};
var _gl;
try{
var attributes={
alpha:_alpha,
depth:_depth,
stencil:_stencil,
antialias:_antialias,
premultipliedAlpha:_premultipliedAlpha,
preserveDrawingBuffer:_preserveDrawingBuffer};
_gl=_context||_canvas.getContext('webgl',attributes)||_canvas.getContext('experimental-webgl',attributes);
if(_gl===null){
if(_canvas.getContext('webgl')!==null){
throw'Error creating WebGL context with your selected attributes.';
}else{
throw'Error creating WebGL context.';
}
}
if(_gl.getShaderPrecisionFormat===undefined){
_gl.getShaderPrecisionFormat=function(){
return{'rangeMin':1,'rangeMax':1,'precision':1};
};
}
_canvas.addEventListener('webglcontextlost',onContextLost,false);
}catch(error){
console.error('THREE.WebGLRenderer: '+error);
}
var extensions=new WebGLExtensions(_gl);
extensions.get('WEBGL_depth_texture');
extensions.get('OES_texture_float');
extensions.get('OES_texture_float_linear');
extensions.get('OES_texture_half_float');
extensions.get('OES_texture_half_float_linear');
extensions.get('OES_standard_derivatives');
extensions.get('ANGLE_instanced_arrays');
if(extensions.get('OES_element_index_uint')){
BufferGeometry.MaxIndex=4294967296;
}
var capabilities=new WebGLCapabilities(_gl,extensions,parameters);
var state=new WebGLState(_gl,extensions,paramThreeToGL);
var properties=new WebGLProperties();
var textures=new WebGLTextures(_gl,extensions,state,properties,capabilities,paramThreeToGL,this.info);
var objects=new WebGLObjects(_gl,properties,this.info);
var programCache=new WebGLPrograms(this,capabilities);
var lightCache=new WebGLLights();
this.info.programs=programCache.programs;
var bufferRenderer=new WebGLBufferRenderer(_gl,extensions,_infoRender);
var indexedBufferRenderer=new WebGLIndexedBufferRenderer(_gl,extensions,_infoRender);
var backgroundCamera=new OrthographicCamera(-1,1,1,-1,0,1);
var backgroundCamera2=new PerspectiveCamera();
var backgroundPlaneMesh=new Mesh(
new PlaneBufferGeometry(2,2),
new MeshBasicMaterial({depthTest:false,depthWrite:false,fog:false}));
var backgroundBoxShader=ShaderLib['cube'];
var backgroundBoxMesh=new Mesh(
new BoxBufferGeometry(5,5,5),
new ShaderMaterial({
uniforms:backgroundBoxShader.uniforms,
vertexShader:backgroundBoxShader.vertexShader,
fragmentShader:backgroundBoxShader.fragmentShader,
side:BackSide,
depthTest:false,
depthWrite:false,
fog:false}));
function getTargetPixelRatio(){
return _currentRenderTarget===null?_pixelRatio:1;
}
function glClearColor(r,g,b,a){
if(_premultipliedAlpha===true){
r*=a;g*=a;b*=a;
}
state.clearColor(r,g,b,a);
}
function setDefaultGLState(){
state.init();
state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));
state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));
glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha);
}
function resetGLState(){
_currentProgram=null;
_currentCamera=null;
_currentGeometryProgram='';
_currentMaterialId=-1;
state.reset();
}
setDefaultGLState();
this.context=_gl;
this.capabilities=capabilities;
this.extensions=extensions;
this.properties=properties;
this.state=state;
var shadowMap=new WebGLShadowMap(this,_lights,objects,capabilities);
this.shadowMap=shadowMap;
var spritePlugin=new SpritePlugin(this,sprites);
var lensFlarePlugin=new LensFlarePlugin(this,lensFlares);
this.getContext=function(){
return _gl;
};
this.getContextAttributes=function(){
return _gl.getContextAttributes();
};
this.forceContextLoss=function(){
extensions.get('WEBGL_lose_context').loseContext();
};
this.getMaxAnisotropy=function(){
return capabilities.getMaxAnisotropy();
};
this.getPrecision=function(){
return capabilities.precision;
};
this.getPixelRatio=function(){
return _pixelRatio;
};
this.setPixelRatio=function(value){
if(value===undefined)return;
_pixelRatio=value;
this.setSize(_viewport.z,_viewport.w,false);
};
this.getSize=function(){
return{
width:_width,
height:_height};
};
this.setSize=function(width,height,updateStyle){
_width=width;
_height=height;
_canvas.width=width*_pixelRatio;
_canvas.height=height*_pixelRatio;
if(updateStyle!==false){
_canvas.style.width=width+'px';
_canvas.style.height=height+'px';
}
this.setViewport(0,0,width,height);
};
this.setViewport=function(x,y,width,height){
state.viewport(_viewport.set(x,y,width,height));
};
this.setScissor=function(x,y,width,height){
state.scissor(_scissor.set(x,y,width,height));
};
this.setScissorTest=function(boolean){
state.setScissorTest(_scissorTest=boolean);
};
this.getClearColor=function(){
return _clearColor;
};
this.setClearColor=function(color,alpha){
_clearColor.set(color);
_clearAlpha=alpha!==undefined?alpha:1;
glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha);
};
this.getClearAlpha=function(){
return _clearAlpha;
};
this.setClearAlpha=function(alpha){
_clearAlpha=alpha;
glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha);
};
this.clear=function(color,depth,stencil){
var bits=0;
if(color===undefined||color)bits|=_gl.COLOR_BUFFER_BIT;
if(depth===undefined||depth)bits|=_gl.DEPTH_BUFFER_BIT;
if(stencil===undefined||stencil)bits|=_gl.STENCIL_BUFFER_BIT;
_gl.clear(bits);
};
this.clearColor=function(){
this.clear(true,false,false);
};
this.clearDepth=function(){
this.clear(false,true,false);
};
this.clearStencil=function(){
this.clear(false,false,true);
};
this.clearTarget=function(renderTarget,color,depth,stencil){
this.setRenderTarget(renderTarget);
this.clear(color,depth,stencil);
};
this.resetGLState=resetGLState;
this.dispose=function(){
transparentObjects=[];
transparentObjectsLastIndex=-1;
opaqueObjects=[];
opaqueObjectsLastIndex=-1;
_canvas.removeEventListener('webglcontextlost',onContextLost,false);
};
function onContextLost(event){
event.preventDefault();
resetGLState();
setDefaultGLState();
properties.clear();
}
function onMaterialDispose(event){
var material=event.target;
material.removeEventListener('dispose',onMaterialDispose);
deallocateMaterial(material);
}
function deallocateMaterial(material){
releaseMaterialProgramReference(material);
properties.delete(material);
}
function releaseMaterialProgramReference(material){
var programInfo=properties.get(material).program;
material.program=undefined;
if(programInfo!==undefined){
programCache.releaseProgram(programInfo);
}
}
this.renderBufferImmediate=function(object,program,material){
state.initAttributes();
var buffers=properties.get(object);
if(object.hasPositions&&!buffers.position)buffers.position=_gl.createBuffer();
if(object.hasNormals&&!buffers.normal)buffers.normal=_gl.createBuffer();
if(object.hasUvs&&!buffers.uv)buffers.uv=_gl.createBuffer();
if(object.hasColors&&!buffers.color)buffers.color=_gl.createBuffer();
var attributes=program.getAttributes();
if(object.hasPositions){
_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.position);
_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW);
state.enableAttribute(attributes.position);
_gl.vertexAttribPointer(attributes.position,3,_gl.FLOAT,false,0,0);
}
if(object.hasNormals){
_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.normal);
if(!material.isMeshPhongMaterial&&
!material.isMeshStandardMaterial&&
material.shading===FlatShading){
for(var i=0,l=object.count*3;i<l;i+=9){
var array=object.normalArray;
var nx=(array[i+0]+array[i+3]+array[i+6])/3;
var ny=(array[i+1]+array[i+4]+array[i+7])/3;
var nz=(array[i+2]+array[i+5]+array[i+8])/3;
array[i+0]=nx;
array[i+1]=ny;
array[i+2]=nz;
array[i+3]=nx;
array[i+4]=ny;
array[i+5]=nz;
array[i+6]=nx;
array[i+7]=ny;
array[i+8]=nz;
}
}
_gl.bufferData(_gl.ARRAY_BUFFER,object.normalArray,_gl.DYNAMIC_DRAW);
state.enableAttribute(attributes.normal);
_gl.vertexAttribPointer(attributes.normal,3,_gl.FLOAT,false,0,0);
}
if(object.hasUvs&&material.map){
_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.uv);
_gl.bufferData(_gl.ARRAY_BUFFER,object.uvArray,_gl.DYNAMIC_DRAW);
state.enableAttribute(attributes.uv);
_gl.vertexAttribPointer(attributes.uv,2,_gl.FLOAT,false,0,0);
}
if(object.hasColors&&material.vertexColors!==NoColors){
_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.color);
_gl.bufferData(_gl.ARRAY_BUFFER,object.colorArray,_gl.DYNAMIC_DRAW);
state.enableAttribute(attributes.color);
_gl.vertexAttribPointer(attributes.color,3,_gl.FLOAT,false,0,0);
}
state.disableUnusedAttributes();
_gl.drawArrays(_gl.TRIANGLES,0,object.count);
object.count=0;
};
this.renderBufferDirect=function(camera,fog,geometry,material,object,group){
setMaterial(material);
var program=setProgram(camera,fog,material,object);
var updateBuffers=false;
var geometryProgram=geometry.id+'_'+program.id+'_'+material.wireframe;
if(geometryProgram!==_currentGeometryProgram){
_currentGeometryProgram=geometryProgram;
updateBuffers=true;
}
var morphTargetInfluences=object.morphTargetInfluences;
if(morphTargetInfluences!==undefined){
var activeInfluences=[];
for(var i=0,l=morphTargetInfluences.length;i<l;i++){
var influence=morphTargetInfluences[i];
activeInfluences.push([influence,i]);
}
activeInfluences.sort(absNumericalSort);
if(activeInfluences.length>8){
activeInfluences.length=8;
}
var morphAttributes=geometry.morphAttributes;
for(var i=0,l=activeInfluences.length;i<l;i++){
var influence=activeInfluences[i];
morphInfluences[i]=influence[0];
if(influence[0]!==0){
var index=influence[1];
if(material.morphTargets===true&&morphAttributes.position)geometry.addAttribute('morphTarget'+i,morphAttributes.position[index]);
if(material.morphNormals===true&&morphAttributes.normal)geometry.addAttribute('morphNormal'+i,morphAttributes.normal[index]);
}else{
if(material.morphTargets===true)geometry.removeAttribute('morphTarget'+i);
if(material.morphNormals===true)geometry.removeAttribute('morphNormal'+i);
}
}
program.getUniforms().setValue(
_gl,'morphTargetInfluences',morphInfluences);
updateBuffers=true;
}
var index=geometry.index;
var position=geometry.attributes.position;
if(material.wireframe===true){
index=objects.getWireframeAttribute(geometry);
}
var renderer;
if(index!==null){
renderer=indexedBufferRenderer;
renderer.setIndex(index);
}else{
renderer=bufferRenderer;
}
if(updateBuffers){
setupVertexAttributes(material,program,geometry);
if(index!==null){
_gl.bindBuffer(_gl.ELEMENT_ARRAY_BUFFER,objects.getAttributeBuffer(index));
}
}
var dataStart=0;
var dataCount=Infinity;
if(index!==null){
dataCount=index.count;
}else if(position!==undefined){
dataCount=position.count;
}
var rangeStart=geometry.drawRange.start;
var rangeCount=geometry.drawRange.count;
var groupStart=group!==null?group.start:0;
var groupCount=group!==null?group.count:Infinity;
var drawStart=Math.max(dataStart,rangeStart,groupStart);
var drawEnd=Math.min(dataStart+dataCount,rangeStart+rangeCount,groupStart+groupCount)-1;
var drawCount=Math.max(0,drawEnd-drawStart+1);
if(object.isMesh){
if(material.wireframe===true){
state.setLineWidth(material.wireframeLinewidth*getTargetPixelRatio());
renderer.setMode(_gl.LINES);
}else{
switch(object.drawMode){
case TrianglesDrawMode:
renderer.setMode(_gl.TRIANGLES);
break;
case TriangleStripDrawMode:
renderer.setMode(_gl.TRIANGLE_STRIP);
break;
case TriangleFanDrawMode:
renderer.setMode(_gl.TRIANGLE_FAN);
break;}
}
}else if(object.isLine){
var lineWidth=material.linewidth;
if(lineWidth===undefined)lineWidth=1;
state.setLineWidth(lineWidth*getTargetPixelRatio());
if(object.isLineSegments){
renderer.setMode(_gl.LINES);
}else{
renderer.setMode(_gl.LINE_STRIP);
}
}else if(object.isPoints){
renderer.setMode(_gl.POINTS);
}
if(geometry&&geometry.isInstancedBufferGeometry){
if(geometry.maxInstancedCount>0){
renderer.renderInstances(geometry,drawStart,drawCount);
}
}else{
renderer.render(drawStart,drawCount);
}
};
function setupVertexAttributes(material,program,geometry,startIndex){
var extension;
if(geometry&&geometry.isInstancedBufferGeometry){
extension=extensions.get('ANGLE_instanced_arrays');
if(extension===null){
console.error('THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');
return;
}
}
if(startIndex===undefined)startIndex=0;
state.initAttributes();
var geometryAttributes=geometry.attributes;
var programAttributes=program.getAttributes();
var materialDefaultAttributeValues=material.defaultAttributeValues;
for(var name in programAttributes){
var programAttribute=programAttributes[name];
if(programAttribute>=0){
var geometryAttribute=geometryAttributes[name];
if(geometryAttribute!==undefined){
var type=_gl.FLOAT;
var array=geometryAttribute.array;
var normalized=geometryAttribute.normalized;
if(array instanceof Float32Array){
type=_gl.FLOAT;
}else if(array instanceof Float64Array){
console.warn("Unsupported data buffer format: Float64Array");
}else if(array instanceof Uint16Array){
type=_gl.UNSIGNED_SHORT;
}else if(array instanceof Int16Array){
type=_gl.SHORT;
}else if(array instanceof Uint32Array){
type=_gl.UNSIGNED_INT;
}else if(array instanceof Int32Array){
type=_gl.INT;
}else if(array instanceof Int8Array){
type=_gl.BYTE;
}else if(array instanceof Uint8Array){
type=_gl.UNSIGNED_BYTE;
}
var size=geometryAttribute.itemSize;
var buffer=objects.getAttributeBuffer(geometryAttribute);
if(geometryAttribute&&geometryAttribute.isInterleavedBufferAttribute){
var data=geometryAttribute.data;
var stride=data.stride;
var offset=geometryAttribute.offset;
if(data&&data.isInstancedInterleavedBuffer){
state.enableAttributeAndDivisor(programAttribute,data.meshPerAttribute,extension);
if(geometry.maxInstancedCount===undefined){
geometry.maxInstancedCount=data.meshPerAttribute*data.count;
}
}else{
state.enableAttribute(programAttribute);
}
_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer);
_gl.vertexAttribPointer(programAttribute,size,type,normalized,stride*data.array.BYTES_PER_ELEMENT,(startIndex*stride+offset)*data.array.BYTES_PER_ELEMENT);
}else{
if(geometryAttribute&&geometryAttribute.isInstancedBufferAttribute){
state.enableAttributeAndDivisor(programAttribute,geometryAttribute.meshPerAttribute,extension);
if(geometry.maxInstancedCount===undefined){
geometry.maxInstancedCount=geometryAttribute.meshPerAttribute*geometryAttribute.count;
}
}else{
state.enableAttribute(programAttribute);
}
_gl.bindBuffer(_gl.ARRAY_BUFFER,buffer);
_gl.vertexAttribPointer(programAttribute,size,type,normalized,0,startIndex*size*geometryAttribute.array.BYTES_PER_ELEMENT);
}
}else if(materialDefaultAttributeValues!==undefined){
var value=materialDefaultAttributeValues[name];
if(value!==undefined){
switch(value.length){
case 2:
_gl.vertexAttrib2fv(programAttribute,value);
break;
case 3:
_gl.vertexAttrib3fv(programAttribute,value);
break;
case 4:
_gl.vertexAttrib4fv(programAttribute,value);
break;
default:
_gl.vertexAttrib1fv(programAttribute,value);}
}
}
}
}
state.disableUnusedAttributes();
}
function absNumericalSort(a,b){
return Math.abs(b[0])-Math.abs(a[0]);
}
function painterSortStable(a,b){
if(a.object.renderOrder!==b.object.renderOrder){
return a.object.renderOrder-b.object.renderOrder;
}else if(a.material.program&&b.material.program&&a.material.program!==b.material.program){
return a.material.program.id-b.material.program.id;
}else if(a.material.id!==b.material.id){
return a.material.id-b.material.id;
}else if(a.z!==b.z){
return a.z-b.z;
}else{
return a.id-b.id;
}
}
function reversePainterSortStable(a,b){
if(a.object.renderOrder!==b.object.renderOrder){
return a.object.renderOrder-b.object.renderOrder;
}if(a.z!==b.z){
return b.z-a.z;
}else{
return a.id-b.id;
}
}
this.render=function(scene,camera,renderTarget,forceClear){
if((camera&&camera.isCamera)===false){
console.error('THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.');
return;
}
var fog=scene.fog;
_currentGeometryProgram='';
_currentMaterialId=-1;
_currentCamera=null;
if(scene.autoUpdate===true)scene.updateMatrixWorld();
if(camera.parent===null)camera.updateMatrixWorld();
camera.matrixWorldInverse.getInverse(camera.matrixWorld);
_projScreenMatrix.multiplyMatrices(camera.projectionMatrix,camera.matrixWorldInverse);
_frustum.setFromMatrix(_projScreenMatrix);
lights.length=0;
opaqueObjectsLastIndex=-1;
transparentObjectsLastIndex=-1;
sprites.length=0;
lensFlares.length=0;
_localClippingEnabled=this.localClippingEnabled;
_clippingEnabled=_clipping.init(this.clippingPlanes,_localClippingEnabled,camera);
projectObject(scene,camera);
opaqueObjects.length=opaqueObjectsLastIndex+1;
transparentObjects.length=transparentObjectsLastIndex+1;
if(_this.sortObjects===true){
opaqueObjects.sort(painterSortStable);
transparentObjects.sort(reversePainterSortStable);
}
if(_clippingEnabled)_clipping.beginShadows();
setupShadows(lights);
shadowMap.render(scene,camera);
setupLights(lights,camera);
if(_clippingEnabled)_clipping.endShadows();
_infoRender.calls=0;
_infoRender.vertices=0;
_infoRender.faces=0;
_infoRender.points=0;
if(renderTarget===undefined){
renderTarget=null;
}
this.setRenderTarget(renderTarget);
var background=scene.background;
if(background===null){
glClearColor(_clearColor.r,_clearColor.g,_clearColor.b,_clearAlpha);
}else if(background&&background.isColor){
glClearColor(background.r,background.g,background.b,1);
forceClear=true;
}
if(this.autoClear||forceClear){
this.clear(this.autoClearColor,this.autoClearDepth,this.autoClearStencil);
}
if(background&&background.isCubeTexture){
backgroundCamera2.projectionMatrix.copy(camera.projectionMatrix);
backgroundCamera2.matrixWorld.extractRotation(camera.matrixWorld);
backgroundCamera2.matrixWorldInverse.getInverse(backgroundCamera2.matrixWorld);
backgroundBoxMesh.material.uniforms["tCube"].value=background;
backgroundBoxMesh.modelViewMatrix.multiplyMatrices(backgroundCamera2.matrixWorldInverse,backgroundBoxMesh.matrixWorld);
objects.update(backgroundBoxMesh);
_this.renderBufferDirect(backgroundCamera2,null,backgroundBoxMesh.geometry,backgroundBoxMesh.material,backgroundBoxMesh,null);
}else if(background&&background.isTexture){
backgroundPlaneMesh.material.map=background;
objects.update(backgroundPlaneMesh);
_this.renderBufferDirect(backgroundCamera,null,backgroundPlaneMesh.geometry,backgroundPlaneMesh.material,backgroundPlaneMesh,null);
}
if(scene.overrideMaterial){
var overrideMaterial=scene.overrideMaterial;
renderObjects(opaqueObjects,camera,fog,overrideMaterial);
renderObjects(transparentObjects,camera,fog,overrideMaterial);
}else{
state.setBlending(NoBlending);
renderObjects(opaqueObjects,camera,fog);
renderObjects(transparentObjects,camera,fog);
}
spritePlugin.render(scene,camera);
lensFlarePlugin.render(scene,camera,_currentViewport);
if(renderTarget){
textures.updateRenderTargetMipmap(renderTarget);
}
state.setDepthTest(true);
state.setDepthWrite(true);
state.setColorWrite(true);
};
function pushRenderItem(object,geometry,material,z,group){
var array,index;
if(material.transparent){
array=transparentObjects;
index=++transparentObjectsLastIndex;
}else{
array=opaqueObjects;
index=++opaqueObjectsLastIndex;
}
var renderItem=array[index];
if(renderItem!==undefined){
renderItem.id=object.id;
renderItem.object=object;
renderItem.geometry=geometry;
renderItem.material=material;
renderItem.z=_vector3.z;
renderItem.group=group;
}else{
renderItem={
id:object.id,
object:object,
geometry:geometry,
material:material,
z:_vector3.z,
group:group};
array.push(renderItem);
}
}
function isObjectViewable(object){
var geometry=object.geometry;
if(geometry.boundingSphere===null)
geometry.computeBoundingSphere();
_sphere.copy(geometry.boundingSphere).
applyMatrix4(object.matrixWorld);
return isSphereViewable(_sphere);
}
function isSpriteViewable(sprite){
_sphere.center.set(0,0,0);
_sphere.radius=0.7071067811865476;
_sphere.applyMatrix4(sprite.matrixWorld);
return isSphereViewable(_sphere);
}
function isSphereViewable(sphere){
if(!_frustum.intersectsSphere(sphere))return false;
var numPlanes=_clipping.numPlanes;
if(numPlanes===0)return true;
var planes=_this.clippingPlanes,
center=sphere.center,
negRad=-sphere.radius,
i=0;
do{
if(planes[i].distanceToPoint(center)<negRad)return false;
}while(++i!==numPlanes);
return true;
}
function projectObject(object,camera){
if(object.visible===false)return;
var visible=(object.layers.mask&camera.layers.mask)!==0;
if(visible){
if(object.isLight){
lights.push(object);
}else if(object.isSprite){
if(object.frustumCulled===false||isSpriteViewable(object)===true){
sprites.push(object);
}
}else if(object.isLensFlare){
lensFlares.push(object);
}else if(object.isImmediateRenderObject){
if(_this.sortObjects===true){
_vector3.setFromMatrixPosition(object.matrixWorld);
_vector3.applyProjection(_projScreenMatrix);
}
pushRenderItem(object,null,object.material,_vector3.z,null);
}else if(object.isMesh||object.isLine||object.isPoints){
if(object.isSkinnedMesh){
object.skeleton.update();
}
if(object.frustumCulled===false||isObjectViewable(object)===true){
var material=object.material;
if(material.visible===true){
if(_this.sortObjects===true){
_vector3.setFromMatrixPosition(object.matrixWorld);
_vector3.applyProjection(_projScreenMatrix);
}
var geometry=objects.update(object);
if(material.isMultiMaterial){
var groups=geometry.groups;
var materials=material.materials;
for(var i=0,l=groups.length;i<l;i++){
var group=groups[i];
var groupMaterial=materials[group.materialIndex];
if(groupMaterial.visible===true){
pushRenderItem(object,geometry,groupMaterial,_vector3.z,group);
}
}
}else{
pushRenderItem(object,geometry,material,_vector3.z,null);
}
}
}
}
}
var children=object.children;
for(var i=0,l=children.length;i<l;i++){
projectObject(children[i],camera);
}
}
function renderObjects(renderList,camera,fog,overrideMaterial){
for(var i=0,l=renderList.length;i<l;i++){
var renderItem=renderList[i];
var object=renderItem.object;
var geometry=renderItem.geometry;
var material=overrideMaterial===undefined?renderItem.material:overrideMaterial;
var group=renderItem.group;
object.modelViewMatrix.multiplyMatrices(camera.matrixWorldInverse,object.matrixWorld);
object.normalMatrix.getNormalMatrix(object.modelViewMatrix);
if(object.isImmediateRenderObject){
setMaterial(material);
var program=setProgram(camera,fog,material,object);
_currentGeometryProgram='';
object.render(function(object){
_this.renderBufferImmediate(object,program,material);
});
}else{
_this.renderBufferDirect(camera,fog,geometry,material,object,group);
}
}
}
function initMaterial(material,fog,object){
var materialProperties=properties.get(material);
var parameters=programCache.getParameters(
material,_lights,fog,_clipping.numPlanes,object);
var code=programCache.getProgramCode(material,parameters);
var program=materialProperties.program;
var programChange=true;
if(program===undefined){
material.addEventListener('dispose',onMaterialDispose);
}else if(program.code!==code){
releaseMaterialProgramReference(material);
}else if(parameters.shaderID!==undefined){
return;
}else{
programChange=false;
}
if(programChange){
if(parameters.shaderID){
var shader=ShaderLib[parameters.shaderID];
materialProperties.__webglShader={
name:material.type,
uniforms:exports.UniformsUtils.clone(shader.uniforms),
vertexShader:shader.vertexShader,
fragmentShader:shader.fragmentShader};
}else{
materialProperties.__webglShader={
name:material.type,
uniforms:material.uniforms,
vertexShader:material.vertexShader,
fragmentShader:material.fragmentShader};
}
material.__webglShader=materialProperties.__webglShader;
program=programCache.acquireProgram(material,parameters,code);
materialProperties.program=program;
material.program=program;
}
var attributes=program.getAttributes();
if(material.morphTargets){
material.numSupportedMorphTargets=0;
for(var i=0;i<_this.maxMorphTargets;i++){
if(attributes['morphTarget'+i]>=0){
material.numSupportedMorphTargets++;
}
}
}
if(material.morphNormals){
material.numSupportedMorphNormals=0;
for(var i=0;i<_this.maxMorphNormals;i++){
if(attributes['morphNormal'+i]>=0){
material.numSupportedMorphNormals++;
}
}
}
var uniforms=materialProperties.__webglShader.uniforms;
if(!material.isShaderMaterial&&
!material.isRawShaderMaterial|
material.clipping===true){
materialProperties.numClippingPlanes=_clipping.numPlanes;
uniforms.clippingPlanes=_clipping.uniform;
}
materialProperties.fog=fog;
materialProperties.lightsHash=_lights.hash;
if(material.lights){
uniforms.ambientLightColor.value=_lights.ambient;
uniforms.directionalLights.value=_lights.directional;
uniforms.spotLights.value=_lights.spot;
uniforms.pointLights.value=_lights.point;
uniforms.hemisphereLights.value=_lights.hemi;
uniforms.directionalShadowMap.value=_lights.directionalShadowMap;
uniforms.directionalShadowMatrix.value=_lights.directionalShadowMatrix;
uniforms.spotShadowMap.value=_lights.spotShadowMap;
uniforms.spotShadowMatrix.value=_lights.spotShadowMatrix;
uniforms.pointShadowMap.value=_lights.pointShadowMap;
uniforms.pointShadowMatrix.value=_lights.pointShadowMatrix;
}
var progUniforms=materialProperties.program.getUniforms(),
uniformsList=
WebGLUniforms.seqWithValue(progUniforms.seq,uniforms);
materialProperties.uniformsList=uniformsList;
materialProperties.dynamicUniforms=
WebGLUniforms.splitDynamic(uniformsList,uniforms);
}
function setMaterial(material){
material.side===DoubleSide?
state.disable(_gl.CULL_FACE):
state.enable(_gl.CULL_FACE);
state.setFlipSided(material.side===BackSide);
material.transparent===true?
state.setBlending(material.blending,material.blendEquation,material.blendSrc,material.blendDst,material.blendEquationAlpha,material.blendSrcAlpha,material.blendDstAlpha,material.premultipliedAlpha):
state.setBlending(NoBlending);
state.setDepthFunc(material.depthFunc);
state.setDepthTest(material.depthTest);
state.setDepthWrite(material.depthWrite);
state.setColorWrite(material.colorWrite);
state.setPolygonOffset(material.polygonOffset,material.polygonOffsetFactor,material.polygonOffsetUnits);
}
function setProgram(camera,fog,material,object){
_usedTextureUnits=0;
var materialProperties=properties.get(material);
if(_clippingEnabled){
if(_localClippingEnabled||camera!==_currentCamera){
var useCache=
camera===_currentCamera&&
material.id===_currentMaterialId;
_clipping.setState(
material.clippingPlanes,material.clipShadows,
camera,materialProperties,useCache);
}
}
if(material.needsUpdate===false){
if(materialProperties.program===undefined){
material.needsUpdate=true;
}else if(material.fog&&materialProperties.fog!==fog){
material.needsUpdate=true;
}else if(material.lights&&materialProperties.lightsHash!==_lights.hash){
material.needsUpdate=true;
}else if(materialProperties.numClippingPlanes!==undefined&&
materialProperties.numClippingPlanes!==_clipping.numPlanes){
material.needsUpdate=true;
}
}
if(material.needsUpdate){
initMaterial(material,fog,object);
material.needsUpdate=false;
}
var refreshProgram=false;
var refreshMaterial=false;
var refreshLights=false;
var program=materialProperties.program,
p_uniforms=program.getUniforms(),
m_uniforms=materialProperties.__webglShader.uniforms;
if(program.id!==_currentProgram){
_gl.useProgram(program.program);
_currentProgram=program.id;
refreshProgram=true;
refreshMaterial=true;
refreshLights=true;
}
if(material.id!==_currentMaterialId){
_currentMaterialId=material.id;
refreshMaterial=true;
}
if(refreshProgram||camera!==_currentCamera){
p_uniforms.set(_gl,camera,'projectionMatrix');
if(capabilities.logarithmicDepthBuffer){
p_uniforms.setValue(_gl,'logDepthBufFC',
2.0/(Math.log(camera.far+1.0)/Math.LN2));
}
if(camera!==_currentCamera){
_currentCamera=camera;
refreshMaterial=true;
refreshLights=true;
}
if(material.isShaderMaterial||
material.isMeshPhongMaterial||
material.isMeshStandardMaterial||
material.envMap){
var uCamPos=p_uniforms.map.cameraPosition;
if(uCamPos!==undefined){
uCamPos.setValue(_gl,
_vector3.setFromMatrixPosition(camera.matrixWorld));
}
}
if(material.isMeshPhongMaterial||
material.isMeshLambertMaterial||
material.isMeshBasicMaterial||
material.isMeshStandardMaterial||
material.isShaderMaterial||
material.skinning){
p_uniforms.setValue(_gl,'viewMatrix',camera.matrixWorldInverse);
}
p_uniforms.set(_gl,_this,'toneMappingExposure');
p_uniforms.set(_gl,_this,'toneMappingWhitePoint');
}
if(material.skinning){
p_uniforms.setOptional(_gl,object,'bindMatrix');
p_uniforms.setOptional(_gl,object,'bindMatrixInverse');
var skeleton=object.skeleton;
if(skeleton){
if(capabilities.floatVertexTextures&&skeleton.useVertexTexture){
p_uniforms.set(_gl,skeleton,'boneTexture');
p_uniforms.set(_gl,skeleton,'boneTextureWidth');
p_uniforms.set(_gl,skeleton,'boneTextureHeight');
}else{
p_uniforms.setOptional(_gl,skeleton,'boneMatrices');
}
}
}
if(refreshMaterial){
if(material.lights){
markUniformsLightsNeedsUpdate(m_uniforms,refreshLights);
}
if(fog&&material.fog){
refreshUniformsFog(m_uniforms,fog);
}
if(material.isMeshBasicMaterial||
material.isMeshLambertMaterial||
material.isMeshPhongMaterial||
material.isMeshStandardMaterial||
material.isMeshDepthMaterial){
refreshUniformsCommon(m_uniforms,material);
}
if(material.isLineBasicMaterial){
refreshUniformsLine(m_uniforms,material);
}else if(material.isLineDashedMaterial){
refreshUniformsLine(m_uniforms,material);
refreshUniformsDash(m_uniforms,material);
}else if(material.isPointsMaterial){
refreshUniformsPoints(m_uniforms,material);
}else if(material.isMeshLambertMaterial){
refreshUniformsLambert(m_uniforms,material);
}else if(material.isMeshPhongMaterial){
refreshUniformsPhong(m_uniforms,material);
}else if(material.isMeshPhysicalMaterial){
refreshUniformsPhysical(m_uniforms,material);
}else if(material.isMeshStandardMaterial){
refreshUniformsStandard(m_uniforms,material);
}else if(material.isMeshDepthMaterial){
if(material.displacementMap){
m_uniforms.displacementMap.value=material.displacementMap;
m_uniforms.displacementScale.value=material.displacementScale;
m_uniforms.displacementBias.value=material.displacementBias;
}
}else if(material.isMeshNormalMaterial){
m_uniforms.opacity.value=material.opacity;
}
WebGLUniforms.upload(
_gl,materialProperties.uniformsList,m_uniforms,_this);
}
p_uniforms.set(_gl,object,'modelViewMatrix');
p_uniforms.set(_gl,object,'normalMatrix');
p_uniforms.setValue(_gl,'modelMatrix',object.matrixWorld);
var dynUniforms=materialProperties.dynamicUniforms;
if(dynUniforms!==null){
WebGLUniforms.evalDynamic(
dynUniforms,m_uniforms,object,camera);
WebGLUniforms.upload(_gl,dynUniforms,m_uniforms,_this);
}
return program;
}
function refreshUniformsCommon(uniforms,material){
uniforms.opacity.value=material.opacity;
uniforms.diffuse.value=material.color;
if(material.emissive){
uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);
}
uniforms.map.value=material.map;
uniforms.specularMap.value=material.specularMap;
uniforms.alphaMap.value=material.alphaMap;
if(material.aoMap){
uniforms.aoMap.value=material.aoMap;
uniforms.aoMapIntensity.value=material.aoMapIntensity;
}
var uvScaleMap;
if(material.map){
uvScaleMap=material.map;
}else if(material.specularMap){
uvScaleMap=material.specularMap;
}else if(material.displacementMap){
uvScaleMap=material.displacementMap;
}else if(material.normalMap){
uvScaleMap=material.normalMap;
}else if(material.bumpMap){
uvScaleMap=material.bumpMap;
}else if(material.roughnessMap){
uvScaleMap=material.roughnessMap;
}else if(material.metalnessMap){
uvScaleMap=material.metalnessMap;
}else if(material.alphaMap){
uvScaleMap=material.alphaMap;
}else if(material.emissiveMap){
uvScaleMap=material.emissiveMap;
}
if(uvScaleMap!==undefined){
if(uvScaleMap.isWebGLRenderTarget){
uvScaleMap=uvScaleMap.texture;
}
var offset=uvScaleMap.offset;
var repeat=uvScaleMap.repeat;
uniforms.offsetRepeat.value.set(offset.x,offset.y,repeat.x,repeat.y);
}
uniforms.envMap.value=material.envMap;
uniforms.flipEnvMap.value=!(material.envMap&&material.envMap.isCubeTexture)?1:-1;
uniforms.reflectivity.value=material.reflectivity;
uniforms.refractionRatio.value=material.refractionRatio;
}
function refreshUniformsLine(uniforms,material){
uniforms.diffuse.value=material.color;
uniforms.opacity.value=material.opacity;
}
function refreshUniformsDash(uniforms,material){
uniforms.dashSize.value=material.dashSize;
uniforms.totalSize.value=material.dashSize+material.gapSize;
uniforms.scale.value=material.scale;
}
function refreshUniformsPoints(uniforms,material){
uniforms.diffuse.value=material.color;
uniforms.opacity.value=material.opacity;
uniforms.size.value=material.size*_pixelRatio;
uniforms.scale.value=_canvas.clientHeight*0.5;
uniforms.map.value=material.map;
if(material.map!==null){
var offset=material.map.offset;
var repeat=material.map.repeat;
uniforms.offsetRepeat.value.set(offset.x,offset.y,repeat.x,repeat.y);
}
}
function refreshUniformsFog(uniforms,fog){
uniforms.fogColor.value=fog.color;
if(fog.isFog){
uniforms.fogNear.value=fog.near;
uniforms.fogFar.value=fog.far;
}else if(fog.isFogExp2){
uniforms.fogDensity.value=fog.density;
}
}
function refreshUniformsLambert(uniforms,material){
if(material.lightMap){
uniforms.lightMap.value=material.lightMap;
uniforms.lightMapIntensity.value=material.lightMapIntensity;
}
if(material.emissiveMap){
uniforms.emissiveMap.value=material.emissiveMap;
}
}
function refreshUniformsPhong(uniforms,material){
uniforms.specular.value=material.specular;
uniforms.shininess.value=Math.max(material.shininess,1e-4);
if(material.lightMap){
uniforms.lightMap.value=material.lightMap;
uniforms.lightMapIntensity.value=material.lightMapIntensity;
}
if(material.emissiveMap){
uniforms.emissiveMap.value=material.emissiveMap;
}
if(material.bumpMap){
uniforms.bumpMap.value=material.bumpMap;
uniforms.bumpScale.value=material.bumpScale;
}
if(material.normalMap){
uniforms.normalMap.value=material.normalMap;
uniforms.normalScale.value.copy(material.normalScale);
}
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}
}
function refreshUniformsStandard(uniforms,material){
uniforms.roughness.value=material.roughness;
uniforms.metalness.value=material.metalness;
if(material.roughnessMap){
uniforms.roughnessMap.value=material.roughnessMap;
}
if(material.metalnessMap){
uniforms.metalnessMap.value=material.metalnessMap;
}
if(material.lightMap){
uniforms.lightMap.value=material.lightMap;
uniforms.lightMapIntensity.value=material.lightMapIntensity;
}
if(material.emissiveMap){
uniforms.emissiveMap.value=material.emissiveMap;
}
if(material.bumpMap){
uniforms.bumpMap.value=material.bumpMap;
uniforms.bumpScale.value=material.bumpScale;
}
if(material.normalMap){
uniforms.normalMap.value=material.normalMap;
uniforms.normalScale.value.copy(material.normalScale);
}
if(material.displacementMap){
uniforms.displacementMap.value=material.displacementMap;
uniforms.displacementScale.value=material.displacementScale;
uniforms.displacementBias.value=material.displacementBias;
}
if(material.envMap){
uniforms.envMapIntensity.value=material.envMapIntensity;
}
}
function refreshUniformsPhysical(uniforms,material){
uniforms.clearCoat.value=material.clearCoat;
uniforms.clearCoatRoughness.value=material.clearCoatRoughness;
refreshUniformsStandard(uniforms,material);
}
function markUniformsLightsNeedsUpdate(uniforms,value){
uniforms.ambientLightColor.needsUpdate=value;
uniforms.directionalLights.needsUpdate=value;
uniforms.pointLights.needsUpdate=value;
uniforms.spotLights.needsUpdate=value;
uniforms.hemisphereLights.needsUpdate=value;
}
function setupShadows(lights){
var lightShadowsLength=0;
for(var i=0,l=lights.length;i<l;i++){
var light=lights[i];
if(light.castShadow){
_lights.shadows[lightShadowsLength++]=light;
}
}
_lights.shadows.length=lightShadowsLength;
}
function setupLights(lights,camera){
var l,ll,light,
r=0,g=0,b=0,
color,
intensity,
distance,
shadowMap,
viewMatrix=camera.matrixWorldInverse,
directionalLength=0,
pointLength=0,
spotLength=0,
hemiLength=0;
for(l=0,ll=lights.length;l<ll;l++){
light=lights[l];
color=light.color;
intensity=light.intensity;
distance=light.distance;
shadowMap=light.shadow&&light.shadow.map?light.shadow.map.texture:null;
if(light.isAmbientLight){
r+=color.r*intensity;
g+=color.g*intensity;
b+=color.b*intensity;
}else if(light.isDirectionalLight){
var uniforms=lightCache.get(light);
uniforms.color.copy(light.color).multiplyScalar(light.intensity);
uniforms.direction.setFromMatrixPosition(light.matrixWorld);
_vector3.setFromMatrixPosition(light.target.matrixWorld);
uniforms.direction.sub(_vector3);
uniforms.direction.transformDirection(viewMatrix);
uniforms.shadow=light.castShadow;
if(light.castShadow){
uniforms.shadowBias=light.shadow.bias;
uniforms.shadowRadius=light.shadow.radius;
uniforms.shadowMapSize=light.shadow.mapSize;
}
_lights.directionalShadowMap[directionalLength]=shadowMap;
_lights.directionalShadowMatrix[directionalLength]=light.shadow.matrix;
_lights.directional[directionalLength++]=uniforms;
}else if(light.isSpotLight){
var uniforms=lightCache.get(light);
uniforms.position.setFromMatrixPosition(light.matrixWorld);
uniforms.position.applyMatrix4(viewMatrix);
uniforms.color.copy(color).multiplyScalar(intensity);
uniforms.distance=distance;
uniforms.direction.setFromMatrixPosition(light.matrixWorld);
_vector3.setFromMatrixPosition(light.target.matrixWorld);
uniforms.direction.sub(_vector3);
uniforms.direction.transformDirection(viewMatrix);
uniforms.coneCos=Math.cos(light.angle);
uniforms.penumbraCos=Math.cos(light.angle*(1-light.penumbra));
uniforms.decay=light.distance===0?0.0:light.decay;
uniforms.shadow=light.castShadow;
if(light.castShadow){
uniforms.shadowBias=light.shadow.bias;
uniforms.shadowRadius=light.shadow.radius;
uniforms.shadowMapSize=light.shadow.mapSize;
}
_lights.spotShadowMap[spotLength]=shadowMap;
_lights.spotShadowMatrix[spotLength]=light.shadow.matrix;
_lights.spot[spotLength++]=uniforms;
}else if(light.isPointLight){
var uniforms=lightCache.get(light);
uniforms.position.setFromMatrixPosition(light.matrixWorld);
uniforms.position.applyMatrix4(viewMatrix);
uniforms.color.copy(light.color).multiplyScalar(light.intensity);
uniforms.distance=light.distance;
uniforms.decay=light.distance===0?0.0:light.decay;
uniforms.shadow=light.castShadow;
if(light.castShadow){
uniforms.shadowBias=light.shadow.bias;
uniforms.shadowRadius=light.shadow.radius;
uniforms.shadowMapSize=light.shadow.mapSize;
}
_lights.pointShadowMap[pointLength]=shadowMap;
if(_lights.pointShadowMatrix[pointLength]===undefined){
_lights.pointShadowMatrix[pointLength]=new Matrix4();
}
_vector3.setFromMatrixPosition(light.matrixWorld).negate();
_lights.pointShadowMatrix[pointLength].identity().setPosition(_vector3);
_lights.point[pointLength++]=uniforms;
}else if(light.isHemisphereLight){
var uniforms=lightCache.get(light);
uniforms.direction.setFromMatrixPosition(light.matrixWorld);
uniforms.direction.transformDirection(viewMatrix);
uniforms.direction.normalize();
uniforms.skyColor.copy(light.color).multiplyScalar(intensity);
uniforms.groundColor.copy(light.groundColor).multiplyScalar(intensity);
_lights.hemi[hemiLength++]=uniforms;
}
}
_lights.ambient[0]=r;
_lights.ambient[1]=g;
_lights.ambient[2]=b;
_lights.directional.length=directionalLength;
_lights.spot.length=spotLength;
_lights.point.length=pointLength;
_lights.hemi.length=hemiLength;
_lights.hash=directionalLength+','+pointLength+','+spotLength+','+hemiLength+','+_lights.shadows.length;
}
this.setFaceCulling=function(cullFace,frontFaceDirection){
state.setCullFace(cullFace);
state.setFlipSided(frontFaceDirection===FrontFaceDirectionCW);
};
function allocTextureUnit(){
var textureUnit=_usedTextureUnits;
if(textureUnit>=capabilities.maxTextures){
console.warn('WebGLRenderer: trying to use '+textureUnit+' texture units while this GPU supports only '+capabilities.maxTextures);
}
_usedTextureUnits+=1;
return textureUnit;
}
this.allocTextureUnit=allocTextureUnit;
this.setTexture2D=function(){
var warned=false;
return function setTexture2D(texture,slot){
if(texture&&texture.isWebGLRenderTarget){
if(!warned){
console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.");
warned=true;
}
texture=texture.texture;
}
textures.setTexture2D(texture,slot);
};
}();
this.setTexture=function(){
var warned=false;
return function setTexture(texture,slot){
if(!warned){
console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.");
warned=true;
}
textures.setTexture2D(texture,slot);
};
}();
this.setTextureCube=function(){
var warned=false;
return function setTextureCube(texture,slot){
if(texture&&texture.isWebGLRenderTargetCube){
if(!warned){
console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.");
warned=true;
}
texture=texture.texture;
}
if(texture&&texture.isCubeTexture||
Array.isArray(texture.image)&&texture.image.length===6){
textures.setTextureCube(texture,slot);
}else{
textures.setTextureCubeDynamic(texture,slot);
}
};
}();
this.getCurrentRenderTarget=function(){
return _currentRenderTarget;
};
this.setRenderTarget=function(renderTarget){
_currentRenderTarget=renderTarget;
if(renderTarget&&properties.get(renderTarget).__webglFramebuffer===undefined){
textures.setupRenderTarget(renderTarget);
}
var isCube=renderTarget&&renderTarget.isWebGLRenderTargetCube;
var framebuffer;
if(renderTarget){
var renderTargetProperties=properties.get(renderTarget);
if(isCube){
framebuffer=renderTargetProperties.__webglFramebuffer[renderTarget.activeCubeFace];
}else{
framebuffer=renderTargetProperties.__webglFramebuffer;
}
_currentScissor.copy(renderTarget.scissor);
_currentScissorTest=renderTarget.scissorTest;
_currentViewport.copy(renderTarget.viewport);
}else{
framebuffer=null;
_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio);
_currentScissorTest=_scissorTest;
_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio);
}
if(_currentFramebuffer!==framebuffer){
_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);
_currentFramebuffer=framebuffer;
}
state.scissor(_currentScissor);
state.setScissorTest(_currentScissorTest);
state.viewport(_currentViewport);
if(isCube){
var textureProperties=properties.get(renderTarget.texture);
_gl.framebufferTexture2D(_gl.FRAMEBUFFER,_gl.COLOR_ATTACHMENT0,_gl.TEXTURE_CUBE_MAP_POSITIVE_X+renderTarget.activeCubeFace,textureProperties.__webglTexture,renderTarget.activeMipMapLevel);
}
};
this.readRenderTargetPixels=function(renderTarget,x,y,width,height,buffer){
if((renderTarget&&renderTarget.isWebGLRenderTarget)===false){
console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.');
return;
}
var framebuffer=properties.get(renderTarget).__webglFramebuffer;
if(framebuffer){
var restore=false;
if(framebuffer!==_currentFramebuffer){
_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);
restore=true;
}
try{
var texture=renderTarget.texture;
var textureFormat=texture.format;
var textureType=texture.type;
if(textureFormat!==RGBAFormat&&paramThreeToGL(textureFormat)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_FORMAT)){
console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.');
return;
}
if(textureType!==UnsignedByteType&&paramThreeToGL(textureType)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE)&&
!(textureType===FloatType&&(extensions.get('OES_texture_float')||extensions.get('WEBGL_color_buffer_float')))&&
!(textureType===HalfFloatType&&extensions.get('EXT_color_buffer_half_float'))){
console.error('THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.');
return;
}
if(_gl.checkFramebufferStatus(_gl.FRAMEBUFFER)===_gl.FRAMEBUFFER_COMPLETE){
if(x>=0&&x<=renderTarget.width-width&&y>=0&&y<=renderTarget.height-height){
_gl.readPixels(x,y,width,height,paramThreeToGL(textureFormat),paramThreeToGL(textureType),buffer);
}
}else{
console.error('THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.');
}
}finally{
if(restore){
_gl.bindFramebuffer(_gl.FRAMEBUFFER,_currentFramebuffer);
}
}
}
};
function paramThreeToGL(p){
var extension;
if(p===RepeatWrapping)return _gl.REPEAT;
if(p===ClampToEdgeWrapping)return _gl.CLAMP_TO_EDGE;
if(p===MirroredRepeatWrapping)return _gl.MIRRORED_REPEAT;
if(p===NearestFilter)return _gl.NEAREST;
if(p===NearestMipMapNearestFilter)return _gl.NEAREST_MIPMAP_NEAREST;
if(p===NearestMipMapLinearFilter)return _gl.NEAREST_MIPMAP_LINEAR;
if(p===LinearFilter)return _gl.LINEAR;
if(p===LinearMipMapNearestFilter)return _gl.LINEAR_MIPMAP_NEAREST;
if(p===LinearMipMapLinearFilter)return _gl.LINEAR_MIPMAP_LINEAR;
if(p===UnsignedByteType)return _gl.UNSIGNED_BYTE;
if(p===UnsignedShort4444Type)return _gl.UNSIGNED_SHORT_4_4_4_4;
if(p===UnsignedShort5551Type)return _gl.UNSIGNED_SHORT_5_5_5_1;
if(p===UnsignedShort565Type)return _gl.UNSIGNED_SHORT_5_6_5;
if(p===ByteType)return _gl.BYTE;
if(p===ShortType)return _gl.SHORT;
if(p===UnsignedShortType)return _gl.UNSIGNED_SHORT;
if(p===IntType)return _gl.INT;
if(p===UnsignedIntType)return _gl.UNSIGNED_INT;
if(p===FloatType)return _gl.FLOAT;
extension=extensions.get('OES_texture_half_float');
if(extension!==null){
if(p===HalfFloatType)return extension.HALF_FLOAT_OES;
}
if(p===AlphaFormat)return _gl.ALPHA;
if(p===RGBFormat)return _gl.RGB;
if(p===RGBAFormat)return _gl.RGBA;
if(p===LuminanceFormat)return _gl.LUMINANCE;
if(p===LuminanceAlphaFormat)return _gl.LUMINANCE_ALPHA;
if(p===DepthFormat)return _gl.DEPTH_COMPONENT;
if(p===DepthStencilFormat)return _gl.DEPTH_STENCIL;
if(p===AddEquation)return _gl.FUNC_ADD;
if(p===SubtractEquation)return _gl.FUNC_SUBTRACT;
if(p===ReverseSubtractEquation)return _gl.FUNC_REVERSE_SUBTRACT;
if(p===ZeroFactor)return _gl.ZERO;
if(p===OneFactor)return _gl.ONE;
if(p===SrcColorFactor)return _gl.SRC_COLOR;
if(p===OneMinusSrcColorFactor)return _gl.ONE_MINUS_SRC_COLOR;
if(p===SrcAlphaFactor)return _gl.SRC_ALPHA;
if(p===OneMinusSrcAlphaFactor)return _gl.ONE_MINUS_SRC_ALPHA;
if(p===DstAlphaFactor)return _gl.DST_ALPHA;
if(p===OneMinusDstAlphaFactor)return _gl.ONE_MINUS_DST_ALPHA;
if(p===DstColorFactor)return _gl.DST_COLOR;
if(p===OneMinusDstColorFactor)return _gl.ONE_MINUS_DST_COLOR;
if(p===SrcAlphaSaturateFactor)return _gl.SRC_ALPHA_SATURATE;
extension=extensions.get('WEBGL_compressed_texture_s3tc');
if(extension!==null){
if(p===RGB_S3TC_DXT1_Format)return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;
if(p===RGBA_S3TC_DXT1_Format)return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;
if(p===RGBA_S3TC_DXT3_Format)return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;
if(p===RGBA_S3TC_DXT5_Format)return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;
}
extension=extensions.get('WEBGL_compressed_texture_pvrtc');
if(extension!==null){
if(p===RGB_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
if(p===RGB_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;
if(p===RGBA_PVRTC_4BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;
if(p===RGBA_PVRTC_2BPPV1_Format)return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;
}
extension=extensions.get('WEBGL_compressed_texture_etc1');
if(extension!==null){
if(p===RGB_ETC1_Format)return extension.COMPRESSED_RGB_ETC1_WEBGL;
}
extension=extensions.get('EXT_blend_minmax');
if(extension!==null){
if(p===MinEquation)return extension.MIN_EXT;
if(p===MaxEquation)return extension.MAX_EXT;
}
extension=extensions.get('WEBGL_depth_texture');
if(extension!==null){
if(p===UnsignedInt248Type)return extension.UNSIGNED_INT_24_8_WEBGL;
}
return 0;
}
}
function FogExp2(color,density){
this.name='';
this.color=new Color(color);
this.density=density!==undefined?density:0.00025;
}
FogExp2.prototype.isFogExp2=true;
FogExp2.prototype.clone=function(){
return new FogExp2(this.color.getHex(),this.density);
};
FogExp2.prototype.toJSON=function(meta){
return{
type:'FogExp2',
color:this.color.getHex(),
density:this.density};
};
function Fog(color,near,far){
this.name='';
this.color=new Color(color);
this.near=near!==undefined?near:1;
this.far=far!==undefined?far:1000;
}
Fog.prototype.isFog=true;
Fog.prototype.clone=function(){
return new Fog(this.color.getHex(),this.near,this.far);
};
Fog.prototype.toJSON=function(meta){
return{
type:'Fog',
color:this.color.getHex(),
near:this.near,
far:this.far};
};
function Scene(){
Object3D.call(this);
this.type='Scene';
this.background=null;
this.fog=null;
this.overrideMaterial=null;
this.autoUpdate=true;
}
Scene.prototype=Object.create(Object3D.prototype);
Scene.prototype.constructor=Scene;
Scene.prototype.copy=function(source,recursive){
Object3D.prototype.copy.call(this,source,recursive);
if(source.background!==null)this.background=source.background.clone();
if(source.fog!==null)this.fog=source.fog.clone();
if(source.overrideMaterial!==null)this.overrideMaterial=source.overrideMaterial.clone();
this.autoUpdate=source.autoUpdate;
this.matrixAutoUpdate=source.matrixAutoUpdate;
return this;
};
Scene.prototype.toJSON=function(meta){
var data=Object3D.prototype.toJSON.call(this,meta);
if(this.background!==null)data.object.background=this.background.toJSON(meta);
if(this.fog!==null)data.object.fog=this.fog.toJSON();
return data;
};
function LensFlare(texture,size,distance,blending,color){
Object3D.call(this);
this.lensFlares=[];
this.positionScreen=new Vector3();
this.customUpdateCallback=undefined;
if(texture!==undefined){
this.add(texture,size,distance,blending,color);
}
}
LensFlare.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:LensFlare,
isLensFlare:true,
copy:function copy(source){
Object3D.prototype.copy.call(this,source);
this.positionScreen.copy(source.positionScreen);
this.customUpdateCallback=source.customUpdateCallback;
for(var i=0,l=source.lensFlares.length;i<l;i++){
this.lensFlares.push(source.lensFlares[i]);
}
return this;
},
add:function add(texture,size,distance,blending,color,opacity){
if(size===undefined)size=-1;
if(distance===undefined)distance=0;
if(opacity===undefined)opacity=1;
if(color===undefined)color=new Color(0xffffff);
if(blending===undefined)blending=NormalBlending;
distance=Math.min(distance,Math.max(0,distance));
this.lensFlares.push({
texture:texture,
size:size,
distance:distance,
x:0,y:0,z:0,
scale:1,
rotation:0,
opacity:opacity,
color:color,
blending:blending});
},
updateLensFlares:function updateLensFlares(){
var f,fl=this.lensFlares.length;
var flare;
var vecX=-this.positionScreen.x*2;
var vecY=-this.positionScreen.y*2;
for(f=0;f<fl;f++){
flare=this.lensFlares[f];
flare.x=this.positionScreen.x+vecX*flare.distance;
flare.y=this.positionScreen.y+vecY*flare.distance;
flare.wantedRotation=flare.x*Math.PI*0.25;
flare.rotation+=(flare.wantedRotation-flare.rotation)*0.25;
}
}});
function SpriteMaterial(parameters){
Material.call(this);
this.type='SpriteMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.rotation=0;
this.fog=false;
this.lights=false;
this.setValues(parameters);
}
SpriteMaterial.prototype=Object.create(Material.prototype);
SpriteMaterial.prototype.constructor=SpriteMaterial;
SpriteMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.map=source.map;
this.rotation=source.rotation;
return this;
};
function Sprite(material){
Object3D.call(this);
this.type='Sprite';
this.material=material!==undefined?material:new SpriteMaterial();
}
Sprite.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Sprite,
isSprite:true,
raycast:function(){
var matrixPosition=new Vector3();
return function raycast(raycaster,intersects){
matrixPosition.setFromMatrixPosition(this.matrixWorld);
var distanceSq=raycaster.ray.distanceSqToPoint(matrixPosition);
var guessSizeSq=this.scale.x*this.scale.y/4;
if(distanceSq>guessSizeSq){
return;
}
intersects.push({
distance:Math.sqrt(distanceSq),
point:this.position,
face:null,
object:this});
};
}(),
clone:function clone(){
return new this.constructor(this.material).copy(this);
}});
function LOD(){
Object3D.call(this);
this.type='LOD';
Object.defineProperties(this,{
levels:{
enumerable:true,
value:[]}});
}
LOD.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:LOD,
copy:function copy(source){
Object3D.prototype.copy.call(this,source,false);
var levels=source.levels;
for(var i=0,l=levels.length;i<l;i++){
var level=levels[i];
this.addLevel(level.object.clone(),level.distance);
}
return this;
},
addLevel:function addLevel(object,distance){
if(distance===undefined)distance=0;
distance=Math.abs(distance);
var levels=this.levels;
for(var l=0;l<levels.length;l++){
if(distance<levels[l].distance){
break;
}
}
levels.splice(l,0,{distance:distance,object:object});
this.add(object);
},
getObjectForDistance:function getObjectForDistance(distance){
var levels=this.levels;
for(var i=1,l=levels.length;i<l;i++){
if(distance<levels[i].distance){
break;
}
}
return levels[i-1].object;
},
raycast:function(){
var matrixPosition=new Vector3();
return function raycast(raycaster,intersects){
matrixPosition.setFromMatrixPosition(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(matrixPosition);
this.getObjectForDistance(distance).raycast(raycaster,intersects);
};
}(),
update:function(){
var v1=new Vector3();
var v2=new Vector3();
return function update(camera){
var levels=this.levels;
if(levels.length>1){
v1.setFromMatrixPosition(camera.matrixWorld);
v2.setFromMatrixPosition(this.matrixWorld);
var distance=v1.distanceTo(v2);
levels[0].object.visible=true;
for(var i=1,l=levels.length;i<l;i++){
if(distance>=levels[i].distance){
levels[i-1].object.visible=false;
levels[i].object.visible=true;
}else{
break;
}
}
for(;i<l;i++){
levels[i].object.visible=false;
}
}
};
}(),
toJSON:function toJSON(meta){
var data=Object3D.prototype.toJSON.call(this,meta);
data.object.levels=[];
var levels=this.levels;
for(var i=0,l=levels.length;i<l;i++){
var level=levels[i];
data.object.levels.push({
object:level.object.uuid,
distance:level.distance});
}
return data;
}});
function DataTexture(data,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,encoding){
Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);
this.image={data:data,width:width,height:height};
this.magFilter=magFilter!==undefined?magFilter:NearestFilter;
this.minFilter=minFilter!==undefined?minFilter:NearestFilter;
this.flipY=false;
this.generateMipmaps=false;
}
DataTexture.prototype=Object.create(Texture.prototype);
DataTexture.prototype.constructor=DataTexture;
DataTexture.prototype.isDataTexture=true;
function Skeleton(bones,boneInverses,useVertexTexture){
this.useVertexTexture=useVertexTexture!==undefined?useVertexTexture:true;
this.identityMatrix=new Matrix4();
bones=bones||[];
this.bones=bones.slice(0);
if(this.useVertexTexture){
var size=Math.sqrt(this.bones.length*4);
size=exports.Math.nextPowerOfTwo(Math.ceil(size));
size=Math.max(size,4);
this.boneTextureWidth=size;
this.boneTextureHeight=size;
this.boneMatrices=new Float32Array(this.boneTextureWidth*this.boneTextureHeight*4);
this.boneTexture=new DataTexture(this.boneMatrices,this.boneTextureWidth,this.boneTextureHeight,RGBAFormat,FloatType);
}else{
this.boneMatrices=new Float32Array(16*this.bones.length);
}
if(boneInverses===undefined){
this.calculateInverses();
}else{
if(this.bones.length===boneInverses.length){
this.boneInverses=boneInverses.slice(0);
}else{
console.warn('THREE.Skeleton bonInverses is the wrong length.');
this.boneInverses=[];
for(var b=0,bl=this.bones.length;b<bl;b++){
this.boneInverses.push(new Matrix4());
}
}
}
}
babelHelpers.extends(Skeleton.prototype,{
calculateInverses:function calculateInverses(){
this.boneInverses=[];
for(var b=0,bl=this.bones.length;b<bl;b++){
var inverse=new Matrix4();
if(this.bones[b]){
inverse.getInverse(this.bones[b].matrixWorld);
}
this.boneInverses.push(inverse);
}
},
pose:function pose(){
var bone;
for(var b=0,bl=this.bones.length;b<bl;b++){
bone=this.bones[b];
if(bone){
bone.matrixWorld.getInverse(this.boneInverses[b]);
}
}
for(var b=0,bl=this.bones.length;b<bl;b++){
bone=this.bones[b];
if(bone){
if(bone.parent&&bone.parent.isBone){
bone.matrix.getInverse(bone.parent.matrixWorld);
bone.matrix.multiply(bone.matrixWorld);
}else{
bone.matrix.copy(bone.matrixWorld);
}
bone.matrix.decompose(bone.position,bone.quaternion,bone.scale);
}
}
},
update:function(){
var offsetMatrix=new Matrix4();
return function update(){
for(var b=0,bl=this.bones.length;b<bl;b++){
var matrix=this.bones[b]?this.bones[b].matrixWorld:this.identityMatrix;
offsetMatrix.multiplyMatrices(matrix,this.boneInverses[b]);
offsetMatrix.toArray(this.boneMatrices,b*16);
}
if(this.useVertexTexture){
this.boneTexture.needsUpdate=true;
}
};
}(),
clone:function clone(){
return new Skeleton(this.bones,this.boneInverses,this.useVertexTexture);
}});
function Bone(skin){
Object3D.call(this);
this.type='Bone';
this.skin=skin;
}
Bone.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Bone,
isBone:true,
copy:function copy(source){
Object3D.prototype.copy.call(this,source);
this.skin=source.skin;
return this;
}});
function SkinnedMesh(geometry,material,useVertexTexture){
Mesh.call(this,geometry,material);
this.type='SkinnedMesh';
this.bindMode="attached";
this.bindMatrix=new Matrix4();
this.bindMatrixInverse=new Matrix4();
var bones=[];
if(this.geometry&&this.geometry.bones!==undefined){
var bone,gbone;
for(var b=0,bl=this.geometry.bones.length;b<bl;++b){
gbone=this.geometry.bones[b];
bone=new Bone(this);
bones.push(bone);
bone.name=gbone.name;
bone.position.fromArray(gbone.pos);
bone.quaternion.fromArray(gbone.rotq);
if(gbone.scl!==undefined)bone.scale.fromArray(gbone.scl);
}
for(var b=0,bl=this.geometry.bones.length;b<bl;++b){
gbone=this.geometry.bones[b];
if(gbone.parent!==-1&&gbone.parent!==null&&
bones[gbone.parent]!==undefined){
bones[gbone.parent].add(bones[b]);
}else{
this.add(bones[b]);
}
}
}
this.normalizeSkinWeights();
this.updateMatrixWorld(true);
this.bind(new Skeleton(bones,undefined,useVertexTexture),this.matrixWorld);
}
SkinnedMesh.prototype=babelHelpers.extends(Object.create(Mesh.prototype),{
constructor:SkinnedMesh,
isSkinnedMesh:true,
bind:function bind(skeleton,bindMatrix){
this.skeleton=skeleton;
if(bindMatrix===undefined){
this.updateMatrixWorld(true);
this.skeleton.calculateInverses();
bindMatrix=this.matrixWorld;
}
this.bindMatrix.copy(bindMatrix);
this.bindMatrixInverse.getInverse(bindMatrix);
},
pose:function pose(){
this.skeleton.pose();
},
normalizeSkinWeights:function normalizeSkinWeights(){
if(this.geometry&&this.geometry.isGeometry){
for(var i=0;i<this.geometry.skinWeights.length;i++){
var sw=this.geometry.skinWeights[i];
var scale=1.0/sw.lengthManhattan();
if(scale!==Infinity){
sw.multiplyScalar(scale);
}else{
sw.set(1,0,0,0);
}
}
}else if(this.geometry&&this.geometry.isBufferGeometry){
var vec=new Vector4();
var skinWeight=this.geometry.attributes.skinWeight;
for(var i=0;i<skinWeight.count;i++){
vec.x=skinWeight.getX(i);
vec.y=skinWeight.getY(i);
vec.z=skinWeight.getZ(i);
vec.w=skinWeight.getW(i);
var scale=1.0/vec.lengthManhattan();
if(scale!==Infinity){
vec.multiplyScalar(scale);
}else{
vec.set(1,0,0,0);
}
skinWeight.setXYZW(i,vec.x,vec.y,vec.z,vec.w);
}
}
},
updateMatrixWorld:function updateMatrixWorld(force){
Mesh.prototype.updateMatrixWorld.call(this,true);
if(this.bindMode==="attached"){
this.bindMatrixInverse.getInverse(this.matrixWorld);
}else if(this.bindMode==="detached"){
this.bindMatrixInverse.getInverse(this.bindMatrix);
}else{
console.warn('THREE.SkinnedMesh unrecognized bindMode: '+this.bindMode);
}
},
clone:function clone(){
return new this.constructor(this.geometry,this.material,this.skeleton.useVertexTexture).copy(this);
}});
function LineBasicMaterial(parameters){
Material.call(this);
this.type='LineBasicMaterial';
this.color=new Color(0xffffff);
this.linewidth=1;
this.linecap='round';
this.linejoin='round';
this.lights=false;
this.setValues(parameters);
}
LineBasicMaterial.prototype=Object.create(Material.prototype);
LineBasicMaterial.prototype.constructor=LineBasicMaterial;
LineBasicMaterial.prototype.isLineBasicMaterial=true;
LineBasicMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.linewidth=source.linewidth;
this.linecap=source.linecap;
this.linejoin=source.linejoin;
return this;
};
function Line(geometry,material,mode){
if(mode===1){
console.warn('THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.');
return new LineSegments(geometry,material);
}
Object3D.call(this);
this.type='Line';
this.geometry=geometry!==undefined?geometry:new BufferGeometry();
this.material=material!==undefined?material:new LineBasicMaterial({color:Math.random()*0xffffff});
}
Line.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Line,
isLine:true,
raycast:function(){
var inverseMatrix=new Matrix4();
var ray=new Ray();
var sphere=new Sphere();
return function raycast(raycaster,intersects){
var precision=raycaster.linePrecision;
var precisionSq=precision*precision;
var geometry=this.geometry;
var matrixWorld=this.matrixWorld;
if(geometry.boundingSphere===null)geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere);
sphere.applyMatrix4(matrixWorld);
if(raycaster.ray.intersectsSphere(sphere)===false)return;
inverseMatrix.getInverse(matrixWorld);
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
var vStart=new Vector3();
var vEnd=new Vector3();
var interSegment=new Vector3();
var interRay=new Vector3();
var step=this&&this.isLineSegments?2:1;
if(geometry&&geometry.isBufferGeometry){
var index=geometry.index;
var attributes=geometry.attributes;
var positions=attributes.position.array;
if(index!==null){
var indices=index.array;
for(var i=0,l=indices.length-1;i<l;i+=step){
var a=indices[i];
var b=indices[i+1];
vStart.fromArray(positions,a*3);
vEnd.fromArray(positions,b*3);
var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);
if(distSq>precisionSq)continue;
interRay.applyMatrix4(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(interRay);
if(distance<raycaster.near||distance>raycaster.far)continue;
intersects.push({
distance:distance,
point:interSegment.clone().applyMatrix4(this.matrixWorld),
index:i,
face:null,
faceIndex:null,
object:this});
}
}else{
for(var i=0,l=positions.length/3-1;i<l;i+=step){
vStart.fromArray(positions,3*i);
vEnd.fromArray(positions,3*i+3);
var distSq=ray.distanceSqToSegment(vStart,vEnd,interRay,interSegment);
if(distSq>precisionSq)continue;
interRay.applyMatrix4(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(interRay);
if(distance<raycaster.near||distance>raycaster.far)continue;
intersects.push({
distance:distance,
point:interSegment.clone().applyMatrix4(this.matrixWorld),
index:i,
face:null,
faceIndex:null,
object:this});
}
}
}else if(geometry&&geometry.isGeometry){
var vertices=geometry.vertices;
var nbVertices=vertices.length;
for(var i=0;i<nbVertices-1;i+=step){
var distSq=ray.distanceSqToSegment(vertices[i],vertices[i+1],interRay,interSegment);
if(distSq>precisionSq)continue;
interRay.applyMatrix4(this.matrixWorld);
var distance=raycaster.ray.origin.distanceTo(interRay);
if(distance<raycaster.near||distance>raycaster.far)continue;
intersects.push({
distance:distance,
point:interSegment.clone().applyMatrix4(this.matrixWorld),
index:i,
face:null,
faceIndex:null,
object:this});
}
}
};
}(),
clone:function clone(){
return new this.constructor(this.geometry,this.material).copy(this);
}});
function LineSegments(geometry,material){
Line.call(this,geometry,material);
this.type='LineSegments';
}
LineSegments.prototype=babelHelpers.extends(Object.create(Line.prototype),{
constructor:LineSegments,
isLineSegments:true});
function PointsMaterial(parameters){
Material.call(this);
this.type='PointsMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.size=1;
this.sizeAttenuation=true;
this.lights=false;
this.setValues(parameters);
}
PointsMaterial.prototype=Object.create(Material.prototype);
PointsMaterial.prototype.constructor=PointsMaterial;
PointsMaterial.prototype.isPointsMaterial=true;
PointsMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.map=source.map;
this.size=source.size;
this.sizeAttenuation=source.sizeAttenuation;
return this;
};
function Points(geometry,material){
Object3D.call(this);
this.type='Points';
this.geometry=geometry!==undefined?geometry:new BufferGeometry();
this.material=material!==undefined?material:new PointsMaterial({color:Math.random()*0xffffff});
}
Points.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Points,
isPoints:true,
raycast:function(){
var inverseMatrix=new Matrix4();
var ray=new Ray();
var sphere=new Sphere();
return function raycast(raycaster,intersects){
var object=this;
var geometry=this.geometry;
var matrixWorld=this.matrixWorld;
var threshold=raycaster.params.Points.threshold;
if(geometry.boundingSphere===null)geometry.computeBoundingSphere();
sphere.copy(geometry.boundingSphere);
sphere.applyMatrix4(matrixWorld);
if(raycaster.ray.intersectsSphere(sphere)===false)return;
inverseMatrix.getInverse(matrixWorld);
ray.copy(raycaster.ray).applyMatrix4(inverseMatrix);
var localThreshold=threshold/((this.scale.x+this.scale.y+this.scale.z)/3);
var localThresholdSq=localThreshold*localThreshold;
var position=new Vector3();
function testPoint(point,index){
var rayPointDistanceSq=ray.distanceSqToPoint(point);
if(rayPointDistanceSq<localThresholdSq){
var intersectPoint=ray.closestPointToPoint(point);
intersectPoint.applyMatrix4(matrixWorld);
var distance=raycaster.ray.origin.distanceTo(intersectPoint);
if(distance<raycaster.near||distance>raycaster.far)return;
intersects.push({
distance:distance,
distanceToRay:Math.sqrt(rayPointDistanceSq),
point:intersectPoint.clone(),
index:index,
face:null,
object:object});
}
}
if(geometry&&geometry.isBufferGeometry){
var index=geometry.index;
var attributes=geometry.attributes;
var positions=attributes.position.array;
if(index!==null){
var indices=index.array;
for(var i=0,il=indices.length;i<il;i++){
var a=indices[i];
position.fromArray(positions,a*3);
testPoint(position,a);
}
}else{
for(var i=0,l=positions.length/3;i<l;i++){
position.fromArray(positions,i*3);
testPoint(position,i);
}
}
}else{
var vertices=geometry.vertices;
for(var i=0,l=vertices.length;i<l;i++){
testPoint(vertices[i],i);
}
}
};
}(),
clone:function clone(){
return new this.constructor(this.geometry,this.material).copy(this);
}});
function Group(){
Object3D.call(this);
this.type='Group';
}
Group.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Group});
function VideoTexture(video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){
Texture.call(this,video,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);
this.generateMipmaps=false;
var scope=this;
function update(){
requestAnimationFrame(update);
if(video.readyState>=video.HAVE_CURRENT_DATA){
scope.needsUpdate=true;
}
}
update();
}
VideoTexture.prototype=Object.create(Texture.prototype);
VideoTexture.prototype.constructor=VideoTexture;
function CompressedTexture(mipmaps,width,height,format,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,encoding){
Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy,encoding);
this.image={width:width,height:height};
this.mipmaps=mipmaps;
this.flipY=false;
this.generateMipmaps=false;
}
CompressedTexture.prototype=Object.create(Texture.prototype);
CompressedTexture.prototype.constructor=CompressedTexture;
CompressedTexture.prototype.isCompressedTexture=true;
function CanvasTexture(canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy){
Texture.call(this,canvas,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);
this.needsUpdate=true;
}
CanvasTexture.prototype=Object.create(Texture.prototype);
CanvasTexture.prototype.constructor=CanvasTexture;
function DepthTexture(width,height,type,mapping,wrapS,wrapT,magFilter,minFilter,anisotropy,format){
format=format!==undefined?format:DepthFormat;
if(format!==DepthFormat&&format!==DepthStencilFormat){
throw new Error('DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat');
}
Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);
this.image={width:width,height:height};
this.type=type!==undefined?type:UnsignedShortType;
this.magFilter=magFilter!==undefined?magFilter:NearestFilter;
this.minFilter=minFilter!==undefined?minFilter:NearestFilter;
this.flipY=false;
this.generateMipmaps=false;
}
DepthTexture.prototype=Object.create(Texture.prototype);
DepthTexture.prototype.constructor=DepthTexture;
DepthTexture.prototype.isDepthTexture=true;
function ShadowMaterial(){
ShaderMaterial.call(this,{
uniforms:exports.UniformsUtils.merge([
UniformsLib["lights"],
{
opacity:{value:1.0}}]),
vertexShader:ShaderChunk['shadow_vert'],
fragmentShader:ShaderChunk['shadow_frag']});
this.lights=true;
this.transparent=true;
Object.defineProperties(this,{
opacity:{
enumerable:true,
get:function get(){
return this.uniforms.opacity.value;
},
set:function set(value){
this.uniforms.opacity.value=value;
}}});
}
ShadowMaterial.prototype=Object.create(ShaderMaterial.prototype);
ShadowMaterial.prototype.constructor=ShadowMaterial;
ShadowMaterial.prototype.isShadowMaterial=true;
function RawShaderMaterial(parameters){
ShaderMaterial.call(this,parameters);
this.type='RawShaderMaterial';
}
RawShaderMaterial.prototype=Object.create(ShaderMaterial.prototype);
RawShaderMaterial.prototype.constructor=RawShaderMaterial;
RawShaderMaterial.prototype.isRawShaderMaterial=true;
function MultiMaterial(materials){
this.uuid=exports.Math.generateUUID();
this.type='MultiMaterial';
this.materials=materials instanceof Array?materials:[];
this.visible=true;
}
MultiMaterial.prototype={
constructor:MultiMaterial,
isMultiMaterial:true,
toJSON:function toJSON(meta){
var output={
metadata:{
version:4.2,
type:'material',
generator:'MaterialExporter'},
uuid:this.uuid,
type:this.type,
materials:[]};
var materials=this.materials;
for(var i=0,l=materials.length;i<l;i++){
var material=materials[i].toJSON(meta);
delete material.metadata;
output.materials.push(material);
}
output.visible=this.visible;
return output;
},
clone:function clone(){
var material=new this.constructor();
for(var i=0;i<this.materials.length;i++){
material.materials.push(this.materials[i].clone());
}
material.visible=this.visible;
return material;
}};
function MeshStandardMaterial(parameters){
Material.call(this);
this.defines={'STANDARD':''};
this.type='MeshStandardMaterial';
this.color=new Color(0xffffff);
this.roughness=0.5;
this.metalness=0.5;
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.emissive=new Color(0x000000);
this.emissiveIntensity=1.0;
this.emissiveMap=null;
this.bumpMap=null;
this.bumpScale=1;
this.normalMap=null;
this.normalScale=new Vector2(1,1);
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.roughnessMap=null;
this.metalnessMap=null;
this.alphaMap=null;
this.envMap=null;
this.envMapIntensity=1.0;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshStandardMaterial.prototype=Object.create(Material.prototype);
MeshStandardMaterial.prototype.constructor=MeshStandardMaterial;
MeshStandardMaterial.prototype.isMeshStandardMaterial=true;
MeshStandardMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.defines={'STANDARD':''};
this.color.copy(source.color);
this.roughness=source.roughness;
this.metalness=source.metalness;
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.emissive.copy(source.emissive);
this.emissiveMap=source.emissiveMap;
this.emissiveIntensity=source.emissiveIntensity;
this.bumpMap=source.bumpMap;
this.bumpScale=source.bumpScale;
this.normalMap=source.normalMap;
this.normalScale.copy(source.normalScale);
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.roughnessMap=source.roughnessMap;
this.metalnessMap=source.metalnessMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.envMapIntensity=source.envMapIntensity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function MeshPhysicalMaterial(parameters){
MeshStandardMaterial.call(this);
this.defines={'PHYSICAL':''};
this.type='MeshPhysicalMaterial';
this.reflectivity=0.5;
this.clearCoat=0.0;
this.clearCoatRoughness=0.0;
this.setValues(parameters);
}
MeshPhysicalMaterial.prototype=Object.create(MeshStandardMaterial.prototype);
MeshPhysicalMaterial.prototype.constructor=MeshPhysicalMaterial;
MeshPhysicalMaterial.prototype.isMeshPhysicalMaterial=true;
MeshPhysicalMaterial.prototype.copy=function(source){
MeshStandardMaterial.prototype.copy.call(this,source);
this.defines={'PHYSICAL':''};
this.reflectivity=source.reflectivity;
this.clearCoat=source.clearCoat;
this.clearCoatRoughness=source.clearCoatRoughness;
return this;
};
function MeshPhongMaterial(parameters){
Material.call(this);
this.type='MeshPhongMaterial';
this.color=new Color(0xffffff);
this.specular=new Color(0x111111);
this.shininess=30;
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.emissive=new Color(0x000000);
this.emissiveIntensity=1.0;
this.emissiveMap=null;
this.bumpMap=null;
this.bumpScale=1;
this.normalMap=null;
this.normalScale=new Vector2(1,1);
this.displacementMap=null;
this.displacementScale=1;
this.displacementBias=0;
this.specularMap=null;
this.alphaMap=null;
this.envMap=null;
this.combine=MultiplyOperation;
this.reflectivity=1;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshPhongMaterial.prototype=Object.create(Material.prototype);
MeshPhongMaterial.prototype.constructor=MeshPhongMaterial;
MeshPhongMaterial.prototype.isMeshPhongMaterial=true;
MeshPhongMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.specular.copy(source.specular);
this.shininess=source.shininess;
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.emissive.copy(source.emissive);
this.emissiveMap=source.emissiveMap;
this.emissiveIntensity=source.emissiveIntensity;
this.bumpMap=source.bumpMap;
this.bumpScale=source.bumpScale;
this.normalMap=source.normalMap;
this.normalScale.copy(source.normalScale);
this.displacementMap=source.displacementMap;
this.displacementScale=source.displacementScale;
this.displacementBias=source.displacementBias;
this.specularMap=source.specularMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.combine=source.combine;
this.reflectivity=source.reflectivity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function MeshNormalMaterial(parameters){
Material.call(this,parameters);
this.type='MeshNormalMaterial';
this.wireframe=false;
this.wireframeLinewidth=1;
this.fog=false;
this.lights=false;
this.morphTargets=false;
this.setValues(parameters);
}
MeshNormalMaterial.prototype=Object.create(Material.prototype);
MeshNormalMaterial.prototype.constructor=MeshNormalMaterial;
MeshNormalMaterial.prototype.isMeshNormalMaterial=true;
MeshNormalMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
return this;
};
function MeshLambertMaterial(parameters){
Material.call(this);
this.type='MeshLambertMaterial';
this.color=new Color(0xffffff);
this.map=null;
this.lightMap=null;
this.lightMapIntensity=1.0;
this.aoMap=null;
this.aoMapIntensity=1.0;
this.emissive=new Color(0x000000);
this.emissiveIntensity=1.0;
this.emissiveMap=null;
this.specularMap=null;
this.alphaMap=null;
this.envMap=null;
this.combine=MultiplyOperation;
this.reflectivity=1;
this.refractionRatio=0.98;
this.wireframe=false;
this.wireframeLinewidth=1;
this.wireframeLinecap='round';
this.wireframeLinejoin='round';
this.skinning=false;
this.morphTargets=false;
this.morphNormals=false;
this.setValues(parameters);
}
MeshLambertMaterial.prototype=Object.create(Material.prototype);
MeshLambertMaterial.prototype.constructor=MeshLambertMaterial;
MeshLambertMaterial.prototype.isMeshLambertMaterial=true;
MeshLambertMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.map=source.map;
this.lightMap=source.lightMap;
this.lightMapIntensity=source.lightMapIntensity;
this.aoMap=source.aoMap;
this.aoMapIntensity=source.aoMapIntensity;
this.emissive.copy(source.emissive);
this.emissiveMap=source.emissiveMap;
this.emissiveIntensity=source.emissiveIntensity;
this.specularMap=source.specularMap;
this.alphaMap=source.alphaMap;
this.envMap=source.envMap;
this.combine=source.combine;
this.reflectivity=source.reflectivity;
this.refractionRatio=source.refractionRatio;
this.wireframe=source.wireframe;
this.wireframeLinewidth=source.wireframeLinewidth;
this.wireframeLinecap=source.wireframeLinecap;
this.wireframeLinejoin=source.wireframeLinejoin;
this.skinning=source.skinning;
this.morphTargets=source.morphTargets;
this.morphNormals=source.morphNormals;
return this;
};
function LineDashedMaterial(parameters){
Material.call(this);
this.type='LineDashedMaterial';
this.color=new Color(0xffffff);
this.linewidth=1;
this.scale=1;
this.dashSize=3;
this.gapSize=1;
this.lights=false;
this.setValues(parameters);
}
LineDashedMaterial.prototype=Object.create(Material.prototype);
LineDashedMaterial.prototype.constructor=LineDashedMaterial;
LineDashedMaterial.prototype.isLineDashedMaterial=true;
LineDashedMaterial.prototype.copy=function(source){
Material.prototype.copy.call(this,source);
this.color.copy(source.color);
this.linewidth=source.linewidth;
this.scale=source.scale;
this.dashSize=source.dashSize;
this.gapSize=source.gapSize;
return this;
};
exports.Cache={
enabled:false,
files:{},
add:function add(key,file){
if(this.enabled===false)return;
this.files[key]=file;
},
get:function get(key){
if(this.enabled===false)return;
return this.files[key];
},
remove:function remove(key){
delete this.files[key];
},
clear:function clear(){
this.files={};
}};
function LoadingManager(onLoad,onProgress,onError){
var scope=this;
var isLoading=false,itemsLoaded=0,itemsTotal=0;
this.onStart=undefined;
this.onLoad=onLoad;
this.onProgress=onProgress;
this.onError=onError;
this.itemStart=function(url){
itemsTotal++;
if(isLoading===false){
if(scope.onStart!==undefined){
scope.onStart(url,itemsLoaded,itemsTotal);
}
}
isLoading=true;
};
this.itemEnd=function(url){
itemsLoaded++;
if(scope.onProgress!==undefined){
scope.onProgress(url,itemsLoaded,itemsTotal);
}
if(itemsLoaded===itemsTotal){
isLoading=false;
if(scope.onLoad!==undefined){
scope.onLoad();
}
}
};
this.itemError=function(url){
if(scope.onError!==undefined){
scope.onError(url);
}
};
}
exports.DefaultLoadingManager=new LoadingManager();
function XHRLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(XHRLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
if(this.path!==undefined)url=this.path+url;
var scope=this;
var cached=exports.Cache.get(url);
if(cached!==undefined){
scope.manager.itemStart(url);
setTimeout(function(){
if(onLoad)onLoad(cached);
scope.manager.itemEnd(url);
},0);
return cached;
}
var request=new XMLHttpRequest();
request.open('GET',url,true);
request.addEventListener('load',function(event){
var response=event.target.response;
exports.Cache.add(url,response);
if(this.status===200){
if(onLoad)onLoad(response);
scope.manager.itemEnd(url);
}else if(this.status===0){
console.warn('THREE.XHRLoader: HTTP Status 0 received.');
if(onLoad)onLoad(response);
scope.manager.itemEnd(url);
}else{
if(onError)onError(event);
scope.manager.itemError(url);
}
},false);
if(onProgress!==undefined){
request.addEventListener('progress',function(event){
onProgress(event);
},false);
}
request.addEventListener('error',function(event){
if(onError)onError(event);
scope.manager.itemError(url);
},false);
if(this.responseType!==undefined)request.responseType=this.responseType;
if(this.withCredentials!==undefined)request.withCredentials=this.withCredentials;
if(request.overrideMimeType)request.overrideMimeType('text/plain');
request.send(null);
scope.manager.itemStart(url);
return request;
},
setPath:function setPath(value){
this.path=value;
return this;
},
setResponseType:function setResponseType(value){
this.responseType=value;
return this;
},
setWithCredentials:function setWithCredentials(value){
this.withCredentials=value;
return this;
}});
function CompressedTextureLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
this._parser=null;
}
babelHelpers.extends(CompressedTextureLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var images=[];
var texture=new CompressedTexture();
texture.image=images;
var loader=new XHRLoader(this.manager);
loader.setPath(this.path);
loader.setResponseType('arraybuffer');
function loadTexture(i){
loader.load(url[i],function(buffer){
var texDatas=scope._parser(buffer,true);
images[i]={
width:texDatas.width,
height:texDatas.height,
format:texDatas.format,
mipmaps:texDatas.mipmaps};
loaded+=1;
if(loaded===6){
if(texDatas.mipmapCount===1)
texture.minFilter=LinearFilter;
texture.format=texDatas.format;
texture.needsUpdate=true;
if(onLoad)onLoad(texture);
}
},onProgress,onError);
}
if(Array.isArray(url)){
var loaded=0;
for(var i=0,il=url.length;i<il;++i){
loadTexture(i);
}
}else{
loader.load(url,function(buffer){
var texDatas=scope._parser(buffer,true);
if(texDatas.isCubemap){
var faces=texDatas.mipmaps.length/texDatas.mipmapCount;
for(var f=0;f<faces;f++){
images[f]={mipmaps:[]};
for(var i=0;i<texDatas.mipmapCount;i++){
images[f].mipmaps.push(texDatas.mipmaps[f*texDatas.mipmapCount+i]);
images[f].format=texDatas.format;
images[f].width=texDatas.width;
images[f].height=texDatas.height;
}
}
}else{
texture.image.width=texDatas.width;
texture.image.height=texDatas.height;
texture.mipmaps=texDatas.mipmaps;
}
if(texDatas.mipmapCount===1){
texture.minFilter=LinearFilter;
}
texture.format=texDatas.format;
texture.needsUpdate=true;
if(onLoad)onLoad(texture);
},onProgress,onError);
}
return texture;
},
setPath:function setPath(value){
this.path=value;
return this;
}});
var DataTextureLoader=BinaryTextureLoader;
function BinaryTextureLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
this._parser=null;
}
babelHelpers.extends(BinaryTextureLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var texture=new DataTexture();
var loader=new XHRLoader(this.manager);
loader.setResponseType('arraybuffer');
loader.load(url,function(buffer){
var texData=scope._parser(buffer);
if(!texData)return;
if(undefined!==texData.image){
texture.image=texData.image;
}else if(undefined!==texData.data){
texture.image.width=texData.width;
texture.image.height=texData.height;
texture.image.data=texData.data;
}
texture.wrapS=undefined!==texData.wrapS?texData.wrapS:ClampToEdgeWrapping;
texture.wrapT=undefined!==texData.wrapT?texData.wrapT:ClampToEdgeWrapping;
texture.magFilter=undefined!==texData.magFilter?texData.magFilter:LinearFilter;
texture.minFilter=undefined!==texData.minFilter?texData.minFilter:LinearMipMapLinearFilter;
texture.anisotropy=undefined!==texData.anisotropy?texData.anisotropy:1;
if(undefined!==texData.format){
texture.format=texData.format;
}
if(undefined!==texData.type){
texture.type=texData.type;
}
if(undefined!==texData.mipmaps){
texture.mipmaps=texData.mipmaps;
}
if(1===texData.mipmapCount){
texture.minFilter=LinearFilter;
}
texture.needsUpdate=true;
if(onLoad)onLoad(texture,texData);
},onProgress,onError);
return texture;
}});
function ImageLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(ImageLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var image=document.createElementNS('http://www.w3.org/1999/xhtml','img');
image.onload=function(){
URL.revokeObjectURL(image.src);
if(onLoad)onLoad(image);
scope.manager.itemEnd(url);
};
if(url.indexOf('data:')===0){
image.src=url;
}else{
var loader=new XHRLoader();
loader.setPath(this.path);
loader.setResponseType('blob');
loader.setWithCredentials(this.withCredentials);
loader.load(url,function(blob){
image.src=URL.createObjectURL(blob);
},onProgress,onError);
}
scope.manager.itemStart(url);
return image;
},
setCrossOrigin:function setCrossOrigin(value){
this.crossOrigin=value;
return this;
},
setWithCredentials:function setWithCredentials(value){
this.withCredentials=value;
return this;
},
setPath:function setPath(value){
this.path=value;
return this;
}});
function CubeTextureLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(CubeTextureLoader.prototype,{
load:function load(urls,onLoad,onProgress,onError){
var texture=new CubeTexture();
var loader=new ImageLoader(this.manager);
loader.setCrossOrigin(this.crossOrigin);
loader.setPath(this.path);
var loaded=0;
function loadTexture(i){
loader.load(urls[i],function(image){
texture.images[i]=image;
loaded++;
if(loaded===6){
texture.needsUpdate=true;
if(onLoad)onLoad(texture);
}
},undefined,onError);
}
for(var i=0;i<urls.length;++i){
loadTexture(i);
}
return texture;
},
setCrossOrigin:function setCrossOrigin(value){
this.crossOrigin=value;
return this;
},
setPath:function setPath(value){
this.path=value;
return this;
}});
function TextureLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(TextureLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var texture=new Texture();
var loader=new ImageLoader(this.manager);
loader.setCrossOrigin(this.crossOrigin);
loader.setWithCredentials(this.withCredentials);
loader.setPath(this.path);
loader.load(url,function(image){
var isJPEG=url.search(/\.(jpg|jpeg)$/)>0||url.search(/^data\:image\/jpeg/)===0;
texture.format=isJPEG?RGBFormat:RGBAFormat;
texture.image=image;
texture.needsUpdate=true;
if(onLoad!==undefined){
onLoad(texture);
}
},onProgress,onError);
return texture;
},
setCrossOrigin:function setCrossOrigin(value){
this.crossOrigin=value;
return this;
},
setWithCredentials:function setWithCredentials(value){
this.withCredentials=value;
return this;
},
setPath:function setPath(value){
this.path=value;
return this;
}});
function Light(color,intensity){
Object3D.call(this);
this.type='Light';
this.color=new Color(color);
this.intensity=intensity!==undefined?intensity:1;
this.receiveShadow=undefined;
}
Light.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Light,
isLight:true,
copy:function copy(source){
Object3D.prototype.copy.call(this,source);
this.color.copy(source.color);
this.intensity=source.intensity;
return this;
},
toJSON:function toJSON(meta){
var data=Object3D.prototype.toJSON.call(this,meta);
data.object.color=this.color.getHex();
data.object.intensity=this.intensity;
if(this.groundColor!==undefined)data.object.groundColor=this.groundColor.getHex();
if(this.distance!==undefined)data.object.distance=this.distance;
if(this.angle!==undefined)data.object.angle=this.angle;
if(this.decay!==undefined)data.object.decay=this.decay;
if(this.penumbra!==undefined)data.object.penumbra=this.penumbra;
if(this.shadow!==undefined)data.object.shadow=this.shadow.toJSON();
return data;
}});
function HemisphereLight(skyColor,groundColor,intensity){
Light.call(this,skyColor,intensity);
this.type='HemisphereLight';
this.castShadow=undefined;
this.position.copy(Object3D.DefaultUp);
this.updateMatrix();
this.groundColor=new Color(groundColor);
}
HemisphereLight.prototype=babelHelpers.extends(Object.create(Light.prototype),{
constructor:HemisphereLight,
isHemisphereLight:true,
copy:function copy(source){
Light.prototype.copy.call(this,source);
this.groundColor.copy(source.groundColor);
return this;
}});
function LightShadow(camera){
this.camera=camera;
this.bias=0;
this.radius=1;
this.mapSize=new Vector2(512,512);
this.map=null;
this.matrix=new Matrix4();
}
babelHelpers.extends(LightShadow.prototype,{
copy:function copy(source){
this.camera=source.camera.clone();
this.bias=source.bias;
this.radius=source.radius;
this.mapSize.copy(source.mapSize);
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
},
toJSON:function toJSON(){
var object={};
if(this.bias!==0)object.bias=this.bias;
if(this.radius!==1)object.radius=this.radius;
if(this.mapSize.x!==512||this.mapSize.y!==512)object.mapSize=this.mapSize.toArray();
object.camera=this.camera.toJSON(false).object;
delete object.camera.matrix;
return object;
}});
function SpotLightShadow(){
LightShadow.call(this,new PerspectiveCamera(50,1,0.5,500));
}
SpotLightShadow.prototype=babelHelpers.extends(Object.create(LightShadow.prototype),{
constructor:SpotLightShadow,
isSpotLightShadow:true,
update:function update(light){
var fov=exports.Math.RAD2DEG*2*light.angle;
var aspect=this.mapSize.width/this.mapSize.height;
var far=light.distance||500;
var camera=this.camera;
if(fov!==camera.fov||aspect!==camera.aspect||far!==camera.far){
camera.fov=fov;
camera.aspect=aspect;
camera.far=far;
camera.updateProjectionMatrix();
}
}});
function SpotLight(color,intensity,distance,angle,penumbra,decay){
Light.call(this,color,intensity);
this.type='SpotLight';
this.position.copy(Object3D.DefaultUp);
this.updateMatrix();
this.target=new Object3D();
Object.defineProperty(this,'power',{
get:function get(){
return this.intensity*Math.PI;
},
set:function set(power){
this.intensity=power/Math.PI;
}});
this.distance=distance!==undefined?distance:0;
this.angle=angle!==undefined?angle:Math.PI/3;
this.penumbra=penumbra!==undefined?penumbra:0;
this.decay=decay!==undefined?decay:1;
this.shadow=new SpotLightShadow();
}
SpotLight.prototype=babelHelpers.extends(Object.create(Light.prototype),{
constructor:SpotLight,
isSpotLight:true,
copy:function copy(source){
Light.prototype.copy.call(this,source);
this.distance=source.distance;
this.angle=source.angle;
this.penumbra=source.penumbra;
this.decay=source.decay;
this.target=source.target.clone();
this.shadow=source.shadow.clone();
return this;
}});
function PointLight(color,intensity,distance,decay){
Light.call(this,color,intensity);
this.type='PointLight';
Object.defineProperty(this,'power',{
get:function get(){
return this.intensity*4*Math.PI;
},
set:function set(power){
this.intensity=power/(4*Math.PI);
}});
this.distance=distance!==undefined?distance:0;
this.decay=decay!==undefined?decay:1;
this.shadow=new LightShadow(new PerspectiveCamera(90,1,0.5,500));
}
PointLight.prototype=babelHelpers.extends(Object.create(Light.prototype),{
constructor:PointLight,
isPointLight:true,
copy:function copy(source){
Light.prototype.copy.call(this,source);
this.distance=source.distance;
this.decay=source.decay;
this.shadow=source.shadow.clone();
return this;
}});
function DirectionalLightShadow(light){
LightShadow.call(this,new OrthographicCamera(-5,5,5,-5,0.5,500));
}
DirectionalLightShadow.prototype=babelHelpers.extends(Object.create(LightShadow.prototype),{
constructor:DirectionalLightShadow});
function DirectionalLight(color,intensity){
Light.call(this,color,intensity);
this.type='DirectionalLight';
this.position.copy(Object3D.DefaultUp);
this.updateMatrix();
this.target=new Object3D();
this.shadow=new DirectionalLightShadow();
}
DirectionalLight.prototype=babelHelpers.extends(Object.create(Light.prototype),{
constructor:DirectionalLight,
isDirectionalLight:true,
copy:function copy(source){
Light.prototype.copy.call(this,source);
this.target=source.target.clone();
this.shadow=source.shadow.clone();
return this;
}});
function AmbientLight(color,intensity){
Light.call(this,color,intensity);
this.type='AmbientLight';
this.castShadow=undefined;
}
AmbientLight.prototype=babelHelpers.extends(Object.create(Light.prototype),{
constructor:AmbientLight,
isAmbientLight:true});
exports.AnimationUtils={
arraySlice:function arraySlice(array,from,to){
if(exports.AnimationUtils.isTypedArray(array)){
return new array.constructor(array.subarray(from,to));
}
return array.slice(from,to);
},
convertArray:function convertArray(array,type,forceClone){
if(!array||
!forceClone&&array.constructor===type)return array;
if(typeof type.BYTES_PER_ELEMENT==='number'){
return new type(array);
}
return Array.prototype.slice.call(array);
},
isTypedArray:function isTypedArray(object){
return ArrayBuffer.isView(object)&&
!(object instanceof DataView);
},
getKeyframeOrder:function getKeyframeOrder(times){
function compareTime(i,j){
return times[i]-times[j];
}
var n=times.length;
var result=new Array(n);
for(var i=0;i!==n;++i){result[i]=i;}
result.sort(compareTime);
return result;
},
sortedArray:function sortedArray(values,stride,order){
var nValues=values.length;
var result=new values.constructor(nValues);
for(var i=0,dstOffset=0;dstOffset!==nValues;++i){
var srcOffset=order[i]*stride;
for(var j=0;j!==stride;++j){
result[dstOffset++]=values[srcOffset+j];
}
}
return result;
},
flattenJSON:function flattenJSON(jsonKeys,times,values,valuePropertyName){
var i=1,key=jsonKeys[0];
while(key!==undefined&&key[valuePropertyName]===undefined){
key=jsonKeys[i++];
}
if(key===undefined)return;
var value=key[valuePropertyName];
if(value===undefined)return;
if(Array.isArray(value)){
do{
value=key[valuePropertyName];
if(value!==undefined){
times.push(key.time);
values.push.apply(values,value);
}
key=jsonKeys[i++];
}while(key!==undefined);
}else if(value.toArray!==undefined){
do{
value=key[valuePropertyName];
if(value!==undefined){
times.push(key.time);
value.toArray(values,values.length);
}
key=jsonKeys[i++];
}while(key!==undefined);
}else{
do{
value=key[valuePropertyName];
if(value!==undefined){
times.push(key.time);
values.push(value);
}
key=jsonKeys[i++];
}while(key!==undefined);
}
}};
function Interpolant(
parameterPositions,sampleValues,sampleSize,resultBuffer){
this.parameterPositions=parameterPositions;
this._cachedIndex=0;
this.resultBuffer=resultBuffer!==undefined?
resultBuffer:new sampleValues.constructor(sampleSize);
this.sampleValues=sampleValues;
this.valueSize=sampleSize;
}
Interpolant.prototype={
constructor:Interpolant,
evaluate:function evaluate(t){
var pp=this.parameterPositions,
i1=this._cachedIndex,
t1=pp[i1],
t0=pp[i1-1];
validate_interval:{
seek:{
var right;
linear_scan:{
forward_scan:if(!(t<t1)){
for(var giveUpAt=i1+2;;){
if(t1===undefined){
if(t<t0)break forward_scan;
i1=pp.length;
this._cachedIndex=i1;
return this.afterEnd_(i1-1,t,t0);
}
if(i1===giveUpAt)break;
t0=t1;
t1=pp[++i1];
if(t<t1){
break seek;
}
}
right=pp.length;
break linear_scan;
}
if(!(t>=t0)){
var t1global=pp[1];
if(t<t1global){
i1=2;
t0=t1global;
}
for(var giveUpAt=i1-2;;){
if(t0===undefined){
this._cachedIndex=0;
return this.beforeStart_(0,t,t1);
}
if(i1===giveUpAt)break;
t1=t0;
t0=pp[--i1-1];
if(t>=t0){
break seek;
}
}
right=i1;
i1=0;
break linear_scan;
}
break validate_interval;
}
while(i1<right){
var mid=i1+right>>>1;
if(t<pp[mid]){
right=mid;
}else{
i1=mid+1;
}
}
t1=pp[i1];
t0=pp[i1-1];
if(t0===undefined){
this._cachedIndex=0;
return this.beforeStart_(0,t,t1);
}
if(t1===undefined){
i1=pp.length;
this._cachedIndex=i1;
return this.afterEnd_(i1-1,t0,t);
}
}
this._cachedIndex=i1;
this.intervalChanged_(i1,t0,t1);
}
return this.interpolate_(i1,t0,t,t1);
},
settings:null,
DefaultSettings_:{},
getSettings_:function getSettings_(){
return this.settings||this.DefaultSettings_;
},
copySampleValue_:function copySampleValue_(index){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
offset=index*stride;
for(var i=0;i!==stride;++i){
result[i]=values[offset+i];
}
return result;
},
interpolate_:function interpolate_(i1,t0,t,t1){
throw new Error("call to abstract method");
},
intervalChanged_:function intervalChanged_(i1,t0,t1){
}};
babelHelpers.extends(Interpolant.prototype,{
beforeStart_:
Interpolant.prototype.copySampleValue_,
afterEnd_:
Interpolant.prototype.copySampleValue_});
function CubicInterpolant(
parameterPositions,sampleValues,sampleSize,resultBuffer){
Interpolant.call(
this,parameterPositions,sampleValues,sampleSize,resultBuffer);
this._weightPrev=-0;
this._offsetPrev=-0;
this._weightNext=-0;
this._offsetNext=-0;
}
CubicInterpolant.prototype=
babelHelpers.extends(Object.create(Interpolant.prototype),{
constructor:CubicInterpolant,
DefaultSettings_:{
endingStart:ZeroCurvatureEnding,
endingEnd:ZeroCurvatureEnding},
intervalChanged_:function intervalChanged_(i1,t0,t1){
var pp=this.parameterPositions,
iPrev=i1-2,
iNext=i1+1,
tPrev=pp[iPrev],
tNext=pp[iNext];
if(tPrev===undefined){
switch(this.getSettings_().endingStart){
case ZeroSlopeEnding:
iPrev=i1;
tPrev=2*t0-t1;
break;
case WrapAroundEnding:
iPrev=pp.length-2;
tPrev=t0+pp[iPrev]-pp[iPrev+1];
break;
default:
iPrev=i1;
tPrev=t1;}
}
if(tNext===undefined){
switch(this.getSettings_().endingEnd){
case ZeroSlopeEnding:
iNext=i1;
tNext=2*t1-t0;
break;
case WrapAroundEnding:
iNext=1;
tNext=t1+pp[1]-pp[0];
break;
default:
iNext=i1-1;
tNext=t0;}
}
var halfDt=(t1-t0)*0.5,
stride=this.valueSize;
this._weightPrev=halfDt/(t0-tPrev);
this._weightNext=halfDt/(tNext-t1);
this._offsetPrev=iPrev*stride;
this._offsetNext=iNext*stride;
},
interpolate_:function interpolate_(i1,t0,t,t1){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
o1=i1*stride,o0=o1-stride,
oP=this._offsetPrev,oN=this._offsetNext,
wP=this._weightPrev,wN=this._weightNext,
p=(t-t0)/(t1-t0),
pp=p*p,
ppp=pp*p;
var sP=-wP*ppp+2*wP*pp-wP*p;
var s0=(1+wP)*ppp+(-1.5-2*wP)*pp+(-0.5+wP)*p+1;
var s1=(-1-wN)*ppp+(1.5+wN)*pp+0.5*p;
var sN=wN*ppp-wN*pp;
for(var i=0;i!==stride;++i){
result[i]=
sP*values[oP+i]+
s0*values[o0+i]+
s1*values[o1+i]+
sN*values[oN+i];
}
return result;
}});
function LinearInterpolant(
parameterPositions,sampleValues,sampleSize,resultBuffer){
Interpolant.call(
this,parameterPositions,sampleValues,sampleSize,resultBuffer);
}
LinearInterpolant.prototype=
babelHelpers.extends(Object.create(Interpolant.prototype),{
constructor:LinearInterpolant,
interpolate_:function interpolate_(i1,t0,t,t1){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
offset1=i1*stride,
offset0=offset1-stride,
weight1=(t-t0)/(t1-t0),
weight0=1-weight1;
for(var i=0;i!==stride;++i){
result[i]=
values[offset0+i]*weight0+
values[offset1+i]*weight1;
}
return result;
}});
function DiscreteInterpolant(
parameterPositions,sampleValues,sampleSize,resultBuffer){
Interpolant.call(
this,parameterPositions,sampleValues,sampleSize,resultBuffer);
}
DiscreteInterpolant.prototype=
babelHelpers.extends(Object.create(Interpolant.prototype),{
constructor:DiscreteInterpolant,
interpolate_:function interpolate_(i1,t0,t,t1){
return this.copySampleValue_(i1-1);
}});
var KeyframeTrackPrototype;
KeyframeTrackPrototype={
TimeBufferType:Float32Array,
ValueBufferType:Float32Array,
DefaultInterpolation:InterpolateLinear,
InterpolantFactoryMethodDiscrete:function InterpolantFactoryMethodDiscrete(result){
return new DiscreteInterpolant(
this.times,this.values,this.getValueSize(),result);
},
InterpolantFactoryMethodLinear:function InterpolantFactoryMethodLinear(result){
return new LinearInterpolant(
this.times,this.values,this.getValueSize(),result);
},
InterpolantFactoryMethodSmooth:function InterpolantFactoryMethodSmooth(result){
return new CubicInterpolant(
this.times,this.values,this.getValueSize(),result);
},
setInterpolation:function setInterpolation(interpolation){
var factoryMethod;
switch(interpolation){
case InterpolateDiscrete:
factoryMethod=this.InterpolantFactoryMethodDiscrete;
break;
case InterpolateLinear:
factoryMethod=this.InterpolantFactoryMethodLinear;
break;
case InterpolateSmooth:
factoryMethod=this.InterpolantFactoryMethodSmooth;
break;}
if(factoryMethod===undefined){
var message="unsupported interpolation for "+
this.ValueTypeName+" keyframe track named "+this.name;
if(this.createInterpolant===undefined){
if(interpolation!==this.DefaultInterpolation){
this.setInterpolation(this.DefaultInterpolation);
}else{
throw new Error(message);
}
}
console.warn(message);
return;
}
this.createInterpolant=factoryMethod;
},
getInterpolation:function getInterpolation(){
switch(this.createInterpolant){
case this.InterpolantFactoryMethodDiscrete:
return InterpolateDiscrete;
case this.InterpolantFactoryMethodLinear:
return InterpolateLinear;
case this.InterpolantFactoryMethodSmooth:
return InterpolateSmooth;}
},
getValueSize:function getValueSize(){
return this.values.length/this.times.length;
},
shift:function shift(timeOffset){
if(timeOffset!==0.0){
var times=this.times;
for(var i=0,n=times.length;i!==n;++i){
times[i]+=timeOffset;
}
}
return this;
},
scale:function scale(timeScale){
if(timeScale!==1.0){
var times=this.times;
for(var i=0,n=times.length;i!==n;++i){
times[i]*=timeScale;
}
}
return this;
},
trim:function trim(startTime,endTime){
var times=this.times,
nKeys=times.length,
from=0,
to=nKeys-1;
while(from!==nKeys&&times[from]<startTime){++from;}
while(to!==-1&&times[to]>endTime){--to;}
++to;
if(from!==0||to!==nKeys){
if(from>=to)to=Math.max(to,1),from=to-1;
var stride=this.getValueSize();
this.times=exports.AnimationUtils.arraySlice(times,from,to);
this.values=exports.AnimationUtils.
arraySlice(this.values,from*stride,to*stride);
}
return this;
},
validate:function validate(){
var valid=true;
var valueSize=this.getValueSize();
if(valueSize-Math.floor(valueSize)!==0){
console.error("invalid value size in track",this);
valid=false;
}
var times=this.times,
values=this.values,
nKeys=times.length;
if(nKeys===0){
console.error("track is empty",this);
valid=false;
}
var prevTime=null;
for(var i=0;i!==nKeys;i++){
var currTime=times[i];
if(typeof currTime==='number'&&isNaN(currTime)){
console.error("time is not a valid number",this,i,currTime);
valid=false;
break;
}
if(prevTime!==null&&prevTime>currTime){
console.error("out of order keys",this,i,currTime,prevTime);
valid=false;
break;
}
prevTime=currTime;
}
if(values!==undefined){
if(exports.AnimationUtils.isTypedArray(values)){
for(var i=0,n=values.length;i!==n;++i){
var value=values[i];
if(isNaN(value)){
console.error("value is not a valid number",this,i,value);
valid=false;
break;
}
}
}
}
return valid;
},
optimize:function optimize(){
var times=this.times,
values=this.values,
stride=this.getValueSize(),
writeIndex=1;
for(var i=1,n=times.length-1;i<=n;++i){
var keep=false;
var time=times[i];
var timeNext=times[i+1];
if(time!==timeNext&&(i!==1||time!==time[0])){
var offset=i*stride,
offsetP=offset-stride,
offsetN=offset+stride;
for(var j=0;j!==stride;++j){
var value=values[offset+j];
if(value!==values[offsetP+j]||
value!==values[offsetN+j]){
keep=true;
break;
}
}
}
if(keep){
if(i!==writeIndex){
times[writeIndex]=times[i];
var readOffset=i*stride,
writeOffset=writeIndex*stride;
for(var j=0;j!==stride;++j){
values[writeOffset+j]=values[readOffset+j];
}
}
++writeIndex;
}
}
if(writeIndex!==times.length){
this.times=exports.AnimationUtils.arraySlice(times,0,writeIndex);
this.values=exports.AnimationUtils.arraySlice(values,0,writeIndex*stride);
}
return this;
}};
function KeyframeTrackConstructor(name,times,values,interpolation){
if(name===undefined)throw new Error("track name is undefined");
if(times===undefined||times.length===0){
throw new Error("no keyframes in track named "+name);
}
this.name=name;
this.times=exports.AnimationUtils.convertArray(times,this.TimeBufferType);
this.values=exports.AnimationUtils.convertArray(values,this.ValueBufferType);
this.setInterpolation(interpolation||this.DefaultInterpolation);
this.validate();
this.optimize();
}
function VectorKeyframeTrack(name,times,values,interpolation){
KeyframeTrackConstructor.call(this,name,times,values,interpolation);
}
VectorKeyframeTrack.prototype=
babelHelpers.extends(Object.create(KeyframeTrackPrototype),{
constructor:VectorKeyframeTrack,
ValueTypeName:'vector'});
function QuaternionLinearInterpolant(
parameterPositions,sampleValues,sampleSize,resultBuffer){
Interpolant.call(
this,parameterPositions,sampleValues,sampleSize,resultBuffer);
}
QuaternionLinearInterpolant.prototype=
babelHelpers.extends(Object.create(Interpolant.prototype),{
constructor:QuaternionLinearInterpolant,
interpolate_:function interpolate_(i1,t0,t,t1){
var result=this.resultBuffer,
values=this.sampleValues,
stride=this.valueSize,
offset=i1*stride,
alpha=(t-t0)/(t1-t0);
for(var end=offset+stride;offset!==end;offset+=4){
Quaternion.slerpFlat(result,0,
values,offset-stride,values,offset,alpha);
}
return result;
}});
function QuaternionKeyframeTrack(name,times,values,interpolation){
KeyframeTrackConstructor.call(this,name,times,values,interpolation);
}
QuaternionKeyframeTrack.prototype=
babelHelpers.extends(Object.create(KeyframeTrackPrototype),{
constructor:QuaternionKeyframeTrack,
ValueTypeName:'quaternion',
DefaultInterpolation:InterpolateLinear,
InterpolantFactoryMethodLinear:function InterpolantFactoryMethodLinear(result){
return new QuaternionLinearInterpolant(
this.times,this.values,this.getValueSize(),result);
},
InterpolantFactoryMethodSmooth:undefined});
function NumberKeyframeTrack(name,times,values,interpolation){
KeyframeTrackConstructor.call(this,name,times,values,interpolation);
}
NumberKeyframeTrack.prototype=
babelHelpers.extends(Object.create(KeyframeTrackPrototype),{
constructor:NumberKeyframeTrack,
ValueTypeName:'number'});
function StringKeyframeTrack(name,times,values,interpolation){
KeyframeTrackConstructor.call(this,name,times,values,interpolation);
}
StringKeyframeTrack.prototype=
babelHelpers.extends(Object.create(KeyframeTrackPrototype),{
constructor:StringKeyframeTrack,
ValueTypeName:'string',
ValueBufferType:Array,
DefaultInterpolation:InterpolateDiscrete,
InterpolantFactoryMethodLinear:undefined,
InterpolantFactoryMethodSmooth:undefined});
function BooleanKeyframeTrack(name,times,values){
KeyframeTrackConstructor.call(this,name,times,values);
}
BooleanKeyframeTrack.prototype=
babelHelpers.extends(Object.create(KeyframeTrackPrototype),{
constructor:BooleanKeyframeTrack,
ValueTypeName:'bool',
ValueBufferType:Array,
DefaultInterpolation:InterpolateDiscrete,
InterpolantFactoryMethodLinear:undefined,
InterpolantFactoryMethodSmooth:undefined});
function ColorKeyframeTrack(name,times,values,interpolation){
KeyframeTrackConstructor.call(this,name,times,values,interpolation);
}
ColorKeyframeTrack.prototype=
babelHelpers.extends(Object.create(KeyframeTrackPrototype),{
constructor:ColorKeyframeTrack,
ValueTypeName:'color'});
function KeyframeTrack(name,times,values,interpolation){
KeyframeTrackConstructor.apply(this,arguments);
}
KeyframeTrack.prototype=KeyframeTrackPrototype;
KeyframeTrackPrototype.constructor=KeyframeTrack;
babelHelpers.extends(KeyframeTrack,{
parse:function parse(json){
if(json.type===undefined){
throw new Error("track type undefined, can not parse");
}
var trackType=KeyframeTrack._getTrackTypeForValueTypeName(json.type);
if(json.times===undefined){
var times=[],values=[];
exports.AnimationUtils.flattenJSON(json.keys,times,values,'value');
json.times=times;
json.values=values;
}
if(trackType.parse!==undefined){
return trackType.parse(json);
}else{
return new trackType(
json.name,json.times,json.values,json.interpolation);
}
},
toJSON:function toJSON(track){
var trackType=track.constructor;
var json;
if(trackType.toJSON!==undefined){
json=trackType.toJSON(track);
}else{
json={
'name':track.name,
'times':exports.AnimationUtils.convertArray(track.times,Array),
'values':exports.AnimationUtils.convertArray(track.values,Array)};
var interpolation=track.getInterpolation();
if(interpolation!==track.DefaultInterpolation){
json.interpolation=interpolation;
}
}
json.type=track.ValueTypeName;
return json;
},
_getTrackTypeForValueTypeName:function _getTrackTypeForValueTypeName(typeName){
switch(typeName.toLowerCase()){
case"scalar":
case"double":
case"float":
case"number":
case"integer":
return NumberKeyframeTrack;
case"vector":
case"vector2":
case"vector3":
case"vector4":
return VectorKeyframeTrack;
case"color":
return ColorKeyframeTrack;
case"quaternion":
return QuaternionKeyframeTrack;
case"bool":
case"boolean":
return BooleanKeyframeTrack;
case"string":
return StringKeyframeTrack;}
throw new Error("Unsupported typeName: "+typeName);
}});
function AnimationClip(name,duration,tracks){
this.name=name;
this.tracks=tracks;
this.duration=duration!==undefined?duration:-1;
this.uuid=exports.Math.generateUUID();
if(this.duration<0){
this.resetDuration();
}
this.trim();
this.optimize();
}
AnimationClip.prototype={
constructor:AnimationClip,
resetDuration:function resetDuration(){
var tracks=this.tracks,
duration=0;
for(var i=0,n=tracks.length;i!==n;++i){
var track=this.tracks[i];
duration=Math.max(
duration,track.times[track.times.length-1]);
}
this.duration=duration;
},
trim:function trim(){
for(var i=0;i<this.tracks.length;i++){
this.tracks[i].trim(0,this.duration);
}
return this;
},
optimize:function optimize(){
for(var i=0;i<this.tracks.length;i++){
this.tracks[i].optimize();
}
return this;
}};
babelHelpers.extends(AnimationClip,{
parse:function parse(json){
var tracks=[],
jsonTracks=json.tracks,
frameTime=1.0/(json.fps||1.0);
for(var i=0,n=jsonTracks.length;i!==n;++i){
tracks.push(KeyframeTrack.parse(jsonTracks[i]).scale(frameTime));
}
return new AnimationClip(json.name,json.duration,tracks);
},
toJSON:function toJSON(clip){
var tracks=[],
clipTracks=clip.tracks;
var json={
'name':clip.name,
'duration':clip.duration,
'tracks':tracks};
for(var i=0,n=clipTracks.length;i!==n;++i){
tracks.push(KeyframeTrack.toJSON(clipTracks[i]));
}
return json;
},
CreateFromMorphTargetSequence:function CreateFromMorphTargetSequence(name,morphTargetSequence,fps,noLoop){
var numMorphTargets=morphTargetSequence.length;
var tracks=[];
for(var i=0;i<numMorphTargets;i++){
var times=[];
var values=[];
times.push(
(i+numMorphTargets-1)%numMorphTargets,
i,
(i+1)%numMorphTargets);
values.push(0,1,0);
var order=exports.AnimationUtils.getKeyframeOrder(times);
times=exports.AnimationUtils.sortedArray(times,1,order);
values=exports.AnimationUtils.sortedArray(values,1,order);
if(!noLoop&&times[0]===0){
times.push(numMorphTargets);
values.push(values[0]);
}
tracks.push(
new NumberKeyframeTrack(
'.morphTargetInfluences['+morphTargetSequence[i].name+']',
times,values).
scale(1.0/fps));
}
return new AnimationClip(name,-1,tracks);
},
findByName:function findByName(objectOrClipArray,name){
var clipArray=objectOrClipArray;
if(!Array.isArray(objectOrClipArray)){
var o=objectOrClipArray;
clipArray=o.geometry&&o.geometry.animations||o.animations;
}
for(var i=0;i<clipArray.length;i++){
if(clipArray[i].name===name){
return clipArray[i];
}
}
return null;
},
CreateClipsFromMorphTargetSequences:function CreateClipsFromMorphTargetSequences(morphTargets,fps,noLoop){
var animationToMorphTargets={};
var pattern=/^([\w-]*?)([\d]+)$/;
for(var i=0,il=morphTargets.length;i<il;i++){
var morphTarget=morphTargets[i];
var parts=morphTarget.name.match(pattern);
if(parts&&parts.length>1){
var name=parts[1];
var animationMorphTargets=animationToMorphTargets[name];
if(!animationMorphTargets){
animationToMorphTargets[name]=animationMorphTargets=[];
}
animationMorphTargets.push(morphTarget);
}
}
var clips=[];
for(var name in animationToMorphTargets){
clips.push(AnimationClip.CreateFromMorphTargetSequence(name,animationToMorphTargets[name],fps,noLoop));
}
return clips;
},
parseAnimation:function parseAnimation(animation,bones,nodeName){
if(!animation){
console.error(" no animation in JSONLoader data");
return null;
}
var addNonemptyTrack=function addNonemptyTrack(
trackType,trackName,animationKeys,propertyName,destTracks){
if(animationKeys.length!==0){
var times=[];
var values=[];
exports.AnimationUtils.flattenJSON(
animationKeys,times,values,propertyName);
if(times.length!==0){
destTracks.push(new trackType(trackName,times,values));
}
}
};
var tracks=[];
var clipName=animation.name||'default';
var duration=animation.length||-1;
var fps=animation.fps||30;
var hierarchyTracks=animation.hierarchy||[];
for(var h=0;h<hierarchyTracks.length;h++){
var animationKeys=hierarchyTracks[h].keys;
if(!animationKeys||animationKeys.length===0)continue;
if(animationKeys[0].morphTargets){
var morphTargetNames={};
for(var k=0;k<animationKeys.length;k++){
if(animationKeys[k].morphTargets){
for(var m=0;m<animationKeys[k].morphTargets.length;m++){
morphTargetNames[animationKeys[k].morphTargets[m]]=-1;
}
}
}
for(var morphTargetName in morphTargetNames){
var times=[];
var values=[];
for(var m=0;
m!==animationKeys[k].morphTargets.length;++m){
var animationKey=animationKeys[k];
times.push(animationKey.time);
values.push(animationKey.morphTarget===morphTargetName?1:0);
}
tracks.push(new NumberKeyframeTrack(
'.morphTargetInfluence['+morphTargetName+']',times,values));
}
duration=morphTargetNames.length*(fps||1.0);
}else{
var boneName='.bones['+bones[h].name+']';
addNonemptyTrack(
VectorKeyframeTrack,boneName+'.position',
animationKeys,'pos',tracks);
addNonemptyTrack(
QuaternionKeyframeTrack,boneName+'.quaternion',
animationKeys,'rot',tracks);
addNonemptyTrack(
VectorKeyframeTrack,boneName+'.scale',
animationKeys,'scl',tracks);
}
}
if(tracks.length===0){
return null;
}
var clip=new AnimationClip(clipName,duration,tracks);
return clip;
}});
function MaterialLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
this.textures={};
}
babelHelpers.extends(MaterialLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var loader=new XHRLoader(scope.manager);
loader.load(url,function(text){
onLoad(scope.parse(JSON.parse(text)));
},onProgress,onError);
},
setTextures:function setTextures(value){
this.textures=value;
},
parse:function parse(json){
var textures=this.textures;
function getTexture(name){
if(textures[name]===undefined){
console.warn('THREE.MaterialLoader: Undefined texture',name);
}
return textures[name];
}
var material=new THREE[json.type]();
if(json.uuid!==undefined)material.uuid=json.uuid;
if(json.name!==undefined)material.name=json.name;
if(json.color!==undefined)material.color.setHex(json.color);
if(json.roughness!==undefined)material.roughness=json.roughness;
if(json.metalness!==undefined)material.metalness=json.metalness;
if(json.emissive!==undefined)material.emissive.setHex(json.emissive);
if(json.specular!==undefined)material.specular.setHex(json.specular);
if(json.shininess!==undefined)material.shininess=json.shininess;
if(json.uniforms!==undefined)material.uniforms=json.uniforms;
if(json.vertexShader!==undefined)material.vertexShader=json.vertexShader;
if(json.fragmentShader!==undefined)material.fragmentShader=json.fragmentShader;
if(json.vertexColors!==undefined)material.vertexColors=json.vertexColors;
if(json.fog!==undefined)material.fog=json.fog;
if(json.shading!==undefined)material.shading=json.shading;
if(json.blending!==undefined)material.blending=json.blending;
if(json.side!==undefined)material.side=json.side;
if(json.opacity!==undefined)material.opacity=json.opacity;
if(json.transparent!==undefined)material.transparent=json.transparent;
if(json.alphaTest!==undefined)material.alphaTest=json.alphaTest;
if(json.depthTest!==undefined)material.depthTest=json.depthTest;
if(json.depthWrite!==undefined)material.depthWrite=json.depthWrite;
if(json.colorWrite!==undefined)material.colorWrite=json.colorWrite;
if(json.wireframe!==undefined)material.wireframe=json.wireframe;
if(json.wireframeLinewidth!==undefined)material.wireframeLinewidth=json.wireframeLinewidth;
if(json.wireframeLinecap!==undefined)material.wireframeLinecap=json.wireframeLinecap;
if(json.wireframeLinejoin!==undefined)material.wireframeLinejoin=json.wireframeLinejoin;
if(json.skinning!==undefined)material.skinning=json.skinning;
if(json.morphTargets!==undefined)material.morphTargets=json.morphTargets;
if(json.size!==undefined)material.size=json.size;
if(json.sizeAttenuation!==undefined)material.sizeAttenuation=json.sizeAttenuation;
if(json.map!==undefined)material.map=getTexture(json.map);
if(json.alphaMap!==undefined){
material.alphaMap=getTexture(json.alphaMap);
material.transparent=true;
}
if(json.bumpMap!==undefined)material.bumpMap=getTexture(json.bumpMap);
if(json.bumpScale!==undefined)material.bumpScale=json.bumpScale;
if(json.normalMap!==undefined)material.normalMap=getTexture(json.normalMap);
if(json.normalScale!==undefined){
var normalScale=json.normalScale;
if(Array.isArray(normalScale)===false){
normalScale=[normalScale,normalScale];
}
material.normalScale=new Vector2().fromArray(normalScale);
}
if(json.displacementMap!==undefined)material.displacementMap=getTexture(json.displacementMap);
if(json.displacementScale!==undefined)material.displacementScale=json.displacementScale;
if(json.displacementBias!==undefined)material.displacementBias=json.displacementBias;
if(json.roughnessMap!==undefined)material.roughnessMap=getTexture(json.roughnessMap);
if(json.metalnessMap!==undefined)material.metalnessMap=getTexture(json.metalnessMap);
if(json.emissiveMap!==undefined)material.emissiveMap=getTexture(json.emissiveMap);
if(json.emissiveIntensity!==undefined)material.emissiveIntensity=json.emissiveIntensity;
if(json.specularMap!==undefined)material.specularMap=getTexture(json.specularMap);
if(json.envMap!==undefined)material.envMap=getTexture(json.envMap);
if(json.reflectivity!==undefined)material.reflectivity=json.reflectivity;
if(json.lightMap!==undefined)material.lightMap=getTexture(json.lightMap);
if(json.lightMapIntensity!==undefined)material.lightMapIntensity=json.lightMapIntensity;
if(json.aoMap!==undefined)material.aoMap=getTexture(json.aoMap);
if(json.aoMapIntensity!==undefined)material.aoMapIntensity=json.aoMapIntensity;
if(json.materials!==undefined){
for(var i=0,l=json.materials.length;i<l;i++){
material.materials.push(this.parse(json.materials[i]));
}
}
return material;
}});
function BufferGeometryLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(BufferGeometryLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var loader=new XHRLoader(scope.manager);
loader.load(url,function(text){
onLoad(scope.parse(JSON.parse(text)));
},onProgress,onError);
},
parse:function parse(json){
var geometry=new BufferGeometry();
var index=json.data.index;
var TYPED_ARRAYS={
'Int8Array':Int8Array,
'Uint8Array':Uint8Array,
'Uint8ClampedArray':Uint8ClampedArray,
'Int16Array':Int16Array,
'Uint16Array':Uint16Array,
'Int32Array':Int32Array,
'Uint32Array':Uint32Array,
'Float32Array':Float32Array,
'Float64Array':Float64Array};
if(index!==undefined){
var typedArray=new TYPED_ARRAYS[index.type](index.array);
geometry.setIndex(new BufferAttribute(typedArray,1));
}
var attributes=json.data.attributes;
for(var key in attributes){
var attribute=attributes[key];
var typedArray=new TYPED_ARRAYS[attribute.type](attribute.array);
geometry.addAttribute(key,new BufferAttribute(typedArray,attribute.itemSize,attribute.normalized));
}
var groups=json.data.groups||json.data.drawcalls||json.data.offsets;
if(groups!==undefined){
for(var i=0,n=groups.length;i!==n;++i){
var group=groups[i];
geometry.addGroup(group.start,group.count,group.materialIndex);
}
}
var boundingSphere=json.data.boundingSphere;
if(boundingSphere!==undefined){
var center=new Vector3();
if(boundingSphere.center!==undefined){
center.fromArray(boundingSphere.center);
}
geometry.boundingSphere=new Sphere(center,boundingSphere.radius);
}
return geometry;
}});
function Loader(){
this.onLoadStart=function(){};
this.onLoadProgress=function(){};
this.onLoadComplete=function(){};
}
Loader.prototype={
constructor:Loader,
crossOrigin:undefined,
extractUrlBase:function extractUrlBase(url){
var parts=url.split('/');
if(parts.length===1)return'./';
parts.pop();
return parts.join('/')+'/';
},
initMaterials:function initMaterials(materials,texturePath,crossOrigin){
var array=[];
for(var i=0;i<materials.length;++i){
array[i]=this.createMaterial(materials[i],texturePath,crossOrigin);
}
return array;
},
createMaterial:function(){
var color,textureLoader,materialLoader;
return function createMaterial(m,texturePath,crossOrigin){
if(color===undefined)color=new Color();
if(textureLoader===undefined)textureLoader=new TextureLoader();
if(materialLoader===undefined)materialLoader=new MaterialLoader();
var textures={};
function loadTexture(path,repeat,offset,wrap,anisotropy){
var fullPath=texturePath+path;
var loader=Loader.Handlers.get(fullPath);
var texture;
if(loader!==null){
texture=loader.load(fullPath);
}else{
textureLoader.setCrossOrigin(crossOrigin);
texture=textureLoader.load(fullPath);
}
if(repeat!==undefined){
texture.repeat.fromArray(repeat);
if(repeat[0]!==1)texture.wrapS=RepeatWrapping;
if(repeat[1]!==1)texture.wrapT=RepeatWrapping;
}
if(offset!==undefined){
texture.offset.fromArray(offset);
}
if(wrap!==undefined){
if(wrap[0]==='repeat')texture.wrapS=RepeatWrapping;
if(wrap[0]==='mirror')texture.wrapS=MirroredRepeatWrapping;
if(wrap[1]==='repeat')texture.wrapT=RepeatWrapping;
if(wrap[1]==='mirror')texture.wrapT=MirroredRepeatWrapping;
}
if(anisotropy!==undefined){
texture.anisotropy=anisotropy;
}
var uuid=exports.Math.generateUUID();
textures[uuid]=texture;
return uuid;
}
var json={
uuid:exports.Math.generateUUID(),
type:'MeshLambertMaterial'};
for(var name in m){
var value=m[name];
switch(name){
case'DbgColor':
case'DbgIndex':
case'opticalDensity':
case'illumination':
break;
case'DbgName':
json.name=value;
break;
case'blending':
json.blending=THREE[value];
break;
case'colorAmbient':
case'mapAmbient':
console.warn('THREE.Loader.createMaterial:',name,'is no longer supported.');
break;
case'colorDiffuse':
json.color=color.fromArray(value).getHex();
break;
case'colorSpecular':
json.specular=color.fromArray(value).getHex();
break;
case'colorEmissive':
json.emissive=color.fromArray(value).getHex();
break;
case'specularCoef':
json.shininess=value;
break;
case'shading':
if(value.toLowerCase()==='basic')json.type='MeshBasicMaterial';
if(value.toLowerCase()==='phong')json.type='MeshPhongMaterial';
if(value.toLowerCase()==='standard')json.type='MeshStandardMaterial';
break;
case'mapDiffuse':
json.map=loadTexture(value,m.mapDiffuseRepeat,m.mapDiffuseOffset,m.mapDiffuseWrap,m.mapDiffuseAnisotropy);
break;
case'mapDiffuseRepeat':
case'mapDiffuseOffset':
case'mapDiffuseWrap':
case'mapDiffuseAnisotropy':
break;
case'mapEmissive':
json.emissiveMap=loadTexture(value,m.mapEmissiveRepeat,m.mapEmissiveOffset,m.mapEmissiveWrap,m.mapEmissiveAnisotropy);
break;
case'mapEmissiveRepeat':
case'mapEmissiveOffset':
case'mapEmissiveWrap':
case'mapEmissiveAnisotropy':
break;
case'mapLight':
json.lightMap=loadTexture(value,m.mapLightRepeat,m.mapLightOffset,m.mapLightWrap,m.mapLightAnisotropy);
break;
case'mapLightRepeat':
case'mapLightOffset':
case'mapLightWrap':
case'mapLightAnisotropy':
break;
case'mapAO':
json.aoMap=loadTexture(value,m.mapAORepeat,m.mapAOOffset,m.mapAOWrap,m.mapAOAnisotropy);
break;
case'mapAORepeat':
case'mapAOOffset':
case'mapAOWrap':
case'mapAOAnisotropy':
break;
case'mapBump':
json.bumpMap=loadTexture(value,m.mapBumpRepeat,m.mapBumpOffset,m.mapBumpWrap,m.mapBumpAnisotropy);
break;
case'mapBumpScale':
json.bumpScale=value;
break;
case'mapBumpRepeat':
case'mapBumpOffset':
case'mapBumpWrap':
case'mapBumpAnisotropy':
break;
case'mapNormal':
json.normalMap=loadTexture(value,m.mapNormalRepeat,m.mapNormalOffset,m.mapNormalWrap,m.mapNormalAnisotropy);
break;
case'mapNormalFactor':
json.normalScale=[value,value];
break;
case'mapNormalRepeat':
case'mapNormalOffset':
case'mapNormalWrap':
case'mapNormalAnisotropy':
break;
case'mapSpecular':
json.specularMap=loadTexture(value,m.mapSpecularRepeat,m.mapSpecularOffset,m.mapSpecularWrap,m.mapSpecularAnisotropy);
break;
case'mapSpecularRepeat':
case'mapSpecularOffset':
case'mapSpecularWrap':
case'mapSpecularAnisotropy':
break;
case'mapMetalness':
json.metalnessMap=loadTexture(value,m.mapMetalnessRepeat,m.mapMetalnessOffset,m.mapMetalnessWrap,m.mapMetalnessAnisotropy);
break;
case'mapMetalnessRepeat':
case'mapMetalnessOffset':
case'mapMetalnessWrap':
case'mapMetalnessAnisotropy':
break;
case'mapRoughness':
json.roughnessMap=loadTexture(value,m.mapRoughnessRepeat,m.mapRoughnessOffset,m.mapRoughnessWrap,m.mapRoughnessAnisotropy);
break;
case'mapRoughnessRepeat':
case'mapRoughnessOffset':
case'mapRoughnessWrap':
case'mapRoughnessAnisotropy':
break;
case'mapAlpha':
json.alphaMap=loadTexture(value,m.mapAlphaRepeat,m.mapAlphaOffset,m.mapAlphaWrap,m.mapAlphaAnisotropy);
break;
case'mapAlphaRepeat':
case'mapAlphaOffset':
case'mapAlphaWrap':
case'mapAlphaAnisotropy':
break;
case'flipSided':
json.side=BackSide;
break;
case'doubleSided':
json.side=DoubleSide;
break;
case'transparency':
console.warn('THREE.Loader.createMaterial: transparency has been renamed to opacity');
json.opacity=value;
break;
case'depthTest':
case'depthWrite':
case'colorWrite':
case'opacity':
case'reflectivity':
case'transparent':
case'visible':
case'wireframe':
json[name]=value;
break;
case'vertexColors':
if(value===true)json.vertexColors=VertexColors;
if(value==='face')json.vertexColors=FaceColors;
break;
default:
console.error('THREE.Loader.createMaterial: Unsupported',name,value);
break;}
}
if(json.type==='MeshBasicMaterial')delete json.emissive;
if(json.type!=='MeshPhongMaterial')delete json.specular;
if(json.opacity<1)json.transparent=true;
materialLoader.setTextures(textures);
return materialLoader.parse(json);
};
}()};
Loader.Handlers={
handlers:[],
add:function add(regex,loader){
this.handlers.push(regex,loader);
},
get:function get(file){
var handlers=this.handlers;
for(var i=0,l=handlers.length;i<l;i+=2){
var regex=handlers[i];
var loader=handlers[i+1];
if(regex.test(file)){
return loader;
}
}
return null;
}};
function JSONLoader(manager){
if(typeof manager==='boolean'){
console.warn('THREE.JSONLoader: showStatus parameter has been removed from constructor.');
manager=undefined;
}
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
this.withCredentials=false;
}
babelHelpers.extends(JSONLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var texturePath=this.texturePath&&typeof this.texturePath==="string"?this.texturePath:Loader.prototype.extractUrlBase(url);
var loader=new XHRLoader(this.manager);
loader.setWithCredentials(this.withCredentials);
loader.load(url,function(text){
var json=JSON.parse(text);
var metadata=json.metadata;
if(metadata!==undefined){
var type=metadata.type;
if(type!==undefined){
if(type.toLowerCase()==='object'){
console.error('THREE.JSONLoader: '+url+' should be loaded with THREE.ObjectLoader instead.');
return;
}
if(type.toLowerCase()==='scene'){
console.error('THREE.JSONLoader: '+url+' should be loaded with THREE.SceneLoader instead.');
return;
}
}
}
var object=scope.parse(json,texturePath);
onLoad(object.geometry,object.materials);
},onProgress,onError);
},
setTexturePath:function setTexturePath(value){
this.texturePath=value;
},
parse:function parse(json,texturePath){
var geometry=new Geometry(),
scale=json.scale!==undefined?1.0/json.scale:1.0;
parseModel(scale);
parseSkin();
parseMorphing(scale);
parseAnimations();
geometry.computeFaceNormals();
geometry.computeBoundingSphere();
function parseModel(scale){
function isBitSet(value,position){
return value&1<<position;
}
var i,j,fi,
offset,zLength,
colorIndex,normalIndex,uvIndex,materialIndex,
type,
isQuad,
hasMaterial,
hasFaceVertexUv,
hasFaceNormal,hasFaceVertexNormal,
hasFaceColor,hasFaceVertexColor,
vertex,face,faceA,faceB,hex,normal,
uvLayer,uv,u,v,
faces=json.faces,
vertices=json.vertices,
normals=json.normals,
colors=json.colors,
nUvLayers=0;
if(json.uvs!==undefined){
for(i=0;i<json.uvs.length;i++){
if(json.uvs[i].length)nUvLayers++;
}
for(i=0;i<nUvLayers;i++){
geometry.faceVertexUvs[i]=[];
}
}
offset=0;
zLength=vertices.length;
while(offset<zLength){
vertex=new Vector3();
vertex.x=vertices[offset++]*scale;
vertex.y=vertices[offset++]*scale;
vertex.z=vertices[offset++]*scale;
geometry.vertices.push(vertex);
}
offset=0;
zLength=faces.length;
while(offset<zLength){
type=faces[offset++];
isQuad=isBitSet(type,0);
hasMaterial=isBitSet(type,1);
hasFaceVertexUv=isBitSet(type,3);
hasFaceNormal=isBitSet(type,4);
hasFaceVertexNormal=isBitSet(type,5);
hasFaceColor=isBitSet(type,6);
hasFaceVertexColor=isBitSet(type,7);
if(isQuad){
faceA=new Face3();
faceA.a=faces[offset];
faceA.b=faces[offset+1];
faceA.c=faces[offset+3];
faceB=new Face3();
faceB.a=faces[offset+1];
faceB.b=faces[offset+2];
faceB.c=faces[offset+3];
offset+=4;
if(hasMaterial){
materialIndex=faces[offset++];
faceA.materialIndex=materialIndex;
faceB.materialIndex=materialIndex;
}
fi=geometry.faces.length;
if(hasFaceVertexUv){
for(i=0;i<nUvLayers;i++){
uvLayer=json.uvs[i];
geometry.faceVertexUvs[i][fi]=[];
geometry.faceVertexUvs[i][fi+1]=[];
for(j=0;j<4;j++){
uvIndex=faces[offset++];
u=uvLayer[uvIndex*2];
v=uvLayer[uvIndex*2+1];
uv=new Vector2(u,v);
if(j!==2)geometry.faceVertexUvs[i][fi].push(uv);
if(j!==0)geometry.faceVertexUvs[i][fi+1].push(uv);
}
}
}
if(hasFaceNormal){
normalIndex=faces[offset++]*3;
faceA.normal.set(
normals[normalIndex++],
normals[normalIndex++],
normals[normalIndex]);
faceB.normal.copy(faceA.normal);
}
if(hasFaceVertexNormal){
for(i=0;i<4;i++){
normalIndex=faces[offset++]*3;
normal=new Vector3(
normals[normalIndex++],
normals[normalIndex++],
normals[normalIndex]);
if(i!==2)faceA.vertexNormals.push(normal);
if(i!==0)faceB.vertexNormals.push(normal);
}
}
if(hasFaceColor){
colorIndex=faces[offset++];
hex=colors[colorIndex];
faceA.color.setHex(hex);
faceB.color.setHex(hex);
}
if(hasFaceVertexColor){
for(i=0;i<4;i++){
colorIndex=faces[offset++];
hex=colors[colorIndex];
if(i!==2)faceA.vertexColors.push(new Color(hex));
if(i!==0)faceB.vertexColors.push(new Color(hex));
}
}
geometry.faces.push(faceA);
geometry.faces.push(faceB);
}else{
face=new Face3();
face.a=faces[offset++];
face.b=faces[offset++];
face.c=faces[offset++];
if(hasMaterial){
materialIndex=faces[offset++];
face.materialIndex=materialIndex;
}
fi=geometry.faces.length;
if(hasFaceVertexUv){
for(i=0;i<nUvLayers;i++){
uvLayer=json.uvs[i];
geometry.faceVertexUvs[i][fi]=[];
for(j=0;j<3;j++){
uvIndex=faces[offset++];
u=uvLayer[uvIndex*2];
v=uvLayer[uvIndex*2+1];
uv=new Vector2(u,v);
geometry.faceVertexUvs[i][fi].push(uv);
}
}
}
if(hasFaceNormal){
normalIndex=faces[offset++]*3;
face.normal.set(
normals[normalIndex++],
normals[normalIndex++],
normals[normalIndex]);
}
if(hasFaceVertexNormal){
for(i=0;i<3;i++){
normalIndex=faces[offset++]*3;
normal=new Vector3(
normals[normalIndex++],
normals[normalIndex++],
normals[normalIndex]);
face.vertexNormals.push(normal);
}
}
if(hasFaceColor){
colorIndex=faces[offset++];
face.color.setHex(colors[colorIndex]);
}
if(hasFaceVertexColor){
for(i=0;i<3;i++){
colorIndex=faces[offset++];
face.vertexColors.push(new Color(colors[colorIndex]));
}
}
geometry.faces.push(face);
}
}
}
function parseSkin(){
var influencesPerVertex=json.influencesPerVertex!==undefined?json.influencesPerVertex:2;
if(json.skinWeights){
for(var i=0,l=json.skinWeights.length;i<l;i+=influencesPerVertex){
var x=json.skinWeights[i];
var y=influencesPerVertex>1?json.skinWeights[i+1]:0;
var z=influencesPerVertex>2?json.skinWeights[i+2]:0;
var w=influencesPerVertex>3?json.skinWeights[i+3]:0;
geometry.skinWeights.push(new Vector4(x,y,z,w));
}
}
if(json.skinIndices){
for(var i=0,l=json.skinIndices.length;i<l;i+=influencesPerVertex){
var a=json.skinIndices[i];
var b=influencesPerVertex>1?json.skinIndices[i+1]:0;
var c=influencesPerVertex>2?json.skinIndices[i+2]:0;
var d=influencesPerVertex>3?json.skinIndices[i+3]:0;
geometry.skinIndices.push(new Vector4(a,b,c,d));
}
}
geometry.bones=json.bones;
if(geometry.bones&&geometry.bones.length>0&&(geometry.skinWeights.length!==geometry.skinIndices.length||geometry.skinIndices.length!==geometry.vertices.length)){
console.warn('When skinning, number of vertices ('+geometry.vertices.length+'), skinIndices ('+
geometry.skinIndices.length+'), and skinWeights ('+geometry.skinWeights.length+') should match.');
}
}
function parseMorphing(scale){
if(json.morphTargets!==undefined){
for(var i=0,l=json.morphTargets.length;i<l;i++){
geometry.morphTargets[i]={};
geometry.morphTargets[i].name=json.morphTargets[i].name;
geometry.morphTargets[i].vertices=[];
var dstVertices=geometry.morphTargets[i].vertices;
var srcVertices=json.morphTargets[i].vertices;
for(var v=0,vl=srcVertices.length;v<vl;v+=3){
var vertex=new Vector3();
vertex.x=srcVertices[v]*scale;
vertex.y=srcVertices[v+1]*scale;
vertex.z=srcVertices[v+2]*scale;
dstVertices.push(vertex);
}
}
}
if(json.morphColors!==undefined&&json.morphColors.length>0){
console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.');
var faces=geometry.faces;
var morphColors=json.morphColors[0].colors;
for(var i=0,l=faces.length;i<l;i++){
faces[i].color.fromArray(morphColors,i*3);
}
}
}
function parseAnimations(){
var outputAnimations=[];
var animations=[];
if(json.animation!==undefined){
animations.push(json.animation);
}
if(json.animations!==undefined){
if(json.animations.length){
animations=animations.concat(json.animations);
}else{
animations.push(json.animations);
}
}
for(var i=0;i<animations.length;i++){
var clip=AnimationClip.parseAnimation(animations[i],geometry.bones);
if(clip)outputAnimations.push(clip);
}
if(geometry.morphTargets){
var morphAnimationClips=AnimationClip.CreateClipsFromMorphTargetSequences(geometry.morphTargets,10);
outputAnimations=outputAnimations.concat(morphAnimationClips);
}
if(outputAnimations.length>0)geometry.animations=outputAnimations;
}
if(json.materials===undefined||json.materials.length===0){
return{geometry:geometry};
}else{
var materials=Loader.prototype.initMaterials(json.materials,texturePath,this.crossOrigin);
return{geometry:geometry,materials:materials};
}
}});
function ObjectLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
this.texturePath='';
}
babelHelpers.extends(ObjectLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
if(this.texturePath===''){
this.texturePath=url.substring(0,url.lastIndexOf('/')+1);
}
var scope=this;
var loader=new XHRLoader(scope.manager);
loader.load(url,function(text){
scope.parse(JSON.parse(text),onLoad);
},onProgress,onError);
},
setTexturePath:function setTexturePath(value){
this.texturePath=value;
},
setCrossOrigin:function setCrossOrigin(value){
this.crossOrigin=value;
},
parse:function parse(json,onLoad){
var geometries=this.parseGeometries(json.geometries);
var images=this.parseImages(json.images,function(){
if(onLoad!==undefined)onLoad(object);
});
var textures=this.parseTextures(json.textures,images);
var materials=this.parseMaterials(json.materials,textures);
var object=this.parseObject(json.object,geometries,materials);
if(json.animations){
object.animations=this.parseAnimations(json.animations);
}
if(json.images===undefined||json.images.length===0){
if(onLoad!==undefined)onLoad(object);
}
return object;
},
parseGeometries:function parseGeometries(json){
var geometries={};
if(json!==undefined){
var geometryLoader=new JSONLoader();
var bufferGeometryLoader=new BufferGeometryLoader();
for(var i=0,l=json.length;i<l;i++){
var geometry;
var data=json[i];
switch(data.type){
case'PlaneGeometry':
case'PlaneBufferGeometry':
geometry=new THREE[data.type](
data.width,
data.height,
data.widthSegments,
data.heightSegments);
break;
case'BoxGeometry':
case'BoxBufferGeometry':
case'CubeGeometry':
geometry=new THREE[data.type](
data.width,
data.height,
data.depth,
data.widthSegments,
data.heightSegments,
data.depthSegments);
break;
case'CircleGeometry':
case'CircleBufferGeometry':
geometry=new THREE[data.type](
data.radius,
data.segments,
data.thetaStart,
data.thetaLength);
break;
case'CylinderGeometry':
case'CylinderBufferGeometry':
geometry=new THREE[data.type](
data.radiusTop,
data.radiusBottom,
data.height,
data.radialSegments,
data.heightSegments,
data.openEnded,
data.thetaStart,
data.thetaLength);
break;
case'ConeGeometry':
case'ConeBufferGeometry':
geometry=new THREE[data.type](
data.radius,
data.height,
data.radialSegments,
data.heightSegments,
data.openEnded,
data.thetaStart,
data.thetaLength);
break;
case'SphereGeometry':
case'SphereBufferGeometry':
geometry=new THREE[data.type](
data.radius,
data.widthSegments,
data.heightSegments,
data.phiStart,
data.phiLength,
data.thetaStart,
data.thetaLength);
break;
case'DodecahedronGeometry':
case'IcosahedronGeometry':
case'OctahedronGeometry':
case'TetrahedronGeometry':
geometry=new THREE[data.type](
data.radius,
data.detail);
break;
case'RingGeometry':
case'RingBufferGeometry':
geometry=new THREE[data.type](
data.innerRadius,
data.outerRadius,
data.thetaSegments,
data.phiSegments,
data.thetaStart,
data.thetaLength);
break;
case'TorusGeometry':
case'TorusBufferGeometry':
geometry=new THREE[data.type](
data.radius,
data.tube,
data.radialSegments,
data.tubularSegments,
data.arc);
break;
case'TorusKnotGeometry':
case'TorusKnotBufferGeometry':
geometry=new THREE[data.type](
data.radius,
data.tube,
data.tubularSegments,
data.radialSegments,
data.p,
data.q);
break;
case'LatheGeometry':
case'LatheBufferGeometry':
geometry=new THREE[data.type](
data.points,
data.segments,
data.phiStart,
data.phiLength);
break;
case'BufferGeometry':
geometry=bufferGeometryLoader.parse(data);
break;
case'Geometry':
geometry=geometryLoader.parse(data.data,this.texturePath).geometry;
break;
default:
console.warn('THREE.ObjectLoader: Unsupported geometry type "'+data.type+'"');
continue;}
geometry.uuid=data.uuid;
if(data.name!==undefined)geometry.name=data.name;
geometries[data.uuid]=geometry;
}
}
return geometries;
},
parseMaterials:function parseMaterials(json,textures){
var materials={};
if(json!==undefined){
var loader=new MaterialLoader();
loader.setTextures(textures);
for(var i=0,l=json.length;i<l;i++){
var material=loader.parse(json[i]);
materials[material.uuid]=material;
}
}
return materials;
},
parseAnimations:function parseAnimations(json){
var animations=[];
for(var i=0;i<json.length;i++){
var clip=AnimationClip.parse(json[i]);
animations.push(clip);
}
return animations;
},
parseImages:function parseImages(json,onLoad){
var scope=this;
var images={};
function loadImage(url){
scope.manager.itemStart(url);
return loader.load(url,function(){
scope.manager.itemEnd(url);
},undefined,function(){
scope.manager.itemError(url);
});
}
if(json!==undefined&&json.length>0){
var manager=new LoadingManager(onLoad);
var loader=new ImageLoader(manager);
loader.setCrossOrigin(this.crossOrigin);
for(var i=0,l=json.length;i<l;i++){
var image=json[i];
var path=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(image.url)?image.url:scope.texturePath+image.url;
images[image.uuid]=loadImage(path);
}
}
return images;
},
parseTextures:function parseTextures(json,images){
function parseConstant(value){
if(typeof value==='number')return value;
console.warn('THREE.ObjectLoader.parseTexture: Constant should be in numeric form.',value);
return THREE[value];
}
var textures={};
if(json!==undefined){
for(var i=0,l=json.length;i<l;i++){
var data=json[i];
if(data.image===undefined){
console.warn('THREE.ObjectLoader: No "image" specified for',data.uuid);
}
if(images[data.image]===undefined){
console.warn('THREE.ObjectLoader: Undefined image',data.image);
}
var texture=new Texture(images[data.image]);
texture.needsUpdate=true;
texture.uuid=data.uuid;
if(data.name!==undefined)texture.name=data.name;
if(data.mapping!==undefined)texture.mapping=parseConstant(data.mapping);
if(data.offset!==undefined)texture.offset.fromArray(data.offset);
if(data.repeat!==undefined)texture.repeat.fromArray(data.repeat);
if(data.wrap!==undefined){
texture.wrapS=parseConstant(data.wrap[0]);
texture.wrapT=parseConstant(data.wrap[1]);
}
if(data.minFilter!==undefined)texture.minFilter=parseConstant(data.minFilter);
if(data.magFilter!==undefined)texture.magFilter=parseConstant(data.magFilter);
if(data.anisotropy!==undefined)texture.anisotropy=data.anisotropy;
if(data.flipY!==undefined)texture.flipY=data.flipY;
textures[data.uuid]=texture;
}
}
return textures;
},
parseObject:function(){
var matrix=new Matrix4();
return function parseObject(data,geometries,materials){
var object;
function getGeometry(name){
if(geometries[name]===undefined){
console.warn('THREE.ObjectLoader: Undefined geometry',name);
}
return geometries[name];
}
function getMaterial(name){
if(name===undefined)return undefined;
if(materials[name]===undefined){
console.warn('THREE.ObjectLoader: Undefined material',name);
}
return materials[name];
}
switch(data.type){
case'Scene':
object=new Scene();
if(data.background!==undefined){
if(Number.isInteger(data.background)){
object.background=new THREE.Color(data.background);
}
}
if(data.fog!==undefined){
if(data.fog.type==='Fog'){
object.fog=new Fog(data.fog.color,data.fog.near,data.fog.far);
}else if(data.fog.type==='FogExp2'){
object.fog=new FogExp2(data.fog.color,data.fog.density);
}
}
break;
case'PerspectiveCamera':
object=new PerspectiveCamera(data.fov,data.aspect,data.near,data.far);
if(data.focus!==undefined)object.focus=data.focus;
if(data.zoom!==undefined)object.zoom=data.zoom;
if(data.filmGauge!==undefined)object.filmGauge=data.filmGauge;
if(data.filmOffset!==undefined)object.filmOffset=data.filmOffset;
if(data.view!==undefined)object.view=babelHelpers.extends({},data.view);
break;
case'OrthographicCamera':
object=new OrthographicCamera(data.left,data.right,data.top,data.bottom,data.near,data.far);
break;
case'AmbientLight':
object=new AmbientLight(data.color,data.intensity);
break;
case'DirectionalLight':
object=new DirectionalLight(data.color,data.intensity);
break;
case'PointLight':
object=new PointLight(data.color,data.intensity,data.distance,data.decay);
break;
case'SpotLight':
object=new SpotLight(data.color,data.intensity,data.distance,data.angle,data.penumbra,data.decay);
break;
case'HemisphereLight':
object=new HemisphereLight(data.color,data.groundColor,data.intensity);
break;
case'Mesh':
var geometry=getGeometry(data.geometry);
var material=getMaterial(data.material);
if(geometry.bones&&geometry.bones.length>0){
object=new SkinnedMesh(geometry,material);
}else{
object=new Mesh(geometry,material);
}
break;
case'LOD':
object=new LOD();
break;
case'Line':
object=new Line(getGeometry(data.geometry),getMaterial(data.material),data.mode);
break;
case'LineSegments':
object=new LineSegments(getGeometry(data.geometry),getMaterial(data.material));
break;
case'PointCloud':
case'Points':
object=new Points(getGeometry(data.geometry),getMaterial(data.material));
break;
case'Sprite':
object=new Sprite(getMaterial(data.material));
break;
case'Group':
object=new Group();
break;
default:
object=new Object3D();}
object.uuid=data.uuid;
if(data.name!==undefined)object.name=data.name;
if(data.matrix!==undefined){
matrix.fromArray(data.matrix);
matrix.decompose(object.position,object.quaternion,object.scale);
}else{
if(data.position!==undefined)object.position.fromArray(data.position);
if(data.rotation!==undefined)object.rotation.fromArray(data.rotation);
if(data.quaternion!==undefined)object.quaternion.fromArray(data.quaternion);
if(data.scale!==undefined)object.scale.fromArray(data.scale);
}
if(data.castShadow!==undefined)object.castShadow=data.castShadow;
if(data.receiveShadow!==undefined)object.receiveShadow=data.receiveShadow;
if(data.shadow){
if(data.shadow.bias!==undefined)object.shadow.bias=data.shadow.bias;
if(data.shadow.radius!==undefined)object.shadow.radius=data.shadow.radius;
if(data.shadow.mapSize!==undefined)object.shadow.mapSize.fromArray(data.shadow.mapSize);
if(data.shadow.camera!==undefined)object.shadow.camera=this.parseObject(data.shadow.camera);
}
if(data.visible!==undefined)object.visible=data.visible;
if(data.userData!==undefined)object.userData=data.userData;
if(data.children!==undefined){
for(var child in data.children){
object.add(this.parseObject(data.children[child],geometries,materials));
}
}
if(data.type==='LOD'){
var levels=data.levels;
for(var l=0;l<levels.length;l++){
var level=levels[l];
var child=object.getObjectByProperty('uuid',level.object);
if(child!==undefined){
object.addLevel(child,level.distance);
}
}
}
return object;
};
}()});
exports.ShapeUtils={
area:function area(contour){
var n=contour.length;
var a=0.0;
for(var p=n-1,q=0;q<n;p=q++){
a+=contour[p].x*contour[q].y-contour[q].x*contour[p].y;
}
return a*0.5;
},
triangulate:function(){
function snip(contour,u,v,w,n,verts){
var p;
var ax,ay,bx,by;
var cx,cy,px,py;
ax=contour[verts[u]].x;
ay=contour[verts[u]].y;
bx=contour[verts[v]].x;
by=contour[verts[v]].y;
cx=contour[verts[w]].x;
cy=contour[verts[w]].y;
if(Number.EPSILON>(bx-ax)*(cy-ay)-(by-ay)*(cx-ax))return false;
var aX,aY,bX,bY,cX,cY;
var apx,apy,bpx,bpy,cpx,cpy;
var cCROSSap,bCROSScp,aCROSSbp;
aX=cx-bx;aY=cy-by;
bX=ax-cx;bY=ay-cy;
cX=bx-ax;cY=by-ay;
for(p=0;p<n;p++){
px=contour[verts[p]].x;
py=contour[verts[p]].y;
if(px===ax&&py===ay||
px===bx&&py===by||
px===cx&&py===cy)continue;
apx=px-ax;apy=py-ay;
bpx=px-bx;bpy=py-by;
cpx=px-cx;cpy=py-cy;
aCROSSbp=aX*bpy-aY*bpx;
cCROSSap=cX*apy-cY*apx;
bCROSScp=bX*cpy-bY*cpx;
if(aCROSSbp>=-Number.EPSILON&&bCROSScp>=-Number.EPSILON&&cCROSSap>=-Number.EPSILON)return false;
}
return true;
}
return function triangulate(contour,indices){
var n=contour.length;
if(n<3)return null;
var result=[],
verts=[],
vertIndices=[];
var u,v,w;
if(exports.ShapeUtils.area(contour)>0.0){
for(v=0;v<n;v++){verts[v]=v;}
}else{
for(v=0;v<n;v++){verts[v]=n-1-v;}
}
var nv=n;
var count=2*nv;
for(v=nv-1;nv>2;){
if(count--<=0){
console.warn('THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()');
if(indices)return vertIndices;
return result;
}
u=v;if(nv<=u)u=0;
v=u+1;if(nv<=v)v=0;
w=v+1;if(nv<=w)w=0;
if(snip(contour,u,v,w,nv,verts)){
var a,b,c,s,t;
a=verts[u];
b=verts[v];
c=verts[w];
result.push([contour[a],
contour[b],
contour[c]]);
vertIndices.push([verts[u],verts[v],verts[w]]);
for(s=v,t=v+1;t<nv;s++,t++){
verts[s]=verts[t];
}
nv--;
count=2*nv;
}
}
if(indices)return vertIndices;
return result;
};
}(),
triangulateShape:function triangulateShape(contour,holes){
function removeDupEndPts(points){
var l=points.length;
if(l>2&&points[l-1].equals(points[0])){
points.pop();
}
}
removeDupEndPts(contour);
holes.forEach(removeDupEndPts);
function point_in_segment_2D_colin(inSegPt1,inSegPt2,inOtherPt){
if(inSegPt1.x!==inSegPt2.x){
if(inSegPt1.x<inSegPt2.x){
return inSegPt1.x<=inOtherPt.x&&inOtherPt.x<=inSegPt2.x;
}else{
return inSegPt2.x<=inOtherPt.x&&inOtherPt.x<=inSegPt1.x;
}
}else{
if(inSegPt1.y<inSegPt2.y){
return inSegPt1.y<=inOtherPt.y&&inOtherPt.y<=inSegPt2.y;
}else{
return inSegPt2.y<=inOtherPt.y&&inOtherPt.y<=inSegPt1.y;
}
}
}
function intersect_segments_2D(inSeg1Pt1,inSeg1Pt2,inSeg2Pt1,inSeg2Pt2,inExcludeAdjacentSegs){
var seg1dx=inSeg1Pt2.x-inSeg1Pt1.x,seg1dy=inSeg1Pt2.y-inSeg1Pt1.y;
var seg2dx=inSeg2Pt2.x-inSeg2Pt1.x,seg2dy=inSeg2Pt2.y-inSeg2Pt1.y;
var seg1seg2dx=inSeg1Pt1.x-inSeg2Pt1.x;
var seg1seg2dy=inSeg1Pt1.y-inSeg2Pt1.y;
var limit=seg1dy*seg2dx-seg1dx*seg2dy;
var perpSeg1=seg1dy*seg1seg2dx-seg1dx*seg1seg2dy;
if(Math.abs(limit)>Number.EPSILON){
var perpSeg2;
if(limit>0){
if(perpSeg1<0||perpSeg1>limit)return[];
perpSeg2=seg2dy*seg1seg2dx-seg2dx*seg1seg2dy;
if(perpSeg2<0||perpSeg2>limit)return[];
}else{
if(perpSeg1>0||perpSeg1<limit)return[];
perpSeg2=seg2dy*seg1seg2dx-seg2dx*seg1seg2dy;
if(perpSeg2>0||perpSeg2<limit)return[];
}
if(perpSeg2===0){
if(inExcludeAdjacentSegs&&(
perpSeg1===0||perpSeg1===limit))return[];
return[inSeg1Pt1];
}
if(perpSeg2===limit){
if(inExcludeAdjacentSegs&&(
perpSeg1===0||perpSeg1===limit))return[];
return[inSeg1Pt2];
}
if(perpSeg1===0)return[inSeg2Pt1];
if(perpSeg1===limit)return[inSeg2Pt2];
var factorSeg1=perpSeg2/limit;
return[{x:inSeg1Pt1.x+factorSeg1*seg1dx,
y:inSeg1Pt1.y+factorSeg1*seg1dy}];
}else{
if(perpSeg1!==0||
seg2dy*seg1seg2dx!==seg2dx*seg1seg2dy)return[];
var seg1Pt=seg1dx===0&&seg1dy===0;
var seg2Pt=seg2dx===0&&seg2dy===0;
if(seg1Pt&&seg2Pt){
if(inSeg1Pt1.x!==inSeg2Pt1.x||
inSeg1Pt1.y!==inSeg2Pt1.y)return[];
return[inSeg1Pt1];
}
if(seg1Pt){
if(!point_in_segment_2D_colin(inSeg2Pt1,inSeg2Pt2,inSeg1Pt1))return[];
return[inSeg1Pt1];
}
if(seg2Pt){
if(!point_in_segment_2D_colin(inSeg1Pt1,inSeg1Pt2,inSeg2Pt1))return[];
return[inSeg2Pt1];
}
var seg1min,seg1max,seg1minVal,seg1maxVal;
var seg2min,seg2max,seg2minVal,seg2maxVal;
if(seg1dx!==0){
if(inSeg1Pt1.x<inSeg1Pt2.x){
seg1min=inSeg1Pt1;seg1minVal=inSeg1Pt1.x;
seg1max=inSeg1Pt2;seg1maxVal=inSeg1Pt2.x;
}else{
seg1min=inSeg1Pt2;seg1minVal=inSeg1Pt2.x;
seg1max=inSeg1Pt1;seg1maxVal=inSeg1Pt1.x;
}
if(inSeg2Pt1.x<inSeg2Pt2.x){
seg2min=inSeg2Pt1;seg2minVal=inSeg2Pt1.x;
seg2max=inSeg2Pt2;seg2maxVal=inSeg2Pt2.x;
}else{
seg2min=inSeg2Pt2;seg2minVal=inSeg2Pt2.x;
seg2max=inSeg2Pt1;seg2maxVal=inSeg2Pt1.x;
}
}else{
if(inSeg1Pt1.y<inSeg1Pt2.y){
seg1min=inSeg1Pt1;seg1minVal=inSeg1Pt1.y;
seg1max=inSeg1Pt2;seg1maxVal=inSeg1Pt2.y;
}else{
seg1min=inSeg1Pt2;seg1minVal=inSeg1Pt2.y;
seg1max=inSeg1Pt1;seg1maxVal=inSeg1Pt1.y;
}
if(inSeg2Pt1.y<inSeg2Pt2.y){
seg2min=inSeg2Pt1;seg2minVal=inSeg2Pt1.y;
seg2max=inSeg2Pt2;seg2maxVal=inSeg2Pt2.y;
}else{
seg2min=inSeg2Pt2;seg2minVal=inSeg2Pt2.y;
seg2max=inSeg2Pt1;seg2maxVal=inSeg2Pt1.y;
}
}
if(seg1minVal<=seg2minVal){
if(seg1maxVal<seg2minVal)return[];
if(seg1maxVal===seg2minVal){
if(inExcludeAdjacentSegs)return[];
return[seg2min];
}
if(seg1maxVal<=seg2maxVal)return[seg2min,seg1max];
return[seg2min,seg2max];
}else{
if(seg1minVal>seg2maxVal)return[];
if(seg1minVal===seg2maxVal){
if(inExcludeAdjacentSegs)return[];
return[seg1min];
}
if(seg1maxVal<=seg2maxVal)return[seg1min,seg1max];
return[seg1min,seg2max];
}
}
}
function isPointInsideAngle(inVertex,inLegFromPt,inLegToPt,inOtherPt){
var legFromPtX=inLegFromPt.x-inVertex.x,legFromPtY=inLegFromPt.y-inVertex.y;
var legToPtX=inLegToPt.x-inVertex.x,legToPtY=inLegToPt.y-inVertex.y;
var otherPtX=inOtherPt.x-inVertex.x,otherPtY=inOtherPt.y-inVertex.y;
var from2toAngle=legFromPtX*legToPtY-legFromPtY*legToPtX;
var from2otherAngle=legFromPtX*otherPtY-legFromPtY*otherPtX;
if(Math.abs(from2toAngle)>Number.EPSILON){
var other2toAngle=otherPtX*legToPtY-otherPtY*legToPtX;
if(from2toAngle>0){
return from2otherAngle>=0&&other2toAngle>=0;
}else{
return from2otherAngle>=0||other2toAngle>=0;
}
}else{
return from2otherAngle>0;
}
}
function removeHoles(contour,holes){
var shape=contour.concat();
var hole;
function isCutLineInsideAngles(inShapeIdx,inHoleIdx){
var lastShapeIdx=shape.length-1;
var prevShapeIdx=inShapeIdx-1;
if(prevShapeIdx<0)prevShapeIdx=lastShapeIdx;
var nextShapeIdx=inShapeIdx+1;
if(nextShapeIdx>lastShapeIdx)nextShapeIdx=0;
var insideAngle=isPointInsideAngle(shape[inShapeIdx],shape[prevShapeIdx],shape[nextShapeIdx],hole[inHoleIdx]);
if(!insideAngle){
return false;
}
var lastHoleIdx=hole.length-1;
var prevHoleIdx=inHoleIdx-1;
if(prevHoleIdx<0)prevHoleIdx=lastHoleIdx;
var nextHoleIdx=inHoleIdx+1;
if(nextHoleIdx>lastHoleIdx)nextHoleIdx=0;
insideAngle=isPointInsideAngle(hole[inHoleIdx],hole[prevHoleIdx],hole[nextHoleIdx],shape[inShapeIdx]);
if(!insideAngle){
return false;
}
return true;
}
function intersectsShapeEdge(inShapePt,inHolePt){
var sIdx,nextIdx,intersection;
for(sIdx=0;sIdx<shape.length;sIdx++){
nextIdx=sIdx+1;nextIdx%=shape.length;
intersection=intersect_segments_2D(inShapePt,inHolePt,shape[sIdx],shape[nextIdx],true);
if(intersection.length>0)return true;
}
return false;
}
var indepHoles=[];
function intersectsHoleEdge(inShapePt,inHolePt){
var ihIdx,chkHole,
hIdx,nextIdx,intersection;
for(ihIdx=0;ihIdx<indepHoles.length;ihIdx++){
chkHole=holes[indepHoles[ihIdx]];
for(hIdx=0;hIdx<chkHole.length;hIdx++){
nextIdx=hIdx+1;nextIdx%=chkHole.length;
intersection=intersect_segments_2D(inShapePt,inHolePt,chkHole[hIdx],chkHole[nextIdx],true);
if(intersection.length>0)return true;
}
}
return false;
}
var holeIndex,shapeIndex,
shapePt,holePt,
holeIdx,cutKey,failedCuts=[],
tmpShape1,tmpShape2,
tmpHole1,tmpHole2;
for(var h=0,hl=holes.length;h<hl;h++){
indepHoles.push(h);
}
var minShapeIndex=0;
var counter=indepHoles.length*2;
while(indepHoles.length>0){
counter--;
if(counter<0){
console.log("Infinite Loop! Holes left:"+indepHoles.length+", Probably Hole outside Shape!");
break;
}
for(shapeIndex=minShapeIndex;shapeIndex<shape.length;shapeIndex++){
shapePt=shape[shapeIndex];
holeIndex=-1;
for(var h=0;h<indepHoles.length;h++){
holeIdx=indepHoles[h];
cutKey=shapePt.x+":"+shapePt.y+":"+holeIdx;
if(failedCuts[cutKey]!==undefined)continue;
hole=holes[holeIdx];
for(var h2=0;h2<hole.length;h2++){
holePt=hole[h2];
if(!isCutLineInsideAngles(shapeIndex,h2))continue;
if(intersectsShapeEdge(shapePt,holePt))continue;
if(intersectsHoleEdge(shapePt,holePt))continue;
holeIndex=h2;
indepHoles.splice(h,1);
tmpShape1=shape.slice(0,shapeIndex+1);
tmpShape2=shape.slice(shapeIndex);
tmpHole1=hole.slice(holeIndex);
tmpHole2=hole.slice(0,holeIndex+1);
shape=tmpShape1.concat(tmpHole1).concat(tmpHole2).concat(tmpShape2);
minShapeIndex=shapeIndex;
break;
}
if(holeIndex>=0)break;
failedCuts[cutKey]=true;
}
if(holeIndex>=0)break;
}
}
return shape;
}
var i,il,f,face,
key,index,
allPointsMap={};
var allpoints=contour.concat();
for(var h=0,hl=holes.length;h<hl;h++){
Array.prototype.push.apply(allpoints,holes[h]);
}
for(i=0,il=allpoints.length;i<il;i++){
key=allpoints[i].x+":"+allpoints[i].y;
if(allPointsMap[key]!==undefined){
console.warn("THREE.ShapeUtils: Duplicate point",key,i);
}
allPointsMap[key]=i;
}
var shapeWithoutHoles=removeHoles(contour,holes);
var triangles=exports.ShapeUtils.triangulate(shapeWithoutHoles,false);
for(i=0,il=triangles.length;i<il;i++){
face=triangles[i];
for(f=0;f<3;f++){
key=face[f].x+":"+face[f].y;
index=allPointsMap[key];
if(index!==undefined){
face[f]=index;
}
}
}
return triangles.concat();
},
isClockWise:function isClockWise(pts){
return exports.ShapeUtils.area(pts)<0;
},
b2:function(){
function b2p0(t,p){
var k=1-t;
return k*k*p;
}
function b2p1(t,p){
return 2*(1-t)*t*p;
}
function b2p2(t,p){
return t*t*p;
}
return function b2(t,p0,p1,p2){
return b2p0(t,p0)+b2p1(t,p1)+b2p2(t,p2);
};
}(),
b3:function(){
function b3p0(t,p){
var k=1-t;
return k*k*k*p;
}
function b3p1(t,p){
var k=1-t;
return 3*k*k*t*p;
}
function b3p2(t,p){
var k=1-t;
return 3*k*t*t*p;
}
function b3p3(t,p){
return t*t*t*p;
}
return function b3(t,p0,p1,p2,p3){
return b3p0(t,p0)+b3p1(t,p1)+b3p2(t,p2)+b3p3(t,p3);
};
}()};
function Curve(){}
Curve.prototype={
constructor:Curve,
getPoint:function getPoint(t){
console.warn("THREE.Curve: Warning, getPoint() not implemented!");
return null;
},
getPointAt:function getPointAt(u){
var t=this.getUtoTmapping(u);
return this.getPoint(t);
},
getPoints:function getPoints(divisions){
if(!divisions)divisions=5;
var points=[];
for(var d=0;d<=divisions;d++){
points.push(this.getPoint(d/divisions));
}
return points;
},
getSpacedPoints:function getSpacedPoints(divisions){
if(!divisions)divisions=5;
var points=[];
for(var d=0;d<=divisions;d++){
points.push(this.getPointAt(d/divisions));
}
return points;
},
getLength:function getLength(){
var lengths=this.getLengths();
return lengths[lengths.length-1];
},
getLengths:function getLengths(divisions){
if(!divisions)divisions=this.__arcLengthDivisions?this.__arcLengthDivisions:200;
if(this.cacheArcLengths&&
this.cacheArcLengths.length===divisions+1&&
!this.needsUpdate){
return this.cacheArcLengths;
}
this.needsUpdate=false;
var cache=[];
var current,last=this.getPoint(0);
var p,sum=0;
cache.push(0);
for(p=1;p<=divisions;p++){
current=this.getPoint(p/divisions);
sum+=current.distanceTo(last);
cache.push(sum);
last=current;
}
this.cacheArcLengths=cache;
return cache;
},
updateArcLengths:function updateArcLengths(){
this.needsUpdate=true;
this.getLengths();
},
getUtoTmapping:function getUtoTmapping(u,distance){
var arcLengths=this.getLengths();
var i=0,il=arcLengths.length;
var targetArcLength;
if(distance){
targetArcLength=distance;
}else{
targetArcLength=u*arcLengths[il-1];
}
var low=0,high=il-1,comparison;
while(low<=high){
i=Math.floor(low+(high-low)/2);
comparison=arcLengths[i]-targetArcLength;
if(comparison<0){
low=i+1;
}else if(comparison>0){
high=i-1;
}else{
high=i;
break;
}
}
i=high;
if(arcLengths[i]===targetArcLength){
var t=i/(il-1);
return t;
}
var lengthBefore=arcLengths[i];
var lengthAfter=arcLengths[i+1];
var segmentLength=lengthAfter-lengthBefore;
var segmentFraction=(targetArcLength-lengthBefore)/segmentLength;
var t=(i+segmentFraction)/(il-1);
return t;
},
getTangent:function getTangent(t){
var delta=0.0001;
var t1=t-delta;
var t2=t+delta;
if(t1<0)t1=0;
if(t2>1)t2=1;
var pt1=this.getPoint(t1);
var pt2=this.getPoint(t2);
var vec=pt2.clone().sub(pt1);
return vec.normalize();
},
getTangentAt:function getTangentAt(u){
var t=this.getUtoTmapping(u);
return this.getTangent(t);
}};
Curve.create=function(constructor,getPointFunc){
constructor.prototype=Object.create(Curve.prototype);
constructor.prototype.constructor=constructor;
constructor.prototype.getPoint=getPointFunc;
return constructor;
};
function LineCurve(v1,v2){
this.v1=v1;
this.v2=v2;
}
LineCurve.prototype=Object.create(Curve.prototype);
LineCurve.prototype.constructor=LineCurve;
LineCurve.prototype.isLineCurve=true;
LineCurve.prototype.getPoint=function(t){
if(t===1){
return this.v2.clone();
}
var point=this.v2.clone().sub(this.v1);
point.multiplyScalar(t).add(this.v1);
return point;
};
LineCurve.prototype.getPointAt=function(u){
return this.getPoint(u);
};
LineCurve.prototype.getTangent=function(t){
var tangent=this.v2.clone().sub(this.v1);
return tangent.normalize();
};
function CurvePath(){
this.curves=[];
this.autoClose=false;
}
CurvePath.prototype=babelHelpers.extends(Object.create(Curve.prototype),{
constructor:CurvePath,
add:function add(curve){
this.curves.push(curve);
},
closePath:function closePath(){
var startPoint=this.curves[0].getPoint(0);
var endPoint=this.curves[this.curves.length-1].getPoint(1);
if(!startPoint.equals(endPoint)){
this.curves.push(new LineCurve(endPoint,startPoint));
}
},
getPoint:function getPoint(t){
var d=t*this.getLength();
var curveLengths=this.getCurveLengths();
var i=0;
while(i<curveLengths.length){
if(curveLengths[i]>=d){
var diff=curveLengths[i]-d;
var curve=this.curves[i];
var segmentLength=curve.getLength();
var u=segmentLength===0?0:1-diff/segmentLength;
return curve.getPointAt(u);
}
i++;
}
return null;
},
getLength:function getLength(){
var lens=this.getCurveLengths();
return lens[lens.length-1];
},
updateArcLengths:function updateArcLengths(){
this.needsUpdate=true;
this.cacheLengths=null;
this.getLengths();
},
getCurveLengths:function getCurveLengths(){
if(this.cacheLengths&&this.cacheLengths.length===this.curves.length){
return this.cacheLengths;
}
var lengths=[],sums=0;
for(var i=0,l=this.curves.length;i<l;i++){
sums+=this.curves[i].getLength();
lengths.push(sums);
}
this.cacheLengths=lengths;
return lengths;
},
getSpacedPoints:function getSpacedPoints(divisions){
if(!divisions)divisions=40;
var points=[];
for(var i=0;i<=divisions;i++){
points.push(this.getPoint(i/divisions));
}
if(this.autoClose){
points.push(points[0]);
}
return points;
},
getPoints:function getPoints(divisions){
divisions=divisions||12;
var points=[],last;
for(var i=0,curves=this.curves;i<curves.length;i++){
var curve=curves[i];
var resolution=curve&&curve.isEllipseCurve?divisions*2:
curve&&curve.isLineCurve?1:
curve&&curve.isSplineCurve?divisions*curve.points.length:
divisions;
var pts=curve.getPoints(resolution);
for(var j=0;j<pts.length;j++){
var point=pts[j];
if(last&&last.equals(point))continue;
points.push(point);
last=point;
}
}
if(this.autoClose&&points.length>1&&!points[points.length-1].equals(points[0])){
points.push(points[0]);
}
return points;
},
createPointsGeometry:function createPointsGeometry(divisions){
var pts=this.getPoints(divisions);
return this.createGeometry(pts);
},
createSpacedPointsGeometry:function createSpacedPointsGeometry(divisions){
var pts=this.getSpacedPoints(divisions);
return this.createGeometry(pts);
},
createGeometry:function createGeometry(points){
var geometry=new Geometry();
for(var i=0,l=points.length;i<l;i++){
var point=points[i];
geometry.vertices.push(new Vector3(point.x,point.y,point.z||0));
}
return geometry;
}});
function EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){
this.aX=aX;
this.aY=aY;
this.xRadius=xRadius;
this.yRadius=yRadius;
this.aStartAngle=aStartAngle;
this.aEndAngle=aEndAngle;
this.aClockwise=aClockwise;
this.aRotation=aRotation||0;
}
EllipseCurve.prototype=Object.create(Curve.prototype);
EllipseCurve.prototype.constructor=EllipseCurve;
EllipseCurve.prototype.isEllipseCurve=true;
EllipseCurve.prototype.getPoint=function(t){
var twoPi=Math.PI*2;
var deltaAngle=this.aEndAngle-this.aStartAngle;
var samePoints=Math.abs(deltaAngle)<Number.EPSILON;
while(deltaAngle<0){deltaAngle+=twoPi;}
while(deltaAngle>twoPi){deltaAngle-=twoPi;}
if(deltaAngle<Number.EPSILON){
if(samePoints){
deltaAngle=0;
}else{
deltaAngle=twoPi;
}
}
if(this.aClockwise===true&&!samePoints){
if(deltaAngle===twoPi){
deltaAngle=-twoPi;
}else{
deltaAngle=deltaAngle-twoPi;
}
}
var angle=this.aStartAngle+t*deltaAngle;
var x=this.aX+this.xRadius*Math.cos(angle);
var y=this.aY+this.yRadius*Math.sin(angle);
if(this.aRotation!==0){
var cos=Math.cos(this.aRotation);
var sin=Math.sin(this.aRotation);
var tx=x-this.aX;
var ty=y-this.aY;
x=tx*cos-ty*sin+this.aX;
y=tx*sin+ty*cos+this.aY;
}
return new Vector2(x,y);
};
exports.CurveUtils={
tangentQuadraticBezier:function tangentQuadraticBezier(t,p0,p1,p2){
return 2*(1-t)*(p1-p0)+2*t*(p2-p1);
},
tangentCubicBezier:function tangentCubicBezier(t,p0,p1,p2,p3){
return-3*p0*(1-t)*(1-t)+
3*p1*(1-t)*(1-t)-6*t*p1*(1-t)+
6*t*p2*(1-t)-3*t*t*p2+
3*t*t*p3;
},
tangentSpline:function tangentSpline(t,p0,p1,p2,p3){
var h00=6*t*t-6*t;
var h10=3*t*t-4*t+1;
var h01=-6*t*t+6*t;
var h11=3*t*t-2*t;
return h00+h10+h01+h11;
},
interpolate:function interpolate(p0,p1,p2,p3,t){
var v0=(p2-p0)*0.5;
var v1=(p3-p1)*0.5;
var t2=t*t;
var t3=t*t2;
return(2*p1-2*p2+v0+v1)*t3+(-3*p1+3*p2-2*v0-v1)*t2+v0*t+p1;
}};
function SplineCurve(points){
this.points=points===undefined?[]:points;
}
SplineCurve.prototype=Object.create(Curve.prototype);
SplineCurve.prototype.constructor=SplineCurve;
SplineCurve.prototype.isSplineCurve=true;
SplineCurve.prototype.getPoint=function(t){
var points=this.points;
var point=(points.length-1)*t;
var intPoint=Math.floor(point);
var weight=point-intPoint;
var point0=points[intPoint===0?intPoint:intPoint-1];
var point1=points[intPoint];
var point2=points[intPoint>points.length-2?points.length-1:intPoint+1];
var point3=points[intPoint>points.length-3?points.length-1:intPoint+2];
var interpolate=exports.CurveUtils.interpolate;
return new Vector2(
interpolate(point0.x,point1.x,point2.x,point3.x,weight),
interpolate(point0.y,point1.y,point2.y,point3.y,weight));
};
function CubicBezierCurve(v0,v1,v2,v3){
this.v0=v0;
this.v1=v1;
this.v2=v2;
this.v3=v3;
}
CubicBezierCurve.prototype=Object.create(Curve.prototype);
CubicBezierCurve.prototype.constructor=CubicBezierCurve;
CubicBezierCurve.prototype.getPoint=function(t){
var b3=exports.ShapeUtils.b3;
return new Vector2(
b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),
b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y));
};
CubicBezierCurve.prototype.getTangent=function(t){
var tangentCubicBezier=exports.CurveUtils.tangentCubicBezier;
return new Vector2(
tangentCubicBezier(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),
tangentCubicBezier(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y)).
normalize();
};
function QuadraticBezierCurve(v0,v1,v2){
this.v0=v0;
this.v1=v1;
this.v2=v2;
}
QuadraticBezierCurve.prototype=Object.create(Curve.prototype);
QuadraticBezierCurve.prototype.constructor=QuadraticBezierCurve;
QuadraticBezierCurve.prototype.getPoint=function(t){
var b2=exports.ShapeUtils.b2;
return new Vector2(
b2(t,this.v0.x,this.v1.x,this.v2.x),
b2(t,this.v0.y,this.v1.y,this.v2.y));
};
QuadraticBezierCurve.prototype.getTangent=function(t){
var tangentQuadraticBezier=exports.CurveUtils.tangentQuadraticBezier;
return new Vector2(
tangentQuadraticBezier(t,this.v0.x,this.v1.x,this.v2.x),
tangentQuadraticBezier(t,this.v0.y,this.v1.y,this.v2.y)).
normalize();
};
var PathPrototype=babelHelpers.extends(Object.create(CurvePath.prototype),{
fromPoints:function fromPoints(vectors){
this.moveTo(vectors[0].x,vectors[0].y);
for(var i=1,l=vectors.length;i<l;i++){
this.lineTo(vectors[i].x,vectors[i].y);
}
},
moveTo:function moveTo(x,y){
this.currentPoint.set(x,y);
},
lineTo:function lineTo(x,y){
var curve=new LineCurve(this.currentPoint.clone(),new Vector2(x,y));
this.curves.push(curve);
this.currentPoint.set(x,y);
},
quadraticCurveTo:function quadraticCurveTo(aCPx,aCPy,aX,aY){
var curve=new QuadraticBezierCurve(
this.currentPoint.clone(),
new Vector2(aCPx,aCPy),
new Vector2(aX,aY));
this.curves.push(curve);
this.currentPoint.set(aX,aY);
},
bezierCurveTo:function bezierCurveTo(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){
var curve=new CubicBezierCurve(
this.currentPoint.clone(),
new Vector2(aCP1x,aCP1y),
new Vector2(aCP2x,aCP2y),
new Vector2(aX,aY));
this.curves.push(curve);
this.currentPoint.set(aX,aY);
},
splineThru:function splineThru(pts){
var npts=[this.currentPoint.clone()].concat(pts);
var curve=new SplineCurve(npts);
this.curves.push(curve);
this.currentPoint.copy(pts[pts.length-1]);
},
arc:function arc(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){
var x0=this.currentPoint.x;
var y0=this.currentPoint.y;
this.absarc(aX+x0,aY+y0,aRadius,
aStartAngle,aEndAngle,aClockwise);
},
absarc:function absarc(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){
this.absellipse(aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise);
},
ellipse:function ellipse(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){
var x0=this.currentPoint.x;
var y0=this.currentPoint.y;
this.absellipse(aX+x0,aY+y0,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation);
},
absellipse:function absellipse(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){
var curve=new EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation);
if(this.curves.length>0){
var firstPoint=curve.getPoint(0);
if(!firstPoint.equals(this.currentPoint)){
this.lineTo(firstPoint.x,firstPoint.y);
}
}
this.curves.push(curve);
var lastPoint=curve.getPoint(1);
this.currentPoint.copy(lastPoint);
}});
function TubeGeometry(path,segments,radius,radialSegments,closed,taper){
Geometry.call(this);
this.type='TubeGeometry';
this.parameters={
path:path,
segments:segments,
radius:radius,
radialSegments:radialSegments,
closed:closed,
taper:taper};
segments=segments||64;
radius=radius||1;
radialSegments=radialSegments||8;
closed=closed||false;
taper=taper||TubeGeometry.NoTaper;
var grid=[];
var scope=this,
tangent,
normal,
binormal,
numpoints=segments+1,
u,v,r,
cx,cy,
pos,pos2=new Vector3(),
i,j,
ip,jp,
a,b,c,d,
uva,uvb,uvc,uvd;
var frames=new TubeGeometry.FrenetFrames(path,segments,closed),
tangents=frames.tangents,
normals=frames.normals,
binormals=frames.binormals;
this.tangents=tangents;
this.normals=normals;
this.binormals=binormals;
function vert(x,y,z){
return scope.vertices.push(new Vector3(x,y,z))-1;
}
for(i=0;i<numpoints;i++){
grid[i]=[];
u=i/(numpoints-1);
pos=path.getPointAt(u);
tangent=tangents[i];
normal=normals[i];
binormal=binormals[i];
r=radius*taper(u);
for(j=0;j<radialSegments;j++){
v=j/radialSegments*2*Math.PI;
cx=-r*Math.cos(v);
cy=r*Math.sin(v);
pos2.copy(pos);
pos2.x+=cx*normal.x+cy*binormal.x;
pos2.y+=cx*normal.y+cy*binormal.y;
pos2.z+=cx*normal.z+cy*binormal.z;
grid[i][j]=vert(pos2.x,pos2.y,pos2.z);
}
}
for(i=0;i<segments;i++){
for(j=0;j<radialSegments;j++){
ip=closed?(i+1)%segments:i+1;
jp=(j+1)%radialSegments;
a=grid[i][j];
b=grid[ip][j];
c=grid[ip][jp];
d=grid[i][jp];
uva=new Vector2(i/segments,j/radialSegments);
uvb=new Vector2((i+1)/segments,j/radialSegments);
uvc=new Vector2((i+1)/segments,(j+1)/radialSegments);
uvd=new Vector2(i/segments,(j+1)/radialSegments);
this.faces.push(new Face3(a,b,d));
this.faceVertexUvs[0].push([uva,uvb,uvd]);
this.faces.push(new Face3(b,c,d));
this.faceVertexUvs[0].push([uvb.clone(),uvc,uvd.clone()]);
}
}
this.computeFaceNormals();
this.computeVertexNormals();
}
TubeGeometry.prototype=Object.create(Geometry.prototype);
TubeGeometry.prototype.constructor=TubeGeometry;
TubeGeometry.NoTaper=function(u){
return 1;
};
TubeGeometry.SinusoidalTaper=function(u){
return Math.sin(Math.PI*u);
};
TubeGeometry.FrenetFrames=function(path,segments,closed){
var normal=new Vector3(),
tangents=[],
normals=[],
binormals=[],
vec=new Vector3(),
mat=new Matrix4(),
numpoints=segments+1,
theta,
smallest,
tx,ty,tz,
i,u;
this.tangents=tangents;
this.normals=normals;
this.binormals=binormals;
for(i=0;i<numpoints;i++){
u=i/(numpoints-1);
tangents[i]=path.getTangentAt(u);
tangents[i].normalize();
}
initialNormal3();
function initialNormal3(){
normals[0]=new Vector3();
binormals[0]=new Vector3();
smallest=Number.MAX_VALUE;
tx=Math.abs(tangents[0].x);
ty=Math.abs(tangents[0].y);
tz=Math.abs(tangents[0].z);
if(tx<=smallest){
smallest=tx;
normal.set(1,0,0);
}
if(ty<=smallest){
smallest=ty;
normal.set(0,1,0);
}
if(tz<=smallest){
normal.set(0,0,1);
}
vec.crossVectors(tangents[0],normal).normalize();
normals[0].crossVectors(tangents[0],vec);
binormals[0].crossVectors(tangents[0],normals[0]);
}
for(i=1;i<numpoints;i++){
normals[i]=normals[i-1].clone();
binormals[i]=binormals[i-1].clone();
vec.crossVectors(tangents[i-1],tangents[i]);
if(vec.length()>Number.EPSILON){
vec.normalize();
theta=Math.acos(exports.Math.clamp(tangents[i-1].dot(tangents[i]),-1,1));
normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta));
}
binormals[i].crossVectors(tangents[i],normals[i]);
}
if(closed){
theta=Math.acos(exports.Math.clamp(normals[0].dot(normals[numpoints-1]),-1,1));
theta/=numpoints-1;
if(tangents[0].dot(vec.crossVectors(normals[0],normals[numpoints-1]))>0){
theta=-theta;
}
for(i=1;i<numpoints;i++){
normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i));
binormals[i].crossVectors(tangents[i],normals[i]);
}
}
};
function ExtrudeGeometry(shapes,options){
if(typeof shapes==="undefined"){
shapes=[];
return;
}
Geometry.call(this);
this.type='ExtrudeGeometry';
shapes=Array.isArray(shapes)?shapes:[shapes];
this.addShapeList(shapes,options);
this.computeFaceNormals();
}
ExtrudeGeometry.prototype=Object.create(Geometry.prototype);
ExtrudeGeometry.prototype.constructor=ExtrudeGeometry;
ExtrudeGeometry.prototype.addShapeList=function(shapes,options){
var sl=shapes.length;
for(var s=0;s<sl;s++){
var shape=shapes[s];
this.addShape(shape,options);
}
};
ExtrudeGeometry.prototype.addShape=function(shape,options){
var amount=options.amount!==undefined?options.amount:100;
var bevelThickness=options.bevelThickness!==undefined?options.bevelThickness:6;
var bevelSize=options.bevelSize!==undefined?options.bevelSize:bevelThickness-2;
var bevelSegments=options.bevelSegments!==undefined?options.bevelSegments:3;
var bevelEnabled=options.bevelEnabled!==undefined?options.bevelEnabled:true;
var curveSegments=options.curveSegments!==undefined?options.curveSegments:12;
var steps=options.steps!==undefined?options.steps:1;
var extrudePath=options.extrudePath;
var extrudePts,extrudeByPath=false;
var uvgen=options.UVGenerator!==undefined?options.UVGenerator:ExtrudeGeometry.WorldUVGenerator;
var splineTube,binormal,normal,position2;
if(extrudePath){
extrudePts=extrudePath.getSpacedPoints(steps);
extrudeByPath=true;
bevelEnabled=false;
splineTube=options.frames!==undefined?options.frames:new TubeGeometry.FrenetFrames(extrudePath,steps,false);
binormal=new Vector3();
normal=new Vector3();
position2=new Vector3();
}
if(!bevelEnabled){
bevelSegments=0;
bevelThickness=0;
bevelSize=0;
}
var ahole,h,hl;
var scope=this;
var shapesOffset=this.vertices.length;
var shapePoints=shape.extractPoints(curveSegments);
var vertices=shapePoints.shape;
var holes=shapePoints.holes;
var reverse=!exports.ShapeUtils.isClockWise(vertices);
if(reverse){
vertices=vertices.reverse();
for(h=0,hl=holes.length;h<hl;h++){
ahole=holes[h];
if(exports.ShapeUtils.isClockWise(ahole)){
holes[h]=ahole.reverse();
}
}
reverse=false;
}
var faces=exports.ShapeUtils.triangulateShape(vertices,holes);
var contour=vertices;
for(h=0,hl=holes.length;h<hl;h++){
ahole=holes[h];
vertices=vertices.concat(ahole);
}
function scalePt2(pt,vec,size){
if(!vec)console.error("THREE.ExtrudeGeometry: vec does not exist");
return vec.clone().multiplyScalar(size).add(pt);
}
var b,bs,t,z,
vert,vlen=vertices.length,
face,flen=faces.length;
function getBevelVec(inPt,inPrev,inNext){
var v_trans_x,v_trans_y,shrink_by=1;
var v_prev_x=inPt.x-inPrev.x,v_prev_y=inPt.y-inPrev.y;
var v_next_x=inNext.x-inPt.x,v_next_y=inNext.y-inPt.y;
var v_prev_lensq=v_prev_x*v_prev_x+v_prev_y*v_prev_y;
var collinear0=v_prev_x*v_next_y-v_prev_y*v_next_x;
if(Math.abs(collinear0)>Number.EPSILON){
var v_prev_len=Math.sqrt(v_prev_lensq);
var v_next_len=Math.sqrt(v_next_x*v_next_x+v_next_y*v_next_y);
var ptPrevShift_x=inPrev.x-v_prev_y/v_prev_len;
var ptPrevShift_y=inPrev.y+v_prev_x/v_prev_len;
var ptNextShift_x=inNext.x-v_next_y/v_next_len;
var ptNextShift_y=inNext.y+v_next_x/v_next_len;
var sf=((ptNextShift_x-ptPrevShift_x)*v_next_y-
(ptNextShift_y-ptPrevShift_y)*v_next_x)/(
v_prev_x*v_next_y-v_prev_y*v_next_x);
v_trans_x=ptPrevShift_x+v_prev_x*sf-inPt.x;
v_trans_y=ptPrevShift_y+v_prev_y*sf-inPt.y;
var v_trans_lensq=v_trans_x*v_trans_x+v_trans_y*v_trans_y;
if(v_trans_lensq<=2){
return new Vector2(v_trans_x,v_trans_y);
}else{
shrink_by=Math.sqrt(v_trans_lensq/2);
}
}else{
var direction_eq=false;
if(v_prev_x>Number.EPSILON){
if(v_next_x>Number.EPSILON){
direction_eq=true;
}
}else{
if(v_prev_x<-Number.EPSILON){
if(v_next_x<-Number.EPSILON){
direction_eq=true;
}
}else{
if(Math.sign(v_prev_y)===Math.sign(v_next_y)){
direction_eq=true;
}
}
}
if(direction_eq){
v_trans_x=-v_prev_y;
v_trans_y=v_prev_x;
shrink_by=Math.sqrt(v_prev_lensq);
}else{
v_trans_x=v_prev_x;
v_trans_y=v_prev_y;
shrink_by=Math.sqrt(v_prev_lensq/2);
}
}
return new Vector2(v_trans_x/shrink_by,v_trans_y/shrink_by);
}
var contourMovements=[];
for(var i=0,il=contour.length,j=il-1,k=i+1;i<il;i++,j++,k++){
if(j===il)j=0;
if(k===il)k=0;
contourMovements[i]=getBevelVec(contour[i],contour[j],contour[k]);
}
var holesMovements=[],oneHoleMovements,verticesMovements=contourMovements.concat();
for(h=0,hl=holes.length;h<hl;h++){
ahole=holes[h];
oneHoleMovements=[];
for(i=0,il=ahole.length,j=il-1,k=i+1;i<il;i++,j++,k++){
if(j===il)j=0;
if(k===il)k=0;
oneHoleMovements[i]=getBevelVec(ahole[i],ahole[j],ahole[k]);
}
holesMovements.push(oneHoleMovements);
verticesMovements=verticesMovements.concat(oneHoleMovements);
}
for(b=0;b<bevelSegments;b++){
t=b/bevelSegments;
z=bevelThickness*Math.cos(t*Math.PI/2);
bs=bevelSize*Math.sin(t*Math.PI/2);
for(i=0,il=contour.length;i<il;i++){
vert=scalePt2(contour[i],contourMovements[i],bs);
v(vert.x,vert.y,-z);
}
for(h=0,hl=holes.length;h<hl;h++){
ahole=holes[h];
oneHoleMovements=holesMovements[h];
for(i=0,il=ahole.length;i<il;i++){
vert=scalePt2(ahole[i],oneHoleMovements[i],bs);
v(vert.x,vert.y,-z);
}
}
}
bs=bevelSize;
for(i=0;i<vlen;i++){
vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i];
if(!extrudeByPath){
v(vert.x,vert.y,0);
}else{
normal.copy(splineTube.normals[0]).multiplyScalar(vert.x);
binormal.copy(splineTube.binormals[0]).multiplyScalar(vert.y);
position2.copy(extrudePts[0]).add(normal).add(binormal);
v(position2.x,position2.y,position2.z);
}
}
var s;
for(s=1;s<=steps;s++){
for(i=0;i<vlen;i++){
vert=bevelEnabled?scalePt2(vertices[i],verticesMovements[i],bs):vertices[i];
if(!extrudeByPath){
v(vert.x,vert.y,amount/steps*s);
}else{
normal.copy(splineTube.normals[s]).multiplyScalar(vert.x);
binormal.copy(splineTube.binormals[s]).multiplyScalar(vert.y);
position2.copy(extrudePts[s]).add(normal).add(binormal);
v(position2.x,position2.y,position2.z);
}
}
}
for(b=bevelSegments-1;b>=0;b--){
t=b/bevelSegments;
z=bevelThickness*Math.cos(t*Math.PI/2);
bs=bevelSize*Math.sin(t*Math.PI/2);
for(i=0,il=contour.length;i<il;i++){
vert=scalePt2(contour[i],contourMovements[i],bs);
v(vert.x,vert.y,amount+z);
}
for(h=0,hl=holes.length;h<hl;h++){
ahole=holes[h];
oneHoleMovements=holesMovements[h];
for(i=0,il=ahole.length;i<il;i++){
vert=scalePt2(ahole[i],oneHoleMovements[i],bs);
if(!extrudeByPath){
v(vert.x,vert.y,amount+z);
}else{
v(vert.x,vert.y+extrudePts[steps-1].y,extrudePts[steps-1].x+z);
}
}
}
}
buildLidFaces();
buildSideFaces();
function buildLidFaces(){
if(bevelEnabled){
var layer=0;
var offset=vlen*layer;
for(i=0;i<flen;i++){
face=faces[i];
f3(face[2]+offset,face[1]+offset,face[0]+offset);
}
layer=steps+bevelSegments*2;
offset=vlen*layer;
for(i=0;i<flen;i++){
face=faces[i];
f3(face[0]+offset,face[1]+offset,face[2]+offset);
}
}else{
for(i=0;i<flen;i++){
face=faces[i];
f3(face[2],face[1],face[0]);
}
for(i=0;i<flen;i++){
face=faces[i];
f3(face[0]+vlen*steps,face[1]+vlen*steps,face[2]+vlen*steps);
}
}
}
function buildSideFaces(){
var layeroffset=0;
sidewalls(contour,layeroffset);
layeroffset+=contour.length;
for(h=0,hl=holes.length;h<hl;h++){
ahole=holes[h];
sidewalls(ahole,layeroffset);
layeroffset+=ahole.length;
}
}
function sidewalls(contour,layeroffset){
var j,k;
i=contour.length;
while(--i>=0){
j=i;
k=i-1;
if(k<0)k=contour.length-1;
var s=0,sl=steps+bevelSegments*2;
for(s=0;s<sl;s++){
var slen1=vlen*s;
var slen2=vlen*(s+1);
var a=layeroffset+j+slen1,
b=layeroffset+k+slen1,
c=layeroffset+k+slen2,
d=layeroffset+j+slen2;
f4(a,b,c,d,contour,s,sl,j,k);
}
}
}
function v(x,y,z){
scope.vertices.push(new Vector3(x,y,z));
}
function f3(a,b,c){
a+=shapesOffset;
b+=shapesOffset;
c+=shapesOffset;
scope.faces.push(new Face3(a,b,c,null,null,0));
var uvs=uvgen.generateTopUV(scope,a,b,c);
scope.faceVertexUvs[0].push(uvs);
}
function f4(a,b,c,d,wallContour,stepIndex,stepsLength,contourIndex1,contourIndex2){
a+=shapesOffset;
b+=shapesOffset;
c+=shapesOffset;
d+=shapesOffset;
scope.faces.push(new Face3(a,b,d,null,null,1));
scope.faces.push(new Face3(b,c,d,null,null,1));
var uvs=uvgen.generateSideWallUV(scope,a,b,c,d);
scope.faceVertexUvs[0].push([uvs[0],uvs[1],uvs[3]]);
scope.faceVertexUvs[0].push([uvs[1],uvs[2],uvs[3]]);
}
};
ExtrudeGeometry.WorldUVGenerator={
generateTopUV:function generateTopUV(geometry,indexA,indexB,indexC){
var vertices=geometry.vertices;
var a=vertices[indexA];
var b=vertices[indexB];
var c=vertices[indexC];
return[
new Vector2(a.x,a.y),
new Vector2(b.x,b.y),
new Vector2(c.x,c.y)];
},
generateSideWallUV:function generateSideWallUV(geometry,indexA,indexB,indexC,indexD){
var vertices=geometry.vertices;
var a=vertices[indexA];
var b=vertices[indexB];
var c=vertices[indexC];
var d=vertices[indexD];
if(Math.abs(a.y-b.y)<0.01){
return[
new Vector2(a.x,1-a.z),
new Vector2(b.x,1-b.z),
new Vector2(c.x,1-c.z),
new Vector2(d.x,1-d.z)];
}else{
return[
new Vector2(a.y,1-a.z),
new Vector2(b.y,1-b.z),
new Vector2(c.y,1-c.z),
new Vector2(d.y,1-d.z)];
}
}};
function ShapeGeometry(shapes,options){
Geometry.call(this);
this.type='ShapeGeometry';
if(Array.isArray(shapes)===false)shapes=[shapes];
this.addShapeList(shapes,options);
this.computeFaceNormals();
}
ShapeGeometry.prototype=Object.create(Geometry.prototype);
ShapeGeometry.prototype.constructor=ShapeGeometry;
ShapeGeometry.prototype.addShapeList=function(shapes,options){
for(var i=0,l=shapes.length;i<l;i++){
this.addShape(shapes[i],options);
}
return this;
};
ShapeGeometry.prototype.addShape=function(shape,options){
if(options===undefined)options={};
var curveSegments=options.curveSegments!==undefined?options.curveSegments:12;
var material=options.material;
var uvgen=options.UVGenerator===undefined?ExtrudeGeometry.WorldUVGenerator:options.UVGenerator;
var i,l,hole;
var shapesOffset=this.vertices.length;
var shapePoints=shape.extractPoints(curveSegments);
var vertices=shapePoints.shape;
var holes=shapePoints.holes;
var reverse=!exports.ShapeUtils.isClockWise(vertices);
if(reverse){
vertices=vertices.reverse();
for(i=0,l=holes.length;i<l;i++){
hole=holes[i];
if(exports.ShapeUtils.isClockWise(hole)){
holes[i]=hole.reverse();
}
}
reverse=false;
}
var faces=exports.ShapeUtils.triangulateShape(vertices,holes);
for(i=0,l=holes.length;i<l;i++){
hole=holes[i];
vertices=vertices.concat(hole);
}
var vert,vlen=vertices.length;
var face,flen=faces.length;
for(i=0;i<vlen;i++){
vert=vertices[i];
this.vertices.push(new Vector3(vert.x,vert.y,0));
}
for(i=0;i<flen;i++){
face=faces[i];
var a=face[0]+shapesOffset;
var b=face[1]+shapesOffset;
var c=face[2]+shapesOffset;
this.faces.push(new Face3(a,b,c,null,null,material));
this.faceVertexUvs[0].push(uvgen.generateTopUV(this,a,b,c));
}
};
function Shape(){
Path.apply(this,arguments);
this.holes=[];
}
Shape.prototype=babelHelpers.extends(Object.create(PathPrototype),{
constructor:Shape,
extrude:function extrude(options){
return new ExtrudeGeometry(this,options);
},
makeGeometry:function makeGeometry(options){
return new ShapeGeometry(this,options);
},
getPointsHoles:function getPointsHoles(divisions){
var holesPts=[];
for(var i=0,l=this.holes.length;i<l;i++){
holesPts[i]=this.holes[i].getPoints(divisions);
}
return holesPts;
},
extractAllPoints:function extractAllPoints(divisions){
return{
shape:this.getPoints(divisions),
holes:this.getPointsHoles(divisions)};
},
extractPoints:function extractPoints(divisions){
return this.extractAllPoints(divisions);
}});
function Path(points){
CurvePath.call(this);
this.currentPoint=new Vector2();
if(points){
this.fromPoints(points);
}
}
Path.prototype=PathPrototype;
PathPrototype.constructor=Path;
function ShapePath(){
this.subPaths=[];
this.currentPath=null;
}
ShapePath.prototype={
moveTo:function moveTo(x,y){
this.currentPath=new Path();
this.subPaths.push(this.currentPath);
this.currentPath.moveTo(x,y);
},
lineTo:function lineTo(x,y){
this.currentPath.lineTo(x,y);
},
quadraticCurveTo:function quadraticCurveTo(aCPx,aCPy,aX,aY){
this.currentPath.quadraticCurveTo(aCPx,aCPy,aX,aY);
},
bezierCurveTo:function bezierCurveTo(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY){
this.currentPath.bezierCurveTo(aCP1x,aCP1y,aCP2x,aCP2y,aX,aY);
},
splineThru:function splineThru(pts){
this.currentPath.splineThru(pts);
},
toShapes:function toShapes(isCCW,noHoles){
function toShapesNoHoles(inSubpaths){
var shapes=[];
for(var i=0,l=inSubpaths.length;i<l;i++){
var tmpPath=inSubpaths[i];
var tmpShape=new Shape();
tmpShape.curves=tmpPath.curves;
shapes.push(tmpShape);
}
return shapes;
}
function isPointInsidePolygon(inPt,inPolygon){
var polyLen=inPolygon.length;
var inside=false;
for(var p=polyLen-1,q=0;q<polyLen;p=q++){
var edgeLowPt=inPolygon[p];
var edgeHighPt=inPolygon[q];
var edgeDx=edgeHighPt.x-edgeLowPt.x;
var edgeDy=edgeHighPt.y-edgeLowPt.y;
if(Math.abs(edgeDy)>Number.EPSILON){
if(edgeDy<0){
edgeLowPt=inPolygon[q];edgeDx=-edgeDx;
edgeHighPt=inPolygon[p];edgeDy=-edgeDy;
}
if(inPt.y<edgeLowPt.y||inPt.y>edgeHighPt.y)continue;
if(inPt.y===edgeLowPt.y){
if(inPt.x===edgeLowPt.x)return true;
}else{
var perpEdge=edgeDy*(inPt.x-edgeLowPt.x)-edgeDx*(inPt.y-edgeLowPt.y);
if(perpEdge===0)return true;
if(perpEdge<0)continue;
inside=!inside;
}
}else{
if(inPt.y!==edgeLowPt.y)continue;
if(edgeHighPt.x<=inPt.x&&inPt.x<=edgeLowPt.x||
edgeLowPt.x<=inPt.x&&inPt.x<=edgeHighPt.x)return true;
}
}
return inside;
}
var isClockWise=exports.ShapeUtils.isClockWise;
var subPaths=this.subPaths;
if(subPaths.length===0)return[];
if(noHoles===true)return toShapesNoHoles(subPaths);
var solid,tmpPath,tmpShape,shapes=[];
if(subPaths.length===1){
tmpPath=subPaths[0];
tmpShape=new Shape();
tmpShape.curves=tmpPath.curves;
shapes.push(tmpShape);
return shapes;
}
var holesFirst=!isClockWise(subPaths[0].getPoints());
holesFirst=isCCW?!holesFirst:holesFirst;
var betterShapeHoles=[];
var newShapes=[];
var newShapeHoles=[];
var mainIdx=0;
var tmpPoints;
newShapes[mainIdx]=undefined;
newShapeHoles[mainIdx]=[];
for(var i=0,l=subPaths.length;i<l;i++){
tmpPath=subPaths[i];
tmpPoints=tmpPath.getPoints();
solid=isClockWise(tmpPoints);
solid=isCCW?!solid:solid;
if(solid){
if(!holesFirst&&newShapes[mainIdx])mainIdx++;
newShapes[mainIdx]={s:new Shape(),p:tmpPoints};
newShapes[mainIdx].s.curves=tmpPath.curves;
if(holesFirst)mainIdx++;
newShapeHoles[mainIdx]=[];
}else{
newShapeHoles[mainIdx].push({h:tmpPath,p:tmpPoints[0]});
}
}
if(!newShapes[0])return toShapesNoHoles(subPaths);
if(newShapes.length>1){
var ambiguous=false;
var toChange=[];
for(var sIdx=0,sLen=newShapes.length;sIdx<sLen;sIdx++){
betterShapeHoles[sIdx]=[];
}
for(var sIdx=0,sLen=newShapes.length;sIdx<sLen;sIdx++){
var sho=newShapeHoles[sIdx];
for(var hIdx=0;hIdx<sho.length;hIdx++){
var ho=sho[hIdx];
var hole_unassigned=true;
for(var s2Idx=0;s2Idx<newShapes.length;s2Idx++){
if(isPointInsidePolygon(ho.p,newShapes[s2Idx].p)){
if(sIdx!==s2Idx)toChange.push({froms:sIdx,tos:s2Idx,hole:hIdx});
if(hole_unassigned){
hole_unassigned=false;
betterShapeHoles[s2Idx].push(ho);
}else{
ambiguous=true;
}
}
}
if(hole_unassigned){
betterShapeHoles[sIdx].push(ho);
}
}
}
if(toChange.length>0){
if(!ambiguous)newShapeHoles=betterShapeHoles;
}
}
var tmpHoles;
for(var i=0,il=newShapes.length;i<il;i++){
tmpShape=newShapes[i].s;
shapes.push(tmpShape);
tmpHoles=newShapeHoles[i];
for(var j=0,jl=tmpHoles.length;j<jl;j++){
tmpShape.holes.push(tmpHoles[j].h);
}
}
return shapes;
}};
function Font(data){
this.data=data;
}
babelHelpers.extends(Font.prototype,{
isFont:true,
generateShapes:function generateShapes(text,size,divisions){
function createPaths(text){
var chars=String(text).split('');
var scale=size/data.resolution;
var offset=0;
var paths=[];
for(var i=0;i<chars.length;i++){
var ret=createPath(chars[i],scale,offset);
offset+=ret.offset;
paths.push(ret.path);
}
return paths;
}
function createPath(c,scale,offset){
var glyph=data.glyphs[c]||data.glyphs['?'];
if(!glyph)return;
var path=new ShapePath();
var pts=[],b2=exports.ShapeUtils.b2,b3=exports.ShapeUtils.b3;
var x,y,cpx,cpy,cpx0,cpy0,cpx1,cpy1,cpx2,cpy2,laste;
if(glyph.o){
var outline=glyph._cachedOutline||(glyph._cachedOutline=glyph.o.split(' '));
for(var i=0,l=outline.length;i<l;){
var action=outline[i++];
switch(action){
case'm':
x=outline[i++]*scale+offset;
y=outline[i++]*scale;
path.moveTo(x,y);
break;
case'l':
x=outline[i++]*scale+offset;
y=outline[i++]*scale;
path.lineTo(x,y);
break;
case'q':
cpx=outline[i++]*scale+offset;
cpy=outline[i++]*scale;
cpx1=outline[i++]*scale+offset;
cpy1=outline[i++]*scale;
path.quadraticCurveTo(cpx1,cpy1,cpx,cpy);
laste=pts[pts.length-1];
if(laste){
cpx0=laste.x;
cpy0=laste.y;
for(var i2=1;i2<=divisions;i2++){
var t=i2/divisions;
b2(t,cpx0,cpx1,cpx);
b2(t,cpy0,cpy1,cpy);
}
}
break;
case'b':
cpx=outline[i++]*scale+offset;
cpy=outline[i++]*scale;
cpx1=outline[i++]*scale+offset;
cpy1=outline[i++]*scale;
cpx2=outline[i++]*scale+offset;
cpy2=outline[i++]*scale;
path.bezierCurveTo(cpx1,cpy1,cpx2,cpy2,cpx,cpy);
laste=pts[pts.length-1];
if(laste){
cpx0=laste.x;
cpy0=laste.y;
for(var i2=1;i2<=divisions;i2++){
var t=i2/divisions;
b3(t,cpx0,cpx1,cpx2,cpx);
b3(t,cpy0,cpy1,cpy2,cpy);
}
}
break;}
}
}
return{offset:glyph.ha*scale,path:path};
}
if(size===undefined)size=100;
if(divisions===undefined)divisions=4;
var data=this.data;
var paths=createPaths(text);
var shapes=[];
for(var p=0,pl=paths.length;p<pl;p++){
Array.prototype.push.apply(shapes,paths[p].toShapes());
}
return shapes;
}});
function FontLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(FontLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var scope=this;
var loader=new XHRLoader(this.manager);
loader.load(url,function(text){
var json;
try{
json=JSON.parse(text);
}catch(e){
console.warn('THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.');
json=JSON.parse(text.substring(65,text.length-2));
}
var font=scope.parse(json);
if(onLoad)onLoad(font);
},onProgress,onError);
},
parse:function parse(json){
return new Font(json);
}});
var context;
function getAudioContext(){
if(context===undefined){
context=new(window.AudioContext||window.webkitAudioContext)();
}
return context;
}
function AudioLoader(manager){
this.manager=manager!==undefined?manager:exports.DefaultLoadingManager;
}
babelHelpers.extends(AudioLoader.prototype,{
load:function load(url,onLoad,onProgress,onError){
var loader=new XHRLoader(this.manager);
loader.setResponseType('arraybuffer');
loader.load(url,function(buffer){
var context=getAudioContext();
context.decodeAudioData(buffer,function(audioBuffer){
onLoad(audioBuffer);
});
},onProgress,onError);
}});
function StereoCamera(){
this.type='StereoCamera';
this.aspect=1;
this.eyeSep=0.064;
this.cameraL=new PerspectiveCamera();
this.cameraL.layers.enable(1);
this.cameraL.matrixAutoUpdate=false;
this.cameraR=new PerspectiveCamera();
this.cameraR.layers.enable(2);
this.cameraR.matrixAutoUpdate=false;
}
babelHelpers.extends(StereoCamera.prototype,{
update:function(){
var focus,fov,aspect,near,far;
var eyeRight=new Matrix4();
var eyeLeft=new Matrix4();
return function update(camera){
var needsUpdate=focus!==camera.focus||fov!==camera.fov||
aspect!==camera.aspect*this.aspect||near!==camera.near||
far!==camera.far;
if(needsUpdate){
focus=camera.focus;
fov=camera.fov;
aspect=camera.aspect*this.aspect;
near=camera.near;
far=camera.far;
var projectionMatrix=camera.projectionMatrix.clone();
var eyeSep=this.eyeSep/2;
var eyeSepOnProjection=eyeSep*near/focus;
var ymax=near*Math.tan(exports.Math.DEG2RAD*fov*0.5);
var xmin,xmax;
eyeLeft.elements[12]=-eyeSep;
eyeRight.elements[12]=eyeSep;
xmin=-ymax*aspect+eyeSepOnProjection;
xmax=ymax*aspect+eyeSepOnProjection;
projectionMatrix.elements[0]=2*near/(xmax-xmin);
projectionMatrix.elements[8]=(xmax+xmin)/(xmax-xmin);
this.cameraL.projectionMatrix.copy(projectionMatrix);
xmin=-ymax*aspect-eyeSepOnProjection;
xmax=ymax*aspect-eyeSepOnProjection;
projectionMatrix.elements[0]=2*near/(xmax-xmin);
projectionMatrix.elements[8]=(xmax+xmin)/(xmax-xmin);
this.cameraR.projectionMatrix.copy(projectionMatrix);
}
this.cameraL.matrixWorld.copy(camera.matrixWorld).multiply(eyeLeft);
this.cameraR.matrixWorld.copy(camera.matrixWorld).multiply(eyeRight);
};
}()});
function CubeCamera(near,far,cubeResolution){
Object3D.call(this);
this.type='CubeCamera';
var fov=90,aspect=1;
var cameraPX=new PerspectiveCamera(fov,aspect,near,far);
cameraPX.up.set(0,-1,0);
cameraPX.lookAt(new Vector3(1,0,0));
this.add(cameraPX);
var cameraNX=new PerspectiveCamera(fov,aspect,near,far);
cameraNX.up.set(0,-1,0);
cameraNX.lookAt(new Vector3(-1,0,0));
this.add(cameraNX);
var cameraPY=new PerspectiveCamera(fov,aspect,near,far);
cameraPY.up.set(0,0,1);
cameraPY.lookAt(new Vector3(0,1,0));
this.add(cameraPY);
var cameraNY=new PerspectiveCamera(fov,aspect,near,far);
cameraNY.up.set(0,0,-1);
cameraNY.lookAt(new Vector3(0,-1,0));
this.add(cameraNY);
var cameraPZ=new PerspectiveCamera(fov,aspect,near,far);
cameraPZ.up.set(0,-1,0);
cameraPZ.lookAt(new Vector3(0,0,1));
this.add(cameraPZ);
var cameraNZ=new PerspectiveCamera(fov,aspect,near,far);
cameraNZ.up.set(0,-1,0);
cameraNZ.lookAt(new Vector3(0,0,-1));
this.add(cameraNZ);
var options={format:RGBFormat,magFilter:LinearFilter,minFilter:LinearFilter};
this.renderTarget=new WebGLRenderTargetCube(cubeResolution,cubeResolution,options);
this.updateCubeMap=function(renderer,scene){
if(this.parent===null)this.updateMatrixWorld();
var renderTarget=this.renderTarget;
var generateMipmaps=renderTarget.texture.generateMipmaps;
renderTarget.texture.generateMipmaps=false;
renderTarget.activeCubeFace=0;
renderer.render(scene,cameraPX,renderTarget);
renderTarget.activeCubeFace=1;
renderer.render(scene,cameraNX,renderTarget);
renderTarget.activeCubeFace=2;
renderer.render(scene,cameraPY,renderTarget);
renderTarget.activeCubeFace=3;
renderer.render(scene,cameraNY,renderTarget);
renderTarget.activeCubeFace=4;
renderer.render(scene,cameraPZ,renderTarget);
renderTarget.texture.generateMipmaps=generateMipmaps;
renderTarget.activeCubeFace=5;
renderer.render(scene,cameraNZ,renderTarget);
renderer.setRenderTarget(null);
};
}
CubeCamera.prototype=Object.create(Object3D.prototype);
CubeCamera.prototype.constructor=CubeCamera;
function AudioListener(){
Object3D.call(this);
this.type='AudioListener';
this.context=getAudioContext();
this.gain=this.context.createGain();
this.gain.connect(this.context.destination);
this.filter=null;
}
AudioListener.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:AudioListener,
getInput:function getInput(){
return this.gain;
},
removeFilter:function removeFilter(){
if(this.filter!==null){
this.gain.disconnect(this.filter);
this.filter.disconnect(this.context.destination);
this.gain.connect(this.context.destination);
this.filter=null;
}
},
getFilter:function getFilter(){
return this.filter;
},
setFilter:function setFilter(value){
if(this.filter!==null){
this.gain.disconnect(this.filter);
this.filter.disconnect(this.context.destination);
}else{
this.gain.disconnect(this.context.destination);
}
this.filter=value;
this.gain.connect(this.filter);
this.filter.connect(this.context.destination);
},
getMasterVolume:function getMasterVolume(){
return this.gain.gain.value;
},
setMasterVolume:function setMasterVolume(value){
this.gain.gain.value=value;
},
updateMatrixWorld:function(){
var position=new Vector3();
var quaternion=new Quaternion();
var scale=new Vector3();
var orientation=new Vector3();
return function updateMatrixWorld(force){
Object3D.prototype.updateMatrixWorld.call(this,force);
var listener=this.context.listener;
var up=this.up;
this.matrixWorld.decompose(position,quaternion,scale);
orientation.set(0,0,-1).applyQuaternion(quaternion);
listener.setPosition(position.x,position.y,position.z);
listener.setOrientation(orientation.x,orientation.y,orientation.z,up.x,up.y,up.z);
};
}()});
function Audio(listener){
Object3D.call(this);
this.type='Audio';
this.context=listener.context;
this.source=this.context.createBufferSource();
this.source.onended=this.onEnded.bind(this);
this.gain=this.context.createGain();
this.gain.connect(listener.getInput());
this.autoplay=false;
this.startTime=0;
this.playbackRate=1;
this.isPlaying=false;
this.hasPlaybackControl=true;
this.sourceType='empty';
this.filters=[];
}
Audio.prototype=babelHelpers.extends(Object.create(Object3D.prototype),{
constructor:Audio,
getOutput:function getOutput(){
return this.gain;
},
setNodeSource:function setNodeSource(audioNode){
this.hasPlaybackControl=false;
this.sourceType='audioNode';
this.source=audioNode;
this.connect();
return this;
},
setBuffer:function setBuffer(audioBuffer){
this.source.buffer=audioBuffer;
this.sourceType='buffer';
if(this.autoplay)this.play();
return this;
},
play:function play(){
if(this.isPlaying===true){
console.warn('THREE.Audio: Audio is already playing.');
return;
}
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
var source=this.context.createBufferSource();
source.buffer=this.source.buffer;
source.loop=this.source.loop;
source.onended=this.source.onended;
source.start(0,this.startTime);
source.playbackRate.value=this.playbackRate;
this.isPlaying=true;
this.source=source;
return this.connect();
},
pause:function pause(){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.source.stop();
this.startTime=this.context.currentTime;
this.isPlaying=false;
return this;
},
stop:function stop(){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.source.stop();
this.startTime=0;
this.isPlaying=false;
return this;
},
connect:function connect(){
if(this.filters.length>0){
this.source.connect(this.filters[0]);
for(var i=1,l=this.filters.length;i<l;i++){
this.filters[i-1].connect(this.filters[i]);
}
this.filters[this.filters.length-1].connect(this.getOutput());
}else{
this.source.connect(this.getOutput());
}
return this;
},
disconnect:function disconnect(){
if(this.filters.length>0){
this.source.disconnect(this.filters[0]);
for(var i=1,l=this.filters.length;i<l;i++){
this.filters[i-1].disconnect(this.filters[i]);
}
this.filters[this.filters.length-1].disconnect(this.getOutput());
}else{
this.source.disconnect(this.getOutput());
}
return this;
},
getFilters:function getFilters(){
return this.filters;
},
setFilters:function setFilters(value){
if(!value)value=[];
if(this.isPlaying===true){
this.disconnect();
this.filters=value;
this.connect();
}else{
this.filters=value;
}
return this;
},
getFilter:function getFilter(){
return this.getFilters()[0];
},
setFilter:function setFilter(filter){
return this.setFilters(filter?[filter]:[]);
},
setPlaybackRate:function setPlaybackRate(value){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.playbackRate=value;
if(this.isPlaying===true){
this.source.playbackRate.value=this.playbackRate;
}
return this;
},
getPlaybackRate:function getPlaybackRate(){
return this.playbackRate;
},
onEnded:function onEnded(){
this.isPlaying=false;
},
getLoop:function getLoop(){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return false;
}
return this.source.loop;
},
setLoop:function setLoop(value){
if(this.hasPlaybackControl===false){
console.warn('THREE.Audio: this Audio has no playback control.');
return;
}
this.source.loop=value;
},
getVolume:function getVolume(){
return this.gain.gain.value;
},
setVolume:function setVolume(value){
this.gain.gain.value=value;
return this;
}});
function PositionalAudio(listener){
Audio.call(this,listener);
this.panner=this.context.createPanner();
this.panner.connect(this.gain);
}
PositionalAudio.prototype=babelHelpers.extends(Object.create(Audio.prototype),{
constructor:PositionalAudio,
getOutput:function getOutput(){
return this.panner;
},
getRefDistance:function getRefDistance(){
return this.panner.refDistance;
},
setRefDistance:function setRefDistance(value){
this.panner.refDistance=value;
},
getRolloffFactor:function getRolloffFactor(){
return this.panner.rolloffFactor;
},
setRolloffFactor:function setRolloffFactor(value){
this.panner.rolloffFactor=value;
},
getDistanceModel:function getDistanceModel(){
return this.panner.distanceModel;
},
setDistanceModel:function setDistanceModel(value){
this.panner.distanceModel=value;
},
getMaxDistance:function getMaxDistance(){
return this.panner.maxDistance;
},
setMaxDistance:function setMaxDistance(value){
this.panner.maxDistance=value;
},
updateMatrixWorld:function(){
var position=new Vector3();
return function updateMatrixWorld(force){
Object3D.prototype.updateMatrixWorld.call(this,force);
position.setFromMatrixPosition(this.matrixWorld);
this.panner.setPosition(position.x,position.y,position.z);
};
}()});
function AudioAnalyser(audio,fftSize){
this.analyser=audio.context.createAnalyser();
this.analyser.fftSize=fftSize!==undefined?fftSize:2048;
this.data=new Uint8Array(this.analyser.frequencyBinCount);
audio.getOutput().connect(this.analyser);
}
babelHelpers.extends(AudioAnalyser.prototype,{
getFrequencyData:function getFrequencyData(){
this.analyser.getByteFrequencyData(this.data);
return this.data;
},
getAverageFrequency:function getAverageFrequency(){
var value=0,data=this.getFrequencyData();
for(var i=0;i<data.length;i++){
value+=data[i];
}
return value/data.length;
}});
function PropertyMixer(binding,typeName,valueSize){
this.binding=binding;
this.valueSize=valueSize;
var bufferType=Float64Array,
mixFunction;
switch(typeName){
case'quaternion':mixFunction=this._slerp;break;
case'string':
case'bool':
bufferType=Array,mixFunction=this._select;break;
default:mixFunction=this._lerp;}
this.buffer=new bufferType(valueSize*4);
this._mixBufferRegion=mixFunction;
this.cumulativeWeight=0;
this.useCount=0;
this.referenceCount=0;
}
PropertyMixer.prototype={
constructor:PropertyMixer,
accumulate:function accumulate(accuIndex,weight){
var buffer=this.buffer,
stride=this.valueSize,
offset=accuIndex*stride+stride,
currentWeight=this.cumulativeWeight;
if(currentWeight===0){
for(var i=0;i!==stride;++i){
buffer[offset+i]=buffer[i];
}
currentWeight=weight;
}else{
currentWeight+=weight;
var mix=weight/currentWeight;
this._mixBufferRegion(buffer,offset,0,mix,stride);
}
this.cumulativeWeight=currentWeight;
},
apply:function apply(accuIndex){
var stride=this.valueSize,
buffer=this.buffer,
offset=accuIndex*stride+stride,
weight=this.cumulativeWeight,
binding=this.binding;
this.cumulativeWeight=0;
if(weight<1){
var originalValueOffset=stride*3;
this._mixBufferRegion(
buffer,offset,originalValueOffset,1-weight,stride);
}
for(var i=stride,e=stride+stride;i!==e;++i){
if(buffer[i]!==buffer[i+stride]){
binding.setValue(buffer,offset);
break;
}
}
},
saveOriginalState:function saveOriginalState(){
var binding=this.binding;
var buffer=this.buffer,
stride=this.valueSize,
originalValueOffset=stride*3;
binding.getValue(buffer,originalValueOffset);
for(var i=stride,e=originalValueOffset;i!==e;++i){
buffer[i]=buffer[originalValueOffset+i%stride];
}
this.cumulativeWeight=0;
},
restoreOriginalState:function restoreOriginalState(){
var originalValueOffset=this.valueSize*3;
this.binding.setValue(this.buffer,originalValueOffset);
},
_select:function _select(buffer,dstOffset,srcOffset,t,stride){
if(t>=0.5){
for(var i=0;i!==stride;++i){
buffer[dstOffset+i]=buffer[srcOffset+i];
}
}
},
_slerp:function _slerp(buffer,dstOffset,srcOffset,t,stride){
Quaternion.slerpFlat(buffer,dstOffset,
buffer,dstOffset,buffer,srcOffset,t);
},
_lerp:function _lerp(buffer,dstOffset,srcOffset,t,stride){
var s=1-t;
for(var i=0;i!==stride;++i){
var j=dstOffset+i;
buffer[j]=buffer[j]*s+buffer[srcOffset+i]*t;
}
}};
function PropertyBinding(rootNode,path,parsedPath){
this.path=path;
this.parsedPath=parsedPath||
PropertyBinding.parseTrackName(path);
this.node=PropertyBinding.findNode(
rootNode,this.parsedPath.nodeName)||rootNode;
this.rootNode=rootNode;
}
PropertyBinding.prototype={
constructor:PropertyBinding,
getValue:function getValue_unbound(targetArray,offset){
this.bind();
this.getValue(targetArray,offset);
},
setValue:function getValue_unbound(sourceArray,offset){
this.bind();
this.setValue(sourceArray,offset);
},
bind:function bind(){
var targetObject=this.node,
parsedPath=this.parsedPath,
objectName=parsedPath.objectName,
propertyName=parsedPath.propertyName,
propertyIndex=parsedPath.propertyIndex;
if(!targetObject){
targetObject=PropertyBinding.findNode(
this.rootNode,parsedPath.nodeName)||this.rootNode;
this.node=targetObject;
}
this.getValue=this._getValue_unavailable;
this.setValue=this._setValue_unavailable;
if(!targetObject){
console.error(" trying to update node for track: "+this.path+" but it wasn't found.");
return;
}
if(objectName){
var objectIndex=parsedPath.objectIndex;
switch(objectName){
case'materials':
if(!targetObject.material){
console.error(' can not bind to material as node does not have a material',this);
return;
}
if(!targetObject.material.materials){
console.error(' can not bind to material.materials as node.material does not have a materials array',this);
return;
}
targetObject=targetObject.material.materials;
break;
case'bones':
if(!targetObject.skeleton){
console.error(' can not bind to bones as node does not have a skeleton',this);
return;
}
targetObject=targetObject.skeleton.bones;
for(var i=0;i<targetObject.length;i++){
if(targetObject[i].name===objectIndex){
objectIndex=i;
break;
}
}
break;
default:
if(targetObject[objectName]===undefined){
console.error(' can not bind to objectName of node, undefined',this);
return;
}
targetObject=targetObject[objectName];}
if(objectIndex!==undefined){
if(targetObject[objectIndex]===undefined){
console.error(" trying to bind to objectIndex of objectName, but is undefined:",this,targetObject);
return;
}
targetObject=targetObject[objectIndex];
}
}
var nodeProperty=targetObject[propertyName];
if(nodeProperty===undefined){
var nodeName=parsedPath.nodeName;
console.error(" trying to update property for track: "+nodeName+
'.'+propertyName+" but it wasn't found.",targetObject);
return;
}
var versioning=this.Versioning.None;
if(targetObject.needsUpdate!==undefined){
versioning=this.Versioning.NeedsUpdate;
this.targetObject=targetObject;
}else if(targetObject.matrixWorldNeedsUpdate!==undefined){
versioning=this.Versioning.MatrixWorldNeedsUpdate;
this.targetObject=targetObject;
}
var bindingType=this.BindingType.Direct;
if(propertyIndex!==undefined){
if(propertyName==="morphTargetInfluences"){
if(!targetObject.geometry){
console.error(' can not bind to morphTargetInfluences becasuse node does not have a geometry',this);
return;
}
if(!targetObject.geometry.morphTargets){
console.error(' can not bind to morphTargetInfluences becasuse node does not have a geometry.morphTargets',this);
return;
}
for(var i=0;i<this.node.geometry.morphTargets.length;i++){
if(targetObject.geometry.morphTargets[i].name===propertyIndex){
propertyIndex=i;
break;
}
}
}
bindingType=this.BindingType.ArrayElement;
this.resolvedProperty=nodeProperty;
this.propertyIndex=propertyIndex;
}else if(nodeProperty.fromArray!==undefined&&nodeProperty.toArray!==undefined){
bindingType=this.BindingType.HasFromToArray;
this.resolvedProperty=nodeProperty;
}else if(nodeProperty.length!==undefined){
bindingType=this.BindingType.EntireArray;
this.resolvedProperty=nodeProperty;
}else{
this.propertyName=propertyName;
}
this.getValue=this.GetterByBindingType[bindingType];
this.setValue=this.SetterByBindingTypeAndVersioning[bindingType][versioning];
},
unbind:function unbind(){
this.node=null;
this.getValue=this._getValue_unbound;
this.setValue=this._setValue_unbound;
}};
babelHelpers.extends(PropertyBinding.prototype,{
_getValue_unavailable:function _getValue_unavailable(){},
_setValue_unavailable:function _setValue_unavailable(){},
_getValue_unbound:PropertyBinding.prototype.getValue,
_setValue_unbound:PropertyBinding.prototype.setValue,
BindingType:{
Direct:0,
EntireArray:1,
ArrayElement:2,
HasFromToArray:3},
Versioning:{
None:0,
NeedsUpdate:1,
MatrixWorldNeedsUpdate:2},
GetterByBindingType:[
function getValue_direct(buffer,offset){
buffer[offset]=this.node[this.propertyName];
},
function getValue_array(buffer,offset){
var source=this.resolvedProperty;
for(var i=0,n=source.length;i!==n;++i){
buffer[offset++]=source[i];
}
},
function getValue_arrayElement(buffer,offset){
buffer[offset]=this.resolvedProperty[this.propertyIndex];
},
function getValue_toArray(buffer,offset){
this.resolvedProperty.toArray(buffer,offset);
}],
SetterByBindingTypeAndVersioning:[
[
function setValue_direct(buffer,offset){
this.node[this.propertyName]=buffer[offset];
},
function setValue_direct_setNeedsUpdate(buffer,offset){
this.node[this.propertyName]=buffer[offset];
this.targetObject.needsUpdate=true;
},
function setValue_direct_setMatrixWorldNeedsUpdate(buffer,offset){
this.node[this.propertyName]=buffer[offset];
this.targetObject.matrixWorldNeedsUpdate=true;
}],
[
function setValue_array(buffer,offset){
var dest=this.resolvedProperty;
for(var i=0,n=dest.length;i!==n;++i){
dest[i]=buffer[offset++];
}
},
function setValue_array_setNeedsUpdate(buffer,offset){
var dest=this.resolvedProperty;
for(var i=0,n=dest.length;i!==n;++i){
dest[i]=buffer[offset++];
}
this.targetObject.needsUpdate=true;
},
function setValue_array_setMatrixWorldNeedsUpdate(buffer,offset){
var dest=this.resolvedProperty;
for(var i=0,n=dest.length;i!==n;++i){
dest[i]=buffer[offset++];
}
this.targetObject.matrixWorldNeedsUpdate=true;
}],
[
function setValue_arrayElement(buffer,offset){
this.resolvedProperty[this.propertyIndex]=buffer[offset];
},
function setValue_arrayElement_setNeedsUpdate(buffer,offset){
this.resolvedProperty[this.propertyIndex]=buffer[offset];
this.targetObject.needsUpdate=true;
},
function setValue_arrayElement_setMatrixWorldNeedsUpdate(buffer,offset){
this.resolvedProperty[this.propertyIndex]=buffer[offset];
this.targetObject.matrixWorldNeedsUpdate=true;
}],
[
function setValue_fromArray(buffer,offset){
this.resolvedProperty.fromArray(buffer,offset);
},
function setValue_fromArray_setNeedsUpdate(buffer,offset){
this.resolvedProperty.fromArray(buffer,offset);
this.targetObject.needsUpdate=true;
},
function setValue_fromArray_setMatrixWorldNeedsUpdate(buffer,offset){
this.resolvedProperty.fromArray(buffer,offset);
this.targetObject.matrixWorldNeedsUpdate=true;
}]]});
PropertyBinding.Composite=
function(targetGroup,path,optionalParsedPath){
var parsedPath=optionalParsedPath||
PropertyBinding.parseTrackName(path);
this._targetGroup=targetGroup;
this._bindings=targetGroup.subscribe_(path,parsedPath);
};
PropertyBinding.Composite.prototype={
constructor:PropertyBinding.Composite,
getValue:function getValue(array,offset){
this.bind();
var firstValidIndex=this._targetGroup.nCachedObjects_,
binding=this._bindings[firstValidIndex];
if(binding!==undefined)binding.getValue(array,offset);
},
setValue:function setValue(array,offset){
var bindings=this._bindings;
for(var i=this._targetGroup.nCachedObjects_,
n=bindings.length;i!==n;++i){
bindings[i].setValue(array,offset);
}
},
bind:function bind(){
var bindings=this._bindings;
for(var i=this._targetGroup.nCachedObjects_,
n=bindings.length;i!==n;++i){
bindings[i].bind();
}
},
unbind:function unbind(){
var bindings=this._bindings;
for(var i=this._targetGroup.nCachedObjects_,
n=bindings.length;i!==n;++i){
bindings[i].unbind();
}
}};
PropertyBinding.create=function(root,path,parsedPath){
if(!(root&&root.isAnimationObjectGroup)){
return new PropertyBinding(root,path,parsedPath);
}else{
return new PropertyBinding.Composite(root,path,parsedPath);
}
};
PropertyBinding.parseTrackName=function(trackName){
var re=/^((?:\w+\/)*)(\w+)?(?:\.(\w+)(?:\[(.+)\])?)?\.(\w+)(?:\[(.+)\])?$/;
var matches=re.exec(trackName);
if(!matches){
throw new Error("cannot parse trackName at all: "+trackName);
}
var results={
nodeName:matches[2],
objectName:matches[3],
objectIndex:matches[4],
propertyName:matches[5],
propertyIndex:matches[6]};
if(results.propertyName===null||results.propertyName.length===0){
throw new Error("can not parse propertyName from trackName: "+trackName);
}
return results;
};
PropertyBinding.findNode=function(root,nodeName){
if(!nodeName||nodeName===""||nodeName==="root"||nodeName==="."||nodeName===-1||nodeName===root.name||nodeName===root.uuid){
return root;
}
if(root.skeleton){
var searchSkeleton=function searchSkeleton(skeleton){
for(var i=0;i<skeleton.bones.length;i++){
var bone=skeleton.bones[i];
if(bone.name===nodeName){
return bone;
}
}
return null;
};
var bone=searchSkeleton(root.skeleton);
if(bone){
return bone;
}
}
if(root.children){
var searchNodeSubtree=function searchNodeSubtree(children){
for(var i=0;i<children.length;i++){
var childNode=children[i];
if(childNode.name===nodeName||childNode.uuid===nodeName){
return childNode;
}
var result=searchNodeSubtree(childNode.children);
if(result)return result;
}
return null;
};
var subTreeNode=searchNodeSubtree(root.children);
if(subTreeNode){
return subTreeNode;
}
}
return null;
};
function AnimationObjectGroup(var_args){
this.uuid=exports.Math.generateUUID();
this._objects=Array.prototype.slice.call(arguments);
this.nCachedObjects_=0;
var indices={};
this._indicesByUUID=indices;
for(var i=0,n=arguments.length;i!==n;++i){
indices[arguments[i].uuid]=i;
}
this._paths=[];
this._parsedPaths=[];
this._bindings=[];
this._bindingsIndicesByPath={};
var scope=this;
this.stats={
objects:{
get total(){return scope._objects.length;},
get inUse(){return this.total-scope.nCachedObjects_;}},
get bindingsPerObject(){return scope._bindings.length;}};
}
AnimationObjectGroup.prototype={
constructor:AnimationObjectGroup,
isAnimationObjectGroup:true,
add:function add(var_args){
var objects=this._objects,
nObjects=objects.length,
nCachedObjects=this.nCachedObjects_,
indicesByUUID=this._indicesByUUID,
paths=this._paths,
parsedPaths=this._parsedPaths,
bindings=this._bindings,
nBindings=bindings.length;
for(var i=0,n=arguments.length;i!==n;++i){
var object=arguments[i],
uuid=object.uuid,
index=indicesByUUID[uuid];
if(index===undefined){
index=nObjects++;
indicesByUUID[uuid]=index;
objects.push(object);
for(var j=0,m=nBindings;j!==m;++j){
bindings[j].push(
new PropertyBinding(
object,paths[j],parsedPaths[j]));
}
}else if(index<nCachedObjects){
var knownObject=objects[index];
var firstActiveIndex=--nCachedObjects,
lastCachedObject=objects[firstActiveIndex];
indicesByUUID[lastCachedObject.uuid]=index;
objects[index]=lastCachedObject;
indicesByUUID[uuid]=firstActiveIndex;
objects[firstActiveIndex]=object;
for(var j=0,m=nBindings;j!==m;++j){
var bindingsForPath=bindings[j],
lastCached=bindingsForPath[firstActiveIndex],
binding=bindingsForPath[index];
bindingsForPath[index]=lastCached;
if(binding===undefined){
binding=new PropertyBinding(
object,paths[j],parsedPaths[j]);
}
bindingsForPath[firstActiveIndex]=binding;
}
}else if(objects[index]!==knownObject){
console.error("Different objects with the same UUID "+
"detected. Clean the caches or recreate your "+
"infrastructure when reloading scenes...");
}
}
this.nCachedObjects_=nCachedObjects;
},
remove:function remove(var_args){
var objects=this._objects,
nCachedObjects=this.nCachedObjects_,
indicesByUUID=this._indicesByUUID,
bindings=this._bindings,
nBindings=bindings.length;
for(var i=0,n=arguments.length;i!==n;++i){
var object=arguments[i],
uuid=object.uuid,
index=indicesByUUID[uuid];
if(index!==undefined&&index>=nCachedObjects){
var lastCachedIndex=nCachedObjects++,
firstActiveObject=objects[lastCachedIndex];
indicesByUUID[firstActiveObject.uuid]=index;
objects[index]=firstActiveObject;
indicesByUUID[uuid]=lastCachedIndex;
objects[lastCachedIndex]=object;
for(var j=0,m=nBindings;j!==m;++j){
var bindingsForPath=bindings[j],
firstActive=bindingsForPath[lastCachedIndex],
binding=bindingsForPath[index];
bindingsForPath[index]=firstActive;
bindingsForPath[lastCachedIndex]=binding;
}
}
}
this.nCachedObjects_=nCachedObjects;
},
uncache:function uncache(var_args){
var objects=this._objects,
nObjects=objects.length,
nCachedObjects=this.nCachedObjects_,
indicesByUUID=this._indicesByUUID,
bindings=this._bindings,
nBindings=bindings.length;
for(var i=0,n=arguments.length;i!==n;++i){
var object=arguments[i],
uuid=object.uuid,
index=indicesByUUID[uuid];
if(index!==undefined){
delete indicesByUUID[uuid];
if(index<nCachedObjects){
var firstActiveIndex=--nCachedObjects,
lastCachedObject=objects[firstActiveIndex],
lastIndex=--nObjects,
lastObject=objects[lastIndex];
indicesByUUID[lastCachedObject.uuid]=index;
objects[index]=lastCachedObject;
indicesByUUID[lastObject.uuid]=firstActiveIndex;
objects[firstActiveIndex]=lastObject;
objects.pop();
for(var j=0,m=nBindings;j!==m;++j){
var bindingsForPath=bindings[j],
lastCached=bindingsForPath[firstActiveIndex],
last=bindingsForPath[lastIndex];
bindingsForPath[index]=lastCached;
bindingsForPath[firstActiveIndex]=last;
bindingsForPath.pop();
}
}else{
var lastIndex=--nObjects,
lastObject=objects[lastIndex];
indicesByUUID[lastObject.uuid]=index;
objects[index]=lastObject;
objects.pop();
for(var j=0,m=nBindings;j!==m;++j){
var bindingsForPath=bindings[j];
bindingsForPath[index]=bindingsForPath[lastIndex];
bindingsForPath.pop();
}
}
}
}
this.nCachedObjects_=nCachedObjects;
},
subscribe_:function subscribe_(path,parsedPath){
var indicesByPath=this._bindingsIndicesByPath,
index=indicesByPath[path],
bindings=this._bindings;
if(index!==undefined)return bindings[index];
var paths=this._paths,
parsedPaths=this._parsedPaths,
objects=this._objects,
nObjects=objects.length,
nCachedObjects=this.nCachedObjects_,
bindingsForPath=new Array(nObjects);
index=bindings.length;
indicesByPath[path]=index;
paths.push(path);
parsedPaths.push(parsedPath);
bindings.push(bindingsForPath);
for(var i=nCachedObjects,
n=objects.length;i!==n;++i){
var object=objects[i];
bindingsForPath[i]=
new PropertyBinding(object,path,parsedPath);
}
return bindingsForPath;
},
unsubscribe_:function unsubscribe_(path){
var indicesByPath=this._bindingsIndicesByPath,
index=indicesByPath[path];
if(index!==undefined){
var paths=this._paths,
parsedPaths=this._parsedPaths,
bindings=this._bindings,
lastBindingsIndex=bindings.length-1,
lastBindings=bindings[lastBindingsIndex],
lastBindingsPath=path[lastBindingsIndex];
indicesByPath[lastBindingsPath]=index;
bindings[index]=lastBindings;
bindings.pop();
parsedPaths[index]=parsedPaths[lastBindingsIndex];
parsedPaths.pop();
paths[index]=paths[lastBindingsIndex];
paths.pop();
}
}};
function AnimationAction(mixer,clip,localRoot){
this._mixer=mixer;
this._clip=clip;
this._localRoot=localRoot||null;
var tracks=clip.tracks,
nTracks=tracks.length,
interpolants=new Array(nTracks);
var interpolantSettings={
endingStart:ZeroCurvatureEnding,
endingEnd:ZeroCurvatureEnding};
for(var i=0;i!==nTracks;++i){
var interpolant=tracks[i].createInterpolant(null);
interpolants[i]=interpolant;
interpolant.settings=interpolantSettings;
}
this._interpolantSettings=interpolantSettings;
this._interpolants=interpolants;
this._propertyBindings=new Array(nTracks);
this._cacheIndex=null;
this._byClipCacheIndex=null;
this._timeScaleInterpolant=null;
this._weightInterpolant=null;
this.loop=LoopRepeat;
this._loopCount=-1;
this._startTime=null;
this.time=0;
this.timeScale=1;
this._effectiveTimeScale=1;
this.weight=1;
this._effectiveWeight=1;
this.repetitions=Infinity;
this.paused=false;
this.enabled=true;
this.clampWhenFinished=false;
this.zeroSlopeAtStart=true;
this.zeroSlopeAtEnd=true;
};
AnimationAction.prototype={
constructor:AnimationAction,
play:function play(){
this._mixer._activateAction(this);
return this;
},
stop:function stop(){
this._mixer._deactivateAction(this);
return this.reset();
},
reset:function reset(){
this.paused=false;
this.enabled=true;
this.time=0;
this._loopCount=-1;
this._startTime=null;
return this.stopFading().stopWarping();
},
isRunning:function isRunning(){
return this.enabled&&!this.paused&&this.timeScale!==0&&
this._startTime===null&&this._mixer._isActiveAction(this);
},
isScheduled:function isScheduled(){
return this._mixer._isActiveAction(this);
},
startAt:function startAt(time){
this._startTime=time;
return this;
},
setLoop:function setLoop(mode,repetitions){
this.loop=mode;
this.repetitions=repetitions;
return this;
},
setEffectiveWeight:function setEffectiveWeight(weight){
this.weight=weight;
this._effectiveWeight=this.enabled?weight:0;
return this.stopFading();
},
getEffectiveWeight:function getEffectiveWeight(){
return this._effectiveWeight;
},
fadeIn:function fadeIn(duration){
return this._scheduleFading(duration,0,1);
},
fadeOut:function fadeOut(duration){
return this._scheduleFading(duration,1,0);
},
crossFadeFrom:function crossFadeFrom(fadeOutAction,duration,warp){
fadeOutAction.fadeOut(duration);
this.fadeIn(duration);
if(warp){
var fadeInDuration=this._clip.duration,
fadeOutDuration=fadeOutAction._clip.duration,
startEndRatio=fadeOutDuration/fadeInDuration,
endStartRatio=fadeInDuration/fadeOutDuration;
fadeOutAction.warp(1.0,startEndRatio,duration);
this.warp(endStartRatio,1.0,duration);
}
return this;
},
crossFadeTo:function crossFadeTo(fadeInAction,duration,warp){
return fadeInAction.crossFadeFrom(this,duration,warp);
},
stopFading:function stopFading(){
var weightInterpolant=this._weightInterpolant;
if(weightInterpolant!==null){
this._weightInterpolant=null;
this._mixer._takeBackControlInterpolant(weightInterpolant);
}
return this;
},
setEffectiveTimeScale:function setEffectiveTimeScale(timeScale){
this.timeScale=timeScale;
this._effectiveTimeScale=this.paused?0:timeScale;
return this.stopWarping();
},
getEffectiveTimeScale:function getEffectiveTimeScale(){
return this._effectiveTimeScale;
},
setDuration:function setDuration(duration){
this.timeScale=this._clip.duration/duration;
return this.stopWarping();
},
syncWith:function syncWith(action){
this.time=action.time;
this.timeScale=action.timeScale;
return this.stopWarping();
},
halt:function halt(duration){
return this.warp(this._effectiveTimeScale,0,duration);
},
warp:function warp(startTimeScale,endTimeScale,duration){
var mixer=this._mixer,now=mixer.time,
interpolant=this._timeScaleInterpolant,
timeScale=this.timeScale;
if(interpolant===null){
interpolant=mixer._lendControlInterpolant(),
this._timeScaleInterpolant=interpolant;
}
var times=interpolant.parameterPositions,
values=interpolant.sampleValues;
times[0]=now;
times[1]=now+duration;
values[0]=startTimeScale/timeScale;
values[1]=endTimeScale/timeScale;
return this;
},
stopWarping:function stopWarping(){
var timeScaleInterpolant=this._timeScaleInterpolant;
if(timeScaleInterpolant!==null){
this._timeScaleInterpolant=null;
this._mixer._takeBackControlInterpolant(timeScaleInterpolant);
}
return this;
},
getMixer:function getMixer(){
return this._mixer;
},
getClip:function getClip(){
return this._clip;
},
getRoot:function getRoot(){
return this._localRoot||this._mixer._root;
},
_update:function _update(time,deltaTime,timeDirection,accuIndex){
var startTime=this._startTime;
if(startTime!==null){
var timeRunning=(time-startTime)*timeDirection;
if(timeRunning<0||timeDirection===0){
return;
}
this._startTime=null;
deltaTime=timeDirection*timeRunning;
}
deltaTime*=this._updateTimeScale(time);
var clipTime=this._updateTime(deltaTime);
var weight=this._updateWeight(time);
if(weight>0){
var interpolants=this._interpolants;
var propertyMixers=this._propertyBindings;
for(var j=0,m=interpolants.length;j!==m;++j){
interpolants[j].evaluate(clipTime);
propertyMixers[j].accumulate(accuIndex,weight);
}
}
},
_updateWeight:function _updateWeight(time){
var weight=0;
if(this.enabled){
weight=this.weight;
var interpolant=this._weightInterpolant;
if(interpolant!==null){
var interpolantValue=interpolant.evaluate(time)[0];
weight*=interpolantValue;
if(time>interpolant.parameterPositions[1]){
this.stopFading();
if(interpolantValue===0){
this.enabled=false;
}
}
}
}
this._effectiveWeight=weight;
return weight;
},
_updateTimeScale:function _updateTimeScale(time){
var timeScale=0;
if(!this.paused){
timeScale=this.timeScale;
var interpolant=this._timeScaleInterpolant;
if(interpolant!==null){
var interpolantValue=interpolant.evaluate(time)[0];
timeScale*=interpolantValue;
if(time>interpolant.parameterPositions[1]){
this.stopWarping();
if(timeScale===0){
this.paused=true;
}else{
this.timeScale=timeScale;
}
}
}
}
this._effectiveTimeScale=timeScale;
return timeScale;
},
_updateTime:function _updateTime(deltaTime){
var time=this.time+deltaTime;
if(deltaTime===0)return time;
var duration=this._clip.duration,
loop=this.loop,
loopCount=this._loopCount;
if(loop===LoopOnce){
if(loopCount===-1){
this.loopCount=0;
this._setEndings(true,true,false);
}
handle_stop:{
if(time>=duration){
time=duration;
}else if(time<0){
time=0;
}else break handle_stop;
if(this.clampWhenFinished)this.paused=true;else
this.enabled=false;
this._mixer.dispatchEvent({
type:'finished',action:this,
direction:deltaTime<0?-1:1});
}
}else{
var pingPong=loop===LoopPingPong;
if(loopCount===-1){
if(deltaTime>=0){
loopCount=0;
this._setEndings(
true,this.repetitions===0,pingPong);
}else{
this._setEndings(
this.repetitions===0,true,pingPong);
}
}
if(time>=duration||time<0){
var loopDelta=Math.floor(time/duration);
time-=duration*loopDelta;
loopCount+=Math.abs(loopDelta);
var pending=this.repetitions-loopCount;
if(pending<0){
if(this.clampWhenFinished)this.paused=true;else
this.enabled=false;
time=deltaTime>0?duration:0;
this._mixer.dispatchEvent({
type:'finished',action:this,
direction:deltaTime>0?1:-1});
}else{
if(pending===0){
var atStart=deltaTime<0;
this._setEndings(atStart,!atStart,pingPong);
}else{
this._setEndings(false,false,pingPong);
}
this._loopCount=loopCount;
this._mixer.dispatchEvent({
type:'loop',action:this,loopDelta:loopDelta});
}
}
if(pingPong&&(loopCount&1)===1){
this.time=time;
return duration-time;
}
}
this.time=time;
return time;
},
_setEndings:function _setEndings(atStart,atEnd,pingPong){
var settings=this._interpolantSettings;
if(pingPong){
settings.endingStart=ZeroSlopeEnding;
settings.endingEnd=ZeroSlopeEnding;
}else{
if(atStart){
settings.endingStart=this.zeroSlopeAtStart?
ZeroSlopeEnding:ZeroCurvatureEnding;
}else{
settings.endingStart=WrapAroundEnding;
}
if(atEnd){
settings.endingEnd=this.zeroSlopeAtEnd?
ZeroSlopeEnding:ZeroCurvatureEnding;
}else{
settings.endingEnd=WrapAroundEnding;
}
}
},
_scheduleFading:function _scheduleFading(duration,weightNow,weightThen){
var mixer=this._mixer,now=mixer.time,
interpolant=this._weightInterpolant;
if(interpolant===null){
interpolant=mixer._lendControlInterpolant(),
this._weightInterpolant=interpolant;
}
var times=interpolant.parameterPositions,
values=interpolant.sampleValues;
times[0]=now;values[0]=weightNow;
times[1]=now+duration;values[1]=weightThen;
return this;
}};
function AnimationMixer(root){
this._root=root;
this._initMemoryManager();
this._accuIndex=0;
this.time=0;
this.timeScale=1.0;
}
babelHelpers.extends(AnimationMixer.prototype,EventDispatcher.prototype,{
clipAction:function clipAction(clip,optionalRoot){
var root=optionalRoot||this._root,
rootUuid=root.uuid,
clipObject=typeof clip==='string'?
AnimationClip.findByName(root,clip):clip,
clipUuid=clipObject!==null?clipObject.uuid:clip,
actionsForClip=this._actionsByClip[clipUuid],
prototypeAction=null;
if(actionsForClip!==undefined){
var existingAction=
actionsForClip.actionByRoot[rootUuid];
if(existingAction!==undefined){
return existingAction;
}
prototypeAction=actionsForClip.knownActions[0];
if(clipObject===null)
clipObject=prototypeAction._clip;
}
if(clipObject===null)return null;
var newAction=new AnimationAction(this,clipObject,optionalRoot);
this._bindAction(newAction,prototypeAction);
this._addInactiveAction(newAction,clipUuid,rootUuid);
return newAction;
},
existingAction:function existingAction(clip,optionalRoot){
var root=optionalRoot||this._root,
rootUuid=root.uuid,
clipObject=typeof clip==='string'?
AnimationClip.findByName(root,clip):clip,
clipUuid=clipObject?clipObject.uuid:clip,
actionsForClip=this._actionsByClip[clipUuid];
if(actionsForClip!==undefined){
return actionsForClip.actionByRoot[rootUuid]||null;
}
return null;
},
stopAllAction:function stopAllAction(){
var actions=this._actions,
nActions=this._nActiveActions,
bindings=this._bindings,
nBindings=this._nActiveBindings;
this._nActiveActions=0;
this._nActiveBindings=0;
for(var i=0;i!==nActions;++i){
actions[i].reset();
}
for(var i=0;i!==nBindings;++i){
bindings[i].useCount=0;
}
return this;
},
update:function update(deltaTime){
deltaTime*=this.timeScale;
var actions=this._actions,
nActions=this._nActiveActions,
time=this.time+=deltaTime,
timeDirection=Math.sign(deltaTime),
accuIndex=this._accuIndex^=1;
for(var i=0;i!==nActions;++i){
var action=actions[i];
if(action.enabled){
action._update(time,deltaTime,timeDirection,accuIndex);
}
}
var bindings=this._bindings,
nBindings=this._nActiveBindings;
for(var i=0;i!==nBindings;++i){
bindings[i].apply(accuIndex);
}
return this;
},
getRoot:function getRoot(){
return this._root;
},
uncacheClip:function uncacheClip(clip){
var actions=this._actions,
clipUuid=clip.uuid,
actionsByClip=this._actionsByClip,
actionsForClip=actionsByClip[clipUuid];
if(actionsForClip!==undefined){
var actionsToRemove=actionsForClip.knownActions;
for(var i=0,n=actionsToRemove.length;i!==n;++i){
var action=actionsToRemove[i];
this._deactivateAction(action);
var cacheIndex=action._cacheIndex,
lastInactiveAction=actions[actions.length-1];
action._cacheIndex=null;
action._byClipCacheIndex=null;
lastInactiveAction._cacheIndex=cacheIndex;
actions[cacheIndex]=lastInactiveAction;
actions.pop();
this._removeInactiveBindingsForAction(action);
}
delete actionsByClip[clipUuid];
}
},
uncacheRoot:function uncacheRoot(root){
var rootUuid=root.uuid,
actionsByClip=this._actionsByClip;
for(var clipUuid in actionsByClip){
var actionByRoot=actionsByClip[clipUuid].actionByRoot,
action=actionByRoot[rootUuid];
if(action!==undefined){
this._deactivateAction(action);
this._removeInactiveAction(action);
}
}
var bindingsByRoot=this._bindingsByRootAndName,
bindingByName=bindingsByRoot[rootUuid];
if(bindingByName!==undefined){
for(var trackName in bindingByName){
var binding=bindingByName[trackName];
binding.restoreOriginalState();
this._removeInactiveBinding(binding);
}
}
},
uncacheAction:function uncacheAction(clip,optionalRoot){
var action=this.existingAction(clip,optionalRoot);
if(action!==null){
this._deactivateAction(action);
this._removeInactiveAction(action);
}
}});
babelHelpers.extends(AnimationMixer.prototype,{
_bindAction:function _bindAction(action,prototypeAction){
var root=action._localRoot||this._root,
tracks=action._clip.tracks,
nTracks=tracks.length,
bindings=action._propertyBindings,
interpolants=action._interpolants,
rootUuid=root.uuid,
bindingsByRoot=this._bindingsByRootAndName,
bindingsByName=bindingsByRoot[rootUuid];
if(bindingsByName===undefined){
bindingsByName={};
bindingsByRoot[rootUuid]=bindingsByName;
}
for(var i=0;i!==nTracks;++i){
var track=tracks[i],
trackName=track.name,
binding=bindingsByName[trackName];
if(binding!==undefined){
bindings[i]=binding;
}else{
binding=bindings[i];
if(binding!==undefined){
if(binding._cacheIndex===null){
++binding.referenceCount;
this._addInactiveBinding(binding,rootUuid,trackName);
}
continue;
}
var path=prototypeAction&&prototypeAction.
_propertyBindings[i].binding.parsedPath;
binding=new PropertyMixer(
PropertyBinding.create(root,trackName,path),
track.ValueTypeName,track.getValueSize());
++binding.referenceCount;
this._addInactiveBinding(binding,rootUuid,trackName);
bindings[i]=binding;
}
interpolants[i].resultBuffer=binding.buffer;
}
},
_activateAction:function _activateAction(action){
if(!this._isActiveAction(action)){
if(action._cacheIndex===null){
var rootUuid=(action._localRoot||this._root).uuid,
clipUuid=action._clip.uuid,
actionsForClip=this._actionsByClip[clipUuid];
this._bindAction(action,
actionsForClip&&actionsForClip.knownActions[0]);
this._addInactiveAction(action,clipUuid,rootUuid);
}
var bindings=action._propertyBindings;
for(var i=0,n=bindings.length;i!==n;++i){
var binding=bindings[i];
if(binding.useCount++===0){
this._lendBinding(binding);
binding.saveOriginalState();
}
}
this._lendAction(action);
}
},
_deactivateAction:function _deactivateAction(action){
if(this._isActiveAction(action)){
var bindings=action._propertyBindings;
for(var i=0,n=bindings.length;i!==n;++i){
var binding=bindings[i];
if(--binding.useCount===0){
binding.restoreOriginalState();
this._takeBackBinding(binding);
}
}
this._takeBackAction(action);
}
},
_initMemoryManager:function _initMemoryManager(){
this._actions=[];
this._nActiveActions=0;
this._actionsByClip={};
this._bindings=[];
this._nActiveBindings=0;
this._bindingsByRootAndName={};
this._controlInterpolants=[];
this._nActiveControlInterpolants=0;
var scope=this;
this.stats={
actions:{
get total(){return scope._actions.length;},
get inUse(){return scope._nActiveActions;}},
bindings:{
get total(){return scope._bindings.length;},
get inUse(){return scope._nActiveBindings;}},
controlInterpolants:{
get total(){return scope._controlInterpolants.length;},
get inUse(){return scope._nActiveControlInterpolants;}}};
},
_isActiveAction:function _isActiveAction(action){
var index=action._cacheIndex;
return index!==null&&index<this._nActiveActions;
},
_addInactiveAction:function _addInactiveAction(action,clipUuid,rootUuid){
var actions=this._actions,
actionsByClip=this._actionsByClip,
actionsForClip=actionsByClip[clipUuid];
if(actionsForClip===undefined){
actionsForClip={
knownActions:[action],
actionByRoot:{}};
action._byClipCacheIndex=0;
actionsByClip[clipUuid]=actionsForClip;
}else{
var knownActions=actionsForClip.knownActions;
action._byClipCacheIndex=knownActions.length;
knownActions.push(action);
}
action._cacheIndex=actions.length;
actions.push(action);
actionsForClip.actionByRoot[rootUuid]=action;
},
_removeInactiveAction:function _removeInactiveAction(action){
var actions=this._actions,
lastInactiveAction=actions[actions.length-1],
cacheIndex=action._cacheIndex;
lastInactiveAction._cacheIndex=cacheIndex;
actions[cacheIndex]=lastInactiveAction;
actions.pop();
action._cacheIndex=null;
var clipUuid=action._clip.uuid,
actionsByClip=this._actionsByClip,
actionsForClip=actionsByClip[clipUuid],
knownActionsForClip=actionsForClip.knownActions,
lastKnownAction=
knownActionsForClip[knownActionsForClip.length-1],
byClipCacheIndex=action._byClipCacheIndex;
lastKnownAction._byClipCacheIndex=byClipCacheIndex;
knownActionsForClip[byClipCacheIndex]=lastKnownAction;
knownActionsForClip.pop();
action._byClipCacheIndex=null;
var actionByRoot=actionsForClip.actionByRoot,
rootUuid=(actions._localRoot||this._root).uuid;
delete actionByRoot[rootUuid];
if(knownActionsForClip.length===0){
delete actionsByClip[clipUuid];
}
this._removeInactiveBindingsForAction(action);
},
_removeInactiveBindingsForAction:function _removeInactiveBindingsForAction(action){
var bindings=action._propertyBindings;
for(var i=0,n=bindings.length;i!==n;++i){
var binding=bindings[i];
if(--binding.referenceCount===0){
this._removeInactiveBinding(binding);
}
}
},
_lendAction:function _lendAction(action){
var actions=this._actions,
prevIndex=action._cacheIndex,
lastActiveIndex=this._nActiveActions++,
firstInactiveAction=actions[lastActiveIndex];
action._cacheIndex=lastActiveIndex;
actions[lastActiveIndex]=action;
firstInactiveAction._cacheIndex=prevIndex;
actions[prevIndex]=firstInactiveAction;
},
_takeBackAction:function _takeBackAction(action){
var actions=this._actions,
prevIndex=action._cacheIndex,
firstInactiveIndex=--this._nActiveActions,
lastActiveAction=actions[firstInactiveIndex];
action._cacheIndex=firstInactiveIndex;
actions[firstInactiveIndex]=action;
lastActiveAction._cacheIndex=prevIndex;
actions[prevIndex]=lastActiveAction;
},
_addInactiveBinding:function _addInactiveBinding(binding,rootUuid,trackName){
var bindingsByRoot=this._bindingsByRootAndName,
bindingByName=bindingsByRoot[rootUuid],
bindings=this._bindings;
if(bindingByName===undefined){
bindingByName={};
bindingsByRoot[rootUuid]=bindingByName;
}
bindingByName[trackName]=binding;
binding._cacheIndex=bindings.length;
bindings.push(binding);
},
_removeInactiveBinding:function _removeInactiveBinding(binding){
var bindings=this._bindings,
propBinding=binding.binding,
rootUuid=propBinding.rootNode.uuid,
trackName=propBinding.path,
bindingsByRoot=this._bindingsByRootAndName,
bindingByName=bindingsByRoot[rootUuid],
lastInactiveBinding=bindings[bindings.length-1],
cacheIndex=binding._cacheIndex;
lastInactiveBinding._cacheIndex=cacheIndex;
bindings[cacheIndex]=lastInactiveBinding;
bindings.pop();
delete bindingByName[trackName];
remove_empty_map:{
for(var _ in bindingByName){break remove_empty_map;}
delete bindingsByRoot[rootUuid];
}
},
_lendBinding:function _lendBinding(binding){
var bindings=this._bindings,
prevIndex=binding._cacheIndex,
lastActiveIndex=this._nActiveBindings++,
firstInactiveBinding=bindings[lastActiveIndex];
binding._cacheIndex=lastActiveIndex;
bindings[lastActiveIndex]=binding;
firstInactiveBinding._cacheIndex=prevIndex;
bindings[prevIndex]=firstInactiveBinding;
},
_takeBackBinding:function _takeBackBinding(binding){
var bindings=this._bindings,
prevIndex=binding._cacheIndex,
firstInactiveIndex=--this._nActiveBindings,
lastActiveBinding=bindings[firstInactiveIndex];
binding._cacheIndex=firstInactiveIndex;
bindings[firstInactiveIndex]=binding;
lastActiveBinding._cacheIndex=prevIndex;
bindings[prevIndex]=lastActiveBinding;
},
_lendControlInterpolant:function _lendControlInterpolant(){
var interpolants=this._controlInterpolants,
lastActiveIndex=this._nActiveControlInterpolants++,
interpolant=interpolants[lastActiveIndex];
if(interpolant===undefined){
interpolant=new LinearInterpolant(
new Float32Array(2),new Float32Array(2),
1,this._controlInterpolantsResultBuffer);
interpolant.__cacheIndex=lastActiveIndex;
interpolants[lastActiveIndex]=interpolant;
}
return interpolant;
},
_takeBackControlInterpolant:function _takeBackControlInterpolant(interpolant){
var interpolants=this._controlInterpolants,
prevIndex=interpolant.__cacheIndex,
firstInactiveIndex=--this._nActiveControlInterpolants,
lastActiveInterpolant=interpolants[firstInactiveIndex];
interpolant.__cacheIndex=firstInactiveIndex;
interpolants[firstInactiveIndex]=interpolant;
lastActiveInterpolant.__cacheIndex=prevIndex;
interpolants[prevIndex]=lastActiveInterpolant;
},
_controlInterpolantsResultBuffer:new Float32Array(1)});
function Uniform(value){
if(typeof value==='string'){
console.warn('THREE.Uniform: Type parameter is no longer needed.');
value=arguments[1];
}
this.value=value;
this.dynamic=false;
}
Uniform.prototype={
constructor:Uniform,
onUpdate:function onUpdate(callback){
this.dynamic=true;
this.onUpdateCallback=callback;
return this;
}};
function InstancedBufferGeometry(){
BufferGeometry.call(this);
this.type='InstancedBufferGeometry';
this.maxInstancedCount=undefined;
}
InstancedBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
InstancedBufferGeometry.prototype.constructor=InstancedBufferGeometry;
InstancedBufferGeometry.prototype.isInstancedBufferGeometry=true;
InstancedBufferGeometry.prototype.addGroup=function(start,count,instances){
this.groups.push({
start:start,
count:count,
instances:instances});
};
InstancedBufferGeometry.prototype.copy=function(source){
var index=source.index;
if(index!==null){
this.setIndex(index.clone());
}
var attributes=source.attributes;
for(var name in attributes){
var attribute=attributes[name];
this.addAttribute(name,attribute.clone());
}
var groups=source.groups;
for(var i=0,l=groups.length;i<l;i++){
var group=groups[i];
this.addGroup(group.start,group.count,group.instances);
}
return this;
};
function InterleavedBufferAttribute(interleavedBuffer,itemSize,offset,normalized){
this.uuid=exports.Math.generateUUID();
this.data=interleavedBuffer;
this.itemSize=itemSize;
this.offset=offset;
this.normalized=normalized===true;
}
InterleavedBufferAttribute.prototype={
constructor:InterleavedBufferAttribute,
isInterleavedBufferAttribute:true,
get length(){
console.warn('THREE.BufferAttribute: .length has been deprecated. Please use .count.');
return this.array.length;
},
get count(){
return this.data.count;
},
get array(){
return this.data.array;
},
setX:function setX(index,x){
this.data.array[index*this.data.stride+this.offset]=x;
return this;
},
setY:function setY(index,y){
this.data.array[index*this.data.stride+this.offset+1]=y;
return this;
},
setZ:function setZ(index,z){
this.data.array[index*this.data.stride+this.offset+2]=z;
return this;
},
setW:function setW(index,w){
this.data.array[index*this.data.stride+this.offset+3]=w;
return this;
},
getX:function getX(index){
return this.data.array[index*this.data.stride+this.offset];
},
getY:function getY(index){
return this.data.array[index*this.data.stride+this.offset+1];
},
getZ:function getZ(index){
return this.data.array[index*this.data.stride+this.offset+2];
},
getW:function getW(index){
return this.data.array[index*this.data.stride+this.offset+3];
},
setXY:function setXY(index,x,y){
index=index*this.data.stride+this.offset;
this.data.array[index+0]=x;
this.data.array[index+1]=y;
return this;
},
setXYZ:function setXYZ(index,x,y,z){
index=index*this.data.stride+this.offset;
this.data.array[index+0]=x;
this.data.array[index+1]=y;
this.data.array[index+2]=z;
return this;
},
setXYZW:function setXYZW(index,x,y,z,w){
index=index*this.data.stride+this.offset;
this.data.array[index+0]=x;
this.data.array[index+1]=y;
this.data.array[index+2]=z;
this.data.array[index+3]=w;
return this;
}};
function InterleavedBuffer(array,stride){
this.uuid=exports.Math.generateUUID();
this.array=array;
this.stride=stride;
this.dynamic=false;
this.updateRange={offset:0,count:-1};
this.version=0;
}
InterleavedBuffer.prototype={
constructor:InterleavedBuffer,
isInterleavedBuffer:true,
get length(){
return this.array.length;
},
get count(){
return this.array.length/this.stride;
},
set needsUpdate(value){
if(value===true)this.version++;
},
setDynamic:function setDynamic(value){
this.dynamic=value;
return this;
},
copy:function copy(source){
this.array=new source.array.constructor(source.array);
this.stride=source.stride;
this.dynamic=source.dynamic;
return this;
},
copyAt:function copyAt(index1,attribute,index2){
index1*=this.stride;
index2*=attribute.stride;
for(var i=0,l=this.stride;i<l;i++){
this.array[index1+i]=attribute.array[index2+i];
}
return this;
},
set:function set(value,offset){
if(offset===undefined)offset=0;
this.array.set(value,offset);
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
}};
function InstancedInterleavedBuffer(array,stride,meshPerAttribute){
InterleavedBuffer.call(this,array,stride);
this.meshPerAttribute=meshPerAttribute||1;
}
InstancedInterleavedBuffer.prototype=Object.create(InterleavedBuffer.prototype);
InstancedInterleavedBuffer.prototype.constructor=InstancedInterleavedBuffer;
InstancedInterleavedBuffer.prototype.isInstancedInterleavedBuffer=true;
InstancedInterleavedBuffer.prototype.copy=function(source){
InterleavedBuffer.prototype.copy.call(this,source);
this.meshPerAttribute=source.meshPerAttribute;
return this;
};
function InstancedBufferAttribute(array,itemSize,meshPerAttribute){
BufferAttribute.call(this,array,itemSize);
this.meshPerAttribute=meshPerAttribute||1;
}
InstancedBufferAttribute.prototype=Object.create(BufferAttribute.prototype);
InstancedBufferAttribute.prototype.constructor=InstancedBufferAttribute;
InstancedBufferAttribute.prototype.isInstancedBufferAttribute=true;
InstancedBufferAttribute.prototype.copy=function(source){
BufferAttribute.prototype.copy.call(this,source);
this.meshPerAttribute=source.meshPerAttribute;
return this;
};
function Raycaster(origin,direction,near,far){
this.ray=new Ray(origin,direction);
this.near=near||0;
this.far=far||Infinity;
this.params={
Mesh:{},
Line:{},
LOD:{},
Points:{threshold:1},
Sprite:{}};
Object.defineProperties(this.params,{
PointCloud:{
get:function get(){
console.warn('THREE.Raycaster: params.PointCloud has been renamed to params.Points.');
return this.Points;
}}});
}
function ascSort(a,b){
return a.distance-b.distance;
}
function _intersectObject(object,raycaster,intersects,recursive){
if(object.visible===false)return;
object.raycast(raycaster,intersects);
if(recursive===true){
var children=object.children;
for(var i=0,l=children.length;i<l;i++){
_intersectObject(children[i],raycaster,intersects,true);
}
}
}
Raycaster.prototype={
constructor:Raycaster,
linePrecision:1,
set:function set(origin,direction){
this.ray.set(origin,direction);
},
setFromCamera:function setFromCamera(coords,camera){
if(camera&&camera.isPerspectiveCamera){
this.ray.origin.setFromMatrixPosition(camera.matrixWorld);
this.ray.direction.set(coords.x,coords.y,0.5).unproject(camera).sub(this.ray.origin).normalize();
}else if(camera&&camera.isOrthographicCamera){
this.ray.origin.set(coords.x,coords.y,(camera.near+camera.far)/(camera.near-camera.far)).unproject(camera);
this.ray.direction.set(0,0,-1).transformDirection(camera.matrixWorld);
}else{
console.error('THREE.Raycaster: Unsupported camera type.');
}
},
intersectObject:function intersectObject(object,recursive){
var intersects=[];
_intersectObject(object,this,intersects,recursive);
intersects.sort(ascSort);
return intersects;
},
intersectObjects:function intersectObjects(objects,recursive){
var intersects=[];
if(Array.isArray(objects)===false){
console.warn('THREE.Raycaster.intersectObjects: objects is not an Array.');
return intersects;
}
for(var i=0,l=objects.length;i<l;i++){
_intersectObject(objects[i],this,intersects,recursive);
}
intersects.sort(ascSort);
return intersects;
}};
function Clock(autoStart){
this.autoStart=autoStart!==undefined?autoStart:true;
this.startTime=0;
this.oldTime=0;
this.elapsedTime=0;
this.running=false;
}
Clock.prototype={
constructor:Clock,
start:function start(){
this.startTime=(performance||Date).now();
this.oldTime=this.startTime;
this.running=true;
},
stop:function stop(){
this.getElapsedTime();
this.running=false;
},
getElapsedTime:function getElapsedTime(){
this.getDelta();
return this.elapsedTime;
},
getDelta:function getDelta(){
var diff=0;
if(this.autoStart&&!this.running){
this.start();
}
if(this.running){
var newTime=(performance||Date).now();
diff=(newTime-this.oldTime)/1000;
this.oldTime=newTime;
this.elapsedTime+=diff;
}
return diff;
}};
function Spline(points){
this.points=points;
var c=[],v3={x:0,y:0,z:0},
point,intPoint,weight,w2,w3,
pa,pb,pc,pd;
this.initFromArray=function(a){
this.points=[];
for(var i=0;i<a.length;i++){
this.points[i]={x:a[i][0],y:a[i][1],z:a[i][2]};
}
};
this.getPoint=function(k){
point=(this.points.length-1)*k;
intPoint=Math.floor(point);
weight=point-intPoint;
c[0]=intPoint===0?intPoint:intPoint-1;
c[1]=intPoint;
c[2]=intPoint>this.points.length-2?this.points.length-1:intPoint+1;
c[3]=intPoint>this.points.length-3?this.points.length-1:intPoint+2;
pa=this.points[c[0]];
pb=this.points[c[1]];
pc=this.points[c[2]];
pd=this.points[c[3]];
w2=weight*weight;
w3=weight*w2;
v3.x=interpolate(pa.x,pb.x,pc.x,pd.x,weight,w2,w3);
v3.y=interpolate(pa.y,pb.y,pc.y,pd.y,weight,w2,w3);
v3.z=interpolate(pa.z,pb.z,pc.z,pd.z,weight,w2,w3);
return v3;
};
this.getControlPointsArray=function(){
var i,p,l=this.points.length,
coords=[];
for(i=0;i<l;i++){
p=this.points[i];
coords[i]=[p.x,p.y,p.z];
}
return coords;
};
this.getLength=function(nSubDivisions){
var i,index,nSamples,position,
point=0,intPoint=0,oldIntPoint=0,
oldPosition=new Vector3(),
tmpVec=new Vector3(),
chunkLengths=[],
totalLength=0;
chunkLengths[0]=0;
if(!nSubDivisions)nSubDivisions=100;
nSamples=this.points.length*nSubDivisions;
oldPosition.copy(this.points[0]);
for(i=1;i<nSamples;i++){
index=i/nSamples;
position=this.getPoint(index);
tmpVec.copy(position);
totalLength+=tmpVec.distanceTo(oldPosition);
oldPosition.copy(position);
point=(this.points.length-1)*index;
intPoint=Math.floor(point);
if(intPoint!==oldIntPoint){
chunkLengths[intPoint]=totalLength;
oldIntPoint=intPoint;
}
}
chunkLengths[chunkLengths.length]=totalLength;
return{chunks:chunkLengths,total:totalLength};
};
this.reparametrizeByArcLength=function(samplingCoef){
var i,j,
index,indexCurrent,indexNext,
realDistance,
sampling,position,
newpoints=[],
tmpVec=new Vector3(),
sl=this.getLength();
newpoints.push(tmpVec.copy(this.points[0]).clone());
for(i=1;i<this.points.length;i++){
realDistance=sl.chunks[i]-sl.chunks[i-1];
sampling=Math.ceil(samplingCoef*realDistance/sl.total);
indexCurrent=(i-1)/(this.points.length-1);
indexNext=i/(this.points.length-1);
for(j=1;j<sampling-1;j++){
index=indexCurrent+j*(1/sampling)*(indexNext-indexCurrent);
position=this.getPoint(index);
newpoints.push(tmpVec.copy(position).clone());
}
newpoints.push(tmpVec.copy(this.points[i]).clone());
}
this.points=newpoints;
};
function interpolate(p0,p1,p2,p3,t,t2,t3){
var v0=(p2-p0)*0.5,
v1=(p3-p1)*0.5;
return(2*(p1-p2)+v0+v1)*t3+(-3*(p1-p2)-2*v0-v1)*t2+v0*t+p1;
}
}
function Spherical(radius,phi,theta){
this.radius=radius!==undefined?radius:1.0;
this.phi=phi!==undefined?phi:0;
this.theta=theta!==undefined?theta:0;
return this;
}
Spherical.prototype={
constructor:Spherical,
set:function set(radius,phi,theta){
this.radius=radius;
this.phi=phi;
this.theta=theta;
return this;
},
clone:function clone(){
return new this.constructor().copy(this);
},
copy:function copy(other){
this.radius.copy(other.radius);
this.phi.copy(other.phi);
this.theta.copy(other.theta);
return this;
},
makeSafe:function makeSafe(){
var EPS=0.000001;
this.phi=Math.max(EPS,Math.min(Math.PI-EPS,this.phi));
return this;
},
setFromVector3:function setFromVector3(vec3){
this.radius=vec3.length();
if(this.radius===0){
this.theta=0;
this.phi=0;
}else{
this.theta=Math.atan2(vec3.x,vec3.z);
this.phi=Math.acos(exports.Math.clamp(vec3.y/this.radius,-1,1));
}
return this;
}};
function MorphBlendMesh(geometry,material){
Mesh.call(this,geometry,material);
this.animationsMap={};
this.animationsList=[];
var numFrames=this.geometry.morphTargets.length;
var name="__default";
var startFrame=0;
var endFrame=numFrames-1;
var fps=numFrames/1;
this.createAnimation(name,startFrame,endFrame,fps);
this.setAnimationWeight(name,1);
}
MorphBlendMesh.prototype=Object.create(Mesh.prototype);
MorphBlendMesh.prototype.constructor=MorphBlendMesh;
MorphBlendMesh.prototype.createAnimation=function(name,start,end,fps){
var animation={
start:start,
end:end,
length:end-start+1,
fps:fps,
duration:(end-start)/fps,
lastFrame:0,
currentFrame:0,
active:false,
time:0,
direction:1,
weight:1,
directionBackwards:false,
mirroredLoop:false};
this.animationsMap[name]=animation;
this.animationsList.push(animation);
};
MorphBlendMesh.prototype.autoCreateAnimations=function(fps){
var pattern=/([a-z]+)_?(\d+)/i;
var firstAnimation,frameRanges={};
var geometry=this.geometry;
for(var i=0,il=geometry.morphTargets.length;i<il;i++){
var morph=geometry.morphTargets[i];
var chunks=morph.name.match(pattern);
if(chunks&&chunks.length>1){
var name=chunks[1];
if(!frameRanges[name])frameRanges[name]={start:Infinity,end:-Infinity};
var range=frameRanges[name];
if(i<range.start)range.start=i;
if(i>range.end)range.end=i;
if(!firstAnimation)firstAnimation=name;
}
}
for(var name in frameRanges){
var range=frameRanges[name];
this.createAnimation(name,range.start,range.end,fps);
}
this.firstAnimation=firstAnimation;
};
MorphBlendMesh.prototype.setAnimationDirectionForward=function(name){
var animation=this.animationsMap[name];
if(animation){
animation.direction=1;
animation.directionBackwards=false;
}
};
MorphBlendMesh.prototype.setAnimationDirectionBackward=function(name){
var animation=this.animationsMap[name];
if(animation){
animation.direction=-1;
animation.directionBackwards=true;
}
};
MorphBlendMesh.prototype.setAnimationFPS=function(name,fps){
var animation=this.animationsMap[name];
if(animation){
animation.fps=fps;
animation.duration=(animation.end-animation.start)/animation.fps;
}
};
MorphBlendMesh.prototype.setAnimationDuration=function(name,duration){
var animation=this.animationsMap[name];
if(animation){
animation.duration=duration;
animation.fps=(animation.end-animation.start)/animation.duration;
}
};
MorphBlendMesh.prototype.setAnimationWeight=function(name,weight){
var animation=this.animationsMap[name];
if(animation){
animation.weight=weight;
}
};
MorphBlendMesh.prototype.setAnimationTime=function(name,time){
var animation=this.animationsMap[name];
if(animation){
animation.time=time;
}
};
MorphBlendMesh.prototype.getAnimationTime=function(name){
var time=0;
var animation=this.animationsMap[name];
if(animation){
time=animation.time;
}
return time;
};
MorphBlendMesh.prototype.getAnimationDuration=function(name){
var duration=-1;
var animation=this.animationsMap[name];
if(animation){
duration=animation.duration;
}
return duration;
};
MorphBlendMesh.prototype.playAnimation=function(name){
var animation=this.animationsMap[name];
if(animation){
animation.time=0;
animation.active=true;
}else{
console.warn("THREE.MorphBlendMesh: animation["+name+"] undefined in .playAnimation()");
}
};
MorphBlendMesh.prototype.stopAnimation=function(name){
var animation=this.animationsMap[name];
if(animation){
animation.active=false;
}
};
MorphBlendMesh.prototype.update=function(delta){
for(var i=0,il=this.animationsList.length;i<il;i++){
var animation=this.animationsList[i];
if(!animation.active)continue;
var frameTime=animation.duration/animation.length;
animation.time+=animation.direction*delta;
if(animation.mirroredLoop){
if(animation.time>animation.duration||animation.time<0){
animation.direction*=-1;
if(animation.time>animation.duration){
animation.time=animation.duration;
animation.directionBackwards=true;
}
if(animation.time<0){
animation.time=0;
animation.directionBackwards=false;
}
}
}else{
animation.time=animation.time%animation.duration;
if(animation.time<0)animation.time+=animation.duration;
}
var keyframe=animation.start+exports.Math.clamp(Math.floor(animation.time/frameTime),0,animation.length-1);
var weight=animation.weight;
if(keyframe!==animation.currentFrame){
this.morphTargetInfluences[animation.lastFrame]=0;
this.morphTargetInfluences[animation.currentFrame]=1*weight;
this.morphTargetInfluences[keyframe]=0;
animation.lastFrame=animation.currentFrame;
animation.currentFrame=keyframe;
}
var mix=animation.time%frameTime/frameTime;
if(animation.directionBackwards)mix=1-mix;
if(animation.currentFrame!==animation.lastFrame){
this.morphTargetInfluences[animation.currentFrame]=mix*weight;
this.morphTargetInfluences[animation.lastFrame]=(1-mix)*weight;
}else{
this.morphTargetInfluences[animation.currentFrame]=weight;
}
}
};
function ImmediateRenderObject(material){
Object3D.call(this);
this.material=material;
this.render=function(renderCallback){};
}
ImmediateRenderObject.prototype=Object.create(Object3D.prototype);
ImmediateRenderObject.prototype.constructor=ImmediateRenderObject;
ImmediateRenderObject.prototype.isImmediateRenderObject=true;
function WireframeGeometry(geometry){
BufferGeometry.call(this);
var edge=[0,0],hash={};
function sortFunction(a,b){
return a-b;
}
var keys=['a','b','c'];
if(geometry&&geometry.isGeometry){
var vertices=geometry.vertices;
var faces=geometry.faces;
var numEdges=0;
var edges=new Uint32Array(6*faces.length);
for(var i=0,l=faces.length;i<l;i++){
var face=faces[i];
for(var j=0;j<3;j++){
edge[0]=face[keys[j]];
edge[1]=face[keys[(j+1)%3]];
edge.sort(sortFunction);
var key=edge.toString();
if(hash[key]===undefined){
edges[2*numEdges]=edge[0];
edges[2*numEdges+1]=edge[1];
hash[key]=true;
numEdges++;
}
}
}
var coords=new Float32Array(numEdges*2*3);
for(var i=0,l=numEdges;i<l;i++){
for(var j=0;j<2;j++){
var vertex=vertices[edges[2*i+j]];
var index=6*i+3*j;
coords[index+0]=vertex.x;
coords[index+1]=vertex.y;
coords[index+2]=vertex.z;
}
}
this.addAttribute('position',new BufferAttribute(coords,3));
}else if(geometry&&geometry.isBufferGeometry){
if(geometry.index!==null){
var indices=geometry.index.array;
var vertices=geometry.attributes.position;
var groups=geometry.groups;
var numEdges=0;
if(groups.length===0){
geometry.addGroup(0,indices.length);
}
var edges=new Uint32Array(2*indices.length);
for(var o=0,ol=groups.length;o<ol;++o){
var group=groups[o];
var start=group.start;
var count=group.count;
for(var i=start,il=start+count;i<il;i+=3){
for(var j=0;j<3;j++){
edge[0]=indices[i+j];
edge[1]=indices[i+(j+1)%3];
edge.sort(sortFunction);
var key=edge.toString();
if(hash[key]===undefined){
edges[2*numEdges]=edge[0];
edges[2*numEdges+1]=edge[1];
hash[key]=true;
numEdges++;
}
}
}
}
var coords=new Float32Array(numEdges*2*3);
for(var i=0,l=numEdges;i<l;i++){
for(var j=0;j<2;j++){
var index=6*i+3*j;
var index2=edges[2*i+j];
coords[index+0]=vertices.getX(index2);
coords[index+1]=vertices.getY(index2);
coords[index+2]=vertices.getZ(index2);
}
}
this.addAttribute('position',new BufferAttribute(coords,3));
}else{
var vertices=geometry.attributes.position.array;
var numEdges=vertices.length/3;
var numTris=numEdges/3;
var coords=new Float32Array(numEdges*2*3);
for(var i=0,l=numTris;i<l;i++){
for(var j=0;j<3;j++){
var index=18*i+6*j;
var index1=9*i+3*j;
coords[index+0]=vertices[index1];
coords[index+1]=vertices[index1+1];
coords[index+2]=vertices[index1+2];
var index2=9*i+3*((j+1)%3);
coords[index+3]=vertices[index2];
coords[index+4]=vertices[index2+1];
coords[index+5]=vertices[index2+2];
}
}
this.addAttribute('position',new BufferAttribute(coords,3));
}
}
}
WireframeGeometry.prototype=Object.create(BufferGeometry.prototype);
WireframeGeometry.prototype.constructor=WireframeGeometry;
function WireframeHelper(object,hex){
var color=hex!==undefined?hex:0xffffff;
LineSegments.call(this,new WireframeGeometry(object.geometry),new LineBasicMaterial({color:color}));
this.matrix=object.matrixWorld;
this.matrixAutoUpdate=false;
}
WireframeHelper.prototype=Object.create(LineSegments.prototype);
WireframeHelper.prototype.constructor=WireframeHelper;
function VertexNormalsHelper(object,size,hex,linewidth){
this.object=object;
this.size=size!==undefined?size:1;
var color=hex!==undefined?hex:0xff0000;
var width=linewidth!==undefined?linewidth:1;
var nNormals=0;
var objGeometry=this.object.geometry;
if(objGeometry&&objGeometry.isGeometry){
nNormals=objGeometry.faces.length*3;
}else if(objGeometry&&objGeometry.isBufferGeometry){
nNormals=objGeometry.attributes.normal.count;
}
var geometry=new BufferGeometry();
var positions=new Float32Attribute(nNormals*2*3,3);
geometry.addAttribute('position',positions);
LineSegments.call(this,geometry,new LineBasicMaterial({color:color,linewidth:width}));
this.matrixAutoUpdate=false;
this.update();
}
VertexNormalsHelper.prototype=Object.create(LineSegments.prototype);
VertexNormalsHelper.prototype.constructor=VertexNormalsHelper;
VertexNormalsHelper.prototype.update=function(){
var v1=new Vector3();
var v2=new Vector3();
var normalMatrix=new Matrix3();
return function update(){
var keys=['a','b','c'];
this.object.updateMatrixWorld(true);
normalMatrix.getNormalMatrix(this.object.matrixWorld);
var matrixWorld=this.object.matrixWorld;
var position=this.geometry.attributes.position;
var objGeometry=this.object.geometry;
if(objGeometry&&objGeometry.isGeometry){
var vertices=objGeometry.vertices;
var faces=objGeometry.faces;
var idx=0;
for(var i=0,l=faces.length;i<l;i++){
var face=faces[i];
for(var j=0,jl=face.vertexNormals.length;j<jl;j++){
var vertex=vertices[face[keys[j]]];
var normal=face.vertexNormals[j];
v1.copy(vertex).applyMatrix4(matrixWorld);
v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
position.setXYZ(idx,v1.x,v1.y,v1.z);
idx=idx+1;
position.setXYZ(idx,v2.x,v2.y,v2.z);
idx=idx+1;
}
}
}else if(objGeometry&&objGeometry.isBufferGeometry){
var objPos=objGeometry.attributes.position;
var objNorm=objGeometry.attributes.normal;
var idx=0;
for(var j=0,jl=objPos.count;j<jl;j++){
v1.set(objPos.getX(j),objPos.getY(j),objPos.getZ(j)).applyMatrix4(matrixWorld);
v2.set(objNorm.getX(j),objNorm.getY(j),objNorm.getZ(j));
v2.applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
position.setXYZ(idx,v1.x,v1.y,v1.z);
idx=idx+1;
position.setXYZ(idx,v2.x,v2.y,v2.z);
idx=idx+1;
}
}
position.needsUpdate=true;
return this;
};
}();
function SpotLightHelper(light){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
var geometry=new BufferGeometry();
var positions=[
0,0,0,0,0,1,
0,0,0,1,0,1,
0,0,0,-1,0,1,
0,0,0,0,1,1,
0,0,0,0,-1,1];
for(var i=0,j=1,l=32;i<l;i++,j++){
var p1=i/l*Math.PI*2;
var p2=j/l*Math.PI*2;
positions.push(
Math.cos(p1),Math.sin(p1),1,
Math.cos(p2),Math.sin(p2),1);
}
geometry.addAttribute('position',new Float32Attribute(positions,3));
var material=new LineBasicMaterial({fog:false});
this.cone=new LineSegments(geometry,material);
this.add(this.cone);
this.update();
}
SpotLightHelper.prototype=Object.create(Object3D.prototype);
SpotLightHelper.prototype.constructor=SpotLightHelper;
SpotLightHelper.prototype.dispose=function(){
this.cone.geometry.dispose();
this.cone.material.dispose();
};
SpotLightHelper.prototype.update=function(){
var vector=new Vector3();
var vector2=new Vector3();
return function update(){
var coneLength=this.light.distance?this.light.distance:1000;
var coneWidth=coneLength*Math.tan(this.light.angle);
this.cone.scale.set(coneWidth,coneWidth,coneLength);
vector.setFromMatrixPosition(this.light.matrixWorld);
vector2.setFromMatrixPosition(this.light.target.matrixWorld);
this.cone.lookAt(vector2.sub(vector));
this.cone.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
};
}();
function SkeletonHelper(object){
this.bones=this.getBoneList(object);
var geometry=new Geometry();
for(var i=0;i<this.bones.length;i++){
var bone=this.bones[i];
if(bone.parent&&bone.parent.isBone){
geometry.vertices.push(new Vector3());
geometry.vertices.push(new Vector3());
geometry.colors.push(new Color(0,0,1));
geometry.colors.push(new Color(0,1,0));
}
}
geometry.dynamic=true;
var material=new LineBasicMaterial({vertexColors:VertexColors,depthTest:false,depthWrite:false,transparent:true});
LineSegments.call(this,geometry,material);
this.root=object;
this.matrix=object.matrixWorld;
this.matrixAutoUpdate=false;
this.update();
}
SkeletonHelper.prototype=Object.create(LineSegments.prototype);
SkeletonHelper.prototype.constructor=SkeletonHelper;
SkeletonHelper.prototype.getBoneList=function(object){
var boneList=[];
if(object&&object.isBone){
boneList.push(object);
}
for(var i=0;i<object.children.length;i++){
boneList.push.apply(boneList,this.getBoneList(object.children[i]));
}
return boneList;
};
SkeletonHelper.prototype.update=function(){
var geometry=this.geometry;
var matrixWorldInv=new Matrix4().getInverse(this.root.matrixWorld);
var boneMatrix=new Matrix4();
var j=0;
for(var i=0;i<this.bones.length;i++){
var bone=this.bones[i];
if(bone.parent&&bone.parent.isBone){
boneMatrix.multiplyMatrices(matrixWorldInv,bone.matrixWorld);
geometry.vertices[j].setFromMatrixPosition(boneMatrix);
boneMatrix.multiplyMatrices(matrixWorldInv,bone.parent.matrixWorld);
geometry.vertices[j+1].setFromMatrixPosition(boneMatrix);
j+=2;
}
}
geometry.verticesNeedUpdate=true;
geometry.computeBoundingSphere();
};
function SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){
BufferGeometry.call(this);
this.type='SphereBufferGeometry';
this.parameters={
radius:radius,
widthSegments:widthSegments,
heightSegments:heightSegments,
phiStart:phiStart,
phiLength:phiLength,
thetaStart:thetaStart,
thetaLength:thetaLength};
radius=radius||50;
widthSegments=Math.max(3,Math.floor(widthSegments)||8);
heightSegments=Math.max(2,Math.floor(heightSegments)||6);
phiStart=phiStart!==undefined?phiStart:0;
phiLength=phiLength!==undefined?phiLength:Math.PI*2;
thetaStart=thetaStart!==undefined?thetaStart:0;
thetaLength=thetaLength!==undefined?thetaLength:Math.PI;
var thetaEnd=thetaStart+thetaLength;
var vertexCount=(widthSegments+1)*(heightSegments+1);
var positions=new BufferAttribute(new Float32Array(vertexCount*3),3);
var normals=new BufferAttribute(new Float32Array(vertexCount*3),3);
var uvs=new BufferAttribute(new Float32Array(vertexCount*2),2);
var index=0,vertices=[],normal=new Vector3();
for(var y=0;y<=heightSegments;y++){
var verticesRow=[];
var v=y/heightSegments;
for(var x=0;x<=widthSegments;x++){
var u=x/widthSegments;
var px=-radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);
var py=radius*Math.cos(thetaStart+v*thetaLength);
var pz=radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);
normal.set(px,py,pz).normalize();
positions.setXYZ(index,px,py,pz);
normals.setXYZ(index,normal.x,normal.y,normal.z);
uvs.setXY(index,u,1-v);
verticesRow.push(index);
index++;
}
vertices.push(verticesRow);
}
var indices=[];
for(var y=0;y<heightSegments;y++){
for(var x=0;x<widthSegments;x++){
var v1=vertices[y][x+1];
var v2=vertices[y][x];
var v3=vertices[y+1][x];
var v4=vertices[y+1][x+1];
if(y!==0||thetaStart>0)indices.push(v1,v2,v4);
if(y!==heightSegments-1||thetaEnd<Math.PI)indices.push(v2,v3,v4);
}
}
this.setIndex(new(positions.count>65535?Uint32Attribute:Uint16Attribute)(indices,1));
this.addAttribute('position',positions);
this.addAttribute('normal',normals);
this.addAttribute('uv',uvs);
this.boundingSphere=new Sphere(new Vector3(),radius);
}
SphereBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
SphereBufferGeometry.prototype.constructor=SphereBufferGeometry;
function PointLightHelper(light,sphereSize){
this.light=light;
this.light.updateMatrixWorld();
var geometry=new SphereBufferGeometry(sphereSize,4,2);
var material=new MeshBasicMaterial({wireframe:true,fog:false});
material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
Mesh.call(this,geometry,material);
this.matrix=this.light.matrixWorld;
this.matrixAutoUpdate=false;
}
PointLightHelper.prototype=Object.create(Mesh.prototype);
PointLightHelper.prototype.constructor=PointLightHelper;
PointLightHelper.prototype.dispose=function(){
this.geometry.dispose();
this.material.dispose();
};
PointLightHelper.prototype.update=function(){
this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
};
function SphereGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength){
Geometry.call(this);
this.type='SphereGeometry';
this.parameters={
radius:radius,
widthSegments:widthSegments,
heightSegments:heightSegments,
phiStart:phiStart,
phiLength:phiLength,
thetaStart:thetaStart,
thetaLength:thetaLength};
this.fromBufferGeometry(new SphereBufferGeometry(radius,widthSegments,heightSegments,phiStart,phiLength,thetaStart,thetaLength));
}
SphereGeometry.prototype=Object.create(Geometry.prototype);
SphereGeometry.prototype.constructor=SphereGeometry;
function HemisphereLightHelper(light,sphereSize){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
this.colors=[new Color(),new Color()];
var geometry=new SphereGeometry(sphereSize,4,2);
geometry.rotateX(-Math.PI/2);
for(var i=0,il=8;i<il;i++){
geometry.faces[i].color=this.colors[i<4?0:1];
}
var material=new MeshBasicMaterial({vertexColors:FaceColors,wireframe:true});
this.lightSphere=new Mesh(geometry,material);
this.add(this.lightSphere);
this.update();
}
HemisphereLightHelper.prototype=Object.create(Object3D.prototype);
HemisphereLightHelper.prototype.constructor=HemisphereLightHelper;
HemisphereLightHelper.prototype.dispose=function(){
this.lightSphere.geometry.dispose();
this.lightSphere.material.dispose();
};
HemisphereLightHelper.prototype.update=function(){
var vector=new Vector3();
return function update(){
this.colors[0].copy(this.light.color).multiplyScalar(this.light.intensity);
this.colors[1].copy(this.light.groundColor).multiplyScalar(this.light.intensity);
this.lightSphere.lookAt(vector.setFromMatrixPosition(this.light.matrixWorld).negate());
this.lightSphere.geometry.colorsNeedUpdate=true;
};
}();
function GridHelper(size,divisions,color1,color2){
divisions=divisions||1;
color1=new Color(color1!==undefined?color1:0x444444);
color2=new Color(color2!==undefined?color2:0x888888);
var center=divisions/2;
var step=size*2/divisions;
var vertices=[],colors=[];
for(var i=0,j=0,k=-size;i<=divisions;i++,k+=step){
vertices.push(-size,0,k,size,0,k);
vertices.push(k,0,-size,k,0,size);
var color=i===center?color1:color2;
color.toArray(colors,j);j+=3;
color.toArray(colors,j);j+=3;
color.toArray(colors,j);j+=3;
color.toArray(colors,j);j+=3;
}
var geometry=new BufferGeometry();
geometry.addAttribute('position',new Float32Attribute(vertices,3));
geometry.addAttribute('color',new Float32Attribute(colors,3));
var material=new LineBasicMaterial({vertexColors:VertexColors});
LineSegments.call(this,geometry,material);
}
GridHelper.prototype=Object.create(LineSegments.prototype);
GridHelper.prototype.constructor=GridHelper;
GridHelper.prototype.setColors=function(){
console.error('THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.');
};
function FaceNormalsHelper(object,size,hex,linewidth){
this.object=object;
this.size=size!==undefined?size:1;
var color=hex!==undefined?hex:0xffff00;
var width=linewidth!==undefined?linewidth:1;
var nNormals=0;
var objGeometry=this.object.geometry;
if(objGeometry&&objGeometry.isGeometry){
nNormals=objGeometry.faces.length;
}else{
console.warn('THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.');
}
var geometry=new BufferGeometry();
var positions=new Float32Attribute(nNormals*2*3,3);
geometry.addAttribute('position',positions);
LineSegments.call(this,geometry,new LineBasicMaterial({color:color,linewidth:width}));
this.matrixAutoUpdate=false;
this.update();
}
FaceNormalsHelper.prototype=Object.create(LineSegments.prototype);
FaceNormalsHelper.prototype.constructor=FaceNormalsHelper;
FaceNormalsHelper.prototype.update=function(){
var v1=new Vector3();
var v2=new Vector3();
var normalMatrix=new Matrix3();
return function update(){
this.object.updateMatrixWorld(true);
normalMatrix.getNormalMatrix(this.object.matrixWorld);
var matrixWorld=this.object.matrixWorld;
var position=this.geometry.attributes.position;
var objGeometry=this.object.geometry;
var vertices=objGeometry.vertices;
var faces=objGeometry.faces;
var idx=0;
for(var i=0,l=faces.length;i<l;i++){
var face=faces[i];
var normal=face.normal;
v1.copy(vertices[face.a]).
add(vertices[face.b]).
add(vertices[face.c]).
divideScalar(3).
applyMatrix4(matrixWorld);
v2.copy(normal).applyMatrix3(normalMatrix).normalize().multiplyScalar(this.size).add(v1);
position.setXYZ(idx,v1.x,v1.y,v1.z);
idx=idx+1;
position.setXYZ(idx,v2.x,v2.y,v2.z);
idx=idx+1;
}
position.needsUpdate=true;
return this;
};
}();
function EdgesGeometry(geometry,thresholdAngle){
BufferGeometry.call(this);
thresholdAngle=thresholdAngle!==undefined?thresholdAngle:1;
var thresholdDot=Math.cos(exports.Math.DEG2RAD*thresholdAngle);
var edge=[0,0],hash={};
function sortFunction(a,b){
return a-b;
}
var keys=['a','b','c'];
var geometry2;
if(geometry&&geometry.isBufferGeometry){
geometry2=new Geometry();
geometry2.fromBufferGeometry(geometry);
}else{
geometry2=geometry.clone();
}
geometry2.mergeVertices();
geometry2.computeFaceNormals();
var vertices=geometry2.vertices;
var faces=geometry2.faces;
for(var i=0,l=faces.length;i<l;i++){
var face=faces[i];
for(var j=0;j<3;j++){
edge[0]=face[keys[j]];
edge[1]=face[keys[(j+1)%3]];
edge.sort(sortFunction);
var key=edge.toString();
if(hash[key]===undefined){
hash[key]={vert1:edge[0],vert2:edge[1],face1:i,face2:undefined};
}else{
hash[key].face2=i;
}
}
}
var coords=[];
for(var key in hash){
var h=hash[key];
if(h.face2===undefined||faces[h.face1].normal.dot(faces[h.face2].normal)<=thresholdDot){
var vertex=vertices[h.vert1];
coords.push(vertex.x);
coords.push(vertex.y);
coords.push(vertex.z);
vertex=vertices[h.vert2];
coords.push(vertex.x);
coords.push(vertex.y);
coords.push(vertex.z);
}
}
this.addAttribute('position',new BufferAttribute(new Float32Array(coords),3));
}
EdgesGeometry.prototype=Object.create(BufferGeometry.prototype);
EdgesGeometry.prototype.constructor=EdgesGeometry;
function EdgesHelper(object,hex,thresholdAngle){
var color=hex!==undefined?hex:0xffffff;
LineSegments.call(this,new EdgesGeometry(object.geometry,thresholdAngle),new LineBasicMaterial({color:color}));
this.matrix=object.matrixWorld;
this.matrixAutoUpdate=false;
}
EdgesHelper.prototype=Object.create(LineSegments.prototype);
EdgesHelper.prototype.constructor=EdgesHelper;
function DirectionalLightHelper(light,size){
Object3D.call(this);
this.light=light;
this.light.updateMatrixWorld();
this.matrix=light.matrixWorld;
this.matrixAutoUpdate=false;
if(size===undefined)size=1;
var geometry=new BufferGeometry();
geometry.addAttribute('position',new Float32Attribute([
-size,size,0,
size,size,0,
size,-size,0,
-size,-size,0,
-size,size,0],
3));
var material=new LineBasicMaterial({fog:false});
this.add(new Line(geometry,material));
geometry=new BufferGeometry();
geometry.addAttribute('position',new Float32Attribute([0,0,0,0,0,1],3));
this.add(new Line(geometry,material));
this.update();
}
DirectionalLightHelper.prototype=Object.create(Object3D.prototype);
DirectionalLightHelper.prototype.constructor=DirectionalLightHelper;
DirectionalLightHelper.prototype.dispose=function(){
var lightPlane=this.children[0];
var targetLine=this.children[1];
lightPlane.geometry.dispose();
lightPlane.material.dispose();
targetLine.geometry.dispose();
targetLine.material.dispose();
};
DirectionalLightHelper.prototype.update=function(){
var v1=new Vector3();
var v2=new Vector3();
var v3=new Vector3();
return function update(){
v1.setFromMatrixPosition(this.light.matrixWorld);
v2.setFromMatrixPosition(this.light.target.matrixWorld);
v3.subVectors(v2,v1);
var lightPlane=this.children[0];
var targetLine=this.children[1];
lightPlane.lookAt(v3);
lightPlane.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);
targetLine.lookAt(v3);
targetLine.scale.z=v3.length();
};
}();
function CameraHelper(camera){
var geometry=new Geometry();
var material=new LineBasicMaterial({color:0xffffff,vertexColors:FaceColors});
var pointMap={};
var hexFrustum=0xffaa00;
var hexCone=0xff0000;
var hexUp=0x00aaff;
var hexTarget=0xffffff;
var hexCross=0x333333;
addLine("n1","n2",hexFrustum);
addLine("n2","n4",hexFrustum);
addLine("n4","n3",hexFrustum);
addLine("n3","n1",hexFrustum);
addLine("f1","f2",hexFrustum);
addLine("f2","f4",hexFrustum);
addLine("f4","f3",hexFrustum);
addLine("f3","f1",hexFrustum);
addLine("n1","f1",hexFrustum);
addLine("n2","f2",hexFrustum);
addLine("n3","f3",hexFrustum);
addLine("n4","f4",hexFrustum);
addLine("p","n1",hexCone);
addLine("p","n2",hexCone);
addLine("p","n3",hexCone);
addLine("p","n4",hexCone);
addLine("u1","u2",hexUp);
addLine("u2","u3",hexUp);
addLine("u3","u1",hexUp);
addLine("c","t",hexTarget);
addLine("p","c",hexCross);
addLine("cn1","cn2",hexCross);
addLine("cn3","cn4",hexCross);
addLine("cf1","cf2",hexCross);
addLine("cf3","cf4",hexCross);
function addLine(a,b,hex){
addPoint(a,hex);
addPoint(b,hex);
}
function addPoint(id,hex){
geometry.vertices.push(new Vector3());
geometry.colors.push(new Color(hex));
if(pointMap[id]===undefined){
pointMap[id]=[];
}
pointMap[id].push(geometry.vertices.length-1);
}
LineSegments.call(this,geometry,material);
this.camera=camera;
if(this.camera.updateProjectionMatrix)this.camera.updateProjectionMatrix();
this.matrix=camera.matrixWorld;
this.matrixAutoUpdate=false;
this.pointMap=pointMap;
this.update();
}
CameraHelper.prototype=Object.create(LineSegments.prototype);
CameraHelper.prototype.constructor=CameraHelper;
CameraHelper.prototype.update=function(){
var geometry,pointMap;
var vector=new Vector3();
var camera=new Camera();
function setPoint(point,x,y,z){
vector.set(x,y,z).unproject(camera);
var points=pointMap[point];
if(points!==undefined){
for(var i=0,il=points.length;i<il;i++){
geometry.vertices[points[i]].copy(vector);
}
}
}
return function update(){
geometry=this.geometry;
pointMap=this.pointMap;
var w=1,h=1;
camera.projectionMatrix.copy(this.camera.projectionMatrix);
setPoint("c",0,0,-1);
setPoint("t",0,0,1);
setPoint("n1",-w,-h,-1);
setPoint("n2",w,-h,-1);
setPoint("n3",-w,h,-1);
setPoint("n4",w,h,-1);
setPoint("f1",-w,-h,1);
setPoint("f2",w,-h,1);
setPoint("f3",-w,h,1);
setPoint("f4",w,h,1);
setPoint("u1",w*0.7,h*1.1,-1);
setPoint("u2",-w*0.7,h*1.1,-1);
setPoint("u3",0,h*2,-1);
setPoint("cf1",-w,0,1);
setPoint("cf2",w,0,1);
setPoint("cf3",0,-h,1);
setPoint("cf4",0,h,1);
setPoint("cn1",-w,0,-1);
setPoint("cn2",w,0,-1);
setPoint("cn3",0,-h,-1);
setPoint("cn4",0,h,-1);
geometry.verticesNeedUpdate=true;
};
}();
function BoxGeometry(width,height,depth,widthSegments,heightSegments,depthSegments){
Geometry.call(this);
this.type='BoxGeometry';
this.parameters={
width:width,
height:height,
depth:depth,
widthSegments:widthSegments,
heightSegments:heightSegments,
depthSegments:depthSegments};
this.fromBufferGeometry(new BoxBufferGeometry(width,height,depth,widthSegments,heightSegments,depthSegments));
this.mergeVertices();
}
BoxGeometry.prototype=Object.create(Geometry.prototype);
BoxGeometry.prototype.constructor=BoxGeometry;
function BoundingBoxHelper(object,hex){
var color=hex!==undefined?hex:0x888888;
this.object=object;
this.box=new Box3();
Mesh.call(this,new BoxGeometry(1,1,1),new MeshBasicMaterial({color:color,wireframe:true}));
}
BoundingBoxHelper.prototype=Object.create(Mesh.prototype);
BoundingBoxHelper.prototype.constructor=BoundingBoxHelper;
BoundingBoxHelper.prototype.update=function(){
this.box.setFromObject(this.object);
this.box.size(this.scale);
this.box.center(this.position);
};
function BoxHelper(object,color){
if(color===undefined)color=0xffff00;
var indices=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);
var positions=new Float32Array(8*3);
var geometry=new BufferGeometry();
geometry.setIndex(new BufferAttribute(indices,1));
geometry.addAttribute('position',new BufferAttribute(positions,3));
LineSegments.call(this,geometry,new LineBasicMaterial({color:color}));
if(object!==undefined){
this.update(object);
}
}
BoxHelper.prototype=Object.create(LineSegments.prototype);
BoxHelper.prototype.constructor=BoxHelper;
BoxHelper.prototype.update=function(){
var box=new Box3();
return function update(object){
if(object&&object.isBox3){
box.copy(object);
}else{
box.setFromObject(object);
}
if(box.isEmpty())return;
var min=box.min;
var max=box.max;
var position=this.geometry.attributes.position;
var array=position.array;
array[0]=max.x;array[1]=max.y;array[2]=max.z;
array[3]=min.x;array[4]=max.y;array[5]=max.z;
array[6]=min.x;array[7]=min.y;array[8]=max.z;
array[9]=max.x;array[10]=min.y;array[11]=max.z;
array[12]=max.x;array[13]=max.y;array[14]=min.z;
array[15]=min.x;array[16]=max.y;array[17]=min.z;
array[18]=min.x;array[19]=min.y;array[20]=min.z;
array[21]=max.x;array[22]=min.y;array[23]=min.z;
position.needsUpdate=true;
this.geometry.computeBoundingSphere();
};
}();
function CylinderBufferGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){
BufferGeometry.call(this);
this.type='CylinderBufferGeometry';
this.parameters={
radiusTop:radiusTop,
radiusBottom:radiusBottom,
height:height,
radialSegments:radialSegments,
heightSegments:heightSegments,
openEnded:openEnded,
thetaStart:thetaStart,
thetaLength:thetaLength};
var scope=this;
radiusTop=radiusTop!==undefined?radiusTop:20;
radiusBottom=radiusBottom!==undefined?radiusBottom:20;
height=height!==undefined?height:100;
radialSegments=Math.floor(radialSegments)||8;
heightSegments=Math.floor(heightSegments)||1;
openEnded=openEnded!==undefined?openEnded:false;
thetaStart=thetaStart!==undefined?thetaStart:0.0;
thetaLength=thetaLength!==undefined?thetaLength:2.0*Math.PI;
var nbCap=0;
if(openEnded===false){
if(radiusTop>0)nbCap++;
if(radiusBottom>0)nbCap++;
}
var vertexCount=calculateVertexCount();
var indexCount=calculateIndexCount();
var indices=new BufferAttribute(new(indexCount>65535?Uint32Array:Uint16Array)(indexCount),1);
var vertices=new BufferAttribute(new Float32Array(vertexCount*3),3);
var normals=new BufferAttribute(new Float32Array(vertexCount*3),3);
var uvs=new BufferAttribute(new Float32Array(vertexCount*2),2);
var index=0,
indexOffset=0,
indexArray=[],
halfHeight=height/2;
var groupStart=0;
generateTorso();
if(openEnded===false){
if(radiusTop>0)generateCap(true);
if(radiusBottom>0)generateCap(false);
}
this.setIndex(indices);
this.addAttribute('position',vertices);
this.addAttribute('normal',normals);
this.addAttribute('uv',uvs);
function calculateVertexCount(){
var count=(radialSegments+1)*(heightSegments+1);
if(openEnded===false){
count+=(radialSegments+1)*nbCap+radialSegments*nbCap;
}
return count;
}
function calculateIndexCount(){
var count=radialSegments*heightSegments*2*3;
if(openEnded===false){
count+=radialSegments*nbCap*3;
}
return count;
}
function generateTorso(){
var x,y;
var normal=new Vector3();
var vertex=new Vector3();
var groupCount=0;
var tanTheta=(radiusBottom-radiusTop)/height;
for(y=0;y<=heightSegments;y++){
var indexRow=[];
var v=y/heightSegments;
var radius=v*(radiusBottom-radiusTop)+radiusTop;
for(x=0;x<=radialSegments;x++){
var u=x/radialSegments;
vertex.x=radius*Math.sin(u*thetaLength+thetaStart);
vertex.y=-v*height+halfHeight;
vertex.z=radius*Math.cos(u*thetaLength+thetaStart);
vertices.setXYZ(index,vertex.x,vertex.y,vertex.z);
normal.copy(vertex);
if(radiusTop===0&&y===0||radiusBottom===0&&y===heightSegments){
normal.x=Math.sin(u*thetaLength+thetaStart);
normal.z=Math.cos(u*thetaLength+thetaStart);
}
normal.setY(Math.sqrt(normal.x*normal.x+normal.z*normal.z)*tanTheta).normalize();
normals.setXYZ(index,normal.x,normal.y,normal.z);
uvs.setXY(index,u,1-v);
indexRow.push(index);
index++;
}
indexArray.push(indexRow);
}
for(x=0;x<radialSegments;x++){
for(y=0;y<heightSegments;y++){
var i1=indexArray[y][x];
var i2=indexArray[y+1][x];
var i3=indexArray[y+1][x+1];
var i4=indexArray[y][x+1];
indices.setX(indexOffset,i1);indexOffset++;
indices.setX(indexOffset,i2);indexOffset++;
indices.setX(indexOffset,i4);indexOffset++;
indices.setX(indexOffset,i2);indexOffset++;
indices.setX(indexOffset,i3);indexOffset++;
indices.setX(indexOffset,i4);indexOffset++;
groupCount+=6;
}
}
scope.addGroup(groupStart,groupCount,0);
groupStart+=groupCount;
}
function generateCap(top){
var x,centerIndexStart,centerIndexEnd;
var uv=new Vector2();
var vertex=new Vector3();
var groupCount=0;
var radius=top===true?radiusTop:radiusBottom;
var sign=top===true?1:-1;
centerIndexStart=index;
for(x=1;x<=radialSegments;x++){
vertices.setXYZ(index,0,halfHeight*sign,0);
normals.setXYZ(index,0,sign,0);
uv.x=0.5;
uv.y=0.5;
uvs.setXY(index,uv.x,uv.y);
index++;
}
centerIndexEnd=index;
for(x=0;x<=radialSegments;x++){
var u=x/radialSegments;
var theta=u*thetaLength+thetaStart;
var cosTheta=Math.cos(theta);
var sinTheta=Math.sin(theta);
vertex.x=radius*sinTheta;
vertex.y=halfHeight*sign;
vertex.z=radius*cosTheta;
vertices.setXYZ(index,vertex.x,vertex.y,vertex.z);
normals.setXYZ(index,0,sign,0);
uv.x=cosTheta*0.5+0.5;
uv.y=sinTheta*0.5*sign+0.5;
uvs.setXY(index,uv.x,uv.y);
index++;
}
for(x=0;x<radialSegments;x++){
var c=centerIndexStart+x;
var i=centerIndexEnd+x;
if(top===true){
indices.setX(indexOffset,i);indexOffset++;
indices.setX(indexOffset,i+1);indexOffset++;
indices.setX(indexOffset,c);indexOffset++;
}else{
indices.setX(indexOffset,i+1);indexOffset++;
indices.setX(indexOffset,i);indexOffset++;
indices.setX(indexOffset,c);indexOffset++;
}
groupCount+=3;
}
scope.addGroup(groupStart,groupCount,top===true?1:2);
groupStart+=groupCount;
}
}
CylinderBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
CylinderBufferGeometry.prototype.constructor=CylinderBufferGeometry;
var lineGeometry=new BufferGeometry();
lineGeometry.addAttribute('position',new Float32Attribute([0,0,0,0,1,0],3));
var coneGeometry=new CylinderBufferGeometry(0,0.5,1,5,1);
coneGeometry.translate(0,-0.5,0);
function ArrowHelper(dir,origin,length,color,headLength,headWidth){
Object3D.call(this);
if(color===undefined)color=0xffff00;
if(length===undefined)length=1;
if(headLength===undefined)headLength=0.2*length;
if(headWidth===undefined)headWidth=0.2*headLength;
this.position.copy(origin);
this.line=new Line(lineGeometry,new LineBasicMaterial({color:color}));
this.line.matrixAutoUpdate=false;
this.add(this.line);
this.cone=new Mesh(coneGeometry,new MeshBasicMaterial({color:color}));
this.cone.matrixAutoUpdate=false;
this.add(this.cone);
this.setDirection(dir);
this.setLength(length,headLength,headWidth);
}
ArrowHelper.prototype=Object.create(Object3D.prototype);
ArrowHelper.prototype.constructor=ArrowHelper;
ArrowHelper.prototype.setDirection=function(){
var axis=new Vector3();
var radians;
return function setDirection(dir){
if(dir.y>0.99999){
this.quaternion.set(0,0,0,1);
}else if(dir.y<-0.99999){
this.quaternion.set(1,0,0,0);
}else{
axis.set(dir.z,0,-dir.x).normalize();
radians=Math.acos(dir.y);
this.quaternion.setFromAxisAngle(axis,radians);
}
};
}();
ArrowHelper.prototype.setLength=function(length,headLength,headWidth){
if(headLength===undefined)headLength=0.2*length;
if(headWidth===undefined)headWidth=0.2*headLength;
this.line.scale.set(1,Math.max(0,length-headLength),1);
this.line.updateMatrix();
this.cone.scale.set(headWidth,headLength,headWidth);
this.cone.position.y=length;
this.cone.updateMatrix();
};
ArrowHelper.prototype.setColor=function(color){
this.line.material.color.copy(color);
this.cone.material.color.copy(color);
};
function AxisHelper(size){
size=size||1;
var vertices=new Float32Array([
0,0,0,size,0,0,
0,0,0,0,size,0,
0,0,0,0,0,size]);
var colors=new Float32Array([
1,0,0,1,0.6,0,
0,1,0,0.6,1,0,
0,0,1,0,0.6,1]);
var geometry=new BufferGeometry();
geometry.addAttribute('position',new BufferAttribute(vertices,3));
geometry.addAttribute('color',new BufferAttribute(colors,3));
var material=new LineBasicMaterial({vertexColors:VertexColors});
LineSegments.call(this,geometry,material);
}
AxisHelper.prototype=Object.create(LineSegments.prototype);
AxisHelper.prototype.constructor=AxisHelper;
function ParametricGeometry(func,slices,stacks){
Geometry.call(this);
this.type='ParametricGeometry';
this.parameters={
func:func,
slices:slices,
stacks:stacks};
var verts=this.vertices;
var faces=this.faces;
var uvs=this.faceVertexUvs[0];
var i,j,p;
var u,v;
var sliceCount=slices+1;
for(i=0;i<=stacks;i++){
v=i/stacks;
for(j=0;j<=slices;j++){
u=j/slices;
p=func(u,v);
verts.push(p);
}
}
var a,b,c,d;
var uva,uvb,uvc,uvd;
for(i=0;i<stacks;i++){
for(j=0;j<slices;j++){
a=i*sliceCount+j;
b=i*sliceCount+j+1;
c=(i+1)*sliceCount+j+1;
d=(i+1)*sliceCount+j;
uva=new Vector2(j/slices,i/stacks);
uvb=new Vector2((j+1)/slices,i/stacks);
uvc=new Vector2((j+1)/slices,(i+1)/stacks);
uvd=new Vector2(j/slices,(i+1)/stacks);
faces.push(new Face3(a,b,d));
uvs.push([uva,uvb,uvd]);
faces.push(new Face3(b,c,d));
uvs.push([uvb.clone(),uvc,uvd.clone()]);
}
}
this.computeFaceNormals();
this.computeVertexNormals();
}
ParametricGeometry.prototype=Object.create(Geometry.prototype);
ParametricGeometry.prototype.constructor=ParametricGeometry;
function PolyhedronGeometry(vertices,indices,radius,detail){
Geometry.call(this);
this.type='PolyhedronGeometry';
this.parameters={
vertices:vertices,
indices:indices,
radius:radius,
detail:detail};
radius=radius||1;
detail=detail||0;
var that=this;
for(var i=0,l=vertices.length;i<l;i+=3){
prepare(new Vector3(vertices[i],vertices[i+1],vertices[i+2]));
}
var p=this.vertices;
var faces=[];
for(var i=0,j=0,l=indices.length;i<l;i+=3,j++){
var v1=p[indices[i]];
var v2=p[indices[i+1]];
var v3=p[indices[i+2]];
faces[j]=new Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()]);
}
var centroid=new Vector3();
for(var i=0,l=faces.length;i<l;i++){
subdivide(faces[i],detail);
}
for(var i=0,l=this.faceVertexUvs[0].length;i<l;i++){
var uvs=this.faceVertexUvs[0][i];
var x0=uvs[0].x;
var x1=uvs[1].x;
var x2=uvs[2].x;
var max=Math.max(x0,x1,x2);
var min=Math.min(x0,x1,x2);
if(max>0.9&&min<0.1){
if(x0<0.2)uvs[0].x+=1;
if(x1<0.2)uvs[1].x+=1;
if(x2<0.2)uvs[2].x+=1;
}
}
for(var i=0,l=this.vertices.length;i<l;i++){
this.vertices[i].multiplyScalar(radius);
}
this.mergeVertices();
this.computeFaceNormals();
this.boundingSphere=new Sphere(new Vector3(),radius);
function prepare(vector){
var vertex=vector.normalize().clone();
vertex.index=that.vertices.push(vertex)-1;
var u=azimuth(vector)/2/Math.PI+0.5;
var v=inclination(vector)/Math.PI+0.5;
vertex.uv=new Vector2(u,1-v);
return vertex;
}
function make(v1,v2,v3){
var face=new Face3(v1.index,v2.index,v3.index,[v1.clone(),v2.clone(),v3.clone()]);
that.faces.push(face);
centroid.copy(v1).add(v2).add(v3).divideScalar(3);
var azi=azimuth(centroid);
that.faceVertexUvs[0].push([
correctUV(v1.uv,v1,azi),
correctUV(v2.uv,v2,azi),
correctUV(v3.uv,v3,azi)]);
}
function subdivide(face,detail){
var cols=Math.pow(2,detail);
var a=prepare(that.vertices[face.a]);
var b=prepare(that.vertices[face.b]);
var c=prepare(that.vertices[face.c]);
var v=[];
for(var i=0;i<=cols;i++){
v[i]=[];
var aj=prepare(a.clone().lerp(c,i/cols));
var bj=prepare(b.clone().lerp(c,i/cols));
var rows=cols-i;
for(var j=0;j<=rows;j++){
if(j===0&&i===cols){
v[i][j]=aj;
}else{
v[i][j]=prepare(aj.clone().lerp(bj,j/rows));
}
}
}
for(var i=0;i<cols;i++){
for(var j=0;j<2*(cols-i)-1;j++){
var k=Math.floor(j/2);
if(j%2===0){
make(
v[i][k+1],
v[i+1][k],
v[i][k]);
}else{
make(
v[i][k+1],
v[i+1][k+1],
v[i+1][k]);
}
}
}
}
function azimuth(vector){
return Math.atan2(vector.z,-vector.x);
}
function inclination(vector){
return Math.atan2(-vector.y,Math.sqrt(vector.x*vector.x+vector.z*vector.z));
}
function correctUV(uv,vector,azimuth){
if(azimuth<0&&uv.x===1)uv=new Vector2(uv.x-1,uv.y);
if(vector.x===0&&vector.z===0)uv=new Vector2(azimuth/2/Math.PI+0.5,uv.y);
return uv.clone();
}
}
PolyhedronGeometry.prototype=Object.create(Geometry.prototype);
PolyhedronGeometry.prototype.constructor=PolyhedronGeometry;
function TetrahedronGeometry(radius,detail){
var vertices=[
1,1,1,-1,-1,1,-1,1,-1,1,-1,-1];
var indices=[
2,1,0,0,3,2,1,3,0,2,3,1];
PolyhedronGeometry.call(this,vertices,indices,radius,detail);
this.type='TetrahedronGeometry';
this.parameters={
radius:radius,
detail:detail};
}
TetrahedronGeometry.prototype=Object.create(PolyhedronGeometry.prototype);
TetrahedronGeometry.prototype.constructor=TetrahedronGeometry;
function OctahedronGeometry(radius,detail){
var vertices=[
1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1];
var indices=[
0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2];
PolyhedronGeometry.call(this,vertices,indices,radius,detail);
this.type='OctahedronGeometry';
this.parameters={
radius:radius,
detail:detail};
}
OctahedronGeometry.prototype=Object.create(PolyhedronGeometry.prototype);
OctahedronGeometry.prototype.constructor=OctahedronGeometry;
function IcosahedronGeometry(radius,detail){
var t=(1+Math.sqrt(5))/2;
var vertices=[
-1,t,0,1,t,0,-1,-t,0,1,-t,0,
0,-1,t,0,1,t,0,-1,-t,0,1,-t,
t,0,-1,t,0,1,-t,0,-1,-t,0,1];
var indices=[
0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,
1,5,9,5,11,4,11,10,2,10,7,6,7,1,8,
3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,
4,9,5,2,4,11,6,2,10,8,6,7,9,8,1];
PolyhedronGeometry.call(this,vertices,indices,radius,detail);
this.type='IcosahedronGeometry';
this.parameters={
radius:radius,
detail:detail};
}
IcosahedronGeometry.prototype=Object.create(PolyhedronGeometry.prototype);
IcosahedronGeometry.prototype.constructor=IcosahedronGeometry;
function DodecahedronGeometry(radius,detail){
var t=(1+Math.sqrt(5))/2;
var r=1/t;
var vertices=[
-1,-1,-1,-1,-1,1,
-1,1,-1,-1,1,1,
1,-1,-1,1,-1,1,
1,1,-1,1,1,1,
0,-r,-t,0,-r,t,
0,r,-t,0,r,t,
-r,-t,0,-r,t,0,
r,-t,0,r,t,0,
-t,0,-r,t,0,-r,
-t,0,r,t,0,r];
var indices=[
3,11,7,3,7,15,3,15,13,
7,19,17,7,17,6,7,6,15,
17,4,8,17,8,10,17,10,6,
8,0,16,8,16,2,8,2,10,
0,12,1,0,1,18,0,18,16,
6,10,2,6,2,13,6,13,15,
2,16,18,2,18,3,2,3,13,
18,1,9,18,9,11,18,11,3,
4,14,12,4,12,0,4,0,8,
11,9,5,11,5,19,11,19,7,
19,5,14,19,14,4,19,4,17,
1,12,14,1,14,5,1,5,9];
PolyhedronGeometry.call(this,vertices,indices,radius,detail);
this.type='DodecahedronGeometry';
this.parameters={
radius:radius,
detail:detail};
}
DodecahedronGeometry.prototype=Object.create(PolyhedronGeometry.prototype);
DodecahedronGeometry.prototype.constructor=DodecahedronGeometry;
function TorusKnotBufferGeometry(radius,tube,tubularSegments,radialSegments,p,q){
BufferGeometry.call(this);
this.type='TorusKnotBufferGeometry';
this.parameters={
radius:radius,
tube:tube,
tubularSegments:tubularSegments,
radialSegments:radialSegments,
p:p,
q:q};
radius=radius||100;
tube=tube||40;
tubularSegments=Math.floor(tubularSegments)||64;
radialSegments=Math.floor(radialSegments)||8;
p=p||2;
q=q||3;
var vertexCount=(radialSegments+1)*(tubularSegments+1);
var indexCount=radialSegments*tubularSegments*2*3;
var indices=new BufferAttribute(new(indexCount>65535?Uint32Array:Uint16Array)(indexCount),1);
var vertices=new BufferAttribute(new Float32Array(vertexCount*3),3);
var normals=new BufferAttribute(new Float32Array(vertexCount*3),3);
var uvs=new BufferAttribute(new Float32Array(vertexCount*2),2);
var i,j,index=0,indexOffset=0;
var vertex=new Vector3();
var normal=new Vector3();
var uv=new Vector2();
var P1=new Vector3();
var P2=new Vector3();
var B=new Vector3();
var T=new Vector3();
var N=new Vector3();
for(i=0;i<=tubularSegments;++i){
var u=i/tubularSegments*p*Math.PI*2;
calculatePositionOnCurve(u,p,q,radius,P1);
calculatePositionOnCurve(u+0.01,p,q,radius,P2);
T.subVectors(P2,P1);
N.addVectors(P2,P1);
B.crossVectors(T,N);
N.crossVectors(B,T);
B.normalize();
N.normalize();
for(j=0;j<=radialSegments;++j){
var v=j/radialSegments*Math.PI*2;
var cx=-tube*Math.cos(v);
var cy=tube*Math.sin(v);
vertex.x=P1.x+(cx*N.x+cy*B.x);
vertex.y=P1.y+(cx*N.y+cy*B.y);
vertex.z=P1.z+(cx*N.z+cy*B.z);
vertices.setXYZ(index,vertex.x,vertex.y,vertex.z);
normal.subVectors(vertex,P1).normalize();
normals.setXYZ(index,normal.x,normal.y,normal.z);
uv.x=i/tubularSegments;
uv.y=j/radialSegments;
uvs.setXY(index,uv.x,uv.y);
index++;
}
}
for(j=1;j<=tubularSegments;j++){
for(i=1;i<=radialSegments;i++){
var a=(radialSegments+1)*(j-1)+(i-1);
var b=(radialSegments+1)*j+(i-1);
var c=(radialSegments+1)*j+i;
var d=(radialSegments+1)*(j-1)+i;
indices.setX(indexOffset,a);indexOffset++;
indices.setX(indexOffset,b);indexOffset++;
indices.setX(indexOffset,d);indexOffset++;
indices.setX(indexOffset,b);indexOffset++;
indices.setX(indexOffset,c);indexOffset++;
indices.setX(indexOffset,d);indexOffset++;
}
}
this.setIndex(indices);
this.addAttribute('position',vertices);
this.addAttribute('normal',normals);
this.addAttribute('uv',uvs);
function calculatePositionOnCurve(u,p,q,radius,position){
var cu=Math.cos(u);
var su=Math.sin(u);
var quOverP=q/p*u;
var cs=Math.cos(quOverP);
position.x=radius*(2+cs)*0.5*cu;
position.y=radius*(2+cs)*su*0.5;
position.z=radius*Math.sin(quOverP)*0.5;
}
}
TorusKnotBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
TorusKnotBufferGeometry.prototype.constructor=TorusKnotBufferGeometry;
function TorusKnotGeometry(radius,tube,tubularSegments,radialSegments,p,q,heightScale){
Geometry.call(this);
this.type='TorusKnotGeometry';
this.parameters={
radius:radius,
tube:tube,
tubularSegments:tubularSegments,
radialSegments:radialSegments,
p:p,
q:q};
if(heightScale!==undefined)console.warn('THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.');
this.fromBufferGeometry(new TorusKnotBufferGeometry(radius,tube,tubularSegments,radialSegments,p,q));
this.mergeVertices();
}
TorusKnotGeometry.prototype=Object.create(Geometry.prototype);
TorusKnotGeometry.prototype.constructor=TorusKnotGeometry;
function TorusBufferGeometry(radius,tube,radialSegments,tubularSegments,arc){
BufferGeometry.call(this);
this.type='TorusBufferGeometry';
this.parameters={
radius:radius,
tube:tube,
radialSegments:radialSegments,
tubularSegments:tubularSegments,
arc:arc};
radius=radius||100;
tube=tube||40;
radialSegments=Math.floor(radialSegments)||8;
tubularSegments=Math.floor(tubularSegments)||6;
arc=arc||Math.PI*2;
var vertexCount=(radialSegments+1)*(tubularSegments+1);
var indexCount=radialSegments*tubularSegments*2*3;
var indices=new(indexCount>65535?Uint32Array:Uint16Array)(indexCount);
var vertices=new Float32Array(vertexCount*3);
var normals=new Float32Array(vertexCount*3);
var uvs=new Float32Array(vertexCount*2);
var vertexBufferOffset=0;
var uvBufferOffset=0;
var indexBufferOffset=0;
var center=new Vector3();
var vertex=new Vector3();
var normal=new Vector3();
var j,i;
for(j=0;j<=radialSegments;j++){
for(i=0;i<=tubularSegments;i++){
var u=i/tubularSegments*arc;
var v=j/radialSegments*Math.PI*2;
vertex.x=(radius+tube*Math.cos(v))*Math.cos(u);
vertex.y=(radius+tube*Math.cos(v))*Math.sin(u);
vertex.z=tube*Math.sin(v);
vertices[vertexBufferOffset]=vertex.x;
vertices[vertexBufferOffset+1]=vertex.y;
vertices[vertexBufferOffset+2]=vertex.z;
center.x=radius*Math.cos(u);
center.y=radius*Math.sin(u);
normal.subVectors(vertex,center).normalize();
normals[vertexBufferOffset]=normal.x;
normals[vertexBufferOffset+1]=normal.y;
normals[vertexBufferOffset+2]=normal.z;
uvs[uvBufferOffset]=i/tubularSegments;
uvs[uvBufferOffset+1]=j/radialSegments;
vertexBufferOffset+=3;
uvBufferOffset+=2;
}
}
for(j=1;j<=radialSegments;j++){
for(i=1;i<=tubularSegments;i++){
var a=(tubularSegments+1)*j+i-1;
var b=(tubularSegments+1)*(j-1)+i-1;
var c=(tubularSegments+1)*(j-1)+i;
var d=(tubularSegments+1)*j+i;
indices[indexBufferOffset]=a;
indices[indexBufferOffset+1]=b;
indices[indexBufferOffset+2]=d;
indices[indexBufferOffset+3]=b;
indices[indexBufferOffset+4]=c;
indices[indexBufferOffset+5]=d;
indexBufferOffset+=6;
}
}
this.setIndex(new BufferAttribute(indices,1));
this.addAttribute('position',new BufferAttribute(vertices,3));
this.addAttribute('normal',new BufferAttribute(normals,3));
this.addAttribute('uv',new BufferAttribute(uvs,2));
}
TorusBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
TorusBufferGeometry.prototype.constructor=TorusBufferGeometry;
function TorusGeometry(radius,tube,radialSegments,tubularSegments,arc){
Geometry.call(this);
this.type='TorusGeometry';
this.parameters={
radius:radius,
tube:tube,
radialSegments:radialSegments,
tubularSegments:tubularSegments,
arc:arc};
this.fromBufferGeometry(new TorusBufferGeometry(radius,tube,radialSegments,tubularSegments,arc));
}
TorusGeometry.prototype=Object.create(Geometry.prototype);
TorusGeometry.prototype.constructor=TorusGeometry;
function TextGeometry(text,parameters){
parameters=parameters||{};
var font=parameters.font;
if((font&&font.isFont)===false){
console.error('THREE.TextGeometry: font parameter is not an instance of THREE.Font.');
return new Geometry();
}
var shapes=font.generateShapes(text,parameters.size,parameters.curveSegments);
parameters.amount=parameters.height!==undefined?parameters.height:50;
if(parameters.bevelThickness===undefined)parameters.bevelThickness=10;
if(parameters.bevelSize===undefined)parameters.bevelSize=8;
if(parameters.bevelEnabled===undefined)parameters.bevelEnabled=false;
ExtrudeGeometry.call(this,shapes,parameters);
this.type='TextGeometry';
}
TextGeometry.prototype=Object.create(ExtrudeGeometry.prototype);
TextGeometry.prototype.constructor=TextGeometry;
function RingBufferGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){
BufferGeometry.call(this);
this.type='RingBufferGeometry';
this.parameters={
innerRadius:innerRadius,
outerRadius:outerRadius,
thetaSegments:thetaSegments,
phiSegments:phiSegments,
thetaStart:thetaStart,
thetaLength:thetaLength};
innerRadius=innerRadius||20;
outerRadius=outerRadius||50;
thetaStart=thetaStart!==undefined?thetaStart:0;
thetaLength=thetaLength!==undefined?thetaLength:Math.PI*2;
thetaSegments=thetaSegments!==undefined?Math.max(3,thetaSegments):8;
phiSegments=phiSegments!==undefined?Math.max(1,phiSegments):1;
var vertexCount=(thetaSegments+1)*(phiSegments+1);
var indexCount=thetaSegments*phiSegments*2*3;
var indices=new BufferAttribute(new(indexCount>65535?Uint32Array:Uint16Array)(indexCount),1);
var vertices=new BufferAttribute(new Float32Array(vertexCount*3),3);
var normals=new BufferAttribute(new Float32Array(vertexCount*3),3);
var uvs=new BufferAttribute(new Float32Array(vertexCount*2),2);
var index=0,indexOffset=0,segment;
var radius=innerRadius;
var radiusStep=(outerRadius-innerRadius)/phiSegments;
var vertex=new Vector3();
var uv=new Vector2();
var j,i;
for(j=0;j<=phiSegments;j++){
for(i=0;i<=thetaSegments;i++){
segment=thetaStart+i/thetaSegments*thetaLength;
vertex.x=radius*Math.cos(segment);
vertex.y=radius*Math.sin(segment);
vertices.setXYZ(index,vertex.x,vertex.y,vertex.z);
normals.setXYZ(index,0,0,1);
uv.x=(vertex.x/outerRadius+1)/2;
uv.y=(vertex.y/outerRadius+1)/2;
uvs.setXY(index,uv.x,uv.y);
index++;
}
radius+=radiusStep;
}
for(j=0;j<phiSegments;j++){
var thetaSegmentLevel=j*(thetaSegments+1);
for(i=0;i<thetaSegments;i++){
segment=i+thetaSegmentLevel;
var a=segment;
var b=segment+thetaSegments+1;
var c=segment+thetaSegments+2;
var d=segment+1;
indices.setX(indexOffset,a);indexOffset++;
indices.setX(indexOffset,b);indexOffset++;
indices.setX(indexOffset,c);indexOffset++;
indices.setX(indexOffset,a);indexOffset++;
indices.setX(indexOffset,c);indexOffset++;
indices.setX(indexOffset,d);indexOffset++;
}
}
this.setIndex(indices);
this.addAttribute('position',vertices);
this.addAttribute('normal',normals);
this.addAttribute('uv',uvs);
}
RingBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
RingBufferGeometry.prototype.constructor=RingBufferGeometry;
function RingGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength){
Geometry.call(this);
this.type='RingGeometry';
this.parameters={
innerRadius:innerRadius,
outerRadius:outerRadius,
thetaSegments:thetaSegments,
phiSegments:phiSegments,
thetaStart:thetaStart,
thetaLength:thetaLength};
this.fromBufferGeometry(new RingBufferGeometry(innerRadius,outerRadius,thetaSegments,phiSegments,thetaStart,thetaLength));
}
RingGeometry.prototype=Object.create(Geometry.prototype);
RingGeometry.prototype.constructor=RingGeometry;
function PlaneGeometry(width,height,widthSegments,heightSegments){
Geometry.call(this);
this.type='PlaneGeometry';
this.parameters={
width:width,
height:height,
widthSegments:widthSegments,
heightSegments:heightSegments};
this.fromBufferGeometry(new PlaneBufferGeometry(width,height,widthSegments,heightSegments));
}
PlaneGeometry.prototype=Object.create(Geometry.prototype);
PlaneGeometry.prototype.constructor=PlaneGeometry;
function LatheBufferGeometry(points,segments,phiStart,phiLength){
BufferGeometry.call(this);
this.type='LatheBufferGeometry';
this.parameters={
points:points,
segments:segments,
phiStart:phiStart,
phiLength:phiLength};
segments=Math.floor(segments)||12;
phiStart=phiStart||0;
phiLength=phiLength||Math.PI*2;
phiLength=exports.Math.clamp(phiLength,0,Math.PI*2);
var vertexCount=(segments+1)*points.length;
var indexCount=segments*points.length*2*3;
var indices=new BufferAttribute(new(indexCount>65535?Uint32Array:Uint16Array)(indexCount),1);
var vertices=new BufferAttribute(new Float32Array(vertexCount*3),3);
var uvs=new BufferAttribute(new Float32Array(vertexCount*2),2);
var index=0,indexOffset=0,base;
var inverseSegments=1.0/segments;
var vertex=new Vector3();
var uv=new Vector2();
var i,j;
for(i=0;i<=segments;i++){
var phi=phiStart+i*inverseSegments*phiLength;
var sin=Math.sin(phi);
var cos=Math.cos(phi);
for(j=0;j<=points.length-1;j++){
vertex.x=points[j].x*sin;
vertex.y=points[j].y;
vertex.z=points[j].x*cos;
vertices.setXYZ(index,vertex.x,vertex.y,vertex.z);
uv.x=i/segments;
uv.y=j/(points.length-1);
uvs.setXY(index,uv.x,uv.y);
index++;
}
}
for(i=0;i<segments;i++){
for(j=0;j<points.length-1;j++){
base=j+i*points.length;
var a=base;
var b=base+points.length;
var c=base+points.length+1;
var d=base+1;
indices.setX(indexOffset,a);indexOffset++;
indices.setX(indexOffset,b);indexOffset++;
indices.setX(indexOffset,d);indexOffset++;
indices.setX(indexOffset,b);indexOffset++;
indices.setX(indexOffset,c);indexOffset++;
indices.setX(indexOffset,d);indexOffset++;
}
}
this.setIndex(indices);
this.addAttribute('position',vertices);
this.addAttribute('uv',uvs);
this.computeVertexNormals();
if(phiLength===Math.PI*2){
var normals=this.attributes.normal.array;
var n1=new Vector3();
var n2=new Vector3();
var n=new Vector3();
base=segments*points.length*3;
for(i=0,j=0;i<points.length;i++,j+=3){
n1.x=normals[j+0];
n1.y=normals[j+1];
n1.z=normals[j+2];
n2.x=normals[base+j+0];
n2.y=normals[base+j+1];
n2.z=normals[base+j+2];
n.addVectors(n1,n2).normalize();
normals[j+0]=normals[base+j+0]=n.x;
normals[j+1]=normals[base+j+1]=n.y;
normals[j+2]=normals[base+j+2]=n.z;
}
}
}
LatheBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
LatheBufferGeometry.prototype.constructor=LatheBufferGeometry;
function LatheGeometry(points,segments,phiStart,phiLength){
Geometry.call(this);
this.type='LatheGeometry';
this.parameters={
points:points,
segments:segments,
phiStart:phiStart,
phiLength:phiLength};
this.fromBufferGeometry(new LatheBufferGeometry(points,segments,phiStart,phiLength));
this.mergeVertices();
}
LatheGeometry.prototype=Object.create(Geometry.prototype);
LatheGeometry.prototype.constructor=LatheGeometry;
function CylinderGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength){
Geometry.call(this);
this.type='CylinderGeometry';
this.parameters={
radiusTop:radiusTop,
radiusBottom:radiusBottom,
height:height,
radialSegments:radialSegments,
heightSegments:heightSegments,
openEnded:openEnded,
thetaStart:thetaStart,
thetaLength:thetaLength};
this.fromBufferGeometry(new CylinderBufferGeometry(radiusTop,radiusBottom,height,radialSegments,heightSegments,openEnded,thetaStart,thetaLength));
this.mergeVertices();
}
CylinderGeometry.prototype=Object.create(Geometry.prototype);
CylinderGeometry.prototype.constructor=CylinderGeometry;
function ConeGeometry(
radius,height,
radialSegments,heightSegments,
openEnded,thetaStart,thetaLength){
CylinderGeometry.call(this,
0,radius,height,
radialSegments,heightSegments,
openEnded,thetaStart,thetaLength);
this.type='ConeGeometry';
this.parameters={
radius:radius,
height:height,
radialSegments:radialSegments,
heightSegments:heightSegments,
openEnded:openEnded,
thetaStart:thetaStart,
thetaLength:thetaLength};
}
ConeGeometry.prototype=Object.create(CylinderGeometry.prototype);
ConeGeometry.prototype.constructor=ConeGeometry;
function ConeBufferGeometry(
radius,height,
radialSegments,heightSegments,
openEnded,thetaStart,thetaLength){
CylinderBufferGeometry.call(this,
0,radius,height,
radialSegments,heightSegments,
openEnded,thetaStart,thetaLength);
this.type='ConeBufferGeometry';
this.parameters={
radius:radius,
height:height,
radialSegments:radialSegments,
heightSegments:heightSegments,
thetaStart:thetaStart,
thetaLength:thetaLength};
}
ConeBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
ConeBufferGeometry.prototype.constructor=ConeBufferGeometry;
function CircleBufferGeometry(radius,segments,thetaStart,thetaLength){
BufferGeometry.call(this);
this.type='CircleBufferGeometry';
this.parameters={
radius:radius,
segments:segments,
thetaStart:thetaStart,
thetaLength:thetaLength};
radius=radius||50;
segments=segments!==undefined?Math.max(3,segments):8;
thetaStart=thetaStart!==undefined?thetaStart:0;
thetaLength=thetaLength!==undefined?thetaLength:Math.PI*2;
var vertices=segments+2;
var positions=new Float32Array(vertices*3);
var normals=new Float32Array(vertices*3);
var uvs=new Float32Array(vertices*2);
normals[2]=1.0;
uvs[0]=0.5;
uvs[1]=0.5;
for(var s=0,i=3,ii=2;s<=segments;s++,i+=3,ii+=2){
var segment=thetaStart+s/segments*thetaLength;
positions[i]=radius*Math.cos(segment);
positions[i+1]=radius*Math.sin(segment);
normals[i+2]=1;
uvs[ii]=(positions[i]/radius+1)/2;
uvs[ii+1]=(positions[i+1]/radius+1)/2;
}
var indices=[];
for(var i=1;i<=segments;i++){
indices.push(i,i+1,0);
}
this.setIndex(new BufferAttribute(new Uint16Array(indices),1));
this.addAttribute('position',new BufferAttribute(positions,3));
this.addAttribute('normal',new BufferAttribute(normals,3));
this.addAttribute('uv',new BufferAttribute(uvs,2));
this.boundingSphere=new Sphere(new Vector3(),radius);
}
CircleBufferGeometry.prototype=Object.create(BufferGeometry.prototype);
CircleBufferGeometry.prototype.constructor=CircleBufferGeometry;
function CircleGeometry(radius,segments,thetaStart,thetaLength){
Geometry.call(this);
this.type='CircleGeometry';
this.parameters={
radius:radius,
segments:segments,
thetaStart:thetaStart,
thetaLength:thetaLength};
this.fromBufferGeometry(new CircleBufferGeometry(radius,segments,thetaStart,thetaLength));
}
CircleGeometry.prototype=Object.create(Geometry.prototype);
CircleGeometry.prototype.constructor=CircleGeometry;
exports.CatmullRomCurve3=function(){
var
tmp=new Vector3(),
px=new CubicPoly(),
py=new CubicPoly(),
pz=new CubicPoly();
function CubicPoly(){
}
CubicPoly.prototype.init=function(x0,x1,t0,t1){
this.c0=x0;
this.c1=t0;
this.c2=-3*x0+3*x1-2*t0-t1;
this.c3=2*x0-2*x1+t0+t1;
};
CubicPoly.prototype.initNonuniformCatmullRom=function(x0,x1,x2,x3,dt0,dt1,dt2){
var t1=(x1-x0)/dt0-(x2-x0)/(dt0+dt1)+(x2-x1)/dt1;
var t2=(x2-x1)/dt1-(x3-x1)/(dt1+dt2)+(x3-x2)/dt2;
t1*=dt1;
t2*=dt1;
this.init(x1,x2,t1,t2);
};
CubicPoly.prototype.initCatmullRom=function(x0,x1,x2,x3,tension){
this.init(x1,x2,tension*(x2-x0),tension*(x3-x1));
};
CubicPoly.prototype.calc=function(t){
var t2=t*t;
var t3=t2*t;
return this.c0+this.c1*t+this.c2*t2+this.c3*t3;
};
return Curve.create(
function(p){
this.points=p||[];
this.closed=false;
},
function(t){
var points=this.points,
point,intPoint,weight,l;
l=points.length;
if(l<2)console.log('duh, you need at least 2 points');
point=(l-(this.closed?0:1))*t;
intPoint=Math.floor(point);
weight=point-intPoint;
if(this.closed){
intPoint+=intPoint>0?0:(Math.floor(Math.abs(intPoint)/points.length)+1)*points.length;
}else if(weight===0&&intPoint===l-1){
intPoint=l-2;
weight=1;
}
var p0,p1,p2,p3;
if(this.closed||intPoint>0){
p0=points[(intPoint-1)%l];
}else{
tmp.subVectors(points[0],points[1]).add(points[0]);
p0=tmp;
}
p1=points[intPoint%l];
p2=points[(intPoint+1)%l];
if(this.closed||intPoint+2<l){
p3=points[(intPoint+2)%l];
}else{
tmp.subVectors(points[l-1],points[l-2]).add(points[l-1]);
p3=tmp;
}
if(this.type===undefined||this.type==='centripetal'||this.type==='chordal'){
var pow=this.type==='chordal'?0.5:0.25;
var dt0=Math.pow(p0.distanceToSquared(p1),pow);
var dt1=Math.pow(p1.distanceToSquared(p2),pow);
var dt2=Math.pow(p2.distanceToSquared(p3),pow);
if(dt1<1e-4)dt1=1.0;
if(dt0<1e-4)dt0=dt1;
if(dt2<1e-4)dt2=dt1;
px.initNonuniformCatmullRom(p0.x,p1.x,p2.x,p3.x,dt0,dt1,dt2);
py.initNonuniformCatmullRom(p0.y,p1.y,p2.y,p3.y,dt0,dt1,dt2);
pz.initNonuniformCatmullRom(p0.z,p1.z,p2.z,p3.z,dt0,dt1,dt2);
}else if(this.type==='catmullrom'){
var tension=this.tension!==undefined?this.tension:0.5;
px.initCatmullRom(p0.x,p1.x,p2.x,p3.x,tension);
py.initCatmullRom(p0.y,p1.y,p2.y,p3.y,tension);
pz.initCatmullRom(p0.z,p1.z,p2.z,p3.z,tension);
}
var v=new Vector3(
px.calc(weight),
py.calc(weight),
pz.calc(weight));
return v;
});
}();
function ClosedSplineCurve3(points){
console.warn('THREE.ClosedSplineCurve3 has been deprecated. Please use THREE.CatmullRomCurve3.');
exports.CatmullRomCurve3.call(this,points);
this.type='catmullrom';
this.closed=true;
}
ClosedSplineCurve3.prototype=Object.create(exports.CatmullRomCurve3.prototype);
var SplineCurve3=Curve.create(
function(points){
console.warn('THREE.SplineCurve3 will be deprecated. Please use THREE.CatmullRomCurve3');
this.points=points===undefined?[]:points;
},
function(t){
var points=this.points;
var point=(points.length-1)*t;
var intPoint=Math.floor(point);
var weight=point-intPoint;
var point0=points[intPoint==0?intPoint:intPoint-1];
var point1=points[intPoint];
var point2=points[intPoint>points.length-2?points.length-1:intPoint+1];
var point3=points[intPoint>points.length-3?points.length-1:intPoint+2];
var interpolate=exports.CurveUtils.interpolate;
return new Vector3(
interpolate(point0.x,point1.x,point2.x,point3.x,weight),
interpolate(point0.y,point1.y,point2.y,point3.y,weight),
interpolate(point0.z,point1.z,point2.z,point3.z,weight));
});
exports.CubicBezierCurve3=Curve.create(
function(v0,v1,v2,v3){
this.v0=v0;
this.v1=v1;
this.v2=v2;
this.v3=v3;
},
function(t){
var b3=exports.ShapeUtils.b3;
return new Vector3(
b3(t,this.v0.x,this.v1.x,this.v2.x,this.v3.x),
b3(t,this.v0.y,this.v1.y,this.v2.y,this.v3.y),
b3(t,this.v0.z,this.v1.z,this.v2.z,this.v3.z));
});
exports.QuadraticBezierCurve3=Curve.create(
function(v0,v1,v2){
this.v0=v0;
this.v1=v1;
this.v2=v2;
},
function(t){
var b2=exports.ShapeUtils.b2;
return new Vector3(
b2(t,this.v0.x,this.v1.x,this.v2.x),
b2(t,this.v0.y,this.v1.y,this.v2.y),
b2(t,this.v0.z,this.v1.z,this.v2.z));
});
exports.LineCurve3=Curve.create(
function(v1,v2){
this.v1=v1;
this.v2=v2;
},
function(t){
if(t===1){
return this.v2.clone();
}
var vector=new Vector3();
vector.subVectors(this.v2,this.v1);
vector.multiplyScalar(t);
vector.add(this.v1);
return vector;
});
function ArcCurve(aX,aY,aRadius,aStartAngle,aEndAngle,aClockwise){
EllipseCurve.call(this,aX,aY,aRadius,aRadius,aStartAngle,aEndAngle,aClockwise);
}
ArcCurve.prototype=Object.create(EllipseCurve.prototype);
ArcCurve.prototype.constructor=ArcCurve;
exports.SceneUtils={
createMultiMaterialObject:function createMultiMaterialObject(geometry,materials){
var group=new Group();
for(var i=0,l=materials.length;i<l;i++){
group.add(new Mesh(geometry,materials[i]));
}
return group;
},
detach:function detach(child,parent,scene){
child.applyMatrix(parent.matrixWorld);
parent.remove(child);
scene.add(child);
},
attach:function attach(child,scene,parent){
var matrixWorldInverse=new Matrix4();
matrixWorldInverse.getInverse(parent.matrixWorld);
child.applyMatrix(matrixWorldInverse);
scene.remove(child);
parent.add(child);
}};
function Face4(a,b,c,d,normal,color,materialIndex){
console.warn('THREE.Face4 has been removed. A THREE.Face3 will be created instead.');
return new Face3(a,b,c,normal,color,materialIndex);
}
var LineStrip=0;
var LinePieces=1;
function PointCloud(geometry,material){
console.warn('THREE.PointCloud has been renamed to THREE.Points.');
return new Points(geometry,material);
}
function ParticleSystem(geometry,material){
console.warn('THREE.ParticleSystem has been renamed to THREE.Points.');
return new Points(geometry,material);
}
function PointCloudMaterial(parameters){
console.warn('THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.');
return new PointsMaterial(parameters);
}
function ParticleBasicMaterial(parameters){
console.warn('THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.');
return new PointsMaterial(parameters);
}
function ParticleSystemMaterial(parameters){
console.warn('THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.');
return new PointsMaterial(parameters);
}
function Vertex(x,y,z){
console.warn('THREE.Vertex has been removed. Use THREE.Vector3 instead.');
return new Vector3(x,y,z);
}
babelHelpers.extends(Box2.prototype,{
empty:function empty(){
console.warn('THREE.Box2: .empty() has been renamed to .isEmpty().');
return this.isEmpty();
},
isIntersectionBox:function isIntersectionBox(box){
console.warn('THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().');
return this.intersectsBox(box);
}});
babelHelpers.extends(Box3.prototype,{
empty:function empty(){
console.warn('THREE.Box3: .empty() has been renamed to .isEmpty().');
return this.isEmpty();
},
isIntersectionBox:function isIntersectionBox(box){
console.warn('THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().');
return this.intersectsBox(box);
},
isIntersectionSphere:function isIntersectionSphere(sphere){
console.warn('THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().');
return this.intersectsSphere(sphere);
}});
babelHelpers.extends(Matrix3.prototype,{
multiplyVector3:function multiplyVector3(vector){
console.warn('THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.');
return vector.applyMatrix3(this);
},
multiplyVector3Array:function multiplyVector3Array(a){
console.warn('THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.');
return this.applyToVector3Array(a);
}});
babelHelpers.extends(Matrix4.prototype,{
extractPosition:function extractPosition(m){
console.warn('THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().');
return this.copyPosition(m);
},
setRotationFromQuaternion:function setRotationFromQuaternion(q){
console.warn('THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().');
return this.makeRotationFromQuaternion(q);
},
multiplyVector3:function multiplyVector3(vector){
console.warn('THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) or vector.applyProjection( matrix ) instead.');
return vector.applyProjection(this);
},
multiplyVector4:function multiplyVector4(vector){
console.warn('THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.');
return vector.applyMatrix4(this);
},
multiplyVector3Array:function multiplyVector3Array(a){
console.warn('THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.');
return this.applyToVector3Array(a);
},
rotateAxis:function rotateAxis(v){
console.warn('THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.');
v.transformDirection(this);
},
crossVector:function crossVector(vector){
console.warn('THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.');
return vector.applyMatrix4(this);
},
translate:function translate(v){
console.error('THREE.Matrix4: .translate() has been removed.');
},
rotateX:function rotateX(angle){
console.error('THREE.Matrix4: .rotateX() has been removed.');
},
rotateY:function rotateY(angle){
console.error('THREE.Matrix4: .rotateY() has been removed.');
},
rotateZ:function rotateZ(angle){
console.error('THREE.Matrix4: .rotateZ() has been removed.');
},
rotateByAxis:function rotateByAxis(axis,angle){
console.error('THREE.Matrix4: .rotateByAxis() has been removed.');
}});
babelHelpers.extends(Plane.prototype,{
isIntersectionLine:function isIntersectionLine(line){
console.warn('THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().');
return this.intersectsLine(line);
}});
babelHelpers.extends(Quaternion.prototype,{
multiplyVector3:function multiplyVector3(vector){
console.warn('THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.');
return vector.applyQuaternion(this);
}});
babelHelpers.extends(Ray.prototype,{
isIntersectionBox:function isIntersectionBox(box){
console.warn('THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().');
return this.intersectsBox(box);
},
isIntersectionPlane:function isIntersectionPlane(plane){
console.warn('THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().');
return this.intersectsPlane(plane);
},
isIntersectionSphere:function isIntersectionSphere(sphere){
console.warn('THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().');
return this.intersectsSphere(sphere);
}});
babelHelpers.extends(Vector3.prototype,{
setEulerFromRotationMatrix:function setEulerFromRotationMatrix(){
console.error('THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.');
},
setEulerFromQuaternion:function setEulerFromQuaternion(){
console.error('THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.');
},
getPositionFromMatrix:function getPositionFromMatrix(m){
console.warn('THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().');
return this.setFromMatrixPosition(m);
},
getScaleFromMatrix:function getScaleFromMatrix(m){
console.warn('THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().');
return this.setFromMatrixScale(m);
},
getColumnFromMatrix:function getColumnFromMatrix(index,matrix){
console.warn('THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().');
return this.setFromMatrixColumn(matrix,index);
}});
babelHelpers.extends(Object3D.prototype,{
getChildByName:function getChildByName(name){
console.warn('THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().');
return this.getObjectByName(name);
},
renderDepth:function renderDepth(value){
console.warn('THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.');
},
translate:function translate(distance,axis){
console.warn('THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.');
return this.translateOnAxis(axis,distance);
}});
Object.defineProperties(Object3D.prototype,{
eulerOrder:{
get:function get(){
console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');
return this.rotation.order;
},
set:function set(value){
console.warn('THREE.Object3D: .eulerOrder is now .rotation.order.');
this.rotation.order=value;
}},
useQuaternion:{
get:function get(){
console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');
},
set:function set(value){
console.warn('THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.');
}}});
Object.defineProperties(LOD.prototype,{
objects:{
get:function get(){
console.warn('THREE.LOD: .objects has been renamed to .levels.');
return this.levels;
}}});
PerspectiveCamera.prototype.setLens=function(focalLength,filmGauge){
console.warn("THREE.PerspectiveCamera.setLens is deprecated. "+
"Use .setFocalLength and .filmGauge for a photographic setup.");
if(filmGauge!==undefined)this.filmGauge=filmGauge;
this.setFocalLength(focalLength);
};
Object.defineProperties(Light.prototype,{
onlyShadow:{
set:function set(value){
console.warn('THREE.Light: .onlyShadow has been removed.');
}},
shadowCameraFov:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraFov is now .shadow.camera.fov.');
this.shadow.camera.fov=value;
}},
shadowCameraLeft:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraLeft is now .shadow.camera.left.');
this.shadow.camera.left=value;
}},
shadowCameraRight:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraRight is now .shadow.camera.right.');
this.shadow.camera.right=value;
}},
shadowCameraTop:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraTop is now .shadow.camera.top.');
this.shadow.camera.top=value;
}},
shadowCameraBottom:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.');
this.shadow.camera.bottom=value;
}},
shadowCameraNear:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraNear is now .shadow.camera.near.');
this.shadow.camera.near=value;
}},
shadowCameraFar:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraFar is now .shadow.camera.far.');
this.shadow.camera.far=value;
}},
shadowCameraVisible:{
set:function set(value){
console.warn('THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.');
}},
shadowBias:{
set:function set(value){
console.warn('THREE.Light: .shadowBias is now .shadow.bias.');
this.shadow.bias=value;
}},
shadowDarkness:{
set:function set(value){
console.warn('THREE.Light: .shadowDarkness has been removed.');
}},
shadowMapWidth:{
set:function set(value){
console.warn('THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.');
this.shadow.mapSize.width=value;
}},
shadowMapHeight:{
set:function set(value){
console.warn('THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.');
this.shadow.mapSize.height=value;
}}});
Object.defineProperties(BufferAttribute.prototype,{
length:{
get:function get(){
console.warn('THREE.BufferAttribute: .length has been deprecated. Please use .count.');
return this.array.length;
}}});
babelHelpers.extends(BufferGeometry.prototype,{
addIndex:function addIndex(index){
console.warn('THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().');
this.setIndex(index);
},
addDrawCall:function addDrawCall(start,count,indexOffset){
if(indexOffset!==undefined){
console.warn('THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.');
}
console.warn('THREE.BufferGeometry: .addDrawCall() is now .addGroup().');
this.addGroup(start,count);
},
clearDrawCalls:function clearDrawCalls(){
console.warn('THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().');
this.clearGroups();
},
computeTangents:function computeTangents(){
console.warn('THREE.BufferGeometry: .computeTangents() has been removed.');
},
computeOffsets:function computeOffsets(){
console.warn('THREE.BufferGeometry: .computeOffsets() has been removed.');
}});
Object.defineProperties(BufferGeometry.prototype,{
drawcalls:{
get:function get(){
console.error('THREE.BufferGeometry: .drawcalls has been renamed to .groups.');
return this.groups;
}},
offsets:{
get:function get(){
console.warn('THREE.BufferGeometry: .offsets has been renamed to .groups.');
return this.groups;
}}});
Object.defineProperties(Material.prototype,{
wrapAround:{
get:function get(){
console.warn('THREE.'+this.type+': .wrapAround has been removed.');
},
set:function set(value){
console.warn('THREE.'+this.type+': .wrapAround has been removed.');
}},
wrapRGB:{
get:function get(){
console.warn('THREE.'+this.type+': .wrapRGB has been removed.');
return new Color();
}}});
Object.defineProperties(MeshPhongMaterial.prototype,{
metal:{
get:function get(){
console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.');
return false;
},
set:function set(value){
console.warn('THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead');
}}});
Object.defineProperties(ShaderMaterial.prototype,{
derivatives:{
get:function get(){
console.warn('THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');
return this.extensions.derivatives;
},
set:function set(value){
console.warn('THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.');
this.extensions.derivatives=value;
}}});
EventDispatcher.prototype=babelHelpers.extends(Object.create({
constructor:EventDispatcher,
apply:function apply(target){
console.warn("THREE.EventDispatcher: .apply is deprecated, "+
"just inherit or Object.assign the prototype to mix-in.");
babelHelpers.extends(target,this);
}}),
EventDispatcher.prototype);
babelHelpers.extends(WebGLRenderer.prototype,{
supportsFloatTextures:function supportsFloatTextures(){
console.warn('THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \'OES_texture_float\' ).');
return this.extensions.get('OES_texture_float');
},
supportsHalfFloatTextures:function supportsHalfFloatTextures(){
console.warn('THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \'OES_texture_half_float\' ).');
return this.extensions.get('OES_texture_half_float');
},
supportsStandardDerivatives:function supportsStandardDerivatives(){
console.warn('THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \'OES_standard_derivatives\' ).');
return this.extensions.get('OES_standard_derivatives');
},
supportsCompressedTextureS3TC:function supportsCompressedTextureS3TC(){
console.warn('THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \'WEBGL_compressed_texture_s3tc\' ).');
return this.extensions.get('WEBGL_compressed_texture_s3tc');
},
supportsCompressedTexturePVRTC:function supportsCompressedTexturePVRTC(){
console.warn('THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \'WEBGL_compressed_texture_pvrtc\' ).');
return this.extensions.get('WEBGL_compressed_texture_pvrtc');
},
supportsBlendMinMax:function supportsBlendMinMax(){
console.warn('THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \'EXT_blend_minmax\' ).');
return this.extensions.get('EXT_blend_minmax');
},
supportsVertexTextures:function supportsVertexTextures(){
return this.capabilities.vertexTextures;
},
supportsInstancedArrays:function supportsInstancedArrays(){
console.warn('THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \'ANGLE_instanced_arrays\' ).');
return this.extensions.get('ANGLE_instanced_arrays');
},
enableScissorTest:function enableScissorTest(boolean){
console.warn('THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().');
this.setScissorTest(boolean);
},
initMaterial:function initMaterial(){
console.warn('THREE.WebGLRenderer: .initMaterial() has been removed.');
},
addPrePlugin:function addPrePlugin(){
console.warn('THREE.WebGLRenderer: .addPrePlugin() has been removed.');
},
addPostPlugin:function addPostPlugin(){
console.warn('THREE.WebGLRenderer: .addPostPlugin() has been removed.');
},
updateShadowMap:function updateShadowMap(){
console.warn('THREE.WebGLRenderer: .updateShadowMap() has been removed.');
}});
Object.defineProperties(WebGLRenderer.prototype,{
shadowMapEnabled:{
get:function get(){
return this.shadowMap.enabled;
},
set:function set(value){
console.warn('THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.');
this.shadowMap.enabled=value;
}},
shadowMapType:{
get:function get(){
return this.shadowMap.type;
},
set:function set(value){
console.warn('THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.');
this.shadowMap.type=value;
}},
shadowMapCullFace:{
get:function get(){
return this.shadowMap.cullFace;
},
set:function set(value){
console.warn('THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.');
this.shadowMap.cullFace=value;
}}});
Object.defineProperties(WebGLShadowMap.prototype,{
cullFace:{
get:function get(){
return this.renderReverseSided?CullFaceFront:CullFaceBack;
},
set:function set(cullFace){
var value=cullFace!==CullFaceBack;
console.warn("WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to "+value+".");
this.renderReverseSided=value;
}}});
Object.defineProperties(WebGLRenderTarget.prototype,{
wrapS:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');
return this.texture.wrapS;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.');
this.texture.wrapS=value;
}},
wrapT:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');
return this.texture.wrapT;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.');
this.texture.wrapT=value;
}},
magFilter:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');
return this.texture.magFilter;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.');
this.texture.magFilter=value;
}},
minFilter:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');
return this.texture.minFilter;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.');
this.texture.minFilter=value;
}},
anisotropy:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');
return this.texture.anisotropy;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.');
this.texture.anisotropy=value;
}},
offset:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');
return this.texture.offset;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .offset is now .texture.offset.');
this.texture.offset=value;
}},
repeat:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');
return this.texture.repeat;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .repeat is now .texture.repeat.');
this.texture.repeat=value;
}},
format:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');
return this.texture.format;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .format is now .texture.format.');
this.texture.format=value;
}},
type:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');
return this.texture.type;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .type is now .texture.type.');
this.texture.type=value;
}},
generateMipmaps:{
get:function get(){
console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');
return this.texture.generateMipmaps;
},
set:function set(value){
console.warn('THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.');
this.texture.generateMipmaps=value;
}}});
babelHelpers.extends(Audio.prototype,{
load:function load(file){
console.warn('THREE.Audio: .load has been deprecated. Please use THREE.AudioLoader.');
var scope=this;
var audioLoader=new AudioLoader();
audioLoader.load(file,function(buffer){
scope.setBuffer(buffer);
});
return this;
}});
babelHelpers.extends(AudioAnalyser.prototype,{
getData:function getData(file){
console.warn('THREE.AudioAnalyser: .getData() is now .getFrequencyData().');
return this.getFrequencyData();
}});
var GeometryUtils={
merge:function merge(geometry1,geometry2,materialIndexOffset){
console.warn('THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.');
var matrix;
if(geometry2.isMesh){
geometry2.matrixAutoUpdate&&geometry2.updateMatrix();
matrix=geometry2.matrix;
geometry2=geometry2.geometry;
}
geometry1.merge(geometry2,matrix,materialIndexOffset);
},
center:function center(geometry){
console.warn('THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.');
return geometry.center();
}};
var ImageUtils={
crossOrigin:undefined,
loadTexture:function loadTexture(url,mapping,onLoad,onError){
console.warn('THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.');
var loader=new TextureLoader();
loader.setCrossOrigin(this.crossOrigin);
var texture=loader.load(url,onLoad,undefined,onError);
if(mapping)texture.mapping=mapping;
return texture;
},
loadTextureCube:function loadTextureCube(urls,mapping,onLoad,onError){
console.warn('THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.');
var loader=new CubeTextureLoader();
loader.setCrossOrigin(this.crossOrigin);
var texture=loader.load(urls,onLoad,undefined,onError);
if(mapping)texture.mapping=mapping;
return texture;
},
loadCompressedTexture:function loadCompressedTexture(){
console.error('THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.');
},
loadCompressedTextureCube:function loadCompressedTextureCube(){
console.error('THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.');
}};
function Projector(){
console.error('THREE.Projector has been moved to /examples/js/renderers/Projector.js.');
this.projectVector=function(vector,camera){
console.warn('THREE.Projector: .projectVector() is now vector.project().');
vector.project(camera);
};
this.unprojectVector=function(vector,camera){
console.warn('THREE.Projector: .unprojectVector() is now vector.unproject().');
vector.unproject(camera);
};
this.pickingRay=function(vector,camera){
console.error('THREE.Projector: .pickingRay() is now raycaster.setFromCamera().');
};
}
function CanvasRenderer(){
console.error('THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js');
this.domElement=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');
this.clear=function(){};
this.render=function(){};
this.setClearColor=function(){};
this.setSize=function(){};
}
Object.defineProperty(exports,'AudioContext',{
get:function get(){
return exports.getAudioContext();
}});
exports.SpritePlugin=SpritePlugin;
exports.LensFlarePlugin=LensFlarePlugin;
exports.WebGLUniforms=WebGLUniforms;
exports.WebGLTextures=WebGLTextures;
exports.WebGLState=WebGLState;
exports.WebGLShadowMap=WebGLShadowMap;
exports.WebGLShader=WebGLShader;
exports.WebGLProperties=WebGLProperties;
exports.WebGLPrograms=WebGLPrograms;
exports.WebGLProgram=WebGLProgram;
exports.WebGLObjects=WebGLObjects;
exports.WebGLLights=WebGLLights;
exports.WebGLGeometries=WebGLGeometries;
exports.WebGLCapabilities=WebGLCapabilities;
exports.WebGLExtensions=WebGLExtensions;
exports.WebGLIndexedBufferRenderer=WebGLIndexedBufferRenderer;
exports.WebGLClipping=WebGLClipping;
exports.WebGLBufferRenderer=WebGLBufferRenderer;
exports.WebGLRenderTargetCube=WebGLRenderTargetCube;
exports.WebGLRenderTarget=WebGLRenderTarget;
exports.WebGLRenderer=WebGLRenderer;
exports.ShaderLib=ShaderLib;
exports.UniformsLib=UniformsLib;
exports.ShaderChunk=ShaderChunk;
exports.FogExp2=FogExp2;
exports.Fog=Fog;
exports.Scene=Scene;
exports.LensFlare=LensFlare;
exports.Sprite=Sprite;
exports.LOD=LOD;
exports.SkinnedMesh=SkinnedMesh;
exports.Skeleton=Skeleton;
exports.Bone=Bone;
exports.Mesh=Mesh;
exports.LineSegments=LineSegments;
exports.Line=Line;
exports.Points=Points;
exports.Group=Group;
exports.VideoTexture=VideoTexture;
exports.DataTexture=DataTexture;
exports.CompressedTexture=CompressedTexture;
exports.CubeTexture=CubeTexture;
exports.CanvasTexture=CanvasTexture;
exports.DepthTexture=DepthTexture;
exports.TextureIdCount=TextureIdCount;
exports.Texture=Texture;
exports.ShadowMaterial=ShadowMaterial;
exports.SpriteMaterial=SpriteMaterial;
exports.RawShaderMaterial=RawShaderMaterial;
exports.ShaderMaterial=ShaderMaterial;
exports.PointsMaterial=PointsMaterial;
exports.MultiMaterial=MultiMaterial;
exports.MeshPhysicalMaterial=MeshPhysicalMaterial;
exports.MeshStandardMaterial=MeshStandardMaterial;
exports.MeshPhongMaterial=MeshPhongMaterial;
exports.MeshNormalMaterial=MeshNormalMaterial;
exports.MeshLambertMaterial=MeshLambertMaterial;
exports.MeshDepthMaterial=MeshDepthMaterial;
exports.MeshBasicMaterial=MeshBasicMaterial;
exports.LineDashedMaterial=LineDashedMaterial;
exports.LineBasicMaterial=LineBasicMaterial;
exports.MaterialIdCount=MaterialIdCount;
exports.Material=Material;
exports.CompressedTextureLoader=CompressedTextureLoader;
exports.BinaryTextureLoader=BinaryTextureLoader;
exports.DataTextureLoader=DataTextureLoader;
exports.CubeTextureLoader=CubeTextureLoader;
exports.TextureLoader=TextureLoader;
exports.ObjectLoader=ObjectLoader;
exports.MaterialLoader=MaterialLoader;
exports.BufferGeometryLoader=BufferGeometryLoader;
exports.LoadingManager=LoadingManager;
exports.JSONLoader=JSONLoader;
exports.ImageLoader=ImageLoader;
exports.FontLoader=FontLoader;
exports.XHRLoader=XHRLoader;
exports.Loader=Loader;
exports.AudioLoader=AudioLoader;
exports.SpotLightShadow=SpotLightShadow;
exports.SpotLight=SpotLight;
exports.PointLight=PointLight;
exports.HemisphereLight=HemisphereLight;
exports.DirectionalLightShadow=DirectionalLightShadow;
exports.DirectionalLight=DirectionalLight;
exports.AmbientLight=AmbientLight;
exports.LightShadow=LightShadow;
exports.Light=Light;
exports.StereoCamera=StereoCamera;
exports.PerspectiveCamera=PerspectiveCamera;
exports.OrthographicCamera=OrthographicCamera;
exports.CubeCamera=CubeCamera;
exports.Camera=Camera;
exports.AudioListener=AudioListener;
exports.PositionalAudio=PositionalAudio;
exports.getAudioContext=getAudioContext;
exports.AudioAnalyser=AudioAnalyser;
exports.Audio=Audio;
exports.VectorKeyframeTrack=VectorKeyframeTrack;
exports.StringKeyframeTrack=StringKeyframeTrack;
exports.QuaternionKeyframeTrack=QuaternionKeyframeTrack;
exports.NumberKeyframeTrack=NumberKeyframeTrack;
exports.ColorKeyframeTrack=ColorKeyframeTrack;
exports.BooleanKeyframeTrack=BooleanKeyframeTrack;
exports.PropertyMixer=PropertyMixer;
exports.PropertyBinding=PropertyBinding;
exports.KeyframeTrack=KeyframeTrack;
exports.AnimationObjectGroup=AnimationObjectGroup;
exports.AnimationMixer=AnimationMixer;
exports.AnimationClip=AnimationClip;
exports.Uniform=Uniform;
exports.InstancedBufferGeometry=InstancedBufferGeometry;
exports.BufferGeometry=BufferGeometry;
exports.DirectGeometry=DirectGeometry;
exports.GeometryIdCount=GeometryIdCount;
exports.Geometry=Geometry;
exports.InterleavedBufferAttribute=InterleavedBufferAttribute;
exports.InstancedInterleavedBuffer=InstancedInterleavedBuffer;
exports.InterleavedBuffer=InterleavedBuffer;
exports.InstancedBufferAttribute=InstancedBufferAttribute;
exports.DynamicBufferAttribute=DynamicBufferAttribute;
exports.Float64Attribute=Float64Attribute;
exports.Float32Attribute=Float32Attribute;
exports.Uint32Attribute=Uint32Attribute;
exports.Int32Attribute=Int32Attribute;
exports.Uint16Attribute=Uint16Attribute;
exports.Int16Attribute=Int16Attribute;
exports.Uint8ClampedAttribute=Uint8ClampedAttribute;
exports.Uint8Attribute=Uint8Attribute;
exports.Int8Attribute=Int8Attribute;
exports.BufferAttribute=BufferAttribute;
exports.Face3=Face3;
exports.Object3DIdCount=Object3DIdCount;
exports.Object3D=Object3D;
exports.Raycaster=Raycaster;
exports.Layers=Layers;
exports.EventDispatcher=EventDispatcher;
exports.Clock=Clock;
exports.QuaternionLinearInterpolant=QuaternionLinearInterpolant;
exports.LinearInterpolant=LinearInterpolant;
exports.DiscreteInterpolant=DiscreteInterpolant;
exports.CubicInterpolant=CubicInterpolant;
exports.Interpolant=Interpolant;
exports.Triangle=Triangle;
exports.Spline=Spline;
exports.Spherical=Spherical;
exports.Plane=Plane;
exports.Frustum=Frustum;
exports.Sphere=Sphere;
exports.Ray=Ray;
exports.Matrix4=Matrix4;
exports.Matrix3=Matrix3;
exports.Box3=Box3;
exports.Box2=Box2;
exports.Line3=Line3;
exports.Euler=Euler;
exports.Vector4=Vector4;
exports.Vector3=Vector3;
exports.Vector2=Vector2;
exports.Quaternion=Quaternion;
exports.Color=Color;
exports.MorphBlendMesh=MorphBlendMesh;
exports.ImmediateRenderObject=ImmediateRenderObject;
exports.WireframeHelper=WireframeHelper;
exports.VertexNormalsHelper=VertexNormalsHelper;
exports.SpotLightHelper=SpotLightHelper;
exports.SkeletonHelper=SkeletonHelper;
exports.PointLightHelper=PointLightHelper;
exports.HemisphereLightHelper=HemisphereLightHelper;
exports.GridHelper=GridHelper;
exports.FaceNormalsHelper=FaceNormalsHelper;
exports.EdgesHelper=EdgesHelper;
exports.DirectionalLightHelper=DirectionalLightHelper;
exports.CameraHelper=CameraHelper;
exports.BoundingBoxHelper=BoundingBoxHelper;
exports.BoxHelper=BoxHelper;
exports.ArrowHelper=ArrowHelper;
exports.AxisHelper=AxisHelper;
exports.WireframeGeometry=WireframeGeometry;
exports.ParametricGeometry=ParametricGeometry;
exports.TetrahedronGeometry=TetrahedronGeometry;
exports.OctahedronGeometry=OctahedronGeometry;
exports.IcosahedronGeometry=IcosahedronGeometry;
exports.DodecahedronGeometry=DodecahedronGeometry;
exports.PolyhedronGeometry=PolyhedronGeometry;
exports.TubeGeometry=TubeGeometry;
exports.TorusKnotGeometry=TorusKnotGeometry;
exports.TorusKnotBufferGeometry=TorusKnotBufferGeometry;
exports.TorusGeometry=TorusGeometry;
exports.TorusBufferGeometry=TorusBufferGeometry;
exports.TextGeometry=TextGeometry;
exports.SphereBufferGeometry=SphereBufferGeometry;
exports.SphereGeometry=SphereGeometry;
exports.RingGeometry=RingGeometry;
exports.RingBufferGeometry=RingBufferGeometry;
exports.PlaneBufferGeometry=PlaneBufferGeometry;
exports.PlaneGeometry=PlaneGeometry;
exports.LatheGeometry=LatheGeometry;
exports.LatheBufferGeometry=LatheBufferGeometry;
exports.ShapeGeometry=ShapeGeometry;
exports.ExtrudeGeometry=ExtrudeGeometry;
exports.EdgesGeometry=EdgesGeometry;
exports.ConeGeometry=ConeGeometry;
exports.ConeBufferGeometry=ConeBufferGeometry;
exports.CylinderGeometry=CylinderGeometry;
exports.CylinderBufferGeometry=CylinderBufferGeometry;
exports.CircleBufferGeometry=CircleBufferGeometry;
exports.CircleGeometry=CircleGeometry;
exports.BoxBufferGeometry=BoxBufferGeometry;
exports.BoxGeometry=BoxGeometry;
exports.ClosedSplineCurve3=ClosedSplineCurve3;
exports.SplineCurve3=SplineCurve3;
exports.ArcCurve=ArcCurve;
exports.EllipseCurve=EllipseCurve;
exports.SplineCurve=SplineCurve;
exports.CubicBezierCurve=CubicBezierCurve;
exports.QuadraticBezierCurve=QuadraticBezierCurve;
exports.LineCurve=LineCurve;
exports.Shape=Shape;
exports.ShapePath=ShapePath;
exports.Path=Path;
exports.Font=Font;
exports.CurvePath=CurvePath;
exports.Curve=Curve;
exports.REVISION=REVISION;
exports.MOUSE=MOUSE;
exports.CullFaceNone=CullFaceNone;
exports.CullFaceBack=CullFaceBack;
exports.CullFaceFront=CullFaceFront;
exports.CullFaceFrontBack=CullFaceFrontBack;
exports.FrontFaceDirectionCW=FrontFaceDirectionCW;
exports.FrontFaceDirectionCCW=FrontFaceDirectionCCW;
exports.BasicShadowMap=BasicShadowMap;
exports.PCFShadowMap=PCFShadowMap;
exports.PCFSoftShadowMap=PCFSoftShadowMap;
exports.FrontSide=FrontSide;
exports.BackSide=BackSide;
exports.DoubleSide=DoubleSide;
exports.FlatShading=FlatShading;
exports.SmoothShading=SmoothShading;
exports.NoColors=NoColors;
exports.FaceColors=FaceColors;
exports.VertexColors=VertexColors;
exports.NoBlending=NoBlending;
exports.NormalBlending=NormalBlending;
exports.AdditiveBlending=AdditiveBlending;
exports.SubtractiveBlending=SubtractiveBlending;
exports.MultiplyBlending=MultiplyBlending;
exports.CustomBlending=CustomBlending;
exports.AddEquation=AddEquation;
exports.SubtractEquation=SubtractEquation;
exports.ReverseSubtractEquation=ReverseSubtractEquation;
exports.MinEquation=MinEquation;
exports.MaxEquation=MaxEquation;
exports.ZeroFactor=ZeroFactor;
exports.OneFactor=OneFactor;
exports.SrcColorFactor=SrcColorFactor;
exports.OneMinusSrcColorFactor=OneMinusSrcColorFactor;
exports.SrcAlphaFactor=SrcAlphaFactor;
exports.OneMinusSrcAlphaFactor=OneMinusSrcAlphaFactor;
exports.DstAlphaFactor=DstAlphaFactor;
exports.OneMinusDstAlphaFactor=OneMinusDstAlphaFactor;
exports.DstColorFactor=DstColorFactor;
exports.OneMinusDstColorFactor=OneMinusDstColorFactor;
exports.SrcAlphaSaturateFactor=SrcAlphaSaturateFactor;
exports.NeverDepth=NeverDepth;
exports.AlwaysDepth=AlwaysDepth;
exports.LessDepth=LessDepth;
exports.LessEqualDepth=LessEqualDepth;
exports.EqualDepth=EqualDepth;
exports.GreaterEqualDepth=GreaterEqualDepth;
exports.GreaterDepth=GreaterDepth;
exports.NotEqualDepth=NotEqualDepth;
exports.MultiplyOperation=MultiplyOperation;
exports.MixOperation=MixOperation;
exports.AddOperation=AddOperation;
exports.NoToneMapping=NoToneMapping;
exports.LinearToneMapping=LinearToneMapping;
exports.ReinhardToneMapping=ReinhardToneMapping;
exports.Uncharted2ToneMapping=Uncharted2ToneMapping;
exports.CineonToneMapping=CineonToneMapping;
exports.UVMapping=UVMapping;
exports.CubeReflectionMapping=CubeReflectionMapping;
exports.CubeRefractionMapping=CubeRefractionMapping;
exports.EquirectangularReflectionMapping=EquirectangularReflectionMapping;
exports.EquirectangularRefractionMapping=EquirectangularRefractionMapping;
exports.SphericalReflectionMapping=SphericalReflectionMapping;
exports.CubeUVReflectionMapping=CubeUVReflectionMapping;
exports.CubeUVRefractionMapping=CubeUVRefractionMapping;
exports.RepeatWrapping=RepeatWrapping;
exports.ClampToEdgeWrapping=ClampToEdgeWrapping;
exports.MirroredRepeatWrapping=MirroredRepeatWrapping;
exports.NearestFilter=NearestFilter;
exports.NearestMipMapNearestFilter=NearestMipMapNearestFilter;
exports.NearestMipMapLinearFilter=NearestMipMapLinearFilter;
exports.LinearFilter=LinearFilter;
exports.LinearMipMapNearestFilter=LinearMipMapNearestFilter;
exports.LinearMipMapLinearFilter=LinearMipMapLinearFilter;
exports.UnsignedByteType=UnsignedByteType;
exports.ByteType=ByteType;
exports.ShortType=ShortType;
exports.UnsignedShortType=UnsignedShortType;
exports.IntType=IntType;
exports.UnsignedIntType=UnsignedIntType;
exports.FloatType=FloatType;
exports.HalfFloatType=HalfFloatType;
exports.UnsignedShort4444Type=UnsignedShort4444Type;
exports.UnsignedShort5551Type=UnsignedShort5551Type;
exports.UnsignedShort565Type=UnsignedShort565Type;
exports.UnsignedInt248Type=UnsignedInt248Type;
exports.AlphaFormat=AlphaFormat;
exports.RGBFormat=RGBFormat;
exports.RGBAFormat=RGBAFormat;
exports.LuminanceFormat=LuminanceFormat;
exports.LuminanceAlphaFormat=LuminanceAlphaFormat;
exports.RGBEFormat=RGBEFormat;
exports.DepthFormat=DepthFormat;
exports.DepthStencilFormat=DepthStencilFormat;
exports.RGB_S3TC_DXT1_Format=RGB_S3TC_DXT1_Format;
exports.RGBA_S3TC_DXT1_Format=RGBA_S3TC_DXT1_Format;
exports.RGBA_S3TC_DXT3_Format=RGBA_S3TC_DXT3_Format;
exports.RGBA_S3TC_DXT5_Format=RGBA_S3TC_DXT5_Format;
exports.RGB_PVRTC_4BPPV1_Format=RGB_PVRTC_4BPPV1_Format;
exports.RGB_PVRTC_2BPPV1_Format=RGB_PVRTC_2BPPV1_Format;
exports.RGBA_PVRTC_4BPPV1_Format=RGBA_PVRTC_4BPPV1_Format;
exports.RGBA_PVRTC_2BPPV1_Format=RGBA_PVRTC_2BPPV1_Format;
exports.RGB_ETC1_Format=RGB_ETC1_Format;
exports.LoopOnce=LoopOnce;
exports.LoopRepeat=LoopRepeat;
exports.LoopPingPong=LoopPingPong;
exports.InterpolateDiscrete=InterpolateDiscrete;
exports.InterpolateLinear=InterpolateLinear;
exports.InterpolateSmooth=InterpolateSmooth;
exports.ZeroCurvatureEnding=ZeroCurvatureEnding;
exports.ZeroSlopeEnding=ZeroSlopeEnding;
exports.WrapAroundEnding=WrapAroundEnding;
exports.TrianglesDrawMode=TrianglesDrawMode;
exports.TriangleStripDrawMode=TriangleStripDrawMode;
exports.TriangleFanDrawMode=TriangleFanDrawMode;
exports.LinearEncoding=LinearEncoding;
exports.sRGBEncoding=sRGBEncoding;
exports.GammaEncoding=GammaEncoding;
exports.RGBEEncoding=RGBEEncoding;
exports.LogLuvEncoding=LogLuvEncoding;
exports.RGBM7Encoding=RGBM7Encoding;
exports.RGBM16Encoding=RGBM16Encoding;
exports.RGBDEncoding=RGBDEncoding;
exports.BasicDepthPacking=BasicDepthPacking;
exports.RGBADepthPacking=RGBADepthPacking;
exports.CubeGeometry=BoxGeometry;
exports.Face4=Face4;
exports.LineStrip=LineStrip;
exports.LinePieces=LinePieces;
exports.MeshFaceMaterial=MultiMaterial;
exports.PointCloud=PointCloud;
exports.Particle=Sprite;
exports.ParticleSystem=ParticleSystem;
exports.PointCloudMaterial=PointCloudMaterial;
exports.ParticleBasicMaterial=ParticleBasicMaterial;
exports.ParticleSystemMaterial=ParticleSystemMaterial;
exports.Vertex=Vertex;
exports.GeometryUtils=GeometryUtils;
exports.ImageUtils=ImageUtils;
exports.Projector=Projector;
exports.CanvasRenderer=CanvasRenderer;
Object.defineProperty(exports,'__esModule',{value:true});
});
}, "three/build/three.js");
__d(31 /* ovrui/lib/Control/MousePanControls.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();
function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
var HALF_PI=Math.PI/2;
var RADIAN_CONVERT=Math.PI/180;
var MousePanControls=function(){
function MousePanControls(camera,target){
_classCallCheck(this,MousePanControls);
this.yaw=camera.rotation.y;
this.pitch=camera.rotation.x;
this.camera=camera;
this.enabled=true;
this.tracking=false;
this.target=target||window;
this.mouseDownHandler=this.mouseDownHandler.bind(this);
this.mouseMoveHandler=this.mouseMoveHandler.bind(this);
this.mouseUpHandler=this.mouseUpHandler.bind(this);
this.connect();
}
_createClass(MousePanControls,[{
key:'connect',
value:function connect(){
this.target.addEventListener('mousedown',this.mouseDownHandler);
window.addEventListener('mousemove',this.mouseMoveHandler);
window.addEventListener('mouseup',this.mouseUpHandler);
this.enabled=true;
}},
{
key:'disconnect',
value:function disconnect(){
this.target.removeEventListener('mousedown',this.mouseDownHandler);
window.removeEventListener('mousemove',this.mouseMoveHandler);
window.removeEventListener('mouseup',this.mouseUpHandler);
this.enabled=false;
}},
{
key:'mouseDownHandler',
value:function mouseDownHandler(e){
this.tracking=true;
this.lastX=e.screenX;
this.lastY=e.screenY;
}},
{
key:'mouseUpHandler',
value:function mouseUpHandler(){
this.tracking=false;
}},
{
key:'mouseMoveHandler',
value:function mouseMoveHandler(e){
if(!this.tracking){
return;
}
var width=window.innerWidth;
var height=window.innerHeight;
if(this.target!==window){
width=this.target.clientWidth;
height=this.target.clientHeight;
}
var deltaX=e.screenX-this.lastX;
var deltaY=e.screenY-this.lastY;
this.lastX=e.screenX;
this.lastY=e.screenY;
this.yaw+=deltaX/width*this.camera.fov*this.camera.aspect*RADIAN_CONVERT;
this.pitch+=deltaY/height*this.camera.fov*RADIAN_CONVERT;
this.pitch=Math.max(-HALF_PI,Math.min(HALF_PI,this.pitch));
}},
{
key:'resetRotation',
value:function resetRotation(x,y,z){
this.yaw=y;
this.pitch=x;
}},
{
key:'update',
value:function update(){
if(!this.enabled){
return;
}
this.camera.rotation.set(this.pitch,this.yaw,0,'YXZ');
}}]);
return MousePanControls;
}();
exports.default=MousePanControls;
}, "ovrui/lib/Control/MousePanControls.js");
__d(32 /* ovrui/lib/Control/VRControls.js */, function(global, require, module, exports) {
"use strict";
Object.defineProperty(exports,"__esModule",{
value:true});
var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();
function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
var VRControls=function(){
function VRControls(camera,vrDisplay){
_classCallCheck(this,VRControls);
this.camera=camera;
this._vrDisplay=vrDisplay;
}
_createClass(VRControls,[{
key:"update",
value:function update(){
var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};
var pose=options.frameData?options.frameData.pose:null;
if(pose){
if(pose.position){
this.camera.position.fromArray(pose.position);
}
if(pose.orientation){
this.camera.quaternion.fromArray(pose.orientation);
}
}
}},
{
key:"vrDisplay",
get:function get(){
return this._vrDisplay;
}}]);
return VRControls;
}();
exports.default=VRControls;
}, "ovrui/lib/Control/VRControls.js");
__d(33 /* ovrui/lib/Control/VREffect.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();
var _ThreeShim=require(29 /* ../ThreeShim */);
var _ThreeShim2=_interopRequireDefault(_ThreeShim);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
var DEFAULT_LEFT_BOUNDS=[0.0,0.0,0.5,1.0];
var DEFAULT_RIGHT_BOUNDS=[0.5,0.0,0.5,1.0];
var leftCamera=new _ThreeShim2.default.PerspectiveCamera();
leftCamera.layers.enable(1);
var rightCamera=new _ThreeShim2.default.PerspectiveCamera();
rightCamera.layers.enable(2);
var leftTranslation=new _ThreeShim2.default.Vector3();
var rightTranslation=new _ThreeShim2.default.Vector3();
var VREffect=function(){
function VREffect(renderer,vrDisplay){
_classCallCheck(this,VREffect);
this.renderer=renderer;
this.vrDisplay=vrDisplay;
this.leftBounds=DEFAULT_LEFT_BOUNDS;
this.rightBounds=DEFAULT_RIGHT_BOUNDS;
this.originalSize=renderer.getSize();
this.originalPixelRatio=renderer.getPixelRatio();
}
_createClass(VREffect,[{
key:'_configureRendererForVRDisplay',
value:function _configureRendererForVRDisplay(){
var leftParams=this.vrDisplay.getEyeParameters('left');
var rightParams=this.vrDisplay.getEyeParameters('right');
this.renderer.setPixelRatio(1);
this.renderer.setSize(leftParams.renderWidth+rightParams.renderWidth,Math.min(leftParams.renderHeight,rightParams.renderHeight),false);
}},
{
key:'requestPresent',
value:function requestPresent(){
var _this=this;
if(!this.vrDisplay){
return Promise.reject();
}
if(this.vrDisplay.isPresenting){
return Promise.resolve();
}
return this.vrDisplay.requestPresent([{
source:this.renderer.domElement}]).
then(function(){
_this._configureRendererForVRDisplay();
});
}},
{
key:'exitPresent',
value:function exitPresent(){
var _this2=this;
if(!this.vrDisplay){
return Promise.resolve();
}
if(!this.vrDisplay.isPresenting){
return Promise.resolve();
}
return this.vrDisplay.exitPresent().then(function(){
_this2.renderer.setPixelRatio(_this2.originalPixelRatio);
_this2.renderer.setSize(_this2.originalSize.width,_this2.originalSize.height,false);
});
}},
{
key:'setSize',
value:function setSize(width,height){
this.originalSize={width:width,height:height};
if(this.vrDisplay&&this.vrDisplay.isPresenting){
this._configureRendererForVRDisplay();
}else{
this.renderer.setPixelRatio(this.originalPixelRatio);
this.renderer.setSize(width,height,false);
}
}},
{
key:'render',
value:function render(scene,camera,frameData){
if(this.vrDisplay&&this.vrDisplay.isPresenting){
var preserveAutoUpdate=scene.autoUpdate;
if(preserveAutoUpdate){
scene.updateMatrixWorld();
scene.autoUpdate=false;
}
var leftParams=this.vrDisplay.getEyeParameters('left');
leftTranslation.fromArray(leftParams.offset);
var rightParams=this.vrDisplay.getEyeParameters('right');
rightTranslation.fromArray(rightParams.offset);
var size=this.renderer.getSize();
var leftRect={
x:Math.round(size.width*this.leftBounds[0]),
y:Math.round(size.height*this.leftBounds[1]),
width:Math.round(size.width*this.leftBounds[2]),
height:Math.round(size.height*this.leftBounds[3])};
var rightRect={
x:Math.round(size.width*this.rightBounds[0]),
y:Math.round(size.height*this.rightBounds[1]),
width:Math.round(size.width*this.rightBounds[2]),
height:Math.round(size.height*this.rightBounds[3])};
this.renderer.setScissorTest(true);
if(this.renderer.autoClear){
this.renderer.clear();
}
if(!camera.parent){
camera.updateMatrixWorld();
}
camera.matrixWorld.decompose(leftCamera.position,leftCamera.quaternion,leftCamera.scale);
camera.matrixWorld.decompose(rightCamera.position,rightCamera.quaternion,rightCamera.scale);
leftCamera.translateOnAxis(leftTranslation,1);
rightCamera.translateOnAxis(rightTranslation,1);
leftCamera.projectionMatrix.elements=frameData.leftProjectionMatrix;
rightCamera.projectionMatrix.elements=frameData.rightProjectionMatrix;
var backupScene=scene.background;
var isStereoBackgroundReady=scene.backgroundLeft&&scene.backgroundRight;
if(isStereoBackgroundReady){
scene.background=scene.backgroundLeft;
}
this.renderer.setViewport(leftRect.x,leftRect.y,leftRect.width,leftRect.height);
this.renderer.setScissor(leftRect.x,leftRect.y,leftRect.width,leftRect.height);
this.renderer.render(scene,leftCamera);
if(isStereoBackgroundReady){
scene.background=scene.backgroundRight;
}
this.renderer.setViewport(rightRect.x,rightRect.y,rightRect.width,rightRect.height);
this.renderer.setScissor(rightRect.x,rightRect.y,rightRect.width,rightRect.height);
this.renderer.render(scene,rightCamera);
scene.background=backupScene;
this.renderer.setViewport(0,0,size.width,size.height);
this.renderer.setScissorTest(false);
if(preserveAutoUpdate){
scene.autoUpdate=true;
}
this.vrDisplay.submitFrame();
}
}}]);
return VREffect;
}();
exports.default=VREffect;
}, "ovrui/lib/Control/VREffect.js");
__d(34 /* ovrui/lib/FourByFourRect/FourByFourRect.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
exports.FourByFourRectGeometry=undefined;
var _ThreeShim=require(29 /* ../ThreeShim */);
var _ThreeShim2=_interopRequireDefault(_ThreeShim);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}
function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}
function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}
var BORDER_LEFT=0;
var BORDER_TOP=1;
var BORDER_RIGHT=2;
var BORDER_BOTTOM=3;
function uvWithInset(pos,inset,insetSize,direction){
var splitPos1=insetSize[direction];
var splitPos2=insetSize[direction+2];
var splitUV1=inset[direction];
var splitUV2=inset[direction+2];
if(pos<splitPos1){
return pos/splitPos1*splitUV1;
}
if(1-pos<splitPos2){
return 1-(1-pos)/splitPos2*splitUV2;
}
if(1-splitPos2===splitPos1){
return splitUV1;
}
return(pos-splitPos1)/(1-splitPos2-splitPos1)*(1-splitUV2-splitUV1)+splitUV1;
}
var FourByFourRectGeometry=exports.FourByFourRectGeometry=function(_THREE$BufferGeometry){
_inherits(FourByFourRectGeometry,_THREE$BufferGeometry);
function FourByFourRectGeometry(dims,border,cropUV,materialIndex){
_classCallCheck(this,FourByFourRectGeometry);
var _this=_possibleConstructorReturn(this,(FourByFourRectGeometry.__proto__||Object.getPrototypeOf(FourByFourRectGeometry)).call(this));
dims=dims||[1,1];
cropUV=cropUV||[0,0,1,1];
var texture=border&&border.texture||[0,0,0,0];
var factor=border&&border.factor||[0,0,0,0];
var cssBorderWidth=border&&border.cssBorderWidth||0;
var originalDim=border.originalDim||dims;
cssBorderWidth=Math.min(Math.min(originalDim[0]/2,originalDim[1]/2),cssBorderWidth);
var vertsX=0;
var vertsY=0;
var vertUVX=[0.0,0.0,0.0,0.0];
var vertUVY=[1.0,0.0,0.0,0.0];
var vertPosX=[0.0,0.0,0.0,0.0];
var vertPosY=[0.0,0.0,0.0,0.0];
var cssCropX=dims[0]>0?Math.max(cssBorderWidth-(originalDim[0]-dims[0])/2,0)/dims[0]:0;
var cssCropY=dims[1]>0?Math.max(cssBorderWidth-(originalDim[1]-dims[1])/2,0)/dims[1]:0;
var cssCrop=[cssCropX,cssCropY,cssCropX,cssCropY];
vertPosX[vertsX]=cssCrop[BORDER_LEFT];
vertUVX[vertsX++]=uvWithInset(cssCrop[BORDER_LEFT],texture,factor,0);
if(texture[BORDER_LEFT]>0.0&&factor[BORDER_LEFT]>cssCrop[BORDER_LEFT]&&factor[BORDER_LEFT]<1-cssCrop[BORDER_RIGHT]){
vertPosX[vertsX]=factor[BORDER_LEFT];
vertUVX[vertsX++]=texture[BORDER_LEFT];
}
if(texture[BORDER_RIGHT]>0.0&&factor[BORDER_RIGHT]>cssCrop[BORDER_RIGHT]&&factor[BORDER_RIGHT]<1-cssCrop[BORDER_LEFT]){
vertPosX[vertsX]=1.0-factor[BORDER_RIGHT];
vertUVX[vertsX++]=1.0-texture[BORDER_RIGHT];
}
vertPosX[vertsX]=1.0-cssCrop[BORDER_RIGHT];
vertUVX[vertsX++]=uvWithInset(1.0-cssCrop[BORDER_RIGHT],texture,factor,0);
vertPosY[vertsY]=cssCrop[BORDER_TOP];
vertUVY[vertsY++]=uvWithInset(cssCrop[BORDER_TOP],texture,factor,1);
if(texture[BORDER_TOP]>0.0&&factor[BORDER_TOP]>cssCrop[BORDER_TOP]&&factor[BORDER_TOP]<1-cssCrop[BORDER_BOTTOM]){
vertPosY[vertsY]=factor[BORDER_TOP];
vertUVY[vertsY++]=texture[BORDER_TOP];
}
if(texture[BORDER_BOTTOM]>0.0&&factor[BORDER_BOTTOM]>cssCrop[BORDER_BOTTOM]&&factor[BORDER_BOTTOM]<1-cssCrop[BORDER_TOP]){
vertPosY[vertsY]=1.0-factor[BORDER_BOTTOM];
vertUVY[vertsY++]=1.0-texture[BORDER_BOTTOM];
}
vertPosY[vertsY]=1.0-cssCrop[BORDER_BOTTOM];
vertUVY[vertsY++]=uvWithInset(1.0-cssCrop[BORDER_BOTTOM],texture,factor,1);
for(var i=0;i<vertsX;i++){
vertUVX[i]=(cropUV[2]-cropUV[0])*vertUVX[i]+cropUV[0];
}
for(var _i=0;_i<vertsY;_i++){
vertUVY[_i]=(cropUV[3]-cropUV[1])*vertUVY[_i]+cropUV[1];
}
var vertexCount=vertsX*vertsY;
var horizontal=vertsX-1;
var vertical=vertsY-1;
var positions=new Float32Array(vertexCount*3);
var uv0=new Float32Array(vertexCount*2);
for(var y=0;y<=vertical;y++){
var yPos=-(-1+vertPosY[y]*2)*(dims[1]*0.5);
var uvY=1.0-vertUVY[y];
for(var x=0;x<=horizontal;x++){
var _index=y*(horizontal+1)+x;
positions[_index*3+0]=(-1+vertPosX[x]*2)*(dims[0]*0.5);
positions[_index*3+1]=yPos;
positions[_index*3+2]=0;
uv0[_index*2+0]=vertUVX[x];
uv0[_index*2+1]=uvY;
}
}
var indices=new Uint32Array(horizontal*vertical*6);
var index=0;
for(var _y=0;_y<vertical;_y++){
for(var _x=0;_x<horizontal;_x++){
indices[index+0]=_y*(horizontal+1)+_x;
indices[index+1]=_y*(horizontal+1)+_x+1;
indices[index+2]=(_y+1)*(horizontal+1)+_x;
indices[index+3]=(_y+1)*(horizontal+1)+_x;
indices[index+4]=_y*(horizontal+1)+_x+1;
indices[index+5]=(_y+1)*(horizontal+1)+_x+1;
index+=6;
}
}
_this.addAttribute('position',new _ThreeShim2.default.BufferAttribute(positions,3));
_this.addAttribute('uv',new _ThreeShim2.default.BufferAttribute(uv0,2));
_this.addGroup(0,horizontal*vertical*6,materialIndex);
_this.setIndex(new _ThreeShim2.default.BufferAttribute(indices,1));
_this.computeBoundingSphere();
return _this;
}
return FourByFourRectGeometry;
}(_ThreeShim2.default.BufferGeometry);
}, "ovrui/lib/FourByFourRect/FourByFourRect.js");
__d(35 /* ovrui/lib/FourByFourRect/MergedBufferGeometry.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
exports.MergedBufferGeometry=MergedBufferGeometry;
var _ThreeShim=require(29 /* ../ThreeShim */);
var _ThreeShim2=_interopRequireDefault(_ThreeShim);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
function MergedBufferGeometry(geometries){
_ThreeShim2.default.BufferGeometry.apply(this);
if(!geometries){
console.warn('THREE.MergedBufferGeometry: empty geometries');
return;
}
var vertexCounts=[];
var vertexOffsets=[];
var indexOffsets=[];
var indexCount=0;
var vertexCount=0;
var attributeDefs={};
for(var i=0;i<geometries.length;i++){
var geometry=geometries[i];
vertexOffsets.push(vertexCount);
vertexCounts.push(0);
indexOffsets.push(indexCount);
indexCount+=geometry.index.count;
var attributes=geometry.attributes;
for(var key in attributes){
var arrayType=attributes[key].array.constructor.name;
if(!attributeDefs[key]){
attributeDefs[key]={
itemSize:attributes[key].itemSize,
arrayType:arrayType,
arrayConstructror:attributes[key].array.constructor};
}else{
if(attributeDefs[key].itemSize!==attributes[key].itemSize||attributeDefs[key].arrayType!==arrayType){
console.error('THREE.MergedBufferGeometry: cannot merge Geometries that attributes have different definition.');
return;
}
}
vertexCounts[i]=Math.max(vertexCounts[i],attributes[key].count);
}
vertexCount+=vertexCounts[i];
}
for(var _key in attributeDefs){
var initialAttributes=new attributeDefs[_key].arrayConstructror(vertexCount*attributeDefs[_key].itemSize);
this.addAttribute(_key,new _ThreeShim2.default.BufferAttribute(initialAttributes,attributeDefs[_key].itemSize));
}
var initialIndices=new Uint32Array(indexCount);
this.setIndex(new _ThreeShim2.default.BufferAttribute(initialIndices,1));
for(var _i=0;_i<geometries.length;_i++){
var _geometry=geometries[_i];
this.merge(_geometry,vertexOffsets[_i]);
for(var j=0,count=_geometry.index.count;j<count;j++){
this.index.array[indexOffsets[_i]+j]=_geometry.index.array[j]+vertexOffsets[_i];
}
var groups=_geometry.groups;
for(var _j=0;_j<groups.length;_j++){
var group=groups[_j];
this.addGroup(group.start+indexOffsets[_i],group.count,group.materialIndex);
}
}
this.computeBoundingSphere();
}
MergedBufferGeometry.prototype=Object.create(_ThreeShim2.default.BufferGeometry.prototype);
MergedBufferGeometry.prototype.constructor=MergedBufferGeometry;
}, "ovrui/lib/FourByFourRect/MergedBufferGeometry.js");
__d(36 /* ovrui/lib/FourByFourRect/CSSBorderGeometry.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
exports.CSSBorderGeometry=CSSBorderGeometry;
var _ThreeShim=require(29 /* ../ThreeShim */);
var _ThreeShim2=_interopRequireDefault(_ThreeShim);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
var EPSILON=1e-10;
var CORNER_COUNT=4;
var CONTROL_COUNT=8;
function sameVertex(x,y,xArray,yArray,index){
var oldX=xArray.length>index?xArray[index]:undefined;
var oldY=yArray.length>index?yArray[index]:undefined;
return oldX!==undefined&&oldY!==undefined&&Math.abs(x-oldX)<EPSILON&&Math.abs(y-oldY)<EPSILON;
}
function pushNewVertex(x,y,xArray,yArray,indexArray){
if(!sameVertex(x,y,xArray,yArray,xArray.length-1)){
xArray.push(x);
yArray.push(y);
}
indexArray.push(xArray.length-1);
}
function mergeLoop(xArray,yArray,indexArray){
var lastIndex=xArray.length-1;
if(xArray.length>1&&yArray.length>1&&sameVertex(xArray[0],yArray[0],xArray,yArray,lastIndex)){
for(var i=indexArray.length-1;i>=0&&indexArray[i]===lastIndex;i--){
indexArray[i]=0;
}
xArray.pop();
yArray.pop();
}
}
function triangleCount(value){
return value>1?value:0;
}
function CSSBorderGeometry(dims,borderWidth,borderRadius,cornerTessellationSize,zOffset,borderMaterialIndex,backgroundMaterialIndex){
_ThreeShim2.default.BufferGeometry.apply(this);
dims=dims||[1,1];
var maxWidth=Math.min(dims[0]/2,dims[1]/2);
borderWidth=Math.min(maxWidth,borderWidth||0);
borderRadius=borderRadius||[0,0,0,0];
for(var i=0;i<CORNER_COUNT;i++){
borderRadius[i]=Math.min(maxWidth,borderRadius[i]);
}
var indentX=[];
var indentY=[];
for(var _i=0;_i<CORNER_COUNT;_i++){
indentX.push(Math.max(borderWidth,borderRadius[_i]));
indentY.push(Math.max(borderWidth,borderRadius[_i]));
}
var centerX=[dims[0]-borderRadius[0],borderRadius[1],borderRadius[2],dims[0]-borderRadius[3]];
var centerY=[dims[1]-borderRadius[0],dims[1]-borderRadius[1],borderRadius[2],borderRadius[3]];
var outerControlPosX=[dims[0],dims[0]-indentX[0],indentX[1],0,0,indentX[2],dims[0]-indentX[3],dims[0]];
var outerControlPosY=[dims[1]-indentY[0],dims[1],dims[1],dims[1]-indentY[1],indentY[2],0,0,indentY[3]];
var innerControlPosX=[].concat(outerControlPosX);
innerControlPosX[0]-=borderWidth;
innerControlPosX[7]-=borderWidth;
innerControlPosX[3]+=borderWidth;
innerControlPosX[4]+=borderWidth;
var innerControlPosY=[].concat(outerControlPosY);
innerControlPosY[1]-=borderWidth;
innerControlPosY[2]-=borderWidth;
innerControlPosY[5]+=borderWidth;
innerControlPosY[6]+=borderWidth;
var cornerControlPosX=[dims[0],dims[0]-borderRadius[0],borderRadius[1],0,0,borderRadius[2],dims[0]-borderRadius[3],dims[0]];
var cornerControlPosY=[dims[1]-borderRadius[0],dims[1],dims[1],dims[1]-borderRadius[1],borderRadius[2],0,0,borderRadius[3]];
var outerVertPosX=[];
var outerVertPosY=[];
var outerIndices=[];
var innerVertPosX=[];
var innerVertPosY=[];
var innerIndices=[];
for(var _i2=0;_i2<CORNER_COUNT;_i2++){
{
var radius=borderRadius[_i2];
var begin=_i2*2;
var end=_i2*2+1;
var arcAngle=Math.PI*0.5;
var angleOffset=_i2*Math.PI*0.5;
var innerRadius=radius-borderWidth;
pushNewVertex(cornerControlPosX[begin],cornerControlPosY[begin],outerVertPosX,outerVertPosY,outerIndices);
pushNewVertex(innerControlPosX[begin],innerControlPosY[begin],innerVertPosX,innerVertPosY,innerIndices);
var tessellation=Math.ceil(radius*arcAngle/cornerTessellationSize);
if(tessellation>0){
var deltaAngle=arcAngle/tessellation;
var theta=0;
for(var j=0;j<tessellation;j++){
theta+=deltaAngle;
var angle=angleOffset+theta;
pushNewVertex(centerX[_i2]+Math.cos(angle)*radius,centerY[_i2]+Math.sin(angle)*radius,outerVertPosX,outerVertPosY,outerIndices);
if(innerRadius>0){
pushNewVertex(centerX[_i2]+Math.cos(angle)*innerRadius,centerY[_i2]+Math.sin(angle)*innerRadius,innerVertPosX,innerVertPosY,innerIndices);
}else{
pushNewVertex(innerControlPosX[begin],innerControlPosY[begin],innerVertPosX,innerVertPosY,innerIndices);
}
}
}
pushNewVertex(cornerControlPosX[end],cornerControlPosY[end],outerVertPosX,outerVertPosY,outerIndices);
pushNewVertex(innerControlPosX[end],innerControlPosY[end],innerVertPosX,innerVertPosY,innerIndices);
}
{
var _begin=_i2*2+1;
var _end=(_i2*2+2)%CONTROL_COUNT;
pushNewVertex(outerControlPosX[_begin],outerControlPosY[_begin],outerVertPosX,outerVertPosY,outerIndices);
pushNewVertex(innerControlPosX[_begin],innerControlPosY[_begin],innerVertPosX,innerVertPosY,innerIndices);
pushNewVertex(outerControlPosX[_end],outerControlPosY[_end],outerVertPosX,outerVertPosY,outerIndices);
pushNewVertex(innerControlPosX[_end],innerControlPosY[_end],innerVertPosX,innerVertPosY,innerIndices);
}
}
mergeLoop(outerVertPosX,outerVertPosY,outerIndices);
mergeLoop(innerVertPosX,innerVertPosY,innerIndices);
var vertexCount=outerVertPosX.length+innerVertPosX.length;
var positions=new Float32Array(vertexCount*3);
var uv0=new Float32Array(vertexCount*2);
var innerIndexOffset=outerVertPosX.length;
for(var _i3=0;_i3<=outerVertPosX.length;_i3++){
var _index=_i3;
positions[_index*3+0]=outerVertPosX[_index]-dims[0]*0.5;
positions[_index*3+1]=outerVertPosY[_index]-dims[1]*0.5;
positions[_index*3+2]=zOffset;
uv0[_index*2+0]=0;
uv0[_index*2+1]=0;
}
for(var _i4=0;_i4<=innerVertPosX.length;_i4++){
var _index2=innerIndexOffset+_i4;
positions[_index2*3+0]=innerVertPosX[_i4]-dims[0]*0.5;
positions[_index2*3+1]=innerVertPosY[_i4]-dims[1]*0.5;
positions[_index2*3+2]=zOffset;
uv0[_index2*2+0]=0;
uv0[_index2*2+1]=0;
}
var borderIndicesCount=borderWidth>0?3*(triangleCount(outerVertPosX.length)+triangleCount(innerVertPosX.length)):0;
var backgroundIndicesCount=3*Math.max(0,innerVertPosX.length-2);
var indices=new Uint32Array(borderIndicesCount+backgroundIndicesCount);
var index=0;
if(borderWidth>0){
for(var _i5=0;_i5<outerIndices.length;_i5++){
var _begin2=_i5;
var _end2=(_i5+1)%outerIndices.length;
if(outerIndices[_begin2]!==outerIndices[_end2]){
indices[index+0]=outerIndices[_begin2];
indices[index+1]=outerIndices[_end2];
indices[index+2]=innerIndexOffset+innerIndices[_begin2];
index+=3;
}
if(innerIndices[_begin2]!==innerIndices[_end2]){
indices[index+0]=outerIndices[_end2];
indices[index+1]=innerIndexOffset+innerIndices[_end2];
indices[index+2]=innerIndexOffset+innerIndices[_begin2];
index+=3;
}
}
}
for(var _i6=1,l=innerVertPosX.length-1;_i6<l;_i6++){
indices[index+0]=innerIndexOffset+0;
indices[index+1]=innerIndexOffset+_i6;
indices[index+2]=innerIndexOffset+_i6+1;
index+=3;
}
this.addAttribute('position',new _ThreeShim2.default.BufferAttribute(positions,3));
this.addAttribute('uv',new _ThreeShim2.default.BufferAttribute(uv0,2));
this.addGroup(0,borderIndicesCount,borderMaterialIndex);
this.addGroup(borderIndicesCount,backgroundIndicesCount,backgroundMaterialIndex);
this.setIndex(new _ThreeShim2.default.BufferAttribute(indices,1));
this.computeBoundingSphere();
}
CSSBorderGeometry.prototype=Object.create(_ThreeShim2.default.BufferGeometry.prototype);
CSSBorderGeometry.prototype.constructor=CSSBorderGeometry;
}, "ovrui/lib/FourByFourRect/CSSBorderGeometry.js");
__d(37 /* ovrui/lib/SDFFont/SDFFont.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
exports.SDFFONT_MARKER_COLOR=exports.TOP=exports.RIGHT_LINE=exports.RIGHT=exports.LEFT=exports.CENTER_LINE=exports.CENTER_FIXEDHEIGHT=exports.CENTER=exports.BOTTOM=exports.BASELINE=undefined;
exports.splitLines=splitLines;
exports.wrapLines=wrapLines;
exports.measureText=measureText;
exports.BitmapFontGeometry=BitmapFontGeometry;
exports.loadFont=loadFont;
var _ThreeShim=require(29 /* ../ThreeShim */);
var _ThreeShim2=_interopRequireDefault(_ThreeShim);
var _DefaultFont=require(38 /* ./DefaultFont */);
function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
var BASELINE=exports.BASELINE='baseline';
var BOTTOM=exports.BOTTOM='bottom';
var CENTER=exports.CENTER='center';
var CENTER_FIXEDHEIGHT=exports.CENTER_FIXEDHEIGHT='center_fixedheight';
var CENTER_LINE=exports.CENTER_LINE='center_line';
var LEFT=exports.LEFT='left';
var RIGHT=exports.RIGHT='right';
var RIGHT_LINE=exports.RIGHT_LINE='right_line';
var TOP=exports.TOP='top';
var SDFFONT_MARKER_COLOR=exports.SDFFONT_MARKER_COLOR=0;
function isBreakable(code){
return code===32||code===13||code===10;
}
function isNewLine(code){
return code===13||code===10;
}
function isWhiteSpace(code){
return code===32||code===9;
}
var vertexShader='\nvarying vec2 vUv;\nattribute vec4 fontParms;\nattribute vec4 textColors;\nvarying vec4 vFontParms;\nvarying vec4 vTextColor;\nvoid main( ) {\n vUv = uv;\n vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n vFontParms = fontParms;\n vTextColor = textColors;\n gl_Position = projectionMatrix * mvPosition;\n}\n';
var fragmentShader='\nuniform sampler2D texture;\nuniform vec4 textColor;\nvarying vec4 vTextColor;\nvarying vec4 vFontParms;\nvarying vec2 vUv;\nvoid main( void ) {\n float distance = texture2D( texture, vUv ).r;\n float ds = vFontParms.z * 255.0;\n float dd = fwidth( vUv.x ) * vFontParms.w * 16.0 * ds;\n float ALPHA_MIN = vFontParms.x - dd;\n float ALPHA_MAX = vFontParms.x + dd;\n float COLOR_MIN = vFontParms.y - dd;\n float COLOR_MAX = vFontParms.y + dd;\n float value = ( clamp( distance, COLOR_MIN, COLOR_MAX ) - COLOR_MIN ) / ( COLOR_MAX - COLOR_MIN );\n float alpha = ( clamp( distance, ALPHA_MIN, ALPHA_MAX ) - ALPHA_MIN ) / ( ALPHA_MAX - ALPHA_MIN );\n gl_FragColor = vec4(value, value, value, alpha) * vTextColor * textColor;\n}\n';
function LineBreaker(text,font,xScale){
var fallback=font.CharMap[42];
return{
text:text,
font:font,
xScale:xScale,
cursor:0,
nextBreak:function nextBreak(maxWidth){
var width=0;
if(this.cursor>=this.text.length){
return null;
}
var code=this.text.charCodeAt(this.cursor++);
if(code===SDFFONT_MARKER_COLOR){
this.cursor+=4;
if(this.cursor>=this.text.length){
return null;
}
code=this.text.charCodeAt(this.cursor++);
}
var g=this.font.CharMap[code]||fallback;
width+=g.AdvanceX*this.xScale;
if(isBreakable(code)){
return{
position:this.cursor,
required:isNewLine(code),
whitespace:isWhiteSpace(code),
split:false,
width:width};
}
code=this.text.charCodeAt(this.cursor);
if(code===SDFFONT_MARKER_COLOR){
this.cursor+=5;
code=this.text.charCodeAt(this.cursor);
}
while(this.cursor<this.text.length&&!isBreakable(code)){
var _g=this.font.CharMap[code]||fallback;
var w=_g.AdvanceX*this.xScale;
if(width+w>maxWidth){
return{
position:this.cursor,
required:false,
whitespace:false,
split:true,
width:width};
}
width+=w;
this.cursor++;
code=this.text.charCodeAt(this.cursor);
if(code===SDFFONT_MARKER_COLOR){
this.cursor+=5;
code=this.text.charCodeAt(this.cursor);
}
}
return{
position:this.cursor,
required:false,
whitespace:false,
split:false,
width:width};
}};
}
function splitLines(fontObject,text,fontHeight,maxWidth,maxHeight,maxLines){
var font=fontObject.data;
if(!font){
return[text];
}
var xScale=fontHeight/font.FontHeight;
var lineStart=0;
var lastOption=0;
var breaker=new LineBreaker(text,font,xScale);
var bk=void 0;
var lines=[];
var lineWidth=0;
while(bk=breaker.nextBreak(maxWidth)){
if(bk.whitespace&&lineWidth===0){
lineStart=bk.position;
}
if(bk.required||lineWidth!==0&&lineWidth+bk.width>maxWidth){
if(lineStart!==lastOption){
lines[lines.length]=text.slice(lineStart,lastOption).trim();
}
lineWidth=0;
lineStart=lastOption;
if(bk.whitespace){
lineStart=bk.position;
continue;
}
}
lineWidth+=bk.width;
lastOption=bk.position;
}
if(lineStart<text.length){
lines[lines.length]=text.slice(lineStart).trim();
}
if(maxLines>0){
lines.splice(maxLines);
}
if(maxHeight){
lines.splice(Math.floor(maxHeight/fontHeight));
}
return lines;
}
function wrapLines(fontObject,text,fontHeight,maxWidth,maxHeight,maxLines){
return splitLines(fontObject,text,fontHeight,maxWidth,maxHeight,maxLines).join('\n');
}
function measureText(fontObject,text,fontHeight){
var font=fontObject.data;
if(!font){
return{};
}
var dim={
maxWidth:0,
maxHeight:0,
maxDescent:0,
numLines:1,
lineWidths:[]};
var xScale=fontHeight/font.FontHeight;
var yScale=fontHeight/font.FontHeight;
var width=0;
var fallback=font.CharMap[42];
for(var i=0;i<text.length;i++){
var charCode=text.charCodeAt(i);
if(charCode===SDFFONT_MARKER_COLOR){
i+=4;
continue;
}
if(isNewLine(charCode)){
if(width>dim.maxWidth){
dim.maxWidth=width;
}
if(i!==text.length-1){
dim.maxHeight+=fontHeight;
dim.maxDescent=0;
}
dim.lineWidths[dim.lineWidths.length]=width;
width=0;
dim.numLines++;
continue;
}
var g=font.CharMap[charCode]||fallback;
var descent=(g.Height-g.BearingY)*yScale;
if(descent>dim.maxDescent){
dim.maxDescent=descent;
}
width+=g.AdvanceX*xScale;
}
if(width>dim.maxWidth){
dim.maxWidth=width;
}
if(width>0){
dim.maxHeight+=fontHeight;
dim.lineWidths[dim.lineWidths.length]=width;
}
if(dim.maxDescent>0){
dim.maxHeight+=dim.maxDescent;
}
return dim;
}
function BitmapFontGeometry(fontObject,text,fontHeight){
var config=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};
var frame=config.frame||[0,0,0,0];
var deltaZ=config.deltaZ||0;
var hAlign=config.hAlign||LEFT;
var vAlign=config.vAlign||BASELINE;
var fontParms=config.fontParms||{AlphaCenter:0.47,ColorCenter:0.49};
var dim=config.dim||measureText(fontObject,text,fontHeight);
var fontParamsAlphaCenter=Math.min(255,fontParms.AlphaCenter*255||108);
var fontParamsColorCenter=Math.min(255,fontParms.ColorCenter*255||128);
_ThreeShim2.default.BufferGeometry.apply(this);
var font=fontObject.data;
if(!font){
return;
}
var xScale=fontHeight/font.FontHeight;
var yScale=fontHeight/font.FontHeight;
var curPos=[0,0];
var numGlyphs=text.length;
var positionsBuffer=new Float32Array(numGlyphs*4*3);
var texCoordBuffer=new Float32Array(numGlyphs*4*2);
var fontParmsBuffer=new Uint8Array(numGlyphs*4*4);
var textColorBuffer=new Uint8Array(numGlyphs*4*4);
var indicesBuffer=new Uint32Array(numGlyphs*6);
if(hAlign===LEFT){
curPos[0]=frame[0];
}else if(hAlign===CENTER){
curPos[0]=frame[0]+frame[2]/2-dim.maxWidth/2;
}else if(hAlign===RIGHT){
curPos[0]=frame[0]+frame[2]-dim.maxWidth;
}
if(vAlign===BASELINE){
curPos[1]=frame[1]+dim.maxHeight-fontHeight;
}else if(vAlign===CENTER){
var ma=font.MaxAscent;
var md=font.MaxDescent;
var fh=font.FontHeight;
var maxFontExtent=ma+md+fh*(dim.numLines-1);
curPos[1]=(maxFontExtent/2-fh)*yScale;
}else if(vAlign===CENTER_FIXEDHEIGHT){
var _ma=font.MaxAscent;
var _md=font.MaxDescent;
var _fh=font.FontHeight;
var maxFontHeight=_ma+_md;
var maxTextHeight=(_fh*(dim.numLines-1)+maxFontHeight)*yScale;
curPos[1]=(maxTextHeight-fontHeight)*0.5-_md*yScale;
}else if(vAlign===TOP){
curPos[1]=frame[1]+frame[3]-fontHeight;
}else if(vAlign===BOTTOM){
curPos[1]=frame[1]+dim.maxHeight-fontHeight;
}
var startX=curPos[0];
if(hAlign===CENTER_LINE){
curPos[0]=frame[0]+frame[2]/2-dim.lineWidths[0]/2;
}else if(hAlign===RIGHT_LINE){
curPos[0]=frame[0]+frame[2]-dim.lineWidths[0];
}
var offsetZ=0.0;
var lineIndex=0;
var index=0;
var textColor=[0xff,0xff,0xff,0xff];
var fallback=font.CharMap[42];
for(var i=0;i<text.length;i++){
var charCode=text.charCodeAt(i);
if(charCode===SDFFONT_MARKER_COLOR){
textColor[0]=text.charCodeAt(i+1);
textColor[1]=text.charCodeAt(i+2);
textColor[2]=text.charCodeAt(i+3);
textColor[3]=text.charCodeAt(i+4);
i+=4;
continue;
}
if(isNewLine(charCode)){
curPos[0]=startX;
curPos[1]-=fontHeight;
lineIndex++;
if(hAlign===CENTER_LINE){
curPos[0]=frame[0]+frame[2]/2-dim.lineWidths[lineIndex]/2;
}else if(hAlign===RIGHT_LINE){
curPos[0]=frame[0]+frame[2]-dim.lineWidths[lineIndex];
}
continue;
}
var g=font.CharMap[charCode]||fallback;
var s0=g.X/font.NaturalWidth;
var t0=g.Y/font.NaturalHeight;
var s1=(g.X+g.Width)/font.NaturalWidth;
var t1=(g.Y+g.Height)/font.NaturalHeight;
var bearingX=g.BearingX*xScale;
var bearingY=g.BearingY*yScale;
var rw=(g.Width+g.BearingX)*xScale;
var rh=(g.Height-g.BearingY)*yScale;
var r=[1,0,0];
var u=[0,1,0];
positionsBuffer[index*12+0]=curPos[0]+r[0]*bearingX-u[0]*rh;
positionsBuffer[index*12+1]=curPos[1]+r[1]*bearingX-u[1]*rh;
positionsBuffer[index*12+2]=offsetZ+r[2]*bearingX-u[2]*rh;
texCoordBuffer[index*8+0]=s0;
texCoordBuffer[index*8+1]=t1;
fontParmsBuffer[index*16+0]=fontParamsAlphaCenter;
fontParmsBuffer[index*16+1]=fontParamsColorCenter;
fontParmsBuffer[index*16+2]=0x02;
fontParmsBuffer[index*16+3]=0xff;
textColorBuffer[index*16+0]=textColor[0];
textColorBuffer[index*16+1]=textColor[1];
textColorBuffer[index*16+2]=textColor[2];
textColorBuffer[index*16+3]=textColor[3];
positionsBuffer[index*12+3]=curPos[0]+r[0]*bearingX+u[0]*bearingY;
positionsBuffer[index*12+4]=curPos[1]+r[1]*bearingX+u[1]*bearingY;
positionsBuffer[index*12+5]=offsetZ+r[2]*bearingX+u[2]*bearingY;
texCoordBuffer[index*8+2]=s0;
texCoordBuffer[index*8+3]=t0;
fontParmsBuffer[index*16+4]=fontParamsAlphaCenter;
fontParmsBuffer[index*16+5]=fontParamsColorCenter;
fontParmsBuffer[index*16+6]=0x02;
fontParmsBuffer[index*16+7]=0xff;
textColorBuffer[index*16+4]=textColor[0];
textColorBuffer[index*16+5]=textColor[1];
textColorBuffer[index*16+6]=textColor[2];
textColorBuffer[index*16+7]=textColor[3];
positionsBuffer[index*12+6]=curPos[0]+r[0]*rw+u[0]*bearingY;
positionsBuffer[index*12+7]=curPos[1]+r[1]*rw+u[1]*bearingY;
positionsBuffer[index*12+8]=offsetZ+r[2]*rw+u[2]*bearingY;
texCoordBuffer[index*8+4]=s1;
texCoordBuffer[index*8+5]=t0;
fontParmsBuffer[index*16+8]=fontParamsAlphaCenter;
fontParmsBuffer[index*16+9]=fontParamsColorCenter;
fontParmsBuffer[index*16+10]=0x02;
fontParmsBuffer[index*16+11]=0xff;
textColorBuffer[index*16+8]=textColor[0];
textColorBuffer[index*16+9]=textColor[1];
textColorBuffer[index*16+10]=textColor[2];
textColorBuffer[index*16+11]=textColor[3];
positionsBuffer[index*12+9]=curPos[0]+r[0]*rw-u[0]*rh;
positionsBuffer[index*12+10]=curPos[1]+r[1]*rw-u[1]*rh;
positionsBuffer[index*12+11]=offsetZ+r[2]*rw-u[2]*rh;
texCoordBuffer[index*8+6]=s1;
texCoordBuffer[index*8+7]=t1;
fontParmsBuffer[index*16+12]=fontParamsAlphaCenter;
fontParmsBuffer[index*16+13]=fontParamsColorCenter;
fontParmsBuffer[index*16+14]=0x02;
fontParmsBuffer[index*16+15]=0xff;
textColorBuffer[index*16+12]=textColor[0];
textColorBuffer[index*16+13]=textColor[1];
textColorBuffer[index*16+14]=textColor[2];
textColorBuffer[index*16+15]=textColor[3];
indicesBuffer[index*6+0]=index*4+0;
indicesBuffer[index*6+1]=index*4+1;
indicesBuffer[index*6+2]=index*4+2;
indicesBuffer[index*6+3]=index*4+0;
indicesBuffer[index*6+4]=index*4+2;
indicesBuffer[index*6+5]=index*4+3;
index++;
curPos[0]+=g.AdvanceX*xScale;
offsetZ+=deltaZ;
}
this.addAttribute('position',new _ThreeShim2.default.BufferAttribute(positionsBuffer,3));
this.addAttribute('uv',new _ThreeShim2.default.BufferAttribute(texCoordBuffer,2));
this.addAttribute('fontParms',new _ThreeShim2.default.BufferAttribute(fontParmsBuffer,4,true));
this.addAttribute('textColors',new _ThreeShim2.default.BufferAttribute(textColorBuffer,4,true));
this.setIndex(new _ThreeShim2.default.BufferAttribute(indicesBuffer,1));
this.addGroup(0,index*6);
this.computeBoundingSphere();
}
BitmapFontGeometry.prototype=Object.create(_ThreeShim2.default.BufferGeometry.prototype);
BitmapFontGeometry.prototype.constructor=BitmapFontGeometry;
function loadFont(fontName,fontTexture,loader){
if(!fontName){
fontTexture=_DefaultFont.DEFAULT_FONT_TEXTURE;
}
var tex=new _ThreeShim2.default.TextureLoader().load(fontTexture,function(texture){
texture.wrapS=_ThreeShim2.default.ClampToEdgeWrapping;
texture.wrapT=_ThreeShim2.default.ClampToEdgeWrapping;
texture.minFilter=_ThreeShim2.default.LinearFilter;
texture.flipY=false;
});
var uniforms={
texture:{
value:tex},
textColor:{
type:'v4',
dynamic:true,
value:new _ThreeShim2.default.Vector4(),
onUpdateCallback:function onUpdateCallback(object,camera){
if(object.parent.textColor){
this.value.set(object.parent.textColor.r,object.parent.textColor.g,object.parent.textColor.b,object.opacity);
}
}}};
var material=new _ThreeShim2.default.ShaderMaterial({
uniforms:uniforms,
vertexShader:vertexShader,
fragmentShader:fragmentShader,
side:_ThreeShim2.default.DoubleSide,
extensions:{derivatives:true}});
material.blending=_ThreeShim2.default.CustomBlending;
material.blendSrc=_ThreeShim2.default.SrcAlphaFactor;
material.blendDst=_ThreeShim2.default.OneMinusSrcAlphaFactor;
material.blendEquation=_ThreeShim2.default.AddEquation;
material.depthWrite=false;
material.transparent=true;
function initFontData(data){
data.CharMap=[];
data.MaxAscent=0;
data.MaxDescent=0;
for(var g in data.Glyphs){
var glyph=data.Glyphs[g];
data.CharMap[glyph.CharCode]=glyph;
var ascent=glyph.BearingY;
var descent=glyph.Height-glyph.BearingY;
if(ascent>data.MaxAscent){
data.MaxAscent=ascent;
}
if(descent>data.MaxDescent){
data.MaxDescent=descent;
}
}
}
function getDefaultFont(){
var font={
CharMap:{},
NaturalWidth:_DefaultFont.DEFAULT_FONT_JSON.NaturalWidth,
NaturalHeight:_DefaultFont.DEFAULT_FONT_JSON.NaturalHeight,
FontHeight:_DefaultFont.DEFAULT_FONT_JSON.FontHeight,
MaxAscent:_DefaultFont.DEFAULT_FONT_JSON.MaxAscent,
MaxDescent:_DefaultFont.DEFAULT_FONT_JSON.MaxDescent};
var glyphs=_DefaultFont.DEFAULT_FONT_JSON.Glyphs;
for(var i=glyphs.length;i--;){
var glyph=glyphs[i];
var glyphData={
X:glyph[1],
Y:glyph[2],
Width:glyph[3],
Height:glyph[4],
AdvanceX:glyph[5],
AdvanceY:glyph[6],
BearingX:glyph[7],
BearingY:glyph[8]};
font.CharMap[glyph[0]]=glyphData;
}
return font;
}
var font={
data:null,
material:material};
if(!fontName){
font.data=getDefaultFont();
return font;
}
var xhrLoader=loader||new _ThreeShim2.default.XHRLoader();
return new Promise(function(resolve,reject){
xhrLoader.load(fontName,function(response){
var data=JSON.parse(response);
initFontData(data);
font.data=data;
resolve(font);
});
});
}
}, "ovrui/lib/SDFFont/SDFFont.js");
__d(38 /* ovrui/lib/SDFFont/DefaultFont.js */, function(global, require, module, exports) {
'use strict';
Object.defineProperty(exports,"__esModule",{
value:true});
var DEFAULT_FONT_TEXTURE=exports.DEFAULT_FONT_TEXTURE='data:image/png;base64,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
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment