starling-framework
Version:
A fast, productive library for 2D cross-platform development.
204 lines (187 loc) • 8.82 kB
JavaScript
// 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;