@tresjs/core 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/tres.umd.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * name: @tresjs/core
3
- * version: v1.7.0
3
+ * version: v1.8.1
4
4
  * (c) 2023
5
5
  * description: Declarative ThreeJS using Vue Components
6
6
  * author: Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)
7
7
  */
8
- (function(h,o){typeof exports=="object"&&typeof module<"u"?o(exports,require("vue"),require("@vueuse/core"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","three"],o):(h=typeof globalThis<"u"?globalThis:h||self,o(h.tres={},h.Vue,h.VueUseCore,h.Three))})(this,function(h,o,f,p){"use strict";function ge(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const a=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,a.get?a:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const te=ge(p);var ne=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(ne||{});const B={cameras:[]},he=45;let x;function K(){const{state:e,setState:t}=U();function r(g="Perspective",n){var i;if(g==="Perspective"){const{near:l,far:s,fov:u}=n||{near:.1,far:1e3,fov:he};x=new p.PerspectiveCamera(u,((i=e.aspectRatio)==null?void 0:i.value)||1,l,s),B.cameras.push(x)}else{const{left:l,right:s,top:u,bottom:m,near:P,far:y}=n||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};x=new p.OrthographicCamera(l,s,u,m,P,y),B.cameras.push(x)}return B.cameras.push(x),x}const a=o.computed(()=>B.cameras[0]);t("camera",a);function c(){a.value instanceof p.PerspectiveCamera&&e.aspectRatio&&(a.value.aspect=e.aspectRatio.value),a.value.updateProjectionMatrix()}function d(g){B.cameras.push(g),g instanceof p.PerspectiveCamera&&e.aspectRatio&&(g.aspect=e.aspectRatio.value),g.updateProjectionMatrix()}return e.aspectRatio&&o.watch(e.aspectRatio,c),{activeCamera:a,createCamera:r,updateCamera:c,pushCamera:d}}const re="[TresJS ▲ ■ ●] ";function I(){function e(a,c){console.error(`${re} ${a}`,c||"")}function t(a){console.warn(`${re} ${a}`)}function r(a,c){}return{logError:e,logWarning:t,logMessage:r}}const $=o.ref({...te,uuid:te.MathUtils.generateUUID()});delete $.value.Scene;let A;function J(e,t="Tres"){const{logError:r}=I();!A&&e&&(A=e);const{createComponentInstances:a}=X(t);return{extend:d=>{if(!d){r("No objects provided to extend catalogue");return}$.value=Object.assign($.value,d);const g=a(o.ref(d));A&&g.forEach(([n,i])=>{A._context.components[n]||A.component(n,i)})},catalogue:$}}const k=e=>typeof e<"u",we=e=>typeof e=="function",z=e=>!!e&&e.constructor===Array;function ye(e){return typeof e=="number"?[e,e,e]:e instanceof p.Vector3?[e.x,e.y,e.z]:e}function ve(e){return e instanceof p.Color?e:Array.isArray(e)?new p.Color(...e):new p.Color(e)}const Ce=["rotation","scale","position"];function X(e){const{logError:t}=I();function r(n,i){k(n)&&k(i)&&Object.entries(n).forEach(([l,s])=>{const u=l.replace(/(-\w)/g,m=>m[1].toUpperCase());i.setAttribute(u,new p.BufferAttribute(...s))})}function a(n,i){k(n)&&k(i)&&Object.entries(n).forEach(([l,s])=>{const u=l.replace(/(-\w)/g,m=>m[1].toUpperCase());if(!(u==="args"||s===void 0)){Ce.includes(u)&&s&&(s=ye(s)),n.ref&&(n.ref=i);try{if(i[u]&&k(i[u].set))i[u].set(...z(s)?s:[s]);else{if(s===""&&(s=!0),we(i[u])){if(l==="center"&&!s)return;i[u](...z(s)?s:[s]);return}i[u]=s}}catch(m){t(`There was an error setting ${u} property`,m)}}})}function c(n){var s,u;const i=/^Symbol\(Fragment\)$/g,l=/^Symbol\(Text\)$/g;if(i.test(n.type.toString()))return n.children.map(m=>c(m));if(l.test(n.type.toString()))return;{const m=n.type.name.replace(e,""),{catalogue:P}=J(),y=o.inject("catalogue")||P;let v;if(y)if((s=n.children)!=null&&s.default){const L=n.children.default().map(D=>c(D));v=new y.value[m](...L.flat().filter(Boolean))}else(u=n==null?void 0:n.props)!=null&&u.args?y!=null&&y.value[m]?v=new y.value[m](...n.props.args):t(`There is no ${m} in the catalogue`,y==null?void 0:y.value.uuid):v=new y.value[m];return n!=null&&n.props&&(m==="BufferGeometry"?r(n.props,v):a(n.props,v)),v}}function d(n,i,l){if(l.default&&(l!=null&&l.default())){const s=l.default().map(u=>c(u));if(n.name==="Group"){const u=new n;return s.forEach(m=>{u.add(m)}),u}else return new n(...s.flat().filter(Boolean))}else return i.args?new n(...i.args):new n}function g(n){return Object.entries(n.value).filter(([i,l])=>{var s,u;return(u=(s=l==null?void 0:l.prototype)==null?void 0:s.constructor)==null?void 0:u.toString().includes("class")}).map(([i,l])=>{const s=`${e}${i}`,u=o.defineComponent({name:s,setup(m,{slots:P,attrs:y,...v}){const{state:L}=U(),{onLoop:D}=V(),C=L.scene,W=L.raycaster,{pushCamera:O}=K();let S=d(l,y,P);a(y,S),(S instanceof p.PerspectiveCamera||S instanceof p.OrthographicCamera)&&O(S),S.isObject3D&&(C==null||C.add(S));let b=null,M=null;if(S instanceof p.Mesh){D(()=>{if(S&&W&&(C!=null&&C.children)){const q=W.intersectObjects(C==null?void 0:C.children);q.length>0?(M=q[0],(b===null||b.object.uuid!==(M==null?void 0:M.object.uuid))&&v.emit("pointer-enter",M),v.emit("pointer-move",M)):(M=null,b!==null&&v.emit("pointer-leave",b)),b=M}});const G=f.useEventListener(window,"click",()=>{v.emit("click",b)});o.onUnmounted(()=>{G()})}return C&&S instanceof p.Fog&&(C.fog=S),v.expose(S),()=>{}}});return[s,u]})}return{createComponentInstances:g,processProps:a,createInstanceFromVNode:c}}const ae=f.createEventHook(),oe=f.createEventHook(),Y=f.createEventHook(),_=new p.Clock;let N=0,R=0;const{pause:Se,resume:Me,isActive:Pe}=f.useRafFn(()=>{ae.trigger({delta:N,elapsed:R,clock:_}),oe.trigger({delta:N,elapsed:R,clock:_}),Y.trigger({delta:N,elapsed:R,clock:_})},{immediate:!1});Y.on(()=>{N=_.getDelta(),R=_.getElapsedTime()});function V(){return{onBeforeLoop:ae.on,onLoop:oe.on,onAfterLoop:Y.on,pause:Se,resume:Me,isActive:Pe}}const be=o.shallowRef(new p.Scene);function se(){return{scene:be}}function ie(e){const t={nodes:{},materials:{}};return e&&e.traverse(r=>{r.name&&(t.nodes[r.name]=r),r.material&&!t.materials[r.material.name]&&(t.materials[r.material.name]=r.material)}),t}async function Ue(e,t,r,a,c){const{logError:d}=I(),g=new e;c&&c(g),r&&r(g);const i=(Array.isArray(t)?t:[t]).map(l=>new Promise((s,u)=>{g.load(l,m=>{m.scene&&Object.assign(m,ie(m.scene)),s(m)},a,m=>u(d("[useLoader] - Failed to load resource",m)))}));return z(t)?await Promise.all(i):await i[0]}async function Le(e){const t=new p.LoadingManager,r=new p.TextureLoader(t),a=c=>new Promise((d,g)=>{r.load(c,n=>d(n),()=>null,()=>{g(new Error("[useTextures] - Failed to load texture"))})});if(z(e)){const c=await Promise.all(e.map(d=>a(d)));return e.length>1?c:c[0]}else{const{map:c,displacementMap:d,normalMap:g,roughnessMap:n,metalnessMap:i,aoMap:l}=e;return{map:c?await a(c):null,displacementMap:d?await a(d):null,normalMap:g?await a(g):null,roughnessMap:n?await a(n):null,metalnessMap:i?await a(i):null,aoMap:l?await a(l):null}}}const T=o.shallowReactive({});function U(){function e(r){return T[r]}function t(r,a){T[r]=a}return{state:T,...o.toRefs(T),getState:e,setState:t}}const Q=o.shallowRef(new p.Raycaster),F=o.ref(new p.Vector2),ce=o.ref(null);function le(){const{setState:e}=U();e("raycaster",Q.value),e("pointer",F),e("currentInstance",ce),o.provide("raycaster",Q),o.provide("pointer",F),o.provide("currentInstance",ce);function t(r){F.value.x=r.clientX/window.innerWidth*2-1,F.value.y=-(r.clientY/window.innerHeight)*2+1}return window.addEventListener("pointermove",t),o.onUnmounted(()=>{window.removeEventListener("pointermove",t)}),{raycaster:Q,pointer:F}}const Z={realistic:{physicallyCorrectLights:!0,outputEncoding:p.sRGBEncoding,toneMapping:p.ACESFilmicToneMapping,toneMappingExposure:3,shadowMap:{enabled:!0,type:p.PCFSoftShadowMap}}},ue=(e,t)=>{for(const r of Object.keys(t))t[r]instanceof Object&&Object.assign(t[r],ue(e[r],t[r]));return Object.assign(e||{},t),e},w=o.shallowRef(),E=o.ref(!1);function fe(e,t,r){const{alpha:a=!0,antialias:c=!0,depth:d,logarithmicDepthBuffer:g,failIfMajorPerformanceCaveat:n,precision:i,premultipliedAlpha:l,stencil:s,shadows:u=!1,shadowMapType:m=p.PCFShadowMap,physicallyCorrectLights:P=!1,outputEncoding:y=p.LinearEncoding,toneMapping:v=p.NoToneMapping,toneMappingExposure:L=1,context:D=void 0,powerPreference:C="default",preserveDrawingBuffer:W=!1,clearColor:O,windowSize:S=!1,preset:b=void 0}=o.toRefs(r),{width:M,height:G}=f.resolveUnref(S)?f.useWindowSize():f.useElementSize(t),{logError:q}=I(),{pixelRatio:pe}=f.useDevicePixelRatio(),{pause:Ie,resume:Ae}=V(),H=o.computed(()=>M.value/G.value),de=()=>{w.value&&(w.value.setSize(M.value,G.value),w.value.setPixelRatio(Math.min(pe.value,2)))},me=()=>{if(!w.value)return;const j=f.resolveUnref(b);if(j){j in Z||q("Renderer Preset must be one of these: "+Object.keys(Z).join(", ")),ue(w.value,Z[j]);return}w.value.shadowMap.enabled=f.resolveUnref(u),w.value.shadowMap.type=f.resolveUnref(m),w.value.toneMapping=f.resolveUnref(v)||p.NoToneMapping,w.value.toneMappingExposure=f.resolveUnref(L),w.value.outputEncoding=f.resolveUnref(y)||p.LinearEncoding,O!=null&&O.value&&w.value.setClearColor(ve(f.resolveUnref(O))),w.value.physicallyCorrectLights=f.resolveUnref(P)},ke=()=>{const j=f.unrefElement(e);if(w.value||!j)return;w.value=new p.WebGLRenderer({canvas:j,alpha:f.resolveUnref(a),antialias:f.resolveUnref(c),context:f.resolveUnref(D),depth:f.resolveUnref(d),failIfMajorPerformanceCaveat:f.resolveUnref(n),logarithmicDepthBuffer:f.resolveUnref(g),powerPreference:f.resolveUnref(C),precision:f.resolveUnref(i),stencil:f.resolveUnref(s),preserveDrawingBuffer:f.resolveUnref(W),premultipliedAlpha:f.resolveUnref(l)});const{setState:ee}=U();ee("renderer",w.value),ee("clock",new p.Clock),ee("aspectRatio",H),me(),de(),Ae(),E.value=!0},_e=()=>{w.value&&(w.value.dispose(),w.value=void 0,E.value=!1,Ie())};return o.watch([H,pe],de),o.watch([u,m,y,P,v,L,O],me),o.watch(()=>[e,t],()=>{f.unrefElement(e)&&f.unrefElement(t)&&ke()},{immediate:!0,deep:!0}),{renderer:w,isReady:E,dispose:_e,aspectRatio:H}}const Oe=o.defineComponent({name:"TresCanvas",props:{shadows:Boolean,shadowMapType:Number,physicallyCorrectLights:Boolean,outputEncoding:Number,toneMapping:Number,toneMappingExposure:Number,context:Object,powerPreference:String,preserveDrawingBuffer:Boolean,clearColor:String,windowSize:{type:Boolean,default:!1},preset:String},setup(e,{slots:t,attrs:r}){const{logError:a}=I(),c=o.ref(),d=o.ref(),{renderer:g,dispose:n,aspectRatio:i}=fe(c,d,e);return o.provide("aspect-ratio",i),o.provide("renderer",g),t.default&&!t.default().some(l=>l.type.name==="Scene")&&a("TresCanvas must contain a Scene component."),t.default&&!t.default().some(l=>{var s;return(s=l.type.name)==null?void 0:s.includes("Camera")})&&a("Scene must contain a Camera component."),o.onBeforeUnmount(()=>n()),()=>{if(t.default)return o.h("div",{ref:d,style:{position:"relative",width:"100%",height:"100vh",...r.style}},[o.h("canvas",{ref:c,style:{width:"100%",height:"100%",position:e.windowSize?"fixed":"absolute",top:0,left:0}}),t.default()])}}}),xe=o.defineComponent({name:"Scene",setup(e,{slots:t}){const{setState:r}=U(),{scene:a}=se(),c=o.inject("renderer"),{activeCamera:d}=K(),{raycaster:g,pointer:n}=le(),{onLoop:i}=V();return o.provide("local-scene",a),r("scene",a.value),i(()=>{g.value.setFromCamera(n.value,d.value),c!=null&&c.value&&(d!=null&&d.value)&&(a!=null&&a.value)&&c.value.render(a==null?void 0:a.value,d.value)}),()=>{if(t.default)return t.default()}}}),je=Symbol("UseTresState"),Be={install(e,t){const r=(t==null?void 0:t.prefix)||"Tres";e.component(`${r}Canvas`,Oe),e.component(`${r}Scene`,xe);const{catalogue:a,extend:c}=J(e,r);e.provide("catalogue",a),e.provide("extend",c),e.provide("useTres",U());const{createComponentInstances:d}=X(r);d(a).forEach(([n,i])=>{e.component(n,i)})}};h.CameraType=ne,h.UseTresStateSymbol=je,h.default=Be,h.trasverseObjects=ie,h.useCamera=K,h.useCatalogue=J,h.useInstanceCreator=X,h.useLoader=Ue,h.useRaycaster=le,h.useRenderLoop=V,h.useRenderer=fe,h.useScene=se,h.useTexture=Le,h.useTres=U,Object.defineProperties(h,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
8
+ (function(C,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("vue"),require("@vueuse/core"),require("three")):typeof define=="function"&&define.amd?define(["exports","vue","@vueuse/core","three"],i):(C=typeof globalThis<"u"?globalThis:C||self,i(C.tres={},C.Vue,C.VueUseCore,C.Three))})(this,function(C,i,u,p){"use strict";function he(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const a=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(n,o,a.get?a:{enumerable:!0,get:()=>e[o]})}}return n.default=e,Object.freeze(n)}const Q=he(p);var E=(e=>(e.Perspective="Perspective",e.Orthographic="Orthographic",e))(E||{});const we=45;let $;function G(){const{state:e,setState:n}=x(),o=i.inject("aspect-ratio");function a(t="Perspective",r){var f,c,s;if(t==="Perspective"){const{near:d,far:w,fov:g}=r||{near:.1,far:1e3,fov:we};$=new p.PerspectiveCamera(g,((f=e.aspectRatio)==null?void 0:f.value)||window.innerWidth/window.innerHeight,d,w),(c=e.cameras)==null||c.push($)}else{const{left:d,right:w,top:g,bottom:h,near:y,far:U}=r||{left:-100,right:100,top:100,bottom:-100,near:.1,far:1e3};$=new p.OrthographicCamera(d,w,g,h,y,U),(s=e.cameras)==null||s.push($)}return e.camera=$,n("camera",e.camera),$}function l(){var t;e.camera instanceof p.PerspectiveCamera&&e.aspectRatio&&(e.camera.aspect=e.aspectRatio.value),(t=e.camera)==null||t.updateProjectionMatrix()}function m(t){var r;(r=e.cameras)==null||r.push(t),t instanceof p.PerspectiveCamera&&e.aspectRatio&&(t.aspect=e.aspectRatio.value),t.updateProjectionMatrix(),n("camera",t)}function v(){e.cameras=[]}return o&&i.watch(o,l),{activeCamera:i.toRef(e,"camera"),createCamera:a,updateCamera:l,pushCamera:m,clearCameras:v}}const H="[TresJS ▲ ■ ●] ";function B(){function e(a,l){console.error(`${H} ${a}`,l||"")}function n(a){console.warn(`${H} ${a}`)}function o(a,l){}return{logError:e,logWarning:n,logMessage:o}}const k=i.ref({...Q,uuid:Q.MathUtils.generateUUID()});delete k.value.Scene;let I;function ee(e,n="Tres"){const{logError:o}=B();!I&&e&&(I=e);const{createComponentInstances:a}=K(n);return{extend:m=>{if(!m){o("No objects provided to extend catalogue");return}k.value=Object.assign(k.value,m);const v=a(i.ref(m));I&&v.forEach(([t,r])=>{I._context.components[t]||I.component(t,r)})},catalogue:k}}const O=e=>typeof e<"u",ye=e=>typeof e=="function",D=e=>!!e&&e.constructor===Array;function Ce(e){return typeof e=="number"?[e,e,e]:e instanceof p.Vector3?[e.x,e.y,e.z]:e}function ve(e){return e instanceof p.Color?e:Array.isArray(e)?new p.Color(...e):new p.Color(e)}const te=["rotation","scale","position"],Se=["X","Y","Z"],Me=["color"],Le=["r","g","b"];function K(e){const{logError:n}=B();function o(t,r){O(t)&&O(r)&&Object.entries(t).forEach(([f,c])=>{const s=f.replace(/(-\w)/g,d=>d[1].toUpperCase());r.setAttribute(s,new p.BufferAttribute(...c))})}function a(t,r){O(t)&&O(r)&&Object.entries(t).forEach(([f,c])=>{const s=f.replace(/(-\w)/g,y=>y[1].toUpperCase());let d,w,g,h;if(!(s==="args"||c===void 0)){te.includes(s)&&c?c=Ce(c):te.forEach(y=>{s.startsWith(y)&&s.length===y.length+1&&(d=y,w=s.substring(y.length),Se.includes(w)||n(`There was an error setting ${f} property, ${w} is not a valid axis for ${d}`))}),Me.forEach(y=>{s.startsWith(y)&&s.length===y.length+1&&(g=y,h=s.substring(y.length).toLowerCase(),Le.includes(h)||n(`There was an error setting ${f} property , ${h} is not a valid axis for ${g}`))}),t.ref&&(t.ref=r);try{if(r[s]&&O(r[s].set))r[s].set(...D(c)?c:[c]);else if(d&&r[d])O(r[d][`set${w}`])?r[d][`set${w}`](c):O(r[`rotate${w}`])&&r[`rotate${w}`](c);else if(g&&h&&r[g]&&r[g][h])r[g][h]=c;else{if(c===""&&(c=!0),ye(r[s])){if(f==="center"&&!c)return;r[s](...D(c)?c:[c]);return}r[s]=c}}catch(y){n(`There was an error setting ${s} property`,y)}}})}function l(t){var s,d;const r=/^Symbol\(Fragment\)$/g,f=/^Symbol\(Text\)$/g,c=/^Symbol\(Comment\)$/g;if(r.test(t.type.toString()))return t.children.map(w=>l(w));if(f.test(t.type.toString())||c.test(t.type.toString()))return;{const w=t.type.name.replace(e,""),g=i.inject("catalogue");let h;if(g)if((s=t.children)!=null&&s.default){const y=t.children.default().map(U=>l(U));h=new g.value[w](...y.flat().filter(Boolean))}else(d=t==null?void 0:t.props)!=null&&d.args?g!=null&&g.value[w]?h=new g.value[w](...t.props.args):n(`There is no ${w} in the catalogue`,g==null?void 0:g.value.uuid):h=new g.value[w];return t!=null&&t.props&&(w==="BufferGeometry"?o(t.props,h):a(t.props,h)),h}}function m(t,r,f){if(f.default&&(f!=null&&f.default())){const c=f.default().map(s=>l(s));if(t.name==="Group"){const s=new t;return c.forEach(d=>{s.add(d)}),s}else return new t(...c.flat().filter(Boolean))}else return r.args?new t(...r.args):new t}function v(t){return Object.entries(t.value).filter(([r,f])=>{var c,s;return(s=(c=f==null?void 0:f.prototype)==null?void 0:c.constructor)==null?void 0:s.toString().includes("class")}).map(([r,f])=>{const c=`${e}${r}`,s=i.defineComponent({name:c,setup(d,{slots:w,attrs:g,...h}){const{state:y}=x(),{onLoop:U}=V(),M=y.scene,T=y.raycaster;let L=m(f,g,w);if(a(g,L),L instanceof p.PerspectiveCamera||L instanceof p.OrthographicCamera){const{pushCamera:F}=G();F(L)}L.isObject3D&&(M==null||M.add(L));let b=null,P=null;if(L instanceof p.Mesh){U(()=>{if(L&&T&&(M!=null&&M.children)){const j=T.intersectObjects(M==null?void 0:M.children);j.length>0?(P=j[0],(b===null||b.object.uuid!==(P==null?void 0:P.object.uuid))&&h.emit("pointer-enter",P),h.emit("pointer-move",P)):(P=null,b!==null&&h.emit("pointer-leave",b)),b=P}});const F=u.useEventListener(window,"click",()=>{h.emit("click",b)});i.onUnmounted(()=>{F()})}return M&&L instanceof p.Fog&&(M.fog=L),h.expose(L),()=>{}}});return[c,s]})}return{createComponentInstances:v,processProps:a,createInstanceFromVNode:l}}const ne=u.createEventHook(),re=u.createEventHook(),q=u.createEventHook(),_=new p.Clock;let z=0,N=0;const{pause:be,resume:Pe,isActive:Ue}=u.useRafFn(()=>{ne.trigger({delta:z,elapsed:N,clock:_}),re.trigger({delta:z,elapsed:N,clock:_}),q.trigger({delta:z,elapsed:N,clock:_})},{immediate:!1});q.on(()=>{z=_.getDelta(),N=_.getElapsedTime()});function V(){return{onBeforeLoop:ne.on,onLoop:re.on,onAfterLoop:q.on,pause:be,resume:Pe,isActive:Ue}}const Oe=i.shallowRef(new p.Scene);function oe(){return{scene:Oe}}function ae(e){const n={nodes:{},materials:{}};return e&&e.traverse(o=>{o.name&&(n.nodes[o.name]=o),o.material&&!n.materials[o.material.name]&&(n.materials[o.material.name]=o.material)}),n}async function xe(e,n,o,a,l){const{logError:m}=B(),v=new e;l&&l(v),o&&o(v);const r=(Array.isArray(n)?n:[n]).map(f=>new Promise((c,s)=>{v.load(f,d=>{d.scene&&Object.assign(d,ae(d.scene)),c(d)},a,d=>s(m("[useLoader] - Failed to load resource",d)))}));return D(n)?await Promise.all(r):await r[0]}async function $e(e){const n=new p.LoadingManager,o=new p.TextureLoader(n),a=l=>new Promise((m,v)=>{o.load(l,t=>m(t),()=>null,()=>{v(new Error("[useTextures] - Failed to load texture"))})});if(D(e)){const l=await Promise.all(e.map(m=>a(m)));return e.length>1?l:l[0]}else{const{map:l,displacementMap:m,normalMap:v,roughnessMap:t,metalnessMap:r,aoMap:f}=e;return{map:l?await a(l):null,displacementMap:m?await a(m):null,normalMap:v?await a(v):null,roughnessMap:t?await a(t):null,metalnessMap:r?await a(r):null,aoMap:f?await a(f):null}}}const W=i.shallowReactive({camera:void 0,cameras:[],aspectRatio:i.computed(()=>window.innerWidth/window.innerHeight)});function x(){function e(o){return W[o]}function n(o,a){W[o]=a}return{state:W,...i.toRefs(W),getState:e,setState:n}}const X=i.shallowRef(new p.Raycaster),R=i.ref(new p.Vector2),ie=i.ref(null);function se(){const{setState:e}=x();e("raycaster",X.value),e("pointer",R),e("currentInstance",ie),i.provide("raycaster",X),i.provide("pointer",R),i.provide("currentInstance",ie);function n(o){R.value.x=o.clientX/window.innerWidth*2-1,R.value.y=-(o.clientY/window.innerHeight)*2+1}return window.addEventListener("pointermove",n),i.onUnmounted(()=>{window.removeEventListener("pointermove",n)}),{raycaster:X,pointer:R}}const Y={realistic:{outputEncoding:p.sRGBEncoding,toneMapping:p.ACESFilmicToneMapping,toneMappingExposure:3,shadowMap:{enabled:!0,type:p.PCFSoftShadowMap}}},ce=(e,n)=>{for(const o of Object.keys(n))n[o]instanceof Object&&Object.assign(n[o],ce(e[o],n[o]));return Object.assign(e||{},n),e},S=i.shallowRef(),J=i.ref(!1);function le(e,n,o){const{alpha:a=!0,antialias:l=!0,depth:m,logarithmicDepthBuffer:v,failIfMajorPerformanceCaveat:t,precision:r,premultipliedAlpha:f,stencil:c,shadows:s=!1,shadowMapType:d=p.PCFShadowMap,physicallyCorrectLights:w=!1,useLegacyLights:g=!1,outputEncoding:h=p.LinearEncoding,toneMapping:y=p.NoToneMapping,toneMappingExposure:U=1,context:M=void 0,powerPreference:T="default",preserveDrawingBuffer:L=!1,clearColor:b,windowSize:P=!1,preset:F=void 0}=i.toRefs(o),{setState:j}=x(),{width:ue,height:pe}=u.resolveUnref(P)?u.useWindowSize():u.useElementSize(n),{logError:Re}=B(),{pixelRatio:de}=u.useDevicePixelRatio(),{pause:Fe,resume:ke}=V(),Z=i.computed(()=>ue.value/pe.value),me=()=>{S.value&&(S.value.setSize(ue.value,pe.value),S.value.setPixelRatio(Math.min(de.value,2)))},ge=()=>{if(!S.value)return;const A=u.resolveUnref(F);if(A){A in Y||Re("Renderer Preset must be one of these: "+Object.keys(Y).join(", ")),ce(S.value,Y[A]);return}S.value.shadowMap.enabled=u.resolveUnref(s),S.value.shadowMap.type=u.resolveUnref(d),S.value.toneMapping=u.resolveUnref(y)||p.NoToneMapping,S.value.toneMappingExposure=u.resolveUnref(U),S.value.outputEncoding=u.resolveUnref(h)||p.LinearEncoding,b!=null&&b.value&&S.value.setClearColor(ve(u.resolveUnref(b))),S.value.useLegacyLights=u.resolveUnref(g)},De=()=>{const A=u.unrefElement(e);S.value||!A||(S.value=new p.WebGLRenderer({canvas:A,alpha:u.resolveUnref(a),antialias:u.resolveUnref(l),context:u.resolveUnref(M),depth:u.resolveUnref(m),failIfMajorPerformanceCaveat:u.resolveUnref(t),logarithmicDepthBuffer:u.resolveUnref(v),powerPreference:u.resolveUnref(T),precision:u.resolveUnref(r),stencil:u.resolveUnref(c),preserveDrawingBuffer:u.resolveUnref(L),premultipliedAlpha:u.resolveUnref(f)}),j("renderer",S.value),j("clock",new p.Clock),j("aspectRatio",Z),ge(),me(),ke(),J.value=!0)},ze=()=>{S.value&&(S.value.dispose(),S.value=void 0,J.value=!1,Fe())};return i.watch([Z,de],me),i.watch([s,d,h,g,y,U,b],ge),i.watch(()=>[e,n],()=>{u.unrefElement(e)&&u.unrefElement(n)&&De()},{immediate:!0,deep:!0}),{renderer:S,isReady:J,dispose:ze,aspectRatio:Z}}const{logError:fe,logWarning:je}=B(),Ae=i.defineComponent({name:"TresCanvas",props:{shadows:Boolean,shadowMapType:Number,physicallyCorrectLights:{type:Boolean,default:!1,validator:e=>(e&&je("physicallyCorrectLights is deprecated. Use useLegacyLights instead."),!0)},useLegacyLights:Boolean,outputEncoding:Number,toneMapping:Number,toneMappingExposure:Number,context:Object,powerPreference:String,preserveDrawingBuffer:Boolean,clearColor:String,windowSize:{type:Boolean,default:!1},preset:String},setup(e,{slots:n,attrs:o}){const a=i.ref(),l=i.ref(),{renderer:m,dispose:v,aspectRatio:t}=le(a,l,e);return i.provide("aspect-ratio",t),i.provide("renderer",m),n.default&&!n.default().some(r=>r.type.name==="Scene")&&fe("TresCanvas must contain a Scene component."),n.default&&!n.default().some(r=>{var f;return(f=r.type.name)==null?void 0:f.includes("Camera")})&&fe("Scene must contain a Camera component."),i.onBeforeUnmount(()=>v()),()=>{if(n.default)return i.h("div",{ref:l,style:{position:"relative",width:"100%",height:"100%",overflow:"hidden",pointerEvents:"auto",touchAction:"none",...o.style}},[i.h("div",{style:{width:"100%",height:"100%"}},[i.h("canvas",{ref:a,style:{display:"block",width:"100%",height:"100%",position:e.windowSize?"fixed":"absolute",top:0,left:0}}),n.default()])])}}}),Be=i.defineComponent({name:"Scene",setup(e,{slots:n}){const{setState:o}=x(),{scene:a}=oe(),l=i.inject("renderer"),{activeCamera:m}=G(),{raycaster:v,pointer:t}=se(),{onLoop:r}=V();return i.provide("local-scene",a),o("scene",a.value),r(()=>{m.value&&(v.value.setFromCamera(t.value,m.value),l!=null&&l.value&&m&&(a!=null&&a.value)&&l.value.render(a==null?void 0:a.value,m.value))}),()=>{if(n.default)return n.default()}}}),Ie=Symbol("UseTresState"),_e={install(e,n){const o=(n==null?void 0:n.prefix)||"Tres";e.component(`${o}Canvas`,Ae),e.component(`${o}Scene`,Be);const{catalogue:a,extend:l}=ee(e,o);e.provide("catalogue",a),e.provide("extend",l),e.provide("useTres",x());const{createComponentInstances:m}=K(o);m(a).forEach(([t,r])=>{e.component(t,r)})}};C.CameraType=E,C.UseTresStateSymbol=Ie,C.default=_e,C.trasverseObjects=ae,C.useCamera=G,C.useCatalogue=ee,C.useInstanceCreator=K,C.useLoader=xe,C.useRaycaster=se,C.useRenderLoop=V,C.useRenderer=le,C.useScene=oe,C.useTexture=$e,C.useTres=x,Object.defineProperties(C,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tresjs/core",
3
3
  "description": "Declarative ThreeJS using Vue Components",
4
- "version": "1.7.0",
4
+ "version": "1.8.1",
5
5
  "type": "module",
6
6
  "author": "Alvaro Saburido <hola@alvarosaburido.dev> (https://github.com/alvarosabu/)",
7
7
  "files": [
@@ -42,25 +42,26 @@
42
42
  "@vueuse/core": "^9.13.0"
43
43
  },
44
44
  "devDependencies": {
45
- "@tresjs/cientos": "^1.7.0",
45
+ "@tresjs/cientos": "^1.8.0",
46
46
  "@types/three": "latest",
47
47
  "@vitejs/plugin-vue": "^4.0.0",
48
- "@vitest/coverage-c8": "^0.28.4",
49
- "@vitest/ui": "^0.28.4",
50
- "gl": "6.0.2",
51
- "happy-dom": "^8.2.6",
48
+ "@vitest/coverage-c8": "^0.28.5",
49
+ "@vitest/ui": "^0.28.5",
50
+ "@vue/test-utils": "^2.3.0",
51
+ "happy-dom": "^8.7.1",
52
+ "jsdom": "^21.1.0",
52
53
  "kolorist": "^1.7.0",
53
54
  "pathe": "^1.1.0",
54
55
  "rollup-plugin-analyzer": "^4.0.0",
55
56
  "rollup-plugin-visualizer": "^5.9.0",
56
57
  "three": "latest",
57
- "vite": "^4.1.2",
58
+ "vite": "^4.1.4",
58
59
  "vite-plugin-banner": "^0.7.0",
59
60
  "vite-plugin-dts": "2.0.0-beta.1",
60
61
  "vite-plugin-glsl": "^1.1.2",
61
62
  "vite-plugin-inspect": "^0.7.15",
62
63
  "vite-plugin-require-transform": "^1.0.9",
63
- "vitest": "^0.28.4",
64
+ "vitest": "^0.28.5",
64
65
  "vue-demi": "^0.13.11"
65
66
  },
66
67
  "scripts": {