@canvas3/nuxt 0.1.18 → 0.1.20

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/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "canvas-nuxt-layout",
3
3
  "configKey": "canvas3Layout",
4
- "version": "0.1.18",
4
+ "version": "0.1.20",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.2",
7
7
  "unbuild": "3.6.0"
@@ -19,7 +19,15 @@ type MeshAnimation = {
19
19
  ease: string;
20
20
  };
21
21
  export type AnimationCallback = () => void;
22
- export type AnimationCallbacks = Map<string, AnimationCallback>;
22
+ export type AnimationCallOptions = {
23
+ onScroll: boolean;
24
+ onResize: boolean;
25
+ onMouseMove: boolean;
26
+ onAnimationsRender: boolean;
27
+ render: boolean;
28
+ animationCallback: AnimationCallback;
29
+ };
30
+ export type AnimationCallbacks = Map<string, AnimationCallOptions>;
23
31
  export type MeshMaterialUniform = Record<string, {
24
32
  duration: number;
25
33
  ease: string | null | undefined;
@@ -4,10 +4,13 @@ import type { Pass } from 'three/addons/postprocessing/Pass.js';
4
4
  import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';
5
5
  import type { ShaderMaterial, WebGLRenderer } from 'three';
6
6
  import Scroll from '#canvas3-nuxt/utils/canvas3/scroll';
7
- import type { AnimationCallback, AnimationCallbacks, Canvas3OptionsType, ScrollActionBinding, MeshMaterialUniform, MeshType, myEffectType } from '#canvas3-nuxt/types/types';
7
+ import type { AnimationCallbacks, Canvas3OptionsType, ScrollActionBinding, MeshMaterialUniform, MeshType, myEffectType, AnimationCallOptions } from '#canvas3-nuxt/types/types';
8
8
  declare class Canvas3Class {
9
9
  canvasInitiated: import("vue").Ref<boolean, boolean>;
10
- animateImageMesh: boolean;
10
+ mouseMoveInProgress: boolean;
11
+ animationsRender: boolean;
12
+ resizeInProgress: boolean;
13
+ meshPositionsUpdate: boolean;
11
14
  canvasContainer: HTMLElement | null;
12
15
  scrollableContent: HTMLElement | null;
13
16
  time: number;
@@ -46,7 +49,7 @@ declare class Canvas3Class {
46
49
  updateOnScrollActiveElement(updatedBinding: ScrollActionBinding): void;
47
50
  removeScrollActiveElement(elNode: HTMLElement): void;
48
51
  removeMesh(id: string): void;
49
- addAnimationToRender(callBackName: string, callBackFunction: AnimationCallback): void;
52
+ addAnimationToRender(callBackName: string, callBackOptions: AnimationCallOptions): void;
50
53
  removeAnimationFromRender(callBackName: string): void;
51
54
  addImageAsMesh(imgHtmlEl: HTMLImageElement, shaderName: string | null, meshId: string, meshUniforms: MeshMaterialUniform, activateMeshUniforms: MeshMaterialUniform): Promise<void>;
52
55
  composerPass(): void;
@@ -55,6 +58,9 @@ declare class Canvas3Class {
55
58
  scrollTo(position: number, delay?: number): void;
56
59
  scrollToElBySelector(elQuerySelector: string, delay?: number, margin?: number): void;
57
60
  setMeshPositionsUpdate(state: boolean): void;
61
+ setAnimationsToRender(state: boolean): void;
62
+ setAnimationToRender(callBackName: string, state: boolean): void;
63
+ externalAnimationsRender(): void;
58
64
  render(): void;
59
65
  }
60
66
  export declare const Canvas3: Canvas3Class;
@@ -14,7 +14,10 @@ import { studio783log } from "#canvas3-nuxt/constants/studio783Log";
14
14
  const canvasInitiated = ref(false);
15
15
  class Canvas3Class {
16
16
  canvasInitiated = canvasInitiated;
17
- animateImageMesh = false;
17
+ mouseMoveInProgress = false;
18
+ animationsRender = false;
19
+ resizeInProgress = false;
20
+ meshPositionsUpdate = false;
18
21
  canvasContainer = null;
19
22
  scrollableContent = null;
20
23
  time = 0;
@@ -59,6 +62,7 @@ class Canvas3Class {
59
62
  this.composerPass();
60
63
  this.render();
61
64
  window.addEventListener("mousemove", (event) => {
65
+ this.mouseMoveInProgress = true;
62
66
  this.mouse.x = event.clientX / this.width;
63
67
  this.mouse.y = event.clientY / this.height;
64
68
  setTimeout(() => {
@@ -69,6 +73,9 @@ class Canvas3Class {
69
73
  this.mouse.movementX = this.mouse.x;
70
74
  this.mouse.movementY = this.mouse.y;
71
75
  }
76
+ setTimeout(() => {
77
+ this.mouseMoveInProgress = false;
78
+ }, 0);
72
79
  });
73
80
  this.canvasInitiated.value = true;
74
81
  studio783log();
@@ -91,10 +98,14 @@ class Canvas3Class {
91
98
  this.canvasContainer?.appendChild(this.renderer.domElement);
92
99
  }
93
100
  resizeOnChange() {
101
+ this.resizeInProgress = true;
94
102
  this.setSize();
95
103
  this.resizeImageStore();
96
104
  this.scroll?.resizeMobileBreakEvents();
97
105
  this.scroll?.setSize();
106
+ setTimeout(() => {
107
+ this.resizeInProgress = false;
108
+ }, 0);
98
109
  }
99
110
  resizeImageStore() {
100
111
  for (const item of this.imageStore) {
@@ -110,19 +121,6 @@ class Canvas3Class {
110
121
  }
111
122
  this.setImageMeshPositions();
112
123
  }
113
- // resizeTextStore() {
114
- // for (const item of this.textStore) {
115
- // const bounds = item.htmlEl.getBoundingClientRect()
116
- // const { scaleX, scaleY } = getMSDFFontMeshScales(
117
- // bounds.width,
118
- // item.mesh.geometry?._layout?._width,
119
- // )
120
- // item.mesh.scale.set(scaleX, scaleY, 1)
121
- // item.width = bounds.width
122
- // item.height = bounds.height * heightPositionCoef
123
- // }
124
- // this.setTextMeshPositions()
125
- // }
126
124
  setImageMeshPositions() {
127
125
  if (this.imageStore.length === 0) return;
128
126
  for (const item of this.imageStore) {
@@ -130,17 +128,6 @@ class Canvas3Class {
130
128
  item.mesh.position.y = -item.htmlEl.getBoundingClientRect().top + this.height / 2 - item.height / 2;
131
129
  }
132
130
  }
133
- // setTextMeshPositions() {
134
- // if (this.textStore.length === 0) return
135
- // for (const item of this.textStore) {
136
- // item.mesh.position.x
137
- // = item.htmlEl.getBoundingClientRect().left - this.width / 2
138
- // item.mesh.position.y
139
- // = -item.htmlEl.getBoundingClientRect().top
140
- // + this.height / 2
141
- // - item.height / 2
142
- // }
143
- // }
144
131
  meshUniformsUpdate(id, uniforms) {
145
132
  const mesh = this.scene.getObjectByName(id);
146
133
  if (!mesh) return;
@@ -252,112 +239,13 @@ class Canvas3Class {
252
239
  this.activateMeshUniformMap.delete(id);
253
240
  this.imageStore = this.imageStore.filter((item) => item.name !== id);
254
241
  }
255
- addAnimationToRender(callBackName, callBackFunction) {
242
+ addAnimationToRender(callBackName, callBackOptions) {
256
243
  if (this.animations.has(callBackName)) return;
257
- this.animations.set(callBackName, callBackFunction);
244
+ this.animations.set(callBackName, callBackOptions);
258
245
  }
259
246
  removeAnimationFromRender(callBackName) {
260
247
  this.animations.delete(callBackName);
261
248
  }
262
- // addTextAsMSDF(shaderName: string, meshId: string, htmlEl: HTMLElement, textContent: string, theme: string, meshUniforms: MeshMaterialUniform, activateMeshUniforms: MeshMaterialUniform) {
263
- // this.activateMeshUniformMap.set(meshId, activateMeshUniforms)
264
- //
265
- // let vertexShader = this.options.shaders.default.textVertex
266
- // let fragmentShader = this.options.shaders.default.textFragment
267
- // if (shaderName && this.options.shaders[shaderName]) {
268
- // vertexShader = this.options.shaders[shaderName].vertexShader
269
- // fragmentShader = this.options.shaders[shaderName].fragmentShader
270
- // }
271
- //
272
- // const bounds = htmlEl.getBoundingClientRect()
273
- // const position = { top: bounds.top, left: bounds.left }
274
- // position.top += this.currentScroll
275
- //
276
- // //* ****************************
277
- // // MSDF
278
- // //* ****************************
279
- //
280
- // const geometry = new MSDFTextGeometry({
281
- // text: textContent.trim(),
282
- // font: this.MSDFTextGeometryFont.data,
283
- // })
284
- //
285
- // const material = new THREE.ShaderMaterial({
286
- // side: THREE.DoubleSide,
287
- // transparent: true,
288
- // defines: {
289
- // IS_SMALL: false, // false,
290
- // },
291
- // uniforms: {
292
- // uDevicePixelRatio: { value: window.devicePixelRatio },
293
- // uColor: {
294
- // // TODO: colors dynamic from component
295
- // value: new THREE.Vector4(
296
- // theme === 'dark' ? 27 / 255 : 191 / 255, // R
297
- // theme === 'dark' ? 24 / 255 : 192 / 255, // G
298
- // theme === 'dark' ? 24 / 255 : 178 / 255, // B
299
- // ),
300
- // },
301
- // uViewport: {
302
- // value: new THREE.Vector2(this.width, this.height),
303
- // },
304
- // // Common
305
- // uMouse: { value: new THREE.Vector2(0, 0) },
306
- // uMouseMovement: { value: new THREE.Vector2(0, 0) },
307
- // uFooterGameBall: { value: new THREE.Vector2(0, 0) },
308
- // uMap: { value: null },
309
- // // Rendering
310
- // uThreshold: { value: 0.05 },
311
- // uAlphaTest: { value: 0.01 },
312
- // uStrokeOutsetWidth: { value: 0.0 },
313
- // uStrokeInsetWidth: { value: 0.3 }, // 0.3
314
- // // new generic
315
- // uTime: { value: 0 },
316
- // uMeshSize: { value: new THREE.Vector2(bounds.width, bounds.height) },
317
- // ...this.options.activateMeshOptions.text,
318
- // ...activateMeshUniforms,
319
- // ...meshUniforms,
320
- // },
321
- // vertexShader: vertexShader,
322
- // fragmentShader: fragmentShader,
323
- // })
324
- //
325
- // if (material.uniforms.uMap)
326
- // material.uniforms.uMap.value = this.MSDFTextGeometryAtlas
327
- //
328
- // this.materials.push(material)
329
- //
330
- // const mesh = new THREE.Mesh(geometry, material)
331
- // mesh.name = meshId
332
- // mesh.renderOrder = 1
333
- //
334
- // const { scaleX, scaleY } = getMSDFFontMeshScales(
335
- // bounds.width,
336
- // mesh.geometry?._layout?._width,
337
- // )
338
- //
339
- // mesh.scale.set(scaleX, scaleY, 1)
340
- //
341
- // this.scene.add(mesh)
342
- //
343
- // const newMesh: MeshType = {
344
- // name: meshId,
345
- // htmlEl: htmlEl,
346
- // mesh: mesh,
347
- // top: position.top,
348
- // left: position.left,
349
- // width: bounds.width,
350
- // height: bounds.height * heightPositionCoef,
351
- // }
352
- //
353
- // this.textStore.push(newMesh)
354
- //
355
- // this.setTextMeshPositions()
356
- //
357
- // if (htmlEl.dataset.activeScroll === 'true') {
358
- // this.activateMesh(meshId, true)
359
- // }
360
- // }
361
249
  async addImageAsMesh(imgHtmlEl, shaderName, meshId, meshUniforms, activateMeshUniforms) {
362
250
  if (activateMeshUniforms) {
363
251
  this.activateMeshUniformMap.set(meshId, activateMeshUniforms);
@@ -474,7 +362,28 @@ class Canvas3Class {
474
362
  }, delay * 1e3);
475
363
  }
476
364
  setMeshPositionsUpdate(state) {
477
- this.animateImageMesh = state;
365
+ this.meshPositionsUpdate = state;
366
+ }
367
+ setAnimationsToRender(state) {
368
+ this.animationsRender = state;
369
+ }
370
+ setAnimationToRender(callBackName, state) {
371
+ const animationToUpdate = this.animations.get(callBackName);
372
+ if (animationToUpdate) animationToUpdate.render = state;
373
+ }
374
+ externalAnimationsRender() {
375
+ for (const [_key, callbackOption] of this.animations.entries()) {
376
+ const callBack = callbackOption.animationCallback;
377
+ if (!callBack) return;
378
+ const shouldRunOnScroll = callbackOption.onScroll && this.scroll?.scrollInProgress;
379
+ const shouldRunOnAnimationsRender = callbackOption.onAnimationsRender && this.animationsRender;
380
+ const shouldRunOnResize = callbackOption.onResize && this.resizeInProgress;
381
+ const shouldRunOnMouseMove = callbackOption.onMouseMove && this.mouseMoveInProgress;
382
+ const shouldRender = callbackOption.render;
383
+ if (shouldRunOnScroll || shouldRunOnAnimationsRender || shouldRunOnResize || shouldRunOnMouseMove || shouldRender) {
384
+ callBack();
385
+ }
386
+ }
478
387
  }
479
388
  render() {
480
389
  this.time += 0.05;
@@ -484,9 +393,10 @@ class Canvas3Class {
484
393
  this.customPass.uniforms.scrollSpeed.value = this.scroll?.speedTarget;
485
394
  this.setImageMeshPositions();
486
395
  }
487
- if (this.animateImageMesh) {
396
+ if (this.meshPositionsUpdate) {
488
397
  this.resizeImageStore();
489
398
  }
399
+ this.externalAnimationsRender();
490
400
  if (this.materials.length > 0) {
491
401
  for (const material of this.materials) {
492
402
  if (material.uniforms.uTime)
@@ -503,9 +413,6 @@ class Canvas3Class {
503
413
  );
504
414
  }
505
415
  }
506
- for (const [_key, callback] of this.animations.entries()) {
507
- callback?.();
508
- }
509
416
  if (this.composer) {
510
417
  this.composer.render();
511
418
  } else if (this.renderer && this.camera) {
@@ -3,11 +3,13 @@ import { getShaderMaterial } from '#canvas3-nuxt/utils/canvas3/helpers';
3
3
  export declare const Canvas3: {
4
4
  addMeshToScene: (mesh: Mesh) => void;
5
5
  getMeshFromSceneByName: (meshName: string) => import("three").Object3D<import("three").Object3DEventMap> | undefined;
6
- addAnimationToRender: (callBackName: string, callBackFunction: import("../types/types.js").AnimationCallback) => void;
6
+ addAnimationToRender: (callBackName: string, callBackOptions: import("../types/types.js").AnimationCallOptions) => void;
7
7
  removeAnimationFromRender: (callBackName: string) => void;
8
8
  addImageAsMesh: (imgHtmlEl: HTMLImageElement, shaderName: string | null, meshId: string, meshUniforms: import("../types/types.js").MeshMaterialUniform, activateMeshUniforms: import("../types/types.js").MeshMaterialUniform) => Promise<void>;
9
9
  getShaderMaterial: typeof getShaderMaterial;
10
10
  removeMesh: (id: string) => void;
11
+ setAnimationsToRender: (state: boolean) => void;
12
+ setAnimationToRender: (callBackName: string, state: boolean) => void;
11
13
  resizeOnChange: () => void;
12
14
  scrollToElBySelector: (elQuerySelector: string, delay?: number, margin?: number) => void;
13
15
  setMeshPositionsUpdate: (state: boolean) => void;
@@ -12,6 +12,8 @@ export const Canvas3 = {
12
12
  addImageAsMesh: mainClass.addImageAsMesh.bind(mainClass),
13
13
  getShaderMaterial,
14
14
  removeMesh: mainClass.removeMesh.bind(mainClass),
15
+ setAnimationsToRender: mainClass.setAnimationsToRender.bind(mainClass),
16
+ setAnimationToRender: mainClass.setAnimationToRender.bind(mainClass),
15
17
  resizeOnChange: mainClass.resizeOnChange.bind(mainClass),
16
18
  scrollToElBySelector: mainClass.scrollToElBySelector.bind(mainClass),
17
19
  setMeshPositionsUpdate: mainClass.setMeshPositionsUpdate.bind(mainClass),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canvas3/nuxt",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },