@eva/plugin-renderer-mesh 2.0.1-beta.9 → 2.0.2-beta.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.
@@ -3,7 +3,6 @@ globalThis.EVA.plugin = globalThis.EVA.plugin || {};
3
3
  globalThis.EVA.plugin.renderer = globalThis.EVA.plugin.renderer || {};
4
4
  var _EVA_IIFE_mesh = function (exports, eva_js, pluginRenderer, pixi_js) {
5
5
  'use strict';
6
-
7
6
  class PerspectiveMesh extends eva_js.Component {
8
7
  constructor() {
9
8
  super(...arguments);
@@ -1 +1 @@
1
- globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{},globalThis.EVA.plugin.renderer=globalThis.EVA.plugin.renderer||{};var _EVA_IIFE_mesh=function(e,r,s,t){"use strict";class n extends r.Component{constructor(){super(...arguments),this.verticesX=10,this.verticesY=10,this._forceUpdate=0}init(e){e&&e.resource&&(this.resource=e.resource),e&&e.verticesX&&(this.verticesX=e.verticesX),e&&e.verticesY&&(this.verticesY=e.verticesY)}setCorners(e,r,s,t,n,i,o,c){const a=this.corners||{};a.x0=e,a.y0=r,a.x1=s,a.y1=t,a.x2=n,a.y2=i,a.x3=o,a.y3=c,this.corners=a,this._forceUpdate+=1}}function i(e,r,s,t){return new(s||(s=Promise))((function(n,i){function o(e){try{a(t.next(e))}catch(e){i(e)}}function c(e){try{a(t.throw(e))}catch(e){i(e)}}function a(e){var r;e.done?n(e.value):(r=e.value,r instanceof s?r:new s((function(e){e(r)}))).then(o,c)}a((t=t.apply(e,r||[])).next())}))}n.componentName="PerspectiveMesh";let o=class extends s.Renderer{constructor(){super(...arguments),this.name="MeshSystem",this.meshes={}}init(){this.renderSystem=this.game.getSystem(s.RendererSystem),this.renderSystem.rendererManager.register(this)}componentChanged(e){var s,n;return i(this,void 0,void 0,(function*(){if("PerspectiveMesh"===e.componentName){const i=e.gameObject.id,o=e.component;if(e.type===r.OBSERVER_TYPE.ADD){const n=new t.PerspectiveMesh({texture:new t.Texture,verticesX:o.verticesX,verticesY:o.verticesY});this.meshes[e.gameObject.id]=n,this.containerManager.getContainer(e.gameObject.id).addChildAt(n,0);const c=this.increaseAsyncId(i),a=yield r.resource.getResource(o.resource),h=null===(s=a.data)||void 0===s?void 0:s.image;if(!this.validateAsyncId(i,c))return;if(!h)return void console.error(`GameObject:${e.gameObject.name}'s Mesh resource load error`);n.texture=h,o.corners?this.meshes[e.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3):n.setCorners(0,0,h.width,0,h.width,h.height,0,h.height)}else if(e.type===r.OBSERVER_TYPE.CHANGE){const s=this.increaseAsyncId(i),t=yield r.resource.getResource(o.resource),c=null===(n=t.data)||void 0===n?void 0:n.image;if(!this.validateAsyncId(i,s))return;if(!c)return void console.error(`GameObject:${e.gameObject.name}'s Mesh resource load error`);this.meshes[e.gameObject.id].texture=c,o.corners&&this.meshes[e.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3)}else if(e.type===r.OBSERVER_TYPE.REMOVE){this.increaseAsyncId(i);const r=this.meshes[e.gameObject.id];this.containerManager.getContainer(e.gameObject.id).removeChild(r),r.destroy(),delete this.meshes[e.gameObject.id]}}}))}destroy(){var e,r;for(const s in this.meshes){const t=this.meshes[s];null===(r=null===(e=this.containerManager)||void 0===e?void 0:e.getContainer(parseInt(s)))||void 0===r||r.removeChild(t),t.destroy(),delete this.meshes[s]}}};o.systemName="MeshSystem",o=function(e,r,s,t){var n,i=arguments.length,o=i<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,s):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,r,s,t);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(o=(i<3?n(o):i>3?n(r,s,o):n(r,s))||o);return i>3&&o&&Object.defineProperty(r,s,o),o}([r.decorators.componentObserver({PerspectiveMesh:["resource","_forceUpdate"]})],o);var c=o;return e.MeshSystem=c,e.PerspectiveMesh=n,Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer,PIXI);globalThis.EVA.plugin.renderer.mesh=globalThis.EVA.plugin.renderer.mesh||_EVA_IIFE_mesh;
1
+ globalThis.EVA=globalThis.EVA||{},globalThis.EVA.plugin=globalThis.EVA.plugin||{},globalThis.EVA.plugin.renderer=globalThis.EVA.plugin.renderer||{};var _EVA_IIFE_mesh=function(e,r,s,t){"use strict";class n extends r.Component{constructor(){super(...arguments),this.verticesX=10,this.verticesY=10,this._forceUpdate=0}init(e){e&&e.resource&&(this.resource=e.resource),e&&e.verticesX&&(this.verticesX=e.verticesX),e&&e.verticesY&&(this.verticesY=e.verticesY)}setCorners(e,r,s,t,n,i,o,c){const a=this.corners||{};a.x0=e,a.y0=r,a.x1=s,a.y1=t,a.x2=n,a.y2=i,a.x3=o,a.y3=c,this.corners=a,this._forceUpdate+=1}}function i(e,r,s,t){return new(s||(s=Promise))(function(n,i){function o(e){try{a(t.next(e))}catch(e){i(e)}}function c(e){try{a(t.throw(e))}catch(e){i(e)}}function a(e){var r;e.done?n(e.value):(r=e.value,r instanceof s?r:new s(function(e){e(r)})).then(o,c)}a((t=t.apply(e,r||[])).next())})}n.componentName="PerspectiveMesh";let o=class extends s.Renderer{constructor(){super(...arguments),this.name="MeshSystem",this.meshes={}}init(){this.renderSystem=this.game.getSystem(s.RendererSystem),this.renderSystem.rendererManager.register(this)}componentChanged(e){var s,n;return i(this,void 0,void 0,function*(){if("PerspectiveMesh"===e.componentName){const i=e.gameObject.id,o=e.component;if(e.type===r.OBSERVER_TYPE.ADD){const n=new t.PerspectiveMesh({texture:new t.Texture,verticesX:o.verticesX,verticesY:o.verticesY});this.meshes[e.gameObject.id]=n,this.containerManager.getContainer(e.gameObject.id).addChildAt(n,0);const c=this.increaseAsyncId(i),a=yield r.resource.getResource(o.resource),h=null===(s=a.data)||void 0===s?void 0:s.image;if(!this.validateAsyncId(i,c))return;if(!h)return void console.error(`GameObject:${e.gameObject.name}'s Mesh resource load error`);n.texture=h,o.corners?this.meshes[e.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3):n.setCorners(0,0,h.width,0,h.width,h.height,0,h.height)}else if(e.type===r.OBSERVER_TYPE.CHANGE){const s=this.increaseAsyncId(i),t=yield r.resource.getResource(o.resource),c=null===(n=t.data)||void 0===n?void 0:n.image;if(!this.validateAsyncId(i,s))return;if(!c)return void console.error(`GameObject:${e.gameObject.name}'s Mesh resource load error`);this.meshes[e.gameObject.id].texture=c,o.corners&&this.meshes[e.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3)}else if(e.type===r.OBSERVER_TYPE.REMOVE){this.increaseAsyncId(i);const r=this.meshes[e.gameObject.id];this.containerManager.getContainer(e.gameObject.id).removeChild(r),r.destroy(),delete this.meshes[e.gameObject.id]}}})}destroy(){var e,r;for(const s in this.meshes){const t=this.meshes[s];null===(r=null===(e=this.containerManager)||void 0===e?void 0:e.getContainer(parseInt(s)))||void 0===r||r.removeChild(t),t.destroy(),delete this.meshes[s]}}};o.systemName="MeshSystem",o=function(e,r,s,t){var n,i=arguments.length,o=i<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,s):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,r,s,t);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(o=(i<3?n(o):i>3?n(r,s,o):n(r,s))||o);return i>3&&o&&Object.defineProperty(r,s,o),o}([r.decorators.componentObserver({PerspectiveMesh:["resource","_forceUpdate"]})],o);var c=o;return e.MeshSystem=c,e.PerspectiveMesh=n,Object.defineProperty(e,"__esModule",{value:!0}),e}({},EVA,EVA.plugin.renderer,PIXI);globalThis.EVA.plugin.renderer.mesh=globalThis.EVA.plugin.renderer.mesh||_EVA_IIFE_mesh;
@@ -6,13 +6,69 @@ var eva_js = require('@eva/eva.js');
6
6
  var pluginRenderer = require('@eva/plugin-renderer');
