Deferred+ renderer

This commit is contained in:
Lubos Lenco 2017-03-28 14:30:51 +02:00
parent 41d84927d5
commit 44f257f6ba
20 changed files with 255 additions and 27 deletions

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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;

View 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
}

View 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"
}
]
}

View file

@ -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

View file

@ -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()])

View file

@ -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

View file

@ -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)

View 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;')

View file

@ -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)

View file

@ -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()

View file

@ -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:

View file

@ -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'])

View file

@ -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)

View file

@ -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])

View file

@ -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.