starling-framework
Version:
A fast, productive library for 2D cross-platform development.
178 lines (162 loc) • 9.4 kB
JavaScript
// Class: starling.styles.DistanceFieldEffect
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 $import = require("./../../import_stub").default;
var $extend = require("./../../extend_stub").default;
function starling_rendering_MeshEffect() {return require("./../../starling/rendering/MeshEffect");}
function openfl__$Vector_Vector_$Impl_$() {return require("./../../openfl/_Vector/Vector_Impl_");}
function starling_rendering_FilterEffect() {return require("./../../starling/rendering/FilterEffect");}
function starling_rendering_Program() {return require("./../../starling/rendering/Program");}
function starling_styles_DistanceFieldStyle() {return require("./../../starling/styles/DistanceFieldStyle");}
function starling_utils_StringUtil() {return require("./../../starling/utils/StringUtil");}
// Constructor
var DistanceFieldEffect = function() {
(starling_rendering_MeshEffect().default).call(this);
this._scale = 1.0;
this._mode = "basic";
}
// Meta
DistanceFieldEffect.__name__ = ["starling","styles","DistanceFieldEffect"];
DistanceFieldEffect.__super__ = (starling_rendering_MeshEffect().default);
DistanceFieldEffect.prototype = $extend((starling_rendering_MeshEffect().default).prototype, {
createProgram: function() {
if(this.get_texture() != null) {
var isBasicMode = this._mode == "basic";
var isShadowMode = this._mode == "shadow";
var vertexShader = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,["m44 op, va0, vc0","mov v0, va1","mul vt4, va3.yyyy, vc4","mul v1, va2, vt4","mov v3, va3","mov v4, va4","mov v5, va5","mul vt4.w, vc4.w, va2.w","mul v4.y, va4.y, vt4.w","mul v5.w, va5.w, vt4.w","mul vt0.x, va3.w, vc5.z","mul vt0.x, vt0.x, vc5.w","div vt0.x, va3.z, vt0.x","mov vt1, vc4","sub vt1.x, va3.x, vt0.x","add vt1.y, va3.x, vt0.x"]);
if(!isBasicMode) {
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"sub vt1.z, va4.x, vt0.x");
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"add vt1.w, va4.x, vt0.x");
}
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"sat v6, vt1");
if(isShadowMode) {
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"mul vt0.xy, va4.zw, vc6.zz");
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"sub vt0.xy, vt0.xy, vc6.yy");
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"mul vt0.xy, vt0.xy, vc5.xy");
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"sub v7, va1, vt0.xyxy");
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"sub vt0.z, va3.x, va4.x");
(openfl__$Vector_Vector_$Impl_$().default).push(vertexShader,"add v7.z, va3.x, vt0.z");
}
var fragmentShader = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,[(starling_rendering_FilterEffect().default).tex("ft0","v0",0,this.get_texture()),this._multiChannel ? DistanceFieldEffect.median("ft0") : "mov ft0, ft0.xxxx","mov ft1, ft0",DistanceFieldEffect.step("ft1.w","v6.x","v6.y"),"mov ft3, ft1","mul ft1, v1, ft1.wwww"]);
if(isShadowMode) {
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,(starling_rendering_FilterEffect().default).tex("ft0","v7",0,this.get_texture()));
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,this._multiChannel ? DistanceFieldEffect.median("ft0") : "mov ft0, ft0.xxxx");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mov ft5.x, v7.z");
} else if(!isBasicMode) {
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mov ft5.x, v6.x");
}
if(!isBasicMode) {
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mov ft2, ft0");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,DistanceFieldEffect.step("ft2.w","v6.z","v6.w"));
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"sub ft2.w, ft2.w, ft3.w");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"sat ft2.w, ft2.w");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mov ft4, ft0");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,DistanceFieldEffect.step("ft4.w","v6.z","ft5.x"));
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"sub ft6.w, v5.w, v4.y");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mul ft4.w, ft4.w, ft6.w");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"add ft4.w, ft4.w, v4.y");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mul ft2.w, ft2.w, ft4.w");
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mul ft2.xyz, v5.xyz, ft2.www");
}
if(isBasicMode) {
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"mov oc, ft1");
} else {
(openfl__$Vector_Vector_$Impl_$().default).push(fragmentShader,"add oc, ft1, ft2");
}
return (starling_rendering_Program().default).fromSource(Array.prototype.join.call(vertexShader,"\n"),Array.prototype.join.call(fragmentShader,"\n"));
} else {
return (starling_rendering_MeshEffect().default).prototype.createProgram.call(this);
}
},
beforeDraw: function(context) {
(starling_rendering_MeshEffect().default).prototype.beforeDraw.call(this,context);
if(this.get_texture() != null) {
this.get_vertexFormat().setVertexBufferAt(3,this.get_vertexBuffer(),"basic");
this.get_vertexFormat().setVertexBufferAt(4,this.get_vertexBuffer(),"extended");
this.get_vertexFormat().setVertexBufferAt(5,this.get_vertexBuffer(),"outerColor");
var pixelWidth = 1.0 / (this.get_texture().get_root().get_nativeWidth() / this.get_texture().get_scale());
var pixelHeight = 1.0 / (this.get_texture().get_root().get_nativeHeight() / this.get_texture().get_scale());
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,0,8 * pixelWidth);
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,1,8 * pixelHeight);
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,2,8);
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,3,this._scale);
context.setProgramConstantsFromVector("vertex",5,DistanceFieldEffect.sVector);
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,0,0.0);
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,1,1.0);
(openfl__$Vector_Vector_$Impl_$().default).set(DistanceFieldEffect.sVector,2,2.0);
context.setProgramConstantsFromVector("vertex",6,DistanceFieldEffect.sVector);
}
},
afterDraw: function(context) {
if(this.get_texture() != null) {
context.setVertexBufferAt(3,null);
context.setVertexBufferAt(4,null);
context.setVertexBufferAt(5,null);
}
(starling_rendering_MeshEffect().default).prototype.afterDraw.call(this,context);
},
get_vertexFormat: function() {
return DistanceFieldEffect.VERTEX_FORMAT;
},
get_programVariantName: function() {
var modeBits;
var _g = this._mode;
switch(_g) {
case "glow":
modeBits = 2;
break;
case "outline":
modeBits = 1;
break;
case "shadow":
modeBits = 3;
break;
default:
modeBits = 0;
}
if(this._multiChannel) {
modeBits = modeBits | 4;
}
return (starling_rendering_MeshEffect().default).prototype.get_programVariantName.call(this) | modeBits << 8;
},
get_scale: function() {
return this._scale;
},
set_scale: function(value) {
return this._scale = value;
},
get_mode: function() {
return this._mode;
},
set_mode: function(value) {
return this._mode = value;
},
get_multiChannel: function() {
return this._multiChannel;
},
set_multiChannel: function(value) {
return this._multiChannel = value;
}
});
DistanceFieldEffect.prototype.__class__ = DistanceFieldEffect.prototype.constructor = $hxClasses["starling.styles.DistanceFieldEffect"] = DistanceFieldEffect;
// Init
// Statics
DistanceFieldEffect.step = function(inOutReg,minReg,maxReg,tmpReg) {
if(tmpReg == null) {
tmpReg = "ft6";
}
var ops = (openfl__$Vector_Vector_$Impl_$().default)._new(null,null,[(starling_utils_StringUtil().default).format("sub {0}, {1}, {2}",[tmpReg,maxReg,minReg]),(starling_utils_StringUtil().default).format("rcp {0}, {0}",[tmpReg]),(starling_utils_StringUtil().default).format("sub {0}, {0}, {1}",[inOutReg,minReg]),(starling_utils_StringUtil().default).format("mul {0}, {0}, {1}",[inOutReg,tmpReg]),(starling_utils_StringUtil().default).format("sat {0}, {0}",[inOutReg])]);
return Array.prototype.join.call(ops,"\n");
}
DistanceFieldEffect.median = function(inOutReg) {
return [(starling_utils_StringUtil().default).format("max {0}.xyz, {0}.xxy, {0}.yzz",[inOutReg]),(starling_utils_StringUtil().default).format("min {0}.x, {0}.x, {0}.y",[inOutReg]),(starling_utils_StringUtil().default).format("min {0}, {0}.xxxx, {0}.zzzz",[inOutReg])].join("\n");
}
DistanceFieldEffect.VERTEX_FORMAT = (starling_styles_DistanceFieldStyle().default).VERTEX_FORMAT
DistanceFieldEffect.MAX_OUTER_OFFSET = 8
DistanceFieldEffect.MAX_SCALE = 8
DistanceFieldEffect.sVector = (openfl__$Vector_Vector_$Impl_$().default)._new(4,true)
// Export
exports.default = DistanceFieldEffect;