@smoud/tiny
Version:
Fast and tiny JavaScript library for HTML5 game and playable ads creation.
1 lines • 11 kB
JavaScript
!function(){"use strict";var e=new RegExp("[\\[\\]\\.:\\/]",'g');function t(){this.dracoLoader=null}function n(){var e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}t.prototype=Object.assign({},{constructor:t,setDRACOLoader:function(e){return this.dracoLoader=e,this},parse:function(e,t,n,r){var i=e,s=JSON.parse(i);void 0===s.asset||s.asset.version[0]<2?r&&r(new Error('Tiny.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.')):new g(s,{},{path:t||this.resourcePath||'',crossOrigin:this.crossOrigin,manager:this.manager}).parse(n,r)}});var r='KHR_draco_mesh_compression';var i=0,s=1,o=2,a=3,c=4,h=5,f=6,u={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},d=(Tiny.NearestFilter,Tiny.LinearFilter,Tiny.NearestMipmapNearestFilter,Tiny.LinearMipmapNearestFilter,Tiny.NearestMipmapLinearFilter,Tiny.LinearMipmapLinearFilter,{SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16}),p={POSITION:'position',NORMAL:'normal',TANGENT:'tangent',TEXCOORD_0:'uv',TEXCOORD_1:'uv2',COLOR_0:'color',WEIGHTS_0:'skinWeight',JOINTS_0:'skinIndex'};Tiny.InterpolateLinear,Tiny.InterpolateDiscrete;function l(e,t,n){for(var r in n.extensions)void 0===e[r]&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[r]=n.extensions[r])}function m(e,t){void 0!==t.extras&&'object'==typeof t.extras&&Object.assign(e.userData,t.extras)}function y(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(var n=0,r=t.weights.length;n<r;n++)e.morphTargetInfluences[n]=t.weights[n];if(t.extras&&Array.isArray(t.extras.targetNames)){var i=t.extras.targetNames;if(e.morphTargetInfluences.length===i.length){e.morphTargetDictionary={};for(n=0,r=i.length;n<r;n++)e.morphTargetDictionary[i[n]]=n}}}function v(e){for(var t='',n=Object.keys(e).sort(),r=0,i=n.length;r<i;r++)t+=n[r]+':'+e[n[r]]+';';return t}function g(e,t,r){this.json=e||{},this.extensions=t||{},this.options=r||{},this.cache=new n,this.primitiveCache={}}function T(e,t,n){var r=t.attributes;function i(t,r){var i=n.getDependency('accessor',t);e.setAttribute(r,i)}for(var s in r){var o=p[s]||s.toLowerCase();o in e.attributes||i(r[s],o)}if(void 0!==t.indices&&!e.index){var a=n.getDependency('accessor',t.indices);e.setIndex(a)}return m(e,t),void 0!==t.targets?function(e,t,n){for(var r=!1,i=!1,s=0,o=t.length;s<o&&(void 0!==(h=t[s]).POSITION&&(r=!0),void 0!==h.NORMAL&&(i=!0),!r||!i);s++);var a=[],c=[];for(s=0,o=t.length;s<o;s++){var h=t[s];if(r){var f=void 0!==h.POSITION?n.getDependency('accessor',h.POSITION):e.attributes.position;a.push(f)}i&&(f=void 0!==h.NORMAL?n.getDependency('accessor',h.NORMAL):e.attributes.normal,c.push(f))}}(e,t.targets,n):e}function b(e,t){var n=e.getIndex();if(null===n){var r=[],i=e.getAttribute('position');if(void 0===i)return e;for(var s=0;s<i.count;s++)r.push(s);e.setIndex(r),n=e.getIndex()}var o=n.count-2,a=[];if(t===Tiny.TriangleFanDrawMode)for(s=1;s<=o;s++)a.push(n.getX(0)),a.push(n.getX(s)),a.push(n.getX(s+1));else for(s=0;s<o;s++)s%2==0?(a.push(n.getX(s)),a.push(n.getX(s+1)),a.push(n.getX(s+2))):(a.push(n.getX(s+2)),a.push(n.getX(s+1)),a.push(n.getX(s)));a.length;var c=e.clone();return c.setIndex(a),c}g.prototype.parse=function(e,t){var n=this.json,r=this.extensions;this.cache.removeAll(),this.markDefs();var i=[this.getDependencies('scene'),this.getDependencies('animation')],s={scene:i[0][n.scene||0],scenes:i[0],animations:i[1],asset:n.asset,parser:this,userData:{}};l(r,s,n),m(s,n),e(s)},g.prototype.markDefs=function(){for(var e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[],r={},i={},s=0,o=t.length;s<o;s++)for(var a=t[s].joints,c=0,h=a.length;c<h;c++)e[a[c]].isBone=!0;for(var f=0,u=e.length;f<u;f++){var d=e[f];void 0!==d.mesh&&(void 0===r[d.mesh]&&(r[d.mesh]=i[d.mesh]=0),r[d.mesh]++,void 0!==d.skin&&(n[d.mesh].isSkinnedMesh=!0))}this.json.meshReferences=r,this.json.meshUses=i},g.prototype.getDependency=function(e,t){var n=e+':'+t,r=this.cache.get(n);if(!r){switch(e){case'scene':r=this.loadScene(t);break;case'node':r=this.loadNode(t);break;case'mesh':r=this.loadMesh(t);break;case'accessor':r=this.loadAccessor(t);break;case'bufferView':r=this.loadBufferView(t);break;case'buffer':r=this.loadBuffer(t);break;case'skin':r=this.loadSkin(t);break;case'animation':r=this.loadAnimation(t);break;default:throw new Error('Unknown type: '+e)}this.cache.add(n,r)}return r},g.prototype.getDependencies=function(e){var t=this.cache.get(e);if(!t){var n=this;t=(this.json[e+('mesh'===e?'es':'s')]||[]).map((function(t,r){return n.getDependency(e,r)})),this.cache.add(e,t)}return t},g.prototype.loadBuffer=function(e){var t=this.json.buffers[e];if(t.type&&'arraybuffer'!==t.type)throw new Error('Tiny.GLTFLoader: '+t.type+' buffer type is not supported.');return function(e){var t=e.match(/^data:(.*?)(;base64)?,(.*)$/);if(t){var n=t[3];n=decodeURIComponent(n),n=atob(n);for(var r=new Uint8Array(n.length),i=0;i<n.length;i++)r[i]=n.charCodeAt(i);return r.buffer}throw new Error("Data isn't a base64 format")}(t.uri)},g.prototype.loadBufferView=function(e){var t=this.json.bufferViews[e],n=this.getDependency('buffer',t.buffer),r=t.byteLength||0,i=t.byteOffset||0;return n.slice(i,i+r)},g.prototype.loadAccessor=function(e){var t=this.json,n=this.json.accessors[e];if(void 0===n.bufferView&&void 0===n.sparse)return null;var r=[];void 0!==n.bufferView?r.push(this.getDependency('bufferView',n.bufferView)):r.push(null),void 0!==n.sparse&&(r.push(this.getDependency('bufferView',n.sparse.indices.bufferView)),r.push(this.getDependency('bufferView',n.sparse.values.bufferView)));var i,s,o=r[0],a=d[n.type],c=u[n.componentType],h=c.BYTES_PER_ELEMENT,f=h*a,p=n.byteOffset||0,l=void 0!==n.bufferView?t.bufferViews[n.bufferView].byteStride:void 0,m=!0===n.normalized;if(l&&l!==f){var y=Math.floor(p/l),v='InterleavedBuffer:'+n.bufferView+':'+n.componentType+':'+y+':'+n.count,g=this.cache.get(v);g||(i=new c(o,y*l,n.count*l/h),g=new Tiny.InterleavedBuffer(i,l/h),this.cache.add(v,g)),s=new Tiny.InterleavedBufferAttribute(g,a,p%l/h,m)}else i=null===o?new c(n.count*a):new c(o,p,n.count*a),s=new Tiny.Attribute(i,a,m);if(void 0!==n.sparse){var T=d.SCALAR,b=u[n.sparse.indices.componentType],w=n.sparse.indices.byteOffset||0,A=n.sparse.values.byteOffset||0,M=new b(r[1],w,n.sparse.count*T),L=new c(r[2],A,n.sparse.count*a);null!==o&&(s=new Tiny.Attribute(s.array.slice(),s.itemSize,s.normalized));for(var D=0,x=M.length;D<x;D++){var O=M[D];if(s.setX(O,L[D*a]),a>=2&&s.setY(O,L[D*a+1]),a>=3&&s.setZ(O,L[D*a+2]),a>=4&&s.setW(O,L[D*a+3]),a>=5)throw new Error('Tiny.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.')}}return s},g.prototype.assignFinalMaterial=function(e){var t=e.geometry,n=e.material;this.extensions,t.attributes.tangent,t.attributes.color,t.attributes.normal,e.isSkinnedMesh,e.geometry.morphAttributes&&Object.keys(t.morphAttributes).length>0&&t.morphAttributes.normal;if(e.isPoints){var r='PointsMaterial:'+n.uuid,i=this.cache.get(r);i||(i=new Tiny.PointsMaterial,Tiny.Material.prototype.copy.call(i,n),i.color.copy(n.color),i.map=n.map,i.sizeAttenuation=!1,this.cache.add(r,i)),n=i}else if(e.isLine){r='LineBasicMaterial:'+n.uuid;var s=this.cache.get(r);s||(s=new Tiny.LineBasicMaterial,Tiny.Material.prototype.copy.call(s,n),s.color.copy(n.color),this.cache.add(r,s)),n=s}e.material=n},g.prototype.loadGeometries=function(e){var t=this,n=this.extensions,i=this.primitiveCache;function s(e){return n[r].decodePrimitive(e,t).then((function(n){return T(n,e,t)}))}for(var o,a,c=[],h=0,f=e.length;h<f;h++){var u,d=e[h],p=(a=void 0,(a=(o=d).extensions&&o.extensions[r])?'draco:'+a.bufferView+':'+a.indices+':'+v(a.attributes):o.indices+':'+v(o.attributes)+':'+o.mode),l=i[p];if(l)c.push(l.geometry);else u=d.extensions&&d.extensions[r]?s(d):T(new Tiny.Geometry,d,t),i[p]={primitive:d,geometry:u},c.push(u)}return c},g.prototype.loadMesh=function(e){for(var t,n,r=this.json.meshes[e],u=r.primitives,d=[],p=0,l=u.length;p<l;p++){var v=(void 0===(n=this.cache).DefaultMaterial&&(n.DefaultMaterial=new Tiny.MeshLambertMaterial),n.DefaultMaterial);d.push(v)}var g=[];for(p=0,l=(t=this.loadGeometries(u)).length;p<l;p++){var T,w=t[p],A=u[p];v=d[p];if(A.mode===c||A.mode===h||A.mode===f||void 0===A.mode)!0!==(T=!0===r.isSkinnedMesh?new Tiny.SkinnedMesh(w,v):new Tiny.Mesh(w,v)).isSkinnedMesh||T.geometry.attributes.skinWeight.normalized||T.normalizeSkinWeights(),A.mode===h?T.geometry=b(T.geometry,Tiny.TriangleStripDrawMode):A.mode===f&&(T.geometry=b(T.geometry,Tiny.TriangleFanDrawMode));else if(A.mode===s)T=new Tiny.LineSegments(w,v);else if(A.mode===a)T=new Tiny.Line(w,v);else if(A.mode===o)T=new Tiny.LineLoop(w,v);else{if(A.mode!==i)throw new Error('Tiny.GLTFLoader: Primitive mode unsupported: '+A.mode);T=new Tiny.Points(w,v)}T.geometry.morphAttributes&&Object.keys(T.geometry.morphAttributes).length>0&&y(T,r),T.name=r.name||'mesh_'+e,t.length>1&&(T.name+='_'+p),m(T,r),this.assignFinalMaterial(T),g.push(T)}if(1===g.length)return g[0];var M=new Tiny.Object3D;for(p=0,l=g.length;p<l;p++)M.add(g[p]);return M},g.prototype.loadSkin=function(e){},g.prototype.loadAnimation=function(e){},g.prototype.loadNode=function(t){var n,r=this.json,i=this.extensions,s=r.meshReferences,o=r.meshUses,a=r.nodes[t];if(void 0!==a.mesh){var c=this.getDependency('mesh',a.mesh);if(s[a.mesh]>1){var h=o[a.mesh]++;(n=c.clone()).name+='_instance_'+h,n.onBeforeRender=c.onBeforeRender;for(var f=0,u=n.children.length;f<u;f++)n.children[f].name+='_instance_'+h,n.children[f].onBeforeRender=c.children[f].onBeforeRender}else n=c;void 0!==a.weights&&n.traverse((function(e){if(e.isMesh)for(var t=0,n=a.weights.length;t<n;t++)e.morphTargetInfluences[t]=a.weights[t]}))}if(!0===a.isBone?n=new Tiny.Bone:n||(n=new Tiny.Object3D),void 0!==a.name&&(n.name=a.name.replace(/\s/g,'_').replace(e,'')),m(n,a),a.extensions&&l(i,n,a),void 0!==a.matrix){var d=new Tiny.Matrix4;d.fromArray(a.matrix),n.applyMatrix(d)}else void 0!==a.translation&&n.position.fromArray(a.translation),void 0!==a.rotation&&n.quaternion.fromArray(a.rotation),void 0!==a.scale&&n.scale.fromArray(a.scale);return n},g.prototype.loadScene=function(){function e(t,n,r,i){var s=r.nodes[t],o=i.getDependency('node',t);if(s.skin,n.add(o),s.children)for(var a=s.children,c=0,h=a.length;c<h;c++){e(a[c],o,r,i)}return o}return function(t){var n=this.json,r=this.extensions,i=this.json.scenes[t],s=new Tiny.Object3D;void 0!==i.name&&(s.name=i.name),m(s,i),i.extensions&&l(r,s,i);for(var o=i.nodes||[],a=0,c=o.length;a<c;a++)e(o[a],s,n,this);return s}}();const w=new t;Tiny.Cache.gltf={},Tiny.Loader.prototype.gltf=function(e,t,n,r){this.list.push({key:e,src:t,type:'gltf',split:n,cb:r})},Tiny.Loader.gltf=function(e,t){var n=e.key;w.parse(e.src,'',(function(r){if(Tiny.Cache.gltf[n]=r,e.split){r.scene.traverse((function(e){e.isMesh&&(Tiny.Cache.mesh3d[n+'.'+e.name]=e)}));for(var i=0;i<r.animations.length;i++){var s=r.animations[i];Tiny.Cache.animation3d[n+'.'+s.name]=s}}e.cb&&e.cb(r),t()}))},Tiny.GLTFLoader=t}();