@planara/core 1.4.9 → 1.6.0

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.
Files changed (65) hide show
  1. package/dist/core/editor-renderer.d.ts +28 -12
  2. package/dist/core/editor-renderer.d.ts.map +1 -1
  3. package/dist/core/preview-renderer.d.ts +2 -1
  4. package/dist/core/preview-renderer.d.ts.map +1 -1
  5. package/dist/core/renderer.d.ts +40 -3
  6. package/dist/core/renderer.d.ts.map +1 -1
  7. package/dist/events/editor-events.d.ts +18 -0
  8. package/dist/events/editor-events.d.ts.map +1 -0
  9. package/dist/events/event-bus.d.ts +17 -0
  10. package/dist/events/event-bus.d.ts.map +1 -0
  11. package/dist/events/event-topics.d.ts +12 -0
  12. package/dist/events/event-topics.d.ts.map +1 -0
  13. package/dist/extensions/mesh-extension.d.ts +12 -0
  14. package/dist/extensions/mesh-extension.d.ts.map +1 -0
  15. package/dist/extensions/orbit-extension.d.ts +5 -2
  16. package/dist/extensions/orbit-extension.d.ts.map +1 -1
  17. package/dist/handlers/display/wireframe-handler.d.ts +37 -0
  18. package/dist/handlers/display/wireframe-handler.d.ts.map +1 -0
  19. package/dist/handlers/select/mesh-select-handler.d.ts +25 -0
  20. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -0
  21. package/dist/hub/app-hub.d.ts +7 -0
  22. package/dist/hub/app-hub.d.ts.map +1 -0
  23. package/dist/hub/editor-hub.d.ts +21 -0
  24. package/dist/hub/editor-hub.d.ts.map +1 -0
  25. package/dist/index.cjs.js +52 -7
  26. package/dist/index.d.ts +10 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.es.js +2065 -113
  29. package/dist/index.full.d.ts +315 -0
  30. package/dist/index.public.d.ts +260 -0
  31. package/dist/index.umd.js +52 -7
  32. package/dist/interfaces/api/mesh-api.d.ts +39 -0
  33. package/dist/interfaces/api/mesh-api.d.ts.map +1 -0
  34. package/dist/interfaces/api/renderer-api.d.ts +27 -0
  35. package/dist/interfaces/api/renderer-api.d.ts.map +1 -0
  36. package/dist/interfaces/handler/display-handler.d.ts +13 -0
  37. package/dist/interfaces/handler/display-handler.d.ts.map +1 -0
  38. package/dist/interfaces/handler/handler.d.ts +23 -0
  39. package/dist/interfaces/handler/handler.d.ts.map +1 -0
  40. package/dist/interfaces/handler/select-handler.d.ts +13 -0
  41. package/dist/interfaces/handler/select-handler.d.ts.map +1 -0
  42. package/dist/interfaces/manager/display-manager.d.ts +8 -0
  43. package/dist/interfaces/manager/display-manager.d.ts.map +1 -0
  44. package/dist/interfaces/manager/manager.d.ts +16 -0
  45. package/dist/interfaces/manager/manager.d.ts.map +1 -0
  46. package/dist/interfaces/manager/select-manager.d.ts +8 -0
  47. package/dist/interfaces/manager/select-manager.d.ts.map +1 -0
  48. package/dist/ioc/container.d.ts +5 -0
  49. package/dist/ioc/container.d.ts.map +1 -0
  50. package/dist/loaders/obj-loader.d.ts +8 -7
  51. package/dist/loaders/obj-loader.d.ts.map +1 -1
  52. package/dist/managers/display/display-manager.d.ts +19 -0
  53. package/dist/managers/display/display-manager.d.ts.map +1 -0
  54. package/dist/managers/select/select-manager.d.ts +19 -0
  55. package/dist/managers/select/select-manager.d.ts.map +1 -0
  56. package/dist/tsdoc-metadata.json +11 -0
  57. package/dist/types/camera/camera-position.d.ts +10 -0
  58. package/dist/types/camera/camera-position.d.ts.map +1 -0
  59. package/dist/types/event/select-event-type.d.ts +6 -0
  60. package/dist/types/event/select-event-type.d.ts.map +1 -0
  61. package/dist/utils/program-settings.d.ts +4 -3
  62. package/dist/utils/program-settings.d.ts.map +1 -1
  63. package/dist/utils/renderer-api.d.ts +21 -0
  64. package/dist/utils/renderer-api.d.ts.map +1 -0
  65. package/package.json +17 -4
package/dist/index.umd.js CHANGED
@@ -1,4 +1,17 @@
1
- (function(r,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("ogl")):typeof define=="function"&&define.amd?define(["exports","ogl"],i):(r=typeof globalThis<"u"?globalThis:r||self,i(r.PlanaraCore={},r.OGL))})(this,(function(r,i){"use strict";function m(s){const e=`
1
+ (function(T,j){typeof exports=="object"&&typeof module<"u"?j(exports,require("ogl")):typeof define=="function"&&define.amd?define(["exports","ogl"],j):(T=typeof globalThis<"u"?globalThis:T||self,j(T.PlanaraCore={},T.OGL))})(this,(function(T,j){"use strict";var je=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},ke={};/*! *****************************************************************************
2
+ Copyright (C) Microsoft. All rights reserved.
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4
+ this file except in compliance with the License. You may obtain a copy of the
5
+ License at http://www.apache.org/licenses/LICENSE-2.0
6
+
7
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
8
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
9
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
10
+ MERCHANTABLITY OR NON-INFRINGEMENT.
11
+
12
+ See the Apache Version 2.0 License for specific language governing permissions
13
+ and limitations under the License.
14
+ ***************************************************************************** */var De;function ct(){if(De)return ke;De=1;var t;return(function(e){(function(r){var i=typeof globalThis=="object"?globalThis:typeof je=="object"?je:typeof self=="object"?self:typeof this=="object"?this:E(),o=n(e);typeof i.Reflect<"u"&&(o=n(i.Reflect,o)),r(o,i),typeof i.Reflect>"u"&&(i.Reflect=e);function n(m,S){return function(H,z){Object.defineProperty(m,H,{configurable:!0,writable:!0,value:z}),S&&S(H,z)}}function l(){try{return Function("return this;")()}catch{}}function w(){try{return(0,eval)("(function() { return this; })()")}catch{}}function E(){return l()||w()}})(function(r,i){var o=Object.prototype.hasOwnProperty,n=typeof Symbol=="function",l=n&&typeof Symbol.toPrimitive<"u"?Symbol.toPrimitive:"@@toPrimitive",w=n&&typeof Symbol.iterator<"u"?Symbol.iterator:"@@iterator",E=typeof Object.create=="function",m={__proto__:[]}instanceof Array,S=!E&&!m,H={create:E?function(){return Ae(Object.create(null))}:m?function(){return Ae({__proto__:null})}:function(){return Ae({})},has:S?function(s,a){return o.call(s,a)}:function(s,a){return a in s},get:S?function(s,a){return o.call(s,a)?s[a]:void 0}:function(s,a){return s[a]}},z=Object.getPrototypeOf(Function),U=typeof Map=="function"&&typeof Map.prototype.entries=="function"?Map:hr(),X=typeof Set=="function"&&typeof Set.prototype.entries=="function"?Set:dr(),re=typeof WeakMap=="function"?WeakMap:vr(),q=n?Symbol.for("@reflect-metadata:registry"):void 0,K=lr(),he=fr(K);function de(s,a,u,h){if(b(u)){if(!nt(s))throw new TypeError;if(!it(a))throw new TypeError;return ve(s,a)}else{if(!nt(s))throw new TypeError;if(!k(a))throw new TypeError;if(!k(h)&&!b(h)&&!ee(h))throw new TypeError;return ee(h)&&(h=void 0),u=W(u),Ie(s,a,u,h)}}r("decorate",de);function c(s,a){function u(h,M){if(!k(h))throw new TypeError;if(!b(M)&&!ar(M))throw new TypeError;Xe(s,a,h,M)}return u}r("metadata",c);function f(s,a,u,h){if(!k(u))throw new TypeError;return b(h)||(h=W(h)),Xe(s,a,u,h)}r("defineMetadata",f);function d(s,a,u){if(!k(a))throw new TypeError;return b(u)||(u=W(u)),Je(s,a,u)}r("hasMetadata",d);function g(s,a,u){if(!k(a))throw new TypeError;return b(u)||(u=W(u)),Le(s,a,u)}r("hasOwnMetadata",g);function O(s,a,u){if(!k(a))throw new TypeError;return b(u)||(u=W(u)),Ye(s,a,u)}r("getMetadata",O);function I(s,a,u){if(!k(a))throw new TypeError;return b(u)||(u=W(u)),Qe(s,a,u)}r("getOwnMetadata",I);function R(s,a){if(!k(s))throw new TypeError;return b(a)||(a=W(a)),Ke(s,a)}r("getMetadataKeys",R);function F(s,a){if(!k(s))throw new TypeError;return b(a)||(a=W(a)),et(s,a)}r("getOwnMetadataKeys",F);function Y(s,a,u){if(!k(a))throw new TypeError;if(b(u)||(u=W(u)),!k(a))throw new TypeError;b(u)||(u=W(u));var h=ne(a,u,!1);return b(h)?!1:h.OrdinaryDeleteMetadata(s,a,u)}r("deleteMetadata",Y);function ve(s,a){for(var u=s.length-1;u>=0;--u){var h=s[u],M=h(a);if(!b(M)&&!ee(M)){if(!it(M))throw new TypeError;a=M}}return a}function Ie(s,a,u,h){for(var M=s.length-1;M>=0;--M){var x=s[M],D=x(a,u,h);if(!b(D)&&!ee(D)){if(!k(D))throw new TypeError;h=D}}return h}function Je(s,a,u){var h=Le(s,a,u);if(h)return!0;var M=xe(a);return ee(M)?!1:Je(s,M,u)}function Le(s,a,u){var h=ne(a,u,!1);return b(h)?!1:rt(h.OrdinaryHasOwnMetadata(s,a,u))}function Ye(s,a,u){var h=Le(s,a,u);if(h)return Qe(s,a,u);var M=xe(a);if(!ee(M))return Ye(s,M,u)}function Qe(s,a,u){var h=ne(a,u,!1);if(!b(h))return h.OrdinaryGetOwnMetadata(s,a,u)}function Xe(s,a,u,h){var M=ne(u,h,!0);M.OrdinaryDefineOwnMetadata(s,a,u,h)}function Ke(s,a){var u=et(s,a),h=xe(s);if(h===null)return u;var M=Ke(h,a);if(M.length<=0)return u;if(u.length<=0)return M;for(var x=new X,D=[],P=0,v=u;P<v.length;P++){var p=v[P],y=x.has(p);y||(x.add(p),D.push(p))}for(var _=0,C=M;_<C.length;_++){var p=C[_],y=x.has(p);y||(x.add(p),D.push(p))}return D}function et(s,a){var u=ne(s,a,!1);return u?u.OrdinaryOwnMetadataKeys(s,a):[]}function tt(s){if(s===null)return 1;switch(typeof s){case"undefined":return 0;case"boolean":return 2;case"string":return 3;case"symbol":return 4;case"number":return 5;case"object":return s===null?1:6;default:return 6}}function b(s){return s===void 0}function ee(s){return s===null}function nr(s){return typeof s=="symbol"}function k(s){return typeof s=="object"?s!==null:typeof s=="function"}function ir(s,a){switch(tt(s)){case 0:return s;case 1:return s;case 2:return s;case 3:return s;case 4:return s;case 5:return s}var u="string",h=st(s,l);if(h!==void 0){var M=h.call(s,u);if(k(M))throw new TypeError;return M}return sr(s)}function sr(s,a){var u,h,M;{var x=s.toString;if(pe(x)){var h=x.call(s);if(!k(h))return h}var u=s.valueOf;if(pe(u)){var h=u.call(s);if(!k(h))return h}}throw new TypeError}function rt(s){return!!s}function or(s){return""+s}function W(s){var a=ir(s);return nr(a)?a:or(a)}function nt(s){return Array.isArray?Array.isArray(s):s instanceof Object?s instanceof Array:Object.prototype.toString.call(s)==="[object Array]"}function pe(s){return typeof s=="function"}function it(s){return typeof s=="function"}function ar(s){switch(tt(s)){case 3:return!0;case 4:return!0;default:return!1}}function Te(s,a){return s===a||s!==s&&a!==a}function st(s,a){var u=s[a];if(u!=null){if(!pe(u))throw new TypeError;return u}}function ot(s){var a=st(s,w);if(!pe(a))throw new TypeError;var u=a.call(s);if(!k(u))throw new TypeError;return u}function at(s){return s.value}function ut(s){var a=s.next();return a.done?!1:a}function lt(s){var a=s.return;a&&a.call(s)}function xe(s){var a=Object.getPrototypeOf(s);if(typeof s!="function"||s===z||a!==z)return a;var u=s.prototype,h=u&&Object.getPrototypeOf(u);if(h==null||h===Object.prototype)return a;var M=h.constructor;return typeof M!="function"||M===s?a:M}function ur(){var s;!b(q)&&typeof i.Reflect<"u"&&!(q in i.Reflect)&&typeof i.Reflect.defineMetadata=="function"&&(s=cr(i.Reflect));var a,u,h,M=new re,x={registerProvider:D,getProvider:v,setProvider:y};return x;function D(_){if(!Object.isExtensible(x))throw new Error("Cannot add provider to a frozen registry.");switch(!0){case s===_:break;case b(a):a=_;break;case a===_:break;case b(u):u=_;break;case u===_:break;default:h===void 0&&(h=new X),h.add(_);break}}function P(_,C){if(!b(a)){if(a.isProviderFor(_,C))return a;if(!b(u)){if(u.isProviderFor(_,C))return a;if(!b(h))for(var L=ot(h);;){var A=ut(L);if(!A)return;var $=at(A);if($.isProviderFor(_,C))return lt(L),$}}}if(!b(s)&&s.isProviderFor(_,C))return s}function v(_,C){var L=M.get(_),A;return b(L)||(A=L.get(C)),b(A)&&(A=P(_,C),b(A)||(b(L)&&(L=new U,M.set(_,L)),L.set(C,A))),A}function p(_){if(b(_))throw new TypeError;return a===_||u===_||!b(h)&&h.has(_)}function y(_,C,L){if(!p(L))throw new Error("Metadata provider not registered.");var A=v(_,C);if(A!==L){if(!b(A))return!1;var $=M.get(_);b($)&&($=new U,M.set(_,$)),$.set(C,L)}return!0}}function lr(){var s;return!b(q)&&k(i.Reflect)&&Object.isExtensible(i.Reflect)&&(s=i.Reflect[q]),b(s)&&(s=ur()),!b(q)&&k(i.Reflect)&&Object.isExtensible(i.Reflect)&&Object.defineProperty(i.Reflect,q,{enumerable:!1,configurable:!1,writable:!1,value:s}),s}function fr(s){var a=new re,u={isProviderFor:function(p,y){var _=a.get(p);return b(_)?!1:_.has(y)},OrdinaryDefineOwnMetadata:D,OrdinaryHasOwnMetadata:M,OrdinaryGetOwnMetadata:x,OrdinaryOwnMetadataKeys:P,OrdinaryDeleteMetadata:v};return K.registerProvider(u),u;function h(p,y,_){var C=a.get(p),L=!1;if(b(C)){if(!_)return;C=new U,a.set(p,C),L=!0}var A=C.get(y);if(b(A)){if(!_)return;if(A=new U,C.set(y,A),!s.setProvider(p,y,u))throw C.delete(y),L&&a.delete(p),new Error("Wrong provider for target.")}return A}function M(p,y,_){var C=h(y,_,!1);return b(C)?!1:rt(C.has(p))}function x(p,y,_){var C=h(y,_,!1);if(!b(C))return C.get(p)}function D(p,y,_,C){var L=h(_,C,!0);L.set(p,y)}function P(p,y){var _=[],C=h(p,y,!1);if(b(C))return _;for(var L=C.keys(),A=ot(L),$=0;;){var ft=ut(A);if(!ft)return _.length=$,_;var pr=at(ft);try{_[$]=pr}catch(yr){try{lt(A)}finally{throw yr}}$++}}function v(p,y,_){var C=h(y,_,!1);if(b(C)||!C.delete(p))return!1;if(C.size===0){var L=a.get(y);b(L)||(L.delete(_),L.size===0&&a.delete(L))}return!0}}function cr(s){var a=s.defineMetadata,u=s.hasOwnMetadata,h=s.getOwnMetadata,M=s.getOwnMetadataKeys,x=s.deleteMetadata,D=new re,P={isProviderFor:function(v,p){var y=D.get(v);return!b(y)&&y.has(p)?!0:M(v,p).length?(b(y)&&(y=new X,D.set(v,y)),y.add(p),!0):!1},OrdinaryDefineOwnMetadata:a,OrdinaryHasOwnMetadata:u,OrdinaryGetOwnMetadata:h,OrdinaryOwnMetadataKeys:M,OrdinaryDeleteMetadata:x};return P}function ne(s,a,u){var h=K.getProvider(s,a);if(!b(h))return h;if(u){if(K.setProvider(s,a,he))return he;throw new Error("Illegal state.")}}function hr(){var s={},a=[],u=(function(){function P(v,p,y){this._index=0,this._keys=v,this._values=p,this._selector=y}return P.prototype["@@iterator"]=function(){return this},P.prototype[w]=function(){return this},P.prototype.next=function(){var v=this._index;if(v>=0&&v<this._keys.length){var p=this._selector(this._keys[v],this._values[v]);return v+1>=this._keys.length?(this._index=-1,this._keys=a,this._values=a):this._index++,{value:p,done:!1}}return{value:void 0,done:!0}},P.prototype.throw=function(v){throw this._index>=0&&(this._index=-1,this._keys=a,this._values=a),v},P.prototype.return=function(v){return this._index>=0&&(this._index=-1,this._keys=a,this._values=a),{value:v,done:!0}},P})(),h=(function(){function P(){this._keys=[],this._values=[],this._cacheKey=s,this._cacheIndex=-2}return Object.defineProperty(P.prototype,"size",{get:function(){return this._keys.length},enumerable:!0,configurable:!0}),P.prototype.has=function(v){return this._find(v,!1)>=0},P.prototype.get=function(v){var p=this._find(v,!1);return p>=0?this._values[p]:void 0},P.prototype.set=function(v,p){var y=this._find(v,!0);return this._values[y]=p,this},P.prototype.delete=function(v){var p=this._find(v,!1);if(p>=0){for(var y=this._keys.length,_=p+1;_<y;_++)this._keys[_-1]=this._keys[_],this._values[_-1]=this._values[_];return this._keys.length--,this._values.length--,Te(v,this._cacheKey)&&(this._cacheKey=s,this._cacheIndex=-2),!0}return!1},P.prototype.clear=function(){this._keys.length=0,this._values.length=0,this._cacheKey=s,this._cacheIndex=-2},P.prototype.keys=function(){return new u(this._keys,this._values,M)},P.prototype.values=function(){return new u(this._keys,this._values,x)},P.prototype.entries=function(){return new u(this._keys,this._values,D)},P.prototype["@@iterator"]=function(){return this.entries()},P.prototype[w]=function(){return this.entries()},P.prototype._find=function(v,p){if(!Te(this._cacheKey,v)){this._cacheIndex=-1;for(var y=0;y<this._keys.length;y++)if(Te(this._keys[y],v)){this._cacheIndex=y;break}}return this._cacheIndex<0&&p&&(this._cacheIndex=this._keys.length,this._keys.push(v),this._values.push(void 0)),this._cacheIndex},P})();return h;function M(P,v){return P}function x(P,v){return v}function D(P,v){return[P,v]}}function dr(){var s=(function(){function a(){this._map=new U}return Object.defineProperty(a.prototype,"size",{get:function(){return this._map.size},enumerable:!0,configurable:!0}),a.prototype.has=function(u){return this._map.has(u)},a.prototype.add=function(u){return this._map.set(u,u),this},a.prototype.delete=function(u){return this._map.delete(u)},a.prototype.clear=function(){this._map.clear()},a.prototype.keys=function(){return this._map.keys()},a.prototype.values=function(){return this._map.keys()},a.prototype.entries=function(){return this._map.entries()},a.prototype["@@iterator"]=function(){return this.keys()},a.prototype[w]=function(){return this.keys()},a})();return s}function vr(){var s=16,a=H.create(),u=h();return(function(){function v(){this._key=h()}return v.prototype.has=function(p){var y=M(p,!1);return y!==void 0?H.has(y,this._key):!1},v.prototype.get=function(p){var y=M(p,!1);return y!==void 0?H.get(y,this._key):void 0},v.prototype.set=function(p,y){var _=M(p,!0);return _[this._key]=y,this},v.prototype.delete=function(p){var y=M(p,!1);return y!==void 0?delete y[this._key]:!1},v.prototype.clear=function(){this._key=h()},v})();function h(){var v;do v="@@WeakMap@@"+P();while(H.has(a,v));return a[v]=!0,v}function M(v,p){if(!o.call(v,u)){if(!p)return;Object.defineProperty(v,u,{value:H.create()})}return v[u]}function x(v,p){for(var y=0;y<p;++y)v[y]=Math.random()*255|0;return v}function D(v){if(typeof Uint8Array=="function"){var p=new Uint8Array(v);return typeof crypto<"u"?crypto.getRandomValues(p):typeof msCrypto<"u"?msCrypto.getRandomValues(p):x(p,v),p}return x(new Array(v),v)}function P(){var v=D(s);v[6]=v[6]&79|64,v[8]=v[8]&191|128;for(var p="",y=0;y<s;++y){var _=v[y];(y===4||y===6||y===8)&&(p+="-"),_<16&&(p+="0"),p+=_.toString(16).toLowerCase()}return p}}function Ae(s){return s.__=void 0,delete s.__,s}})})(t||(t={})),ke}ct();function ht(t){const e=`
2
15
  attribute vec3 position;
3
16
  attribute vec3 normal;
4
17
 
@@ -12,19 +25,51 @@
12
25
  vNormal = normalize(normalMatrix * normal);
13
26
  gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
14
27
  }
15
- `,t=`
28
+ `,r=`
16
29
  precision highp float;
17
30
 
18
31
  uniform float uHit;
32
+ uniform float uSelected;
19
33
 
20
34
  varying vec3 vNormal;
21
35
 
22
36
  void main() {
23
37
  vec3 normal = normalize(vNormal);
24
38
  float lighting = dot(normal, normalize(vec3(-0.3, 0.8, 0.6)));
25
- vec3 color = mix(vec3(0.2, 0.8, 1.0), vec3(1.0, 0.2, 0.8), uHit);
26
- gl_FragColor.rgb = color + lighting * 0.1;
27
- gl_FragColor.a = 1.0;
39
+
40
+ // Базовый цвет меша
41
+ vec3 baseColor = vec3(0.2, 0.8, 1.0);
42
+
43
+ // Цвет при наведении (hover)
44
+ vec3 hoverColor = vec3(1.0, 1.0, 0.1);
45
+
46
+ // Цвет при клике (selected)
47
+ vec3 selectedColor = vec3(1.0, 0.3, 0.3);
48
+
49
+ // Применяем логику подсветки:
50
+ // приоритет: выделение > hover > обычный цвет
51
+ vec3 color = mix(baseColor, hoverColor, uHit);
52
+ color = mix(color, selectedColor, uSelected);
53
+
54
+ // Немного света для объема
55
+ color += lighting * 0.1;
56
+
57
+ gl_FragColor = vec4(color, 1.0);
28
58
  }
29
- `;return new i.Program(s,{vertex:e,fragment:t,cullFace:!1,uniforms:{uHit:{value:0}}})}class l{gl;scene;camera;canvas;program;meshes;constructor(e){this.canvas=e,this.gl=new i.Renderer({canvas:e,dpr:2}),this.gl.setSize(e.clientWidth,e.clientHeight),this.gl.gl.clearColor(.1,.1,.1,1),this.scene=new i.Transform,this.camera=new i.Camera(this.gl.gl,{fov:45}),this.camera.position.set(1,1,7),this.camera.lookAt([0,0,0]),this.program=m(this.gl.gl),this.meshes=[]}resize(){this.gl.setSize(this.canvas.width,this.canvas.height),this.camera.perspective({aspect:this.canvas.width/this.canvas.height})}render(){this.gl.render({scene:this.scene,camera:this.camera})}update(){}loop(){this.update(),this.render(),requestAnimationFrame(this.loop.bind(this))}addFigure(e){const t=new i.Geometry(this.gl.gl,{position:{size:3,data:new Float32Array(e.position)},normal:{size:3,data:new Float32Array(e.normal??[])},uv:{size:2,data:new Float32Array(e.uv??[])}}),n=new i.Mesh(this.gl.gl,{geometry:t,program:this.program});return n.setParent(this.scene),this.meshes.push(n),n}destroy(){this.meshes&&(this.meshes.length=0,this.meshes=[]),this.scene=null,this.camera=null,this.program=null,this.gl=null,this.canvas=null}}class g extends i.Orbit{isInteracting=!1;element;constructor(e,t={}){super(e,t),this.element=t.element||document,this.element.addEventListener("mousedown",()=>this.isInteracting=!0),this.element.addEventListener("mouseup",()=>this.isInteracting=!1),this.element.addEventListener("touchstart",()=>this.isInteracting=!0),this.element.addEventListener("touchend",()=>this.isInteracting=!1)}destroy(){this.element.removeEventListener("mousedown",()=>this.isInteracting=!0),this.element.removeEventListener("mouseup",()=>this.isInteracting=!1),this.element.removeEventListener("touchstart",()=>this.isInteracting=!0),this.element.removeEventListener("touchend",()=>this.isInteracting=!1)}}class f extends l{orbit;raycast;mouse;isEventListenersAdded;constructor(e){super(e);const t=new i.GridHelper(this.gl.gl,{size:10,divisions:10});t.position.y=-.001,t.setParent(this.scene),new i.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new g(this.camera,{element:this.canvas}),this.raycast=new i.Raycast,this.mouse=new i.Vec2,this.isEventListenersAdded=!1}update(){this.orbit?.update()}addFigure(e){const t=super.addFigure(e);if(t.geometry){const n=t.geometry.constructor.name;t.geometry.raycast=n.includes("Sphere")?"sphere":"box"}return t.isHit=!1,t.onBeforeRender(({mesh:n})=>{this.updateHitUniform(n)}),this.isEventListenersAdded||this.initMouseListeners(),t}updateHitUniform(e){this.program.uniforms.uHit.value=e.isHit?1:0}initMouseListeners(){document.addEventListener("mousemove",this.handleMouseMove,!1),this.isEventListenersAdded=!0}handleMouseMove=e=>{if(this.orbit.isInteracting)return;this.mouse.set(2*(e.x/this.gl.width)-1,2*(1-e.y/this.gl.height)-1),this.raycast.castMouse(this.camera,this.mouse),this.meshes.forEach(n=>n.isHit=!1),this.raycast.intersectBounds(this.meshes).forEach(n=>n.isHit=!0)};destroy(){this.isEventListenersAdded&&(window.removeEventListener("mousemove",this.handleMouseMove,!1),this.isEventListenersAdded=!1),this.orbit=null,this.raycast=null,this.mouse=null,super.destroy()}}class y extends l{orbit;constructor(e){super(e),this.orbit=new i.Orbit(this.camera,{element:this.canvas,target:new i.Vec3(0,0,0),minPolarAngle:Math.PI/2,maxPolarAngle:Math.PI/2,enableRotate:!0,enableZoom:!1,enablePan:!1})}update(){this.orbit?.update()}}class b{type;position;normal;uv;material;constructor(e){this.type=e.type,this.position=e.position,this.normal=e.normal??[],this.uv=e.uv??[],this.material=e.material}}var c=(s=>(s[s.Cube=0]="Cube",s[s.Sphere=1]="Sphere",s[s.Plane=2]="Plane",s[s.Cylinder=3]="Cylinder",s[s.Custom=4]="Custom",s))(c||{});class w{positions=[];normals=[];uvs=[];tmpPositions=[];tmpNormals=[];tmpUVs=[];load(e){const t=e.split(`
30
- `);for(const h of t){if(!h.trim()||h.startsWith("#"))continue;const a=h.trim().split(/\s+/);switch(a[0]){case"v":this.tmpPositions.push(a.slice(1).map(Number));break;case"vn":this.tmpNormals.push(a.slice(1).map(Number));break;case"vt":this.tmpUVs.push(a.slice(1).map(Number));break;case"f":this.processFaceLine(a);break}}const n={type:c.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new b(n)}processFaceLine(e){for(let t=1;t<e.length;t++){const n=e[t];if(!n)continue;const[h,a,u]=n.split("/"),d=h?parseInt(h,10):void 0,v=a?parseInt(a,10):void 0,p=u?parseInt(u,10):void 0;if(d!==void 0){const o=this.tmpPositions[d-1];o&&this.positions.push(...o)}if(v!==void 0){const o=this.tmpUVs[v-1];o&&this.uvs.push(...o)}if(p!==void 0){const o=this.tmpNormals[p-1];o&&this.normals.push(...o)}}}}r.EditorRenderer=f,r.ObjLoader=w,r.PreviewRenderer=y,r.Renderer=l,r.createProgram=m,Object.defineProperty(r,Symbol.toStringTag,{value:"Module"})}));
59
+ `;return new j.Program(t,{vertex:e,fragment:r,cullFace:!1,uniforms:{uHit:{value:0},uSelected:{value:0}}})}class He extends j.Mesh{isHit;constructor(e,r){super(e,r),this.isHit=!1}}class ye{gl;scene;camera;canvas;program;meshes;constructor(e){this.canvas=e,this.gl=new j.Renderer({canvas:e,dpr:2}),this.gl.setSize(e.clientWidth,e.clientHeight),this.gl.gl.clearColor(.1,.1,.1,1),this.scene=new j.Transform,this.camera=new j.Camera(this.gl.gl,{fov:45}),this.camera.position.set(1,1,7),this.camera.lookAt([0,0,0]),this.program=ht(this.gl.gl),this.meshes=[]}resize(){this.gl.setSize(this.canvas.width,this.canvas.height),this.camera.perspective({aspect:this.canvas.width/this.canvas.height})}render(){this.gl.render({scene:this.scene,camera:this.camera})}update(){}loop(){this.update(),this.render(),requestAnimationFrame(this.loop.bind(this))}addFigure(e){const r=new j.Geometry(this.gl.gl,{position:{size:3,data:new Float32Array(e.position)},normal:{size:3,data:new Float32Array(e.normal??[])},uv:{size:2,data:new Float32Array(e.uv??[])}}),i=new He(this.gl.gl,{geometry:r,program:this.program});return i.setParent(this.scene),this.meshes.push(i),i}addMesh(e){this.scene.addChild(e)}getContext(){return this.gl.gl}removeMesh(e){this.scene.removeChild(e)}getMeshes(){return this.meshes}getProgram(){return this.program}destroy(){this.meshes&&(this.meshes.length=0,this.meshes=[]),this.scene=null,this.camera=null,this.program=null,this.gl=null,this.canvas=null}}class dt extends j.Orbit{isInteracting=!1;_element;constructor(e,r={}){super(e,r),this._element=r.element||document,this._element.addEventListener("mousedown",()=>this.isInteracting=!0),this._element.addEventListener("mouseup",()=>this.isInteracting=!1),this._element.addEventListener("touchstart",()=>this.isInteracting=!0),this._element.addEventListener("touchend",()=>this.isInteracting=!1)}destroy(){this._element.removeEventListener("mousedown",()=>this.isInteracting=!0),this._element.removeEventListener("mouseup",()=>this.isInteracting=!1),this._element.removeEventListener("touchstart",()=>this.isInteracting=!0),this._element.removeEventListener("touchend",()=>this.isInteracting=!1)}}var me;(function(t){t[t.Transient=0]="Transient",t[t.Singleton=1]="Singleton",t[t.ResolutionScoped=2]="ResolutionScoped",t[t.ContainerScoped=3]="ContainerScoped"})(me||(me={}));const N=me;/*! *****************************************************************************
60
+ Copyright (c) Microsoft Corporation.
61
+
62
+ Permission to use, copy, modify, and/or distribute this software for any
63
+ purpose with or without fee is hereby granted.
64
+
65
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
66
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
67
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
68
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
69
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
70
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
71
+ PERFORMANCE OF THIS SOFTWARE.
72
+ ***************************************************************************** */var _e=function(t,e){return _e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,i){r.__proto__=i}||function(r,i){for(var o in i)i.hasOwnProperty(o)&&(r[o]=i[o])},_e(t,e)};function ge(t,e){_e(t,e);function r(){this.constructor=t}t.prototype=e===null?Object.create(e):(r.prototype=e.prototype,new r)}function vt(t,e,r,i){function o(n){return n instanceof r?n:new r(function(l){l(n)})}return new(r||(r=Promise))(function(n,l){function w(S){try{m(i.next(S))}catch(H){l(H)}}function E(S){try{m(i.throw(S))}catch(H){l(H)}}function m(S){S.done?n(S.value):o(S.value).then(w,E)}m((i=i.apply(t,[])).next())})}function pt(t,e){var r={label:0,sent:function(){if(n[0]&1)throw n[1];return n[1]},trys:[],ops:[]},i,o,n,l;return l={next:w(0),throw:w(1),return:w(2)},typeof Symbol=="function"&&(l[Symbol.iterator]=function(){return this}),l;function w(m){return function(S){return E([m,S])}}function E(m){if(i)throw new TypeError("Generator is already executing.");for(;r;)try{if(i=1,o&&(n=m[0]&2?o.return:m[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,m[1])).done)return n;switch(o=0,n&&(m=[m[0]&2,n.value]),m[0]){case 0:case 1:n=m;break;case 4:return r.label++,{value:m[1],done:!1};case 5:r.label++,o=m[1],m=[0];continue;case 7:m=r.ops.pop(),r.trys.pop();continue;default:if(n=r.trys,!(n=n.length>0&&n[n.length-1])&&(m[0]===6||m[0]===2)){r=0;continue}if(m[0]===3&&(!n||m[1]>n[0]&&m[1]<n[3])){r.label=m[1];break}if(m[0]===6&&r.label<n[1]){r.label=n[1],n=m;break}if(n&&r.label<n[2]){r.label=n[2],r.ops.push(m);break}n[2]&&r.ops.pop(),r.trys.pop();continue}m=e.call(t,r)}catch(S){m=[6,S],o=0}finally{i=n=0}if(m[0]&5)throw m[1];return{value:m[0]?m[1]:void 0,done:!0}}}function ie(t){var e=typeof Symbol=="function"&&Symbol.iterator,r=e&&t[e],i=0;if(r)return r.call(t);if(t&&typeof t.length=="number")return{next:function(){return t&&i>=t.length&&(t=void 0),{value:t&&t[i++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function se(t,e){var r=typeof Symbol=="function"&&t[Symbol.iterator];if(!r)return t;var i=r.call(t),o,n=[],l;try{for(;(e===void 0||e-- >0)&&!(o=i.next()).done;)n.push(o.value)}catch(w){l={error:w}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(l)throw l.error}}return n}function Z(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(se(arguments[e]));return t}var we="injectionTokens";function yt(t){var e=Reflect.getMetadata("design:paramtypes",t)||[],r=Reflect.getOwnMetadata(we,t)||{};return Object.keys(r).forEach(function(i){e[+i]=r[i]}),e}function Ne(t,e){return function(r,i,o){var n=Reflect.getOwnMetadata(we,r)||{};n[o]=t,Reflect.defineMetadata(we,n,r)}}function Fe(t){return!!t.useClass}function Me(t){return!!t.useFactory}var Be=(function(){function t(e){this.wrap=e,this.reflectMethods=["get","getPrototypeOf","setPrototypeOf","getOwnPropertyDescriptor","defineProperty","has","set","deleteProperty","apply","construct","ownKeys"]}return t.prototype.createProxy=function(e){var r=this,i={},o=!1,n,l=function(){return o||(n=e(r.wrap()),o=!0),n};return new Proxy(i,this.createHandler(l))},t.prototype.createHandler=function(e){var r={},i=function(o){r[o]=function(){for(var n=[],l=0;l<arguments.length;l++)n[l]=arguments[l];n[0]=e();var w=Reflect[o];return w.apply(void 0,Z(n))}};return this.reflectMethods.forEach(i),r},t})();function Q(t){return typeof t=="string"||typeof t=="symbol"}function mt(t){return typeof t=="object"&&"token"in t&&"multiple"in t}function $e(t){return typeof t=="object"&&"token"in t&&"transform"in t}function _t(t){return typeof t=="function"||t instanceof Be}function oe(t){return!!t.useToken}function ae(t){return t.useValue!=null}function gt(t){return Fe(t)||ae(t)||oe(t)||Me(t)}var be=(function(){function t(){this._registryMap=new Map}return t.prototype.entries=function(){return this._registryMap.entries()},t.prototype.getAll=function(e){return this.ensure(e),this._registryMap.get(e)},t.prototype.get=function(e){this.ensure(e);var r=this._registryMap.get(e);return r[r.length-1]||null},t.prototype.set=function(e,r){this.ensure(e),this._registryMap.get(e).push(r)},t.prototype.setAll=function(e,r){this._registryMap.set(e,r)},t.prototype.has=function(e){return this.ensure(e),this._registryMap.get(e).length>0},t.prototype.clear=function(){this._registryMap.clear()},t.prototype.ensure=function(e){this._registryMap.has(e)||this._registryMap.set(e,[])},t})(),wt=(function(t){ge(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e})(be),ue=(function(){function t(){this.scopedResolutions=new Map}return t})();function Mt(t,e){if(t===null)return"at position #"+e;var r=t.split(",")[e].trim();return'"'+r+'" at position #'+e}function bt(t,e,r){return r===void 0&&(r=" "),Z([t],e.message.split(`
73
+ `).map(function(i){return r+i})).join(`
74
+ `)}function Ot(t,e,r){var i=se(t.toString().match(/constructor\(([\w, ]+)\)/)||[],2),o=i[1],n=o===void 0?null:o,l=Mt(n,e);return bt("Cannot inject the dependency "+l+' of "'+t.name+'" constructor. Reason:',r)}function Et(t){if(typeof t.dispose!="function")return!1;var e=t.dispose;return!(e.length>0)}var Rt=(function(t){ge(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e})(be),Pt=(function(t){ge(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e})(be),Ct=(function(){function t(){this.preResolution=new Rt,this.postResolution=new Pt}return t})(),We=new Map,St=(function(){function t(e){this.parent=e,this._registry=new wt,this.interceptors=new Ct,this.disposed=!1,this.disposables=new Set}return t.prototype.register=function(e,r,i){i===void 0&&(i={lifecycle:N.Transient}),this.ensureNotDisposed();var o;if(gt(r)?o=r:o={useClass:r},oe(o))for(var n=[e],l=o;l!=null;){var w=l.useToken;if(n.includes(w))throw new Error("Token registration cycle detected! "+Z(n,[w]).join(" -> "));n.push(w);var E=this._registry.get(w);E&&oe(E.provider)?l=E.provider:l=null}if((i.lifecycle===N.Singleton||i.lifecycle==N.ContainerScoped||i.lifecycle==N.ResolutionScoped)&&(ae(o)||Me(o)))throw new Error('Cannot use lifecycle "'+N[i.lifecycle]+'" with ValueProviders or FactoryProviders');return this._registry.set(e,{provider:o,options:i}),this},t.prototype.registerType=function(e,r){return this.ensureNotDisposed(),Q(r)?this.register(e,{useToken:r}):this.register(e,{useClass:r})},t.prototype.registerInstance=function(e,r){return this.ensureNotDisposed(),this.register(e,{useValue:r})},t.prototype.registerSingleton=function(e,r){if(this.ensureNotDisposed(),Q(e)){if(Q(r))return this.register(e,{useToken:r},{lifecycle:N.Singleton});if(r)return this.register(e,{useClass:r},{lifecycle:N.Singleton});throw new Error('Cannot register a type name as a singleton without a "to" token')}var i=e;return r&&!Q(r)&&(i=r),this.register(e,{useClass:i},{lifecycle:N.Singleton})},t.prototype.resolve=function(e,r,i){r===void 0&&(r=new ue),i===void 0&&(i=!1),this.ensureNotDisposed();var o=this.getRegistration(e);if(!o&&Q(e)){if(i)return;throw new Error('Attempted to resolve unregistered dependency token: "'+e.toString()+'"')}if(this.executePreResolutionInterceptor(e,"Single"),o){var n=this.resolveRegistration(o,r);return this.executePostResolutionInterceptor(e,n,"Single"),n}if(_t(e)){var n=this.construct(e,r);return this.executePostResolutionInterceptor(e,n,"Single"),n}throw new Error("Attempted to construct an undefined constructor. Could mean a circular dependency problem. Try using `delay` function.")},t.prototype.executePreResolutionInterceptor=function(e,r){var i,o;if(this.interceptors.preResolution.has(e)){var n=[];try{for(var l=ie(this.interceptors.preResolution.getAll(e)),w=l.next();!w.done;w=l.next()){var E=w.value;E.options.frequency!="Once"&&n.push(E),E.callback(e,r)}}catch(m){i={error:m}}finally{try{w&&!w.done&&(o=l.return)&&o.call(l)}finally{if(i)throw i.error}}this.interceptors.preResolution.setAll(e,n)}},t.prototype.executePostResolutionInterceptor=function(e,r,i){var o,n;if(this.interceptors.postResolution.has(e)){var l=[];try{for(var w=ie(this.interceptors.postResolution.getAll(e)),E=w.next();!E.done;E=w.next()){var m=E.value;m.options.frequency!="Once"&&l.push(m),m.callback(e,r,i)}}catch(S){o={error:S}}finally{try{E&&!E.done&&(n=w.return)&&n.call(w)}finally{if(o)throw o.error}}this.interceptors.postResolution.setAll(e,l)}},t.prototype.resolveRegistration=function(e,r){if(this.ensureNotDisposed(),e.options.lifecycle===N.ResolutionScoped&&r.scopedResolutions.has(e))return r.scopedResolutions.get(e);var i=e.options.lifecycle===N.Singleton,o=e.options.lifecycle===N.ContainerScoped,n=i||o,l;return ae(e.provider)?l=e.provider.useValue:oe(e.provider)?l=n?e.instance||(e.instance=this.resolve(e.provider.useToken,r)):this.resolve(e.provider.useToken,r):Fe(e.provider)?l=n?e.instance||(e.instance=this.construct(e.provider.useClass,r)):this.construct(e.provider.useClass,r):Me(e.provider)?l=e.provider.useFactory(this):l=this.construct(e.provider,r),e.options.lifecycle===N.ResolutionScoped&&r.scopedResolutions.set(e,l),l},t.prototype.resolveAll=function(e,r,i){var o=this;r===void 0&&(r=new ue),i===void 0&&(i=!1),this.ensureNotDisposed();var n=this.getAllRegistrations(e);if(!n&&Q(e)){if(i)return[];throw new Error('Attempted to resolve unregistered dependency token: "'+e.toString()+'"')}if(this.executePreResolutionInterceptor(e,"All"),n){var l=n.map(function(E){return o.resolveRegistration(E,r)});return this.executePostResolutionInterceptor(e,l,"All"),l}var w=[this.construct(e,r)];return this.executePostResolutionInterceptor(e,w,"All"),w},t.prototype.isRegistered=function(e,r){return r===void 0&&(r=!1),this.ensureNotDisposed(),this._registry.has(e)||r&&(this.parent||!1)&&this.parent.isRegistered(e,!0)},t.prototype.reset=function(){this.ensureNotDisposed(),this._registry.clear(),this.interceptors.preResolution.clear(),this.interceptors.postResolution.clear()},t.prototype.clearInstances=function(){var e,r;this.ensureNotDisposed();try{for(var i=ie(this._registry.entries()),o=i.next();!o.done;o=i.next()){var n=se(o.value,2),l=n[0],w=n[1];this._registry.setAll(l,w.filter(function(E){return!ae(E.provider)}).map(function(E){return E.instance=void 0,E}))}}catch(E){e={error:E}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.createChildContainer=function(){var e,r;this.ensureNotDisposed();var i=new t(this);try{for(var o=ie(this._registry.entries()),n=o.next();!n.done;n=o.next()){var l=se(n.value,2),w=l[0],E=l[1];E.some(function(m){var S=m.options;return S.lifecycle===N.ContainerScoped})&&i._registry.setAll(w,E.map(function(m){return m.options.lifecycle===N.ContainerScoped?{provider:m.provider,options:m.options}:m}))}}catch(m){e={error:m}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return i},t.prototype.beforeResolution=function(e,r,i){i===void 0&&(i={frequency:"Always"}),this.interceptors.preResolution.set(e,{callback:r,options:i})},t.prototype.afterResolution=function(e,r,i){i===void 0&&(i={frequency:"Always"}),this.interceptors.postResolution.set(e,{callback:r,options:i})},t.prototype.dispose=function(){return vt(this,void 0,void 0,function(){var e;return pt(this,function(r){switch(r.label){case 0:return this.disposed=!0,e=[],this.disposables.forEach(function(i){var o=i.dispose();o&&e.push(o)}),[4,Promise.all(e)];case 1:return r.sent(),[2]}})})},t.prototype.getRegistration=function(e){return this.isRegistered(e)?this._registry.get(e):this.parent?this.parent.getRegistration(e):null},t.prototype.getAllRegistrations=function(e){return this.isRegistered(e)?this._registry.getAll(e):this.parent?this.parent.getAllRegistrations(e):null},t.prototype.construct=function(e,r){var i=this;if(e instanceof Be)return e.createProxy(function(n){return i.resolve(n,r)});var o=(function(){var n=We.get(e);if(!n||n.length===0){if(e.length===0)return new e;throw new Error('TypeInfo not known for "'+e.name+'"')}var l=n.map(i.resolveParams(r,e));return new(e.bind.apply(e,Z([void 0],l)))})();return Et(o)&&this.disposables.add(o),o},t.prototype.resolveParams=function(e,r){var i=this;return function(o,n){var l,w,E;try{return mt(o)?$e(o)?o.multiple?(l=i.resolve(o.transform)).transform.apply(l,Z([i.resolveAll(o.token,new ue,o.isOptional)],o.transformArgs)):(w=i.resolve(o.transform)).transform.apply(w,Z([i.resolve(o.token,e,o.isOptional)],o.transformArgs)):o.multiple?i.resolveAll(o.token,new ue,o.isOptional):i.resolve(o.token,e,o.isOptional):$e(o)?(E=i.resolve(o.transform,e)).transform.apply(E,Z([i.resolve(o.token,e)],o.transformArgs)):i.resolve(o,e)}catch(m){throw new Error(Ot(r,n,m))}}},t.prototype.ensureNotDisposed=function(){if(this.disposed)throw new Error("This container has been disposed, you cannot interact with a disposed container")},t})(),It=new St;function G(t,e){var r={token:t,multiple:!1,isOptional:e};return Ne(r)}function V(t){return function(e){We.set(e,yt(e))}}function Ge(t,e){var r={token:t,multiple:!0,isOptional:e};return Ne(r)}if(typeof Reflect>"u"||!Reflect.getMetadata)throw new Error(`tsyringe requires a reflect polyfill. Please add 'import "reflect-metadata"' to the top of your entry point.`);var le={exports:{}},Ve;function Lt(){if(Ve)return le.exports;Ve=1;var t=typeof Reflect=="object"?Reflect:null,e=t&&typeof t.apply=="function"?t.apply:function(f,d,g){return Function.prototype.apply.call(f,d,g)},r;t&&typeof t.ownKeys=="function"?r=t.ownKeys:Object.getOwnPropertySymbols?r=function(f){return Object.getOwnPropertyNames(f).concat(Object.getOwnPropertySymbols(f))}:r=function(f){return Object.getOwnPropertyNames(f)};function i(c){console&&console.warn&&console.warn(c)}var o=Number.isNaN||function(f){return f!==f};function n(){n.init.call(this)}le.exports=n,le.exports.once=K,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var l=10;function w(c){if(typeof c!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof c)}Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return l},set:function(c){if(typeof c!="number"||c<0||o(c))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+c+".");l=c}}),n.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(f){if(typeof f!="number"||f<0||o(f))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+f+".");return this._maxListeners=f,this};function E(c){return c._maxListeners===void 0?n.defaultMaxListeners:c._maxListeners}n.prototype.getMaxListeners=function(){return E(this)},n.prototype.emit=function(f){for(var d=[],g=1;g<arguments.length;g++)d.push(arguments[g]);var O=f==="error",I=this._events;if(I!==void 0)O=O&&I.error===void 0;else if(!O)return!1;if(O){var R;if(d.length>0&&(R=d[0]),R instanceof Error)throw R;var F=new Error("Unhandled error."+(R?" ("+R.message+")":""));throw F.context=R,F}var Y=I[f];if(Y===void 0)return!1;if(typeof Y=="function")e(Y,this,d);else for(var ve=Y.length,Ie=X(Y,ve),g=0;g<ve;++g)e(Ie[g],this,d);return!0};function m(c,f,d,g){var O,I,R;if(w(d),I=c._events,I===void 0?(I=c._events=Object.create(null),c._eventsCount=0):(I.newListener!==void 0&&(c.emit("newListener",f,d.listener?d.listener:d),I=c._events),R=I[f]),R===void 0)R=I[f]=d,++c._eventsCount;else if(typeof R=="function"?R=I[f]=g?[d,R]:[R,d]:g?R.unshift(d):R.push(d),O=E(c),O>0&&R.length>O&&!R.warned){R.warned=!0;var F=new Error("Possible EventEmitter memory leak detected. "+R.length+" "+String(f)+" listeners added. Use emitter.setMaxListeners() to increase limit");F.name="MaxListenersExceededWarning",F.emitter=c,F.type=f,F.count=R.length,i(F)}return c}n.prototype.addListener=function(f,d){return m(this,f,d,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(f,d){return m(this,f,d,!0)};function S(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function H(c,f,d){var g={fired:!1,wrapFn:void 0,target:c,type:f,listener:d},O=S.bind(g);return O.listener=d,g.wrapFn=O,O}n.prototype.once=function(f,d){return w(d),this.on(f,H(this,f,d)),this},n.prototype.prependOnceListener=function(f,d){return w(d),this.prependListener(f,H(this,f,d)),this},n.prototype.removeListener=function(f,d){var g,O,I,R,F;if(w(d),O=this._events,O===void 0)return this;if(g=O[f],g===void 0)return this;if(g===d||g.listener===d)--this._eventsCount===0?this._events=Object.create(null):(delete O[f],O.removeListener&&this.emit("removeListener",f,g.listener||d));else if(typeof g!="function"){for(I=-1,R=g.length-1;R>=0;R--)if(g[R]===d||g[R].listener===d){F=g[R].listener,I=R;break}if(I<0)return this;I===0?g.shift():re(g,I),g.length===1&&(O[f]=g[0]),O.removeListener!==void 0&&this.emit("removeListener",f,F||d)}return this},n.prototype.off=n.prototype.removeListener,n.prototype.removeAllListeners=function(f){var d,g,O;if(g=this._events,g===void 0)return this;if(g.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):g[f]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete g[f]),this;if(arguments.length===0){var I=Object.keys(g),R;for(O=0;O<I.length;++O)R=I[O],R!=="removeListener"&&this.removeAllListeners(R);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(d=g[f],typeof d=="function")this.removeListener(f,d);else if(d!==void 0)for(O=d.length-1;O>=0;O--)this.removeListener(f,d[O]);return this};function z(c,f,d){var g=c._events;if(g===void 0)return[];var O=g[f];return O===void 0?[]:typeof O=="function"?d?[O.listener||O]:[O]:d?q(O):X(O,O.length)}n.prototype.listeners=function(f){return z(this,f,!0)},n.prototype.rawListeners=function(f){return z(this,f,!1)},n.listenerCount=function(c,f){return typeof c.listenerCount=="function"?c.listenerCount(f):U.call(c,f)},n.prototype.listenerCount=U;function U(c){var f=this._events;if(f!==void 0){var d=f[c];if(typeof d=="function")return 1;if(d!==void 0)return d.length}return 0}n.prototype.eventNames=function(){return this._eventsCount>0?r(this._events):[]};function X(c,f){for(var d=new Array(f),g=0;g<f;++g)d[g]=c[g];return d}function re(c,f){for(;f+1<c.length;f++)c[f]=c[f+1];c.pop()}function q(c){for(var f=new Array(c.length),d=0;d<f.length;++d)f[d]=c[d].listener||c[d];return f}function K(c,f){return new Promise(function(d,g){function O(R){c.removeListener(f,I),g(R)}function I(){typeof c.removeListener=="function"&&c.removeListener("error",O),d([].slice.call(arguments))}de(c,f,I,{once:!0}),f!=="error"&&he(c,O,{once:!0})})}function he(c,f,d){typeof c.on=="function"&&de(c,"error",f,d)}function de(c,f,d,g){if(typeof c.on=="function")g.once?c.once(f,d):c.on(f,d);else if(typeof c.addEventListener=="function")c.addEventListener(f,function O(I){g.once&&c.removeEventListener(f,O),d(I)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof c)}return le.exports}var Tt=Lt(),xt=Object.getOwnPropertyDescriptor,At=(t,e,r,i)=>{for(var o=i>1?void 0:i?xt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o};T.EventBus=class{_emitter;constructor(){this._emitter=new Tt.EventEmitter}emit(e,r){this._emitter.emit(e,r)}on(e,r){this._emitter.on(e,r)}off(e,r){this._emitter.off(e,r)}},T.EventBus=At([V()],T.EventBus);var J=(t=>(t.SelectHover="select.hover",t.SelectClick="select.click",t))(J||{}),jt=Object.getOwnPropertyDescriptor,kt=(t,e,r,i)=>{for(var o=i>1?void 0:i?jt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},ze=(t,e)=>(r,i)=>e(r,i,t);T.EditorRenderer=class extends ye{constructor(e,r){super(e),this._canvas=e,this._bus=r;const i=new j.GridHelper(this.gl.gl,{size:10,divisions:10});i.position.y=-.001,i.setParent(this.scene),new j.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this._orbit=new dt(this.camera,{element:this.canvas}),this._raycast=new j.Raycast,this._mouse=new j.Vec2,this._isEventListenersAdded=!1}_orbit;_raycast;_mouse;_isEventListenersAdded;update(){this._orbit?.update()}addFigure(e){const r=super.addFigure(e);if(r.geometry){const i=r.geometry.constructor.name;r.geometry.raycast=i.includes("Sphere")?"sphere":"box"}return this._isEventListenersAdded||this.initMouseListeners(),r}setMeshBeforeRender(e,r){e.onBeforeRender(r)}initMouseListeners(){document.addEventListener("mousemove",this._handleMouseMove,!1),document.addEventListener("click",this._handleMouseClick,!1),this._isEventListenersAdded=!0}_handleMouseMove=e=>{this._processRaycastEvent(e,J.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,J.SelectClick,!1)};_processRaycastEvent(e,r,i){if(this._orbit.isInteracting)return;this._mouse.set(2*(e.x/this.gl.width)-1,2*(1-e.y/this.gl.height)-1),this._raycast.castMouse(this.camera,this._mouse),i&&this.meshes.forEach(l=>l.isHit=!1);const o=this._raycast.intersectBounds(this.meshes),n=o.length?o[0]:null;this._bus.emit(r,n?{mesh:n}:null),i&&o.forEach(l=>l.isHit=!0)}destroy(){this._isEventListenersAdded&&(document.removeEventListener("mousemove",this._handleMouseMove,!1),document.removeEventListener("click",this._handleMouseClick,!1),this._isEventListenersAdded=!1),this._orbit.destroy(),this._orbit=null,this._raycast=null,this._mouse=null,super.destroy()}},T.EditorRenderer=kt([V(),ze(0,G("Canvas")),ze(1,G("EventBus"))],T.EditorRenderer);class Dt extends ye{_orbit;constructor(e){super(e),this._orbit=new j.Orbit(this.camera,{element:this.canvas,target:new j.Vec3(0,0,0),minPolarAngle:Math.PI/2,maxPolarAngle:Math.PI/2,enableRotate:!0,enableZoom:!1,enablePan:!1})}update(){this._orbit?.update()}}class Ht{type;position;normal;uv;material;constructor(e){this.type=e.type,this.position=e.position,this.normal=e.normal??[],this.uv=e.uv??[],this.material=e.material}}var Ue=(t=>(t[t.Cube=0]="Cube",t[t.Sphere=1]="Sphere",t[t.Plane=2]="Plane",t[t.Cylinder=3]="Cylinder",t[t.Custom=4]="Custom",t))(Ue||{}),te=(t=>(t.Plane="plane",t.Wireframe="wireframe",t.Texture="texture",t))(te||{}),fe=(t=>(t.Mesh="mesh",t.Face="face",t.Edge="edge",t.Vertex="vertex",t))(fe||{});class Nt{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(e){const r=e.split(`
75
+ `);for(const o of r){if(!o.trim()||o.startsWith("#"))continue;const n=o.trim().split(/\s+/);switch(n[0]){case"v":this._tmpPositions.push(n.slice(1).map(Number));break;case"vn":this._tmpNormals.push(n.slice(1).map(Number));break;case"vt":this._tmpUVs.push(n.slice(1).map(Number));break;case"f":this.processFaceLine(n);break}}const i={type:Ue.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new Ht(i)}processFaceLine(e){for(let r=1;r<e.length;r++){const i=e[r];if(!i)continue;const[o,n,l]=i.split("/"),w=o?parseInt(o,10):void 0,E=n?parseInt(n,10):void 0,m=l?parseInt(l,10):void 0;if(w!==void 0){const S=this._tmpPositions[w-1];S&&this._positions.push(...S)}if(E!==void 0){const S=this._tmpUVs[E-1];S&&this._uvs.push(...S)}if(m!==void 0){const S=this._tmpNormals[m-1];S&&this._normals.push(...S)}}}}var Ft=Object.getOwnPropertyDescriptor,Bt=(t,e,r,i)=>{for(var o=i>1?void 0:i?Ft(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},$t=(t,e)=>(r,i)=>e(r,i,t);let Oe=class{_currentMode=te.Plane;_handlers;constructor(t){this._handlers=new Map(t.map(e=>[e.mode,e]))}manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),t!==te.Plane&&this._handlers.get(t)?.handle(),this._currentMode=t)}destroy(){this._handlers&&this._handlers.clear(),this._currentMode=te.Plane}};Oe=Bt([V(),$t(0,Ge("IDisplayHandler"))],Oe);var ce=(t=>(t.Hover="hover",t.Click="click",t))(ce||{}),Wt=Object.getOwnPropertyDescriptor,Gt=(t,e,r,i)=>{for(var o=i>1?void 0:i?Wt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},qe=(t,e)=>(r,i)=>e(r,i,t);let Ee=class{constructor(t,e){this._eventBus=t,this._handlers=new Map(e.map(r=>[r.mode,r])),this._eventBus.on(J.SelectHover,this._onHover),this._eventBus.on(J.SelectClick,this._onClick)}_currentMode=fe.Mesh;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=t)}_onHover=t=>{if(!t)return;this._handlers.get(this._currentMode)?.handle(t,ce.Hover)};_onClick=t=>{if(!t)return;this._handlers.get(this._currentMode)?.handle(t,ce.Click)};destroy(){this._eventBus.off(J.SelectHover,this._onHover)}};Ee=Gt([V(),qe(0,G("EventBus")),qe(1,Ge("ISelectHandler"))],Ee);var Vt=Object.getOwnPropertyDescriptor,zt=(t,e,r,i)=>{for(var o=i>1?void 0:i?Vt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},Ut=(t,e)=>(r,i)=>e(r,i,t);let Re=class{constructor(t){this._api=t,this._wireMeshes=[],this._context=this._api.getContext(),this._wireMeshProgram=new j.NormalProgram(this._context)}mode=te.Wireframe;_wireMeshes;_wireMeshProgram;_context;handle(){const t=this._api.getMeshes();this.createWireMeshes(t),this._api.removeMeshes(t),this._api.addMeshes(this._wireMeshes)}rollback(){const t=this._api.getMeshes();this._api.removeMeshes(this._wireMeshes),this._api.addMeshes(t)}destroy(){this._wireMeshes&&(this._wireMeshes.length=0,this._wireMeshes=[])}createWireMeshes(t){for(const e of t){const r=new j.WireMesh(this._context,{geometry:e.geometry,program:this._wireMeshProgram});this._wireMeshes.push(r)}}};Re=zt([V(),Ut(0,G("RendererApi"))],Re);var qt=Object.getOwnPropertyDescriptor,Zt=(t,e,r,i)=>{for(var o=i>1?void 0:i?qt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},Jt=(t,e)=>(r,i)=>e(r,i,t);let Pe=class{constructor(t){this._api=t,this._program=t.getProgram(),this._selectedMesh=null}mode=fe.Mesh;_program;_selectedMesh;handle(t,e){if(!t)return;const{mesh:r}=t;e===ce.Hover?this._api.setMeshBeforeRender(r,()=>this._onHover(r)):this._api.setMeshBeforeRender(r,()=>this._onClick(r))}_onHover=t=>{t.program.uniforms.uHit.value=t.isHit?1:0};_onClick=t=>{this._selectedMesh&&this._selectedMesh.program?.uniforms.uSelected&&(this._selectedMesh.program.uniforms.uSelected.value=0),this._selectedMesh=t,t.program?.uniforms.uSelected&&(t.program.uniforms.uSelected.value=1),console.log(`Selected mesh: ${t.id}`)};rollback(){this._program.uniforms.uHit.value=0}destroy(){this.rollback()}};Pe=Zt([V(),Jt(0,G("RendererApi"))],Pe);var Yt=Object.getOwnPropertyDescriptor,Qt=(t,e,r,i)=>{for(var o=i>1?void 0:i?Yt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},Xt=(t,e)=>(r,i)=>e(r,i,t);let Ce=class{constructor(t){this._renderer=t}addMesh(t){this._renderer.addMesh(t)}addMeshes(t){for(const e of t)this._renderer.addMesh(e)}removeMesh(t){this._renderer.removeMesh(t)}removeMeshes(t){for(const e of t)this._renderer.removeMesh(e)}getMeshes(){return this._renderer.getMeshes()}getContext(){return this._renderer.getContext()}getProgram(){return this._renderer.getProgram()}setMeshBeforeRender(t,e){this._renderer.setMeshBeforeRender(t,e)}};Ce=Qt([V(),Xt(0,G("EditorRenderer"))],Ce);var Kt=Object.getOwnPropertyDescriptor,er=(t,e,r,i)=>{for(var o=i>1?void 0:i?Kt(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(o=l(o)||o);return o},Se=(t,e)=>(r,i)=>e(r,i,t);T.EditorHub=class{constructor(e,r,i){this._displayManager=e,this._selectManager=r,this._renderer=i,r.manage(fe.Mesh)}setDisplayMode(e){this._displayManager.manage(e)}setSelectMode(e){this._selectManager.manage(e)}resizeRenderer(){this._renderer.resize()}updateRenderer(){this._renderer.loop()}addFigure(e){this._renderer.addFigure(e)}destroy(){this._displayManager.destroy(),this._selectManager.destroy(),this._renderer.destroy()}},T.EditorHub=er([V(),Se(0,G("IDisplayManager")),Se(1,G("ISelectManager")),Se(2,G("EditorRenderer"))],T.EditorHub);let Ze=!1;const B=It.createChildContainer();function tr(t){return Ze||(B.registerInstance("Canvas",t),B.registerSingleton("EventBus",T.EventBus),B.registerSingleton("EditorRenderer",T.EditorRenderer),B.registerSingleton("RendererApi",Ce),B.registerSingleton("IDisplayHandler",Re),B.registerSingleton("ISelectHandler",Pe),B.registerSingleton("IDisplayManager",Oe),B.registerSingleton("ISelectManager",Ee),B.registerSingleton("EditorHub",T.EditorHub),Ze=!0),B}function rr(t){return tr(t).resolve("EditorHub")}T.EditorMesh=He,T.EventTopics=J,T.ObjLoader=Nt,T.PreviewRenderer=Dt,T.Renderer=ye,T.createAppHub=rr,Object.defineProperty(T,Symbol.toStringTag,{value:"Module"})}));
@@ -0,0 +1,39 @@
1
+ import { Mesh } from 'ogl';
2
+ /**
3
+ * Интерфейс для управления фигурами внутри рендерера.
4
+ * Предоставляет базовый CRUD-набор операций для добавления, удаления и получения фигур из сцены.
5
+ * @internal
6
+ */
7
+ export interface IMeshApi {
8
+ /**
9
+ * Добавляет фигуру в сцену.
10
+ *
11
+ * @param mesh - Фигура, которую необходимо добавить.
12
+ */
13
+ addMesh(mesh: Mesh): void;
14
+ /**
15
+ * Добавляет несколько фигур в сцену за один вызов.
16
+ *
17
+ * @param meshes - Массив фигур для добавления.
18
+ */
19
+ addMeshes(meshes: Mesh[]): void;
20
+ /**
21
+ * Удаляет фигуру из сцены.
22
+ *
23
+ * @param mesh - Фигура, которую необходимо удалить.
24
+ */
25
+ removeMesh(mesh: Mesh): void;
26
+ /**
27
+ * Удаляет несколько фигур из сцены за один вызов.
28
+ *
29
+ * @param meshes - Массив фигур для удаления.
30
+ */
31
+ removeMeshes(meshes: Mesh[]): void;
32
+ /**
33
+ * Возвращает список всех фигур, находящихся в сцене.
34
+ *
35
+ * @returns Массив текущих фигур.
36
+ */
37
+ getMeshes(): Mesh[];
38
+ }
39
+ //# sourceMappingURL=mesh-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/mesh-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAE1B;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEhC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAE7B;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACH,SAAS,IAAI,IAAI,EAAE,CAAC;CACrB"}
@@ -0,0 +1,27 @@
1
+ import { Mesh, MeshRenderCallback, OGLRenderingContext, Program } from 'ogl';
2
+ /**
3
+ * Интерфейс API рендерера.
4
+ * Предоставляет доступ к базовым возможностям ядра рендерера
5
+ * @internal
6
+ */
7
+ export interface IRendererApi {
8
+ /**
9
+ * Возвращает WebGL контекст рендерера.
10
+ *
11
+ * @returns Контекст WebGL (OGLRenderingContext) текущей сцены.
12
+ */
13
+ getContext(): OGLRenderingContext;
14
+ /**
15
+ * Возвращает настройку для рендеринга.
16
+ *
17
+ * @returns Program для настройки рендеринга моделей.
18
+ */
19
+ getProgram(): Program;
20
+ /**
21
+ *
22
+ * @param mesh
23
+ * @param f
24
+ */
25
+ setMeshBeforeRender(mesh: Mesh, f: MeshRenderCallback): void;
26
+ }
27
+ //# sourceMappingURL=renderer-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/renderer-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAElF;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,UAAU,IAAI,mBAAmB,CAAC;IAElC;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAAC;IAEtB;;;;OAIG;IACH,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;CAC9D"}
@@ -0,0 +1,13 @@
1
+ import { IHandler } from './handler';
2
+ import { DisplayMode } from '@planara/types';
3
+ /**
4
+ * Маркерный интерфейс для всех Display-хендлеров.
5
+ * Используется только для DI.
6
+ *
7
+ * Расширяет {@link IHandler} и добавляет поле `mode`
8
+ * @internal
9
+ */
10
+ export interface IDisplayHandler extends IHandler {
11
+ mode: DisplayMode;
12
+ }
13
+ //# sourceMappingURL=display-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-handler.d.ts","sourceRoot":"","sources":["../../../src/interfaces/handler/display-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,IAAI,EAAE,WAAW,CAAC;CACnB"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Общий интерфейс для всех хендлеров.
3
+ * Хендлеры выполняют действия по настройке рендерера,
4
+ * управляют состоянием сцены или конкретных режимов отображения.
5
+ * @internal
6
+ */
7
+ export interface IHandler {
8
+ /**
9
+ * Выполняет основное действие хендлера.
10
+ * Например, применяет конкретный режим отображения или модифицирует настройки рендерера.
11
+ */
12
+ handle(...args: unknown[]): void;
13
+ /**
14
+ * Откатывает изменения, внесённые методом handle().
15
+ * Используется для восстановления предыдущего состояния рендерера.
16
+ */
17
+ rollback(): void;
18
+ /**
19
+ * Освобождает ресурсы хендлера, удаляет слушатели и очищает внутренние данные.
20
+ */
21
+ destroy(): void;
22
+ }
23
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/interfaces/handler/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,QAAQ;IACvB;;;OAGG;IACH,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEjC;;;OAGG;IACH,QAAQ,IAAI,IAAI,CAAC;IAEjB;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,13 @@
1
+ import { IHandler } from './handler';
2
+ import { SelectMode } from '@planara/types';
3
+ /**
4
+ * Маркерный интерфейс для всех Select-хендлеров.
5
+ * Используется только для DI.
6
+ *
7
+ * Расширяет {@link IHandler} и добавляет поле `mode`
8
+ * @internal
9
+ */
10
+ export interface ISelectHandler extends IHandler {
11
+ mode: SelectMode;
12
+ }
13
+ //# sourceMappingURL=select-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-handler.d.ts","sourceRoot":"","sources":["../../../src/interfaces/handler/select-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE,UAAU,CAAC;CAClB"}
@@ -0,0 +1,8 @@
1
+ import { IManager } from './manager';
2
+ /**
3
+ * Маркерный интерфейс для менеджеров отображения.
4
+ * @public
5
+ */
6
+ export interface IDisplayManager extends IManager {
7
+ }
8
+ //# sourceMappingURL=display-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-manager.d.ts","sourceRoot":"","sources":["../../../src/interfaces/manager/display-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,eAAgB,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Общий интерфейс для всех менеджеров в хабе.
3
+ * Каждый менеджер отвечает за одну фичу.
4
+ * @public
5
+ */
6
+ export interface IManager {
7
+ /**
8
+ * Выполняет основное действие менеджера.
9
+ */
10
+ manage(...args: unknown[]): void;
11
+ /**
12
+ * Освобождает ресурсы менеджера.
13
+ */
14
+ destroy(): void;
15
+ }
16
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/interfaces/manager/manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAEjC;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,8 @@
1
+ import { IManager } from './manager';
2
+ /**
3
+ * Маркерный интерфейс для менеджеров выборки.
4
+ * @public
5
+ */
6
+ export interface ISelectManager extends IManager {
7
+ }
8
+ //# sourceMappingURL=select-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-manager.d.ts","sourceRoot":"","sources":["../../../src/interfaces/manager/select-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C;;;GAGG;AACH,MAAM,WAAW,cAAe,SAAQ,QAAQ;CAAG"}
@@ -0,0 +1,5 @@
1
+ import { DependencyContainer } from 'tsyringe';
2
+ declare const container: DependencyContainer;
3
+ export declare function createContainer(canvas: HTMLCanvasElement): DependencyContainer;
4
+ export { container };
5
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../src/ioc/container.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAgC,KAAK,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAsBlF,QAAA,MAAM,SAAS,qBAAyC,CAAC;AAEzD,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,CA2B9E;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -1,17 +1,18 @@
1
1
  import { Figure } from '@planara/types';
2
+ /** @public */
2
3
  export declare class ObjLoader {
3
4
  /** Позиции вершин */
4
- private positions;
5
+ private _positions;
5
6
  /** Нормали вершин */
6
- private normals;
7
+ private _normals;
7
8
  /** UV-координаты (опционально) */
8
- private uvs;
9
- private tmpPositions;
10
- private tmpNormals;
11
- private tmpUVs;
9
+ private _uvs;
10
+ private _tmpPositions;
11
+ private _tmpNormals;
12
+ private _tmpUVs;
12
13
  /**
13
14
  * Загружает OBJ-модель в Figure
14
- * @param objContent Строка содержимого .obj файла
15
+ * @param objContent - Строка содержимого .obj файла
15
16
  */
16
17
  load(objContent: string): Figure;
17
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"obj-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/obj-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA+B,MAAM,gBAAgB,CAAC;AAErE,qBAAa,SAAS;IACpB,qBAAqB;IACrB,OAAO,CAAC,SAAS,CAAgB;IAEjC,qBAAqB;IACrB,OAAO,CAAC,OAAO,CAAgB;IAE/B,kCAAkC;IAClC,OAAO,CAAC,GAAG,CAAgB;IAG3B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkB;IAEhC;;;OAGG;IACI,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAmCvC;;OAEG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
1
+ {"version":3,"file":"obj-loader.d.ts","sourceRoot":"","sources":["../../src/loaders/obj-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAA+B,MAAM,gBAAgB,CAAC;AAErE,cAAc;AACd,qBAAa,SAAS;IACpB,qBAAqB;IACrB,OAAO,CAAC,UAAU,CAAgB;IAElC,qBAAqB;IACrB,OAAO,CAAC,QAAQ,CAAgB;IAEhC,kCAAkC;IAClC,OAAO,CAAC,IAAI,CAAgB;IAG5B,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,OAAO,CAAkB;IAEjC;;;OAGG;IACI,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAmCvC;;OAEG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
@@ -0,0 +1,19 @@
1
+ import { IDisplayManager } from '../../interfaces/manager/display-manager';
2
+ import { DisplayMode } from '@planara/types';
3
+ import { IDisplayHandler } from '../../interfaces/handler/display-handler';
4
+ /**
5
+ * Менеджер для управления отображением
6
+ * @internal
7
+ */
8
+ export declare class DisplayManager implements IDisplayManager {
9
+ /** Текущий режим отображения */
10
+ private _currentMode;
11
+ /** Хендлеры, которые управляют отображением */
12
+ private readonly _handlers;
13
+ constructor(handlers: IDisplayHandler[]);
14
+ /** Установка режима отображения */
15
+ manage(mode: DisplayMode): void;
16
+ /** Освобождение ресурсов */
17
+ destroy(): void;
18
+ }
19
+ //# sourceMappingURL=display-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display-manager.d.ts","sourceRoot":"","sources":["../../../src/managers/display/display-manager.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAGhF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAEhF;;;GAGG;AACH,qBACa,cAAe,YAAW,eAAe;IACpD,gCAAgC;IAChC,OAAO,CAAC,YAAY,CAAkC;IAEtD,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;gBAEb,QAAQ,EAAE,eAAe,EAAE;IAIrE,mCAAmC;IACnC,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAc/B,4BAA4B;IAC5B,OAAO,IAAI,IAAI;CAOhB"}
@@ -0,0 +1,19 @@
1
+ import { ISelectHandler } from '../../interfaces/handler/select-handler';
2
+ import { ISelectManager } from '../../interfaces/manager/select-manager';
3
+ import { EventBus } from '../../events/event-bus';
4
+ import { SelectMode } from '@planara/types';
5
+ export declare class SelectManager implements ISelectManager {
6
+ private _eventBus;
7
+ /** Текущий режим выборки */
8
+ private _currentMode;
9
+ /** Хендлеры, которые управляют выборкой */
10
+ private readonly _handlers;
11
+ constructor(_eventBus: EventBus, handlers: ISelectHandler[]);
12
+ manage(mode: SelectMode): void;
13
+ /** Обработчик события наведения на модель */
14
+ private _onHover;
15
+ /** Обработчик события клика на модель */
16
+ private _onClick;
17
+ destroy(): void;
18
+ }
19
+ //# sourceMappingURL=select-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-manager.d.ts","sourceRoot":"","sources":["../../../src/managers/select/select-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAK9E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAKvD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,qBACa,aAAc,YAAW,cAAc;IAQ5B,OAAO,CAAC,SAAS;IAPvC,4BAA4B;IAC5B,OAAO,CAAC,YAAY,CAA+B;IAEnD,2CAA2C;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;gBAGxB,SAAS,EAAE,QAAQ,EAClB,QAAQ,EAAE,cAAc,EAAE;IAUzD,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAU9B,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAQd;IAEF,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAQd;IAEF,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.53.1"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Тип позиции камеры в мире.
3
+ * @public
4
+ */
5
+ export type CameraPosition = {
6
+ x: number;
7
+ y: number;
8
+ z: number;
9
+ };
10
+ //# sourceMappingURL=camera-position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-position.d.ts","sourceRoot":"","sources":["../../../src/types/camera/camera-position.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC"}
@@ -0,0 +1,6 @@
1
+ /** Тип события при выборке */
2
+ export declare enum SelectEventType {
3
+ Hover = "hover",
4
+ Click = "click"
5
+ }
6
+ //# sourceMappingURL=select-event-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-event-type.d.ts","sourceRoot":"","sources":["../../../src/types/event/select-event-type.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,oBAAY,eAAe;IACzB,KAAK,UAAU;IACf,KAAK,UAAU;CAChB"}
@@ -5,8 +5,9 @@ import { OGLRenderingContext, Program } from 'ogl';
5
5
  * Включает базовый vertex и fragment шейдеры, добавляет uniform `tMap` с дефолтной текстурой.
6
6
  * Этот Program можно использовать для всех фигур в сцене, а также для сетки и осей.
7
7
  *
8
- * @param {OGLRenderingContext} gl - WebGL контекст.
9
- * @returns {Program} Экземпляр Program с базовыми шейдерами и uniform.
8
+ * @param gl - WebGL контекст.
9
+ * @returns Экземпляр Program с базовыми шейдерами и uniform.
10
+ * @internal
10
11
  */
11
- export declare function createProgram(gl: OGLRenderingContext): Program;
12
+ export declare function _createProgram(gl: OGLRenderingContext): Program;
12
13
  //# sourceMappingURL=program-settings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"program-settings.d.ts","sourceRoot":"","sources":["../../src/utils/program-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAExD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAyC9D"}
1
+ {"version":3,"file":"program-settings.d.ts","sourceRoot":"","sources":["../../src/utils/program-settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAExD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,mBAAmB,GAAG,OAAO,CA2D/D"}
@@ -0,0 +1,21 @@
1
+ import { IMeshApi } from '../interfaces/api/mesh-api';
2
+ import { IRendererApi } from '../interfaces/api/renderer-api';
3
+ import { Mesh, MeshRenderCallback, OGLRenderingContext, Program } from 'ogl';
4
+ import { EditorRenderer } from '../core/editor-renderer';
5
+ /**
6
+ * API для EditorRenderer
7
+ * @internal
8
+ */
9
+ export declare class RendererApi implements IMeshApi, IRendererApi {
10
+ private _renderer;
11
+ constructor(_renderer: EditorRenderer);
12
+ addMesh(mesh: Mesh): void;
13
+ addMeshes(meshes: Mesh[]): void;
14
+ removeMesh(mesh: Mesh): void;
15
+ removeMeshes(meshes: Mesh[]): void;
16
+ getMeshes(): Mesh[];
17
+ getContext(): OGLRenderingContext;
18
+ getProgram(): Program;
19
+ setMeshBeforeRender(mesh: Mesh, f: MeshRenderCallback): void;
20
+ }
21
+ //# sourceMappingURL=renderer-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-api.d.ts","sourceRoot":"","sources":["../../src/utils/renderer-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAInE,OAAO,KAAK,EAAE,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAClF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;GAGG;AACH,qBACa,WAAY,YAAW,QAAQ,EAAE,YAAY;IAClB,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,cAAc;IAEhE,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAIzB,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI;IAM/B,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAI5B,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI;IAMlC,SAAS,IAAI,IAAI,EAAE;IAInB,UAAU,IAAI,mBAAmB;IAIjC,UAAU,IAAI,OAAO;IAIrB,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,kBAAkB,GAAG,IAAI;CAGpE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planara/core",
3
- "version": "1.4.9",
3
+ "version": "1.6.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -9,6 +9,14 @@
9
9
  "main": "dist/index.cjs.js",
10
10
  "module": "dist/index.es.js",
11
11
  "types": "dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "require": "./dist/index.cjs.js",
15
+ "types": "./dist/index.public.d.ts",
16
+ "import": "./dist/index.es.js"
17
+ }
18
+ },
19
+ "sideEffects": false,
12
20
  "files": [
13
21
  "dist"
14
22
  ],
@@ -17,7 +25,8 @@
17
25
  "build": "vite build",
18
26
  "lint": "eslint src --ext .ts,.js",
19
27
  "lint:fix": "eslint src --ext .ts,.js --fix",
20
- "format": "prettier --write 'src/**/*.{ts,js,json}'"
28
+ "format": "prettier --write 'src/**/*.{ts,js,json}'",
29
+ "api:extract": "api-extractor run --local"
21
30
  },
22
31
  "keywords": [
23
32
  "planara",
@@ -30,6 +39,7 @@
30
39
  "description": "Core rendering library for Planara",
31
40
  "devDependencies": {
32
41
  "@eslint/eslintrc": "^3.3.1",
42
+ "@microsoft/api-extractor": "^7.53.1",
33
43
  "@types/node": "^24.6.0",
34
44
  "@typescript-eslint/eslint-plugin": "^8.44.1",
35
45
  "@typescript-eslint/parser": "^8.44.1",
@@ -43,8 +53,11 @@
43
53
  "vite-tsconfig-paths": "^5.1.4"
44
54
  },
45
55
  "dependencies": {
46
- "@planara/types": "^1.0.3",
47
- "ogl": "^1.0.11"
56
+ "@planara/types": "^1.3.1",
57
+ "events": "^3.3.0",
58
+ "ogl": "^1.0.11",
59
+ "reflect-metadata": "^0.2.2",
60
+ "tsyringe": "^4.10.0"
48
61
  },
49
62
  "repository": {
50
63
  "type": "git",