armory/blender/arm/material/make_rect.py
2017-12-20 15:37:58 +01:00

140 lines
5.9 KiB
Python

import bpy
import arm.make_state as state
import arm.material.mat_state as mat_state
import arm.material.mat_utils as mat_utils
import arm.material.cycles as cycles
import arm.material.make_skin as make_skin
import arm.material.make_tess as make_tess
import arm.utils
is_displacement = False
def make(context_id):
con_rect = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'equal', 'cull_mode': 'none' })
make_rect(con_rect)
return con_rect
def make_rect(con_rect):
wrd = bpy.data.worlds['Arm']
vert = con_rect.make_vert()
frag = con_rect.make_frag()
vert.vstruct_as_vsin = False # Rect structure is used instead
vert.add_in('vec2 pos')
vert.add_out('vec2 texCoordRect')
vert.add_out('vec3 viewRay')
vert.add_uniform('float materialID', link='_objectInfoMaterialIndex')
vert.add_uniform('mat4 invVP', link='_inverseViewProjectionMatrix')
vert.add_uniform('vec3 eye', link='_cameraPosition')
vert.write('const vec2 madd = vec2(0.5, 0.5);')
vert.write('texCoordRect = pos.xy * madd + madd;')
vert.write('const float fstep = 1.0 / 16777216.0; // 24bit')
# vert.write('const float fstep = 1.0 / 65536.0; // 16bit')
vert.write('gl_Position = vec4(pos.xy, (materialID * fstep) * 2.0 - 1.0, 1.0);')
vert.write('vec4 v = vec4(pos.xy, 1.0, 1.0);')
vert.write('v = vec4(invVP * v);')
vert.write('v.xyz /= v.w;')
vert.write('viewRay = v.xyz - eye;')
frag.ins = vert.outs
frag.add_out('vec4 fragColor')
frag.add_include('compiled.glsl')
frag.add_include('std/brdf.glsl')
frag.add_include('std/math.glsl')
frag.add_include('std/gbuffer.glsl')
frag.add_include('std/shirr.glsl')
frag.add_include('std/shadows.glsl')
frag.add_uniform('sampler2D gbuffer0')
frag.add_uniform('sampler2D gbuffer1')
frag.add_uniform('sampler2D gbuffer2')
frag.add_uniform('sampler2D gbufferD')
frag.add_uniform('sampler2D ssaotex')
frag.add_uniform('sampler2D shadowMap', included=True)
frag.add_uniform('sampler2D shadowMapCube', included=True)
frag.add_uniform('mat4 LWVP', link='_biasLampWorldViewProjectionMatrix')
frag.add_uniform('vec3 eye', link='_cameraPosition')
frag.add_uniform('vec3 eyeLook', link='_cameraLook')
frag.add_uniform('vec3 lightPos', link='_lampPosition')
frag.add_uniform('vec3 lightColor', link='_lampColor')
frag.add_uniform('int lightShadow', link='_lampCastShadow')
frag.add_uniform('vec2 lightProj', link='_lampPlaneProj')
frag.add_uniform('float shadowsBias', link='_lampShadowsBias')
# TODO: ifdef
frag.add_uniform('float envmapStrength', link='_envmapStrength')
frag.add_uniform('vec4 shirr[7]', link='_envmapIrradiance', included=True)
frag.add_uniform('sampler2D senvmapRadiance', link='_envmapRadiance')
frag.add_uniform('sampler2D senvmapBrdf', link='_envmapBrdf')
frag.add_uniform('int envmapNumMipmaps', link='_envmapNumMipmaps')
frag.write_pre = True
frag.write('vec4 g0 = texture(gbuffer0, texCoordRect);')
frag.write('vec4 g1 = texture(gbuffer1, texCoordRect);')
frag.write('vec4 g2 = texture(gbuffer2, texCoordRect);')
frag.write('float depth = texture(gbufferD, texCoordRect).r * 2.0 - 1.0;')
frag.write('vec3 n;')
frag.write('n.z = 1.0 - abs(g0.x) - abs(g0.y);')
frag.write('n.xy = n.z >= 0.0 ? g0.xy : octahedronWrap(g0.xy);')
frag.write('n = normalize(n);')
frag.write('vec2 texCoord = g0.zw;');
frag.add_uniform('vec2 cameraProj', link='_cameraPlaneProj')
frag.write('vec3 wposition = getPos(eye, eyeLook, viewRay, depth, cameraProj);')
frag.write('vec3 vVec = normalize(eye - wposition);')
frag.write_pre = False
frag.write('float dotNV = dot(n, vVec);')
frag.write('vec3 lp = lightPos - wposition;')
frag.write('vec3 l = normalize(lp);')
frag.write('float dotNL = max(dot(n, l), 0.0);')
frag.write('vec3 h = normalize(vVec + l);')
frag.write('float dotNH = dot(n, h);')
frag.write('float dotVH = dot(vVec, h);')
frag.write('float visibility = 1.0;')
frag.write('vec3 basecol;')
frag.write('float roughness;')
frag.write('float metallic;')
frag.write('float occlusion;')
mat_state.texture_grad = True
cycles.parse(mat_state.nodes, con_rect, vert, frag, None, None, None, parse_opacity=False, parse_displacement=False)
mat_state.texture_grad = False
frag.write('vec3 albedo = surfaceAlbedo(basecol, metallic);')
frag.write('vec3 f0 = surfaceF0(basecol, metallic);')
# Shadows
frag.write('if (lightShadow == 1) {')
frag.write(' vec4 lPos = LWVP * vec4(wposition, 1.0);')
frag.write(' lPos.xyz /= lPos.w;')
frag.write(' if (lPos.x > 0.0 && lPos.y > 0.0 && lPos.x < 1.0 && lPos.y < 1.0) visibility = PCF(lPos.xy, lPos.z - shadowsBias);;')
frag.write('}')
frag.write('else if (lightShadow == 2) {')
frag.write(' visibility = PCFCube(lp, -l, shadowsBias, lightProj, n);')
frag.write('}')
frag.write('visibility *= attenuate(distance(wposition, lightPos));')
frag.write('fragColor.rgb = lambertDiffuseBRDF(albedo, dotNL) + specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH);')
frag.write('fragColor.rgb *= lightColor;')
frag.write('fragColor.rgb *= visibility;')
# Env
frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;')
frag.write('vec3 envl = shIrradiance(n) / PI;')
frag.write('vec3 reflectionWorld = reflect(-vVec, n);')
frag.write('float lod = getMipFromRoughness(roughness, envmapNumMipmaps);')
frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb;')
frag.write('envl.rgb *= albedo;')
frag.write('envl.rgb += prefilteredColor * (f0 * envBRDF.x + envBRDF.y);')
frag.write('envl.rgb *= texture(ssaotex, texCoordRect).r;')
frag.write('envl.rgb *= envmapStrength * occlusion;')
frag.write('fragColor.rgb += envl;')