2016-12-13 01:09:17 +01:00
|
|
|
import material.state as state
|
2016-12-13 11:42:00 +01:00
|
|
|
import material.make_cycles as make_cycles
|
2016-12-15 00:18:59 +01:00
|
|
|
import armutils
|
|
|
|
import assets
|
2016-12-13 01:09:17 +01:00
|
|
|
|
|
|
|
def mesh(context_id):
|
|
|
|
con_mesh = state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
|
|
|
|
|
2016-12-15 00:18:59 +01:00
|
|
|
assets.add(armutils.get_sdk_path() + '/armory/Assets/' + 'noise64.png')
|
|
|
|
assets.add_embedded_data('noise64.png')
|
|
|
|
|
2016-12-13 11:42:00 +01:00
|
|
|
vert = con_mesh.make_vert()
|
|
|
|
frag = con_mesh.make_frag()
|
2016-12-13 01:09:17 +01:00
|
|
|
|
|
|
|
vert.add_out('vec3 wnormal')
|
|
|
|
vert.add_out('vec3 wposition')
|
|
|
|
vert.add_out('vec3 eyeDir')
|
|
|
|
vert.add_uniform('mat4 W', '_worldMatrix')
|
|
|
|
vert.add_uniform('mat4 N', '_normalMatrix')
|
|
|
|
vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix')
|
|
|
|
vert.add_uniform('vec3 eye', '_cameraPosition')
|
|
|
|
vert.write('vec4 spos = vec4(pos, 1.0);')
|
|
|
|
vert.write('wnormal = normalize(mat3(N) * nor);')
|
|
|
|
vert.write('wposition = vec4(W * spos).xyz;')
|
|
|
|
vert.write('eyeDir = eye - wposition;')
|
|
|
|
vert.write('gl_Position = WVP * spos;')
|
|
|
|
|
2016-12-15 00:18:59 +01:00
|
|
|
# frag.add_uniform('sampler2D snoise', link='_noise64') # If no PCSS enabled
|
2016-12-13 01:09:17 +01:00
|
|
|
frag.add_include('../../Shaders/compiled.glsl')
|
|
|
|
frag.add_include('../../Shaders/std/brdf.glsl')
|
|
|
|
frag.add_include('../../Shaders/std/math.glsl')
|
|
|
|
frag.add_include('../../Shaders/std/shirr.glsl')
|
|
|
|
frag.add_uniform('vec3 lightColor', '_lampColor')
|
|
|
|
frag.add_uniform('vec3 lightDir', '_lampDirection')
|
|
|
|
frag.add_uniform('vec3 lightPos', '_lampPosition')
|
|
|
|
frag.add_uniform('int lightType', '_lampType')
|
|
|
|
frag.add_uniform('float shirr[27]', link='_envmapIrradiance', included=True)
|
|
|
|
frag.add_uniform('float envmapStrength', link='_envmapStrength')
|
|
|
|
frag.add_uniform('sampler2D senvmapRadiance', link='_envmapRadiance')
|
|
|
|
frag.add_uniform('sampler2D senvmapBrdf', link='_envmapBrdf')
|
|
|
|
frag.add_uniform('int envmapNumMipmaps', link='_envmapNumMipmaps')
|
|
|
|
frag.write('vec3 n = normalize(wnormal);')
|
|
|
|
frag.write('vec3 l = lightType == 0 ? lightDir : normalize(lightPos - wposition);')
|
|
|
|
frag.write('vec3 v = normalize(eyeDir);')
|
|
|
|
frag.write('vec3 h = normalize(v + l);')
|
|
|
|
frag.write('float dotNL = dot(n, l);')
|
2016-12-15 00:18:59 +01:00
|
|
|
# frag.write('float dotNV = dot(n, v);')
|
|
|
|
frag.write('float dotNV = max(dot(n, v), 0.0);')
|
2016-12-13 01:09:17 +01:00
|
|
|
frag.write('float dotNH = dot(n, h);')
|
|
|
|
frag.write('float dotVH = dot(v, h);')
|
|
|
|
|
|
|
|
vert.add_out('vec4 lampPos')
|
|
|
|
vert.add_uniform('mat4 LWVP', '_lampWorldViewProjectionMatrix')
|
|
|
|
vert.write('lampPos = LWVP * spos;')
|
2016-12-15 00:18:59 +01:00
|
|
|
# frag.add_include('../../Shaders/std/shadows.glsl')
|
|
|
|
frag.add_include('../../Shaders/std/shadows_pcss.glsl')
|
2016-12-13 01:09:17 +01:00
|
|
|
frag.add_uniform('sampler2D shadowMap', included=True)
|
2016-12-15 00:18:59 +01:00
|
|
|
frag.add_uniform('sampler2D snoise', link='_noise64', included=True)
|
|
|
|
frag.add_uniform('float lampSizeUV', link='_lampSizeUV', included=True)
|
2016-12-13 01:09:17 +01:00
|
|
|
frag.add_uniform('bool receiveShadow')
|
|
|
|
frag.add_uniform('float shadowsBias', '_lampShadowsBias')
|
|
|
|
frag.write('float visibility = 1.0;')
|
|
|
|
frag.write('if (receiveShadow && lampPos.w > 0.0) {')
|
|
|
|
frag.tab += 1
|
|
|
|
frag.write('vec3 lpos = lampPos.xyz / lampPos.w;')
|
|
|
|
frag.write('lpos.xy = lpos.xy * 0.5 + 0.5;')
|
2016-12-15 00:18:59 +01:00
|
|
|
# frag.write('visibility = PCF(lpos.xy, lpos.z - shadowsBias);')
|
|
|
|
frag.write('visibility = PCSS(lpos.xy, lpos.z - shadowsBias);')
|
2016-12-13 01:09:17 +01:00
|
|
|
frag.tab -= 1
|
|
|
|
frag.write('}')
|
|
|
|
|
|
|
|
frag.add_uniform('float spotlightCutoff', '_spotlampCutoff')
|
|
|
|
frag.add_uniform('float spotlightExponent', '_spotlampExponent')
|
|
|
|
frag.write('if (lightType == 2) {')
|
|
|
|
frag.tab += 1
|
|
|
|
frag.write('float spotEffect = dot(lightDir, l);')
|
|
|
|
frag.write('if (spotEffect < spotlightCutoff) {')
|
|
|
|
frag.tab += 1
|
|
|
|
frag.write('spotEffect = smoothstep(spotlightCutoff - spotlightExponent, spotlightCutoff, spotEffect);')
|
|
|
|
frag.write('visibility *= spotEffect;')
|
|
|
|
frag.tab -= 1
|
|
|
|
frag.write('}')
|
|
|
|
frag.tab -= 1
|
|
|
|
frag.write('}')
|
|
|
|
|
|
|
|
frag.write('vec3 basecol;')
|
|
|
|
frag.write('float roughness;')
|
|
|
|
frag.write('float metallic;')
|
2016-12-13 20:06:23 +01:00
|
|
|
frag.write('float occlusion;')
|
2016-12-13 01:09:17 +01:00
|
|
|
|
2016-12-13 11:42:00 +01:00
|
|
|
make_cycles.parse(state.nodes, vert, frag)
|
2016-12-13 01:09:17 +01:00
|
|
|
|
|
|
|
frag.write('vec3 albedo = surfaceAlbedo(basecol, metallic);')
|
|
|
|
frag.write('vec3 f0 = surfaceF0(basecol, metallic);')
|
|
|
|
frag.write('vec3 direct = lambertDiffuseBRDF(albedo, dotNL);')
|
|
|
|
frag.write('direct += specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH);')
|
|
|
|
|
|
|
|
frag.write('vec3 indirect = (shIrradiance(n, 2.2) / PI) * albedo;')
|
|
|
|
frag.write('vec3 reflectionWorld = reflect(-v, n);')
|
|
|
|
frag.write('float lod = getMipFromRoughness(roughness, envmapNumMipmaps);')
|
|
|
|
frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb;')
|
|
|
|
frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;')
|
|
|
|
frag.write('indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y);')
|
|
|
|
|
2016-12-13 20:06:23 +01:00
|
|
|
frag.write('fragColor = vec4(direct * lightColor * visibility + indirect * occlusion * envmapStrength, 1.0);')
|
2016-12-13 01:09:17 +01:00
|
|
|
|
|
|
|
return con_mesh
|
|
|
|
|
|
|
|
def shadows(context_id):
|
|
|
|
con_shadowmap = state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
|
|
|
|
|
2016-12-13 11:42:00 +01:00
|
|
|
vert = con_shadowmap.make_vert()
|
2016-12-13 01:09:17 +01:00
|
|
|
vert.add_uniform('mat4 LWVP', '_lampWorldViewProjectionMatrix')
|
|
|
|
vert.write('gl_Position = LWVP * vec4(pos, 1.0);')
|
|
|
|
|
2016-12-13 11:42:00 +01:00
|
|
|
frag = con_shadowmap.make_frag()
|
2016-12-13 01:09:17 +01:00
|
|
|
frag.write('fragColor = vec4(0.0);')
|
|
|
|
|
|
|
|
return con_shadowmap
|
|
|
|
|