forked from OctaForge/OctaCore
675 lines
24 KiB
INI
675 lines
24 KiB
INI
////////////////////////////////////////////////////////
|
|
//
|
|
// world shaders
|
|
//
|
|
///////////////////////////////////////////////////////
|
|
|
|
// worldtype:
|
|
// e -> reserve envmap texture slot
|
|
// r -> envmap reflection
|
|
// R -> modulate envmap reflection with spec map
|
|
// s -> spec
|
|
// S -> spec map
|
|
// g -> glow
|
|
// G -> pulse glow
|
|
// b -> blendmap
|
|
// a -> transparent
|
|
// A -> refractive
|
|
// m -> alpha-mask
|
|
// T -> triplanar
|
|
// d -> detail
|
|
|
|
wtopt = [ >= (strstr $worldtype $arg1) 0 ]
|
|
|
|
worldvariantshader = [
|
|
local worldtype
|
|
worldtype = $arg2
|
|
stype = (? (wtopt "e") 3 1)
|
|
srow = -1
|
|
if (wtopt "G") [
|
|
stype = (+ $stype 0x10)
|
|
defuniformparam "glowcolor" 1 1 1 // glow color
|
|
defuniformparam "pulseglowspeed" 1 // pulse frequency (Hz)
|
|
defuniformparam "pulseglowcolor" 0 0 0 // pulse glow color
|
|
] [if (wtopt "g") [
|
|
defuniformparam "glowcolor" 1 1 1 // glow color
|
|
]]
|
|
if (wtopt "R") [
|
|
defuniformparam "envmin" 0 0 0 // minimum reflectivity
|
|
defuniformparam "envscale" 1 1 1 // reflectivity map multiplier
|
|
] [if (wtopt "r") [
|
|
defuniformparam "envmin" 0 0 0 // minimum reflectivity
|
|
defuniformparam "envscale" 0.2 0.2 0.2 // reflectivity
|
|
]]
|
|
defuniformparam "gloss" 1 // glossiness
|
|
if (wtopt "S") [
|
|
defuniformparam "specscale" 2 2 2 // spec map multiplier
|
|
] [if (wtopt "s") [
|
|
defuniformparam "specscale" 1 1 1 // spec multiplier
|
|
]]
|
|
if (wtopt "T") [
|
|
defuniformparam "triplanarbias" 0.3 0.3 0.3
|
|
stype = (+ $stype 0x20)
|
|
]
|
|
if (wtopt "b") [
|
|
srow = 0
|
|
]
|
|
if (wtopt "a") [
|
|
if (wtopt "A") [stype = (+ $stype 4)]
|
|
srow = 1
|
|
]
|
|
variantshader $stype $arg1 $srow [
|
|
attribute vec4 vvertex;
|
|
attribute vec3 vnormal;
|
|
attribute vec2 vtexcoord0;
|
|
uniform mat4 camprojmatrix;
|
|
uniform vec2 texgenscroll;
|
|
varying vec3 nvec;
|
|
@(ginterpvert (|| $msaalight [&& $msaasamples [! (wtopt "a")]]))
|
|
@(if (wtopt "T") [result [
|
|
uniform vec2 texgenscale;
|
|
varying vec2 texcoordx, texcoordy, texcoordz;
|
|
@(? (wtopt "d") [uniform vec2 detailscale;])
|
|
]] [result [
|
|
varying vec2 texcoord0;
|
|
]])
|
|
@(? (wtopt "r") [uniform vec3 camera; varying vec3 camvec;])
|
|
@(? (wtopt "G") [uniform float millis; flat varying float pulse;])
|
|
@(? (wtopt "b") [
|
|
uniform vec4 blendmapparams;
|
|
varying vec2 texcoord1;
|
|
])
|
|
|
|
void main(void)
|
|
{
|
|
gl_Position = camprojmatrix * vvertex;
|
|
@(if (wtopt "T") [result [
|
|
texcoordx = vec2(vvertex.y, -vvertex.z) * texgenscale;
|
|
texcoordy = vec2(vvertex.x, -vvertex.z) * texgenscale;
|
|
texcoordz = vvertex.xy * @(? (wtopt "d") "detailscale" "texgenscale");
|
|
]] [result [
|
|
texcoord0 = vtexcoord0 + texgenscroll;
|
|
]])
|
|
@(? (wtopt "b") [
|
|
texcoord1 = (vvertex.xy - blendmapparams.xy)*blendmapparams.zw;
|
|
])
|
|
nvec = vnormal;
|
|
|
|
@(gdepthpackvert (|| $msaalight [&& $msaasamples [! (wtopt "a")]]))
|
|
|
|
@(? (wtopt "r") [camvec = camera - vvertex.xyz;])
|
|
|
|
@(? (wtopt "G") [
|
|
pulse = abs(fract(millis*pulseglowspeed.x)*2.0 - 1.0);
|
|
])
|
|
}
|
|
] [
|
|
@(if (wtopt "A") [result [
|
|
@(gfetchdefs refractlight)
|
|
uniform vec4 refractparams;
|
|
]])
|
|
uniform vec4 colorparams;
|
|
uniform sampler2D diffusemap;
|
|
@(? (|| $msaalight [&& $msaasamples [! (wtopt "a")]]) [uniform float hashid;])
|
|
varying vec3 nvec;
|
|
@(ginterpfrag (|| $msaalight [&& $msaasamples [! (wtopt "a")]]))
|
|
@(if (wtopt "T") [result [
|
|
varying vec2 texcoordx, texcoordy, texcoordz;
|
|
@(? (wtopt "d") [uniform sampler2D detaildiffusemap;])
|
|
]] [result [
|
|
varying vec2 texcoord0;
|
|
]])
|
|
@(? (wtopt "g") [uniform sampler2D glowmap;])
|
|
@(? (wtopt "G") [flat varying float pulse;])
|
|
@(? (wtopt "r") [uniform samplerCube envmap; varying vec3 camvec;])
|
|
@(? (wtopt "b") [
|
|
uniform float blendlayer;
|
|
uniform sampler2D blendmap;
|
|
varying vec2 texcoord1;
|
|
])
|
|
|
|
void main(void)
|
|
{
|
|
vec3 normal = normalize(nvec);
|
|
|
|
@(if (wtopt "T") [result [
|
|
vec3 triblend = max(abs(normal) - triplanarbias.xyz, 0.001);
|
|
triblend *= triblend;
|
|
triblend /= triblend.x + triblend.y + triblend.z;
|
|
|
|
vec4 diffusex = texture2D(diffusemap, texcoordx);
|
|
vec4 diffusey = texture2D(diffusemap, texcoordy);
|
|
vec4 diffusez = texture2D(@(? (wtopt "d") "detaildiffusemap" "diffusemap"), texcoordz);
|
|
vec4 diffuse = diffusex*triblend.x + diffusey*triblend.y + diffusez*triblend.z;
|
|
]] [result [
|
|
vec4 diffuse = texture2D(diffusemap, texcoord0);
|
|
]])
|
|
|
|
gcolor.rgb = diffuse.rgb*colorparams.rgb;
|
|
|
|
@(if (wtopt "r") [result [
|
|
vec3 camvecn = normalize(camvec);
|
|
float invfresnel = dot(camvecn, normal);
|
|
vec3 rvec = 2.0*normal*invfresnel - camvecn;
|
|
vec3 reflect = textureCube(envmap, rvec).rgb;
|
|
@(? (wtopt "R") [
|
|
vec3 rmod = envscale.xyz*diffuse.a;
|
|
] [
|
|
#define rmod envscale.xyz
|
|
])
|
|
gcolor.rgb = mix(gcolor.rgb, reflect, envmin.xyz + rmod * clamp(1.0 - invfresnel, 0.0, 1.0));
|
|
]])
|
|
|
|
@(if (wtopt "g") [result [
|
|
@(? (wtopt "T") [
|
|
vec3 glowx = texture2D(glowmap, texcoordx).rgb;
|
|
vec3 glowy = texture2D(glowmap, texcoordy).rgb;
|
|
vec3 glowz = texture2D(glowmap, texcoordz).rgb;
|
|
vec3 glow = glowx*triblend.x + glowy*triblend.y + glowz*triblend.z;
|
|
] [
|
|
vec3 glow = texture2D(glowmap, texcoord0).rgb;
|
|
])
|
|
glow *= @(? (wtopt "G") [mix(glowcolor.xyz, pulseglowcolor.xyz, pulse)] [glowcolor.xyz]);
|
|
@(if (wtopt "a") [result [
|
|
gglow.rgb = glow;
|
|
]] [gglowpack glow packnorm])
|
|
]] [? (wtopt "a") [
|
|
gglow.rgb = vec3(0.0);
|
|
]])
|
|
|
|
@(if (wtopt "a") [
|
|
? (wtopt "A") [
|
|
vec3 rlight = gfetch(refractlight, gl_FragCoord.xy).rgb;
|
|
gglow.rgb += rlight * refractparams.xyz;
|
|
] (? (wtopt "m") [
|
|
gcolor.rgb *= diffuse.a;
|
|
#define packnorm diffuse.a * colorparams.a
|
|
] [
|
|
#define packnorm colorparams.a
|
|
])
|
|
])
|
|
|
|
@(gnormpackdef normal packnorm)
|
|
|
|
@(gdepthpackfrag (|| $msaalight [&& $msaasamples [! (wtopt "a")]]) "" hashid)
|
|
|
|
@(? (wtopt "b") [
|
|
float blend = abs(texture2D(blendmap, texcoord1).r - blendlayer);
|
|
gcolor.rgb *= blend;
|
|
gnormal.rgb *= blend;
|
|
gnormal.a *= blendlayer;
|
|
])
|
|
|
|
@(gspecpack [gloss.x] (if (wtopt "s") [? (wtopt "S") [diffuse.a*specscale.x] [specscale.x]]) (? (wtopt "b") blendlayer) blend)
|
|
}
|
|
]
|
|
]
|
|
|
|
worldshader = [
|
|
worldtype = $arg2
|
|
stype = (? (wtopt "e") 3 1)
|
|
if (wtopt "T") [
|
|
stype = (+ $stype 0x20)
|
|
]
|
|
defershader $stype $arg1 [
|
|
worldvariantshader @arg1 @arg2
|
|
worldvariantshader @arg1 @(concatword $arg2 "b")
|
|
worldvariantshader @arg1 @(concatword $arg2 "a")
|
|
worldvariantshader @arg1 @(concatword $arg2 "aA")
|
|
]
|
|
]
|
|
|
|
worldshader "stdworld" ""
|
|
forceshader "stdworld"
|
|
|
|
worldshader "alphaworld" "m"
|
|
|
|
worldshader "specworld" "s"
|
|
worldshader "specmapworld" "sS"
|
|
|
|
worldshader "glowworld" "g"
|
|
worldshader "pulseglowworld" "gG"
|
|
|
|
worldshader "glowalphaworld" "gm"
|
|
worldshader "pulseglowalphaworld" "gGm"
|
|
|
|
worldshader "envworld" "er"
|
|
worldshader "envspecworld" "esr"
|
|
worldshader "envspecmapworld" "esSrR"
|
|
worldshader "envglowworld" "erg"
|
|
worldshader "envpulseglowworld" "ergG"
|
|
|
|
worldshader "triplanarworld" "T"
|
|
worldshader "triplanardetailworld" "Td"
|
|
|
|
// bumptype:
|
|
// e -> reserve envmap texture slot
|
|
// r -> envmap reflection
|
|
// R -> modulate envmap reflection with spec map
|
|
// s -> spec
|
|
// S -> spec map
|
|
// p -> parallax
|
|
// g -> glow
|
|
// G -> pulse glow
|
|
// b -> blendmap
|
|
// a -> transparent
|
|
// A -> refractive
|
|
// m -> alpha-mask
|
|
// T -> triplanar
|
|
// d -> detail
|
|
|
|
btopt = [ >= (strstr $bumptype $arg1) 0 ]
|
|
|
|
bumpvariantshader = [
|
|
local bumptype
|
|
bumptype = $arg2
|
|
stype = (? (btopt "e") 3 1)
|
|
srow = -1
|
|
if (btopt "G") [
|
|
stype = (+ $stype 0x10)
|
|
defuniformparam "glowcolor" 1 1 1 // glow color
|
|
defuniformparam "pulseglowspeed" 1 // pulse frequency (Hz)
|
|
defuniformparam "pulseglowcolor" 0 0 0 // pulse glow color
|
|
] [if (btopt "g") [
|
|
defuniformparam "glowcolor" 1 1 1 // glow color
|
|
]]
|
|
defuniformparam "gloss" 1 // glossiness
|
|
if (btopt "S") [
|
|
defuniformparam "specscale" 2 2 2 // spec map multiplier
|
|
] [if (btopt "s") [
|
|
defuniformparam "specscale" 1 1 1 // spec multiplier
|
|
]]
|
|
if (btopt "p") [
|
|
defuniformparam "parallaxscale" 0.06 -0.03 // parallax scaling
|
|
]
|
|
if (btopt "R") [
|
|
defuniformparam "envmin" 0 0 0 // minimum reflectivity
|
|
defuniformparam "envscale" 1 1 1 // reflectivity map multiplier
|
|
] [if (btopt "r") [
|
|
defuniformparam "envmin" 0 0 0 // minimum reflectivity
|
|
defuniformparam "envscale" 0.2 0.2 0.2 // reflectivity
|
|
]]
|
|
if (btopt "T") [
|
|
defuniformparam "triplanarbias" 0.3 0.3 0.3
|
|
stype = (+ $stype 0x20)
|
|
]
|
|
if (btopt "b") [
|
|
srow = 0
|
|
]
|
|
if (btopt "a") [
|
|
if (btopt "A") [stype = (+ $stype 4)]
|
|
srow = 1
|
|
]
|
|
variantshader $stype $arg1 $srow [
|
|
attribute vec4 vvertex, vtangent;
|
|
attribute vec3 vnormal;
|
|
attribute vec2 vtexcoord0;
|
|
uniform mat4 camprojmatrix;
|
|
uniform vec2 texgenscroll;
|
|
@(ginterpvert (|| $msaalight [&& $msaasamples [! (btopt "a")]] [btopt "A"]))
|
|
@(if (btopt "T") [result [
|
|
uniform vec2 texgenscale;
|
|
varying vec2 texcoordx, texcoordy, texcoordz;
|
|
varying vec3 normal;
|
|
varying vec3 tangentx, tangenty, tangentz;
|
|
@(? (btopt "d") [uniform vec2 detailscale;])
|
|
]] [result [
|
|
varying vec2 texcoord0;
|
|
varying mat3 world;
|
|
]])
|
|
@(? (|| (btopt "p") (btopt "r") (btopt "T")) [
|
|
uniform vec3 camera;
|
|
varying vec3 camvec;
|
|
])
|
|
@(? (btopt "G") [uniform float millis; flat varying float pulse;])
|
|
@(? (btopt "b") [
|
|
uniform vec4 blendmapparams;
|
|
varying vec2 texcoord1;
|
|
])
|
|
|
|
void main(void)
|
|
{
|
|
gl_Position = camprojmatrix * vvertex;
|
|
|
|
@(gdepthpackvert (|| $msaalight [&& $msaasamples [! (btopt "a")]] [btopt "A"]))
|
|
|
|
@(if (btopt "T") [result [
|
|
texcoordx = vec2(vvertex.y, -vvertex.z) * texgenscale;
|
|
texcoordy = vec2(vvertex.x, -vvertex.z) * texgenscale;
|
|
texcoordz = vvertex.xy * @(? (btopt "d") "detailscale" "texgenscale");
|
|
|
|
normal = vnormal;
|
|
tangentx = normalize(vec3(1.001, 0.0, 0.0) - vnormal*vnormal.x);
|
|
tangenty = normalize(vec3(0.0, 1.001, 0.0) - vnormal*vnormal.y);
|
|
tangentz = normalize(vec3(0.0, 0.0, -1.001) + vnormal*vnormal.z);
|
|
]] [result [
|
|
texcoord0 = vtexcoord0 + texgenscroll;
|
|
|
|
vec3 bitangent = cross(vnormal, vtangent.xyz) * vtangent.w;
|
|
// calculate tangent -> world transform
|
|
world = mat3(vtangent.xyz, bitangent, vnormal);
|
|
]])
|
|
|
|
@(? (|| (btopt "p") (btopt "r") (btopt "T")) [
|
|
camvec = camera - vvertex.xyz;
|
|
])
|
|
|
|
@(? (btopt "b") [
|
|
texcoord1 = (vvertex.xy - blendmapparams.xy)*blendmapparams.zw;
|
|
])
|
|
|
|
@(? (btopt "G") [
|
|
pulse = abs(fract(millis*pulseglowspeed.x)*2.0 - 1.0);
|
|
])
|
|
}
|
|
] [
|
|
@(if (btopt "A") [result [
|
|
@(gfetchdefs [refractlight refractmask])
|
|
uniform vec4 refractparams;
|
|
uniform float refractdepth;
|
|
]])
|
|
uniform vec4 colorparams;
|
|
uniform sampler2D diffusemap, normalmap;
|
|
@(? (|| $msaalight [&& $msaasamples [! (btopt "a")]]) [uniform float hashid;])
|
|
varying mat3 world;
|
|
@(ginterpfrag (|| $msaalight [&& $msaasamples [! (btopt "a")]] [btopt "A"]))
|
|
@(if (btopt "T") [result [
|
|
varying vec2 texcoordx, texcoordy, texcoordz;
|
|
varying vec3 normal, tangentx, tangenty, tangentz;
|
|
@(? (btopt "d") [uniform sampler2D detaildiffusemap, detailnormalmap;])
|
|
]] [result [
|
|
varying vec2 texcoord0;
|
|
]])
|
|
@(? (|| (btopt "p") (btopt "r") (btopt "T")) [varying vec3 camvec;])
|
|
@(? (btopt "g") [uniform sampler2D glowmap;])
|
|
@(? (btopt "G") [flat varying float pulse;])
|
|
@(? (btopt "r") [uniform samplerCube envmap;])
|
|
@(? (btopt "b") [
|
|
uniform float blendlayer;
|
|
uniform sampler2D blendmap;
|
|
varying vec2 texcoord1;
|
|
])
|
|
|
|
void main(void)
|
|
{
|
|
@(? (|| (btopt "p") (btopt "r") (btopt "T")) [
|
|
vec3 camvecn = normalize(camvec);
|
|
])
|
|
|
|
@(if (btopt "T") [result [
|
|
vec3 triblend = max(abs(normal) - triplanarbias.xyz, 0.001);
|
|
triblend *= triblend;
|
|
triblend /= triblend.x + triblend.y + triblend.z;
|
|
|
|
#define worldx mat3(tangenty, tangentz, normal)
|
|
#define worldy mat3(tangentx, tangentz, normal)
|
|
#define worldz mat3(tangentx, tangenty, normal)
|
|
|
|
@(if (btopt "p") [result [
|
|
float heightx = texture2D(normalmap, texcoordx).a;
|
|
float heighty = texture2D(normalmap, texcoordy).a;
|
|
float heightz = texture2D(@(? (btopt "d") "detailnormalmap" "normalmap"), texcoordz).a;
|
|
vec3 camvect = camvecn * mat3(tangentx, tangenty, tangentz);
|
|
|
|
vec2 dtcx = texcoordx + camvect.yz*(heightx*parallaxscale.x + parallaxscale.y);
|
|
vec2 dtcy = texcoordy + camvect.xz*(heighty*parallaxscale.x + parallaxscale.y);
|
|
vec2 dtcz = texcoordz + camvect.xy*(heightz*parallaxscale.x + parallaxscale.y);
|
|
]] [result [
|
|
#define dtcx texcoordx
|
|
#define dtcy texcoordy
|
|
#define dtcz texcoordz
|
|
]])
|
|
|
|
vec4 diffusex = texture2D(diffusemap, dtcx);
|
|
vec4 diffusey = texture2D(diffusemap, dtcy);
|
|
vec4 diffusez = texture2D(@(? (btopt "d") "detaildiffusemap" "diffusemap"), dtcz);
|
|
vec4 diffuse = diffusex*triblend.x + diffusey*triblend.y + diffusez*triblend.z;
|
|
|
|
vec3 bumpx = (texture2D(normalmap, dtcx).rgb*2.0 - 1.0)*triblend.x;
|
|
vec3 bumpy = (texture2D(normalmap, dtcy).rgb*2.0 - 1.0)*triblend.y;
|
|
vec3 bumpz = (texture2D(@(? (btopt "d") "detailnormalmap" "normalmap"), dtcz).rgb*2.0 - 1.0)*triblend.z;
|
|
vec3 bumpw = normalize(worldx*bumpx + worldy*bumpy + worldz*bumpz);
|
|
|
|
@(? (btopt "A") [
|
|
vec2 bump = bumpx.xy + bumpy.xy + bumpz.xy;
|
|
])
|
|
]] [result [
|
|
@(? (btopt "p") [
|
|
float height = texture2D(normalmap, texcoord0).a;
|
|
vec2 dtc = texcoord0 + (camvecn * world).xy*(height*parallaxscale.x + parallaxscale.y);
|
|
] [
|
|
#define dtc texcoord0
|
|
])
|
|
|
|
vec4 diffuse = texture2D(diffusemap, dtc);
|
|
|
|
@(? (&& (btopt "a") [! (btopt "A")] [btopt "m"]) [
|
|
vec4 normal = texture2D(normalmap, dtc);
|
|
#define bump normal.rgb
|
|
] [
|
|
vec3 bump = texture2D(normalmap, dtc).rgb;
|
|
])
|
|
bump = bump*2.0 - 1.0;
|
|
vec3 bumpw = normalize(world * bump);
|
|
]])
|
|
|
|
gcolor.rgb = diffuse.rgb*colorparams.rgb;
|
|
|
|
@(if (btopt "r") [result [
|
|
float invfresnel = dot(camvecn, bumpw);
|
|
vec3 rvec = 2.0*bumpw*invfresnel - camvecn;
|
|
vec3 reflect = textureCube(envmap, rvec).rgb;
|
|
@(? (btopt "R") [
|
|
vec3 rmod = envscale.xyz*diffuse.a;
|
|
] [
|
|
#define rmod envscale.xyz
|
|
])
|
|
gcolor.rgb = mix(gcolor.rgb, reflect, envmin.xyz + rmod * clamp(1.0 - invfresnel, 0.0, 1.0));
|
|
]])
|
|
|
|
@(if (btopt "g") [result [
|
|
@(? (btopt "T") [
|
|
vec3 glowx = texture2D(glowmap, dtcx).rgb;
|
|
vec3 glowy = texture2D(glowmap, dtcy).rgb;
|
|
vec3 glowz = texture2D(glowmap, dtcz).rgb;
|
|
vec3 glow = glowx*triblend.x + glowy*triblend.y + glowz*triblend.z;
|
|
] [
|
|
vec3 glow = texture2D(glowmap, dtc).rgb;
|
|
])
|
|
glow *= @(? (btopt "G") [mix(glowcolor.xyz, pulseglowcolor.xyz, pulse)] [glowcolor.xyz]);
|
|
@(if (btopt "a") [result [
|
|
gglow.rgb = glow;
|
|
]] [gglowpack glow packnorm])
|
|
]] [? (btopt "a") [
|
|
gglow.rgb = vec3(0.0);
|
|
]])
|
|
|
|
@(if (btopt "a") [
|
|
? (btopt "A") [
|
|
vec2 rtc = bump.xy*refractparams.w;
|
|
float rmask = clamp(refractdepth*(lineardepth - dot(gfetch(refractmask, gl_FragCoord.xy + rtc).rgb, gdepthunpackparams)), 0.0, 1.0);
|
|
vec3 rlight = gfetch(refractlight, gl_FragCoord.xy + rtc*rmask).rgb;
|
|
gglow.rgb += rlight * refractparams.xyz;
|
|
] (? (btopt "m") [
|
|
gcolor.rgb *= normal.a;
|
|
#define packnorm normal.a * colorparams.a
|
|
] [
|
|
#define packnorm colorparams.a
|
|
])
|
|
])
|
|
|
|
@(gnormpackdef bumpw packnorm)
|
|
|
|
@(gdepthpackfrag (|| $msaalight [&& $msaasamples [! (btopt "a")]]) "" hashid)
|
|
|
|
@(? (btopt "b") [
|
|
float blend = abs(texture2D(blendmap, texcoord1).r - blendlayer);
|
|
gcolor.rgb *= blend;
|
|
gnormal.rgb *= blend;
|
|
gnormal.a *= blendlayer;
|
|
])
|
|
|
|
@(gspecpack [gloss.x] (if (btopt "s") [? (btopt "S") [diffuse.a*specscale.x] [specscale.x]]) (? (btopt "b") blendlayer) blend)
|
|
}
|
|
]
|
|
]
|
|
|
|
bumpshader = [
|
|
bumptype = $arg2
|
|
stype = (? (btopt "e") 3 1)
|
|
if (btopt "T") [
|
|
stype = (+ $stype 0x20)
|
|
]
|
|
defershader $stype $arg1 [
|
|
bumpvariantshader @arg1 @arg2
|
|
bumpvariantshader @arg1 @(concatword $arg2 "b")
|
|
bumpvariantshader @arg1 @(concatword $arg2 "a")
|
|
bumpvariantshader @arg1 @(concatword $arg2 "aA")
|
|
]
|
|
]
|
|
|
|
bumpshader "bumpworld" ""
|
|
bumpshader "bumpspecworld" "s"
|
|
bumpshader "bumpspecmapworld" "sS"
|
|
|
|
bumpshader "bumpalphaworld" "m"
|
|
bumpshader "bumpspecalphaworld" "sm"
|
|
bumpshader "bumpspecmapalphaworld" "sSm"
|
|
|
|
bumpshader "bumpglowworld" "g"
|
|
bumpshader "bumpspecglowworld" "sg"
|
|
bumpshader "bumpspecmapglowworld" "sSg"
|
|
|
|
bumpshader "bumppulseglowworld" "gG"
|
|
bumpshader "bumpspecpulseglowworld" "sgG"
|
|
bumpshader "bumpspecmappulseglowworld" "sSgG"
|
|
|
|
bumpshader "bumpparallaxworld" "p"
|
|
bumpshader "bumpspecparallaxworld" "ps"
|
|
bumpshader "bumpspecmapparallaxworld" "psS"
|
|
|
|
bumpshader "bumpparallaxglowworld" "pg"
|
|
bumpshader "bumpspecparallaxglowworld" "psg"
|
|
bumpshader "bumpspecmapparallaxglowworld" "psSg"
|
|
|
|
bumpshader "bumpparallaxpulseglowworld" "pgG"
|
|
bumpshader "bumpspecparallaxpulseglowworld" "psgG"
|
|
bumpshader "bumpspecmapparallaxpulseglowworld" "psSgG"
|
|
|
|
bumpshader "bumpenvworld" "er"
|
|
bumpshader "bumpenvspecworld" "esr"
|
|
bumpshader "bumpenvspecmapworld" "esSrR"
|
|
|
|
bumpshader "bumpenvglowworld" "erg"
|
|
bumpshader "bumpenvspecglowworld" "eosrg"
|
|
bumpshader "bumpenvspecmapglowworld" "esSrRg"
|
|
|
|
bumpshader "bumpenvpulseglowworld" "eorgG"
|
|
bumpshader "bumpenvspecpulseglowworld" "esrgG"
|
|
bumpshader "bumpenvspecmappulseglowworld" "esSrRgG"
|
|
|
|
bumpshader "bumpenvparallaxworld" "epr"
|
|
bumpshader "bumpenvspecparallaxworld" "epsr"
|
|
bumpshader "bumpenvspecmapparallaxworld" "epsSrR"
|
|
|
|
bumpshader "bumpenvparallaxglowworld" "eprg"
|
|
bumpshader "bumpenvspecparallaxglowworld" "epsrg"
|
|
bumpshader "bumpenvspecmapparallaxglowworld" "epsSrRg"
|
|
|
|
bumpshader "bumpenvparallaxpulseglowworld" "eprgG"
|
|
bumpshader "bumpenvspecparallaxpulseglowworld" "epsrgG"
|
|
bumpshader "bumpenvspecmapparallaxpulseglowworld" "epsSrRgG"
|
|
|
|
bumpshader "triplanarbumpworld" "T"
|
|
bumpshader "triplanarbumpspecworld" "Ts"
|
|
bumpshader "triplanarbumpspecmapworld" "TsS"
|
|
bumpshader "triplanarbumpparallaxworld" "Tp"
|
|
|
|
bumpshader "triplanarbumpspecparallaxworld" "Tps"
|
|
bumpshader "triplanarbumpspecmapparallaxworld" "TpsS"
|
|
|
|
bumpshader "triplanardetailbumpworld" "Td"
|
|
bumpshader "triplanardetailbumpspecworld" "Tds"
|
|
bumpshader "triplanardetailbumpspecmapworld" "TdsS"
|
|
bumpshader "triplanardetailbumpparallaxworld" "Tdp"
|
|
|
|
bumpshader "triplanardetailbumpspecparallaxworld" "Tdps"
|
|
bumpshader "triplanardetailbumpspecmapparallaxworld" "TdpsS"
|
|
|
|
shader 0 shadowmapworld [
|
|
attribute vec4 vvertex;
|
|
uniform mat4 shadowmatrix;
|
|
void main(void)
|
|
{
|
|
gl_Position = shadowmatrix * vvertex;
|
|
}
|
|
] [
|
|
void main(void)
|
|
{
|
|
}
|
|
]
|
|
|
|
defershader 1 "rsmworld" [
|
|
loop i 2 [
|
|
variantshader 1 "rsmworld" (- $i 1) [
|
|
attribute vec4 vvertex;
|
|
attribute vec3 vnormal;
|
|
attribute vec2 vtexcoord0;
|
|
uniform mat4 rsmmatrix;
|
|
uniform vec2 texgenscroll;
|
|
uniform vec4 colorparams;
|
|
uniform vec3 rsmdir;
|
|
varying vec4 normal;
|
|
varying vec2 texcoord0;
|
|
@(? (= $i 1) [
|
|
uniform vec4 blendmapparams;
|
|
varying vec2 texcoord1;
|
|
])
|
|
void main(void)
|
|
{
|
|
gl_Position = rsmmatrix * vvertex;
|
|
texcoord0 = vtexcoord0 + texgenscroll;
|
|
@(if (= $i 1) [result [
|
|
texcoord1 = (vvertex.xy - blendmapparams.xy)*blendmapparams.zw;
|
|
]])
|
|
normal = vec4(vnormal, dot(vnormal, rsmdir));
|
|
}
|
|
] [
|
|
uniform vec4 colorparams;
|
|
uniform sampler2D diffusemap;
|
|
varying vec4 normal;
|
|
varying vec2 texcoord0;
|
|
@(? (= $i 1) [
|
|
uniform float blendlayer;
|
|
uniform sampler2D blendmap;
|
|
varying vec2 texcoord1;
|
|
])
|
|
fragdata(0) vec4 gcolor;
|
|
fragdata(1) vec4 gnormal;
|
|
void main(void)
|
|
{
|
|
vec4 diffuse = texture2D(diffusemap, texcoord0);
|
|
|
|
@(if (= $i 2) [result [
|
|
#define alpha 1.0
|
|
]] [result [
|
|
#define alpha colorparams.a
|
|
]])
|
|
|
|
gcolor.rgb = normal.w*diffuse.rgb*colorparams.rgb;
|
|
gnormal = vec4(normal.xyz*0.5+0.5, 0.0);
|
|
|
|
@(if (= $i 1) [result [
|
|
float blend = abs(texture2D(blendmap, texcoord1).r - blendlayer);
|
|
gcolor.rgb *= blend;
|
|
gcolor.a = blendlayer;
|
|
gnormal *= blend;
|
|
]] [result [
|
|
gcolor.a = alpha;
|
|
]])
|
|
}
|
|
]
|
|
]
|
|
]
|
|
|