fmode-ng 0.0.39 → 0.0.41

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.
Files changed (100) hide show
  1. package/esm2022/fmode-ng.mjs +5 -10
  2. package/esm2022/lib/aigc/agent/agent.prompt.mjs +122 -10
  3. package/esm2022/lib/aigc/agent/index.mjs +2 -10
  4. package/esm2022/lib/aigc/avatar/avatar.module.mjs +45 -10
  5. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +2 -10
  6. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +315 -10
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +3 -10
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +57 -10
  9. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +97 -10
  10. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +104 -10
  11. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +111 -10
  12. package/esm2022/lib/aigc/avatar/index.mjs +8 -10
  13. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +2 -10
  14. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +166 -8
  15. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +36 -10
  16. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +2 -10
  17. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +141 -8
  18. package/esm2022/lib/aigc/chat/chat-list/index.mjs +2 -10
  19. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +40 -10
  20. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +2 -10
  21. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +92 -10
  22. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +2 -10
  23. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +2 -10
  24. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +207 -8
  25. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +236 -10
  26. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +137 -10
  27. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +69 -10
  28. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +2 -10
  29. package/esm2022/lib/aigc/chat/index.mjs +8 -10
  30. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +82 -10
  31. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +269 -8
  32. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +51 -10
  33. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +24 -10
  34. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +94 -10
  35. package/esm2022/lib/aigc/index.mjs +13 -10
  36. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +21 -10
  37. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +736 -8
  38. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +181 -8
  39. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +7 -10
  40. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +194 -9
  41. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +27 -10
  42. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +27 -10
  43. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +68 -10
  44. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +229 -8
  45. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +2 -10
  46. package/esm2022/lib/aigc/voice/audio.player.mjs +52 -10
  47. package/esm2022/lib/aigc/voice/class-asr.mjs +79 -8
  48. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +501 -8
  49. package/esm2022/lib/aigc/voice/index.mjs +3 -10
  50. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +38 -10
  51. package/esm2022/lib/aigc/voice/lib/resample.mjs +34 -10
  52. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +233 -8
  53. package/esm2022/lib/aigc/voice/tts/index.mjs +2 -10
  54. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +190 -10
  55. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +33 -10
  56. package/esm2022/lib/map/index.mjs +4 -10
  57. package/esm2022/lib/map/map.module.mjs +61 -10
  58. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +110 -10
  59. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +98 -8
  60. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +100 -8
  61. package/esm2022/lib/nova-cloud/index.mjs +2 -10
  62. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +148 -10
  63. package/esm2022/lib/platform/cross.service.mjs +63 -10
  64. package/esm2022/lib/platform/index.mjs +2 -10
  65. package/esm2022/lib/social/index.mjs +2 -10
  66. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +236 -8
  67. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +59 -10
  68. package/esm2022/lib/storage/index.mjs +5 -10
  69. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +130 -8
  70. package/esm2022/lib/storage/service-upload/index.mjs +2 -10
  71. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +462 -8
  72. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +28 -10
  73. package/esm2022/lib/storage/storage.module.mjs +41 -10
  74. package/esm2022/lib/user/account/account.service.mjs +221 -10
  75. package/esm2022/lib/user/captcha/captcha.component.mjs +135 -10
  76. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +62 -10
  77. package/esm2022/lib/user/index.mjs +17 -10
  78. package/esm2022/lib/user/login/auth.guard.mjs +28 -10
  79. package/esm2022/lib/user/login/auth.service.mjs +373 -8
  80. package/esm2022/lib/user/login/login.component.mjs +913 -10
  81. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +273 -10
  82. package/esm2022/lib/user/profile/auth-profile.guard.mjs +27 -10
  83. package/esm2022/lib/user/profile/auth-profile.service.mjs +122 -10
  84. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +115 -10
  85. package/esm2022/lib/user/profile/profile.module.mjs +57 -10
  86. package/esm2022/lib/user/staff/index.mjs +4 -10
  87. package/esm2022/lib/user/staff/staff.guard.mjs +26 -10
  88. package/esm2022/lib/user/staff/staff.module.mjs +18 -10
  89. package/esm2022/lib/user/staff/staff.service.mjs +85 -10
  90. package/esm2022/lib/user/user-name.pipe.mjs +29 -10
  91. package/esm2022/lib/user/user.module.mjs +106 -10
  92. package/esm2022/lib/video/fm-video/fm-video.component.mjs +67 -10
  93. package/esm2022/lib/video/index.mjs +2 -10
  94. package/esm2022/public-api.mjs +13 -10
  95. package/fesm2022/fmode-ng.mjs +8895 -7
  96. package/fesm2022/fmode-ng.mjs.map +1 -1
  97. package/lib/user/login/auth.service.d.ts +18 -3
  98. package/lib/user/modal-user-login/modal-user-login.component.d.ts +4 -2
  99. package/package.json +1 -1
  100. package/LICENSE.md +0 -8
