babylon.asciiArtPostProcess.min.js 4.8 KB

1
  1. var __decorate=this&&this.__decorate||function(t,e,i,n){if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)return Reflect.decorate(t,e,i,n);switch(arguments.length){case 2:return t.reduceRight(function(t,e){return e&&e(t)||t},e);case 3:return t.reduceRight(function(t,n){return void(n&&n(e,i))},void 0);case 4:return t.reduceRight(function(t,n){return n&&n(e,i,t)||t},n)}},BABYLON;!function(t){var e=function(e){function i(i,n,r,o){e.call(this,o),this.name=i,this._text==r,this._font==n,this.wrapU=t.Texture.CLAMP_ADDRESSMODE,this.wrapV=t.Texture.CLAMP_ADDRESSMODE;var a=this.getFontHeight(n),c=this.getFontWidth(n);this._charSize=Math.max(a.height,c);var l=Math.ceil(this._charSize*r.length),s=this._charSize;this._texture=o.getEngine().createDynamicTexture(l,s,!1,t.Texture.NEAREST_SAMPLINGMODE);var f=this.getSize(),h=document.createElement("canvas");h.width=f.width,h.height=f.height;var u=h.getContext("2d");u.textBaseline="top",u.font=n,u.fillStyle="white",u.imageSmoothingEnabled=!1;for(var g=0;g<r.length;g++)u.fillText(r[g],g*this._charSize,-a.offset);this.getScene().getEngine().updateDynamicTexture(this._texture,h,!1,!0)}return __extends(i,e),Object.defineProperty(i.prototype,"charSize",{get:function(){return this._charSize},enumerable:!0,configurable:!0}),i.prototype.getFontWidth=function(t){var e=document.createElement("canvas"),i=e.getContext("2d");return i.fillStyle="white",i.font=t,i.measureText("W").width},i.prototype.getFontHeight=function(t){var e=document.createElement("canvas"),i=e.getContext("2d");i.fillRect(0,0,e.width,e.height),i.textBaseline="top",i.fillStyle="white",i.font=t,i.fillText("jH|",0,0);for(var n=i.getImageData(0,0,e.width,e.height).data,r=-1,o=-1,a=0;a<e.height;a++)for(var c=0;c<e.width;c++){var l=4*(a*e.width+c);{if(0!==n[l]){-1===r&&(r=a);break}if(c===e.width-1&&-1!==r){o=a,a=e.height;break}}}return{height:o-r+1,offset:r-1}},i.prototype.clone=function(){return new i(this.name,this._font,this._text,this.getScene())},i.Parse=function(e,n){var r=t.SerializationHelper.Parse(function(){return new i(e.name,e.font,e.text,n)},e,n,null);return r},__decorate([t.serialize("font")],i.prototype,"_font"),__decorate([t.serialize("text")],i.prototype,"_text"),i}(t.BaseTexture);t.AsciiArtFontTexture=e;var i=function(i){function n(n,r,o){var a=this;i.call(this,n,"asciiart",["asciiArtFontInfos","asciiArtOptions"],["asciiArtFont"],{width:r.getEngine().getRenderWidth(),height:r.getEngine().getRenderHeight()},r,t.Texture.TRILINEAR_SAMPLINGMODE,r.getEngine(),!0),this.mixToTile=0,this.mixToNormal=0;var c="40px Monospace",l=" `-.'_:,\"=^;<+!*?/cL\\zrs7TivJtC{3F)Il(xZfY5S2eajo14[nuyE]P6V9kXpKwGhqAUbOd8#HRDB0$mgMW&Q%N@";o&&("string"==typeof o?c=o:(c=o.font||c,l=o.characterSet||l,this.mixToTile=o.mixToTile||this.mixToTile,this.mixToNormal=o.mixToNormal||this.mixToNormal)),this._asciiArtFontTexture=new e(n,c,l,r.getScene());var s=this._asciiArtFontTexture.getSize();this.onApply=function(t){t.setTexture("asciiArtFont",a._asciiArtFontTexture),t.setFloat4("asciiArtFontInfos",a._asciiArtFontTexture.charSize,l.length,s.width,s.height),t.setFloat4("asciiArtOptions",a.width,a.height,a.mixToNormal,a.mixToTile)}}return __extends(n,i),n}(t.PostProcess);t.AsciiArtPostProcess=i}(BABYLON||(BABYLON={})),BABYLON.Effect.ShadersStore.asciiartPixelShader="// Samplers.\nvarying vec2 vUV;\nuniform sampler2D textureSampler;\nuniform sampler2D asciiArtFont;\n\n// Infos.\nuniform vec4 asciiArtFontInfos;\nuniform vec4 asciiArtOptions;\n\n// Transform color to luminance.\nfloat getLuminance(vec3 color)\n{\n return clamp(dot(color, vec3(0.2126, 0.7152, 0.0722)), 0., 1.);\n}\n\n// Main functions.\nvoid main(void) \n{\n float caracterSize = asciiArtFontInfos.x;\n float numChar = asciiArtFontInfos.y - 1.0;\n float fontx = asciiArtFontInfos.z;\n float fonty = asciiArtFontInfos.w;\n\n float screenx = asciiArtOptions.x;\n float screeny = asciiArtOptions.y;\n\n float tileX = float(floor((gl_FragCoord.x) / caracterSize)) * caracterSize / screenx;\n float tileY = float(floor((gl_FragCoord.y) / caracterSize)) * caracterSize / screeny;\n\n vec2 tileUV = vec2(tileX, tileY);\n vec4 tileColor = texture2D(textureSampler, tileUV);\n vec4 baseColor = texture2D(textureSampler, vUV);\n\n float tileLuminance = getLuminance(tileColor.rgb);\n\n float offsetx = (float(floor(tileLuminance * numChar))) * caracterSize / fontx;\n float offsety = 0.0;\n\n float x = float(mod(gl_FragCoord.x, caracterSize)) / fontx;\n float y = float(mod(gl_FragCoord.y, caracterSize)) / fonty;\n\n vec4 finalColor = texture2D(asciiArtFont, vec2(offsetx + x, offsety + (caracterSize / fonty - y)));\n finalColor.rgb *= tileColor.rgb;\n finalColor.a = 1.0;\n\n finalColor = mix(finalColor, tileColor, asciiArtOptions.w);\n finalColor = mix(finalColor, baseColor, asciiArtOptions.z);\n\n gl_FragColor = finalColor;\n}";