├── .env ├── .gitignore ├── LICENSE ├── README.md ├── babel.config.js ├── deploy.bat ├── package-lock.json ├── package.json ├── public ├── ammo.js ├── compiler.wasm ├── earcut.min.2.2.1.js ├── favicon.ico ├── gif.worker.js ├── index.html ├── opentype.min.1.1.0.js └── 方正正准黑简体.TTF ├── src ├── App.vue ├── assets │ ├── fontFamily.css │ ├── gifjs │ │ └── gif.js │ ├── iconfont │ │ ├── demo.css │ │ ├── demo_index.html │ │ ├── iconfont.css │ │ ├── iconfont.eot │ │ ├── iconfont.js │ │ ├── iconfont.json │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ └── iconfont.woff2 │ ├── logo.png │ └── spectrum │ │ ├── spectrum.min.css │ │ └── spectrum.min.js ├── canvas │ ├── babylon.font.mjs │ ├── common.js │ ├── common3D.js │ ├── function3D.js │ └── particle3D.js ├── components │ ├── HelloWorld.vue │ └── global │ │ └── library │ │ ├── filterSetting.vue │ │ └── setGroup.vue ├── data │ ├── babylonData.js │ ├── characterSettingData.js │ ├── filterConfig.js │ ├── imageFiltersData.js │ └── resourcePath.js ├── i18n.js ├── locales │ ├── en.json │ └── zh.json ├── main.js ├── master │ ├── 3dModel.vue │ ├── animation.vue │ ├── cameraSetting.vue │ ├── gui2DSetting.vue │ ├── js │ │ ├── meshData.js │ │ └── methods.js │ ├── lightSetting.vue │ ├── materialSetting.vue │ ├── meshSetting.vue │ ├── model │ │ └── managerPannel.vue │ ├── multiMaterialSetting.vue │ ├── particleSetting.vue │ ├── programSetting.vue │ ├── sceneSetting.vue │ ├── skeletonSetting.vue │ ├── spriteManagerSetting.vue │ └── textureSetting.vue ├── plugins │ └── element.js ├── store │ ├── index.js │ ├── modules │ │ └── master.js │ └── mutations │ │ └── mutation-types.js └── utils │ ├── storeUtil.js │ ├── util.js │ └── window.js ├── vue.config.js └── yarn.lock /.env: -------------------------------------------------------------------------------- 1 | VUE_APP_I18N_LOCALE=en 2 | VUE_APP_I18N_FALLBACK_LOCALE=en 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020-present, Mengshukeji 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LuckyBabylon 2 | 3 | ## 介绍 4 | Babylon 3D可视化编辑器 5 | 6 | ## 演示 7 | 8 | [Demo](https://mengshukeji.github.io/LuckyBabylonDemo/) 9 | 10 | ## 使用 11 | 12 | ## 安装 13 | ``` 14 | npm i 15 | ``` 16 | 17 | ### 开发 18 | ``` 19 | npm run serve 20 | ``` 21 | 22 | ### 打包 23 | ``` 24 | npm run build 25 | ``` 26 | 27 | ## 共建 28 | 29 | - 欢迎试用提交 [issues](https://github.com/mengshukeji/LuckyBabylon/issues) 或者 [PR](https://github.com/mengshukeji/LuckyBabylon/pulls) 30 | - 欢迎加入[Babylon翻译计划](https://github.com/mengshukeji/babylon_doc) 31 | 32 | 33 | ## 联系 34 | 35 | - 联系邮箱: alexads@foxmail.com 36 | - 加入Babylon.js中文网官方QQ群:1127206245 37 | 38 | QQ群 39 | 40 | ## 资源链接 41 | 42 | - [Babylon.js中文网](https://www.cnbabylon.com/) 43 | - [Babylon.js中文文档](https://doc.cnbabylon.com) 44 | - [Babylon.js英文文档](https://endoc.cnbabylon.com) 45 | 46 | 47 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /deploy.bat: -------------------------------------------------------------------------------- 1 | # deploy Demo 2 | npm run build 3 | cd dist 4 | git init 5 | git remote add origin https://github.com/mengshukeji/LuckyBabylonDemo.git 6 | git add . 7 | git commit -m 'deploy LuckyBabylon demo' 8 | git push -f origin master:gh-pages -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "luckybabylon", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint", 9 | "i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'" 10 | }, 11 | "dependencies": { 12 | "babylon-mtoon-material": "^2.0.1", 13 | "core-js": "^3.6.5", 14 | "earcut": "^2.2.2", 15 | "element-ui": "^2.4.5", 16 | "jquery": "^3.5.1", 17 | "js-beautify": "^1.13.0", 18 | "vue": "^2.6.11", 19 | "vue-i18n": "^8.17.3", 20 | "vue-monaco-editor": "^0.0.19", 21 | "vuex": "^3.4.0" 22 | }, 23 | "devDependencies": { 24 | "@babylonjs/core": "^4.1.0", 25 | "@babylonjs/gui": "^4.1.0", 26 | "@babylonjs/loaders": "^4.1.0", 27 | "@babylonjs/materials": "^4.1.0", 28 | "@babylonjs/procedural-textures": "^4.1.0", 29 | "@vue/cli-plugin-babel": "~4.5.0", 30 | "@vue/cli-plugin-eslint": "~4.5.0", 31 | "@vue/cli-plugin-vuex": "^4.5.7", 32 | "@vue/cli-service": "~4.5.0", 33 | "babel-eslint": "^10.1.0", 34 | "eslint": "^6.7.2", 35 | "eslint-plugin-vue": "^6.2.2", 36 | "sass": "^1.27.0", 37 | "sass-loader": "^10.0.3", 38 | "vue-cli-plugin-element": "^1.0.1", 39 | "vue-cli-plugin-i18n": "^1.0.1", 40 | "vue-loader": "^15.9.3", 41 | "vue-template-compiler": "^2.6.11" 42 | }, 43 | "eslintConfig": { 44 | "root": true, 45 | "env": { 46 | "node": true 47 | }, 48 | "extends": [ 49 | "plugin:vue/essential", 50 | "eslint:recommended" 51 | ], 52 | "parserOptions": { 53 | "parser": "babel-eslint" 54 | } 55 | }, 56 | "browserslist": [ 57 | "> 1%", 58 | "last 2 versions", 59 | "not dead" 60 | ] 61 | } 62 | -------------------------------------------------------------------------------- /public/compiler.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/public/compiler.wasm -------------------------------------------------------------------------------- /public/earcut.min.2.2.1.js: -------------------------------------------------------------------------------- 1 | !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).earcut=e()}}(function(){return function i(u,f,o){function v(n,e){if(!f[n]){if(!u[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(y)return y(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var x=f[n]={exports:{}};u[n][0].call(x.exports,function(e){return v(u[n][1][e]||e)},x,x.exports,i,u,f,o)}return f[n].exports}for(var y="function"==typeof require&&require,e=0;e80*t){r=i=e[0],x=u=e[1];for(var h=t;hi.x?x.x>u.x?x.x:u.x:i.x>u.x?i.x:u.x,y=x.y>i.y?x.y>u.y?x.y:u.y:i.y>u.y?i.y:u.y,p=w(f,o,n,t,r),a=w(v,y,n,t,r),l=e.prevZ,h=e.nextZ;l&&l.z>=p&&h&&h.z<=a;){if(l!==e.prev&&l!==e.next&&b(x.x,x.y,i.x,i.y,u.x,u.y,l.x,l.y)&&0<=m(l.prev,l,l.next))return!1;if(l=l.prevZ,h!==e.prev&&h!==e.next&&b(x.x,x.y,i.x,i.y,u.x,u.y,h.x,h.y)&&0<=m(h.prev,h,h.next))return!1;h=h.nextZ}for(;l&&l.z>=p;){if(l!==e.prev&&l!==e.next&&b(x.x,x.y,i.x,i.y,u.x,u.y,l.x,l.y)&&0<=m(l.prev,l,l.next))return!1;l=l.prevZ}for(;h&&h.z<=a;){if(h!==e.prev&&h!==e.next&&b(x.x,x.y,i.x,i.y,u.x,u.y,h.x,h.y)&&0<=m(h.prev,h,h.next))return!1;h=h.nextZ}return!0}function a(e,n,t){var r=e;do{var x=r.prev,i=r.next.next;!h(x,i)&&z(x,r,r.next,i)&&q(x,i)&&q(i,x)&&(n.push(x.i/t),n.push(r.i/t),n.push(i.i/t),k(r),k(r.next),r=e=i),r=r.next}while(r!==e);return c(r)}function l(e,n,t,r,x,i){var u,f,o=e;do{for(var v=o.next.next;v!==o.prev;){if(o.i!==v.i&&(f=v,(u=o).next.i!==f.i&&u.prev.i!==f.i&&!function(e,n){var t=e;do{if(t.i!==e.i&&t.next.i!==e.i&&t.i!==n.i&&t.next.i!==n.i&&z(t,t.next,e,n))return!0;t=t.next}while(t!==e);return!1}(u,f)&&(q(u,f)&&q(f,u)&&function(e,n){var t=e,r=!1,x=(e.x+n.x)/2,i=(e.y+n.y)/2;for(;t.y>i!=t.next.y>i&&t.next.y!==t.y&&x<(t.next.x-t.x)*(i-t.y)/(t.next.y-t.y)+t.x&&(r=!r),t=t.next,t!==e;);return r}(u,f)&&(m(u.prev,u,f.prev)||m(u,f.prev,f))||h(u,f)&&0=r.next.y&&r.next.y!==r.y){var f=r.x+(i-r.y)*(r.next.x-r.x)/(r.next.y-r.y);if(f<=x&&u=r.x&&r.x>=y&&x!==r.x&&b(it.x||r.x===t.x&&(h=r,m((l=t).prev,l,h.prev)<0&&m(h.next,l,l.next)<0)))&&(t=r,a=o)),r=r.next,r!==v;);var l,h;return t}(e,n)){var t=O(n,e);c(t,t.next)}}function w(e,n,t,r,x){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-t)*x)|e<<8))|e<<4))|e<<2))|e<<1))|(n=1431655765&((n=858993459&((n=252645135&((n=16711935&((n=32767*(n-r)*x)|n<<8))|n<<4))|n<<2))|n<<1))<<1}function M(e){for(var n=e,t=e;(n.x=Math.min(e.x,t.x)&&n.y<=Math.max(e.y,t.y)&&n.y>=Math.min(e.y,t.y)}function v(e){return 0=ByteArray.pageSize)this.newPage();this.pages[this.page][this.cursor++]=val};ByteArray.prototype.writeUTFBytes=function(string){for(var l=string.length,i=0;i=0)this.dispose=disposalCode};GIFEncoder.prototype.setRepeat=function(repeat){this.repeat=repeat};GIFEncoder.prototype.setTransparent=function(color){this.transparent=color};GIFEncoder.prototype.addFrame=function(imageData){this.image=imageData;this.colorTab=this.globalPalette&&this.globalPalette.slice?this.globalPalette:null;this.getImagePixels();this.analyzePixels();if(this.globalPalette===true)this.globalPalette=this.colorTab;if(this.firstFrame){this.writeLSD();this.writePalette();if(this.repeat>=0){this.writeNetscapeExt()}}this.writeGraphicCtrlExt();this.writeImageDesc();if(!this.firstFrame&&!this.globalPalette)this.writePalette();this.writePixels();this.firstFrame=false};GIFEncoder.prototype.finish=function(){this.out.writeByte(59)};GIFEncoder.prototype.setQuality=function(quality){if(quality<1)quality=1;this.sample=quality};GIFEncoder.prototype.setDither=function(dither){if(dither===true)dither="FloydSteinberg";this.dither=dither};GIFEncoder.prototype.setGlobalPalette=function(palette){this.globalPalette=palette};GIFEncoder.prototype.getGlobalPalette=function(){return this.globalPalette&&this.globalPalette.slice&&this.globalPalette.slice(0)||this.globalPalette};GIFEncoder.prototype.writeHeader=function(){this.out.writeUTFBytes("GIF89a")};GIFEncoder.prototype.analyzePixels=function(){if(!this.colorTab){this.neuQuant=new NeuQuant(this.pixels,this.sample);this.neuQuant.buildColormap();this.colorTab=this.neuQuant.getColormap()}if(this.dither){this.ditherPixels(this.dither.replace("-serpentine",""),this.dither.match(/-serpentine/)!==null)}else{this.indexPixels()}this.pixels=null;this.colorDepth=8;this.palSize=7;if(this.transparent!==null){this.transIndex=this.findClosest(this.transparent,true)}};GIFEncoder.prototype.indexPixels=function(imgq){var nPix=this.pixels.length/3;this.indexedPixels=new Uint8Array(nPix);var k=0;for(var j=0;j=0&&x1+x=0&&y1+y>16,(c&65280)>>8,c&255,used)};GIFEncoder.prototype.findClosestRGB=function(r,g,b,used){if(this.colorTab===null)return-1;if(this.neuQuant&&!used){return this.neuQuant.lookupRGB(r,g,b)}var c=b|g<<8|r<<16;var minpos=0;var dmin=256*256*256;var len=this.colorTab.length;for(var i=0,index=0;i=0){disp=dispose&7}disp<<=2;this.out.writeByte(0|disp|0|transp);this.writeShort(this.delay);this.out.writeByte(this.transIndex);this.out.writeByte(0)};GIFEncoder.prototype.writeImageDesc=function(){this.out.writeByte(44);this.writeShort(0);this.writeShort(0);this.writeShort(this.width);this.writeShort(this.height);if(this.firstFrame||this.globalPalette){this.out.writeByte(0)}else{this.out.writeByte(128|0|0|0|this.palSize)}};GIFEncoder.prototype.writeLSD=function(){this.writeShort(this.width);this.writeShort(this.height);this.out.writeByte(128|112|0|this.palSize);this.out.writeByte(0);this.out.writeByte(0)};GIFEncoder.prototype.writeNetscapeExt=function(){this.out.writeByte(33);this.out.writeByte(255);this.out.writeByte(11);this.out.writeUTFBytes("NETSCAPE2.0");this.out.writeByte(3);this.out.writeByte(1);this.writeShort(this.repeat);this.out.writeByte(0)};GIFEncoder.prototype.writePalette=function(){this.out.writeBytes(this.colorTab);var n=3*256-this.colorTab.length;for(var i=0;i>8&255)};GIFEncoder.prototype.writePixels=function(){var enc=new LZWEncoder(this.width,this.height,this.indexedPixels,this.colorDepth);enc.encode(this.out)};GIFEncoder.prototype.stream=function(){return this.out};module.exports=GIFEncoder},{"./LZWEncoder.js":2,"./TypedNeuQuant.js":3}],2:[function(require,module,exports){var EOF=-1;var BITS=12;var HSIZE=5003;var masks=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function LZWEncoder(width,height,pixels,colorDepth){var initCodeSize=Math.max(2,colorDepth);var accum=new Uint8Array(256);var htab=new Int32Array(HSIZE);var codetab=new Int32Array(HSIZE);var cur_accum,cur_bits=0;var a_count;var free_ent=0;var maxcode;var clear_flg=false;var g_init_bits,ClearCode,EOFCode;function char_out(c,outs){accum[a_count++]=c;if(a_count>=254)flush_char(outs)}function cl_block(outs){cl_hash(HSIZE);free_ent=ClearCode+2;clear_flg=true;output(ClearCode,outs)}function cl_hash(hsize){for(var i=0;i=0){disp=hsize_reg-i;if(i===0)disp=1;do{if((i-=disp)<0)i+=hsize_reg;if(htab[i]===fcode){ent=codetab[i];continue outer_loop}}while(htab[i]>=0)}output(ent,outs);ent=c;if(free_ent<1<0){outs.writeByte(a_count);outs.writeBytes(accum,0,a_count);a_count=0}}function MAXCODE(n_bits){return(1<0)cur_accum|=code<=8){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}if(free_ent>maxcode||clear_flg){if(clear_flg){maxcode=MAXCODE(n_bits=g_init_bits);clear_flg=false}else{++n_bits;if(n_bits==BITS)maxcode=1<0){char_out(cur_accum&255,outs);cur_accum>>=8;cur_bits-=8}flush_char(outs)}}this.encode=encode}module.exports=LZWEncoder},{}],3:[function(require,module,exports){var ncycles=100;var netsize=256;var maxnetpos=netsize-1;var netbiasshift=4;var intbiasshift=16;var intbias=1<>betashift;var betagamma=intbias<>3;var radiusbiasshift=6;var radiusbias=1<>3);var i,v;for(i=0;i>=netbiasshift;network[i][1]>>=netbiasshift;network[i][2]>>=netbiasshift;network[i][3]=i}}function altersingle(alpha,i,b,g,r){network[i][0]-=alpha*(network[i][0]-b)/initalpha;network[i][1]-=alpha*(network[i][1]-g)/initalpha;network[i][2]-=alpha*(network[i][2]-r)/initalpha}function alterneigh(radius,i,b,g,r){var lo=Math.abs(i-radius);var hi=Math.min(i+radius,netsize);var j=i+1;var k=i-1;var m=1;var p,a;while(jlo){a=radpower[m++];if(jlo){p=network[k--];p[0]-=a*(p[0]-b)/alpharadbias;p[1]-=a*(p[1]-g)/alpharadbias;p[2]-=a*(p[2]-r)/alpharadbias}}}function contest(b,g,r){var bestd=~(1<<31);var bestbiasd=bestd;var bestpos=-1;var bestbiaspos=bestpos;var i,n,dist,biasdist,betafreq;for(i=0;i>intbiasshift-netbiasshift);if(biasdist>betashift;freq[i]-=betafreq;bias[i]+=betafreq<>1;for(j=previouscol+1;j>1;for(j=previouscol+1;j<256;j++)netindex[j]=maxnetpos}function inxsearch(b,g,r){var a,p,dist;var bestd=1e3;var best=-1;var i=netindex[g];var j=i-1;while(i=0){if(i=bestd)i=netsize;else{i++;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist=0){p=network[j];dist=g-p[1];if(dist>=bestd)j=-1;else{j--;if(dist<0)dist=-dist;a=p[0]-b;if(a<0)a=-a;dist+=a;if(dist>radiusbiasshift;if(rad<=1)rad=0;for(i=0;i=lengthcount)pix-=lengthcount;i++;if(delta===0)delta=1;if(i%delta===0){alpha-=alpha/alphadec;radius-=radius/radiusdec;rad=radius>>radiusbiasshift;if(rad<=1)rad=0;for(j=0;j 2 | 3 | 4 | 5 | 3D建模 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | -------------------------------------------------------------------------------- /public/方正正准黑简体.TTF: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/public/方正正准黑简体.TTF -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 17 | 18 | -------------------------------------------------------------------------------- /src/assets/fontFamily.css: -------------------------------------------------------------------------------- 1 | /*日村体*/ 2 | @font-face { 3 | font-family: 'ricunti'; 4 | /* src: url('../../static/font/ricunti.ttf'); */ 5 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g2mCAbge0ADeq6BqN4fU513.ttf'); 6 | } 7 | 8 | /*造字工坊黄金时代*/ 9 | @font-face { 10 | font-family: 'zaozigongfanghuangjinshidai'; 11 | /* src: url('../../static/font/zaozigongfanghuangjinshidai.otf'); */ 12 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3jJseAQ4zIABhJZJWubeo500.otf'); 13 | } 14 | /*本末客圆*/ 15 | @font-face { 16 | font-family: 'benmokeyuan'; 17 | /* src: url('../../static/font/benmokeyuan.ttf'); */ 18 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g3VaALKQwADeq6BqN4fU811.ttf'); 19 | } 20 | @font-face { 21 | font-family: 'b3f3dcf6'; 22 | /* src: url('../../static/font/b3f3dcf6-79ff-4ac4-a9d2-121e9cfb5b11.ttf'); */ 23 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g6DuAElq-ABoOAPtF6SU435.ttf'); 24 | } 25 | 26 | /*汉仪书魂体简*/ 27 | @font-face { 28 | font-family: 'hanyishuhuntijian'; 29 | /* src: url('../../static/font/b3f3dcf6-79ff-4ac4-a9d2-121e9cfb5b11.ttf'); */ 30 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g6DuAElq-ABoOAPtF6SU435.ttf'); 31 | } 32 | 33 | /*QuartzRegular*/ 34 | @font-face { 35 | font-family: 'QuartzRegular'; 36 | /* src: url('../../static/font/b3f3dcf6-79ff-4ac4-a9d2-121e9cfb5b11.ttf'); */ 37 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g6DuAElq-ABoOAPtF6SU435.ttf'); 38 | } 39 | 40 | /*苹方常规*/ 41 | @font-face { 42 | font-family: 'pingfangchanggui'; 43 | /* src: url('../../static/font/b3f3dcf6-79ff-4ac4-a9d2-121e9cfb5b11.ttf'); */ 44 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g6DuAElq-ABoOAPtF6SU435.ttf'); 45 | } 46 | 47 | /*逐浪创艺粗黑体*/ 48 | @font-face { 49 | font-family: 'LPD8R8'; 50 | /* src: url('../../static/font/b3f3dcf6-79ff-4ac4-a9d2-121e9cfb5b11.ttf'); */ 51 | src: url('https://www.office2.cn/file/group1/M00/00/04/r2YPll3g3VaALKQwADeq6BqN4fU811.ttf'); 52 | } 53 | 54 | /*思源黑体常规*/ 55 | @font-face { 56 | font-family: 'siyuanheitichanggui'; 57 | /* src: url('../../static/font/b3f3dcf6-79ff-4ac4-a9d2-121e9cfb5b11.ttf'); */ 58 | src: url('https://www.office2.cn/file/group1/M00/00/07/r2YPll3mO5-AMAkqAPyrlDGm1sc800.otf'); 59 | } 60 | -------------------------------------------------------------------------------- /src/assets/gifjs/gif.js: -------------------------------------------------------------------------------- 1 | // gif.js 0.2.0 - https://github.com/jnordberg/gif.js 2 | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GIF=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o0&&this._events[type].length>m){this._events[type].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[type].length);if(typeof console.trace==="function"){console.trace()}}}return this};EventEmitter.prototype.on=EventEmitter.prototype.addListener;EventEmitter.prototype.once=function(type,listener){if(!isFunction(listener))throw TypeError("listener must be a function");var fired=false;function g(){this.removeListener(type,g);if(!fired){fired=true;listener.apply(this,arguments)}}g.listener=listener;this.on(type,g);return this};EventEmitter.prototype.removeListener=function(type,listener){var list,position,length,i;if(!isFunction(listener))throw TypeError("listener must be a function");if(!this._events||!this._events[type])return this;list=this._events[type];length=list.length;position=-1;if(list===listener||isFunction(list.listener)&&list.listener===listener){delete this._events[type];if(this._events.removeListener)this.emit("removeListener",type,listener)}else if(isObject(list)){for(i=length;i-- >0;){if(list[i]===listener||list[i].listener&&list[i].listener===listener){position=i;break}}if(position<0)return this;if(list.length===1){list.length=0;delete this._events[type]}else{list.splice(position,1)}if(this._events.removeListener)this.emit("removeListener",type,listener)}return this};EventEmitter.prototype.removeAllListeners=function(type){var key,listeners;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[type])delete this._events[type];return this}if(arguments.length===0){for(key in this._events){if(key==="removeListener")continue;this.removeAllListeners(key)}this.removeAllListeners("removeListener");this._events={};return this}listeners=this._events[type];if(isFunction(listeners)){this.removeListener(type,listeners)}else if(listeners){while(listeners.length)this.removeListener(type,listeners[listeners.length-1])}delete this._events[type];return this};EventEmitter.prototype.listeners=function(type){var ret;if(!this._events||!this._events[type])ret=[];else if(isFunction(this._events[type]))ret=[this._events[type]];else ret=this._events[type].slice();return ret};EventEmitter.prototype.listenerCount=function(type){if(this._events){var evlistener=this._events[type];if(isFunction(evlistener))return 1;else if(evlistener)return evlistener.length}return 0};EventEmitter.listenerCount=function(emitter,type){return emitter.listenerCount(type)};function isFunction(arg){return typeof arg==="function"}function isNumber(arg){return typeof arg==="number"}function isObject(arg){return typeof arg==="object"&&arg!==null}function isUndefined(arg){return arg===void 0}},{}],2:[function(require,module,exports){var UA,browser,mode,platform,ua;ua=navigator.userAgent.toLowerCase();platform=navigator.platform.toLowerCase();UA=ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/)||[null,"unknown",0];mode=UA[1]==="ie"&&document.documentMode;browser={name:UA[1]==="version"?UA[3]:UA[1],version:mode||parseFloat(UA[1]==="opera"&&UA[4]?UA[4]:UA[2]),platform:{name:ua.match(/ip(?:ad|od|hone)/)?"ios":(ua.match(/(?:webos|android)/)||platform.match(/mac|win|linux/)||["other"])[0]}};browser[browser.name]=true;browser[browser.name+parseInt(browser.version,10)]=true;browser.platform[browser.platform.name]=true;module.exports=browser},{}],3:[function(require,module,exports){var EventEmitter,GIF,browser,extend=function(child,parent){for(var key in parent){if(hasProp.call(parent,key))child[key]=parent[key]}function ctor(){this.constructor=child}ctor.prototype=parent.prototype;child.prototype=new ctor;child.__super__=parent.prototype;return child},hasProp={}.hasOwnProperty,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;iref;i=0<=ref?++j:--j){results.push(null)}return results}.call(this);numWorkers=this.spawnWorkers();if(this.options.globalPalette===true){this.renderNextFrame()}else{for(i=j=0,ref=numWorkers;0<=ref?jref;i=0<=ref?++j:--j){this.renderNextFrame()}}this.emit("start");return this.emit("progress",0)};GIF.prototype.abort=function(){var worker;while(true){worker=this.activeWorkers.shift();if(worker==null){break}this.log("killing active worker");worker.terminate()}this.running=false;return this.emit("abort")};GIF.prototype.spawnWorkers=function(){var j,numWorkers,ref,results;numWorkers=Math.min(this.options.workers,this.frames.length);(function(){results=[];for(var j=ref=this.freeWorkers.length;ref<=numWorkers?jnumWorkers;ref<=numWorkers?j++:j--){results.push(j)}return results}).apply(this).forEach(function(_this){return function(i){var worker;_this.log("spawning worker "+i);worker=new Worker(_this.options.workerScript);worker.onmessage=function(event){_this.activeWorkers.splice(_this.activeWorkers.indexOf(worker),1);_this.freeWorkers.push(worker);return _this.frameFinished(event.data)};return _this.freeWorkers.push(worker)}}(this));return numWorkers};GIF.prototype.frameFinished=function(frame){var i,j,ref;this.log("frame "+frame.index+" finished - "+this.activeWorkers.length+" active");this.finishedFrames++;this.emit("progress",this.finishedFrames/this.frames.length);this.imageParts[frame.index]=frame;if(this.options.globalPalette===true){this.options.globalPalette=frame.globalPalette;this.log("global palette analyzed");if(this.frames.length>2){for(i=j=1,ref=this.freeWorkers.length;1<=ref?jref;i=1<=ref?++j:--j){this.renderNextFrame()}}}if(indexOf.call(this.imageParts,null)>=0){return this.renderNextFrame()}else{return this.finishRendering()}};GIF.prototype.finishRendering=function(){var data,frame,i,image,j,k,l,len,len1,len2,len3,offset,page,ref,ref1,ref2;len=0;ref=this.imageParts;for(j=0,len1=ref.length;j=this.frames.length){return}frame=this.frames[this.nextFrame++];worker=this.freeWorkers.shift();task=this.getTask(frame);this.log("starting frame "+(task.index+1)+" of "+this.frames.length);this.activeWorkers.push(worker);return worker.postMessage(task)};GIF.prototype.getContextData=function(ctx){return ctx.getImageData(0,0,this.options.width,this.options.height).data};GIF.prototype.getImageData=function(image){var ctx;if(this._canvas==null){this._canvas=document.createElement("canvas");this._canvas.width=this.options.width;this._canvas.height=this.options.height}ctx=this._canvas.getContext("2d");ctx.setFill=this.options.background;ctx.fillRect(0,0,this.options.width,this.options.height);ctx.drawImage(image,0,0);return this.getContextData(ctx)};GIF.prototype.getTask=function(frame){var index,task;index=this.frames.indexOf(frame);task={index:index,last:index===this.frames.length-1,delay:frame.delay,transparent:frame.transparent,width:this.options.width,height:this.options.height,quality:this.options.quality,dither:this.options.dither,globalPalette:this.options.globalPalette,repeat:this.options.repeat,canTransfer:browser.name==="chrome"};if(frame.data!=null){task.data=frame.data}else if(frame.context!=null){task.data=this.getContextData(frame.context)}else if(frame.image!=null){task.data=this.getImageData(frame.image)}else{throw new Error("Invalid frame")}return task};GIF.prototype.log=function(){var args;args=1<=arguments.length?slice.call(arguments,0):[];if(!this.options.debug){return}return console.log.apply(console,args)};return GIF}(EventEmitter);module.exports=GIF},{"./browser.coffee":2,events:1}]},{},[3])(3)}); 3 | //# sourceMappingURL=gif.js.map 4 | -------------------------------------------------------------------------------- /src/assets/iconfont/demo.css: -------------------------------------------------------------------------------- 1 | /* Logo 字体 */ 2 | @font-face { 3 | font-family: "iconfont logo"; 4 | src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); 5 | src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), 6 | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), 7 | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), 8 | url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); 9 | } 10 | 11 | .logo { 12 | font-family: "iconfont logo"; 13 | font-size: 160px; 14 | font-style: normal; 15 | -webkit-font-smoothing: antialiased; 16 | -moz-osx-font-smoothing: grayscale; 17 | } 18 | 19 | /* tabs */ 20 | .nav-tabs { 21 | position: relative; 22 | } 23 | 24 | .nav-tabs .nav-more { 25 | position: absolute; 26 | right: 0; 27 | bottom: 0; 28 | height: 42px; 29 | line-height: 42px; 30 | color: #666; 31 | } 32 | 33 | #tabs { 34 | border-bottom: 1px solid #eee; 35 | } 36 | 37 | #tabs li { 38 | cursor: pointer; 39 | width: 100px; 40 | height: 40px; 41 | line-height: 40px; 42 | text-align: center; 43 | font-size: 16px; 44 | border-bottom: 2px solid transparent; 45 | position: relative; 46 | z-index: 1; 47 | margin-bottom: -1px; 48 | color: #666; 49 | } 50 | 51 | 52 | #tabs .active { 53 | border-bottom-color: #f00; 54 | color: #222; 55 | } 56 | 57 | .tab-container .content { 58 | display: none; 59 | } 60 | 61 | /* 页面布局 */ 62 | .main { 63 | padding: 30px 100px; 64 | width: 960px; 65 | margin: 0 auto; 66 | } 67 | 68 | .main .logo { 69 | color: #333; 70 | text-align: left; 71 | margin-bottom: 30px; 72 | line-height: 1; 73 | height: 110px; 74 | margin-top: -50px; 75 | overflow: hidden; 76 | *zoom: 1; 77 | } 78 | 79 | .main .logo a { 80 | font-size: 160px; 81 | color: #333; 82 | } 83 | 84 | .helps { 85 | margin-top: 40px; 86 | } 87 | 88 | .helps pre { 89 | padding: 20px; 90 | margin: 10px 0; 91 | border: solid 1px #e7e1cd; 92 | background-color: #fffdef; 93 | overflow: auto; 94 | } 95 | 96 | .icon_lists { 97 | width: 100% !important; 98 | overflow: hidden; 99 | *zoom: 1; 100 | } 101 | 102 | .icon_lists li { 103 | width: 100px; 104 | margin-bottom: 10px; 105 | margin-right: 20px; 106 | text-align: center; 107 | list-style: none !important; 108 | cursor: default; 109 | } 110 | 111 | .icon_lists li .code-name { 112 | line-height: 1.2; 113 | } 114 | 115 | .icon_lists .icon { 116 | display: block; 117 | height: 100px; 118 | line-height: 100px; 119 | font-size: 42px; 120 | margin: 10px auto; 121 | color: #333; 122 | -webkit-transition: font-size 0.25s linear, width 0.25s linear; 123 | -moz-transition: font-size 0.25s linear, width 0.25s linear; 124 | transition: font-size 0.25s linear, width 0.25s linear; 125 | } 126 | 127 | .icon_lists .icon:hover { 128 | font-size: 100px; 129 | } 130 | 131 | .icon_lists .svg-icon { 132 | /* 通过设置 font-size 来改变图标大小 */ 133 | width: 1em; 134 | /* 图标和文字相邻时,垂直对齐 */ 135 | vertical-align: -0.15em; 136 | /* 通过设置 color 来改变 SVG 的颜色/fill */ 137 | fill: currentColor; 138 | /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 139 | normalize.css 中也包含这行 */ 140 | overflow: hidden; 141 | } 142 | 143 | .icon_lists li .name, 144 | .icon_lists li .code-name { 145 | color: #666; 146 | } 147 | 148 | /* markdown 样式 */ 149 | .markdown { 150 | color: #666; 151 | font-size: 14px; 152 | line-height: 1.8; 153 | } 154 | 155 | .highlight { 156 | line-height: 1.5; 157 | } 158 | 159 | .markdown img { 160 | vertical-align: middle; 161 | max-width: 100%; 162 | } 163 | 164 | .markdown h1 { 165 | color: #404040; 166 | font-weight: 500; 167 | line-height: 40px; 168 | margin-bottom: 24px; 169 | } 170 | 171 | .markdown h2, 172 | .markdown h3, 173 | .markdown h4, 174 | .markdown h5, 175 | .markdown h6 { 176 | color: #404040; 177 | margin: 1.6em 0 0.6em 0; 178 | font-weight: 500; 179 | clear: both; 180 | } 181 | 182 | .markdown h1 { 183 | font-size: 28px; 184 | } 185 | 186 | .markdown h2 { 187 | font-size: 22px; 188 | } 189 | 190 | .markdown h3 { 191 | font-size: 16px; 192 | } 193 | 194 | .markdown h4 { 195 | font-size: 14px; 196 | } 197 | 198 | .markdown h5 { 199 | font-size: 12px; 200 | } 201 | 202 | .markdown h6 { 203 | font-size: 12px; 204 | } 205 | 206 | .markdown hr { 207 | height: 1px; 208 | border: 0; 209 | background: #e9e9e9; 210 | margin: 16px 0; 211 | clear: both; 212 | } 213 | 214 | .markdown p { 215 | margin: 1em 0; 216 | } 217 | 218 | .markdown>p, 219 | .markdown>blockquote, 220 | .markdown>.highlight, 221 | .markdown>ol, 222 | .markdown>ul { 223 | width: 80%; 224 | } 225 | 226 | .markdown ul>li { 227 | list-style: circle; 228 | } 229 | 230 | .markdown>ul li, 231 | .markdown blockquote ul>li { 232 | margin-left: 20px; 233 | padding-left: 4px; 234 | } 235 | 236 | .markdown>ul li p, 237 | .markdown>ol li p { 238 | margin: 0.6em 0; 239 | } 240 | 241 | .markdown ol>li { 242 | list-style: decimal; 243 | } 244 | 245 | .markdown>ol li, 246 | .markdown blockquote ol>li { 247 | margin-left: 20px; 248 | padding-left: 4px; 249 | } 250 | 251 | .markdown code { 252 | margin: 0 3px; 253 | padding: 0 5px; 254 | background: #eee; 255 | border-radius: 3px; 256 | } 257 | 258 | .markdown strong, 259 | .markdown b { 260 | font-weight: 600; 261 | } 262 | 263 | .markdown>table { 264 | border-collapse: collapse; 265 | border-spacing: 0px; 266 | empty-cells: show; 267 | border: 1px solid #e9e9e9; 268 | width: 95%; 269 | margin-bottom: 24px; 270 | } 271 | 272 | .markdown>table th { 273 | white-space: nowrap; 274 | color: #333; 275 | font-weight: 600; 276 | } 277 | 278 | .markdown>table th, 279 | .markdown>table td { 280 | border: 1px solid #e9e9e9; 281 | padding: 8px 16px; 282 | text-align: left; 283 | } 284 | 285 | .markdown>table th { 286 | background: #F7F7F7; 287 | } 288 | 289 | .markdown blockquote { 290 | font-size: 90%; 291 | color: #999; 292 | border-left: 4px solid #e9e9e9; 293 | padding-left: 0.8em; 294 | margin: 1em 0; 295 | } 296 | 297 | .markdown blockquote p { 298 | margin: 0; 299 | } 300 | 301 | .markdown .anchor { 302 | opacity: 0; 303 | transition: opacity 0.3s ease; 304 | margin-left: 8px; 305 | } 306 | 307 | .markdown .waiting { 308 | color: #ccc; 309 | } 310 | 311 | .markdown h1:hover .anchor, 312 | .markdown h2:hover .anchor, 313 | .markdown h3:hover .anchor, 314 | .markdown h4:hover .anchor, 315 | .markdown h5:hover .anchor, 316 | .markdown h6:hover .anchor { 317 | opacity: 1; 318 | display: inline-block; 319 | } 320 | 321 | .markdown>br, 322 | .markdown>p>br { 323 | clear: both; 324 | } 325 | 326 | 327 | .hljs { 328 | display: block; 329 | background: white; 330 | padding: 0.5em; 331 | color: #333333; 332 | overflow-x: auto; 333 | } 334 | 335 | .hljs-comment, 336 | .hljs-meta { 337 | color: #969896; 338 | } 339 | 340 | .hljs-string, 341 | .hljs-variable, 342 | .hljs-template-variable, 343 | .hljs-strong, 344 | .hljs-emphasis, 345 | .hljs-quote { 346 | color: #df5000; 347 | } 348 | 349 | .hljs-keyword, 350 | .hljs-selector-tag, 351 | .hljs-type { 352 | color: #a71d5d; 353 | } 354 | 355 | .hljs-literal, 356 | .hljs-symbol, 357 | .hljs-bullet, 358 | .hljs-attribute { 359 | color: #0086b3; 360 | } 361 | 362 | .hljs-section, 363 | .hljs-name { 364 | color: #63a35c; 365 | } 366 | 367 | .hljs-tag { 368 | color: #333333; 369 | } 370 | 371 | .hljs-title, 372 | .hljs-attr, 373 | .hljs-selector-id, 374 | .hljs-selector-class, 375 | .hljs-selector-attr, 376 | .hljs-selector-pseudo { 377 | color: #795da3; 378 | } 379 | 380 | .hljs-addition { 381 | color: #55a532; 382 | background-color: #eaffea; 383 | } 384 | 385 | .hljs-deletion { 386 | color: #bd2c00; 387 | background-color: #ffecec; 388 | } 389 | 390 | .hljs-link { 391 | text-decoration: underline; 392 | } 393 | 394 | /* 代码高亮 */ 395 | /* PrismJS 1.15.0 396 | https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ 397 | /** 398 | * prism.js default theme for JavaScript, CSS and HTML 399 | * Based on dabblet (http://dabblet.com) 400 | * @author Lea Verou 401 | */ 402 | code[class*="language-"], 403 | pre[class*="language-"] { 404 | color: black; 405 | background: none; 406 | text-shadow: 0 1px white; 407 | font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; 408 | text-align: left; 409 | white-space: pre; 410 | word-spacing: normal; 411 | word-break: normal; 412 | word-wrap: normal; 413 | line-height: 1.5; 414 | 415 | -moz-tab-size: 4; 416 | -o-tab-size: 4; 417 | tab-size: 4; 418 | 419 | -webkit-hyphens: none; 420 | -moz-hyphens: none; 421 | -ms-hyphens: none; 422 | hyphens: none; 423 | } 424 | 425 | pre[class*="language-"]::-moz-selection, 426 | pre[class*="language-"] ::-moz-selection, 427 | code[class*="language-"]::-moz-selection, 428 | code[class*="language-"] ::-moz-selection { 429 | text-shadow: none; 430 | background: #b3d4fc; 431 | } 432 | 433 | pre[class*="language-"]::selection, 434 | pre[class*="language-"] ::selection, 435 | code[class*="language-"]::selection, 436 | code[class*="language-"] ::selection { 437 | text-shadow: none; 438 | background: #b3d4fc; 439 | } 440 | 441 | @media print { 442 | 443 | code[class*="language-"], 444 | pre[class*="language-"] { 445 | text-shadow: none; 446 | } 447 | } 448 | 449 | /* Code blocks */ 450 | pre[class*="language-"] { 451 | padding: 1em; 452 | margin: .5em 0; 453 | overflow: auto; 454 | } 455 | 456 | :not(pre)>code[class*="language-"], 457 | pre[class*="language-"] { 458 | background: #f5f2f0; 459 | } 460 | 461 | /* Inline code */ 462 | :not(pre)>code[class*="language-"] { 463 | padding: .1em; 464 | border-radius: .3em; 465 | white-space: normal; 466 | } 467 | 468 | .token.comment, 469 | .token.prolog, 470 | .token.doctype, 471 | .token.cdata { 472 | color: slategray; 473 | } 474 | 475 | .token.punctuation { 476 | color: #999; 477 | } 478 | 479 | .namespace { 480 | opacity: .7; 481 | } 482 | 483 | .token.property, 484 | .token.tag, 485 | .token.boolean, 486 | .token.number, 487 | .token.constant, 488 | .token.symbol, 489 | .token.deleted { 490 | color: #905; 491 | } 492 | 493 | .token.selector, 494 | .token.attr-name, 495 | .token.string, 496 | .token.char, 497 | .token.builtin, 498 | .token.inserted { 499 | color: #690; 500 | } 501 | 502 | .token.operator, 503 | .token.entity, 504 | .token.url, 505 | .language-css .token.string, 506 | .style .token.string { 507 | color: #9a6e3a; 508 | background: hsla(0, 0%, 100%, .5); 509 | } 510 | 511 | .token.atrule, 512 | .token.attr-value, 513 | .token.keyword { 514 | color: #07a; 515 | } 516 | 517 | .token.function, 518 | .token.class-name { 519 | color: #DD4A68; 520 | } 521 | 522 | .token.regex, 523 | .token.important, 524 | .token.variable { 525 | color: #e90; 526 | } 527 | 528 | .token.important, 529 | .token.bold { 530 | font-weight: bold; 531 | } 532 | 533 | .token.italic { 534 | font-style: italic; 535 | } 536 | 537 | .token.entity { 538 | cursor: help; 539 | } 540 | -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/src/assets/iconfont/iconfont.eot -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/src/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/src/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/assets/iconfont/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/src/assets/iconfont/iconfont.woff2 -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dream-num/LuckyBabylon/76c3364280a0b372c4bc7f23dc005b88a8cbf2da/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/spectrum/spectrum.min.css: -------------------------------------------------------------------------------- 1 | .sp-container{position:absolute;top:0;left:0;display:inline-block;*display:inline;*zoom:1;z-index:9999994;overflow:hidden}.sp-container.sp-flat{position:relative}.sp-container,.sp-container *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.sp-top{position:relative;width:100%;display:inline-block}.sp-top-inner{position:absolute;top:0;left:0;bottom:0;right:0}.sp-color{position:absolute;top:0;left:0;bottom:0;right:20%}.sp-hue{position:absolute;top:0;right:0;bottom:0;left:84%;height:100%}.sp-clear-enabled .sp-hue{top:33px;height:77.5%}.sp-fill{padding-top:80%}.sp-sat,.sp-val{position:absolute;top:0;left:0;right:0;bottom:0}.sp-alpha-enabled .sp-top{margin-bottom:18px}.sp-alpha-enabled .sp-alpha{display:block}.sp-alpha-handle{position:absolute;top:-4px;bottom:-4px;width:6px;left:50%;cursor:pointer;border:1px solid black;background:white;opacity:.8}.sp-alpha{display:none;position:absolute;bottom:-14px;right:0;left:0;height:8px}.sp-alpha-inner{border:solid 1px #333}.sp-clear{display:none}.sp-clear.sp-clear-display{background-position:center}.sp-clear-enabled .sp-clear{display:block;position:absolute;top:0;right:0;bottom:0;left:84%;height:28px}.sp-container,.sp-replacer,.sp-preview,.sp-dragger,.sp-slider,.sp-alpha,.sp-clear,.sp-alpha-handle,.sp-container.sp-dragging .sp-input,.sp-container button{-webkit-user-select:none;-moz-user-select:-moz-none;-o-user-select:none;user-select:none}.sp-container.sp-input-disabled .sp-input-container{display:none}.sp-container.sp-buttons-disabled .sp-button-container{display:none}.sp-container.sp-palette-buttons-disabled .sp-palette-button-container{display:none}.sp-palette-only .sp-picker-container{display:none}.sp-palette-disabled .sp-palette-container{display:none}.sp-initial-disabled .sp-initial{display:none}.sp-sat{background-image:-webkit-gradient(linear,0 0,100% 0,from(#FFF),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(left,#FFF,rgba(204,154,129,0));background-image:-moz-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-o-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:-ms-linear-gradient(left,#fff,rgba(204,154,129,0));background-image:linear-gradient(to right,#fff,rgba(204,154,129,0));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";filter:progid:DXImageTransform.Microsoft.gradient(GradientType = 1,startColorstr='#FFFFFFFF',endColorstr='#00CC9A81')}.sp-val{background-image:-webkit-gradient(linear,0 100%,0 0,from(#000),to(rgba(204,154,129,0)));background-image:-webkit-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-moz-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-o-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:-ms-linear-gradient(bottom,#000,rgba(204,154,129,0));background-image:linear-gradient(to top,#000,rgba(204,154,129,0));-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81',endColorstr='#FF000000')}.sp-hue{background:-moz-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:-ms-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:-o-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:-webkit-gradient(linear,left top,left bottom,from(#f00),color-stop(0.17,#ff0),color-stop(0.33,#0f0),color-stop(0.5,#0ff),color-stop(0.67,#00f),color-stop(0.83,#f0f),to(#f00));background:-webkit-linear-gradient(top,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%);background:linear-gradient(to bottom,#f00 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,#f00 100%)}.sp-1{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000',endColorstr='#ffff00')}.sp-2{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00',endColorstr='#00ff00')}.sp-3{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00',endColorstr='#00ffff')}.sp-4{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff',endColorstr='#0000ff')}.sp-5{height:16%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff',endColorstr='#ff00ff')}.sp-6{height:17%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff',endColorstr='#ff0000')}.sp-hidden{display:none !important}.sp-cf:before,.sp-cf:after{content:"";display:table}.sp-cf:after{clear:both}.sp-cf{*zoom:1}@media(max-device-width:480px){.sp-color{right:40%}.sp-hue{left:63%}.sp-fill{padding-top:60%}}.sp-dragger{border-radius:5px;height:5px;width:5px;border:1px solid #fff;background:#000;cursor:pointer;position:absolute;top:0;left:0}.sp-slider{position:absolute;top:0;cursor:pointer;height:3px;left:-1px;right:-1px;border:1px solid #000;background:white;opacity:.8}.sp-container{border-radius:0;background-color:#ececec;border:solid 1px #f0c49b;padding:0}.sp-container,.sp-container button,.sp-container input,.sp-color,.sp-hue,.sp-clear{font:normal 12px "Lucida Grande","Lucida Sans Unicode","Lucida Sans",Geneva,Verdana,sans-serif;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box}.sp-top{margin-bottom:3px}.sp-color,.sp-hue,.sp-clear{border:solid 1px #666}.sp-input-container{float:right;width:100px;margin-bottom:4px}.sp-initial-disabled .sp-input-container{width:100%}.sp-input{font-size:12px !important;border:1px inset;padding:4px 5px;margin:0;width:100%;background:transparent;border-radius:3px;color:#222}.sp-input:focus{border:1px solid orange}.sp-input.sp-validation-error{border:1px solid red;background:#fdd}.sp-picker-container,.sp-palette-container{float:left;position:relative;padding:10px;padding-bottom:300px;margin-bottom:-290px}.sp-picker-container{width:172px;border-left:solid 1px #fff}.sp-palette-container{border-right:solid 1px #ccc}.sp-palette-only .sp-palette-container{border:0}.sp-palette .sp-thumb-el{display:block;position:relative;float:left;width:24px;height:15px;margin:3px;cursor:pointer;border:solid 2px transparent}.sp-palette .sp-thumb-el:hover,.sp-palette .sp-thumb-el.sp-thumb-active{border-color:orange}.sp-thumb-el{position:relative}.sp-initial{float:left;border:solid 1px #333}.sp-initial span{width:30px;height:25px;border:0;display:block;float:left;margin:0}.sp-initial .sp-clear-display{background-position:center}.sp-palette-button-container,.sp-button-container{float:right}.sp-replacer{margin:0;overflow:hidden;cursor:pointer;padding:4px;display:inline-block;*zoom:1;*display:inline;border:solid 1px #91765d;background:#eee;color:#333;vertical-align:middle}.sp-replacer:hover,.sp-replacer.sp-active{border-color:#f0c49b;color:#111}.sp-replacer.sp-disabled{cursor:default;border-color:silver;color:silver}.sp-dd{padding:2px 0;height:16px;line-height:16px;float:left;font-size:10px}.sp-preview{position:relative;width:25px;height:20px;border:solid 1px #222;margin-right:5px;float:left;z-index:0}.sp-palette{*width:220px;max-width:220px}.sp-palette .sp-thumb-el{width:16px;height:16px;margin:2px 1px;border:solid 1px #d0d0d0}.sp-container{padding-bottom:0}.sp-container button{background-color:#eee;background-image:-webkit-linear-gradient(top,#eee,#ccc);background-image:-moz-linear-gradient(top,#eee,#ccc);background-image:-ms-linear-gradient(top,#eee,#ccc);background-image:-o-linear-gradient(top,#eee,#ccc);background-image:linear-gradient(to bottom,#eee,#ccc);border:1px solid #ccc;border-bottom:1px solid #bbb;border-radius:3px;color:#333;font-size:14px;line-height:1;padding:5px 4px;text-align:center;text-shadow:0 1px 0 #eee;vertical-align:middle}.sp-container button:hover{background-color:#ddd;background-image:-webkit-linear-gradient(top,#ddd,#bbb);background-image:-moz-linear-gradient(top,#ddd,#bbb);background-image:-ms-linear-gradient(top,#ddd,#bbb);background-image:-o-linear-gradient(top,#ddd,#bbb);background-image:linear-gradient(to bottom,#ddd,#bbb);border:1px solid #bbb;border-bottom:1px solid #999;cursor:pointer;text-shadow:0 1px 0 #ddd}.sp-container button:active{border:1px solid #aaa;border-bottom:1px solid #888;-webkit-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-moz-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-ms-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;-o-box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee;box-shadow:inset 0 0 5px 2px #aaa,0 1px 0 0 #eee}.sp-cancel{font-size:11px;color:#d93f3f !important;margin:0;padding:2px;margin-right:5px;vertical-align:middle;text-decoration:none}.sp-cancel:hover{color:#d93f3f !important;text-decoration:underline}.sp-palette span:hover,.sp-palette span.sp-thumb-active{border-color:#000}.sp-preview,.sp-alpha,.sp-thumb-el{position:relative;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.sp-preview-inner,.sp-alpha-inner,.sp-thumb-inner{display:block;position:absolute;top:0;left:0;bottom:0;right:0}.sp-palette .sp-thumb-inner{background-position:50% 50%;background-repeat:no-repeat}.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=)}.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=)}.sp-clear-display{background-repeat:no-repeat;background-position:center;background-image:url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==)} -------------------------------------------------------------------------------- /src/canvas/babylon.font.mjs: -------------------------------------------------------------------------------- 1 | const ID_OFFSET=-8,SIZE_OFFSET=-4,ARRAYBUFFER_ID=0,STRING_ID=1,ARRAYBUFFERVIEW=1,ARRAY=2,VAL_ALIGN_OFFSET=5,VAL_SIGNED=1024,VAL_FLOAT=2048,VAL_MANAGED=8192,ARRAYBUFFERVIEW_BUFFER_OFFSET=0,ARRAYBUFFERVIEW_DATASTART_OFFSET=4,ARRAYBUFFERVIEW_DATALENGTH_OFFSET=8,ARRAYBUFFERVIEW_SIZE=12,ARRAY_LENGTH_OFFSET=12,ARRAY_SIZE=16,BIGINT="undefined"!=typeof BigUint64Array,THIS=Symbol(),CHUNKSIZE=1024;function getStringImpl(a,b){var c=String.fromCharCode;const d=new Uint32Array(a),e=new Uint16Array(a);var f=d[b+SIZE_OFFSET>>>2]>>>1,g=b>>>1;if(f<=CHUNKSIZE)return c.apply(String,e.subarray(g,g+f));const h=[];do{const a=e[g+CHUNKSIZE-1],b=55296<=a&&56320>a?CHUNKSIZE-1:CHUNKSIZE;h.push(c.apply(String,e.subarray(g,g+=b))),f-=b}while(f>CHUNKSIZE);return h.join("")+c.apply(String,e.subarray(g,g+f))}function preInstantiate(a){function b(a,b){return a?getStringImpl(a.buffer,b):""}const c={},d=a.env=a.env||{};return d.abort=d.abort||function(a,e,f,g){const h=c.memory||d.memory;throw Error("abort: "+b(h,a)+" at "+b(h,e)+":"+f+":"+g)},d.trace=d.trace||function(a,e){const f=c.memory||d.memory;console.log("trace: "+b(f,a)+(e?" ":"")+Array.prototype.slice.call(arguments,2,2+e).join(", "))},a.Math=a.Math||Math,a.Date=a.Date||Date,c}function postInstantiate(a,b){function c(a){const b=new Uint32Array(j.buffer),c=b[n>>>2];if((a>>>=0)>=c)throw Error("invalid id: "+a);return b[(n+4>>>2)+2*a]}function d(a){const b=new Uint32Array(j.buffer),c=b[n>>>2];if((a>>>=0)>=c)throw Error("invalid id: "+a);return b[(n+4>>>2)+2*a+1]}function e(a){var b=Math.clz32;return 31-b(31&a>>>VAL_ALIGN_OFFSET)}function f(a,b,c){const d=j.buffer;if(c)switch(a){case 2:return new Float32Array(d);case 3:return new Float64Array(d);}else switch(a){case 0:return new(b?Int8Array:Uint8Array)(d);case 1:return new(b?Int16Array:Uint16Array)(d);case 2:return new(b?Int32Array:Uint32Array)(d);case 3:return new(b?BigInt64Array:BigUint64Array)(d);}throw Error("unsupported align: "+a)}function g(a){const b=new Uint32Array(j.buffer),d=b[a+ID_OFFSET>>>2],g=c(d);if(!(g&ARRAYBUFFERVIEW))throw Error("not an array: "+d);const h=e(g);var i=b[a+ARRAYBUFFERVIEW_DATASTART_OFFSET>>>2];const k=g&ARRAY?b[a+ARRAY_LENGTH_OFFSET>>>2]:b[i+SIZE_OFFSET>>>2]>>>h;return f(h,g&VAL_SIGNED,g&VAL_FLOAT).subarray(i>>>=h,i+k)}function h(a,b,c){const d=j.buffer,e=new Uint32Array(d),f=e[c+ARRAYBUFFERVIEW_DATASTART_OFFSET>>>2];return new a(d,f,e[f+SIZE_OFFSET>>>2]>>>b)}const i=b.exports,j=i.memory,k=i.table,l=i.__alloc,m=i.__retain,n=i.__rtti_base||-1;return a.__allocString=function(a){const b=a.length,c=l(b<<1,STRING_ID),d=new Uint16Array(j.buffer);for(var e=0;e>>1)+e]=a.charCodeAt(e);return c},a.__getString=function(a){const b=j.buffer,c=new Uint32Array(b)[a+ID_OFFSET>>>2];if(c!==STRING_ID)throw Error("not a string: "+a);return getStringImpl(b,a)},a.__allocArray=function(a,b){const d=c(a);if(!(d&(ARRAYBUFFERVIEW|ARRAY)))throw Error("not an array: "+a+" @ "+d);const g=e(d),h=b.length,k=l(h<>>2]=m(k),o[n+ARRAYBUFFERVIEW_DATASTART_OFFSET>>>2]=k,o[n+ARRAYBUFFERVIEW_DATALENGTH_OFFSET>>>2]=h<>>2]=h);const p=f(g,d&VAL_SIGNED,d&VAL_FLOAT);if(d&VAL_MANAGED)for(let a=0;a>>g)+a]=m(b[a]);else p.set(b,k>>>g);return n},a.__getArrayView=g,a.__getArray=function(a){const b=g(a),c=b.length,d=Array(c);for(let e=0;e>>2];return b.slice(a,a+c)},a.__getInt8Array=h.bind(null,Int8Array,0),a.__getUint8Array=h.bind(null,Uint8Array,0),a.__getUint8ClampedArray=h.bind(null,Uint8ClampedArray,0),a.__getInt16Array=h.bind(null,Int16Array,1),a.__getUint16Array=h.bind(null,Uint16Array,1),a.__getInt32Array=h.bind(null,Int32Array,2),a.__getUint32Array=h.bind(null,Uint32Array,2),BIGINT&&(a.__getInt64Array=h.bind(null,BigInt64Array,3),a.__getUint64Array=h.bind(null,BigUint64Array,3)),a.__getFloat32Array=h.bind(null,Float32Array,2),a.__getFloat64Array=h.bind(null,Float64Array,3),a.__instanceof=function(a,b){const c=new Uint32Array(j.buffer);var e=c[a+ID_OFFSET>>>2];if(e<=c[n>>>2])do if(e==b)return!0;while(e=d(e));return!1},a.memory=a.memory||j,a.table=a.table||k,demangle(i,a)}function wrapFunction(a,b){var c=(...c)=>(b(c.length),a(...c));return c.original=a,c}function isResponse(a){return"undefined"!=typeof Response&&a instanceof Response}async function instantiate(a,b){return isResponse(a=await a)?instantiateStreaming(a,b):postInstantiate(preInstantiate(b||(b={})),(await WebAssembly.instantiate(a instanceof WebAssembly.Module?a:await WebAssembly.compile(a),b)))}async function instantiateStreaming(a,b){return WebAssembly.instantiateStreaming?postInstantiate(preInstantiate(b||(b={})),(await WebAssembly.instantiateStreaming(a,b)).instance):instantiate(isResponse(a=await a)?a.arrayBuffer():a,b)}var instantiateStreaming_1=instantiateStreaming;function demangle(a,b){function c(a,b){return Object.prototype.hasOwnProperty.call(a,b)}var d=b?Object.create(b):{},e=a.__setargc||function(){};for(let f in a){if(!c(a,f))continue;let b=a[f],g=f.split("."),h=d;for(;1Object.defineProperty(a,b,Object.getOwnPropertyDescriptor(g,b))),h[d]=a}if(i=i.substring(j+1),h=h[d].prototype,!/^(get|set):/.test(i))"constructor"===i?h[i]=wrapFunction(b,e):Object.defineProperty(h,i,{value:function(...a){return e(a.length),b(this[THIS],...a)}});else if(!c(h,i=i.substring(4))){let b=a[f.replace("set:","get:")],c=a[f.replace("get:","set:")];Object.defineProperty(h,i,{get:function(){return b(this[THIS])},set:function(a){c(this[THIS],a)},enumerable:!0})}}else /^(get|set):/.test(i)?!c(h,i=i.substring(4))&&Object.defineProperty(h,i,{get:a[f.replace("set:","get:")],set:a[f.replace("get:","set:")],enumerable:!0}):"function"==typeof b?h[i]=wrapFunction(b,e):h[i]=b}return d}class Compiler{constructor(a){this.wasm=a}static async Build(a){const b={env:{abort(a,b,c,d){console.error("abort called at"+c+":"+d)}}},c=await instantiateStreaming_1(fetch(a),b);return new Compiler(c)}encode(a,b){const c=new DataView(b);let d=0,e=0,f=0;for(const g of a){let a=g.type.codePointAt(0);c.setUint8(d,a),d++;a===77||a===76?(c.setFloat64(d,g.x,!0),d+=8,c.setFloat64(d,g.y,!0),d+=8,e=g.x,f=g.y):a===81?(c.setFloat64(d,e,!0),d+=8,c.setFloat64(d,f,!0),d+=8,c.setFloat64(d,g.x1,!0),d+=8,c.setFloat64(d,g.y1,!0),d+=8,c.setFloat64(d,g.x,!0),d+=8,c.setFloat64(d,g.y,!0),d+=8,e=g.x,f=g.y):a===67?(c.setFloat64(d,e,!0),d+=8,c.setFloat64(d,f,!0),d+=8,c.setFloat64(d,g.x1,!0),d+=8,c.setFloat64(d,g.y1,!0),d+=8,c.setFloat64(d,g.x2,!0),d+=8,c.setFloat64(d,g.y2,!0),d+=8,c.setFloat64(d,g.x,!0),d+=8,c.setFloat64(d,g.y,!0),d+=8,e=g.x,f=g.y):void 0}return d}compileEncoded(a,b,c,d,e){var f=Math.abs,g=Math.max,h=Math.min,i=Math.round;if(d=g(0,h(255,i(d))),e=f(e),a!==this.wasm.memory.buffer){const b=this.wasm.memory.buffer;for(let c=0,d=a.byteLength;c>>3)+0],k[(a>>>3)+1]])}m[f]=a}return m}compile(a,b,c,d){const e=this.wasm.memory.buffer,f=this.encode(a,this.wasm.memory.buffer);return this.compileEncoded(e,f,b,c,d)}}class Font{constructor(a,b){this.raw=a,this.compiler=b}static async Install(a,b){const c=await opentypeLoadAsync(a);return new Font(c,b)}static Measure(a,b,c){return new Metrics(a,b,c)}static Compile(a,b,c,d,e){const f=a.raw.getPath(b,0,0,c).commands,g=a.raw.outlinesFormat,h=a.compiler.compile(f,g,d,e*c),i=([a,b])=>new BABYLON.Vector3(a,0,-b),j=[];for(const{fill:f,holes:g}of h){const a={fill:f.map(i),holes:g.map(a=>a.map(i))};j.push(a)}return j}static BuildMesh(a,b,c){const d=[];for(const{fill:e,holes:f}of a){const a=BABYLON.MeshBuilder.CreatePolygon("",{...b,shape:e,holes:f},c);d.push(a)}return 0{opentype.load(a,(a,d)=>{a?c(a):b(d)})})}export{Compiler,Font}; 2 | //# sourceMappingURL=babylon.font.mjs.map 3 | -------------------------------------------------------------------------------- /src/canvas/common.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 导出整个fabricPlus,方法调用 f.notActiveStyle(); 3 | * -- import * as f from '@/canvas/fabricPlus' 4 | * 5 | * 导出单个方法 ,方法调用notActiveStyle(); 6 | * import {notActiveStyle} as f from '@/canvas/fabricPlus' 7 | * */ 8 | 9 | //fabric对象转json对象 10 | import store from '@/store/index.js'; 11 | import {commonSpace,pageSpace,commonUpdate,commonGet} from '@/store/mutations/mutation-types' 12 | 13 | 14 | const canvasId = 'sliderCanvas'; 15 | const scrollx = 'msMidScrollx'; 16 | const scrolly = 'msMidScrolly'; 17 | 18 | 19 | /** 20 | * 编辑图片,编辑元件 21 | * @param {*} objects 22 | * @param {*} objHanddle 23 | */ 24 | function notActiveStyle(objects, objHanddle) { 25 | let sliderCanvas = getCanvas(); 26 | let showviewportBorder = sliderCanvas._objects[0]; 27 | let allobjects = sliderCanvas.getObjects(); 28 | for (let i = 0; i < allobjects.length; i++) { 29 | let obj = allobjects[i]; 30 | let isMatch = checkInObjects(obj, objects); 31 | 32 | if (!isMatch && obj != showviewportBorder) { 33 | if (typeof objHanddle == 'function') { 34 | objHanddle(obj); 35 | } 36 | //obj.set({"opacity": obj.get("opacityC"), "selectable":true}); 37 | } 38 | } 39 | } 40 | 41 | /** 42 | * 判断一个对象obj是否在数组objects中 43 | * @param {*} obj 44 | * @param {*} objects 45 | */ 46 | function checkInObjects(obj, objects) { 47 | let isMatch = false; 48 | for (let x = 0; x < objects.length; x++) { 49 | let ac = objects[x]; 50 | if (obj == ac) { 51 | isMatch = true; 52 | break; 53 | } 54 | } 55 | return isMatch; 56 | } 57 | 58 | /** 59 | * 生成随机的图表id 60 | * @param {*} prefix 61 | */ 62 | function generateRandomKey(prefix) { 63 | if (prefix == null) { 64 | prefix = 'page'; 65 | } 66 | 67 | let userAgent = window.navigator.userAgent 68 | .replace(/[^a-zA-Z0-9]/g, '') 69 | .split(''); 70 | let mid = ''; 71 | for (let i = 0; i < 12; i++) { 72 | mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))]; 73 | } 74 | let time = new Date().getTime(); 75 | 76 | return prefix + '_' + mid + '_' + time; 77 | } 78 | 79 | /** 80 | * 取得组件随机位置 81 | * @param {*} type 82 | */ 83 | function getRandomPosition(type) { 84 | let center = getViewAbsoluteXY(); 85 | return { 86 | left: center.width / 2, 87 | top: center.height / 2, 88 | }; 89 | } 90 | 91 | /** 92 | * 获取当前页面的最大Zindex 93 | */ 94 | function getCurPageIndexMax() { 95 | let curPageObjects = store.state.page.curPage.objects; 96 | 97 | if(curPageObjects.size === 0){ 98 | return 0; 99 | } 100 | 101 | let max = -Infinity; 102 | for (let object of curPageObjects.values()) { 103 | let index = object.mszIndex; 104 | if (max < index) { 105 | max = index; 106 | } 107 | } 108 | return max; 109 | } 110 | 111 | //处理主画布的interactive/selection/selectable状态 112 | function banCanvasInteract(state) { 113 | if (state == null) { 114 | state = false; 115 | } 116 | let canvas = getCanvas(); 117 | //console.log(state); 118 | canvas.interactive = state; 119 | canvas.selection = state; 120 | canvas.selectable = state; 121 | 122 | let sliderCanvas = getCanvas(); 123 | sliderCanvas.forEachObject(function(object){ 124 | if(object!=sliderCanvas.showviewportBorder){ 125 | object.set("evented", state); 126 | } 127 | }); 128 | canvas.requestRenderAll(); 129 | } 130 | 131 | /** 132 | * 获取画布相关位置信息 133 | */ 134 | function getViewAbsoluteXY() { 135 | let viewOriginX = store.state.common.canvasSetting.viewOriginX, 136 | viewOriginY = store.state.common.canvasSetting.viewOriginY, 137 | curzoom = store.state.common.canvasSetting.curzoom, 138 | viewCanvasWidth = store.state.common.canvasSetting.viewWidth, 139 | viewCanvasHeight = store.state.common.canvasSetting.viewHeight; 140 | // param = _this.calMoveParam(), 141 | // center = _this.sliderCanvas.getCenter(), 142 | // vf = _this.sliderCanvas.viewportTransform, 143 | // centerfix = fabric.util.transformPoint(new fabric.Point(center.left, center.top), vf), 144 | // centerLeft = centerfix.x, 145 | // centerTop = centerfix.y, 146 | 147 | // viewCanvasWidth = _this.$store.state.curPage.viewCanvasWidth, 148 | // viewCanvasHeight = _this.$store.state.curPage.viewCanvasHeight, 149 | // viewW = viewCanvasWidth, 150 | // viewH = viewCanvasHeight; 151 | // if(viewCanvasWidth > this.sliderCanvasParentW){ 152 | // centerLeft += (center.left+this.viewFixScrollLeft) * this.curzoom; 153 | // } 154 | 155 | // if(viewCanvasHeight > this.sliderCanvasParentH){ 156 | // centerTop += (center.top+this.viewFixScrollTop) * this.curzoom; 157 | // } 158 | 159 | return { 160 | left: viewOriginX, 161 | right: viewOriginX + viewCanvasWidth, 162 | top: viewOriginY, 163 | bottom: viewOriginY + viewCanvasHeight, 164 | width: viewCanvasWidth, 165 | height: viewCanvasHeight, 166 | zoomWidth: viewCanvasWidth * curzoom, 167 | zoomHeight: viewCanvasHeight * curzoom, 168 | }; 169 | } 170 | 171 | /** 172 | * 根据鼠标位置 计算鼠标在组件内的位置 173 | * @param {*} x 174 | * @param {*} y 175 | * @param {*} invert 176 | */ 177 | function transformPoint(x, y, invert) { 178 | let canvas = getCanvas(); 179 | if (invert == null) { 180 | invert = true; 181 | } 182 | let vf = canvas.viewportTransform; 183 | if (invert) { 184 | vf = fabric.util.invertTransform(vf); 185 | } 186 | let centerfix = fabric.util.transformPoint(new fabric.Point(x, y), vf); 187 | 188 | return { 189 | x: centerfix.x, 190 | y: centerfix.y, 191 | }; 192 | } 193 | 194 | /** 195 | * 根据鼠标位置 判断鼠标是否在组件上 196 | * @param {*} x 197 | * @param {*} y 198 | */ 199 | function isMousePointInView(x, y) { 200 | let viewXY = getViewAbsoluteXY(); 201 | let inContainView = false; 202 | let centerfix = transformPoint(x, y); 203 | //console.log("viewXY:"+JSON.stringify(viewXY) + ", x:" + x + ", y:" + y + ", centerfix.x:" + centerfix.x + ", centerfix.y:" + centerfix.y); 204 | x = centerfix.x; 205 | y = centerfix.y; 206 | if ( 207 | y > viewXY.top && 208 | y < viewXY.bottom && 209 | x > viewXY.left && 210 | x < viewXY.right 211 | ) { 212 | inContainView = true; 213 | } 214 | return inContainView; 215 | } 216 | 217 | //滚动条被拖动到边之后,即取消移动滚动条 218 | function calMoveParam() { 219 | let parentWH = getCanvasParentWH(); 220 | let sliderCanvasParentW = parentWH.width; 221 | let sliderCanvasParentH = parentWH.height; 222 | let showMin = store.state.common.canvasSetting.showMin; 223 | let curzoom = store.state.common.canvasSetting.curzoom; 224 | /* let viewCanvasWidth = store.state.curPage.viewCanvasWidth * curzoom, 225 | viewCanvasHeight = store.state.curPage.viewCanvasHeight * curzoom; 226 | var center = this.sliderCanvas.getCenter(); */ 227 | 228 | // var moveLimitX = (viewCanvasWidth+this.sliderCanvasParentW)/2 - this.showMin; 229 | // var moveLimitY = (viewCanvasHeight+this.sliderCanvasParentH)/2 -this.showMin; 230 | 231 | // if(this.$store.state.curPage.viewCanvasWidth > this.sliderCanvasParentW){ 232 | // moveLimitX -= (center.left+this.viewFixScrollLeft) * this.curzoom; 233 | // } 234 | 235 | // if(this.$store.state.curPage.viewCanvasHeight > this.sliderCanvasParentH){ 236 | // moveLimitY -= (center.top+this.viewFixScrollTop) * this.curzoom; 237 | // } 238 | 239 | /* var cl = 240 | (this.sliderCanvasParentW - showMin) * (1 - curzoom) - 241 | this.fixResizeX / this.curzoom, 242 | ct = 243 | (this.sliderCanvasParentH - showMin) * (1 - curzoom) - 244 | this.fixResizeY / curzoom; */ 245 | 246 | //中心点测试 247 | //var _this = vueMain.$children[0].$children[0];var zoom = 0.4;var center = _this.sliderCanvas.getCenter();_this.sliderCanvas.viewportTransform = [zoom,0,0,zoom,center.left*(1-zoom),center.left*(1-zoom) ];_this.sliderCanvas.requestRenderAll();_this.sliderCanvas.forEachObject(function(obj) {obj.setCoords();}); 248 | 249 | // console.log("Y",this.viewportTransform[5]-ct,moveLimitY,viewCanvasHeight/2 , _this.sliderCanvasParentH/2); 250 | // console.log("X",this.viewportTransform[4]-cl,moveLimitX,viewCanvasWidth/2, _this.sliderCanvasParentW/2); 251 | // console.log("center", JSON.stringify(center), JSON.stringify(vpcenter), _this.curzoom ,canvas.getZoom(), "cl"+cl, "ct"+ct); 252 | 253 | /* return { 254 | moveLimitX: 255 | (this.sliderCanvasParentW - this.showMin) * (1 - this.curzoom), 256 | moveLimitY: 257 | (this.sliderCanvasParentH - this.showMin) * (1 - this.curzoom), 258 | centerFixLeft: 0, 259 | centerFixTop: 0 260 | }; 261 | */ 262 | 263 | return { 264 | moveLimitX: (sliderCanvasParentW) * (1 - curzoom), 265 | moveLimitY: (sliderCanvasParentH) * (1 - curzoom), 266 | centerFixLeft: 0, 267 | centerFixTop: 0, 268 | }; 269 | 270 | //return {moveLimitX: (this.sliderCanvasParentW-this.showMin)*(1-this.curzoom)+this.fixResizeX*this.curzoom, moveLimitY:(this.sliderCanvasParentH-this.showMin)*(1-this.curzoom)+this.fixResizeY*this.curzoom, centerFixLeft:0, centerFixTop:0}; 271 | } 272 | 273 | /** 274 | * 根据当前的角度/宽/高,设置active对象的位置坐标 275 | */ 276 | function activeObjectSetCoods() { 277 | let sliderCanvas = getCanvas(); 278 | let active = sliderCanvas.getActiveObject(); 279 | if (active != null) { 280 | active.setCoords(); 281 | } 282 | } 283 | 284 | /** 285 | * 计算滚动条的长和宽 286 | * 然后改store的数据 287 | */ 288 | function calScrollSize() { 289 | let sliderCanvas = getCanvas(); 290 | let parentWH = getCanvasParentWH(); 291 | let sliderCanvasParentW = parentWH.width, 292 | sliderCanvasParentH = parentWH.height, 293 | viewWidth = store.state.common.canvasSetting.viewWidth, 294 | viewHeight = store.state.common.canvasSetting.viewHeight, 295 | curzoom = store.state.common.canvasSetting.curzoom, 296 | showMin = store.state.common.canvasSetting.showMin; 297 | let scrollWidth = 298 | sliderCanvasParentW * 2 + viewWidth * curzoom ; 299 | let scrollHeight = 300 | sliderCanvasParentH * 2 + viewHeight * curzoom ; 301 | commitCommonMutations('canvasSetting.scrollWidth', scrollWidth); 302 | commitCommonMutations('canvasSetting.scrollHeight', scrollHeight); 303 | // if(this.curPage.viewCanvasWidth > this.sliderCanvasParentW){ 304 | // this.scrollWidth -= 2*(this.sliderCanvas.getCenter().left+this.viewFixScrollLeft) * (this.curzoom); 305 | // } 306 | 307 | // if(this.curPage.viewCanvasHeight > this.sliderCanvasParentH){ 308 | // this.scrollHeight -= 2*(this.sliderCanvas.getCenter().top+this.viewFixScrollTop) * (this.curzoom); 309 | // } 310 | 311 | //console.log(sliderCanvas, "viewWidth:"+viewWidth, "viewHeight:"+viewHeight,"curzoom:"+curzoom,"showMin:"+showMin,"sliderCanvasParentW:"+sliderCanvasParentW,"sliderCanvasParentH:"+sliderCanvasParentH,"scrollWidth:"+scrollWidth, "scrollHeight:"+scrollHeight); 312 | } 313 | 314 | //缩放功能,鼠标不在中间区域时触发 315 | function canvasZoomCenter( 316 | sliderCanvasParentW, 317 | sliderCanvasParentH, 318 | zoom, 319 | canvas 320 | ) { 321 | 322 | calScrollSize(); 323 | 324 | let param = calMoveParam(), 325 | scrollWidth = store.state.common.canvasSetting.scrollWidth, 326 | scrollHeight = store.state.common.canvasSetting.scrollHeight; 327 | let x = (scrollWidth - sliderCanvasParentW) / 2, 328 | y = (scrollHeight - sliderCanvasParentH) / 2; 329 | // canvas.viewportTransform[4] = param.moveLimitX - x; 330 | // canvas.viewportTransform[5] = param.moveLimitY - y; 331 | // canvas.requestRenderAll(); 332 | 333 | // var curPage = getState('page', 'curPage'); 334 | // var sliderCanvas3D = document.getElementById("sliderCanvas3D"); 335 | // if(sliderCanvas3D!=null){ 336 | // var babylon = sliderCanvas3D.babylon; 337 | // if(babylon!=null){ 338 | // var curScene = babylon.scene[curPage.pageId]; 339 | // if(babylon!=null && curScene!=null){ 340 | // var camera = curScene.camera; 341 | // camera.radius = 10/zoom; 342 | // } 343 | // } 344 | // } 345 | 346 | 347 | 348 | canvas.zoomToPoint( 349 | { x: sliderCanvasParentW / 2, y: sliderCanvasParentH / 2 }, 350 | zoom 351 | ); 352 | 353 | return {x:x, y:y}; 354 | 355 | 356 | // let scroll = getScrollXY(); 357 | // if(scroll.x!=null){ 358 | // scroll.x.scrollLeft = x; 359 | // scroll.y.scrollTop = y; 360 | // } 361 | } 362 | 363 | /** 364 | * 窗口改变或者缩放之后 重刷主画布 365 | * @param {*} x 366 | * @param {*} y 367 | */ 368 | function initialCanvasShow(x, y) { 369 | let sliderCanvas = getCanvas(); 370 | let scrollOffsetX, scrollOffsetY; 371 | let param = calMoveParam(); 372 | if (x == null) { 373 | scrollOffsetX = 374 | param.moveLimitX + 375 | param.centerFixLeft - 376 | sliderCanvas.viewportTransform[4]; 377 | } else { 378 | scrollOffsetX = x; 379 | } 380 | 381 | if (y == null) { 382 | scrollOffsetY = 383 | param.moveLimitY + 384 | param.centerFixTop - 385 | sliderCanvas.viewportTransform[5]; 386 | } else { 387 | scrollOffsetY = y; 388 | } 389 | // _this.objScrollX.scrollLeft((_this.scrollWidth - _this.sliderCanvasParentW)/2); 390 | // _this.objScrollY.scrollTop((_this.scrollHeight - _this.sliderCanvasParentH)/2); 391 | 392 | // console.log("X",param.moveLimitX , param.centerFixLeft,this.sliderCanvas.viewportTransform[4], scrollOffsetX); 393 | // console.log("Y",param.moveLimitY , param.centerFixTop ,this.sliderCanvas.viewportTransform[5], scrollOffsetY); 394 | 395 | // setTimeout(function() { 396 | let scroll = getScrollXY(); 397 | scroll.x.scrollLeft = scrollOffsetX; 398 | scroll.y.scrollTop = scrollOffsetY; 399 | // }, 0); 400 | } 401 | 402 | /** 403 | * 获取fabriccanvas以及父级canvas的宽高 404 | */ 405 | function getEditorCanvas() { 406 | let canvas = document.getElementById(canvasId); 407 | let parent = canvas.parentElement; 408 | let parentW = parent.clientWidth; 409 | let parentH = parent.clientHeight; 410 | return { 411 | canvas: canvas.fabric, 412 | width: parentW, 413 | height: parentH, 414 | }; 415 | } 416 | 417 | /** 418 | * 获取fabriccanvas 419 | */ 420 | function getCanvas() { 421 | return document.getElementById(canvasId).fabric; 422 | } 423 | 424 | 425 | function getStaticCanvasList() { 426 | return document.getElementById(canvasId).staticCanvas; 427 | } 428 | 429 | function getCurStaticCanvas(pageId) { 430 | var staticCanvas = document.getElementById(canvasId).staticCanvas; 431 | if(staticCanvas==null){ 432 | return; 433 | } 434 | 435 | if(pageId==null){ 436 | var curPage = getState('page', 'curPage'); 437 | pageId = curPage.pageId; 438 | } 439 | 440 | return staticCanvas[pageId]; 441 | } 442 | 443 | /** 444 | * 获取父级canvas的宽高 445 | */ 446 | function getCanvasParentWH() { 447 | let canvas = document.getElementById(canvasId); 448 | let parent = canvas.parentElement; 449 | let parentW = parent.clientWidth; 450 | let parentH = parent.clientHeight; 451 | return { 452 | width: parentW, 453 | height: parentH, 454 | }; 455 | } 456 | 457 | /** 458 | * 获取滚动条的x,y 459 | */ 460 | function getScrollXY() { 461 | let objScrollX = document.getElementById(scrollx); 462 | let objScrollY = document.getElementById(scrolly); 463 | return { x: objScrollX, y: objScrollY }; 464 | } 465 | 466 | /** 467 | * 获取state属性 468 | * @param {*} param 469 | */ 470 | function getState(nameSpace, param) { 471 | let space = `${nameSpace}/${commonGet}`; 472 | return store.getters[space](param); 473 | } 474 | 475 | /** 476 | * 提交common模块下的Mutations 477 | * @param {*} updateProperty 478 | * @param {*} value 479 | */ 480 | function commitCommonMutations(updateProperty, value) { 481 | let space = `${commonSpace}/${commonUpdate}`; 482 | store.commit(space, { updateProperty: updateProperty, value: value }); 483 | } 484 | 485 | /** 486 | * 提交page模块下的Mutations 487 | * @param {*} updateProperty 488 | * @param {*} value 489 | */ 490 | function pageCommonMutations(updateProperty, value) { 491 | let space = `${pageSpace}/${commonUpdate}`; 492 | store.commit(space, { updateProperty: updateProperty, value: value }); 493 | } 494 | 495 | 496 | function getOrderPageList(sData){ 497 | var sliderPageSort = [] 498 | for (let [key, page] of sData) { 499 | sliderPageSort.push(page); 500 | } 501 | 502 | sliderPageSort.sort(function (a, b) { 503 | if (a.order > b.order) { 504 | return 1; 505 | } else { 506 | return -1; 507 | } 508 | }); 509 | return sliderPageSort; 510 | } 511 | 512 | /** 513 | * 设置对象fill属性 设置fill渐变或背景图片 514 | * @param {Object} updateObj 更新属性对象 515 | * @param {Fabric.canvas} canvas fabric的canvas对象 516 | * @param {Fabric.Object} activeObj fabric的操作对象 517 | */ 518 | function setFillOrImg(updateObj, canvas, activeObj) { 519 | if(!updateObj.fill){ 520 | return; 521 | } 522 | if (updateObj.fill.source) { 523 | fabric.util.loadImage(updateObj.fill.source, function(img) { 524 | activeObj.set('fill', new fabric.Pattern({ 525 | source: img 526 | })); 527 | canvas.requestRenderAll(); 528 | }); 529 | } else if (updateObj.fill.colorStops) { // 渐变色 530 | let colorStops = {}; 531 | for(let i = 0; i < updateObj.fill.colorStops.length; i++){ 532 | let offset = updateObj.fill.colorStops[i].offset; 533 | let color = updateObj.fill.colorStops[i].color; 534 | colorStops[offset] = color; 535 | } 536 | 537 | let fillOption = { 538 | type: updateObj.fill.type, 539 | colorStops: colorStops 540 | }; 541 | if(updateObj.fill.type == 'linear'){ 542 | fillOption.x1 = updateObj.fill.x * activeObj.width; 543 | fillOption.y1 = updateObj.fill.y * activeObj.height; 544 | fillOption.x2 = updateObj.fill.x2 * activeObj.width; 545 | fillOption.y2 = updateObj.fill.y2 * activeObj.height; 546 | } 547 | else if(updateObj.fill.type == 'radial'){ 548 | fillOption.x1 = updateObj.fill.cx * activeObj.width; 549 | fillOption.y1 = updateObj.fill.cy * activeObj.height; 550 | fillOption.x2 = updateObj.fill.cx * activeObj.width; 551 | fillOption.y2 = updateObj.fill.cy * activeObj.height; 552 | fillOption.r1 = updateObj.fill.r * activeObj.width; 553 | fillOption.r2 = updateObj.fill.r * activeObj.height; 554 | } 555 | activeObj.setGradient('fill', fillOption); 556 | } 557 | } 558 | 559 | 560 | 561 | export { 562 | notActiveStyle, 563 | checkInObjects, 564 | generateRandomKey, 565 | getRandomPosition, 566 | getCurPageIndexMax, 567 | banCanvasInteract, 568 | getViewAbsoluteXY, 569 | transformPoint, 570 | isMousePointInView, 571 | calMoveParam, 572 | activeObjectSetCoods, 573 | calScrollSize, 574 | getEditorCanvas, 575 | getCanvas, 576 | getCanvasParentWH, 577 | getScrollXY, 578 | canvasZoomCenter, 579 | initialCanvasShow, 580 | getState, 581 | commitCommonMutations, 582 | pageCommonMutations, 583 | getStaticCanvasList, 584 | getCurStaticCanvas, 585 | getOrderPageList, 586 | setFillOrImg 587 | }; 588 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 41 | 42 | 43 | 59 | -------------------------------------------------------------------------------- /src/components/global/library/filterSetting.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | -------------------------------------------------------------------------------- /src/components/global/library/setGroup.vue: -------------------------------------------------------------------------------- 1 | 84 | 85 | 137 | 138 | -------------------------------------------------------------------------------- /src/data/characterSettingData.js: -------------------------------------------------------------------------------- 1 | //字体 2 | const fontFamilyListWin = [ 3 | { label: '微软雅黑', value: 'Microsoft YaHei' }, 4 | { label: '宋体', value: 'SimSun' }, 5 | { label: '楷体', value: '楷体' }, 6 | { label: '黑体', value: 'Heiti SC' }, 7 | { label: 'Helvetica', value: 'Helvetica' }, 8 | { label: 'Arial', value: 'Arial' }, 9 | { label: 'Tahoma', value: 'Tahoma' }, 10 | { label: 'Times New Roman', value: 'Times New Roman' }, 11 | ]; 12 | 13 | const fontFamilyListMac = [ 14 | { label: '苹方', value: 'PingFang SC' }, 15 | { label: '苹果丽黑', value: 'Hiragino Sans GB' }, 16 | { label: '黑体', value: 'Heiti SC' }, 17 | { label: '华文细黑', value: 'STXihei' }, 18 | { label: '华文黑体', value: 'STHeiti' }, 19 | { label: 'Helvetica', value: 'Helvetica' }, 20 | { label: 'Times New Roman', value: 'Times New Roman' }, 21 | ]; 22 | let fontFamilyList = []; 23 | if(/macintosh|mac os x/i.test(navigator.userAgent)){ 24 | fontFamilyList = fontFamilyListMac; 25 | } 26 | else{ 27 | fontFamilyList = fontFamilyListWin; 28 | } 29 | 30 | /** 31 | * 避头尾法则 32 | */ 33 | const headTailRuleList = [ 34 | { label: '规则1', value: 'rule1' }, 35 | { label: '规则2', value: 'rule2' }, 36 | { label: '规则3', value: 'rule3' }, 37 | { label: '规则4', value: 'rule4' }, 38 | ]; 39 | 40 | /** 41 | * 边框描边样式 42 | */ 43 | const strokeDashList = [ 44 | { 45 | value: 'straightLine', 46 | label: '——————', 47 | }, 48 | { 49 | value: 'foldLine', 50 | label: '▬ ▬ ▬ ▬ ▬ ▬ ▬ ', 51 | }, 52 | { 53 | value: 'dottedLine', 54 | label: '·············', 55 | }, 56 | { 57 | value: 'squareLine', 58 | label: '■ ■ ■ ■ ■ ■ ■', 59 | }, 60 | ]; 61 | 62 | /** 63 | * 项目符号、编号类型 64 | */ 65 | const bulletTypeList = [ 66 | // { 67 | // value: 'square', 68 | // icon: 'iconxiantiaotuceng', 69 | // label: '项目符号', 70 | // }, 71 | // { 72 | // value: 'number', 73 | // icon: 'iconshupaiwenzi', 74 | // label: '项目编号', 75 | // }, 76 | // { 77 | // value: 'nothing', 78 | // icon: '', 79 | // label: '无', 80 | // }, 81 | { 82 | value: 'number', 83 | label: '数字 1', 84 | }, 85 | { 86 | value: 'circle', 87 | label: '●', 88 | }, 89 | { 90 | value: 'square', 91 | label: '◆', 92 | }, 93 | ]; 94 | 95 | /** 96 | * 项目符号 97 | */ 98 | const shapeList = [ 99 | { 100 | value: 'circle', 101 | label: '●', 102 | }, 103 | { 104 | value: 'square', 105 | label: '◆', 106 | }, 107 | ]; 108 | 109 | /** 110 | * 起始编号 111 | */ 112 | const numberList = [ 113 | { 114 | value: '0', 115 | label: '1', 116 | }, 117 | { 118 | value: '1', 119 | label: '(1)', 120 | }, 121 | { 122 | value: '2', 123 | label: '①', 124 | }, 125 | { 126 | value: '3', 127 | label: 'Ⅰ', 128 | }, 129 | { 130 | value: '4', 131 | label: '(Ⅰ)', 132 | }, 133 | { 134 | value: '5', 135 | label: '一', 136 | }, 137 | { 138 | value: '6', 139 | label: '壹', 140 | }, 141 | { 142 | value: '7', 143 | label: 'A', 144 | }, 145 | { 146 | value: '8', 147 | label: 'a', 148 | }, 149 | ]; 150 | 151 | /** 152 | * 项目编号类型 153 | */ 154 | const numTypeList = [ 155 | { 156 | value: '0', 157 | label: '1', 158 | }, 159 | { 160 | value: '1', 161 | label: '(1)', 162 | }, 163 | { 164 | value: '2', 165 | label: '①', 166 | }, 167 | { 168 | value: '3', 169 | label: 'Ⅰ', 170 | }, 171 | { 172 | value: '4', 173 | label: '(Ⅰ)', 174 | }, 175 | { 176 | value: '5', 177 | label: '一', 178 | }, 179 | { 180 | value: '6', 181 | label: '壹', 182 | }, 183 | { 184 | value: '7', 185 | label: 'A', 186 | }, 187 | { 188 | value: '8', 189 | label: 'a', 190 | }, 191 | ]; 192 | 193 | /** 194 | * 对齐方式 195 | */ 196 | const textAlignList = [ 197 | { content: '左对齐', icon: 'iconwenbenzuoduiqi', attr: 'left' }, 198 | { content: '居中对齐', icon: 'iconwenbenjuzhongduiqi', attr: 'center' }, 199 | { content: '右对齐', icon: 'iconwenbenyouduiqi', attr: 'right' }, 200 | { content: '两端对齐', icon: 'iconwenbenliangduanduiqi', attr: 'justify' }, 201 | ]; 202 | 203 | const textDecrationList = [ 204 | { content: '加粗', icon: 'iconshupaiwenzi', attr: 'fontWeight' }, 205 | { content: '倾斜', icon: 'iconwenbentuceng', attr: 'italic' }, 206 | { content: '下划线', icon: 'iconxiangshangqingxie', attr: 'underline' }, 207 | { content: '删除线', icon: 'iconxiangxia', attr: 'linethrough' }, 208 | ]; 209 | 210 | const fields = [ 211 | 'msItemID', 212 | 'width', 213 | 'height', 214 | 'listItem', 215 | 'fontFamily', 216 | 'fontSize', 217 | 'fill', 218 | 'charSpacing', 219 | 'lineSpace', 220 | 'headTailRule', 221 | 'textIndent', 222 | 'bulletType', 223 | 'bulletOffset', 224 | 'bulletColor', 225 | 'numType', 226 | 'startNum', 227 | 'shapeType', 228 | 'fontWeight', 229 | 'fontStyle', 230 | 'underline', 231 | 'linethrough', 232 | 'textAlign', 233 | ]; 234 | 235 | /** 236 | * angleX,angleY(X,Y轴旋转)是不存在的属性 237 | * angleX->skewX + scaleX的改变 238 | * angleY->skewY + scaleY的改变 239 | * msLine:没有left,top,width,height 240 | * isLockWH 不存在的特殊属性 241 | * isShadow 是否有阴影 242 | * ‘color,blur,offsetX,offsetY’四个属性组成了shadow 243 | * strokeDashType 描边线条类型 244 | */ 245 | const normalFields = [ 246 | 'msItemID', //id 247 | 'type', //类型 248 | 'isFill', //是否填充 249 | 'fill', //填充颜色或者图片 250 | 'fontWeight', //加粗 251 | 'fontStyle', //倾斜 252 | 'underline', //下划线 253 | 'linethrough', //删除线 254 | 'opacity', //透明度 255 | 'isStroke', //是否有边框样式 256 | 'strokeWidth', //边框宽度 257 | 'stroke', //边框颜色 258 | 'strokeDashType', //边框的样式类型 259 | 'isShadow', //是否有阴影 260 | 'shadowColor', //阴影颜色 261 | 'shadowBlur', //模糊 262 | 'shadowX', //X偏移 263 | 'shadowY', //Y偏移 264 | 'isLockWH', //是否锁定宽高比 265 | 'width', //宽 266 | 'height', //高 267 | 'scaleX', 268 | 'scaleY', 269 | 'left', //左 270 | 'top', //上 271 | 'angle', //Z轴旋转 272 | // 'angleX', //x轴旋转 273 | // 'angleY', //Y轴旋转 274 | 'skewX', // X轴斜切 275 | 'skewY', // Y轴斜切 276 | 'flipX', //水平翻转 277 | 'flipY', //垂直翻转 278 | 'mszIndex', //层次 279 | 'visible', //隐藏 280 | 'path', // 281 | 'lineWidth', // 直线线条粗细 282 | 'lineColor', // 直线线条颜色 283 | ]; 284 | 285 | /** 286 | * 获取对比属性值是否相等的map 287 | */ 288 | function getNormalMap() { 289 | let map = new Map(); 290 | let arr = [ 291 | 'isFill', //是否填充 292 | 'fill', //填充颜色或者图片 293 | 'opacity', //透明度 294 | 'isStroke', //是否有边框样式 295 | 'strokeWidth', //边框宽度 296 | 'stroke', //边框颜色 297 | 'strokeDashType', //边框的样式类型 298 | 'isShadow', //是否有阴影 299 | 'shadowColor', //阴影颜色 300 | 'shadowBlur', //模糊 301 | 'shadowX', //X偏移 302 | 'shadowY', //Y偏移 303 | 'isLockWH', //是否锁定宽高比 304 | 'width', //宽 305 | 'height', //高 306 | 'left', //左 307 | 'top', //上 308 | 'angle', //Z轴旋转 309 | // 'angleX', //x轴旋转 310 | // 'angleY', //Y轴旋转 311 | 'skewX', // X轴斜切 312 | 'skewY', // Y轴斜切 313 | 'flipX', //水平翻转 314 | 'flipY', //垂直翻转 315 | 'visible', //隐藏 316 | ]; 317 | arr.forEach(item => { 318 | map.set(item, 0); 319 | }); 320 | return map; 321 | } 322 | 323 | /** 324 | * 当选中多个时model的初始值 325 | */ 326 | const normalGroupModel = { 327 | msItemID: null, 328 | type: null, 329 | isFill: false, 330 | fill: null, 331 | opacity: 0, 332 | isStroke: false, //是否有边框 333 | strokeWidth: 0, //边框宽度 334 | stroke: null, //边框颜色 335 | strokeDashType: null, //边框的样式类型 336 | isShadow: false, //是否有阴影 337 | shadowColor: null, //阴影颜色 338 | shadowBlur: 0, //模糊 339 | shadowX: 0, //X偏移 340 | shadowY: 0, //Y偏移 341 | isLockWH: false, //是否锁定宽高比 342 | angle: 0, //Z轴旋转 343 | // angleX: 0, //x轴旋转 344 | // angleY: 0, //Y轴旋转 345 | skewX: 0, //x轴斜切 346 | skewY: 0, //Y轴斜切 347 | flipX: false, //水平翻转 348 | flipY: false, //垂直翻转 349 | //mszIndex:0, //层次 350 | visible: true, //隐藏 351 | }; 352 | 353 | export { 354 | fontFamilyList, 355 | headTailRuleList, 356 | strokeDashList, 357 | bulletTypeList, 358 | shapeList, 359 | numberList, 360 | numTypeList, 361 | textAlignList, 362 | textDecrationList, 363 | fields, 364 | normalFields, 365 | normalGroupModel, 366 | getNormalMap, 367 | }; 368 | -------------------------------------------------------------------------------- /src/data/imageFiltersData.js: -------------------------------------------------------------------------------- 1 | const imgFilters = { 2 | // 滤镜属性数组 3 | filters: [ 4 | 'grayscale', // 灰度 5 | 'invert', // 反色 6 | 'remove-color', // 删除色 7 | 'sepia', // 8 | 'brownie', 9 | 'brightness', // 明亮 10 | 'contrast', // 对比度 11 | 'saturation', // 饱和度 12 | 'noise', // 噪点 13 | 'vintage', // 复古 14 | 'pixelate', // 像素化 15 | 'blur', // 模糊 16 | 'sharpen', // 锐化 17 | 'emboss', // 浮雕 18 | 'technicolor', // 彩色 19 | 'polaroid', // 曝光 20 | 'blend-color', // 混色 21 | 'gamma', // 灰度系数(r,g,b) 22 | 'kodachrome', // 底片 23 | 'blackwhite', // 黑白 24 | 'blend-image', // 混合图像 25 | 'hue', // 色度 26 | ], 27 | 28 | // 滤镜类型数组 29 | filterTypes: [ 30 | "HueRotation", 31 | "Saturation", 32 | "Contrast", 33 | "Brightness", 34 | "Grayscale", 35 | "BlackWhite", 36 | "Vintage", 37 | "Polaroid", 38 | "Kodachrome", 39 | "Technicolor", 40 | "Sepia", 41 | "Convolute", 42 | "Invert", 43 | "RemoveColor", 44 | "Noise", 45 | "Pixelate", 46 | "Blur", 47 | "BlendColor" 48 | ], 49 | 50 | /** 混色 modeList */ 51 | blendcolorList: [ 52 | {label: 'add', value: "add"}, 53 | {label: 'diff', value: "diff"}, 54 | {label: 'subtract', value: "subtract"}, 55 | {label: 'multiply', value: "multiply"}, 56 | {label: 'screen', value: "screen"}, 57 | {label: 'lighten', value: "lighten"}, 58 | {label: 'darken', value: "darken"}, 59 | {label: 'overlay', value: "overlay"}, 60 | {label: 'exclusion', value: "exclusion"}, 61 | {label: 'tint', value: "tint"} 62 | ], 63 | 64 | /** 混合图片 modeList */ 65 | blendimageList: [ 66 | {label: 'multiply', value: "multiply"}, 67 | {label: 'mask', value: "mask"} 68 | ], 69 | 70 | /** 锐化matrix */ 71 | sharpenMatrix: [ 72 | 0, -1, 0, 73 | -1, 5, -1, 74 | 0, -1, 0 75 | ], 76 | 77 | /** 浮雕matrix */ 78 | embossMatrix: [ 79 | 1, 1, 1, 80 | 1, 0.7, -1, 81 | -1, -1, -1 82 | ] 83 | } 84 | export default imgFilters; -------------------------------------------------------------------------------- /src/i18n.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueI18n from 'vue-i18n' 3 | 4 | Vue.use(VueI18n) 5 | 6 | function loadLocaleMessages () { 7 | const locales = require.context('./locales', true, /[A-Za-z0-9-_,\s]+\.json$/i) 8 | const messages = {} 9 | locales.keys().forEach(key => { 10 | const matched = key.match(/([A-Za-z0-9-_]+)\./i) 11 | if (matched && matched.length > 1) { 12 | const locale = matched[1] 13 | messages[locale] = locales(key) 14 | } 15 | }) 16 | return messages 17 | } 18 | 19 | export default new VueI18n({ 20 | locale: process.env.VUE_APP_I18N_LOCALE || 'en', 21 | fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en', 22 | messages: loadLocaleMessages() 23 | }) 24 | -------------------------------------------------------------------------------- /src/locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "hideAssist": "Hide Assist", 4 | "showAssist": "Show Assist" 5 | } 6 | } -------------------------------------------------------------------------------- /src/locales/zh.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "control": "简化控制", 4 | "hideAssist": "隐藏辅助", 5 | "showAssist": "显示辅助" 6 | } 7 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import './plugins/element.js' 4 | 5 | import '@/utils/window' 6 | // Import custom icon 7 | import '@/assets/iconfont/iconfont.css' 8 | import '@/assets/fontFamily.css' 9 | import store from './store' 10 | import i18n from './i18n' 11 | 12 | Vue.config.productionTip = false 13 | 14 | new Vue({ 15 | store, 16 | i18n, 17 | render: h => h(App) 18 | }).$mount('#app') 19 | 20 | // set the language 21 | i18n.locale = 'zh' -------------------------------------------------------------------------------- /src/master/animation.vue: -------------------------------------------------------------------------------- 1 | 205 | 206 | 363 | 364 | -------------------------------------------------------------------------------- /src/master/multiMaterialSetting.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 229 | 230 | -------------------------------------------------------------------------------- /src/master/programSetting.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 191 | 192 | -------------------------------------------------------------------------------- /src/master/skeletonSetting.vue: -------------------------------------------------------------------------------- 1 | 98 | 99 | 215 | 216 | -------------------------------------------------------------------------------- /src/master/spriteManagerSetting.vue: -------------------------------------------------------------------------------- 1 | 163 | 164 | 307 | 308 | -------------------------------------------------------------------------------- /src/plugins/element.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Element from 'element-ui' 3 | import 'element-ui/lib/theme-chalk/index.css' 4 | 5 | Vue.use(Element) 6 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | import Vue from 'vue'; 3 | import Vuex from 'vuex'; 4 | 5 | import master from './modules/master'; 6 | 7 | 8 | Vue.use(Vuex); 9 | 10 | /** 11 | * 理解vuex 12 | * state 理解为数据定义 13 | * getters 理解为state的数据计算 14 | * actions 驱动数据变化,但是不直接改变数据 15 | * mutation 直接改变数据 16 | */ 17 | export default new Vuex.Store({ 18 | modules: { 19 | master:master 20 | }, 21 | state: {}, 22 | mutations: {}, 23 | actions: {}, 24 | getters: {}, 25 | }); 26 | -------------------------------------------------------------------------------- /src/store/modules/master.js: -------------------------------------------------------------------------------- 1 | import { commonMutationsUpdate,getState } from '../../utils/storeUtil'; 2 | import { commonUpdate,commonGet } from '../mutations/mutation-types'; 3 | import { ms3dfKeyAddList } from '@/master/js/meshData'; 4 | 5 | export default { 6 | namespaced: true, 7 | state: { 8 | "id": "scene_asdf_12123", 9 | "name": "默认场景", 10 | 11 | "autoClear": true, //loop时是否自动清除boolean 12 | "clearColor": "rgb(0,0,0)", //color3 13 | "ambientColor": null,//场景光,如果mesh的material设置了ambientColor则接受这个颜色 14 | "gravity": [0,-9.807,0], //重力 15 | "environmentTexture": "", //环境纹理,所有pbr会使用到,CubeTexture、HDRCubeTexture、EquiRectangularCubeTexture、Texture 16 | "fogEnabled": false, //雾效果 17 | "fogMode": 0, //雾模式,0 BABYLON.Scene.FOGMODE_NONE 默认,1 BABYLON.Scene.FOGMODE_EXP 指数, 2 BABYLON.Scene.FOGMODE_EXP2 指数2,3 BABYLON.Scene.FOGMODE_LINEAR 线性 18 | "fogDensity": 0.01, //雾密度,0-1,步长0.01 19 | "fogStart": 20, //雾开始,0-100,步长1 20 | "fogEnd": 20, //雾结束,0-100,步长1 21 | "fogColor": 'rgb(1,1,1)', //雾颜色 22 | "enableBackground2D": false, //开启2d背景 23 | "background2D": "base64", //背景图base64 24 | "enableGlow": false,//开启全局辉光 25 | "glowIntensity": 1, //辉光亮度 26 | "mainTextureFixedSize": 1024, //主纹理体积 27 | "blurKernelSize": 32, //模糊核心体积 28 | "enableFilter":false, //开启滤镜 29 | "filter":{},//滤镜 30 | 31 | "screenRatio":[16, 9], 32 | 33 | "cameras": [], 34 | "lights": [], 35 | "textures": [], 36 | "materials": [], 37 | "geometries": { 38 | "vertexData":[], 39 | }, 40 | "meshes": [], 41 | "spriteManagers": [], 42 | 43 | "particleSystems": [], 44 | "transformNodes": [], 45 | "instances":[], 46 | "gui2Ds":[], 47 | 48 | // "solidParticleSystems": [], 49 | 50 | // "pointCloudParticleSystems": [], 51 | 52 | "programs": [], //{name id type pro} 53 | 54 | "skeletons": [], //骨骼动画 55 | "animationGroups": [],//动画组 56 | "multiMaterials": [], //多材质 57 | 58 | //辅助参数 59 | "curModelName": 'scene', //当前右侧模块名称 60 | "preModelName": '', //上一个右侧模块名称 61 | "curCameraId": null, //当前相机id 62 | "curLightId": null, //当前灯光id 63 | "curMeshId": null, //当前物体id 64 | "curMaterialId": null, //当前材质id 65 | "curTextureId": null, //当前纹理id 66 | "curSpriteManagerId": null, //当前精灵图id 67 | "curProgramId": null, //当前程序id 68 | "curParticleId": null, //当前粒子id 69 | "curSkeletonId": null, //当前骨骼动画id 70 | "curMultiMaterialId":null, //当前复合材质id 71 | "curGui2DId":null,//当前交互控件id 72 | "masterLayerTime": null,//刷新左侧管理菜单 73 | "isFullscreen":true,//是否全屏 74 | "mouseDownHoldState":false, 75 | "batchOptionCache":null, 76 | 77 | "historyListCache":[],//历史记录 78 | "historyIndex":null,//历史记录指针 79 | 80 | }, 81 | mutations: { 82 | [commonUpdate](state, param) { 83 | commonMutationsUpdate(state, param); 84 | }, 85 | refreshMasterLayerTime(state){ 86 | state.masterLayerTime = new Date(); 87 | }, 88 | updateBatchCommands(state, param){//批量更新操作,param为完整的file格式 89 | if(param==null){ 90 | return; 91 | } 92 | 93 | let addData = param.addData, filter = param.filter; 94 | 95 | let addList = ms3dfKeyAddList; 96 | 97 | Object.keys(addData).forEach((mainType)=>{ 98 | let updateObject = state[mainType]; 99 | if(mainType=="geometries"){ 100 | if(addData[mainType] && addData[mainType].vertexData && addData[mainType].vertexData.length>0){ 101 | updateObject.vertexData = updateObject.vertexData.concat(addData[mainType].vertexData); 102 | } 103 | } 104 | else if(mainType=="cameras"){ 105 | if(addData[mainType] && addData[mainType][0]){ 106 | // state[mainType][0] = addData[mainType][0]; 107 | Object.keys(state[mainType][0]).forEach((key)=>{ 108 | state[mainType][0][key] = addData[mainType][0][key]; 109 | }); 110 | } 111 | } 112 | else if(mainType in addList && addData[mainType]){ 113 | if(addData[mainType] && addData[mainType].length>0){ 114 | state[mainType] = updateObject.concat(addData[mainType]); 115 | } 116 | } 117 | else { 118 | if(addData[mainType]!==undefined){ 119 | state[mainType] = addData[mainType]; 120 | } 121 | } 122 | }); 123 | }, 124 | updateCommands(state, param) { 125 | //param:{key:"key1.key2.${index}.key3", value:"bug"} 126 | 127 | let key = param.key, value = param.value; 128 | if(key==null || key.length==0){ 129 | return; 130 | } 131 | 132 | var keyList = key.split("."); 133 | var lastKey = keyList[keyList.length-1]; 134 | keyList.pop(); 135 | if(keyList.length>0){ 136 | var curObj = null; 137 | keyList.forEach((item, i)=>{ 138 | if(curObj==null){ 139 | curObj = state; 140 | } 141 | if(item.indexOf("$")>-1){ 142 | let r = parseInt(item.replace('${', '').replace('}', '')); 143 | curObj = curObj[r]; 144 | } 145 | else{ 146 | curObj = curObj[item]; 147 | } 148 | }); 149 | 150 | curObj[lastKey] = value; 151 | } 152 | else{ 153 | state[lastKey] = value; 154 | } 155 | 156 | }, 157 | insertCommands(state, param) { 158 | 159 | let key = param.key, value = param.value; 160 | if(key==null || key.length==0){ 161 | return; 162 | } 163 | 164 | var keyList = key.split("."); 165 | var lastKey = keyList[keyList.length-1]; 166 | keyList.pop(); 167 | if(keyList.length>0){ 168 | var curObj = null; 169 | keyList.forEach((item, i)=>{ 170 | if(curObj==null){ 171 | curObj = state; 172 | } 173 | if(item.indexOf("$")>-1){ 174 | let r = parseInt(item.replace('${', '').replace('}', '')); 175 | curObj = curObj[r]; 176 | } 177 | else{ 178 | curObj = curObj[item]; 179 | } 180 | }); 181 | 182 | if(curObj[lastKey] instanceof Array){ 183 | curObj[lastKey].push(value); 184 | } 185 | else{ 186 | curObj[lastKey] = value; 187 | } 188 | 189 | } 190 | else{ 191 | if(state[lastKey] instanceof Array){ 192 | state[lastKey].push(value); 193 | } 194 | else{ 195 | state[lastKey] = value; 196 | } 197 | } 198 | }, 199 | deleteCommands(state, param) { 200 | let key = param.key, value = param.value, deleLen = param.deleLen; 201 | 202 | if(deleLen==null){ 203 | deleLen = 1; 204 | } 205 | 206 | if(key==null || key.length==0){ 207 | return; 208 | } 209 | 210 | var keyList = key.split("."); 211 | var lastKey = keyList[keyList.length-1]; 212 | keyList.pop(); 213 | if(keyList.length>0){ 214 | var curObj = null; 215 | keyList.forEach((item, i)=>{ 216 | if(curObj==null){ 217 | curObj = state; 218 | } 219 | if(item.indexOf("$")>-1){ 220 | let r = parseInt(item.replace('${', '').replace('}', '')); 221 | curObj = curObj[r]; 222 | } 223 | else{ 224 | curObj = curObj[item]; 225 | } 226 | }); 227 | 228 | if(lastKey.indexOf("$")>-1){ 229 | let r = parseInt(lastKey.replace('${', '').replace('}', '')); 230 | curObj.splice(r, deleLen); 231 | } 232 | else{ 233 | delete curObj[lastKey]; 234 | } 235 | 236 | } 237 | else{ 238 | if(lastKey.indexOf("$")>-1){ 239 | let r = parseInt(lastKey.replace('${', '').replace('}', '')); 240 | state.splice(r, deleLen); 241 | } 242 | else{ 243 | delete state[lastKey]; 244 | } 245 | 246 | } 247 | }, 248 | deleteItem(state, param){ 249 | let key = param.key, id = param.id, deleteIndex; 250 | for(let i=0;i (param) => { 276 | //TODO:param可以写一个正则校验 277 | if(!param){ 278 | throw '不能传空参数'; 279 | } 280 | return getState(state,param) 281 | }, 282 | getObjectByID: (state) => (param) => { 283 | //param:{type:"", id:""} 284 | 285 | 286 | // "cameras":[], 287 | // "lights":[], 288 | // "textures":[], 289 | // "materials":[], 290 | // "geometries":{ 291 | // "vertexData":[], 292 | // }, 293 | // "meshes":[], 294 | // "sprite":[], 295 | // "particleSystems": [], 296 | // "solidParticleSystems": [], 297 | // "pointCloudParticleSystems": [], 298 | 299 | let type = param.type, id = param.id; 300 | 301 | var o = state[type]; 302 | 303 | for(var i=0;i { 11 | map.set(item.msItemID, item); 12 | if (item.type == 'symbol' && symbols) { 13 | let symbolsTemp = symbols.get(item.symbolTempId); 14 | let symboldata = symbolsTemp ? symbolsTemp.objects : []; 15 | getPageOjbects(map, symboldata, symbols); 16 | } else if (item.objects && item.objects.size > 0) { 17 | //Map使用szie 18 | getPageOjbects(map, item.objects, symbols); 19 | } 20 | }); 21 | } 22 | 23 | /** 24 | * 获取页面所有组件(包含子组件)object对象,放入一个map对象中 25 | * @param {Map} objects 26 | * @param {Map} symbols 元件map 27 | * @param {Map} resultMap 返回包含所有组件的map 28 | */ 29 | function getAllObjects(objects, symbols, resultMap = new Map()) { 30 | if (!isMap(objects)) { 31 | console.error("参数不是map类型!"); 32 | return null; 33 | } 34 | 35 | for (let [key, value] of objects.entries()) { 36 | if (value.type == 'group' || value.type == 'symbol') { 37 | let copyItem = deepCopy(value); 38 | delete copyItem.objects; 39 | resultMap.set(key, copyItem); 40 | 41 | if (value.type == 'group') { 42 | getAllObjects(value.objects, symbols, resultMap); 43 | } else if (value.type == 'symbol') { 44 | let symbolObjects; 45 | if (symbols.get(value.symbolTempId) != null) { 46 | symbolObjects = symbols.get(value.symbolTempId).objects; 47 | } 48 | if (symbolObjects != null) { 49 | getAllObjects(symbolObjects, symbols, resultMap); 50 | } 51 | } 52 | } else { 53 | resultMap.set(key, value); 54 | } 55 | } 56 | return resultMap; 57 | // objects = convertMapToArray(objects); 58 | // for (var i = 0; i < objects.length; i++) { 59 | // var item = objects[i]; 60 | 61 | // arr[item.msItemID] = item; 62 | 63 | // if (item.type == 'group') { 64 | // this.checkGroupJson(item.objects, arr); 65 | // } else if (item.type == 'symbol') { 66 | // var o = item.objects; 67 | // if (o == null) { 68 | // var symbols = this.$store.state.symbols.symbolsTemp; 69 | 70 | // if (symbols.get(item.symbolTempId) != null) { 71 | // o = symbols.get(item.symbolTempId).objects; 72 | // } 73 | // } 74 | 75 | // if (o != null) { 76 | // this.checkGroupJson(o, arr); 77 | // } 78 | // } 79 | // } 80 | } 81 | 82 | function queryFabricObject(msItemID, curPageObjects, symbols) { 83 | const map = new Map(); 84 | getPageOjbects(map, curPageObjects, symbols); 85 | console.log(map); 86 | return map.get(msItemID); 87 | } 88 | 89 | /** 90 | * 公共修改Mutations的方法 91 | * @param {*} state 92 | * @param {*} param 93 | */ 94 | function commonMutationsUpdate(state, param) { 95 | let property = param.updateProperty; //多层嵌套写a.b.c 96 | let value = param.value; 97 | if (!property) { 98 | return; 99 | } 100 | if (property.includes('.')) { 101 | let n = ''; 102 | let arr = property.split('.'); 103 | for (let i = 0; i < arr.length - 1; i++) { 104 | let item = arr[i]; 105 | if (n == '') { 106 | n = Reflect.get(state, item); 107 | } else { 108 | n = Reflect.get(n, item); 109 | } 110 | } 111 | let lastProperty = arr[arr.length - 1]; 112 | n[lastProperty] = value; 113 | } else { 114 | state[property] = value; 115 | } 116 | } 117 | 118 | /** 119 | * 获取数据 120 | * @param {*} state 121 | * @param {*} property 122 | */ 123 | function getState(state, property) { 124 | if (property.includes('.')) { 125 | let n = ''; 126 | let arr = property.split('.'); 127 | for (let i = 0; i < arr.length - 1; i++) { 128 | let item = arr[i]; 129 | if (n == '') { 130 | n = Reflect.get(state, item); 131 | } else { 132 | n = Reflect.get(n, item); 133 | } 134 | } 135 | let lastProperty = arr[arr.length - 1]; 136 | return n[lastProperty]; 137 | } else { 138 | return state[property]; 139 | } 140 | } 141 | 142 | /** 143 | * 递归把map转为数组 144 | * @param {Map} map 145 | * @param {Array} array 146 | * @param {*} symbols 147 | */ 148 | function convertMapToArray(map, array = []) { 149 | if (!map) return []; 150 | let copyMap = deepCopy(map); 151 | let objects = [...copyMap.values()]; 152 | if (!objects || objects.length == 0) return []; 153 | objects.forEach(item => { 154 | let itemCopy = deepCopy(item); 155 | delete itemCopy.objects; 156 | if (item.objects) { 157 | itemCopy.objects = convertMapToArray(item.objects); 158 | } 159 | array.push(itemCopy); 160 | }) 161 | return array; 162 | } 163 | 164 | /** 165 | * store数据变model 166 | * @param {*} storeData 167 | */ 168 | function sotreToModel(storeData){ 169 | let shadow = storeData.shadow; 170 | if(shadow){ 171 | storeData['color'] = shadow['color']; 172 | storeData['blur'] = shadow['blur']; 173 | storeData['offsetX'] = shadow['offsetX']; 174 | storeData['offsetY'] = shadow['offsetY']; 175 | }else{ 176 | storeData['color'] ="rgb(0,0,0)"; //阴影颜色 177 | storeData['blur'] = 0;//阴影模糊程度 178 | storeData['offsetX'] = 0;//阴影水平偏移程度 179 | storeData['offsetY'] = 0;//阴影垂直偏移程度 180 | } 181 | 182 | // storeData['angleX'] = 0; 183 | // storeData['angleY'] = 0; 184 | return storeData; 185 | } 186 | 187 | /** 188 | * 把 shadowColor, shadowBlur, 189 | * shadowX,shadowY,shadowAffectStroke合成shadow 190 | * store数据转fabric数据结构 191 | * @param {*} storeData 192 | */ 193 | function storeToFabric(storeData,fabricItem){ 194 | let emptyShadow = false, // 是否清空阴影 195 | emptyStroke = false, // 是否清除描边 196 | emptyFill = false; // 是否清除填充 197 | if (storeData.hasOwnProperty("isShadow")) { 198 | if (!storeData.isShadow) { 199 | storeData['shadow'] = {}; 200 | emptyShadow = true; 201 | } 202 | } else if (fabricItem && !fabricItem.isShadow) { 203 | storeData['shadow'] = {}; 204 | emptyShadow = true; 205 | } 206 | if (!emptyShadow && fabricItem) { 207 | let fieldArr = [ 208 | {storeKey:'shadowColor',fabricKey:'color'}, //阴影颜色 209 | {storeKey:'shadowBlur',fabricKey:'blur'}, //模糊 210 | {storeKey:'shadowX',fabricKey:'offsetX'}, //X偏移量 211 | {storeKey:'shadowY',fabricKey:'offsetY'}, //Y偏移量 212 | {storeKey:'shadowAffectStroke',fabricKey:'affectStroke'} 213 | ]; 214 | let shadow = {}; 215 | fieldArr.forEach(item=>{ 216 | // if(fabricItem && fabricItem.shadow){ 217 | // shadow[item.fabricKey] = fabricItem.shadow[item.fabricKey] 218 | // } 219 | if(fabricItem){ 220 | shadow[item.fabricKey] = fabricItem[item.storeKey]; 221 | } 222 | 223 | if(storeData.hasOwnProperty(item.storeKey)){ 224 | shadow[item.fabricKey] = storeData[item.storeKey]; 225 | // delete storeData[item.storeKey]; 226 | } 227 | }); 228 | if(JSON.stringify(shadow) != "{}"){ 229 | storeData['shadow'] = shadow; 230 | } 231 | } 232 | //X轴旋转 233 | // if (storeData.hasOwnProperty('angleX')) { 234 | // let x = (storeData.angleX) * Math.PI / 180; 235 | // storeData['skewX'] = Math.tan(x); 236 | // //this.curActiveObj.skewX = this.styles.skewX.toFixed(6)*10; 237 | // storeData['scaleX'] = Math.cos(x); 238 | // //this.curActiveObj.scaleX = +this.styles.scaleX.toFixed(6); 239 | // //this.curActiveObj.angleX = param; 240 | // delete storeData.angleX; 241 | // } 242 | // //Y轴旋转 243 | // if (storeData.hasOwnProperty('angleY')) { 244 | // let y = (storeData.angleY) * Math.PI / 180; 245 | // storeData['skewY'] = Math.tan(y); 246 | // storeData['scaleY'] = Math.cos(y); 247 | // //this.styles.skewY = Math.tan(y); 248 | // // this.curActiveObj.skewY = this.styles.skewY.toFixed(6)*10; 249 | // // this.styles.scaleY = Math.cos(y); 250 | // // this.curActiveObj.scaleY = +this.styles.scaleY.toFixed(6); 251 | // // this.curActiveObj.angleY = param; 252 | // delete storeData.angleY; 253 | // } 254 | 255 | // 边框描边 256 | if (storeData.hasOwnProperty("isStroke")) { 257 | if (!storeData.isStroke) { 258 | storeData.stroke = null; 259 | emptyStroke = true; 260 | } 261 | } 262 | // else if (fabricItem && !fabricItem.isStroke) { 263 | // storeData.stroke = null; 264 | // emptyStroke = true; 265 | // } 266 | if (!emptyStroke) { 267 | if(storeData.hasOwnProperty('strokeDashType')){ 268 | let dashType = storeData.strokeDashType; 269 | if(dashType ==='straightLine'){ 270 | storeData.strokeDashArray = [0,0,0]; 271 | }else if(dashType ==='foldLine'){ 272 | storeData.strokeDashArray = [1,4,4]; 273 | }else if(dashType ==='dottedLine'){ 274 | storeData.strokeLineCap = "round"; 275 | storeData.strokeDashArray = [0,0,0,9,0,0,0,9,0,0]; 276 | }else if(dashType ==='squareLine'){ 277 | storeData.strokeLineCap = "square"; 278 | storeData.strokeDashArray = [0,0,0,10,0,0,0,10,0,0]; 279 | } 280 | // delete storeData.strokeDashType; 281 | } 282 | } 283 | } 284 | 285 | /** 286 | * 根据路劲路由更新主对象的子属性 287 | * @param {需要更新的主对象} chartOptions 288 | * @param {路径路由} router 289 | * @param {更新对象} updateObj 290 | */ 291 | function setChartOptionsByRouter(chartOptions,router,updateObj) { 292 | if (chartOptions == undefined || router == undefined) { 293 | return chartOptions; 294 | } 295 | 296 | let routerArray = router.split('/'); 297 | const defaultOption = chartOptions.defaultOption; 298 | 299 | //递归获取内部属性 300 | function deepFind(curObj) { 301 | if (routerArray.length != 0) { 302 | return deepFind(curObj[routerArray.shift()]) 303 | }else{ 304 | Object.assign(curObj,updateObj) 305 | return curObj 306 | } 307 | 308 | } 309 | deepFind(defaultOption); 310 | return chartOptions; 311 | } 312 | export { 313 | getPageOjbects, 314 | commonMutationsUpdate, 315 | getState, 316 | convertMapToArray, 317 | getAllObjects, 318 | sotreToModel, 319 | storeToFabric, 320 | setChartOptionsByRouter 321 | }; 322 | -------------------------------------------------------------------------------- /src/utils/util.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 删除数组元素 3 | * @param {Array} arr 4 | * @param {Object} item 5 | */ 6 | function delArrItem(arr, item) { 7 | let i = arr.indexOf(item); 8 | if (i > -1) { 9 | arr.splice(i, 1); 10 | } 11 | return arr; 12 | } 13 | 14 | /** 15 | * 深度克隆数据,包括对象,数组,map 16 | * @param {*} obj 对象,数组,map 17 | */ 18 | function deepCopy(obj) { 19 | if (!isObject(obj) && !isMap(obj)) { 20 | return obj; 21 | } 22 | 23 | let cloneObj; 24 | if (isMap(obj)) { 25 | cloneObj = new Map(); 26 | for (let key of obj.keys()) { 27 | let value = obj.get(key); 28 | if (isMap(value) || isObject(value) || Array.isArray(obj)) { 29 | let copyVal = deepCopy(value); 30 | cloneObj.set(key, copyVal); 31 | }else{ 32 | cloneObj.set(key,value); 33 | } 34 | } 35 | }else if(typeof obj === "function"){ 36 | cloneObj = obj 37 | }else { 38 | cloneObj = Array.isArray(obj) ? [] : {}; 39 | if(obj instanceof HTMLElement){ 40 | cloneObj=obj.cloneNode(true) 41 | }else { 42 | for (let key in obj) { 43 | if (obj.hasOwnProperty(key)) { 44 | cloneObj[key] = 45 | isMap(obj[key]) || isObject(obj[key]) 46 | ? deepCopy(obj[key]) 47 | : obj[key]; 48 | } 49 | } 50 | 51 | } 52 | } 53 | return cloneObj; 54 | } 55 | 56 | /** 57 | * 深拷贝,当obj为map时转为一维数组 58 | * @param {*} obj 59 | */ 60 | function deepCopyMapToArray(obj) { 61 | if (!isObject(obj)) { 62 | console.error('obj 不是一个对象!'); 63 | return obj; 64 | } 65 | function isObject(o) { 66 | return (typeof o === 'object' || typeof o === 'function') && o !== null; 67 | } 68 | 69 | if (obj instanceof Map) { 70 | let arr = []; 71 | for (let value of obj.values()) { 72 | arr.push(value); 73 | } 74 | obj = arr; 75 | } 76 | 77 | let cloneObj = Array.isArray(obj) ? [] : {}; 78 | for (let key in obj) { 79 | cloneObj[key] = isObject(obj[key]) 80 | ? deepCopyMapToArray(obj[key]) 81 | : obj[key]; 82 | } 83 | 84 | return cloneObj; 85 | } 86 | 87 | /** 88 | * 判断某个元素是否在指定数组里面 89 | * @param {*} item 90 | * @param {*} arr 91 | */ 92 | function isBelong(item, arr) { 93 | var flag = false; 94 | if (arr.length) { 95 | var strArr = JSON.stringify(arr); 96 | var strItem = JSON.stringify(item); 97 | if (strArr.indexOf(strItem) > -1) { 98 | flag = true; 99 | return flag; 100 | } 101 | } 102 | return flag; 103 | } 104 | 105 | /** 106 | * 检查一个数组是否包含属于另一个数组 107 | * @param {Array} arr1 108 | * @param {Array} arr2 109 | */ 110 | function isContain(arr1, arr2) { 111 | for (var i = arr2.length - 1; i >= 0; i--) { 112 | if (!arr1.includes(arr2[i])) { 113 | return false; 114 | } 115 | } 116 | return true; 117 | } 118 | 119 | /** 120 | * map转jsonObj 121 | * @param {Map} map 122 | */ 123 | function mapToObj(map) { 124 | let obj = Object.create(null); 125 | for (let [k, v] of map) { 126 | // We don’t escape the key '__proto__' 127 | // which can cause problems on older engines 128 | obj[k] = v; 129 | } 130 | return obj; 131 | } 132 | 133 | /** 134 | * jsonObj转map 135 | * @param {json} obj 136 | */ 137 | function objToMap(obj) { 138 | let map = new Map(); 139 | try { 140 | for (let k of Object.keys(obj)) { 141 | if (!k || k == 'null') { 142 | throw new Error('键值不能为空!'); 143 | } 144 | //是数字值? 145 | // if (!isNaN(k)) { 146 | // map.set(Number(k), obj[k]); 147 | // } else { 148 | // map.set(k, obj[k]); 149 | // } 150 | map.set(k, obj[k]); 151 | } 152 | } catch (e) { 153 | console.error(e.name + ': ' + e.message); 154 | return null; 155 | } 156 | 157 | return map; 158 | } 159 | 160 | /** 161 | * 递归查找objects下的子objects转成map 162 | * @param {Map} map 已经转成了map的objects 163 | */ 164 | function recursiveObjsToMap(map) { 165 | for (let value of map.values()) { 166 | if (value.objects) { 167 | let childMap = objToMap(value.objects); 168 | value.objects = childMap; 169 | recursiveObjsToMap(childMap); 170 | } 171 | } 172 | } 173 | 174 | /** 175 | * map集合排序 176 | * @param {Map} map 需要排序的map 177 | * @param {String} property 传key表示key排序,或者传value的属性名称 178 | * @param {Boolean} isDesc 是否降序,默认升序asc 179 | */ 180 | function sortMap(map, property, isDesc) { 181 | try { 182 | let sortedMap = new Map( 183 | [...map].sort(([k1, v1], [k2, v2]) => { 184 | if (property === 'key') { 185 | if (isNaN(k1)) { 186 | throw new Error('键值不是数字,不能排序!'); 187 | } 188 | if (!isDesc) { 189 | if (k1 > k2) { 190 | return 1; 191 | } else { 192 | return -1; 193 | } 194 | } else { 195 | if (k2 > k1) { 196 | return 1; 197 | } else { 198 | return -1; 199 | } 200 | } 201 | } else { 202 | if (isNaN(v1[property])) { 203 | throw new Error('不是数字,不能排序!'); 204 | } 205 | if (!isDesc) { 206 | if (v1[property] > v2[property]) { 207 | return 1; 208 | } else { 209 | return -1; 210 | } 211 | } else { 212 | if (v2[property] > v1[property]) { 213 | return 1; 214 | } else { 215 | return -1; 216 | } 217 | } 218 | } 219 | }) 220 | ); 221 | return sortedMap; 222 | } catch (e) { 223 | console.error(e.name + ': ' + e.message); 224 | return map; 225 | } 226 | } 227 | 228 | /** 229 | * 拼接map 将第一个参数后的所有map加到第一个map上; 若key值重复,则对应值将会被覆盖 230 | * @param {Map} map 用于拼接并返回的map 231 | * @param {Array} args 多个map参数的数组 es6 Rest Parameters写法 232 | */ 233 | function concatMap(map, ...args) { 234 | let isValidate = true; 235 | if (!isMap(map)) { 236 | console.error("参数不是map类型!"); 237 | isValidate = false; 238 | } else if (args && args.length > 0) { 239 | for (let i = 0; i < args.length; i++) { 240 | const arg = args[i]; 241 | if (!isMap(arg)) { 242 | console.error("包含非map类型参数!"); 243 | break; 244 | } else { 245 | for (let [key, value] of arg.entries()) { 246 | map.set(key, value); 247 | } 248 | } 249 | } 250 | } 251 | return map; 252 | } 253 | 254 | /** 255 | * 判断参数是否是Object类型 256 | * @param {*} o 257 | */ 258 | function isObject(o) { 259 | return ( 260 | !isMap(o) && 261 | (typeof o === 'object' || typeof o === 'function') && 262 | o !== null 263 | ); 264 | } 265 | 266 | /** 267 | * 判断参数是否是Map类型 268 | * @param {*} obj 269 | */ 270 | function isMap(obj) { 271 | if (obj instanceof Map) { 272 | return true; 273 | } else { 274 | return false; 275 | } 276 | } 277 | 278 | function copyProperties(target, source) { 279 | for (let key of Reflect.ownKeys(source)) { 280 | if ( key !== 'constructor' 281 | && key !== 'prototype' 282 | && key !== 'name' 283 | ) { 284 | let desc = Object.getOwnPropertyDescriptor(source, key); 285 | Object.defineProperty(target, key, desc); 286 | } 287 | } 288 | } 289 | 290 | /** 291 | * 判断是否为数值 292 | * @param {*} val 293 | */ 294 | function isRealNum(val) { 295 | // 判断是否是数字 296 | if (typeof val !== 'number') { 297 | return false; 298 | } 299 | // NaN 或数字 300 | return !isNaN(val) 301 | } 302 | 303 | 304 | /** 305 | * 判断参数是否为空 306 | * @param {*} val 307 | */ 308 | function isEmpty(val){ 309 | 310 | 311 | } 312 | 313 | /** 314 | * 寻找数组中的相同的属性值的对象 315 | * @param {Array} objArray 316 | */ 317 | function findDuplicates(objArray,fieldArray){ 318 | let common = []; 319 | let fields = []; 320 | let map = new Map(); 321 | let flag = 0; 322 | for (let i = 1; i < objArray.length; i++) { 323 | for (let j = i - 1; j >= 0; j--) { 324 | flag++; 325 | 326 | //如果存在字段数组 327 | if(fieldArray){ 328 | fieldArray.forEach( f => { 329 | if(objArray[i][f] == objArray[j][f]){ 330 | fields.push(f); 331 | common.push(objArray[i][f]); 332 | map.set(f,objArray[i][f]); 333 | } 334 | }); 335 | } 336 | 337 | /* if (objArray[i] > objArray[j]) { 338 | break; 339 | } else if (objArray[i] == objArray[j]) { 340 | return true; 341 | } */ 342 | } 343 | } 344 | console.log("循环数",flag); 345 | console.log("相同元素",fields,common,map); 346 | } 347 | 348 | /** 349 | * 比较两个基本数据类型的一维数组是否相等 350 | * @param {Array} arrA 351 | * @param {Array} arrB 352 | */ 353 | function equalsArray(arrA, arrB) { 354 | if (Array.isArray(arrA) && Array.isArray(arrB)) { 355 | if (arrA.length != arrB.length) return false; 356 | for (let i = 0; i < arrA.length; i++) { 357 | if (arrA[i] !== arrB[i]) { 358 | return false; 359 | } 360 | } 361 | return true; 362 | } else { 363 | return false; 364 | } 365 | } 366 | 367 | function getQueryString(name) { 368 | var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); 369 | var r = window.location.search.substr(1).match(reg); 370 | if (r != null) return decodeURI(r[2]); 371 | return null; 372 | } 373 | 374 | function isPlainObject(obj){ 375 | return obj && Object.prototype.toString.call(obj) === "[object Object]" 376 | } 377 | 378 | // jq的 extend 方法 379 | function $extend() { 380 | var options, name, src, copy, copyIsArray, clone, 381 | target = arguments[ 0 ] || {}, 382 | i = 1, 383 | length = arguments.length, 384 | deep = false; 385 | 386 | // Handle a deep copy situation 387 | if ( typeof target === "boolean" ) { 388 | deep = target; 389 | 390 | // Skip the boolean and the target 391 | target = arguments[ i ] || {}; 392 | i++; 393 | } 394 | 395 | // Handle case when target is a string or something (possible in deep copy) 396 | if ( typeof target !== "object" && typeof target !== "function" ) { 397 | target = {}; 398 | } 399 | 400 | // Extend jQuery itself if only one argument is passed 401 | if ( i === length ) { 402 | target = this; 403 | i--; 404 | } 405 | 406 | for ( ; i < length; i++ ) { 407 | 408 | // Only deal with non-null/undefined values 409 | if ( ( options = arguments[ i ] ) != null ) { 410 | 411 | // Extend the base object 412 | for ( name in options ) { 413 | src = target[ name ]; 414 | copy = options[ name ]; 415 | 416 | // Prevent never-ending loop 417 | if ( target === copy ) { 418 | continue; 419 | } 420 | 421 | // Recurse if we're merging plain objects or arrays 422 | if ( deep && copy && ( isPlainObject( copy ) || 423 | ( copyIsArray = Array.isArray( copy ) ) ) ) { 424 | 425 | if ( copyIsArray ) { 426 | copyIsArray = false; 427 | clone = src && Array.isArray( src ) ? src : []; 428 | 429 | } else { 430 | clone = src && isPlainObject( src ) ? src : {}; 431 | } 432 | 433 | // Never move original objects, clone them 434 | target[ name ] = $extend( deep, clone, copy ); 435 | 436 | // Don't bring in undefined values 437 | } else if ( copy !== undefined ) { 438 | target[ name ] = copy; 439 | } 440 | } 441 | } 442 | } 443 | return target; 444 | } 445 | 446 | 447 | /** 448 | * 是否微信 449 | */ 450 | function isWeixin() { 451 | var a = navigator.userAgent.toLowerCase() 452 | return 'micromessenger' == a.match(/MicroMessenger/i) ? !0 : !1 453 | } 454 | 455 | 456 | /** 457 | * 是否移动端 458 | * 459 | */ 460 | function isMobileAgent(){ 461 | let mobile = navigator.userAgent.match( 462 | /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i 463 | ); 464 | return mobile != null; 465 | } 466 | 467 | /** 468 | * 获取iphone手机系统版本号 469 | * @return { null | String } 非iphone返回null, iphone返回系统版本号 470 | */ 471 | function getIOSVersion() { 472 | let str = navigator.userAgent.toLowerCase(); 473 | let ver = str.match(/cpu iphone os (.*?) like mac os/); 474 | if (!ver) { 475 | // alert("请在Ios系统中打开"); 476 | console.log("非iphone"); 477 | } else { 478 | // alert("你当前的Ios系统版本为:" + ver[1].replace(/_/g, ".")); 479 | // 只返回大版本 480 | return ver[1].split('_')[0]; 481 | } 482 | return null; 483 | } 484 | 485 | 486 | export { 487 | delArrItem, 488 | deepCopy, 489 | deepCopyMapToArray, 490 | isBelong, 491 | isContain, 492 | mapToObj, 493 | objToMap, 494 | recursiveObjsToMap, 495 | sortMap, 496 | concatMap, 497 | isMap, 498 | isRealNum, 499 | findDuplicates, 500 | equalsArray, 501 | getQueryString, 502 | $extend, 503 | isWeixin, 504 | isMobileAgent, 505 | getIOSVersion 506 | } -------------------------------------------------------------------------------- /src/utils/window.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * 说明: 4 | * 在editor/show/master三个入口文件index.js中均引入了,按需修改 5 | * 6 | * 全局变量使用规则: 7 | * 1.优先使用store代替,或者挂载 Vue.prototype,若是跨js过多的flag,无法使用Vue.prototype的情况,使用全局变量 8 | * 2.严格按照内部分类挂载,更多分类自行添加 9 | * 3.所有变量预先初始化,加好注释 10 | * 4.可临时使用全局变量代替store存储,并加上TODO:表明后期会优化 11 | * 12 | */ 13 | 14 | window._vueMain={ 15 | //挂载全局flag使用 16 | flag:{ 17 | isDrawObjectFinished:true, //标识是否渲染canvas完成, //防止切换页过快,导致上一页没渲染完毕的组件被渲染到了当前切换页 18 | }, 19 | //挂载数组使用 20 | arr:{}, 21 | //挂载对象使用 22 | obj: { 23 | //TODO:迁移到store.common 模块中 24 | msLoadingState:{ //3D loading 样式 25 | stateOpen:false, //是否采用全局设置 //大部分情况不采用此设置 26 | display: 'none', //是否显示 'none' / 'flex' 27 | colorChange: false, //是否使用设置的背景颜色 28 | backgroundColor: 'rgba(0, 0, 0, 0.3)'//背景颜色 //用于黑色背景还是透明背景 29 | } 30 | 31 | }, 32 | //函数 33 | func:{ 34 | 35 | } 36 | }; -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | let path = require('path') 2 | function resolve(dir) { 3 | return path.join(__dirname, dir) 4 | } 5 | module.exports = { 6 | publicPath: process.env.NODE_ENV === 'production' 7 | ? '/LuckyBabylonDemo/' 8 | : '/', 9 | chainWebpack: config => { 10 | config.resolve.alias 11 | .set('@', resolve('src')) // key,value自行定义,比如.set('@@', resolve('src/components')) 12 | }, 13 | 14 | lintOnSave: false, 15 | 16 | pluginOptions: { 17 | i18n: { 18 | locale: 'en', 19 | fallbackLocale: 'en', 20 | localeDir: 'locales', 21 | enableInSFC: false 22 | } 23 | } 24 | } --------------------------------------------------------------------------------