UNPKG

starling-framework

Version:

A fast, productive library for 2D cross-platform development.

204 lines (187 loc) 8.82 kB
// Class: starling.styles.MultiTextureEffect var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this $global.Object.defineProperty(exports, "__esModule", {value: true}); var __map_reserved = {}; // Imports var $hxClasses = require("./../../hxClasses_stub").default; var $hxEnums = require("./../../hxEnums_stub").default; var $import = require("./../../import_stub").default; var $extend = require("./../../extend_stub").default; function starling_rendering_MeshEffect() {return require("./../../starling/rendering/MeshEffect");} function starling_utils_RenderUtil() {return require("./../../starling/utils/RenderUtil");} function starling_rendering_FilterEffect() {return require("./../../starling/rendering/FilterEffect");} function openfl__$Vector_Vector_$Impl_$() {return require("./../../openfl/_Vector/Vector_Impl_");} function starling_rendering_Program() {return require("./../../starling/rendering/Program");} function js__$Boot_HaxeError() {return require("./../../js/_Boot/HaxeError");} function openfl_errors_Error() {return $import(require("openfl/errors/Error"));} function starling_styles_MultiTextureStyle() {return require("./../../starling/styles/MultiTextureStyle");} function starling_core_Starling() {return require("./../../starling/core/Starling");} // Constructor var MultiTextureEffect = function() { (starling_rendering_MeshEffect().default).call(this); this.__isBaseline = (starling_core_Starling().default).get_current().get_profile() == "baseline" || (starling_core_Starling().default).get_current().get_profile() == "baselineConstrained" || (starling_core_Starling().default).get_current().get_profile() == "baselineExtended"; if(this.__isBaseline) { this._multiTexturingConstants = MultiTextureEffect.baselineTextureIndices; } else { this._multiTexturingConstants = MultiTextureEffect.textureIndices; } } // Meta MultiTextureEffect.__name__ = "starling.styles.MultiTextureEffect"; MultiTextureEffect.__isInterface__ = false; MultiTextureEffect.__super__ = (starling_rendering_MeshEffect().default); MultiTextureEffect.prototype = $extend((starling_rendering_MeshEffect().default).prototype, { get_programVariantName: function() { var bits = (starling_rendering_MeshEffect().default).prototype.get_programVariantName.call(this); var _g = 0; var _g1 = this.textures.length; while(_g < _g1) { var i = _g++; bits = bits | (starling_utils_RenderUtil().default).getTextureVariantBits(this.textures[i]) << i + 4; } return bits; }, createProgram: function() { var length = this.textures.length; if(length > 0) { var fragmentShader = []; var vertexShader = "m44 op, va0, vc0\n" + "mov v0, va1\n" + "mul v1, va2, vc4\n" + "mov v2, va3"; if(this.__isBaseline) { fragmentShader.push("slt ft4, v2.xxxx, fc0"); fragmentShader.push((starling_rendering_FilterEffect().default).tex("ft0","v0",0,this.get_texture())); fragmentShader.push("min ft5, ft4.xxxx, ft0"); fragmentShader.push("sub ft6, fc1.xxxx, ft4"); fragmentShader.push((starling_rendering_FilterEffect().default).tex("ft1","v0",1,this.textures[0])); if(length > 1) { fragmentShader.push("min ft6.xyz, ft6.xyz, ft4.yzw"); fragmentShader.push("min ft0, ft6.xxxx, ft1"); fragmentShader.push("add ft5, ft5, ft0"); fragmentShader.push((starling_rendering_FilterEffect().default).tex("ft2","v0",2,this.textures[1])); fragmentShader.push("min ft0, ft6.yyyy, ft2"); if(length > 2) { fragmentShader.push("add ft5, ft5, ft0"); fragmentShader.push((starling_rendering_FilterEffect().default).tex("ft3","v0",3,this.textures[2])); fragmentShader.push("min ft0, ft6.zzzz, ft3"); if(length > 3) { fragmentShader.push("add ft5, ft5, ft0"); fragmentShader.push((starling_rendering_FilterEffect().default).tex("ft4","v0",4,this.textures[3])); fragmentShader.push("min ft0, ft6.wwww, ft4"); } } } else { fragmentShader.push("min ft0, ft6.xxxx, ft1"); } fragmentShader.push("add ft5, ft5, ft0"); fragmentShader.push("mul oc, ft5, v1"); } else { (openfl__$Vector_Vector_$Impl_$().default).unshift(this.textures,this._texture); this.multiTex(fragmentShader,this.textures); (openfl__$Vector_Vector_$Impl_$().default).shift(this.textures); fragmentShader.push("mul oc, ft0, v1"); } return (starling_rendering_Program().default).fromSource(vertexShader,fragmentShader.join("\n"),this.__isBaseline ? 1 : 2,!this.__isBaseline); } return (starling_rendering_MeshEffect().default).prototype.createProgram.call(this); }, multiTex: function(data,textures,numTextures,textureOffset,textureRegister,textureIndexSource,constantsStartIndex) { if(constantsStartIndex == null) { constantsStartIndex = 0; } if(textureIndexSource == null) { textureIndexSource = "v2.x"; } if(textureRegister == null) { textureRegister = "ft0"; } if(textureOffset == null) { textureOffset = 0; } if(numTextures == null) { numTextures = 0; } if(numTextures == 0) { numTextures = textures.length; } if(numTextures <= 2) { if(numTextures == 2) { this.checkTexIndex(data,textureOffset,textureIndexSource,constantsStartIndex); data[data.length] = (starling_utils_RenderUtil().default).createAGALTexOperation(textureRegister,"v0",textureOffset,textures[textureOffset]); data[data.length] = "els"; data[data.length] = (starling_utils_RenderUtil().default).createAGALTexOperation(textureRegister,"v0",textureOffset + 1,textures[textureOffset + 1]); data[data.length] = "eif"; } else { data[data.length] = (starling_utils_RenderUtil().default).createAGALTexOperation(textureRegister,"v0",textureOffset,textures[textureOffset]); } } else { var halfNumTextures = Math.ceil(numTextures / 2); var remainingTextures = numTextures - halfNumTextures; this.checkTexIndex(data,textureOffset + halfNumTextures - 1,textureIndexSource,constantsStartIndex); this.multiTex(data,textures,halfNumTextures,textureOffset,textureRegister,textureIndexSource,constantsStartIndex); data[data.length] = "els"; this.multiTex(data,textures,remainingTextures,textureOffset + halfNumTextures,textureRegister,textureIndexSource,constantsStartIndex); data[data.length] = "eif"; } }, checkTexIndex: function(data,textureNum,textureIndexSource,constantsStartIndex) { var constantIndex = constantsStartIndex + Math.floor(textureNum / 4); var constantSubIndex = textureNum % 4; var constant; switch(constantSubIndex) { case 0: constant = " fc" + constantIndex + ".x"; break; case 1: constant = " fc" + constantIndex + ".y"; break; case 2: constant = " fc" + constantIndex + ".z"; break; case 3: constant = " fc" + constantIndex + ".w"; break; default: throw new (js__$Boot_HaxeError().default)(new (openfl_errors_Error().default)("incorrect constant sub index")); } data[data.length] = "ifl " + textureIndexSource + constant; }, beforeDraw: function(context) { (starling_rendering_MeshEffect().default).prototype.beforeDraw.call(this,context); var length = this.textures.length; if(length > 0) { var _g = 0; var _g1 = length; while(_g < _g1) { var i = _g++; var texture = this.textures[i]; (starling_utils_RenderUtil().default).setSamplerStateAt(i + 1,texture.get_mipMapping(),this.get_textureSmoothing(),this.get_textureRepeat()); context.setTextureAt(i + 1,texture.get_base()); } this.get_vertexFormat().setVertexBufferAt(3,this.get_vertexBuffer(),"texture"); context.setProgramConstantsFromVector("fragment",0,this._multiTexturingConstants,this.__isBaseline ? 2 : Math.ceil((length + 1) / 4)); } }, afterDraw: function(context) { var length = this.textures.length; if(length > 0) { var _g = 0; var _g1 = length; while(_g < _g1) { var i = _g++; context.setTextureAt(i + 1,null); } context.setVertexBufferAt(3,null); } (starling_rendering_MeshEffect().default).prototype.afterDraw.call(this,context); }, get_vertexFormat: function() { return MultiTextureEffect.VERTEX_FORMAT; } }); MultiTextureEffect.prototype.__class__ = MultiTextureEffect.prototype.constructor = $hxClasses["starling.styles.MultiTextureEffect"] = MultiTextureEffect; // Init // Statics MultiTextureEffect.VERTEX_FORMAT = (starling_styles_MultiTextureStyle().default).VERTEX_FORMAT MultiTextureEffect.baselineTextureIndices = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,[0.125,0.375,0.625,0.875,1,0,0,0]) MultiTextureEffect.textureIndices = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,[0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5]) // Export exports.default = MultiTextureEffect;