7
7
  var pixi_js = require('pixi.js');
8
8
 
9
+ /**
10
+ * 透视网格组件
11
+ *
12
+ * PerspectiveMesh 组件用于创建具有透视变形效果的图片。
13
+ * 通过将图片分割成网格并调整四个角的位置,可以实现 3D 透视、梯形变换等效果,
14
+ * 适用于翻书效果、卡片翻转、3D 地面贴图等场景。
15
+ *
16
+ * 工作原理:
17
+ * - 将图片分割成 M×N 的网格
18
+ * - 通过调整四个角的位置实现透视变换
19
+ * - 网格越密集,变形效果越平滑
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * // 创建透视变形的图片
24
+ * const card = new GameObject('card');
25
+ * const mesh = new PerspectiveMesh({
26
+ * resource: 'cardImage',
27
+ * verticesX: 10, // 横向网格数
28
+ * verticesY: 10 // 纵向网格数
29
+ * });
30
+ * card.addComponent(mesh);
31
+ *
32
+ * // 设置四个角的位置实现透视效果
33
+ * // 参数:左上(x0,y0), 右上(x1,y1), 右下(x2,y2), 左下(x3,y3)
34
+ * mesh.setCorners(
35
+ * 50, 0, // 左上角
36
+ * 350, 0, // 右上角
37
+ * 400, 300, // 右下角
38
+ * 0, 300 // 左下角
39
+ * );
40
+ *
41
+ * // 创建翻书效果
42
+ * let angle = 0;
43
+ * setInterval(() => {
44
+ * angle += 0.1;
45
+ * const offset = Math.sin(angle) * 50;
46
+ * mesh.setCorners(
47
+ * offset, 0,
48
+ * 400 - offset, 0,
49
+ * 400, 300,
50
+ * 0, 300
51
+ * );
52
+ * }, 16);
53
+ * ```
54
+ */
9
55
  class PerspectiveMesh extends eva_js.Component {
10
56
  constructor() {
11
57
  super(...arguments);
58
+ /** 横向顶点数量(网格密度) */
12
59
  this.verticesX = 10;
60
+ /** 纵向顶点数量(网格密度) */
13
61
  this.verticesY = 10;
62
+ /** 强制更新标志 */
14
63
  this._forceUpdate = 0;
15
64
  }
65
+ /**
66
+ * 初始化组件
67
+ * @param obj - 初始化参数
68
+ * @param obj.resource - 纹理资源名称
69
+ * @param obj.verticesX - 横向网格密度
70
+ * @param obj.verticesY - 纵向网格密度
71
+ */
16
72
  init(obj) {
17
73
  if (obj && obj.resource) {
18
74
  this.resource = obj.resource;
@@ -24,6 +80,20 @@ class PerspectiveMesh extends eva_js.Component {
24
80
  this.verticesY = obj.verticesY;
25
81
  }
26
82
  }
83
+ /**
84
+ * 设置四个角的位置
85
+ *
86
+ * 通过改变四个角的坐标来实现透视变换效果。
87
+ *
88
+ * @param x0 - 左上角 X 坐标
89
+ * @param y0 - 左上角 Y 坐标
90
+ * @param x1 - 右上角 X 坐标
91
+ * @param y1 - 右上角 Y 坐标
92
+ * @param x2 - 右下角 X 坐标
93
+ * @param y2 - 右下角 Y 坐标
94
+ * @param x3 - 左下角 X 坐标
95
+ * @param y3 - 左下角 Y 坐标
96
+ */
27
97
  setCorners(x0, y0, x1, y1, x2, y2, x3, y3) {
28
98
  const corners = this.corners || {};
29
99
  corners.x0 = x0;
@@ -38,21 +108,22 @@ class PerspectiveMesh extends eva_js.Component {
38
108
  this._forceUpdate += 1;
39
109
  }
40
110
  }
111
+ /** 组件名称 */
41
112
  PerspectiveMesh.componentName = 'PerspectiveMesh';
42
113
 
43
- /*! *****************************************************************************
44
- Copyright (c) Microsoft Corporation. All rights reserved.
45
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
46
- this file except in compliance with the License. You may obtain a copy of the
47
- License at http://www.apache.org/licenses/LICENSE-2.0
114
+ /******************************************************************************
115
+ Copyright (c) Microsoft Corporation.
48
116
 
49
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
50
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
51
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
52
- MERCHANTABLITY OR NON-INFRINGEMENT.
117
+ Permission to use, copy, modify, and/or distribute this software for any
118
+ purpose with or without fee is hereby granted.
53
119
 
54
- See the Apache Version 2.0 License for specific language governing permissions
55
- and limitations under the License.
120
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
121
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
122
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
123
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
124
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
125
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
126
+ PERFORMANCE OF THIS SOFTWARE.
56
127
  ***************************************************************************** */
57
128
 
58
129
  function __decorate(decorators, target, key, desc) {
@@ -63,13 +134,19 @@ function __decorate(decorators, target, key, desc) {
63
134
  }
64
135
 
65
136
  function __awaiter(thisArg, _arguments, P, generator) {
137
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
66
138
  return new (P || (P = Promise))(function (resolve, reject) {
67
139
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
68
140
  function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
69
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
141
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
70
142
  step((generator = generator.apply(thisArg, _arguments || [])).next());
71
143
  });
72
- }
144
+ }
145
+
146
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
147
+ var e = new Error(message);
148
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
149
+ };
73
150
 
74
151
  let MeshSystem = class MeshSystem extends pluginRenderer.Renderer {
75
152
  constructor() {
@@ -1,16 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@eva/eva.js"),r=require("@eva/plugin-renderer"),t=require("pixi.js");class s extends e.Component{constructor(){super(...arguments),this.verticesX=10,this.verticesY=10,this._forceUpdate=0}init(e){e&&e.resource&&(this.resource=e.resource),e&&e.verticesX&&(this.verticesX=e.verticesX),e&&e.verticesY&&(this.verticesY=e.verticesY)}setCorners(e,r,t,s,n,i,o,c){const a=this.corners||{};a.x0=e,a.y0=r,a.x1=t,a.y1=s,a.x2=n,a.y2=i,a.x3=o,a.y3=c,this.corners=a,this._forceUpdate+=1}}s.componentName="PerspectiveMesh";let n=class extends r.Renderer{constructor(){super(...arguments),this.name="MeshSystem",this.meshes={}}init(){this.renderSystem=this.game.getSystem(r.RendererSystem),this.renderSystem.rendererManager.register(this)}componentChanged(r){var s,n,i,o,c,a;return i=this,o=void 0,a=function*(){if("PerspectiveMesh"===r.componentName){const i=r.gameObject.id,o=r.component;if(r.type===e.OBSERVER_TYPE.ADD){const n=new t.PerspectiveMesh({texture:new t.Texture,verticesX:o.verticesX,verticesY:o.verticesY});this.meshes[r.gameObject.id]=n,this.containerManager.getContainer(r.gameObject.id).addChildAt(n,0);const c=this.increaseAsyncId(i),a=yield e.resource.getResource(o.resource),h=null===(s=a.data)||void 0===s?void 0:s.image;if(!this.validateAsyncId(i,c))return;if(!h)return void console.error(`GameObject:${r.gameObject.name}'s Mesh resource load error`);n.texture=h,o.corners?this.meshes[r.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3):n.setCorners(0,0,h.width,0,h.width,h.height,0,h.height)}else if(r.type===e.OBSERVER_TYPE.CHANGE){const t=this.increaseAsyncId(i),s=yield e.resource.getResource(o.resource),c=null===(n=s.data)||void 0===n?void 0:n.image;if(!this.validateAsyncId(i,t))return;if(!c)return void console.error(`GameObject:${r.gameObject.name}'s Mesh resource load error`);this.meshes[r.gameObject.id].texture=c,o.corners&&this.meshes[r.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3)}else if(r.type===e.OBSERVER_TYPE.REMOVE){this.increaseAsyncId(i);const e=this.meshes[r.gameObject.id];this.containerManager.getContainer(r.gameObject.id).removeChild(e),e.destroy(),delete this.meshes[r.gameObject.id]}}},new((c=void 0)||(c=Promise))((function(e,r){function t(e){try{n(a.next(e))}catch(e){r(e)}}function s(e){try{n(a.throw(e))}catch(e){r(e)}}function n(r){r.done?e(r.value):new c((function(e){e(r.value)})).then(t,s)}n((a=a.apply(i,o||[])).next())}))}destroy(){var e,r;for(const t in this.meshes){const s=this.meshes[t];null===(r=null===(e=this.containerManager)||void 0===e?void 0:e.getContainer(parseInt(t)))||void 0===r||r.removeChild(s),s.destroy(),delete this.meshes[t]}}};n.systemName="MeshSystem",n=
2
- /*! *****************************************************************************
3
- Copyright (c) Microsoft Corporation. All rights reserved.
4
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
5
- this file except in compliance with the License. You may obtain a copy of the
6
- License at http://www.apache.org/licenses/LICENSE-2.0
7
-
8
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
9
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
10
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
11
- MERCHANTABLITY OR NON-INFRINGEMENT.
12
-
13
- See the Apache Version 2.0 License for specific language governing permissions
14
- and limitations under the License.
15
- ***************************************************************************** */
16
- function(e,r,t,s){var n,i=arguments.length,o=i<3?r:null===s?s=Object.getOwnPropertyDescriptor(r,t):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,r,t,s);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(o=(i<3?n(o):i>3?n(r,t,o):n(r,t))||o);return i>3&&o&&Object.defineProperty(r,t,o),o}([e.decorators.componentObserver({PerspectiveMesh:["resource","_forceUpdate"]})],n);var i=n;exports.MeshSystem=i,exports.PerspectiveMesh=s;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("@eva/eva.js"),r=require("@eva/plugin-renderer"),t=require("pixi.js");class s extends e.Component{constructor(){super(...arguments),this.verticesX=10,this.verticesY=10,this._forceUpdate=0}init(e){e&&e.resource&&(this.resource=e.resource),e&&e.verticesX&&(this.verticesX=e.verticesX),e&&e.verticesY&&(this.verticesY=e.verticesY)}setCorners(e,r,t,s,n,i,o,c){const a=this.corners||{};a.x0=e,a.y0=r,a.x1=t,a.y1=s,a.x2=n,a.y2=i,a.x3=o,a.y3=c,this.corners=a,this._forceUpdate+=1}}function n(e,r,t,s){return new(t||(t=Promise))(function(n,i){function o(e){try{a(s.next(e))}catch(e){i(e)}}function c(e){try{a(s.throw(e))}catch(e){i(e)}}function a(e){var r;e.done?n(e.value):(r=e.value,r instanceof t?r:new t(function(e){e(r)})).then(o,c)}a((s=s.apply(e,r||[])).next())})}s.componentName="PerspectiveMesh","function"==typeof SuppressedError&&SuppressedError;let i=class extends r.Renderer{constructor(){super(...arguments),this.name="MeshSystem",this.meshes={}}init(){this.renderSystem=this.game.getSystem(r.RendererSystem),this.renderSystem.rendererManager.register(this)}componentChanged(r){var s,i;return n(this,void 0,void 0,function*(){if("PerspectiveMesh"===r.componentName){const n=r.gameObject.id,o=r.component;if(r.type===e.OBSERVER_TYPE.ADD){const i=new t.PerspectiveMesh({texture:new t.Texture,verticesX:o.verticesX,verticesY:o.verticesY});this.meshes[r.gameObject.id]=i,this.containerManager.getContainer(r.gameObject.id).addChildAt(i,0);const c=this.increaseAsyncId(n),a=yield e.resource.getResource(o.resource),h=null===(s=a.data)||void 0===s?void 0:s.image;if(!this.validateAsyncId(n,c))return;if(!h)return void console.error(`GameObject:${r.gameObject.name}'s Mesh resource load error`);i.texture=h,o.corners?this.meshes[r.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3):i.setCorners(0,0,h.width,0,h.width,h.height,0,h.height)}else if(r.type===e.OBSERVER_TYPE.CHANGE){const t=this.increaseAsyncId(n),s=yield e.resource.getResource(o.resource),c=null===(i=s.data)||void 0===i?void 0:i.image;if(!this.validateAsyncId(n,t))return;if(!c)return void console.error(`GameObject:${r.gameObject.name}'s Mesh resource load error`);this.meshes[r.gameObject.id].texture=c,o.corners&&this.meshes[r.gameObject.id].setCorners(o.corners.x0,o.corners.y0,o.corners.x1,o.corners.y1,o.corners.x2,o.corners.y2,o.corners.x3,o.corners.y3)}else if(r.type===e.OBSERVER_TYPE.REMOVE){this.increaseAsyncId(n);const e=this.meshes[r.gameObject.id];this.containerManager.getContainer(r.gameObject.id).removeChild(e),e.destroy(),delete this.meshes[r.gameObject.id]}}})}destroy(){var e,r;for(const t in this.meshes){const s=this.meshes[t];null===(r=null===(e=this.containerManager)||void 0===e?void 0:e.getContainer(parseInt(t)))||void 0===r||r.removeChild(s),s.destroy(),delete this.meshes[t]}}};i.systemName="MeshSystem",i=function(e,r,t,s){var n,i=arguments.length,o=i<3?r:null===s?s=Object.getOwnPropertyDescriptor(r,t):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,r,t,s);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(o=(i<3?n(o):i>3?n(r,t,o):n(r,t))||o);return i>3&&o&&Object.defineProperty(r,t,o),o}([e.decorators.componentObserver({PerspectiveMesh:["resource","_forceUpdate"]})],i);var o=i;exports.MeshSystem=o,exports.PerspectiveMesh=s;
@@ -24,14 +24,87 @@ export declare class MeshSystem extends Renderer {
24
24
  destroy(): void;
25
25
  }
26
26
 
27
+ /**
28
+ * 透视网格组件
29
+ *
30
+ * PerspectiveMesh 组件用于创建具有透视变形效果的图片。
31
+ * 通过将图片分割成网格并调整四个角的位置,可以实现 3D 透视、梯形变换等效果,
32
+ * 适用于翻书效果、卡片翻转、3D 地面贴图等场景。
33
+ *
34
+ * 工作原理:
35
+ * - 将图片分割成 M×N 的网格
36
+ * - 通过调整四个角的位置实现透视变换
37
+ * - 网格越密集,变形效果越平滑
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * // 创建透视变形的图片
42
+ * const card = new GameObject('card');
43
+ * const mesh = new PerspectiveMesh({
44
+ * resource: 'cardImage',
45
+ * verticesX: 10, // 横向网格数
46
+ * verticesY: 10 // 纵向网格数
47
+ * });
48
+ * card.addComponent(mesh);
49
+ *
50
+ * // 设置四个角的位置实现透视效果
51
+ * // 参数:左上(x0,y0), 右上(x1,y1), 右下(x2,y2), 左下(x3,y3)
52
+ * mesh.setCorners(
53
+ * 50, 0, // 左上角
54
+ * 350, 0, // 右上角
55
+ * 400, 300, // 右下角
56
+ * 0, 300 // 左下角
57
+ * );
58
+ *
59
+ * // 创建翻书效果
60
+ * let angle = 0;
61
+ * setInterval(() => {
62
+ * angle += 0.1;
63
+ * const offset = Math.sin(angle) * 50;
64
+ * mesh.setCorners(
65
+ * offset, 0,
66
+ * 400 - offset, 0,
67
+ * 400, 300,
68
+ * 0, 300
69
+ * );
70
+ * }, 16);
71
+ * ```
72
+ */
27
73
  export declare class PerspectiveMesh extends Component<PerspectiveMeshParams> {
74
+ /** 组件名称 */
28
75
  static componentName: string;
76
+ /** 纹理资源名称 */
29
77
  resource: string;
78
+ /** 横向顶点数量(网格密度) */
30
79
  verticesX: number;
80
+ /** 纵向顶点数量(网格密度) */
31
81
  verticesY: number;
82
+ /** 四个角的坐标位置 */
32
83
  corners: Corners;
84
+ /** 强制更新标志 */
33
85
  _forceUpdate: number;
86
+ /**
87
+ * 初始化组件
88
+ * @param obj - 初始化参数
89
+ * @param obj.resource - 纹理资源名称
90
+ * @param obj.verticesX - 横向网格密度
91
+ * @param obj.verticesY - 纵向网格密度
92
+ */
34
93
  init(obj?: PerspectiveMeshParams): void;
94
+ /**
95
+ * 设置四个角的位置
96
+ *
97
+ * 通过改变四个角的坐标来实现透视变换效果。
98
+ *
99
+ * @param x0 - 左上角 X 坐标
100
+ * @param y0 - 左上角 Y 坐标
101
+ * @param x1 - 右上角 X 坐标
102
+ * @param y1 - 右上角 Y 坐标
103
+ * @param x2 - 右下角 X 坐标
104
+ * @param y2 - 右下角 Y 坐标
105
+ * @param x3 - 左下角 X 坐标
106
+ * @param y3 - 左下角 Y 坐标
107
+ */
35
108
  setCorners(x0: number, y0: number, x1: number, y1: number, x2: number, y2: number, x3: number, y3: number): void;
36
109
  }
37
110
 
@@ -2,13 +2,69 @@ import { Component, decorators, OBSERVER_TYPE, resource } from '@eva/eva.js';
2
2
  import { Renderer, RendererSystem } from '@eva/plugin-renderer';
3
3
  import { PerspectiveMesh as PerspectiveMesh$1, Texture } from 'pixi.js';
4
4
 
5
+ /**
6
+ * 透视网格组件
7
+ *
8
+ * PerspectiveMesh 组件用于创建具有透视变形效果的图片。
9
+ * 通过将图片分割成网格并调整四个角的位置,可以实现 3D 透视、梯形变换等效果,
10
+ * 适用于翻书效果、卡片翻转、3D 地面贴图等场景。
11
+ *
12
+ * 工作原理:
13
+ * - 将图片分割成 M×N 的网格
14
+ * - 通过调整四个角的位置实现透视变换
15
+ * - 网格越密集,变形效果越平滑
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * // 创建透视变形的图片
20
+ * const card = new GameObject('card');
21
+ * const mesh = new PerspectiveMesh({
22
+ * resource: 'cardImage',
23
+ * verticesX: 10, // 横向网格数
24
+ * verticesY: 10 // 纵向网格数
25
+ * });
26
+ * card.addComponent(mesh);
27
+ *
28
+ * // 设置四个角的位置实现透视效果
29
+ * // 参数:左上(x0,y0), 右上(x1,y1), 右下(x2,y2), 左下(x3,y3)
30
+ * mesh.setCorners(
31
+ * 50, 0, // 左上角
32
+ * 350, 0, // 右上角
33
+ * 400, 300, // 右下角
34
+ * 0, 300 // 左下角
35
+ * );
36
+ *
37
+ * // 创建翻书效果
38
+ * let angle = 0;
39
+ * setInterval(() => {
40
+ * angle += 0.1;
41
+ * const offset = Math.sin(angle) * 50;
42
+ * mesh.setCorners(
43
+ * offset, 0,
44
+ * 400 - offset, 0,
45
+ * 400, 300,
46
+ * 0, 300
47
+ * );
48
+ * }, 16);
49
+ * ```
50
+ */
5
51
  class PerspectiveMesh extends Component {
6
52
  constructor() {
7
53
  super(...arguments);
54
+ /** 横向顶点数量(网格密度) */
8
55
  this.verticesX = 10;
56
+ /** 纵向顶点数量(网格密度) */
9
57
  this.verticesY = 10;
58
+ /** 强制更新标志 */
10
59
  this._forceUpdate = 0;
11
60
  }
61
+ /**
62
+ * 初始化组件
63
+ * @param obj - 初始化参数
64
+ * @param obj.resource - 纹理资源名称
65
+ * @param obj.verticesX - 横向网格密度
66
+ * @param obj.verticesY - 纵向网格密度
67
+ */
12
68
  init(obj) {
13
69
  if (obj && obj.resource) {
14
70
  this.resource = obj.resource;
@@ -20,6 +76,20 @@ class PerspectiveMesh extends Component {
20
76
  this.verticesY = obj.verticesY;
21
77
  }
22
78
  }
79
+ /**
80
+ * 设置四个角的位置
81
+ *
82
+ * 通过改变四个角的坐标来实现透视变换效果。
83
+ *
84
+ * @param x0 - 左上角 X 坐标
85
+ * @param y0 - 左上角 Y 坐标
86
+ * @param x1 - 右上角 X 坐标
87
+ * @param y1 - 右上角 Y 坐标
88
+ * @param x2 - 右下角 X 坐标
89
+ * @param y2 - 右下角 Y 坐标
90
+ * @param x3 - 左下角 X 坐标
91
+ * @param y3 - 左下角 Y 坐标
92
+ */
23
93
  setCorners(x0, y0, x1, y1, x2, y2, x3, y3) {
24
94
  const corners = this.corners || {};
25
95
  corners.x0 = x0;
@@ -34,21 +104,22 @@ class PerspectiveMesh extends Component {
34
104
  this._forceUpdate += 1;
35
105
  }
36
106
  }
107
+ /** 组件名称 */
37
108
  PerspectiveMesh.componentName = 'PerspectiveMesh';
38
109
 
39
- /*! *****************************************************************************
40
- Copyright (c) Microsoft Corporation. All rights reserved.
41
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
42
- this file except in compliance with the License. You may obtain a copy of the
43
- License at http://www.apache.org/licenses/LICENSE-2.0
110
+ /******************************************************************************
111
+ Copyright (c) Microsoft Corporation.
44
112
 
45
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
46
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
47
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
48
- MERCHANTABLITY OR NON-INFRINGEMENT.
113
+ Permission to use, copy, modify, and/or distribute this software for any
114
+ purpose with or without fee is hereby granted.
49
115
 
50
- See the Apache Version 2.0 License for specific language governing permissions
51
- and limitations under the License.
116
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
117
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
118
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
119
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
120
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
121
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
122
+ PERFORMANCE OF THIS SOFTWARE.
52
123
  ***************************************************************************** */
53
124
 
54
125
  function __decorate(decorators, target, key, desc) {
@@ -59,13 +130,19 @@ function __decorate(decorators, target, key, desc) {
59
130
  }
60
131
 
61
132
  function __awaiter(thisArg, _arguments, P, generator) {
133
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
62
134
  return new (P || (P = Promise))(function (resolve, reject) {
63
135
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
64
136
  function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
65
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
137
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
66
138
  step((generator = generator.apply(thisArg, _arguments || [])).next());
67
139
  });
68
- }
140
+ }
141
+
142
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
143
+ var e = new Error(message);
144
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
145
+ };
69
146
 
70
147
  let MeshSystem = class MeshSystem extends Renderer {
71
148
  constructor() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eva/plugin-renderer-mesh",
3
- "version": "2.0.1-beta.9",
3
+ "version": "2.0.2-beta.0",
4
4
  "description": "@eva/plugin-renderer-mesh",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-renderer-mesh.esm.js",
@@ -19,8 +19,8 @@
19
19
  "homepage": "https://eva.js.org",
20
20
  "dependencies": {
21
21
  "@eva/inspector-decorator": "^0.0.5",
22
- "@eva/plugin-renderer": "2.0.1-beta.9",
23
- "@eva/eva.js": "2.0.1-beta.9",
24
- "pixi.js": "^8.8.1"
22
+ "@eva/plugin-renderer": "2.0.2-beta.0",
23
+ "@eva/eva.js": "2.0.2-beta.0",
24
+ "pixi.js": "^8.17.0"
25
25
  }
26
26
  }