@planara/core 1.1.2 → 1.2.2

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.
@@ -1,10 +1,20 @@
1
1
  import { Renderer } from './renderer';
2
2
  /**
3
- * Рендерер для редактора (оси координат, сетка, orbit)
3
+ * Рендерер для редактора.
4
+ * Добавляет сетку, оси координат и поддержку Orbit для управления камерой.
5
+ * Наследуется от базового Renderer.
4
6
  */
5
7
  export declare class EditorRenderer extends Renderer {
8
+ /** Orbit-контроллер для управления камерой */
6
9
  private orbit;
10
+ /**
11
+ * Инициализация сцены редактора.
12
+ * Создает сетку, оси координат и orbit-контроллер.
13
+ */
7
14
  protected init(): void;
15
+ /**
16
+ * Обновление состояния рендерера.
17
+ */
8
18
  protected update(): void;
9
19
  }
10
20
  //# sourceMappingURL=editor-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor-renderer.d.ts","sourceRoot":"","sources":["../../src/core/editor-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC;;GAEG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,OAAO,CAAC,KAAK,CAAS;IAEtB,SAAS,CAAC,IAAI;IAcd,SAAS,CAAC,MAAM;CAGjB"}
1
+ {"version":3,"file":"editor-renderer.d.ts","sourceRoot":"","sources":["../../src/core/editor-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC;;;;GAIG;AACH,qBAAa,cAAe,SAAQ,QAAQ;IAC1C,8CAA8C;IAC9C,OAAO,CAAC,KAAK,CAAS;IAEtB;;;OAGG;IACH,SAAS,CAAC,IAAI;IAcd;;OAEG;IACH,SAAS,CAAC,MAAM;CAGjB"}
@@ -1,8 +1,19 @@
1
1
  import { Renderer } from './renderer';
2
2
  /**
3
- * Рендерер для предпросмотра модели (сцена, камера, orbit по горизонтали)
3
+ * Рендерер для предпросмотра 3D-модели.
4
+ * Настраивает сцену, камеру и орбитальную навигацию (по горизонтали).
5
+ * Наследуется от базового Renderer.
4
6
  */
5
7
  export declare class PreviewRenderer extends Renderer {
8
+ /** Orbit-контроллер для управления камерой */
9
+ private orbit;
10
+ /**
11
+ * Инициализация сцены предпросмотра.
12
+ */
6
13
  protected init(): void;
14
+ /**
15
+ * Обновление состояния рендерера.
16
+ */
17
+ protected update(): void;
7
18
  }
8
19
  //# sourceMappingURL=preview-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preview-renderer.d.ts","sourceRoot":"","sources":["../../src/core/preview-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC;;GAEG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,SAAS,CAAC,IAAI;CAGf"}
1
+ {"version":3,"file":"preview-renderer.d.ts","sourceRoot":"","sources":["../../src/core/preview-renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,8CAA8C;IAC9C,OAAO,CAAC,KAAK,CAAS;IAEtB;;OAEG;IACH,SAAS,CAAC,IAAI;IAYd;;OAEG;IACH,SAAS,CAAC,MAAM;CAGjB"}
@@ -1,14 +1,41 @@
1
1
  import { Renderer as OGLRenderer, Camera, Transform } from 'ogl';
2
+ /**
3
+ * Абстрактный базовый класс рендерера для работы с WebGL через OGL.
4
+ * Отвечает за инициализацию сцены, камеры и цикла рендеринга.
5
+ */
2
6
  export declare abstract class Renderer {
7
+ /** Экземпляр рендерера OGL */
3
8
  gl: OGLRenderer;
9
+ /** Корневой объект сцены */
4
10
  scene: Transform;
11
+ /** Камера для сцены */
5
12
  camera: Camera;
13
+ /** HTML-элемент canvas, на котором рендерится сцена */
6
14
  protected canvas: HTMLCanvasElement;
15
+ /**
16
+ * Конструктор рендерера
17
+ * @param canvas - HTMLCanvasElement для рендеринга
18
+ */
7
19
  constructor(canvas: HTMLCanvasElement);
20
+ /**
21
+ * Метод для инициализации рендерера, добавления объектов в сцену.
22
+ */
8
23
  protected abstract init(): void;
24
+ /**
25
+ * Обновляет размер рендерера и камеры при изменении размеров canvas.
26
+ */
9
27
  resize(): void;
28
+ /**
29
+ * Выполняет рендеринг сцены с текущей камерой.
30
+ */
10
31
  render(): void;
32
+ /**
33
+ * Запускает основной цикл рендеринга.
34
+ */
11
35
  loop(): void;
36
+ /**
37
+ * Метод для обновления логики рендерера.
38
+ */
12
39
  protected update(): void;
13
40
  }
14
41
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/core/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAEjE,8BAAsB,QAAQ;IACrB,EAAE,EAAE,WAAW,CAAC;IAChB,KAAK,EAAE,SAAS,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC;gBAExB,MAAM,EAAE,iBAAiB;IAerC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;IAE/B,MAAM;IAKN,MAAM;IAIN,IAAI;IAMJ,SAAS,CAAC,MAAM,IAAI,IAAI;CACzB"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/core/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAEjE;;;GAGG;AACH,8BAAsB,QAAQ;IAC5B,8BAA8B;IACvB,EAAE,EAAE,WAAW,CAAC;IAEvB,4BAA4B;IACrB,KAAK,EAAE,SAAS,CAAC;IAExB,uBAAuB;IAChB,MAAM,EAAE,MAAM,CAAC;IAEtB,uDAAuD;IACvD,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAEpC;;;OAGG;gBACS,MAAM,EAAE,iBAAiB;IAerC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI;IAE/B;;OAEG;IACH,MAAM;IAKN;;OAEG;IACH,MAAM;IAIN;;OAEG;IACH,IAAI;IAMJ;;OAEG;IACH,SAAS,CAAC,MAAM,IAAI,IAAI;CACzB"}
package/dist/index.cjs.js CHANGED
@@ -1 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("ogl");class i{gl;scene;camera;canvas;constructor(e){this.canvas=e,this.gl=new t.Renderer({canvas:e}),this.gl.setSize(e.clientWidth,e.clientHeight),this.gl.gl.clearColor(1,1,1,1),this.scene=new t.Transform,this.camera=new t.Camera(this.gl.gl,{fov:45}),this.camera.position.set(1,1,7),this.camera.lookAt([0,0,0]),this.init()}resize(){this.gl.setSize(this.canvas.clientWidth,this.canvas.clientHeight),this.camera.perspective({aspect:this.canvas.width/this.canvas.height})}render(){this.gl.render({scene:this.scene,camera:this.camera})}loop(){this.update(),this.render(),requestAnimationFrame(this.loop.bind(this))}update(){}}class r extends i{orbit;init(){const e=new t.GridHelper(this.gl.gl,{size:10,divisions:10});e.position.y=-.001,e.setParent(this.scene),new t.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new t.Orbit(this.camera)}update(){this.orbit.update()}}class n extends i{init(){}}exports.EditorRenderer=r;exports.PreviewRenderer=n;exports.Renderer=i;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("ogl");class h{gl;scene;camera;canvas;constructor(e){this.canvas=e,this.gl=new r.Renderer({canvas:e}),this.gl.setSize(e.clientWidth,e.clientHeight),this.gl.gl.clearColor(1,1,1,1),this.scene=new r.Transform,this.camera=new r.Camera(this.gl.gl,{fov:45}),this.camera.position.set(1,1,7),this.camera.lookAt([0,0,0]),this.init()}resize(){this.gl.setSize(this.canvas.clientWidth,this.canvas.clientHeight),this.camera.perspective({aspect:this.canvas.width/this.canvas.height})}render(){this.gl.render({scene:this.scene,camera:this.camera})}loop(){this.update(),this.render(),requestAnimationFrame(this.loop.bind(this))}update(){}}class u extends h{orbit;init(){const e=new r.GridHelper(this.gl.gl,{size:10,divisions:10});e.position.y=-.001,e.setParent(this.scene),new r.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new r.Orbit(this.camera)}update(){this.orbit.update()}}class v extends h{orbit;init(){this.orbit=new r.Orbit(this.camera,{target:new r.Vec3(0,0,0),minPolarAngle:Math.PI/2,maxPolarAngle:Math.PI/2,enableRotate:!0,enableZoom:!1,enablePan:!1})}update(){this.orbit.update()}}class g{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 d=(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))(d||{});class b{positions=[];normals=[];uvs=[];tmpPositions=[];tmpNormals=[];tmpUVs=[];parse(e){const n=e.split(`
2
+ `);for(const a of n){if(!a.trim()||a.startsWith("#"))continue;const t=a.trim().split(/\s+/);switch(t[0]){case"v":this.tmpPositions.push(t.slice(1).map(Number));break;case"vn":this.tmpNormals.push(t.slice(1).map(Number));break;case"vt":this.tmpUVs.push(t.slice(1).map(Number));break;case"f":this.processFaceLine(t);break}}const o={type:d.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new g(o)}processFaceLine(e){for(let n=1;n<e.length;n++){const o=e[n];if(!o)continue;const[a,t,l]=o.split("/"),c=a?parseInt(a,10):void 0,p=t?parseInt(t,10):void 0,m=l?parseInt(l,10):void 0;if(c!==void 0){const i=this.tmpPositions[c-1];i&&this.positions.push(...i)}if(p!==void 0){const i=this.tmpUVs[p-1];i&&this.uvs.push(...i)}if(m!==void 0){const i=this.tmpNormals[m-1];i&&this.normals.push(...i)}}}}exports.EditorRenderer=u;exports.ObjLoader=b;exports.PreviewRenderer=v;exports.Renderer=h;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './core/renderer';
2
2
  export * from './core/editor-renderer';
3
3
  export * from './core/preview-renderer';
4
+ export * from './loaders/obj-loader';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC"}
package/dist/index.es.js CHANGED
@@ -1,40 +1,171 @@
1
- import { Renderer as s, Transform as r, Camera as n, GridHelper as a, AxesHelper as h, Orbit as c } from "ogl";
2
- class i {
1
+ import { Renderer as u, Transform as v, Camera as g, GridHelper as b, AxesHelper as f, Orbit as p, Vec3 as x } from "ogl";
2
+ class m {
3
+ /** Экземпляр рендерера OGL */
3
4
  gl;
5
+ /** Корневой объект сцены */
4
6
  scene;
7
+ /** Камера для сцены */
5
8
  camera;
9
+ /** HTML-элемент canvas, на котором рендерится сцена */
6
10
  canvas;
7
- constructor(e) {
8
- this.canvas = e, this.gl = new s({ canvas: e }), this.gl.setSize(e.clientWidth, e.clientHeight), this.gl.gl.clearColor(1, 1, 1, 1), this.scene = new r(), this.camera = new n(this.gl.gl, { fov: 45 }), this.camera.position.set(1, 1, 7), this.camera.lookAt([0, 0, 0]), this.init();
11
+ /**
12
+ * Конструктор рендерера
13
+ * @param canvas - HTMLCanvasElement для рендеринга
14
+ */
15
+ constructor(s) {
16
+ this.canvas = s, this.gl = new u({ canvas: s }), this.gl.setSize(s.clientWidth, s.clientHeight), this.gl.gl.clearColor(1, 1, 1, 1), this.scene = new v(), this.camera = new g(this.gl.gl, { fov: 45 }), this.camera.position.set(1, 1, 7), this.camera.lookAt([0, 0, 0]), this.init();
9
17
  }
18
+ /**
19
+ * Обновляет размер рендерера и камеры при изменении размеров canvas.
20
+ */
10
21
  resize() {
11
22
  this.gl.setSize(this.canvas.clientWidth, this.canvas.clientHeight), this.camera.perspective({ aspect: this.canvas.width / this.canvas.height });
12
23
  }
24
+ /**
25
+ * Выполняет рендеринг сцены с текущей камерой.
26
+ */
13
27
  render() {
14
28
  this.gl.render({ scene: this.scene, camera: this.camera });
15
29
  }
30
+ /**
31
+ * Запускает основной цикл рендеринга.
32
+ */
16
33
  loop() {
17
34
  this.update(), this.render(), requestAnimationFrame(this.loop.bind(this));
18
35
  }
36
+ /**
37
+ * Метод для обновления логики рендерера.
38
+ */
19
39
  update() {
20
40
  }
21
41
  }
22
- class d extends i {
42
+ class I extends m {
43
+ /** Orbit-контроллер для управления камерой */
23
44
  orbit;
45
+ /**
46
+ * Инициализация сцены редактора.
47
+ * Создает сетку, оси координат и orbit-контроллер.
48
+ */
24
49
  init() {
25
- const e = new a(this.gl.gl, { size: 10, divisions: 10 });
26
- e.position.y = -1e-3, e.setParent(this.scene), new h(this.gl.gl, { size: 6, symmetric: !0 }).setParent(this.scene), this.orbit = new c(this.camera);
50
+ const s = new b(this.gl.gl, { size: 10, divisions: 10 });
51
+ s.position.y = -1e-3, s.setParent(this.scene), new f(this.gl.gl, { size: 6, symmetric: !0 }).setParent(this.scene), this.orbit = new p(this.camera);
27
52
  }
53
+ /**
54
+ * Обновление состояния рендерера.
55
+ */
28
56
  update() {
29
57
  this.orbit.update();
30
58
  }
31
59
  }
32
- class g extends i {
60
+ class C extends m {
61
+ /** Orbit-контроллер для управления камерой */
62
+ orbit;
63
+ /**
64
+ * Инициализация сцены предпросмотра.
65
+ */
33
66
  init() {
67
+ this.orbit = new p(this.camera, {
68
+ target: new x(0, 0, 0),
69
+ minPolarAngle: Math.PI / 2,
70
+ maxPolarAngle: Math.PI / 2,
71
+ enableRotate: !0,
72
+ enableZoom: !1,
73
+ enablePan: !1
74
+ });
75
+ }
76
+ /**
77
+ * Обновление состояния рендерера.
78
+ */
79
+ update() {
80
+ this.orbit.update();
81
+ }
82
+ }
83
+ class P {
84
+ /** Тип фигуры */
85
+ type;
86
+ /** Позиции вершин */
87
+ position;
88
+ /** Нормали вершин */
89
+ normal;
90
+ /** UV-координаты */
91
+ uv;
92
+ /** Материал (опционально) */
93
+ material;
94
+ /**
95
+ * Создаёт новую фигуру
96
+ * @param data - исходные данные фигуры
97
+ */
98
+ constructor(s) {
99
+ this.type = s.type, this.position = s.position, this.normal = s.normal ?? [], this.uv = s.uv ?? [], this.material = s.material;
100
+ }
101
+ }
102
+ var d = /* @__PURE__ */ ((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))(d || {});
103
+ class y {
104
+ positions = [];
105
+ normals = [];
106
+ uvs = [];
107
+ tmpPositions = [];
108
+ tmpNormals = [];
109
+ tmpUVs = [];
110
+ /**
111
+ * Загружает OBJ-модель в Figure
112
+ * @param objContent Строка содержимого .obj файла
113
+ */
114
+ parse(s) {
115
+ const n = s.split(`
116
+ `);
117
+ for (const r of n) {
118
+ if (!r.trim() || r.startsWith("#")) continue;
119
+ const e = r.trim().split(/\s+/);
120
+ switch (e[0]) {
121
+ case "v":
122
+ this.tmpPositions.push(e.slice(1).map(Number));
123
+ break;
124
+ case "vn":
125
+ this.tmpNormals.push(e.slice(1).map(Number));
126
+ break;
127
+ case "vt":
128
+ this.tmpUVs.push(e.slice(1).map(Number));
129
+ break;
130
+ case "f":
131
+ this.processFaceLine(e);
132
+ break;
133
+ }
134
+ }
135
+ const a = {
136
+ type: d.Custom,
137
+ position: this.positions,
138
+ ...this.normals.length > 0 && { normal: this.normals },
139
+ ...this.uvs.length > 0 && { uv: this.uvs }
140
+ };
141
+ return new P(a);
142
+ }
143
+ /**
144
+ * Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
145
+ */
146
+ processFaceLine(s) {
147
+ for (let n = 1; n < s.length; n++) {
148
+ const a = s[n];
149
+ if (!a) continue;
150
+ const [r, e, o] = a.split("/"), h = r ? parseInt(r, 10) : void 0, l = e ? parseInt(e, 10) : void 0, c = o ? parseInt(o, 10) : void 0;
151
+ if (h !== void 0) {
152
+ const i = this.tmpPositions[h - 1];
153
+ i && this.positions.push(...i);
154
+ }
155
+ if (l !== void 0) {
156
+ const i = this.tmpUVs[l - 1];
157
+ i && this.uvs.push(...i);
158
+ }
159
+ if (c !== void 0) {
160
+ const i = this.tmpNormals[c - 1];
161
+ i && this.normals.push(...i);
162
+ }
163
+ }
34
164
  }
35
165
  }
36
166
  export {
37
- d as EditorRenderer,
38
- g as PreviewRenderer,
39
- i as Renderer
167
+ I as EditorRenderer,
168
+ y as ObjLoader,
169
+ C as PreviewRenderer,
170
+ m as Renderer
40
171
  };
package/dist/index.umd.js CHANGED
@@ -1 +1,2 @@
1
- (function(i,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("ogl")):typeof define=="function"&&define.amd?define(["exports","ogl"],e):(i=typeof globalThis<"u"?globalThis:i||self,e(i.PlanaraCore={},i.OGL))})(this,(function(i,e){"use strict";class s{gl;scene;camera;canvas;constructor(t){this.canvas=t,this.gl=new e.Renderer({canvas:t}),this.gl.setSize(t.clientWidth,t.clientHeight),this.gl.gl.clearColor(1,1,1,1),this.scene=new e.Transform,this.camera=new e.Camera(this.gl.gl,{fov:45}),this.camera.position.set(1,1,7),this.camera.lookAt([0,0,0]),this.init()}resize(){this.gl.setSize(this.canvas.clientWidth,this.canvas.clientHeight),this.camera.perspective({aspect:this.canvas.width/this.canvas.height})}render(){this.gl.render({scene:this.scene,camera:this.camera})}loop(){this.update(),this.render(),requestAnimationFrame(this.loop.bind(this))}update(){}}class r extends s{orbit;init(){const t=new e.GridHelper(this.gl.gl,{size:10,divisions:10});t.position.y=-.001,t.setParent(this.scene),new e.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new e.Orbit(this.camera)}update(){this.orbit.update()}}class a extends s{init(){}}i.EditorRenderer=r,i.PreviewRenderer=a,i.Renderer=s,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(i,s){typeof exports=="object"&&typeof module<"u"?s(exports,require("ogl")):typeof define=="function"&&define.amd?define(["exports","ogl"],s):(i=typeof globalThis<"u"?globalThis:i||self,s(i.PlanaraCore={},i.OGL))})(this,(function(i,s){"use strict";class c{gl;scene;camera;canvas;constructor(e){this.canvas=e,this.gl=new s.Renderer({canvas:e}),this.gl.setSize(e.clientWidth,e.clientHeight),this.gl.gl.clearColor(1,1,1,1),this.scene=new s.Transform,this.camera=new s.Camera(this.gl.gl,{fov:45}),this.camera.position.set(1,1,7),this.camera.lookAt([0,0,0]),this.init()}resize(){this.gl.setSize(this.canvas.clientWidth,this.canvas.clientHeight),this.camera.perspective({aspect:this.canvas.width/this.canvas.height})}render(){this.gl.render({scene:this.scene,camera:this.camera})}loop(){this.update(),this.render(),requestAnimationFrame(this.loop.bind(this))}update(){}}class v extends c{orbit;init(){const e=new s.GridHelper(this.gl.gl,{size:10,divisions:10});e.position.y=-.001,e.setParent(this.scene),new s.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new s.Orbit(this.camera)}update(){this.orbit.update()}}class f extends c{orbit;init(){this.orbit=new s.Orbit(this.camera,{target:new s.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 l=(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))(l||{});class g{positions=[];normals=[];uvs=[];tmpPositions=[];tmpNormals=[];tmpUVs=[];parse(e){const a=e.split(`
2
+ `);for(const o of a){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 h={type:l.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new b(h)}processFaceLine(e){for(let a=1;a<e.length;a++){const h=e[a];if(!h)continue;const[o,n,p]=h.split("/"),m=o?parseInt(o,10):void 0,d=n?parseInt(n,10):void 0,u=p?parseInt(p,10):void 0;if(m!==void 0){const r=this.tmpPositions[m-1];r&&this.positions.push(...r)}if(d!==void 0){const r=this.tmpUVs[d-1];r&&this.uvs.push(...r)}if(u!==void 0){const r=this.tmpNormals[u-1];r&&this.normals.push(...r)}}}}i.EditorRenderer=v,i.ObjLoader=g,i.PreviewRenderer=f,i.Renderer=c,Object.defineProperty(i,Symbol.toStringTag,{value:"Module"})}));
@@ -0,0 +1,19 @@
1
+ import { Figure } from '@planara/types';
2
+ export declare class ObjLoader {
3
+ private positions;
4
+ private normals;
5
+ private uvs;
6
+ private tmpPositions;
7
+ private tmpNormals;
8
+ private tmpUVs;
9
+ /**
10
+ * Загружает OBJ-модель в Figure
11
+ * @param objContent Строка содержимого .obj файла
12
+ */
13
+ parse(objContent: string): Figure;
14
+ /**
15
+ * Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
16
+ */
17
+ private processFaceLine;
18
+ }
19
+ //# sourceMappingURL=obj-loader.d.ts.map
@@ -0,0 +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,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,GAAG,CAAgB;IAE3B,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,MAAM,CAAkB;IAEhC;;;OAGG;IACH,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAmCjC;;OAEG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@planara/core",
3
- "version": "1.1.2",
3
+ "version": "1.2.2",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org/"
@@ -43,6 +43,7 @@
43
43
  "vite-tsconfig-paths": "^5.1.4"
44
44
  },
45
45
  "dependencies": {
46
+ "@planara/types": "^1.0.3",
46
47
  "ogl": "^1.0.11"
47
48
  },
48
49
  "repository": {