@planara/core 1.4.3 → 1.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +9 -12
- package/dist/index.es.js +36 -36
- package/dist/index.umd.js +9 -12
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("ogl");function d(s){const e=`
|
|
2
2
|
attribute vec3 position;
|
|
3
3
|
attribute vec3 normal;
|
|
4
|
-
attribute vec2 uv;
|
|
5
4
|
|
|
6
5
|
uniform mat4 modelViewMatrix;
|
|
7
6
|
uniform mat4 projectionMatrix;
|
|
8
7
|
uniform mat3 normalMatrix;
|
|
9
8
|
|
|
10
9
|
varying vec3 vNormal;
|
|
11
|
-
varying vec2 vUv;
|
|
12
10
|
|
|
13
11
|
void main() {
|
|
14
|
-
vUv = uv;
|
|
15
12
|
vNormal = normalize(normalMatrix * normal);
|
|
16
13
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
17
14
|
}
|
|
18
15
|
`,t=`
|
|
19
16
|
precision highp float;
|
|
20
17
|
|
|
21
|
-
uniform
|
|
18
|
+
uniform float uHit;
|
|
19
|
+
|
|
22
20
|
varying vec3 vNormal;
|
|
23
|
-
varying vec2 vUv;
|
|
24
21
|
|
|
25
22
|
void main() {
|
|
26
|
-
vec3
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
vec3 normal = normalize(vNormal);
|
|
24
|
+
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;
|
|
31
28
|
}
|
|
32
|
-
`,i=new r.Texture(s);return new r.Program(s,{vertex:e,fragment:t,uniforms:{tMap:{value:i}}})}class h{gl;scene;camera;canvas;program;meshes;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.program=d(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 r.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 r.Mesh(this.gl.gl,{geometry:t,program:this.program});return i.setParent(this.scene),this.meshes.push(i),i}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
|
|
33
|
-
`);for(const
|
|
29
|
+
`,i=new r.Texture(s);return new r.Program(s,{vertex:e,fragment:t,uniforms:{tMap:{value:i},uHit:{value:0}}})}class h{gl;scene;camera;canvas;program;meshes;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.program=d(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 r.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 r.Mesh(this.gl.gl,{geometry:t,program:this.program});return i.setParent(this.scene),this.meshes.push(i),i}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 v extends h{orbit;raycast;mouse;isEventListenersAdded;constructor(e){super(e);const t=new r.GridHelper(this.gl.gl,{size:10,divisions:10});t.position.y=-.001,t.setParent(this.scene),new r.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new r.Orbit(this.camera,{element:this.canvas}),this.raycast=new r.Raycast,this.mouse=new r.Vec2,this.isEventListenersAdded=!1}update(){this.orbit?.update()}addFigure(e){const t=super.addFigure(e);if(t.geometry){const i=t.geometry.constructor.name;t.geometry.raycast=i.includes("Sphere")?"sphere":"box"}return t.isHit=!1,t.onBeforeRender(({mesh:i})=>{this.updateHitUniform(i)}),this.isEventListenersAdded&&(this.initMouseListeners(),this.isEventListenersAdded=!0),t}updateHitUniform(e){this.program.uniforms.uHit.value=e.isHit?1:0}initMouseListeners(){window.addEventListener("load",()=>{document.addEventListener("mousemove",this.handleMouseMove,!1)})}handleMouseMove=e=>{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(i=>i.isHit=!1),this.raycast.intersectBounds(this.meshes).forEach(i=>i.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 g extends h{orbit;constructor(e){super(e),this.orbit=new r.Orbit(this.camera,{element:this.canvas,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 f{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 p=(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))(p||{});class y{positions=[];normals=[];uvs=[];tmpPositions=[];tmpNormals=[];tmpUVs=[];load(e){const t=e.split(`
|
|
30
|
+
`);for(const a of t){if(!a.trim()||a.startsWith("#"))continue;const n=a.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:p.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new f(i)}processFaceLine(e){for(let t=1;t<e.length;t++){const i=e[t];if(!i)continue;const[a,n,l]=i.split("/"),m=a?parseInt(a,10):void 0,c=n?parseInt(n,10):void 0,u=l?parseInt(l,10):void 0;if(m!==void 0){const o=this.tmpPositions[m-1];o&&this.positions.push(...o)}if(c!==void 0){const o=this.tmpUVs[c-1];o&&this.uvs.push(...o)}if(u!==void 0){const o=this.tmpNormals[u-1];o&&this.normals.push(...o)}}}}exports.EditorRenderer=v;exports.ObjLoader=y;exports.PreviewRenderer=g;exports.Renderer=h;exports.createProgram=d;
|
package/dist/index.es.js
CHANGED
|
@@ -1,21 +1,18 @@
|
|
|
1
|
-
import { Texture as
|
|
2
|
-
function
|
|
1
|
+
import { Texture as p, Program as v, Renderer as g, Transform as f, Camera as w, Geometry as y, Mesh as b, GridHelper as x, AxesHelper as M, Orbit as c, Raycast as P, Vec2 as A, Vec3 as L } from "ogl";
|
|
2
|
+
function H(t) {
|
|
3
3
|
const e = (
|
|
4
4
|
/* glsl */
|
|
5
5
|
`
|
|
6
6
|
attribute vec3 position;
|
|
7
7
|
attribute vec3 normal;
|
|
8
|
-
attribute vec2 uv;
|
|
9
8
|
|
|
10
9
|
uniform mat4 modelViewMatrix;
|
|
11
10
|
uniform mat4 projectionMatrix;
|
|
12
11
|
uniform mat3 normalMatrix;
|
|
13
12
|
|
|
14
13
|
varying vec3 vNormal;
|
|
15
|
-
varying vec2 vUv;
|
|
16
14
|
|
|
17
15
|
void main() {
|
|
18
|
-
vUv = uv;
|
|
19
16
|
vNormal = normalize(normalMatrix * normal);
|
|
20
17
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
21
18
|
}
|
|
@@ -25,23 +22,26 @@ function E(t) {
|
|
|
25
22
|
`
|
|
26
23
|
precision highp float;
|
|
27
24
|
|
|
28
|
-
uniform
|
|
25
|
+
uniform float uHit;
|
|
26
|
+
|
|
29
27
|
varying vec3 vNormal;
|
|
30
|
-
varying vec2 vUv;
|
|
31
28
|
|
|
32
29
|
void main() {
|
|
33
|
-
vec3
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
vec3 normal = normalize(vNormal);
|
|
31
|
+
float lighting = dot(normal, normalize(vec3(-0.3, 0.8, 0.6)));
|
|
32
|
+
vec3 color = mix(vec3(0.2, 0.8, 1.0), vec3(1.0, 0.2, 0.8), uHit);
|
|
33
|
+
gl_FragColor.rgb = color + lighting * 0.1;
|
|
34
|
+
gl_FragColor.a = 1.0;
|
|
38
35
|
}
|
|
39
36
|
`
|
|
40
|
-
), i = new
|
|
41
|
-
return new
|
|
37
|
+
), i = new p(t);
|
|
38
|
+
return new v(t, {
|
|
42
39
|
vertex: e,
|
|
43
40
|
fragment: s,
|
|
44
|
-
uniforms: {
|
|
41
|
+
uniforms: {
|
|
42
|
+
tMap: { value: i },
|
|
43
|
+
uHit: { value: 0 }
|
|
44
|
+
}
|
|
45
45
|
});
|
|
46
46
|
}
|
|
47
47
|
class u {
|
|
@@ -62,7 +62,7 @@ class u {
|
|
|
62
62
|
* @param canvas - HTMLCanvasElement для рендеринга
|
|
63
63
|
*/
|
|
64
64
|
constructor(e) {
|
|
65
|
-
this.canvas = e, this.gl = new g({ canvas: e }), this.gl.setSize(e.clientWidth, e.clientHeight), this.gl.gl.clearColor(1, 1, 1, 1), this.scene = new f(), this.camera = new
|
|
65
|
+
this.canvas = e, this.gl = new g({ canvas: e }), this.gl.setSize(e.clientWidth, e.clientHeight), this.gl.gl.clearColor(1, 1, 1, 1), this.scene = new f(), this.camera = new w(this.gl.gl, { fov: 45 }), this.camera.position.set(1, 1, 7), this.camera.lookAt([0, 0, 0]), this.program = H(this.gl.gl), this.meshes = [];
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Обновляет размер рендерера и камеры при изменении размеров canvas.
|
|
@@ -92,7 +92,7 @@ class u {
|
|
|
92
92
|
* @param figure Данные фигуры: position, normal, uv
|
|
93
93
|
*/
|
|
94
94
|
addFigure(e) {
|
|
95
|
-
const s = new
|
|
95
|
+
const s = new y(this.gl.gl, {
|
|
96
96
|
position: { size: 3, data: new Float32Array(e.position) },
|
|
97
97
|
normal: { size: 3, data: new Float32Array(e.normal ?? []) },
|
|
98
98
|
uv: { size: 2, data: new Float32Array(e.uv ?? []) }
|
|
@@ -107,7 +107,7 @@ class u {
|
|
|
107
107
|
this.meshes && (this.meshes.length = 0, this.meshes = []), this.scene = null, this.camera = null, this.program = null, this.gl = null, this.canvas = null;
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
class
|
|
110
|
+
class C extends u {
|
|
111
111
|
/** Orbit-контроллер для управления камерой */
|
|
112
112
|
orbit;
|
|
113
113
|
/** Raycast для подсветки моделей при наведении */
|
|
@@ -172,7 +172,7 @@ class F extends u {
|
|
|
172
172
|
this.isEventListenersAdded && (window.removeEventListener("mousemove", this.handleMouseMove, !1), this.isEventListenersAdded = !1), this.orbit = null, this.raycast = null, this.mouse = null, super.destroy();
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
|
-
class
|
|
175
|
+
class F extends u {
|
|
176
176
|
/** Orbit-контроллер для управления камерой */
|
|
177
177
|
orbit;
|
|
178
178
|
/**
|
|
@@ -197,7 +197,7 @@ class I extends u {
|
|
|
197
197
|
this.orbit?.update();
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
-
class
|
|
200
|
+
class E {
|
|
201
201
|
/** Тип фигуры */
|
|
202
202
|
type;
|
|
203
203
|
/** Позиции вершин */
|
|
@@ -217,7 +217,7 @@ class z {
|
|
|
217
217
|
}
|
|
218
218
|
}
|
|
219
219
|
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 || {});
|
|
220
|
-
class
|
|
220
|
+
class I {
|
|
221
221
|
/** Позиции вершин */
|
|
222
222
|
positions = [];
|
|
223
223
|
/** Нормали вершин */
|
|
@@ -235,9 +235,9 @@ class H {
|
|
|
235
235
|
load(e) {
|
|
236
236
|
const s = e.split(`
|
|
237
237
|
`);
|
|
238
|
-
for (const
|
|
239
|
-
if (!
|
|
240
|
-
const r =
|
|
238
|
+
for (const a of s) {
|
|
239
|
+
if (!a.trim() || a.startsWith("#")) continue;
|
|
240
|
+
const r = a.trim().split(/\s+/);
|
|
241
241
|
switch (r[0]) {
|
|
242
242
|
case "v":
|
|
243
243
|
this.tmpPositions.push(r.slice(1).map(Number));
|
|
@@ -259,7 +259,7 @@ class H {
|
|
|
259
259
|
...this.normals.length > 0 && { normal: this.normals },
|
|
260
260
|
...this.uvs.length > 0 && { uv: this.uvs }
|
|
261
261
|
};
|
|
262
|
-
return new
|
|
262
|
+
return new E(i);
|
|
263
263
|
}
|
|
264
264
|
/**
|
|
265
265
|
* Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
|
|
@@ -268,26 +268,26 @@ class H {
|
|
|
268
268
|
for (let s = 1; s < e.length; s++) {
|
|
269
269
|
const i = e[s];
|
|
270
270
|
if (!i) continue;
|
|
271
|
-
const [
|
|
271
|
+
const [a, r, o] = i.split("/"), h = a ? parseInt(a, 10) : void 0, l = r ? parseInt(r, 10) : void 0, m = o ? parseInt(o, 10) : void 0;
|
|
272
272
|
if (h !== void 0) {
|
|
273
|
-
const
|
|
274
|
-
|
|
273
|
+
const n = this.tmpPositions[h - 1];
|
|
274
|
+
n && this.positions.push(...n);
|
|
275
275
|
}
|
|
276
276
|
if (l !== void 0) {
|
|
277
|
-
const
|
|
278
|
-
|
|
277
|
+
const n = this.tmpUVs[l - 1];
|
|
278
|
+
n && this.uvs.push(...n);
|
|
279
279
|
}
|
|
280
280
|
if (m !== void 0) {
|
|
281
|
-
const
|
|
282
|
-
|
|
281
|
+
const n = this.tmpNormals[m - 1];
|
|
282
|
+
n && this.normals.push(...n);
|
|
283
283
|
}
|
|
284
284
|
}
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
export {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
C as EditorRenderer,
|
|
289
|
+
I as ObjLoader,
|
|
290
|
+
F as PreviewRenderer,
|
|
291
291
|
u as Renderer,
|
|
292
|
-
|
|
292
|
+
H as createProgram
|
|
293
293
|
};
|
package/dist/index.umd.js
CHANGED
|
@@ -1,33 +1,30 @@
|
|
|
1
1
|
(function(n,r){typeof exports=="object"&&typeof module<"u"?r(exports,require("ogl")):typeof define=="function"&&define.amd?define(["exports","ogl"],r):(n=typeof globalThis<"u"?globalThis:n||self,r(n.PlanaraCore={},n.OGL))})(this,(function(n,r){"use strict";function m(s){const e=`
|
|
2
2
|
attribute vec3 position;
|
|
3
3
|
attribute vec3 normal;
|
|
4
|
-
attribute vec2 uv;
|
|
5
4
|
|
|
6
5
|
uniform mat4 modelViewMatrix;
|
|
7
6
|
uniform mat4 projectionMatrix;
|
|
8
7
|
uniform mat3 normalMatrix;
|
|
9
8
|
|
|
10
9
|
varying vec3 vNormal;
|
|
11
|
-
varying vec2 vUv;
|
|
12
10
|
|
|
13
11
|
void main() {
|
|
14
|
-
vUv = uv;
|
|
15
12
|
vNormal = normalize(normalMatrix * normal);
|
|
16
13
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
17
14
|
}
|
|
18
15
|
`,t=`
|
|
19
16
|
precision highp float;
|
|
20
17
|
|
|
21
|
-
uniform
|
|
18
|
+
uniform float uHit;
|
|
19
|
+
|
|
22
20
|
varying vec3 vNormal;
|
|
23
|
-
varying vec2 vUv;
|
|
24
21
|
|
|
25
22
|
void main() {
|
|
26
|
-
vec3
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
vec3 normal = normalize(vNormal);
|
|
24
|
+
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;
|
|
31
28
|
}
|
|
32
|
-
`,i=new r.Texture(s);return new r.Program(s,{vertex:e,fragment:t,uniforms:{tMap:{value:i}}})}class l{gl;scene;camera;canvas;program;meshes;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.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 r.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 r.Mesh(this.gl.gl,{geometry:t,program:this.program});return i.setParent(this.scene),this.meshes.push(i),i}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
|
|
33
|
-
`);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 i={type:c.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new y(i)}processFaceLine(e){for(let t=1;t<e.length;t++){const i=e[t];if(!i)continue;const[h,a,
|
|
29
|
+
`,i=new r.Texture(s);return new r.Program(s,{vertex:e,fragment:t,uniforms:{tMap:{value:i},uHit:{value:0}}})}class l{gl;scene;camera;canvas;program;meshes;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.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 r.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 r.Mesh(this.gl.gl,{geometry:t,program:this.program});return i.setParent(this.scene),this.meshes.push(i),i}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 f extends l{orbit;raycast;mouse;isEventListenersAdded;constructor(e){super(e);const t=new r.GridHelper(this.gl.gl,{size:10,divisions:10});t.position.y=-.001,t.setParent(this.scene),new r.AxesHelper(this.gl.gl,{size:6,symmetric:!0}).setParent(this.scene),this.orbit=new r.Orbit(this.camera,{element:this.canvas}),this.raycast=new r.Raycast,this.mouse=new r.Vec2,this.isEventListenersAdded=!1}update(){this.orbit?.update()}addFigure(e){const t=super.addFigure(e);if(t.geometry){const i=t.geometry.constructor.name;t.geometry.raycast=i.includes("Sphere")?"sphere":"box"}return t.isHit=!1,t.onBeforeRender(({mesh:i})=>{this.updateHitUniform(i)}),this.isEventListenersAdded&&(this.initMouseListeners(),this.isEventListenersAdded=!0),t}updateHitUniform(e){this.program.uniforms.uHit.value=e.isHit?1:0}initMouseListeners(){window.addEventListener("load",()=>{document.addEventListener("mousemove",this.handleMouseMove,!1)})}handleMouseMove=e=>{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(i=>i.isHit=!1),this.raycast.intersectBounds(this.meshes).forEach(i=>i.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 g extends l{orbit;constructor(e){super(e),this.orbit=new r.Orbit(this.camera,{element:this.canvas,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 y{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 b{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 i={type:c.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new y(i)}processFaceLine(e){for(let t=1;t<e.length;t++){const i=e[t];if(!i)continue;const[h,a,u]=i.split("/"),d=h?parseInt(h,10):void 0,p=a?parseInt(a,10):void 0,v=u?parseInt(u,10):void 0;if(d!==void 0){const o=this.tmpPositions[d-1];o&&this.positions.push(...o)}if(p!==void 0){const o=this.tmpUVs[p-1];o&&this.uvs.push(...o)}if(v!==void 0){const o=this.tmpNormals[v-1];o&&this.normals.push(...o)}}}}n.EditorRenderer=f,n.ObjLoader=b,n.PreviewRenderer=g,n.Renderer=l,n.createProgram=m,Object.defineProperty(n,Symbol.toStringTag,{value:"Module"})}));
|