@preference-sl/pref-viewer 2.3.4 → 2.4.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.
- package/package.json +8 -2
- package/src/index.js +1 -33
package/package.json
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@preference-sl/pref-viewer",
|
|
3
|
-
"version": "2.3.4",
|
|
4
3
|
"description": "Web Component to preview GLTF models with Babylon.js",
|
|
5
4
|
"author": "Alex Moreno Palacio <amoreno@preference.es>",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"release": "standard-version --releaseCommitMessageFormat \"chore(release): {{currentTag}} [skip ci]\""
|
|
7
|
+
},
|
|
6
8
|
"repository": {
|
|
7
9
|
"type": "git",
|
|
8
10
|
"url": "git+https://bitbucket.org/preferencesl/pref-viewer.git"
|
|
@@ -30,5 +32,9 @@
|
|
|
30
32
|
"dependencies": {
|
|
31
33
|
"@babylonjs/core": "^8.0.0",
|
|
32
34
|
"@babylonjs/loaders": "^8.0.0"
|
|
33
|
-
}
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"standard-version": "^9.5.0"
|
|
38
|
+
},
|
|
39
|
+
"version": "2.4.0"
|
|
34
40
|
}
|
package/src/index.js
CHANGED
|
@@ -55,7 +55,6 @@ import "@babylonjs/loaders";
|
|
|
55
55
|
class PrefViewer extends HTMLElement {
|
|
56
56
|
constructor() {
|
|
57
57
|
super();
|
|
58
|
-
console.log("PrefViewer: constructor");
|
|
59
58
|
this.attachShadow({ mode: "open" });
|
|
60
59
|
this._createCanvas();
|
|
61
60
|
this._wrapCanvas();
|
|
@@ -79,10 +78,8 @@ class PrefViewer extends HTMLElement {
|
|
|
79
78
|
}
|
|
80
79
|
|
|
81
80
|
attributeChangedCallback(name, _oldValue, newValue) {
|
|
82
|
-
console.log(`PrefViewer: attributeChangedCallback - ${name} -> ${newValue}`);
|
|
83
81
|
if (name === "model" && newValue) {
|
|
84
82
|
this.modelUrl = newValue;
|
|
85
|
-
console.log(`PrefViewer: modelUrl set to ${this.modelUrl}`);
|
|
86
83
|
// Only reload if initialization has already happened
|
|
87
84
|
if (this._hasInitialized) {
|
|
88
85
|
this._reloadModel();
|
|
@@ -91,7 +88,6 @@ class PrefViewer extends HTMLElement {
|
|
|
91
88
|
}
|
|
92
89
|
|
|
93
90
|
connectedCallback() {
|
|
94
|
-
console.log("PrefViewer: connectedCallback");
|
|
95
91
|
|
|
96
92
|
// Set up the plugin hook ONCE globally before any other initialization
|
|
97
93
|
if (!this._pluginHookSetup) {
|
|
@@ -102,10 +98,8 @@ class PrefViewer extends HTMLElement {
|
|
|
102
98
|
// 1) Determine modelUrl now that element is connected
|
|
103
99
|
if (!this.hasAttribute("model")) {
|
|
104
100
|
this.modelUrl = new URL("./models/window.gltf", import.meta.url).href;
|
|
105
|
-
console.log(`PrefViewer: no model attribute, defaulting to ${this.modelUrl}`);
|
|
106
101
|
} else {
|
|
107
102
|
this.modelUrl = this.getAttribute("model");
|
|
108
|
-
console.log(`PrefViewer: model attribute present, using ${this.modelUrl}`);
|
|
109
103
|
}
|
|
110
104
|
|
|
111
105
|
// 2) Initialize Babylon (engine + scene + camera + lights + hooks)
|
|
@@ -119,7 +113,6 @@ class PrefViewer extends HTMLElement {
|
|
|
119
113
|
}
|
|
120
114
|
|
|
121
115
|
disconnectedCallback() {
|
|
122
|
-
console.log("PrefViewer: disconnectedCallback - disposing engine");
|
|
123
116
|
this._disposeEngine();
|
|
124
117
|
if (this._onWindowResize) {
|
|
125
118
|
window.removeEventListener("resize", this._onWindowResize);
|
|
@@ -128,7 +121,6 @@ class PrefViewer extends HTMLElement {
|
|
|
128
121
|
|
|
129
122
|
// ====== URL Preprocessing Setup ======
|
|
130
123
|
_setupUrlPreprocessing() {
|
|
131
|
-
console.log("PrefViewer: Setting up URL preprocessing hook");
|
|
132
124
|
|
|
133
125
|
const transformUrl = (url) => {
|
|
134
126
|
// a) If the loader already prepended "blob:…", strip it out.
|
|
@@ -138,35 +130,28 @@ class PrefViewer extends HTMLElement {
|
|
|
138
130
|
);
|
|
139
131
|
// b) Normalize backslashes "\" → forward slashes "/"
|
|
140
132
|
const fixedSlashes = stripped.replace(/\\/g, "/");
|
|
141
|
-
|
|
142
|
-
`PrefViewer: preprocessUrl received "${url}", stripped to "${stripped}", normalized to "${fixedSlashes}"`
|
|
143
|
-
);
|
|
133
|
+
|
|
144
134
|
// c) If it now starts with "http://" or "https://", return it as an absolute URL:
|
|
145
135
|
if (/^https?:\/\//i.test(fixedSlashes)) {
|
|
146
|
-
console.log(`PrefViewer: preprocessUrl returning absolute URL "${fixedSlashes}"`);
|
|
147
136
|
return fixedSlashes;
|
|
148
137
|
}
|
|
149
138
|
// d) Otherwise, return the relative path
|
|
150
|
-
console.log(`PrefViewer: preprocessUrl returning relative URL "${fixedSlashes}"`);
|
|
151
139
|
return fixedSlashes;
|
|
152
140
|
};
|
|
153
141
|
|
|
154
142
|
SceneLoader.OnPluginActivatedObservable.add((plugin) => {
|
|
155
|
-
console.log(`PrefViewer: Plugin activated - ${plugin.name}`);
|
|
156
143
|
if (plugin.name === "gltf" || plugin.name === "gltf2") {
|
|
157
144
|
// Support both sync and async preprocessing
|
|
158
145
|
plugin.preprocessUrl = transformUrl;
|
|
159
146
|
if (typeof plugin.preprocessUrlAsync === 'function' || plugin.preprocessUrlAsync === undefined) {
|
|
160
147
|
plugin.preprocessUrlAsync = (url) => Promise.resolve(transformUrl(url));
|
|
161
148
|
}
|
|
162
|
-
console.log("PrefViewer: URL preprocessing hooks set up for GLTF plugin");
|
|
163
149
|
}
|
|
164
150
|
});
|
|
165
151
|
}
|
|
166
152
|
|
|
167
153
|
// ====== Private setup methods ======
|
|
168
154
|
_createCanvas() {
|
|
169
|
-
console.log("PrefViewer: _createCanvas");
|
|
170
155
|
this.canvas = document.createElement("canvas");
|
|
171
156
|
Object.assign(this.canvas.style, {
|
|
172
157
|
width: "100%",
|
|
@@ -176,7 +161,6 @@ class PrefViewer extends HTMLElement {
|
|
|
176
161
|
}
|
|
177
162
|
|
|
178
163
|
_wrapCanvas() {
|
|
179
|
-
console.log("PrefViewer: _wrapCanvas");
|
|
180
164
|
const wrapper = document.createElement("div");
|
|
181
165
|
Object.assign(wrapper.style, {
|
|
182
166
|
width: "100%",
|
|
@@ -188,7 +172,6 @@ class PrefViewer extends HTMLElement {
|
|
|
188
172
|
}
|
|
189
173
|
|
|
190
174
|
_initializeBabylon() {
|
|
191
|
-
console.log("PrefViewer: _initializeBabylon - creating engine and scene");
|
|
192
175
|
|
|
193
176
|
// 1) Create the Babylon engine & scene
|
|
194
177
|
this.engine = new Engine(this.canvas, true, { alpha: true });
|
|
@@ -196,16 +179,13 @@ class PrefViewer extends HTMLElement {
|
|
|
196
179
|
this.scene.clearColor = new Color4(1, 1, 1, 1);
|
|
197
180
|
|
|
198
181
|
// 2) Create camera and lights
|
|
199
|
-
console.log("PrefViewer: _createCamera and _createLights");
|
|
200
182
|
this._createCamera();
|
|
201
183
|
this._createLights();
|
|
202
184
|
|
|
203
185
|
// 3) Hook up input/event handlers (e.g. wheel-to-zoom)
|
|
204
|
-
console.log("PrefViewer: _setupEventListeners");
|
|
205
186
|
this._setupEventListeners();
|
|
206
187
|
|
|
207
188
|
// 4) Start Babylon's render loop
|
|
208
|
-
console.log("PrefViewer: Starting render loop");
|
|
209
189
|
this.engine.runRenderLoop(() => {
|
|
210
190
|
if (this.scene) {
|
|
211
191
|
this.scene.render();
|
|
@@ -213,7 +193,6 @@ class PrefViewer extends HTMLElement {
|
|
|
213
193
|
});
|
|
214
194
|
|
|
215
195
|
this._onWindowResize = () => {
|
|
216
|
-
console.log("PrefViewer: Window resized - calling engine.resize()");
|
|
217
196
|
if (this.engine) {
|
|
218
197
|
this.engine.resize();
|
|
219
198
|
}
|
|
@@ -222,7 +201,6 @@ class PrefViewer extends HTMLElement {
|
|
|
222
201
|
}
|
|
223
202
|
|
|
224
203
|
_createCamera() {
|
|
225
|
-
console.log("PrefViewer: _createCamera");
|
|
226
204
|
// ArcRotateCamera that orbits around origin
|
|
227
205
|
this.camera = new ArcRotateCamera(
|
|
228
206
|
"camera",
|
|
@@ -236,7 +214,6 @@ class PrefViewer extends HTMLElement {
|
|
|
236
214
|
}
|
|
237
215
|
|
|
238
216
|
_createLights() {
|
|
239
|
-
console.log("PrefViewer: _createLights");
|
|
240
217
|
this.hemiLight = new HemisphericLight(
|
|
241
218
|
"hemiLight",
|
|
242
219
|
new Vector3(0, 1, 0),
|
|
@@ -254,7 +231,6 @@ class PrefViewer extends HTMLElement {
|
|
|
254
231
|
}
|
|
255
232
|
|
|
256
233
|
_setupEventListeners() {
|
|
257
|
-
console.log("PrefViewer: _setupEventListeners");
|
|
258
234
|
// Zoom toward point-of-interest on wheel scroll
|
|
259
235
|
this.canvas.addEventListener("wheel", (evt) => {
|
|
260
236
|
if (!this.scene || !this.camera) return;
|
|
@@ -274,7 +250,6 @@ class PrefViewer extends HTMLElement {
|
|
|
274
250
|
|
|
275
251
|
// ====== Model loading / management ======
|
|
276
252
|
async _reloadModel() {
|
|
277
|
-
console.log(`PrefViewer: _reloadModel - loading ${this.modelUrl}`);
|
|
278
253
|
if (!this.scene || !this.modelUrl) {
|
|
279
254
|
console.warn("PrefViewer: _reloadModel aborted (scene or modelUrl missing)");
|
|
280
255
|
return;
|
|
@@ -284,7 +259,6 @@ class PrefViewer extends HTMLElement {
|
|
|
284
259
|
this._disposePreviousMeshes();
|
|
285
260
|
|
|
286
261
|
try {
|
|
287
|
-
console.log(`PrefViewer: ImportMeshAsync("${this.modelUrl}")`);
|
|
288
262
|
const result = await SceneLoader.ImportMeshAsync(
|
|
289
263
|
null,
|
|
290
264
|
"",
|
|
@@ -293,10 +267,8 @@ class PrefViewer extends HTMLElement {
|
|
|
293
267
|
undefined,
|
|
294
268
|
".gltf"
|
|
295
269
|
);
|
|
296
|
-
console.log("PrefViewer: Model loaded, creating default camera/light if needed");
|
|
297
270
|
this.scene.createDefaultCameraOrLight(true, true, true);
|
|
298
271
|
|
|
299
|
-
console.log("PrefViewer: Dispatching model-loaded event");
|
|
300
272
|
this.dispatchEvent(
|
|
301
273
|
new CustomEvent("model-loaded", {
|
|
302
274
|
detail: {
|
|
@@ -309,7 +281,6 @@ class PrefViewer extends HTMLElement {
|
|
|
309
281
|
);
|
|
310
282
|
} catch (err) {
|
|
311
283
|
console.error("PrefViewer: Error loading model:", err);
|
|
312
|
-
console.log("PrefViewer: Dispatching model-error event");
|
|
313
284
|
this.dispatchEvent(
|
|
314
285
|
new CustomEvent("model-error", {
|
|
315
286
|
detail: { error: err },
|
|
@@ -321,11 +292,9 @@ class PrefViewer extends HTMLElement {
|
|
|
321
292
|
}
|
|
322
293
|
|
|
323
294
|
_disposePreviousMeshes() {
|
|
324
|
-
console.log("PrefViewer: _disposePreviousMeshes");
|
|
325
295
|
if (!this.scene) return;
|
|
326
296
|
this.scene.meshes.slice().forEach((mesh) => {
|
|
327
297
|
if (mesh.getClassName() === "Mesh") {
|
|
328
|
-
console.log(`PrefViewer: Disposing mesh ${mesh.name}`);
|
|
329
298
|
mesh.dispose();
|
|
330
299
|
}
|
|
331
300
|
});
|
|
@@ -333,7 +302,6 @@ class PrefViewer extends HTMLElement {
|
|
|
333
302
|
|
|
334
303
|
// ====== Cleanup ======
|
|
335
304
|
_disposeEngine() {
|
|
336
|
-
console.log("PrefViewer: _disposeEngine");
|
|
337
305
|
if (this.engine) {
|
|
338
306
|
this.engine.dispose();
|
|
339
307
|
this.engine = null;
|