layaair-js
Version:
An open source HTML5 engine. Edition JavaScript.
341 lines (299 loc) • 10 kB
JavaScript
(function(window,document,Laya){
var __un=Laya.un,__uns=Laya.uns,__static=Laya.static,__class=Laya.class,__getset=Laya.getset,__newvec=Laya.__newvec;
var BlendMode=laya.webgl.canvas.BlendMode,Browser=laya.utils.Browser,Color=laya.utils.Color,ColorFilterAction=laya.filters.ColorFilterAction;
var ColorFilterActionGL=laya.filters.webgl.ColorFilterActionGL,Filter=laya.filters.Filter,FilterActionGL=laya.filters.webgl.FilterActionGL;
var Matrix=laya.maths.Matrix,Rectangle=laya.maths.Rectangle,Render=laya.renders.Render,RenderContext=laya.renders.RenderContext;
var RenderTarget2D=laya.webgl.resource.RenderTarget2D,RunDriver=laya.utils.RunDriver,ShaderDefines2D=laya.webgl.shader.d2.ShaderDefines2D;
var Sprite=laya.display.Sprite,SubmitCMD=laya.webgl.submit.SubmitCMD,Texture=laya.resource.Texture,Value2D=laya.webgl.shader.d2.value.Value2D;
/**
*默认的FILTER,什么都不做
*@private
*/
//class laya.filters.FilterAction
var FilterAction=(function(){
function FilterAction(){
this.data=null;
}
__class(FilterAction,'laya.filters.FilterAction');
var __proto=FilterAction.prototype;
Laya.imps(__proto,{"laya.filters.IFilterAction":true})
__proto.apply=function(data){
return null;
}
return FilterAction;
})()
/**
*@private
*/
//class laya.filters.WebGLFilter
var WebGLFilter=(function(){
function WebGLFilter(){};
__class(WebGLFilter,'laya.filters.WebGLFilter');
WebGLFilter.enable=function(){
if (WebGLFilter.isInit)return;
WebGLFilter.isInit=true;
if (!Render.isWebGL)return;
RunDriver.createFilterAction=function (type){
var action;
switch (type){
case /*laya.filters.Filter.COLOR*/0x20:
action=new ColorFilterActionGL();
break ;
case /*laya.filters.Filter.BLUR*/0x10:
action=new BlurFilterActionGL();
break ;
case /*laya.filters.Filter.GLOW*/0x08:
action=new GlowFilterActionGL();
break ;
}
return action;
}
}
WebGLFilter.isInit=false;
WebGLFilter.__init$=function(){
BlurFilterActionGL;
ColorFilterActionGL;
GlowFilterActionGL;
Render;
RunDriver;{
RunDriver.createFilterAction=function (type){
var action;
switch (type){
case /*laya.filters.Filter.BLUR*/0x10:
action=new FilterAction();
break ;
case /*laya.filters.Filter.GLOW*/0x08:
action=new FilterAction();
break ;
case /*laya.filters.Filter.COLOR*/0x20:
action=new ColorFilterAction();
break ;
}
return action;
}
}
}
return WebGLFilter;
})()
/**
*模糊滤镜
*/
//class laya.filters.BlurFilter extends laya.filters.Filter
var BlurFilter=(function(_super){
function BlurFilter(strength){
this.strength=NaN;
BlurFilter.__super.call(this);
(strength===void 0)&& (strength=4);
if (Render.isWebGL)WebGLFilter.enable();
this.strength=strength;
this._action=RunDriver.createFilterAction(0x10);
this._action.data=this;
}
__class(BlurFilter,'laya.filters.BlurFilter',_super);
var __proto=BlurFilter.prototype;
/**
*@private 通知微端
*/
__proto.callNative=function(sp){
sp.model &&sp.model.blurFilter&&sp.model.blurFilter(this.strength);
}
/**
*@private
*当前滤镜对应的操作器
*/
__getset(0,__proto,'action',function(){
return this._action;
});
/**
*@private
*当前滤镜的类型
*/
__getset(0,__proto,'type',function(){
return 0x10;
});
return BlurFilter;
})(Filter)
/**
*发光滤镜(也可以当成阴影滤使用)
*/
//class laya.filters.GlowFilter extends laya.filters.Filter
var GlowFilter=(function(_super){
function GlowFilter(color,blur,offX,offY){
this._color=null;
GlowFilter.__super.call(this);
this._elements=new Float32Array(9);
(blur===void 0)&& (blur=4);
(offX===void 0)&& (offX=6);
(offY===void 0)&& (offY=6);
if (Render.isWebGL){
WebGLFilter.enable();
}
this._color=new Color(color);
this.blur=blur;
this.offX=offX;
this.offY=offY;
this._action=RunDriver.createFilterAction(0x08);
this._action.data=this;
}
__class(GlowFilter,'laya.filters.GlowFilter',_super);
var __proto=GlowFilter.prototype;
/**@private */
__proto.getColor=function(){
return this._color._color;
}
/**
*@private 通知微端
*/
__proto.callNative=function(sp){
sp.model &&sp.model.glowFilter&&sp.model.glowFilter(this._color.strColor,this._elements[4],this._elements[5],this._elements[6]);
}
/**
*@private
*滤镜类型
*/
__getset(0,__proto,'type',function(){
return 0x08;
});
/**@private */
__getset(0,__proto,'action',function(){
return this._action;
});
/**@private */
/**@private */
__getset(0,__proto,'offY',function(){
return this._elements[6];
},function(value){
this._elements[6]=value;
});
/**@private */
/**@private */
__getset(0,__proto,'offX',function(){
return this._elements[5];
},function(value){
this._elements[5]=value;
});
/**@private */
/**@private */
__getset(0,__proto,'blur',function(){
return this._elements[4];
},function(value){
this._elements[4]=value;
});
return GlowFilter;
})(Filter)
/**
*@private
*/
//class laya.filters.webgl.BlurFilterActionGL extends laya.filters.webgl.FilterActionGL
var BlurFilterActionGL=(function(_super){
function BlurFilterActionGL(){
this.data=null;
BlurFilterActionGL.__super.call(this);
}
__class(BlurFilterActionGL,'laya.filters.webgl.BlurFilterActionGL',_super);
var __proto=BlurFilterActionGL.prototype;
__proto.setValueMix=function(shader){
shader.defines.add(this.data.type);
var o=shader;
}
__proto.apply3d=function(scope,sprite,context,x,y){
var b=scope.getValue("bounds");
var shaderValue=Value2D.create(/*laya.webgl.shader.d2.ShaderDefines2D.TEXTURE2D*/0x01,0);
shaderValue.setFilters([this.data]);
var tMatrix=Matrix.EMPTY;
tMatrix.identity();
context.ctx.drawTarget(scope,0,0,b.width,b.height,Matrix.EMPTY,"src",shaderValue);
shaderValue.setFilters(null);
}
__proto.setValue=function(shader){
shader.strength=this.data.strength;
}
__getset(0,__proto,'typeMix',function(){return /*laya.filters.Filter.BLUR*/0x10;});
return BlurFilterActionGL;
})(FilterActionGL)
/**
*@private
*/
//class laya.filters.webgl.GlowFilterActionGL extends laya.filters.webgl.FilterActionGL
var GlowFilterActionGL=(function(_super){
function GlowFilterActionGL(){
this.data=null;
this._initKey=false;
this._textureWidth=0;
this._textureHeight=0;
GlowFilterActionGL.__super.call(this);
}
__class(GlowFilterActionGL,'laya.filters.webgl.GlowFilterActionGL',_super);
var __proto=GlowFilterActionGL.prototype;
Laya.imps(__proto,{"laya.filters.IFilterActionGL":true})
__proto.setValueMix=function(shader){}
__proto.apply3d=function(scope,sprite,context,x,y){
var b=scope.getValue("bounds");
scope.addValue("color",this.data.getColor());
var w=b.width,h=b.height;
this._textureWidth=w;
this._textureHeight=h;
var submit=SubmitCMD.create([scope,sprite,context,0,0],GlowFilterActionGL.tmpTarget);
context.ctx.addRenderObject(submit);
var shaderValue;
var mat=Matrix.TEMP;
mat.identity();
shaderValue=Value2D.create(/*laya.webgl.shader.d2.ShaderDefines2D.TEXTURE2D*/0x01,0);
shaderValue.setFilters([this.data]);
context.ctx.drawTarget(scope,0,0,this._textureWidth,this._textureHeight,mat,"src",shaderValue,null,BlendMode.TOINT.overlay);
submit=SubmitCMD.create([scope,sprite,context,0,0],GlowFilterActionGL.startOut);
context.ctx.addRenderObject(submit);
shaderValue=Value2D.create(/*laya.webgl.shader.d2.ShaderDefines2D.TEXTURE2D*/0x01,0);
context.ctx.drawTarget(scope,0,0,this._textureWidth,this._textureHeight,mat,"tmpTarget",shaderValue,Texture.INV_UV,BlendMode.TOINT.overlay);
shaderValue=Value2D.create(/*laya.webgl.shader.d2.ShaderDefines2D.TEXTURE2D*/0x01,0);
context.ctx.drawTarget(scope,0,0,this._textureWidth,this._textureHeight,mat,"src",shaderValue);
submit=SubmitCMD.create([scope,sprite,context,0,0],GlowFilterActionGL.recycleTarget);
context.ctx.addRenderObject(submit);
return null;
}
__proto.setSpriteWH=function(sprite){
this._textureWidth=sprite.width;
this._textureHeight=sprite.height;
}
__proto.setValue=function(shader){
shader.u_offsetX=this.data.offX;
shader.u_offsetY=-this.data.offY;
shader.u_strength=1.0;
shader.u_blurX=this.data.blur;
shader.u_blurY=this.data.blur;
shader.u_textW=this._textureWidth;
shader.u_textH=this._textureHeight;
shader.u_color=this.data.getColor();
}
__getset(0,__proto,'typeMix',function(){return /*laya.filters.Filter.GLOW*/0x08;});
GlowFilterActionGL.tmpTarget=function(scope,sprite,context,x,y){
var b=scope.getValue("bounds");
var out=scope.getValue("out");
out.end();
var tmpTarget=RenderTarget2D.create(b.width,b.height);
tmpTarget.start();
var color=scope.getValue("color");
if (color){
tmpTarget.clear(color[0],color[1],color[2],0);
}
scope.addValue("tmpTarget",tmpTarget);
}
GlowFilterActionGL.startOut=function(scope,sprite,context,x,y){
var tmpTarget=scope.getValue("tmpTarget");
tmpTarget.end();
var out=scope.getValue("out");
out.start();
var color=scope.getValue("color");
if (color){
out.clear(color[0],color[1],color[2],0);
}
}
GlowFilterActionGL.recycleTarget=function(scope,sprite,context,x,y){
var src=scope.getValue("src");
var tmpTarget=scope.getValue("tmpTarget");
tmpTarget.recycle();
}
return GlowFilterActionGL;
})(FilterActionGL)
Laya.__init([WebGLFilter]);
})(window,document,Laya);