Deferred+ renderer
This commit is contained in:
parent
41d84927d5
commit
44f257f6ba
|
@ -113,7 +113,7 @@ void main() {
|
|||
envl.rgb += prefilteredColor * (f0 * envBRDF.x + envBRDF.y);
|
||||
#endif
|
||||
|
||||
envl.rgb *= envmapStrength * g0.a; // Occlusion
|
||||
envl.rgb *= envmapStrength * g1.a; // Occlusion
|
||||
|
||||
#ifdef _SSAO
|
||||
envl.rgb *= texture(ssaotex, texCoord).r; // SSAO
|
||||
|
|
|
@ -126,10 +126,10 @@ vec2 getProjectedCoord(vec3 hitCoord) {
|
|||
}
|
||||
float getDeltaDepth(vec3 hitCoord) {
|
||||
vec2 texCoord = getProjectedCoord(hitCoord);
|
||||
float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0;
|
||||
// float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0;
|
||||
// TODO: store_depth
|
||||
// vec4 g0 = texture(gbuffer0, texCoord);
|
||||
// float depth = (1.0 - g0.a) * 2.0 - 1.0;
|
||||
vec4 g0 = texture(gbuffer0, texCoord);
|
||||
float depth = (1.0 - g0.a) * 2.0 - 1.0;
|
||||
vec3 wpos = getPos2(invVP, depth, texCoord);
|
||||
float d1 = length(eye - wpos);
|
||||
float d2 = length(eye - hitCoord);
|
||||
|
@ -157,9 +157,9 @@ void main() {
|
|||
|
||||
vec4 g0 = texture(gbuffer0, texCoord); // Normal.xy, metallic/roughness, occlusion
|
||||
vec4 g1 = texture(gbuffer1, texCoord); // Basecolor.rgb,
|
||||
float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0; // 0 - 1 => -1 - 1
|
||||
// float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0; // 0 - 1 => -1 - 1
|
||||
// TODO: store_depth
|
||||
// float depth = (1.0 - g0.a) * 2.0 - 1.0;
|
||||
float depth = (1.0 - g0.a) * 2.0 - 1.0;
|
||||
|
||||
vec3 n;
|
||||
n.z = 1.0 - abs(g0.x) - abs(g0.y);
|
||||
|
|
|
@ -100,9 +100,9 @@ vec2 getProjectedCoord(vec3 hitCoord) {
|
|||
}
|
||||
float getDeltaDepth(vec3 hitCoord) {
|
||||
vec2 texCoord = getProjectedCoord(hitCoord);
|
||||
vec4 g0 = texture(gbuffer0, texCoord);
|
||||
float depth = texture(gbufferD, texCoord).r * 2.0 - 1.0;
|
||||
// TODO: store_depth
|
||||
// vec4 g0 = texture(gbuffer0, texCoord);
|
||||
// float depth = (1.0 - g0.a) * 2.0 - 1.0;
|
||||
vec3 wpos = getPos(eye, eyeLook, viewRay, depth);
|
||||
float d1 = length(eye - wpos);
|
||||
|
|
|
@ -20,7 +20,7 @@ void main() {
|
|||
gl_Position = vec4(pos.xy, 0.0, 1.0);
|
||||
|
||||
// NDC (at the back of cube)
|
||||
vec4 v = vec4(pos.x, pos.y, 1.0, 1.0);
|
||||
vec4 v = vec4(pos.x, pos.y, 1.0, 1.0);
|
||||
v = vec4(invVP * v);
|
||||
v.xyz /= v.w;
|
||||
viewRay = v.xyz - eye;
|
||||
|
|
16
Shaders/matid_to_depth/matid_to_depth.frag.glsl
Normal file
16
Shaders/matid_to_depth/matid_to_depth.frag.glsl
Normal file
|
@ -0,0 +1,16 @@
|
|||
// Transfer material IDs to depth buffer
|
||||
#version 450
|
||||
|
||||
#ifdef GL_ES
|
||||
precision mediump float;
|
||||
#endif
|
||||
|
||||
uniform sampler2D tex;
|
||||
|
||||
in vec2 texCoord;
|
||||
|
||||
void main() {
|
||||
// const float fstep = 1.0 / 16777216.0; // 24bit
|
||||
const float fstep = 1.0 / 65536.0; // 16bit
|
||||
gl_FragDepth = texture(tex, texCoord).r * fstep; // materialID
|
||||
}
|
19
Shaders/matid_to_depth/matid_to_depth.json
Executable file
19
Shaders/matid_to_depth/matid_to_depth.json
Executable file
|
@ -0,0 +1,19 @@
|
|||
{
|
||||
"contexts": [
|
||||
{
|
||||
"name": "matid_to_depth",
|
||||
"depth_write": true,
|
||||
"compare_mode": "always",
|
||||
"color_write_red": false,
|
||||
"color_write_green": false,
|
||||
"color_write_blue": false,
|
||||
"color_write_alpha": false,
|
||||
"cull_mode": "none",
|
||||
"links": [],
|
||||
"texture_params": [],
|
||||
"vertex_shader": "matid_to_depth.vert.glsl",
|
||||
"vertex_shader_path": "../include/pass.vert.glsl",
|
||||
"fragment_shader": "matid_to_depth.frag.glsl"
|
||||
}
|
||||
]
|
||||
}
|
|
@ -142,7 +142,12 @@ def make_draw_meshes(stage, node_group, node):
|
|||
# Order
|
||||
order = node.inputs[2].default_value
|
||||
stage['params'].append(order)
|
||||
|
||||
|
||||
def make_draw_rects(stage, node_group, node):
|
||||
stage['command'] = 'draw_rects'
|
||||
context = node.inputs[1].default_value
|
||||
stage['params'].append(context)
|
||||
|
||||
def make_draw_decals(stage, node_group, node):
|
||||
stage['command'] = 'draw_decals'
|
||||
context = node.inputs[1].default_value
|
||||
|
@ -387,6 +392,9 @@ def make_motion_blur_velocity_pass(stages, node_group, node):
|
|||
def make_copy_pass(stages, node_group, node):
|
||||
make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='copy_pass/copy_pass/copy_pass')
|
||||
|
||||
def make_materialid_to_depth(stages, node_group, node):
|
||||
make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='matid_to_depth/matid_to_depth/matid_to_depth')
|
||||
|
||||
def make_blend_pass(stages, node_group, node):
|
||||
make_quad_pass(stages, node_group, node, target_index=1, bind_target_indices=[2], bind_target_constants=['tex'], shader_context='blend_pass/blend_pass/blend_pass')
|
||||
|
||||
|
@ -518,7 +526,10 @@ def buildNode(stages, node, node_group):
|
|||
|
||||
elif node.bl_idname == 'DrawMeshesNodeType':
|
||||
make_draw_meshes(stage, node_group, node)
|
||||
|
||||
|
||||
elif node.bl_idname == 'DrawRectsNodeType':
|
||||
make_draw_rects(stage, node_group, node)
|
||||
|
||||
elif node.bl_idname == 'DrawDecalsNodeType':
|
||||
make_draw_decals(stage, node_group, node)
|
||||
|
||||
|
@ -644,6 +655,9 @@ def buildNode(stages, node, node_group):
|
|||
elif node.bl_idname == 'CopyPassNodeType':
|
||||
make_copy_pass(stages, node_group, node)
|
||||
append_stage = False
|
||||
elif node.bl_idname == 'MatIDToDepthNodeType':
|
||||
make_materialid_to_depth(stages, node_group, node)
|
||||
append_stage = False
|
||||
elif node.bl_idname == 'BlendPassNodeType':
|
||||
make_blend_pass(stages, node_group, node)
|
||||
append_stage = False
|
||||
|
@ -778,7 +792,7 @@ def traverse_renderpath(node, node_group, render_targets, depth_buffers):
|
|||
traverse_renderpath(loop_node, node_group, render_targets, depth_buffers)
|
||||
|
||||
# Prebuilt
|
||||
elif node.bl_idname == 'MotionBlurPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'CopyPassNodeType' or node.bl_idname == 'BlendPassNodeType' or node.bl_idname == 'CombinePassNodeType' or node.bl_idname == 'DebugNormalsPassNodeType' or node.bl_idname == 'FXAAPassNodeType' or node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'WaterPassNodeType' or node.bl_idname == 'DeferredLightPassNodeType' or node.bl_idname == 'DeferredIndirectPassNodeType' or node.bl_idname == 'VolumetricLightPassNodeType' or node.bl_idname == 'TranslucentResolvePassNodeType':
|
||||
elif node.bl_idname == 'MotionBlurPassNodeType' or node.bl_idname == 'MotionBlurVelocityPassNodeType' or node.bl_idname == 'CopyPassNodeType' or node.bl_idname == 'MatIDToDepthNodeType' or node.bl_idname == 'BlendPassNodeType' or node.bl_idname == 'CombinePassNodeType' or node.bl_idname == 'DebugNormalsPassNodeType' or node.bl_idname == 'FXAAPassNodeType' or node.bl_idname == 'TAAPassNodeType' or node.bl_idname == 'WaterPassNodeType' or node.bl_idname == 'DeferredLightPassNodeType' or node.bl_idname == 'DeferredIndirectPassNodeType' or node.bl_idname == 'VolumetricLightPassNodeType' or node.bl_idname == 'TranslucentResolvePassNodeType':
|
||||
if node.inputs[1].is_linked:
|
||||
tnode = nodes.find_node_by_link(node_group, node, node.inputs[1])
|
||||
parse_render_target(tnode, node_group, render_targets, depth_buffers)
|
||||
|
@ -824,7 +838,8 @@ def parse_render_target(node, node_group, render_targets, depth_buffers):
|
|||
if found == False:
|
||||
db = {}
|
||||
db['name'] = depth_buffer_id
|
||||
db['stencil_buffer'] = depth_node.inputs[1].default_value
|
||||
if depth_node.inputs[1] != '':
|
||||
db['format'] = depth_node.inputs[1].default_value
|
||||
depth_buffers.append(db)
|
||||
# Get scale
|
||||
scale = 1.0
|
||||
|
|
|
@ -11,7 +11,7 @@ def kode_studio():
|
|||
subprocess.Popen([kode_path, arm.utils.get_fp()])
|
||||
elif arm.utils.get_os() == 'mac':
|
||||
kode_path = '"' + sdk_path + '/Kode Studio.app/Contents/MacOS/Electron"'
|
||||
subprocess.Popen([kode_path + ' ' + arm.utils.get_fp()], shell=True)
|
||||
subprocess.Popen([kode_path + ' "' + arm.utils.get_fp() + '"'], shell=True)
|
||||
else:
|
||||
kode_path = sdk_path + '/linux64/kodestudio'
|
||||
subprocess.Popen([kode_path, arm.utils.get_fp()])
|
||||
|
|
|
@ -674,7 +674,10 @@ def texture_store(node, tex, tex_name, to_linear=False):
|
|||
else:
|
||||
uv_name = 'texCoord'
|
||||
tex_store = store_var_name(node)
|
||||
curshader.write('vec4 {0} = texture({1}, {2}.xy);'.format(tex_store, tex_name, uv_name))
|
||||
if mat_state.texture_grad:
|
||||
curshader.write('vec4 {0} = textureGrad({1}, {2}.xy, g2.xy, g2.zw);'.format(tex_store, tex_name, uv_name))
|
||||
else:
|
||||
curshader.write('vec4 {0} = texture({1}, {2}.xy);'.format(tex_store, tex_name, uv_name))
|
||||
if to_linear:
|
||||
curshader.write('{0}.rgb = pow({0}.rgb, vec3(2.2));'.format(tex_store))
|
||||
return tex_store
|
||||
|
|
|
@ -218,9 +218,8 @@ def make_deferred(con_mesh):
|
|||
frag.write('n /= (abs(n.x) + abs(n.y) + abs(n.z));')
|
||||
frag.write('n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);')
|
||||
# TODO: store_depth
|
||||
# frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), 1.0 - gl_FragCoord.z);')
|
||||
frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), occlusion);')
|
||||
frag.write('fragColor[1] = vec4(basecol.rgb, 0.0);')
|
||||
frag.write('fragColor[0] = vec4(n.xy, packFloat(metallic, roughness), 1.0 - gl_FragCoord.z);')
|
||||
frag.write('fragColor[1] = vec4(basecol.rgb, occlusion);')
|
||||
|
||||
if '_Veloc' in wrd.rp_defs:
|
||||
frag.write('vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;')
|
||||
|
@ -234,7 +233,7 @@ def make_deferred_plus(con_mesh):
|
|||
vert = con_mesh.make_vert()
|
||||
frag = con_mesh.make_frag()
|
||||
|
||||
frag.add_out('vec4[2] fragColor')
|
||||
frag.add_out('vec4[3] fragColor')
|
||||
|
||||
vert.add_uniform('mat3 N', '_normalMatrix')
|
||||
vert.write_main_header('vec4 spos = vec4(pos, 1.0);')
|
||||
|
@ -245,9 +244,13 @@ def make_deferred_plus(con_mesh):
|
|||
|
||||
frag.add_include('../../Shaders/compiled.glsl')
|
||||
|
||||
vert.add_out('vec2 texCoord')
|
||||
|
||||
mat_state.data.add_elem('tex', 2) #### Add using cycles.py
|
||||
if mat_state.data.is_elem('tex'):
|
||||
vert.add_out('vec2 texCoord')
|
||||
vert.write('texCoord = tex;')
|
||||
else:
|
||||
vert.write('texCoord = vec2(0.0);')
|
||||
|
||||
vert.add_out('vec3 wnormal')
|
||||
write_norpos(vert)
|
||||
|
@ -255,12 +258,16 @@ def make_deferred_plus(con_mesh):
|
|||
frag.write_main_header('vec3 n = normalize(wnormal);')
|
||||
frag.write_pre = False
|
||||
|
||||
frag.add_uniform('float materialID', link='_objectInfoMaterialIndex')
|
||||
|
||||
# Pack gbuffer
|
||||
frag.add_include('../../Shaders/std/gbuffer.glsl')
|
||||
frag.write('n /= (abs(n.x) + abs(n.y) + abs(n.z));')
|
||||
frag.write('n.xy = n.z >= 0.0 ? n.xy : octahedronWrap(n.xy);')
|
||||
frag.write('fragColor[0] = vec4(n.x, n.y, 0.0, 0.0);')
|
||||
frag.write('fragColor[1] = vec4(0.0, 0.0, 0.0, 0.0);')
|
||||
frag.write('fragColor[0] = vec4(n.xy, fract(texCoord));')
|
||||
frag.write('fragColor[1] = vec4(materialID, 0.0, 0.0, 0.0);')
|
||||
frag.write('fragColor[2] = vec4(dFdx(texCoord), dFdy(texCoord));')
|
||||
# + tangent space
|
||||
|
||||
def make_forward(con_mesh):
|
||||
make_forward_base(con_mesh)
|
||||
|
|
129
blender/arm/material/make_rect.py
Normal file
129
blender/arm/material/make_rect.py
Normal file
|
@ -0,0 +1,129 @@
|
|||
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.vertex_structure_as_vsinput = 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('../../Shaders/compiled.glsl')
|
||||
frag.add_include('../../Shaders/std/brdf.glsl')
|
||||
frag.add_include('../../Shaders/std/math.glsl')
|
||||
frag.add_include('../../Shaders/std/gbuffer.glsl')
|
||||
frag.add_include('../../Shaders/std/shirr.glsl')
|
||||
frag.add_include('../../Shaders/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('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('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.write('vec3 wposition = getPos(eye, eyeLook, viewRay, depth);')
|
||||
frag.write('vec3 v = normalize(eye - wposition);')
|
||||
frag.write('float dotNV = dot(n, v);')
|
||||
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(v + l);')
|
||||
frag.write('float dotNH = dot(n, h);')
|
||||
frag.write('float dotVH = dot(v, 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, 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('vec4 lampPos = LWVP * vec4(wposition, 1.0);')
|
||||
frag.write('lampPos.xyz /= lampPos.w;')
|
||||
frag.write('visibility = PCF(lampPos.xy, lampPos.z - shadowsBias);')
|
||||
|
||||
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, 2.2) / PI;')
|
||||
|
||||
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('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;')
|
|
@ -7,6 +7,7 @@ import arm.material.mat_state as mat_state
|
|||
from arm.material.shader_data import ShaderData
|
||||
import arm.material.cycles as cycles
|
||||
import arm.material.make_mesh as make_mesh
|
||||
import arm.material.make_rect as make_rect
|
||||
import arm.material.make_shadowmap as make_shadowmap
|
||||
import arm.material.make_transluc as make_transluc
|
||||
import arm.material.make_overlay as make_overlay
|
||||
|
@ -62,6 +63,9 @@ def build(material, mat_users, mat_armusers, rid):
|
|||
if rp == 'mesh':
|
||||
con = mesh_make(rp, rid)
|
||||
|
||||
elif rp == 'rect':
|
||||
con = make_rect.make(rp)
|
||||
|
||||
elif rp == 'shadowmap':
|
||||
con = make_shadowmap.make(rp, rpasses)
|
||||
|
||||
|
|
|
@ -5,3 +5,4 @@ mat_users = None
|
|||
bind_constants = None # Merged with mat_context bind constants
|
||||
bind_textures = None # Merged with mat_context bind textures
|
||||
batch = False
|
||||
texture_grad = False # Sample textures using textureGrad()
|
||||
|
|
|
@ -38,6 +38,8 @@ def get_rpasses(material):
|
|||
ar.append(con)
|
||||
if bpy.data.cameras[0].rp_voxelgi:
|
||||
ar.append('voxel')
|
||||
if bpy.data.cameras[0].rp_renderer == 'Deferred Plus':
|
||||
ar.append('rect')
|
||||
|
||||
shadows_enabled = False
|
||||
for cam in bpy.data.cameras:
|
||||
|
|
|
@ -17,6 +17,7 @@ class Shader:
|
|||
self.header = ''
|
||||
self.write_pre = False
|
||||
self.tab = 1
|
||||
self.vertex_structure_as_vsinput = True
|
||||
|
||||
def add_include(self, s):
|
||||
self.includes.append(s)
|
||||
|
@ -83,7 +84,7 @@ class Shader:
|
|||
in_ext = ''
|
||||
out_ext = ''
|
||||
|
||||
if self.shader_type == 'vert': # Vertex structure as vertex shader input
|
||||
if self.shader_type == 'vert' and self.vertex_structure_as_vsinput: # Vertex structure as vertex shader input
|
||||
vs = self.context.shader_data['vertex_structure']
|
||||
for e in vs:
|
||||
self.add_in('vec' + str(e['size']) + ' ' + e['name'])
|
||||
|
|
|
@ -155,6 +155,19 @@ class CopyPassNode(Node, CGPipelineTreeNode):
|
|||
|
||||
self.outputs.new('NodeSocketShader', "Stage")
|
||||
|
||||
class MatIDToDepthNode(Node, CGPipelineTreeNode):
|
||||
'''Copy material IDs to depth'''
|
||||
bl_idname = 'MatIDToDepthNodeType'
|
||||
bl_label = 'MatID to Depth'
|
||||
bl_icon = 'SOUND'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Stage")
|
||||
self.inputs.new('NodeSocketShader', "Target")
|
||||
self.inputs.new('NodeSocketShader', "Material ID")
|
||||
|
||||
self.outputs.new('NodeSocketShader', "Stage")
|
||||
|
||||
class BlendPassNode(Node, CGPipelineTreeNode):
|
||||
'''Blend to target node'''
|
||||
bl_idname = 'BlendPassNodeType'
|
||||
|
@ -355,7 +368,19 @@ class DrawMeshesNode(Node, CGPipelineTreeNode):
|
|||
self.inputs[2].default_value = 'front_to_back'
|
||||
|
||||
self.outputs.new('NodeSocketShader', "Stage")
|
||||
|
||||
|
||||
class DrawRectsNode(Node, CGPipelineTreeNode):
|
||||
'''Draw rects of specified context node'''
|
||||
bl_idname = 'DrawRectsNodeType'
|
||||
bl_label = 'Draw Rects'
|
||||
bl_icon = 'SOUND'
|
||||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketShader', "Stage")
|
||||
self.inputs.new('NodeSocketString', "Context")
|
||||
|
||||
self.outputs.new('NodeSocketShader', "Stage")
|
||||
|
||||
class DrawDecalsNode(Node, CGPipelineTreeNode):
|
||||
'''Draw decals node'''
|
||||
bl_idname = 'DrawDecalsNodeType'
|
||||
|
@ -527,7 +552,7 @@ class DepthBufferNode(Node, CGPipelineTreeNode):
|
|||
|
||||
def init(self, context):
|
||||
self.inputs.new('NodeSocketString', "ID")
|
||||
self.inputs.new('NodeSocketBool', "Stencil")
|
||||
self.inputs.new('NodeSocketString', "Format")
|
||||
|
||||
self.outputs.new('NodeSocketShader', "Target")
|
||||
|
||||
|
@ -785,6 +810,7 @@ node_categories = [
|
|||
MyCommandNodeCategory("COMMANDNODES", "Command", items=[
|
||||
NodeItem("BeginNodeType"),
|
||||
NodeItem("DrawMeshesNodeType"),
|
||||
NodeItem("DrawRectsNodeType"),
|
||||
NodeItem("DrawDecalsNodeType"),
|
||||
NodeItem("ClearTargetNodeType"),
|
||||
NodeItem("ClearImageNodeType"),
|
||||
|
@ -819,6 +845,7 @@ node_categories = [
|
|||
NodeItem("MotionBlurPassNodeType"),
|
||||
NodeItem("MotionBlurVelocityPassNodeType"),
|
||||
NodeItem("CopyPassNodeType"),
|
||||
NodeItem("MatIDToDepthNodeType"),
|
||||
NodeItem("BlendPassNodeType"),
|
||||
NodeItem("CombinePassNodeType"),
|
||||
NodeItem("BlurBasicPassNodeType"),
|
||||
|
@ -852,6 +879,7 @@ def register():
|
|||
bpy.utils.register_class(CGPipelineTree)
|
||||
bpy.utils.register_class(BeginNode)
|
||||
bpy.utils.register_class(DrawMeshesNode)
|
||||
bpy.utils.register_class(DrawRectsNode)
|
||||
bpy.utils.register_class(DrawDecalsNode)
|
||||
bpy.utils.register_class(ClearTargetNode)
|
||||
bpy.utils.register_class(ClearImageNode)
|
||||
|
@ -882,6 +910,7 @@ def register():
|
|||
bpy.utils.register_class(MotionBlurPassNode)
|
||||
bpy.utils.register_class(MotionBlurVelocityPassNode)
|
||||
bpy.utils.register_class(CopyPassNode)
|
||||
bpy.utils.register_class(MatIDToDepthNode)
|
||||
bpy.utils.register_class(BlendPassNode)
|
||||
bpy.utils.register_class(CombinePassNode)
|
||||
bpy.utils.register_class(BlurBasicPassNode)
|
||||
|
@ -913,6 +942,7 @@ def unregister():
|
|||
bpy.utils.unregister_class(CGPipelineTree)
|
||||
bpy.utils.unregister_class(BeginNode)
|
||||
bpy.utils.unregister_class(DrawMeshesNode)
|
||||
bpy.utils.unregister_class(DrawRectsNode)
|
||||
bpy.utils.unregister_class(DrawDecalsNode)
|
||||
bpy.utils.unregister_class(ClearTargetNode)
|
||||
bpy.utils.unregister_class(ClearImageNode)
|
||||
|
@ -943,6 +973,7 @@ def unregister():
|
|||
bpy.utils.unregister_class(MotionBlurPassNode)
|
||||
bpy.utils.unregister_class(MotionBlurVelocityPassNode)
|
||||
bpy.utils.unregister_class(CopyPassNode)
|
||||
bpy.utils.unregister_class(MatIDToDepthNode)
|
||||
bpy.utils.unregister_class(BlendPassNode)
|
||||
bpy.utils.unregister_class(CombinePassNode)
|
||||
bpy.utils.unregister_class(BlurBasicPassNode)
|
||||
|
|
|
@ -169,7 +169,7 @@ class ArmoryEditScriptButton(bpy.types.Operator):
|
|||
subprocess.Popen([kode_path, arm.utils.get_fp(), hx_path])
|
||||
elif arm.utils.get_os() == 'mac':
|
||||
kode_path = '"' + sdk_path + '/Kode Studio.app/Contents/MacOS/Electron"'
|
||||
subprocess.Popen([kode_path + ' ' + arm.utils.get_fp() + ' ' + hx_path], shell=True)
|
||||
subprocess.Popen([kode_path + ' "' + arm.utils.get_fp() + '" "' + hx_path + '"'], shell=True)
|
||||
else:
|
||||
kode_path = sdk_path + '/linux64/kodestudio'
|
||||
subprocess.Popen([kode_path, arm.utils.get_fp(), hx_path])
|
||||
|
|
|
@ -388,7 +388,7 @@ class ArmoryPlayerPanel(bpy.types.Panel):
|
|||
|
||||
layout.prop(wrd, 'arm_play_advanced')
|
||||
if wrd.arm_play_advanced:
|
||||
# layout.prop(wrd, make_utils.runtime_to_gapi())
|
||||
layout.prop(wrd, make_utils.runtime_to_gapi())
|
||||
layout.prop(wrd, 'arm_play_console')
|
||||
if arm.utils.with_krom():
|
||||
row = layout.row(align=True)
|
||||
|
@ -437,7 +437,7 @@ class ArmoryProjectPanel(bpy.types.Panel):
|
|||
row.operator("arm.build_project")
|
||||
row.operator("arm.publish_project")
|
||||
layout.prop(wrd, 'arm_project_target')
|
||||
# layout.prop(wrd, make_utils.target_to_gapi())
|
||||
layout.prop(wrd, make_utils.target_to_gapi())
|
||||
|
||||
layout.label("Libraries")
|
||||
rows = 2
|
||||
|
|
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue