123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969 |
- var BABYLON;
- (function (BABYLON) {
- var ShaderMaterialHelperStatics = (function () {
- function ShaderMaterialHelperStatics() {
- }
- ShaderMaterialHelperStatics.Dark = false;
- ShaderMaterialHelperStatics.Light = true;
- ShaderMaterialHelperStatics.PrecisionHighMode = 'highp';
- ShaderMaterialHelperStatics.PrecisionMediumMode = 'mediump';
- ShaderMaterialHelperStatics.face_back = "!gl_FrontFacing";
- ShaderMaterialHelperStatics.face_front = "gl_FrontFacing";
- ShaderMaterialHelperStatics.AttrPosition = 'position';
- ShaderMaterialHelperStatics.AttrNormal = 'normal';
- ShaderMaterialHelperStatics.AttrUv = 'uv';
- ShaderMaterialHelperStatics.AttrUv2 = 'uv2';
- ShaderMaterialHelperStatics.AttrTypeForPosition = 'vec3';
- ShaderMaterialHelperStatics.AttrTypeForNormal = 'vec3';
- ShaderMaterialHelperStatics.AttrTypeForUv = 'vec2';
- ShaderMaterialHelperStatics.AttrTypeForUv2 = 'vec2';
- ShaderMaterialHelperStatics.uniformView = "view";
- ShaderMaterialHelperStatics.uniformWorld = "world";
- ShaderMaterialHelperStatics.uniformWorldView = "worldView";
- ShaderMaterialHelperStatics.uniformViewProjection = "viewProjection";
- ShaderMaterialHelperStatics.uniformWorldViewProjection = "worldViewProjection";
- ShaderMaterialHelperStatics.uniformStandardType = "mat4";
- ShaderMaterialHelperStatics.uniformFlags = "flags";
- ShaderMaterialHelperStatics.Mouse = "mouse";
- ShaderMaterialHelperStatics.Screen = "screen";
- ShaderMaterialHelperStatics.Camera = "camera";
- ShaderMaterialHelperStatics.Look = "look";
- ShaderMaterialHelperStatics.Time = "time";
- ShaderMaterialHelperStatics.GlobalTime = "gtime";
- ShaderMaterialHelperStatics.Position = "pos";
- ShaderMaterialHelperStatics.WorldPosition = "wpos";
- ShaderMaterialHelperStatics.Normal = "nrm";
- ShaderMaterialHelperStatics.WorldNormal = "wnrm";
- ShaderMaterialHelperStatics.Uv = "vuv";
- ShaderMaterialHelperStatics.Uv2 = "vuv2";
- ShaderMaterialHelperStatics.Center = 'center';
- ShaderMaterialHelperStatics.ReflectMatrix = "refMat";
- ShaderMaterialHelperStatics.Texture2D = "txtRef_";
- ShaderMaterialHelperStatics.TextureCube = "cubeRef_";
- return ShaderMaterialHelperStatics;
- })();
- BABYLON.ShaderMaterialHelperStatics = ShaderMaterialHelperStatics;
- var Normals = (function () {
- function Normals() {
- }
- Normals.Default = ShaderMaterialHelperStatics.Normal;
- Normals.Inverse = '-1.*' + ShaderMaterialHelperStatics.Normal;
- Normals.Pointed = 'normalize(' + ShaderMaterialHelperStatics.Position + '-' + ShaderMaterialHelperStatics.Center + ')';
- Normals.Flat = 'normalize(cross(dFdx(' + ShaderMaterialHelperStatics.Position + ' * -1.), dFdy(' + ShaderMaterialHelperStatics.Position + ')))';
- Normals.Map = 'normalMap()';
- return Normals;
- })();
- BABYLON.Normals = Normals;
- var Speculars = (function () {
- function Speculars() {
- }
- Speculars.Map = 'specularMap()';
- return Speculars;
- })();
- var ShaderMaterialHelper = (function () {
- function ShaderMaterialHelper() {
- }
- ShaderMaterialHelper.prototype.ShaderMaterial = function (name, scene, shader, helpers) {
- return this.MakeShaderMaterialForEngine(name, scene, shader, helpers);
- };
- ShaderMaterialHelper.prototype.MakeShaderMaterialForEngine = function (name, scene, shader, helpers) { return {}; };
- ShaderMaterialHelper.prototype.DefineTexture = function (txt, scene) {
- return null;
- };
- ShaderMaterialHelper.prototype.DefineCubeTexture = function (txt, scene) {
- return null;
- };
- ShaderMaterialHelper.prototype.SetUniforms = function (meshes, cameraPos, cameraTarget, mouse, screen, time) {
- };
- return ShaderMaterialHelper;
- })();
- BABYLON.ShaderMaterialHelper = ShaderMaterialHelper;
- var Shader = (function () {
- function Shader() {
- }
- Shader.Replace = function (s, t, d) {
- var ignore = null;
- return s.replace(new RegExp(t.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, "\\$&"), (ignore ? "gi" : "g")), (typeof (d) == "string") ? d.replace(/\$/g, "$$$$") : d);
- };
- Shader.Def = function (a, d) {
- if (a != undefined && a != null)
- return (d != undefined && d != null ? a : true);
- else if (d != Shader._null)
- return (d != undefined && d != null ? d : false);
- return null;
- };
- Shader.Join = function (s) {
- return s.join("\n\
- ");
- };
- Shader.Print = function (n) {
- if (n == undefined)
- return "0.";
- var sn = Shader.Replace(n.toString(), '-', '0');
- var reg = new RegExp('^\\d+$');
- if (reg.test(sn) && n.toString().indexOf('.') == -1)
- return n + ".";
- return n.toString();
- };
- Shader.Custom = function () {
- return "custom_" + this.Print(++this.Me.CustomIndexer) + "_";
- };
- Shader.Index = function () {
- return "_" + Shader.Indexer + "_";
- };
- Shader.DefCustom = function (t, c) {
- this.Me.Body += t + " custom_" + this.Print(++this.Me.CustomIndexer) + "_ = " + c + ";";
- };
- Shader._null = 'set null anyway';
- return Shader;
- })();
- BABYLON.Shader = Shader;
- var Helper = (function () {
- function Helper() {
- var setting = Shader.Me.Setting;
- var instance = new ShaderBuilder();
- instance.Parent = Shader.Me;
- instance.Setting = setting;
- return instance;
- }
- Helper.Red = 0;
- Helper.Yellow = 1;
- Helper.White = 2;
- Helper.Cyan = 4;
- Helper.Blue = 5;
- Helper.Pink = 6;
- Helper.Black = 7;
- Helper.Green = 8;
- return Helper;
- })();
- BABYLON.Helper = Helper;
- var ShaderSetting = (function () {
- function ShaderSetting() {
- this.PrecisionMode = ShaderMaterialHelperStatics.PrecisionHighMode;
- }
- return ShaderSetting;
- })();
- BABYLON.ShaderSetting = ShaderSetting;
- var ShaderBuilder = (function () {
- function ShaderBuilder() {
- this.Setting = new ShaderSetting();
- this.Extentions = [];
- this.Attributes = [];
- this.Fragment = [];
- this.Helpers = [];
- this.Uniforms = [];
- this.Varings = [];
- this.Vertex = [];
- this.Setting.Uv = true;
- this.Setting.Time = true;
- this.Setting.Camera = true;
- this.Setting.Helpers = true;
- this.Setting.NormalMap = "result = vec4(0.5);";
- this.Setting.SpecularMap = "float_result = 1.0;";
- this.Setting.NormalOpacity = "0.5";
- this.Setting.Normal = ShaderMaterialHelperStatics.Normal;
- if (Shader.Indexer == null)
- Shader.Indexer = 1;
- this.CustomIndexer = 1;
- Shader.Me = this;
- }
- ShaderBuilder.InitializeEngine = function () {
- eval(BABYLON.Shader.Replace(BABYLON.Shader.Replace("BABYLON.ShaderMaterialHelper.prototype.MakeShaderMaterialForEngine=function(name,scene,shader,helpers){BABYLON.Effect.ShadersStore[name+#[QT]VertexShader#[QT]]=shader.Vertex;BABYLON.Effect.ShadersStore[name+#[QT]PixelShader#[QT]]=shader.Pixel;return new BABYLON.ShaderMaterial(name,scene,{vertex:name,fragment:name},helpers);}", "#[QT]", '"'), '#[T]', "'"));
- eval(BABYLON.Shader.Replace(BABYLON.Shader.Replace("BABYLON.ShaderMaterialHelper.prototype.DefineTexture = function (option, sc) { var tx = new BABYLON.Texture(option, sc); return tx; } ", "#[QT]", '"'), '#[T]', "'"));
- eval(BABYLON.Shader.Replace(BABYLON.Shader.Replace("BABYLON.ShaderMaterialHelper.prototype.DefineCubeTexture = function (option, sc) { var tx = new BABYLON.CubeTexture(option, sc); tx.coordinatesMode = BABYLON.Texture.PLANAR_MODE; return tx; } ", "#[QT]", '"'), '#[T]', "'"));
- eval(BABYLON.Shader.Replace(BABYLON.Shader.Replace("BABYLON.ShaderMaterialHelper.prototype.SetUniforms = function (meshes, cameraPos, cameraTarget, mouse, screen, time) { for (var ms in meshes) { ms = meshes[ms]; if (ms.material && (ms.material.ShaderSetting != null || ms.material.ShaderSetting != undefined)) { if (ms.material.ShaderSetting.Camera) ms.material.setVector3(BABYLON.ShaderMaterialHelperStatics.Camera, cameraPos); if (ms.material.ShaderSetting.Center) ms.material.setVector3(BABYLON.ShaderMaterialHelperStatics.Center, { x: 0., y: 0., z: 0. }); if (ms.material.ShaderSetting.Mouse) ms.material.setVector2(BABYLON.ShaderMaterialHelperStatics.Mouse, mouse); if (ms.material.ShaderSetting.Screen) ms.material.setVector2(BABYLON.ShaderMaterialHelperStatics.Screen, screen); if (ms.material.ShaderSetting.GlobalTime) ms.material.setVector4(BABYLON.ShaderMaterialHelperStatics.GlobalTime, { x: 0., y: 0., z: 0., w: 0. }); if (ms.material.ShaderSetting.Look) ms.material.setVector3(BABYLON.ShaderMaterialHelperStatics.Look, cameraTarget); if (ms.material.ShaderSetting.Time) ms.material.setFloat(BABYLON.ShaderMaterialHelperStatics.Time, time); } } }", "#[QT]", '"'), '#[T]', "'"));
- };
- ShaderBuilder.prototype.PrepareBeforeMaterialBuild = function (scene) {
- this.Setting = Shader.Me.Setting;
- this.Attributes.push(ShaderMaterialHelperStatics.AttrPosition);
- this.Attributes.push(ShaderMaterialHelperStatics.AttrNormal);
- if (this.Setting.Uv) {
- this.Attributes.push(ShaderMaterialHelperStatics.AttrUv);
- }
- if (this.Setting.Uv2) {
- this.Attributes.push(ShaderMaterialHelperStatics.AttrUv2);
- }
- this.Uniforms.push(ShaderMaterialHelperStatics.uniformView, ShaderMaterialHelperStatics.uniformWorld, ShaderMaterialHelperStatics.uniformWorldView, ShaderMaterialHelperStatics.uniformViewProjection, ShaderMaterialHelperStatics.uniformWorldViewProjection);
- // start Build Vertex Frame
- this.Vertex.push("precision " + this.Setting.PrecisionMode + " float;");
- this.Vertex.push("attribute " + ShaderMaterialHelperStatics.AttrTypeForPosition + " " + ShaderMaterialHelperStatics.AttrPosition + ";");
- this.Vertex.push("attribute " + ShaderMaterialHelperStatics.AttrTypeForNormal + " " + ShaderMaterialHelperStatics.AttrNormal + ";");
- if (this.Setting.Uv) {
- this.Vertex.push("attribute " + ShaderMaterialHelperStatics.AttrTypeForUv + " " + ShaderMaterialHelperStatics.AttrUv + ";");
- this.Vertex.push("varying vec2 " + ShaderMaterialHelperStatics.Uv + ";");
- }
- if (this.Setting.Uv2) {
- this.Vertex.push("attribute " + ShaderMaterialHelperStatics.AttrTypeForUv2 + " " + ShaderMaterialHelperStatics.AttrUv2 + ";");
- this.Vertex.push("varying vec2 " + ShaderMaterialHelperStatics.Uv2 + ";");
- }
- this.Vertex.push("varying vec3 " + ShaderMaterialHelperStatics.Position + ";");
- this.Vertex.push("varying vec3 " + ShaderMaterialHelperStatics.Normal + ";");
- this.Vertex.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformWorldViewProjection + ";");
- if (this.Setting.VertexView) {
- this.Vertex.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformView + ";");
- }
- if (this.Setting.VertexWorld) {
- this.Vertex.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformWorld + ";");
- }
- if (this.Setting.VertexViewProjection) {
- this.Vertex.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformViewProjection + ";");
- }
- if (this.Setting.Flags) {
- this.Uniforms.push(ShaderMaterialHelperStatics.uniformFlags);
- this.Vertex.push("uniform float " + ShaderMaterialHelperStatics.uniformFlags + ";");
- }
- if (this.Setting.VertexWorldView) {
- this.Vertex.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformWorldView + ";");
- }
- /*#extension GL_OES_standard_derivatives : enable*/
- this.Fragment.push("precision " + this.Setting.PrecisionMode + " float;\n\
- #extension GL_OES_standard_derivatives : enable\n\
- \n\
- \n\
- ");
- if (this.Setting.Uv) {
- this.Fragment.push("varying vec2 " + ShaderMaterialHelperStatics.Uv + ";");
- }
- if (this.Setting.Uv2) {
- this.Fragment.push("varying vec2 " + ShaderMaterialHelperStatics.Uv2 + ";");
- }
- if (this.Setting.FragmentView) {
- this.Fragment.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformView + ";");
- }
- if (this.Setting.FragmentWorld) {
- this.Fragment.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformWorld + ";");
- }
- if (this.Setting.FragmentViewProjection) {
- this.Fragment.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformViewProjection + ";");
- }
- if (this.Setting.FragmentWorldView) {
- this.Fragment.push("uniform " + ShaderMaterialHelperStatics.uniformStandardType + ' ' + ShaderMaterialHelperStatics.uniformWorldView + ";");
- }
- if (this.Setting.Flags) {
- this.Fragment.push("uniform float " + ShaderMaterialHelperStatics.uniformFlags + ";");
- }
- this.Fragment.push("varying vec3 " + ShaderMaterialHelperStatics.Position + ";");
- this.Fragment.push("varying vec3 " + ShaderMaterialHelperStatics.Normal + ";");
- if (this.Setting.WorldPosition) {
- this.Vertex.push("varying vec3 " + ShaderMaterialHelperStatics.WorldPosition + ";");
- this.Vertex.push("varying vec3 " + ShaderMaterialHelperStatics.WorldNormal + ";");
- this.Fragment.push("varying vec3 " + ShaderMaterialHelperStatics.WorldPosition + ";");
- this.Fragment.push("varying vec3 " + ShaderMaterialHelperStatics.WorldNormal + ";");
- }
- if (this.Setting.Texture2Ds != null) {
- for (var s in this.Setting.Texture2Ds) {
- if (this.Setting.Texture2Ds[s].inVertex) {
- this.Vertex.push("uniform sampler2D " + ShaderMaterialHelperStatics.Texture2D + s + ";");
- }
- if (this.Setting.Texture2Ds[s].inFragment) {
- this.Fragment.push("uniform sampler2D " + ShaderMaterialHelperStatics.Texture2D + s + ";");
- }
- }
- }
- if (this.Setting.TextureCubes != null) {
- for (var s in this.Setting.TextureCubes) {
- if (this.Setting.TextureCubes[s].inVertex) {
- this.Vertex.push("uniform samplerCube " + ShaderMaterialHelperStatics.TextureCube + s + ";");
- }
- if (this.Setting.TextureCubes[s].inFragment) {
- this.Fragment.push("uniform samplerCube " + ShaderMaterialHelperStatics.TextureCube + s + ";");
- }
- }
- }
- if (this.Setting.Center) {
- this.Vertex.push("uniform vec3 " + ShaderMaterialHelperStatics.Center + ";");
- this.Fragment.push("uniform vec3 " + ShaderMaterialHelperStatics.Center + ";");
- }
- if (this.Setting.Mouse) {
- this.Vertex.push("uniform vec2 " + ShaderMaterialHelperStatics.Mouse + ";");
- this.Fragment.push("uniform vec2 " + ShaderMaterialHelperStatics.Mouse + ";");
- }
- if (this.Setting.Screen) {
- this.Vertex.push("uniform vec2 " + ShaderMaterialHelperStatics.Screen + ";");
- this.Fragment.push("uniform vec2 " + ShaderMaterialHelperStatics.Screen + ";");
- }
- if (this.Setting.Camera) {
- this.Vertex.push("uniform vec3 " + ShaderMaterialHelperStatics.Camera + ";");
- this.Fragment.push("uniform vec3 " + ShaderMaterialHelperStatics.Camera + ";");
- }
- if (this.Setting.Look) {
- this.Vertex.push("uniform vec3 " + ShaderMaterialHelperStatics.Look + ";");
- this.Fragment.push("uniform vec3 " + ShaderMaterialHelperStatics.Look + ";");
- }
- if (this.Setting.Time) {
- this.Vertex.push("uniform float " + ShaderMaterialHelperStatics.Time + ";");
- this.Fragment.push("uniform float " + ShaderMaterialHelperStatics.Time + ";");
- }
- if (this.Setting.GlobalTime) {
- this.Vertex.push("uniform vec4 " + ShaderMaterialHelperStatics.GlobalTime + ";");
- this.Fragment.push("uniform vec4 " + ShaderMaterialHelperStatics.GlobalTime + ";");
- }
- if (this.Setting.ReflectMatrix) {
- this.Vertex.push("uniform mat4 " + ShaderMaterialHelperStatics.ReflectMatrix + ";");
- this.Fragment.push("uniform mat4 " + ShaderMaterialHelperStatics.ReflectMatrix + ";");
- }
- if (this.Setting.Helpers) {
- var sresult = Shader.Join([
- "vec3 random3(vec3 c) { float j = 4096.0*sin(dot(c,vec3(17.0, 59.4, 15.0))); vec3 r; r.z = fract(512.0*j); j *= .125; r.x = fract(512.0*j); j *= .125; r.y = fract(512.0*j); return r-0.5; } ",
- "float rand(vec2 co){ return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453); } ",
- "const float F3 = 0.3333333;const float G3 = 0.1666667;",
- "float simplex3d(vec3 p) { vec3 s = floor(p + dot(p, vec3(F3))); vec3 x = p - s + dot(s, vec3(G3)); vec3 e = step(vec3(0.0), x - x.yzx); vec3 i1 = e*(1.0 - e.zxy); vec3 i2 = 1.0 - e.zxy*(1.0 - e); vec3 x1 = x - i1 + G3; vec3 x2 = x - i2 + 2.0*G3; vec3 x3 = x - 1.0 + 3.0*G3; vec4 w, d; w.x = dot(x, x); w.y = dot(x1, x1); w.z = dot(x2, x2); w.w = dot(x3, x3); w = max(0.6 - w, 0.0); d.x = dot(random3(s), x); d.y = dot(random3(s + i1), x1); d.z = dot(random3(s + i2), x2); d.w = dot(random3(s + 1.0), x3); w *= w; w *= w; d *= w; return dot(d, vec4(52.0)); } ",
- "float noise(vec3 m) { return 0.5333333*simplex3d(m) +0.2666667*simplex3d(2.0*m) +0.1333333*simplex3d(4.0*m) +0.0666667*simplex3d(8.0*m); } ",
- "float dim(vec3 p1 , vec3 p2){ return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)+(p2.z-p1.z)*(p2.z-p1.z)); }",
- "vec2 rotate_xy(vec2 pr1,vec2 pr2,float alpha) {vec2 pp2 = vec2( pr2.x - pr1.x, pr2.y - pr1.y );return vec2( pr1.x + pp2.x * cos(alpha*3.14159265/180.) - pp2.y * sin(alpha*3.14159265/180.),pr1.y + pp2.x * sin(alpha*3.14159265/180.) + pp2.y * cos(alpha*3.14159265/180.));} \n vec3 r_y(vec3 n, float a,vec3 c) {vec3 c1 = vec3( c.x, c.y, c.z );c1.x = c1.x;c1.y = c1.z;vec2 p = rotate_xy(vec2(c1.x,c1.y), vec2( n.x, n.z ), a);n.x = p.x;n.z = p.y;return n; } \n vec3 r_x(vec3 n, float a,vec3 c) {vec3 c1 = vec3( c.x, c.y, c.z );c1.x = c1.y;c1.y = c1.z;vec2 p = rotate_xy(vec2(c1.x,c1.y), vec2( n.y, n.z ), a);n.y = p.x;n.z = p.y;return n; } \n vec3 r_z(vec3 n, float a,vec3 c) { vec3 c1 = vec3( c.x, c.y, c.z );vec2 p = rotate_xy(vec2(c1.x,c1.y), vec2( n.x, n.y ), a);n.x = p.x;n.y = p.y;return n; }",
- ]);
- this.Vertex.push(sresult);
- this.Fragment.push(sresult);
- }
- this.Vertex.push("void main(void) { \n\
- " + ShaderMaterialHelperStatics.Position + " = " + ShaderMaterialHelperStatics.AttrPosition + "; \n\
- " + ShaderMaterialHelperStatics.Normal + " = " + ShaderMaterialHelperStatics.AttrNormal + "; \n\
- vec4 result = vec4(" + ShaderMaterialHelperStatics.Position + ",1.); \n\
- #[Source] \n\
- gl_Position = worldViewProjection * result;\n\
- vuv = uv;\n\
- #[AfterFinishVertex] \n\
- }");
- // start Build Fragment Frame
- if (this.Setting.NormalMap != null) {
- this.Fragment.push("vec3 normalMap() { vec4 result = vec4(0.); " + this.Setting.NormalMap + "; \n\
- result = vec4( normalize( " + this.Setting.Normal + " -(normalize(result.xyz)*2.0-vec3(1.))*(max(-0.5,min(0.5," + Shader.Print(this.Setting.NormalOpacity) + ")) )),1.0); return result.xyz;}");
- }
- if (this.Setting.SpecularMap != null) {
- this.Fragment.push("float specularMap() { vec4 result = vec4(0.);float float_result = 0.; " + this.Setting.SpecularMap + "; return float_result ;}");
- }
- this.Fragment.push(this.FragmentBeforeMain);
- this.Fragment.push(" \n\
- void main(void) { \n\
- int discardState = 0;\n\
- vec4 result = vec4(0.);\n\
- #[Source] \n\
- if(discardState == 0)gl_FragColor = result; \n\
- }");
- };
- ShaderBuilder.prototype.PrepareMaterial = function (material, scene) {
- material.ShaderSetting =
- this.Setting;
- if (!this.Setting.Transparency) {
- material.needAlphaBlending = function () { return false; };
- }
- else {
- material.needAlphaBlending = function () { return true; };
- }
- ;
- if (!this.Setting.Back)
- this.Setting.Back = false;
- material.needAlphaTesting = function () { return true; };
- material.setVector3("camera", { x: 18., y: 18., z: 18. });
- material.backFaceCulling = !this.Setting.Back;
- material.wireframe = this.Setting.Wire;
- material.setFlags = function (flags) {
- if (this.ShaderSetting.Flags) {
- var s = 0.;
- for (var i = 0; i < 20; i++) {
- if (flags.length > i && flags[i] == '1')
- s += Math.pow(2., i);
- }
- this.flagNumber = s;
- this.setFloat(ShaderMaterialHelperStatics.uniformFlags, s);
- }
- };
- material.flagNumber = 0.;
- material.flagUp = function (flag) {
- if (this.ShaderSetting.Flags) {
- if (Math.floor((this.flagNumber / Math.pow(2., flag) % 2.)) != 1.)
- this.flagNumber += Math.pow(2., flag);
- this.setFloat(ShaderMaterialHelperStatics.uniformFlags, this.flagNumber);
- }
- };
- material.flagDown = function (flag) {
- if (this.ShaderSetting.Flags) {
- if (Math.floor((this.flagNumber / Math.pow(2., flag) % 2.)) == 1.)
- this.flagNumber -= Math.pow(2., flag);
- this.setFloat(ShaderMaterialHelperStatics.uniformFlags, this.flagNumber);
- }
- };
- material.onCompiled = function () {
- };
- if (this.Setting.Texture2Ds != null) {
- for (var s in this.Setting.Texture2Ds) {
- // setTexture2D
- var texture = new ShaderMaterialHelper().DefineTexture(this.Setting.Texture2Ds[s].key, scene);
- material.setTexture(ShaderMaterialHelperStatics.Texture2D + s, texture);
- }
- }
- if (this.Setting.TextureCubes != null) {
- for (var s in this.Setting.TextureCubes) {
- // setTexture2D
- var texture = new ShaderMaterialHelper().DefineCubeTexture(this.Setting.TextureCubes[s].key, scene);
- material.setTexture(ShaderMaterialHelperStatics.TextureCube + s, texture);
- material.setMatrix(ShaderMaterialHelperStatics.ReflectMatrix, texture.getReflectionTextureMatrix());
- }
- }
- Shader.Me = null;
- return material;
- };
- ShaderBuilder.prototype.Build = function () {
- Shader.Me.Parent.Setting = Shader.Me.Setting;
- Shader.Me = Shader.Me.Parent;
- return this.Body;
- };
- ShaderBuilder.prototype.BuildMaterial = function (scene) {
- this.PrepareBeforeMaterialBuild(scene);
- if (Shader.ShaderIdentity == null)
- Shader.ShaderIdentity = 0;
- Shader.ShaderIdentity++;
- var shaderMaterial = new ShaderMaterialHelper().ShaderMaterial("ShaderBuilder_" + Shader.ShaderIdentity, scene, {
- Pixel: Shader.Join(this.Fragment)
- .replace("#[Source]", this.Body),
- Vertex: Shader.Join(this.Vertex)
- .replace("#[Source]", Shader.Def(this.VertexBody, ""))
- .replace("#[AfterFinishVertex]", Shader.Def(this.AfterVertex, ""))
- }, {
- uniforms: this.Uniforms,
- attributes: this.Attributes
- });
- Shader.Indexer = 1;
- return this.PrepareMaterial(shaderMaterial, scene);
- };
- ShaderBuilder.prototype.Event = function (index, mat) {
- Shader.Me.Setting.Flags = true;
- Shader.Indexer++;
- this.Body = Shader.Def(this.Body, "");
- this.Body += " if ( floor(mod( " + ShaderMaterialHelperStatics.uniformFlags + "/pow(2.," + Shader.Print(index) + "),2.)) == 1.) { " + mat + " } ";
- return this;
- };
- ShaderBuilder.prototype.EventVertex = function (index, mat) {
- Shader.Me.Setting.Flags = true;
- Shader.Me.Setting.Vertex = true;
- Shader.Indexer++;
- this.VertexBody = Shader.Def(this.VertexBody, "");
- this.VertexBody += " if( floor(mod( " + ShaderMaterialHelperStatics.uniformFlags + "/pow(2.," + Shader.Print(index) + "),2.)) == 1. ){ " + mat + "}";
- return this;
- };
- ShaderBuilder.prototype.Transparency = function () {
- Shader.Me.Setting.Transparency = true;
- return this;
- };
- ShaderBuilder.prototype.Wired = function () {
- Shader.Me.Setting.Wire = true;
- return this;
- };
- ShaderBuilder.prototype.VertexShader = function (mat) {
- this.VertexBody = Shader.Def(this.VertexBody, "");
- this.VertexBody += mat;
- return this;
- };
- ShaderBuilder.prototype.Solid = function (color) {
- color = Shader.Def(color, { r: 0., g: 0., b: 0., a: 1. });
- color.a = Shader.Def(color.a, 1.);
- color.r = Shader.Def(color.r, 0.);
- color.g = Shader.Def(color.g, 0.);
- color.b = Shader.Def(color.b, 0.);
- this.Body = Shader.Def(this.Body, "");
- this.Body += " result = vec4(" + Shader.Print(color.r) + "," + Shader.Print(color.g) + "," + Shader.Print(color.b) + "," + Shader.Print(color.a) + ");";
- return this;
- };
- ShaderBuilder.prototype.GetMapIndex = function (key) {
- if (Shader.Me.Setting.Texture2Ds != null) {
- for (var it in Shader.Me.Setting.Texture2Ds) {
- if (this.Setting.Texture2Ds[it].key == key) {
- return it;
- }
- }
- }
- else
- Shader.Me.Setting.Texture2Ds = [];
- return -1;
- };
- ShaderBuilder.prototype.GetCubeMapIndex = function (key) {
- if (Shader.Me.Setting.TextureCubes != null) {
- for (var it in Shader.Me.Setting.TextureCubes) {
- if (this.Setting.TextureCubes[it].key == key) {
- return it;
- }
- }
- }
- else
- Shader.Me.Setting.TextureCubes = [];
- return -1;
- };
- ShaderBuilder.prototype.Map = function (option) {
- Shader.Indexer++;
- option = Shader.Def(option, { path: '/images/color.png' });
- var s = Shader.Me.GetMapIndex(option.path);
- if (s == -1) {
- Shader.Me.Setting.Texture2Ds.push({ key: option.path, inVertex: option.useInVertex, inFragment: true });
- }
- else {
- Shader.Me.Setting.Texture2Ds[s].inVertex = true;
- }
- s = Shader.Me.GetMapIndex(option.path);
- Shader.Me.Setting.Center = true;
- Shader.Me.Setting.Helpers = true;
- Shader.Me.Setting.Uv = true;
- option.normal = Shader.Def(option.normal, Normals.Map);
- option.alpha = Shader.Def(option.alpha, false);
- option.bias = Shader.Def(option.bias, "0.");
- option.normalLevel = Shader.Def(option.normalLevel, 1.0);
- option.path = Shader.Def(option.path, "qa.jpg");
- option.rotation = Shader.Def(option.rotation, { x: 0, y: 0, z: 0 });
- option.scaleX = Shader.Def(option.scaleX, 1.);
- option.scaleY = Shader.Def(option.scaleY, 1.);
- option.useInVertex = Shader.Def(option.useInVertex, false);
- option.x = Shader.Def(option.x, 0.0);
- option.y = Shader.Def(option.y, 0.0);
- option.uv = Shader.Def(option.uv, ShaderMaterialHelperStatics.Uv);
- option.animation = Shader.Def(option.animation, false);
- option.tiled = Shader.Def(option.tiled, false);
- option.columnIndex = Shader.Def(option.columnIndex, 1);
- option.rowIndex = Shader.Def(option.rowIndex, 1);
- option.animationSpeed = Shader.Def(option.animationSpeed, 2000);
- option.animationFrameEnd = Shader.Def(option.animationFrameEnd, 100) + option.indexCount;
- option.animationFrameStart = Shader.Def(option.animationFrameStart, 0) + option.indexCount;
- option.indexCount = Shader.Def(option.indexCount, 1);
- var frameLength = Math.min(option.animationFrameEnd - option.animationFrameStart, option.indexCount * option.indexCount);
- var uv = Shader.Def(option.uv, ShaderMaterialHelperStatics.Uv);
- if (option.uv == "planar") {
- uv = ShaderMaterialHelperStatics.Position;
- }
- else {
- uv = 'vec3(' + option.uv + '.x,' + option.uv + '.y,0.)';
- }
- option.scaleX /= option.indexCount;
- option.scaleY /= option.indexCount;
- var rotate = ["vec3 centeri#[Ind] = " + ShaderMaterialHelperStatics.Center + ";",
- "vec3 ppo#[Ind] = r_z( " + uv + "," + Shader.Print(option.rotation.x) + ",centeri#[Ind]); ",
- " ppo#[Ind] = r_y( ppo#[Ind]," + Shader.Print(option.rotation.y) + ",centeri#[Ind]); ",
- " ppo#[Ind] = r_x( ppo#[Ind]," + Shader.Print(option.rotation.x) + ",centeri#[Ind]); ",
- "vec3 nrm#[Ind] = r_z( " + option.normal + "," + Shader.Print(option.rotation.x) + ",centeri#[Ind]); ",
- " nrm#[Ind] = r_y( nrm#[Ind]," + Shader.Print(option.rotation.y) + ",centeri#[Ind]); ",
- " nrm#[Ind] = r_x( nrm#[Ind]," + Shader.Print(option.rotation.z) + ",centeri#[Ind]); "].join("\n\
- ");
- var sresult = Shader.Join([rotate,
- " vec4 color#[Ind] = texture2D(" +
- ShaderMaterialHelperStatics.Texture2D + s + " ,ppo#[Ind].xy*vec2(" +
- Shader.Print(option.scaleX) + "," + Shader.Print(option.scaleY) + ")+vec2(" +
- Shader.Print(option.x) + "," + Shader.Print(option.y) + ")" +
- (option.bias != null ? "," + Shader.Print(option.bias) : "") + ");",
- " if(nrm#[Ind].z < " + Shader.Print(option.normalLevel) + "){ ",
- (option.alpha ? " result = color#[Ind];" : "result = vec4(color#[Ind].rgb , 1.); "),
- "}"]);
- if (option.indexCount > 1 || option.tiled) {
- option.columnIndex = option.indexCount - option.columnIndex + 1.0;
- sresult = [
- " vec3 uvt#[Ind] = vec3(" + uv + ".x*" + Shader.Print(option.scaleX) + "+" + Shader.Print(option.x) + "," + uv + ".y*" + Shader.Print(option.scaleY) + "+" + Shader.Print(option.y) + ",0.0); ",
- " ",
- " float xst#[Ind] = 1./(" + Shader.Print(option.indexCount) + "*2.); ",
- " float yst#[Ind] =1./(" + Shader.Print(option.indexCount) + "*2.); ",
- " float xs#[Ind] = 1./" + Shader.Print(option.indexCount) + "; ",
- " float ys#[Ind] = 1./" + Shader.Print(option.indexCount) + "; ",
- " float yid#[Ind] = " + Shader.Print(option.columnIndex - 1.0) + " ; ",
- " float xid#[Ind] = " + Shader.Print(option.rowIndex - 1.0) + "; ",
- option.animation ? " float ind_a#[Ind] = floor(mod(time*0.001*" + Shader.Print(option.animationSpeed) + ", " + Shader.Print(frameLength) + " )+" + Shader.Print(option.animationFrameStart) + ");" +
- " yid#[Ind] = " + Shader.Print(option.indexCount) + "- floor(ind_a#[Ind] / " + Shader.Print(option.indexCount) + ");" +
- " xid#[Ind] = floor(mod(ind_a#[Ind] , " + Shader.Print(option.indexCount) + ")); "
- : "",
- " float xi#[Ind] = mod(uvt#[Ind].x ,xs#[Ind])+xs#[Ind]*xid#[Ind] ; ",
- " float yi#[Ind] = mod(uvt#[Ind].y ,ys#[Ind])+ys#[Ind]*yid#[Ind] ; ",
- " ",
- " float xi2#[Ind] = mod(uvt#[Ind].x -xs#[Ind]*0.5 ,xs#[Ind])+xs#[Ind]*xid#[Ind] ; ",
- " float yi2#[Ind] = mod(uvt#[Ind].y -ys#[Ind]*0.5,ys#[Ind])+ys#[Ind]*yid#[Ind] ; ",
- " ",
- " ",
- " vec4 f#[Ind] = texture2D(" + ShaderMaterialHelperStatics.Texture2D + s + ",vec2(xi#[Ind],yi#[Ind])) ; ",
- " result = f#[Ind] ; ",
- (option.tiled ? [" vec4 f2#[Ind] = texture2D(" + ShaderMaterialHelperStatics.Texture2D + s + ",vec2(xi2#[Ind]+xid#[Ind] ,yi#[Ind])) ; ",
- " vec4 f3#[Ind] = texture2D(" + ShaderMaterialHelperStatics.Texture2D + s + ",vec2(xi#[Ind],yi2#[Ind]+yid#[Ind])) ; ",
- " vec4 f4#[Ind] = texture2D(" + ShaderMaterialHelperStatics.Texture2D + s + ",vec2(xi2#[Ind]+xid#[Ind],yi2#[Ind]+yid#[Ind])) ; ",
- " ",
- " ",
- " float ir#[Ind] = 0.,ir2#[Ind] = 0.; ",
- " ",
- " if( yi2#[Ind] >= yid#[Ind] *ys#[Ind] ){ ",
- " ir2#[Ind] = min(2.,max(0.,( yi2#[Ind]-yid#[Ind] *ys#[Ind])*2.0/ys#[Ind] )) ; ",
- " if(ir2#[Ind] > 1.0) ir2#[Ind] =1.0-(ir2#[Ind]-1.0); ",
- " ir2#[Ind] = min(1.0,max(0.0,pow(ir2#[Ind]," + Shader.Print(15.) + " )*" + Shader.Print(3.) + ")); ",
- " result = result *(1.0-ir2#[Ind]) +f3#[Ind]*ir2#[Ind] ; ",
- " } ",
- " if( xi2#[Ind] >= xid#[Ind] *xs#[Ind] ){ ",
- " ir2#[Ind] = min(2.,max(0.,( xi2#[Ind]-xid#[Ind] *xs#[Ind])*2.0/xs#[Ind] )) ; ",
- " if(ir2#[Ind] > 1.0) ir2#[Ind] =1.0-(ir2#[Ind]-1.0); ",
- " ir2#[Ind] = min(1.0,max(0.0,pow(ir2#[Ind]," + Shader.Print(15.) + " )*" + Shader.Print(3.) + ")); ",
- " result = result *(1.0-ir2#[Ind]) +f2#[Ind]*ir2#[Ind] ; ",
- " } ",
- " if( xi2#[Ind] >= xid#[Ind] *xs#[Ind] && xi2#[Ind] >= xid#[Ind] *xs#[Ind] ){ ",
- " ir2#[Ind] = min(2.,max(0.,( xi2#[Ind]-xid#[Ind] *xs#[Ind])*2.0/xs#[Ind] )) ; ",
- " float ir3#[Ind] = min(2.,max(0.,( yi2#[Ind]-yid#[Ind] *ys#[Ind])*2.0/ys#[Ind] )) ; ",
- " if(ir2#[Ind] > 1.0) ir2#[Ind] =1.0-(ir2#[Ind]-1.0); ",
- " if(ir3#[Ind] > 1.0) ir3#[Ind] =1.0-(ir3#[Ind]-1.0); ",
- " ir2#[Ind] = min(1.0,max(0.0,pow(ir2#[Ind]," + Shader.Print(15.) + " )*" + Shader.Print(3.) + ")); ",
- " ir3#[Ind] = min(1.0,max(0.0,pow(ir3#[Ind]," + Shader.Print(15.) + " )*" + Shader.Print(3.) + ")); ",
- " ir2#[Ind] = min(1.0,max(0.0, ir2#[Ind]* ir3#[Ind] )); ",
- " if(nrm#[Ind].z < " + Shader.Print(option.normalLevel) + "){ ",
- (option.alpha ? " result = result *(1.0-ir2#[Ind]) +f4#[Ind]* ir2#[Ind] ;" : " result = vec4(result.xyz*(1.0-ir2#[Ind]) +f4#[Ind].xyz* ir2#[Ind] ,1.0); "),
- "}",
- " } "
- ].join("\n") : "")].join("\n");
- }
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- ShaderBuilder.prototype.Multi = function (mats, combine) {
- combine = Shader.Def(combine, true);
- Shader.Indexer++;
- var pre = "", ps = ["", "", "", ""], psh = "0.0";
- for (var i = 0; i < mats.length; i++) {
- if (mats[i].result == undefined || mats[i].result == null)
- mats[i] = { result: mats[i], opacity: 1.0 };
- pre += " vec4 result#[Ind]" + i + ";result#[Ind]" + i + " = vec4(0.,0.,0.,0.); float rp#[Ind]" + i + " = " + Shader.Print(mats[i].opacity) + "; \n\
- ";
- pre += mats[i].result + "\n\
- ";
- pre += " result#[Ind]" + i + " = result; \n\
- ";
- ps[0] += (i == 0 ? "" : " + ") + "result#[Ind]" + i + ".x*rp#[Ind]" + i;
- ps[1] += (i == 0 ? "" : " + ") + "result#[Ind]" + i + ".y*rp#[Ind]" + i;
- ps[2] += (i == 0 ? "" : " + ") + "result#[Ind]" + i + ".z*rp#[Ind]" + i;
- ps[3] += (i == 0 ? "" : " + ") + "result#[Ind]" + i + ".w*rp#[Ind]" + i;
- psh += "+" + Shader.Print(mats[i].opacity);
- }
- if (combine) {
- ps[0] = "(" + ps[0] + ")/(" + Shader.Print(psh) + ")";
- ps[1] = "(" + ps[1] + ")/(" + Shader.Print(psh) + ")";
- ps[2] = "(" + ps[2] + ")/(" + Shader.Print(psh) + ")";
- ps[3] = "(" + ps[3] + ")/(" + Shader.Print(psh) + ")";
- }
- pre += "result = vec4(" + ps[0] + "," + ps[1] + "," + ps[2] + "," + ps[3] + ");";
- this.Body = Shader.Def(this.Body, "");
- this.Body += Shader.Replace(pre, "#[Ind]", "_" + Shader.Indexer + "_");
- return this;
- };
- ShaderBuilder.prototype.Back = function (mat) {
- Shader.Me.Setting.Back = true;
- mat = Shader.Def(mat, '');
- this.Body = Shader.Def(this.Body, "");
- this.Body += 'if(' + ShaderMaterialHelperStatics.face_back + '){' + mat + ';}';
- return this;
- };
- ShaderBuilder.prototype.InLine = function (mat) {
- mat = Shader.Def(mat, '');
- this.Body = Shader.Def(this.Body, "");
- this.Body += mat;
- return this;
- };
- ShaderBuilder.prototype.Front = function (mat) {
- mat = Shader.Def(mat, '');
- this.Body = Shader.Def(this.Body, "");
- this.Body += 'if(' + ShaderMaterialHelperStatics.face_front + '){' + mat + ';}';
- return this;
- };
- ShaderBuilder.prototype.Range = function (mat1, mat2, option) {
- Shader.Indexer++;
- var k = Shader.Indexer;
- option.start = Shader.Def(option.start, 0.);
- option.end = Shader.Def(option.end, 1.);
- option.direction = Shader.Def(option.direction, ShaderMaterialHelperStatics.Position + '.y');
- var sresult = [
- "float s_r_dim#[Ind] = " + option.direction + ";",
- "if(s_r_dim#[Ind] > " + Shader.Print(option.end) + "){",
- mat2,
- "}",
- "else { ",
- mat1,
- " vec4 mat1#[Ind]; mat1#[Ind] = result;",
- " if(s_r_dim#[Ind] > " + Shader.Print(option.start) + "){ ",
- mat2,
- " vec4 mati2#[Ind];mati2#[Ind] = result;",
- " float s_r_cp#[Ind] = (s_r_dim#[Ind] - (" + Shader.Print(option.start) + "))/(" + Shader.Print(option.end) + "-(" + Shader.Print(option.start) + "));",
- " float s_r_c#[Ind] = 1.0 - s_r_cp#[Ind];",
- " result = vec4(mat1#[Ind].x*s_r_c#[Ind]+mati2#[Ind].x*s_r_cp#[Ind],mat1#[Ind].y*s_r_c#[Ind]+mati2#[Ind].y*s_r_cp#[Ind],mat1#[Ind].z*s_r_c#[Ind]+mati2#[Ind].z*s_r_cp#[Ind],mat1#[Ind].w*s_r_c#[Ind]+mati2#[Ind].w*s_r_cp#[Ind]);",
- " }",
- " else { result = mat1#[Ind]; }",
- "}"
- ].join('\n\
- ');
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- ShaderBuilder.prototype.Reference = function (index, mat) {
- if (Shader.Me.References == null)
- Shader.Me.References = "";
- var sresult = "vec4 resHelp#[Ind] = result;";
- if (Shader.Me.References.indexOf("," + index + ",") == -1) {
- Shader.Me.References += "," + index + ",";
- sresult += " vec4 result_" + index + " = vec4(0.);\n\
- ";
- }
- if (mat == null) {
- sresult += " result_" + index + " = result;";
- }
- else {
- sresult += mat + "\n\
- result_" + index + " = result;";
- }
- sresult += "result = resHelp#[Ind] ;";
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- ShaderBuilder.prototype.ReplaceColor = function (index, color, mat, option) {
- Shader.Indexer++;
- option = Shader.Def(option, {});
- var d = Shader.Def(option.rangeStep, -0.280);
- var d2 = Shader.Def(option.rangePower, 0.0);
- var d3 = Shader.Def(option.colorIndex, 0.0);
- var d4 = Shader.Def(option.colorStep, 1.0);
- var ilg = Shader.Def(option.indexToEnd, false);
- var lg = " > 0.5 + " + Shader.Print(d) + " ";
- var lw = " < 0.5 - " + Shader.Print(d) + " ";
- var rr = "((result_" + index + ".x*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")>1.0 ? 0. : max(0.,(result_" + index + ".x*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")))";
- var rg = "((result_" + index + ".y*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")>1.0 ? 0. : max(0.,(result_" + index + ".y*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")))";
- var rb = "((result_" + index + ".z*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")>1.0 ? 0. : max(0.,(result_" + index + ".z*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")))";
- if (ilg) {
- rr = "min(1.0, max(0.,(result_" + index + ".x*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")))";
- rg = "min(1.0, max(0.,(result_" + index + ".y*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")))";
- rb = "min(1.0, max(0.,(result_" + index + ".z*" + Shader.Print(d4) + "-" + Shader.Print(d3) + ")))";
- }
- var a = " && ";
- var p = " + ";
- var r = "";
- var cond = "";
- switch (color) {
- case Helper.White:
- cond = rr + lg + a + rg + lg + a + rb + lg;
- r = "(" + rr + p + rg + p + rb + ")/3.0";
- break;
- case Helper.Cyan:
- cond = rr + lw + a + rg + lg + a + rb + lg;
- r = "(" + rg + p + rb + ")/2.0 - (" + rr + ")/1.0";
- break;
- case Helper.Pink:
- cond = rr + lg + a + rg + lw + a + rb + lg;
- r = "(" + rr + p + rb + ")/2.0 - (" + rg + ")/1.0";
- break;
- case Helper.Yellow:
- cond = rr + lg + a + rg + lg + a + rb + lw;
- r = "(" + rr + p + rg + ")/2.0 - (" + rb + ")/1.0";
- break;
- case Helper.Blue:
- cond = rr + lw + a + rg + lw + a + rb + lg;
- r = "(" + rb + ")/1.0 - (" + rr + p + rg + ")/2.0";
- break;
- case Helper.Red:
- cond = rr + lg + a + rg + lw + a + rb + lw;
- r = "(" + rr + ")/1.0 - (" + rg + p + rb + ")/2.0";
- break;
- case Helper.Green:
- cond = rr + lw + a + rg + lg + a + rb + lw;
- r = "(" + rg + ")/1.0 - (" + rr + p + rb + ")/2.0";
- break;
- case Helper.Black:
- cond = rr + lw + a + rg + lw + a + rb + lw;
- r = "1.0-(" + rr + p + rg + p + rb + ")/3.0";
- break;
- }
- var sresult = " if( " + cond + " ) { vec4 oldrs#[Ind] = vec4(result);float al#[Ind] = max(0.0,min(1.0," + r + "+(" + Shader.Print(d2) + "))); float l#[Ind] = 1.0-al#[Ind]; " + mat + " result = result*al#[Ind] + oldrs#[Ind] * l#[Ind]; }";
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- ShaderBuilder.prototype.Blue = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Blue, mat, option);
- };
- ShaderBuilder.prototype.Cyan = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Cyan, mat, option);
- };
- ShaderBuilder.prototype.Red = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Red, mat, option);
- };
- ShaderBuilder.prototype.Yellow = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Yellow, mat, option);
- };
- ShaderBuilder.prototype.Green = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Green, mat, option);
- };
- ShaderBuilder.prototype.Pink = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Pink, mat, option);
- };
- ShaderBuilder.prototype.White = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.White, mat, option);
- };
- ShaderBuilder.prototype.Black = function (index, mat, option) {
- return this.ReplaceColor(index, Helper.Black, mat, option);
- };
- ShaderBuilder.prototype.ReflectCube = function (option) {
- Shader.Indexer++;
- option = Shader.Def(option, { path: '/images/cube/a' });
- var s = Shader.Me.GetCubeMapIndex(option.path);
- if (s == -1) {
- Shader.Me.Setting.TextureCubes.push({ key: option.path, inVertex: option.useInVertex, inFragment: true });
- }
- else {
- Shader.Me.Setting.TextureCubes[s].inVertex = true;
- }
- s = Shader.Me.GetCubeMapIndex(option.path);
- option.normal = Shader.Def(option.normal, Normals.Map);
- option.alpha = Shader.Def(option.alpha, false);
- option.bias = Shader.Def(option.bias, "0.");
- option.normalLevel = Shader.Def(option.normalLevel, 1.0);
- option.rotation = Shader.Def(option.rotation, { x: 0, y: 0, z: 0 });
- option.scaleX = Shader.Def(option.scaleX, 1.);
- option.scaleY = Shader.Def(option.scaleY, 1.);
- option.useInVertex = Shader.Def(option.useInVertex, false);
- option.x = Shader.Def(option.x, 0.0);
- option.y = Shader.Def(option.y, 0.0);
- option.uv = Shader.Def(option.uv, ShaderMaterialHelperStatics.Uv);
- option.reflectMap = Shader.Def(option.reflectMap, "1.");
- Shader.Me.Setting.Center = true;
- Shader.Me.Setting.Camera = true;
- Shader.Me.Setting.ReflectMatrix = true;
- var sresult = "";
- if (option.equirectangular) {
- option.path = Shader.Def(option.path, '/images/cube/roofl1.jpg');
- var s = Shader.Me.GetMapIndex(option.path);
- if (s == -1) {
- Shader.Me.Setting.Texture2Ds.push({ key: option.path, inVertex: option.useInVertex, inFragment: true });
- }
- else {
- Shader.Me.Setting.Texture2Ds[s].inVertex = true;
- }
- s = Shader.Me.GetMapIndex(option.path);
- Shader.Me.Setting.VertexWorld = true;
- Shader.Me.Setting.FragmentWorld = true;
- sresult = ' vec3 nWorld#[Ind] = normalize( mat3( world[0].xyz, world[1].xyz, world[2].xyz ) * ' + option.normal + '); ' +
- ' vec3 vReflect#[Ind] = normalize( reflect( normalize( ' + ShaderMaterialHelperStatics.Camera + '- vec3(world * vec4(' + ShaderMaterialHelperStatics.Position + ', 1.0))), nWorld#[Ind] ) ); ' +
- 'float yaw#[Ind] = .5 - atan( vReflect#[Ind].z, -1.* vReflect#[Ind].x ) / ( 2.0 * 3.14159265358979323846264); ' +
- ' float pitch#[Ind] = .5 - atan( vReflect#[Ind].y, length( vReflect#[Ind].xz ) ) / ( 3.14159265358979323846264); ' +
- ' vec3 color#[Ind] = texture2D( ' + ShaderMaterialHelperStatics.Texture2D + s + ', vec2( yaw#[Ind], pitch#[Ind]),' + Shader.Print(option.bias) + ' ).rgb; result = vec4(color#[Ind] ,1.);';
- }
- else {
- option.path = Shader.Def(option.path, "/images/cube/a");
- sresult = [
- "vec3 viewDir#[Ind] = " + ShaderMaterialHelperStatics.Position + " - " + ShaderMaterialHelperStatics.Camera + " ;",
- " viewDir#[Ind] =r_x(viewDir#[Ind] ," + Shader.Print(option.rotation.x) + ", " + ShaderMaterialHelperStatics.Center + ");",
- " viewDir#[Ind] =r_y(viewDir#[Ind] ," + Shader.Print(option.rotation.y) + "," + ShaderMaterialHelperStatics.Center + ");",
- " viewDir#[Ind] =r_z(viewDir#[Ind] ," + Shader.Print(option.rotation.z) + "," + ShaderMaterialHelperStatics.Center + ");",
- "vec3 coords#[Ind] = " + (option.refract ? "refract" : "reflect") + "(viewDir#[Ind]" + (option.revers ? "*vec3(1.0)" : "*vec3(-1.0)") + ", " + option.normal + " " + (option.refract ? ",(" + Shader.Print(option.refractMap) + ")" : "") + " )+" + ShaderMaterialHelperStatics.Position + "; ",
- "vec3 vReflectionUVW#[Ind] = vec3( " + ShaderMaterialHelperStatics.ReflectMatrix + " * vec4(coords#[Ind], 0)); ",
- "vec3 rc#[Ind]= textureCube(" +
- ShaderMaterialHelperStatics.TextureCube + s + ", vReflectionUVW#[Ind]," + Shader.Print(option.bias) + ").rgb;",
- "result =result + vec4(rc#[Ind].x ,rc#[Ind].y,rc#[Ind].z, " + (!option.alpha ? "1." : "(rc#[Ind].x+rc#[Ind].y+rc#[Ind].z)/3.0 ") + ")*(min(1.,max(0.," + Shader.Print(option.reflectMap) + "))); "
- ].join('\n\
- ');
- }
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- ShaderBuilder.prototype.NormalMap = function (val, mat) {
- Shader.Me.Setting.NormalOpacity = val;
- Shader.Me.Setting.NormalMap = mat;
- return this;
- };
- ShaderBuilder.prototype.SpecularMap = function (mat) {
- Shader.Me.Setting.SpecularMap = mat;
- return this;
- };
- ShaderBuilder.prototype.Instance = function () {
- var setting = Shader.Me.Setting;
- var instance = new ShaderBuilder();
- instance.Parent = Shader.Me;
- instance.Setting = setting;
- return instance;
- };
- ShaderBuilder.prototype.Reflect = function (option, opacity) {
- opacity = Shader.Def(opacity, 1.);
- return this.Multi(["result = result;", { result: this.Instance().ReflectCube(option).Build(), opacity: opacity }], true);
- };
- ShaderBuilder.prototype.Light = function (option) {
- option = Shader.Def(option, {});
- option.color = Shader.Def(option.color, { r: 1., g: 1., b: 1., a: 1. });
- option.darkColorMode = Shader.Def(option.darkColorMode, false);
- option.direction = Shader.Def(option.direction, "vec3(sin(time*0.02)*28.,sin(time*0.02)*8.+10.,cos(time*0.02)*28.)");
- option.normal = Shader.Def(option.normal, Normals.Map);
- option.rotation = Shader.Def(option.rotation, { x: 0., y: 0., z: 0. });
- option.specular = Shader.Def(option.specular, Speculars.Map);
- option.specularLevel = Shader.Def(option.specularLevel, 1.);
- option.specularPower = Shader.Def(option.specularPower, 1.);
- option.phonge = Shader.Def(option.phonge, 0.);
- option.phongePower = Shader.Def(option.phongePower, 1.);
- option.phongeLevel = Shader.Def(option.phongeLevel, 1.);
- option.supplement = Shader.Def(option.supplement, false);
- option.reducer = Shader.Def(option.reducer, '1.');
- var c_c = option.color;
- if (option.darkColorMode) {
- c_c.a = 1.0 - c_c.a;
- c_c.r = 1.0 - c_c.r;
- c_c.g = 1.0 - c_c.g;
- c_c.b = 1.0 - c_c.b;
- c_c.a = c_c.a - 1.0;
- }
- Shader.Indexer++;
- Shader.Me.Setting.Camera = true;
- Shader.Me.Setting.FragmentWorld = true;
- Shader.Me.Setting.VertexWorld = true;
- Shader.Me.Setting.Helpers = true;
- Shader.Me.Setting.Center = true;
- var sresult = Shader.Join([
- " vec3 dir#[Ind] = normalize( vec3(world * vec4(" + ShaderMaterialHelperStatics.Position + ",1.)) - " + ShaderMaterialHelperStatics.Camera + ");",
- " dir#[Ind] =r_x(dir#[Ind] ," + Shader.Print(option.rotation.x) + ",vec3(" + ShaderMaterialHelperStatics.Center + "));",
- " dir#[Ind] =r_y(dir#[Ind] ," + Shader.Print(option.rotation.y) + ",vec3(" + ShaderMaterialHelperStatics.Center + "));",
- " dir#[Ind] =r_z(dir#[Ind] ," + Shader.Print(option.rotation.z) + ",vec3(" + ShaderMaterialHelperStatics.Center + "));",
- " vec4 p1#[Ind] = vec4(" + option.direction + ",.0); ",
- " vec4 c1#[Ind] = vec4(" + Shader.Print(c_c.r) + "," + Shader.Print(c_c.g) + "," + Shader.Print(c_c.b) + ",0.0); ",
- " vec3 vnrm#[Ind] = normalize(vec3(world * vec4(" + option.normal + ", 0.0))); ",
- " vec3 l#[Ind]= normalize(p1#[Ind].xyz " +
- (!option.parallel ? "- vec3(world * vec4(" + ShaderMaterialHelperStatics.Position + ",1.)) " : "")
- + "); ",
- " vec3 vw#[Ind]= normalize(camera - vec3(world * vec4(" + ShaderMaterialHelperStatics.Position + ",1.))); ",
- " vec3 aw#[Ind]= normalize(vw#[Ind]+ l#[Ind]); ",
- " float sc#[Ind]= max(0.,min(1., dot(vnrm#[Ind], aw#[Ind]))); ",
- " sc#[Ind]= pow(sc#[Ind]*min(1.,max(0.," + Shader.Print(option.specular) + ")), (" + Shader.Print(option.specularPower * 1000.) + "))/" + Shader.Print(option.specularLevel) + " ; ",
- " float ph#[Ind]= pow(" + Shader.Print(option.phonge) + "*2., (" + Shader.Print(option.phongePower) + "*0.3333))/(" + Shader.Print(option.phongeLevel) + "*3.) ; ",
- " float ndl#[Ind] = max(0., dot(vnrm#[Ind], l#[Ind])); ",
- " float ls#[Ind] = " + (option.supplement ? "1.0 -" : "") + "max(0.,min(1.,ndl#[Ind]*ph#[Ind]*(" + Shader.Print(option.reducer) + "))) ; ",
- " result += vec4( c1#[Ind].xyz*( ls#[Ind])*" + Shader.Print(c_c.a) + " , ls#[Ind]); ",
- " float ls2#[Ind] = " + (option.supplement ? "1.0 -" : "") + "max(0.,min(1., sc#[Ind]*(" + Shader.Print(option.reducer) + "))) ; ",
- " result += vec4( c1#[Ind].xyz*( ls2#[Ind])*" + Shader.Print(c_c.a) + " , ls2#[Ind]); ",
- ]);
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- ShaderBuilder.prototype.Effect = function (option) {
- var op = Shader.Def(option, {});
- Shader.Indexer++;
- var sresult = [
- 'vec4 res#[Ind] = vec4(0.);',
- 'res#[Ind].x = ' + (op.px ? Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.px, 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w') + ';' : ' result.x;'),
- 'res#[Ind].y = ' + (op.py ? Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.py, 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w') + ';' : ' result.y;'),
- 'res#[Ind].z = ' + (op.pz ? Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.pz, 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w') + ';' : ' result.z;'),
- 'res#[Ind].w = ' + (op.pw ? Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.pw, 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w') + ';' : ' result.w;'),
- 'res#[Ind] = ' + (op.pr ? ' vec4(' + Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.pr, 'pr', 'res#[Ind].x'), 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w') + ','
- + Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.pr, 'pr', 'res#[Ind].y'), 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w') + ',' +
- Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.pr, 'pr', 'res#[Ind].z'), 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w')
- + ',' +
- Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(Shader.Replace(op.pr, 'pr', 'res#[Ind].w'), 'px', 'result.x'), 'py', 'result.y'), 'pz', 'result.z'), 'pw', 'result.w')
- + ');' : ' res#[Ind]*1.0;'),
- 'result = res#[Ind] ;'
- ].join('\n\
- ');
- sresult = Shader.Replace(sresult, '#[Ind]', "_" + Shader.Indexer + "_");
- this.Body = Shader.Def(this.Body, "");
- this.Body += sresult;
- return this;
- };
- return ShaderBuilder;
- })();
- BABYLON.ShaderBuilder = ShaderBuilder;
- })(BABYLON || (BABYLON = {}));
- //# sourceMappingURL=ShaderBuilder.js.map
|