@@ -1,10 +1,315 @@
1
-
2
- /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs
7
- */
8
- import{CommonModule}from"@angular/common";import{Component,ElementRef}from"@angular/core";import{ViewChild}from"@angular/core";import{FormsModule}from"@angular/forms";import*as BABYLON from"@babylonjs/core";import"@babylonjs/loaders";import{RolePointsCloud}from"./role-points.class";import*as i0 from"@angular/core";export class CompAvatarParticleComponent{constructor(e){this.elementRef=e,this.isWebVR=!1,this.animMap={}}ngAfterViewInit(){if(this.canvas=this.renderCanvas.nativeElement,console.log(this.canvas),this.canvas){let e={};this.engine=new BABYLON.Engine(this.canvas,!0,e),console.log(this.engine),this.createScene(),this.engine.runRenderLoop((()=>{this.scene?.render(),this.engine?.resize()})),window.addEventListener("resize",(()=>{this.engine?.resize()}))}}async createScene(){this.scene=new BABYLON.Scene(this.engine),this.scene.clearColor=new BABYLON.Color4(0,0,0,1),this.mainCamera=this.createCamera(),console.log(this.mainCamera),this.currentRole=new RolePointsCloud(this.scene,this.engine,this.mainCamera),await this.currentRole.init(),this.currentRole.playAnim("idle"),this.currentRole.Mesh.visibility=0,await this.createCloudPoints();new BABYLON.HemisphericLight("light1",new BABYLON.Vector3(0,1,0),this.scene);this.engine?.resize()}createCamera(){let e=new(this.isWebVR?BABYLON.VRDeviceOrientationArcRotateCamera:BABYLON.ArcRotateCamera)("Camera",0,0,30,new BABYLON.Vector3(0,.5,0),this.scene);return e.setPosition(new BABYLON.Vector3(0,0,5)),e.beta=Math.PI/3,e.alpha=Math.PI/1.2,e.radius=15,e}async createCloudPoints(){this.pointsMesh=this.currentRole.Mesh,this.pointsCloud=new BABYLON.PointsCloudSystem("pcs",1,this.scene);let e=new BABYLON.Color3(.7,.8,1),t=new BABYLON.Color4(.7,.8,1),n=(new BABYLON.Color4(.2,.5,1),new BABYLON.Color4(0,0,.2,0),new BABYLON.Texture("/assets/avatar/particle/textures/flare.png",this.scene)),i=new BABYLON.PBRMaterial("material",this.scene);i.emissiveTexture=n,i.emissiveColor=e,this.pointsCloud.addVolumePoints(this.currentRole.Mesh,5e3,BABYLON.PointColor.Color,t),this.pointsCloud.buildMeshAsync().then((()=>{this.playAnimation("waiting")})),this.scene.registerAfterRender((()=>{this.pointsCloud.setParticles()})),this.engine.runRenderLoop((()=>{this.scene.render()}))}playAnimation(e){switch(e){case"waiting":this.cloudAnim();break;case"listening":this.cloudAnim({rotateSpeed:.01,breathing:!1});break;case"thinking":this.cloudAnim({rotateSpeed:.2,breathing:!1});break;case"talking":this.animMap.idle&&this.scene.beginDirectAnimation(this.pointsMesh,[this.animMap.talking],0,20,!0)}}cloudAnim(e={breathing:!0,rotateSpeed:.002}){this.animMap.idle&&this.scene.beginDirectAnimation(this.pointsMesh,[this.animMap.idle],0,120,!0);let t=new BABYLON.Color4(1,1,1,1),n=(new BABYLON.Texture("/assets/avatar/particle/textures/flare.png",this.scene),0);this.pointsCloud.updateParticle=i=>{let a=this.currentRole.Mesh.getBoundingInfo()?.boundingSphere?.radiusWorld,o=this.currentRole.Mesh.getBoundingInfo()?.boundingSphere?.centerWorld;i.idx;if(i.color=t,i.rotation.y+=e.rotateSpeed,i&&n<3&&(console.log(this.currentRole.Mesh.getBoundingInfo()),console.log(i),n++),i.initpos||(i.initpos=i.position),e.breathing){let e=i.initpos.subtract(o);i.position=new BABYLON.Vector3(e.x*a,e.y*a,e.z*a).add(this.currentRole.offsetPosition)}return i}}createSphere(){let e=BABYLON.MeshBuilder.CreateSphere("sphere",{diameter:2},this.scene);e.visibility=1,e.material=new BABYLON.StandardMaterial("mat",this.scene),e.material.wireframe=!0,e.scaling=new BABYLON.Vector3(1,1,1),this.pointsMesh=e;let t=new BABYLON.Animation("breathingAnimation","scaling",30,BABYLON.Animation.ANIMATIONTYPE_VECTOR3,BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE),n=[];n.push({frame:0,value:new BABYLON.Vector3(.3,.3,.3)}),n.push({frame:60,value:new BABYLON.Vector3(.5,.5,.5)}),n.push({frame:120,value:new BABYLON.Vector3(.3,.3,.3)}),t.setKeys(n),this.animMap.idle=t;let i=[{frame:0,value:BABYLON.Vector3.One()},{frame:10,value:new BABYLON.Vector3(1.2,.8,1.2)},{frame:20,value:BABYLON.Vector3.One()}],a=new BABYLON.Animation("talkAnimation","scaling",30,BABYLON.Animation.ANIMATIONTYPE_VECTOR3,BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);return a.setKeys(i),this.animMap.talk=a,this.scene.beginDirectAnimation(e,[this.animMap.idle],0,120,!0),e}async createParticle(){let e=this.createSphere(),t=new BABYLON.ParticleSystem("particles",2e3,this.scene);t.particleTexture=new BABYLON.Texture("/assets/avatar/particle/textures/flare.png",this.scene),t.emitter=e,t.minEmitBox=new BABYLON.Vector3(0,0,0),t.maxEmitBox=new BABYLON.Vector3(0,0,0),t.color1=new BABYLON.Color4(.7,.8,1,1),t.color2=new BABYLON.Color4(.2,.5,1,1),t.colorDead=new BABYLON.Color4(0,0,.2,0),t.minSize=.5,t.maxSize=.5,t.minLifeTime=.1,t.maxLifeTime=.1,t.minAngularSpeed=0,t.maxAngularSpeed=Math.PI,t.minInitialRotation=0,t.maxInitialRotation=Math.PI,t.minEmitPower=0,t.maxEmitPower=0,t.emitRate=1500,t.updateSpeed=.01,t.blendMode=BABYLON.ParticleSystem.BLENDMODE_ONEONE,t.direction1=new BABYLON.Vector3(0,0,0),t.direction2=new BABYLON.Vector3(0,0,0),t.start();let n=t.createSphereEmitter();n.radius=2,n.radiusRange=0,n.directionRandomizer=0,t.gravity=new BABYLON.Vector3(0,0,0),t.disposeOnStop=!0,t.updateFunction=n=>{for(let i=0;i<n.length;i++){let a=n[i],o=e.getBoundingInfo()?.boundingSphere?.radiusWorld;a.position=a.position.normalize().scale(o),a.age+=this.scene.getEngine().getDeltaTime()/1e3,a.age>=a.lifeTime&&(t.recycleParticle(a),i--)}},this.engine.runRenderLoop((()=>{this.scene.render(),t.worldOffset=e.position}))}setCameraToMeshCenter(e,t){t.computeWorldMatrix(!0);let n=t.getBoundingInfo(),i=n.minimum,a=n.maximum,o=a.x-i.x,r=a.y-i.y,s=a.z-i.z,l=n.boundingBox.center;console.log("宽度:"+o),console.log("高度:"+r),console.log("深度:"+s),console.log("中心点:"+l)}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CompAvatarParticleComponent,deps:[{token:i0.ElementRef}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:CompAvatarParticleComponent,isStandalone:!0,selector:"fm-avatar-role-particle",viewQueries:[{propertyName:"renderCanvas",first:!0,predicate:["renderCanvas"],descendants:!0}],ngImport:i0,template:'<canvas #renderCanvas class="render-canvas"></canvas>',styles:[".render-canvas{display:block;width:100%;height:100%;touch-action:none}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"ngmodule",type:FormsModule}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:CompAvatarParticleComponent,decorators:[{type:Component,args:[{selector:"fm-avatar-role-particle",standalone:!0,imports:[CommonModule,FormsModule],template:'<canvas #renderCanvas class="render-canvas"></canvas>',styles:[".render-canvas{display:block;width:100%;height:100%;touch-action:none}\n"]}]}],ctorParameters:()=>[{type:i0.ElementRef}],propDecorators:{renderCanvas:[{type:ViewChild,args:["renderCanvas"]}]}});
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2F2YXRhci9jb21wLWF2YXRhci1wYXJ0aWNsZS9jb21wLWF2YXRhci1wYXJ0aWNsZS5jb21wb25lbnQubWpz`
10
-
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, ElementRef } from '@angular/core';
3
+ import { ViewChild } from '@angular/core';
4
+ import { FormsModule } from '@angular/forms';
5
+ /**
6
+ * npm i -S @babylonjs/core
7
+ * npm i -S @babylonjs/loaders
8
+ */
9
+ import * as BABYLON from '@babylonjs/core';
10
+ // import { CloudPoint } from '@babylonjs/core';
11
+ import '@babylonjs/loaders';
12
+ import { RolePointsCloud } from './role-points.class';
13
+ import * as i0 from "@angular/core";
14
+ export class CompAvatarParticleComponent {
15
+ constructor(elementRef) {
16
+ this.elementRef = elementRef;
17
+ this.isWebVR = false;
18
+ this.animMap = {};
19
+ }
20
+ ngAfterViewInit() {
21
+ this.canvas = this.renderCanvas.nativeElement;
22
+ console.log(this.canvas);
23
+ if (this.canvas) {
24
+ let options = {};
25
+ this.engine = new BABYLON.Engine(this.canvas, true, options);
26
+ console.log(this.engine);
27
+ // 创建场景
28
+ this.createScene();
29
+ this.engine.runRenderLoop(() => {
30
+ this.scene?.render();
31
+ this.engine?.resize();
32
+ });
33
+ window.addEventListener('resize', () => {
34
+ this.engine?.resize();
35
+ });
36
+ }
37
+ }
38
+ async createScene() {
39
+ // 创建场景
40
+ this.scene = new BABYLON.Scene(this.engine);
41
+ this.scene.clearColor = new BABYLON.Color4(0, 0, 0, 1);
42
+ // 创建舞台中央旋转相机
43
+ this.mainCamera = this.createCamera();
44
+ console.log(this.mainCamera);
45
+ // 加载预设的角色
46
+ this.currentRole = new RolePointsCloud(this.scene, this.engine, this.mainCamera);
47
+ await this.currentRole.init();
48
+ this.currentRole.playAnim("idle"); // 默认播放闲置画面
49
+ this.currentRole.Mesh.visibility = 0; // 开启点云,原Mesh设置隐藏
50
+ // 创建需要展示的主要资源
51
+ // let prefab = this.prefabList[0]
52
+ // await this.createPrefab(prefab)
53
+ // 创建粒子效果
54
+ // await this.createParticle()
55
+ // 创建点云粒子
56
+ await this.createCloudPoints();
57
+ let light = new BABYLON.HemisphericLight('light1', new BABYLON.Vector3(0, 1, 0), this.scene);
58
+ // let ground = BABYLON.MeshBuilder.CreateGround('ground1', {height:10, width:10, subdivisions: 2}, this.scene);
59
+ // let groudMaterial = new BABYLON.StandardMaterial("groudMaterial", this.scene);
60
+ // groudMaterial.diffuseColor = new BABYLON.Color3(0.5, 0.5, 0.5); // 设置灰色
61
+ // ground.material = groudMaterial;
62
+ // 修正比例
63
+ this.engine?.resize();
64
+ }
65
+ createCamera() {
66
+ // Parameters: alpha, beta, radius, target position, scene
67
+ let CameraType = this.isWebVR ? BABYLON.VRDeviceOrientationArcRotateCamera : BABYLON.ArcRotateCamera;
68
+ let camera = new CameraType("Camera", 0, 0, 30, new BABYLON.Vector3(0, 0.5, 0), this.scene);
69
+ // Positions the camera overwriting alpha, beta, radius
70
+ camera.setPosition(new BABYLON.Vector3(0, 0, 5));
71
+ // 设置相机的俯仰角度为45°
72
+ camera.beta = Math.PI / 3;
73
+ camera.alpha = Math.PI / 1.2;
74
+ camera.radius = 15;
75
+ // This attaches the camera to the canvas
76
+ // camera.attachControl(this.canvas, true); // 关闭控制,由程序锁定镜头
77
+ return camera;
78
+ }
79
+ async createCloudPoints() {
80
+ this.pointsMesh = this.currentRole.Mesh;
81
+ this.pointsCloud = new BABYLON.PointsCloudSystem("pcs", 1, this.scene);
82
+ // pcs.addPoints(10000);
83
+ let color1 = new BABYLON.Color3(0.7, 0.8, 1.0);
84
+ let color4 = new BABYLON.Color4(0.7, 0.8, 1.0);
85
+ let color2 = new BABYLON.Color4(0.2, 0.5, 1.0);
86
+ let colorDead = new BABYLON.Color4(0, 0, 0.2, 0.0);
87
+ let pTexture = new BABYLON.Texture("/assets/avatar/particle/textures/flare.png", this.scene);
88
+ let pMaterial = new BABYLON.PBRMaterial("material", this.scene);
89
+ pMaterial.emissiveTexture = pTexture;
90
+ pMaterial.emissiveColor = color1;
91
+ this.pointsCloud.addVolumePoints(this.currentRole.Mesh, 5000, BABYLON.PointColor.Color, color4);
92
+ this.pointsCloud.buildMeshAsync().then(() => {
93
+ // this.pointsCloud.mesh.material = pMaterial;
94
+ this.playAnimation("waiting");
95
+ });
96
+ this.scene.registerAfterRender(() => {
97
+ this.pointsCloud.setParticles();
98
+ });
99
+ this.engine.runRenderLoop(() => {
100
+ this.scene.render();
101
+ });
102
+ }
103
+ playAnimation(name) {
104
+ // 材质颜色
105
+ switch (name) {
106
+ case "waiting":
107
+ this.cloudAnim();
108
+ break;
109
+ case "listening":
110
+ this.cloudAnim({
111
+ rotateSpeed: 0.01,
112
+ breathing: false,
113
+ });
114
+ break;
115
+ case "thinking":
116
+ this.cloudAnim({
117
+ rotateSpeed: 0.2,
118
+ breathing: false,
119
+ });
120
+ break;
121
+ case "talking":
122
+ // this.pointsCloud.particles
123
+ this.animMap['idle'] && this.scene.beginDirectAnimation(this.pointsMesh, [this.animMap['talking']], 0, 20, true);
124
+ default:
125
+ break;
126
+ }
127
+ }
128
+ cloudAnim(options = {
129
+ breathing: true,
130
+ rotateSpeed: 0.002
131
+ }) {
132
+ this.animMap['idle'] && this.scene.beginDirectAnimation(this.pointsMesh, [this.animMap['idle']], 0, 120, true);
133
+ let colorWhite = new BABYLON.Color4(1.0, 1.0, 1.0, 1.0);
134
+ let pTexture = new BABYLON.Texture("/assets/avatar/particle/textures/flare.png", this.scene);
135
+ let islog = 0;
136
+ this.pointsCloud.updateParticle = (particle) => {
137
+ // 空间位置
138
+ let sphereRadius = this.currentRole.Mesh.getBoundingInfo()?.boundingSphere?.radiusWorld;
139
+ let centerWorld = this.currentRole.Mesh.getBoundingInfo()?.boundingSphere?.centerWorld;
140
+ let index = particle.idx;
141
+ particle.color = colorWhite;
142
+ // 旋转
143
+ particle.rotation.y += options.rotateSpeed;
144
+ // 位置
145
+ if (particle && islog < 3) {
146
+ console.log(this.currentRole.Mesh.getBoundingInfo());
147
+ console.log(particle);
148
+ islog++;
149
+ }
150
+ if (!particle.initpos)
151
+ particle.initpos = particle.position;
152
+ if (options.breathing) {
153
+ let initpos = particle.initpos;
154
+ let relativeVector = initpos.subtract(centerWorld);
155
+ particle.position = new BABYLON.Vector3(relativeVector.x * sphereRadius, relativeVector.y * sphereRadius, relativeVector.z * sphereRadius).add(this.currentRole.offsetPosition);
156
+ }
157
+ return particle;
158
+ };
159
+ }
160
+ createSphere() {
161
+ let sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2 }, this.scene);
162
+ sphere.visibility = 1; // 不可见,仅用于粒子覆盖占位
163
+ // 材质
164
+ sphere.material = new BABYLON.StandardMaterial("mat", this.scene);
165
+ sphere.material.wireframe = true;
166
+ // 设置初始缩放
167
+ sphere.scaling = new BABYLON.Vector3(1, 1, 1);
168
+ this.pointsMesh = sphere;
169
+ /**
170
+ * 呼吸动画
171
+ */
172
+ // 创建动画
173
+ let animation = new BABYLON.Animation("breathingAnimation", "scaling", 30, BABYLON.Animation.ANIMATIONTYPE_VECTOR3, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);
174
+ // 定义动画关键帧
175
+ let keys = [];
176
+ keys.push({
177
+ frame: 0,
178
+ value: new BABYLON.Vector3(0.3, 0.3, 0.3) // 初始缩放
179
+ });
180
+ keys.push({
181
+ frame: 60,
182
+ value: new BABYLON.Vector3(0.5, 0.5, 0.5) // 最大缩放
183
+ });
184
+ keys.push({
185
+ frame: 120,
186
+ value: new BABYLON.Vector3(0.3, 0.3, 0.3) // 初始缩放
187
+ });
188
+ // 将关键帧添加到动画
189
+ animation.setKeys(keys);
190
+ this.animMap["idle"] = animation;
191
+ /**
192
+ * 讲话动画
193
+ */
194
+ // 定义动画帧
195
+ let animationFramesTalk = [
196
+ { frame: 0, value: BABYLON.Vector3.One() },
197
+ { frame: 10, value: new BABYLON.Vector3(1.2, 0.8, 1.2) },
198
+ { frame: 20, value: BABYLON.Vector3.One() },
199
+ ];
200
+ // 创建动画
201
+ let animationTalk = new BABYLON.Animation("talkAnimation", "scaling", 30, BABYLON.Animation.ANIMATIONTYPE_VECTOR3, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);
202
+ // 设置动画帧
203
+ animationTalk.setKeys(animationFramesTalk);
204
+ this.animMap["talk"] = animationTalk;
205
+ // 启动动画
206
+ this.scene.beginDirectAnimation(sphere, [this.animMap['idle']], 0, 120, true);
207
+ return sphere;
208
+ }
209
+ async createParticle() {
210
+ // 创建球体
211
+ let sphere = this.createSphere();
212
+ // 创建粒子系统
213
+ let particleSystem = new BABYLON.ParticleSystem("particles", 2000, this.scene);
214
+ particleSystem.particleTexture = new BABYLON.Texture("/assets/avatar/particle/textures/flare.png", this.scene);
215
+ particleSystem.emitter = sphere;
216
+ particleSystem.minEmitBox = new BABYLON.Vector3(0, 0, 0); // Starting all from
217
+ particleSystem.maxEmitBox = new BABYLON.Vector3(0, 0, 0); // To...
218
+ // Colors of all particles
219
+ particleSystem.color1 = new BABYLON.Color4(0.7, 0.8, 1.0, 1.0);
220
+ particleSystem.color2 = new BABYLON.Color4(0.2, 0.5, 1.0, 1.0);
221
+ particleSystem.colorDead = new BABYLON.Color4(0, 0, 0.2, 0.0);
222
+ // Size of each particle (random between...
223
+ particleSystem.minSize = 0.5;
224
+ particleSystem.maxSize = 0.5;
225
+ // Life time of each particle (random between...
226
+ particleSystem.minLifeTime = 0.1;
227
+ particleSystem.maxLifeTime = 0.1;
228
+ // 角度速度
229
+ particleSystem.minAngularSpeed = 0;
230
+ particleSystem.maxAngularSpeed = Math.PI;
231
+ particleSystem.minInitialRotation = 0;
232
+ particleSystem.maxInitialRotation = Math.PI;
233
+ // Emission rate// 设置粒子的初始速度
234
+ // 禁用速度属性
235
+ // particleSystem.manualEmitCount = particleSystem.getCapacity(); // 禁用自动发射
236
+ particleSystem.minEmitPower = 0; // 最小发射速度
237
+ particleSystem.maxEmitPower = 0; // 最大发射速度
238
+ particleSystem.emitRate = 1500;
239
+ // Speed
240
+ particleSystem.updateSpeed = 0.01;
241
+ // Blend mode : BLENDMODE_ONEONE, or BLENDMODE_STANDARD
242
+ particleSystem.blendMode = BABYLON.ParticleSystem.BLENDMODE_ONEONE;
243
+ particleSystem.direction1 = new BABYLON.Vector3(0, 0, 0);
244
+ particleSystem.direction2 = new BABYLON.Vector3(0, 0, 0);
245
+ particleSystem.start();
246
+ // 设置粒子发射器为球形发射器
247
+ let sphereEmitter = particleSystem.createSphereEmitter();
248
+ sphereEmitter.radius = 2; // 球体半径
249
+ // sphereEmitter.startPositionFunction = (worldMatrix: BABYLON.Matrix, positionToUpdate: BABYLON.Vector3, particle: BABYLON.Particle, isLocal: boolean)=>{
250
+ // let sphereRadius = sphere.getBoundingInfo()?.boundingSphere?.radiusWorld
251
+ // particle.position = particle.position.normalize().scale(sphereRadius);
252
+ // }
253
+ sphereEmitter.radiusRange = 0; // 开始发射半径范围 0 只在表面
254
+ sphereEmitter.directionRandomizer = 0; // 开始发射方向随机性
255
+ // 设置粒子效果
256
+ particleSystem.gravity = new BABYLON.Vector3(0, 0, 0); // 关闭重力
257
+ // 设置粒子系统停止后立即销毁粒子
258
+ particleSystem.disposeOnStop = true;
259
+ // 修改粒子更新函数,将粒子限制在球体表面
260
+ particleSystem.updateFunction = (particles) => {
261
+ for (let index = 0; index < particles.length; index++) {
262
+ let particle = particles[index];
263
+ // // 将粒子位置限制在球体表面
264
+ let sphereRadius = sphere.getBoundingInfo()?.boundingSphere?.radiusWorld;
265
+ particle.position = particle.position.normalize().scale(sphereRadius);
266
+ // particle.scale = new BABYLON.Vector2(0.2,0.2)
267
+ particle.age += this.scene.getEngine().getDeltaTime() / 1000;
268
+ // 检查粒子是否达到最大生命周期,如果是则使其消失
269
+ if (particle.age >= particle.lifeTime) {
270
+ particleSystem.recycleParticle(particle);
271
+ index--; // 更新索引以避免跳过下一个粒子
272
+ }
273
+ // // 在一定时间后使粒子消失
274
+ // if (particle.age > 0.19) {
275
+ // particle.lifeTime = 0
276
+ // }
277
+ }
278
+ };
279
+ // 动画循环
280
+ this.engine.runRenderLoop(() => {
281
+ this.scene.render();
282
+ // 更新粒子的位置和缩放
283
+ particleSystem.worldOffset = sphere.position;
284
+ // particle.position = particle.position.normalize().scale(sphereEmitter.radius);
285
+ });
286
+ }
287
+ setCameraToMeshCenter(camera, mesh) {
288
+ // 获取网格体的边界信息
289
+ mesh.computeWorldMatrix(true);
290
+ let boundingInfo = mesh.getBoundingInfo();
291
+ // 获取边界框的最小点和最大点
292
+ let minimum = boundingInfo.minimum;
293
+ let maximum = boundingInfo.maximum;
294
+ // 计算网格体的长宽高
295
+ let width = maximum.x - minimum.x;
296
+ let height = maximum.y - minimum.y;
297
+ let depth = maximum.z - minimum.z;
298
+ let center = boundingInfo.boundingBox.center;
299
+ console.log("宽度:" + width);
300
+ console.log("高度:" + height);
301
+ console.log("深度:" + depth);
302
+ console.log("中心点:" + center);
303
+ // camera?.setPosition(center)
304
+ }
305
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CompAvatarParticleComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
306
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: CompAvatarParticleComponent, isStandalone: true, selector: "fm-avatar-role-particle", viewQueries: [{ propertyName: "renderCanvas", first: true, predicate: ["renderCanvas"], descendants: true }], ngImport: i0, template: "<canvas #renderCanvas class=\"render-canvas\"></canvas>", styles: [".render-canvas{display:block;width:100%;height:100%;touch-action:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }] }); }
307
+ }
308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CompAvatarParticleComponent, decorators: [{
309
+ type: Component,
310
+ args: [{ selector: 'fm-avatar-role-particle', standalone: true, imports: [CommonModule, FormsModule], template: "<canvas #renderCanvas class=\"render-canvas\"></canvas>", styles: [".render-canvas{display:block;width:100%;height:100%;touch-action:none}\n"] }]
311
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { renderCanvas: [{
312
+ type: ViewChild,
313
+ args: ["renderCanvas"]
314
+ }] } });
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcC1hdmF0YXItcGFydGljbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9haWdjL2F2YXRhci9jb21wLWF2YXRhci1wYXJ0aWNsZS9jb21wLWF2YXRhci1wYXJ0aWNsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvYXZhdGFyL2NvbXAtYXZhdGFyLXBhcnRpY2xlL2NvbXAtYXZhdGFyLXBhcnRpY2xlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFpQixVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0M7OztHQUdHO0FBQ0gsT0FBTyxLQUFLLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxnREFBZ0Q7QUFDaEQsT0FBTyxvQkFBb0IsQ0FBQztBQUU1QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7O0FBU3RELE1BQU0sT0FBTywyQkFBMkI7SUFRdEMsWUFBb0IsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXVEMUMsWUFBTyxHQUFXLEtBQUssQ0FBQTtRQW1JdkIsWUFBTyxHQUVILEVBQUUsQ0FBQTtJQTNMTixDQUFDO0lBQ0YsZUFBZTtRQUNaLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFD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LENBQUMsQ0FBQztRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQztRQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQztRQUU3Qiw4QkFBOEI7SUFDaEMsQ0FBQzsrR0F2WFUsMkJBQTJCO21HQUEzQiwyQkFBMkIsaU1DckJ4Qyx5REFBcUQsaUlEaUIxQyxZQUFZLDhCQUFDLFdBQVc7OzRGQUl0QiwyQkFBMkI7a0JBUHZDLFNBQVM7K0JBQ0UseUJBQXlCLGNBQ3hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBQyxXQUFXLENBQUM7K0VBS1IsWUFBWTtzQkFBdEMsU0FBUzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8qKlxuICogbnBtIGkgLVMgQGJhYnlsb25qcy9jb3JlXG4gKiBucG0gaSAtUyBAYmFieWxvbmpzL2xvYWRlcnNcbiAqL1xuaW1wb3J0ICogYXMgQkFCWUxPTiBmcm9tICdAYmFieWxvbmpzL2NvcmUnO1xuLy8gaW1wb3J0IHsgQ2xvdWRQb2ludCB9IGZyb20gJ0BiYWJ5bG9uanMvY29yZSc7XG5pbXBvcnQgJ0BiYWJ5bG9uanMvbG9hZGVycyc7XG5pbXBvcnQgeyBBdmF0YXJSb2xlIH0gZnJvbSAnLi9hdmF0YXIucm9sZSc7XG5pbXBvcnQgeyBSb2xlUG9pbnRzQ2xvdWQgfSBmcm9tICcuL3JvbGUtcG9pbnRzLmNsYXNzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZm0tYXZhdGFyLXJvbGUtcGFydGljbGUnLFxuICBzdGFuZGFsb25lOnRydWUsXG4gIGltcG9ydHM6W0NvbW1vbk1vZHVsZSxGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wLWF2YXRhci1wYXJ0aWNsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXAtYXZhdGFyLXBhcnRpY2xlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29tcEF2YXRhclBhcnRpY2xlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gQFZpZXdDaGlsZChcInJlbmRlckNhbnZhc1wiKSByZW5kZXJDYW52YXM6RWxlbWVudFJlZlxuICBcbiAgLy8g55S75biDXG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudHx1bmRlZmluZWQ7XG4gIHByaXZhdGUgZW5naW5lOiBCQUJZTE9OLkVuZ2luZXx1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2NlbmU6IEJBQllMT04uU2NlbmV8dW5kZWZpbmVkO1xuICBtYWluQ2FtZXJhOkJBQllMT04uQXJjUm90YXRlQ2FtZXJhfEJBQllMT04uVlJEZXZpY2VPcmllbnRhdGlvbkFyY1JvdGF0ZUNhbWVyYXx1bmRlZmluZWQ7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICB9XG4gbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2FudmFzID0gdGhpcy5yZW5kZXJDYW52YXMubmF0aXZlRWxlbWVudDtcbiAgICBjb25zb2xlLmxvZyh0aGlzLmNhbnZhcylcbiAgICBpZih0aGlzLmNhbnZhcyl7XG4gICAgICAgIGxldCBvcHRpb25zOkJBQllMT04uRW5naW5lT3B0aW9ucyA9IHtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuZ2luZSA9IG5ldyBCQUJZTE9OLkVuZ2luZSgodGhpcy5jYW52YXMgYXMgYW55KSwgdHJ1ZSxvcHRpb25zKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5lbmdpbmUpXG4gICAgICAgIC8vIOWIm+W7uuWcuuaZr1xuICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgIHRoaXMuZW5naW5lLnJ1blJlbmRlckxvb3AoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2NlbmU/LnJlbmRlcigpO1xuICAgICAgICAgIHRoaXMuZW5naW5lPy5yZXNpemUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbmdpbmU/LnJlc2l6ZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cbiAgY3VycmVudFJvbGU6QXZhdGFyUm9sZVxuICBhc3luYyBjcmVhdGVTY2VuZSgpIHtcbiAgICAvLyDliJvlu7rlnLrmma9cbiAgICB0aGlzLnNjZW5lID0gbmV3IEJBQllMT04uU2NlbmUoKHRoaXMuZW5naW5lIGFzIGFueSkpO1xuICAgIHRoaXMuc2NlbmUuY2xlYXJDb2xvciA9IG5ldyBCQUJZTE9OLkNvbG9yNCgwLDAsMCwxKVxuICAgIC8vIOWIm+W7uuiInuWPsOS4reWkruaXi+i9rOebuOaculxuICAgIHRoaXMubWFpbkNhbWVyYSA9IHRoaXMuY3JlYXRlQ2FtZXJhKCk7XG4gICAgY29uc29sZS5sb2codGhpcy5tYWluQ2FtZXJhKVxuICAgIC8vIOWKoOi9vemihOiuvueahOinkuiJslxuICAgIHRoaXMuY3VycmVudFJvbGUgPSBuZXcgUm9sZVBvaW50c0Nsb3VkKHRoaXMuc2NlbmUsdGhpcy5lbmdpbmUsdGhpcy5tYWluQ2FtZXJhKVxuICAgIGF3YWl0IHRoaXMuY3VycmVudFJvbGUuaW5pdCgpXG4gICAgdGhpcy5jdXJyZW50Um9sZS5wbGF5QW5pbShcImlkbGVcIikgLy8g6buY6K6k5pKt5pS+6Zey572u55S76Z2iXG4gICAgdGhpcy5jdXJyZW50Um9sZS5NZXNoLnZpc2liaWxpdHkgPSAwOyAvLyDlvIDlkK/ngrnkupHvvIzljp9NZXNo6K6+572u6ZqQ6JePXG5cbiAgICAvLyDliJvlu7rpnIDopoHlsZXnpLrnmoTkuLvopoHotYTmupBcbiAgICAvLyBsZXQgcHJlZmFiID0gdGhpcy5wcmVmYWJMaXN0WzBdXG4gICAgLy8gYXdhaXQgdGhpcy5jcmVhdGVQcmVmYWIocHJlZmFiKVxuXG4gICAgLy8g5Yib5bu657KS5a2Q5pWI5p6cXG4gICAgLy8gYXdhaXQgdGhpcy5jcmVhdGVQYXJ0aWNsZSgpXG5cbiAgICAvLyDliJvlu7rngrnkupHnspLlrZBcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZUNsb3VkUG9pbnRzKClcblxuICAgIGxldCBsaWdodCA9IG5ldyBCQUJZTE9OLkhlbWlzcGhlcmljTGlnaHQoJ2xpZ2h0MScsIG5ldyBCQUJZTE9OLlZlY3RvcjMoMCwxLDApLCB0aGlzLnNjZW5lKTtcblxuICAgIC8vIGxldCBncm91bmQgPSBCQUJZTE9OLk1lc2hCdWlsZGVyLkNyZWF0ZUdyb3VuZCgnZ3JvdW5kMScsIHtoZWlnaHQ6MTAsIHdpZHRoOjEwLCBzdWJkaXZpc2lvbnM6IDJ9LCB0aGlzLnNjZW5lKTtcbiAgICAvLyBsZXQgZ3JvdWRNYXRlcmlhbCA9IG5ldyBCQUJZTE9OLlN0YW5kYXJkTWF0ZXJpYWwoXCJncm91ZE1hdGVyaWFsXCIsIHRoaXMuc2NlbmUpO1xuICAgIC8vIGdyb3VkTWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gbmV3IEJBQllMT04uQ29sb3IzKDAuNSwgMC41LCAwLjUpOyAvLyDorr7nva7ngbDoibJcbiAgICAvLyBncm91bmQubWF0ZXJpYWwgPSBncm91ZE1hdGVyaWFsO1xuICAgIC8vIOS/ruato+avlOS+i1xuICAgIHRoaXMuZW5naW5lPy5yZXNpemUoKTtcblxuICB9XG4gIGlzV2ViVlI6Ym9vbGVhbiA9IGZhbHNlXG4gIGNyZWF0ZUNhbWVyYSgpe1xuICAgIC8vIFBhcmFtZXRlcnM6IGFscGhhLCBiZXRhLCByYWRpdXMsIHRhcmdldCBwb3NpdGlvbiwgc2NlbmVcbiAgICBsZXQgQ2FtZXJhVHlwZSA9IHRoaXMuaXNXZWJWUj9CQUJZTE9OLlZSRGV2aWNlT3JpZW50YXRpb25BcmNSb3RhdGVDYW1lcmE6QkFCWUxPTi5BcmNSb3RhdGVDYW1lcmFcbiAgICBsZXQgY2FtZXJhID0gbmV3IENhbWVyYVR5cGUoXCJDYW1lcmFcIiwgMCwgMCwgMzAsIG5ldyBCQUJZTE9OLlZlY3RvcjMoMCwgMC41LCAwKSwgdGhpcy5zY2VuZSk7XG4gICAgLy8gUG9zaXRpb25zIHRoZSBjYW1lcmEgb3ZlcndyaXRpbmcgYWxwaGEsIGJldGEsIHJhZGl1c1xuICAgIGNhbWVyYS5zZXRQb3NpdGlvbihuZXcgQkFCWUxPTi5WZWN0b3IzKDAsIDAsIDUpKTtcbiAgICAvLyDorr7nva7nm7jmnLrnmoTkv6/ku7Dop5LluqbkuLo0NcKwXG4gICAgY2FtZXJhLmJldGEgPSBNYXRoLlBJIC8gMztcbiAgICBjYW1lcmEuYWxwaGEgPSBNYXRoLlBJIC8gMS4yO1xuICAgIGNhbWVyYS5yYWRpdXMgPSAxNTtcbiAgICAvLyBUaGlzIGF0dGFjaGVzIHRoZSBjYW1lcmEgdG8gdGhlIGNhbnZhc1xuICAgIC8vIGNhbWVyYS5hdHRhY2hDb250cm9sKHRoaXMuY2FudmFzLCB0cnVlKTsgLy8g5YWz6Zet5o6n5Yi277yM55Sx56iL5bqP6ZSB5a6a6ZWc5aS0XG4gICAgcmV0dXJuIGNhbWVyYVxuICB9XG5cbiAgbWFpbk1lc2g6QkFCWUxPTi5BYnN0cmFjdE1lc2h8dW5kZWZpbmVkXG4gIC8vIHByZWZhYkxpc3QgPSBbXG4gIC8vICAge25hbWU6XCLok53oibLlj6/niLHlsI/mnLrlmajkurpcIixkaXI6Jy9hc3NldHMvYXZhdGFyL3ByZWZhYi9ibHVlcm9ib3QvJyxmaWxlOlwic2NlbmUuZ2x0ZlwiLGNhbWVyYVBvc2l0b246W01hdGguUEkgLyAxLjIsIE1hdGguUEkgLyAzLDVdfSxcbiAgLy8gICB7bmFtZTpcIue0q+iJsuWwj+eyvueBtVwiLGRpcjonL2Fzc2V0cy9hdmF0YXIvcHJlZmFiL2Z1cmJ5X3B1cnBsZS8nLGZpbGU6XCJzY2VuZS5nbHRmXCIsY2FtZXJhUG9zaXRvbjpbMCwgMCwxMF19XG4gIC8vIF1cbiAgLy8gYXN5bmMgY3JlYXRlUHJlZmFiKHByZWZhYjphbnkpe1xuICAvLyAgICAgLy8g5Yqg6L295qih5Z6LXG4gIC8vICAgICBjb25zdCBtb2RlbCA9IGF3YWl0IEJBQllMT04uU2NlbmVMb2FkZXIuSW1wb3J0TWVzaEFzeW5jKG51bGwsIHByZWZhYi5kaXIsIHByZWZhYi5maWxlLCB0aGlzLnNjZW5lKTtcblxuICAvLyAgICAgLy8g6K6+572u5qih5Z6L5Yid5aeL5L2N572uXG4gIC8vICAgICB0aGlzLm1haW5NZXNoID0gbW9kZWwubWVzaGVzWzBdXG4gIC8vICAgICB0aGlzLm1haW5NZXNoLnBvc2l0aW9uID0gbmV3IEJBQllMT04uVmVjdG9yMygwLCAwLjEsIDApO1xuICAvLyAgICAgY29uc29sZS5sb2codGhpcy5tYWluTWVzaClcblxuICAvLyAgICAgLy8g6YeN6K6+55u45py65L2N572uXG4gIC8vICAgICAvLyDmlrnms5XkuIDvvJrliqDovb3kurrlt6XpooTorr7plZzlpLTkvY3nva5cbiAgLy8gICAgIHRoaXMubWFpbkNhbWVyYT8uc2V0UG9zaXRpb24obmV3IEJBQllMT04uVmVjdG9yMyhwcmVmYWIuY2FtZXJhUG9zaXRvblswXSxwcmVmYWIuY2FtZXJhUG9zaXRvblsxXSxwcmVmYWIuY2FtZXJhUG9zaXRvblsyXSkpXG4gIC8vICAgICAvLyDmlrnms5XkuozvvJrnlLHkuo5NZXNo5pys6Lqr55qE56m66Ze05L+h5oGv57y65aSx77yM5a+86Ie05peg5rOV5pm66IO96K+G5YirXG4gIC8vICAgICAvLyB0aGlzLnNldENhbWVyYVRvTWVzaENlbnRlcih0aGlzLm1haW5DYW1lcmEsdGhpcy5tYWluTWVzaClcbiAgLy8gICAgIHJldHVyblxuICAvLyB9XG5cbiAgcG9pbnRzQ2xvdWQ6QkFCWUxPTi5Qb2ludHNDbG91ZFN5c3RlbVxuICBwb2ludHNNZXNoOkJBQllMT04uTWVzaFxuICBhc3luYyBjcmVhdGVDbG91ZFBvaW50cygpe1xuICAgIHRoaXMucG9pbnRzTWVzaCA9IHRoaXMuY3VycmVudFJvbGUuTWVzaFxuICAgIHRoaXMucG9pbnRzQ2xvdWQgPSBuZXcgQkFCWUxPTi5Qb2ludHNDbG91ZFN5c3RlbShcInBjc1wiLCAxLCB0aGlzLnNjZW5lKSBcbiAgICAvLyBwY3MuYWRkUG9pbnRzKDEwMDAwKTtcbiAgICBcbiAgICBsZXQgY29sb3IxID0gbmV3IEJBQllMT04uQ29sb3IzKDAuNywgMC44LCAxLjApO1xuICAgIGxldCBjb2xvcjQgPSBuZXcgQkFCWUxPTi5Db2xvcjQoMC43LCAwLjgsIDEuMCk7XG4gICAgbGV0IGNvbG9yMiA9IG5ldyBCQUJZTE9OLkNvbG9yNCgwLjIsIDAuNSwgMS4wKTtcbiAgICBsZXQgY29sb3JEZWFkID0gbmV3IEJBQllMT04uQ29sb3I0KDAsIDAsIDAuMiwgMC4wKTtcbiAgICBsZXQgcFRleHR1cmUgPSBuZXcgQkFCWUxPTi5UZXh0dXJlKFwiL2Fzc2V0cy9hdmF0YXIvcGFydGljbGUvdGV4dHVyZXMvZmxhcmUucG5nXCIsIHRoaXMuc2NlbmUpO1xuICAgIGxldCBwTWF0ZXJpYWwgPSBuZXcgQkFCWUxPTi5QQlJNYXRlcmlhbChcIm1hdGVyaWFsXCIsIHRoaXMuc2NlbmUpO1xuICAgIHBNYXRlcmlhbC5lbWlzc2l2ZVRleHR1cmUgPSBwVGV4dHVyZVxuICAgIHBNYXRlcmlhbC5lbWlzc2l2ZUNvbG9yID0gY29sb3IxXG4gICAgXG4gICAgIHRoaXMucG9pbnRzQ2xvdWQuYWRkVm9sdW1lUG9pbnRzKHRoaXMuY3VycmVudFJvbGUuTWVzaCwgNTAwMCxCQUJZTE9OLlBvaW50Q29sb3IuQ29sb3IsY29sb3I0KTtcblxuICAgICB0aGlzLnBvaW50c0Nsb3VkLmJ1aWxkTWVzaEFzeW5jKCkudGhlbigoKT0+e1xuICAgICAgLy8gIHRoaXMucG9pbnRzQ2xvdWQubWVzaC5tYXRlcmlhbCA9IHBNYXRlcmlhbDtcbiAgICAgICB0aGlzLnBsYXlBbmltYXRpb24oXCJ3YWl0aW5nXCIpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnNjZW5lLnJlZ2lzdGVyQWZ0ZXJSZW5kZXIoKCkgPT4ge1xuICAgICAgIHRoaXMucG9pbnRzQ2xvdWQuc2V0UGFydGljbGVzKCk7XG4gICAgfSk7XG4gICAgdGhpcy5lbmdpbmUucnVuUmVuZGVyTG9vcCgoKSA9PiB7XG4gICAgICB0aGlzLnNjZW5lLnJlbmRlcigpO1xuICAgIH0pO1xuXG4gIH1cblxuICBwbGF5QW5pbWF0aW9uKG5hbWUpe1xuICAgIFxuICAgIC8vIOadkOi0qOminOiJslxuXG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICBjYXNlIFwid2FpdGluZ1wiOlxuICAgICAgICB0aGlzLmNsb3VkQW5pbSgpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImxpc3RlbmluZ1wiOlxuICAgICAgICB0aGlzLmNsb3VkQW5pbSh7XG4gICAgICAgICAgcm90YXRlU3BlZWQ6MC4wMSxcbiAgICAgICAgICBicmVhdGhpbmc6ZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInRoaW5raW5nXCI6XG4gICAgICAgIHRoaXMuY2xvdWRBbmltKHtcbiAgICAgICAgICByb3RhdGVTcGVlZDowLjIsXG4gICAgICAgICAgYnJlYXRoaW5nOmZhbHNlLFxuICAgICAgICB9KVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJ0YWxraW5nXCI6XG4gICAgICAgIC8vIHRoaXMucG9pbnRzQ2xvdWQucGFydGljbGVzXG4gICAgICAgIHRoaXMuYW5pbU1hcFsnaWRsZSddJiZ0aGlzLnNjZW5lLmJlZ2luRGlyZWN0QW5pbWF0aW9uKHRoaXMucG9pbnRzTWVzaCwgW3RoaXMuYW5pbU1hcFsndGFsa2luZyddXSwgMCwgMjAsIHRydWUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGNsb3VkQW5pbShvcHRpb25zPXtcbiAgICBicmVhdGhpbmc6dHJ1ZSxcbiAgICByb3RhdGVTcGVlZDowLjAwMlxuICB9KXtcbiAgICB0aGlzLmFuaW1NYXBbJ2lkbGUnXSYmdGhpcy5zY2VuZS5iZWdpbkRpcmVjdEFuaW1hdGlvbih0aGlzLnBvaW50c01lc2gsIFt0aGlzLmFuaW1NYXBbJ2lkbGUnXV0sIDAsIDEyMCwgdHJ1ZSk7XG4gICAgbGV0IGNvbG9yV2hpdGUgPSBuZXcgQkFCWUxPTi5Db2xvcjQoMS4wLCAxLjAsIDEuMCwxLjApO1xuICAgIGxldCBwVGV4dHVyZSA9IG5ldyBCQUJZTE9OLlRleHR1cmUoXCIvYXNzZXRzL2F2YXRhci9wYXJ0aWNsZS90ZXh0dXJlcy9mbGFyZS5wbmdcIiwgdGhpcy5zY2VuZSk7XG4gICAgbGV0IGlzbG9nID0gMFxuXG4gICAgdGhpcy5wb2ludHNDbG91ZC51cGRhdGVQYXJ0aWNsZSA9IChwYXJ0aWNsZTpCQUJZTE9OLkNsb3VkUG9pbnQpID0+e1xuICAgICAgLy8g56m66Ze05L2N572uXG4gICAgICBsZXQgc3BoZXJlUmFkaXVzID0gdGhpcy5jdXJyZW50Um9sZS5NZXNoLmdldEJvdW5kaW5nSW5mbygpPy5ib3VuZGluZ1NwaGVyZT8ucmFkaXVzV29ybGRcbiAgICAgIGxldCBjZW50ZXJXb3JsZCA9IHRoaXMuY3VycmVudFJvbGUuTWVzaC5nZXRCb3VuZGluZ0luZm8oKT8uYm91bmRpbmdTcGhlcmU/LmNlbnRlcldvcmxkXG5cbiAgICAgIGxldCBpbmRleCA9IHBhcnRpY2xlLmlkeDtcbiAgICAgIHBhcnRpY2xlLmNvbG9yID0gY29sb3JXaGl0ZTtcbiAgICAgIC8vIOaXi+i9rFxuICAgICAgcGFydGljbGUucm90YXRpb24ueSArPSBvcHRpb25zLnJvdGF0ZVNwZWVkOyBcbiAgICAgIC8vIOS9jee9rlxuICAgICAgaWYocGFydGljbGUmJmlzbG9nPDMpe1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLmN1cnJlbnRSb2xlLk1lc2guZ2V0Qm91bmRpbmdJbmZvKCkpXG4gICAgICAgIGNvbnNvbGUubG9nKHBhcnRpY2xlKVxuICAgICAgICBpc2xvZyArK1xuICAgICAgfVxuICAgICAgaWYoIShwYXJ0aWNsZSBhcyBhbnkpLmluaXRwb3MpIChwYXJ0aWNsZSBhcyBhbnkpLmluaXRwb3MgPSBwYXJ0aWNsZS5wb3NpdGlvblxuICAgICAgaWYob3B0aW9ucy5icmVhdGhpbmcpe1xuICAgICAgICBsZXQgaW5pdHBvcyA9IChwYXJ0aWNsZSBhcyBhbnkpLmluaXRwb3NcbiAgICAgICAgbGV0IHJlbGF0aXZlVmVjdG9yID0gaW5pdHBvcy5zdWJ0cmFjdChjZW50ZXJXb3JsZCk7XG4gICAgICAgIHBhcnRpY2xlLnBvc2l0aW9uID0gbmV3IEJBQllMT04uVmVjdG9yMyhyZWxhdGl2ZVZlY3Rvci54KnNwaGVyZVJhZGl1cyxyZWxhdGl2ZVZlY3Rvci55KnNwaGVyZVJhZGl1cyxyZWxhdGl2ZVZlY3Rvci56KnNwaGVyZVJhZGl1cykuYWRkKHRoaXMuY3VycmVudFJvbGUub2Zmc2V0UG9zaXRpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnRpY2xlXG4gIH07XG4gIH1cbiAgXG4gIGFuaW1NYXA6e1xuICAgIFtrZXk6c3RyaW5nXTpCQUJZTE9OLkFuaW1hdGlvblxuICB9ID0ge31cbiAgY3JlYXRlU3BoZXJlKCl7XG4gICAgbGV0IHNwaGVyZSA9IEJBQllMT04uTWVzaEJ1aWxkZXIuQ3JlYXRlU3BoZXJlKFwic3BoZXJlXCIsIHsgZGlhbWV0ZXI6IDIgfSwgdGhpcy5zY2VuZSk7XG4gICAgc3BoZXJlLnZpc2liaWxpdHkgPSAxIC8vIOS4jeWPr+inge+8jOS7heeUqOS6jueykuWtkOimhuebluWNoOS9jVxuICAgIC8vIOadkOi0qFxuICAgIHNwaGVyZS5tYXRlcmlhbCA9IG5ldyBCQUJZTE9OLlN0YW5kYXJkTWF0ZXJpYWwoXCJtYXRcIiwgdGhpcy5zY2VuZSk7XG4gICAgc3BoZXJlLm1hdGVyaWFsLndpcmVmcmFtZSA9IHRydWU7XG4gICAgLy8g6K6+572u5Yid5aeL57yp5pS+XG4gICAgc3BoZXJlLnNjYWxpbmcgPSBuZXcgQkFCWUxPTi5WZWN0b3IzKDEsIDEsIDEpO1xuICAgIHRoaXMucG9pbnRzTWVzaCA9IHNwaGVyZTtcbiAgICAvKipcbiAgICAgKiDlkbzlkLjliqjnlLtcbiAgICAgKi9cbiAgICAvLyDliJvlu7rliqjnlLtcbiAgICBsZXQgYW5pbWF0aW9uID0gbmV3IEJBQllMT04uQW5pbWF0aW9uKFxuICAgICAgICBcImJyZWF0aGluZ0FuaW1hdGlvblwiLFxuICAgICAgICBcInNjYWxpbmdcIixcbiAgICAgICAgMzAsXG4gICAgICAgIEJBQllMT04uQW5pbWF0aW9uLkFOSU1BVElPTlRZUEVfVkVDVE9SMyxcbiAgICAgICAgQkFCWUxPTi5BbmltYXRpb24uQU5JTUFUSU9OTE9PUE1PREVfQ1lDTEVcbiAgICApO1xuXG4gICAgLy8g5a6a5LmJ5Yqo55S75YWz6ZSu5binXG4gICAgbGV0IGtleXMgPSBbXTtcbiAgICBrZXlzLnB1c2goe1xuICAgICAgICBmcmFtZTogMCxcbiAgICAgICAgdmFsdWU6IG5ldyBCQUJZTE9OLlZlY3RvcjMoMC4zLDAuMywwLjMpIC8vIOWIneWni+e8qeaUvlxuICAgIH0pO1xuICAgIGtleXMucHVzaCh7XG4gICAgICAgIGZyYW1lOiA2MCxcbiAgICAgICAgdmFsdWU6IG5ldyBCQUJZTE9OLlZlY3RvcjMoMC41LDAuNSwwLjUpIC8vIOacgOWkp+e8qeaUvlxuICAgIH0pO1xuICAgIGtleXMucHVzaCh7XG4gICAgICAgIGZyYW1lOiAxMjAsXG4gICAgICAgIHZhbHVlOiBuZXcgQkFCWUxPTi5WZWN0b3IzKDAuMywwLjMsMC4zKSAvLyDliJ3lp4vnvKnmlL5cbiAgICB9KTtcblxuICAgIC8vIOWwhuWFs+mUruW4p+a3u+WKoOWIsOWKqOeUu1xuICAgIGFuaW1hdGlvbi5zZXRLZXlzKGtleXMpO1xuICAgIHRoaXMuYW5pbU1hcFtcImlkbGVcIl09YW5pbWF0aW9uO1xuXG5cbiAgICAvKipcbiAgICAgKiDorrLor53liqjnlLtcbiAgICAgKi9cblxuICAvLyDlrprkuYnliqjnlLvluKdcbiAgbGV0IGFuaW1hdGlvbkZyYW1lc1RhbGsgPSBbXG4gICAgeyBmcmFtZTogMCwgdmFsdWU6IEJBQllMT04uVmVjdG9yMy5PbmUoKSB9LFxuICAgIHsgZnJhbWU6IDEwLCB2YWx1ZTogbmV3IEJBQllMT04uVmVjdG9yMygxLjIsIDAuOCwgMS4yKSB9LFxuICAgIHsgZnJhbWU6IDIwLCB2YWx1ZTogQkFCWUxPTi5WZWN0b3IzLk9uZSgpIH0sXG4gIF07XG5cbiAgLy8g5Yib5bu65Yqo55S7XG4gIGxldCBhbmltYXRpb25UYWxrID0gbmV3IEJBQllMT04uQW5pbWF0aW9uKFxuICAgIFwidGFsa0FuaW1hdGlvblwiLFxuICAgIFwic2NhbGluZ1wiLFxuICAgIDMwLFxuICAgIEJBQllMT04uQW5pbWF0aW9uLkFOSU1BVElPTlRZUEVfVkVDVE9SMyxcbiAgICBCQUJZTE9OLkFuaW1hdGlvbi5BTklNQVRJT05MT09QTU9ERV9DWUNMRVxuICApO1xuXG4gIC8vIOiuvue9ruWKqOeUu+W4p1xuICBhbmltYXRpb25UYWxrLnNldEtleXMoYW5pbWF0aW9uRnJhbWVzVGFsayk7XG4gIHRoaXMuYW5pbU1hcFtcInRhbGtcIl09YW5pbWF0aW9uVGFsaztcblxuXG4gICAgLy8g5ZCv5Yqo5Yqo55S7XG4gICAgdGhpcy5zY2VuZS5iZWdpbkRpcmVjdEFuaW1hdGlvbihzcGhlcmUsIFt0aGlzLmFuaW1NYXBbJ2lkbGUnXV0sIDAsIDEyMCwgdHJ1ZSk7XG5cbiAgICByZXR1cm4gc3BoZXJlXG4gIH1cblxuXG5cbiAgYXN5bmMgY3JlYXRlUGFydGljbGUoKXtcbiAgICAgICAgLy8g5Yib5bu655CD5L2TXG4gICAgICAgICAgbGV0IHNwaGVyZSA9IHRoaXMuY3JlYXRlU3BoZXJlKClcblxuICAgICAgICAgIC8vIOWIm+W7uueykuWtkOezu+e7n1xuICAgICAgICAgIGxldCBwYXJ0aWNsZVN5c3RlbSA9IG5ldyBCQUJZTE9OLlBhcnRpY2xlU3lzdGVtKFwicGFydGljbGVzXCIsIDIwMDAsIHRoaXMuc2NlbmUpO1xuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLnBhcnRpY2xlVGV4dHVyZSA9IG5ldyBCQUJZTE9OLlRleHR1cmUoXCIvYXNzZXRzL2F2YXRhci9wYXJ0aWNsZS90ZXh0dXJlcy9mbGFyZS5wbmdcIiwgdGhpcy5zY2VuZSk7XG4gICAgICAgICAgcGFydGljbGVTeXN0ZW0uZW1pdHRlciA9IHNwaGVyZTtcbiAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5taW5FbWl0Qm94ID0gbmV3IEJBQllMT04uVmVjdG9yMygwLCAwLCAwKTsgLy8gU3RhcnRpbmcgYWxsIGZyb21cbiAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5tYXhFbWl0Qm94ID0gbmV3IEJBQllMT04uVmVjdG9yMygwLCAwLCAwKTsgLy8gVG8uLi5cbiAgICAgICAgICAvLyBDb2xvcnMgb2YgYWxsIHBhcnRpY2xlc1xuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmNvbG9yMSA9IG5ldyBCQUJZTE9OLkNvbG9yNCgwLjcsIDAuOCwgMS4wLCAxLjApO1xuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmNvbG9yMiA9IG5ldyBCQUJZTE9OLkNvbG9yNCgwLjIsIDAuNSwgMS4wLCAxLjApO1xuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmNvbG9yRGVhZCA9IG5ldyBCQUJZTE9OLkNvbG9yNCgwLCAwLCAwLjIsIDAuMCk7XG4gICAgICAgICAgLy8gU2l6ZSBvZiBlYWNoIHBhcnRpY2xlIChyYW5kb20gYmV0d2Vlbi4uLlxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLm1pblNpemUgPSAwLjU7XG4gICAgICAgICAgcGFydGljbGVTeXN0ZW0ubWF4U2l6ZSA9IDAuNTtcbiAgICAgICAgICAvLyBMaWZlIHRpbWUgb2YgZWFjaCBwYXJ0aWNsZSAocmFuZG9tIGJldHdlZW4uLi5cbiAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5taW5MaWZlVGltZSA9IDAuMTtcbiAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5tYXhMaWZlVGltZSA9IDAuMTtcbiAgICAgICAgICAvLyDop5LluqbpgJ/luqZcbiAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5taW5Bbmd1bGFyU3BlZWQgPSAwO1xuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLm1heEFuZ3VsYXJTcGVlZCA9IE1hdGguUEk7XG4gICAgICAgICAgcGFydGljbGVTeXN0ZW0ubWluSW5pdGlhbFJvdGF0aW9uID0gMDtcbiAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5tYXhJbml0aWFsUm90YXRpb24gPSBNYXRoLlBJO1xuICAgICAgICAgIC8vIEVtaXNzaW9uIHJhdGUvLyDorr7nva7nspLlrZDnmoTliJ3lp4vpgJ/luqZcbiAgICAgICAgIC8vIOemgeeUqOmAn+W6puWxnuaAp1xuICAgICAgICAgIC8vIHBhcnRpY2xlU3lzdGVtLm1hbnVhbEVtaXRDb3VudCA9IHBhcnRpY2xlU3lzdGVtLmdldENhcGFjaXR5KCk7IC8vIOemgeeUqOiHquWKqOWPkeWwhFxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLm1pbkVtaXRQb3dlciA9IDA7IC8vIOacgOWwj+WPkeWwhOmAn+W6plxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLm1heEVtaXRQb3dlciA9IDA7IC8vIOacgOWkp+WPkeWwhOmAn+W6plxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmVtaXRSYXRlID0gMTUwMDtcbiAgICAgICAgICAvLyBTcGVlZFxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLnVwZGF0ZVNwZWVkID0gMC4wMTtcbiAgICAgICAgICAvLyBCbGVuZCBtb2RlIDogQkxFTkRNT0RFX09ORU9ORSwgb3IgQkxFTkRNT0RFX1NUQU5EQVJEXG4gICAgICAgICAgcGFydGljbGVTeXN0ZW0uYmxlbmRNb2RlID0gQkFCWUxPTi5QYXJ0aWNsZVN5c3RlbS5CTEVORE1PREVfT05FT05FO1xuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmRpcmVjdGlvbjEgPSBuZXcgQkFCWUxPTi5WZWN0b3IzKDAsMCwwKVxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmRpcmVjdGlvbjIgPSBuZXcgQkFCWUxPTi5WZWN0b3IzKDAsMCwwKVxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLnN0YXJ0KCk7XG4gICAgICAgICAgLy8g6K6+572u57KS5a2Q5Y+R5bCE5Zmo5Li655CD5b2i5Y+R5bCE5ZmoXG4gICAgICAgICAgbGV0IHNwaGVyZUVtaXR0ZXIgPSBwYXJ0aWNsZVN5c3RlbS5jcmVhdGVTcGhlcmVFbWl0dGVyKCk7XG4gICAgICAgICAgc3BoZXJlRW1pdHRlci5yYWRpdXMgPSAyOyAvLyDnkIPkvZPljYrlvoRcbiAgICAgICAgICAvLyBzcGhlcmVFbWl0dGVyLnN0YXJ0UG9zaXRpb25GdW5jdGlvbiA9ICh3b3JsZE1hdHJpeDogQkFCWUxPTi5NYXRyaXgsIHBvc2l0aW9uVG9VcGRhdGU6IEJBQllMT04uVmVjdG9yMywgcGFydGljbGU6IEJBQllMT04uUGFydGljbGUsIGlzTG9jYWw6IGJvb2xlYW4pPT57XG4gICAgICAgICAgLy8gICBsZXQgc3BoZXJlUmFkaXVzID0gc3BoZXJlLmdldEJvdW5kaW5nSW5mbygpPy5ib3VuZGluZ1NwaGVyZT8ucmFkaXVzV29ybGRcbiAgICAgICAgICAvLyAgIHBhcnRpY2xlLnBvc2l0aW9uID0gcGFydGljbGUucG9zaXRpb24ubm9ybWFsaXplKCkuc2NhbGUoc3BoZXJlUmFkaXVzKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgc3BoZXJlRW1pdHRlci5yYWRpdXNSYW5nZSA9IDA7IC8vIOW8gOWni+WPkeWwhOWNiuW+hOiMg+WbtCAwIOWPquWcqOihqOmdolxuICAgICAgICAgIHNwaGVyZUVtaXR0ZXIuZGlyZWN0aW9uUmFuZG9taXplciA9IDA7IC8vIOW8gOWni+WPkeWwhOaWueWQkemaj+acuuaAp1xuXG4gICAgICAgICAgLy8g6K6+572u57KS5a2Q5pWI5p6cXG4gICAgICAgICAgcGFydGljbGVTeXN0ZW0uZ3Jhdml0eSA9IG5ldyBCQUJZTE9OLlZlY3RvcjMoMCwgMCwgMCk7IC8vIOWFs+mXremHjeWKm1xuICAgICAgICAgIC8vIOiuvue9rueykuWtkOezu+e7n+WBnOatouWQjueri+WNs+mUgOavgeeykuWtkFxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLmRpc3Bvc2VPblN0b3AgPSB0cnVlO1xuICAgICAgICAgIC8vIOS/ruaUueeykuWtkOabtOaWsOWHveaVsO+8jOWwhueykuWtkOmZkOWItuWcqOeQg+S9k+ihqOmdolxuICAgICAgICAgIHBhcnRpY2xlU3lzdGVtLnVwZGF0ZUZ1bmN0aW9uID0gKHBhcnRpY2xlcykgPT57XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcGFydGljbGVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBwYXJ0aWNsZSA9IHBhcnRpY2xlc1tpbmRleF07XG5cbiAgICAgICAgICAvLyAgICAgICAvLyDlsIbnspLlrZDkvY3nva7pmZDliLblnKjnkIPkvZPooajpnaJcbiAgICAgICAgICAgICAgICBsZXQgc3BoZXJlUmFkaXVzID0gc3BoZXJlLmdldEJvdW5kaW5nSW5mbygpPy5ib3VuZGluZ1NwaGVyZT8ucmFkaXVzV29ybGRcbiAgICAgICAgICAgICAgICBwYXJ0aWNsZS5wb3NpdGlvbiA9IHBhcnRpY2xlLnBvc2l0aW9uLm5vcm1hbGl6ZSgpLnNjYWxlKHNwaGVyZVJhZGl1cyk7XG4gICAgICAgICAgLy8gICAgICAgcGFydGljbGUuc2NhbGUgPSBuZXcgQkFCWUxPTi5WZWN0b3IyKDAuMiwwLjIpXG5cbiAgICAgICAgICAgICAgcGFydGljbGUuYWdlICs9IHRoaXMuc2NlbmUuZ2V0RW5naW5lKCkuZ2V0RGVsdGFUaW1lKCkvMTAwMDtcbiAgICAgICAgICAgIC8vIOajgOafpeeykuWtkOaYr+WQpui+vuWIsOacgOWkp+eUn+WRveWRqOacn++8jOWmguaenOaYr+WImeS9v+WFtua2iOWksVxuICAgICAgICAgICAgaWYgKHBhcnRpY2xlLmFnZSA+PSBwYXJ0aWNsZS5saWZlVGltZSkge1xuICAgICAgICAgICAgICBwYXJ0aWNsZVN5c3RlbS5yZWN5Y2xlUGFydGljbGUocGFydGljbGUpO1xuICAgICAgICAgICAgICBpbmRleC0tOyAvLyDmm7TmlrDntKLlvJXku6Xpgb/lhY3ot7Pov4fkuIvkuIDkuKrnspLlrZBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAvLyAgICAgICAvLyDlnKjkuIDlrprml7bpl7TlkI7kvb/nspLlrZDmtojlpLFcbiAgICAgICAgICAvLyAgICAgICBpZiAocGFydGljbGUuYWdlID4gMC4xOSkge1xuICAgICAgICAgIC8vICAgICAgICAgcGFydGljbGUubGlmZVRpbWUgPSAwXG4gICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG5cbiAgICAgICAgLy8g5Yqo55S75b6q546vXG4gICAgICAgIHRoaXMuZW5naW5lLnJ1blJlbmRlckxvb3AoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zY2VuZS5yZW5kZXIoKTtcbiAgICAgICAgICAgIC8vIOabtOaWsOeykuWtkOeahOS9jee9ruWSjOe8qeaUvlxuICAgICAgICAgICAgcGFydGljbGVTeXN0ZW0ud29ybGRPZmZzZXQgPSBzcGhlcmUucG9zaXRpb247XG4gICAgICAgICAgICAvLyBwYXJ0aWNsZS5wb3NpdGlvbiA9IHBhcnRpY2xlLnBvc2l0aW9uLm5vcm1hbGl6ZSgpLnNjYWxlKHNwaGVyZUVtaXR0ZXIucmFkaXVzKTtcbiAgICAgICAgICB9KTtcbiAgfVxuXG4gIHNldENhbWVyYVRvTWVzaENlbnRlcihjYW1lcmE6QkFCWUxPTi5BcmNSb3RhdGVDYW1lcmF8dW5kZWZpbmVkLG1lc2g6QkFCWUxPTi5BYnN0cmFjdE1lc2gpe1xuICAgIC8vIOiOt+WPlue9keagvOS9k+eahOi+ueeVjOS/oeaBr1xuICAgIG1lc2guY29tcHV0ZVdvcmxkTWF0cml4KHRydWUpO1xuICAgIGxldCBib3VuZGluZ0luZm8gPSBtZXNoLmdldEJvdW5kaW5nSW5mbygpO1xuXG4gICAgLy8g6I635Y+W6L6555WM5qGG55qE5pyA5bCP54K55ZKM5pyA5aSn54K5XG4gICAgbGV0IG1pbmltdW0gPSBib3VuZGluZ0luZm8ubWluaW11bTtcbiAgICBsZXQgbWF4aW11bSA9IGJvdW5kaW5nSW5mby5tYXhpbXVtO1xuXG4gICAgLy8g6K6h566X572R5qC85L2T55qE6ZW/5a696auYXG4gICAgbGV0IHdpZHRoID0gbWF4aW11bS54IC0gbWluaW11bS54O1xuICAgIGxldCBoZWlnaHQgPSBtYXhpbXVtLnkgLSBtaW5pbXVtLnk7XG4gICAgbGV0IGRlcHRoID0gbWF4aW11bS56IC0gbWluaW11bS56O1xuICAgIGxldCBjZW50ZXIgPSBib3VuZGluZ0luZm8uYm91bmRpbmdCb3guY2VudGVyO1xuICAgIGNvbnNvbGUubG9nKFwi5a695bqm77yaXCIgKyB3aWR0aCk7XG4gICAgY29uc29sZS5sb2coXCLpq5jluqbvvJpcIiArIGhlaWdodCk7XG4gICAgY29uc29sZS5sb2coXCLmt7HluqbvvJpcIiArIGRlcHRoKTtcbiAgICBjb25zb2xlLmxvZyhcIuS4reW/g+eCue+8mlwiICsgY2VudGVyKTtcblxuICAgIC8vIGNhbWVyYT8uc2V0UG9zaXRpb24oY2VudGVyKVxuICB9XG59XG4iLCI8Y2FudmFzICNyZW5kZXJDYW52YXMgY2xhc3M9XCJyZW5kZXItY2FudmFzXCI+PC9jYW52YXM+Il19
@@ -1,10 +1,3 @@
1
-
2
- /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs
7
- */
8
- export*from"./comp-avatar-particle.component";export*from"./avatar.role";
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2F2YXRhci9jb21wLWF2YXRhci1wYXJ0aWNsZS9pbmRleC5tanM=`
10
-
1
+ export * from "./comp-avatar-particle.component";
2
+ export * from "./avatar.role";
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvYXZhdGFyL2NvbXAtYXZhdGFyLXBhcnRpY2xlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0NBQWtDLENBQUE7QUFDaEQsY0FBYyxlQUFlLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9jb21wLWF2YXRhci1wYXJ0aWNsZS5jb21wb25lbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXZhdGFyLnJvbGVcIlxuIl19
@@ -1,10 +1,57 @@
1
-
2
- /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs
7
- */
8
- import*as BABYLON from"@babylonjs/core";import"@babylonjs/loaders";export class RolePointsCloud{constructor(i,e,t){this.offsetPosition=new BABYLON.Vector3(0,1.25,0),this.animationGroup=new BABYLON.AnimationGroup("RoleAnimGroup"),this.AnimMap={idle:null},this.scene=i,this.engine=this.engine}async init(){this.Mesh=this.loadMesh(),this.loadIdleAnim()}playAnim(i){this.scene.beginDirectAnimation(this.Mesh,[this.AnimMap[i]],0,120,!0)}loadMesh(){let i=BABYLON.MeshBuilder.CreateSphere("sphere",{diameter:2},this.scene);return i.position.addInPlace(this.offsetPosition),i.visibility=1,i.material=new BABYLON.StandardMaterial("mat",this.scene),i.material.wireframe=!0,i.scaling=new BABYLON.Vector3(1,1,1),i}loadIdleAnim(){let i=new BABYLON.Animation("idle","scaling",30,BABYLON.Animation.ANIMATIONTYPE_VECTOR3,BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE),e=[];e.push({frame:0,value:new BABYLON.Vector3(1,1,1)}),e.push({frame:60,value:new BABYLON.Vector3(1.5,1.5,1.5)}),e.push({frame:120,value:new BABYLON.Vector3(1,1,1)}),i.setKeys(e),this.Mesh.animations.push(this.AnimMap.idle),this.AnimMap.idle=i,this.animationGroup.addTargetedAnimation(this.AnimMap.idle,this.Mesh)}}
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2F2YXRhci9jb21wLWF2YXRhci1wYXJ0aWNsZS9yb2xlLXBvaW50cy5jbGFzcy5tanM=`
10
-
1
+ import * as BABYLON from '@babylonjs/core';
2
+ import '@babylonjs/loaders';
3
+ export class RolePointsCloud {
4
+ constructor(scene, engine, camera) {
5
+ this.offsetPosition = new BABYLON.Vector3(0, 1.25, 0);
6
+ this.animationGroup = new BABYLON.AnimationGroup("RoleAnimGroup");
7
+ this.AnimMap = {
8
+ idle: null
9
+ };
10
+ this.scene = scene;
11
+ this.engine = this.engine;
12
+ }
13
+ async init() {
14
+ this.Mesh = this.loadMesh();
15
+ this.loadIdleAnim();
16
+ }
17
+ playAnim(anim) {
18
+ // this.Mesh.animations[0]
19
+ // this.animationGroup.start(true,1,0,120,null)
20
+ this.scene.beginDirectAnimation(this.Mesh, [this.AnimMap[anim]], 0, 120, true);
21
+ }
22
+ loadMesh() {
23
+ let sphere = BABYLON.MeshBuilder.CreateSphere("sphere", { diameter: 2 }, this.scene);
24
+ sphere.position.addInPlace(this.offsetPosition);
25
+ sphere.visibility = 1; // 不可见,仅用于粒子覆盖占位
26
+ // 材质
27
+ sphere.material = new BABYLON.StandardMaterial("mat", this.scene);
28
+ sphere.material.wireframe = true;
29
+ // 设置初始缩放
30
+ sphere.scaling = new BABYLON.Vector3(1, 1, 1);
31
+ return sphere;
32
+ }
33
+ loadIdleAnim() {
34
+ // 创建动画
35
+ let idleAnim = new BABYLON.Animation("idle", "scaling", 30, BABYLON.Animation.ANIMATIONTYPE_VECTOR3, BABYLON.Animation.ANIMATIONLOOPMODE_CYCLE);
36
+ // 定义动画关键帧
37
+ let keys = [];
38
+ keys.push({
39
+ frame: 0,
40
+ value: new BABYLON.Vector3(1, 1, 1) // 初始缩放
41
+ });
42
+ keys.push({
43
+ frame: 60,
44
+ value: new BABYLON.Vector3(1.5, 1.5, 1.5) // 最大缩放
45
+ });
46
+ keys.push({
47
+ frame: 120,
48
+ value: new BABYLON.Vector3(1, 1, 1) // 初始缩放
49
+ });
50
+ idleAnim.setKeys(keys);
51
+ // 将关键帧添加到动画
52
+ this.Mesh.animations.push(this.AnimMap.idle);
53
+ this.AnimMap.idle = idleAnim;
54
+ this.animationGroup.addTargetedAnimation(this.AnimMap.idle, this.Mesh);
55
+ }
56
+ }
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1wb2ludHMuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvYXZhdGFyL2NvbXAtYXZhdGFyLXBhcnRpY2xlL3JvbGUtcG9pbnRzLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxPQUFPLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxvQkFBb0IsQ0FBQztBQUc1QixNQUFNLE9BQU8sZUFBZTtJQUd4QixZQUFZLEtBQUssRUFBQyxNQUFNLEVBQUMsTUFBTTtRQUsvQixtQkFBYyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlDLG1CQUFjLEdBQTBCLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNuRixZQUFPLEdBQUc7WUFDTixJQUFJLEVBQUMsSUFBSTtTQUNaLENBQUE7UUFSRyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUE7SUFDN0IsQ0FBQztJQU9ELEtBQUssQ0FBQyxJQUFJO1FBQ04sSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBSTtRQUNULDBCQUEwQjtRQUMxQiwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUNELFFBQVE7UUFDSixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUMvQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQSxDQUFDLGdCQUFnQjtRQUN0QyxLQUFLO1FBQ0wsTUFBTSxDQUFDLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQyxTQUFTO1FBQ1QsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QyxPQUFPLE1BQU0sQ0FBQTtJQUNqQixDQUFDO0lBQ0QsWUFBWTtRQUNSLE9BQU87UUFDUCxJQUFJLFFBQVEsR0FBRyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQ2hDLE1BQU0sRUFDTixTQUFTLEVBQ1QsRUFBRSxFQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMscUJBQXFCLEVBQ3ZDLE9BQU8sQ0FBQyxTQUFTLENBQUMsdUJBQXVCLENBQzVDLENBQUM7UUFFRixVQUFVO1FBQ1YsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNOLEtBQUssRUFBRSxDQUFDO1lBQ1IsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87U0FDNUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNOLEtBQUssRUFBRSxFQUFFO1lBQ1QsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUMsR0FBRyxFQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU87U0FDbEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNOLEtBQUssRUFBRSxHQUFHO1lBQ1YsS0FBSyxFQUFFLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUMsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87U0FDNUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUN0QixZQUFZO1FBQ1osSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFBO1FBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pFLENBQUM7Q0FFSiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0ICogYXMgQkFCWUxPTiBmcm9tICdAYmFieWxvbmpzL2NvcmUnO1xuaW1wb3J0ICdAYmFieWxvbmpzL2xvYWRlcnMnO1xuaW1wb3J0IHsgQXZhdGFyUm9sZSB9IGZyb20gJy4vYXZhdGFyLnJvbGUnO1xuXG5leHBvcnQgY2xhc3MgUm9sZVBvaW50c0Nsb3VkIGltcGxlbWVudHMgQXZhdGFyUm9sZXtcbiAgICBzY2VuZTpCQUJZTE9OLlNjZW5lXG4gICAgZW5naW5lOkJBQllMT04uRW5naW5lXG4gICAgY29uc3RydWN0b3Ioc2NlbmUsZW5naW5lLGNhbWVyYSl7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZVxuICAgICAgICB0aGlzLmVuZ2luZSA9IHRoaXMuZW5naW5lXG4gICAgfVxuICAgIE1lc2g6QkFCWUxPTi5NZXNoXG4gICAgb2Zmc2V0UG9zaXRpb24gPSBuZXcgQkFCWUxPTi5WZWN0b3IzKDAsMS4yNSwwKVxuICAgIGFuaW1hdGlvbkdyb3VwOkJBQllMT04uQW5pbWF0aW9uR3JvdXAgPSBuZXcgQkFCWUxPTi5BbmltYXRpb25Hcm91cChcIlJvbGVBbmltR3JvdXBcIilcbiAgICBBbmltTWFwID0ge1xuICAgICAgICBpZGxlOm51bGxcbiAgICB9XG4gICAgYXN5bmMgaW5pdCgpe1xuICAgICAgICB0aGlzLk1lc2ggPSB0aGlzLmxvYWRNZXNoKCk7XG4gICAgICAgIHRoaXMubG9hZElkbGVBbmltKCk7XG4gICAgfVxuXG4gICAgcGxheUFuaW0oYW5pbSl7XG4gICAgICAgIC8vIHRoaXMuTWVzaC5hbmltYXRpb25zWzBdXG4gICAgICAgIC8vIHRoaXMuYW5pbWF0aW9uR3JvdXAuc3RhcnQodHJ1ZSwxLDAsMTIwLG51bGwpXG4gICAgICAgIHRoaXMuc2NlbmUuYmVnaW5EaXJlY3RBbmltYXRpb24odGhpcy5NZXNoLCBbdGhpcy5BbmltTWFwW2FuaW1dXSwgMCwgMTIwLCB0cnVlKTtcbiAgICB9XG4gICAgbG9hZE1lc2goKXtcbiAgICAgICAgbGV0IHNwaGVyZSA9IEJBQllMT04uTWVzaEJ1aWxkZXIuQ3JlYXRlU3BoZXJlKFwic3BoZXJlXCIsIHsgZGlhbWV0ZXI6IDIgfSwgdGhpcy5zY2VuZSk7XG4gICAgICAgIHNwaGVyZS5wb3NpdGlvbi5hZGRJblBsYWNlKHRoaXMub2Zmc2V0UG9zaXRpb24pXG4gICAgICAgIHNwaGVyZS52aXNpYmlsaXR5ID0gMSAvLyDkuI3lj6/op4HvvIzku4XnlKjkuo7nspLlrZDopobnm5bljaDkvY1cbiAgICAgICAgLy8g5p2Q6LSoXG4gICAgICAgIHNwaGVyZS5tYXRlcmlhbCA9IG5ldyBCQUJZTE9OLlN0YW5kYXJkTWF0ZXJpYWwoXCJtYXRcIiwgdGhpcy5zY2VuZSk7XG4gICAgICAgIHNwaGVyZS5tYXRlcmlhbC53aXJlZnJhbWUgPSB0cnVlO1xuICAgICAgICAvLyDorr7nva7liJ3lp4vnvKnmlL5cbiAgICAgICAgc3BoZXJlLnNjYWxpbmcgPSBuZXcgQkFCWUxPTi5WZWN0b3IzKDEsIDEsIDEpO1xuICAgICAgICByZXR1cm4gc3BoZXJlXG4gICAgfVxuICAgIGxvYWRJZGxlQW5pbSgpe1xuICAgICAgICAvLyDliJvlu7rliqjnlLtcbiAgICAgICAgbGV0IGlkbGVBbmltID0gbmV3IEJBQllMT04uQW5pbWF0aW9uKFxuICAgICAgICAgICAgXCJpZGxlXCIsXG4gICAgICAgICAgICBcInNjYWxpbmdcIixcbiAgICAgICAgICAgIDMwLFxuICAgICAgICAgICAgQkFCWUxPTi5BbmltYXRpb24uQU5JTUFUSU9OVFlQRV9WRUNUT1IzLFxuICAgICAgICAgICAgQkFCWUxPTi5BbmltYXRpb24uQU5JTUFUSU9OTE9PUE1PREVfQ1lDTEVcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIC8vIOWumuS5ieWKqOeUu+WFs+mUruW4p1xuICAgICAgICBsZXQga2V5cyA9IFtdO1xuICAgICAgICBrZXlzLnB1c2goe1xuICAgICAgICAgICAgZnJhbWU6IDAsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IEJBQllMT04uVmVjdG9yMygxLDEsMSkgLy8g5Yid5aeL57yp5pS+XG4gICAgICAgIH0pO1xuICAgICAgICBrZXlzLnB1c2goe1xuICAgICAgICAgICAgZnJhbWU6IDYwLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBCQUJZTE9OLlZlY3RvcjMoMS41LDEuNSwxLjUpIC8vIOacgOWkp+e8qeaUvlxuICAgICAgICB9KTtcbiAgICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgICAgIGZyYW1lOiAxMjAsXG4gICAgICAgICAgICB2YWx1ZTogbmV3IEJBQllMT04uVmVjdG9yMygxLDEsMSkgLy8g5Yid5aeL57yp5pS+XG4gICAgICAgIH0pO1xuICAgICAgICBpZGxlQW5pbS5zZXRLZXlzKGtleXMpXG4gICAgICAgIC8vIOWwhuWFs+mUruW4p+a3u+WKoOWIsOWKqOeUu1xuICAgICAgICB0aGlzLk1lc2guYW5pbWF0aW9ucy5wdXNoKHRoaXMuQW5pbU1hcC5pZGxlKVxuICAgICAgICB0aGlzLkFuaW1NYXAuaWRsZSA9IGlkbGVBbmltXG4gICAgICAgIHRoaXMuYW5pbWF0aW9uR3JvdXAuYWRkVGFyZ2V0ZWRBbmltYXRpb24odGhpcy5BbmltTWFwLmlkbGUsdGhpcy5NZXNoKVxuICAgIH1cbiAgICBcbn0iXX0=