/* Built for whs v2.2.0-beta.0 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.StatsModule = factory()); }(this, (function () { 'use strict'; function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a 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); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } function _defineProperty(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; } /* WhitestormJS Framework v2.2.0-alpha.0 */function createCommonjsModule(fn,module){return module={exports:{}},fn(module,module.exports),module.exports;}var runtime=createCommonjsModule(function(module){/** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */!function(global){var Op=Object.prototype;var hasOwn=Op.hasOwnProperty;var undefined;// More compressible than void 0. var $Symbol=typeof Symbol==="function"?Symbol:{};var iteratorSymbol=$Symbol.iterator||"@@iterator";var asyncIteratorSymbol=$Symbol.asyncIterator||"@@asyncIterator";var toStringTagSymbol=$Symbol.toStringTag||"@@toStringTag";var runtime=global.regeneratorRuntime;if(runtime){{// If regeneratorRuntime is defined globally and we're in a module, // make the exports object identical to regeneratorRuntime. module.exports=runtime;}// Don't bother evaluating the rest of this file if the runtime was // already defined globally. return;}// Define the runtime globally (as expected by generated code) as either // module.exports (if we're in a module) or a new, empty object. runtime=global.regeneratorRuntime=module.exports;function wrap(innerFn,outerFn,self,tryLocsList){// If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. var protoGenerator=outerFn&&outerFn.prototype instanceof Generator?outerFn:Generator;var generator=Object.create(protoGenerator.prototype);var context=new Context(tryLocsList||[]);// The ._invoke method unifies the implementations of the .next, // .throw, and .return methods. generator._invoke=makeInvokeMethod(innerFn,self,context);return generator;}runtime.wrap=wrap;// Try/catch helper to minimize deoptimizations. Returns a completion // record like context.tryEntries[i].completion. This interface could // have been (and was previously) designed to take a closure to be // invoked without arguments, but in all the cases we care about we // already have an existing method we want to call, so there's no need // to create a new function object. We can even get away with assuming // the method takes exactly one argument, since that happens to be true // in every case, so we don't have to touch the arguments object. The // only additional allocation required is the completion record, which // has a stable shape and so hopefully should be cheap to allocate. function tryCatch(fn,obj,arg){try{return {type:"normal",arg:fn.call(obj,arg)};}catch(err){return {type:"throw",arg:err};}}var GenStateSuspendedStart="suspendedStart";var GenStateSuspendedYield="suspendedYield";var GenStateExecuting="executing";var GenStateCompleted="completed";// Returning this object from the innerFn has the same effect as // breaking out of the dispatch switch statement. var ContinueSentinel={};// Dummy constructor functions that we use as the .constructor and // .constructor.prototype properties for functions that return Generator // objects. For full spec compliance, you may wish to configure your // minifier not to mangle the names of these two functions. function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}// This is a polyfill for %IteratorPrototype% for environments that // don't natively support it. var IteratorPrototype={};IteratorPrototype[iteratorSymbol]=function(){return this;};var getProto=Object.getPrototypeOf;var NativeIteratorPrototype=getProto&&getProto(getProto(values([])));if(NativeIteratorPrototype&&NativeIteratorPrototype!==Op&&hasOwn.call(NativeIteratorPrototype,iteratorSymbol)){// This environment has a native %IteratorPrototype%; use it instead // of the polyfill. IteratorPrototype=NativeIteratorPrototype;}var Gp=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(IteratorPrototype);GeneratorFunction.prototype=Gp.constructor=GeneratorFunctionPrototype;GeneratorFunctionPrototype.constructor=GeneratorFunction;GeneratorFunctionPrototype[toStringTagSymbol]=GeneratorFunction.displayName="GeneratorFunction";// Helper for defining the .next, .throw, and .return methods of the // Iterator interface in terms of a single ._invoke method. function defineIteratorMethods(prototype){["next","throw","return"].forEach(function(method){prototype[method]=function(arg){return this._invoke(method,arg);};});}runtime.isGeneratorFunction=function(genFun){var ctor=typeof genFun==="function"&&genFun.constructor;return ctor?ctor===GeneratorFunction||// For the native GeneratorFunction constructor, the best we can // do is to check its .name property. (ctor.displayName||ctor.name)==="GeneratorFunction":false;};runtime.mark=function(genFun){if(Object.setPrototypeOf){Object.setPrototypeOf(genFun,GeneratorFunctionPrototype);}else{genFun.__proto__=GeneratorFunctionPrototype;if(!(toStringTagSymbol in genFun)){genFun[toStringTagSymbol]="GeneratorFunction";}}genFun.prototype=Object.create(Gp);return genFun;};// Within the body of any async function, `await x` is transformed to // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test // `hasOwn.call(value, "__await")` to determine if the yielded value is // meant to be awaited. runtime.awrap=function(arg){return {__await:arg};};function AsyncIterator(generator){function invoke(method,arg,resolve,reject){var record=tryCatch(generator[method],generator,arg);if(record.type==="throw"){reject(record.arg);}else{var result=record.arg;var value=result.value;if(value&&typeof value==="object"&&hasOwn.call(value,"__await")){return Promise.resolve(value.__await).then(function(value){invoke("next",value,resolve,reject);},function(err){invoke("throw",err,resolve,reject);});}return Promise.resolve(value).then(function(unwrapped){// When a yielded Promise is resolved, its final value becomes // the .value of the Promise<{value,done}> result for the // current iteration. If the Promise is rejected, however, the // result for this iteration will be rejected with the same // reason. Note that rejections of yielded Promises are not // thrown back into the generator function, as is the case // when an awaited Promise is rejected. This difference in // behavior between yield and await is important, because it // allows the consumer to decide what to do with the yielded // rejection (swallow it and continue, manually .throw it back // into the generator, abandon iteration, whatever). With // await, by contrast, there is no opportunity to examine the // rejection reason outside the generator function, so the // only option is to throw it from the await expression, and // let the generator function handle the exception. result.value=unwrapped;resolve(result);},reject);}}var previousPromise;function enqueue(method,arg){function callInvokeWithMethodAndArg(){return new Promise(function(resolve,reject){invoke(method,arg,resolve,reject);});}return previousPromise=// If enqueue has been called before, then we want to wait until // all previous Promises have been resolved before calling invoke, // so that results are always delivered in the correct order. If // enqueue has not been called before, then it is important to // call invoke immediately, without waiting on a callback to fire, // so that the async generator function has the opportunity to do // any necessary setup in a predictable way. This predictability // is why the Promise constructor synchronously invokes its // executor callback, and why async functions synchronously // execute code before the first await. Since we implement simple // async functions in terms of async generators, it is especially // important to get this right, even though it requires care. previousPromise?previousPromise.then(callInvokeWithMethodAndArg,// Avoid propagating failures to Promises returned by later // invocations of the iterator. callInvokeWithMethodAndArg):callInvokeWithMethodAndArg();}// Define the unified helper method that is used to implement .next, // .throw, and .return (see defineIteratorMethods). this._invoke=enqueue;}defineIteratorMethods(AsyncIterator.prototype);AsyncIterator.prototype[asyncIteratorSymbol]=function(){return this;};runtime.AsyncIterator=AsyncIterator;// Note that simple async functions are implemented on top of // AsyncIterator objects; they just return a Promise for the value of // the final result produced by the iterator. runtime.async=function(innerFn,outerFn,self,tryLocsList){var iter=new AsyncIterator(wrap(innerFn,outerFn,self,tryLocsList));return runtime.isGeneratorFunction(outerFn)?iter// If outerFn is a generator, return the full iterator. :iter.next().then(function(result){return result.done?result.value:iter.next();});};function makeInvokeMethod(innerFn,self,context){var state=GenStateSuspendedStart;return function invoke(method,arg){if(state===GenStateExecuting){throw new Error("Generator is already running");}if(state===GenStateCompleted){if(method==="throw"){throw arg;}// Be forgiving, per 25.3.3.3.3 of the spec: // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume return doneResult();}context.method=method;context.arg=arg;while(true){var delegate=context.delegate;if(delegate){var delegateResult=maybeInvokeDelegate(delegate,context);if(delegateResult){if(delegateResult===ContinueSentinel)continue;return delegateResult;}}if(context.method==="next"){// Setting context._sent for legacy support of Babel's // function.sent implementation. context.sent=context._sent=context.arg;}else if(context.method==="throw"){if(state===GenStateSuspendedStart){state=GenStateCompleted;throw context.arg;}context.dispatchException(context.arg);}else if(context.method==="return"){context.abrupt("return",context.arg);}state=GenStateExecuting;var record=tryCatch(innerFn,self,context);if(record.type==="normal"){// If an exception is thrown from innerFn, we leave state === // GenStateExecuting and loop back for another invocation. state=context.done?GenStateCompleted:GenStateSuspendedYield;if(record.arg===ContinueSentinel){continue;}return {value:record.arg,done:context.done};}else if(record.type==="throw"){state=GenStateCompleted;// Dispatch the exception by looping back around to the // context.dispatchException(context.arg) call above. context.method="throw";context.arg=record.arg;}}};}// Call delegate.iterator[context.method](context.arg) and handle the // result, either by returning a { value, done } result from the // delegate iterator, or by modifying context.method and context.arg, // setting context.delegate to null, and returning the ContinueSentinel. function maybeInvokeDelegate(delegate,context){var method=delegate.iterator[context.method];if(method===undefined){// A .throw or .return when the delegate iterator has no .throw // method always terminates the yield* loop. context.delegate=null;if(context.method==="throw"){if(delegate.iterator.return){// If the delegate iterator has a return method, give it a // chance to clean up. context.method="return";context.arg=undefined;maybeInvokeDelegate(delegate,context);if(context.method==="throw"){// If maybeInvokeDelegate(context) changed context.method from // "return" to "throw", let that override the TypeError below. return ContinueSentinel;}}context.method="throw";context.arg=new TypeError("The iterator does not provide a 'throw' method");}return ContinueSentinel;}var record=tryCatch(method,delegate.iterator,context.arg);if(record.type==="throw"){context.method="throw";context.arg=record.arg;context.delegate=null;return ContinueSentinel;}var info=record.arg;if(!info){context.method="throw";context.arg=new TypeError("iterator result is not an object");context.delegate=null;return ContinueSentinel;}if(info.done){// Assign the result of the finished delegate to the temporary // variable specified by delegate.resultName (see delegateYield). context[delegate.resultName]=info.value;// Resume execution at the desired location (see delegateYield). context.next=delegate.nextLoc;// If context.method was "throw" but the delegate handled the // exception, let the outer generator proceed normally. If // context.method was "next", forget context.arg since it has been // "consumed" by the delegate iterator. If context.method was // "return", allow the original .return call to continue in the // outer generator. if(context.method!=="return"){context.method="next";context.arg=undefined;}}else{// Re-yield the result returned by the delegate method. return info;}// The delegate iterator is finished, so forget it and continue with // the outer generator. context.delegate=null;return ContinueSentinel;}// Define Generator.prototype.{next,throw,return} in terms of the // unified ._invoke helper method. defineIteratorMethods(Gp);Gp[toStringTagSymbol]="Generator";// A Generator should always return itself as the iterator object when the // @@iterator function is called on it. Some browsers' implementations of the // iterator prototype chain incorrectly implement this, causing the Generator // object to not be returned from this call. This ensures that doesn't happen. // See https://github.com/facebook/regenerator/issues/274 for more details. Gp[iteratorSymbol]=function(){return this;};Gp.toString=function(){return "[object Generator]";};function pushTryEntry(locs){var entry={tryLoc:locs[0]};if(1 in locs){entry.catchLoc=locs[1];}if(2 in locs){entry.finallyLoc=locs[2];entry.afterLoc=locs[3];}this.tryEntries.push(entry);}function resetTryEntry(entry){var record=entry.completion||{};record.type="normal";delete record.arg;entry.completion=record;}function Context(tryLocsList){// The root entry object (effectively a try statement without a catch // or a finally block) gives us a place to store values thrown from // locations where there is no enclosing try statement. this.tryEntries=[{tryLoc:"root"}];tryLocsList.forEach(pushTryEntry,this);this.reset(true);}runtime.keys=function(object){var keys=[];for(var key in object){keys.push(key);}keys.reverse();// Rather than returning an object with a next method, we keep // things simple and return the next function itself. return function next(){while(keys.length){var key=keys.pop();if(key in object){next.value=key;next.done=false;return next;}}// To avoid creating an additional object, we just hang the .value // and .done properties off the next function object itself. This // also ensures that the minifier will not anonymize the function. next.done=true;return next;};};function values(iterable){if(iterable){var iteratorMethod=iterable[iteratorSymbol];if(iteratorMethod){return iteratorMethod.call(iterable);}if(typeof iterable.next==="function"){return iterable;}if(!isNaN(iterable.length)){var i=-1,next=function next(){while(++i=0;--i){var entry=this.tryEntries[i];var record=entry.completion;if(entry.tryLoc==="root"){// Exception thrown outside of any try block that could handle // it, so set the completion value of the entire function to // throw the exception. return handle("end");}if(entry.tryLoc<=this.prev){var hasCatch=hasOwn.call(entry,"catchLoc");var hasFinally=hasOwn.call(entry,"finallyLoc");if(hasCatch&&hasFinally){if(this.prev=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc<=this.prev&&hasOwn.call(entry,"finallyLoc")&&this.prev=0;--i){var entry=this.tryEntries[i];if(entry.finallyLoc===finallyLoc){this.complete(entry.completion,entry.afterLoc);resetTryEntry(entry);return ContinueSentinel;}}},"catch":function(tryLoc){for(var i=this.tryEntries.length-1;i>=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc===tryLoc){var record=entry.completion;if(record.type==="throw"){var thrown=record.arg;resetTryEntry(entry);}return thrown;}}// The context.catch method must only be called with a location // argument that corresponds to a known catch block. throw new Error("illegal catch attempt");},delegateYield:function(iterable,resultName,nextLoc){this.delegate={iterator:values(iterable),resultName:resultName,nextLoc:nextLoc};if(this.method==="next"){// Deliberately forget the last sent value so that we don't // accidentally pass it on to the delegate. this.arg=undefined;}return ContinueSentinel;}};}(// In sloppy mode, unbound `this` refers to the global object, fallback to // Function constructor if we're in global strict mode. That is sadly a form // of indirect eval which violates Content Security Policy. function(){return this;}()||Function("return this")());});/** * Copyright (c) 2014-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ // This method of obtaining a reference to the global object needs to be // kept identical to the way it is obtained in runtime.js var g=function(){return this;}()||Function("return this")();// Use `getOwnPropertyNames` because not all browsers support calling // `hasOwnProperty` on the global `self` object in a worker. See #183. var hadRuntime=g.regeneratorRuntime&&Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime")>=0;// Save the old regeneratorRuntime in case it needs to be restored later. var oldRuntime=hadRuntime&&g.regeneratorRuntime;// Force reevalutation of runtime.js. g.regeneratorRuntime=undefined;var runtimeModule=runtime;if(hadRuntime){// Restore the original runtime. g.regeneratorRuntime=oldRuntime;}else{// Remove the global property added by runtime.js. try{delete g.regeneratorRuntime;}catch(e){g.regeneratorRuntime=undefined;}}var regenerator=runtimeModule;// 7.1.4 ToInteger var ceil=Math.ceil;var floor=Math.floor;var _toInteger=function(it){return isNaN(it=+it)?0:(it>0?floor:ceil)(it);};// 7.2.1 RequireObjectCoercible(argument) var _defined=function(it){if(it==undefined)throw TypeError("Can't call method on "+it);return it;};// true -> String#at // false -> String#codePointAt var _stringAt=function(TO_STRING){return function(that,pos){var s=String(_defined(that));var i=_toInteger(pos);var l=s.length;var a,b;if(i<0||i>=l)return TO_STRING?'':undefined;a=s.charCodeAt(i);return a<0xd800||a>0xdbff||i+1===l||(b=s.charCodeAt(i+1))<0xdc00||b>0xdfff?TO_STRING?s.charAt(i):a:TO_STRING?s.slice(i,i+2):(a-0xd800<<10)+(b-0xdc00)+0x10000;};};var _library=true;var _global=createCommonjsModule(function(module){// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 var global=module.exports=typeof window!='undefined'&&window.Math==Math?window:typeof self!='undefined'&&self.Math==Math?self// eslint-disable-next-line no-new-func :Function('return this')();if(typeof __g=='number')__g=global;// eslint-disable-line no-undef });var _core=createCommonjsModule(function(module){var core=module.exports={version:'2.5.6'};if(typeof __e=='number')__e=core;// eslint-disable-line no-undef });var _core_1=_core.version;var _aFunction=function(it){if(typeof it!='function')throw TypeError(it+' is not a function!');return it;};// optional / simple context binding var _ctx=function(fn,that,length){_aFunction(fn);if(that===undefined)return fn;switch(length){case 1:return function(a){return fn.call(that,a);};case 2:return function(a,b){return fn.call(that,a,b);};case 3:return function(a,b,c){return fn.call(that,a,b,c);};}return function()/* ...args */{return fn.apply(that,arguments);};};var _isObject=function(it){return typeof it==='object'?it!==null:typeof it==='function';};var _anObject=function(it){if(!_isObject(it))throw TypeError(it+' is not an object!');return it;};var _fails=function(exec){try{return !!exec();}catch(e){return true;}};// Thank's IE8 for his funny defineProperty var _descriptors=!_fails(function(){return Object.defineProperty({},'a',{get:function(){return 7;}}).a!=7;});var document$1=_global.document;// typeof document.createElement is 'object' in old IE var is=_isObject(document$1)&&_isObject(document$1.createElement);var _domCreate=function(it){return is?document$1.createElement(it):{};};var _ie8DomDefine=!_descriptors&&!_fails(function(){return Object.defineProperty(_domCreate('div'),'a',{get:function(){return 7;}}).a!=7;});// 7.1.1 ToPrimitive(input [, PreferredType]) // instead of the ES6 spec version, we didn't implement @@toPrimitive case // and the second argument - flag - preferred type is a string var _toPrimitive=function(it,S){if(!_isObject(it))return it;var fn,val;if(S&&typeof(fn=it.toString)=='function'&&!_isObject(val=fn.call(it)))return val;if(typeof(fn=it.valueOf)=='function'&&!_isObject(val=fn.call(it)))return val;if(!S&&typeof(fn=it.toString)=='function'&&!_isObject(val=fn.call(it)))return val;throw TypeError("Can't convert object to primitive value");};var dP=Object.defineProperty;var f=_descriptors?Object.defineProperty:function defineProperty(O,P,Attributes){_anObject(O);P=_toPrimitive(P,true);_anObject(Attributes);if(_ie8DomDefine)try{return dP(O,P,Attributes);}catch(e){/* empty */}if('get'in Attributes||'set'in Attributes)throw TypeError('Accessors not supported!');if('value'in Attributes)O[P]=Attributes.value;return O;};var _objectDp={f:f};var _propertyDesc=function(bitmap,value){return {enumerable:!(bitmap&1),configurable:!(bitmap&2),writable:!(bitmap&4),value:value};};var _hide=_descriptors?function(object,key,value){return _objectDp.f(object,key,_propertyDesc(1,value));}:function(object,key,value){object[key]=value;return object;};var hasOwnProperty={}.hasOwnProperty;var _has=function(it,key){return hasOwnProperty.call(it,key);};var PROTOTYPE='prototype';var $export=function(type,name,source){var IS_FORCED=type&$export.F;var IS_GLOBAL=type&$export.G;var IS_STATIC=type&$export.S;var IS_PROTO=type&$export.P;var IS_BIND=type&$export.B;var IS_WRAP=type&$export.W;var exports=IS_GLOBAL?_core:_core[name]||(_core[name]={});var expProto=exports[PROTOTYPE];var target=IS_GLOBAL?_global:IS_STATIC?_global[name]:(_global[name]||{})[PROTOTYPE];var key,own,out;if(IS_GLOBAL)source=name;for(key in source){// contains in native own=!IS_FORCED&&target&&target[key]!==undefined;if(own&&_has(exports,key))continue;// export native or passed out=own?target[key]:source[key];// prevent global pollution for namespaces exports[key]=IS_GLOBAL&&typeof target[key]!='function'?source[key]// bind timers to global for call from export context :IS_BIND&&own?_ctx(out,_global)// wrap global constructors for prevent change them in library :IS_WRAP&&target[key]==out?function(C){var F=function(a,b,c){if(this instanceof C){switch(arguments.length){case 0:return new C();case 1:return new C(a);case 2:return new C(a,b);}return new C(a,b,c);}return C.apply(this,arguments);};F[PROTOTYPE]=C[PROTOTYPE];return F;// make static versions for prototype methods }(out):IS_PROTO&&typeof out=='function'?_ctx(Function.call,out):out;// export proto methods to core.%CONSTRUCTOR%.methods.%NAME% if(IS_PROTO){(exports.virtual||(exports.virtual={}))[key]=out;// export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% if(type&$export.R&&expProto&&!expProto[key])_hide(expProto,key,out);}}};// type bitmap $export.F=1;// forced $export.G=2;// global $export.S=4;// static $export.P=8;// proto $export.B=16;// bind $export.W=32;// wrap $export.U=64;// safe $export.R=128;// real proto method for `library` var _export=$export;var _redefine=_hide;var _iterators={};var toString={}.toString;var _cof=function(it){return toString.call(it).slice(8,-1);};// fallback for non-array-like ES3 and non-enumerable old V8 strings // eslint-disable-next-line no-prototype-builtins var _iobject=Object('z').propertyIsEnumerable(0)?Object:function(it){return _cof(it)=='String'?it.split(''):Object(it);};// to indexed object, toObject with fallback for non-array-like ES3 strings var _toIobject=function(it){return _iobject(_defined(it));};// 7.1.15 ToLength var min=Math.min;var _toLength=function(it){return it>0?min(_toInteger(it),0x1fffffffffffff):0;// pow(2, 53) - 1 == 9007199254740991 };var max=Math.max;var min$1=Math.min;var _toAbsoluteIndex=function(index,length){index=_toInteger(index);return index<0?max(index+length,0):min$1(index,length);};// false -> Array#indexOf // true -> Array#includes var _arrayIncludes=function(IS_INCLUDES){return function($this,el,fromIndex){var O=_toIobject($this);var length=_toLength(O.length);var index=_toAbsoluteIndex(fromIndex,length);var value;// Array#includes uses SameValueZero equality algorithm // eslint-disable-next-line no-self-compare if(IS_INCLUDES&&el!=el)while(length>index){value=O[index++];// eslint-disable-next-line no-self-compare if(value!=value)return true;// Array#indexOf ignores holes, Array#includes - not }else for(;length>index;index++)if(IS_INCLUDES||index in O){if(O[index]===el)return IS_INCLUDES||index||0;}return !IS_INCLUDES&&-1;};};var _shared=createCommonjsModule(function(module){var SHARED='__core-js_shared__';var store=_global[SHARED]||(_global[SHARED]={});(module.exports=function(key,value){return store[key]||(store[key]=value!==undefined?value:{});})('versions',[]).push({version:_core.version,mode:'pure',copyright:'© 2018 Denis Pushkarev (zloirock.ru)'});});var id$1=0;var px=Math.random();var _uid=function(key){return 'Symbol('.concat(key===undefined?'':key,')_',(++id$1+px).toString(36));};var shared=_shared('keys');var _sharedKey=function(key){return shared[key]||(shared[key]=_uid(key));};var arrayIndexOf=_arrayIncludes(false);var IE_PROTO=_sharedKey('IE_PROTO');var _objectKeysInternal=function(object,names){var O=_toIobject(object);var i=0;var result=[];var key;for(key in O)if(key!=IE_PROTO)_has(O,key)&&result.push(key);// Don't enum bug & hidden keys while(names.length>i)if(_has(O,key=names[i++])){~arrayIndexOf(result,key)||result.push(key);}return result;};// IE 8- don't enum bug keys var _enumBugKeys='constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');// 19.1.2.14 / 15.2.3.14 Object.keys(O) var _objectKeys=Object.keys||function keys(O){return _objectKeysInternal(O,_enumBugKeys);};var _objectDps=_descriptors?Object.defineProperties:function defineProperties(O,Properties){_anObject(O);var keys=_objectKeys(Properties);var length=keys.length;var i=0;var P;while(length>i)_objectDp.f(O,P=keys[i++],Properties[P]);return O;};var document$2=_global.document;var _html=document$2&&document$2.documentElement;// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) var IE_PROTO$1=_sharedKey('IE_PROTO');var Empty=function(){/* empty */};var PROTOTYPE$1='prototype';// Create object with fake `null` prototype: use iframe Object with cleared prototype var createDict=function(){// Thrash, waste and sodomy: IE GC bug var iframe=_domCreate('iframe');var i=_enumBugKeys.length;var lt='<';var gt='>';var iframeDocument;iframe.style.display='none';_html.appendChild(iframe);iframe.src='javascript:';// eslint-disable-line no-script-url // createDict = iframe.contentWindow.Object; // html.removeChild(iframe); iframeDocument=iframe.contentWindow.document;iframeDocument.open();iframeDocument.write(lt+'script'+gt+'document.F=Object'+lt+'/script'+gt);iframeDocument.close();createDict=iframeDocument.F;while(i--)delete createDict[PROTOTYPE$1][_enumBugKeys[i]];return createDict();};var _objectCreate=Object.create||function create(O,Properties){var result;if(O!==null){Empty[PROTOTYPE$1]=_anObject(O);result=new Empty();Empty[PROTOTYPE$1]=null;// add "__proto__" for Object.getPrototypeOf polyfill result[IE_PROTO$1]=O;}else result=createDict();return Properties===undefined?result:_objectDps(result,Properties);};var _wks=createCommonjsModule(function(module){var store=_shared('wks');var Symbol=_global.Symbol;var USE_SYMBOL=typeof Symbol=='function';var $exports=module.exports=function(name){return store[name]||(store[name]=USE_SYMBOL&&Symbol[name]||(USE_SYMBOL?Symbol:_uid)('Symbol.'+name));};$exports.store=store;});var def=_objectDp.f;var TAG=_wks('toStringTag');var _setToStringTag=function(it,tag,stat){if(it&&!_has(it=stat?it:it.prototype,TAG))def(it,TAG,{configurable:true,value:tag});};var IteratorPrototype={};// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() _hide(IteratorPrototype,_wks('iterator'),function(){return this;});var _iterCreate=function(Constructor,NAME,next){Constructor.prototype=_objectCreate(IteratorPrototype,{next:_propertyDesc(1,next)});_setToStringTag(Constructor,NAME+' Iterator');};// 7.1.13 ToObject(argument) var _toObject=function(it){return Object(_defined(it));};// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) var IE_PROTO$2=_sharedKey('IE_PROTO');var ObjectProto=Object.prototype;var _objectGpo=Object.getPrototypeOf||function(O){O=_toObject(O);if(_has(O,IE_PROTO$2))return O[IE_PROTO$2];if(typeof O.constructor=='function'&&O instanceof O.constructor){return O.constructor.prototype;}return O instanceof Object?ObjectProto:null;};var ITERATOR=_wks('iterator');var BUGGY=!([].keys&&'next'in[].keys());// Safari has buggy iterators w/o `next` var FF_ITERATOR='@@iterator';var KEYS='keys';var VALUES='values';var returnThis=function(){return this;};var _iterDefine=function(Base,NAME,Constructor,next,DEFAULT,IS_SET,FORCED){_iterCreate(Constructor,NAME,next);var getMethod=function(kind){if(!BUGGY&&kind in proto)return proto[kind];switch(kind){case KEYS:return function keys(){return new Constructor(this,kind);};case VALUES:return function values(){return new Constructor(this,kind);};}return function entries(){return new Constructor(this,kind);};};var TAG=NAME+' Iterator';var DEF_VALUES=DEFAULT==VALUES;var VALUES_BUG=false;var proto=Base.prototype;var $native=proto[ITERATOR]||proto[FF_ITERATOR]||DEFAULT&&proto[DEFAULT];var $default=$native||getMethod(DEFAULT);var $entries=DEFAULT?!DEF_VALUES?$default:getMethod('entries'):undefined;var $anyNative=NAME=='Array'?proto.entries||$native:$native;var methods,key,IteratorPrototype;// Fix native if($anyNative){IteratorPrototype=_objectGpo($anyNative.call(new Base()));if(IteratorPrototype!==Object.prototype&&IteratorPrototype.next){// Set @@toStringTag to native iterators _setToStringTag(IteratorPrototype,TAG,true);// fix for some old engines }}// fix Array#{values, @@iterator}.name in V8 / FF if(DEF_VALUES&&$native&&$native.name!==VALUES){VALUES_BUG=true;$default=function values(){return $native.call(this);};}// Define iterator if((FORCED)&&(BUGGY||VALUES_BUG||!proto[ITERATOR])){_hide(proto,ITERATOR,$default);}// Plug for library _iterators[NAME]=$default;_iterators[TAG]=returnThis;if(DEFAULT){methods={values:DEF_VALUES?$default:getMethod(VALUES),keys:IS_SET?$default:getMethod(KEYS),entries:$entries};if(FORCED)for(key in methods){if(!(key in proto))_redefine(proto,key,methods[key]);}else _export(_export.P+_export.F*(BUGGY||VALUES_BUG),NAME,methods);}return methods;};var $at=_stringAt(true);// 21.1.3.27 String.prototype[@@iterator]() _iterDefine(String,'String',function(iterated){this._t=String(iterated);// target this._i=0;// next index // 21.1.5.2.1 %StringIteratorPrototype%.next() },function(){var O=this._t;var index=this._i;var point;if(index>=O.length)return {value:undefined,done:true};point=$at(O,index);this._i+=point.length;return {value:point,done:false};});var _iterStep=function(done,value){return {value:value,done:!!done};};// 22.1.3.4 Array.prototype.entries() // 22.1.3.13 Array.prototype.keys() // 22.1.3.29 Array.prototype.values() // 22.1.3.30 Array.prototype[@@iterator]() var es6_array_iterator=_iterDefine(Array,'Array',function(iterated,kind){this._t=_toIobject(iterated);// target this._i=0;// next index this._k=kind;// kind // 22.1.5.2.1 %ArrayIteratorPrototype%.next() },function(){var O=this._t;var kind=this._k;var index=this._i++;if(!O||index>=O.length){this._t=undefined;return _iterStep(1);}if(kind=='keys')return _iterStep(0,index);if(kind=='values')return _iterStep(0,O[index]);return _iterStep(0,[index,O[index]]);},'values');// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) _iterators.Arguments=_iterators.Array;var TO_STRING_TAG=_wks('toStringTag');var DOMIterables=('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,'+'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,'+'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,'+'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,'+'TextTrackList,TouchList').split(',');for(var i=0;iindex;index++){result=entries?f(_anObject(step=iterable[index])[0],step[1]):f(iterable[index]);if(result===BREAK||result===RETURN)return result;}else for(iterator=iterFn.call(iterable);!(step=iterator.next()).done;){result=_iterCall(iterator,f,step.value,entries);if(result===BREAK||result===RETURN)return result;}};exports.BREAK=BREAK;exports.RETURN=RETURN;});// 7.3.20 SpeciesConstructor(O, defaultConstructor) var SPECIES=_wks('species');var _speciesConstructor=function(O,D){var C=_anObject(O).constructor;var S;return C===undefined||(S=_anObject(C)[SPECIES])==undefined?D:_aFunction(S);};// fast apply, http://jsperf.lnkit.com/fast-apply/5 var _invoke=function(fn,args,that){var un=that===undefined;switch(args.length){case 0:return un?fn():fn.call(that);case 1:return un?fn(args[0]):fn.call(that,args[0]);case 2:return un?fn(args[0],args[1]):fn.call(that,args[0],args[1]);case 3:return un?fn(args[0],args[1],args[2]):fn.call(that,args[0],args[1],args[2]);case 4:return un?fn(args[0],args[1],args[2],args[3]):fn.call(that,args[0],args[1],args[2],args[3]);}return fn.apply(that,args);};var process=_global.process;var setTask=_global.setImmediate;var clearTask=_global.clearImmediate;var MessageChannel=_global.MessageChannel;var Dispatch=_global.Dispatch;var counter=0;var queue={};var ONREADYSTATECHANGE='onreadystatechange';var defer,channel,port;var run=function(){var id=+this;// eslint-disable-next-line no-prototype-builtins if(queue.hasOwnProperty(id)){var fn=queue[id];delete queue[id];fn();}};var listener=function(event){run.call(event.data);};// Node.js 0.9+ & IE10+ has setImmediate, otherwise: if(!setTask||!clearTask){setTask=function setImmediate(fn){var args=[];var i=1;while(arguments.length>i)args.push(arguments[i++]);queue[++counter]=function(){// eslint-disable-next-line no-new-func _invoke(typeof fn=='function'?fn:Function(fn),args);};defer(counter);return counter;};clearTask=function clearImmediate(id){delete queue[id];};// Node.js 0.8- if(_cof(process)=='process'){defer=function(id){process.nextTick(_ctx(run,id,1));};// Sphere (JS game engine) Dispatch API }else if(Dispatch&&Dispatch.now){defer=function(id){Dispatch.now(_ctx(run,id,1));};// Browsers with MessageChannel, includes WebWorkers }else if(MessageChannel){channel=new MessageChannel();port=channel.port2;channel.port1.onmessage=listener;defer=_ctx(port.postMessage,port,1);// Browsers with postMessage, skip WebWorkers // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' }else if(_global.addEventListener&&typeof postMessage=='function'&&!_global.importScripts){defer=function(id){_global.postMessage(id+'','*');};_global.addEventListener('message',listener,false);// IE8- }else if(ONREADYSTATECHANGE in _domCreate('script')){defer=function(id){_html.appendChild(_domCreate('script'))[ONREADYSTATECHANGE]=function(){_html.removeChild(this);run.call(id);};};// Rest old browsers }else{defer=function(id){setTimeout(_ctx(run,id,1),0);};}}var _task={set:setTask,clear:clearTask};var macrotask=_task.set;var Observer=_global.MutationObserver||_global.WebKitMutationObserver;var process$1=_global.process;var Promise$1=_global.Promise;var isNode=_cof(process$1)=='process';var _microtask=function(){var head,last,notify;var flush=function(){var parent,fn;if(isNode&&(parent=process$1.domain))parent.exit();while(head){fn=head.fn;head=head.next;try{fn();}catch(e){if(head)notify();else last=undefined;throw e;}}last=undefined;if(parent)parent.enter();};// Node.js if(isNode){notify=function(){process$1.nextTick(flush);};// browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339 }else if(Observer&&!(_global.navigator&&_global.navigator.standalone)){var toggle=true;var node=document.createTextNode('');new Observer(flush).observe(node,{characterData:true});// eslint-disable-line no-new notify=function(){node.data=toggle=!toggle;};// environments with maybe non-completely correct, but existent Promise }else if(Promise$1&&Promise$1.resolve){// Promise.resolve without an argument throws an error in LG WebOS 2 var promise=Promise$1.resolve(undefined);notify=function(){promise.then(flush);};// for other environments - macrotask based on: // - setImmediate // - MessageChannel // - window.postMessag // - onreadystatechange // - setTimeout }else{notify=function(){// strange IE + webpack dev server bug - use .call(global) macrotask.call(_global,flush);};}return function(fn){var task={fn:fn,next:undefined};if(last)last.next=task;if(!head){head=task;notify();}last=task;};};// 25.4.1.5 NewPromiseCapability(C) function PromiseCapability(C){var resolve,reject;this.promise=new C(function($$resolve,$$reject){if(resolve!==undefined||reject!==undefined)throw TypeError('Bad Promise constructor');resolve=$$resolve;reject=$$reject;});this.resolve=_aFunction(resolve);this.reject=_aFunction(reject);}var f$1=function(C){return new PromiseCapability(C);};var _newPromiseCapability={f:f$1};var _perform=function(exec){try{return {e:false,v:exec()};}catch(e){return {e:true,v:e};}};var navigator=_global.navigator;var _userAgent=navigator&&navigator.userAgent||'';var _promiseResolve=function(C,x){_anObject(C);if(_isObject(x)&&x.constructor===C)return x;var promiseCapability=_newPromiseCapability.f(C);var resolve=promiseCapability.resolve;resolve(x);return promiseCapability.promise;};var _redefineAll=function(target,src,safe){for(var key in src){if(safe&&target[key])target[key]=src[key];else _hide(target,key,src[key]);}return target;};var SPECIES$1=_wks('species');var _setSpecies=function(KEY){var C=typeof _core[KEY]=='function'?_core[KEY]:_global[KEY];if(_descriptors&&C&&!C[SPECIES$1])_objectDp.f(C,SPECIES$1,{configurable:true,get:function(){return this;}});};var ITERATOR$3=_wks('iterator');var SAFE_CLOSING=false;try{var riter=[7][ITERATOR$3]();riter['return']=function(){SAFE_CLOSING=true;};}catch(e){/* empty */}var _iterDetect=function(exec,skipClosing){if(!skipClosing&&!SAFE_CLOSING)return false;var safe=false;try{var arr=[7];var iter=arr[ITERATOR$3]();iter.next=function(){return {done:safe=true};};arr[ITERATOR$3]=function(){return iter;};exec(arr);}catch(e){/* empty */}return safe;};var task=_task.set;var microtask=_microtask();var PROMISE='Promise';var TypeError$1=_global.TypeError;var process$2=_global.process;var versions=process$2&&process$2.versions;var v8=versions&&versions.v8||'';var $Promise=_global[PROMISE];var isNode$1=_classof(process$2)=='process';var empty=function(){/* empty */};var Internal,newGenericPromiseCapability,OwnPromiseCapability,Wrapper;var newPromiseCapability=newGenericPromiseCapability=_newPromiseCapability.f;var USE_NATIVE=!!function(){try{// correct subclassing with @@species support var promise=$Promise.resolve(1);var FakePromise=(promise.constructor={})[_wks('species')]=function(exec){exec(empty,empty);};// unhandled rejections tracking support, NodeJS Promise without it fails @@species test return (isNode$1||typeof PromiseRejectionEvent=='function')&&promise.then(empty)instanceof FakePromise// v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables // https://bugs.chromium.org/p/chromium/issues/detail?id=830565 // we can't detect it synchronously, so just check versions &&v8.indexOf('6.6')!==0&&_userAgent.indexOf('Chrome/66')===-1;}catch(e){/* empty */}}();// helpers var isThenable=function(it){var then;return _isObject(it)&&typeof(then=it.then)=='function'?then:false;};var notify=function(promise,isReject){if(promise._n)return;promise._n=true;var chain=promise._c;microtask(function(){var value=promise._v;var ok=promise._s==1;var i=0;var run=function(reaction){var handler=ok?reaction.ok:reaction.fail;var resolve=reaction.resolve;var reject=reaction.reject;var domain=reaction.domain;var result,then,exited;try{if(handler){if(!ok){if(promise._h==2)onHandleUnhandled(promise);promise._h=1;}if(handler===true)result=value;else{if(domain)domain.enter();result=handler(value);// may throw if(domain){domain.exit();exited=true;}}if(result===reaction.promise){reject(TypeError$1('Promise-chain cycle'));}else if(then=isThenable(result)){then.call(result,resolve,reject);}else resolve(result);}else reject(value);}catch(e){if(domain&&!exited)domain.exit();reject(e);}};while(chain.length>i)run(chain[i++]);// variable length - can't use forEach promise._c=[];promise._n=false;if(isReject&&!promise._h)onUnhandled(promise);});};var onUnhandled=function(promise){task.call(_global,function(){var value=promise._v;var unhandled=isUnhandled(promise);var result,handler,console;if(unhandled){result=_perform(function(){if(isNode$1){process$2.emit('unhandledRejection',value,promise);}else if(handler=_global.onunhandledrejection){handler({promise:promise,reason:value});}else if((console=_global.console)&&console.error){console.error('Unhandled promise rejection',value);}});// Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should promise._h=isNode$1||isUnhandled(promise)?2:1;}promise._a=undefined;if(unhandled&&result.e)throw result.v;});};var isUnhandled=function(promise){return promise._h!==1&&(promise._a||promise._c).length===0;};var onHandleUnhandled=function(promise){task.call(_global,function(){var handler;if(isNode$1){process$2.emit('rejectionHandled',promise);}else if(handler=_global.onrejectionhandled){handler({promise:promise,reason:promise._v});}});};var $reject=function(value){var promise=this;if(promise._d)return;promise._d=true;promise=promise._w||promise;// unwrap promise._v=value;promise._s=2;if(!promise._a)promise._a=promise._c.slice();notify(promise,true);};var $resolve=function(value){var promise=this;var then;if(promise._d)return;promise._d=true;promise=promise._w||promise;// unwrap try{if(promise===value)throw TypeError$1("Promise can't be resolved itself");if(then=isThenable(value)){microtask(function(){var wrapper={_w:promise,_d:false};// wrap try{then.call(value,_ctx($resolve,wrapper,1),_ctx($reject,wrapper,1));}catch(e){$reject.call(wrapper,e);}});}else{promise._v=value;promise._s=1;notify(promise,false);}}catch(e){$reject.call({_w:promise,_d:false},e);// wrap }};// constructor polyfill if(!USE_NATIVE){// 25.4.3.1 Promise(executor) $Promise=function Promise(executor){_anInstance(this,$Promise,PROMISE,'_h');_aFunction(executor);Internal.call(this);try{executor(_ctx($resolve,this,1),_ctx($reject,this,1));}catch(err){$reject.call(this,err);}};// eslint-disable-next-line no-unused-vars Internal=function Promise(executor){this._c=[];// <- awaiting reactions this._a=undefined;// <- checked in isUnhandled reactions this._s=0;// <- state this._d=false;// <- done this._v=undefined;// <- value this._h=0;// <- rejection state, 0 - default, 1 - handled, 2 - unhandled this._n=false;// <- notify };Internal.prototype=_redefineAll($Promise.prototype,{// 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) then:function then(onFulfilled,onRejected){var reaction=newPromiseCapability(_speciesConstructor(this,$Promise));reaction.ok=typeof onFulfilled=='function'?onFulfilled:true;reaction.fail=typeof onRejected=='function'&&onRejected;reaction.domain=isNode$1?process$2.domain:undefined;this._c.push(reaction);if(this._a)this._a.push(reaction);if(this._s)notify(this,false);return reaction.promise;},// 25.4.5.1 Promise.prototype.catch(onRejected) 'catch':function(onRejected){return this.then(undefined,onRejected);}});OwnPromiseCapability=function(){var promise=new Internal();this.promise=promise;this.resolve=_ctx($resolve,promise,1);this.reject=_ctx($reject,promise,1);};_newPromiseCapability.f=newPromiseCapability=function(C){return C===$Promise||C===Wrapper?new OwnPromiseCapability(C):newGenericPromiseCapability(C);};}_export(_export.G+_export.W+_export.F*!USE_NATIVE,{Promise:$Promise});_setToStringTag($Promise,PROMISE);_setSpecies(PROMISE);Wrapper=_core[PROMISE];// statics _export(_export.S+_export.F*!USE_NATIVE,PROMISE,{// 25.4.4.5 Promise.reject(r) reject:function reject(r){var capability=newPromiseCapability(this);var $$reject=capability.reject;$$reject(r);return capability.promise;}});_export(_export.S+_export.F*(_library),PROMISE,{// 25.4.4.6 Promise.resolve(x) resolve:function resolve(x){return _promiseResolve(this===Wrapper?$Promise:this,x);}});_export(_export.S+_export.F*!(USE_NATIVE&&_iterDetect(function(iter){$Promise.all(iter)['catch'](empty);})),PROMISE,{// 25.4.4.1 Promise.all(iterable) all:function all(iterable){var C=this;var capability=newPromiseCapability(C);var resolve=capability.resolve;var reject=capability.reject;var result=_perform(function(){var values=[];var index=0;var remaining=1;_forOf(iterable,false,function(promise){var $index=index++;var alreadyCalled=false;values.push(undefined);remaining++;C.resolve(promise).then(function(value){if(alreadyCalled)return;alreadyCalled=true;values[$index]=value;--remaining||resolve(values);},reject);});--remaining||resolve(values);});if(result.e)reject(result.v);return capability.promise;},// 25.4.4.4 Promise.race(iterable) race:function race(iterable){var C=this;var capability=newPromiseCapability(C);var reject=capability.reject;var result=_perform(function(){_forOf(iterable,false,function(promise){C.resolve(promise).then(capability.resolve,reject);});});if(result.e)reject(result.v);return capability.promise;}});_export(_export.P+_export.R,'Promise',{'finally':function(onFinally){var C=_speciesConstructor(this,_core.Promise||_global.Promise);var isFunction=typeof onFinally=='function';return this.then(isFunction?function(x){return _promiseResolve(C,onFinally()).then(function(){return x;});}:onFinally,isFunction?function(e){return _promiseResolve(C,onFinally()).then(function(){throw e;});}:onFinally);}});// https://github.com/tc39/proposal-promise-try _export(_export.S,'Promise',{'try':function(callbackfn){var promiseCapability=_newPromiseCapability.f(this);var result=_perform(callbackfn);(result.e?promiseCapability.reject:promiseCapability.resolve)(result.v);return promiseCapability.promise;}});var promise=_core.Promise;var promise$1=promise;function _asyncToGenerator$1(fn){return function(){var self=this,args=arguments;return new promise$1(function(resolve,reject){var gen=fn.apply(self,args);function step(key,arg){try{var info=gen[key](arg);var value=info.value;}catch(error){reject(error);return;}if(info.done){resolve(value);}else{promise$1.resolve(value).then(_next,_throw);}}function _next(value){step("next",value);}function _throw(err){step("throw",err);}_next();});};}var asyncToGenerator=_asyncToGenerator$1;var f$2={}.propertyIsEnumerable;var _objectPie={f:f$2};var gOPD=Object.getOwnPropertyDescriptor;var f$3=_descriptors?gOPD:function getOwnPropertyDescriptor(O,P){O=_toIobject(O);P=_toPrimitive(P,true);if(_ie8DomDefine)try{return gOPD(O,P);}catch(e){/* empty */}if(_has(O,P))return _propertyDesc(!_objectPie.f.call(O,P),O[P]);};var _objectGopd={f:f$3};// most Object methods by ES6 should accept primitives var _objectSap=function(KEY,exec){var fn=(_core.Object||{})[KEY]||Object[KEY];var exp={};exp[KEY]=exec(fn);_export(_export.S+_export.F*_fails(function(){fn(1);}),'Object',exp);};// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) var $getOwnPropertyDescriptor=_objectGopd.f;_objectSap('getOwnPropertyDescriptor',function(){return function getOwnPropertyDescriptor(it,key){return $getOwnPropertyDescriptor(_toIobject(it),key);};});var $Object=_core.Object;var getOwnPropertyDescriptor=function getOwnPropertyDescriptor(it,key){return $Object.getOwnPropertyDescriptor(it,key);};var getOwnPropertyDescriptor$1=getOwnPropertyDescriptor;var _meta=createCommonjsModule(function(module){var META=_uid('meta');var setDesc=_objectDp.f;var id=0;var isExtensible=Object.isExtensible||function(){return true;};var FREEZE=!_fails(function(){return isExtensible(Object.preventExtensions({}));});var setMeta=function(it){setDesc(it,META,{value:{i:'O'+ ++id,// object ID w:{}// weak collections IDs }});};var fastKey=function(it,create){// return primitive with prefix if(!_isObject(it))return typeof it=='symbol'?it:(typeof it=='string'?'S':'P')+it;if(!_has(it,META)){// can't set metadata to uncaught frozen object if(!isExtensible(it))return 'F';// not necessary to add metadata if(!create)return 'E';// add missing metadata setMeta(it);// return object ID }return it[META].i;};var getWeak=function(it,create){if(!_has(it,META)){// can't set metadata to uncaught frozen object if(!isExtensible(it))return true;// not necessary to add metadata if(!create)return false;// add missing metadata setMeta(it);// return hash weak collections IDs }return it[META].w;};// add metadata on freeze-family methods calling var onFreeze=function(it){if(FREEZE&&meta.NEED&&isExtensible(it)&&!_has(it,META))setMeta(it);return it;};var meta=module.exports={KEY:META,NEED:false,fastKey:fastKey,getWeak:getWeak,onFreeze:onFreeze};});var _meta_1=_meta.KEY;var _meta_2=_meta.NEED;var _meta_3=_meta.fastKey;var _meta_4=_meta.getWeak;var _meta_5=_meta.onFreeze;var f$4=_wks;var _wksExt={f:f$4};var defineProperty=_objectDp.f;var _wksDefine=function(name){var $Symbol=_core.Symbol||(_core.Symbol={});if(name.charAt(0)!='_'&&!(name in $Symbol))defineProperty($Symbol,name,{value:_wksExt.f(name)});};var f$5=Object.getOwnPropertySymbols;var _objectGops={f:f$5};// all enumerable object keys, includes symbols var _enumKeys=function(it){var result=_objectKeys(it);var getSymbols=_objectGops.f;if(getSymbols){var symbols=getSymbols(it);var isEnum=_objectPie.f;var i=0;var key;while(symbols.length>i)if(isEnum.call(it,key=symbols[i++]))result.push(key);}return result;};// 7.2.2 IsArray(argument) var _isArray=Array.isArray||function isArray(arg){return _cof(arg)=='Array';};// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) var hiddenKeys=_enumBugKeys.concat('length','prototype');var f$6=Object.getOwnPropertyNames||function getOwnPropertyNames(O){return _objectKeysInternal(O,hiddenKeys);};var _objectGopn={f:f$6};// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window var gOPN=_objectGopn.f;var toString$1={}.toString;var windowNames=typeof window=='object'&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];var getWindowNames=function(it){try{return gOPN(it);}catch(e){return windowNames.slice();}};var f$7=function getOwnPropertyNames(it){return windowNames&&toString$1.call(it)=='[object Window]'?getWindowNames(it):gOPN(_toIobject(it));};var _objectGopnExt={f:f$7};// ECMAScript 6 symbols shim var META=_meta.KEY;var gOPD$1=_objectGopd.f;var dP$1=_objectDp.f;var gOPN$1=_objectGopnExt.f;var $Symbol=_global.Symbol;var $JSON=_global.JSON;var _stringify=$JSON&&$JSON.stringify;var PROTOTYPE$2='prototype';var HIDDEN=_wks('_hidden');var TO_PRIMITIVE=_wks('toPrimitive');var isEnum={}.propertyIsEnumerable;var SymbolRegistry=_shared('symbol-registry');var AllSymbols=_shared('symbols');var OPSymbols=_shared('op-symbols');var ObjectProto$1=Object[PROTOTYPE$2];var USE_NATIVE$1=typeof $Symbol=='function';var QObject=_global.QObject;// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 var setter=!QObject||!QObject[PROTOTYPE$2]||!QObject[PROTOTYPE$2].findChild;// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 var setSymbolDesc=_descriptors&&_fails(function(){return _objectCreate(dP$1({},'a',{get:function(){return dP$1(this,'a',{value:7}).a;}})).a!=7;})?function(it,key,D){var protoDesc=gOPD$1(ObjectProto$1,key);if(protoDesc)delete ObjectProto$1[key];dP$1(it,key,D);if(protoDesc&&it!==ObjectProto$1)dP$1(ObjectProto$1,key,protoDesc);}:dP$1;var wrap=function(tag){var sym=AllSymbols[tag]=_objectCreate($Symbol[PROTOTYPE$2]);sym._k=tag;return sym;};var isSymbol=USE_NATIVE$1&&typeof $Symbol.iterator=='symbol'?function(it){return typeof it=='symbol';}:function(it){return it instanceof $Symbol;};var $defineProperty=function defineProperty(it,key,D){if(it===ObjectProto$1)$defineProperty(OPSymbols,key,D);_anObject(it);key=_toPrimitive(key,true);_anObject(D);if(_has(AllSymbols,key)){if(!D.enumerable){if(!_has(it,HIDDEN))dP$1(it,HIDDEN,_propertyDesc(1,{}));it[HIDDEN][key]=true;}else{if(_has(it,HIDDEN)&&it[HIDDEN][key])it[HIDDEN][key]=false;D=_objectCreate(D,{enumerable:_propertyDesc(0,false)});}return setSymbolDesc(it,key,D);}return dP$1(it,key,D);};var $defineProperties=function defineProperties(it,P){_anObject(it);var keys=_enumKeys(P=_toIobject(P));var i=0;var l=keys.length;var key;while(l>i)$defineProperty(it,key=keys[i++],P[key]);return it;};var $create=function create(it,P){return P===undefined?_objectCreate(it):$defineProperties(_objectCreate(it),P);};var $propertyIsEnumerable=function propertyIsEnumerable(key){var E=isEnum.call(this,key=_toPrimitive(key,true));if(this===ObjectProto$1&&_has(AllSymbols,key)&&!_has(OPSymbols,key))return false;return E||!_has(this,key)||!_has(AllSymbols,key)||_has(this,HIDDEN)&&this[HIDDEN][key]?E:true;};var $getOwnPropertyDescriptor$1=function getOwnPropertyDescriptor(it,key){it=_toIobject(it);key=_toPrimitive(key,true);if(it===ObjectProto$1&&_has(AllSymbols,key)&&!_has(OPSymbols,key))return;var D=gOPD$1(it,key);if(D&&_has(AllSymbols,key)&&!(_has(it,HIDDEN)&&it[HIDDEN][key]))D.enumerable=true;return D;};var $getOwnPropertyNames=function getOwnPropertyNames(it){var names=gOPN$1(_toIobject(it));var result=[];var i=0;var key;while(names.length>i){if(!_has(AllSymbols,key=names[i++])&&key!=HIDDEN&&key!=META)result.push(key);}return result;};var $getOwnPropertySymbols=function getOwnPropertySymbols(it){var IS_OP=it===ObjectProto$1;var names=gOPN$1(IS_OP?OPSymbols:_toIobject(it));var result=[];var i=0;var key;while(names.length>i){if(_has(AllSymbols,key=names[i++])&&(IS_OP?_has(ObjectProto$1,key):true))result.push(AllSymbols[key]);}return result;};// 19.4.1.1 Symbol([description]) if(!USE_NATIVE$1){$Symbol=function Symbol(){if(this instanceof $Symbol)throw TypeError('Symbol is not a constructor!');var tag=_uid(arguments.length>0?arguments[0]:undefined);var $set=function(value){if(this===ObjectProto$1)$set.call(OPSymbols,value);if(_has(this,HIDDEN)&&_has(this[HIDDEN],tag))this[HIDDEN][tag]=false;setSymbolDesc(this,tag,_propertyDesc(1,value));};if(_descriptors&&setter)setSymbolDesc(ObjectProto$1,tag,{configurable:true,set:$set});return wrap(tag);};_redefine($Symbol[PROTOTYPE$2],'toString',function toString(){return this._k;});_objectGopd.f=$getOwnPropertyDescriptor$1;_objectDp.f=$defineProperty;_objectGopn.f=_objectGopnExt.f=$getOwnPropertyNames;_objectPie.f=$propertyIsEnumerable;_objectGops.f=$getOwnPropertySymbols;if(_descriptors&&!_library){_redefine(ObjectProto$1,'propertyIsEnumerable',$propertyIsEnumerable,true);}_wksExt.f=function(name){return wrap(_wks(name));};}_export(_export.G+_export.W+_export.F*!USE_NATIVE$1,{Symbol:$Symbol});for(var es6Symbols=// 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','),j=0;es6Symbols.length>j;)_wks(es6Symbols[j++]);for(var wellKnownSymbols=_objectKeys(_wks.store),k=0;wellKnownSymbols.length>k;)_wksDefine(wellKnownSymbols[k++]);_export(_export.S+_export.F*!USE_NATIVE$1,'Symbol',{// 19.4.2.1 Symbol.for(key) 'for':function(key){return _has(SymbolRegistry,key+='')?SymbolRegistry[key]:SymbolRegistry[key]=$Symbol(key);},// 19.4.2.5 Symbol.keyFor(sym) keyFor:function keyFor(sym){if(!isSymbol(sym))throw TypeError(sym+' is not a symbol!');for(var key in SymbolRegistry)if(SymbolRegistry[key]===sym)return key;},useSetter:function(){setter=true;},useSimple:function(){setter=false;}});_export(_export.S+_export.F*!USE_NATIVE$1,'Object',{// 19.1.2.2 Object.create(O [, Properties]) create:$create,// 19.1.2.4 Object.defineProperty(O, P, Attributes) defineProperty:$defineProperty,// 19.1.2.3 Object.defineProperties(O, Properties) defineProperties:$defineProperties,// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) getOwnPropertyDescriptor:$getOwnPropertyDescriptor$1,// 19.1.2.7 Object.getOwnPropertyNames(O) getOwnPropertyNames:$getOwnPropertyNames,// 19.1.2.8 Object.getOwnPropertySymbols(O) getOwnPropertySymbols:$getOwnPropertySymbols});// 24.3.2 JSON.stringify(value [, replacer [, space]]) $JSON&&_export(_export.S+_export.F*(!USE_NATIVE$1||_fails(function(){var S=$Symbol();// MS Edge converts symbol values to JSON as {} // WebKit converts symbol values to JSON as null // V8 throws on boxed symbols return _stringify([S])!='[null]'||_stringify({a:S})!='{}'||_stringify(Object(S))!='{}';})),'JSON',{stringify:function stringify(it){var args=[it];var i=1;var replacer,$replacer;while(arguments.length>i)args.push(arguments[i++]);$replacer=replacer=args[1];if(!_isObject(replacer)&&it===undefined||isSymbol(it))return;// IE8 returns string on undefined if(!_isArray(replacer))replacer=function(key,value){if(typeof $replacer=='function')value=$replacer.call(this,key,value);if(!isSymbol(value))return value;};args[1]=replacer;return _stringify.apply($JSON,args);}});// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) $Symbol[PROTOTYPE$2][TO_PRIMITIVE]||_hide($Symbol[PROTOTYPE$2],TO_PRIMITIVE,$Symbol[PROTOTYPE$2].valueOf);// 19.4.3.5 Symbol.prototype[@@toStringTag] _setToStringTag($Symbol,'Symbol');// 20.2.1.9 Math[@@toStringTag] _setToStringTag(Math,'Math',true);// 24.3.3 JSON[@@toStringTag] _setToStringTag(_global.JSON,'JSON',true);var getOwnPropertySymbols=_core.Object.getOwnPropertySymbols;var getOwnPropertySymbols$1=getOwnPropertySymbols;// 19.1.2.14 Object.keys(O) _objectSap('keys',function(){return function keys(it){return _objectKeys(_toObject(it));};});var keys=_core.Object.keys;var keys$1=keys;// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes) _export(_export.S+_export.F*!_descriptors,'Object',{defineProperty:_objectDp.f});var $Object$1=_core.Object;var defineProperty$1=function defineProperty(it,key,desc){return $Object$1.defineProperty(it,key,desc);};var defineProperty$2=defineProperty$1;function _defineProperty$1(obj,key,value){if(key in obj){defineProperty$2(obj,key,{value:value,enumerable:true,configurable:true,writable:true});}else{obj[key]=value;}return obj;}var defineProperty$3=_defineProperty$1;function _objectSpread$1(target){for(var i=1;i1?_len-1:0),_key=1;_key<_len;_key++){extensions[_key-1]=arguments[_key];}// $.extend alternative, ... is the spread operator. for(var _i=0;_i0?1:+x;};}if('name'in Function.prototype===false){// Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name Object.defineProperty(Function.prototype,'name',{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1];}});}if(Object.assign===undefined){// Missing in IE // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign (function(){Object.assign=function(target){if(target===undefined||target===null){throw new TypeError('Cannot convert undefined or null to object');}var output=Object(target);for(var index=1;index>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];// .toUpperCase() here flattens concatenated strings to save heap memory space. return uuid.toUpperCase();};}(),clamp:function(value,min,max){return Math.max(min,Math.min(max,value));},// compute euclidian modulo of m % n // https://en.wikipedia.org/wiki/Modulo_operation euclideanModulo:function(n,m){return (n%m+m)%m;},// Linear mapping from range to range mapLinear:function(x,a1,a2,b1,b2){return b1+(x-a1)*(b2-b1)/(a2-a1);},// https://en.wikipedia.org/wiki/Linear_interpolation lerp:function(x,y,t){return (1-t)*x+t*y;},// http://en.wikipedia.org/wiki/Smoothstep smoothstep:function(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(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);},// Random integer from interval randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1));},// Random float from interval randFloat:function(low,high){return low+Math.random()*(high-low);},// Random float from <-range/2, range/2> interval randFloatSpread:function(range){return range*(0.5-Math.random());},degToRad:function(degrees){return degrees*_Math.DEG2RAD;},radToDeg:function(radians){return radians*_Math.RAD2DEG;},isPowerOfTwo:function(value){return (value&value-1)===0&&value!==0;},ceilPowerOfTwo:function(value){return Math.pow(2,Math.ceil(Math.log(value)/Math.LN2));},floorPowerOfTwo:function(value){return Math.pow(2,Math.floor(Math.log(value)/Math.LN2));}};/** * @author mrdoob / http://mrdoob.com/ * @author philogb / http://blog.thejit.org/ * @author egraether / http://egraether.com/ * @author zz85 / http://www.lab4games.net/zz85/blog */function Vector2(x,y){this.x=x||0;this.y=y||0;}Object.defineProperties(Vector2.prototype,{"width":{get:function(){return this.x;},set:function(value){this.x=value;}},"height":{get:function(){return this.y;},set:function(value){this.y=value;}}});Object.assign(Vector2.prototype,{isVector2:true,set:function(x,y){this.x=x;this.y=y;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setComponent:function(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);}return this;},getComponent:function(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(){return new this.constructor(this.x,this.y);},copy:function(v){this.x=v.x;this.y=v.y;return this;},add:function(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(s){this.x+=s;this.y+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;return this;},sub:function(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(s){this.x-=s;this.y-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this;},multiply:function(v){this.x*=v.x;this.y*=v.y;return this;},multiplyScalar:function(scalar){this.x*=scalar;this.y*=scalar;return this;},divide:function(v){this.x/=v.x;this.y/=v.y;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},applyMatrix3:function(m){var x=this.x,y=this.y;var e=m.elements;this.x=e[0]*x+e[3]*y+e[6];this.y=e[1]*x+e[4]*y+e[7];return this;},min:function(v){this.x=Math.min(this.x,v.x);this.y=Math.min(this.y,v.y);return this;},max:function(v){this.x=Math.max(this.x,v.x);this.y=Math.max(this.y,v.y);return this;},clamp:function(min,max){// assumes min < max, componentwise 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=new Vector2();var max=new Vector2();return function clampScalar(minVal,maxVal){min.set(minVal,minVal);max.set(maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);return this;},roundToZero:function(){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(){this.x=-this.x;this.y=-this.y;return this;},dot:function(v){return this.x*v.x+this.y*v.y;},lengthSq:function(){return this.x*this.x+this.y*this.y;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y);},normalize:function(){return this.divideScalar(this.length()||1);},angle:function(){// computes the angle in radians with respect to the positive x-axis var angle=Math.atan2(this.y,this.x);if(angle<0)angle+=2*Math.PI;return angle;},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y;return dx*dx+dy*dy;},manhattanDistanceTo:function(v){return Math.abs(this.x-v.x)+Math.abs(this.y-v.y);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(v,alpha){this.x+=(v.x-this.x)*alpha;this.y+=(v.y-this.y)*alpha;return this;},lerpVectors:function(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},equals:function(v){return v.x===this.x&&v.y===this.y;},fromArray:function(array,offset){if(offset===undefined)offset=0;this.x=array[offset];this.y=array[offset+1];return this;},toArray:function(array,offset){if(array===undefined)array=[];if(offset===undefined)offset=0;array[offset]=this.x;array[offset+1]=this.y;return array;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector2: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);return this;},rotateAround:function(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;}});/** * @author mrdoob / http://mrdoob.com/ * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author jordi_ros / http://plattsoft.com * @author D1plo1d / http://github.com/D1plo1d * @author alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author timknip / http://www.floorplanner.com/ * @author bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley */function Matrix4(){this.elements=[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.');}}Object.assign(Matrix4.prototype,{isMatrix4:true,set:function(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(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this;},clone:function(){return new Matrix4().fromArray(this.elements);},copy:function(m){var te=this.elements;var me=m.elements;te[0]=me[0];te[1]=me[1];te[2]=me[2];te[3]=me[3];te[4]=me[4];te[5]=me[5];te[6]=me[6];te[7]=me[7];te[8]=me[8];te[9]=me[9];te[10]=me[10];te[11]=me[11];te[12]=me[12];te[13]=me[13];te[14]=me[14];te[15]=me[15];return this;},copyPosition:function(m){var te=this.elements,me=m.elements;te[12]=me[12];te[13]=me[13];te[14]=me[14];return this;},extractBasis:function(xAxis,yAxis,zAxis){xAxis.setFromMatrixColumn(this,0);yAxis.setFromMatrixColumn(this,1);zAxis.setFromMatrixColumn(this,2);return this;},makeBasis:function(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=new Vector3();return function extractRotation(m){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(euler){if(!(euler&&euler.isEuler)){console.error('THREE.Matrix4: .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;}// last column te[3]=0;te[7]=0;te[11]=0;// bottom row te[12]=0;te[13]=0;te[14]=0;te[15]=1;return this;},makeRotationFromQuaternion:function(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);// last column te[3]=0;te[7]=0;te[11]=0;// bottom row te[12]=0;te[13]=0;te[14]=0;te[15]=1;return this;},lookAt:function(){var x=new Vector3();var y=new Vector3();var z=new Vector3();return function lookAt(eye,target,up){var te=this.elements;z.subVectors(eye,target);if(z.lengthSq()===0){// eye and target are in the same position z.z=1;}z.normalize();x.crossVectors(up,z);if(x.lengthSq()===0){// up and z are parallel if(Math.abs(up.z)===1){z.x+=0.0001;}else{z.z+=0.0001;}z.normalize();x.crossVectors(up,z);}x.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(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(m){return this.multiplyMatrices(m,this);},multiplyMatrices:function(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;},multiplyScalar:function(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;},applyToBufferAttribute:function(){var v1=new Vector3();return function applyToBufferAttribute(attribute){for(var i=0,l=attribute.count;i=0?1:-1,sqrSin=1-cos*cos;// Skip the Slerp for tiny steps to avoid numeric problems: 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;// Normalize in case we just did a lerp: 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;}});Object.defineProperties(Quaternion.prototype,{x:{get:function(){return this._x;},set:function(value){this._x=value;this.onChangeCallback();}},y:{get:function(){return this._y;},set:function(value){this._y=value;this.onChangeCallback();}},z:{get:function(){return this._z;},set:function(value){this._z=value;this.onChangeCallback();}},w:{get:function(){return this._w;},set:function(value){this._w=value;this.onChangeCallback();}}});Object.assign(Quaternion.prototype,{set:function(x,y,z,w){this._x=x;this._y=y;this._z=z;this._w=w;this.onChangeCallback();return this;},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w);},copy:function(quaternion){this._x=quaternion.x;this._y=quaternion.y;this._z=quaternion.z;this._w=quaternion.w;this.onChangeCallback();return this;},setFromEuler:function(euler,update){if(!(euler&&euler.isEuler)){throw new Error('THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.');}var x=euler._x,y=euler._y,z=euler._z,order=euler.order;// http://www.mathworks.com/matlabcentral/fileexchange/ // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/ // content/SpinCalc.m var cos=Math.cos;var sin=Math.sin;var c1=cos(x/2);var c2=cos(y/2);var c3=cos(z/2);var s1=sin(x/2);var s2=sin(y/2);var s3=sin(z/2);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(axis,angle){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm // assumes axis is normalized 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(m){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) 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(){// assumes direction vectors vFrom and vTo are normalized var v1=new Vector3();var r;var EPS=0.000001;return function setFromUnitVectors(vFrom,vTo){if(v1===undefined)v1=new Vector3();r=vFrom.dot(vTo)+1;if(rMath.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(){// quaternion is assumed to have unit length return this.conjugate();},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this;},dot:function(v){return this._x*v._x+this._y*v._y+this._z*v._z+this._w*v._w;},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w;},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w);},normalize:function(){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(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(q){return this.multiplyQuaternions(q,this);},multiplyQuaternions:function(a,b){// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm 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(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;// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/ 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(quaternion){return quaternion._x===this._x&&quaternion._y===this._y&&quaternion._z===this._z&&quaternion._w===this._w;},fromArray:function(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(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(callback){this.onChangeCallback=callback;return this;},onChangeCallback:function(){}});/** * @author mrdoob / http://mrdoob.com/ * @author kile / http://kile.stravaganza.org/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */function Vector3(x,y,z){this.x=x||0;this.y=y||0;this.z=z||0;}Object.assign(Vector3.prototype,{isVector3:true,set:function(x,y,z){this.x=x;this.y=y;this.z=z;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;this.z=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setZ:function(z){this.z=z;return this;},setComponent:function(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);}return this;},getComponent:function(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(){return new this.constructor(this.x,this.y,this.z);},copy:function(v){this.x=v.x;this.y=v.y;this.z=v.z;return this;},add:function(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(s){this.x+=s;this.y+=s;this.z+=s;return this;},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this;},addScaledVector:function(v,s){this.x+=v.x*s;this.y+=v.y*s;this.z+=v.z*s;return this;},sub:function(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(s){this.x-=s;this.y-=s;this.z-=s;return this;},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this;},multiply:function(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(scalar){this.x*=scalar;this.y*=scalar;this.z*=scalar;return this;},multiplyVectors:function(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=new Quaternion();return function applyEuler(euler){if(!(euler&&euler.isEuler)){console.error('THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.');}return this.applyQuaternion(quaternion.setFromEuler(euler));};}(),applyAxisAngle:function(){var quaternion=new Quaternion();return function applyAxisAngle(axis,angle){return this.applyQuaternion(quaternion.setFromAxisAngle(axis,angle));};}(),applyMatrix3:function(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(m){var x=this.x,y=this.y,z=this.z;var e=m.elements;var w=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])*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;return this;},applyQuaternion:function(q){var x=this.x,y=this.y,z=this.z;var qx=q.x,qy=q.y,qz=q.z,qw=q.w;// calculate quat * vector 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;// calculate result * inverse quat 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=new Matrix4();return function project(camera){matrix.multiplyMatrices(camera.projectionMatrix,matrix.getInverse(camera.matrixWorld));return this.applyMatrix4(matrix);};}(),unproject:function(){var matrix=new Matrix4();return function unproject(camera){matrix.multiplyMatrices(camera.matrixWorld,matrix.getInverse(camera.projectionMatrix));return this.applyMatrix4(matrix);};}(),transformDirection:function(m){// input: THREE.Matrix4 affine matrix // vector interpreted as a direction 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(v){this.x/=v.x;this.y/=v.y;this.z/=v.z;return this;},divideScalar:function(scalar){return this.multiplyScalar(1/scalar);},min:function(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(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(min,max){// assumes min < max, componentwise 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=new Vector3();var max=new Vector3();return function clampScalar(minVal,maxVal){min.set(minVal,minVal,minVal);max.set(maxVal,maxVal,maxVal);return this.clamp(min,max);};}(),clampLength:function(min,max){var length=this.length();return this.divideScalar(length||1).multiplyScalar(Math.max(min,Math.min(max,length)));},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this;},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this;},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this;},roundToZero:function(){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(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this;},dot:function(v){return this.x*v.x+this.y*v.y+this.z*v.z;},// TODO lengthSquared? lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z;},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z);},normalize:function(){return this.divideScalar(this.length()||1);},setLength:function(length){return this.normalize().multiplyScalar(length);},lerp:function(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(v1,v2,alpha){return this.subVectors(v2,v1).multiplyScalar(alpha).add(v1);},cross:function(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);}return this.crossVectors(this,v);},crossVectors:function(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(vector){var scalar=vector.dot(this)/vector.lengthSq();return this.copy(vector).multiplyScalar(scalar);},projectOnPlane:function(){var v1=new Vector3();return function projectOnPlane(planeNormal){v1.copy(this).projectOnVector(planeNormal);return this.sub(v1);};}(),reflect:function(){// reflect incident vector off plane orthogonal to normal // normal is assumed to have unit length var v1=new Vector3();return function reflect(normal){return this.sub(v1.copy(normal).multiplyScalar(2*this.dot(normal)));};}(),angleTo:function(v){var theta=this.dot(v)/Math.sqrt(this.lengthSq()*v.lengthSq());// clamp, to handle numerical problems return Math.acos(_Math.clamp(theta,-1,1));},distanceTo:function(v){return Math.sqrt(this.distanceToSquared(v));},distanceToSquared:function(v){var dx=this.x-v.x,dy=this.y-v.y,dz=this.z-v.z;return dx*dx+dy*dy+dz*dz;},manhattanDistanceTo:function(v){return Math.abs(this.x-v.x)+Math.abs(this.y-v.y)+Math.abs(this.z-v.z);},setFromSpherical:function(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;},setFromCylindrical:function(c){this.x=c.radius*Math.sin(c.theta);this.y=c.y;this.z=c.radius*Math.cos(c.theta);return this;},setFromMatrixPosition:function(m){var e=m.elements;this.x=e[12];this.y=e[13];this.z=e[14];return this;},setFromMatrixScale:function(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(m,index){return this.fromArray(m.elements,index*4);},equals:function(v){return v.x===this.x&&v.y===this.y&&v.z===this.z;},fromArray:function(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(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;},fromBufferAttribute:function(attribute,index,offset){if(offset!==undefined){console.warn('THREE.Vector3: offset has been removed from .fromBufferAttribute().');}this.x=attribute.getX(index);this.y=attribute.getY(index);this.z=attribute.getZ(index);return this;}});/** * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io * @author tschw */function Matrix3(){this.elements=[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.');}}Object.assign(Matrix3.prototype,{isMatrix3:true,set:function(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(){this.set(1,0,0,0,1,0,0,0,1);return this;},clone:function(){return new this.constructor().fromArray(this.elements);},copy:function(m){var te=this.elements;var me=m.elements;te[0]=me[0];te[1]=me[1];te[2]=me[2];te[3]=me[3];te[4]=me[4];te[5]=me[5];te[6]=me[6];te[7]=me[7];te[8]=me[8];return this;},setFromMatrix4:function(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;},applyToBufferAttribute:function(){var v1=new Vector3();return function applyToBufferAttribute(attribute){for(var i=0,l=attribute.count;i2048||canvas.height>2048){return canvas.toDataURL('image/jpeg',0.6);}else{return canvas.toDataURL('image/png');}}var output={metadata:{version:4.5,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],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(this.image!==undefined){// TODO: Move to THREE.Image var image=this.image;if(image.uuid===undefined){image.uuid=_Math.generateUUID();// UGH }if(!isRootObject&&meta.images[image.uuid]===undefined){meta.images[image.uuid]={uuid:image.uuid,url:getDataURL(image)};}output.image=image.uuid;}if(!isRootObject){meta.textures[this.uuid]=output;}return output;},dispose:function(){this.dispatchEvent({type:'dispose'});},transformUv:function(uv){if(this.mapping!==UVMapping)return;uv.applyMatrix3(this.matrix);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;}}});Object.defineProperty(Texture.prototype,"needsUpdate",{set:function(value){if(value===true)this.version++;}});/** * @author supereggbert / http://www.paulbrunt.co.uk/ * @author philogb / http://blog.thejit.org/ * @author mikael emtinger / http://gomo.se/ * @author egraether / http://egraether.com/ * @author WestLangley / http://github.com/WestLangley */function Vector4(x,y,z,w){this.x=x||0;this.y=y||0;this.z=z||0;this.w=w!==undefined?w:1;}Object.assign(Vector4.prototype,{isVector4:true,set:function(x,y,z,w){this.x=x;this.y=y;this.z=z;this.w=w;return this;},setScalar:function(scalar){this.x=scalar;this.y=scalar;this.z=scalar;this.w=scalar;return this;},setX:function(x){this.x=x;return this;},setY:function(y){this.y=y;return this;},setZ:function(z){this.z=z;return this;},setW:function(w){this.w=w;return this;},setComponent:function(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);}return this;},getComponent:function(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(){return new this.constructor(this.x,this.y,this.z,this.w);},copy:function(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(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(s){this.x+=s;this.y+=s;this.z+=s;this.w+=s;return this;},addVectors:function(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(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(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(s){this.x-=s;this.y-=s;this.z-=s;this.w-=s;return this;},subVectors:function(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(scalar){this.x*=scalar;this.y*=scalar;this.z*=scalar;this.w*=scalar;return this;},applyMatrix4:function(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(scalar){return this.multiplyScalar(1/scalar);},setAxisAngleFromQuaternion:function(q){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm // q is assumed to be normalized 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(m){// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm // assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled) var angle,x,y,z,// variables for result epsilon=0.01,// margin to allow for rounding errors epsilon2=0.1,// margin to distinguish between 0 and 180 degrees 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)yy&&xx>zz){// m11 is the largest diagonal term if(xxzz){// m22 is the largest diagonal term if(yymaxX)maxX=x;if(y>maxY)maxY=y;if(z>maxZ)maxZ=z;}this.min.set(minX,minY,minZ);this.max.set(maxX,maxY,maxZ);return this;},setFromBufferAttribute:function(attribute){var minX=+Infinity;var minY=+Infinity;var minZ=+Infinity;var maxX=-Infinity;var maxY=-Infinity;var maxZ=-Infinity;for(var i=0,l=attribute.count;imaxX)maxX=x;if(y>maxY)maxY=y;if(z>maxZ)maxZ=z;}this.min.set(minX,minY,minZ);this.max.set(maxX,maxY,maxZ);return this;},setFromPoints:function(points){this.makeEmpty();for(var i=0,il=points.length;ithis.max.x||point.ythis.max.y||point.zthis.max.z?false:true;},containsBox:function(box){return 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;},getParameter:function(point,target){// This can potentially have a divide by zero if the box // has a size dimension of 0. if(target===undefined){console.warn('THREE.Box3: .getParameter() target is now required');target=new Vector3();}return target.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(box){// using 6 splitting planes to rule out intersections. return box.max.xthis.max.x||box.max.ythis.max.y||box.max.zthis.max.z?false:true;},intersectsSphere:function(){var closestPoint=new Vector3();return function intersectsSphere(sphere){// Find the point on the AABB closest to the sphere center. this.clampPoint(sphere.center,closestPoint);// If that point is inside the sphere, the AABB and sphere intersect. return closestPoint.distanceToSquared(sphere.center)<=sphere.radius*sphere.radius;};}(),intersectsPlane:function(plane){// We compute the minimum and maximum dot product values. If those values // are on the same side (back or front) of the plane, then there is no intersection. 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;},intersectsTriangle:function(){// triangle centered vertices var v0=new Vector3();var v1=new Vector3();var v2=new Vector3();// triangle edge vectors var f0=new Vector3();var f1=new Vector3();var f2=new Vector3();var testAxis=new Vector3();var center=new Vector3();var extents=new Vector3();var triangleNormal=new Vector3();function satForAxes(axes){var i,j;for(i=0,j=axes.length-3;i<=j;i+=3){testAxis.fromArray(axes,i);// project the aabb onto the seperating axis var r=extents.x*Math.abs(testAxis.x)+extents.y*Math.abs(testAxis.y)+extents.z*Math.abs(testAxis.z);// project all 3 vertices of the triangle onto the seperating axis var p0=v0.dot(testAxis);var p1=v1.dot(testAxis);var p2=v2.dot(testAxis);// actual test, basically see if either of the most extreme of the triangle points intersects r if(Math.max(-Math.max(p0,p1,p2),Math.min(p0,p1,p2))>r){// points of the projected triangle are outside the projected half-length of the aabb // the axis is seperating and we can exit return false;}}return true;}return function intersectsTriangle(triangle){if(this.isEmpty()){return false;}// compute box center and extents this.getCenter(center);extents.subVectors(this.max,center);// translate triangle to aabb origin v0.subVectors(triangle.a,center);v1.subVectors(triangle.b,center);v2.subVectors(triangle.c,center);// compute edge vectors for triangle f0.subVectors(v1,v0);f1.subVectors(v2,v1);f2.subVectors(v0,v2);// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb // make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation // axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned) var axes=[0,-f0.z,f0.y,0,-f1.z,f1.y,0,-f2.z,f2.y,f0.z,0,-f0.x,f1.z,0,-f1.x,f2.z,0,-f2.x,-f0.y,f0.x,0,-f1.y,f1.x,0,-f2.y,f2.x,0];if(!satForAxes(axes)){return false;}// test 3 face normals from the aabb axes=[1,0,0,0,1,0,0,0,1];if(!satForAxes(axes)){return false;}// finally testing the face normal of the triangle // use already existing triangle edge vectors here triangleNormal.crossVectors(f0,f1);axes=[triangleNormal.x,triangleNormal.y,triangleNormal.z];return satForAxes(axes);};}(),clampPoint:function(point,target){if(target===undefined){console.warn('THREE.Box3: .clampPoint() target is now required');target=new Vector3();}return target.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(target){if(target===undefined){console.warn('THREE.Box3: .getBoundingSphere() target is now required');target=new Sphere();}this.getCenter(target.center);target.radius=this.getSize(v1).length()*0.5;return target;};}(),intersect:function(box){this.min.max(box.min);this.max.min(box.max);// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values. if(this.isEmpty())this.makeEmpty();return this;},union:function(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){// transform of empty box is an empty box. if(this.isEmpty())return this;// NOTE: I am using a binary pattern to specify all 2^3 combinations below points[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(matrix);// 000 points[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(matrix);// 001 points[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(matrix);// 010 points[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(matrix);// 011 points[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(matrix);// 100 points[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(matrix);// 101 points[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(matrix);// 110 points[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(matrix);// 111 this.setFromPoints(points);return this;};}(),translate:function(offset){this.min.add(offset);this.max.add(offset);return this;},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max);}});/** * @author bhouston / http://clara.io * @author mrdoob / http://mrdoob.com/ */function Sphere(center,radius){this.center=center!==undefined?center:new Vector3();this.radius=radius!==undefined?radius:0;}Object.assign(Sphere.prototype,{set:function(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).getCenter(center);}var maxRadiusSq=0;for(var i=0,il=points.length;ithis.radius*this.radius){target.sub(this.center).normalize();target.multiplyScalar(this.radius).add(this.center);}return target;},getBoundingBox:function(target){if(target===undefined){console.warn('THREE.Sphere: .getBoundingBox() target is now required');target=new Box3();}target.set(this.center,this.center);target.expandByScalar(this.radius);return target;},applyMatrix4:function(matrix){this.center.applyMatrix4(matrix);this.radius=this.radius*matrix.getMaxScaleOnAxis();return this;},translate:function(offset){this.center.add(offset);return this;},equals:function(sphere){return sphere.center.equals(this.center)&&sphere.radius===this.radius;}});/** * @author bhouston / http://clara.io */function Plane(normal,constant){// normal is assumed to be normalized this.normal=normal!==undefined?normal:new Vector3(1,0,0);this.constant=constant!==undefined?constant:0;}Object.assign(Plane.prototype,{set:function(normal,constant){this.normal.copy(normal);this.constant=constant;return this;},setComponents:function(x,y,z,w){this.normal.set(x,y,z);this.constant=w;return this;},setFromNormalAndCoplanarPoint:function(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();// Q: should an error be thrown if normal is zero (e.g. degenerate plane)? this.setFromNormalAndCoplanarPoint(normal,a);return this;};}(),clone:function(){return new this.constructor().copy(this);},copy:function(plane){this.normal.copy(plane.normal);this.constant=plane.constant;return this;},normalize:function(){// Note: will lead to a divide by zero if the plane is invalid. var inverseNormalLength=1.0/this.normal.length();this.normal.multiplyScalar(inverseNormalLength);this.constant*=inverseNormalLength;return this;},negate:function(){this.constant*=-1;this.normal.negate();return this;},distanceToPoint:function(point){return this.normal.dot(point)+this.constant;},distanceToSphere:function(sphere){return this.distanceToPoint(sphere.center)-sphere.radius;},projectPoint:function(point,target){if(target===undefined){console.warn('THREE.Plane: .projectPoint() target is now required');target=new Vector3();}return target.copy(this.normal).multiplyScalar(-this.distanceToPoint(point)).add(point);},intersectLine:function(){var v1=new Vector3();return function intersectLine(line,target){if(target===undefined){console.warn('THREE.Plane: .intersectLine() target is now required');target=new Vector3();}var direction=line.delta(v1);var denominator=this.normal.dot(direction);if(denominator===0){// line is coplanar, return origin if(this.distanceToPoint(line.start)===0){return target.copy(line.start);}// Unsure if this is the correct method to handle this case. return undefined;}var t=-(line.start.dot(this.normal)+this.constant)/denominator;if(t<0||t>1){return undefined;}return target.copy(direction).multiplyScalar(t).add(line.start);};}(),intersectsLine:function(line){// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it. var startSign=this.distanceToPoint(line.start);var endSign=this.distanceToPoint(line.end);return startSign<0&&endSign>0||endSign<0&&startSign>0;},intersectsBox:function(box){return box.intersectsPlane(this);},intersectsSphere:function(sphere){return sphere.intersectsPlane(this);},coplanarPoint:function(target){if(target===undefined){console.warn('THREE.Plane: .coplanarPoint() target is now required');target=new Vector3();}return target.copy(this.normal).multiplyScalar(-this.constant);},applyMatrix4:function(){var v1=new Vector3();var m1=new Matrix3();return function applyMatrix4(matrix,optionalNormalMatrix){var normalMatrix=optionalNormalMatrix||m1.getNormalMatrix(matrix);var referencePoint=this.coplanarPoint(v1).applyMatrix4(matrix);var normal=this.normal.applyMatrix3(normalMatrix).normalize();this.constant=-referencePoint.dot(normal);return this;};}(),translate:function(offset){this.constant-=offset.dot(this.normal);return this;},equals:function(plane){return plane.normal.equals(this.normal)&&plane.constant===this.constant;}});/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author bhouston / http://clara.io */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()];}Object.assign(Frustum.prototype,{set:function(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(){return new this.constructor().copy(this);},copy:function(frustum){var planes=this.planes;for(var i=0;i<6;i++){planes[i].copy(frustum.planes[i]);}return this;},setFromMatrix:function(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(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(distance0?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 both outside plane, no intersection if(d1<0&&d2<0){return false;}}return true;};}(),containsPoint:function(point){var planes=this.planes;for(var i=0;i<6;i++){if(planes[i].distanceToPoint(point)<0){return false;}}return true;}});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="float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\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}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\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 = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\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\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\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 PI_HALF 1.5707963267949\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}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\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="vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\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 += normalize( objectNormal ) * ( 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\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn 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\treturn 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\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = min( floor( D ) / 255.0, 1.0 );\n\treturn 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\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn 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\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn 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, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = 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 envMapIntensity;\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\tuniform int maxMipLevel;\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_vertex="\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif";var fog_pars_vertex="#ifdef USE_FOG\n varying float fogDepth;\n#endif\n";var fog_fragment="#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\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\tvarying float fogDepth;\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\n";var gradientmap_pars_fragment="#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n";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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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_begin="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\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\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\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\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 ( angleCos > spotLight.coneCos ) {\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_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\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";var lights_pars_maps="#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = 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 = 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\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = 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 = 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 = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, 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 = 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\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\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}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\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_Direct_RectArea\t\tRE_Direct_RectArea_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_fragment_begin="\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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\t#pragma unroll_loop\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\t#pragma unroll_loop\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 ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\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#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n";var lights_fragment_maps="#if defined( RE_IndirectDiffuse )\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 defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n";var lights_fragment_end="#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\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\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= 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\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n";var map_particle_pars_fragment="#ifdef USE_MAP\n\tuniform mat3 uvTransform;\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.b;\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_fragment_begin="#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 );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n";var normal_fragment_maps="#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 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\t\tscale *= float( gl_FrontFacing ) * 2.0 - 1.0;\n\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\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\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\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\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( 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="vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n";var dithering_fragment="#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n";var dithering_pars_fragment="#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n";var roughnessmap_fragment="float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\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\tfloat shadow = 1.0;\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\tshadow = (\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\tshadow = (\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\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\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, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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\t#pragma unroll_loop\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 ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 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 boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\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\ttransformed = ( bindMatrixInverse * skinned ).xyz;\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="#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn 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\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn 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 mat3 uvTransform;\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 = ( uvTransform * vec3( uv, 1 ) ).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( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n";var cube_frag="uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n";var depth_frag="#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - 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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var distanceRGBA_frag="#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n";var distanceRGBA_vert="#define DISTANCE\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n";var equirect_frag="uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n";var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n";var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshbasic_vert="#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \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\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n";var normal_frag="#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n";var normal_vert="#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n";var points_frag="uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var points_vert="uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var shadow_frag="uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n";var shadow_vert="#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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_vertex:fog_vertex,fog_pars_vertex:fog_pars_vertex,fog_fragment:fog_fragment,fog_pars_fragment:fog_pars_fragment,gradientmap_pars_fragment:gradientmap_pars_fragment,lightmap_fragment:lightmap_fragment,lightmap_pars_fragment:lightmap_pars_fragment,lights_lambert_vertex:lights_lambert_vertex,lights_pars_begin:lights_pars_begin,lights_pars_maps:lights_pars_maps,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_fragment_begin:lights_fragment_begin,lights_fragment_maps:lights_fragment_maps,lights_fragment_end:lights_fragment_end,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_fragment_begin:normal_fragment_begin,normal_fragment_maps:normal_fragment_maps,normalmap_pars_fragment:normalmap_pars_fragment,packing:packing,premultiplied_alpha_fragment:premultiplied_alpha_fragment,project_vertex:project_vertex,dithering_fragment:dithering_fragment,dithering_pars_fragment:dithering_pars_fragment,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};/** * Uniform Utilities */var UniformsUtils={merge:function(uniforms){var merged={};for(var u=0;u>16&255)/255;this.g=(hex>>8&255)/255;this.b=(hex&255)/255;return this;},setRGB:function(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,s,l ranges are in 0.0 - 1.0 h=_Math.euclideanModulo(h,1);s=_Math.clamp(s,0,1);l=_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(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)){// rgb / hsl 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)){// rgb(255,0,0) rgba(255,0,0,0.5) 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)){// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5) 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)){// hsl(120,50%,50%) hsla(120,50%,50%,0.5) 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)){// hex color var hex=m[1];var size=hex.length;if(size===3){// #ff0 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){// #ff0000 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){// color keywords var hex=ColorKeywords[style];if(hex!==undefined){// red this.setHex(hex);}else{// unknown color console.warn('THREE.Color: Unknown color '+style);}}return this;},clone:function(){return new this.constructor(this.r,this.g,this.b);},copy:function(color){this.r=color.r;this.g=color.g;this.b=color.b;return this;},copyGammaToLinear:function(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(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(){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(){this.r=Math.sqrt(this.r);this.g=Math.sqrt(this.g);this.b=Math.sqrt(this.b);return this;},getHex:function(){return this.r*255<<16^this.g*255<<8^this.b*255<<0;},getHexString:function(){return ('000000'+this.getHex().toString(16)).slice(-6);},getHSL:function(target){// h,s,l ranges are in 0.0 - 1.0 if(target===undefined){console.warn('THREE.Color: .getHSL() target is now required');target={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+(g1){for(var i=0;i1){for(var i=0;i0){object.children=[];for(var i=0;i0)output.geometries=geometries;if(materials.length>0)output.materials=materials;if(textures.length>0)output.textures=textures;if(images.length>0)output.images=images;if(shapes.length>0)output.shapes=shapes;}output.object=object;return output;// extract data from the cache hash // remove metadata on each item // and return as array function extractFromCache(cache){var values=[];for(var key in cache){var data=cache[key];delete data.metadata;values.push(data);}return values;}},clone:function(recursive){return new this.constructor().copy(this,recursive);},copy:function(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.layers.mask=source.layers.mask;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;i0){for(var i=0;i0){this.normalsNeedUpdate=true;}},computeFlatVertexNormals:function(){var f,fl,face;this.computeFaceNormals();for(f=0,fl=this.faces.length;f0){this.normalsNeedUpdate=true;}},computeMorphNormals:function(){var i,il,f,fl,face;// save original normals // - create temp variables on first access // otherwise just copy (for faster repeated calls) for(f=0,fl=this.faces.length;f=0;i--){var idx=faceIndicesToRemove[i];this.faces.splice(idx,1);for(j=0,jl=this.faceVertexUvs.length;j0;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);// isQuad 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<0)data.data.colors=colors;if(uvs.length>0)data.data.uvs=[uvs];// temporal backward compatibility data.data.faces=faces;return data;},clone:function(){/* // Handle primitives var parameters = this.parameters; if ( parameters !== undefined ) { var values = []; for ( var key in parameters ) { values.push( parameters[ key ] ); } var geometry = Object.create( this.constructor.prototype ); this.constructor.apply( geometry, values ); return geometry; } return new this.constructor().copy( this ); */return new Geometry().copy(this);},copy:function(source){var i,il,j,jl,k,kl;// reset this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingBox=null;this.boundingSphere=null;// name this.name=source.name;// vertices var vertices=source.vertices;for(i=0,il=vertices.length;i0;var hasFaceVertexUv2=faceVertexUvs[1]&&faceVertexUvs[1].length>0;// morphs var morphTargets=geometry.morphTargets;var morphTargetsLength=morphTargets.length;var morphTargetsPosition;if(morphTargetsLength>0){morphTargetsPosition=[];for(var i=0;i0){morphTargetsNormal=[];for(var i=0;imax)max=array[i];}return max;}/** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */var bufferGeometryId=1;// BufferGeometry uses odd numbers as Id function BufferGeometry(){Object.defineProperty(this,'id',{value:bufferGeometryId+=2});this.uuid=_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};}BufferGeometry.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:BufferGeometry,isBufferGeometry:true,getIndex:function(){return this.index;},setIndex:function(index){if(Array.isArray(index)){this.index=new(arrayMax(index)>65535?Uint32BufferAttribute:Uint16BufferAttribute)(index,1);}else{this.index=index;}},addAttribute:function(name,attribute){if(!(attribute&&attribute.isBufferAttribute)&&!(attribute&&attribute.isInterleavedBufferAttribute)){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(name){return this.attributes[name];},removeAttribute:function(name){delete this.attributes[name];return this;},addGroup:function(start,count,materialIndex){this.groups.push({start:start,count:count,materialIndex:materialIndex!==undefined?materialIndex:0});},clearGroups:function(){this.groups=[];},setDrawRange:function(start,count){this.drawRange.start=start;this.drawRange.count=count;},applyMatrix:function(matrix){var position=this.attributes.position;if(position!==undefined){matrix.applyToBufferAttribute(position);position.needsUpdate=true;}var normal=this.attributes.normal;if(normal!==undefined){var normalMatrix=new Matrix3().getNormalMatrix(matrix);normalMatrix.applyToBufferAttribute(normal);normal.needsUpdate=true;}if(this.boundingBox!==null){this.computeBoundingBox();}if(this.boundingSphere!==null){this.computeBoundingSphere();}return this;},rotateX:function(){// rotate geometry around world x-axis var m1=new Matrix4();return function rotateX(angle){m1.makeRotationX(angle);this.applyMatrix(m1);return this;};}(),rotateY:function(){// rotate geometry around world y-axis var m1=new Matrix4();return function rotateY(angle){m1.makeRotationY(angle);this.applyMatrix(m1);return this;};}(),rotateZ:function(){// rotate geometry around world z-axis var m1=new Matrix4();return function rotateZ(angle){m1.makeRotationZ(angle);this.applyMatrix(m1);return this;};}(),translate:function(){// translate geometry var m1=new Matrix4();return function translate(x,y,z){m1.makeTranslation(x,y,z);this.applyMatrix(m1);return this;};}(),scale:function(){// scale geometry var m1=new Matrix4();return function scale(x,y,z){m1.makeScale(x,y,z);this.applyMatrix(m1);return this;};}(),lookAt:function(){var obj=new Object3D();return function lookAt(vector){obj.lookAt(vector);obj.updateMatrix();this.applyMatrix(obj.matrix);};}(),center:function(){var offset=new Vector3();return function center(){this.computeBoundingBox();this.boundingBox.getCenter(offset).negate();this.translate(offset.x,offset.y,offset.z);return this;};}(),setFromObject:function(object){// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); var geometry=object.geometry;if(object.isPoints||object.isLine){var positions=new Float32BufferAttribute(geometry.vertices.length*3,3);var colors=new Float32BufferAttribute(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 Float32BufferAttribute(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.isMesh){if(geometry&&geometry.isGeometry){this.fromGeometry(geometry);}}return this;},setFromPoints:function(points){var position=[];for(var i=0,l=points.length;i0){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));}// groups this.groups=geometry.groups;// morphs for(var name in geometry.morphTargets){var array=[];var morphTargets=geometry.morphTargets[name];for(var i=0,l=morphTargets.length;i0){var skinIndices=new Float32BufferAttribute(geometry.skinIndices.length*4,4);this.addAttribute('skinIndex',skinIndices.copyVector4sArray(geometry.skinIndices));}if(geometry.skinWeights.length>0){var skinWeights=new Float32BufferAttribute(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(){if(this.boundingBox===null){this.boundingBox=new Box3();}var position=this.attributes.position;if(position!==undefined){this.boundingBox.setFromBufferAttribute(position);}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 position=this.attributes.position;if(position){var center=this.boundingSphere.center;box.setFromBufferAttribute(position);box.getCenter(center);// hoping to find a boundingSphere with a radius smaller than the // boundingSphere of the boundingBox: sqrt(3) smaller in the best case var maxRadiusSq=0;for(var i=0,il=position.count;i0){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(){/* // Handle primitives var parameters = this.parameters; if ( parameters !== undefined ) { var values = []; for ( var key in parameters ) { values.push( parameters[ key ] ); } var geometry = Object.create( this.constructor.prototype ); this.constructor.apply( geometry, values ); return geometry; } return new this.constructor().copy( this ); */return new BufferGeometry().copy(this);},copy:function(source){var name,i,l;// reset this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingBox=null;this.boundingSphere=null;// name this.name=source.name;// index var index=source.index;if(index!==null){this.setIndex(index.clone());}// attributes var attributes=source.attributes;for(name in attributes){var attribute=attributes[name];this.addAttribute(name,attribute.clone());}// morph attributes var morphAttributes=source.morphAttributes;for(name in morphAttributes){var array=[];var morphAttribute=morphAttributes[name];// morphAttribute: array of Float32BufferAttributes for(i=0,l=morphAttribute.length;i0?1:-1;// now apply vector to normal buffer normals.push(vector.x,vector.y,vector.z);// uvs uvs.push(ix/gridX);uvs.push(1-iy/gridY);// counters vertexCounter+=1;}}// indices // 1. you need three indices to draw a single face // 2. a single segment consists of two faces // 3. so we need to generate six (2*3) indices per segment for(iy=0;iy0)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;if(this.morphTargets===true)data.morphTargets=true;if(this.skinning===true)data.skinning=true;if(this.visible===false)data.visible=false;if(JSON.stringify(this.userData)!=='{}')data.userData=this.userData;// TODO: Copied from Object3D.toJSON 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(){return new this.constructor().copy(this);},copy:function(source){this.name=source.name;this.fog=source.fog;this.lights=source.lights;this.blending=source.blending;this.side=source.side;this.flatShading=source.flatShading;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.dithering=source.dithering;this.alphaTest=source.alphaTest;this.premultipliedAlpha=source.premultipliedAlpha;this.overdraw=source.overdraw;this.visible=source.visible;this.userData=JSON.parse(JSON.stringify(source.userData));this.clipShadows=source.clipShadows;this.clipIntersection=source.clipIntersection;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;this.shadowSide=source.shadowSide;return this;},dispose:function(){this.dispatchEvent({type:'dispose'});}});/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * depthTest: , * depthWrite: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: * } */function MeshBasicMaterial(parameters){Material.call(this);this.type='MeshBasicMaterial';this.color=new Color(0xffffff);// emissive this.map=null;this.lightMap=null;this.lightMapIntensity=1.0;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.lightMap=source.lightMap;this.lightMapIntensity=source.lightMapIntensity;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;};/** * @author alteredq / http://alteredqualia.com/ * * parameters = { * defines: { "label" : "value" }, * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, * * fragmentShader: , * vertexShader: , * * wireframe: , * wireframeLinewidth: , * * lights: , * * skinning: , * morphTargets: , * morphNormals: * } */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;// set to use scene fog this.lights=false;// set to use scene lights this.clipping=false;// set to use user-defined clipping planes this.skinning=false;// set to use skinning attribute streams this.morphTargets=false;// set to use morph targets this.morphNormals=false;// set to use morph normals this.extensions={derivatives:false,// set to use derivatives fragDepth:false,// set to use fragment depth values drawBuffers:false,// set to use draw buffers shaderTextureLOD:false// set to use shader texture LOD };// When rendered geometry doesn't include these attributes but the material does, // use these default values in WebGL. This avoids errors when buffer data is missing. this.defaultAttributeValues={'color':[1,1,1],'uv':[0,0],'uv2':[0,0]};this.index0AttributeName=undefined;this.uniformsNeedUpdate=false;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=UniformsUtils.clone(source.uniforms);this.defines=Object.assign({},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;};/** * @author bhouston / http://clara.io */function Ray(origin,direction){this.origin=origin!==undefined?origin:new Vector3();this.direction=direction!==undefined?direction:new Vector3();}Object.assign(Ray.prototype,{set:function(origin,direction){this.origin.copy(origin);this.direction.copy(direction);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(ray){this.origin.copy(ray.origin);this.direction.copy(ray.direction);return this;},at:function(t,target){if(target===undefined){console.warn('THREE.Ray: .at() target is now required');target=new Vector3();}return target.copy(this.direction).multiplyScalar(t).add(this.origin);},lookAt:function(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(point,target){if(target===undefined){console.warn('THREE.Ray: .closestPointToPoint() target is now required');target=new Vector3();}target.subVectors(point,this.origin);var directionDistance=target.dot(this.direction);if(directionDistance<0){return target.copy(this.origin);}return target.copy(this.direction).multiplyScalar(directionDistance).add(this.origin);},distanceToPoint:function(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);// point behind the ray 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){// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h // It returns the min distance between the ray and the segment // defined by v0 and v1 // It can also set two optional targets : // - The closest point on the ray // - The closest point on the segment 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){// The ray and segment are not parallel. s0=a01*b1-b0;s1=a01*b0-b1;extDet=segExtent*det;if(s0>=0){if(s1>=-extDet){if(s1<=extDet){// region 0 // Minimum at interior points of ray and segment. var invDet=1/det;s0*=invDet;s1*=invDet;sqrDist=s0*(s0+a01*s1+2*b0)+s1*(a01*s0+s1+2*b1)+c;}else{// region 1 s1=segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}else{// region 5 s1=-segExtent;s0=Math.max(0,-(a01*s1+b0));sqrDist=-s0*s0+s1*(s1+2*b1)+c;}}else{if(s1<=-extDet){// region 4 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){// region 3 s0=0;s1=Math.min(Math.max(-segExtent,-b1),segExtent);sqrDist=s1*(s1+2*b1)+c;}else{// region 2 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{// Ray and segment are parallel. 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,target){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);// t0 = first intersect point - entrance on front of sphere var t0=tca-thc;// t1 = second intersect point - exit point on back of sphere var t1=tca+thc;// test to see if both t0 and t1 are behind the ray - if so, return null if(t0<0&&t1<0)return null;// test to see if t0 is behind the ray: // if it is, the ray is inside the sphere, so return the second exit point scaled by t1, // in order to always return an intersect point that is in front of the ray. if(t0<0)return this.at(t1,target);// else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at(t0,target);};}(),intersectsSphere:function(sphere){return this.distanceToPoint(sphere.center)<=sphere.radius;},distanceToPlane:function(plane){var denominator=plane.normal.dot(this.direction);if(denominator===0){// line is coplanar, return origin if(plane.distanceToPoint(this.origin)===0){return 0;}// Null is preferable to undefined since undefined means.... it is undefined return null;}var t=-(this.origin.dot(plane.normal)+plane.constant)/denominator;// Return if the ray never intersects the plane return t>=0?t:null;},intersectPlane:function(plane,target){var t=this.distanceToPlane(plane);if(t===null){return null;}return this.at(t,target);},intersectsPlane:function(plane){// check if the ray lies on the plane first var distToPoint=plane.distanceToPoint(this.origin);if(distToPoint===0){return true;}var denominator=plane.normal.dot(this.direction);if(denominator*distToPoint<0){return true;}// ray origin is behind the plane (and is pointing behind it) return false;},intersectBox:function(box,target){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;// These lines also handle the case where tmin or tmax is NaN // (result of 0 * Infinity). x !== x returns true if x is NaN if(tymin>tmin||tmin!==tmin)tmin=tymin;if(tymax=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=0?tmin:tmax,target);},intersectsBox:function(){var v=new Vector3();return function intersectsBox(box){return this.intersectBox(box,v)!==null;};}(),intersectTriangle:function(){// Compute the offset origin, edges, and normal. var diff=new Vector3();var edge1=new Vector3();var edge2=new Vector3();var normal=new Vector3();return function intersectTriangle(a,b,c,backfaceCulling,target){// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h edge1.subVectors(b,a);edge2.subVectors(c,a);normal.crossVectors(edge1,edge2);// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction, // E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by // |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2)) // |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q)) // |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N) 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));// b1 < 0, no intersection if(DdQxE2<0){return null;}var DdE1xQ=sign*this.direction.dot(edge1.cross(diff));// b2 < 0, no intersection if(DdE1xQ<0){return null;}// b1+b2 > 1, no intersection if(DdQxE2+DdE1xQ>DdN){return null;}// Line intersects triangle, check if ray does. var QdN=-sign*diff.dot(normal);// t < 0, no intersection if(QdN<0){return null;}// Ray intersects triangle. return this.at(QdN/DdN,target);};}(),applyMatrix4:function(matrix4){this.origin.applyMatrix4(matrix4);this.direction.transformDirection(matrix4);return this;},equals:function(ray){return ray.origin.equals(this.origin)&&ray.direction.equals(this.direction);}});/** * @author bhouston / http://clara.io */function Line3(start,end){this.start=start!==undefined?start:new Vector3();this.end=end!==undefined?end:new Vector3();}Object.assign(Line3.prototype,{set:function(start,end){this.start.copy(start);this.end.copy(end);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(line){this.start.copy(line.start);this.end.copy(line.end);return this;},getCenter:function(target){if(target===undefined){console.warn('THREE.Line3: .getCenter() target is now required');target=new Vector3();}return target.addVectors(this.start,this.end).multiplyScalar(0.5);},delta:function(target){if(target===undefined){console.warn('THREE.Line3: .delta() target is now required');target=new Vector3();}return target.subVectors(this.end,this.start);},distanceSq:function(){return this.start.distanceToSquared(this.end);},distance:function(){return this.start.distanceTo(this.end);},at:function(t,target){if(target===undefined){console.warn('THREE.Line3: .at() target is now required');target=new Vector3();}return this.delta(target).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=_Math.clamp(t,0,1);}return t;};}(),closestPointToPoint:function(point,clampToLine,target){var t=this.closestPointToPointParameter(point,clampToLine);if(target===undefined){console.warn('THREE.Line3: .closestPointToPoint() target is now required');target=new Vector3();}return this.delta(target).multiplyScalar(t).add(this.start);},applyMatrix4:function(matrix){this.start.applyMatrix4(matrix);this.end.applyMatrix4(matrix);return this;},equals:function(line){return line.start.equals(this.start)&&line.end.equals(this.end);}});/** * @author bhouston / http://clara.io * @author mrdoob / http://mrdoob.com/ */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();}Object.assign(Triangle,{getNormal:function(){var v0=new Vector3();return function getNormal(a,b,c,target){if(target===undefined){console.warn('THREE.Triangle: .getNormal() target is now required');target=new Vector3();}target.subVectors(c,b);v0.subVectors(a,b);target.cross(v0);var targetLengthSq=target.lengthSq();if(targetLengthSq>0){return target.multiplyScalar(1/Math.sqrt(targetLengthSq));}return target.set(0,0,0);};}(),// static/instance method to calculate barycentric coordinates // based on: http://www.blackpawn.com/texts/pointinpoly/default.html getBarycoord:function(){var v0=new Vector3();var v1=new Vector3();var v2=new Vector3();return function getBarycoord(point,a,b,c,target){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;if(target===undefined){console.warn('THREE.Triangle: .getBarycoord() target is now required');target=new Vector3();}// collinear or singular triangle if(denom===0){// arbitrary location outside of triangle? // not sure if this is the best idea, maybe should be returning undefined return target.set(-2,-1,-1);}var invDenom=1/denom;var u=(dot11*dot02-dot01*dot12)*invDenom;var v=(dot00*dot12-dot01*dot02)*invDenom;// barycentric coordinates must always sum to 1 return target.set(1-u-v,v,u);};}(),containsPoint:function(){var v1=new Vector3();return function containsPoint(point,a,b,c){Triangle.getBarycoord(point,a,b,c,v1);return v1.x>=0&&v1.y>=0&&v1.x+v1.y<=1;};}()});Object.assign(Triangle.prototype,{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this;},setFromPointsAndIndices:function(points,i0,i1,i2){this.a.copy(points[i0]);this.b.copy(points[i1]);this.c.copy(points[i2]);return this;},clone:function(){return new this.constructor().copy(this);},copy:function(triangle){this.a.copy(triangle.a);this.b.copy(triangle.b);this.c.copy(triangle.c);return this;},getArea:function(){var v0=new Vector3();var v1=new Vector3();return function getArea(){v0.subVectors(this.c,this.b);v1.subVectors(this.a,this.b);return v0.cross(v1).length()*0.5;};}(),getMidpoint:function(target){if(target===undefined){console.warn('THREE.Triangle: .getMidpoint() target is now required');target=new Vector3();}return target.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3);},getNormal:function(target){return Triangle.getNormal(this.a,this.b,this.c,target);},getPlane:function(target){if(target===undefined){console.warn('THREE.Triangle: .getPlane() target is now required');target=new Vector3();}return target.setFromCoplanarPoints(this.a,this.b,this.c);},getBarycoord:function(point,target){return Triangle.getBarycoord(point,this.a,this.b,this.c,target);},containsPoint:function(point){return Triangle.containsPoint(point,this.a,this.b,this.c);},intersectsBox:function(box){return box.intersectsTriangle(this);},closestPointToPoint:function(){var plane=new Plane();var edgeList=[new Line3(),new Line3(),new Line3()];var projectedPoint=new Vector3();var closestPoint=new Vector3();return function closestPointToPoint(point,target){if(target===undefined){console.warn('THREE.Triangle: .closestPointToPoint() target is now required');target=new Vector3();}var minDistance=Infinity;// project the point onto the plane of the triangle plane.setFromCoplanarPoints(this.a,this.b,this.c);plane.projectPoint(point,projectedPoint);// check if the projection lies within the triangle if(this.containsPoint(projectedPoint)===true){// if so, this is the closest point target.copy(projectedPoint);}else{// if not, the point falls outside the triangle. the target is the closest point to the triangle's edges or vertices 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;i0){var morphAttribute=morphAttributes[keys[0]];if(morphAttribute!==undefined){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphAttribute.length;m0){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphTargets.length;mraycaster.far)return null;return {distance:distance,point:intersectionPointWorld.clone(),object:object};}function checkBufferGeometryIntersection(object,raycaster,ray,position,uv,a,b,c){vA.fromBufferAttribute(position,a);vB.fromBufferAttribute(position,b);vC.fromBufferAttribute(position,c);var intersection=checkIntersection(object,object.material,raycaster,ray,vA,vB,vC,intersectionPoint);if(intersection){if(uv){uvA.fromBufferAttribute(uv,a);uvB.fromBufferAttribute(uv,b);uvC.fromBufferAttribute(uv,c);intersection.uv=uvIntersection(intersectionPoint,vA,vB,vC,uvA,uvB,uvC);}var face=new Face3(a,b,c);Triangle.getNormal(vA,vB,vC,face.normal);intersection.face=face;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;// Checking boundingSphere distance to ray 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);// Check boundingBox before continuing if(geometry.boundingBox!==null){if(ray.intersectsBox(geometry.boundingBox)===false)return;}var intersection;if(geometry.isBufferGeometry){var a,b,c;var index=geometry.index;var position=geometry.attributes.position;var uv=geometry.attributes.uv;var i,l;if(index!==null){// indexed buffer geometry for(i=0,l=index.count;i0)uvs=faceVertexUvs;for(var f=0,fl=faces.length;f0&&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;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};}/** * @author tschw */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.numIntersection=0;this.init=function(planes,enableLocalClipping,camera){var enabled=planes.length!==0||enableLocalClipping||// enable state of previous frame - the clipping code has to // run another frame in order to reset the state: 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,clipIntersection,clipShadows,camera,cache,fromCache){if(!localClippingEnabled||planes===null||planes.length===0||renderingShadows&&!clipShadows){// there's no local clipping if(renderingShadows){// there's no global clipping projectPlanes(null);}else{resetGlobalState();}}else{var nGlobal=renderingShadows?0:numGlobalPlanes,lGlobal=nGlobal*4,dstArray=cache.clippingState||null;uniform.value=dstArray;// ensure unique state dstArray=projectPlanes(planes,camera,lGlobal,fromCache);for(var i=0;i!==lGlobal;++i){dstArray[i]=globalState[i];}cache.clippingState=dstArray;this.numIntersection=clipIntersection?this.numPlanes:0;this.numPlanes+=nGlobal;}};function resetGlobalState(){if(uniform.value!==globalState){uniform.value=globalState;uniform.needsUpdate=numGlobalPlanes>0;}scope.numPlanes=numGlobalPlanes;scope.numIntersection=0;}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.length65535?Uint32BufferAttribute:Uint16BufferAttribute)(indices,1);attributes.update(attribute,gl.ELEMENT_ARRAY_BUFFER);wireframeAttributes[geometry.id]=attribute;return attribute;}return {get:get,update:update,getWireframeAttribute:getWireframeAttribute};}/** * @author mrdoob / http://mrdoob.com/ */function WebGLIndexedBufferRenderer(gl,extensions,info){var mode;function setMode(value){mode=value;}var type,bytesPerElement;function setIndex(value){type=value.type;bytesPerElement=value.bytesPerElement;}function render(start,count){gl.drawElements(mode,count,type,start*bytesPerElement);info.update(count,mode);}function renderInstances(geometry,start,count){var extension=extensions.get('ANGLE_instanced_arrays');if(extension===null){console.error('THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}extension.drawElementsInstancedANGLE(mode,count,type,start*bytesPerElement,geometry.maxInstancedCount);info.update(count,mode,geometry.maxInstancedCount);}// this.setMode=setMode;this.setIndex=setIndex;this.render=render;this.renderInstances=renderInstances;}/** * @author Mugen87 / https://github.com/Mugen87 */function WebGLInfo(gl){var memory={geometries:0,textures:0};var render={frame:0,calls:0,triangles:0,points:0,lines:0};function update(count,mode,instanceCount){instanceCount=instanceCount||1;render.calls++;switch(mode){case gl.TRIANGLES:render.triangles+=instanceCount*(count/3);break;case gl.TRIANGLE_STRIP:case gl.TRIANGLE_FAN:render.triangles+=instanceCount*(count-2);break;case gl.LINES:render.lines+=instanceCount*(count/2);break;case gl.LINE_STRIP:render.lines+=instanceCount*(count-1);break;case gl.LINE_LOOP:render.lines+=instanceCount*count;break;case gl.POINTS:render.points+=instanceCount*count;break;default:console.error('THREE.WebGLInfo: Unknown draw mode:',mode);break;}}function reset(){render.frame++;render.calls=0;render.triangles=0;render.points=0;render.lines=0;}return {memory:memory,render:render,programs:null,autoReset:true,reset:reset,update:update};}/** * @author mrdoob / http://mrdoob.com/ */function absNumericalSort(a,b){return Math.abs(b[1])-Math.abs(a[1]);}function WebGLMorphtargets(gl){var influencesList={};var morphInfluences=new Float32Array(8);function update(object,geometry,material,program){var objectInfluences=object.morphTargetInfluences;var length=objectInfluences.length;var influences=influencesList[geometry.id];if(influences===undefined){// initialise list influences=[];for(var i=0;i0)return array;// unoptimized: ! isNaN( firstElem ) // see http://jacksondunstan.com/articles/983 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;}// Texture unit allocation 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;}// --- Setters --- // Note: Defining these methods externally, because they come in a bunch // and this way their names minify. // Single scalar function setValue1f(gl,v){gl.uniform1f(this.addr,v);}function setValue1i(gl,v){gl.uniform1i(this.addr,v);}// Single float vector (from flat array or THREE.VectorN) 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);}}// Single matrix (from flat array or MatrixN) function setValue2fm(gl,v){gl.uniformMatrix2fv(this.addr,false,v.elements||v);}function setValue3fm(gl,v){if(v.elements===undefined){gl.uniformMatrix3fv(this.addr,false,v);}else{mat3array.set(v.elements);gl.uniformMatrix3fv(this.addr,false,mat3array);}}function setValue4fm(gl,v){if(v.elements===undefined){gl.uniformMatrix4fv(this.addr,false,v);}else{mat4array.set(v.elements);gl.uniformMatrix4fv(this.addr,false,mat4array);}}// Single texture (2D / Cube) 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);}// Integer / Boolean vectors or arrays thereof (always flat arrays) 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);}// Helper to pick the right setter for the singular case function getSingularSetter(type){switch(type){case 0x1406:return setValue1f;// FLOAT case 0x8b50:return setValue2fv;// _VEC2 case 0x8b51:return setValue3fv;// _VEC3 case 0x8b52:return setValue4fv;// _VEC4 case 0x8b5a:return setValue2fm;// _MAT2 case 0x8b5b:return setValue3fm;// _MAT3 case 0x8b5c:return setValue4fm;// _MAT4 case 0x8b5e:case 0x8d66:return setValueT1;// SAMPLER_2D, SAMPLER_EXTERNAL_OES case 0x8b60:return setValueT6;// SAMPLER_CUBE case 0x1404:case 0x8b56:return setValue1i;// INT, BOOL case 0x8b53:case 0x8b57:return setValue2iv;// _VEC2 case 0x8b54:case 0x8b58:return setValue3iv;// _VEC3 case 0x8b55:case 0x8b59:return setValue4iv;// _VEC4 }}// Array of scalars function setValue1fv(gl,v){gl.uniform1fv(this.addr,v);}function setValue1iv(gl,v){gl.uniform1iv(this.addr,v);}// Array of vectors (flat or from THREE classes) 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));}// Array of matrices (flat or from THREE clases) 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));}// Array of textures (2D / Cube) 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]);}}// Helper to pick the right setter for a pure (bottom-level) array function getPureArraySetter(type){switch(type){case 0x1406:return setValue1fv;// FLOAT case 0x8b50:return setValueV2a;// _VEC2 case 0x8b51:return setValueV3a;// _VEC3 case 0x8b52:return setValueV4a;// _VEC4 case 0x8b5a:return setValueM2a;// _MAT2 case 0x8b5b:return setValueM3a;// _MAT3 case 0x8b5c:return setValueM4a;// _MAT4 case 0x8b5e:return setValueT1a;// SAMPLER_2D case 0x8b60:return setValueT6a;// SAMPLER_CUBE case 0x1404:case 0x8b56:return setValue1iv;// INT, BOOL case 0x8b53:case 0x8b57:return setValue2iv;// _VEC2 case 0x8b54:case 0x8b58:return setValue3iv;// _VEC3 case 0x8b55:case 0x8b59:return setValue4iv;// _VEC4 }}// --- Uniform Classes --- function SingleUniform(id,activeInfo,addr){this.id=id;this.addr=addr;this.setValue=getSingularSetter(activeInfo.type);// this.path = activeInfo.name; // DEBUG }function PureArrayUniform(id,activeInfo,addr){this.id=id;this.addr=addr;this.size=activeInfo.size;this.setValue=getPureArraySetter(activeInfo.type);// this.path = activeInfo.name; // DEBUG }function StructuredUniform(id){this.id=id;UniformContainer.call(this);// mix-in }StructuredUniform.prototype.setValue=function(gl,value){// Note: Don't need an extra 'renderer' parameter, since samplers // are not allowed in structured uniforms. var seq=this.seq;for(var i=0,n=seq.length;i!==n;++i){var u=seq[i];u.setValue(gl,value[u.id]);}};// --- Top-level --- // Parser - builds up the property tree from the path strings var RePathPart=/([\w\d_]+)(\])?(\[|\.)?/g;// extracts // - the identifier (member name or array index) // - followed by an optional right bracket (found when array index) // - followed by an optional left bracket or dot (type of subscript) // // Note: These portions can be read in a non-overlapping fashion and // allow straightforward parsing of the hierarchy that WebGL encodes // in the uniform names. 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;// reset RegExp object, because of the early exit of a previous run 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;// convert to integer if(subscript===undefined||subscript==='['&&matchEnd+2===pathLength){// bare name or "pure" bottom-level array "[0]" suffix addUniform(container,subscript===undefined?new SingleUniform(id,activeInfo,addr):new PureArrayUniform(id,activeInfo,addr));break;}else{// step into inner node / create it in case it doesn't exist var map=container.map,next=map[id];if(next===undefined){next=new StructuredUniform(id);addUniform(container,next);}container=next;}}}// Root Container function WebGLUniforms(gl,program,renderer){UniformContainer.call(this);this.renderer=renderer;var n=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);for(var i=0;i/gm;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=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g;function replace(match,start,end,snippet){var unroll='';for(var i=parseInt(start);i0?renderer.gammaFactor:1.0;// console.log( 'building new program ' ); // var customExtensions=generateExtensions(material.extensions,parameters,extensions);var customDefines=generateDefines(defines);// var program=gl.createProgram();var prefixVertex,prefixFragment;if(material.isRawShaderMaterial){prefixVertex=[customDefines].filter(filterEmptyLine).join('\n');if(prefixVertex.length>0){prefixVertex+='\n';}prefixFragment=[customExtensions,customDefines].filter(filterEmptyLine).join('\n');if(prefixFragment.length>0){prefixFragment+='\n';}}else{prefixVertex=['precision '+parameters.precision+' float;','precision '+parameters.precision+' int;','#define SHADER_NAME '+shader.name,customDefines,parameters.supportsVertexTextures?'#define VERTEX_TEXTURES':'','#define GAMMA_FACTOR '+gammaFactorDefine,'#define MAX_BONES '+parameters.maxBones,parameters.useFog&¶meters.fog?'#define USE_FOG':'',parameters.useFog&¶meters.fogExp?'#define FOG_EXP2':'',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&¶meters.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&¶meters.flatShading===false?'#define USE_MORPHNORMALS':'',parameters.doubleSided?'#define DOUBLE_SIDED':'',parameters.flipSided?'#define FLIP_SIDED':'',parameters.shadowMapEnabled?'#define USE_SHADOWMAP':'',parameters.shadowMapEnabled?'#define '+shadowMapTypeDefine:'',parameters.sizeAttenuation?'#define USE_SIZEATTENUATION':'',parameters.logarithmicDepthBuffer?'#define USE_LOGDEPTHBUF':'',parameters.logarithmicDepthBuffer&&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 '+shader.name,customDefines,parameters.alphaTest?'#define ALPHATEST '+parameters.alphaTest:'','#define GAMMA_FACTOR '+gammaFactorDefine,parameters.useFog&¶meters.fog?'#define USE_FOG':'',parameters.useFog&¶meters.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.gradientMap?'#define USE_GRADIENTMAP':'',parameters.flatShading?'#define FLAT_SHADED':'',parameters.doubleSided?'#define DOUBLE_SIDED':'',parameters.flipSided?'#define FLIP_SIDED':'',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&&extensions.get('EXT_frag_depth')?'#define USE_LOGDEPTHBUF_EXT':'',parameters.envMap&&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']:'',// this code is required here because it is used by the toneMapping() function defined below parameters.toneMapping!==NoToneMapping?getToneMappingFunction('toneMapping',parameters.toneMapping):'',parameters.dithering?'#define DITHERING':'',parameters.outputEncoding||parameters.mapEncoding||parameters.envMapEncoding||parameters.emissiveMapEncoding?ShaderChunk['encodings_pars_fragment']:'',// this code is required here because it is used by the various encoding/decoding function defined below 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);vertexShader=replaceLightNums(vertexShader,parameters);vertexShader=replaceClippingPlaneNums(vertexShader,parameters);fragmentShader=parseIncludes(fragmentShader);fragmentShader=replaceLightNums(fragmentShader,parameters);fragmentShader=replaceClippingPlaneNums(fragmentShader,parameters);vertexShader=unrollLoops(vertexShader);fragmentShader=unrollLoops(fragmentShader);var vertexGlsl=prefixVertex+vertexShader;var fragmentGlsl=prefixFragment+fragmentShader;// console.log( '*VERTEX*', vertexGlsl ); // console.log( '*FRAGMENT*', fragmentGlsl ); var glVertexShader=WebGLShader(gl,gl.VERTEX_SHADER,vertexGlsl);var glFragmentShader=WebGLShader(gl,gl.FRAGMENT_SHADER,fragmentGlsl);gl.attachShader(program,glVertexShader);gl.attachShader(program,glFragmentShader);// Force a particular attribute to index 0. if(material.index0AttributeName!==undefined){gl.bindAttribLocation(program,0,material.index0AttributeName);}else if(parameters.morphTargets===true){// programs with morphTargets displace position out of attribute 0 gl.bindAttribLocation(program,0,'position');}gl.linkProgram(program);var programLog=gl.getProgramInfoLog(program).trim();var vertexLog=gl.getShaderInfoLog(glVertexShader).trim();var fragmentLog=gl.getShaderInfoLog(glFragmentShader).trim();var runnable=true;var haveDiagnostics=true;// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) ); // console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) ); 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}};}// clean up gl.deleteShader(glVertexShader);gl.deleteShader(glFragmentShader);// set up caching for uniform locations var cachedUniforms;this.getUniforms=function(){if(cachedUniforms===undefined){cachedUniforms=new WebGLUniforms(gl,program,renderer);}return cachedUniforms;};// set up caching for attribute locations var cachedAttributes;this.getAttributes=function(){if(cachedAttributes===undefined){cachedAttributes=fetchAttributeLocations(gl,program);}return cachedAttributes;};// free resource this.destroy=function(){gl.deleteProgram(program);this.program=undefined;};// DEPRECATED Object.defineProperties(this,{uniforms:{get:function(){console.warn('THREE.WebGLProgram: .uniforms is now .getUniforms().');return this.getUniforms();}},attributes:{get:function(){console.warn('THREE.WebGLProgram: .attributes is now .getAttributes().');return this.getAttributes();}}});// this.name=shader.name;this.id=programIdCount++;this.code=code;this.usedTimes=1;this.program=program;this.vertexShader=glVertexShader;this.fragmentShader=glFragmentShader;return this;}/** * @author mrdoob / http://mrdoob.com/ */function WebGLPrograms(renderer,extensions,capabilities){var programs=[];var shaderIDs={MeshDepthMaterial:'depth',MeshDistanceMaterial:'distanceRGBA',MeshNormalMaterial:'normal',MeshBasicMaterial:'basic',MeshLambertMaterial:'lambert',MeshPhongMaterial:'phong',MeshToonMaterial:'phong',MeshStandardMaterial:'physical',MeshPhysicalMaterial:'physical',LineBasicMaterial:'basic',LineDashedMaterial:'dashed',PointsMaterial:'points',ShadowMaterial:'shadow'};var parameterNames=["precision","supportsVertexTextures","map","mapEncoding","envMap","envMapMode","envMapEncoding","lightMap","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","displacementMap","specularMap","roughnessMap","metalnessMap","gradientMap","alphaMap","combine","vertexColors","fog","useFog","fogExp","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","maxMorphTargets","maxMorphNormals","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","shadowMapEnabled","shadowMapType","toneMapping",'physicallyCorrectLights',"alphaTest","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering"];function allocateBones(object){var skeleton=object.skeleton;var bones=skeleton.bones;if(capabilities.floatVertexTextures){return 1024;}else{// default for when object is not specified // ( for example when prebuilding shader to be used with multiple objects ) // // - leave some extra space for other uniforms // - limit here is ANGLE's 254 max uniform vectors // (up to 54 should be safe) var nVertexUniforms=capabilities.maxVertexUniforms;var nVertexMatrices=Math.floor((nVertexUniforms-20)/4);var maxBones=Math.min(nVertexMatrices,bones.length);if(maxBones0,maxBones:maxBones,useVertexTexture:capabilities.floatVertexTextures,morphTargets:material.morphTargets,morphNormals:material.morphNormals,maxMorphTargets:renderer.maxMorphTargets,maxMorphNormals:renderer.maxMorphNormals,numDirLights:lights.directional.length,numPointLights:lights.point.length,numSpotLights:lights.spot.length,numRectAreaLights:lights.rectArea.length,numHemiLights:lights.hemi.length,numClippingPlanes:nClipPlanes,numClipIntersection:nClipIntersection,dithering:material.dithering,shadowMapEnabled:renderer.shadowMap.enabled&&object.receiveShadow&&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;i1)opaque.sort(painterSortStable);if(transparent.length>1)transparent.sort(reversePainterSortStable);}return {opaque:opaque,transparent:transparent,init:init,push:push,sort:sort};}function WebGLRenderLists(){var lists={};function get(scene,camera){var hash=scene.id+','+camera.id;var list=lists[hash];if(list===undefined){// console.log( 'THREE.WebGLRenderLists:', hash ); list=new WebGLRenderList();lists[hash]=list;}return list;}function dispose(){lists={};}return {get:get,dispose:dispose};}/** * @author mrdoob / http://mrdoob.com/ */function UniformsCache(){var lights={};return {get:function(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(),shadowCameraNear:1,shadowCameraFar:1000};break;case'HemisphereLight':uniforms={direction:new Vector3(),skyColor:new Color(),groundColor:new Color()};break;case'RectAreaLight':uniforms={color:new Color(),position:new Vector3(),halfWidth:new Vector3(),halfHeight:new Vector3()// TODO (abelnation): set RectAreaLight shadow uniforms };break;}lights[light.id]=uniforms;return uniforms;}};}var count=0;function WebGLLights(){var cache=new UniformsCache();var state={id:count++,hash:'',ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};var vector3=new Vector3();var matrix4=new Matrix4();var matrix42=new Matrix4();function setup(lights,shadows,camera){var r=0,g=0,b=0;var directionalLength=0;var pointLength=0;var spotLength=0;var rectAreaLength=0;var hemiLength=0;var viewMatrix=camera.matrixWorldInverse;for(var i=0,l=lights.length;i, * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * } */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;};/** * @author WestLangley / http://github.com/WestLangley * * parameters = { * * referencePosition: , * nearDistance: , * farDistance: , * * skinning: , * morphTargets: , * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: * * } */function MeshDistanceMaterial(parameters){Material.call(this);this.type='MeshDistanceMaterial';this.referencePosition=new Vector3();this.nearDistance=1;this.farDistance=1000;this.skinning=false;this.morphTargets=false;this.map=null;this.alphaMap=null;this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.fog=false;this.lights=false;this.setValues(parameters);}MeshDistanceMaterial.prototype=Object.create(Material.prototype);MeshDistanceMaterial.prototype.constructor=MeshDistanceMaterial;MeshDistanceMaterial.prototype.isMeshDistanceMaterial=true;MeshDistanceMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.referencePosition.copy(source.referencePosition);this.nearDistance=source.nearDistance;this.farDistance=source.farDistance;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;return this;};/** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */function WebGLShadowMap(_renderer,_objects,maxTextureSize){var _frustum=new Frustum(),_projScreenMatrix=new Matrix4(),_shadowMapSize=new Vector2(),_maxShadowMapSize=new Vector2(maxTextureSize,maxTextureSize),_lookTarget=new Vector3(),_lightPositionWorld=new Vector3(),_MorphingFlag=1,_SkinningFlag=2,_NumberOfMaterialVariants=(_MorphingFlag|_SkinningFlag)+1,_depthMaterials=new Array(_NumberOfMaterialVariants),_distanceMaterials=new Array(_NumberOfMaterialVariants),_materialCache={};var shadowSide={0:BackSide,1:FrontSide,2:DoubleSide};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()];// init for(var i=0;i!==_NumberOfMaterialVariants;++i){var useMorphing=(i&_MorphingFlag)!==0;var useSkinning=(i&_SkinningFlag)!==0;var depthMaterial=new MeshDepthMaterial({depthPacking:RGBADepthPacking,morphTargets:useMorphing,skinning:useSkinning});_depthMaterials[i]=depthMaterial;// var distanceMaterial=new MeshDistanceMaterial({morphTargets:useMorphing,skinning:useSkinning});_distanceMaterials[i]=distanceMaterial;}// var scope=this;this.enabled=false;this.autoUpdate=true;this.needsUpdate=false;this.type=PCFShadowMap;this.render=function(lights,scene,camera){if(scope.enabled===false)return;if(scope.autoUpdate===false&&scope.needsUpdate===false)return;if(lights.length===0)return;// TODO Clean up (needed in case of contextlost) var _gl=_renderer.context;var _state=_renderer.state;// Set GL state for depth map. _state.disable(_gl.BLEND);_state.buffers.color.setClear(1,1,1,1);_state.buffers.depth.setTest(true);_state.setScissorTest(false);// render depth map var faceCount;for(var i=0,il=lights.length;i0;}else if(geometry&&geometry.isGeometry){useMorphing=geometry.morphTargets&&geometry.morphTargets.length>0;}}if(object.isSkinnedMesh&&material.skinning===false){console.warn('THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:',object);}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){// in this case we need a unique material instance reflecting the // appropriate state 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;result.side=material.shadowSide!=null?material.shadowSide:shadowSide[material.side];result.clipShadows=material.clipShadows;result.clippingPlanes=material.clippingPlanes;result.clipIntersection=material.clipIntersection;result.wireframeLinewidth=material.wireframeLinewidth;result.linewidth=material.linewidth;if(isPointLight&&result.isMeshDistanceMaterial){result.referencePosition.copy(lightPositionWorld);result.nearDistance=shadowCameraNear;result.farDistance=shadowCameraFar;}return result;}function renderObject(object,camera,shadowCamera,isPointLight){if(object.visible===false)return;var visible=object.layers.test(camera.layers);if(visible&&(object.isMesh||object.isLine||object.isPoints)){if(object.castShadow&&(!object.frustumCulled||_frustum.intersectsObject(object))){object.modelViewMatrix.multiplyMatrices(shadowCamera.matrixWorldInverse,object.matrixWorld);var geometry=_objects.update(object);var material=object.material;if(Array.isArray(material)){var groups=geometry.groups;for(var k=0,kl=groups.length;k 0 ) {',' float fogFactor = 0.0;',' if ( fogType == 1 ) {',' fogFactor = smoothstep( fogNear, fogFar, fogDepth );',' } else {',' const float LOG2 = 1.442695;',' fogFactor = exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 );',' fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',' }',' gl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, 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;}}}/** * @author mrdoob / http://mrdoob.com/ */function WebGLState(gl,extensions,utils){function ColorBuffer(){var locked=false;var color=new Vector4();var currentColorMask=null;var currentColorClear=new Vector4(0,0,0,0);return {setMask:function(colorMask){if(currentColorMask!==colorMask&&!locked){gl.colorMask(colorMask,colorMask,colorMask,colorMask);currentColorMask=colorMask;}},setLocked:function(lock){locked=lock;},setClear:function(r,g,b,a,premultipliedAlpha){if(premultipliedAlpha===true){r*=a;g*=a;b*=a;}color.set(r,g,b,a);if(currentColorClear.equals(color)===false){gl.clearColor(r,g,b,a);currentColorClear.copy(color);}},reset:function(){locked=false;currentColorMask=null;currentColorClear.set(-1,0,0,0);// set to invalid state }};}function DepthBuffer(){var locked=false;var currentDepthMask=null;var currentDepthFunc=null;var currentDepthClear=null;return {setTest:function(depthTest){if(depthTest){enable(gl.DEPTH_TEST);}else{disable(gl.DEPTH_TEST);}},setMask:function(depthMask){if(currentDepthMask!==depthMask&&!locked){gl.depthMask(depthMask);currentDepthMask=depthMask;}},setFunc:function(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(lock){locked=lock;},setClear:function(depth){if(currentDepthClear!==depth){gl.clearDepth(depth);currentDepthClear=depth;}},reset:function(){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(stencilTest){if(stencilTest){enable(gl.STENCIL_TEST);}else{disable(gl.STENCIL_TEST);}},setMask:function(stencilMask){if(currentStencilMask!==stencilMask&&!locked){gl.stencilMask(stencilMask);currentStencilMask=stencilMask;}},setFunc:function(stencilFunc,stencilRef,stencilMask){if(currentStencilFunc!==stencilFunc||currentStencilRef!==stencilRef||currentStencilFuncMask!==stencilMask){gl.stencilFunc(stencilFunc,stencilRef,stencilMask);currentStencilFunc=stencilFunc;currentStencilRef=stencilRef;currentStencilFuncMask=stencilMask;}},setOp:function(stencilFail,stencilZFail,stencilZPass){if(currentStencilFail!==stencilFail||currentStencilZFail!==stencilZFail||currentStencilZPass!==stencilZPass){gl.stencilOp(stencilFail,stencilZFail,stencilZPass);currentStencilFail=stencilFail;currentStencilZFail=stencilZFail;currentStencilZPass=stencilZPass;}},setLocked:function(lock){locked=lock;},setClear:function(stencil){if(currentStencilClear!==stencil){gl.clearStencil(stencil);currentStencilClear=stencil;}},reset:function(){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 currentProgram=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 maxTextures=gl.getParameter(gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS);var lineWidthAvailable=false;var version=0;var glVersion=gl.getParameter(gl.VERSION);if(glVersion.indexOf('WebGL')!==-1){version=parseFloat(/^WebGL\ ([0-9])/.exec(glVersion)[1]);lineWidthAvailable=version>=1.0;}else if(glVersion.indexOf('OpenGL ES')!==-1){version=parseFloat(/^OpenGL\ ES\ ([0-9])/.exec(glVersion)[1]);lineWidthAvailable=version>=2.0;}var currentTextureSlot=null;var currentBoundTextures={};var currentScissor=new Vector4();var currentViewport=new Vector4();function createTexture(type,target,count){var data=new Uint8Array(4);// 4 is required to match default unpack alignment of 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;imaxSize||image.height>maxSize){if('data'in image){console.warn('THREE.WebGLRenderer: image in DataTexture is too big ('+image.width+'x'+image.height+').');return;}// Warning: Scaling through the canvas will only work with images that use // premultiplied alpha. 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 _Math.isPowerOfTwo(image.width)&&_Math.isPowerOfTwo(image.height);}function makePowerOfTwo(image){if(image instanceof HTMLImageElement||image instanceof HTMLCanvasElement||image instanceof ImageBitmap){if(_canvas===undefined)_canvas=document.createElementNS('http://www.w3.org/1999/xhtml','canvas');_canvas.width=_Math.floorPowerOfTwo(image.width);_canvas.height=_Math.floorPowerOfTwo(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){return texture.wrapS!==ClampToEdgeWrapping||texture.wrapT!==ClampToEdgeWrapping||texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;}function textureNeedsGenerateMipmaps(texture,isPowerOfTwo){return texture.generateMipmaps&&isPowerOfTwo&&texture.minFilter!==NearestFilter&&texture.minFilter!==LinearFilter;}function generateMipmap(target,texture,width,height){_gl.generateMipmap(target);var textureProperties=properties.get(texture);// Note: Math.log( x ) * Math.LOG2E used instead of Math.log2( x ) which is not supported by IE11 textureProperties.__maxMipLevel=Math.log(Math.max(width,height))*Math.LOG2E;}// Fallback filters for non-power-of-2 textures 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);if(texture.isVideoTexture){delete _videoTextures[texture.id];}info.memory.textures--;}function onRenderTargetDispose(event){var renderTarget=event.target;renderTarget.removeEventListener('dispose',onRenderTargetDispose);deallocateRenderTarget(renderTarget);info.memory.textures--;}// function deallocateTexture(texture){var textureProperties=properties.get(texture);if(texture.image&&textureProperties.__image__webglTextureCube){// cube texture _gl.deleteTexture(textureProperties.__image__webglTextureCube);}else{// 2D texture if(textureProperties.__webglInit===undefined)return;_gl.deleteTexture(textureProperties.__webglTexture);}// remove all webgl properties properties.remove(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.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.remove(renderTarget.texture);properties.remove(renderTarget);}// function setTexture2D(texture,slot){var textureProperties=properties.get(texture);if(texture.isVideoTexture)updateVideoTexture(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();info.memory.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=utils.convert(texture.format),glType=utils.convert(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-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(!isCompressed){textureProperties.__maxMipLevel=0;}else{textureProperties.__maxMipLevel=mipmaps.length-1;}if(textureNeedsGenerateMipmaps(texture,isPowerOfTwoImage)){// We assume images for cube map have the same size. generateMipmap(_gl.TEXTURE_CUBE_MAP,texture,image.width,image.height);}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,utils.convert(texture.wrapS));_gl.texParameteri(textureType,_gl.TEXTURE_WRAP_T,utils.convert(texture.wrapT));_gl.texParameteri(textureType,_gl.TEXTURE_MAG_FILTER,utils.convert(texture.magFilter));_gl.texParameteri(textureType,_gl.TEXTURE_MIN_FILTER,utils.convert(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();info.memory.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=utils.convert(texture.format),glType=utils.convert(texture.type);setTextureParameters(_gl.TEXTURE_2D,texture,isPowerOfTwoImage);var mipmap,mipmaps=texture.mipmaps;if(texture.isDepthTexture){// populate depth texture with dummy data 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){// WebGL 2.0 requires signed internalformat for glTexImage2D internalFormat=_gl.DEPTH_COMPONENT16;}if(texture.format===DepthFormat&&internalFormat===_gl.DEPTH_COMPONENT){// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are // DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if(texture.type!==UnsignedShortType&&texture.type!==UnsignedIntType){console.warn('THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.');texture.type=UnsignedShortType;glType=utils.convert(texture.type);}}// Depth stencil textures need the DEPTH_STENCIL internal format // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if(texture.format===DepthStencilFormat){internalFormat=_gl.DEPTH_STENCIL;// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are // DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL. // (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/) if(texture.type!==UnsignedInt248Type){console.warn('THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.');texture.type=UnsignedInt248Type;glType=utils.convert(texture.type);}}state.texImage2D(_gl.TEXTURE_2D,0,internalFormat,image.width,image.height,0,glFormat,glType,null);}else if(texture.isDataTexture){// use manually created mipmaps if available // if there are no manual mipmaps // set 0 level mipmap and then use GL to generate other mipmap levels if(mipmaps.length>0&&isPowerOfTwoImage){for(var i=0,il=mipmaps.length;i-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);}}textureProperties.__maxMipLevel=mipmaps.length-1;}else{// regular Texture (image, video, canvas) // use manually created mipmaps if available // if there are no manual mipmaps // set 0 level mipmap and then use GL to generate other mipmap levels if(mipmaps.length>0&&isPowerOfTwoImage){for(var i=0,il=mipmaps.length;i 1) return this.filmGauge/Math.max(this.aspect,1);},/** * Sets an offset in a larger frustum. This is useful for multi-window or * multi-monitor/multi-machine setups. * * For example, if you have 3x2 monitors and each monitor is 1920x1080 and * the monitors are in grid like this * * +---+---+---+ * | A | B | C | * +---+---+---+ * | D | E | F | * +---+---+---+ * * then for each monitor you would call it like this * * var w = 1920; * var h = 1080; * var fullWidth = w * 3; * var fullHeight = h * 2; * * --A-- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h ); * --B-- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h ); * --C-- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h ); * --D-- * camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h ); * --E-- * camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h ); * --F-- * camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h ); * * Note there is no reason monitors have to be the same size or in a grid. */setViewOffset:function(fullWidth,fullHeight,x,y,width,height){this.aspect=fullWidth/fullHeight;if(this.view===null){this.view={enabled:true,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1};}this.view.enabled=true;this.view.fullWidth=fullWidth;this.view.fullHeight=fullHeight;this.view.offsetX=x;this.view.offsetY=y;this.view.width=width;this.view.height=height;this.updateProjectionMatrix();},clearViewOffset:function(){if(this.view!==null){this.view.enabled=false;}this.updateProjectionMatrix();},updateProjectionMatrix:function(){var near=this.near,top=near*Math.tan(_Math.DEG2RAD*0.5*this.fov)/this.zoom,height=2*top,width=this.aspect*height,left=-0.5*width,view=this.view;if(this.view!==null&&this.view.enabled){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.makePerspective(left,left+width,top,top-height,near,this.far);},toJSON:function(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=Object.assign({},this.view);data.object.filmGauge=this.filmGauge;data.object.filmOffset=this.filmOffset;return data;}});/** * @author mrdoob / http://mrdoob.com/ */function ArrayCamera(array){PerspectiveCamera.call(this);this.cameras=array||[];}ArrayCamera.prototype=Object.assign(Object.create(PerspectiveCamera.prototype),{constructor:ArrayCamera,isArrayCamera:true});/** * @author mrdoob / http://mrdoob.com/ */function WebVRManager(renderer){var scope=this;var device=null;var frameData=null;var poseTarget=null;var standingMatrix=new Matrix4();var standingMatrixInverse=new Matrix4();if(typeof window!=='undefined'&&'VRFrameData'in window){frameData=new window.VRFrameData();window.addEventListener('vrdisplaypresentchange',onVRDisplayPresentChange,false);}var matrixWorldInverse=new Matrix4();var tempQuaternion=new Quaternion();var tempPosition=new Vector3();var cameraL=new PerspectiveCamera();cameraL.bounds=new Vector4(0.0,0.0,0.5,1.0);cameraL.layers.enable(1);var cameraR=new PerspectiveCamera();cameraR.bounds=new Vector4(0.5,0.0,0.5,1.0);cameraR.layers.enable(2);var cameraVR=new ArrayCamera([cameraL,cameraR]);cameraVR.layers.enable(1);cameraVR.layers.enable(2);// function isPresenting(){return device!==null&&device.isPresenting===true;}var currentSize,currentPixelRatio;function onVRDisplayPresentChange(){if(isPresenting()){var eyeParameters=device.getEyeParameters('left');var renderWidth=eyeParameters.renderWidth;var renderHeight=eyeParameters.renderHeight;currentPixelRatio=renderer.getPixelRatio();currentSize=renderer.getSize();renderer.setDrawingBufferSize(renderWidth*2,renderHeight,1);}else if(scope.enabled){renderer.setDrawingBufferSize(currentSize.width,currentSize.height,currentPixelRatio);}}// this.enabled=false;this.userHeight=1.6;this.getDevice=function(){return device;};this.setDevice=function(value){if(value!==undefined)device=value;};this.setPoseTarget=function(object){if(object!==undefined)poseTarget=object;};this.getCamera=function(camera){if(device===null)return camera;device.depthNear=camera.near;device.depthFar=camera.far;device.getFrameData(frameData);// var stageParameters=device.stageParameters;if(stageParameters){standingMatrix.fromArray(stageParameters.sittingToStandingTransform);}else{standingMatrix.makeTranslation(0,scope.userHeight,0);}var pose=frameData.pose;var poseObject=poseTarget!==null?poseTarget:camera;// We want to manipulate poseObject by its position and quaternion components since users may rely on them. poseObject.matrix.copy(standingMatrix);poseObject.matrix.decompose(poseObject.position,poseObject.quaternion,poseObject.scale);if(pose.orientation!==null){tempQuaternion.fromArray(pose.orientation);poseObject.quaternion.multiply(tempQuaternion);}if(pose.position!==null){tempQuaternion.setFromRotationMatrix(standingMatrix);tempPosition.fromArray(pose.position);tempPosition.applyQuaternion(tempQuaternion);poseObject.position.add(tempPosition);}poseObject.updateMatrixWorld();if(device.isPresenting===false)return camera;// cameraL.near=camera.near;cameraR.near=camera.near;cameraL.far=camera.far;cameraR.far=camera.far;cameraVR.matrixWorld.copy(camera.matrixWorld);cameraVR.matrixWorldInverse.copy(camera.matrixWorldInverse);cameraL.matrixWorldInverse.fromArray(frameData.leftViewMatrix);cameraR.matrixWorldInverse.fromArray(frameData.rightViewMatrix);// TODO (mrdoob) Double check this code standingMatrixInverse.getInverse(standingMatrix);cameraL.matrixWorldInverse.multiply(standingMatrixInverse);cameraR.matrixWorldInverse.multiply(standingMatrixInverse);var parent=poseObject.parent;if(parent!==null){matrixWorldInverse.getInverse(parent.matrixWorld);cameraL.matrixWorldInverse.multiply(matrixWorldInverse);cameraR.matrixWorldInverse.multiply(matrixWorldInverse);}// envMap and Mirror needs camera.matrixWorld cameraL.matrixWorld.getInverse(cameraL.matrixWorldInverse);cameraR.matrixWorld.getInverse(cameraR.matrixWorldInverse);cameraL.projectionMatrix.fromArray(frameData.leftProjectionMatrix);cameraR.projectionMatrix.fromArray(frameData.rightProjectionMatrix);// HACK (mrdoob) // https://github.com/w3c/webvr/issues/203 cameraVR.projectionMatrix.copy(cameraL.projectionMatrix);// var layers=device.getLayers();if(layers.length){var layer=layers[0];if(layer.leftBounds!==null&&layer.leftBounds.length===4){cameraL.bounds.fromArray(layer.leftBounds);}if(layer.rightBounds!==null&&layer.rightBounds.length===4){cameraR.bounds.fromArray(layer.rightBounds);}}return cameraVR;};this.getStandingMatrix=function(){return standingMatrix;};this.submitFrame=function(){if(isPresenting())device.submitFrame();};this.dispose=function(){if(typeof window!=='undefined'){window.removeEventListener('vrdisplaypresentchange',onVRDisplayPresentChange);}};}/** * @author supereggbert / http://www.paulbrunt.co.uk/ * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author szimek / https://github.com/szimek/ * @author tschw */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,_powerPreference=parameters.powerPreference!==undefined?parameters.powerPreference:'default';var currentRenderList=null;var currentRenderState=null;// public properties this.domElement=_canvas;this.context=null;// clearing this.autoClear=true;this.autoClearColor=true;this.autoClearDepth=true;this.autoClearStencil=true;// scene graph this.sortObjects=true;// user-defined clipping this.clippingPlanes=[];this.localClippingEnabled=false;// physically based shading this.gammaFactor=2.0;// for backwards compatibility this.gammaInput=false;this.gammaOutput=false;// physical lights this.physicallyCorrectLights=false;// tone mapping this.toneMapping=LinearToneMapping;this.toneMappingExposure=1.0;this.toneMappingWhitePoint=1.0;// morphs this.maxMorphTargets=8;this.maxMorphNormals=4;// internal properties var _this=this,_isContextLost=false,// internal state cache _currentRenderTarget=null,_currentFramebuffer=null,_currentMaterialId=-1,_currentGeometryProgram='',_currentCamera=null,_currentArrayCamera=null,_currentViewport=new Vector4(),_currentScissor=new Vector4(),_currentScissorTest=null,// _usedTextureUnits=0,// _width=_canvas.width,_height=_canvas.height,_pixelRatio=1,_viewport=new Vector4(0,0,_width,_height),_scissor=new Vector4(0,0,_width,_height),_scissorTest=false,// frustum _frustum=new Frustum(),// clipping _clipping=new WebGLClipping(),_clippingEnabled=false,_localClippingEnabled=false,// camera matrices cache _projScreenMatrix=new Matrix4(),_vector3=new Vector3();function getTargetPixelRatio(){return _currentRenderTarget===null?_pixelRatio:1;}// initialize var _gl;try{var contextAttributes={alpha:_alpha,depth:_depth,stencil:_stencil,antialias:_antialias,premultipliedAlpha:_premultipliedAlpha,preserveDrawingBuffer:_preserveDrawingBuffer,powerPreference:_powerPreference};// event listeners must be registered before WebGL context is created, see #12753 _canvas.addEventListener('webglcontextlost',onContextLost,false);_canvas.addEventListener('webglcontextrestored',onContextRestore,false);_gl=_context||_canvas.getContext('webgl',contextAttributes)||_canvas.getContext('experimental-webgl',contextAttributes);if(_gl===null){if(_canvas.getContext('webgl')!==null){throw new Error('Error creating WebGL context with your selected attributes.');}else{throw new Error('Error creating WebGL context.');}}// Some experimental-webgl implementations do not have getShaderPrecisionFormat if(_gl.getShaderPrecisionFormat===undefined){_gl.getShaderPrecisionFormat=function(){return {'rangeMin':1,'rangeMax':1,'precision':1};};}}catch(error){console.error('THREE.WebGLRenderer: '+error.message);}var extensions,capabilities,state,info;var properties,textures,attributes,geometries,objects;var programCache,renderLists,renderStates;var background,morphtargets,bufferRenderer,indexedBufferRenderer;var spriteRenderer;var utils;function initGLContext(){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('OES_element_index_uint');extensions.get('ANGLE_instanced_arrays');utils=new WebGLUtils(_gl,extensions);capabilities=new WebGLCapabilities(_gl,extensions,parameters);state=new WebGLState(_gl,extensions,utils);state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));info=new WebGLInfo(_gl);properties=new WebGLProperties();textures=new WebGLTextures(_gl,extensions,state,properties,capabilities,utils,info);attributes=new WebGLAttributes(_gl);geometries=new WebGLGeometries(_gl,attributes,info);objects=new WebGLObjects(geometries,info);morphtargets=new WebGLMorphtargets(_gl);programCache=new WebGLPrograms(_this,extensions,capabilities);renderLists=new WebGLRenderLists();renderStates=new WebGLRenderStates();background=new WebGLBackground(_this,state,geometries,_premultipliedAlpha);bufferRenderer=new WebGLBufferRenderer(_gl,extensions,info);indexedBufferRenderer=new WebGLIndexedBufferRenderer(_gl,extensions,info);spriteRenderer=new WebGLSpriteRenderer(_this,_gl,state,textures,capabilities);info.programs=programCache.programs;_this.context=_gl;_this.capabilities=capabilities;_this.extensions=extensions;_this.properties=properties;_this.renderLists=renderLists;_this.state=state;_this.info=info;}initGLContext();// vr var vr=new WebVRManager(_this);this.vr=vr;// shadow map var shadowMap=new WebGLShadowMap(_this,objects,capabilities.maxTextureSize);this.shadowMap=shadowMap;// API this.getContext=function(){return _gl;};this.getContextAttributes=function(){return _gl.getContextAttributes();};this.forceContextLoss=function(){var extension=extensions.get('WEBGL_lose_context');if(extension)extension.loseContext();};this.forceContextRestore=function(){var extension=extensions.get('WEBGL_lose_context');if(extension)extension.restoreContext();};this.getPixelRatio=function(){return _pixelRatio;};this.setPixelRatio=function(value){if(value===undefined)return;_pixelRatio=value;this.setSize(_width,_height,false);};this.getSize=function(){return {width:_width,height:_height};};this.setSize=function(width,height,updateStyle){var device=vr.getDevice();if(device&&device.isPresenting){console.warn('THREE.WebGLRenderer: Can\'t change size while VR device is presenting.');return;}_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.getDrawingBufferSize=function(){return {width:_width*_pixelRatio,height:_height*_pixelRatio};};this.setDrawingBufferSize=function(width,height,pixelRatio){_width=width;_height=height;_pixelRatio=pixelRatio;_canvas.width=width*pixelRatio;_canvas.height=height*pixelRatio;this.setViewport(0,0,width,height);};this.getCurrentViewport=function(){return _currentViewport;};this.setViewport=function(x,y,width,height){_viewport.set(x,_height-y-height,width,height);state.viewport(_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio));};this.setScissor=function(x,y,width,height){_scissor.set(x,_height-y-height,width,height);state.scissor(_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio));};this.setScissorTest=function(boolean){state.setScissorTest(_scissorTest=boolean);};// Clearing this.getClearColor=function(){return background.getClearColor();};this.setClearColor=function(){background.setClearColor.apply(background,arguments);};this.getClearAlpha=function(){return background.getClearAlpha();};this.setClearAlpha=function(){background.setClearAlpha.apply(background,arguments);};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.dispose=function(){_canvas.removeEventListener('webglcontextlost',onContextLost,false);_canvas.removeEventListener('webglcontextrestored',onContextRestore,false);renderLists.dispose();renderStates.dispose();properties.dispose();objects.dispose();vr.dispose();stopAnimation();};// Events function onContextLost(event){event.preventDefault();console.log('THREE.WebGLRenderer: Context Lost.');_isContextLost=true;}function onContextRestore()/* event */{console.log('THREE.WebGLRenderer: Context Restored.');_isContextLost=false;initGLContext();}function onMaterialDispose(event){var material=event.target;material.removeEventListener('dispose',onMaterialDispose);deallocateMaterial(material);}// Buffer deallocation function deallocateMaterial(material){releaseMaterialProgramReference(material);properties.remove(material);}function releaseMaterialProgramReference(material){var programInfo=properties.get(material).program;material.program=undefined;if(programInfo!==undefined){programCache.releaseProgram(programInfo);}}// Buffer rendering function renderObjectImmediate(object,program,material){object.render(function(object){_this.renderBufferImmediate(object,program,material);});}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 programAttributes=program.getAttributes();if(object.hasPositions){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.position);_gl.bufferData(_gl.ARRAY_BUFFER,object.positionArray,_gl.DYNAMIC_DRAW);state.enableAttribute(programAttributes.position);_gl.vertexAttribPointer(programAttributes.position,3,_gl.FLOAT,false,0,0);}if(object.hasNormals){_gl.bindBuffer(_gl.ARRAY_BUFFER,buffers.normal);if(!material.isMeshPhongMaterial&&!material.isMeshStandardMaterial&&!material.isMeshNormalMaterial&&material.flatShading===true){for(var i=0,l=object.count*3;i0){renderer.renderInstances(geometry,drawStart,drawCount);}}else{renderer.render(drawStart,drawCount);}};function setupVertexAttributes(material,program,geometry){if(geometry&&geometry.isInstancedBufferGeometry){if(extensions.get('ANGLE_instanced_arrays')===null){console.error('THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.');return;}}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 normalized=geometryAttribute.normalized;var size=geometryAttribute.itemSize;var attribute=attributes.get(geometryAttribute);// TODO Attribute may not be available on context restore if(attribute===undefined)continue;var buffer=attribute.buffer;var type=attribute.type;var bytesPerElement=attribute.bytesPerElement;if(geometryAttribute.isInterleavedBufferAttribute){var data=geometryAttribute.data;var stride=data.stride;var offset=geometryAttribute.offset;if(data&&data.isInstancedInterleavedBuffer){state.enableAttributeAndDivisor(programAttribute,data.meshPerAttribute);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*bytesPerElement,offset*bytesPerElement);}else{if(geometryAttribute.isInstancedBufferAttribute){state.enableAttributeAndDivisor(programAttribute,geometryAttribute.meshPerAttribute);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,0);}}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();}// Compile this.compile=function(scene,camera){currentRenderState=renderStates.get(scene,camera);currentRenderState.init();scene.traverse(function(object){if(object.isLight){currentRenderState.pushLight(object);if(object.castShadow){currentRenderState.pushShadow(object);}}});currentRenderState.setupLights(camera);scene.traverse(function(object){if(object.material){if(Array.isArray(object.material)){for(var i=0;i=0){material.numSupportedMorphTargets++;}}}if(material.morphNormals){material.numSupportedMorphNormals=0;for(var i=0;i<_this.maxMorphNormals;i++){if(programAttributes['morphNormal'+i]>=0){material.numSupportedMorphNormals++;}}}var uniforms=materialProperties.shader.uniforms;if(!material.isShaderMaterial&&!material.isRawShaderMaterial||material.clipping===true){materialProperties.numClippingPlanes=_clipping.numPlanes;materialProperties.numIntersection=_clipping.numIntersection;uniforms.clippingPlanes=_clipping.uniform;}materialProperties.fog=fog;// store the light setup it was created for materialProperties.lightsHash=lights.state.hash;if(material.lights){// wire up the material to this renderer's lighting state uniforms.ambientLightColor.value=lights.state.ambient;uniforms.directionalLights.value=lights.state.directional;uniforms.spotLights.value=lights.state.spot;uniforms.rectAreaLights.value=lights.state.rectArea;uniforms.pointLights.value=lights.state.point;uniforms.hemisphereLights.value=lights.state.hemi;uniforms.directionalShadowMap.value=lights.state.directionalShadowMap;uniforms.directionalShadowMatrix.value=lights.state.directionalShadowMatrix;uniforms.spotShadowMap.value=lights.state.spotShadowMap;uniforms.spotShadowMatrix.value=lights.state.spotShadowMatrix;uniforms.pointShadowMap.value=lights.state.pointShadowMap;uniforms.pointShadowMatrix.value=lights.state.pointShadowMatrix;// TODO (abelnation): add area lights shadow info to uniforms }var progUniforms=materialProperties.program.getUniforms(),uniformsList=WebGLUniforms.seqWithValue(progUniforms.seq,uniforms);materialProperties.uniformsList=uniformsList;}function setProgram(camera,fog,material,object){_usedTextureUnits=0;var materialProperties=properties.get(material);var lights=currentRenderState.state.lights;if(_clippingEnabled){if(_localClippingEnabled||camera!==_currentCamera){var useCache=camera===_currentCamera&&material.id===_currentMaterialId;// we might want to call this function with some ClippingGroup // object instead of the material, once it becomes feasible // (#8465, #8379) _clipping.setState(material.clippingPlanes,material.clipIntersection,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.state.hash){material.needsUpdate=true;}else if(materialProperties.numClippingPlanes!==undefined&&(materialProperties.numClippingPlanes!==_clipping.numPlanes||materialProperties.numIntersection!==_clipping.numIntersection)){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.shader.uniforms;if(state.useProgram(program.program)){refreshProgram=true;refreshMaterial=true;refreshLights=true;}if(material.id!==_currentMaterialId){_currentMaterialId=material.id;refreshMaterial=true;}if(refreshProgram||camera!==_currentCamera){p_uniforms.setValue(_gl,'projectionMatrix',camera.projectionMatrix);if(capabilities.logarithmicDepthBuffer){p_uniforms.setValue(_gl,'logDepthBufFC',2.0/(Math.log(camera.far+1.0)/Math.LN2));}// Avoid unneeded uniform updates per ArrayCamera's sub-camera if(_currentCamera!==(_currentArrayCamera||camera)){_currentCamera=_currentArrayCamera||camera;// lighting uniforms depend on the camera so enforce an update // now, in case this material supports lights - or later, when // the next material that does gets activated: refreshMaterial=true;// set to true on material change refreshLights=true;// remains set until update done }// load material specific uniforms // (shader material also gets them for the sake of genericity) 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);}}// skinning uniforms must be set even if material didn't change // auto-setting of texture unit for bone texture must go before other textures // not sure why, but otherwise weird things happen if(material.skinning){p_uniforms.setOptional(_gl,object,'bindMatrix');p_uniforms.setOptional(_gl,object,'bindMatrixInverse');var skeleton=object.skeleton;if(skeleton){var bones=skeleton.bones;if(capabilities.floatVertexTextures){if(skeleton.boneTexture===undefined){// layout (1 matrix = 4 pixels) // RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4) // with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8) // 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16) // 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32) // 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64) var size=Math.sqrt(bones.length*4);// 4 pixels needed for 1 matrix size=_Math.ceilPowerOfTwo(size);size=Math.max(size,4);var boneMatrices=new Float32Array(size*size*4);// 4 floats per RGBA pixel boneMatrices.set(skeleton.boneMatrices);// copy current values var boneTexture=new DataTexture(boneMatrices,size,size,RGBAFormat,FloatType);boneTexture.needsUpdate=true;skeleton.boneMatrices=boneMatrices;skeleton.boneTexture=boneTexture;skeleton.boneTextureSize=size;}p_uniforms.setValue(_gl,'boneTexture',skeleton.boneTexture);p_uniforms.setValue(_gl,'boneTextureSize',skeleton.boneTextureSize);}else{p_uniforms.setOptional(_gl,skeleton,'boneMatrices');}}}if(refreshMaterial){p_uniforms.setValue(_gl,'toneMappingExposure',_this.toneMappingExposure);p_uniforms.setValue(_gl,'toneMappingWhitePoint',_this.toneMappingWhitePoint);if(material.lights){// the current material requires lighting info // note: all lighting uniforms are always set correctly // they simply reference the renderer's state for their // values // // use the current material's .needsUpdate flags to set // the GL state when required markUniformsLightsNeedsUpdate(m_uniforms,refreshLights);}// refresh uniforms common to several materials if(fog&&material.fog){refreshUniformsFog(m_uniforms,fog);}if(material.isMeshBasicMaterial){refreshUniformsCommon(m_uniforms,material);}else if(material.isMeshLambertMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsLambert(m_uniforms,material);}else if(material.isMeshPhongMaterial){refreshUniformsCommon(m_uniforms,material);if(material.isMeshToonMaterial){refreshUniformsToon(m_uniforms,material);}else{refreshUniformsPhong(m_uniforms,material);}}else if(material.isMeshStandardMaterial){refreshUniformsCommon(m_uniforms,material);if(material.isMeshPhysicalMaterial){refreshUniformsPhysical(m_uniforms,material);}else{refreshUniformsStandard(m_uniforms,material);}}else if(material.isMeshDepthMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsDepth(m_uniforms,material);}else if(material.isMeshDistanceMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsDistance(m_uniforms,material);}else if(material.isMeshNormalMaterial){refreshUniformsCommon(m_uniforms,material);refreshUniformsNormal(m_uniforms,material);}else if(material.isLineBasicMaterial){refreshUniformsLine(m_uniforms,material);if(material.isLineDashedMaterial){refreshUniformsDash(m_uniforms,material);}}else if(material.isPointsMaterial){refreshUniformsPoints(m_uniforms,material);}else if(material.isShadowMaterial){m_uniforms.color.value=material.color;m_uniforms.opacity.value=material.opacity;}// RectAreaLight Texture // TODO (mrdoob): Find a nicer implementation if(m_uniforms.ltc_1!==undefined)m_uniforms.ltc_1.value=UniformsLib.LTC_1;if(m_uniforms.ltc_2!==undefined)m_uniforms.ltc_2.value=UniformsLib.LTC_2;WebGLUniforms.upload(_gl,materialProperties.uniformsList,m_uniforms,_this);}if(material.isShaderMaterial&&material.uniformsNeedUpdate===true){WebGLUniforms.upload(_gl,materialProperties.uniformsList,m_uniforms,_this);material.uniformsNeedUpdate=false;}// common matrices p_uniforms.setValue(_gl,'modelViewMatrix',object.modelViewMatrix);p_uniforms.setValue(_gl,'normalMatrix',object.normalMatrix);p_uniforms.setValue(_gl,'modelMatrix',object.matrixWorld);return program;}// Uniforms (refresh uniforms objects) function refreshUniformsCommon(uniforms,material){uniforms.opacity.value=material.opacity;if(material.color){uniforms.diffuse.value=material.color;}if(material.emissive){uniforms.emissive.value.copy(material.emissive).multiplyScalar(material.emissiveIntensity);}if(material.map){uniforms.map.value=material.map;}if(material.alphaMap){uniforms.alphaMap.value=material.alphaMap;}if(material.specularMap){uniforms.specularMap.value=material.specularMap;}if(material.envMap){uniforms.envMap.value=material.envMap;// don't flip CubeTexture envMaps, flip everything else: // WebGLRenderTargetCube will be flipped for backwards compatibility // WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture // this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future uniforms.flipEnvMap.value=!(material.envMap&&material.envMap.isCubeTexture)?1:-1;uniforms.reflectivity.value=material.reflectivity;uniforms.refractionRatio.value=material.refractionRatio;uniforms.maxMipLevel.value=properties.get(material.envMap).__maxMipLevel;}if(material.lightMap){uniforms.lightMap.value=material.lightMap;uniforms.lightMapIntensity.value=material.lightMapIntensity;}if(material.aoMap){uniforms.aoMap.value=material.aoMap;uniforms.aoMapIntensity.value=material.aoMapIntensity;}// uv repeat and offset setting priorities // 1. color map // 2. specular map // 3. normal map // 4. bump map // 5. alpha map // 6. emissive map 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){// backwards compatibility if(uvScaleMap.isWebGLRenderTarget){uvScaleMap=uvScaleMap.texture;}if(uvScaleMap.matrixAutoUpdate===true){uvScaleMap.updateMatrix();}uniforms.uvTransform.value.copy(uvScaleMap.matrix);}}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=_height*0.5;uniforms.map.value=material.map;if(material.map!==null){if(material.map.matrixAutoUpdate===true){material.map.updateMatrix();}uniforms.uvTransform.value.copy(material.map.matrix);}}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.emissiveMap){uniforms.emissiveMap.value=material.emissiveMap;}}function refreshUniformsPhong(uniforms,material){uniforms.specular.value=material.specular;uniforms.shininess.value=Math.max(material.shininess,1e-4);// to prevent pow( 0.0, 0.0 ) 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 refreshUniformsToon(uniforms,material){refreshUniformsPhong(uniforms,material);if(material.gradientMap){uniforms.gradientMap.value=material.gradientMap;}}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.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.envMap.value = material.envMap; // part of uniforms common uniforms.envMapIntensity.value=material.envMapIntensity;}}function refreshUniformsPhysical(uniforms,material){uniforms.clearCoat.value=material.clearCoat;uniforms.clearCoatRoughness.value=material.clearCoatRoughness;refreshUniformsStandard(uniforms,material);}function refreshUniformsDepth(uniforms,material){if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}}function refreshUniformsDistance(uniforms,material){if(material.displacementMap){uniforms.displacementMap.value=material.displacementMap;uniforms.displacementScale.value=material.displacementScale;uniforms.displacementBias.value=material.displacementBias;}uniforms.referencePosition.value.copy(material.referencePosition);uniforms.nearDistance.value=material.nearDistance;uniforms.farDistance.value=material.farDistance;}function refreshUniformsNormal(uniforms,material){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 uniforms are marked as clean, they don't need to be loaded to the GPU. function markUniformsLightsNeedsUpdate(uniforms,value){uniforms.ambientLightColor.needsUpdate=value;uniforms.directionalLights.needsUpdate=value;uniforms.pointLights.needsUpdate=value;uniforms.spotLights.needsUpdate=value;uniforms.rectAreaLights.needsUpdate=value;uniforms.hemisphereLights.needsUpdate=value;}// Textures function allocTextureUnit(){var textureUnit=_usedTextureUnits;if(textureUnit>=capabilities.maxTextures){console.warn('THREE.WebGLRenderer: Trying to use '+textureUnit+' texture units while this GPU supports only '+capabilities.maxTextures);}_usedTextureUnits+=1;return textureUnit;}this.allocTextureUnit=allocTextureUnit;// this.setTexture2D = setTexture2D; this.setTexture2D=function(){var warned=false;// backwards compatibility: peel texture.texture 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){// backwards compatibility: peel texture.texture 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;}// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture // TODO: unify these code paths if(texture&&texture.isCubeTexture||Array.isArray(texture.image)&&texture.image.length===6){// CompressedTexture can have Array in image :/ // this function alone should take care of cube textures textures.setTextureCube(texture,slot);}else{// assumed: texture property of THREE.WebGLRenderTargetCube textures.setTextureCubeDynamic(texture,slot);}};}();this.getRenderTarget=function(){return _currentRenderTarget;};this.setRenderTarget=function(renderTarget){_currentRenderTarget=renderTarget;if(renderTarget&&properties.get(renderTarget).__webglFramebuffer===undefined){textures.setupRenderTarget(renderTarget);}var framebuffer=null;var isCube=false;if(renderTarget){var __webglFramebuffer=properties.get(renderTarget).__webglFramebuffer;if(renderTarget.isWebGLRenderTargetCube){framebuffer=__webglFramebuffer[renderTarget.activeCubeFace];isCube=true;}else{framebuffer=__webglFramebuffer;}_currentViewport.copy(renderTarget.viewport);_currentScissor.copy(renderTarget.scissor);_currentScissorTest=renderTarget.scissorTest;}else{_currentViewport.copy(_viewport).multiplyScalar(_pixelRatio);_currentScissor.copy(_scissor).multiplyScalar(_pixelRatio);_currentScissorTest=_scissorTest;}if(_currentFramebuffer!==framebuffer){_gl.bindFramebuffer(_gl.FRAMEBUFFER,framebuffer);_currentFramebuffer=framebuffer;}state.viewport(_currentViewport);state.scissor(_currentScissor);state.setScissorTest(_currentScissorTest);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)){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&&utils.convert(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&&utils.convert(textureType)!==_gl.getParameter(_gl.IMPLEMENTATION_COLOR_READ_TYPE)&&// IE11, Edge and Chrome Mac < 52 (#9513) !(textureType===FloatType&&(extensions.get('OES_texture_float')||extensions.get('WEBGL_color_buffer_float')))&&// Chrome Mac >= 52 and Firefox !(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){// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604) if(x>=0&&x<=renderTarget.width-width&&y>=0&&y<=renderTarget.height-height){_gl.readPixels(x,y,width,height,utils.convert(textureFormat),utils.convert(textureType),buffer);}}else{console.error('THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.');}}finally{if(restore){_gl.bindFramebuffer(_gl.FRAMEBUFFER,_currentFramebuffer);}}}};this.copyFramebufferToTexture=function(position,texture,level){var width=texture.image.width;var height=texture.image.height;var glFormat=utils.convert(texture.format);this.setTexture2D(texture,0);_gl.copyTexImage2D(_gl.TEXTURE_2D,level||0,glFormat,position.x,position.y,width,height,0);};this.copyTextureToTexture=function(position,srcTexture,dstTexture,level){var width=srcTexture.image.width;var height=srcTexture.image.height;var glFormat=utils.convert(dstTexture.format);var glType=utils.convert(dstTexture.type);var pixels=srcTexture.isDataTexture?srcTexture.image.data:srcTexture.image;this.setTexture2D(dstTexture,0);_gl.texSubImage2D(_gl.TEXTURE_2D,level||0,position.x,position.y,width,height,glFormat,glType,pixels);};}/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */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};};/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */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};};/** * @author mrdoob / http://mrdoob.com/ */function Scene(){Object3D.call(this);this.type='Scene';this.background=null;this.fog=null;this.overrideMaterial=null;this.autoUpdate=true;// checked by the renderer }Scene.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Scene,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;},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;}});/** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * uvOffset: new THREE.Vector2(), * uvScale: new THREE.Vector2() * } */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.isSpriteMaterial=true;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;};/** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */function Sprite(material){Object3D.call(this);this.type='Sprite';this.material=material!==undefined?material:new SpriteMaterial();this.center=new Vector2(0.5,0.5);}Sprite.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:Sprite,isSprite:true,raycast:function(){var intersectPoint=new Vector3();var worldPosition=new Vector3();var worldScale=new Vector3();return function raycast(raycaster,intersects){worldPosition.setFromMatrixPosition(this.matrixWorld);raycaster.ray.closestPointToPoint(worldPosition,intersectPoint);worldScale.setFromMatrixScale(this.matrixWorld);var guessSizeSq=worldScale.x*worldScale.y/4;if(worldPosition.distanceToSquared(intersectPoint)>guessSizeSq)return;var distance=raycaster.ray.origin.distanceTo(intersectPoint);if(distanceraycaster.far)return;intersects.push({distance:distance,point:intersectPoint.clone(),face:null,object:this});};}(),clone:function(){return new this.constructor(this.material).copy(this);},copy:function(source){Object3D.prototype.copy.call(this,source);if(source.center!==undefined)this.center.copy(source.center);return this;}});/** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */function LOD(){Object3D.call(this);this.type='LOD';Object.defineProperties(this,{levels:{enumerable:true,value:[]}});}LOD.prototype=Object.assign(Object.create(Object3D.prototype),{constructor:LOD,copy:function(source){Object3D.prototype.copy.call(this,source,false);var levels=source.levels;for(var i=0,l=levels.length;i1){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=levels[i].distance){levels[i-1].object.visible=false;levels[i].object.visible=true;}else{break;}}for(;i, * opacity: , * * linewidth: , * linecap: "round", * linejoin: "round" * } */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;};/** * @author mrdoob / http://mrdoob.com/ */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=Object.assign(Object.create(Object3D.prototype),{constructor:Line,isLine:true,computeLineDistances:function(){var start=new Vector3();var end=new Vector3();return function computeLineDistances(){var geometry=this.geometry;if(geometry.isBufferGeometry){// we assume non-indexed geometry if(geometry.index===null){var positionAttribute=geometry.attributes.position;var lineDistances=[0];for(var i=1,l=positionAttribute.count;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( 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;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}}else if(geometry.isGeometry){var vertices=geometry.vertices;var nbVertices=vertices.length;for(var i=0;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.far)continue;intersects.push({distance:distance,// What do we want? intersection point on the ray or on the segment?? // point: raycaster.ray.at( distance ), point:interSegment.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this});}}};}(),clone:function(){return new this.constructor(this.geometry,this.material).copy(this);}});/** * @author mrdoob / http://mrdoob.com/ */function LineSegments(geometry,material){Line.call(this,geometry,material);this.type='LineSegments';}LineSegments.prototype=Object.assign(Object.create(Line.prototype),{constructor:LineSegments,isLineSegments:true,computeLineDistances:function(){var start=new Vector3();var end=new Vector3();return function computeLineDistances(){var geometry=this.geometry;if(geometry.isBufferGeometry){// we assume non-indexed geometry if(geometry.index===null){var positionAttribute=geometry.attributes.position;var lineDistances=[];for(var i=0,l=positionAttribute.count;i, * opacity: , * map: new THREE.Texture( ), * * size: , * sizeAttenuation: * } */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;};/** * @author alteredq / http://alteredqualia.com/ */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=Object.assign(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;// Checking boundingSphere distance to ray if(geometry.boundingSphere===null)geometry.computeBoundingSphere();sphere.copy(geometry.boundingSphere);sphere.applyMatrix4(matrixWorld);sphere.radius+=threshold;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();var intersectPoint=new Vector3();function testPoint(point,index){var rayPointDistanceSq=ray.distanceSqToPoint(point);if(rayPointDistanceSqraycaster.far)return;intersects.push({distance:distance,distanceToRay:Math.sqrt(rayPointDistanceSq),point:intersectPoint.clone(),index:index,face:null,object:object});}}if(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=video.HAVE_CURRENT_DATA){this.needsUpdate=true;}}});/** * @author alteredq / http://alteredqualia.com/ */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;// no flipping for cube textures // (also flipping doesn't work for compressed textures ) this.flipY=false;// can't generate mipmaps for compressed textures // mips must be embedded in DDS files this.generateMipmaps=false;}CompressedTexture.prototype=Object.create(Texture.prototype);CompressedTexture.prototype.constructor=CompressedTexture;CompressedTexture.prototype.isCompressedTexture=true;/** * @author Matt DesLauriers / @mattdesl * @author atix / arthursilber.de */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');}if(type===undefined&&format===DepthFormat)type=UnsignedShortType;if(type===undefined&&format===DepthStencilFormat)type=UnsignedInt248Type;Texture.call(this,null,mapping,wrapS,wrapT,magFilter,minFilter,format,type,anisotropy);this.image={width:width,height:height};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;/** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */function WireframeGeometry(geometry){BufferGeometry.call(this);this.type='WireframeGeometry';// buffer var vertices=[];// helper variables var i,j,l,o,ol;var edge=[0,0],edges={},e,edge1,edge2;var key,keys=['a','b','c'];var vertex;// different logic for Geometry and BufferGeometry if(geometry&&geometry.isGeometry){// create a data structure that contains all edges without duplicates var faces=geometry.faces;for(i=0,l=faces.length;i=0){func(u-EPS,v,p1);pu.subVectors(p0,p1);}else{func(u+EPS,v,p1);pu.subVectors(p1,p0);}if(v-EPS>=0){func(u,v-EPS,p1);pv.subVectors(p0,p1);}else{func(u,v+EPS,p1);pv.subVectors(p1,p0);}// cross product of tangent vectors returns surface normal normal.crossVectors(pu,pv).normalize();normals.push(normal.x,normal.y,normal.z);// uv uvs.push(u,v);}}// generate indices for(i=0;i0.9&&min<0.1){if(x0<0.2)uvBuffer[i+0]+=1;if(x1<0.2)uvBuffer[i+2]+=1;if(x2<0.2)uvBuffer[i+4]+=1;}}}function pushVertex(vertex){vertexBuffer.push(vertex.x,vertex.y,vertex.z);}function getVertexByIndex(index,vertex){var stride=index*3;vertex.x=vertices[stride+0];vertex.y=vertices[stride+1];vertex.z=vertices[stride+2];}function correctUVs(){var a=new Vector3();var b=new Vector3();var c=new Vector3();var centroid=new Vector3();var uvA=new Vector2();var uvB=new Vector2();var uvC=new Vector2();for(var i=0,j=0;i80*dim){minX=maxX=data[0];minY=maxY=data[1];for(var i=dim;imaxX)maxX=x;if(y>maxY)maxY=y;}// minX, minY and invSize are later used to transform coords into integers for z-order calculation invSize=Math.max(maxX-minX,maxY-minY);invSize=invSize!==0?1/invSize:0;}earcutLinked(outerNode,triangles,dim,minX,minY,invSize);return triangles;}};// create a circular doubly linked list from polygon points in the specified winding order function linkedList(data,start,end,dim,clockwise){var i,last;if(clockwise===signedArea(data,start,end,dim)>0){for(i=start;i=start;i-=dim)last=insertNode(i,data[i],data[i+1],last);}if(last&&equals(last,last.next)){removeNode(last);last=last.next;}return last;}// eliminate colinear or duplicate points function filterPoints(start,end){if(!start)return start;if(!end)end=start;var p=start,again;do{again=false;if(!p.steiner&&(equals(p,p.next)||area(p.prev,p,p.next)===0)){removeNode(p);p=end=p.prev;if(p===p.next)break;again=true;}else{p=p.next;}}while(again||p!==end);return end;}// main ear slicing loop which triangulates a polygon (given as a linked list) function earcutLinked(ear,triangles,dim,minX,minY,invSize,pass){if(!ear)return;// interlink polygon nodes in z-order if(!pass&&invSize)indexCurve(ear,minX,minY,invSize);var stop=ear,prev,next;// iterate through ears, slicing them one by one while(ear.prev!==ear.next){prev=ear.prev;next=ear.next;if(invSize?isEarHashed(ear,minX,minY,invSize):isEar(ear)){// cut off the triangle triangles.push(prev.i/dim);triangles.push(ear.i/dim);triangles.push(next.i/dim);removeNode(ear);// skipping the next vertice leads to less sliver triangles ear=next.next;stop=next.next;continue;}ear=next;// if we looped through the whole remaining polygon and can't find any more ears if(ear===stop){// try filtering points and slicing again if(!pass){earcutLinked(filterPoints(ear),triangles,dim,minX,minY,invSize,1);// if this didn't work, try curing all small self-intersections locally }else if(pass===1){ear=cureLocalIntersections(ear,triangles,dim);earcutLinked(ear,triangles,dim,minX,minY,invSize,2);// as a last resort, try splitting the remaining polygon into two }else if(pass===2){splitEarcut(ear,triangles,dim,minX,minY,invSize);}break;}}}// check whether a polygon node forms a valid ear with adjacent nodes function isEar(ear){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;// reflex, can't be an ear // now make sure we don't have other points inside the potential ear var p=ear.next.next;while(p!==ear.prev){if(pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0){return false;}p=p.next;}return true;}function isEarHashed(ear,minX,minY,invSize){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;// reflex, can't be an ear // triangle bbox; min & max are calculated like this for speed var minTX=a.xb.x?a.x>c.x?a.x:c.x:b.x>c.x?b.x:c.x,maxTY=a.y>b.y?a.y>c.y?a.y:c.y:b.y>c.y?b.y:c.y;// z-order range for the current triangle bbox; var minZ=zOrder(minTX,minTY,minX,minY,invSize),maxZ=zOrder(maxTX,maxTY,minX,minY,invSize);// first look for points inside the triangle in increasing z-order var p=ear.nextZ;while(p&&p.z<=maxZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.nextZ;}// then look for points in decreasing z-order p=ear.prevZ;while(p&&p.z>=minZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.prevZ;}return true;}// go through all polygon nodes and cure small local self-intersections function cureLocalIntersections(start,triangles,dim){var p=start;do{var a=p.prev,b=p.next.next;if(!equals(a,b)&&intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)){triangles.push(a.i/dim);triangles.push(p.i/dim);triangles.push(b.i/dim);// remove two nodes involved removeNode(p);removeNode(p.next);p=start=b;}p=p.next;}while(p!==start);return p;}// try splitting polygon into two and triangulate them independently function splitEarcut(start,triangles,dim,minX,minY,invSize){// look for a valid diagonal that divides the polygon into two var a=start;do{var b=a.next.next;while(b!==a.prev){if(a.i!==b.i&&isValidDiagonal(a,b)){// split the polygon in two by the diagonal var c=splitPolygon(a,b);// filter colinear points around the cuts a=filterPoints(a,a.next);c=filterPoints(c,c.next);// run earcut on each half earcutLinked(a,triangles,dim,minX,minY,invSize);earcutLinked(c,triangles,dim,minX,minY,invSize);return;}b=b.next;}a=a.next;}while(a!==start);}// link every hole into the outer loop, producing a single-ring polygon without holes function eliminateHoles(data,holeIndices,outerNode,dim){var queue=[],i,len,start,end,list;for(i=0,len=holeIndices.length;i=p.next.y&&p.next.y!==p.y){var x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx){qx=x;if(x===hx){if(hy===p.y)return p;if(hy===p.next.y)return p.next;}m=p.x=p.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hym.x)&&locallyInside(p,hole)){m=p;tanMin=tan;}}p=p.next;}return m;}// interlink polygon nodes in z-order function indexCurve(start,minX,minY,invSize){var p=start;do{if(p.z===null)p.z=zOrder(p.x,p.y,minX,minY,invSize);p.prevZ=p.prev;p.nextZ=p.next;p=p.next;}while(p!==start);p.prevZ.nextZ=null;p.prevZ=null;sortLinked(p);}// Simon Tatham's linked list merge sort algorithm // http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html function sortLinked(list){var i,p,q,e,tail,numMerges,pSize,qSize,inSize=1;do{p=list;list=null;tail=null;numMerges=0;while(p){numMerges++;q=p;pSize=0;for(i=0;i0||qSize>0&&q){if(pSize!==0&&(qSize===0||!q||p.z<=q.z)){e=p;p=p.nextZ;pSize--;}else{e=q;q=q.nextZ;qSize--;}if(tail)tail.nextZ=e;else list=e;e.prevZ=tail;tail=e;}p=q;}tail.nextZ=null;inSize*=2;}while(numMerges>1);return list;}// z-order of a point given coords and inverse of the longer side of data bbox function zOrder(x,y,minX,minY,invSize){// coords are transformed into non-negative 15-bit integer range x=32767*(x-minX)*invSize;y=32767*(y-minY)*invSize;x=(x|x<<8)&0x00FF00FF;x=(x|x<<4)&0x0F0F0F0F;x=(x|x<<2)&0x33333333;x=(x|x<<1)&0x55555555;y=(y|y<<8)&0x00FF00FF;y=(y|y<<4)&0x0F0F0F0F;y=(y|y<<2)&0x33333333;y=(y|y<<1)&0x55555555;return x|y<<1;}// find the leftmost node of a polygon ring function getLeftmost(start){var p=start,leftmost=start;do{if(p.x=0&&(ax-px)*(by-py)-(bx-px)*(ay-py)>=0&&(bx-px)*(cy-py)-(cx-px)*(by-py)>=0;}// check if a diagonal between two polygon nodes is valid (lies in polygon interior) function isValidDiagonal(a,b){return a.next.i!==b.i&&a.prev.i!==b.i&&!intersectsPolygon(a,b)&&locallyInside(a,b)&&locallyInside(b,a)&&middleInside(a,b);}// signed area of a triangle function area(p,q,r){return (q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);}// check if two points are equal function equals(p1,p2){return p1.x===p2.x&&p1.y===p2.y;}// check if two segments intersect function intersects(p1,q1,p2,q2){if(equals(p1,q1)&&equals(p2,q2)||equals(p1,q2)&&equals(p2,q1))return true;return area(p1,q1,p2)>0!==area(p1,q1,q2)>0&&area(p2,q2,p1)>0!==area(p2,q2,q1)>0;}// check if a polygon diagonal intersects any polygon segments function intersectsPolygon(a,b){var p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b)){return true;}p=p.next;}while(p!==a);return false;}// check if a polygon diagonal is locally inside the polygon function locallyInside(a,b){return area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0;}// check if the middle point of a polygon diagonal is inside the polygon function middleInside(a,b){var p=a,inside=false,px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{if(p.y>py!==p.next.y>py&&p.next.y!==p.y&&px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x){inside=!inside;}p=p.next;}while(p!==a);return inside;}// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; // if one belongs to the outer ring and another to a hole, it merges it into a single ring function splitPolygon(a,b){var a2=new Node(a.i,a.x,a.y),b2=new Node(b.i,b.x,b.y),an=a.next,bp=b.prev;a.next=b;b.prev=a;a2.next=an;an.prev=a2;b2.next=a2;a2.prev=b2;bp.next=b2;b2.prev=bp;return b2;}// create a node and optionally link it with previous one (in a circular doubly linked list) function insertNode(i,x,y,last){var p=new Node(i,x,y);if(!last){p.prev=p;p.next=p;}else{p.next=last.next;p.prev=last;last.next.prev=p;last.next=p;}return p;}function removeNode(p){p.next.prev=p.prev;p.prev.next=p.next;if(p.prevZ)p.prevZ.nextZ=p.nextZ;if(p.nextZ)p.nextZ.prevZ=p.prevZ;}function Node(i,x,y){// vertice index in coordinates array this.i=i;// vertex coordinates this.x=x;this.y=y;// previous and next vertice nodes in a polygon ring this.prev=null;this.next=null;// z-order curve value this.z=null;// previous and next nodes in z-order this.prevZ=null;this.nextZ=null;// indicates whether this is a steiner point this.steiner=false;}function signedArea(data,start,end,dim){var sum=0;for(var i=start,j=end-dim;i2&&points[l-1].equals(points[0])){points.pop();}}function addContour(vertices,contour){for(var i=0;i, // number of points on the curves * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too * amount: , // Depth to extrude the shape * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into the original shape bevel goes * bevelSize: , // how far from shape outline is bevel * bevelSegments: , // number of bevel layers * * extrudePath: // curve to extrude shape along * * UVGenerator: // object that provides UV generator functions * * } */ // ExtrudeGeometry function ExtrudeGeometry(shapes,options){Geometry.call(this);this.type='ExtrudeGeometry';this.parameters={shapes:shapes,options:options};this.fromBufferGeometry(new ExtrudeBufferGeometry(shapes,options));this.mergeVertices();}ExtrudeGeometry.prototype=Object.create(Geometry.prototype);ExtrudeGeometry.prototype.constructor=ExtrudeGeometry;// ExtrudeBufferGeometry function ExtrudeBufferGeometry(shapes,options){BufferGeometry.call(this);this.type='ExtrudeBufferGeometry';this.parameters={shapes:shapes,options:options};shapes=Array.isArray(shapes)?shapes:[shapes];var scope=this;var verticesArray=[];var uvArray=[];for(var i=0,l=shapes.length;iNumber.EPSILON){// not collinear // length of vectors for normalizing 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);// shift adjacent points by unit vectors to the left 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;// scaling factor for v_prev to intersection point 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);// vector from inPt to intersection point v_trans_x=ptPrevShift_x+v_prev_x*sf-inPt.x;v_trans_y=ptPrevShift_y+v_prev_y*sf-inPt.y;// Don't normalize!, otherwise sharp corners become ugly // but prevent crazy spikes 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{// handle special case of collinear edges var direction_eq=false;// assumes: opposite 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){// console.log("Warning: lines are a straight sequence"); v_trans_x=-v_prev_y;v_trans_y=v_prev_x;shrink_by=Math.sqrt(v_prev_lensq);}else{// console.log("Warning: lines are a straight spike"); 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 0; b -- ) { t=b/bevelSegments;z=bevelThickness*Math.cos(t*Math.PI/2);bs=bevelSize*Math.sin(t*Math.PI/2);// contract shape for(i=0,il=contour.length;i=0;b--){t=b/bevelSegments;z=bevelThickness*Math.cos(t*Math.PI/2);bs=bevelSize*Math.sin(t*Math.PI/2);// contract shape for(i=0,il=contour.length;i=0){j=i;k=i-1;if(k<0)k=contour.length-1;//console.log('b', i,j, i-1, k,vertices.length); var s=0,sl=steps+bevelSegments*2;for(s=0;s, // font * * size: , // size of the text * height: , // thickness to extrude text * curveSegments: , // number of points on the curves * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into text bevel goes * bevelSize: // how far from text outline is bevel * } */ // TextGeometry function TextGeometry(text,parameters){Geometry.call(this);this.type='TextGeometry';this.parameters={text:text,parameters:parameters};this.fromBufferGeometry(new TextBufferGeometry(text,parameters));this.mergeVertices();}TextGeometry.prototype=Object.create(Geometry.prototype);TextGeometry.prototype.constructor=TextGeometry;// TextBufferGeometry function TextBufferGeometry(text,parameters){parameters=parameters||{};var font=parameters.font;if(!(font&&font.isFont)){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);// translate parameters to ExtrudeGeometry API parameters.amount=parameters.height!==undefined?parameters.height:50;// defaults if(parameters.bevelThickness===undefined)parameters.bevelThickness=10;if(parameters.bevelSize===undefined)parameters.bevelSize=8;if(parameters.bevelEnabled===undefined)parameters.bevelEnabled=false;ExtrudeBufferGeometry.call(this,shapes,parameters);this.type='TextBufferGeometry';}TextBufferGeometry.prototype=Object.create(ExtrudeBufferGeometry.prototype);TextBufferGeometry.prototype.constructor=TextBufferGeometry;/** * @author mrdoob / http://mrdoob.com/ * @author benaadams / https://twitter.com/ben_a_adams * @author Mugen87 / https://github.com/Mugen87 */ // SphereGeometry 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));this.mergeVertices();}SphereGeometry.prototype=Object.create(Geometry.prototype);SphereGeometry.prototype.constructor=SphereGeometry;// SphereBufferGeometry 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||1;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 ix,iy;var index=0;var grid=[];var vertex=new Vector3();var normal=new Vector3();// buffers var indices=[];var vertices=[];var normals=[];var uvs=[];// generate vertices, normals and uvs for(iy=0;iy<=heightSegments;iy++){var verticesRow=[];var v=iy/heightSegments;for(ix=0;ix<=widthSegments;ix++){var u=ix/widthSegments;// vertex vertex.x=-radius*Math.cos(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertex.y=radius*Math.cos(thetaStart+v*thetaLength);vertex.z=radius*Math.sin(phiStart+u*phiLength)*Math.sin(thetaStart+v*thetaLength);vertices.push(vertex.x,vertex.y,vertex.z);// normal normal.set(vertex.x,vertex.y,vertex.z).normalize();normals.push(normal.x,normal.y,normal.z);// uv uvs.push(u,1-v);verticesRow.push(index++);}grid.push(verticesRow);}// indices for(iy=0;iy0)indices.push(a,b,d);if(iy!==heightSegments-1||thetaEnd0)generateCap(true);if(radiusBottom>0)generateCap(false);}// build geometry this.setIndex(indices);this.addAttribute('position',new Float32BufferAttribute(vertices,3));this.addAttribute('normal',new Float32BufferAttribute(normals,3));this.addAttribute('uv',new Float32BufferAttribute(uvs,2));function generateTorso(){var x,y;var normal=new Vector3();var vertex=new Vector3();var groupCount=0;// this will be used to calculate the normal var slope=(radiusBottom-radiusTop)/height;// generate vertices, normals and uvs for(y=0;y<=heightSegments;y++){var indexRow=[];var v=y/heightSegments;// calculate the radius of the current row var radius=v*(radiusBottom-radiusTop)+radiusTop;for(x=0;x<=radialSegments;x++){var u=x/radialSegments;var theta=u*thetaLength+thetaStart;var sinTheta=Math.sin(theta);var cosTheta=Math.cos(theta);// vertex vertex.x=radius*sinTheta;vertex.y=-v*height+halfHeight;vertex.z=radius*cosTheta;vertices.push(vertex.x,vertex.y,vertex.z);// normal normal.set(sinTheta,slope,cosTheta).normalize();normals.push(normal.x,normal.y,normal.z);// uv uvs.push(u,1-v);// save index of vertex in respective row indexRow.push(index++);}// now save vertices of the row in our index array indexArray.push(indexRow);}// generate indices for(x=0;x * } */function ShadowMaterial(parameters){Material.call(this);this.type='ShadowMaterial';this.color=new Color(0x000000);this.transparent=true;this.setValues(parameters);}ShadowMaterial.prototype=Object.create(Material.prototype);ShadowMaterial.prototype.constructor=ShadowMaterial;ShadowMaterial.prototype.isShadowMaterial=true;ShadowMaterial.prototype.copy=function(source){Material.prototype.copy.call(this,source);this.color.copy(source.color);return this;};/** * @author mrdoob / http://mrdoob.com/ */function RawShaderMaterial(parameters){ShaderMaterial.call(this,parameters);this.type='RawShaderMaterial';}RawShaderMaterial.prototype=Object.create(ShaderMaterial.prototype);RawShaderMaterial.prototype.constructor=RawShaderMaterial;RawShaderMaterial.prototype.isRawShaderMaterial=true;/** * @author WestLangley / http://github.com/WestLangley * * parameters = { * color: , * roughness: , * metalness: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * roughnessMap: new THREE.Texture( ), * * metalnessMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * envMapIntensity: * * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */function MeshStandardMaterial(parameters){Material.call(this);this.defines={'STANDARD':''};this.type='MeshStandardMaterial';this.color=new Color(0xffffff);// diffuse 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;};/** * @author WestLangley / http://github.com/WestLangley * * parameters = { * reflectivity: * } */function MeshPhysicalMaterial(parameters){MeshStandardMaterial.call(this);this.defines={'PHYSICAL':''};this.type='MeshPhysicalMaterial';this.reflectivity=0.5;// maps to F0 = 0.04 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;};/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * specular: , * shininess: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */function MeshPhongMaterial(parameters){Material.call(this);this.type='MeshPhongMaterial';this.color=new Color(0xffffff);// diffuse 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;};/** * @author takahirox / http://github.com/takahirox * * parameters = { * gradientMap: new THREE.Texture( ) * } */function MeshToonMaterial(parameters){MeshPhongMaterial.call(this);this.defines={'TOON':''};this.type='MeshToonMaterial';this.gradientMap=null;this.setValues(parameters);}MeshToonMaterial.prototype=Object.create(MeshPhongMaterial.prototype);MeshToonMaterial.prototype.constructor=MeshToonMaterial;MeshToonMaterial.prototype.isMeshToonMaterial=true;MeshToonMaterial.prototype.copy=function(source){MeshPhongMaterial.prototype.copy.call(this,source);this.gradientMap=source.gradientMap;return this;};/** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley * * parameters = { * opacity: , * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * * skinning: , * morphTargets: , * morphNormals: * } */function MeshNormalMaterial(parameters){Material.call(this);this.type='MeshNormalMaterial';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.wireframe=false;this.wireframeLinewidth=1;this.fog=false;this.lights=false;this.skinning=false;this.morphTargets=false;this.morphNormals=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.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.wireframe=source.wireframe;this.wireframeLinewidth=source.wireframeLinewidth;this.skinning=source.skinning;this.morphTargets=source.morphTargets;this.morphNormals=source.morphNormals;return this;};/** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */function MeshLambertMaterial(parameters){Material.call(this);this.type='MeshLambertMaterial';this.color=new Color(0xffffff);// diffuse 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;};/** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * * linewidth: , * * scale: , * dashSize: , * gapSize: * } */function LineDashedMaterial(parameters){LineBasicMaterial.call(this);this.type='LineDashedMaterial';this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(parameters);}LineDashedMaterial.prototype=Object.create(LineBasicMaterial.prototype);LineDashedMaterial.prototype.constructor=LineDashedMaterial;LineDashedMaterial.prototype.isLineDashedMaterial=true;LineDashedMaterial.prototype.copy=function(source){LineBasicMaterial.prototype.copy.call(this,source);this.scale=source.scale;this.dashSize=source.dashSize;this.gapSize=source.gapSize;return this;};var Materials=Object.freeze({ShadowMaterial:ShadowMaterial,SpriteMaterial:SpriteMaterial,RawShaderMaterial:RawShaderMaterial,ShaderMaterial:ShaderMaterial,PointsMaterial:PointsMaterial,MeshPhysicalMaterial:MeshPhysicalMaterial,MeshStandardMaterial:MeshStandardMaterial,MeshPhongMaterial:MeshPhongMaterial,MeshToonMaterial:MeshToonMaterial,MeshNormalMaterial:MeshNormalMaterial,MeshLambertMaterial:MeshLambertMaterial,MeshDepthMaterial:MeshDepthMaterial,MeshDistanceMaterial:MeshDistanceMaterial,MeshBasicMaterial:MeshBasicMaterial,LineDashedMaterial:LineDashedMaterial,LineBasicMaterial:LineBasicMaterial,Material:Material});/** * @author mrdoob / http://mrdoob.com/ */var Cache={enabled:false,files:{},add:function(key,file){if(this.enabled===false)return;// console.log( 'THREE.Cache', 'Adding key:', key ); this.files[key]=file;},get:function(key){if(this.enabled===false)return;// console.log( 'THREE.Cache', 'Checking key:', key ); return this.files[key];},remove:function(key){delete this.files[key];},clear:function(){this.files={};}};/** * @author mrdoob / http://mrdoob.com/ */function LoadingManager(onLoad,onProgress,onError){var scope=this;var isLoading=false;var itemsLoaded=0;var itemsTotal=0;var urlModifier=undefined;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);}};this.resolveURL=function(url){if(urlModifier){return urlModifier(url);}return url;};this.setURLModifier=function(transform){urlModifier=transform;return this;};}var DefaultLoadingManager=new LoadingManager();/** * @author mrdoob / http://mrdoob.com/ */var loading={};function FileLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;}Object.assign(FileLoader.prototype,{load:function(url,onLoad,onProgress,onError){if(url===undefined)url='';if(this.path!==undefined)url=this.path+url;url=this.manager.resolveURL(url);var scope=this;var cached=Cache.get(url);if(cached!==undefined){scope.manager.itemStart(url);setTimeout(function(){if(onLoad)onLoad(cached);scope.manager.itemEnd(url);},0);return cached;}// Check if request is duplicate if(loading[url]!==undefined){loading[url].push({onLoad:onLoad,onProgress:onProgress,onError:onError});return;}// Check for data: URI var dataUriRegex=/^data:(.*?)(;base64)?,(.*)$/;var dataUriRegexResult=url.match(dataUriRegex);// Safari can not handle Data URIs through XMLHttpRequest so process manually if(dataUriRegexResult){var mimeType=dataUriRegexResult[1];var isBase64=!!dataUriRegexResult[2];var data=dataUriRegexResult[3];data=window.decodeURIComponent(data);if(isBase64)data=window.atob(data);try{var response;var responseType=(this.responseType||'').toLowerCase();switch(responseType){case'arraybuffer':case'blob':var view=new Uint8Array(data.length);for(var i=0;i0||url.search(/^data\:image\/jpeg/)===0;texture.format=isJPEG?RGBFormat:RGBAFormat;texture.needsUpdate=true;if(onLoad!==undefined){onLoad(texture);}},onProgress,onError);return texture;},setCrossOrigin:function(value){this.crossOrigin=value;return this;},setPath:function(value){this.path=value;return this;}});/** * @author zz85 / http://www.lab4games.net/zz85/blog * Extensible curve object * * Some common of curve methods: * .getPoint( t, optionalTarget ), .getTangent( t ) * .getPointAt( u, optionalTarget ), .getTangentAt( u ) * .getPoints(), .getSpacedPoints() * .getLength() * .updateArcLengths() * * This following curves inherit from THREE.Curve: * * -- 2D curves -- * THREE.ArcCurve * THREE.CubicBezierCurve * THREE.EllipseCurve * THREE.LineCurve * THREE.QuadraticBezierCurve * THREE.SplineCurve * * -- 3D curves -- * THREE.CatmullRomCurve3 * THREE.CubicBezierCurve3 * THREE.LineCurve3 * THREE.QuadraticBezierCurve3 * * A series of curves can be represented as a THREE.CurvePath. * **/ /************************************************************** * Abstract Curve base class **************************************************************/function Curve(){this.type='Curve';this.arcLengthDivisions=200;}Object.assign(Curve.prototype,{// Virtual base class method to overwrite and implement in subclasses // - t [0 .. 1] getPoint:function()/* t, optionalTarget */{console.warn('THREE.Curve: .getPoint() not implemented.');return null;},// Get point at relative position in curve according to arc length // - u [0 .. 1] getPointAt:function(u,optionalTarget){var t=this.getUtoTmapping(u);return this.getPoint(t,optionalTarget);},// Get sequence of points using getPoint( t ) getPoints:function(divisions){if(divisions===undefined)divisions=5;var points=[];for(var d=0;d<=divisions;d++){points.push(this.getPoint(d/divisions));}return points;},// Get sequence of points using getPointAt( u ) getSpacedPoints:function(divisions){if(divisions===undefined)divisions=5;var points=[];for(var d=0;d<=divisions;d++){points.push(this.getPointAt(d/divisions));}return points;},// Get total curve arc length getLength:function(){var lengths=this.getLengths();return lengths[lengths.length-1];},// Get list of cumulative segment lengths getLengths:function(divisions){if(divisions===undefined)divisions=this.arcLengthDivisions;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;// { sums: cache, sum: sum }; Sum is in the last element. },updateArcLengths:function(){this.needsUpdate=true;this.getLengths();},// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant getUtoTmapping:function(u,distance){var arcLengths=this.getLengths();var i=0,il=arcLengths.length;var targetArcLength;// The targeted u distance value to get if(distance){targetArcLength=distance;}else{targetArcLength=u*arcLengths[il-1];}// binary search for the index with largest value smaller than target u distance var low=0,high=il-1,comparison;while(low<=high){i=Math.floor(low+(high-low)/2);// less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats comparison=arcLengths[i]-targetArcLength;if(comparison<0){low=i+1;}else if(comparison>0){high=i-1;}else{high=i;break;// DONE }}i=high;if(arcLengths[i]===targetArcLength){return i/(il-1);}// we could get finer grain at lengths, or use simple interpolation between two points var lengthBefore=arcLengths[i];var lengthAfter=arcLengths[i+1];var segmentLength=lengthAfter-lengthBefore;// determine where we are between the 'before' and 'after' points var segmentFraction=(targetArcLength-lengthBefore)/segmentLength;// add that fractional amount to t var t=(i+segmentFraction)/(il-1);return t;},// Returns a unit vector tangent at t // In case any sub curve does not implement its tangent derivation, // 2 points a small delta apart will be used to find its gradient // which seems to give a reasonable approximation getTangent:function(t){var delta=0.0001;var t1=t-delta;var t2=t+delta;// Capping in case of danger 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(u){var t=this.getUtoTmapping(u);return this.getTangent(t);},computeFrenetFrames:function(segments,closed){// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf var normal=new Vector3();var tangents=[];var normals=[];var binormals=[];var vec=new Vector3();var mat=new Matrix4();var i,u,theta;// compute the tangent vectors for each segment on the curve for(i=0;i<=segments;i++){u=i/segments;tangents[i]=this.getTangentAt(u);tangents[i].normalize();}// select an initial normal vector perpendicular to the first tangent vector, // and in the direction of the minimum tangent xyz component normals[0]=new Vector3();binormals[0]=new Vector3();var min=Number.MAX_VALUE;var tx=Math.abs(tangents[0].x);var ty=Math.abs(tangents[0].y);var tz=Math.abs(tangents[0].z);if(tx<=min){min=tx;normal.set(1,0,0);}if(ty<=min){min=ty;normal.set(0,1,0);}if(tz<=min){normal.set(0,0,1);}vec.crossVectors(tangents[0],normal).normalize();normals[0].crossVectors(tangents[0],vec);binormals[0].crossVectors(tangents[0],normals[0]);// compute the slowly-varying normal and binormal vectors for each segment on the curve for(i=1;i<=segments;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(_Math.clamp(tangents[i-1].dot(tangents[i]),-1,1));// clamp for floating pt errors normals[i].applyMatrix4(mat.makeRotationAxis(vec,theta));}binormals[i].crossVectors(tangents[i],normals[i]);}// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same if(closed===true){theta=Math.acos(_Math.clamp(normals[0].dot(normals[segments]),-1,1));theta/=segments;if(tangents[0].dot(vec.crossVectors(normals[0],normals[segments]))>0){theta=-theta;}for(i=1;i<=segments;i++){// twist a little... normals[i].applyMatrix4(mat.makeRotationAxis(tangents[i],theta*i));binormals[i].crossVectors(tangents[i],normals[i]);}}return {tangents:tangents,normals:normals,binormals:binormals};},clone:function(){return new this.constructor().copy(this);},copy:function(source){this.arcLengthDivisions=source.arcLengthDivisions;return this;},toJSON:function(){var data={metadata:{version:4.5,type:'Curve',generator:'Curve.toJSON'}};data.arcLengthDivisions=this.arcLengthDivisions;data.type=this.type;return data;},fromJSON:function(json){this.arcLengthDivisions=json.arcLengthDivisions;return this;}});function EllipseCurve(aX,aY,xRadius,yRadius,aStartAngle,aEndAngle,aClockwise,aRotation){Curve.call(this);this.type='EllipseCurve';this.aX=aX||0;this.aY=aY||0;this.xRadius=xRadius||1;this.yRadius=yRadius||1;this.aStartAngle=aStartAngle||0;this.aEndAngle=aEndAngle||2*Math.PI;this.aClockwise=aClockwise||false;this.aRotation=aRotation||0;}EllipseCurve.prototype=Object.create(Curve.prototype);EllipseCurve.prototype.constructor=EllipseCurve;EllipseCurve.prototype.isEllipseCurve=true;EllipseCurve.prototype.getPoint=function(t,optionalTarget){var point=optionalTarget||new Vector2();var twoPi=Math.PI*2;var deltaAngle=this.aEndAngle-this.aStartAngle;var samePoints=Math.abs(deltaAngle)twoPi)deltaAngle-=twoPi;if(deltaAngle0?0:(Math.floor(Math.abs(intPoint)/l)+1)*l;}else if(weight===0&&intPoint===l-1){intPoint=l-2;weight=1;}var p0,p1,p2,p3;// 4 points if(this.closed||intPoint>0){p0=points[(intPoint-1)%l];}else{// extrapolate first point tmp.subVectors(points[0],points[1]).add(points[0]);p0=tmp;}p1=points[intPoint%l];p2=points[(intPoint+1)%l];if(this.closed||intPoint+2points.length-2?points.length-1:intPoint+1];var p3=points[intPoint>points.length-3?points.length-1:intPoint+2];point.set(CatmullRom(weight,p0.x,p1.x,p2.x,p3.x),CatmullRom(weight,p0.y,p1.y,p2.y,p3.y));return point;};SplineCurve.prototype.copy=function(source){Curve.prototype.copy.call(this,source);this.points=[];for(var i=0,l=source.points.length;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;// loop where sum != 0, sum > d , sum+1 1&&!points[points.length-1].equals(points[0])){points.push(points[0]);}return points;},copy:function(source){Curve.prototype.copy.call(this,source);this.curves=[];for(var i=0,l=source.curves.length;i0){// if a previous curve is present, attempt to join 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);},copy:function(source){CurvePath.prototype.copy.call(this,source);this.currentPoint.copy(source.currentPoint);return this;},toJSON:function(){var data=CurvePath.prototype.toJSON.call(this);data.currentPoint=this.currentPoint.toArray();return data;},fromJSON:function(json){CurvePath.prototype.fromJSON.call(this,json);this.currentPoint.fromArray(json.currentPoint);return this;}});/** * @author zz85 / http://www.lab4games.net/zz85/blog * Defines a 2d shape plane using paths. **/ // STEP 1 Create a path. // STEP 2 Turn path into shape. // STEP 3 ExtrudeGeometry takes in Shape/Shapes // STEP 3a - Extract points from each shape, turn to vertices // STEP 3b - Triangulate each shape, add faces. function Shape(points){Path.call(this,points);this.uuid=_Math.generateUUID();this.type='Shape';this.holes=[];}Shape.prototype=Object.assign(Object.create(Path.prototype),{constructor:Shape,getPointsHoles:function(divisions){var holesPts=[];for(var i=0,l=this.holes.length;i= t1 || t1 === undefined ) { forward_scan:if(!(t=t0)){// looping? var t1global=pp[1];if(t=t0){// we have arrived at the sought interval break seek;}}// prepare binary search on the left side of the index right=i1;i1=0;break linear_scan;}// the interval is valid break validate_interval;}// linear scan // binary search while(i1>>1;if(t seconds conversions) scale:function(timeScale){if(timeScale!==1.0){var times=this.times;for(var i=0,n=times.length;i!==n;++i){times[i]*=timeScale;}}return this;},// removes keyframes before and after animation without changing any values within the range [startTime, endTime]. // IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values trim:function(startTime,endTime){var times=this.times,nKeys=times.length,from=0,to=nKeys-1;while(from!==nKeys&×[from]endTime){--to;}++to;// inclusive -> exclusive bound if(from!==0||to!==nKeys){// empty tracks are forbidden, so keep at least one keyframe if(from>=to)to=Math.max(to,1),from=to-1;var stride=this.getValueSize();this.times=AnimationUtils.arraySlice(times,from,to);this.values=AnimationUtils.arraySlice(this.values,from*stride,to*stride);}return this;},// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable validate:function(){var valid=true;var valueSize=this.getValueSize();if(valueSize-Math.floor(valueSize)!==0){console.error('THREE.KeyframeTrack: Invalid value size in track.',this);valid=false;}var times=this.times,values=this.values,nKeys=times.length;if(nKeys===0){console.error('THREE.KeyframeTrack: 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('THREE.KeyframeTrack: Time is not a valid number.',this,i,currTime);valid=false;break;}if(prevTime!==null&&prevTime>currTime){console.error('THREE.KeyframeTrack: Out of order keys.',this,i,currTime,prevTime);valid=false;break;}prevTime=currTime;}if(values!==undefined){if(AnimationUtils.isTypedArray(values)){for(var i=0,n=values.length;i!==n;++i){var value=values[i];if(isNaN(value)){console.error('THREE.KeyframeTrack: Value is not a valid number.',this,i,value);valid=false;break;}}}}return valid;},// removes equivalent sequential keys as common in morph target sequences // (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0) optimize:function(){var times=this.times,values=this.values,stride=this.getValueSize(),smoothInterpolation=this.getInterpolation()===InterpolateSmooth,writeIndex=1,lastIndex=times.length-1;for(var i=1;i0){times[writeIndex]=times[lastIndex];for(var readOffset=lastIndex*stride,writeOffset=writeIndex*stride,j=0;j!==stride;++j){values[writeOffset+j]=values[readOffset+j];}++writeIndex;}if(writeIndex!==times.length){this.times=AnimationUtils.arraySlice(times,0,writeIndex);this.values=AnimationUtils.arraySlice(values,0,writeIndex*stride);}return this;}});/** * * A Track of vectored keyframe values. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */function VectorKeyframeTrack(name,times,values,interpolation){KeyframeTrack.call(this,name,times,values,interpolation);}VectorKeyframeTrack.prototype=Object.assign(Object.create(KeyframeTrack.prototype),{constructor:VectorKeyframeTrack,ValueTypeName:'vector'// ValueBufferType is inherited // DefaultInterpolation is inherited });/** * * Reusable set of Tracks that represent an animation. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ */function AnimationClip(name,duration,tracks){this.name=name;this.tracks=tracks;this.duration=duration!==undefined?duration:-1;this.uuid=_Math.generateUUID();// this means it should figure out its duration by scanning the tracks if(this.duration<0){this.resetDuration();}this.optimize();}Object.assign(AnimationClip,{parse:function(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(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(name,morphTargetSequence,fps,noLoop){var numMorphTargets=morphTargetSequence.length;var tracks=[];for(var i=0;i1){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;},// parse the animation.hierarchy format parseAnimation:function(animation,bones){if(!animation){console.error('THREE.AnimationClip: No animation in JSONLoader data.');return null;}var addNonemptyTrack=function(trackType,trackName,animationKeys,propertyName,destTracks){// only return track if there are actually keys. if(animationKeys.length!==0){var times=[];var values=[];AnimationUtils.flattenJSON(animationKeys,times,values,propertyName);// empty keys are filtered out, so check again if(times.length!==0){destTracks.push(new trackType(trackName,times,values));}}};var tracks=[];var clipName=animation.name||'default';// automatic length determination in AnimationClip. var duration=animation.length||-1;var fps=animation.fps||30;var hierarchyTracks=animation.hierarchy||[];for(var h=0;h uv index correspondence fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i uv index correspondence fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i1?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;i1?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(json,geometry){var scale=json.scale;if(json.morphTargets!==undefined){for(var i=0,l=json.morphTargets.length;i0){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;i0)geometry.animations=outputAnimations;}return function parse(json,texturePath){if(json.data!==undefined){// Geometry 4.0 spec json=json.data;}if(json.scale!==undefined){json.scale=1.0/json.scale;}else{json.scale=1.0;}var geometry=new Geometry();parseModel(json,geometry);parseSkin(json,geometry);parseMorphing(json,geometry);parseAnimations(json,geometry);geometry.computeFaceNormals();geometry.computeBoundingSphere();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};}};}()});/** * @author mrdoob / http://mrdoob.com/ */function ObjectLoader(manager){this.manager=manager!==undefined?manager:DefaultLoadingManager;this.texturePath='';}Object.assign(ObjectLoader.prototype,{load:function(url,onLoad,onProgress,onError){if(this.texturePath===''){this.texturePath=url.substring(0,url.lastIndexOf('/')+1);}var scope=this;var loader=new FileLoader(scope.manager);loader.load(url,function(text){var json=null;try{json=JSON.parse(text);}catch(error){if(onError!==undefined)onError(error);console.error('THREE:ObjectLoader: Can\'t parse '+url+'.',error.message);return;}var metadata=json.metadata;if(metadata===undefined||metadata.type===undefined||metadata.type.toLowerCase()==='geometry'){console.error('THREE.ObjectLoader: Can\'t load '+url+'. Use THREE.JSONLoader instead.');return;}scope.parse(json,onLoad);},onProgress,onError);},setTexturePath:function(value){this.texturePath=value;},setCrossOrigin:function(value){this.crossOrigin=value;},parse:function(json,onLoad){var shapes=this.parseShape(json.shapes);var geometries=this.parseGeometries(json.geometries,shapes);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;},parseShape:function(json){var shapes={};if(json!==undefined){for(var i=0,l=json.length;i0){var manager=new LoadingManager(onLoad);var loader=new ImageLoader(manager);loader.setCrossOrigin(this.crossOrigin);for(var i=0,l=json.length;i0){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'LineLoop':object=new LineLoop(getGeometry(data.geometry),getMaterial(data.material));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){object.matrix.fromArray(data.matrix);if(data.matrixAutoUpdate!==undefined)object.matrixAutoUpdate=data.matrixAutoUpdate;if(object.matrixAutoUpdate)object.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.frustumCulled!==undefined)object.frustumCulled=data.frustumCulled;if(data.renderOrder!==undefined)object.renderOrder=data.renderOrder;if(data.userData!==undefined)object.userData=data.userData;if(data.children!==undefined){var children=data.children;for(var i=0;i immediate success or // toggling of inside/outside at every single! intersection point of an edge // with the horizontal line through inPt, left of inPt // not counting lowerY endpoints of edges and whole edges on that line var inside=false;for(var p=polyLen-1,q=0;qNumber.EPSILON){// not parallel if(edgeDy<0){edgeLowPt=inPolygon[q];edgeDx=-edgeDx;edgeHighPt=inPolygon[p];edgeDy=-edgeDy;}if(inPt.yedgeHighPt.y)continue;if(inPt.y===edgeLowPt.y){if(inPt.x===edgeLowPt.x)return true;// inPt is on contour ? // continue; // no intersection or edgeLowPt => doesn't count !!! }else{var perpEdge=edgeDy*(inPt.x-edgeLowPt.x)-edgeDx*(inPt.y-edgeLowPt.y);if(perpEdge===0)return true;// inPt is on contour ? if(perpEdge<0)continue;inside=!inside;// true intersection left of inPt }}else{// parallel or collinear if(inPt.y!==edgeLowPt.y)continue;// parallel // edge lies on the same horizontal line as inPt if(edgeHighPt.x<=inPt.x&&inPt.x<=edgeLowPt.x||edgeLowPt.x<=inPt.x&&inPt.x<=edgeHighPt.x)return true;// inPt: Point on contour ! // continue; }}return inside;}var isClockWise=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;// console.log("Holes first", 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 probably all Shapes with wrong orientation if(!newShapes[0])return toShapesNoHoles(subPaths);if(newShapes.length>1){var ambiguous=false;var toChange=[];for(var sIdx=0,sLen=newShapes.length;sIdx0){// console.log("to change: ", toChange); if(!ambiguous)newShapeHoles=betterShapeHoles;}}var tmpHoles;for(var i=0,il=newShapes.length;i0){this.source.connect(this.filters[0]);for(var i=1,l=this.filters.length;i0){this.source.disconnect(this.filters[0]);for(var i=1,l=this.filters.length;i' accumulate:function(accuIndex,weight){// note: happily accumulating nothing when weight = 0, the caller knows // the weight and shouldn't have made the call in the first place var buffer=this.buffer,stride=this.valueSize,offset=accuIndex*stride+stride,currentWeight=this.cumulativeWeight;if(currentWeight===0){// accuN := incoming * weight for(var i=0;i!==stride;++i){buffer[offset+i]=buffer[i];}currentWeight=weight;}else{// accuN := accuN + incoming * weight currentWeight+=weight;var mix=weight/currentWeight;this._mixBufferRegion(buffer,offset,0,mix,stride);}this.cumulativeWeight=currentWeight;},// apply the state of 'accu' to the binding when accus differ apply:function(accuIndex){var stride=this.valueSize,buffer=this.buffer,offset=accuIndex*stride+stride,weight=this.cumulativeWeight,binding=this.binding;this.cumulativeWeight=0;if(weight<1){// accuN := accuN + original * ( 1 - cumulativeWeight ) 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]){// value has changed -> update scene graph binding.setValue(buffer,offset);break;}}},// remember the state of the bound property and copy it to both accus saveOriginalState:function(){var binding=this.binding;var buffer=this.buffer,stride=this.valueSize,originalValueOffset=stride*3;binding.getValue(buffer,originalValueOffset);// accu[0..1] := orig -- initially detect changes against the original for(var i=stride,e=originalValueOffset;i!==e;++i){buffer[i]=buffer[originalValueOffset+i%stride];}this.cumulativeWeight=0;},// apply the state previously taken via 'saveOriginalState' to the binding restoreOriginalState:function(){var originalValueOffset=this.valueSize*3;this.binding.setValue(this.buffer,originalValueOffset);},// mix functions _select:function(buffer,dstOffset,srcOffset,t,stride){if(t>=0.5){for(var i=0;i!==stride;++i){buffer[dstOffset+i]=buffer[srcOffset+i];}}},_slerp:function(buffer,dstOffset,srcOffset,t){Quaternion.slerpFlat(buffer,dstOffset,buffer,dstOffset,buffer,srcOffset,t);},_lerp:function(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;}}});/** * * A reference to a real property in the scene graph. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ // Characters [].:/ are reserved for track binding syntax. var RESERVED_CHARS_RE='\\[\\]\\.:\\/';function Composite(targetGroup,path,optionalParsedPath){var parsedPath=optionalParsedPath||PropertyBinding.parseTrackName(path);this._targetGroup=targetGroup;this._bindings=targetGroup.subscribe_(path,parsedPath);}Object.assign(Composite.prototype,{getValue:function(array,offset){this.bind();// bind all binding var firstValidIndex=this._targetGroup.nCachedObjects_,binding=this._bindings[firstValidIndex];// and only call .getValue on the first if(binding!==undefined)binding.getValue(array,offset);},setValue:function(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(){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].bind();}},unbind:function(){var bindings=this._bindings;for(var i=this._targetGroup.nCachedObjects_,n=bindings.length;i!==n;++i){bindings[i].unbind();}}});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;}Object.assign(PropertyBinding,{Composite:Composite,create:function(root,path,parsedPath){if(!(root&&root.isAnimationObjectGroup)){return new PropertyBinding(root,path,parsedPath);}else{return new PropertyBinding.Composite(root,path,parsedPath);}},/** * Replaces spaces with underscores and removes unsupported characters from * node names, to ensure compatibility with parseTrackName(). * * @param {string} name Node name to be sanitized. * @return {string} */sanitizeNodeName:function(){var reservedRe=new RegExp('['+RESERVED_CHARS_RE+']','g');return function sanitizeNodeName(name){return name.replace(/\s/g,'_').replace(reservedRe,'');};}(),parseTrackName:function(){// Attempts to allow node names from any language. ES5's `\w` regexp matches // only latin characters, and the unicode \p{L} is not yet supported. So // instead, we exclude reserved characters and match everything else. var wordChar='[^'+RESERVED_CHARS_RE+']';var wordCharOrDot='[^'+RESERVED_CHARS_RE.replace('\\.','')+']';// Parent directories, delimited by '/' or ':'. Currently unused, but must // be matched to parse the rest of the track name. var directoryRe=/((?:WC+[\/:])*)/.source.replace('WC',wordChar);// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. var nodeRe=/(WCOD+)?/.source.replace('WCOD',wordCharOrDot);// Object on target node, and accessor. May not contain reserved // characters. Accessor may contain any character except closing bracket. var objectRe=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace('WC',wordChar);// Property and accessor. May not contain reserved characters. Accessor may // contain any non-bracket characters. var propertyRe=/\.(WC+)(?:\[(.+)\])?/.source.replace('WC',wordChar);var trackRe=new RegExp(''+'^'+directoryRe+nodeRe+objectRe+propertyRe+'$');var supportedObjectNames=['material','materials','bones'];return function parseTrackName(trackName){var matches=trackRe.exec(trackName);if(!matches){throw new Error('PropertyBinding: Cannot parse trackName: '+trackName);}var results={// directoryName: matches[ 1 ], // (tschw) currently unused nodeName:matches[2],objectName:matches[3],objectIndex:matches[4],propertyName:matches[5],// required propertyIndex:matches[6]};var lastDot=results.nodeName&&results.nodeName.lastIndexOf('.');if(lastDot!==undefined&&lastDot!==-1){var objectName=results.nodeName.substring(lastDot+1);// Object names must be checked against a whitelist. Otherwise, there // is no way to parse 'foo.bar.baz': 'baz' must be a property, but // 'bar' could be the objectName, or part of a nodeName (which can // include '.' characters). if(supportedObjectNames.indexOf(objectName)!==-1){results.nodeName=results.nodeName.substring(0,lastDot);results.objectName=objectName;}}if(results.propertyName===null||results.propertyName.length===0){throw new Error('PropertyBinding: can not parse propertyName from trackName: '+trackName);}return results;};}(),findNode:function(root,nodeName){if(!nodeName||nodeName===""||nodeName==="root"||nodeName==="."||nodeName===-1||nodeName===root.name||nodeName===root.uuid){return root;}// search into skeleton bones. if(root.skeleton){var bone=root.skeleton.getBoneByName(nodeName);if(bone!==undefined){return bone;}}// search into node subtree. if(root.children){var searchNodeSubtree=function(children){for(var i=0;i this._bindingsIndicesByPath={};// inside: indices in these arrays 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;}};}Object.assign(AnimationObjectGroup.prototype,{isAnimationObjectGroup:true,add:function(){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,knownObject=undefined;for(var i=0,n=arguments.length;i!==n;++i){var object=arguments[i],uuid=object.uuid,index=indicesByUUID[uuid];if(index===undefined){// unknown object -> add it to the ACTIVE region index=nObjects++;indicesByUUID[uuid]=index;objects.push(object);// accounting is done, now do the same for all bindings for(var j=0,m=nBindings;j!==m;++j){bindings[j].push(new PropertyBinding(object,paths[j],parsedPaths[j]));}}else if(index=nCachedObjects){// move existing object into the CACHED region var lastCachedIndex=nCachedObjects++,firstActiveObject=objects[lastCachedIndex];indicesByUUID[firstActiveObject.uuid]=index;objects[index]=firstActiveObject;indicesByUUID[uuid]=lastCachedIndex;objects[lastCachedIndex]=object;// accounting is done, now do the same for all bindings 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;}}}// for arguments this.nCachedObjects_=nCachedObjects;},// remove & forget uncache:function(){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 zero effective time scale this.enabled=true;// false -> zero effective weight this.clampWhenFinished=false;// keep feeding the last frame? this.zeroSlopeAtStart=true;// for smooth interpolation w/o separate this.zeroSlopeAtEnd=true;// clips for start, loop and end }Object.assign(AnimationAction.prototype,{// State & Scheduling play:function(){this._mixer._activateAction(this);return this;},stop:function(){this._mixer._deactivateAction(this);return this.reset();},reset:function(){this.paused=false;this.enabled=true;this.time=0;// restart clip this._loopCount=-1;// forget previous loops this._startTime=null;// forget scheduling return this.stopFading().stopWarping();},isRunning:function(){return this.enabled&&!this.paused&&this.timeScale!==0&&this._startTime===null&&this._mixer._isActiveAction(this);},// return true when play has been called isScheduled:function(){return this._mixer._isActiveAction(this);},startAt:function(time){this._startTime=time;return this;},setLoop:function(mode,repetitions){this.loop=mode;this.repetitions=repetitions;return this;},// Weight // set the weight stopping any scheduled fading // although .enabled = false yields an effective weight of zero, this // method does *not* change .enabled, because it would be confusing setEffectiveWeight:function(weight){this.weight=weight;// note: same logic as when updated at runtime this._effectiveWeight=this.enabled?weight:0;return this.stopFading();},// return the weight considering fading and .enabled getEffectiveWeight:function(){return this._effectiveWeight;},fadeIn:function(duration){return this._scheduleFading(duration,0,1);},fadeOut:function(duration){return this._scheduleFading(duration,1,0);},crossFadeFrom:function(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(fadeInAction,duration,warp){return fadeInAction.crossFadeFrom(this,duration,warp);},stopFading:function(){var weightInterpolant=this._weightInterpolant;if(weightInterpolant!==null){this._weightInterpolant=null;this._mixer._takeBackControlInterpolant(weightInterpolant);}return this;},// Time Scale Control // set the time scale stopping any scheduled warping // although .paused = true yields an effective time scale of zero, this // method does *not* change .paused, because it would be confusing setEffectiveTimeScale:function(timeScale){this.timeScale=timeScale;this._effectiveTimeScale=this.paused?0:timeScale;return this.stopWarping();},// return the time scale considering warping and .paused getEffectiveTimeScale:function(){return this._effectiveTimeScale;},setDuration:function(duration){this.timeScale=this._clip.duration/duration;return this.stopWarping();},syncWith:function(action){this.time=action.time;this.timeScale=action.timeScale;return this.stopWarping();},halt:function(duration){return this.warp(this._effectiveTimeScale,0,duration);},warp:function(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(){var timeScaleInterpolant=this._timeScaleInterpolant;if(timeScaleInterpolant!==null){this._timeScaleInterpolant=null;this._mixer._takeBackControlInterpolant(timeScaleInterpolant);}return this;},// Object Accessors getMixer:function(){return this._mixer;},getClip:function(){return this._clip;},getRoot:function(){return this._localRoot||this._mixer._root;},// Interna _update:function(time,deltaTime,timeDirection,accuIndex){// called by the mixer if(!this.enabled){// call ._updateWeight() to update ._effectiveWeight this._updateWeight(time);return;}var startTime=this._startTime;if(startTime!==null){// check for scheduled start of action var timeRunning=(time-startTime)*timeDirection;if(timeRunning<0||timeDirection===0){return;// yet to come / don't decide when delta = 0 }// start this._startTime=null;// unschedule deltaTime=timeDirection*timeRunning;}// apply time scale and advance time deltaTime*=this._updateTimeScale(time);var clipTime=this._updateTime(deltaTime);// note: _updateTime may disable the action resulting in // an effective weight of 0 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(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){// faded out, disable this.enabled=false;}}}}this._effectiveWeight=weight;return weight;},_updateTimeScale:function(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){// motion has halted, pause this.paused=true;}else{// warp done - apply final time scale this.timeScale=timeScale;}}}}this._effectiveTimeScale=timeScale;return timeScale;},_updateTime:function(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){// just started 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{// repetitive Repeat or PingPong var pingPong=loop===LoopPingPong;if(loopCount===-1){// just started if(deltaTime>=0){loopCount=0;this._setEndings(true,this.repetitions===0,pingPong);}else{// when looping in reverse direction, the initial // transition through zero counts as a repetition, // so leave loopCount at -1 this._setEndings(this.repetitions===0,true,pingPong);}}if(time>=duration||time<0){// wrap around var loopDelta=Math.floor(time/duration);// signed time-=duration*loopDelta;loopCount+=Math.abs(loopDelta);var pending=this.repetitions-loopCount;if(pending<=0){// have to stop (switch state, clamp time, fire event) 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{// keep running if(pending===1){// entering the last round 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){// invert time for the "pong round" this.time=time;return duration-time;}}this.time=time;return time;},_setEndings:function(atStart,atEnd,pingPong){var settings=this._interpolantSettings;if(pingPong){settings.endingStart=ZeroSlopeEnding;settings.endingEnd=ZeroSlopeEnding;}else{// assuming for LoopOnce atStart == atEnd == true 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(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;}});/** * * Player for AnimationClips. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */function AnimationMixer(root){this._root=root;this._initMemoryManager();this._accuIndex=0;this.time=0;this.timeScale=1.0;}AnimationMixer.prototype=Object.assign(Object.create(EventDispatcher.prototype),{constructor:AnimationMixer,_bindAction:function(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){// existing binding, make sure the cache knows 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(action){if(!this._isActiveAction(action)){if(action._cacheIndex===null){// this action has been forgotten by the cache, but the user // appears to be still using it -> rebind 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;// increment reference counts / sort out state 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(action){if(this._isActiveAction(action)){var bindings=action._propertyBindings;// decrement reference counts / sort out state 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);}},// Memory manager _initMemoryManager:function(){this._actions=[];// 'nActiveActions' followed by inactive ones this._nActiveActions=0;this._actionsByClip={};// inside: // { // knownActions: Array< AnimationAction > - used as prototypes // actionByRoot: AnimationAction - lookup // } this._bindings=[];// 'nActiveBindings' followed by inactive ones this._nActiveBindings=0;this._bindingsByRootAndName={};// inside: Map< name, PropertyMixer > this._controlInterpolants=[];// same game as above 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;}}};},// Memory management for AnimationAction objects _isActiveAction:function(action){var index=action._cacheIndex;return index!==null&&index| inactive actions ] // s a // <-swap-> // a s 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(action){// [ active actions | inactive actions ] // [ active actions |< inactive actions ] // a s // <-swap-> // s a 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;},// Memory management for PropertyMixer objects _addInactiveBinding:function(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(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;// eslint-disable-line no-unused-vars delete bindingsByRoot[rootUuid];}},_lendBinding:function(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(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;},// Memory management of Interpolants for weight and time scale _lendControlInterpolant:function(){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(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),// return an action for a clip optionally using a custom root target // object (this method allocates a lot of dynamic memory in case a // previously unknown clip/root combination is specified) clipAction:function(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;}// we know the clip, so we don't have to parse all // the bindings again but can just copy prototypeAction=actionsForClip.knownActions[0];// also, take the clip from the prototype action if(clipObject===null)clipObject=prototypeAction._clip;}// clip must be known when specified via string if(clipObject===null)return null;// allocate all resources required to run it var newAction=new AnimationAction(this,clipObject,optionalRoot);this._bindAction(newAction,prototypeAction);// and make the action known to the memory manager this._addInactiveAction(newAction,clipUuid,rootUuid);return newAction;},// get an existing action existingAction:function(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;},// deactivates all previously scheduled actions stopAllAction:function(){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;},// advance the time and update apply the animation update:function(deltaTime){deltaTime*=this.timeScale;var actions=this._actions,nActions=this._nActiveActions,time=this.time+=deltaTime,timeDirection=Math.sign(deltaTime),accuIndex=this._accuIndex^=1;// run active actions for(var i=0;i!==nActions;++i){var action=actions[i];action._update(time,deltaTime,timeDirection,accuIndex);}// update scene graph var bindings=this._bindings,nBindings=this._nActiveBindings;for(var i=0;i!==nBindings;++i){bindings[i].apply(accuIndex);}return this;},// return this mixer's root target object getRoot:function(){return this._root;},// free all resources specific to a particular clip uncacheClip:function(clip){var actions=this._actions,clipUuid=clip.uuid,actionsByClip=this._actionsByClip,actionsForClip=actionsByClip[clipUuid];if(actionsForClip!==undefined){// note: just calling _removeInactiveAction would mess up the // iteration state and also require updating the state we can // just throw away 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];}},// free all resources specific to a particular root target object uncacheRoot:function(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);}}},// remove a targeted clip from the cache uncacheAction:function(clip,optionalRoot){var action=this.existingAction(clip,optionalRoot);if(action!==null){this._deactivateAction(action);this._removeInactiveAction(action);}}});/** * @author mrdoob / http://mrdoob.com/ */function Uniform(value){if(typeof value==='string'){console.warn('THREE.Uniform: Type parameter is no longer needed.');value=arguments[1];}this.value=value;}Uniform.prototype.clone=function(){return new Uniform(this.value.clone===undefined?this.value:this.value.clone());};/** * @author benaadams / https://twitter.com/ben_a_adams */function InstancedBufferGeometry(){BufferGeometry.call(this);this.type='InstancedBufferGeometry';this.maxInstancedCount=undefined;}InstancedBufferGeometry.prototype=Object.assign(Object.create(BufferGeometry.prototype),{constructor:InstancedBufferGeometry,isInstancedBufferGeometry:true,copy:function(source){BufferGeometry.prototype.copy.call(this,source);this.maxInstancedCount=source.maxInstancedCount;return this;},clone:function(){return new this.constructor().copy(this);}});/** * @author benaadams / https://twitter.com/ben_a_adams */function InterleavedBufferAttribute(interleavedBuffer,itemSize,offset,normalized){this.data=interleavedBuffer;this.itemSize=itemSize;this.offset=offset;this.normalized=normalized===true;}Object.defineProperties(InterleavedBufferAttribute.prototype,{count:{get:function(){return this.data.count;}},array:{get:function(){return this.data.array;}}});Object.assign(InterleavedBufferAttribute.prototype,{isInterleavedBufferAttribute:true,setX:function(index,x){this.data.array[index*this.data.stride+this.offset]=x;return this;},setY:function(index,y){this.data.array[index*this.data.stride+this.offset+1]=y;return this;},setZ:function(index,z){this.data.array[index*this.data.stride+this.offset+2]=z;return this;},setW:function(index,w){this.data.array[index*this.data.stride+this.offset+3]=w;return this;},getX:function(index){return this.data.array[index*this.data.stride+this.offset];},getY:function(index){return this.data.array[index*this.data.stride+this.offset+1];},getZ:function(index){return this.data.array[index*this.data.stride+this.offset+2];},getW:function(index){return this.data.array[index*this.data.stride+this.offset+3];},setXY:function(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(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(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;}});/** * @author benaadams / https://twitter.com/ben_a_adams */function InterleavedBuffer(array,stride){this.array=array;this.stride=stride;this.count=array!==undefined?array.length/stride:0;this.dynamic=false;this.updateRange={offset:0,count:-1};this.version=0;}Object.defineProperty(InterleavedBuffer.prototype,'needsUpdate',{set:function(value){if(value===true)this.version++;}});Object.assign(InterleavedBuffer.prototype,{isInterleavedBuffer:true,onUploadCallback:function(){},setArray:function(array){if(Array.isArray(array)){throw new TypeError('THREE.BufferAttribute: array should be a Typed Array.');}this.count=array!==undefined?array.length/this.stride:0;this.array=array;return this;},setDynamic:function(value){this.dynamic=value;return this;},copy:function(source){this.array=new source.array.constructor(source.array);this.count=source.count;this.stride=source.stride;this.dynamic=source.dynamic;return this;},copyAt:function(index1,attribute,index2){index1*=this.stride;index2*=attribute.stride;for(var i=0,l=this.stride;ithis.max.x||point.ythis.max.y?false:true;},containsBox:function(box){return this.min.x<=box.min.x&&box.max.x<=this.max.x&&this.min.y<=box.min.y&&box.max.y<=this.max.y;},getParameter:function(point,target){// This can potentially have a divide by zero if the box // has a size dimension of 0. if(target===undefined){console.warn('THREE.Box2: .getParameter() target is now required');target=new Vector2();}return target.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(box){// using 4 splitting planes to rule out intersections return box.max.xthis.max.x||box.max.ythis.max.y?false:true;},clampPoint:function(point,target){if(target===undefined){console.warn('THREE.Box2: .clampPoint() target is now required');target=new Vector2();}return target.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(box){this.min.max(box.min);this.max.min(box.max);return this;},union:function(box){this.min.min(box.min);this.max.max(box.max);return this;},translate:function(offset){this.min.add(offset);this.max.add(offset);return this;},equals:function(box){return box.min.equals(this.min)&&box.max.equals(this.max);}});/** * @author alteredq / http://alteredqualia.com/ */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;/** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */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 Float32BufferAttribute(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;i0.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);};/** * @author sroucheray / http://sroucheray.org/ * @author mrdoob / http://mrdoob.com/ */function AxesHelper(size){size=size||1;var vertices=[0,0,0,size,0,0,0,0,0,0,size,0,0,0,0,0,0,size];var colors=[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 Float32BufferAttribute(vertices,3));geometry.addAttribute('color',new Float32BufferAttribute(colors,3));var material=new LineBasicMaterial({vertexColors:VertexColors});LineSegments.call(this,geometry,material);}AxesHelper.prototype=Object.create(LineSegments.prototype);AxesHelper.prototype.constructor=AxesHelper;// Curve.create=function(construct,getPoint){console.log('THREE.Curve.create() has been deprecated');construct.prototype=Object.create(Curve.prototype);construct.prototype.constructor=construct;construct.prototype.getPoint=getPoint;return construct;};// Object.assign(CurvePath.prototype,{createPointsGeometry:function(divisions){console.warn('THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');// generate geometry from path points (for Line or Points objects) var pts=this.getPoints(divisions);return this.createGeometry(pts);},createSpacedPointsGeometry:function(divisions){console.warn('THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');// generate geometry from equidistant sampling along the path var pts=this.getSpacedPoints(divisions);return this.createGeometry(pts);},createGeometry:function(points){console.warn('THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.');var geometry=new Geometry();for(var i=0,l=points.length;i0?e.slice(0,e.length):e,i=0,j;while(j=list[i++])j[0].apply(j[1],empty.slice.call(arguments,1));return target;};};// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) _export(_export.S,'Object',{create:_objectCreate});var $Object$2=_core.Object;var create=function create(P,D){return $Object$2.create(P,D);};var create$1=create;var _validateCollection=function(it,TYPE){if(!_isObject(it)||it._t!==TYPE)throw TypeError('Incompatible receiver, '+TYPE+' required!');return it;};var dP$2=_objectDp.f;var fastKey=_meta.fastKey;var SIZE=_descriptors?'_s':'size';var getEntry=function(that,key){// fast case var index=fastKey(key);var entry;if(index!=='F')return that._i[index];// frozen object case for(entry=that._f;entry;entry=entry.n){if(entry.k==key)return entry;}};var _collectionStrong={getConstructor:function(wrapper,NAME,IS_MAP,ADDER){var C=wrapper(function(that,iterable){_anInstance(that,C,NAME,'_i');that._t=NAME;// collection type that._i=_objectCreate(null);// index that._f=undefined;// first entry that._l=undefined;// last entry that[SIZE]=0;// size if(iterable!=undefined)_forOf(iterable,IS_MAP,that[ADDER],that);});_redefineAll(C.prototype,{// 23.1.3.1 Map.prototype.clear() // 23.2.3.2 Set.prototype.clear() clear:function clear(){for(var that=_validateCollection(this,NAME),data=that._i,entry=that._f;entry;entry=entry.n){entry.r=true;if(entry.p)entry.p=entry.p.n=undefined;delete data[entry.i];}that._f=that._l=undefined;that[SIZE]=0;},// 23.1.3.3 Map.prototype.delete(key) // 23.2.3.4 Set.prototype.delete(value) 'delete':function(key){var that=_validateCollection(this,NAME);var entry=getEntry(that,key);if(entry){var next=entry.n;var prev=entry.p;delete that._i[entry.i];entry.r=true;if(prev)prev.n=next;if(next)next.p=prev;if(that._f==entry)that._f=next;if(that._l==entry)that._l=prev;that[SIZE]--;}return !!entry;},// 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined) // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined) forEach:function forEach(callbackfn/* , that = undefined */){_validateCollection(this,NAME);var f=_ctx(callbackfn,arguments.length>1?arguments[1]:undefined,3);var entry;while(entry=entry?entry.n:this._f){f(entry.v,entry.k,this);// revert to the last existing entry while(entry&&entry.r)entry=entry.p;}},// 23.1.3.7 Map.prototype.has(key) // 23.2.3.7 Set.prototype.has(value) has:function has(key){return !!getEntry(_validateCollection(this,NAME),key);}});if(_descriptors)dP$2(C.prototype,'size',{get:function(){return _validateCollection(this,NAME)[SIZE];}});return C;},def:function(that,key,value){var entry=getEntry(that,key);var prev,index;// change existing entry if(entry){entry.v=value;// create new entry }else{that._l=entry={i:index=fastKey(key,true),// <- index k:key,// <- key v:value,// <- value p:prev=that._l,// <- previous entry n:undefined,// <- next entry r:false// <- removed };if(!that._f)that._f=entry;if(prev)prev.n=entry;that[SIZE]++;// add to index if(index!=='F')that._i[index]=entry;}return that;},getEntry:getEntry,setStrong:function(C,NAME,IS_MAP){// add .keys, .values, .entries, [@@iterator] // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11 _iterDefine(C,NAME,function(iterated,kind){this._t=_validateCollection(iterated,NAME);// target this._k=kind;// kind this._l=undefined;// previous },function(){var that=this;var kind=that._k;var entry=that._l;// revert to the last existing entry while(entry&&entry.r)entry=entry.p;// get next entry if(!that._t||!(that._l=entry=entry?entry.n:that._t._f)){// or finish the iteration that._t=undefined;return _iterStep(1);}// return step by kind if(kind=='keys')return _iterStep(0,entry.k);if(kind=='values')return _iterStep(0,entry.v);return _iterStep(0,[entry.k,entry.v]);},IS_MAP?'entries':'values',!IS_MAP,true);// add [@@species], 23.1.2.2, 23.2.2.2 _setSpecies(NAME);}};var SPECIES$2=_wks('species');var _arraySpeciesConstructor=function(original){var C;if(_isArray(original)){C=original.constructor;// cross-realm fallback if(typeof C=='function'&&(C===Array||_isArray(C.prototype)))C=undefined;if(_isObject(C)){C=C[SPECIES$2];if(C===null)C=undefined;}}return C===undefined?Array:C;};// 9.4.2.3 ArraySpeciesCreate(originalArray, length) var _arraySpeciesCreate=function(original,length){return new(_arraySpeciesConstructor(original))(length);};// 0 -> Array#forEach // 1 -> Array#map // 2 -> Array#filter // 3 -> Array#some // 4 -> Array#every // 5 -> Array#find // 6 -> Array#findIndex var _arrayMethods=function(TYPE,$create){var IS_MAP=TYPE==1;var IS_FILTER=TYPE==2;var IS_SOME=TYPE==3;var IS_EVERY=TYPE==4;var IS_FIND_INDEX=TYPE==6;var NO_HOLES=TYPE==5||IS_FIND_INDEX;var create=$create||_arraySpeciesCreate;return function($this,callbackfn,that){var O=_toObject($this);var self=_iobject(O);var f=_ctx(callbackfn,that,3);var length=_toLength(self.length);var index=0;var result=IS_MAP?create($this,length):IS_FILTER?create($this,0):undefined;var val,res;for(;length>index;index++)if(NO_HOLES||index in self){val=self[index];res=f(val,index,O);if(TYPE){if(IS_MAP)result[index]=res;// map else if(res)switch(TYPE){case 3:return true;// some case 5:return val;// find case 6:return index;// findIndex case 2:result.push(val);// filter }else if(IS_EVERY)return false;// every }}return IS_FIND_INDEX?-1:IS_SOME||IS_EVERY?IS_EVERY:result;};};var dP$3=_objectDp.f;var each=_arrayMethods(0);var _collection=function(NAME,wrapper,methods,common,IS_MAP,IS_WEAK){var Base=_global[NAME];var C=Base;var ADDER=IS_MAP?'set':'add';var proto=C&&C.prototype;var O={};if(!_descriptors||typeof C!='function'||!(IS_WEAK||proto.forEach&&!_fails(function(){new C().entries().next();}))){// create collection constructor C=common.getConstructor(wrapper,NAME,IS_MAP,ADDER);_redefineAll(C.prototype,methods);_meta.NEED=true;}else{C=wrapper(function(target,iterable){_anInstance(target,C,NAME,'_c');target._c=new Base();if(iterable!=undefined)_forOf(iterable,IS_MAP,target[ADDER],target);});each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','),function(KEY){var IS_ADDER=KEY=='add'||KEY=='set';if(KEY in proto&&!(IS_WEAK&&KEY=='clear'))_hide(C.prototype,KEY,function(a,b){_anInstance(this,C,KEY);if(!IS_ADDER&&IS_WEAK&&!_isObject(a))return KEY=='get'?undefined:false;var result=this._c[KEY](a===0?0:a,b);return IS_ADDER?this:result;});});IS_WEAK||dP$3(C.prototype,'size',{get:function(){return this._c.size;}});}_setToStringTag(C,NAME);O[NAME]=C;_export(_export.G+_export.W+_export.F,O);if(!IS_WEAK)common.setStrong(C,NAME,IS_MAP);return C;};var MAP='Map';// 23.1 Map Objects var es6_map=_collection(MAP,function(get){return function Map(){return get(this,arguments.length>0?arguments[0]:undefined);};},{// 23.1.3.6 Map.prototype.get(key) get:function get(key){var entry=_collectionStrong.getEntry(_validateCollection(this,MAP),key);return entry&&entry.v;},// 23.1.3.9 Map.prototype.set(key, value) set:function set(key,value){return _collectionStrong.def(_validateCollection(this,MAP),key===0?0:key,value);}},_collectionStrong,true);var _arrayFromIterable=function(iter,ITERATOR){var result=[];_forOf(iter,false,result.push,result,ITERATOR);return result;};// https://github.com/DavidBruant/Map-Set.prototype.toJSON var _collectionToJson=function(NAME){return function toJSON(){if(_classof(this)!=NAME)throw TypeError(NAME+"#toJSON isn't generic");return _arrayFromIterable(this);};};// https://github.com/DavidBruant/Map-Set.prototype.toJSON _export(_export.P+_export.R,'Map',{toJSON:_collectionToJson('Map')});// https://tc39.github.io/proposal-setmap-offrom/ var _setCollectionOf=function(COLLECTION){_export(_export.S,COLLECTION,{of:function of(){var length=arguments.length;var A=new Array(length);while(length--)A[length]=arguments[length];return new this(A);}});};// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of _setCollectionOf('Map');// https://tc39.github.io/proposal-setmap-offrom/ var _setCollectionFrom=function(COLLECTION){_export(_export.S,COLLECTION,{from:function from(source/* , mapFn, thisArg */){var mapFn=arguments[1];var mapping,A,n,cb;_aFunction(this);mapping=mapFn!==undefined;if(mapping)_aFunction(mapFn);if(source==undefined)return new this();A=[];if(mapping){n=0;cb=_ctx(mapFn,arguments[2],2);_forOf(source,false,function(nextItem){A.push(cb(nextItem,n++));});}else{_forOf(source,false,A.push,A);}return new this(A);}});};// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from _setCollectionFrom('Map');var map=_core.Map;var map$1=map;var arraySlice=[].slice;var factories={};var construct=function(F,len,args){if(!(len in factories)){for(var n=[],i=0;i3&&arguments[3]!==undefined?arguments[3]:false;classCallCheck(this,DependencyError);_this2=possibleConstructorReturn(this,getPrototypeOf$2(DependencyError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this2.stack.split('\n');stackArray.splice(1,2);_this2.stack=stackArray.join('\n');if(console)console.error('Active module:',activeModule);if(console&&dependencyModule)console.error('Dependency published by module:',dependencyModule);_this2.name='DependencyError';return _this2;}inherits(DependencyError,_Error2);return DependencyError;}(wrapNativeSuper(Error));var ManagerError=/*#__PURE__*/function(_Error3){function ManagerError(classInstance,message,component){var _this3;var activeModule=arguments.length>3&&arguments[3]!==undefined?arguments[3]:false;classCallCheck(this,ManagerError);_this3=possibleConstructorReturn(this,getPrototypeOf$2(ManagerError).call(this,"@".concat(classInstance,": ").concat(message)));var stackArray=_this3.stack.split('\n');stackArray.splice(1,2);_this3.stack=stackArray.join('\n');if(console)console.error('Component:',component);if(console&&activeModule)console.error('Active module:',activeModule);_this3.name='ManagerError';return _this3;}inherits(ManagerError,_Error3);return ManagerError;}(wrapNativeSuper(Error));var warnDeps=function warnDeps(){throw new Error('WhitestormJS Framework requ ires Three.js r92. https://threejs.org/');};try{}catch(err){warnDeps();}/** * @class ModuleSystem * @category core * @description Provides API for classes that will use Modules.
* This class includes basic event system with those supported methods: *
.on()
.off()
.emit()
* @extends Events * @memberof module:core */var ModuleSystem=/*#__PURE__*/function(_Events){function ModuleSystem(){classCallCheck(this,ModuleSystem);return possibleConstructorReturn(this,getPrototypeOf$2(ModuleSystem).apply(this,arguments));}createClass(ModuleSystem,[{key:"integrateModules",// INTEGRATING /** * @method integrateModules * @instance * @description This method applies all modules from .modules collection. * @param {Object} [source] If source (should be a component) is provided, will replace .modules with source's one before executing modules. * @memberof module:core.ModuleSystem */value:function integrateModules(source){if(!this.modules&&!source)return;if(source&&source.modules)this.modules=source.modules.slice(0);if(this.modules){for(var i=0,max=this.modules.length;i0&&arguments[0]!==undefined?arguments[0]:{};var modules=this.modules;if(!modules)return bridgeMap;for(var i=0,max=modules.length;i func.apply(this, [moduleScope])] How the function is wrapped/ * @memberof module:core.ModuleSystem */},{key:"applyCommand",value:function applyCommand(name){var _this=this;var cb=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(func,moduleScope){return func.apply(_this,[moduleScope]);};var modules=this.modules;if(!modules)return;for(var i=0,max=modules.length;i1&&arguments[1]!==undefined?arguments[1]:true;if(!module)return;if(push&&this.modules)this.modules.push(module);else if(push)this.modules=[module];if(this.manager)this.manager.active(module);if(module.manager&&this.manager)module.manager(this.manager);else if(module.manager){throw new ManagerError('Component',"Module requires ModuleManager that is turned off for this component",this,module);}if(module.integrate)module.integrate.bind(this)(module);return module;}/** * @method disposeModules * @instance * @description Disposes of all modules * @memberof module:core.ModuleSystem */},{key:"disposeModules",value:function disposeModules(){while(this.modules.length){this.disposeModule(this.modules[0]);}}/** * @method disposeModule * @instance * @description Disposes of the given module * @param {Object} module the module to dispose * @return {Module} Returns module that was removed. * @memberof module:core.ModuleSystem */},{key:"disposeModule",value:function disposeModule(module){if(!module)return;this.modules.splice(this.modules.indexOf(module),1);if(module.dispose)module.dispose.bind(this)(module);return module;}// PIPED METHOD /** * @method module * @instance * @description piped version of .applyModule(). * @param {Object} module the module to apply * @return {this} returns this - app/component * @throws {ManagerError} * @memberof module:core.ModuleSystem * @example Piped modules * component * .module(new Module1()) * .module(new Module2()) * .module(new Module3()) */},{key:"module",value:function module(_module){this.applyModule(_module);return this;}}]);inherits(ModuleSystem,_Events);return ModuleSystem;}(minivents_commonjs);function _arrayWithHoles$1(arr){if(Array.isArray(arr))return arr;}var arrayWithHoles=_arrayWithHoles$1;var core_getIterator=_core.getIterator=function(it){var iterFn=core_getIteratorMethod(it);if(typeof iterFn!='function')throw TypeError(it+' is not iterable!');return _anObject(iterFn.call(it));};var getIterator=core_getIterator;var getIterator$1=getIterator;function _iterableToArrayLimit$1(arr,i){var _arr=[];var _n=true;var _d=false;var _e=undefined;try{for(var _i=getIterator$1(arr),_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"]!=null)_i["return"]();}finally{if(_d)throw _e;}}return _arr;}var iterableToArrayLimit=_iterableToArrayLimit$1;function _nonIterableRest$1(){throw new TypeError("Invalid attempt to destructure non-iterable instance");}var nonIterableRest=_nonIterableRest$1;function _slicedToArray$1(arr,i){return arrayWithHoles(arr)||iterableToArrayLimit(arr,i)||nonIterableRest();}var slicedToArray=_slicedToArray$1;function symbolObservablePonyfill(root){var result;var Symbol=root.Symbol;if(typeof Symbol==='function'){if(Symbol.observable){result=Symbol.observable;}else{result=Symbol('observable');Symbol.observable=result;}}else{result='@@observable';}return result;}/* global window */var root;if(typeof self!=='undefined'){root=self;}else if(typeof window!=='undefined'){root=window;}else if(typeof global!=='undefined'){root=global;}else if(typeof module!=='undefined'){root=module;}else{root=Function('return this')();}var result=symbolObservablePonyfill(root);/** * These are private action types reserved by Redux. * For any unknown actions, you must return the current state. * If the current state is undefined, you must return the initial state. * Do not reference these action types directly in your code. */var ActionTypes={INIT:'@@redux/INIT'+Math.random().toString(36).substring(7).split('').join('.'),REPLACE:'@@redux/REPLACE'+Math.random().toString(36).substring(7).split('').join('.')};var _typeof$1=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol&&obj!==Symbol.prototype?"symbol":typeof obj;};/** * @param {any} obj The object to inspect. * @returns {boolean} True if the argument appears to be a plain object. */function isPlainObject(obj){if((typeof obj==='undefined'?'undefined':_typeof$1(obj))!=='object'||obj===null)return false;var proto=obj;while(Object.getPrototypeOf(proto)!==null){proto=Object.getPrototypeOf(proto);}return Object.getPrototypeOf(obj)===proto;}/** * Creates a Redux store that holds the state tree. * The only way to change the data in the store is to call `dispatch()` on it. * * There should only be a single store in your app. To specify how different * parts of the state tree respond to actions, you may combine several reducers * into a single reducer function by using `combineReducers`. * * @param {Function} reducer A function that returns the next state tree, given * the current state tree and the action to handle. * * @param {any} [preloadedState] The initial state. You may optionally specify it * to hydrate the state from the server in universal apps, or to restore a * previously serialized user session. * If you use `combineReducers` to produce the root reducer function, this must be * an object with the same shape as `combineReducers` keys. * * @param {Function} [enhancer] The store enhancer. You may optionally specify it * to enhance the store with third-party capabilities such as middleware, * time travel, persistence, etc. The only store enhancer that ships with Redux * is `applyMiddleware()`. * * @returns {Store} A Redux store that lets you read the state, dispatch actions * and subscribe to changes. */function createStore(reducer,preloadedState,enhancer){var _ref2;if(typeof preloadedState==='function'&&typeof enhancer==='undefined'){enhancer=preloadedState;preloadedState=undefined;}if(typeof enhancer!=='undefined'){if(typeof enhancer!=='function'){throw new Error('Expected the enhancer to be a function.');}return enhancer(createStore)(reducer,preloadedState);}if(typeof reducer!=='function'){throw new Error('Expected the reducer to be a function.');}var currentReducer=reducer;var currentState=preloadedState;var currentListeners=[];var nextListeners=currentListeners;var isDispatching=false;function ensureCanMutateNextListeners(){if(nextListeners===currentListeners){nextListeners=currentListeners.slice();}}/** * Reads the state tree managed by the store. * * @returns {any} The current state tree of your application. */function getState(){if(isDispatching){throw new Error('You may not call store.getState() while the reducer is executing. '+'The reducer has already received the state as an argument. '+'Pass it down from the top reducer instead of reading it from the store.');}return currentState;}/** * Adds a change listener. It will be called any time an action is dispatched, * and some part of the state tree may potentially have changed. You may then * call `getState()` to read the current state tree inside the callback. * * You may call `dispatch()` from a change listener, with the following * caveats: * * 1. The subscriptions are snapshotted just before every `dispatch()` call. * If you subscribe or unsubscribe while the listeners are being invoked, this * will not have any effect on the `dispatch()` that is currently in progress. * However, the next `dispatch()` call, whether nested or not, will use a more * recent snapshot of the subscription list. * * 2. The listener should not expect to see all state changes, as the state * might have been updated multiple times during a nested `dispatch()` before * the listener is called. It is, however, guaranteed that all subscribers * registered before the `dispatch()` started will be called with the latest * state by the time it exits. * * @param {Function} listener A callback to be invoked on every dispatch. * @returns {Function} A function to remove this change listener. */function subscribe(listener){if(typeof listener!=='function'){throw new Error('Expected the listener to be a function.');}if(isDispatching){throw new Error('You may not call store.subscribe() while the reducer is executing. '+'If you would like to be notified after the store has been updated, subscribe from a '+'component and invoke store.getState() in the callback to access the latest state. '+'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');}var isSubscribed=true;ensureCanMutateNextListeners();nextListeners.push(listener);return function unsubscribe(){if(!isSubscribed){return;}if(isDispatching){throw new Error('You may not unsubscribe from a store listener while the reducer is executing. '+'See https://redux.js.org/api-reference/store#subscribe(listener) for more details.');}isSubscribed=false;ensureCanMutateNextListeners();var index=nextListeners.indexOf(listener);nextListeners.splice(index,1);};}/** * Dispatches an action. It is the only way to trigger a state change. * * The `reducer` function, used to create the store, will be called with the * current state tree and the given `action`. Its return value will * be considered the **next** state of the tree, and the change listeners * will be notified. * * The base implementation only supports plain object actions. If you want to * dispatch a Promise, an Observable, a thunk, or something else, you need to * wrap your store creating function into the corresponding middleware. For * example, see the documentation for the `redux-thunk` package. Even the * middleware will eventually dispatch plain object actions using this method. * * @param {Object} action A plain object representing “what changed”. It is * a good idea to keep actions serializable so you can record and replay user * sessions, or use the time travelling `redux-devtools`. An action must have * a `type` property which may not be `undefined`. It is a good idea to use * string constants for action types. * * @returns {Object} For convenience, the same action object you dispatched. * * Note that, if you use a custom middleware, it may wrap `dispatch()` to * return something else (for example, a Promise you can await). */function dispatch(action){if(!isPlainObject(action)){throw new Error('Actions must be plain objects. '+'Use custom middleware for async actions.');}if(typeof action.type==='undefined'){throw new Error('Actions may not have an undefined "type" property. '+'Have you misspelled a constant?');}if(isDispatching){throw new Error('Reducers may not dispatch actions.');}try{isDispatching=true;currentState=currentReducer(currentState,action);}finally{isDispatching=false;}var listeners=currentListeners=nextListeners;for(var i=0;i0&&arguments[0]!==undefined?arguments[0]:[{},''];var action=arguments.length>1?arguments[1]:undefined;state[0][action.key]=action.data;state[1]=action.key;return state;});this.modules={};}/** * @method active * @instance * @description Sets .currentModule to provided module. * @param {Object} module the module to make current * @memberof module:core.ModuleManager */createClass(ModuleManager,[{key:"active",value:function active(module){this.currentModule=module;}/** * @method reset * @instance * @description Set's .currentModule to null. * @memberof module:core.ModuleManager */},{key:"reset",value:function reset(){this.currentModule=null;}/** * @method define * @instance * @description Define the module in manager * @param name The module name * @memberof module:core.ModuleManager */},{key:"define",value:function define(name){this.modules[name]=this.currentModule;}/** * @method use * @instance * @description Get the defined module from manager * @param name The module name * @memberof module:core.ModuleManager */},{key:"use",value:function use(name){return this.modules[name];}/** * @method set * @instance * @description An alias for .add()

* Use this method if you know that you will overwrite existing dependency.
* Use it in your app, but not in module that you provide to other people. * @param {String} key the key of the dependency * @param {Object} data the value of the dependency * @memberof module:core.ModuleManager */},{key:"set",value:function set(key,data){this.store.dispatch({type:'ADD',key:key,data:data});}/** * @method get * @instance * @description Returns dependency in store object, by key. * @param {String} key the key of the dependency * @memberof module:core.ModuleManager * @return {Object|Module} * @throws {DependencyError} if dependency is not in the store * @example Get the 'hello' dependency * manager.get('hello'); // -> {world: true} */},{key:"get",value:function get(key){if(!this.store.getState()[0][key]){throw new DependencyError('ModuleManager',"Module requires '".concat(key,"' dependency"),this.currentModule);}return this.store.getState()[0][key];}/** * @method has * @instance * @description Returns whether manager has a dependency with the given key * @param {String} key the key of the dependency * @memberof module:core.ModuleManager * @return {Boolean} Promise that is resolved when all promises completed. * @example Check whether the store has the 'hello' dependency * manager.has('hello'); // -> true */},{key:"has",value:function has(key){return Boolean(this.store.getState()[0][key]);}/** * @method update * @instance * @description Updates deps * @param {Object} [depsMap={}] * @memberof module:core.ModuleManager */},{key:"update",value:function update(){var _this=this;var depsMap=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.store.subscribe(function(){var _this$store$getState=_this.store.getState(),_this$store$getState2=slicedToArray(_this$store$getState,2),data=_this$store$getState2[0],changedKey=_this$store$getState2[1];var callback=depsMap[changedKey];if(callback)callback(data[changedKey]);});}/** * @method add * @alias module:core.ModuleManager#set * @memberof module:core.ModuleManager */},{key:"add",value:function add(){console.warn('.add() method is deprecated. Use .set() instead');return this.set.apply(this,arguments);}/** * @method require * @instance * @description Require module * @param {String} name Defined name * @param {Function} moduleExecutor Function that returns applied module * @memberof module:core.ModuleManager */},{key:"require",value:function require(name,moduleExecutor){if(this.use(name)===undefined)this.handler.applyModule(moduleExecutor());}}]);return ModuleManager;}();/** * @class Component * @category core * @param {Object} [params] - The parameters object. * @param {Object} [instructions] - The instructions object. * @extends ModuleSystem * @memberof module:core */var Component=/*#__PURE__*/function(_ModuleSystem){/** * Default values for parameters * @member {Object} module:core.Component#defaults * @static * @default { * modules: [], * manager: true * } */ /** * Static instructions * @member {Object} module:core.Component#instructions * @static * @default {} */ /** * Array of promises that should be resolved before Component is ready. * @member {Array} module:core.Component#_wait * @private */ // Collection of promises; /** * Collection of `modules`. * @member {Array} module:core.Component#modules * @public */ // Collection of modules; /** * Collection of `child` Components. * @member {Array} module:core.Component#children * @public */ // For keeping children components; function Component(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Component.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:Component.instructions;classCallCheck(this,Component);_this=possibleConstructorReturn(this,getPrototypeOf$2(Component).call(this));// Apply polyfilled parameters to .params; defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"_wait",[]),"modules",[]),"children",[]);_this.params=extend(transformData(params,instructions),defaults);if(_this.params.manager)_this.manager=new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));_this.modules=_this.params.modules;_this.integrateModules();return _this;}/** * @method wait * @instance * @description Wait for a promise. * @param {Promise} [promise] - The promise that should be added to a queue. * @return {Promise} Promise that is resolved when all promises completed. * @memberof module:core.Component */createClass(Component,[{key:"wait",value:function wait(promise){if(promise)this._wait.push(promise);return Promise.all(this._wait);}/** * @method defer * @instance * @description Execute `func` (Callback) when Component is ready. * @param {Function} func - Callback. * @memberof module:core.Component */},{key:"defer",value:function defer(func){var _this2=this;if(this.isDeffered)this.wait().then(function(){return func(_this2);});else func(this);}// PARAMETERS /** * @method updateParams * @instance * @description Updates parameters of the Component. * @return {Object} Params of this Component * @memberof module:core.Component */},{key:"updateParams",value:function updateParams(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.params=extend(params,this.params);return this.params;}// COPYING & CLONING /** * @method clone * @instance * @description Clone this component * @return {object} a cloned component with all its source component' params copied. * @memberof module:core.Component */},{key:"clone",value:function clone(){return new this.constructor(this.params).copy(this);}/** * @method copy * @instance * @description Copy source native and integrate `modules` to it. * @param {Component} source - Source component that is used for `copy()` action. * @param {Function} [customize] - Callback executed before modules integration process. * @return {this} Component * @memberof module:core.Component */},{key:"copy",value:function copy(source,customize){this.params=objectSpread({},source.params);if(source.native)this.native=source.native.clone(source.params);if(customize)customize();this.integrateModules(source);return this;}/** * @method add * @instance * @description Add a child `Component`. * @param {Component} object - Component that should be added as a `child`. * @return {Promise} Resolved when action is done. * @memberof module:core.Component */},{key:"add",value:function(){var _add=asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(object){return regenerator.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:if(!object.parent){_context.next=3;break;}_context.next=3;return object.parent.remove(object);case 3:_context.next=5;return this.wait();case 5:_context.next=7;return object.wait();case 7:if(object.native){_context.next=9;break;}throw new CompositionError$1('Component','there is no object.native',this);case 9:object.parent=this;_context.next=12;return this.applyBridge({onAdd:object}).onAdd;case 12:this.native.add(object.native);this.children.push(object);return _context.abrupt("return",object);case 15:case"end":return _context.stop();}}},_callee,this);}));return function add(_x){return _add.apply(this,arguments);};}()/** * @method remove * @instance * @description Remove a child `Component`. * @param {Component} object - Component that should be a **child** of this Component. * @return {Promise} Resolved when action is done. * @memberof module:core.Component */},{key:"remove",value:function(){var _remove=asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(object){return regenerator.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(!(object.parent!==this)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return this.wait();case 4:_context2.next=6;return object.wait();case 6:object.parent=null;this.native.remove(object.native);this.children.splice(this.children.indexOf(object),1);case 9:case"end":return _context2.stop();}}},_callee2,this);}));return function remove(_x2){return _remove.apply(this,arguments);};}()/** * @method addTo * @instance * @description Adds `this` Component to specified `App`/`Component`. * @param {Component} object - Component that will be a parent of `this`. * @memberof module:core.Component */},{key:"addTo",value:function addTo(object){return object.add(this);}},{key:"get",value:function get(key){return this.manager.get(key);}},{key:"use",value:function use(key){return this.manager.use(key);}/** * Returns whether the object is `async` (`wait` promises are more than `0`). * @member {Boolean} module:core.Component#isDeffered */},{key:"isDeffered",get:function get(){return this._wait.length>0;}/** * Returns the `ModuleManager` used for this component. * @member {ModuleManager} module:core.Component#manager * @throws {ManagerError} */},{key:"manager",get:function get(){if(this._manager)return this._manager;throw new ManagerError('Component',"ModuleManager is not used in this component. 'manager' parameter should be set as 'true'",this);},set:function set(manager){this._manager=manager;}/** * Returns the `native` object used for this component. * @member {Object} module:core.Component#native */},{key:"native",get:function get(){return this._native;},set:function set(mesh){this._native=mesh;this._native.component=this;return this._native;}}]);inherits(Component,_ModuleSystem);return Component;}(ModuleSystem);defineProperty$3(defineProperty$3(Component,"defaults",{modules:null,manager:true}),"instructions",{});// 26.1.6 Reflect.get(target, propertyKey [, receiver]) function get(target,propertyKey/* , receiver */){var receiver=arguments.length<3?target:arguments[2];var desc,proto;if(_anObject(target)===receiver)return target[propertyKey];if(desc=_objectGopd.f(target,propertyKey))return _has(desc,'value')?desc.value:desc.get!==undefined?desc.get.call(receiver):undefined;if(_isObject(proto=_objectGpo(target)))return get(proto,propertyKey,receiver);}_export(_export.S,'Reflect',{get:get});var get$1=_core.Reflect.get;var get$2=get$1;function _superPropBase$1(object,property){while(!Object.prototype.hasOwnProperty.call(object,property)){object=getPrototypeOf$2(object);if(object===null)break;}return object;}var superPropBase=_superPropBase$1;var get$3=createCommonjsModule(function(module){function _get$$1(target,property,receiver){if(typeof Reflect!=="undefined"&&get$2){module.exports=_get$$1=get$2;}else{module.exports=_get$$1=function _get$$1(target,property,receiver){var base=superPropBase(target,property);if(!base)return;var desc=getOwnPropertyDescriptor$1(base,property);if(desc.get){return desc.get.call(receiver);}return desc.value;};}return _get$$1(target,property,receiver||target);}module.exports=_get$$1;});function attributes(){for(var _len=arguments.length,mappers=new Array(_len),_key=0;_key<_len;_key++){mappers[_key]=arguments[_key];}return function(target){for(var i=0;i1&&arguments[1]!==undefined?arguments[1]:Mesh;return(/*#__PURE__*/function(_MeshComponent){function _class2(){classCallCheck(this,_class2);return possibleConstructorReturn(this,getPrototypeOf$2(_class2).apply(this,arguments));}createClass(_class2,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:geom,material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new constructor(geometry,material)}).mesh;}}]);inherits(_class2,_MeshComponent);return _class2;}(MeshComponent));}},{key:"create",value:function create(geom,params,constructor){return new(MeshComponent.custom(geom,constructor))(params);}},{key:"from",value:function from(mesh){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};params.build=false;var component=new MeshComponent(params);component.native=mesh;component.wrap();return component;}}]);function MeshComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:MeshComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:MeshComponent.instructions;classCallCheck(this,MeshComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(MeshComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('MeshComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){_this.wait(build);_this.wait(new Promise(function(resolve){build.then(function(native){_this.native=native;_this.wrap().then(resolve);});}));}else{_this.native=build;_this.wait(_this.wrap());}}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING /** * @method build * @description Build livecycle should return a native object. * @throws {CompositionError} * @memberof module:core.MeshComponent */createClass(MeshComponent,[{key:"build",value:function build(){throw new CompositionError$1('MeshComponent','Instance should have it\'s own .build().',this);}/** * @method wrap * @instance * @description Wraps transforms (`position` & `rotation`) * @return {Promise} Resolved when action is completed * @memberof module:core.MeshComponent */},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){// TODO: Fix defer with physics // this.defer(() => { var _this2$params=_this2.params,position=_this2$params.position,rotation=_this2$params.rotation,scale=_this2$params.scale,shadow=_this2$params.shadow;_this2.position.set(position.x,position.y,position.z);_this2.rotation.set(rotation.x,rotation.y,rotation.z);_this2.scale.set(scale.x,scale.y,scale.z);_this2.native.castShadow=shadow.cast;_this2.native.receiveShadow=shadow.receive;_this2.applyBridge({onWrap:1});resolve(_this2);// }); });}// COPYING & CLONING /** * @method copy * @instance * @description Copy source transforms & execute `Component.copy()` * @return {this} MeshComponent * @memberof module:core.MeshComponent */},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(MeshComponent.prototype),"copy",this).call(this,source,function(){_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/** * @method clone * @instance * @description Make a clone of this MeshComponent using `.copy()` * @return {MeshComponent} clone of this object * @memberof module:core.MeshComponent */},{key:"clone",value:function clone(geometry,material){var dest=new this.constructor({build:false}).copy(this);if(geometry)dest.geometry=dest.geometry.clone();if(material)dest.material=dest.material.clone();return dest;}}]);inherits(MeshComponent,_Component);return MeshComponent;}(Component))||_class);defineProperty$3(defineProperty$3(MeshComponent,"defaults",objectSpread({},Component.defaults,{build:true,geometry:{},material:false,shadow:{cast:true,receive:true},position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0},scale:{x:1,y:1,z:1}})),"instructions",{position:['x','y','z'],rotation:['x','y','z'],scale:['x','y','z']});var _dec$1,_class$1;var/** * @class LightComponent * @category core * @param {Object} [params] - The parameters object. * @param {Object} [instructions] - The instructions object. * @extends module:core.Component * @memberof module:core */LightComponent=(_dec$1=attributes(copy('position','rotation','quaternion','target')),_dec$1(_class$1=/*#__PURE__*/function(_Component){createClass(LightComponent,null,[{key:"from",/** * Default values for parameters * @member {Object} module:core.LightComponent#defaults * @static * @default * { * build: true, * * shadow: { * cast: true, * * bias: 0, * radius: 1, * * mapSize: { * width: 1024, * height: 1024 * }, * * camera: { * near: true, * far: 400, * fov: 90, * * top: 200, * bottom: -200, * left: -200, * right: 200 * } * }, * * position: {x: 0, y: 0, z: 0}, * rotation: {x: 0, y: 0, z: 0} * } */ /** * Static instructions * @member {Object} module:core.LightComponent#instructions * @static * @default * { * position: ['x', 'y', 'z'], * rotation: ['x', 'y', 'z'] * } */value:function from(light){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};var wrapShadow=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;params.build=false;var component=new LightComponent(params);component.native=light;component.wrap();if(wrapShadow)component.wrapShadow();return component;}}]);function LightComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:LightComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:LightComponent.instructions;classCallCheck(this,LightComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(LightComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('LightComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){build.then(function(native){_this.native=native;});}else _this.native=build;_this.wait(_this.wrap());}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING /** * @method build * @instance * @description Build livecycle should return a native object. * @throws {CompositionError} * @memberof module:core.LightComponent */createClass(LightComponent,[{key:"build",value:function build(){throw new CompositionError$1('MeshComponent','Instance should have it\'s own .build().',this);}/** * @method wrap * @instance * @description Wraps transforms (`position` & `rotation`) * @return {Promise} Resolved when action is completed * @memberof module:core.LightComponent */},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){_this2.defer(function(){var _this2$params=_this2.params,position=_this2$params.position,rotation=_this2$params.rotation;_this2.position.set(position.x,position.y,position.z);_this2.rotation.set(rotation.x,rotation.y,rotation.z);_this2.applyBridge({onWrap:1});resolve(_this2);});});}/** * @method wrapShadow * @instance * @description Wraps shadow properties * @memberof module:core.LightComponent */},{key:"wrapShadow",value:function wrapShadow(){var native=this.native,shadow=this.params.shadow;native.castShadow=shadow.cast;native.shadow.mapSize.width=shadow.mapSize.width;native.shadow.mapSize.height=shadow.mapSize.height;native.shadow.bias=shadow.bias;native.shadow.radius=shadow.radius;var shadowCamera=native.shadow.camera;var camera=shadow.camera;shadowCamera.near=camera.near;shadowCamera.far=camera.far;shadowCamera.fov=camera.fov;shadowCamera.left=camera.left;shadowCamera.right=camera.right;shadowCamera.top=camera.top;shadowCamera.bottom=camera.bottom;}// COPYING & CLONING /** * @method copy * @instance * @description Copy source transforms & execute `Component.copy()` * @return {this} LightComponent * @memberof module:core.LightComponent */},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(LightComponent.prototype),"copy",this).call(this,source,function(){if(_this3.target)_this3.target.copy(source.target());_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/** * @method clone * @instance * @description Make a clone of this LightComponent using `.copy()` * @return {LightComponent} clone of this object * @memberof module:core.LightComponent */},{key:"clone",value:function clone(){return new this.constructor({build:false}).copy(this);}}]);inherits(LightComponent,_Component);return LightComponent;}(Component))||_class$1);defineProperty$3(defineProperty$3(LightComponent,"defaults",objectSpread({},Component.defaults,{build:true,shadow:{cast:true,bias:0,radius:1,mapSize:{width:1024,height:1024},camera:{near:true,far:400,fov:90,top:200,bottom:-200,left:-200,right:200}},position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}})),"instructions",{position:['x','y','z'],rotation:['x','y','z']});var _dec$2,_class$2;var/** * @class CameraComponent * @category core * @param {Object} [params] - The parameters object. * @param {Object} [instructions] - The instructions object. * @extends module:core.Component * @memberof module:core */CameraComponent=(_dec$2=attributes(copy('position','rotation','quaternion','target')),_dec$2(_class$2=/*#__PURE__*/function(_Component){createClass(CameraComponent,null,[{key:"from",/** * Default values for parameters * @member {Object} module:core.CameraComponent#defaults * @static * @default * { * build: true, * * position: {x: 0, y: 0, z: 0}, * rotation: {x: 0, y: 0, z: 0} * } */ /** * Static instructions * @member {Object} module:core.CameraComponent#instructions * @static * @default * { * position: ['x', 'y', 'z'], * rotation: ['x', 'y', 'z'], * scale: ['x', 'y', 'z'] * } */value:function from(camera){var params=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};params.build=false;var component=new CameraComponent(params);component.native=camera;component.wrap();return component;}}]);function CameraComponent(params){var _this;var defaults=arguments.length>1&&arguments[1]!==undefined?arguments[1]:CameraComponent.defaults;var instructions=arguments.length>2&&arguments[2]!==undefined?arguments[2]:CameraComponent.instructions;classCallCheck(this,CameraComponent);_this=possibleConstructorReturn(this,getPrototypeOf$2(CameraComponent).call(this,params,defaults,instructions));if(_this.params.build){var build=_this.build(_this.params);if(!build){throw new CompositionError$1('CameraComponent','.build() method should return a THREE.Object3D or a Promise resolved with THREE.Object3D.',assertThisInitialized(assertThisInitialized(_this)));}if(build instanceof Promise){build.then(function(native){_this.native=native;});}else _this.native=build;_this.wait(_this.wrap());}_this.applyCommand('postIntegrate');return _this;}// BUILDING & WRAPPING /** * @method build * @instance * @description Build livecycle should return a native object. * @throws {CompositionError} * @memberof module:core.CameraComponent */createClass(CameraComponent,[{key:"build",value:function build(){throw new CompositionError$1('CameraComponent','Instance should have it\'s own .build().',this);}/** * @method wrap * @instance * @description Wraps transforms (`position` & `rotation`) * @return {Promise} Resolved when action is completed * @memberof module:core.CameraComponent */},{key:"wrap",value:function wrap(){var _this2=this;return new Promise(function(resolve){_this2.defer(function(){_this2.position.set(_this2.params.position.x,_this2.params.position.y,_this2.params.position.z);_this2.rotation.set(_this2.params.rotation.x,_this2.params.rotation.y,_this2.params.rotation.z);_this2.applyBridge({onWrap:1});resolve(_this2);});});}/** * @method copy * @instance * @description Copy source transforms & execute `Component.copy()` * @return {this} CameraComponent * @memberof module:core.CameraComponent */},{key:"copy",value:function copy$$1(source){var _this3=this;return get$3(getPrototypeOf$2(CameraComponent.prototype),"copy",this).call(this,source,function(){if(_this3.target)_this3.target.copy(source.target());_this3.position.copy(source.position);_this3.rotation.copy(source.rotation);_this3.quaternion.copy(source.quaternion);});}/** * @method clone * @instance * @description Make a clone of this CameraComponent using `.copy()` * @return {CameraComponent} clone of this object * @memberof module:core.CameraComponent */},{key:"clone",value:function clone(){return new this.constructor({build:false}).copy(this);}}]);inherits(CameraComponent,_Component);return CameraComponent;}(Component))||_class$2);defineProperty$3(defineProperty$3(CameraComponent,"defaults",objectSpread({},Component.defaults,{build:true,position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0}})),"instructions",{position:['x','y','z'],rotation:['x','y','z'],scale:['x','y','z']});const version="2.2.0-alpha.0";var system={window:typeof window==='undefined'?global:window};/** * @class App * @category core * @description This component is used to prepare a world scene, setup physics, camera, renderer and all other things that you usually do before making meshes. * @param {Array} [modules=[]] - Array of Modules * @extends ModuleSystem * @memberof module:core */var App=/*#__PURE__*/function(_ModuleSystem){/** * @description Defines whether the scene should render or not * @member {Boolean} module:core.App#enabled * @public */ /** * Loops in this app * @description Array of loops that are executed by this app. * @member {Array} module:core.App#loops * @public */function App(){var _this;var modules=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[];classCallCheck(this,App);console.log("WHS.App ".concat(version));_this=possibleConstructorReturn(this,getPrototypeOf$2(App).call(this));defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"enabled",true),"loops",[]);_this.manager=new ModuleManager(assertThisInitialized(assertThisInitialized(_this)));_this.modules=modules;_this.integrateModules();return _this;}// CONTROLS & UPDATING /** * @method start * @description Start rendering loop and physics simulation (if you use version with physics). * @memberof module:core.App */createClass(App,[{key:"start",value:function start(){var requestAnimFrame=function(){return system.window.requestAnimationFrame||system.window.webkitRequestAnimationFrame||system.window.mozRequestAnimationFrame||function(callback){system.window.setTimeout(callback,1000/60);};}();var loops=this.loops,enabled=this.enabled;function process(){requestAnimFrame(process);if(!enabled)return;for(var i=0,ll=loops.length;iAdding a loop to an app * const loop = new Loop(() => { * // ... * }); * * const app = new App(); * * app.addLoop(loop); * loop.start(); */},{key:"addLoop",value:function addLoop(loop){var _this2=this;return new Promise(function(resolve){_this2.loops.push(loop);resolve(loop);});}/** * @method removeLoop * @description Removes loop from this app. * @param {Object} loop - the loop to remove * @return {Promise} Promise that is resolved when promises completed. * @memberof module:core.App */},{key:"removeLoop",value:function removeLoop(loop){var _this3=this;return new Promise(function(resolve){var index=_this3.loops.indexOf(loop);if(index!==-1)_this3.loops.splice(index,1);resolve(loop);});}},{key:"get",value:function get(key){return this.manager.get(key);}},{key:"use",value:function use(key){return this.manager.use(key);}}]);inherits(App,_ModuleSystem);return App;}(ModuleSystem);/** * @class Loop * @category core * @param {Function} func function to execute on each animation frame * @param {Boolean} [useClock=true] passes a Clock to the function when called, if true * @memberof module:core */var Loop=/*#__PURE__*/function(){function Loop(func){var useClock=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;classCallCheck(this,Loop);this.func=func;this.clock=useClock?new Clock():null;this.enabled=false;}// CONTROLS /** * @method start * @instance * @description Starts this loop, clock if it has one. Won't do anything if loop enabled already. * @param {Component} [world] app to add this loop to, if provided. * @memberof module:core.Loop */createClass(Loop,[{key:"start",value:function start(world){if(this.enabled)return;if(world)world.addLoop(this);if(this.clock)this.clock.start();this.enabled=true;}/** * @method stop * @instance * @description Stops this loop and its clock if it has one, won't do anything if this loop is not enabled) * @param {Component} [world] app to remove this loop from, if provided. * @memberof module:core.Loop */},{key:"stop",value:function stop(world){if(!this.enabled)return;if(this.clock)this.clock.stop();this.enabled=false;if(world)world.removeLoop(this);}// EXECUTION /** * @method execute * @instance * @description Executes the function of this loop * @memberof module:core.Loop * @returns {*} whatever the function of this loop returns */},{key:"execute",value:function execute(){return this.func(this.clock);}}]);return Loop;}();/** @module core */ /** * @class AmbientLight * @category components/lights * @description AmbientLight is a simple class, it extends Light and inherits all its methods. * AmbientLight creates basic light around all scene, so it doesn't need properties like pos or target. * It supports only color and intensity as parameters, which defines the color of the surrounded light and intensity of light. * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating an AmbientLight * new AmbientLight({ * color: 0xffffff, * intensity: 0.2 * }).addTo(world); */var AmbientLight$1=/*#__PURE__*/function(_LightComponent){function AmbientLight$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,AmbientLight$$1);return possibleConstructorReturn(this,getPrototypeOf$2(AmbientLight$$1).call(this,params,AmbientLight$$1.defaults));}createClass(AmbientLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new AmbientLight(params.color,params.intensity)}).light;}}]);inherits(AmbientLight$$1,_LightComponent);return AmbientLight$$1;}(LightComponent);defineProperty$3(AmbientLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1}));/** * @class DirectionalLight * @category components/lights * @description DirectinalLight creates a light that shines from a specific direction not from a specific position.

* This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

* The best analogy would be a light source that acts like the sun: the sun is so far away that all sunlight hitting objects comes from the same angle.

* It has the same options as AmbientLight in light paramater, but it also supports pos and target paramaters. * @param {Object} [params={light: {color: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0) * new DirectionalLight({ * color: 0xffffff, * intensity: 0.2, * * position: [10, 20, 10] * }).addTo(app); */var DirectionalLight$1=/*#__PURE__*/function(_LightComponent){function DirectionalLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DirectionalLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(DirectionalLight$$1).call(this,params,DirectionalLight$$1.defaults));_this.wrapShadow();return _this;}createClass(DirectionalLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new DirectionalLight(params.color,params.intensity)}).light;}}]);inherits(DirectionalLight$$1,_LightComponent);return DirectionalLight$$1;}(LightComponent);defineProperty$3(DirectionalLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1}));/** * @class HemisphereLight * @category components/lights * @description HemisphereLight is a light source positioned directly above the scene.
* It also doesn't need position and target properties. * @classDesc * * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a HemisphereLight * new HemisphereLight({ * skyColor: 0xff0000, * groundColor: 0x0000ff, * intensity: 0.2 * }).addTo(app); */var HemisphereLight$1=/*#__PURE__*/function(_LightComponent){function HemisphereLight$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,HemisphereLight$$1);return possibleConstructorReturn(this,getPrototypeOf$2(HemisphereLight$$1).call(this,params,HemisphereLight$$1.defaults));}createClass(HemisphereLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new HemisphereLight(params.skyColor,params.groundColor,params.intensity)}).light;}}]);inherits(HemisphereLight$$1,_LightComponent);return HemisphereLight$$1;}(LightComponent);defineProperty$3(HemisphereLight$1,"defaults",objectSpread({},LightComponent.defaults,{skyColor:0xffffff,groundColor:0xffffff,intensity:1}));/** * @class PointLight * @category components/lights * @description PointLight creates a light at a specific position in the scene. The light shines in all directions (roughly similar to a light bulb.)

* It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params. * @extends LightComponent * @memberof module:components/lights * @example Creating a PointLight * new PointLight( { * color: 0xff0000, * intensity: 2, * distance: 300 * * position: [10, 20, 10] * }).addTo(app); */var PointLight$1=/*#__PURE__*/function(_LightComponent){function PointLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,PointLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(PointLight$$1).call(this,params,PointLight$$1.defaults));_this.wrapShadow();return _this;}createClass(PointLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new PointLight(params.color,params.intensity,params.distance,params.decay)}).light;}}]);inherits(PointLight$$1,_LightComponent);return PointLight$$1;}(LightComponent);defineProperty$3(PointLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,distance:100,decay:1}));/** * @class SpotLight * @category components/lights * @description SpotLight creates spot light that can cast shadow in one direction.

* It has the same parameters as AmbientLight in light, but it also supports pos and target.

* SpotLight affects meshes with lambert and phong material. * @classDesc * * @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, angle: Math.PI / 3, exponent: 0, decay: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0) * new SpotLight({ * color: 0x00ff00, * intensity: 3, * distance: 1000 * * position: [10, 20, 10] * }).addTo(app); */var SpotLight$1=/*#__PURE__*/function(_LightComponent){function SpotLight$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,SpotLight$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(SpotLight$$1).call(this,params,SpotLight$$1.defaults));_this.wrapShadow();return _this;}createClass(SpotLight$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new SpotLight(params.color,params.intensity,params.distance,params.angle,params.exponent,params.decay)}).light;}}]);inherits(SpotLight$$1,_LightComponent);return SpotLight$$1;}(LightComponent);defineProperty$3(SpotLight$1,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,distance:100,angle:Math.PI/3,exponent:0,decay:1}));var AreaLight=/*#__PURE__*/function(_LightComponent){function AreaLight(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,AreaLight);return possibleConstructorReturn(this,getPrototypeOf$2(AreaLight).call(this,params,AreaLight.defaults));}createClass(AreaLight,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({light:new RectAreaLight(params.color,params.intensity,params.width,params.height)}).light;}}]);inherits(AreaLight,_LightComponent);return AreaLight;}(LightComponent);defineProperty$3(AreaLight,"defaults",objectSpread({},LightComponent.defaults,{color:0xffffff,intensity:1,width:10,height:10}));/** @module components/lights */ /** * @class CubeCamera * @category components/cameras * @description Creates 6 cameras that render to a WebGLRenderTargetCube * @param {Object} [params] - The parameters object. * @memberof module:components/cameras * @extends module:core.CameraComponent * @example Creates a CubeCamera and set it as app's camera * const camera = new CubeCamera({ * camera: { * cubeResolution: 256 * }, * * position: { * x: 0, * y: 100, * z: 0 * } * }); * * app.camera = camera; */var CubeCamera$1=/*#__PURE__*/function(_CameraComponent){/** * Default values for parameters * @member {Object} module:components/cameras.CubeCamera#defaults * @static * @default
     * {
     *   camera: {
     *     near: 1,
     *     far: 1000,
     *     cubeResolution: 128
     *   }
     * }
*/function CubeCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,CubeCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(CubeCamera$$1).call(this,params,CubeCamera$$1.defaults));}createClass(CubeCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new CubeCamera(params.near,params.far,params.cubeResolution)}).camera;}}]);inherits(CubeCamera$$1,_CameraComponent);return CubeCamera$$1;}(CameraComponent);defineProperty$3(CubeCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,cubeResolution:128}));/** * @class OrthographicCamera * @category components/cameras * @description Camera with orthographic projection. * @param {Object} [params] - The parameters object. * @memberof module:components/cameras * @extends module:core.CameraComponent * @example Create an OrthographicCamera and set it as app's camera * const camera = new OrthographicCamera({ * camera: { * far: 10000 * }, * * position: { * y: 50 * } * }); * * app.camera = camera; */var OrthographicCamera$1=/*#__PURE__*/function(_CameraComponent){/** * Default values for parameters * @member {Object} module:components/cameras.OrthographicCamera#defaults * @static * @default
     * {
     *   near: 1,
     *   far: 1000,
     *   left: system.window.innerWidth / -2,
     *   right: system.window.innerWidth / 2,
     *   top: system.window.innerHeight / 2,
     *   bottom: system.window.innerHeight / -2
     * }
*/function OrthographicCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OrthographicCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(OrthographicCamera$$1).call(this,params,OrthographicCamera$$1.defaults));}createClass(OrthographicCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new OrthographicCamera(params.left,params.right,params.top,params.bottom,params.near,params.far)}).camera;}}]);inherits(OrthographicCamera$$1,_CameraComponent);return OrthographicCamera$$1;}(CameraComponent);defineProperty$3(OrthographicCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,left:system.window.innerWidth/-2,right:system.window.innerWidth/2,top:system.window.innerHeight/2,bottom:system.window.innerHeight/-2}));/** * @class PerspectiveCamera * @description Camera with perspective projection. * @category components/cameras * @param {Object} [params] - The parameters object. * @memberof module:components/cameras * @extends module:core.CameraComponent * @example Create an PerspectiveCamera and set it as app's camera * const camera = new PerspectiveCamera({ * fov: 75, * aspect: window.innerWidth / window.innerHeight, * * position: { * x: 0, * y: 100, * z: 0 * } * }); * * app.camera = camera; */var PerspectiveCamera$1=/*#__PURE__*/function(_CameraComponent){/** * Default values for parameters * @member {Object} module:components/cameras.PerspectiveCamera#defaults * @static * @default
     * {
     *   near: 1,
     *   far: 1000,
     *   fov: 75,
     *   aspect: system.window.innerWidth / system.window.innerHeight
     * }
*/function PerspectiveCamera$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,PerspectiveCamera$$1);return possibleConstructorReturn(this,getPrototypeOf$2(PerspectiveCamera$$1).call(this,params,PerspectiveCamera$$1.defaults));}createClass(PerspectiveCamera$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return this.applyBridge({camera:new PerspectiveCamera(params.fov,params.aspect,params.near,params.far)}).camera;}}]);inherits(PerspectiveCamera$$1,_CameraComponent);return PerspectiveCamera$$1;}(CameraComponent);defineProperty$3(PerspectiveCamera$1,"defaults",objectSpread({},CameraComponent.defaults,{near:1,far:1000,fov:75,aspect:system.window.innerWidth/system.window.innerHeight}));/** @module components/cameras */ /** * @class Box * @category components/meshes * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to * pass specific parameters to build this mesh as a geometry object. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Box, and adding to app * new Box({ * geometry: { * width: 2, * height: 2, * depth: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [50, 60, 70] * }).addTo(app); */var Box=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Box#defaults * @static * @default
     * {
     *   geometry: {
     *     width: 1,
     *     height: 1,
     *     depth: 1,
     *     widthSegments: 1,
     *     heightSegments: 1,
     *     depthSegments: 1
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Box#instructions * @static * @default geometry: ['width', 'height', 'depth', 'widthSegments', 'heightSegments', 'depthSegements'] */function Box(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Box);return possibleConstructorReturn(this,getPrototypeOf$2(Box).call(this,params,Box.defaults,Box.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Box */createClass(Box,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?BoxBufferGeometry:BoxGeometry)(params.geometry.width,params.geometry.height,params.geometry.depth,params.geometry.widthSegments,params.geometry.heightSegments,params.geometry.depthSegments);return geometry;}}]);inherits(Box,_MeshComponent);return Box;}(MeshComponent);defineProperty$3(defineProperty$3(Box,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{width:1,height:1,depth:1,widthSegments:1,heightSegments:1,depthSegments:1}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['width','height','depth','widthSegments','heightSegments','depthSegements']}));/** * @class Circle * @category components/meshes * @description As told on Component definition, while you can pass any of the inherited params for this component construction, you will need to * pass specific parameters to build this mesh as a geometry object. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Circle, and adding to app * new Circle({ * geometry: { * radius: 4, * segments: 16 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [50, 60, 70] * }).addTo(app); */var Circle=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Circle#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 50,
     *     segments: 8,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Circle#instructions * @static * @default geometry: ['radius', 'segments', 'thetaStart', 'thetaLength'] */function Circle(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Circle);return possibleConstructorReturn(this,getPrototypeOf$2(Circle).call(this,params,Circle.defaults,Circle.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Circle */createClass(Circle,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?CircleBufferGeometry:CircleGeometry)(params.geometry.radius,params.geometry.segments,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Circle,_MeshComponent);return Circle;}(MeshComponent);defineProperty$3(defineProperty$3(Circle,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:50,segments:8,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','segments','thetaStart','thetaLength']}));/** * @class Cone * @category components/meshes * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
* The surface area and the volume of a cylinder have been known since deep antiquity. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Cone, and adding to app * new Cone({ * geometry: { * radiusTop: 2, * radiusBottom: 4, * height: 5 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * pos: [0, 100, 0] * }).addTo(app); */var Cone=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Cone#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 20,
     *     height: 100,
     *     radiusSegments: 32,
     *     heightSegments: 1,
     *     openEnded: false,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Cone#instructions * @static * @default
     * geometry: [
     *   'radius',
     *   'height',
     *   'radiusSegments',
     *   'heightSegments',
     *   'openEnded',
     *   'thetaStart',
     *   'thetaLength'
     * ]
     * 
*/function Cone(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Cone);_this=possibleConstructorReturn(this,getPrototypeOf$2(Cone).call(this,params,Cone.defaults,Cone.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Cone.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Cone */createClass(Cone,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?ConeBufferGeometry:ConeGeometry)(params.geometry.radius,params.geometry.height,params.geometry.radiusSegments,params.geometry.heightSegments,params.geometry.openEnded,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Cone,_MeshComponent);return Cone;}(MeshComponent);defineProperty$3(defineProperty$3(Cone,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:20,height:100,radiusSegments:32,heightSegments:1,openEnded:false,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','height','radiusSegments','heightSegments','openEnded','thetaStart','thetaLength']}));/** * @class Cylinder * @category components/meshes * @description A cylinder is one of the most basic curvilinear geometric shapes, the surface formed by the points at a fixed distance from a given straight line, the axis of the cylinder.

* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
* The surface area and the volume of a cylinder have been known since deep antiquity. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Cylinder, and adding to app * new Cylinder({ * geometry: { * radiusTop: 2, * radiusBottom: 4, * height: 5 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * pos: [0, 100, 0] * }).addTo(app); */var Cylinder=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Cylinder#defaults * @static * @default
     * {
     *   geometry: {
     *     radiusTop: 20,
     *     radiusBottom: 20,
     *     height: 100,
     *     radiusSegments: 32,
     *     heightSegments: 1,
     *     openEnded: false,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Cylinder#instructions * @static * @default
     * geometry: [
     *   'radiusTop',
     *   'radiusBottom',
     *   'height',
     *   'radiusSegments',
     *   'heightSegments',
     *   'openEnded',
     *   'thetaStart',
     *   'thetaLength'
     * ]
     * 
*/function Cylinder(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Cylinder);_this=possibleConstructorReturn(this,getPrototypeOf$2(Cylinder).call(this,params,Cylinder.defaults,Cylinder.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Cylinder.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Cylinder */createClass(Cylinder,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?CylinderBufferGeometry:CylinderGeometry)(params.geometry.radiusTop,params.geometry.radiusBottom,params.geometry.height,params.geometry.radiusSegments,params.geometry.heightSegments,params.geometry.openEnded,params.geometry.thetaStart,params.geometry.thetaLength);return geometry;}}]);inherits(Cylinder,_MeshComponent);return Cylinder;}(MeshComponent);defineProperty$3(defineProperty$3(Cylinder,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radiusTop:0,radiusBottom:1,height:1,radiusSegments:32,heightSegments:1,openEnded:false,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radiusTop','radiusBottom','height','radiusSegments','heightSegments','openEnded','thetaStart','thetaLength']}));/** * @class Dodecahedron * @category components/meshes * @description In geometry, a dodecahedron is any polyhedron with twelve flat faces.

* The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
* There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
* All of these have icosahedral symmetry, order 120. * Dodecahedron creates Dodecahedron object by it's radius and detail. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Dodecahedron, and adding to app * new Dodecahedron({ * geometry: { * radius: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * y: 10 * } * }).addTo(app); */var Dodecahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Dodecahedron#defaults * @static * @default
     * geometry: {
     *   radius: 1,
     *   detail: 0
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Dodecahedron#instructions * @static * @default
     * geometry: ['radius', 'detail']
     * 
*/function Dodecahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Dodecahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Dodecahedron).call(this,params,Dodecahedron.defaults,Dodecahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Dodecahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Dodecahedron */createClass(Dodecahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?DodecahedronBufferGeometry:DodecahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Dodecahedron,_MeshComponent);return Dodecahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Dodecahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/** * @class Extrude * @category components/meshes * @description Extrude geometry means that you can create a 3D mesh from any 2D shape using three.js geometry based on THREE.Vector2.
* Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

* You can also find some interesting examples made using three.js which is a core of whs.js, such as: * - Webgl geometry extrude * - Extrude shapes from geodata * - Extrude splines * * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors. * This class is similar to THREE.ExtrudeGeometry, * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot). * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a shape, then an Extrude from it * const shape = new THREE.Shape([ * new THREE.Vector2(-4,-4), * new THREE.Vector2(-2,0), * new THREE.Vector2(-4,4), * new THREE.Vector2(0,2), * new THREE.Vector2(4,4), * new THREE.Vector2(2,0), * new THREE.Vector2(4,-4), * new THREE.Vector2(0,-2) * ]); * * const extrude = new Extrude({ * geometry: { * shapes: shape, * options: { * bevelEnabled: false, * bevelSize: 0, * amount: 2 * } * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }); * * extrude.addTo(app); */var Extrude=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Extrude#defaults * @static * @default
     * {
     *   geometry: {
     *     shapes: [],
     *     options: {}
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Extrude#instructions * @static * @default
     * {
     *   geometry: ['shapes', 'options']
     * }
     * 
*/function Extrude(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Extrude);_this=possibleConstructorReturn(this,getPrototypeOf$2(Extrude).call(this,params,Extrude.defaults,Extrude.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Extrude.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Extrude */createClass(Extrude,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new ExtrudeGeometry(params.geometry.shapes,params.geometry.options);return params.buffer?new BufferGeometry().fromGeometry(geometry):geometry;}}]);inherits(Extrude,_MeshComponent);return Extrude;}(MeshComponent);defineProperty$3(defineProperty$3(Extrude,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{shapes:[],options:{}}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['shapes','options']}));/** * @class Icosahedron * @category components/meshes * @description In geometry, an icosahedron is a polyhedron with 20 faces.
* There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
* `Icosahedron` creates an Icosahedron object by its radius and detail. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Icosahedron, and adding to app * new Icosahedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }).addTo(app); */var Icosahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Icosahedron#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 1,
     *     detail: 0
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Icosahedron#instructions * @static * @default {geometry: ['radius', 'detail']} */function Icosahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Icosahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Icosahedron).call(this,params,Icosahedron.defaults,Icosahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Icosahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Icosahedron */createClass(Icosahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?IcosahedronBufferGeometry:IcosahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Icosahedron,_MeshComponent);return Icosahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Icosahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/** * @class Lathe * @category components/meshes * @description A `LatheGeometry` allows you to create shapes from a smooth curve. * This curve is defined by a number of points (also called knots) and is most often called a spline. This spline is rotated around a fixed point and results in vase- and bell-like shapes.

* In 3D computer graphics, a lathed object is a 3D model whose vertex geometry is produced by rotating the points of a spline or other point set around a fixed axis. * The lathing may be partial; the amount of rotation is not necessarily a full 360 degrees. * The point set providing the initial source data can be thought of as a cross section through the object along a plane containing its axis of radial symmetry.

* The following example shows a geometry which can be generated using `Lathe` class. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Lath, and adding to app * const points = []; * * for (let i = 0; i < 10; i++) { * points.push( * new THREE.Vector2( * (Math.sin(i * 0.7) * 15 + 50) / 10, * (i - 5) * 0.2 * ) * ); * } * * const lathe = new Lathe({ * geometry: { * points: points * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 50, 10] * }).addTo(app); */var Lathe=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Lathe#defaults * @static * @default
     * {
     *   geometry: {
     *     points: []
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Lathe#instructions * @static * @default
{
     *   geometry: ['points']
     * }
     * 
*/function Lathe(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Lathe);_this=possibleConstructorReturn(this,getPrototypeOf$2(Lathe).call(this,params,Lathe.defaults,Lathe.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Lathe.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Lathe */createClass(Lathe,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?LatheBufferGeometry:LatheGeometry)(params.geometry.points);}}]);inherits(Lathe,_MeshComponent);return Lathe;}(MeshComponent);defineProperty$3(defineProperty$3(Lathe,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{points:[]}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['points']}));/** * @class Line * @category components/meshes * @description Line component is generated from a curve/line and amount of vectors that should be used (points). * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Line, and adding to app * new Line({ * geometry: { * curve: new THREE.LineCurve3(new THREE.Vector3(10, 10, 0), new THREE.Vector3(10, 30, 0)) * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Line$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Line#defaults * @static * @default
     * {
     *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
     *   points: 50
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Line#instructions * @static * @default
{
     *   geometry: ['curve', 'points']
     * }
     * 
*/function Line$$1(params){classCallCheck(this,Line$$1);return possibleConstructorReturn(this,getPrototypeOf$2(Line$$1).call(this,params,Line$$1.defaults,Line$$1.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Line */createClass(Line$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Line(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=params.buffer?new BufferGeometry():new Geometry();if(params.buffer){var pp=params.curve.getPoints(params.points);var verts=new Float32Array(pp.length*3);for(var i=0,max=pp.length;iCreating a Importer, and adding to app * new Importer({ * loader: new THREE.OBJLoader(), * * parser(geometry, material) { // data from loader * return new THREE.Mesh(geometry, material); // should return your .native (mesh in this case) * }, * * position: [0, 100, 0] * }).addTo(app); */var Importer=/*#__PURE__*/function(_MeshComponent){createClass(Importer,null,[{key:"filter",/** * Default values for parameters * @member {Object} module:components/meshes.Importer#defaults * @static * @default
       * {
       *   url: '',
       *   loader: new JSONLoader(),
       *
       *   onLoad() {},
       *   onProgress() {},
       *   onError() {},
       *
       *   texturePath: null,
       *   useCustomMaterial: false,
       *
       *   parser(geometry, materials) {
       *     return new Mesh(geometry, materials);
       *   }
       * }
*/ /** * @method filter * @description Default values for filter * @static * @param {THREE.Mesh} object Instance for iterating through it's children. * @param {Function} filter Function with child as argument, should return a boolean whether include the child or not. * @return {THREE.Mesh} object with children * @memberof module:components/meshes.Importer * @example Removing unnecessary lights from children * new Importer({ * loader: new THREE.OBJLoader(), * * parse(group) { // data from loader * return Importer.filter(group, child => !child.isLight); // remove lights * }, * * position: [0, 100, 0] * }).addTo(app); */value:function filter(object,_filter){var processFilter=function processFilter(object){object.children.forEach(function(el,index){if(el.children)processFilter(el);if(!_filter(el))object.children.splice(index,1);});return object;};return processFilter(object);}}]);function Importer(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Importer);return possibleConstructorReturn(this,getPrototypeOf$2(Importer).call(this,params,Importer.defaults,Importer.instructions,false));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Importer */createClass(Importer,[{key:"build",value:function build(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new Promise(function(resolve){if(params.texturePath)params.loader.setTexturePath(params.texturePath);params.loader.load(params.url,function(){for(var _len=arguments.length,data=new Array(_len),_key=0;_key<_len;_key++){data[_key]=arguments[_key];}// geometry, materials params.onLoad.apply(params,data);var object=params.parser.apply(_this,data);if(params.material)object.material=_this.applyBridge({material:params.material}).material;resolve(object);},params.onProgress,params.onError);});}}]);inherits(Importer,_MeshComponent);return Importer;}(MeshComponent);defineProperty$3(defineProperty$3(Importer,"defaults",objectSpread({},MeshComponent.defaults,{url:'',loader:new JSONLoader(),onLoad:function onLoad(){},onProgress:function onProgress(){},// TODO add onComplete? onError:function onError(){},texturePath:null,useCustomMaterial:false,parser:function parser(geometry,material){var _this$applyBridge=this.applyBridge({geometry:geometry,material:material}),geom=_this$applyBridge.geometry,mat=_this$applyBridge.material;return this.applyBridge({mesh:geom.bones?new SkinnedMesh(geom,mat):new Mesh(geom,mat)}).mesh;}})),"instructions",objectSpread({},MeshComponent.instructions));/** * @class Octahedron * @category components/meshes * @description In geometry, an octahedron is a polyhedron with eight faces. * A regular octahedron is a Platonic solid composed of eight equilateral triangles, four of which meet at each vertex. *

* `Octahedron` creates an Octahedron object by its `radius` and `detail`. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating an Octahedron, and adding to app * new Octahedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }).addTo(app); */var Octahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Octahedron#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 1,
     *     detail: 0
     *   }
     * }
     * 
*/function Octahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Octahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Octahedron).call(this,params,Octahedron.defaults,Octahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Octahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Octahedron */createClass(Octahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?OctahedronBufferGeometry:OctahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Octahedron,_MeshComponent);return Octahedron;}(MeshComponent);defineProperty$3(Octahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}}));/** * @class Parametric * @category components/meshes * @description `Parametric` generates a geometry representing a Parametric surface *

* It is usually used to develop different kinds of highfields or visualize a math function. *
* - Parametric surface * - "Graphulus" *

* @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Example creating an heightfield-like geometry. `u` and `v` are like `x` and `y` in shape, but their values are always from `0` to `1`. * We use them in `THREE.Vector3` like `x` and `z` and `Math.random() * 5` for `y`. * const createParametric = (u, v) => { * return new THREE.Vector3(u * 30, Math.random() * 5, v * 30); * } * * new Parametric({ * geometry: { * func: createParametric * }, * * material: new THREE.MeshLambertMaterial({ * color: 0xffffff, * side: THREE.DoubleSide * }), * * position: [0, 100, -100] * }).addTo(app); */var Parametric=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Parametric#defaults * @static * @default
     * {
     *   geometry: {
     *     func: (u, v) => new Vector3(u, v, 0),
     *     slices: 10,
     *     tacks: 10
     *   }
     * }
     * 
*/function Parametric(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Parametric);return possibleConstructorReturn(this,getPrototypeOf$2(Parametric).call(this,params,Parametric.defaults,Parametric.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Parametric */createClass(Parametric,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?ParametricBufferGeometry:ParametricGeometry)(params.geometry.func,params.geometry.slices,params.geometry.stacks);}}]);inherits(Parametric,_MeshComponent);return Parametric;}(MeshComponent);defineProperty$3(Parametric,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{func:function func(u,v){return new Vector3(u,v,0);},slices:10,stacks:10}}));/** * @class Plane * @category components/meshes * @description `Plane` is used for creating planes given some `width` and `height`. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Plane, and adding to app * new Plane({ * geometry: { * width: 20, * height: 30 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Plane$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Plane#defaults * @static * @default
     * {
     *   geometry: {
     *     width: 10,
     *     height: 10,
     *     wSegments: 1,
     *     hSegments: 1
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Plane#instructions * @static * @default
     * {
     *   geometry: ['width', 'height', 'wSegments', 'hSegments']
     * }
     * 
*/function Plane$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Plane$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Plane$$1).call(this,params,Plane$$1.defaults,Plane$$1.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Plane$$1.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Plane */createClass(Plane$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?PlaneBufferGeometry:PlaneGeometry)(params.geometry.width,params.geometry.height,params.geometry.wSegments,params.geometry.hSegments);return geometry;}}]);inherits(Plane$$1,_MeshComponent);return Plane$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Plane$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{width:10,height:10,wSegments:1,hSegments:1}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['width','height','wSegments','hSegments']}));var verticesOfCube=[-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,-1,1,1,-1,1,1,1,1,-1,1,1],indicesOfFaces=[2,1,0,0,3,2,0,4,7,7,3,0,0,1,5,5,4,0,1,2,6,6,5,1,2,3,7,7,6,2,4,5,6,6,7,4];/** * @class Polyhedron * @category components/meshes * @description In elementary geometry, a polyhedron is a solid in three dimensions with flat polygonal faces, straight edges and sharp corners or vertices. *

* `Polyhedron` creates a Polyhedron by its `radius` and `detail`. *

* @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating an Polyhedron, and adding to app * new Polyhedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: [0, 100, 0] * }).addTo(app); */var Polyhedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Polyhedron#defaults * @static * @default
     * {
     *   geometry: {
     *     verticesOfCube: [
     *       -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
     *       -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1
     *     ],
     *
     *     indicesOfFaces: [
     *       2, 1, 0, 0, 3, 2,
     *       0, 4, 7, 7, 3, 0,
     *       0, 1, 5, 5, 4, 0,
     *       1, 2, 6, 6, 5, 1,
     *       2, 3, 7, 7, 6, 2,
     *       4, 5, 6, 6, 7, 4
     *     ],
     *
     *     radius: 6,
     *     detail: 2
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Polyhedron#instructions * @static * @default
     * {
     *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
     * }
     * 
*/function Polyhedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Polyhedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Polyhedron).call(this,params,Polyhedron.defaults,Polyhedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Polyhedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Polyhedron */createClass(Polyhedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?PolyhedronBufferGeometry:PolyhedronGeometry)(params.geometry.verticesOfCube,params.geometry.indicesOfFaces,params.geometry.radius,params.geometry.detail);}}]);inherits(Polyhedron,_MeshComponent);return Polyhedron;}(MeshComponent);defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(Polyhedron,"verticesOfCube",verticesOfCube),"indicesOfFaces",indicesOfFaces),"defaults",objectSpread({},MeshComponent.defaults,{geometry:{verticesOfCube:verticesOfCube,indicesOfFaces:indicesOfFaces,radius:6,detail:2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['verticesOfCube','indicesOfFaces','radius','detail']}));/** * @class Ring * @category components/meshes * @description Ring class creates a circle or just 2D Torus. Does not support physics. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Ring, and adding to app * new Ring({ * geometry: { * innerRadius: 5, * outerRadius: 2 * }, * * material: new THREE.MeshLambertMaterial({ * color: 0xffffff, * side THREE.DoubleSide * }), * * position: [0, 8, 0], * * rotation: { * x: Math.PI/4 * } * }).addTo(app); */var Ring=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Ring#defaults * @static * @default
     * {
     *   geometry: {
     *     innerRadius: 0,
     *     outerRadius: 50,
     *     thetaSegments: 8,
     *     phiSegments: 8,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Ring#instructions * @static * @default
     * {
     *   geometry: [
     *     'innerRadius',
     *     'outerRadius',
     *     'thetaSegments',
     *     'phiSegments',
     *     'thetaStart',
     *     'thetaLength'
     *   ]
     * }
     * 
*/function Ring(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Ring);_this=possibleConstructorReturn(this,getPrototypeOf$2(Ring).call(this,params,Ring.defaults,Ring.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Ring.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Ring */createClass(Ring,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?RingBufferGeometry:RingGeometry)(params.geometry.innerRadius,params.geometry.outerRadius,params.geometry.thetaSegments,params.geometry.phiSegments,params.geometry.thetaStart,params.geometry.thetaLength);}}]);inherits(Ring,_MeshComponent);return Ring;}(MeshComponent);defineProperty$3(defineProperty$3(Ring,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{innerRadius:0,outerRadius:50,thetaSegments:8,phiSegments:8,thetaStart:0,thetaLength:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.defaults,{geometry:['innerRadius','outerRadius','thetaSegments','phiSegments','thetaStart','thetaLength']}));/** * @class Shape * @category components/meshes * @description Shape is a universal class. It allows you to create different 2D shapes in 3D scene.
* Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero. *

* `Shape` consists of shapes that are in its shapes parameter. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app * const rectWidth = 10, * rectLength = 5; * * const rectShape = new THREE.Shape(); * rectShape.moveTo(0,0); * rectShape.lineTo(0, rectWidth); * rectShape.lineTo(rectLength, rectWidth); * rectShape.lineTo(rectLength, 0); * rectShape.lineTo(0, 0); * * const plane = new Shape({ * geometry: { * shape: rectShape * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Shape$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Shape#defaults * @static * @default
     * {
     *   geometry: {
     *     shapes: []
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Shape#instructions * @static * @default
     * {
     *   geometry: ['shapes']
     * }
     * 
*/function Shape$$1(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Shape$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Shape$$1).call(this,params,Shape$$1.defaults,Shape$$1.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Shape$$1.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Shape */createClass(Shape$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?ShapeBufferGeometry:ShapeGeometry)(params.geometry.shapes);}}]);inherits(Shape$$1,_MeshComponent);return Shape$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Shape$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{shapes:[]}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['shapes']}));/** * @class Sphere * @category components/meshes * @description Sphere class is used to create sphere objects by its radius property and other values that determines its detality. *

* It is similar to THREE.SphereGeometry, but it also contains all `Shape` properties, such as material, mass and vectors like position (pos) and rotation (rot). *

* Then it creates an `Three.js mesh` or a `Physijs mesh`, that is similar to `Three.js mesh`, but it also take into consideration collision calculations. * This mesh is a combination of `Three.js geometry` and `Physijs material` (The same as in three.js, but with friction and restitution). * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Sphere, and adding it to app * new Sphere({ * geometry: { * radius: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * y: 100 * } * }).addTo(app); */var Sphere$1=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Sphere#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 1,
     *     widthSegments: 8,
     *     heightSegments: 6
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Sphere#instructions * @static * @default
     * {
     *   geometry: ['radius', 'widthSegments', 'heightSegments']
     * }
     * 
*/function Sphere$$1(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Sphere$$1);return possibleConstructorReturn(this,getPrototypeOf$2(Sphere$$1).call(this,params,Sphere$$1.defaults,Sphere$$1.instructions));}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Sphere */createClass(Sphere$$1,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?SphereBufferGeometry:SphereGeometry)(params.geometry.radius,params.geometry.widthSegments,params.geometry.heightSegments);return geometry;}}]);inherits(Sphere$$1,_MeshComponent);return Sphere$$1;}(MeshComponent);defineProperty$3(defineProperty$3(Sphere$1,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,widthSegments:8,heightSegments:6}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','widthSegments','heightSegments']}));/** * @class Tetrahedron * @category components/meshes * @description In geometry, a tetrahedron is a polyhedron composed of four triangular faces, six straight edges, and four vertex corners. * The tetrahedron is the simplest of all the ordinary convex polyhedra and the only one that has fewer than 5 faces. *

* `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail` * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Tetrahedron, and adding it to app * new Tetrahedron({ * geometry: { * radius: 2, * detail: 1 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * x: 0, * y: 100, * z: 0 * } * }).addTo(app); */var Tetrahedron=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Tetrahedron#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 1,
     *     detail: 0
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Tetrahedron#instructions * @static * @default
     * {
     *   geometry: ['radius', 'detail']
     * }
     * 
*/function Tetrahedron(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Tetrahedron);_this=possibleConstructorReturn(this,getPrototypeOf$2(Tetrahedron).call(this,params,Tetrahedron.defaults,Tetrahedron.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Tetrahedron.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Tetrahedron */createClass(Tetrahedron,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new(params.buffer?TetrahedronBufferGeometry:TetrahedronGeometry)(params.geometry.radius,params.geometry.detail);}}]);inherits(Tetrahedron,_MeshComponent);return Tetrahedron;}(MeshComponent);defineProperty$3(defineProperty$3(Tetrahedron,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:1,detail:0}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','detail']}));/** * @class Text * @category components/meshes * @description Text class is made for creating 3D text objects. * @classDesc * *

* Physics text object can be convex or concave. By default it's convex but you can also switch to concave. * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Text, and adding it to app * new Text({ * text: 'Some text', * parameters: { * font: 'path/to/font.typeface.js', * size: 20, * height: 5, * curveSegments: 6 * } * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * x: -40, * y: 20, * z: 0 * } * }).addTo(app); */var Text=/*#__PURE__*/function(_MeshComponent){createClass(Text,null,[{key:"load",/** * Default values for parameters * @member {Object} module:components/meshes.Text#defaults * @static * @default
       * {
       *   text: 'Hello World!',
       *   font: null,
       *
       *   geometry: {
       *     size: 12,
       *     height: 50,
       *     curveSegments: 12,
       *     font: new Font(),
       *     bevelEnabled: false,
       *     bevelThickness: 10,
       *     bevelSize: 8
       *   }
       * }
       * 
*/ /** * Default FontLoader * @member {Object} module:components/meshes.Text#loader * @static * @default new FontLoader() */ /** * @method load * @static * @description load() preloads a Font object and returns a Promise with it. * @param {String} path Path to the font * @return {Promise} A promise resolved with a font * @memberof module:components/meshes.Text */value:function load(path){var loader=arguments.length>1&&arguments[1]!==undefined?arguments[1]:Text.loader;return new Promise(function(resolve){loader.load(path,resolve);});}}]);function Text(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Text);return possibleConstructorReturn(this,getPrototypeOf$2(Text).call(this,params,Text.defaults,Text.instructions));}/** * @method build * @description Build is called as part of the lifecycle to create a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Text */createClass(Text,[{key:"build",value:function build(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var promise=new Promise(function(resolve){(params.font instanceof Promise?params.font:Promise.resolve(params.font)).then(function(font){var _this$applyBridge=_this.applyBridge({geometry:new TextGeometry(params.text,Object.assign(params.geometry,{font:font})),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;resolve(_this.applyBridge({mesh:new Mesh(geometry,material)}).mesh);});});get$3(getPrototypeOf$2(Text.prototype),"wait",this).call(this,promise);return promise;}}]);inherits(Text,_MeshComponent);return Text;}(MeshComponent);defineProperty$3(defineProperty$3(defineProperty$3(Text,"defaults",objectSpread({},MeshComponent.defaults,{text:'Hello World!',font:null,geometry:{size:12,height:50,curveSegments:12,font:new Font(),bevelEnabled:false,bevelThickness:10,bevelSize:8}})),"instructions",objectSpread({},MeshComponent.instructions)),"loader",new FontLoader());/** * @class Torus * @category components/meshes * @description Torus class makes a torus figure. A donut is a torus. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Torus, and adding it to app * new Torus({ * geometry: { * radius: 5, * tube: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * position: { * y: 35 * } * }).addTo(app); */var Torus=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Torus#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 100,
     *     tube: 40,
     *     radialSegments: 8,
     *     tubularSegments: 6,
     *     arc: Math.PI * 2
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Torus#instructions * @static * @default
     * {
     *   geometry: [
     *     'radius',
     *     'tube',
     *     'radialSegments',
     *     'tubularSegments',
     *     'arc'
     *   ]
     * }
     * 
*/function Torus(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Torus);_this=possibleConstructorReturn(this,getPrototypeOf$2(Torus).call(this,params,Torus.defaults,Torus.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Torus.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Torus */createClass(Torus,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};return new TorusGeometry(params.geometry.radius,params.geometry.tube,params.geometry.radialSegments,params.geometry.tubularSegments,params.geometry.arc);}}]);inherits(Torus,_MeshComponent);return Torus;}(MeshComponent);defineProperty$3(defineProperty$3(Torus,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:100,tube:40,radialSegments:8,tubularSegments:6,arc:Math.PI*2}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','tube','radialSegments','tubularSegments','arc']}));/** * @class Torusknot * @category components/meshes * @description Torusknot class makes a torusknot figure. It's like a crooked donut, very crooked. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Torusknot, and adding it to app * new Torusknot({ * geometry: { * radius:5, * tube: 2 * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * * pos: { * y: 100 * } * }).addTo(app); */var Torusknot=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Torusknot#defaults * @static * @default
     * {
     *   geometry: {
     *     radius: 100,
     *     tube: 40,
     *     radialSegments: 64,
     *     tubularSegments: 8,
     *     p: 2,
     *     q: 3
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Torusknot#instructions * @static * @default
     * {
     *   geometry: [
     *     'radius',
     *     'tube',
     *     'radialSegments',
     *     'tubularSegments',
     *     'p',
     *     'q'
     *   ]
     * }
     * 
*/function Torusknot(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Torusknot);_this=possibleConstructorReturn(this,getPrototypeOf$2(Torusknot).call(this,params,Torusknot.defaults,Torusknot.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Torusknot.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Torusknot */createClass(Torusknot,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var GConstruct=params.buffer?TorusKnotBufferGeometry:TorusKnotGeometry;return new GConstruct(params.geometry.radius,params.geometry.tube,params.geometry.radialSegments,params.geometry.tubularSegments,params.geometry.p,params.geometry.q);}}]);inherits(Torusknot,_MeshComponent);return Torusknot;}(MeshComponent);defineProperty$3(defineProperty$3(Torusknot,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{radius:100,tube:40,radialSegments:64,tubularSegments:8,p:2,q:3}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['radius','tube','radialSegments','tubularSegments','p','q']}));/** * @class Tube * @category components/meshes * @description Tube class makes a tube that extrudes along a 3d curve. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Tube from a three.js Curve, and adding it to app * const CustomSinCurve = THREE.Curve.create( * function (scale) { // custom curve constructor * this.scale = (scale === undefined) ? 1 : scale; * }, * * function (t) { // getPoint: t is between 0-1 * const tx = t * 3 - 1.5, * ty = Math.sin( 2 * Math.PI * t ), * tz = 0; * * return new THREE.Vector3(tx, ty, tz).multiplyScalar(this.scale); * } * ); * * const path = new CustomSinCurve(10); * * new Tube({ * geometry: { * path: path * }, * * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }) * }).addTo(app); */var Tube=/*#__PURE__*/function(_MeshComponent){/** * Default values for parameters * @member {Object} module:components/meshes.Tube#defaults * @static * @default
     * {
     *   geometry: {
     *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
     *     segments: 20,
     *     radius: 2,
     *     radiusSegments: 8,
     *     closed: false
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Tube#instructions * @static * @default
     * {
     *   geometry: [
     *     'path',
     *     'segments',
     *     'radius',
     *     'radiusSegments',
     *     'closed'
     *   ]
     * }
     * 
*/function Tube(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,Tube);_this=possibleConstructorReturn(this,getPrototypeOf$2(Tube).call(this,params,Tube.defaults,Tube.instructions));if(params.build){_this.build(params);get$3(getPrototypeOf$2(Tube.prototype),"wrap",assertThisInitialized(_this)).call(assertThisInitialized(_this));}return _this;}/** * @method build * @description Build lifecycle creates a mesh using input params. * @param {Object} params Component parameters. * @return {THREE.Mesh} Built mesh * @memberof module:components/meshes.Tube */createClass(Tube,[{key:"build",value:function build(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.params;var _this$applyBridge=this.applyBridge({geometry:this.buildGeometry(params),material:params.material}),geometry=_this$applyBridge.geometry,material=_this$applyBridge.material;return this.applyBridge({mesh:new Mesh(geometry,material)}).mesh;}},{key:"buildGeometry",value:function buildGeometry(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var geometry=new(params.buffer?TubeBufferGeometry:TubeGeometry)(params.geometry.path,params.geometry.segments,params.geometry.radius,params.geometry.radiusSegments,params.geometry.closed);return geometry;}}]);inherits(Tube,_MeshComponent);return Tube;}(MeshComponent);defineProperty$3(defineProperty$3(Tube,"defaults",objectSpread({},MeshComponent.defaults,{geometry:{path:new LineCurve3(new Vector3(0,0,0),new Vector3(0,0,1)),segments:20,radius:2,radiusSegments:8,closed:false}})),"instructions",objectSpread({},MeshComponent.instructions,{geometry:['path','segments','radius','radiusSegments','closed']}));/** * @class Group * @category components/meshes * @description Sometimes you need to make groups of objects (it's not conveniently to apply transforms to each object when can make just one to a group).
* In Three.js you make it using `THREE.Object3D` and it's children.

* In whs.js we have `Group` * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Approach 2 - Adding objects to an empty group * const sphere = new Sphere(); * const box = new Box(); * const group = new Group(); * * sphere.addTo(group); * box.addTo(group); * @example Approach 2 - Making a group from objects * const sphere = new Sphere(); * const box = new Box(); * const group = new Group(box, sphere); * // OR: const group = new Group([box, sphere]); */var Group$1=/*#__PURE__*/function(_MeshComponent){function Group$$1(){var _this;classCallCheck(this,Group$$1);_this=possibleConstructorReturn(this,getPrototypeOf$2(Group$$1).call(this,{}));for(var i=0;iCreating an element module, passing it to the App * new App([ * new ElementModule(document.getElementById('app')) * ]); */var ElementModule=/*#__PURE__*/function(){function ElementModule(){var container=arguments.length>0&&arguments[0]!==undefined?arguments[0]:document.body;classCallCheck(this,ElementModule);if(container.container){console.warn('ElementModule now accepts only argument which is a DOM object, not a params object.');this.container=container.container;}else this.container=container;this.createElement();}/** * @method createElement * @instance * @description Creates a canvas element. * @memberof module:modules/app.ElementModule */createClass(ElementModule,[{key:"createElement",value:function createElement(){this.element=window.document.createElement('div');this.element.className='whs-app';this.element.style.width='inherit';this.element.style.height='inherit';this.element.style.position='relative';}},{key:"manager",value:function manager(_manager){_manager.set('element',this.element);_manager.set('container',this.container);}},{key:"integrate",value:function integrate(self){self.container.appendChild(self.element);}}]);return ElementModule;}();/** * @class RenderingModule * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule({ * bgColor: 0x162129, * * renderer: { * antialias: true * } * }, {shadow: true}) * ]); */var RenderingModule=/*#__PURE__*/function(){/** * additional * @description collection of additional scripts * @static * @member {Object} module:core.App#additional * @public */ /** * enabled * @static * @member {Boolean} module:core.App#enabled * @public */function RenderingModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var additional=arguments.length>1?arguments[1]:undefined;classCallCheck(this,RenderingModule);defineProperty$3(this,"enabled",true);this.params=Object.assign({width:window.innerWidth,height:window.innerHeight,resolution:new Vector2(1,1),pixelRatio:window.devicePixelRatio,bgColor:0x000000,bgOpacity:1,renderer:{},fix:function fix(){}},params);var _this$params=this.params,bgColor=_this$params.bgColor,bgOpacity=_this$params.bgOpacity,_renderer=_this$params.renderer,pixelRatio=_this$params.pixelRatio,width=_this$params.width,height=_this$params.height,resolution=_this$params.resolution,fix=_this$params.fix;this.renderer=new WebGLRenderer(_renderer);this.effects=[];this.renderer.setClearColor(bgColor,bgOpacity);if(pixelRatio)this.renderer.setPixelRatio(pixelRatio);this.setSize(Number(width*resolution.x).toFixed(),Number(height*resolution.y).toFixed());for(var key in additional){if(additional[key])this.applyAdditional(key);}fix(this.renderer);}/** * @method applyAdditional * @description Apply additional script from RenderingModule.additional * @param {Stirng} name Script name * @return {this} * @memberof module:modules/app.RenderingModule */createClass(RenderingModule,[{key:"applyAdditional",value:function applyAdditional(name){RenderingModule.additional[name].apply(this,[this.renderer]);}/** * @method integrateRenderer * @description Integrate renderer * @param {NodeElement} element DOM object * @param {THREE.Scene} scene used scene * @param {THREE.Camera} camera used camera * @return {Loop} renderLoop * @memberof module:modules/app.RenderingModule */},{key:"integrateRenderer",value:function integrateRenderer(element,scene,camera){var _this=this;this.scene=scene;this.camera=camera;this.attachToCanvas(element);return new Loop(function(){return _this.renderer.render(_this.scene,_this.camera);});}/** * @method effect * @description Add three.js effect * @param {Object} effect three.js effect * @param {function} effectLoop update function for effect * @return {this} * @memberof module:modules/app.RenderingModule */},{key:"effect",value:function effect(_effect){var _this2=this;var effectLoop=arguments.length>1&&arguments[1]!==undefined?arguments[1]:function(){_effect.render(_this2.scene,_this2.camera);};this.renderLoop.stop();var size=this.renderer.getSize();_effect.setSize(size.width,size.height);var loop=new Loop(effectLoop);this.effects.push(loop);if(this.enabled)loop.start(this.app);return this;}/** * @method setSize * @description Update render target width and height. * @param {Number} width * @param {Number} height * @memberof module:modules/app.RenderingModule */},{key:"setSize",value:function setSize(width,height){if(this.renderer)this.renderer.setSize(width,height);}/** * @method attachToCanvas * @description Attach renderer.domElement to element * @param {NodeElement} element DOM object * @memberof module:modules/app.RenderingModule */},{key:"attachToCanvas",value:function attachToCanvas(element){var canvas=this.renderer.domElement;// attach to new parent world dom element.appendChild(canvas);canvas.style.width='100%';canvas.style.height='100%';}/** * @method stop * @description Stops renderLoop and effect loops * @memberof module:modules/app.RenderingModule */},{key:"stop",value:function stop(){this.enabled=false;this.renderLoop.stop();this.effects.forEach(function(loop){return loop.stop();});}/** * @method play * @description Resumes renderLoop and effect loops * @memberof module:modules/app.RenderingModule */},{key:"play",value:function play(){this.enabled=true;this.renderLoop.start();this.effects.forEach(function(loop){return loop.start();});}},{key:"manager",value:function manager(_manager){var _this3=this;_manager.define('rendering');_manager.set('renderer',this.renderer);this.app=_manager.handler;this.renderLoop=this.integrateRenderer(_manager.get('element'),_manager.get('scene'),_manager.get('camera').native);_manager.update({element:function element(_element){_this3.attachToCanvas(_element);},scene:function scene(_scene){_this3.scene=_scene;},camera:function camera(_camera){_this3.camera=_camera.native;}});}},{key:"integrate",value:function integrate(self){var _this4=this;self.renderLoop.start(this);self.effects.forEach(function(loop){return loop.start(_this4);});}/** * @method dispose * @description Dispose rendering context * @memberof module:modules/app.RenderingModule */},{key:"dispose",value:function dispose(){this.stop();this.renderer.forceContextLoss();}}]);return RenderingModule;}();defineProperty$3(RenderingModule,"additional",{shadow:function shadow(renderer){renderer.shadowMap.enabled=true;}});var SYMBOL_CHILDREN_FOR_SCENE=Symbol('SYMBOL_CHILDREN_FOR_SCENE');/** * @class SceneModule * @category modules/app * @param {Boolean} [willSceneBeReplaced=false] willSceneBeReplaced should be true only if you are going to overwrite scene dependency even without the use of default one. * @memberof module:modules/app */var SceneModule=/*#__PURE__*/function(){function SceneModule(){var willSceneBeReplaced=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,SceneModule);this.scene=willSceneBeReplaced?null:new Scene();}createClass(SceneModule,[{key:"manager",value:function manager(_manager){_manager.set('scene',this.scene);}},{key:"integrate",value:function integrate(self){Object.assign(this,{add:function add(object){var _this=this;return asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee(){return regenerator.wrap(function _callee$(_context){while(1){switch(_context.prev=_context.next){case 0:if(!object.parent){_context.next=3;break;}_context.next=3;return object.parent.remove(object);case 3:_context.next=5;return object.wait();case 5:if(object.native){_context.next=7;break;}throw new CompositionError('SceneModule','there is no object.native',_this);case 7:object.parent=_this;_context.next=10;return _this.applyBridge({onAdd:object}).onAdd;case 10:self.scene.add(object.native);_this.children.push(object);return _context.abrupt("return",object);case 13:case"end":return _context.stop();}}},_callee,this);}))();},remove:function remove(object){var _this2=this;return asyncToGenerator(/*#__PURE__*/regenerator.mark(function _callee2(){return regenerator.wrap(function _callee2$(_context2){while(1){switch(_context2.prev=_context2.next){case 0:if(!(object.parent!==_this2)){_context2.next=2;break;}return _context2.abrupt("return");case 2:_context2.next=4;return object.wait();case 4:object.parent=null;self.scene.remove(object.native);_this2.children.splice(_this2.children.indexOf(object),1);case 7:case"end":return _context2.stop();}}},_callee2,this);}))();},_setScene:function _setScene(scene){this.children=scene[SYMBOL_CHILDREN_FOR_SCENE]=scene[SYMBOL_CHILDREN_FOR_SCENE]||[];self.scene=scene;},setScene:function setScene(scene){this._setScene(scene);this.manager.set('scene',scene);},getScene:function getScene(){return self.scene;}});if(self.scene)this._setScene(self.scene);}}]);return SceneModule;}();// import {addResizeListener} from 'detect-element-resize'; /** * @class ResizeModule * @category modules/app * @param {Object} [params={auto: true}] - If auto is set to true - resize will be triggered when container resizes * @memberof module:modules/app */var ResizeModule=/*#__PURE__*/function(){function ResizeModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ResizeModule);this.params=Object.assign({auto:true},params);this.callbacks=[this.setSize.bind(this)];}/** * @function setSize * @instance * @description This function sets the provided width & height to the renderer object. * @param {Number} [width=1] - The promise that should be added to a queue. * @param {Number} [height=1] - that is resolved when all promises completed. * @memberof module:modules/app.ResizeModule */createClass(ResizeModule,[{key:"setSize",value:function setSize(){var width=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1;var height=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;this.camera.native.aspect=width/height;this.camera.native.updateProjectionMatrix();if(this.rendering)this.rendering.setSize(width,height);}/** * @method trigger * @instance * @description Triggers resize when called. width & height are determined automatically * This invokes each callbacks with the new width and height as params * @memberof module:modules/app.ResizeModule */},{key:"trigger",value:function trigger(){var _this$container=this.container,offsetWidth=_this$container.offsetWidth,offsetHeight=_this$container.offsetHeight,resolution=this.resolution;var width=Number(offsetWidth*resolution.x).toFixed();var height=Number(offsetHeight*resolution.y).toFixed();this.callbacks.forEach(function(cb){cb(width,height);});}/** * @method addAutoresize * @instance * @description Sets module to autoresize, this adds an event listene on window resize to trigger the resize * @memberof module:modules/app.ResizeModule */},{key:"addAutoresize",value:function addAutoresize(){this.container=this.getContainer();this.resolution=this.getResolution();if(this.params.auto)window.addEventListener('resize',this.trigger.bind(this));}/** * @method addCallback * @instance * @description Adds a call back function to the existing callbacks list. * @param {Function} func - The callback function to add * @memberof module:modules/app.ResizeModule */},{key:"addCallback",value:function addCallback(func){this.callbacks.push(func);}},{key:"manager",value:function manager(_manager){var _this=this;_manager.define('resize');this.rendering=_manager.get('renderer');this.camera=_manager.get('camera');this.getResolution=function(){return _manager.use('rendering').params.resolution;};this.getContainer=function(){return _manager.get('container');};_manager.update({container:function container(_container){_this.container=_container;}});this.addAutoresize();}}]);return ResizeModule;}();var fragment="uniform sampler2D tPreviousLum;\r\nuniform sampler2D tCurrentLum;\r\nuniform float minLuminance;\r\nuniform float delta;\r\nuniform float tau;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tfloat previousLum = texture2D(tPreviousLum, vUv, MIP_LEVEL_1X1).r;\r\n\tfloat currentLum = texture2D(tCurrentLum, vUv, MIP_LEVEL_1X1).r;\r\n\r\n\tpreviousLum = max(minLuminance, previousLum);\r\n\tcurrentLum = max(minLuminance, currentLum);\r\n\r\n\t// Adapt the luminance using Pattanaik's technique.\r\n\tfloat adaptedLum = previousLum + (currentLum - previousLum) * (1.0 - exp(-delta * tau));\r\n\r\n\tgl_FragColor.r = adaptedLum;\r\n\r\n}\r\n";var vertex="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An adaptive luminosity shader material. */var AdaptiveLuminosityMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new adaptive luminosity material. */function AdaptiveLuminosityMaterial(){classCallCheck(this,AdaptiveLuminosityMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(AdaptiveLuminosityMaterial).call(this,{type:"AdaptiveLuminosityMaterial",defines:{MIP_LEVEL_1X1:"0.0"},uniforms:{tPreviousLum:new Uniform(null),tCurrentLum:new Uniform(null),minLuminance:new Uniform(0.01),delta:new Uniform(0.0),tau:new Uniform(1.0)},fragmentShader:fragment,vertexShader:vertex,depthWrite:false,depthTest:false}));}inherits(AdaptiveLuminosityMaterial,_ShaderMaterial);return AdaptiveLuminosityMaterial;}(ShaderMaterial);var fragment$1="uniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform float focus;\r\nuniform float dof;\r\nuniform float aspect;\r\nuniform float aperture;\r\nuniform float maxBlur;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tuniform float cameraNear;\r\n\tuniform float cameraFar;\r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(1.0, aspect);\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = texture2D(tDepth, vUv).x;\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = readDepth(tDepth, vUv);\r\n\r\n\t#endif\r\n\r\n\tfloat focusNear = clamp(focus - dof, 0.0, 1.0);\r\n\tfloat focusFar = clamp(focus + dof, 0.0, 1.0);\r\n\r\n\t// Calculate a DoF mask.\r\n\tfloat low = step(depth, focusNear);\r\n\tfloat high = step(focusFar, depth);\r\n\r\n\tfloat factor = (depth - focusNear) * low + (depth - focusFar) * high;\r\n\r\n\tvec2 dofBlur = vec2(clamp(factor * aperture, -maxBlur, maxBlur));\r\n\r\n\tvec2 dofblur9 = dofBlur * 0.9;\r\n\tvec2 dofblur7 = dofBlur * 0.7;\r\n\tvec2 dofblur4 = dofBlur * 0.4;\r\n\r\n\tvec4 color = vec4(0.0);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofBlur);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofBlur);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.15, 0.37) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.37, 0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.37, -0.15) * aspectCorrection) * dofblur9);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.15, -0.37) * aspectCorrection) * dofblur9);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.40, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur7);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur7);\r\n\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, -0.4 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, 0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.4, 0.0 ) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2(-0.29, -0.29) * aspectCorrection) * dofblur4);\r\n\tcolor += texture2D(tDiffuse, vUv + (vec2( 0.0, 0.4 ) * aspectCorrection) * dofblur4);\r\n\r\n\tgl_FragColor = color / 41.0;\r\n\r\n}\r\n";var vertex$1="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Depth of Field shader (Bokeh). * * Original shader code by Martins Upitis: * http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html */var BokehMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new bokeh material. * * @param {PerspectiveCamera} [camera] - A camera. * @param {Object} [options] - The options. * @param {Number} [options.focus=1.0] - The focus distance, corresponds directly with the scene depth. * @param {Number} [options.dof=0.02] - Depth of field. An area in front of and behind the focus point that still appears sharp. * @param {Number} [options.aperture=0.025] - Camera aperture scale. Bigger values for stronger blur and shallower depth of field. * @param {Number} [options.maxBlur=1.0] - Maximum blur strength. */function BokehMaterial(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,BokehMaterial);var settings=Object.assign({focus:1.0,dof:0.02,aperture:0.025,maxBlur:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(BokehMaterial).call(this,{type:"BokehMaterial",uniforms:{cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000),aspect:new Uniform(1.0),tDiffuse:new Uniform(null),tDepth:new Uniform(null),focus:new Uniform(settings.focus),dof:new Uniform(settings.dof),aperture:new Uniform(settings.aperture),maxBlur:new Uniform(settings.maxBlur)},fragmentShader:fragment$1,vertexShader:vertex$1,depthWrite:false,depthTest:false}));_this.adoptCameraSettings(camera);return _this;}/** * Adopts the settings of the given camera. * * @param {PerspectiveCamera} [camera=null] - A camera. */createClass(BokehMaterial,[{key:"adoptCameraSettings",value:function adoptCameraSettings(){var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;this.uniforms.aspect.value=camera.aspect;}}}]);inherits(BokehMaterial,_ShaderMaterial);return BokehMaterial;}(ShaderMaterial);var fragment$2="uniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tconst vec2 threshold = vec2(EDGE_THRESHOLD);\r\n\r\n\t// Calculate color deltas.\r\n\tvec4 delta;\r\n\tvec3 c = texture2D(tDiffuse, vUv).rgb;\r\n\r\n\tvec3 cLeft = texture2D(tDiffuse, vOffset[0].xy).rgb;\r\n\tvec3 t = abs(c - cLeft);\r\n\tdelta.x = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTop = texture2D(tDiffuse, vOffset[0].zw).rgb;\r\n\tt = abs(c - cTop);\r\n\tdelta.y = max(max(t.r, t.g), t.b);\r\n\r\n\t// We do the usual threshold.\r\n\tvec2 edges = step(threshold, delta.xy);\r\n\r\n\t// Then discard if there is no edge.\r\n\tif(dot(edges, vec2(1.0)) == 0.0) {\r\n\r\n\t\tdiscard;\r\n\r\n\t}\r\n\r\n\t// Calculate right and bottom deltas.\r\n\tvec3 cRight = texture2D(tDiffuse, vOffset[1].xy).rgb;\r\n\tt = abs(c - cRight);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cBottom = texture2D(tDiffuse, vOffset[1].zw).rgb;\r\n\tt = abs(c - cBottom);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the maximum delta in the direct neighborhood.\r\n\tfloat maxDelta = max(max(max(delta.x, delta.y), delta.z), delta.w);\r\n\r\n\t// Calculate left-left and top-top deltas.\r\n\tvec3 cLeftLeft = texture2D(tDiffuse, vOffset[2].xy).rgb;\r\n\tt = abs(c - cLeftLeft);\r\n\tdelta.z = max(max(t.r, t.g), t.b);\r\n\r\n\tvec3 cTopTop = texture2D(tDiffuse, vOffset[2].zw).rgb;\r\n\tt = abs(c - cTopTop);\r\n\tdelta.w = max(max(t.r, t.g), t.b);\r\n\r\n\t// Calculate the final maximum delta.\r\n\tmaxDelta = max(max(maxDelta, delta.z), delta.w);\r\n\r\n\t// Local contrast adaptation in action.\r\n\tedges.xy *= step(0.5 * maxDelta, delta.xy);\r\n\r\n\tgl_FragColor = vec4(edges, 0.0, 0.0);\r\n\r\n}\r\n";var vertex$2="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-1.0, 0.0, 0.0, 1.0); // Changed sign in W component.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\tvOffset[2] = uv.xyxy + texelSize.xyxy * vec4(-2.0, 0.0, 0.0, 2.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A material that detects edges in a color texture. * * Mainly used for Subpixel Morphological Antialiasing. */var ColorEdgesMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new color edges material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function ColorEdgesMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,ColorEdgesMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(ColorEdgesMaterial).call(this,{type:"ColorEdgesMaterial",defines:{EDGE_THRESHOLD:"0.1"},uniforms:{tDiffuse:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$2,vertexShader:vertex$2,depthWrite:false,depthTest:false}));}/** * Sets the edge detection sensitivity. * * A lower value results in more edges being detected at the expense of * performance. * * 0.1 is a reasonable value, and allows to catch most visible edges. * 0.05 is a rather overkill value, that allows to catch 'em all. * * If temporal supersampling is used, 0.2 could be a reasonable value, * as low contrast edges are properly filtered by just 2x. * * @param {Number} threshold - The edge detection sensitivity. Range: [0, 0.5]. */createClass(ColorEdgesMaterial,[{key:"setEdgeDetectionThreshold",value:function setEdgeDetectionThreshold(threshold){this.defines.EDGE_THRESHOLD=threshold.toFixed("2");this.needsUpdate=true;}}]);inherits(ColorEdgesMaterial,_ShaderMaterial);return ColorEdgesMaterial;}(ShaderMaterial);var fragment$3="uniform sampler2D texture1;\r\nuniform sampler2D texture2;\r\n\r\nuniform float opacity1;\r\nuniform float opacity2;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel1 = opacity1 * texture2D(texture1, vUv);\r\n\tvec4 texel2 = opacity2 * texture2D(texture2, vUv);\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invTexel1 = vec3(1.0) - texel1.rgb;\r\n\t\tvec3 invTexel2 = vec3(1.0) - texel2.rgb;\r\n\r\n\t\tvec4 color = vec4(\r\n\t\t\tvec3(1.0) - invTexel1 * invTexel2,\r\n\t\t\ttexel1.a + texel2.a\r\n\t\t);\r\n\r\n\t#else\r\n\r\n\t\tvec4 color = texel1 + texel2;\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$3="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A material for combining two textures. * * This material supports the two blend modes Add and Screen. * * In Screen mode, the two textures are effectively projected on a white screen * simultaneously. In Add mode, the textures are simply added together which * often produces undesired, washed out results. */var CombineMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new combine material. * * @param {Boolean} [screenMode=false] - Whether the screen blend mode should be used. */function CombineMaterial(){var _this;var screenMode=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,CombineMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(CombineMaterial).call(this,{type:"CombineMaterial",uniforms:{texture1:new Uniform(null),texture2:new Uniform(null),opacity1:new Uniform(1.0),opacity2:new Uniform(1.0)},fragmentShader:fragment$3,vertexShader:vertex$3,depthWrite:false,depthTest:false}));_this.setScreenModeEnabled(screenMode);return _this;}/** * Enables or disables the Screen blend mode. * * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. */createClass(CombineMaterial,[{key:"setScreenModeEnabled",value:function setScreenModeEnabled(enabled){if(enabled){this.defines.SCREEN_MODE="1";}else{delete this.defines.SCREEN_MODE;}this.needsUpdate=true;}}]);inherits(CombineMaterial,_ShaderMaterial);return CombineMaterial;}(ShaderMaterial);var fragment$4="#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\t// Sample top left texel.\r\n\tvec4 sum = texture2D(tDiffuse, vUv0);\r\n\r\n\t// Sample top right texel.\r\n\tsum += texture2D(tDiffuse, vUv1);\r\n\r\n\t// Sample bottom right texel.\r\n\tsum += texture2D(tDiffuse, vUv2);\r\n\r\n\t// Sample bottom left texel.\r\n\tsum += texture2D(tDiffuse, vUv3);\r\n\r\n\t// Compute the average.\r\n\tgl_FragColor = sum * 0.25;\r\n\r\n\t#include \r\n\r\n}\r\n";var vertex$4="uniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\nuniform float kernel;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 dUv = (texelSize * vec2(kernel)) + halfTexelSize;\r\n\r\n\tvUv0 = vec2(uv.x - dUv.x, uv.y + dUv.y);\r\n\tvUv1 = vec2(uv.x + dUv.x, uv.y + dUv.y);\r\n\tvUv2 = vec2(uv.x + dUv.x, uv.y - dUv.y);\r\n\tvUv3 = vec2(uv.x - dUv.x, uv.y - dUv.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An optimised convolution shader material. * * This material supports dithering. * * Based on the GDC2003 Presentation by Masaki Kawase, Bunkasha Games: * Frame Buffer Postprocessing Effects in DOUBLE-S.T.E.A.L (Wreckless) * and an article by Filip Strugar, Intel: * An investigation of fast real-time GPU-based image blur algorithms * * Further modified according to Apple's * [Best Practices for Shaders](https://goo.gl/lmRoM5). */var ConvolutionMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new convolution material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function ConvolutionMaterial(){var _this;var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,ConvolutionMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(ConvolutionMaterial).call(this,{type:"ConvolutionMaterial",uniforms:{tDiffuse:new Uniform(null),texelSize:new Uniform(new Vector2()),halfTexelSize:new Uniform(new Vector2()),kernel:new Uniform(0.0)},fragmentShader:fragment$4,vertexShader:vertex$4,depthWrite:false,depthTest:false}));_this.setTexelSize(texelSize.x,texelSize.y);/** * The current kernel size. * * @type {KernelSize} * @default KernelSize.LARGE */_this.kernelSize=KernelSize.LARGE;return _this;}/** * Returns the kernel. * * @return {Float32Array} The kernel. */createClass(ConvolutionMaterial,[{key:"getKernel",value:function getKernel(){return kernelPresets[this.kernelSize];}/** * Sets the texel size. * * @param {Number} x - The texel width. * @param {Number} y - The texel height. */},{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);this.uniforms.halfTexelSize.value.set(x,y).multiplyScalar(0.5);}}]);inherits(ConvolutionMaterial,_ShaderMaterial);return ConvolutionMaterial;}(ShaderMaterial);/** * The Kawase blur kernel presets. * * @type {Float32Array[]} * @private */var kernelPresets=[new Float32Array([0.0,0.0]),new Float32Array([0.0,1.0,1.0]),new Float32Array([0.0,1.0,1.0,2.0]),new Float32Array([0.0,1.0,2.0,2.0,3.0]),new Float32Array([0.0,1.0,2.0,3.0,4.0,4.0,5.0]),new Float32Array([0.0,1.0,2.0,3.0,4.0,5.0,7.0,8.0,9.0,10.0])];/** * A kernel size enumeration. * * @type {Object} * @property {Number} VERY_SMALL - A very small kernel that matches a 7x7 Gauss blur kernel. * @property {Number} SMALL - A small kernel that matches a 15x15 Gauss blur kernel. * @property {Number} MEDIUM - A medium sized kernel that matches a 23x23 Gauss blur kernel. * @property {Number} LARGE - A large kernel that matches a 35x35 Gauss blur kernel. * @property {Number} VERY_LARGE - A very large kernel that matches a 63x63 Gauss blur kernel. * @property {Number} HUGE - A huge kernel that matches a 127x127 Gauss blur kernel. */var KernelSize={VERY_SMALL:0,SMALL:1,MEDIUM:2,LARGE:3,VERY_LARGE:4,HUGE:5};var fragment$5="uniform sampler2D tDiffuse;\r\nuniform float opacity;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = opacity * texel;\r\n\r\n}\r\n";var vertex$5="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A simple copy shader material. */var CopyMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new copy material. */function CopyMaterial(){classCallCheck(this,CopyMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(CopyMaterial).call(this,{type:"CopyMaterial",uniforms:{tDiffuse:new Uniform(null),opacity:new Uniform(1.0)},fragmentShader:fragment$5,vertexShader:vertex$5,depthWrite:false,depthTest:false}));}inherits(CopyMaterial,_ShaderMaterial);return CopyMaterial;}(ShaderMaterial);var fragment$6="#include \r\n#include \r\n\r\nuniform sampler2D tDepth;\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t// Transform into Cartesian coordinate (not mirrored).\r\n\tvec2 projTexCoord = (vProjTexCoord.xy / vProjTexCoord.w) * 0.5 + 0.5;\r\n\tprojTexCoord = clamp(projTexCoord, 0.002, 0.998);\r\n\r\n\tfloat fragCoordZ = unpackRGBAToDepth(texture2D(tDepth, projTexCoord));\r\n\r\n\t#ifdef PERSPECTIVE_CAMERA\r\n\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#else\r\n\r\n\t\tfloat viewZ = orthographicDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t#endif\r\n\r\n\tfloat depthTest = (-vViewZ > -viewZ) ? 1.0 : 0.0;\r\n\r\n\tgl_FragColor.rgb = vec3(0.0, depthTest, 1.0);\r\n\r\n}\r\n";var vertex$6="#include \r\n#include \r\n#include \r\n#include \r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t#include \r\n\t#include \r\n\t#include \r\n\t#include \r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include \r\n\r\n}\r\n";/** * A depth comparison shader material. */var DepthComparisonMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new depth comparison material. * * @param {Texture} [depthTexture=null] - A depth texture. * @param {PerspectiveCamera} [camera] - A camera. */function DepthComparisonMaterial(){var _this;var depthTexture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var camera=arguments.length>1?arguments[1]:undefined;classCallCheck(this,DepthComparisonMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(DepthComparisonMaterial).call(this,{type:"DepthComparisonMaterial",uniforms:{tDepth:new Uniform(depthTexture),cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000)},fragmentShader:fragment$6,vertexShader:vertex$6,depthWrite:false,depthTest:false,morphTargets:true,skinning:true}));_this.adoptCameraSettings(camera);return _this;}/** * Adopts the settings of the given camera. * * @param {Camera} [camera=null] - A camera. */createClass(DepthComparisonMaterial,[{key:"adoptCameraSettings",value:function adoptCameraSettings(){var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;if(camera instanceof PerspectiveCamera){this.defines.PERSPECTIVE_CAMERA="1";}else{delete this.defines.PERSPECTIVE_CAMERA;}}}}]);inherits(DepthComparisonMaterial,_ShaderMaterial);return DepthComparisonMaterial;}(ShaderMaterial);var fragment$7="uniform sampler2D tDiffuse;\r\n\r\nuniform float angle;\r\nuniform float scale;\r\nuniform float intensity;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nfloat pattern() {\r\n\r\n\tfloat s = sin(angle);\r\n\tfloat c = cos(angle);\r\n\r\n\tvec2 point = vec2(c * vUvPattern.x - s * vUvPattern.y, s * vUvPattern.x + c * vUvPattern.y) * scale;\r\n\r\n\treturn (sin(point.x) * sin(point.y)) * 4.0;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef AVERAGE\r\n\r\n\t\tcolor = vec3((color.r + color.g + color.b) / 3.0);\r\n\r\n\t#endif\r\n\r\n\tcolor = vec3(color * 10.0 - 5.0 + pattern());\r\n\tcolor = texel.rgb + (color - texel.rgb) * intensity;\r\n\r\n\tgl_FragColor = vec4(color, texel.a);\r\n\r\n}\r\n";var vertex$7="uniform vec4 offsetRepeat;\r\n\r\nvarying vec2 vUv;\r\nvarying vec2 vUvPattern;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvUvPattern = uv * offsetRepeat.zw + offsetRepeat.xy;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A dot screen shader material. */var DotScreenMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new dot screen material. * * @param {Boolean} [options] - The options. * @param {Boolean} [options.average=false] - Whether the shader should output the colour average (black and white). * @param {Boolean} [options.angle=1.57] - The angle of the dot pattern. * @param {Boolean} [options.scale=1.0] - The scale of the dot pattern. * @param {Boolean} [options.intensity=1.0] - The intensity of the effect. */function DotScreenMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DotScreenMaterial);var settings=Object.assign({average:false,angle:1.57,scale:1.0,intensity:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(DotScreenMaterial).call(this,{type:"DotScreenMaterial",uniforms:{tDiffuse:new Uniform(null),angle:new Uniform(settings.angle),scale:new Uniform(settings.scale),intensity:new Uniform(settings.intensity),offsetRepeat:new Uniform(new Vector4(0.5,0.5,1.0,1.0))},fragmentShader:fragment$7,vertexShader:vertex$7,depthWrite:false,depthTest:false}));_this.setAverageEnabled(settings.average);return _this;}/** * Enables or disables the Screen blend mode. * * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. */createClass(DotScreenMaterial,[{key:"setAverageEnabled",value:function setAverageEnabled(enabled){if(enabled){this.defines.AVERAGE="1";}else{delete this.defines.AVERAGE;}this.needsUpdate=true;}}]);inherits(DotScreenMaterial,_ShaderMaterial);return DotScreenMaterial;}(ShaderMaterial);var fragment$8="uniform sampler2D tDiffuse;\r\nuniform float time;\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifdef NOISE\r\n\r\n\tuniform float noiseIntensity;\r\n\r\n#endif\r\n\r\n#ifdef SCANLINES\r\n\r\n\tuniform float scanlineIntensity;\r\n\tuniform float scanlineCount;\r\n\r\n#endif\r\n\r\n#ifdef GRID\r\n\r\n\tuniform float gridIntensity;\r\n\tuniform vec2 gridScale;\r\n\tuniform float gridLineWidth;\r\n\r\n#endif\r\n\r\n#ifdef GREYSCALE\r\n\r\n\t#include \r\n\r\n\tuniform float greyscaleIntensity;\r\n\r\n#elif defined(SEPIA)\r\n\r\n\tuniform float sepiaIntensity;\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tuniform float vignetteOffset;\r\n\tuniform float vignetteDarkness;\r\n\r\n#endif\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tvec3 color = texel.rgb;\r\n\r\n\t#ifdef SCREEN_MODE\r\n\r\n\t\tvec3 invColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tfloat x = vUv.x * vUv.y * time * 1000.0;\r\n\t\tx = mod(x, 13.0) * mod(x, 123.0);\r\n\t\tx = mod(x, 0.01);\r\n\r\n\t\tvec3 noise = texel.rgb * clamp(0.1 + x * 100.0, 0.0, 1.0) * noiseIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invNoise = vec3(1.0) - noise;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invNoise;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += noise;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef SCANLINES\r\n\r\n\t\tvec2 sl = vec2(sin(vUv.y * scanlineCount), cos(vUv.y * scanlineCount));\r\n\t\tvec3 scanlines = texel.rgb * vec3(sl.x, sl.y, sl.x) * scanlineIntensity;\r\n\r\n\t\t#ifdef SCREEN_MODE\r\n\r\n\t\t\tinvColor = vec3(1.0) - color;\r\n\t\t\tvec3 invScanlines = vec3(1.0) - scanlines;\r\n\r\n\t\t\tcolor = vec3(1.0) - invColor * invScanlines;\r\n\r\n\t\t#else\r\n\r\n\t\t\tcolor += scanlines;\r\n\r\n\t\t#endif\r\n\r\n\t#endif\r\n\r\n\t#ifdef GRID\r\n\r\n\t\tfloat grid = 0.5 - max(abs(mod(vUv.x * gridScale.x, 1.0) - 0.5), abs(mod(vUv.y * gridScale.y, 1.0) - 0.5));\r\n\t\tcolor *= (1.0 - gridIntensity) + vec3(smoothstep(0.0, gridLineWidth, grid)) * gridIntensity;\r\n\r\n\t#endif\r\n\r\n\t#ifdef GREYSCALE\r\n\r\n\t\tcolor = mix(color, vec3(linearToRelativeLuminance(color)), greyscaleIntensity);\r\n\r\n\t#elif defined(SEPIA)\r\n\r\n\t\tvec3 c = color.rgb;\r\n\r\n\t\tcolor.r = dot(c, vec3(1.0 - 0.607 * sepiaIntensity, 0.769 * sepiaIntensity, 0.189 * sepiaIntensity));\r\n\t\tcolor.g = dot(c, vec3(0.349 * sepiaIntensity, 1.0 - 0.314 * sepiaIntensity, 0.168 * sepiaIntensity));\r\n\t\tcolor.b = dot(c, vec3(0.272 * sepiaIntensity, 0.534 * sepiaIntensity, 1.0 - 0.869 * sepiaIntensity));\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tconst vec2 center = vec2(0.5);\r\n\r\n\t\t#ifdef ESKIL\r\n\r\n\t\t\tvec2 uv = (vUv - center) * vec2(vignetteOffset);\r\n\t\t\tcolor = mix(color.rgb, vec3(1.0 - vignetteDarkness), dot(uv, uv));\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat dist = distance(vUv, center);\r\n\t\t\tcolor *= smoothstep(0.8, vignetteOffset * 0.799, dist * (vignetteDarkness + vignetteOffset));\r\n\r\n\t\t#endif\t\t\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = vec4(clamp(color, 0.0, 1.0), texel.a);\r\n\r\n}\r\n";var vertex$8="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A cinematic shader that provides the following effects: * - Film Grain * - Scanlines * - Vignette * - Greyscale * - Sepia * * Original scanlines algorithm by Pat "Hawthorne" Shearon. * http://www.truevision3d.com/forums/showcase/staticnoise_colorblackwhite_scanline_shaders-t18698.0.html * * Optimised scanlines and noise with intensity scaling by Georg "Leviathan" * Steinrohder. This version was provided under a Creative Commons Attribution * 3.0 License: http://creativecommons.org/licenses/by/3.0. * * The sepia effect is based on: * https://github.com/evanw/glfx.js * * The vignette code is based on PaintEffect postprocess from ro.me: * http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js */var FilmMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new film material. * * @param {Object} [options] - The options. Disabled effects will not be included in the final shader and have no negative impact on performance. * @param {Boolean} [options.greyscale=false] - Enable greyscale effect. Greyscale and sepia are mutually exclusive. * @param {Boolean} [options.sepia=false] - Enable sepia effect. Greyscale and sepia are mutually exclusive. * @param {Boolean} [options.vignette=false] - Apply vignette effect. * @param {Boolean} [options.eskil=false] - Use Eskil's vignette approach. The default looks dusty while Eskil looks burned out. * @param {Boolean} [options.screenMode=true] - Whether the screen blend mode should be used for noise and scanlines. Both of these effects are computed independently. * @param {Boolean} [options.noise=true] - Show noise-based film grain. * @param {Boolean} [options.scanlines=true] - Show scanlines. * @param {Boolean} [options.grid=true] - Show a grid. * @param {Number} [options.noiseIntensity=0.5] - The noise intensity. * @param {Number} [options.scanlineIntensity=0.05] - The scanline intensity. * @param {Number} [options.gridIntensity=1.0] - The grid strength. 0.0 to 1.0. * @param {Number} [options.greyscaleIntensity=1.0] - The intensity of the greyscale effect. 0.0 to 1.0. * @param {Number} [options.sepiaIntensity=1.0] - The intensity of the sepia effect. 0.0 to 1.0. * @param {Number} [options.vignetteOffset=1.0] - The offset of the vignette effect. 0.0 to 1.0. * @param {Number} [options.vignetteDarkness=1.0] - The darkness of the vignette effect. 0.0 to 1.0. */function FilmMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,FilmMaterial);var settings=Object.assign({screenMode:true,noise:true,scanlines:true,grid:false,greyscale:false,sepia:false,vignette:false,eskil:false,noiseIntensity:0.5,scanlineIntensity:0.05,gridIntensity:1.0,greyscaleIntensity:1.0,sepiaIntensity:1.0,vignetteOffset:1.0,vignetteDarkness:1.0},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(FilmMaterial).call(this,{type:"FilmMaterial",uniforms:{tDiffuse:new Uniform(null),time:new Uniform(0.0),noiseIntensity:new Uniform(settings.noiseIntensity),scanlineIntensity:new Uniform(settings.scanlineIntensity),gridIntensity:new Uniform(settings.gridIntensity),scanlineCount:new Uniform(0.0),gridScale:new Uniform(new Vector2()),gridLineWidth:new Uniform(0.0),greyscaleIntensity:new Uniform(settings.greyscaleIntensity),sepiaIntensity:new Uniform(settings.sepiaIntensity),vignetteOffset:new Uniform(settings.vignetteOffset),vignetteDarkness:new Uniform(settings.vignetteDarkness)},fragmentShader:fragment$8,vertexShader:vertex$8,depthWrite:false,depthTest:false}));_this.setScreenModeEnabled(settings.screenMode);_this.setNoiseEnabled(settings.noise);_this.setScanlinesEnabled(settings.scanlines);_this.setGridEnabled(settings.grid);_this.setGreyscaleEnabled(settings.greyscale);_this.setSepiaEnabled(settings.sepia);_this.setVignetteEnabled(settings.vignette);_this.setEskilEnabled(settings.eskil);return _this;}/** * Enables or disables the Screen blend mode. * * @param {Boolean} enabled - Whether the Screen blend mode should be enabled. */createClass(FilmMaterial,[{key:"setScreenModeEnabled",value:function setScreenModeEnabled(enabled){if(enabled){this.defines.SCREEN_MODE="1";}else{delete this.defines.SCREEN_MODE;}this.needsUpdate=true;}/** * Enables or disables the noise effect. * * @param {Boolean} enabled - Whether the noise effect should be enabled. */},{key:"setNoiseEnabled",value:function setNoiseEnabled(enabled){if(enabled){this.defines.NOISE="1";}else{delete this.defines.NOISE;}this.needsUpdate=true;}/** * Enables or disables the scanlines effect. * * @param {Boolean} enabled - Whether the scanlines effect should be enabled. */},{key:"setScanlinesEnabled",value:function setScanlinesEnabled(enabled){if(enabled){this.defines.SCANLINES="1";}else{delete this.defines.SCANLINES;}this.needsUpdate=true;}/** * Enables or disables the grid effect. * * @param {Boolean} enabled - Whether the grid effect should be enabled. */},{key:"setGridEnabled",value:function setGridEnabled(enabled){if(enabled){this.defines.GRID="1";}else{delete this.defines.GRID;}this.needsUpdate=true;}/** * Enables or disables the greyscale effect. * * @param {Boolean} enabled - Whether the greyscale effect should be enabled. */},{key:"setGreyscaleEnabled",value:function setGreyscaleEnabled(enabled){if(enabled){this.defines.GREYSCALE="1";}else{delete this.defines.GREYSCALE;}this.needsUpdate=true;}/** * Enables or disables the sepia effect. * * @param {Boolean} enabled - Whether the sepia effect should be enabled. */},{key:"setSepiaEnabled",value:function setSepiaEnabled(enabled){if(enabled){this.defines.SEPIA="1";}else{delete this.defines.SEPIA;}this.needsUpdate=true;}/** * Enables or disables the Vignette effect. * * @param {Boolean} enabled - Whether the Vignette effect should be enabled. */},{key:"setVignetteEnabled",value:function setVignetteEnabled(enabled){if(enabled){this.defines.VIGNETTE="1";}else{delete this.defines.VIGNETTE;}this.needsUpdate=true;}/** * Enables or disables the Eskil Vignette effect. * * Has no effect if Vignette is disabled. * * @param {Boolean} enabled - Whether the Eskil Vignette effect should be enabled. */},{key:"setEskilEnabled",value:function setEskilEnabled(enabled){if(enabled){this.defines.ESKIL="1";}else{delete this.defines.ESKIL;}this.needsUpdate=true;}}]);inherits(FilmMaterial,_ShaderMaterial);return FilmMaterial;}(ShaderMaterial);var fragment$9="uniform sampler2D tDiffuse;\r\nuniform sampler2D tPerturb;\r\n\r\nuniform bool active;\r\n\r\nuniform float amount;\r\nuniform float angle;\r\nuniform float seed;\r\nuniform float seedX;\r\nuniform float seedY;\r\nuniform float distortionX;\r\nuniform float distortionY;\r\nuniform float colS;\r\n\r\nvarying vec2 vUv;\r\n\r\nfloat rand(vec2 tc) {\r\n\r\n\tconst float a = 12.9898;\r\n\tconst float b = 78.233;\r\n\tconst float c = 43758.5453;\r\n\r\n\tfloat dt = dot(tc, vec2(a, b));\r\n\tfloat sn = mod(dt, 3.14);\r\n\r\n\treturn fract(sin(sn) * c);\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec2 coord = vUv;\r\n\r\n\tfloat xs, ys;\r\n\tvec4 normal;\r\n\r\n\tvec2 offset;\r\n\tvec4 cr, cga, cb;\r\n\tvec4 snow, color;\r\n\r\n\tfloat sx, sy;\r\n\r\n\tif(active) {\r\n\r\n\t\txs = floor(gl_FragCoord.x / 0.5);\r\n\t\tys = floor(gl_FragCoord.y / 0.5);\r\n\r\n\t\tnormal = texture2D(tPerturb, coord * seed * seed);\r\n\r\n\t\tif(coord.y < distortionX + colS && coord.y > distortionX - colS * seed) {\r\n\r\n\t\t\tsx = clamp(ceil(seedX), 0.0, 1.0);\r\n\t\t\tcoord.y = sx * (1.0 - (coord.y + distortionY)) + (1.0 - sx) * distortionY;\r\n\r\n\t\t}\r\n\r\n\t\tif(coord.x < distortionY + colS && coord.x > distortionY - colS * seed) {\r\n\r\n\t\t\tsy = clamp(ceil(seedY), 0.0, 1.0);\r\n\t\t\tcoord.x = sy * distortionX + (1.0 - sy) * (1.0 - (coord.x + distortionX));\r\n\r\n\t\t}\r\n\r\n\t\tcoord.x += normal.x * seedX * (seed / 5.0);\r\n\t\tcoord.y += normal.y * seedY * (seed / 5.0);\r\n\r\n\t\toffset = amount * vec2(cos(angle), sin(angle));\r\n\r\n\t\tcr = texture2D(tDiffuse, coord + offset);\r\n\t\tcga = texture2D(tDiffuse, coord);\r\n\t\tcb = texture2D(tDiffuse, coord - offset);\r\n\r\n\t\tcolor = vec4(cr.r, cga.g, cb.b, cga.a);\r\n\t\tsnow = 200.0 * amount * vec4(rand(vec2(xs * seed, ys * seed * 50.0)) * 0.2);\r\n\t\tcolor += snow;\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$9="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A glitch shader material. * * Reference: * https://github.com/staffantan/unityglitch */var GlitchMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new glitch material. */function GlitchMaterial(){classCallCheck(this,GlitchMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(GlitchMaterial).call(this,{type:"GlitchMaterial",uniforms:{tDiffuse:new Uniform(null),tPerturb:new Uniform(null),active:new Uniform(1),amount:new Uniform(0.8),angle:new Uniform(0.02),seed:new Uniform(0.02),seedX:new Uniform(0.02),seedY:new Uniform(0.02),distortionX:new Uniform(0.5),distortionY:new Uniform(0.6),colS:new Uniform(0.05)},fragmentShader:fragment$9,vertexShader:vertex$9,depthWrite:false,depthTest:false}));}inherits(GlitchMaterial,_ShaderMaterial);return GlitchMaterial;}(ShaderMaterial);var fragment$10="#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec3 lightPosition;\r\n\r\nuniform float exposure;\r\nuniform float decay;\r\nuniform float density;\r\nuniform float weight;\r\nuniform float clampMax;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec2 texCoord = vUv;\r\n\r\n\t// Calculate vector from pixel to light source in screen space.\r\n\tvec2 deltaTexCoord = texCoord - lightPosition.st;\r\n\tdeltaTexCoord *= 1.0 / NUM_SAMPLES_FLOAT * density;\r\n\r\n\t// A decreasing illumination factor.\r\n\tfloat illuminationDecay = 1.0;\r\n\r\n\tvec4 sample;\r\n\tvec4 color = vec4(0.0);\r\n\r\n\t// Estimate the probability of occlusion at each pixel by summing samples along a ray to the light source.\r\n\tfor(int i = 0; i < NUM_SAMPLES_INT; ++i) {\r\n\r\n\t\ttexCoord -= deltaTexCoord;\r\n\t\tsample = texture2D(tDiffuse, texCoord);\r\n\r\n\t\t// Apply sample attenuation scale/decay factors.\r\n\t\tsample *= illuminationDecay * weight;\r\n\r\n\t\tcolor += sample;\r\n\r\n\t\t// Update exponential decay factor.\r\n\t\tilluminationDecay *= decay;\r\n\r\n\t}\r\n\r\n\tgl_FragColor = clamp(color * exposure, 0.0, clampMax);\r\n\r\n\t#include \r\n\r\n}\r\n";var vertex$10="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A crepuscular rays shader material. * * This material supports dithering. * * References: * * Thibaut Despoulain, 2012: * [(WebGL) Volumetric Light Approximation in Three.js]( * http://bkcore.com/blog/3d/webgl-three-js-volumetric-light-godrays.html) * * Nvidia, GPU Gems 3, 2008: * [Chapter 13. Volumetric Light Scattering as a Post-Process]( * https://developer.nvidia.com/gpugems/GPUGems3/gpugems3_ch13.html) */var GodRaysMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new god rays material. * * @param {Object} [options] - The options. * @param {Number} [options.density=0.96] - The density of the light rays. * @param {Number} [options.decay=0.93] - An illumination decay factor. * @param {Number} [options.weight=0.4] - A light ray weight factor. * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. */function GodRaysMaterial(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,GodRaysMaterial);var settings=Object.assign({exposure:0.6,density:0.93,decay:0.96,weight:0.4,clampMax:1.0},options);return possibleConstructorReturn(this,getPrototypeOf$2(GodRaysMaterial).call(this,{type:"GodRaysMaterial",defines:{NUM_SAMPLES_FLOAT:"60.0",NUM_SAMPLES_INT:"60"},uniforms:{tDiffuse:new Uniform(null),lightPosition:new Uniform(null),exposure:new Uniform(settings.exposure),decay:new Uniform(settings.decay),density:new Uniform(settings.density),weight:new Uniform(settings.weight),clampMax:new Uniform(settings.clampMax)},fragmentShader:fragment$10,vertexShader:vertex$10,depthWrite:false,depthTest:false}));}inherits(GodRaysMaterial,_ShaderMaterial);return GodRaysMaterial;}(ShaderMaterial);var fragment$11="#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float distinction;\r\nuniform vec2 range;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tfloat l = linearToRelativeLuminance(texel.rgb);\r\n\r\n\t#ifdef RANGE\r\n\r\n\t\tfloat low = step(range.x, l);\r\n\t\tfloat high = step(l, range.y);\r\n\r\n\t\t// Apply the mask.\r\n\t\tl *= low * high;\r\n\r\n\t#endif\r\n\r\n\tl = pow(abs(l), distinction);\r\n\r\n\t#ifdef COLOR\r\n\r\n\t\tgl_FragColor = vec4(texel.rgb * l, texel.a);\r\n\r\n\t#else\r\n\r\n\t\tgl_FragColor = vec4(l, l, l, texel.a);\r\n\r\n\t#endif\r\n\r\n}\r\n";var vertex$11="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A luminosity shader material. * * This shader produces a greyscale luminance map that describes the absolute * amount of light emitted by a scene. It can also be configured to output * colours that are scaled with their respective luminance value. Additionally, * a range may be provided to mask out undesired texels. * * The alpha channel will remain unaffected in all cases. * * On luminance coefficients: * http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html#RTFToC9 * * Coefficients for different colour spaces: * https://hsto.org/getpro/habr/post_images/2ab/69d/084/2ab69d084f9a597e032624bcd74d57a7.png * * Luminance range reference: * https://cycling74.com/2007/05/23/your-first-shader/#.Vty9FfkrL4Z */var LuminosityMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new luminosity material. * * @param {Boolean} [colorOutput=false] - Defines whether the shader should output colours scaled with their luminance value. * @param {Vector2} [luminanceRange] - If provided, the shader will mask out texels that aren't in the specified luminance range. */function LuminosityMaterial(){var _this;var colorOutput=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;var luminanceRange=arguments.length>1&&arguments[1]!==undefined?arguments[1]:null;classCallCheck(this,LuminosityMaterial);var maskLuminance=luminanceRange!==null;_this=possibleConstructorReturn(this,getPrototypeOf$2(LuminosityMaterial).call(this,{type:"LuminosityMaterial",uniforms:{tDiffuse:new Uniform(null),distinction:new Uniform(1.0),range:new Uniform(maskLuminance?luminanceRange:new Vector2())},fragmentShader:fragment$11,vertexShader:vertex$11}));_this.setColorOutputEnabled(colorOutput);_this.setLuminanceRangeEnabled(maskLuminance);return _this;}/** * Enables or disables color output. * * @param {Boolean} enabled - Whether color output should be enabled. */createClass(LuminosityMaterial,[{key:"setColorOutputEnabled",value:function setColorOutputEnabled(enabled){if(enabled){this.defines.COLOR="1";}else{delete this.defines.COLOR;}this.needsUpdate=true;}/** * Enables or disables the luminance mask. * * @param {Boolean} enabled - Whether the luminance mask should be enabled. */},{key:"setLuminanceRangeEnabled",value:function setLuminanceRangeEnabled(enabled){if(enabled){this.defines.RANGE="1";}else{delete this.defines.RANGE;}this.needsUpdate=true;}}]);inherits(LuminosityMaterial,_ShaderMaterial);return LuminosityMaterial;}(ShaderMaterial);var fragment$12="uniform sampler2D tDiffuse;\r\nuniform sampler2D tMask;\r\nuniform sampler2D tEdges;\r\n\r\nuniform vec3 visibleEdgeColor;\r\nuniform vec3 hiddenEdgeColor;\r\nuniform float pulse;\r\nuniform float edgeStrength;\r\n\r\n#ifdef USE_PATTERN\r\n\r\n\tuniform sampler2D tPattern;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 color = texture2D(tDiffuse, vUv);\r\n\tvec2 edge = texture2D(tEdges, vUv).rg;\r\n\tvec2 mask = texture2D(tMask, vUv).rg;\r\n\r\n\t#ifndef X_RAY\r\n\r\n\t\tedge.y = 0.0;\r\n\r\n\t#endif\r\n\r\n\tedge *= (edgeStrength * mask.x * pulse);\r\n\tvec3 outlineColor = edge.x * visibleEdgeColor + edge.y * hiddenEdgeColor;\r\n\r\n\t#ifdef ALPHA_BLENDING\r\n\r\n\t\tcolor.rgb = mix(color.rgb, outlineColor, max(edge.x, edge.y));\r\n\r\n\t#else\r\n\r\n\t\tcolor.rgb += outlineColor;\r\n\r\n\t#endif\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec3 patternColor = texture2D(tPattern, vPatternCoord).rgb;\r\n\r\n\t\t#ifdef X_RAY\r\n\r\n\t\t\tfloat hiddenFactor = 0.5;\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat hiddenFactor = 0.0;\r\n\r\n\t\t#endif\r\n\r\n\t\tfloat visibilityFactor = (1.0 - mask.y > 0.0) ? 1.0 : hiddenFactor;\r\n\r\n\t\tcolor.rgb += visibilityFactor * (1.0 - mask.x) * (1.0 - patternColor);\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$12="#ifdef USE_PATTERN\r\n\r\n\tuniform float aspect;\r\n\tuniform float patternScale;\r\n\tvarying vec2 vPatternCoord;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_PATTERN\r\n\r\n\t\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\t\tvPatternCoord = uv * aspectCorrection * patternScale;\r\n\r\n\t#endif\r\n\r\n\tvUv = uv;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An outline blend shader material. */var OutlineBlendMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new outline blend material. * * @param {Object} [options] - The options. * @param {Number} [options.edgeStrength=1.0] - The edge strength. * @param {Number} [options.patternScale=1.0] - The scale of the pattern texture. * @param {Number} [options.visibleEdgeColor=0xffffff] - The color of visible edges. * @param {Number} [options.hiddenEdgeColor=0x22090A] - The color of hidden edges. * @param {Boolean} [alphaBlending=false] - Whether the outline should be blended using alpha. * @param {Boolean} [xRay=true] - Whether hidden parts of selected objects should be visible. */function OutlineBlendMaterial(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OutlineBlendMaterial);var settings=Object.assign({edgeStrength:1.0,patternScale:1.0,visibleEdgeColor:0xffffff,hiddenEdgeColor:0x22090A,alphaBlending:false,xRay:true},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlineBlendMaterial).call(this,{type:"OutlineBlendMaterial",uniforms:{pulse:new Uniform(1.0),aspect:new Uniform(1.0),tDiffuse:new Uniform(null),tMask:new Uniform(null),tEdges:new Uniform(null),tPattern:new Uniform(null),edgeStrength:new Uniform(settings.edgeStrength),patternScale:new Uniform(settings.patternScale),visibleEdgeColor:new Uniform(new Color(settings.visibleEdgeColor)),hiddenEdgeColor:new Uniform(new Color(settings.hiddenEdgeColor))},fragmentShader:fragment$12,vertexShader:vertex$12,depthWrite:false,depthTest:false}));_this.setAlphaBlendingEnabled(settings.alphaBlending);_this.setXRayEnabled(settings.xRay);return _this;}/** * Enables or disables the alpha blending. * * @param {Boolean} enabled - Whether the alpha blending should be enabled. */createClass(OutlineBlendMaterial,[{key:"setAlphaBlendingEnabled",value:function setAlphaBlendingEnabled(enabled){if(enabled){this.defines.ALPHA_BLENDING="1";}else{delete this.defines.ALPHA_BLENDING;}this.needsUpdate=true;}/** * Defines whether hidden parts of selected objects should be visible. * * @param {Boolean} enabled - Whether hidden parts of selected objects should be visible. */},{key:"setXRayEnabled",value:function setXRayEnabled(enabled){if(enabled){this.defines.X_RAY="1";}else{delete this.defines.X_RAY;}this.needsUpdate=true;}/** * Sets a pattern texture to use as overlay. * * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. */},{key:"setPatternTexture",value:function setPatternTexture(){var texture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;if(texture!==null){this.defines.USE_PATTERN="1";}else{delete this.defines.USE_PATTERN;}this.uniforms.tPattern.value=texture;this.needsUpdate=true;}}]);inherits(OutlineBlendMaterial,_ShaderMaterial);return OutlineBlendMaterial;}(ShaderMaterial);var fragment$13="uniform sampler2D tMask;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvec2 c0 = texture2D(tMask, vUv0).rg;\r\n\tvec2 c1 = texture2D(tMask, vUv1).rg;\r\n\tvec2 c2 = texture2D(tMask, vUv2).rg;\r\n\tvec2 c3 = texture2D(tMask, vUv3).rg;\r\n\r\n\tfloat d0 = (c0.x - c1.x) * 0.5;\r\n\tfloat d1 = (c2.x - c3.x) * 0.5;\r\n\tfloat d = length(vec2(d0, d1));\r\n\r\n\tfloat a0 = min(c0.y, c1.y);\r\n\tfloat a1 = min(c2.y, c3.y);\r\n\tfloat visibilityFactor = min(a0, a1);\r\n\r\n\tgl_FragColor.rg = (1.0 - visibilityFactor > 0.001) ? vec2(d, 0.0) : vec2(0.0, d);\r\n\r\n}\r\n";var vertex$13="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv0;\r\nvarying vec2 vUv1;\r\nvarying vec2 vUv2;\r\nvarying vec2 vUv3;\r\n\r\nvoid main() {\r\n\r\n\tvUv0 = vec2(uv.x + texelSize.x, uv.y);\r\n\tvUv1 = vec2(uv.x - texelSize.x, uv.y);\r\n\tvUv2 = vec2(uv.x, uv.y + texelSize.y);\r\n\tvUv3 = vec2(uv.x, uv.y - texelSize.y);\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * An outline edge detection shader material. */var OutlineEdgesMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new outline edge detection material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function OutlineEdgesMaterial(){var _this;var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,OutlineEdgesMaterial);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlineEdgesMaterial).call(this,{type:"OutlineEdgesMaterial",uniforms:{tMask:new Uniform(null),texelSize:new Uniform(new Vector2())},fragmentShader:fragment$13,vertexShader:vertex$13,depthWrite:false,depthTest:false}));_this.setTexelSize(texelSize.x,texelSize.y);return _this;}/** * Sets the texel size. * * @param {Number} x - The texel width. * @param {Number} y - The texel height. */createClass(OutlineEdgesMaterial,[{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);}}]);inherits(OutlineEdgesMaterial,_ShaderMaterial);return OutlineEdgesMaterial;}(ShaderMaterial);var fragment$14="uniform sampler2D tDiffuse;\r\nuniform float granularity;\r\nuniform float dx;\r\nuniform float dy;\r\n\r\nvarying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel;\r\n\r\n\tif(granularity > 0.0) {\r\n\r\n\t\tvec2 coord = vec2(\r\n\t\t\tdx * (floor(vUv.x / dx) + 0.5),\r\n\t\t\tdy * (floor(vUv.y / dy) + 0.5)\r\n\t\t);\r\n\r\n\t\ttexel = texture2D(tDiffuse, coord);\r\n\r\n\t} else {\r\n\r\n\t\ttexel = texture2D(tDiffuse, vUv);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texel;\r\n\r\n}\r\n";var vertex$14="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A pixelation shader material. * * Original shader code by Robert Casanova: * https://github.com/robertcasanova/pixelate-shader */var PixelationMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new pixelation material. */function PixelationMaterial(){classCallCheck(this,PixelationMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(PixelationMaterial).call(this,{type:"PixelationMaterial",uniforms:{tDiffuse:new Uniform(null),granularity:new Uniform(1.0),resolution:new Uniform(new Vector2(1.0,1.0)),dx:new Uniform(1.0),dy:new Uniform(1.0)},fragmentShader:fragment$14,vertexShader:vertex$14,depthWrite:false,depthTest:false}));}/** * The pixel granularity. * * @type {Number} */createClass(PixelationMaterial,[{key:"setResolution",/** * Sets the resolution. * * @param {Number} width - The width. * @param {Number} height - The height. */value:function setResolution(width,height){this.uniforms.resolution.value.set(width,height);this.granularity=this.granularity;}},{key:"granularity",get:function get(){return this.uniforms.granularity.value;}/** * A higher value yields coarser visuals. * * @type {Number} */,set:function set(x){var uniforms=this.uniforms;var resolution=uniforms.resolution.value;uniforms.granularity.value=x;uniforms.dx.value=x/resolution.x;uniforms.dy.value=x/resolution.y;}}]);inherits(PixelationMaterial,_ShaderMaterial);return PixelationMaterial;}(ShaderMaterial);var fragment$15="#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tDepth;\r\n\r\nuniform vec2 texelSize;\r\nuniform vec2 halfTexelSize;\r\n\r\nuniform float cameraNear;\r\nuniform float cameraFar;\r\n\r\nuniform float focalLength;\r\nuniform float focalStop;\r\n\r\nuniform float maxBlur;\r\nuniform float luminanceThreshold;\r\nuniform float luminanceGain;\r\nuniform float bias;\r\nuniform float fringe;\r\nuniform float ditherStrength;\r\n\r\n#ifdef SHADER_FOCUS\r\n\r\n\tuniform vec2 focusCoords;\r\n\r\n#else\r\n\r\n\tuniform float focalDepth;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\n#ifndef USE_LOGDEPTHBUF\r\n\r\n\t#include \r\n\r\n\tfloat readDepth(sampler2D depthSampler, vec2 coord) {\r\n\r\n\t\tfloat fragCoordZ = texture2D(depthSampler, coord).x;\r\n\t\tfloat viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\r\n\r\n\t\treturn viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef PENTAGON\r\n\r\n\tfloat penta(vec2 coords) {\r\n\r\n\t\tconst vec4 HS0 = vec4( 1.0, 0.0, 0.0, 1.0);\r\n\t\tconst vec4 HS1 = vec4( 0.309016994, 0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS2 = vec4(-0.809016994, 0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS3 = vec4(-0.809016994, -0.587785252, 0.0, 1.0);\r\n\t\tconst vec4 HS4 = vec4( 0.309016994, -0.951056516, 0.0, 1.0);\r\n\t\tconst vec4 HS5 = vec4( 0.0, 0.0, 1.0, 1.0);\r\n\r\n\t\tconst vec4 ONE = vec4(1.0);\r\n\r\n\t\tconst float P_FEATHER = 0.4;\r\n\t\tconst float N_FEATHER = -P_FEATHER;\r\n\r\n\t\tfloat inOrOut = -4.0;\r\n\r\n\t\tvec4 P = vec4(coords, vec2(RINGS_FLOAT - 1.3));\r\n\r\n\t\tvec4 dist = vec4(\r\n\t\t\tdot(P, HS0),\r\n\t\t\tdot(P, HS1),\r\n\t\t\tdot(P, HS2),\r\n\t\t\tdot(P, HS3)\r\n\t\t);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\r\n\t\tinOrOut += dot(dist, ONE);\r\n\r\n\t\tdist.x = dot(P, HS4);\r\n\t\tdist.y = HS5.w - abs(P.z);\r\n\r\n\t\tdist = smoothstep(N_FEATHER, P_FEATHER, dist);\r\n\t\tinOrOut += dist.x;\r\n\r\n\t\treturn clamp(inOrOut, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef SHOW_FOCUS\r\n\r\n\tvec3 debugFocus(vec3 c, float blur, float depth) {\r\n\r\n\t\tfloat edge = 0.002 * depth;\r\n\t\tfloat m = clamp(smoothstep(0.0, edge, blur), 0.0, 1.0);\r\n\t\tfloat e = clamp(smoothstep(1.0 - edge, 1.0, blur), 0.0, 1.0);\r\n\r\n\t\tc = mix(c, vec3(1.0, 0.5, 0.0), (1.0 - m) * 0.6);\r\n\t\tc = mix(c, vec3(0.0, 0.5, 1.0), ((1.0 - e) - (1.0 - m)) * 0.2);\r\n\r\n\t\treturn c;\r\n\r\n\t}\r\n\r\n#endif\r\n\r\n#ifdef VIGNETTE\r\n\r\n\tfloat vignette() {\r\n\r\n\t\tconst vec2 CENTER = vec2(0.5);\r\n\r\n\t\tconst float VIGNETTE_OUT = 1.3;\r\n\t\tconst float VIGNETTE_IN = 0.0;\r\n\t\tconst float VIGNETTE_FADE = 22.0; \r\n\r\n\t\tfloat d = distance(vUv, CENTER);\r\n\t\td = smoothstep(VIGNETTE_OUT + (focalStop / VIGNETTE_FADE), VIGNETTE_IN + (focalStop / VIGNETTE_FADE), d);\r\n\r\n\t\treturn clamp(d, 0.0, 1.0);\r\n\r\n\t}\r\n\r\n#endif\r\n\r\nvec2 rand2(vec2 coord) {\r\n\r\n\tvec2 noise;\r\n\r\n\t#ifdef NOISE\r\n\r\n\t\tconst float a = 12.9898;\r\n\t\tconst float b = 78.233;\r\n\t\tconst float c = 43758.5453;\r\n\r\n\t\tnoise.x = clamp(fract(sin(mod(dot(coord, vec2(a, b)), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\t\tnoise.y = clamp(fract(sin(mod(dot(coord, vec2(a, b) * 2.0), 3.14)) * c), 0.0, 1.0) * 2.0 - 1.0;\r\n\r\n\t#else\r\n\r\n\t\tnoise.x = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.25) + (fract(coord.t * halfTexelSize.y) * 0.75)) * 2.0 - 1.0;\r\n\t\tnoise.y = ((fract(1.0 - coord.s * halfTexelSize.x) * 0.75) + (fract(coord.t * halfTexelSize.y) * 0.25)) * 2.0 - 1.0;\r\n\r\n\t#endif\r\n\r\n\treturn noise;\r\n\r\n}\r\n\r\nvec3 processTexel(vec2 coords, float blur) {\r\n\r\n\tvec3 c;\r\n\tc.r = texture2D(tDiffuse, coords + vec2(0.0, 1.0) * texelSize * fringe * blur).r;\r\n\tc.g = texture2D(tDiffuse, coords + vec2(-0.866, -0.5) * texelSize * fringe * blur).g;\r\n\tc.b = texture2D(tDiffuse, coords + vec2(0.866, -0.5) * texelSize * fringe * blur).b;\r\n\r\n\t// Calculate the luminance of the constructed colour.\r\n\tfloat luminance = linearToRelativeLuminance(c);\r\n\tfloat threshold = max((luminance - luminanceThreshold) * luminanceGain, 0.0);\r\n\r\n\treturn c + mix(vec3(0.0), c, threshold * blur);\r\n\r\n}\r\n\r\nfloat linearize(float depth) {\r\n\r\n\treturn -cameraFar * cameraNear / (depth * (cameraFar - cameraNear) - cameraFar);\r\n\r\n}\r\n\r\nfloat gather(float i, float j, float ringSamples, inout vec3 color, float w, float h, float blur) {\r\n\r\n\tconst float TWO_PI = 6.28318531;\r\n\r\n\tfloat step = TWO_PI / ringSamples;\r\n\tfloat pw = cos(j * step) * i;\r\n\tfloat ph = sin(j * step) * i;\r\n\r\n\t#ifdef PENTAGON\r\n\r\n\t\tfloat p = penta(vec2(pw, ph));\r\n\r\n\t#else\r\n\r\n\t\tfloat p = 1.0;\r\n\r\n\t#endif\r\n\r\n\tcolor += processTexel(vUv + vec2(pw * w, ph * h), blur) * mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n\treturn mix(1.0, i / RINGS_FLOAT, bias) * p;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\tfloat depth = linearize(texture2D(tDepth, vUv).x);\r\n\r\n\t#else\r\n\r\n\t\tfloat depth = linearize(readDepth(tDepth, vUv));\r\n\r\n\t#endif\r\n\r\n\t#ifdef SHADER_FOCUS\r\n\r\n\t\t#ifdef USE_LOGDEPTHBUF\r\n\r\n\t\t\tfloat fDepth = linearize(texture2D(tDepth, focusCoords).x);\r\n\r\n\t\t#else\r\n\r\n\t\t\tfloat fDepth = linearize(readDepth(tDepth, focusCoords));\r\n\r\n\t\t#endif\r\n\r\n\t#else\r\n\r\n\t\tfloat fDepth = focalDepth;\r\n\r\n\t#endif\r\n\r\n\t#ifdef MANUAL_DOF\r\n\r\n\t\tconst float nDoFStart = 1.0; \r\n\t\tconst float nDoFDist = 2.0;\r\n\t\tconst float fDoFStart = 1.0;\r\n\t\tconst float fDoFDist = 3.0;\r\n\r\n\t\tfloat focalPlane = depth - fDepth;\r\n\t\tfloat farDoF = (focalPlane - fDoFStart) / fDoFDist;\r\n\t\tfloat nearDoF = (-focalPlane - nDoFStart) / nDoFDist;\r\n\r\n\t\tfloat blur = (focalPlane > 0.0) ? farDoF : nearDoF;\r\n\r\n\t#else\r\n\r\n\t\tconst float CIRCLE_OF_CONFUSION = 0.03; // 35mm film = 0.03mm CoC.\r\n\r\n\t\tfloat focalPlaneMM = fDepth * 1000.0;\r\n\t\tfloat depthMM = depth * 1000.0;\r\n\r\n\t\tfloat focalPlane = (depthMM * focalLength) / (depthMM - focalLength);\r\n\t\tfloat farDoF = (focalPlaneMM * focalLength) / (focalPlaneMM - focalLength);\r\n\t\tfloat nearDoF = (focalPlaneMM - focalLength) / (focalPlaneMM * focalStop * CIRCLE_OF_CONFUSION);\r\n\r\n\t\tfloat blur = abs(focalPlane - farDoF) * nearDoF;\r\n\r\n\t#endif\r\n\r\n\tblur = clamp(blur, 0.0, 1.0);\r\n\r\n\t// Dithering.\r\n\tvec2 noise = rand2(vUv) * ditherStrength * blur;\r\n\r\n\tfloat blurFactorX = texelSize.x * blur * maxBlur + noise.x;\r\n\tfloat blurFactorY = texelSize.y * blur * maxBlur + noise.y;\r\n\r\n\tconst int MAX_RING_SAMPLES = RINGS_INT * SAMPLES_INT;\r\n\r\n\t// Calculation of final color.\r\n\tvec4 color;\r\n\r\n\tif(blur < 0.05) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t} else {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv);\r\n\r\n\t\tfloat s = 1.0;\r\n\t\tint ringSamples;\r\n\r\n\t\tfor(int i = 1; i <= RINGS_INT; ++i) {\r\n\r\n\t\t\tringSamples = i * SAMPLES_INT;\r\n\r\n\t\t\t// Constant loop.\r\n\t\t\tfor(int j = 0; j < MAX_RING_SAMPLES; ++j) {\r\n\r\n\t\t\t\t// Break earlier.\r\n\t\t\t\tif(j >= ringSamples) { break; }\r\n\r\n\t\t\t\ts += gather(float(i), float(j), float(ringSamples), color.rgb, blurFactorX, blurFactorY, blur);\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tcolor.rgb /= s; // Divide by sample count.\r\n\r\n\t}\r\n\r\n\t#ifdef SHOW_FOCUS\r\n\r\n\t\tcolor.rgb = debugFocus(color.rgb, blur, depth);\r\n\r\n\t#endif\r\n\r\n\t#ifdef VIGNETTE\r\n\r\n\t\tcolor.rgb *= vignette();\r\n\r\n\t#endif\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$15="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Depth of Field shader v2.4. * * Original shader code by Martins Upitis: * http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update) */var RealisticBokehMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new bokeh2 material. * * @param {PerspectiveCamera} [camera] - The main camera. * @param {Object} [options] - Additional options. * @param {Vector2} [options.texelSize] - The absolute screen texel size. * @param {Boolean} [options.rings=3] - The number of blurring iterations. * @param {Boolean} [options.samples=2] - The amount of samples taken per ring. * @param {Boolean} [options.showFocus=false] - Whether the focus point should be highlighted. * @param {Boolean} [options.manualDoF=false] - Enables manual depth of field blur. * @param {Boolean} [options.vignette=false] - Enables a vignette effect. * @param {Boolean} [options.pentagon=false] - Enable to use a pentagonal shape to scale gathered texels. * @param {Boolean} [options.shaderFocus=true] - Disable if you compute your own focalDepth (in metres!). * @param {Boolean} [options.noise=true] - Disable if you don't want noise patterns for dithering. * @param {Number} [options.maxBlur=1.0] - The maximum blur strength. * @param {Number} [options.luminanceThreshold=0.5] - A luminance threshold. * @param {Number} [options.luminanceGain=2.0] - A luminance gain factor. * @param {Number} [options.bias=0.5] - A blur bias. * @param {Number} [options.fringe=0.7] - A blur offset. * @param {Number} [options.ditherStrength=0.0001] - The dither strength. */function RealisticBokehMaterial(){var _this;var camera=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,RealisticBokehMaterial);var settings=Object.assign({texelSize:null,rings:3,samples:2,showFocus:false,manualDoF:false,vignette:false,pentagon:false,shaderFocus:true,noise:true,maxBlur:1.0,luminanceThreshold:0.5,luminanceGain:2.0,bias:0.5,fringe:0.7,ditherStrength:0.0001},options);_this=possibleConstructorReturn(this,getPrototypeOf$2(RealisticBokehMaterial).call(this,{type:"RealisticBokehMaterial",defines:{RINGS_INT:settings.rings.toFixed(0),RINGS_FLOAT:settings.rings.toFixed(1),SAMPLES_INT:settings.samples.toFixed(0),SAMPLES_FLOAT:settings.samples.toFixed(1)},uniforms:{tDiffuse:new Uniform(null),tDepth:new Uniform(null),texelSize:new Uniform(new Vector2()),halfTexelSize:new Uniform(new Vector2()),cameraNear:new Uniform(0.1),cameraFar:new Uniform(2000),focalLength:new Uniform(24.0),focalStop:new Uniform(0.9),maxBlur:new Uniform(settings.maxBlur),luminanceThreshold:new Uniform(settings.luminanceThreshold),luminanceGain:new Uniform(settings.luminanceGain),bias:new Uniform(settings.bias),fringe:new Uniform(settings.fringe),ditherStrength:new Uniform(settings.ditherStrength),focusCoords:new Uniform(new Vector2(0.5,0.5)),focalDepth:new Uniform(1.0)},fragmentShader:fragment$15,vertexShader:vertex$15,depthWrite:false,depthTest:false}));_this.setShowFocusEnabled(settings.showFocus);_this.setManualDepthOfFieldEnabled(settings.manualDoF);_this.setVignetteEnabled(settings.vignette);_this.setPentagonEnabled(settings.pentagon);_this.setShaderFocusEnabled(settings.shaderFocus);_this.setNoiseEnabled(settings.noise);if(settings.texelSize!==null){_this.setTexelSize(settings.texelSize.x,settings.texelSize.y);}_this.adoptCameraSettings(camera);return _this;}/** * Defines whether the focus should be shown. * * @param {Boolean} enabled - True if the focus should be shown, false otherwise. */createClass(RealisticBokehMaterial,[{key:"setShowFocusEnabled",value:function setShowFocusEnabled(enabled){if(enabled){this.defines.SHOW_FOCUS="1";}else{delete this.defines.SHOW_FOCUS;}this.needsUpdate=true;}/** * Defines whether manual Depth of Field should be enabled. * * @param {Boolean} enabled - Whether manual DoF should be enabled. */},{key:"setManualDepthOfFieldEnabled",value:function setManualDepthOfFieldEnabled(enabled){if(enabled){this.defines.MANUAL_DOF="1";}else{delete this.defines.MANUAL_DOF;}this.needsUpdate=true;}/** * Defines whether the Vignette effect should be enabled. * * @param {Boolean} enabled - Whether the Vignette effect should be enabled. */},{key:"setVignetteEnabled",value:function setVignetteEnabled(enabled){if(enabled){this.defines.VIGNETTE="1";}else{delete this.defines.VIGNETTE;}this.needsUpdate=true;}/** * Defines whether the pentagonal blur effect should be enabled. * * @param {Boolean} enabled - Whether the pentagonal blur effect should be enabled. */},{key:"setPentagonEnabled",value:function setPentagonEnabled(enabled){if(enabled){this.defines.PENTAGON="1";}else{delete this.defines.PENTAGON;}this.needsUpdate=true;}/** * Enables or disables the automatic shader focus. * * @param {Boolean} enabled - Whether the shader focus should be enabled. */},{key:"setShaderFocusEnabled",value:function setShaderFocusEnabled(enabled){if(enabled){this.defines.SHADER_FOCUS="1";}else{delete this.defines.SHADER_FOCUS;}this.needsUpdate=true;}/** * Defines whether the dithering should compute noise. * * @param {Boolean} enabled - Whether noise-based dithering should be enabled. */},{key:"setNoiseEnabled",value:function setNoiseEnabled(enabled){if(enabled){this.defines.NOISE="1";}else{delete this.defines.NOISE;}this.needsUpdate=true;}/** * Sets the texel size. * * @param {Number} x - The texel width. * @param {Number} y - The texel height. */},{key:"setTexelSize",value:function setTexelSize(x,y){this.uniforms.texelSize.value.set(x,y);this.uniforms.halfTexelSize.value.set(x,y).multiplyScalar(0.5);}/** * Adopts the near and far plane and the focal length of the given camera. * * @param {PerspectiveCamera} camera - The main camera. */},{key:"adoptCameraSettings",value:function adoptCameraSettings(camera){if(camera!==null){this.uniforms.cameraNear.value=camera.near;this.uniforms.cameraFar.value=camera.far;this.uniforms.focalLength.value=camera.getFocalLength();// unit: mm. }}}]);inherits(RealisticBokehMaterial,_ShaderMaterial);return RealisticBokehMaterial;}(ShaderMaterial);var fragment$16="#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform vec2 center;\r\nuniform float aspect;\r\nuniform float waveSize;\r\nuniform float radius;\r\nuniform float maxRadius;\r\nuniform float amplitude;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvec2 aspectCorrection = vec2(aspect, 1.0);\r\n\r\n\tvec2 difference = vUv * aspectCorrection - center * aspectCorrection;\r\n\tfloat distance = sqrt(dot(difference, difference)) * vSize;\r\n\r\n\tvec2 displacement = vec2(0.0);\r\n\r\n\tif(distance > radius) {\r\n\r\n\t\tif(distance < radius + waveSize) {\r\n\r\n\t\t\tfloat angle = (distance - radius) * PI2 / waveSize;\r\n\t\t\tfloat cosSin = (1.0 - cos(angle)) * 0.5;\r\n\r\n\t\t\tfloat extent = maxRadius + waveSize;\r\n\t\t\tfloat decay = max(extent - distance * distance, 0.0) / extent;\r\n\r\n\t\t\tdisplacement = ((cosSin * amplitude * difference) / distance) * decay;\r\n\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tgl_FragColor = texture2D(tDiffuse, vUv - displacement);\r\n\r\n}\r\n";var vertex$16="uniform float size;\r\nuniform float scale;\r\nuniform float cameraDistance;\r\n\r\nvarying vec2 vUv;\r\nvarying float vSize;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tvSize = (0.1 * cameraDistance) / size;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * A shock wave shader material. * * Based on a Gist by Jean-Philippe Sarda: * https://gist.github.com/jpsarda/33cea67a9f2ecb0a0eda */var ShockWaveMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new shock wave material. * * @param {Object} [options] - The options. * @param {Number} [options.waveSize=0.2] - The wave size. * @param {Number} [options.amplitude=0.05] - The distortion amplitude. */function ShockWaveMaterial(){var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ShockWaveMaterial);var settings=Object.assign({maxRadius:1.0,waveSize:0.2,amplitude:0.05},options);return possibleConstructorReturn(this,getPrototypeOf$2(ShockWaveMaterial).call(this,{type:"ShockWaveMaterial",uniforms:{tDiffuse:new Uniform(null),center:new Uniform(new Vector2(0.5,0.5)),aspect:new Uniform(1.0),cameraDistance:new Uniform(1.0),size:new Uniform(1.0),radius:new Uniform(-settings.waveSize),maxRadius:new Uniform(settings.maxRadius),waveSize:new Uniform(settings.waveSize),amplitude:new Uniform(settings.amplitude)},fragmentShader:fragment$16,vertexShader:vertex$16,depthWrite:false,depthTest:false}));}inherits(ShockWaveMaterial,_ShaderMaterial);return ShockWaveMaterial;}(ShaderMaterial);var fragment$17="uniform sampler2D tDiffuse;\r\nuniform sampler2D tWeights;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\t// Fetch the blending weights for current pixel.\r\n\tvec4 a;\r\n\ta.xz = texture2D(tWeights, vUv).xz;\r\n\ta.y = texture2D(tWeights, vOffset.zw).g;\r\n\ta.w = texture2D(tWeights, vOffset.xy).a;\r\n\r\n\tvec4 color;\r\n\r\n\t// Check if there is any blending weight with a value greater than 0.0.\r\n\tif(dot(a, vec4(1.0)) < 1e-5) {\r\n\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\r\n\t} else {\r\n\r\n\t\t/* Up to four lines can be crossing a pixel (one through each edge).\r\n\t\t * The line with the maximum weight for each direction is favoured.\r\n\t\t */\r\n\r\n\t\tvec2 offset;\r\n\t\toffset.x = a.a > a.b ? a.a : -a.b; // Left vs. right.\r\n\t\toffset.y = a.g > a.r ? -a.g : a.r; // Top vs. bottom (changed signs).\r\n\r\n\t\t// Go in the direction with the maximum weight (horizontal vs. vertical).\r\n\t\tif(abs(offset.x) > abs(offset.y)) {\r\n\r\n\t\t\toffset.y = 0.0;\r\n\r\n\t\t} else {\r\n\r\n\t\t\toffset.x = 0.0;\r\n\r\n\t\t}\r\n\r\n\t\t// Fetch the opposite color and lerp by hand.\r\n\t\tcolor = texture2D(tDiffuse, vUv, 0.0);\r\n\t\tvec2 coord = vUv + sign(offset) * texelSize;\r\n\t\tvec4 oppositeColor = texture2D(tDiffuse, coord, 0.0);\r\n\t\tfloat s = abs(offset.x) > abs(offset.y) ? abs(offset.x) : abs(offset.y);\r\n\r\n\t\t// Gamma correction.\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(2.2));\r\n\t\toppositeColor.rgb = pow(abs(oppositeColor.rgb), vec3(2.2));\r\n\t\tcolor = mix(color, oppositeColor, s);\r\n\t\tcolor.rgb = pow(abs(color.rgb), vec3(1.0 / 2.2));\r\n\r\n\t}\r\n\r\n\tgl_FragColor = color;\r\n\r\n}\r\n";var vertex$17="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvOffset = uv.xyxy + texelSize.xyxy * vec4(1.0, 0.0, 0.0, -1.0); // Changed sign in W component.\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Subpixel Morphological Antialiasing. * * This material is used to render the final antialiasing. */var SMAABlendMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new SMAA blend material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function SMAABlendMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,SMAABlendMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(SMAABlendMaterial).call(this,{type:"SMAABlendMaterial",uniforms:{tDiffuse:new Uniform(null),tWeights:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$17,vertexShader:vertex$17,depthWrite:false,depthTest:false}));}inherits(SMAABlendMaterial,_ShaderMaterial);return SMAABlendMaterial;}(ShaderMaterial);var fragment$18="#define sampleLevelZeroOffset(t, coord, offset) texture2D(t, coord + float(offset) * texelSize, 0.0)\r\n\r\nuniform sampler2D tDiffuse;\r\nuniform sampler2D tArea;\r\nuniform sampler2D tSearch;\r\n\r\nuniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvec2 round(vec2 x) {\r\n\r\n\treturn sign(x) * floor(abs(x) + 0.5);\r\n\r\n}\r\n\r\nfloat searchLength(vec2 e, float bias, float scale) {\r\n\r\n\t// Not required if tSearch accesses are set to point.\r\n\t// const vec2 SEARCH_TEX_PIXEL_SIZE = 1.0 / vec2(66.0, 33.0);\r\n\t// e = vec2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE + e * vec2(scale, 1.0) * vec2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\r\n\r\n\te.r = bias + e.r * scale;\r\n\r\n\treturn 255.0 * texture2D(tSearch, e, 0.0).r;\r\n\r\n}\r\n\r\nfloat searchXLeft(vec2 texCoord, float end) {\r\n\r\n\t/* @PSEUDO_GATHER4\r\n\t * This texCoord has been offset by (-0.25, -0.125) in the vertex shader to\r\n\t * sample between edge, thus fetching four edges in a row.\r\n\t * Sampling with different offsets in each direction allows to disambiguate\r\n\t * which edges are active from the four fetched ones.\r\n\t */\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x > end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\t// Correct the previously applied offset (-0.25, -0.125).\r\n\ttexCoord.x += 0.25 * texelSize.x;\r\n\r\n\t// The searches are biased by 1, so adjust the coords accordingly.\r\n\ttexCoord.x += texelSize.x;\r\n\r\n\t// Disambiguate the length added by the last step.\r\n\ttexCoord.x += 2.0 * texelSize.x; // Undo last step.\r\n\ttexCoord.x -= texelSize.x * searchLength(e, 0.0, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchXRight(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(0.0, 1.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(2.0, 0.0) * texelSize;\r\n\r\n\t\tif(!(texCoord.x < end && e.g > 0.8281 && e.r == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.x -= 0.25 * texelSize.x;\r\n\ttexCoord.x -= texelSize.x;\r\n\ttexCoord.x -= 2.0 * texelSize.x;\r\n\ttexCoord.x += texelSize.x * searchLength(e, 0.5, 0.5);\r\n\r\n\treturn texCoord.x;\r\n\r\n}\r\n\r\nfloat searchYUp(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord += vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y > end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y -= 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y; // Changed sign.\r\n\ttexCoord.y -= 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y * searchLength(e.gr, 0.0, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nfloat searchYDown(vec2 texCoord, float end) {\r\n\r\n\tvec2 e = vec2(1.0, 0.0);\r\n\r\n\tfor(int i = 0; i < MAX_SEARCH_STEPS_INT; ++i ) {\r\n\r\n\t\te = texture2D(tDiffuse, texCoord, 0.0).rg;\r\n\t\ttexCoord -= vec2(0.0, 2.0) * texelSize; // Changed sign.\r\n\r\n\t\tif(!(texCoord.y < end && e.r > 0.8281 && e.g == 0.0)) { break; }\r\n\r\n\t}\r\n\r\n\ttexCoord.y += 0.25 * texelSize.y; // Changed sign.\r\n\ttexCoord.y += texelSize.y; // Changed sign.\r\n\ttexCoord.y += 2.0 * texelSize.y; // Changed sign.\r\n\ttexCoord.y -= texelSize.y * searchLength(e.gr, 0.5, 0.5); // Changed sign.\r\n\r\n\treturn texCoord.y;\r\n\r\n}\r\n\r\nvec2 area(vec2 dist, float e1, float e2, float offset) {\r\n\r\n\t// Rounding prevents precision errors of bilinear filtering.\r\n\tvec2 texCoord = AREATEX_MAX_DISTANCE * round(4.0 * vec2(e1, e2)) + dist;\r\n\r\n\t// Scale and bias for texel space translation.\r\n\ttexCoord = AREATEX_PIXEL_SIZE * texCoord + (0.5 * AREATEX_PIXEL_SIZE);\r\n\r\n\t// Move to proper place, according to the subpixel offset.\r\n\ttexCoord.y += AREATEX_SUBTEX_SIZE * offset;\r\n\r\n\treturn texture2D(tArea, texCoord, 0.0).rg;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 weights = vec4(0.0);\r\n\tvec4 subsampleIndices = vec4(0.0);\r\n\tvec2 e = texture2D(tDiffuse, vUv).rg;\r\n\r\n\tif(e.g > 0.0) {\r\n\r\n\t\t// Edge at north.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the left.\r\n\t\tvec2 coords;\r\n\t\tcoords.x = searchXLeft(vOffset[0].xy, vOffset[2].x);\r\n\t\tcoords.y = vOffset[1].y; // vOffset[1].y = vUv.y - 0.25 * texelSize.y (@CROSSING_OFFSET)\r\n\t\td.x = coords.x;\r\n\r\n\t\t/* Now fetch the left crossing edges, two at a time using bilinear\r\n\t\tfiltering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to discern what\r\n\t\tvalue each edge has. */\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).r;\r\n\r\n\t\t// Find the distance to the right.\r\n\t\tcoords.x = searchXRight(vOffset[0].zw, vOffset[2].y);\r\n\t\td.y = coords.x;\r\n\r\n\t\t/* Translate distances to pixel units for better interleave arithmetic and\r\n\t\tmemory accesses. */\r\n\t\td = d / texelSize.x - vPixCoord.x;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the right crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(1, 0)).r;\r\n\r\n\t\t// Pattern recognised, now get the actual area.\r\n\t\tweights.rg = area(sqrtD, e1, e2, subsampleIndices.y);\r\n\r\n\t}\r\n\r\n\tif(e.r > 0.0) {\r\n\r\n\t\t// Edge at west.\r\n\t\tvec2 d;\r\n\r\n\t\t// Find the distance to the top.\r\n\t\tvec2 coords;\r\n\t\tcoords.y = searchYUp(vOffset[1].xy, vOffset[2].z);\r\n\t\tcoords.x = vOffset[0].x; // vOffset[1].x = vUv.x - 0.25 * texelSize.x;\r\n\t\td.x = coords.y;\r\n\r\n\t\t// Fetch the top crossing edges.\r\n\t\tfloat e1 = texture2D(tDiffuse, coords, 0.0).g;\r\n\r\n\t\t// Find the distance to the bottom.\r\n\t\tcoords.y = searchYDown(vOffset[1].zw, vOffset[2].w);\r\n\t\td.y = coords.y;\r\n\r\n\t\t// Distances in pixel units.\r\n\t\td = d / texelSize.y - vPixCoord.y;\r\n\r\n\t\t// The area texture is compressed quadratically.\r\n\t\tvec2 sqrtD = sqrt(abs(d));\r\n\r\n\t\t// Fetch the bottom crossing edges.\r\n\t\tcoords.y -= texelSize.y; // WebGL port note: Added.\r\n\t\tfloat e2 = sampleLevelZeroOffset(tDiffuse, coords, ivec2(0, 1)).g;\r\n\r\n\t\t// Get the area for this direction.\r\n\t\tweights.ba = area(sqrtD, e1, e2, subsampleIndices.x);\r\n\r\n\t}\r\n\r\n\tgl_FragColor = weights;\r\n\r\n}\r\n";var vertex$18="uniform vec2 texelSize;\r\n\r\nvarying vec2 vUv;\r\nvarying vec4 vOffset[3];\r\nvarying vec2 vPixCoord;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\r\n\tvPixCoord = uv / texelSize;\r\n\r\n\t// Offsets for the searches (see @PSEUDO_GATHER4).\r\n\tvOffset[0] = uv.xyxy + texelSize.xyxy * vec4(-0.25, 0.125, 1.25, 0.125); // Changed sign in Y and W components.\r\n\tvOffset[1] = uv.xyxy + texelSize.xyxy * vec4(-0.125, 0.25, -0.125, -1.25); //Changed sign in Y and W components.\r\n\r\n\t// This indicates the ends of the loops.\r\n\tvOffset[2] = vec4(vOffset[0].xz, vOffset[1].yw) + vec4(-2.0, 2.0, -2.0, 2.0) * texelSize.xxyy * MAX_SEARCH_STEPS_FLOAT;\r\n\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Subpixel Morphological Antialiasing. * * This material computes weights for detected edges. */var SMAAWeightsMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new SMAA weights material. * * @param {Vector2} [texelSize] - The absolute screen texel size. */function SMAAWeightsMaterial(){var texelSize=arguments.length>0&&arguments[0]!==undefined?arguments[0]:new Vector2();classCallCheck(this,SMAAWeightsMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(SMAAWeightsMaterial).call(this,{type:"SMAAWeightsMaterial",defines:{// Configurable settings: MAX_SEARCH_STEPS_INT:"8",MAX_SEARCH_STEPS_FLOAT:"8.0",// Non-configurable settings: AREATEX_MAX_DISTANCE:"16.0",AREATEX_PIXEL_SIZE:"(1.0 / vec2(160.0, 560.0))",AREATEX_SUBTEX_SIZE:"(1.0 / 7.0)",SEARCHTEX_SIZE:"vec2(66.0, 33.0)",SEARCHTEX_PACKED_SIZE:"vec2(64.0, 16.0)"},uniforms:{tDiffuse:new Uniform(null),tArea:new Uniform(null),tSearch:new Uniform(null),texelSize:new Uniform(texelSize)},fragmentShader:fragment$18,vertexShader:vertex$18,depthWrite:false,depthTest:false}));}/** * Sets the maximum amount of steps performed in the horizontal/vertical * pattern searches, at each side of the pixel. * * In number of pixels, it's actually the double. So the maximum line length * perfectly handled by, for example 16, is 64 (perfectly means that longer * lines won't look as good, but are still antialiased). * * @param {Number} steps - The search steps. Range: [0, 112]. */createClass(SMAAWeightsMaterial,[{key:"setOrthogonalSearchSteps",value:function setOrthogonalSearchSteps(steps){this.defines.MAX_SEARCH_STEPS_INT=steps.toFixed("0");this.defines.MAX_SEARCH_STEPS_FLOAT=steps.toFixed("1");this.needsUpdate=true;}}]);inherits(SMAAWeightsMaterial,_ShaderMaterial);return SMAAWeightsMaterial;}(ShaderMaterial);var fragment$19="#include \r\n#include \r\n\r\nuniform sampler2D tDiffuse;\r\nuniform float middleGrey;\r\nuniform float maxLuminance;\r\n\r\n#ifdef ADAPTED_LUMINANCE\r\n\r\n\tuniform sampler2D luminanceMap;\r\n\r\n#else\r\n\r\n\tuniform float averageLuminance;\r\n\r\n#endif\r\n\r\nvarying vec2 vUv;\r\n\r\nvec3 toneMap(vec3 c) {\r\n\r\n\t#ifdef ADAPTED_LUMINANCE\r\n\r\n\t\t// Get the calculated average luminance by sampling the center.\r\n\t\tfloat lumAvg = texture2D(luminanceMap, vec2(0.5)).r;\r\n\r\n\t#else\r\n\r\n\t\tfloat lumAvg = averageLuminance;\r\n\r\n\t#endif\r\n\r\n\t// Calculate the luminance of the current pixel.\r\n\tfloat lumPixel = linearToRelativeLuminance(c);\r\n\r\n\t// Apply the modified operator (Reinhard Eq. 4).\r\n\tfloat lumScaled = (lumPixel * middleGrey) / lumAvg;\r\n\r\n\tfloat lumCompressed = (lumScaled * (1.0 + (lumScaled / (maxLuminance * maxLuminance)))) / (1.0 + lumScaled);\r\n\r\n\treturn lumCompressed * c;\r\n\r\n}\r\n\r\nvoid main() {\r\n\r\n\tvec4 texel = texture2D(tDiffuse, vUv);\r\n\tgl_FragColor = vec4(toneMap(texel.rgb), texel.a);\r\n\r\n\t#include \r\n\r\n}\r\n";var vertex$19="varying vec2 vUv;\r\n\r\nvoid main() {\r\n\r\n\tvUv = uv;\r\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\r\n\r\n}\r\n";/** * Full-screen tone-mapping shader material. * * This material supports dithering. * * Reference: * http://www.cis.rit.edu/people/faculty/ferwerda/publications/sig02_paper.pdf */var ToneMappingMaterial=/*#__PURE__*/function(_ShaderMaterial){/** * Constructs a new tone mapping material. */function ToneMappingMaterial(){classCallCheck(this,ToneMappingMaterial);return possibleConstructorReturn(this,getPrototypeOf$2(ToneMappingMaterial).call(this,{type:"ToneMappingMaterial",uniforms:{tDiffuse:new Uniform(null),luminanceMap:new Uniform(null),averageLuminance:new Uniform(1.0),maxLuminance:new Uniform(16.0),middleGrey:new Uniform(0.6)},fragmentShader:fragment$19,vertexShader:vertex$19,depthWrite:false,depthTest:false}));}inherits(ToneMappingMaterial,_ShaderMaterial);return ToneMappingMaterial;}(ShaderMaterial);/** * A collection of shader materials that are used in the post processing passes. * * @module postprocessing/materials */ /** * An abstract pass. * * Passes that do not rely on the depth buffer should explicitly disable the * depth test and depth write in their respective shader materials. * * @implements {Resizable} * @implements {Disposable} */var Pass=/*#__PURE__*/function(){/** * Constructs a new pass. * * @param {String} [name] - The name of this pass. * @param {Scene} [scene] - The scene to render. * @param {Camera} [camera] - The camera. * @param {Mesh} [quad] - A quad that fills the screen to render 2D filter effects. Set this to null, if you don't need it (see {@link RenderPass}). */function Pass(){var name=arguments.length>0&&arguments[0]!==undefined?arguments[0]:"Pass";var scene=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Scene();var camera=arguments.length>2&&arguments[2]!==undefined?arguments[2]:new OrthographicCamera(-1,1,1,-1,0,1);var quad=arguments.length>3&&arguments[3]!==undefined?arguments[3]:new Mesh(new PlaneBufferGeometry(2,2),null);classCallCheck(this,Pass);/** * The name of this pass. * * @type {String} */this.name=name;/** * The scene to render. * * @type {Scene} * @protected */this.scene=scene;/** * The camera. * * @type {Camera} * @protected */this.camera=camera;/** * A quad mesh that fills the screen. * * @type {Mesh} * @private */this.quad=quad;if(this.quad!==null){this.quad.frustumCulled=false;if(this.scene!==null){this.scene.add(this.quad);}}/** * Indicates whether this pass should render to screen. * * @type {Boolean} */this.renderToScreen=false;/** * Indicates whether this pass should be executed. * * @type {Boolean} */this.enabled=true;/** * Indicates whether the {@link EffectComposer} should swap the frame * buffers after this pass has finished rendering. * * Set this to `false` if this pass doesn't render to the output buffer or * the screen. Otherwise, the contents of the input buffer will be lost. * * @type {Boolean} */this.needsSwap=true;}/** * The fullscreen material. * * @type {Material} */createClass(Pass,[{key:"render",/** * Renders the effect. * * This is an abstract method that must be overridden. * * @abstract * @throws {Error} An error is thrown if the method is not overridden. * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){throw new Error("Render method not implemented!");}/** * Updates this pass with the renderer's size. * * You may override this method in case you want to be informed about the main * render size. * * The {@link EffectComposer} calls this method before this pass is * initialized and every time its own size is updated. * * @param {Number} width - The renderer's width. * @param {Number} height - The renderer's height. * @example this.myRenderTarget.setSize(width, height); */},{key:"setSize",value:function setSize(width,height){}/** * Performs initialization tasks. * * By overriding this method you gain access to the renderer. You'll also be * able to configure your custom render targets to use the appropriate format * (RGB or RGBA). * * The provided renderer can be used to warm up special off-screen render * targets by performing a preliminary render operation. * * The {@link EffectComposer} calls this method when this pass is added to its * queue, but not before its size has been set. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. * @example if(!alpha) { this.myRenderTarget.texture.format = RGBFormat; } */},{key:"initialize",value:function initialize(renderer,alpha){}/** * Performs a shallow search for properties that define a dispose method and * deletes them. The pass will be inoperative after this method was called! * * Disposable objects: * - render targets * - materials * - textures * * The {@link EffectComposer} calls this method when it is being destroyed. * You may, however, use it independently to free memory when you are certain * that you don't need this pass anymore. */},{key:"dispose",value:function dispose(){var key;var _arr=Object.keys(this);for(var _i=0;_i<_arr.length;_i++){key=_arr[_i];if(this[key]!==null&&typeof this[key].dispose==="function"){this[key].dispose();this[key]=null;}}if(this.material!==null){this.material.dispose();}}},{key:"material",get:function get(){return this.quad!==null?this.quad.material:null;}/** * Sets the fullscreen material. * * The material will be assigned to the quad mesh that fills the screen. * * @type {Material} */,set:function set(value){if(this.quad!==null){this.quad.material=value;}}}]);return Pass;}();/** * An efficient, incremental blur pass. * * Note: This pass allows the input and output buffer to be the same. */var BlurPass=/*#__PURE__*/function(_Pass){/** * Constructs a new blur pass. * * @param {Object} [options] - The options. * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. */function BlurPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,BlurPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BlurPass).call(this,"BlurPass"));/** * A render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetX=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTargetX.texture.name="Blur.TargetX";_this.renderTargetX.texture.generateMipmaps=false;/** * A second render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetY=_this.renderTargetX.clone();_this.renderTargetY.texture.name="Blur.TargetY";/** * The resolution scale. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.resolutionScale=options.resolutionScale!==undefined?options.resolutionScale:0.5;/** * A convolution shader material. * * @type {ConvolutionMaterial} * @private */_this.convolutionMaterial=new ConvolutionMaterial();/** * A convolution shader material that uses dithering. * * @type {ConvolutionMaterial} * @private */_this.ditheredConvolutionMaterial=new ConvolutionMaterial();_this.ditheredConvolutionMaterial.dithering=true;/** * Whether the blurred result should also be dithered using noise. * * @type {Boolean} */_this.dithering=false;_this.kernelSize=options.kernelSize;return _this;}/** * The absolute width of the internal render targets. * * @type {Number} */createClass(BlurPass,[{key:"render",/** * Blurs the input buffer and writes the result to the output buffer. The * input buffer remains intact, unless its also the output buffer. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var renderTargetX=this.renderTargetX;var renderTargetY=this.renderTargetY;var material=this.convolutionMaterial;var uniforms=material.uniforms;var kernel=material.getKernel();var lastRT=inputBuffer;var destRT;var i,l;this.material=material;// Apply the multi-pass blur. for(i=0,l=kernel.length-1;i0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.convolutionMaterial.kernelSize=value;this.ditheredConvolutionMaterial.kernelSize=value;}}]);inherits(BlurPass,_Pass);return BlurPass;}(Pass);/** * A bloom pass. * * This pass renders a scene with superimposed blur by utilizing the fast Kawase * convolution approach. */var BloomPass=/*#__PURE__*/function(_Pass){/** * Constructs a new bloom pass. * * @param {Object} [options] - The options. * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. * @param {Number} [options.intensity=1.0] - The strength of the bloom effect. * @param {Number} [options.distinction=1.0] - The luminance distinction factor. Raise this value to bring out the brighter elements in the scene. * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the bloom texture with the scene colors. */function BloomPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,BloomPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BloomPass).call(this,"BloomPass"));/** * A render target. * * @type {WebGLRenderTarget} * @private */_this.renderTarget=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTarget.texture.name="Bloom.Target";_this.renderTarget.texture.generateMipmaps=false;/** * A blur pass. * * @type {BlurPass} * @private */_this.blurPass=new BlurPass(options);/** * A combine shader material. * * @type {CombineMaterial} * @private */_this.combineMaterial=new CombineMaterial(options.screenMode!==undefined?options.screenMode:true);_this.intensity=options.intensity;/** * A luminosity shader material. * * @type {LuminosityMaterial} * @private */_this.luminosityMaterial=new LuminosityMaterial(true);_this.distinction=options.distinction;return _this;}/** * The resolution scale. * * @type {Number} */createClass(BloomPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var blurPass=this.blurPass;var luminosityMaterial=this.luminosityMaterial;var combineMaterial=this.combineMaterial;var renderTarget=this.renderTarget;// Luminance filter. this.material=luminosityMaterial;luminosityMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(scene,camera,renderTarget);// Convolution phase. blurPass.render(renderer,renderTarget,renderTarget);if(this.blend){// Render the original scene with superimposed blur. this.material=combineMaterial;combineMaterial.uniforms.texture1.value=inputBuffer.texture;combineMaterial.uniforms.texture2.value=renderTarget.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTarget.setSize(width,height);}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){this.blurPass.initialize(renderer,alpha);if(!alpha){this.renderTarget.texture.format=RGBFormat;}}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/** * You need to call {@link EffectComposer#setSize} after changing this value. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/** * The blur kernel size. * * @type {KernelSize} */},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/** * @type {KernelSize} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.blurPass.kernelSize=value;}/** * The overall intensity of the effect. * * @type {Number} */},{key:"intensity",get:function get(){return this.combineMaterial.uniforms.opacity2.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.combineMaterial.uniforms.opacity2.value=value;}/** * The luminance distinction factor. * * @type {Number} */},{key:"distinction",get:function get(){return this.luminosityMaterial.uniforms.distinction.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.luminosityMaterial.uniforms.distinction.value=value;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.blurPass.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){this.blurPass.dithering=value;}/** * Indicates whether the effect should be applied to the input buffer. * * @type {Boolean} */},{key:"blend",get:function get(){return this.needsSwap;}/** * If disabled, the input buffer will remain unaffected. * * You may use the {@link BloomPass#overlay} texture to apply the effect to * your scene. * * @type {Boolean} */,set:function set(value){this.needsSwap=value;}/** * The effect overlay texture. * * @type {Texture} */},{key:"overlay",get:function get(){return this.renderTarget.texture;}}]);inherits(BloomPass,_Pass);return BloomPass;}(Pass);/** * A Depth of Field (DoF) pass using a bokeh shader. * * This pass requires a {@link EffectComposer#depthTexture}. */var BokehPass=/*#__PURE__*/function(_Pass){/** * Constructs a new bokeh pass. * * @param {PerspectiveCamera} camera - The main camera. Used to obtain the aspect ratio and the near and far plane settings. * @param {Object} [options] - Additional parameters. See {@link BokehMaterial} for details. */function BokehPass(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,BokehPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(BokehPass).call(this,"BokehPass"));_this.material=new BokehMaterial(camera,options);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(BokehPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.tDepth.value=inputBuffer.depthTexture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.material.uniforms.aspect.value=width/height;}}]);inherits(BokehPass,_Pass);return BokehPass;}(Pass);/** * A pass that disables the stencil test. */var ClearMaskPass=/*#__PURE__*/function(_Pass){/** * Constructs a new clear mask pass. */function ClearMaskPass(){var _this;classCallCheck(this,ClearMaskPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ClearMaskPass).call(this,"ClearMaskPass",null,null,null));_this.needsSwap=false;return _this;}/** * Disables the global stencil test. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(ClearMaskPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){renderer.state.buffers.stencil.setTest(false);}}]);inherits(ClearMaskPass,_Pass);return ClearMaskPass;}(Pass);/** * Used for saving the original clear color of the renderer. * * @type {Color} * @private */var color=new Color();/** * A pass that clears the input buffer or the screen. * * You can prevent specific bits from being cleared by setting either the * autoClearColor, autoClearStencil or autoClearDepth properties of the renderer * to false. */var ClearPass=/*#__PURE__*/function(_Pass){/** * Constructs a new clear pass. * * @param {Object} [options] - Additional options. * @param {Color} [options.clearColor=null] - An override clear color. * @param {Number} [options.clearAlpha=0.0] - An override clear alpha. */function ClearPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ClearPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ClearPass).call(this,"ClearPass",null,null,null));_this.needsSwap=false;/** * The clear color. * * @type {Color} */_this.clearColor=options.clearColor!==undefined?options.clearColor:null;/** * The clear alpha. * * @type {Number} */_this.clearAlpha=options.clearAlpha!==undefined?options.clearAlpha:0.0;return _this;}/** * Clears the input buffer or the screen. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(ClearPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var clearColor=this.clearColor;var clearAlpha;if(clearColor!==null){color.copy(renderer.getClearColor());clearAlpha=renderer.getClearAlpha();renderer.setClearColor(clearColor,this.clearAlpha);}renderer.setRenderTarget(this.renderToScreen?null:inputBuffer);renderer.clear();if(clearColor!==null){renderer.setClearColor(color,clearAlpha);}}}]);inherits(ClearPass,_Pass);return ClearPass;}(Pass);/** * A dot screen pass. */var DotScreenPass=/*#__PURE__*/function(_Pass){/** * Constructs a new dot screen pass. * * @param {Object} [options] - The options. * @param {Boolean} [options.average=false] - Whether the shader should output a colour average (black and white). * @param {Number} [options.angle=1.57] - The angle of the pattern. * @param {Number} [options.scale=1.0] - The scale of the overall effect. * @param {Number} [options.intensity=1.0] - The intensity of the effect. */function DotScreenPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DotScreenPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(DotScreenPass).call(this,"DotScreenPass"));_this.material=new DotScreenMaterial(options);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(DotScreenPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){width=Math.max(1,width);height=Math.max(1,height);this.material.uniforms.offsetRepeat.value.z=width;this.material.uniforms.offsetRepeat.value.w=height;}}]);inherits(DotScreenPass,_Pass);return DotScreenPass;}(Pass);/** * A film pass. * * Provides various cinematic effects. */var FilmPass=/*#__PURE__*/function(_Pass){/** * Constructs a new film pass. * * @param {Object} [options] - The options. See {@link FilmMaterial} for more options. * @param {Number} [options.scanlineDensity=1.25] - The scanline density, relative to the screen height. * @param {Number} [options.gridScale=1.0] - The grid scale, relative to the screen height. * @param {Number} [options.gridLineWidth=0.0] - The grid line width. This value will be added to the base line width. */function FilmPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,FilmPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(FilmPass).call(this,"FilmPass"));_this.material=new FilmMaterial(options);/** * The amount of scanlines, relative to the screen height. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.scanlineDensity=options.scanlineDensity===undefined?1.25:options.scanlineDensity;/** * The grid scale, relative to the screen height. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.gridScale=options.gridScale===undefined?1.0:Math.max(options.gridScale,1e-6);/** * The grid line width. * * You need to call {@link EffectComposer#setSize} after changing this * value. * * @type {Number} */_this.gridLineWidth=options.gridLineWidth===undefined?0.0:Math.max(options.gridLineWidth,0.0);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(FilmPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.time.value+=delta;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){var aspect=width/height;var gridScale=this.gridScale*(height*0.125);this.material.uniforms.scanlineCount.value=Math.round(height*this.scanlineDensity);this.material.uniforms.gridScale.value.set(aspect*gridScale,gridScale);this.material.uniforms.gridLineWidth.value=gridScale/height+this.gridLineWidth;}}]);inherits(FilmPass,_Pass);return FilmPass;}(Pass);/** * Returns a random integer in the specified range. * * @private * @param {Number} low - The lowest possible value. * @param {Number} high - The highest possible value. * @return {Number} The random value. */function randomInt(low,high){return low+Math.floor(Math.random()*(high-low+1));}/** * Returns a random float in the specified range. * * @private * @param {Number} low - The lowest possible value. * @param {Number} high - The highest possible value. * @return {Number} The random value. */function randomFloat(low,high){return low+Math.random()*(high-low);}/** * A glitch pass. */var GlitchPass=/*#__PURE__*/function(_Pass){/** * Constructs a new glitch pass. * * @param {Object} [options] - The options. * @param {Texture} [options.perturbMap] - A perturbation map. If none is provided, a noise texture will be created. * @param {Number} [options.dtSize=64] - The size of the generated noise map. Will be ignored if a perturbation map is provided. */function GlitchPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,GlitchPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(GlitchPass).call(this,"GlitchPass"));_this.material=new GlitchMaterial();/** * A perturbation map. * * @type {Texture} * @private */_this.texture=null;_this.perturbMap=options.perturbMap!==undefined?options.perturbMap:_this.generatePerturbMap(options.dtSize);_this.perturbMap.name="Glitch.Perturbation";_this.perturbMap.generateMipmaps=false;/** * The effect mode. * * @type {GlitchMode} */_this.mode=GlitchMode.SPORADIC;/** * A counter for the glitch activation and deactivation. * * @type {Number} * @private */_this.counter=0;/** * A random break point for the sporadic glitch activation. * * @type {Number} * @private */_this.breakPoint=randomInt(120,240);return _this;}/** * The current perturbation map. * * @type {Texture} */createClass(GlitchPass,[{key:"generatePerturbMap",/** * Destroys the current perturbation map and replaces it with a new one. * * @param {Number} [size=64] - The texture size. * @return {DataTexture} The perturbation texture. */value:function generatePerturbMap(){var size=arguments.length>0&&arguments[0]!==undefined?arguments[0]:64;var pixels=size*size;var data=new Float32Array(pixels*3);var dt=this.perturbMap;var i,x;for(i=0;i2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,RenderPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(RenderPass).call(this,"RenderPass",scene,camera,null));_this.needsSwap=false;/** * A clear pass. * * @type {ClearPass} */_this.clearPass=new ClearPass(options);/** * An override material. * * @type {Material} */_this.overrideMaterial=options.overrideMaterial!==undefined?options.overrideMaterial:null;/** * Indicates whether the depth buffer should be cleared explicitly. * * @type {Boolean} */_this.clearDepth=options.clearDepth!==undefined?options.clearDepth:false;/** * Indicates whether the color, depth and stencil buffers should be cleared. * * Even with clear set to true you can prevent specific buffers from being * cleared by setting either the autoClearColor, autoClearStencil or * autoClearDepth properties of the renderer to false. * * @type {Boolean} */_this.clear=options.clear!==undefined?options.clear:true;return _this;}/** * Renders the scene. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(RenderPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var renderTarget=this.renderToScreen?null:inputBuffer;var overrideMaterial=scene.overrideMaterial;if(this.clear){this.clearPass.renderToScreen=this.renderToScreen;this.clearPass.render(renderer,inputBuffer);}else if(this.clearDepth){renderer.setRenderTarget(renderTarget);renderer.clearDepth();}scene.overrideMaterial=this.overrideMaterial;renderer.render(scene,this.camera,renderTarget);scene.overrideMaterial=overrideMaterial;}}]);inherits(RenderPass,_Pass);return RenderPass;}(Pass);/** * Clamps a given value. * * @private * @param {Number} value - The value to clamp. * @param {Number} min - The lowest possible value. * @param {Number} max - The highest possible value. * @return {Number} The clamped value. */function clamp(value,min,max){return Math.max(min,Math.min(max,value));}/** * A crepuscular rays pass. */var GodRaysPass=/*#__PURE__*/function(_Pass){/** * Constructs a new god rays pass. * * @param {Scene} scene - The main scene. * @param {Camera} camera - The main camera. * @param {Object3D} lightSource - The main light source. * @param {Object} [options] - The options. * @param {Number} [options.density=0.96] - The density of the light rays. * @param {Number} [options.decay=0.93] - An illumination decay factor. * @param {Number} [options.weight=0.4] - A light ray weight factor. * @param {Number} [options.exposure=0.6] - A constant attenuation coefficient. * @param {Number} [options.clampMax=1.0] - An upper bound for the saturation of the overall effect. * @param {Number} [options.intensity=1.0] - A constant factor for additive blending. * @param {Number} [options.resolutionScale=0.5] - The render texture resolution scale, relative to the screen render size. * @param {Number} [options.kernelSize=KernelSize.LARGE] - The blur kernel size. * @param {Number} [options.samples=60] - The number of samples per pixel. * @param {Number} [options.screenMode=true] - Whether the screen blend mode should be used for combining the god rays texture with the scene colors. */function GodRaysPass(scene,camera,lightSource){var _this;var options=arguments.length>3&&arguments[3]!==undefined?arguments[3]:{};classCallCheck(this,GodRaysPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(GodRaysPass).call(this,"GodRaysPass"));/** * A scene that only contains the light source. * * @type {Scene} * @private */_this.lightScene=new Scene();/** * The main scene. * * @type {Scene} * @private */_this.mainScene=scene;/** * The main camera. * * @type {Camera} * @private */_this.mainCamera=camera;/** * A render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetX=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTargetX.texture.name="GodRays.TargetX";_this.renderTargetX.texture.generateMipmaps=false;/** * A second render target. * * @type {WebGLRenderTarget} * @private */_this.renderTargetY=_this.renderTargetX.clone();_this.renderTargetY.texture.name="GodRays.TargetY";/** * A render target for the masked light scene. * * @type {WebGLRenderTarget} * @private */_this.renderTargetMask=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter});_this.renderTargetMask.texture.name="GodRays.Mask";_this.renderTargetMask.texture.generateMipmaps=false;/** * A pass that only renders the light source. * * @type {RenderPass} * @private */_this.renderPassLight=new RenderPass(_this.lightScene,_this.mainCamera,{clearColor:new Color(0x000000)});/** * A pass that renders the masked scene over the light. * * @type {RenderPass} * @private */_this.renderPassMask=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new MeshBasicMaterial({color:0x000000})});_this.renderPassMask.clear=false;/** * A blur pass. * * @type {BlurPass} * @private */_this.blurPass=new BlurPass(options);/** * The light source. * * @type {Object3D} */_this.lightSource=lightSource;/** * The light position in screen space. * * @type {Vector3} * @private */_this.screenPosition=new Vector3();/** * A god rays shader material. * * @type {GodRaysMaterial} * @private */_this.godRaysMaterial=new GodRaysMaterial(options);_this.godRaysMaterial.uniforms.lightPosition.value=_this.screenPosition;_this.samples=options.samples;/** * A combine shader material. * * @type {CombineMaterial} * @private */_this.combineMaterial=new CombineMaterial(options.screenMode!==undefined?options.screenMode:true);_this.intensity=options.intensity;return _this;}/** * The resolution scale. * * @type {Number} */createClass(GodRaysPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var mainScene=this.mainScene;var lightSource=this.lightSource;var screenPosition=this.screenPosition;var godRaysMaterial=this.godRaysMaterial;var combineMaterial=this.combineMaterial;var renderTargetMask=this.renderTargetMask;var renderTargetX=this.renderTargetX;var renderTargetY=this.renderTargetY;var background,parent;// Compute the screen light position and translate it to [0.0, 1.0]. screenPosition.copy(lightSource.position).project(this.mainCamera);screenPosition.x=clamp((screenPosition.x+1.0)*0.5,0.0,1.0);screenPosition.y=clamp((screenPosition.y+1.0)*0.5,0.0,1.0);parent=lightSource.parent;background=mainScene.background;mainScene.background=null;this.lightScene.add(lightSource);/* First, render the light source. Then render the scene into the same buffer using a mask override material with depth test enabled. */this.renderPassLight.render(renderer,renderTargetMask);this.renderPassMask.render(renderer,renderTargetMask);if(parent!==null){parent.add(lightSource);}mainScene.background=background;// Blur the masked scene to reduce artifacts. this.blurPass.render(renderer,this.renderTargetMask,renderTargetX);// Blur the masked scene along radial lines towards the light source. this.material=godRaysMaterial;godRaysMaterial.uniforms.tDiffuse.value=renderTargetX.texture;renderer.render(scene,camera,renderTargetY);if(this.blend){// Combine the god rays with the scene colors. this.material=combineMaterial;combineMaterial.uniforms.texture1.value=inputBuffer.texture;combineMaterial.uniforms.texture2.value=renderTargetY.texture;renderer.render(scene,camera,this.renderToScreen?null:outputBuffer);}}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.renderPassLight.setSize(width,height);this.renderPassMask.setSize(width,height);this.blurPass.setSize(width,height);width=this.blurPass.width;height=this.blurPass.height;this.renderTargetMask.setSize(width,height);this.renderTargetX.setSize(width,height);this.renderTargetY.setSize(width,height);}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){this.renderPassLight.initialize(renderer,alpha);this.renderPassMask.initialize(renderer,alpha);this.blurPass.initialize(renderer,alpha);if(!alpha){this.renderTargetMask.texture.format=RGBFormat;this.renderTargetX.texture.format=RGBFormat;this.renderTargetY.texture.format=RGBFormat;}}},{key:"resolutionScale",get:function get(){return this.blurPass.resolutionScale;}/** * You need to call {@link EffectComposer#setSize} after changing this value. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/** * The blur kernel size. * * @type {KernelSize} */},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/** * @type {KernelSize} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.LARGE;this.blurPass.kernelSize=value;}/** * The overall intensity of the effect. * * @type {Number} */},{key:"intensity",get:function get(){return this.combineMaterial.uniforms.opacity2.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.combineMaterial.uniforms.opacity2.value=value;}/** * The number of samples per pixel. * * @type {Number} */},{key:"samples",get:function get(){return Number.parseInt(this.godRaysMaterial.defines.NUM_SAMPLES_INT);}/** * This value must be carefully chosen. A higher value directly increases the * GPU load. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:60;value=Math.floor(value);this.godRaysMaterial.defines.NUM_SAMPLES_FLOAT=value.toFixed(1);this.godRaysMaterial.defines.NUM_SAMPLES_INT=value.toFixed(0);this.godRaysMaterial.needsUpdate=true;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.godRaysMaterial.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){if(this.dithering!==value){this.godRaysMaterial.dithering=value;this.godRaysMaterial.needsUpdate=true;}}/** * Indicates whether the effect should be applied to the input buffer. * * @type {Boolean} */},{key:"blend",get:function get(){return this.needsSwap;}/** * If disabled, the input buffer will remain unaffected. * * You may use the {@link BloomPass#overlay} texture to apply the effect to * your scene. * * @type {Boolean} */,set:function set(value){this.needsSwap=value;}/** * The effect overlay texture. * * @type {Texture} */},{key:"overlay",get:function get(){return this.renderTargetY.texture;}}]);inherits(GodRaysPass,_Pass);return GodRaysPass;}(Pass);/** * A mask pass. */var MaskPass=/*#__PURE__*/function(_Pass){/** * Constructs a new mask pass. * * @param {Scene} scene - The scene to render. * @param {Camera} camera - The camera to use. */function MaskPass(scene,camera){var _this;classCallCheck(this,MaskPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(MaskPass).call(this,"MaskPass",scene,camera,null));_this.needsSwap=false;/** * Inverse flag. * * @type {Boolean} */_this.inverse=false;/** * Stencil buffer clear flag. * * @type {Boolean} */_this.clearStencil=true;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(MaskPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var context=renderer.context;var state=renderer.state;var scene=this.scene;var camera=this.camera;var writeValue=this.inverse?0:1;var clearValue=1-writeValue;// Don't update color or depth. state.buffers.color.setMask(false);state.buffers.depth.setMask(false);// Lock the buffers. state.buffers.color.setLocked(true);state.buffers.depth.setLocked(true);// Configure the stencil. state.buffers.stencil.setTest(true);state.buffers.stencil.setOp(context.REPLACE,context.REPLACE,context.REPLACE);state.buffers.stencil.setFunc(context.ALWAYS,writeValue,0xffffffff);state.buffers.stencil.setClear(clearValue);// Clear the stencil. if(this.clearStencil){if(this.renderToScreen){renderer.setRenderTarget(null);renderer.clearStencil();}else{renderer.setRenderTarget(inputBuffer);renderer.clearStencil();renderer.setRenderTarget(outputBuffer);renderer.clearStencil();}}// Draw the mask. if(this.renderToScreen){renderer.render(scene,camera,null);}else{renderer.render(scene,camera,inputBuffer);renderer.render(scene,camera,outputBuffer);}// Unlock the buffers. state.buffers.color.setLocked(false);state.buffers.depth.setLocked(false);// Only render where the stencil is set to 1. state.buffers.stencil.setFunc(context.EQUAL,1,0xffffffff);state.buffers.stencil.setOp(context.KEEP,context.KEEP,context.KEEP);}}]);inherits(MaskPass,_Pass);return MaskPass;}(Pass);/** * A shader pass. * * Used to render any shader material as a 2D filter. */var ShaderPass=/*#__PURE__*/function(_Pass){/** * Constructs a new shader pass. * * @param {ShaderMaterial} material - The shader material to use. * @param {String} [textureID="tDiffuse"] - The texture uniform identifier. */function ShaderPass(material){var _this;var textureID=arguments.length>1&&arguments[1]!==undefined?arguments[1]:"tDiffuse";classCallCheck(this,ShaderPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ShaderPass).call(this,"ShaderPass"));_this.material=material;/** * The name of the color sampler uniform of the given material. * * @type {String} */_this.textureID=textureID;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(ShaderPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){if(this.material.uniforms[this.textureID]!==undefined){this.material.uniforms[this.textureID].value=inputBuffer.texture;}renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}}]);inherits(ShaderPass,_Pass);return ShaderPass;}(Pass);/** * An outline pass. */var OutlinePass=/*#__PURE__*/function(_Pass){/** * Constructs a new outline pass. * * @param {Scene} scene - The main scene. * @param {Camera} camera - The main camera. * @param {Object} [options] - Additional parameters. See {@link BlurPass}, {@link OutlineBlendMaterial} and {@link OutlineEdgesMaterial} for details. * @param {Number} [options.pulseSpeed=0.0] - The pulse speed. A value of zero disables the pulse effect. * @param {Boolean} [options.blur=true] - Whether the outline should be blurred. */function OutlinePass(scene,camera){var _this;var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,OutlinePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(OutlinePass).call(this,"OutlinePass"));/** * The main scene. * * @type {Scene} * @private */_this.mainScene=scene;/** * The main camera. * * @type {Camera} * @private */_this.mainCamera=camera;/** * A render target for depth information. * * @type {WebGLRenderTarget} * @private */_this.renderTargetDepth=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter});_this.renderTargetDepth.texture.name="Outline.Depth";_this.renderTargetDepth.texture.generateMipmaps=false;/** * A render target for the outline mask. * * @type {WebGLRenderTarget} * @private */_this.renderTargetMask=_this.renderTargetDepth.clone();_this.renderTargetMask.texture.format=RGBFormat;_this.renderTargetMask.texture.name="Outline.Mask";/** * A render target for the edge detection. * * @type {WebGLRenderTarget} * @private */_this.renderTargetEdges=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false,format:RGBFormat});_this.renderTargetEdges.texture.name="Outline.Edges";_this.renderTargetEdges.texture.generateMipmaps=false;/** * A render target for the blurred outline overlay. * * @type {WebGLRenderTarget} * @private */_this.renderTargetBlurredEdges=_this.renderTargetEdges.clone();_this.renderTargetBlurredEdges.texture.name="Outline.BlurredEdges";/** * A depth pass. * * @type {RenderPass} * @private */_this.renderPassDepth=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new MeshDepthMaterial({depthPacking:RGBADepthPacking,morphTargets:true,skinning:true}),clearColor:new Color(0xffffff),clearAlpha:1.0});/** * A depth comparison mask pass. * * @type {RenderPass} * @private */_this.renderPassMask=new RenderPass(_this.mainScene,_this.mainCamera,{overrideMaterial:new DepthComparisonMaterial(_this.renderTargetDepth.texture,_this.mainCamera),clearColor:new Color(0xffffff),clearAlpha:1.0});/** * A blur pass. * * @type {BlurPass} * @private */_this.blurPass=new BlurPass(options);_this.kernelSize=options.kernelSize;/** * A copy pass that renders the read buffer to screen if needed. * * @type {ShaderPass} * @private */_this.copyPass=new ShaderPass(new CopyMaterial());_this.copyPass.renderToScreen=true;/** * An outline edge detection material. * * @type {OutlineEdgesMaterial} * @private */_this.outlineEdgesMaterial=new OutlineEdgesMaterial(options);_this.outlineEdgesMaterial.uniforms.tMask.value=_this.renderTargetMask.texture;/** * An outline blend material. * * @type {OutlineBlendMaterial} * @private */_this.outlineBlendMaterial=new OutlineBlendMaterial(options);_this.outlineBlendMaterial.uniforms.tMask.value=_this.renderTargetMask.texture;_this.blur=options.blur!==undefined?options.blur:true;/** * A list of objects to outline. * * @type {Object3D[]} * @private */_this.selection=[];/** * The current animation time. * * @type {Number} * @private */_this.time=0.0;/** * The pulse speed. A value of zero disables the pulse effect. * * @type {Number} */_this.pulseSpeed=options.pulseSpeed!==undefined?options.pulseSpeed:0.0;/** * A dedicated render layer for selected objects. * * This layer is set to 10 by default. If this collides with your own custom * layers, please change it to a free layer before rendering! * * @type {Number} */_this.selectionLayer=10;return _this;}/** * The resolution scale. * * @type {Number} */createClass(OutlinePass,[{key:"setPatternTexture",/** * Sets a pattern texture to use as an overlay for selected objects. * * @param {Texture} [texture=null] - A pattern texture. Set to null to disable the pattern. */value:function setPatternTexture(){var texture=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;this.outlineBlendMaterial.setPatternTexture(texture);}/** * Clears the current selection and selects a list of objects. * * @param {Object3D[]} objects - The objects that should be outlined. This array will be copied. * @return {OutlinePass} This pass. */},{key:"setSelection",value:function setSelection(objects){var selection=objects.slice(0);var selectionLayer=this.selectionLayer;var i,l;this.clearSelection();for(i=0,l=selection.length;i=0){selection[index].layers.disable(this.selectionLayer);selection.splice(index,1);if(selection.length===0){this.time=0.0;}}return this;}/** * Sets the visibility of all selected objects. * * @private * @param {Boolean} visible - Whether the selected objects should be visible. */},{key:"setSelectionVisible",value:function setSelectionVisible(visible){var selection=this.selection;var i,l;for(i=0,l=selection.length;i0){background=mainScene.background;mask=mainCamera.layers.mask;mainScene.background=null;pulse.value=1.0;if(this.pulseSpeed>0.0){pulse.value=0.625+Math.cos(this.time*this.pulseSpeed*10.0)*0.375;this.time+=delta;}// Render a custom depth texture and ignore selected objects. this.setSelectionVisible(false);this.renderPassDepth.render(renderer,this.renderTargetDepth);this.setSelectionVisible(true);// Create a mask for the selected objects using the depth information. mainCamera.layers.mask=1<0&&arguments[0]!==undefined?arguments[0]:0.5;this.blurPass.resolutionScale=value;}/** * The blur kernel size. * * @type {KernelSize} */},{key:"kernelSize",get:function get(){return this.blurPass.kernelSize;}/** * @type {KernelSize} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:KernelSize.VERY_SMALL;this.blurPass.kernelSize=value;}/** * Indicates whether the outline overlay should be blurred. * * @type {Boolean} */},{key:"blur",get:function get(){return this.blurPass.enabled;}/** * @type {Boolean} */,set:function set(value){this.blurPass.enabled=value;this.outlineBlendMaterial.uniforms.tEdges.value=value?this.renderTargetBlurredEdges.texture:this.renderTargetEdges.texture;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.blurPass.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){this.blurPass.dithering=value;}/** * Indicates whether the effect should be applied to the input buffer. * * @type {Boolean} */},{key:"blend",get:function get(){return this.needsSwap;}/** * If disabled, the input buffer will remain unaffected. * * You may use the {@link BloomPass#overlay} texture to apply the effect to * your scene. * * @type {Boolean} */,set:function set(value){this.needsSwap=value;}/** * The effect overlay texture. * * @type {Texture} */},{key:"overlay",get:function get(){return this.outlineBlendMaterial.uniforms.tEdges.value;}}]);inherits(OutlinePass,_Pass);return OutlinePass;}(Pass);/** * A pixelation pass. */var PixelationPass=/*#__PURE__*/function(_Pass){/** * Constructs a new pixelation pass. * * @param {Number} [granularity=30.0] - The intensity of the effect. */function PixelationPass(){var _this;var granularity=arguments.length>0&&arguments[0]!==undefined?arguments[0]:30.0;classCallCheck(this,PixelationPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(PixelationPass).call(this,"PixelationPass"));_this.material=new PixelationMaterial();_this.granularity=granularity;return _this;}/** * The pixel granularity. * * @type {Number} */createClass(PixelationPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.material.setResolution(width,height);}},{key:"granularity",get:function get(){return this.material.granularity;}/** * A higher value yields coarser visuals. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:30;value=Math.floor(value);if(value%2>0){value+=1;}this.material.granularity=value;}}]);inherits(PixelationPass,_Pass);return PixelationPass;}(Pass);/** * An advanced Depth of Field (DoF) pass. * * Yields more realistic results but is also more demanding. * * This pass requires a {@link EffectComposer#depthTexture}. */var RealisticBokehPass=/*#__PURE__*/function(_Pass){/** * Constructs a new bokeh pass. * * @param {PerspectiveCamera} camera - The main camera. Used to obtain the focal length and the near and far plane settings. * @param {Object} [options] - Additional parameters. See {@link RealisticBokehMaterial} for details. */function RealisticBokehPass(camera){var _this;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,RealisticBokehPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(RealisticBokehPass).call(this,"RealisticBokehPass"));_this.material=new RealisticBokehMaterial(camera,options);return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(RealisticBokehPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;this.material.uniforms.tDepth.value=inputBuffer.depthTexture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.material.setTexelSize(1.0/width,1.0/height);}}]);inherits(RealisticBokehPass,_Pass);return RealisticBokehPass;}(Pass);/** * A pass that renders the result from a previous pass to another render target. */var SavePass=/*#__PURE__*/function(_Pass){/** * Constructs a new save pass. * * @param {WebGLRenderTarget} [renderTarget] - The render target to use for saving the input buffer. * @param {Boolean} [resize=true] - Whether the render target should adjust to the size of the input buffer. */function SavePass(renderTarget){var _this;var resize=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;classCallCheck(this,SavePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(SavePass).call(this,"SavePass"));_this.material=new CopyMaterial();_this.needsSwap=false;/** * The render target. * * @type {WebGLRenderTarget} */_this.renderTarget=renderTarget!==undefined?renderTarget:new WebGLRenderTarget(1,1,{minFilter:LinearFilter,magFilter:LinearFilter,stencilBuffer:false,depthBuffer:false});_this.renderTarget.texture.name="Save.Target";_this.renderTarget.texture.generateMipmaps=false;/** * Indicates whether the render target should be resized when the size of * the composer's frame buffer changes. * * @type {Boolean} */_this.resize=resize;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(SavePass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderTarget);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){if(this.resize){width=Math.max(1,width);height=Math.max(1,height);this.renderTarget.setSize(width,height);}}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){if(!alpha){this.renderTarget.texture.format=RGBFormat;}}}]);inherits(SavePass,_Pass);return SavePass;}(Pass);/** * Half PI. * * @type {Number} * @private */var HALF_PI=Math.PI*0.5;/** * A vector. * * @type {Vector3} * @private */var v=new Vector3();/** * A vector. * * @type {Vector3} * @private */var ab=new Vector3();/** * A shock wave pass. */var ShockWavePass=/*#__PURE__*/function(_Pass){/** * Constructs a new shock wave pass. * * @param {Camera} camera - The main camera. * @param {Vector3} [epicenter] - The world position of the shock wave epicenter. * @param {Object} [options] - The options. * @param {Number} [options.speed=1.0] - The animation speed. * @param {Number} [options.maxRadius=1.0] - The extent of the shock wave. * @param {Number} [options.waveSize=0.2] - The wave size. * @param {Number} [options.amplitude=0.05] - The distortion amplitude. */function ShockWavePass(camera){var _this;var epicenter=arguments.length>1&&arguments[1]!==undefined?arguments[1]:new Vector3();var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,ShockWavePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ShockWavePass).call(this,"ShockWavePass"));/** * The main camera. * * @type {Object3D} */_this.mainCamera=camera;/** * The epicenter. * * @type {Vector3} * @example shockWavePass.epicenter = myMesh.position; */_this.epicenter=epicenter;/** * The object position in screen space. * * @type {Vector3} * @private */_this.screenPosition=new Vector3();/** * The speed of the shock wave animation. * * @type {Number} */_this.speed=options.speed!==undefined?options.speed:2.0;/** * A time accumulator. * * @type {Number} * @private */_this.time=0.0;/** * Indicates whether the shock wave animation is active. * * @type {Boolean} * @private */_this.active=false;/** * A shock wave shader material. * * @type {ShockWaveMaterial} * @private */_this.shockWaveMaterial=new ShockWaveMaterial(options);_this.shockWaveMaterial.uniforms.center.value=_this.screenPosition;/** * A copy shader material. * * @type {CopyMaterial} * @private */_this.copyMaterial=new CopyMaterial();return _this;}/** * Emits the shock wave. */createClass(ShockWavePass,[{key:"explode",value:function explode(){this.time=0.0;this.active=true;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */},{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var epicenter=this.epicenter;var mainCamera=this.mainCamera;var screenPosition=this.screenPosition;var shockWaveMaterial=this.shockWaveMaterial;var uniforms=shockWaveMaterial.uniforms;var center=uniforms.center;var radius=uniforms.radius;var maxRadius=uniforms.maxRadius;var waveSize=uniforms.waveSize;this.copyMaterial.uniforms.tDiffuse.value=inputBuffer.texture;this.material=this.copyMaterial;if(this.active){// Calculate direction vectors. mainCamera.getWorldDirection(v);ab.copy(mainCamera.position).sub(epicenter);// Don't render the effect if the object is behind the camera. if(v.angleTo(ab)>HALF_PI){// Scale the effect based on distance to the object. uniforms.cameraDistance.value=mainCamera.position.distanceTo(epicenter);// Calculate the screen position of the epicenter. screenPosition.copy(epicenter).project(mainCamera);center.value.x=(screenPosition.x+1.0)*0.5;center.value.y=(screenPosition.y+1.0)*0.5;uniforms.tDiffuse.value=inputBuffer.texture;this.material=shockWaveMaterial;}// Update the shock wave radius based on time. this.time+=delta*this.speed;radius.value=this.time-waveSize.value;if(radius.value>=(maxRadius.value+waveSize.value)*2){this.active=false;}}renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.shockWaveMaterial.uniforms.aspect.value=width/height;}}]);inherits(ShockWavePass,_Pass);return ShockWavePass;}(Pass);// Generated with SMAASearchImageData.generate().toCanvas().toDataURL(), not cropped, low dynamic range. var searchImageDataURL="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII";// Generated with SMAAAreaImageData.generate().toCanvas().toDataURL(). var areaImageDataURL="data:image/png;base64,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";/** * Subpixel Morphological Antialiasing (SMAA) v2.8. * * Preset: SMAA 1x Medium (with color edge detection). * https://github.com/iryoku/smaa/releases/tag/v2.8 */var SMAAPass=/*#__PURE__*/function(_Pass){/** * Constructs a new SMAA pass. * * @param {Image} searchImage - The SMAA search image. Preload this image using the {@link searchImageDataURL}. * @param {Image} areaImage - The SMAA area image. Preload this image using the {@link areaImageDataURL}. */function SMAAPass(searchImage,areaImage){var _this;classCallCheck(this,SMAAPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(SMAAPass).call(this,"SMAAPass"));/** * A clear pass for the color edges buffer. * * @type {ClearPass} * @private */_this.clearPass=new ClearPass({clearColor:new Color(0x000000),clearAlpha:1.0});/** * A render target for the color edge detection. * * @type {WebGLRenderTarget} * @private */_this.renderTargetColorEdges=new WebGLRenderTarget(1,1,{minFilter:LinearFilter,format:RGBFormat,stencilBuffer:false,depthBuffer:false});_this.renderTargetColorEdges.texture.name="SMAA.ColorEdges";_this.renderTargetColorEdges.texture.generateMipmaps=false;/** * A render target for the SMAA weights. * * @type {WebGLRenderTarget} * @private */_this.renderTargetWeights=_this.renderTargetColorEdges.clone();_this.renderTargetWeights.texture.name="SMAA.Weights";_this.renderTargetWeights.texture.format=RGBAFormat;/** * Color edge detection shader material. * * @type {ColorEdgesMaterial} * @private */_this.colorEdgesMaterial=new ColorEdgesMaterial();/** * SMAA weights shader material. * * @type {SMAAWeightsMaterial} * @private */_this.weightsMaterial=new SMAAWeightsMaterial();_this.weightsMaterial.uniforms.tDiffuse.value=_this.renderTargetColorEdges.texture;/** * The SMAA search texture. * * @type {Texture} * @private */_this.searchTexture=new Texture(searchImage);_this.searchTexture.name="SMAA.Search";_this.searchTexture.magFilter=NearestFilter;_this.searchTexture.minFilter=NearestFilter;_this.searchTexture.format=RGBAFormat;_this.searchTexture.generateMipmaps=false;_this.searchTexture.needsUpdate=true;_this.searchTexture.flipY=false;_this.weightsMaterial.uniforms.tSearch.value=_this.searchTexture;/** * The SMAA area texture. * * @type {Texture} * @private */_this.areaTexture=new Texture(areaImage);_this.areaTexture.name="SMAA.Area";_this.areaTexture.minFilter=LinearFilter;_this.areaTexture.format=RGBAFormat;_this.areaTexture.generateMipmaps=false;_this.areaTexture.needsUpdate=true;_this.areaTexture.flipY=false;_this.weightsMaterial.uniforms.tArea.value=_this.areaTexture;/** * SMAA blend shader material. * * @type {SMAABlendMaterial} * @private */_this.blendMaterial=new SMAABlendMaterial();_this.blendMaterial.uniforms.tWeights.value=_this.renderTargetWeights.texture;return _this;}/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */createClass(SMAAPass,[{key:"render",value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){// Detect color edges. this.material=this.colorEdgesMaterial;this.colorEdgesMaterial.uniforms.tDiffuse.value=inputBuffer.texture;this.clearPass.render(renderer,this.renderTargetColorEdges);renderer.render(this.scene,this.camera,this.renderTargetColorEdges);// Compute edge weights. this.material=this.weightsMaterial;renderer.render(this.scene,this.camera,this.renderTargetWeights);// Apply the antialiasing filter to the colors. this.material=this.blendMaterial;this.blendMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Updates the size of this pass. * * @param {Number} width - The width. * @param {Number} height - The height. */},{key:"setSize",value:function setSize(width,height){this.renderTargetColorEdges.setSize(width,height);this.renderTargetWeights.setSize(width,height);this.colorEdgesMaterial.uniforms.texelSize.value.copy(this.weightsMaterial.uniforms.texelSize.value.copy(this.blendMaterial.uniforms.texelSize.value.set(1.0/width,1.0/height)));}/** * The SMAA search image, encoded as a base64 data URL. * * Use this image data to create an Image instance and use it together with * the area image to create an SMAAPass. * * @type {String} * @example * const searchImage = new Image(); * searchImage.addEventListener("load", progress); * searchImage.src = SMAAPass.searchImageDataURL; */}],[{key:"searchImageDataURL",get:function get(){return searchImageDataURL;}/** * The SMAA area image, encoded as a base64 data URL. * * Use this image data to create an Image instance and use it together with * the search image to create an SMAAPass. * * @type {String} * @example * const areaImage = new Image(); * areaImage.addEventListener("load", progress); * areaImage.src = SMAAPass.areaImageDataURL; */},{key:"areaImageDataURL",get:function get(){return areaImageDataURL;}}]);inherits(SMAAPass,_Pass);return SMAAPass;}(Pass);/** * A pass that renders a given texture. */var TexturePass=/*#__PURE__*/function(_Pass){/** * Constructs a new texture pass. * * @param {Texture} texture - The texture. * @param {Number} [opacity=1.0] - The texture opacity. * @param {Boolean} [screenMode=true] - Whether the screen blend mode should be used for combining the texture with the scene colors. */function TexturePass(texture){var _this;var opacity=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1.0;var screenMode=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;classCallCheck(this,TexturePass);_this=possibleConstructorReturn(this,getPrototypeOf$2(TexturePass).call(this,"TexturePass"));_this.material=new CombineMaterial(screenMode);_this.texture=texture;_this.opacitySource=opacity;return _this;}/** * The texture. * * @type {Texture} */createClass(TexturePass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){this.material.uniforms.texture1.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}},{key:"texture",get:function get(){return this.material.uniforms.texture2.value;}/** * @type {Texture} */,set:function set(value){this.material.uniforms.texture2.value=value;}/** * The opacity of the input buffer. * * The destination color is the color from the image in the input buffer. * * @type {Number} */},{key:"opacityDestination",get:function get(){return this.material.uniforms.opacity1.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.material.uniforms.opacity1.value=value;}/** * The opacity of the texture. * * The source color is the color from the texture. * * @type {Number} */},{key:"opacitySource",get:function get(){return this.material.uniforms.opacity2.value;}/** * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:1.0;this.material.uniforms.opacity2.value=value;}}]);inherits(TexturePass,_Pass);return TexturePass;}(Pass);/** * A tone mapping pass that supports adaptive luminosity. * * If adaptivity is enabled, this pass generates a texture that represents the * luminosity of the current scene and adjusts it over time to simulate the * optic nerve responding to the amount of light it is receiving. * * Reference: * GDC2007 - Wolfgang Engel, Post-Processing Pipeline * http://perso.univ-lyon1.fr/jean-claude.iehl/Public/educ/GAMA/2007/gdc07/Post-Processing_Pipeline.pdf */var ToneMappingPass=/*#__PURE__*/function(_Pass){/** * Constructs a new tone mapping pass. * * @param {Object} [options] - The options. * @param {Boolean} [options.adaptive=true] - Whether the tone mapping should use an adaptive luminance map. * @param {Number} [options.resolution=256] - The render texture resolution. * @param {Number} [options.distinction=1.0] - A luminance distinction factor. */function ToneMappingPass(){var _this;var options=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ToneMappingPass);_this=possibleConstructorReturn(this,getPrototypeOf$2(ToneMappingPass).call(this,"ToneMappingPass"));/** * The render target for the current luminosity. * * @type {WebGLRenderTarget} * @private * @todo Use RED format in WebGL 2.0. */_this.renderTargetLuminosity=new WebGLRenderTarget(1,1,{minFilter:LinearMipMapLinearFilter,magFilter:LinearFilter,format:RGBFormat,stencilBuffer:false,depthBuffer:false});_this.renderTargetLuminosity.texture.name="ToneMapping.Luminosity";/** * The render target for adapted luminosity. * * @type {WebGLRenderTarget} * @private */_this.renderTargetAdapted=_this.renderTargetLuminosity.clone();_this.renderTargetAdapted.texture.name="ToneMapping.AdaptedLuminosity";_this.renderTargetAdapted.texture.generateMipmaps=false;_this.renderTargetAdapted.texture.minFilter=LinearFilter;/** * A render target that holds a copy of the adapted limonosity. * * @type {WebGLRenderTarget} * @private */_this.renderTargetPrevious=_this.renderTargetAdapted.clone();_this.renderTargetPrevious.texture.name="ToneMapping.PreviousLuminosity";/** * Copy shader material used for saving the luminance map. * * @type {CopyMaterial} * @private */_this.copyMaterial=new CopyMaterial();/** * A luminosity shader material. * * @type {LuminosityMaterial} * @private */_this.luminosityMaterial=new LuminosityMaterial();_this.luminosityMaterial.uniforms.distinction.value=options.distinction!==undefined?options.distinction:1.0;/** * An adaptive luminance shader material. * * @type {AdaptiveLuminosityMaterial} * @private */_this.adaptiveLuminosityMaterial=new AdaptiveLuminosityMaterial();_this.resolution=options.resolution;/** * A tone mapping shader material. * * @type {ToneMappingMaterial} * @private */_this.toneMappingMaterial=new ToneMappingMaterial();_this.adaptive=options.adaptive;return _this;}/** * The resolution of the render targets. * * @type {Number} */createClass(ToneMappingPass,[{key:"render",/** * Renders the effect. * * @param {WebGLRenderer} renderer - The renderer. * @param {WebGLRenderTarget} inputBuffer - A frame buffer that contains the result of the previous pass. * @param {WebGLRenderTarget} outputBuffer - A frame buffer that serves as the output render target unless this pass renders to screen. * @param {Number} [delta] - The time between the last frame and the current one in seconds. * @param {Boolean} [stencilTest] - Indicates whether a stencil mask is active. */value:function render(renderer,inputBuffer,outputBuffer,delta,stencilTest){var scene=this.scene;var camera=this.camera;var adaptiveLuminosityMaterial=this.adaptiveLuminosityMaterial;var luminosityMaterial=this.luminosityMaterial;var toneMappingMaterial=this.toneMappingMaterial;var copyMaterial=this.copyMaterial;var renderTargetPrevious=this.renderTargetPrevious;var renderTargetLuminosity=this.renderTargetLuminosity;var renderTargetAdapted=this.renderTargetAdapted;if(this.adaptive){// Render the luminance of the current scene into a render target with mipmapping enabled. this.material=luminosityMaterial;luminosityMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(scene,camera,renderTargetLuminosity);// Use the new luminance values, the previous luminance and the frame delta to adapt the luminance over time. this.material=adaptiveLuminosityMaterial;adaptiveLuminosityMaterial.uniforms.delta.value=delta;adaptiveLuminosityMaterial.uniforms.tPreviousLum.value=renderTargetPrevious.texture;adaptiveLuminosityMaterial.uniforms.tCurrentLum.value=renderTargetLuminosity.texture;renderer.render(scene,camera,renderTargetAdapted);// Copy the new adapted luminance value so that it can be used by the next frame. this.material=copyMaterial;copyMaterial.uniforms.tDiffuse.value=renderTargetAdapted.texture;renderer.render(scene,camera,renderTargetPrevious);}// Apply the tone mapping to the colours. this.material=toneMappingMaterial;toneMappingMaterial.uniforms.tDiffuse.value=inputBuffer.texture;renderer.render(this.scene,this.camera,this.renderToScreen?null:outputBuffer);}/** * Performs initialization tasks. * * @param {WebGLRenderer} renderer - The renderer. * @param {Boolean} alpha - Whether the renderer uses the alpha channel or not. */},{key:"initialize",value:function initialize(renderer,alpha){this.material=new MeshBasicMaterial({color:0x7fffff});renderer.render(this.scene,this.camera,this.renderTargetPrevious);this.material.dispose();}},{key:"resolution",get:function get(){return this.renderTargetLuminosity.width;}/** * The resolution of the render targets. Must be a power of two for mipmaps. * * @type {Number} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:256;// Round the given value to the next power of two. var exponent=Math.max(0,Math.ceil(Math.log2(value)));value=Math.pow(2,exponent);this.renderTargetLuminosity.setSize(value,value);this.renderTargetPrevious.setSize(value,value);this.renderTargetAdapted.setSize(value,value);this.adaptiveLuminosityMaterial.defines.MIP_LEVEL_1X1=exponent.toFixed(1);this.adaptiveLuminosityMaterial.needsUpdate=true;}/** * Whether this pass uses adaptive luminosity. * * @type {Boolean} * @default true */},{key:"adaptive",get:function get(){return this.toneMappingMaterial.defines.ADAPTED_LUMINANCE!==undefined;}/** * Whether this pass should use adaptive luminosity. * * @type {Boolean} */,set:function set(){var value=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;if(value){this.toneMappingMaterial.defines.ADAPTED_LUMINANCE="1";this.toneMappingMaterial.uniforms.luminanceMap.value=this.renderTargetAdapted.texture;}else{delete this.toneMappingMaterial.defines.ADAPTED_LUMINANCE;this.toneMappingMaterial.uniforms.luminanceMap.value=null;}this.toneMappingMaterial.needsUpdate=true;}/** * Indicates whether dithering is enabled. * * @type {Boolean} */},{key:"dithering",get:function get(){return this.toneMappingMaterial.dithering;}/** * If enabled, the result will be dithered to remove banding artifacts. * * @type {Boolean} */,set:function set(value){if(this.dithering!==value){this.toneMappingMaterial.dithering=value;this.toneMappingMaterial.needsUpdate=true;}}}]);inherits(ToneMappingPass,_Pass);return ToneMappingPass;}(Pass);/** * A compilation of the post processing passes. * * @module postprocessing/passes */ /** * The EffectComposer may be used in place of a normal WebGLRenderer. * * The auto clear behaviour of the provided renderer will be disabled to prevent * unnecessary clear operations. * * It is common practice to use a {@link RenderPass} as the first pass to * automatically clear the screen and render the scene to a texture for further * processing. * * @implements {Resizable} * @implements {Disposable} */var EffectComposer=/*#__PURE__*/function(){/** * Constructs a new effect composer. * * @param {WebGLRenderer} [renderer] - The renderer that should be used. * @param {Object} [options] - The options. * @param {Boolean} [options.depthBuffer=true] - Whether the main render targets should have a depth buffer. * @param {Boolean} [options.stencilBuffer=false] - Whether the main render targets should have a stencil buffer. * @param {Boolean} [options.depthTexture=false] - Set to true if one of your passes relies on a depth texture. */function EffectComposer(){var renderer=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;var options=arguments.length>1&&arguments[1]!==undefined?arguments[1]:{};classCallCheck(this,EffectComposer);/** * The renderer. * * You may replace the renderer at any time by using * {@link EffectComposer#replaceRenderer}. * * @type {WebGLRenderer} */this.renderer=renderer;/** * The input buffer. * * Reading from and writing to the same render target should be avoided. * Therefore, two seperate yet identical buffers are used. * * @type {WebGLRenderTarget} * @private */this.inputBuffer=null;/** * The output buffer. * * @type {WebGLRenderTarget} * @private */this.outputBuffer=null;if(this.renderer!==null){this.renderer.autoClear=false;this.inputBuffer=this.createBuffer(options.depthBuffer!==undefined?options.depthBuffer:true,options.stencilBuffer!==undefined?options.stencilBuffer:false,options.depthTexture!==undefined?options.depthTexture:false);this.outputBuffer=this.inputBuffer.clone();}/** * A copy pass used for copying masked scenes. * * @type {ShaderPass} * @private */this.copyPass=new ShaderPass(new CopyMaterial());/** * The passes. * * @type {Pass[]} * @private */this.passes=[];}/** * The depth texture of the input and output buffers. * * @type {DepthTexture} */createClass(EffectComposer,[{key:"replaceRenderer",/** * Replaces the current renderer with the given one. The DOM element of the * current renderer will automatically be removed from its parent node and the * DOM element of the new renderer will take its place. * * The auto clear mechanism of the provided renderer will be disabled. * * Switching between renderers allows you to dynamically enable or disable * antialiasing. * * @param {WebGLRenderer} renderer - The new renderer. * @return {WebGLRenderer} The old renderer. */value:function replaceRenderer(renderer){var oldRenderer=this.renderer;var parent,oldSize,newSize;if(oldRenderer!==null&&oldRenderer!==renderer){this.renderer=renderer;this.renderer.autoClear=false;parent=oldRenderer.domElement.parentNode;oldSize=oldRenderer.getSize();newSize=renderer.getSize();if(parent!==null){parent.removeChild(oldRenderer.domElement);parent.appendChild(renderer.domElement);}if(oldSize.width!==newSize.width||oldSize.height!==newSize.height){this.setSize();}}return oldRenderer;}/** * Creates a new render target by replicating the renderer's canvas. * * The created render target uses a linear filter for texel minification and * magnification. Its render texture format depends on whether the renderer * uses the alpha channel. Mipmaps are disabled. * * @param {Boolean} depthBuffer - Whether the render target should have a depth buffer. * @param {Boolean} stencilBuffer - Whether the render target should have a stencil buffer. * @param {Boolean} depthTexture - Whether the render target should have a depth texture. * @return {WebGLRenderTarget} A new render target that equals the renderer's canvas. */},{key:"createBuffer",value:function createBuffer(depthBuffer,stencilBuffer,depthTexture){var drawingBufferSize=this.renderer.getDrawingBufferSize();var alpha=this.renderer.context.getContextAttributes().alpha;var renderTarget=new WebGLRenderTarget(drawingBufferSize.width,drawingBufferSize.height,{minFilter:LinearFilter,magFilter:LinearFilter,format:alpha?RGBAFormat:RGBFormat,depthBuffer:depthBuffer,stencilBuffer:stencilBuffer,depthTexture:depthTexture?new DepthTexture():null});if(depthTexture&&stencilBuffer){renderTarget.depthTexture.format=DepthStencilFormat;renderTarget.depthTexture.type=UnsignedInt248Type;}renderTarget.texture.name="EffectComposer.Buffer";renderTarget.texture.generateMipmaps=false;return renderTarget;}/** * Adds a pass, optionally at a specific index. * * @param {Pass} pass - A new pass. * @param {Number} [index] - An index at which the pass should be inserted. */},{key:"addPass",value:function addPass(pass,index){var renderer=this.renderer;var drawingBufferSize=renderer.getDrawingBufferSize();pass.setSize(drawingBufferSize.width,drawingBufferSize.height);pass.initialize(renderer,renderer.context.getContextAttributes().alpha);if(index!==undefined){this.passes.splice(index,0,pass);}else{this.passes.push(pass);}}/** * Removes a pass. * * @param {Pass} pass - The pass. */},{key:"removePass",value:function removePass(pass){this.passes.splice(this.passes.indexOf(pass),1);}/** * Renders all enabled passes in the order in which they were added. * * @param {Number} delta - The time between the last frame and the current one in seconds. */},{key:"render",value:function render(delta){var passes=this.passes;var copyPass=this.copyPass;var renderer=this.renderer;var inputBuffer=this.inputBuffer;var outputBuffer=this.outputBuffer;var stencilTest=false;var pass,context,state,buffer;var i,l;for(i=0,l=passes.length;i2&&arguments[2]!==undefined?arguments[2]:true;if(object[method])return;if(showWarn)console.warn("@PostProcessorModule: pass.".concat(method,"() was not found."),object);object[method]=function(){};};/** * @class PostProcessorModule * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new WHS.PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule(), * new PostProcessorModule() * ]); * * const processor = app.use('postprocessor'); * * processor * .render() * .pass(new GlitchPass()) * .renderToScreen() */var PostProcessorModule=/*#__PURE__*/function(){function PostProcessorModule(){var _this=this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:PostProcessorModule.defaults;classCallCheck(this,PostProcessorModule);defineProperty$3(defineProperty$3(this,"currentPass",null),"defer",new Promise(function(resolve){_this.resolve=resolve;}));this.debug=params.debug;this.params=params;}createClass(PostProcessorModule,[{key:"manager",value:function manager(_manager){var _this2=this;_manager.define('postprocessor');this.effects=_manager.use('rendering').effects;this.renderer=_manager.get('renderer');this.scene=_manager.get('scene');this.camera=_manager.get('camera');this.composer=new EffectComposer(this.renderer,this.params);_manager.use('rendering').stop();var composer=this.composer;this.renderLoop=new Loop(function(clock){return composer.render(clock.getDelta());}).start(_manager.handler);_manager.update({renderer:function renderer(_renderer){_this2.composer.replaceRenderer(_renderer);},scene:function scene(_scene){_this2.scene=_scene;},camera:function camera(_camera){_this2.camera=_camera;}});this.resolve();}/** * @method render * @description Adds RenderPass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"render",value:function render(){var _this3=this;this.defer.then(function(){var pass=new RenderPass(_this3.scene,_this3.camera.native);// TODO: Support for effects. _this3.composer.addPass(pass);_this3.currentPass=pass;});return this;}/** * @method pass * @description Adds your custom pass * @param {Pass} pass A custom pass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"pass",value:function pass(_pass){var _this4=this;this.defer.then(function(){polyfill(_pass,'setSize',_this4.debug);polyfill(_pass,'initialise',_this4.debug);_this4.composer.addPass(_pass);_this4.currentPass=_pass;});return this;}/** * @method shader * @description Adds a pass made from shader material * @param {Material} material A ShaderMaterial * @param {String} textureID Name of the readBuffer uniform * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"shader",value:function shader(material){var _this5=this;var textureID=arguments.length>1&&arguments[1]!==undefined?arguments[1]:'readBuffer';this.defer.then(function(){if(!material.uniforms[textureID])material.uniforms[textureID]={value:null};var pass=new ShaderPass(material,textureID);_this5.composer.addPass(pass);_this5.currentPass=pass;});return this;}/** * @method get * @description Returns a pass by the given name * @param {String} name The name of the pass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"get",value:function get(name){return name?this.composer.passes.filter(function(pass){return pass.name===name;})[0]:this.currentPass;}/** * @method renderToScreen * @description Sets the renderToScreen property of currentPass * @param {String} [name=true] The name of the pass * @return {this} * @memberof module:modules/app.PostProcessorModule */},{key:"renderToScreen",value:function renderToScreen(){var _this6=this;var bool=arguments.length>0&&arguments[0]!==undefined?arguments[0]:true;this.defer.then(function(){_this6.currentPass.renderToScreen=bool;});return this;}}]);return PostProcessorModule;}();defineProperty$3(PostProcessorModule,"defaults",{debug:true});/** * @class EventsPatchModule * @description This one is used in the core to handle events used by modules. If you want to make custom events - please make a similar one. * @category modules/app * @memberof module:modules/app */var EventsPatchModule=/*#__PURE__*/function(){function EventsPatchModule(){classCallCheck(this,EventsPatchModule);}createClass(EventsPatchModule,[{key:"manager",value:function manager(_manager){_manager.define('events');this.element=_manager.get('renderer').domElement;}/** * @function patchEvents * @description This methods patches the list of events on specific object. * @param {Number} originObject - The object that gives events. * @param {Number} [destObject=this] - The object that takes events. * @param {Array[Strings]} [events=[]] - The list of events by names. * @memberof module:modules/app.EventsPatchModule */},{key:"patchEvents",value:function patchEvents(originObject){var destObject=arguments.length>1&&arguments[1]!==undefined?arguments[1]:this;var events=arguments.length>2&&arguments[2]!==undefined?arguments[2]:[];events.forEach(function(event){return originObject.addEventListener(event,function(e){return destObject.emit(event,e);});});}},{key:"integrate",value:function integrate(self){var element=self.element,patchEvents=self.patchEvents;patchEvents(element,this,['mousemove','mouseup','contextmenu','mousedown','click','wheel','touchstart','touchend','touchmove','keydown','keyup','keypress']);}}]);return EventsPatchModule;}();/** * @class VirtualMouseModule * @category modules/app * @param {Boolean} [globalMovement=false] * @memberof module:modules/app * @extends Events */var VirtualMouseModule=/*#__PURE__*/function(_Events){function VirtualMouseModule(){var _this;var globalMovement=arguments.length>0&&arguments[0]!==undefined?arguments[0]:false;classCallCheck(this,VirtualMouseModule);_this=possibleConstructorReturn(this,getPrototypeOf$2(VirtualMouseModule).call(this));defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(defineProperty$3(assertThisInitialized(assertThisInitialized(_this)),"mouse",new Vector2()),"raycaster",new Raycaster()),"world",null),"canvas",null),"projectionPlane",new Plane(new Vector3(0,0,1),0));_this.globalMovement=globalMovement;return _this;}createClass(VirtualMouseModule,[{key:"update",value:function update(e,customX,customY){var rect=this.canvas.getBoundingClientRect();var x=customX||e.clientX;var y=customY||e.clientY;this.mouse.x=(x-rect.left)/(rect.right-rect.left)*2-1;this.mouse.y=-((y-rect.top)/(rect.bottom-rect.top))*2+1;this.projectionPlane.normal.copy(this.camera.getWorldDirection());this.raycaster.setFromCamera(this.mouse,this.camera);this.emit('move');}},{key:"manager",value:function manager(_manager){_manager.define('mouse');_manager.require('events',function(){return new EventsPatchModule();});this.canvas=_manager.get('renderer').domElement;this.camera=_manager.get('camera').native;}},{key:"integrate",value:function integrate(self){var _this2=this;['click','mousedown','mouseup','mousemove'].forEach(function(ev){return _this2.on(ev,function(e){return self.emit(ev,e);});});self.globalX=0;self.globalY=0;this.on('mousemove',function(e){if(document.pointerLockElement!==null){self.globalX+=e.movementX;self.globalY+=e.movementY;self.update(e,self.globalX,self.globalY);}else self.update(e);});}/** * @method track * @description Starts tracking events on a component * @param {Component} component A component, that should be tracked by the mouse * @param {Boolean} nested Whether component's children should be tracked or not * @memberof module:modules/app.VirtualMouseModule */},{key:"track",value:function track(component){var _this3=this;var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;var isHovered=false;this.on('move',function(){if(_this3.hovers(component,nested)){if(isHovered)component.emit('mousemove');else{component.emit('mouseover');isHovered=true;}}else if(isHovered){component.emit('mouseout');isHovered=false;}});this.on('click',function(){if(isHovered)component.emit('click');else component.emit('offClick');});this.on('mousedown',function(){if(isHovered)component.emit('mousedown');});this.on('mouseup',function(){if(isHovered)component.emit('mouseup');});}/** * @method intersection * @description Returns an intersection data * @param {Component} component A component that intersects with mouse ray (or doesn't) * @param {Boolean} nested Whether component's children should be tracked or not * @return {Array} intersection data. * @memberof module:modules/app.VirtualMouseModule */},{key:"intersection",value:function intersection(_ref){var native=_ref.native;var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(native.children.length>0&&nested){var objects=[];native.traverse(function(child){return objects.push(child);});return this.raycaster.intersectObjects(objects);}return this.raycaster.intersectObject(native);}/** * @method project * @description Returns a vector based on mouse ray intersection with plane * @param {THREE.Plane} [plane=this.projectionPlane] Math plane that is used * @param {Vector3} [target] Optional target * @return {Vector3} An intersection point. * @memberof module:modules/app.VirtualMouseModule */},{key:"project",value:function project(){var plane=arguments.length>0&&arguments[0]!==undefined?arguments[0]:this.projectionPlane;var target=arguments.length>1?arguments[1]:undefined;return this.raycaster.ray.intersectPlane(plane,target);}/** * @method hovers * @description Returns a boolean based on intersection data (Whether mouse hovers the component) * @param {Component} component A component that intersects with mouse ray (or doesn't) * @param {Boolean} nested Whether component's children should be tracked or not * @return {Boolean} Whether the component is hovered. * @memberof module:modules/app.VirtualMouseModule */},{key:"hovers",value:function hovers(component){var nested=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;return this.intersection(component,nested).length>0;}/** * Mouse ray * @member {THREE.Ray} module:modules/app.VirtualMouseModule#ray * @public */},{key:"ray",get:function get(){return this.raycaster.ray;}/** * Mouse x [-1; 1] * @member {Number} module:modules/app.VirtualMouseModule#x * @public */},{key:"x",get:function get(){return this.mouse.x;}/** * Mouse y [-1; 1] * @member {Number} module:modules/app.VirtualMouseModule#y * @public */},{key:"y",get:function get(){return this.mouse.y;}}]);inherits(VirtualMouseModule,_Events);return VirtualMouseModule;}(minivents_commonjs);/** * @class ControlsModule * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new WHS.PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule(), * new ControlsModule.from(new THREE.TrackballControls()) * ]); */var ControlsModule=/*#__PURE__*/function(){createClass(ControlsModule,null,[{key:"from",value:function from(controls){return new ControlsModule({controls:controls});}}]);function ControlsModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,ControlsModule);this.params=Object.assign({controls:false,fix:function fix(controls){return controls;},update:function update(c){this.controls.update(c.getDelta());}},params);this.controls=this.params.controls;this.update=this.params.update;}createClass(ControlsModule,[{key:"manager",value:function manager(_manager){_manager.define('controls');_manager.require('events',function(){return new EventsPatchModule();});}/** * @method setControls * @description Set working controls * @param {Object} controls Working three.js controls object. * @return {this} * @memberof module:modules/app.ControlsModule */},{key:"setControls",value:function setControls(controls){this.controls=controls;return this;}/** * @method setUpdate * @description Set controls update function * @param {Function} update Update function * @return {this} * @memberof module:modules/app.ControlsModule */},{key:"setUpdate",value:function setUpdate(update){this.update=update;return this;}},{key:"integrate",value:function integrate(self){self.updateLoop=new Loop(self.update.bind(self));self.updateLoop.start(this);}}]);return ControlsModule;}();/** * @class FogModule * @category modules/app * @param {Object} [params={color: 0xefd1b5, density: 0.020, near: 10, far: 1000}] - The parameters object. * @param {String} [type=exp2] - The type of fog - exp2 or linear * @memberof module:modules/app * @example How to create and apply a FogModule * const fogModule = new FogModule({ * color: 0xffffff, * density: 0.03, * near: 20, * far: 200 * }, 'exp2'); * * new App([ * ..., * fogModule * ]); */var FogModule=/*#__PURE__*/function(){function FogModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var type=arguments.length>1?arguments[1]:undefined;classCallCheck(this,FogModule);this.params=Object.assign({color:0xefd1b5,density:0.020,near:10,far:1000},params);if(!type||type==='exp2')this.fog=new FogExp2(this.params.color,this.params.density);else if(type==='linear')this.fog=new Fog(this.params.color,this.params.near,this.params.far);}createClass(FogModule,[{key:"manager",value:function manager(_manager){_manager.set('fog',this.fog);_manager.get('scene').fog=this.fog;}}]);return FogModule;}();var isEqualDefault=function isEqualDefault(a,b){if(a===b)return true;else if(a&&a.equals&&a.equals(b))return true;return false;};/** * @class StateModule * @description `StateModule` is useful for apps, where you need state manipulation. * This can be: _transitions between screens, games, development moments_. * You can check [basic/state](https://whs-dev.surge.sh/examples/?basic/state) example. * @category modules/app * @param {Object} [params] * @memberof module:modules/app * @example Creating a state module * new App([ * // ... * new StateModule().default({ * sphereColor: 0xff0000 * }) * ]); */var StateModule=/*#__PURE__*/function(){createClass(StateModule,null,[{key:"actionGenerate",value:function actionGenerate(isEqual){return function(){var state=arguments.length>0&&arguments[0]!==undefined?arguments[0]:[{},''];var _ref=arguments.length>1?arguments[1]:undefined,key=_ref.key,data=_ref.data;if(isEqual(state[0][key],data))return state;state[0][key]=data;state[1]=key;return state;};}}]);function StateModule(){var equalCheck=arguments.length>0&&arguments[0]!==undefined?arguments[0]:isEqualDefault;classCallCheck(this,StateModule);this.store=createStore(StateModule.actionGenerate(equalCheck));this.configuration={};this.currentConfig='default';this.prevConfig='default';}/** * @method default * @description Add default configuration. * @param {Object} data Configuration setup * @memberof module:modules/app.StateModule * @example * new WHS.StateModule().default({ * sphereColor: UTILS.$colors.mesh, * planeColor: 0x447F8B * }) */createClass(StateModule,[{key:"default",value:function _default(data){this.config({default:data});return this;}/** * @method setEqualCheck * @description Sets an equalCheck function * @param {Function} func function to generate equal check * @memberof module:modules/app.StateModule */},{key:"setEqualCheck",value:function setEqualCheck(func){this.store.replaceReducer(StateModule.actionGenerate(func));}},{key:"manager",value:function manager(_manager){_manager.define('state');}/** * @method config * @description Load configurations from object. * @param {Object} configs Configuration data * @memberof module:modules/app.StateModule * @example Adding `green` configuration * state.config({ * green: { * sphereColor: 0x00ff00, * planeColor: 0x00ff00 * } * }); */},{key:"config",value:function config(configs){for(var key in configs){if(key){this.configuration[key]=key==='default'?configs[key]:Object.assign({},this.configuration.default,configs[key]);}}}/** * @method update * @description Load updates from object. * @param {Object} updates Updates data * @memberof module:modules/app.StateModule * @example Update callback for `sphereColor` * state.update({ * sphereColor: color => sphere.material.color.setHex(color) * }); */},{key:"update",value:function update(){var _this=this;var updates=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};this.store.subscribe(function(){var _this$store$getState=_this.store.getState(),_this$store$getState2=slicedToArray(_this$store$getState,2),data=_this$store$getState2[0],changedKey=_this$store$getState2[1];var callback=updates[changedKey];if(callback)callback(data[changedKey]);});}/** * @method to * @description Switch to configuration. * @param {String} configName Configuration name. * @memberof module:modules/app.StateModule * @example Changes configuration to `green` * state.to('green'); */},{key:"to",value:function to(configName){this.prevConfig=this.currentConfig;this.currentConfig=configName;var config=this.configuration[configName]?this.configuration[configName]:this.configuration.default;this.set(config);}/** * @method set * @description Set current parameters. * @param {Object} data Configuration parameters. * @memberof module:modules/app.StateModule * @example * state.set({ * sphereColor: 0x00ff00 * }); */},{key:"set",value:function set(data){for(var key in data){if(key)this.store.dispatch({type:'ADD',key:key,data:data[key]});}}/** * @method get * @description Return data of parameter. * @param {String} key Parameter name. * @memberof module:modules/app.StateModule * @example * state.get('sphereColor'); // 0x00ff00 */},{key:"get",value:function get(key){return this.store.getState()[0][key];}/** * @method prev * @description Return `trueVal` if `config` match previous configuration, in other case - return `falseVal`. * @param {String} config Configuration name. * @param {Any} trueVal Value returned if condition is truthy. * @param {Any} falseVal Value returned if condition is falsy. * @memberof module:modules/app.StateModule */},{key:"prev",value:function prev(config,trueVal,falseVal){return this.prevConfig===config?trueVal:falseVal;}/** * @method current * @description Return `trueVal` if `config` match current configuration, in other case - return `falseVal`. * @param {String} config Configuration name. * @param {Any} trueVal Value returned if condition is truthy. * @param {Any} falseVal Value returned if condition is falsy. * @memberof module:modules/app.StateModule */},{key:"current",value:function current(config,trueVal,falseVal){return this.currentConfig===config?trueVal:falseVal;}}]);return StateModule;}();// Unlike TrackballControls, it maintains the "up" direction object.up (+Y by default). // // Orbit - left mouse / touch: one finger move // Zoom - middle mouse, or mousewheel / touch: two finger spread or squish // Pan - right mouse, or arrow keys / touch: three finter swipe var ThreeOrbitControls=/*#__PURE__*/function(_EventDispatcher){function ThreeOrbitControls(object,domElement,eventHandler){var _this;classCallCheck(this,ThreeOrbitControls);_this=possibleConstructorReturn(this,getPrototypeOf$2(ThreeOrbitControls).call(this));_this.object=object;_this.domElement=domElement===undefined?document:domElement;_this.eventHandler=eventHandler;// Set to false to disable this control _this.enabled=true;// "target" sets the location of focus, where the object orbits around _this.target=new Vector3();// How far you can dolly in and out ( PerspectiveCamera only ) _this.minDistance=0;_this.maxDistance=Infinity;// How far you can zoom in and out ( OrthographicCamera only ) _this.minZoom=0;_this.maxZoom=Infinity;// How far you can orbit vertically, upper and lower limits. // Range is 0 to Math.PI radians. _this.minPolarAngle=0;// radians _this.maxPolarAngle=Math.PI;// radians // How far you can orbit horizontally, upper and lower limits. // If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ]. _this.minAzimuthAngle=-Infinity;// radians _this.maxAzimuthAngle=Infinity;// radians // Set to true to enable damping (inertia) // If damping is enabled, you must call controls.update() in your animation loop _this.enableDamping=false;_this.dampingFactor=0.25;// This option actually enables dollying in and out; left as "zoom" for backwards compatibility. // Set to false to disable zooming _this.enableZoom=true;_this.zoomSpeed=1.0;// Set to false to disable rotating _this.enableRotate=true;_this.rotateSpeed=1.0;// Set to false to disable panning _this.enablePan=true;_this.keyPanSpeed=7.0;// pixels moved per arrow key push // Set to true to automatically rotate around the target // If auto-rotate is enabled, you must call controls.update() in your animation loop _this.autoRotate=false;_this.autoRotateSpeed=2.0;// 30 seconds per round when fps is 60 // Set to false to disable use of the keys _this.enableKeys=true;// The four arrow keys _this.keys={LEFT:37,UP:38,RIGHT:39,BOTTOM:40};// Mouse buttons _this.mouseButtons={ORBIT:MOUSE.LEFT,ZOOM:MOUSE.MIDDLE,PAN:MOUSE.RIGHT};// for reset _this.target0=_this.target.clone();_this.position0=_this.object.position.clone();_this.zoom0=_this.object.zoom;// // public methods // _this.getPolarAngle=function(){return spherical.phi;};_this.getAzimuthalAngle=function(){return spherical.theta;};_this.reset=function(){_this.target.copy(_this.target0);_this.object.position.copy(_this.position0);_this.object.zoom=_this.zoom0;_this.object.updateProjectionMatrix();_this.dispatchEvent(changeEvent);_this.update();state=STATE.NONE;};// this method is exposed, but perhaps it would be better if we can make it private... _this.update=function(){var offset=new Vector3();// so camera.up is the orbit axis var quat=new Quaternion().setFromUnitVectors(object.up,new Vector3(0,1,0));var quatInverse=quat.clone().inverse();var lastPosition=new Vector3();var lastQuaternion=new Quaternion();return function(){var position=_this.object.position;offset.copy(position).sub(_this.target);// rotate offset to "y-axis-is-up" space offset.applyQuaternion(quat);// angle from z-axis around y-axis spherical.setFromVector3(offset);if(_this.autoRotate&&state===STATE.NONE)rotateLeft(getAutoRotationAngle());spherical.theta+=sphericalDelta.theta;spherical.phi+=sphericalDelta.phi;// restrict theta to be between desired limits spherical.theta=Math.max(_this.minAzimuthAngle,Math.min(_this.maxAzimuthAngle,spherical.theta));// restrict phi to be between desired limits spherical.phi=Math.max(_this.minPolarAngle,Math.min(_this.maxPolarAngle,spherical.phi));spherical.makeSafe();spherical.radius*=scale;// restrict radius to be between desired limits spherical.radius=Math.max(_this.minDistance,Math.min(_this.maxDistance,spherical.radius));// move target to panned location _this.target.add(panOffset);offset.setFromSpherical(spherical);// rotate offset back to "camera-up-vector-is-up" space offset.applyQuaternion(quatInverse);position.copy(_this.target).add(offset);_this.object.lookAt(_this.target);if(_this.enableDamping===true){sphericalDelta.theta*=1-_this.dampingFactor;sphericalDelta.phi*=1-_this.dampingFactor;}else sphericalDelta.set(0,0,0);scale=1;panOffset.set(0,0,0);// update condition is: // min(camera displacement, camera rotation in radians)^2 > EPS // using small-angle approximation cos(x/2) = 1 - x^2 / 8 if(zoomChanged||lastPosition.distanceToSquared(_this.object.position)>EPS||8*(1-lastQuaternion.dot(_this.object.quaternion))>EPS){_this.dispatchEvent(changeEvent);lastPosition.copy(_this.object.position);lastQuaternion.copy(_this.object.quaternion);zoomChanged=false;return true;}return false;}();};_this.dispose=function(){_this.domElement.removeEventListener('contextmenu',onContextMenu,false);_this.domElement.removeEventListener('mousedown',onMouseDown,false);_this.domElement.removeEventListener('wheel',onMouseWheel,false);_this.domElement.removeEventListener('touchstart',onTouchStart,false);_this.domElement.removeEventListener('touchend',onTouchEnd,false);_this.domElement.removeEventListener('touchmove',onTouchMove,false);document.removeEventListener('mousemove',onMouseMove,false);document.removeEventListener('mouseup',onMouseUp,false);window.removeEventListener('keydown',onKeyDown,false);// this.dispatchEvent( { type: 'dispose' } ); // should this be added here? };// // internals // var changeEvent={type:'change'};var startEvent={type:'start'};var endEvent={type:'end'};var STATE={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_DOLLY:4,TOUCH_PAN:5};var state=STATE.NONE;var EPS=0.000001;// current position in spherical coordinates var spherical=new Spherical();var sphericalDelta=new Spherical();var scale=1;var panOffset=new Vector3();var zoomChanged=false;var rotateStart=new Vector2();var rotateEnd=new Vector2();var rotateDelta=new Vector2();var panStart=new Vector2();var panEnd=new Vector2();var panDelta=new Vector2();var dollyStart=new Vector2();var dollyEnd=new Vector2();var dollyDelta=new Vector2();var getAutoRotationAngle=function getAutoRotationAngle(){return 2*Math.PI/60/60*_this.autoRotateSpeed;};var getZoomScale=function getZoomScale(){return Math.pow(0.95,_this.zoomSpeed);};var rotateLeft=function rotateLeft(angle){sphericalDelta.theta-=angle;};var rotateUp=function rotateUp(angle){sphericalDelta.phi-=angle;};var panLeft=function(){var v=new Vector3();return function(distance,objectMatrix){v.setFromMatrixColumn(objectMatrix,0);// get X column of objectMatrix v.multiplyScalar(-distance);panOffset.add(v);};}();var panUp=function(){var v=new Vector3();return function(distance,objectMatrix){v.setFromMatrixColumn(objectMatrix,1);// get Y column of objectMatrix v.multiplyScalar(distance);panOffset.add(v);};}();// deltaX and deltaY are in pixels; right and down are positive var pan=function(){var offset=new Vector3();return function(deltaX,deltaY){var element=_this.domElement===document?_this.domElement.body:_this.domElement;if(_this.object instanceof PerspectiveCamera){// perspective var position=_this.object.position;offset.copy(position).sub(_this.target);var targetDistance=offset.length();// half of the fov is center to top of screen targetDistance*=Math.tan(_this.object.fov/2*Math.PI/180.0);// we actually don't use screenWidth, since perspective camera is fixed to screen height panLeft(2*deltaX*targetDistance/element.clientHeight,_this.object.matrix);panUp(2*deltaY*targetDistance/element.clientHeight,_this.object.matrix);}else if(_this.object instanceof OrthographicCamera){// orthographic panLeft(deltaX*(_this.object.right-_this.object.left)/_this.object.zoom/element.clientWidth,_this.object.matrix);panUp(deltaY*(_this.object.top-_this.object.bottom)/_this.object.zoom/element.clientHeight,_this.object.matrix);}else{// camera neither orthographic nor perspective console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - pan disabled.');_this.enablePan=false;}};}();var dollyIn=function dollyIn(dollyScale){if(_this.object instanceof PerspectiveCamera)scale/=dollyScale;else if(_this.object instanceof OrthographicCamera){_this.object.zoom=Math.max(_this.minZoom,Math.min(_this.maxZoom,_this.object.zoom*dollyScale));_this.object.updateProjectionMatrix();zoomChanged=true;}else{console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');_this.enableZoom=false;}};var dollyOut=function dollyOut(dollyScale){if(_this.object instanceof PerspectiveCamera)scale*=dollyScale;else if(_this.object instanceof OrthographicCamera){_this.object.zoom=Math.max(_this.minZoom,Math.min(_this.maxZoom,_this.object.zoom/dollyScale));_this.object.updateProjectionMatrix();zoomChanged=true;}else{console.warn('WARNING: OrbitControlsModule.js encountered an unknown camera type - dolly/zoom disabled.');_this.enableZoom=false;}};// // event callbacks - update the object state // var handleMouseDownRotate=function handleMouseDownRotate(event){// console.log( 'handleMouseDownRotate' ); rotateStart.set(event.clientX,event.clientY);};var handleMouseDownDolly=function handleMouseDownDolly(event){// console.log( 'handleMouseDownDolly' ); dollyStart.set(event.clientX,event.clientY);};var handleMouseDownPan=function handleMouseDownPan(event){// console.log( 'handleMouseDownPan' ); panStart.set(event.clientX,event.clientY);};var handleMouseMoveRotate=function handleMouseMoveRotate(event){// console.log( 'handleMouseMoveRotate' ); rotateEnd.set(event.clientX,event.clientY);rotateDelta.subVectors(rotateEnd,rotateStart);var element=_this.domElement===document?_this.domElement.body:_this.domElement;// rotating across whole screen goes 360 degrees around rotateLeft(2*Math.PI*rotateDelta.x/element.clientWidth*_this.rotateSpeed);// rotating up and down along whole screen attempts to go 360, but limited to 180 rotateUp(2*Math.PI*rotateDelta.y/element.clientHeight*_this.rotateSpeed);rotateStart.copy(rotateEnd);_this.update();};var handleMouseMoveDolly=function handleMouseMoveDolly(event){// console.log( 'handleMouseMoveDolly' ); dollyEnd.set(event.clientX,event.clientY);dollyDelta.subVectors(dollyEnd,dollyStart);if(dollyDelta.y>0)dollyIn(getZoomScale());else if(dollyDelta.y<0)dollyOut(getZoomScale());dollyStart.copy(dollyEnd);_this.update();};var handleMouseMovePan=function handleMouseMovePan(event){// console.log( 'handleMouseMovePan' ); panEnd.set(event.clientX,event.clientY);panDelta.subVectors(panEnd,panStart);pan(panDelta.x,panDelta.y);panStart.copy(panEnd);_this.update();};var handleMouseWheel=function handleMouseWheel(event){// console.log( 'handleMouseWheel' ); if(event.deltaY<0)dollyOut(getZoomScale());else if(event.deltaY>0)dollyIn(getZoomScale());_this.update();};var handleKeyDown=function handleKeyDown(event){// console.log( 'handleKeyDown' ); switch(event.keyCode){case _this.keys.UP:pan(0,_this.keyPanSpeed);_this.update();break;case _this.keys.BOTTOM:pan(0,-_this.keyPanSpeed);_this.update();break;case _this.keys.LEFT:pan(_this.keyPanSpeed,0);_this.update();break;case _this.keys.RIGHT:pan(-_this.keyPanSpeed,0);_this.update();break;}};var handleTouchStartRotate=function handleTouchStartRotate(event){// console.log( 'handleTouchStartRotate' ); rotateStart.set(event.touches[0].pageX,event.touches[0].pageY);};var handleTouchStartDolly=function handleTouchStartDolly(event){// console.log( 'handleTouchStartDolly' ); var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;var distance=Math.sqrt(dx*dx+dy*dy);dollyStart.set(0,distance);};var handleTouchStartPan=function handleTouchStartPan(event){// console.log( 'handleTouchStartPan' ); panStart.set(event.touches[0].pageX,event.touches[0].pageY);};var handleTouchMoveRotate=function handleTouchMoveRotate(event){// console.log( 'handleTouchMoveRotate' ); rotateEnd.set(event.touches[0].pageX,event.touches[0].pageY);rotateDelta.subVectors(rotateEnd,rotateStart);var element=_this.domElement===document?_this.domElement.body:_this.domElement;// rotating across whole screen goes 360 degrees around rotateLeft(2*Math.PI*rotateDelta.x/element.clientWidth*_this.rotateSpeed);// rotating up and down along whole screen attempts to go 360, but limited to 180 rotateUp(2*Math.PI*rotateDelta.y/element.clientHeight*_this.rotateSpeed);rotateStart.copy(rotateEnd);_this.update();};var handleTouchMoveDolly=function handleTouchMoveDolly(event){// console.log( 'handleTouchMoveDolly' ); var dx=event.touches[0].pageX-event.touches[1].pageX;var dy=event.touches[0].pageY-event.touches[1].pageY;var distance=Math.sqrt(dx*dx+dy*dy);dollyEnd.set(0,distance);dollyDelta.subVectors(dollyEnd,dollyStart);if(dollyDelta.y>0)dollyOut(getZoomScale());else if(dollyDelta.y<0)dollyIn(getZoomScale());dollyStart.copy(dollyEnd);_this.update();};var handleTouchMovePan=function handleTouchMovePan(event){// console.log( 'handleTouchMovePan' ); panEnd.set(event.touches[0].pageX,event.touches[0].pageY);panDelta.subVectors(panEnd,panStart);pan(panDelta.x,panDelta.y);panStart.copy(panEnd);_this.update();};// event handlers - FSM: listen for events and reset state // var onMouseDown=function onMouseDown(event){if(_this.enabled===false)return;event.preventDefault();if(event.button===_this.mouseButtons.ORBIT){if(_this.enableRotate===false)return;handleMouseDownRotate(event);state=STATE.ROTATE;}else if(event.button===_this.mouseButtons.ZOOM){if(_this.enableZoom===false)return;handleMouseDownDolly(event);state=STATE.DOLLY;}else if(event.button===_this.mouseButtons.PAN){if(_this.enablePan===false)return;handleMouseDownPan(event);state=STATE.PAN;}if(state!==STATE.NONE){_this.eventHandler.on('mousemove',onMouseMove,false);_this.eventHandler.on('mouseup',onMouseUp,false);_this.dispatchEvent(startEvent);}};var onMouseMove=function onMouseMove(event){if(_this.enabled===false)return;event.preventDefault();if(state===STATE.ROTATE){if(_this.enableRotate===false)return;handleMouseMoveRotate(event);}else if(state===STATE.DOLLY){if(_this.enableZoom===false)return;handleMouseMoveDolly(event);}else if(state===STATE.PAN){if(_this.enablePan===false)return;handleMouseMovePan(event);}};var onMouseUp=function onMouseUp(event){if(_this.enabled===false)return;document.removeEventListener('mousemove',onMouseMove,false);document.removeEventListener('mouseup',onMouseUp,false);_this.dispatchEvent(endEvent);state=STATE.NONE;};var onMouseWheel=function onMouseWheel(event){if(_this.enabled===false||_this.enableZoom===false||state!==STATE.NONE&&state!==STATE.ROTATE)return;event.preventDefault();event.stopPropagation();handleMouseWheel(event);_this.dispatchEvent(startEvent);// not sure why these are here... _this.dispatchEvent(endEvent);};var onKeyDown=function onKeyDown(event){if(_this.enabled===false||_this.enableKeys===false||_this.enablePan===false)return;handleKeyDown(event);};var onTouchStart=function onTouchStart(event){if(_this.enabled===false)return;switch(event.touches.length){case 1:// one-fingered touch: rotate if(_this.enableRotate===false)return;handleTouchStartRotate(event);state=STATE.TOUCH_ROTATE;break;case 2:// two-fingered touch: dolly if(_this.enableZoom===false)return;handleTouchStartDolly(event);state=STATE.TOUCH_DOLLY;break;case 3:// three-fingered touch: pan if(_this.enablePan===false)return;handleTouchStartPan(event);state=STATE.TOUCH_PAN;break;default:state=STATE.NONE;}if(state!==STATE.NONE)_this.dispatchEvent(startEvent);};var onTouchMove=function onTouchMove(event){if(_this.enabled===false)return;event.preventDefault();event.stopPropagation();switch(event.touches.length){case 1:// one-fingered touch: rotate if(_this.enableRotate===false)return;if(state!==STATE.TOUCH_ROTATE)return;// is this needed?... handleTouchMoveRotate(event);break;case 2:// two-fingered touch: dolly if(_this.enableZoom===false)return;if(state!==STATE.TOUCH_DOLLY)return;// is this needed?... handleTouchMoveDolly(event);break;case 3:// three-fingered touch: pan if(_this.enablePan===false)return;if(state!==STATE.TOUCH_PAN)return;// is this needed?... handleTouchMovePan(event);break;default:state=STATE.NONE;}};var onTouchEnd=function onTouchEnd(event){if(_this.enabled===false)return;_this.dispatchEvent(endEvent);state=STATE.NONE;};var onContextMenu=function onContextMenu(event){event.preventDefault();};// _this.eventHandler.on('contextmenu',onContextMenu,false);_this.eventHandler.on('mousedown',onMouseDown,false);_this.eventHandler.on('wheel',onMouseWheel,false);_this.eventHandler.on('touchstart',onTouchStart,false);_this.eventHandler.on('touchend',onTouchEnd,false);_this.eventHandler.on('touchmove',onTouchMove,false);_this.eventHandler.on('keydown',onKeyDown,false);// force an update at start _this.update();return _this;}createClass(ThreeOrbitControls,[{key:"center",get:function get(){console.warn('OrbitControls: .center has been renamed to .target');return this.target;}},{key:"noZoom",get:function get(){console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');return !this.enableZoom;},set:function set(value){console.warn('OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.');this.enableZoom=!value;}},{key:"noRotate",get:function get(){console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');return !this.enableRotate;},set:function set(value){console.warn('OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.');this.enableRotate=!value;}},{key:"noPan",get:function get(){console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');return !this.enablePan;},set:function set(value){console.warn('OrbitControls: .noPan has been deprecated. Use .enablePan instead.');this.enablePan=!value;}},{key:"noKeys",get:function get(){console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');return !this.enableKeys;},set:function set(value){console.warn('OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.');this.enableKeys=!value;}},{key:"staticMoving",get:function get(){console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');return !this.enableDamping;},set:function set(value){console.warn('OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.');this.enableDamping=!value;}},{key:"dynamicDampingFactor",get:function get(){console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');return this.dampingFactor;},set:function set(value){console.warn('OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.');this.dampingFactor=value;}}]);inherits(ThreeOrbitControls,_EventDispatcher);return ThreeOrbitControls;}(EventDispatcher);/** * @class OrbitControlsModule * @category modules/app * @param {Object} [params] * @param {Object} [params.object=camera] Object to which controls are applied. * @param {THREE.Vector3} [params.target=new Vector3()] Controls center vector. * @param {Boolean} [params.follow=false] Follow the target * @memberof module:modules/app * @example Creating a rendering module and passing it to App's modules * new App([ * new ElementModule(), * new SceneModule(), * new DefineModule('camera', new WHS.PerspectiveCamera({ * position: new THREE.Vector3(0, 6, 18), * far: 10000 * })), * new RenderingModule(), * new OrbitControlsModule() * ]); */var OrbitControlsModule=/*#__PURE__*/function(_ControlsModule){function OrbitControlsModule(){var _this;var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,OrbitControlsModule);_this=possibleConstructorReturn(this,getPrototypeOf$2(OrbitControlsModule).call(this,params));_this.params=Object.assign({follow:false,object:null,target:new Vector3()},params);return _this;}createClass(OrbitControlsModule,[{key:"manager",value:function manager(_manager){get$3(getPrototypeOf$2(OrbitControlsModule.prototype),"manager",this).call(this,_manager);var _this$params=this.params,obj=_this$params.object,follow=_this$params.follow,target=_this$params.target;var object=obj?obj.native:_manager.get('camera').native;var controls=new ThreeOrbitControls(object,_manager.get('element'),_manager.handler);var updateProcessor=follow?function(c){controls.update(c.getDelta());controls.target.copy(target);}:function(c){controls.update(c.getDelta());};this.setControls(controls);this.setUpdate(updateProcessor);_manager.update({camera:function camera(_camera){if(obj)return;controls.object=_camera.native;},element:function element(_element){controls.domElement=_element;}});controls.target.copy(target);}}]);inherits(OrbitControlsModule,_ControlsModule);return OrbitControlsModule;}(ControlsModule);/** @module modules/app/controls */ /** @module modules/app */ /** * @class DynamicGeometryModule * @category modules/mesh * @param {Object} [params={attributes: false}] - params * @param {Boolean} [patchEvents=true] * @memberof module:modules/mesh */var DynamicGeometryModule=/*#__PURE__*/function(){function DynamicGeometryModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,DynamicGeometryModule);this.params=Object.assign({attributes:false},params);}createClass(DynamicGeometryModule,[{key:"integrate",value:function integrate(self){var _this=this;var params=self.params;this.g_=function(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};if(this.buildGeometry){this.native.geometry=this.buildGeometry(this.updateParams({geometry:params}));}};if(params.attributes){var _loop=function _loop(key){if(key){Object.defineProperty(_this,"g_".concat(key),{get:function get(){return this.native.geometry.parameters[key];},set:function set(value){this.native.geometry=this.buildGeometry(this.updateParams({geometry:defineProperty$3({},key,value)}));},configurable:true,enumerable:true});}};for(var key in this.params.geometry){_loop(key);}}}}]);return DynamicGeometryModule;}();var loader=new TextureLoader();/** * @class TextureModule * @category modules/mesh * @description A TextureModule can be applied to any Mesh or Model. * @param {Array} [textures] - array of texture objects * @memberof module:modules/mesh * @example Creating an instance. url takes a path, or a data object. * var woodTexture = new TextureModule({ * url: `${process.assetsPath}/textures/wood.jpg` * }); * @example More comprehensive example, wood texture applied to a Box. * new Box({ * geometry: { * width: 2, * height: 2, * depth: 2 * }, * modules: [ * new TextureModule({ * url: `path/to/texture.jpg`, * repeat: new THREE.Vector2(1, 1) // optional * }) * ], * material: new THREE.MeshBasicMaterial({ * color: 0xffffff * }), * position: [50, 60, 70] * }).addTo(app); */var TextureModule=/*#__PURE__*/function(){createClass(TextureModule,null,[{key:"load",value:function load(url){return new TextureModule({url:url}).textures[0][1];}}]);function TextureModule(){var _this=this;classCallCheck(this,TextureModule);defineProperty$3(defineProperty$3(this,"textures",[]),"bridge",{material:function material(_material,self){self.textures.forEach(function(texture){_material[texture[0]]=texture[1];});_material.needsUpdate=true;return _material;}});for(var _len=arguments.length,textures=new Array(_len),_key=0;_key<_len;_key++){textures[_key]=arguments[_key];}textures.forEach(function(_ref){var url=_ref.url,_ref$type=_ref.type,type=_ref$type===void 0?'map':_ref$type,_ref$offset=_ref.offset,offset=_ref$offset===void 0?new Vector2(0,0):_ref$offset,_ref$repeat=_ref.repeat,repeat=_ref$repeat===void 0?new Vector2(1,1):_ref$repeat,_ref$wrap=_ref.wrap,wrap=_ref$wrap===void 0?RepeatWrapping:_ref$wrap,_ref$mapping=_ref.mapping,mapping=_ref$mapping===void 0?UVMapping:_ref$mapping,_ref$fix=_ref.fix,fix=_ref$fix===void 0?function(tex){return tex;}:_ref$fix;var texture=loader.load(url);if(wrap.length>0){texture.wrapS=wrap[0];texture.wrapT=wrap[1];}else texture.wrapS=texture.wrapT=wrap;texture.mapping=mapping;texture.offset.copy(offset);texture.repeat.copy(repeat);texture.magFilter=NearestFilter;texture.minFilter=LinearMipMapLinearFilter;_this.textures.push([type,fix(texture)]);});}return TextureModule;}();/** * @class AnimationModule * @category modules/mesh * @description Convenience module that wraps the three.js animation system * @param {App} app - the app * @param {Boolean} [isDeferred=false] - set to true if animation should not start automatically * @param {Object} [params={speed: 1}] - the params * @memberof module:modules/mesh * @example Create animation module and play a given clip of an imported model * const animationModule = new AnimationModule(app, false, { * speed: 1.2 // speed up animation by 20% * }); * * new Importer({ * parser(geometry, materials) { * // Override parse to generate a skinnedMesh, needed for skinned models * return new THREE.SkinnedMesh(geometry, materials); * }, * * url: `path/to/model.json`, * useCustomMaterial: true, * * material: new THREE.MeshStandardMaterial({ * skinning: true * }), * * modules: [animationModule] * }).addTo(app).then(() => { * // adding model to app returns a promise, so pipe the function to kick off the animation clip * animationModule.play('clipName'); * }); */var AnimationModule=/*#__PURE__*/function(){function AnimationModule(app,isDeferred){var params=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};classCallCheck(this,AnimationModule);defineProperty$3(this,"bridge",{mesh:function mesh(_mesh,self){_mesh.geometry.skeleton=_mesh.skeleton;self.mixer=new AnimationMixer(_mesh.geometry);self.clips=_mesh.geometry.animations;return _mesh;}});this.params=Object.assign({speed:1},params);this.clock=new Clock();this.app=app;this.isDeferred=isDeferred;}/** * @method play * @instance * @description Plays the given clip name * @param {String} clipName - the clip to play * @return {THREE.AnimationAction} Playing action * @memberof module:modules/mesh.AnimationModule */createClass(AnimationModule,[{key:"play",value:function play(clipName){var clip=AnimationClip.findByName(this.clips,clipName);return this.mixer.clipAction(clip).play();}/** * @method update * @instance * @description Update the mixer (being called on frame animation loop) * @memberof module:modules/mesh.AnimationModule */},{key:"update",value:function update(){if(this.mixer)this.mixer.update(this.clock.getDelta()*this.params.speed);}},{key:"integrate",value:function integrate(self){self.loop=new Loop(function(){self.update();});if(!self.isDeferred)self.loop.start(self.app);}},{key:"manager",value:function manager(_manager){_manager.define('animation');}}]);return AnimationModule;}();/** @module modules/mesh */ /** * @class DefineModule * @category modules * @param {String} name * @param {Object} data * @memberof module:modules * @example Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules * new App([ * // ... * new DefineModule('camera', new PerspectiveCamera()) * ]); */var DefineModule=/*#__PURE__*/function(){function DefineModule(name,data){classCallCheck(this,DefineModule);this.name=name;this.data=data;}createClass(DefineModule,[{key:"manager",value:function manager(_manager){_manager.set(this.name,this.data);}}]);return DefineModule;}();/** @module modules */var Model=/*#__PURE__*/function(_Importer){function Model(params){var _getPrototypeOf2;classCallCheck(this,Model);console.warn('Model is deprecated. Use Importer instead.');if(params.geometry){params.url=params.geometry.path;params.loader=params.geometry.loader;}for(var _len=arguments.length,additional=new Array(_len>1?_len-1:0),_key=1;_key<_len;_key++){additional[_key-1]=arguments[_key];}return possibleConstructorReturn(this,(_getPrototypeOf2=getPrototypeOf$2(Model)).call.apply(_getPrototypeOf2,[this,params].concat(additional)));}inherits(Model,_Importer);return Model;}(Importer);var CameraModule=/*#__PURE__*/function(){function CameraModule(){var params=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};classCallCheck(this,CameraModule);console.warn('CameraModule is deprecated. Use DefineModule instead.');this.camera=new PerspectiveCamera$1(params);}createClass(CameraModule,[{key:"integrate",value:function integrate(self){this.add(self.camera);}},{key:"manager",value:function manager(_manager){_manager.set('camera',this.camera);}}]);return CameraModule;}(); var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function createCommonjsModule$1(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports; } var stats_min = createCommonjsModule$1(function (module, exports) { // stats.js - http://github.com/mrdoob/stats.js (function(f,e){module.exports=e();})(commonjsGlobal,function(){var f=function(){function e(a){c.appendChild(a.dom);return a}function u(a){for(var d=0;dg+1E3&&(r.update(1E3*a/(c-g),100),g=c,a=0,t)){var d=performance.memory;t.update(d.usedJSHeapSize/ 1048576,d.jsHeapSizeLimit/1048576);}return c},update:function(){k=this.end();},domElement:c,setMode:u}};f.Panel=function(e,f,l){var c=Infinity,k=0,g=Math.round,a=g(window.devicePixelRatio||1),r=80*a,h=48*a,t=3*a,v=2*a,d=3*a,m=15*a,n=74*a,p=30*a,q=document.createElement("canvas");q.width=r;q.height=h;q.style.cssText="width:80px;height:48px";var b=q.getContext("2d");b.font="bold "+9*a+"px Helvetica,Arial,sans-serif";b.textBaseline="top";b.fillStyle=l;b.fillRect(0,0,r,h);b.fillStyle=f;b.fillText(e,t,v); b.fillRect(d,m,n,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d,m,n,p);return {dom:q,update:function(h,w){c=Math.min(c,h);k=Math.max(k,h);b.fillStyle=l;b.globalAlpha=1;b.fillRect(0,0,r,m);b.fillStyle=f;b.fillText(g(h)+" "+e+" ("+g(c)+"-"+g(k)+")",t,v);b.drawImage(q,d+a,m,n-a,p,d,m,n-a,p);b.fillRect(d+n-a,m,a,p);b.fillStyle=l;b.globalAlpha=.9;b.fillRect(d+n-a,m,a,g((1-h/w)*p));}}};return f}); }); var StatsModule = /*#__PURE__*/ function () { function StatsModule() { var code = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; _classCallCheck(this, StatsModule); this.stats = new stats_min(); this.stats.showPanel(code); } _createClass(StatsModule, [{ key: "manager", value: function manager(_manager) { _manager.get('container').appendChild(this.stats.dom); _manager.add('stats', this.stats, { alias: '$stats' }); } }, { key: "integrate", value: function integrate(self) { var stats = self.stats; var preProcess = new Loop(function () { return stats.begin(); }); var postProcess = new Loop(function () { return stats.end(); }); this.loops.unshift(preProcess); this.loops.push(postProcess); // Patch method self.addLoop = function (loop) { var _this = this; return new Promise(function (resolve) { if (_this.loops[_this.loops.length - 1] === postProcess) _this.loops.pop(); _this.loops.push(loop); _this.loops.push(postProcess); resolve(loop); }); }; preProcess.start(); postProcess.start(); } }]); return StatsModule; }(); _defineProperty(StatsModule, "codes", { fps: 0, ms: 1, mb: 2, custom: 3 }); return StatsModule; }))); //# sourceMappingURL=StatsModule.js.map