@planara/core 1.4.5 → 1.4.7
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 +8 -8
- package/dist/index.es.js +24 -24
- package/dist/index.umd.js +7 -7
- package/dist/utils/program-settings.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("ogl");function d(
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("ogl");function d(t){const e=`
|
|
2
2
|
attribute vec3 position;
|
|
3
3
|
attribute vec3 normal;
|
|
4
4
|
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
vNormal = normalize(normalMatrix * normal);
|
|
13
13
|
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
14
14
|
}
|
|
15
|
-
`,
|
|
15
|
+
`,s=`
|
|
16
16
|
precision highp float;
|
|
17
17
|
|
|
18
18
|
uniform float uHit;
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
|
|
22
22
|
void main() {
|
|
23
23
|
vec3 normal = normalize(vNormal);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
`);for(const a of
|
|
29
|
+
`;return new r.Program(t,{vertex:e,fragment:s,cullFace:!1,uniforms:{uHit:{value:0}}})}class h{gl;scene;camera;canvas;program;meshes;constructor(e){this.canvas=e,this.gl=new r.Renderer({canvas:e,dpr:2}),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 s=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:s,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 s=new r.GridHelper(this.gl.gl,{size:10,divisions:10});s.position.y=-.001,s.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 s=super.addFigure(e);if(s.geometry){const i=s.geometry.constructor.name;s.geometry.raycast=i.includes("Sphere")?"sphere":"box"}return s.isHit=!1,s.onBeforeRender(({mesh:i})=>{this.updateHitUniform(i)}),this.isEventListenersAdded||(this.initMouseListeners(),this.isEventListenersAdded=!0),s}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=(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))(p||{});class y{positions=[];normals=[];uvs=[];tmpPositions=[];tmpNormals=[];tmpUVs=[];load(e){const s=e.split(`
|
|
30
|
+
`);for(const a of s){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 s=1;s<e.length;s++){const i=e[s];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,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
function
|
|
1
|
+
import { Program as p, Renderer as v, Transform as g, Camera as f, Geometry as y, Mesh as w, GridHelper as b, AxesHelper as x, Orbit as c, Raycast as M, Vec2 as P, Vec3 as A } from "ogl";
|
|
2
|
+
function L(t) {
|
|
3
3
|
const e = (
|
|
4
4
|
/* glsl */
|
|
5
5
|
`
|
|
@@ -28,18 +28,18 @@ function H(t) {
|
|
|
28
28
|
|
|
29
29
|
void main() {
|
|
30
30
|
vec3 normal = normalize(vNormal);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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;
|
|
35
35
|
}
|
|
36
36
|
`
|
|
37
|
-
)
|
|
38
|
-
return new
|
|
37
|
+
);
|
|
38
|
+
return new p(t, {
|
|
39
39
|
vertex: e,
|
|
40
40
|
fragment: s,
|
|
41
|
+
cullFace: !1,
|
|
41
42
|
uniforms: {
|
|
42
|
-
tMap: { value: i },
|
|
43
43
|
uHit: { value: 0 }
|
|
44
44
|
}
|
|
45
45
|
});
|
|
@@ -62,7 +62,7 @@ class u {
|
|
|
62
62
|
* @param canvas - HTMLCanvasElement для рендеринга
|
|
63
63
|
*/
|
|
64
64
|
constructor(e) {
|
|
65
|
-
this.canvas = e, this.gl = new
|
|
65
|
+
this.canvas = e, this.gl = new v({ canvas: e, dpr: 2 }), this.gl.setSize(e.clientWidth, e.clientHeight), this.gl.gl.clearColor(1, 1, 1, 1), this.scene = new g(), this.camera = new f(this.gl.gl, { fov: 45 }), this.camera.position.set(1, 1, 7), this.camera.lookAt([0, 0, 0]), this.program = L(this.gl.gl), this.meshes = [];
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Обновляет размер рендерера и камеры при изменении размеров canvas.
|
|
@@ -96,7 +96,7 @@ class u {
|
|
|
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 ?? []) }
|
|
99
|
-
}), i = new
|
|
99
|
+
}), i = new w(this.gl.gl, {
|
|
100
100
|
geometry: s,
|
|
101
101
|
program: this.program
|
|
102
102
|
});
|
|
@@ -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 F extends u {
|
|
111
111
|
/** Orbit-контроллер для управления камерой */
|
|
112
112
|
orbit;
|
|
113
113
|
/** Raycast для подсветки моделей при наведении */
|
|
@@ -123,8 +123,8 @@ class C extends u {
|
|
|
123
123
|
*/
|
|
124
124
|
constructor(e) {
|
|
125
125
|
super(e);
|
|
126
|
-
const s = new
|
|
127
|
-
s.position.y = -1e-3, s.setParent(this.scene), new
|
|
126
|
+
const s = new b(this.gl.gl, { size: 10, divisions: 10 });
|
|
127
|
+
s.position.y = -1e-3, s.setParent(this.scene), new x(this.gl.gl, { size: 6, symmetric: !0 }).setParent(this.scene), this.orbit = new c(this.camera, { element: this.canvas }), this.raycast = new M(), this.mouse = new P(), this.isEventListenersAdded = !1;
|
|
128
128
|
}
|
|
129
129
|
/**
|
|
130
130
|
* Обновление состояния рендерера.
|
|
@@ -145,7 +145,7 @@ class C extends u {
|
|
|
145
145
|
}
|
|
146
146
|
return s.isHit = !1, s.onBeforeRender(({ mesh: i }) => {
|
|
147
147
|
this.updateHitUniform(i);
|
|
148
|
-
}), this.isEventListenersAdded
|
|
148
|
+
}), this.isEventListenersAdded || (this.initMouseListeners(), this.isEventListenersAdded = !0), s;
|
|
149
149
|
}
|
|
150
150
|
/**
|
|
151
151
|
* Обновление uniform uHit для конкретной 3D-модели
|
|
@@ -172,7 +172,7 @@ class C 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 z extends u {
|
|
176
176
|
/** Orbit-контроллер для управления камерой */
|
|
177
177
|
orbit;
|
|
178
178
|
/**
|
|
@@ -182,7 +182,7 @@ class F extends u {
|
|
|
182
182
|
constructor(e) {
|
|
183
183
|
super(e), this.orbit = new c(this.camera, {
|
|
184
184
|
element: this.canvas,
|
|
185
|
-
target: new
|
|
185
|
+
target: new A(0, 0, 0),
|
|
186
186
|
minPolarAngle: Math.PI / 2,
|
|
187
187
|
maxPolarAngle: Math.PI / 2,
|
|
188
188
|
enableRotate: !0,
|
|
@@ -197,7 +197,7 @@ class F extends u {
|
|
|
197
197
|
this.orbit?.update();
|
|
198
198
|
}
|
|
199
199
|
}
|
|
200
|
-
class
|
|
200
|
+
class H {
|
|
201
201
|
/** Тип фигуры */
|
|
202
202
|
type;
|
|
203
203
|
/** Позиции вершин */
|
|
@@ -217,7 +217,7 @@ class E {
|
|
|
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 C {
|
|
221
221
|
/** Позиции вершин */
|
|
222
222
|
positions = [];
|
|
223
223
|
/** Нормали вершин */
|
|
@@ -259,7 +259,7 @@ class I {
|
|
|
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 H(i);
|
|
263
263
|
}
|
|
264
264
|
/**
|
|
265
265
|
* Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
|
|
@@ -285,9 +285,9 @@ class I {
|
|
|
285
285
|
}
|
|
286
286
|
}
|
|
287
287
|
export {
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
288
|
+
F as EditorRenderer,
|
|
289
|
+
C as ObjLoader,
|
|
290
|
+
z as PreviewRenderer,
|
|
291
291
|
u as Renderer,
|
|
292
|
-
|
|
292
|
+
L as createProgram
|
|
293
293
|
};
|
package/dist/index.umd.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
(function(n,
|
|
1
|
+
(function(n,i){typeof exports=="object"&&typeof module<"u"?i(exports,require("ogl")):typeof define=="function"&&define.amd?define(["exports","ogl"],i):(n=typeof globalThis<"u"?globalThis:n||self,i(n.PlanaraCore={},n.OGL))})(this,(function(n,i){"use strict";function m(s){const e=`
|
|
2
2
|
attribute vec3 position;
|
|
3
3
|
attribute vec3 normal;
|
|
4
4
|
|
|
@@ -21,10 +21,10 @@
|
|
|
21
21
|
|
|
22
22
|
void main() {
|
|
23
23
|
vec3 normal = normalize(vNormal);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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;
|
|
28
28
|
}
|
|
29
|
-
|
|
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
|
|
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??[])}}),r=new i.Mesh(this.gl.gl,{geometry:t,program:this.program});return r.setParent(this.scene),this.meshes.push(r),r}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 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 i.Orbit(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 r=t.geometry.constructor.name;t.geometry.raycast=r.includes("Sphere")?"sphere":"box"}return t.isHit=!1,t.onBeforeRender(({mesh:r})=>{this.updateHitUniform(r)}),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(r=>r.isHit=!1),this.raycast.intersectBounds(this.meshes).forEach(r=>r.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 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 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 r={type:c.Custom,position:this.positions,...this.normals.length>0&&{normal:this.normals},...this.uvs.length>0&&{uv:this.uvs}};return new y(r)}processFaceLine(e){for(let t=1;t<e.length;t++){const r=e[t];if(!r)continue;const[h,a,d]=r.split("/"),u=h?parseInt(h,10):void 0,p=a?parseInt(a,10):void 0,v=d?parseInt(d,10):void 0;if(u!==void 0){const o=this.tmpPositions[u-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"})}));
|
|
@@ -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,
|
|
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"}
|