Fix shader paths

This commit is contained in:
Lubos Lenco 2016-12-21 00:51:04 +01:00
parent b0c0a426c7
commit 0954693781
16 changed files with 141 additions and 122 deletions

View file

@ -214,9 +214,9 @@ void main() {
float gamma_val = acos(cos_gamma);
vec3 R = Z * hosekWilkie(cos_theta, gamma_val, cos_gamma) * envmapStrength;
#ifndef _LDR
R = pow(R, vec3(2.2));
#endif
// #ifndef _LDR
// R = pow(R, vec3(2.2));
// #endif
#endif
#ifdef _EnvClouds

View file

@ -60,11 +60,11 @@ def get_sdk_path():
# blender.app/Contents/MacOS/blender
return bpy.app.binary_path[:-22] + '/armsdk/'
elif get_os() == 'linux':
# blender
return bpy.app.binary_path[:-7] + '/armsdk/'
# /blender
return bpy.app.binary_path.rsplit('/', 1)[0] + '/armsdk/'
else:
# blender.exe
return bpy.app.binary_path[:-11] + '/armsdk/'
# /blender.exe
return bpy.app.binary_path.replace('\\', '/').rsplit('/', 1)[0] + '/armsdk/'
else:
return addon_prefs.sdk_path
@ -106,7 +106,10 @@ def safefilename(s):
return s
def safe_source_name(s):
return safefilename(s).replace('.', '_').replace('-', '_').replace(' ', '')
s = safefilename(s).replace('.', '_').replace('-', '_').replace(' ', '')
if s[0].isdigit():
s = '_' + s
return s
def safe_assetpath(s):
return s[2:] if s[:2] == '//' else s # Remove leading '//'

View file

@ -2176,6 +2176,7 @@ class ArmoryExporter:
ob.data.mesh_cached = False
self.output['material_datas'].append(o)
material.is_cached = True
# Object with no material assigned in the scene
if self.export_default_material:
@ -2552,14 +2553,7 @@ class ArmoryExporter:
with open(targetpath, 'w') as f:
f.write(bpy.data.texts[t.jsscript_prop].as_string())
sdk_path = armutils.get_sdk_path()
# Extract path to built-in python binary
if armutils.get_os() == 'win':
# Remove 'os.py' from path
python_path = os.__file__[:-5] + '../bin/python.exe'
elif armutils.get_os() == 'mac':
python_path = os.__file__[:-5] + '../../bin/python3.5m'
else:
python_path = os.__file__[:-5] + '../../bin/python3.5m'
python_path = bpy.app.binary_path_python
cwd = os.getcwd()
os.chdir(scriptspath)
# Disable minification for now, too slow

View file

@ -120,10 +120,13 @@ def on_scene_update_post(context):
edit_obj.data.data_cached = False
obj = bpy.context.object
if obj != None and operators_changed:
# Modifier was added/removed, recache mesh
if ops[-1].bl_idname == 'OBJECT_OT_modifier_add' or ops[-1].bl_idname == 'OBJECT_OT_modifier_remove':
obj.data.mesh_cached = False
if obj != None:
if operators_changed:
# Modifier was added/removed, recache mesh
if ops[-1].bl_idname == 'OBJECT_OT_modifier_add' or ops[-1].bl_idname == 'OBJECT_OT_modifier_remove':
obj.data.mesh_cached = False
if obj.active_material != None and obj.active_material.is_updated:
obj.active_material.is_cached = False
@persistent
def on_load_post(context):

View file

@ -139,13 +139,13 @@ def compile_project(target_name=None, is_publish=False, watch=False, patch=False
if armutils.get_os() == 'win':
node_path = sdk_path + '/nodejs/node.exe'
khamake_path = sdk_path + '/win32/resources/app/extensions/kha/Kha/make'
khamake_path = sdk_path + '/win32/Kha/make'
elif armutils.get_os() == 'mac':
node_path = sdk_path + '/nodejs/node-osx'
khamake_path = sdk_path + '/Kode Studio.app/Contents/Resources/app/extensions/kha/Kha/make'
khamake_path = sdk_path + '/Kode Studio.app/Contents/Kha/make'
else:
node_path = sdk_path + '/nodejs/node-linux64'
khamake_path = sdk_path + '/linux64/resources/app/extensions/kha/Kha/make'
khamake_path = sdk_path + '/linux64/Kha/make'
kha_target_name = make_utils.get_kha_target(target_name)
cmd = [node_path, khamake_path, kha_target_name]
@ -394,13 +394,13 @@ def on_compiled(mode): # build, play, play_viewport, publish
webbrowser.open(html5_app_path)
elif wrd.arm_play_runtime == 'Krom':
if armutils.get_os() == 'win':
krom_location = sdk_path + '/win32/resources/app/extensions/krom/Krom/win32'
krom_location = sdk_path + '/win32/Krom/win32'
krom_path = krom_location + '/Krom.exe'
elif armutils.get_os() == 'mac':
krom_location = sdk_path + '/Kode Studio.app/Contents/Resources/app/extensions/krom/Krom/macos/Krom.app/Contents/MacOS'
krom_location = sdk_path + '/Kode Studio.app/Contents/Krom/macos/Krom.app/Contents/MacOS'
krom_path = krom_location + '/Krom'
else:
krom_location = sdk_path + '/linux64/resources/app/extensions/krom/Krom/linux'
krom_location = sdk_path + '/linux64/Krom/linux'
krom_path = krom_location + '/Krom'
os.chdir(krom_location)
state.playproc = subprocess.Popen([krom_path, armutils.get_fp() + '/build/window/krom', armutils.get_fp() + '/build/window/krom-resources'], stderr=subprocess.PIPE)

View file

@ -129,7 +129,7 @@ def make_draw_meshes(stage, node_group, node):
# Context
context = node.inputs[1].default_value
# Store shadowmap size
if context == build_node_tree.cam.shadows_context:
if context == 'shadowmap':
bpy.data.worlds['Arm'].shadowmap_size = buildNode.last_set_target_w
stage['params'].append(context)
# Order

View file

@ -254,7 +254,8 @@ def parse_color(world, node, context, envmap_strength_const):
# Append sky define
elif node.type == 'TEX_SKY':
envmap_strength_const['float'] *= 0.25 # Match to Cycles
# Match to cycles
envmap_strength_const['float'] *= 0.1
bpy.data.worlds['Arm'].world_defs += '_EnvSky'
# Append sky properties to material

View file

@ -20,7 +20,8 @@ def parse(material, mat_data, mat_users, rid):
mat_state.output_node = cycles.node_by_type(mat_state.nodes, 'OUTPUT_MATERIAL')
if mat_state.output_node == None:
return None
mat_state.path = armutils.get_fp() + '/build/compiled/ShaderRaws/' + material.name
matname = armutils.safe_source_name(material.name)
mat_state.path = armutils.get_fp() + '/build/compiled/ShaderRaws/' + matname
if not os.path.exists(mat_state.path):
os.makedirs(mat_state.path)
@ -77,42 +78,28 @@ def parse(material, mat_data, mat_users, rid):
write_shaders(con, rp)
armutils.write_arm(mat_state.path + '/' + material.name + '_data.arm', mat_state.data.get())
armutils.write_arm(mat_state.path + '/' + matname + '_data.arm', mat_state.data.get())
shader_data_name = material.name + '_data'
shader_data_path = 'build/compiled/ShaderRaws/' + material.name + '/' + shader_data_name + '.arm'
shader_data_name = matname + '_data'
shader_data_path = 'build/compiled/ShaderRaws/' + matname + '/' + shader_data_name + '.arm'
assets.add_shader_data(shader_data_path)
mat_data['shader'] = shader_data_name + '/' + shader_data_name
return mat_state.data.sd
def write_shaders(con, rpass):
if con.vert != None:
shader_path = mat_state.path + '/' + mat_state.material.name + '_' + rpass + '.vert.glsl'
assets.add_shader(shader_path)
keep_cache = mat_state.material.is_cached
write_shader(con.vert, 'vert', rpass, keep_cache)
write_shader(con.frag, 'frag', rpass, keep_cache)
write_shader(con.geom, 'geom', rpass, keep_cache)
write_shader(con.tesc, 'tesc', rpass, keep_cache)
write_shader(con.tese, 'tese', rpass, keep_cache)
def write_shader(shader, ext, rpass, keep_cache=True):
if shader == None:
return
shader_path = mat_state.path + '/' + armutils.safe_source_name(mat_state.material.name) + '_' + rpass + '.' + ext + '.glsl'
assets.add_shader(shader_path)
if not os.path.isfile(shader_path) or keep_cache:
with open(shader_path, 'w') as f:
f.write(con.vert.get())
if con.frag != None:
shader_path = mat_state.path + '/' + mat_state.material.name + '_' + rpass + '.frag.glsl'
assets.add_shader(shader_path)
with open(shader_path, 'w') as f:
f.write(con.frag.get())
if con.geom != None:
shader_path = mat_state.path + '/' + mat_state.material.name + '_' + rpass + '.geom.glsl'
assets.add_shader(shader_path)
with open(shader_path, 'w') as f:
f.write(con.geom.get())
if con.tesc != None:
shader_path = mat_state.path + '/' + mat_state.material.name + '_' + rpass + '.tesc.glsl'
assets.add_shader(shader_path)
with open(shader_path, 'w') as f:
f.write(con.tesc.get())
if con.tese != None:
shader_path = mat_state.path + '/' + mat_state.material.name + '_' + rpass + '.tese.glsl'
assets.add_shader(shader_path)
with open(shader_path, 'w') as f:
f.write(con.tese.get())
f.write(shader.get())

View file

@ -19,9 +19,9 @@ def make(context_id, rid):
return con_mesh
def make_base(con_mesh, mrt, parse_opacity):
def make_base(con_mesh, parse_opacity):
vert = con_mesh.make_vert()
frag = con_mesh.make_frag(mrt=mrt)
frag = con_mesh.make_frag()
geom = None
tesc = None
tese = None
@ -31,8 +31,6 @@ def make_base(con_mesh, mrt, parse_opacity):
vert.add_uniform('mat4 N', '_normalMatrix')
vert.write_pre = True
vert.write('vec4 spos = vec4(pos, 1.0);')
if mat_state.data.is_elem('off'):
vert.write('spos.xyz += off;')
vert.write_pre = False
if mat_utils.disp_linked(mat_state.output_node):
@ -144,24 +142,55 @@ def write_norpos(vert, declare=False):
vert.write(prep + 'wnormal = normalize(mat3(N) * (nor + 2.0 * cross(skinA.xyz, cross(skinA.xyz, nor) + skinA.w * nor)));')
else:
vert.write(prep + 'wnormal = normalize(mat3(N) * nor);')
if mat_state.data.is_elem('off'):
vert.write('spos.xyz += off;')
vert.write('wposition = vec4(W * spos).xyz;')
vert.write_pre = False
def make_deferred(con_mesh):
make_base(con_mesh, mrt=2, parse_opacity=False)
wrd = bpy.data.worlds['Arm']
make_base(con_mesh, parse_opacity=False)
frag = con_mesh.frag
vert = con_mesh.vert
if '_Veloc' in wrd.world_defs:
frag.add_out('vec4[3] fragColor')
vert.add_uniform('mat4 prevWVP', link='_prevWorldViewProjectionMatrix')
vert.add_out('vec4 wvpposition')
vert.add_out('vec4 prevwvpposition')
vert.write('wvpposition = gl_Position;')
vert.write('prevwvpposition = prevWVP * spos;')
else:
frag.add_out('vec4[2] fragColor')
# Pack gbuffer
frag = con_mesh.frag
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.xy, packFloat(metallic, roughness), 1.0 - gl_FragCoord.z);')
frag.write('fragColor[1] = vec4(basecol.rgb, occlusion);')
if '_Veloc' in wrd.world_defs:
frag.write('vec2 posa = (wvpposition.xy / wvpposition.w) * 0.5 + 0.5;')
frag.write('vec2 posb = (prevwvpposition.xy / prevwvpposition.w) * 0.5 + 0.5;')
frag.write('fragColor[2].rg = vec2(posa - posb);')
return con_mesh
def make_forward(con_mesh, mrt=1, parse_opacity=False):
make_base(con_mesh, mrt=mrt, parse_opacity=parse_opacity)
def make_forward(con_mesh):
make_forward_base(con_mesh)
frag.add_out('vec4 fragColor')
frag.write('fragColor = vec4(direct * lightColor * visibility + indirect * occlusion * envmapStrength, 1.0);')
if '_LDR' in bpy.data.worlds['Arm'].world_defs:
frag.write('fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2);')
def make_forward_base(con_mesh, parse_opacity=False):
wrd = bpy.data.worlds['Arm']
make_base(con_mesh, parse_opacity=parse_opacity)
vert = con_mesh.vert
frag = con_mesh.frag
tese = con_mesh.tese
@ -175,9 +204,10 @@ def make_forward(con_mesh, mrt=1, parse_opacity=False):
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', ifdef='_Rad')
frag.add_uniform('sampler2D senvmapBrdf', link='_envmapBrdf', ifdef='_Rad')
frag.add_uniform('int envmapNumMipmaps', link='_envmapNumMipmaps', ifdef='_Rad')
if '_Rad' in wrd.world_defs:
frag.add_uniform('sampler2D senvmapRadiance', link='_envmapRadiance')
frag.add_uniform('sampler2D senvmapBrdf', link='_envmapBrdf')
frag.add_uniform('int envmapNumMipmaps', link='_envmapNumMipmaps')
frag.write('vec3 l = lightType == 0 ? lightDir : normalize(lightPos - wposition);')
frag.write('vec3 h = normalize(v + l);')
@ -185,7 +215,6 @@ def make_forward(con_mesh, mrt=1, parse_opacity=False):
frag.write('float dotNH = dot(n, h);')
frag.write('float dotVH = dot(v, h);')
wrd = bpy.data.worlds['Arm']
if '_PCSS' in wrd.world_defs:
is_pcss = True
else:
@ -241,19 +270,12 @@ def make_forward(con_mesh, mrt=1, parse_opacity=False):
frag.write('direct += specularBRDF(f0, roughness, dotNL, dotNH, dotNV, dotVH);')
frag.write('vec3 indirect = (shIrradiance(n, 2.2) / PI) * albedo;')
frag.write('#ifdef _Rad')
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('#ifdef _EnvLDR')
frag.write('prefilteredColor = pow(prefilteredColor, vec3(2.2);')
frag.write('#endif')
frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;')
frag.write('indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y);')
frag.write('#endif')
if mrt == 1:
frag.write('fragColor = vec4(direct * lightColor * visibility + indirect * occlusion * envmapStrength, 1.0);')
frag.write('#ifdef _LDR')
frag.write('fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2);')
frag.write('#endif')
if '_RAD' in wrd.world_defs:
frag.write('vec3 reflectionWorld = reflect(-v, n);')
frag.write('float lod = getMipFromRoughness(roughness, envmapNumMipmaps);')
frag.write('vec3 prefilteredColor = textureLod(senvmapRadiance, envMapEquirect(reflectionWorld), lod).rgb;')
if '_EnvLDR' in wrd.world_defs:
frag.write('prefilteredColor = pow(prefilteredColor, vec3(2.2);')
frag.write('vec2 envBRDF = texture(senvmapBrdf, vec2(roughness, 1.0 - dotNV)).xy;')
frag.write('indirect += prefilteredColor * (f0 * envBRDF.x + envBRDF.y);')

View file

@ -13,6 +13,7 @@ def make(context_id, rpasses):
tesc = None
tese = None
frag.add_out('vec4 fragColor')
vert.write('vec4 spos = vec4(pos, 1.0);')
parse_opacity = 'translucent' in rpasses

View file

@ -7,12 +7,14 @@ def make(context_id):
'blend_source': 'blend_one', 'blend_destination': 'blend_one', 'blend_operation': 'add', \
'alpha_blend_source': 'blend_zero', 'alpha_blend_destination': 'inverse_source_alpha', 'alpha_blend_operation': 'add' })
make_mesh.make_forward(con_transluc, mrt=2, parse_opacity=True)
make_mesh.make_forward_base(con_transluc, parse_opacity=True)
vert = con_transluc.vert
frag = con_transluc.frag
tese = con_transluc.tese
frag.add_out('vec4[2] fragColor')
if tese != None:
tese.add_out('vec4 wvpposition')
tese.write('wvpposition = gl_Position;')

View file

@ -10,7 +10,6 @@ class Shader:
self.ins = []
self.outs = []
self.uniforms = []
self.uniforms_ifdefs = []
self.functions = {}
self.main = ''
self.main_pre = ''
@ -26,7 +25,7 @@ class Shader:
def add_out(self, s):
self.outs.append(s)
def add_uniform(self, s, link=None, included=False, ifdef=None):
def add_uniform(self, s, link=None, included=False):
ar = s.split(' ')
if ar[0] == 'sampler2D':
self.context.add_texture_unit(ar[0], ar[1], link=link)
@ -36,7 +35,6 @@ class Shader:
ar[1] = ar[1].split('[', 1)[0]
self.context.add_constant(ar[0], ar[1], link=link)
if included == False and s not in self.uniforms:
self.uniforms_ifdefs.append(ifdef)
self.uniforms.append(s)
def add_function(self, s):
@ -91,14 +89,8 @@ class Shader:
s += 'in {0}{1};\n'.format(a, in_ext)
for a in self.outs:
s += 'out {0}{1};\n'.format(a, out_ext)
for i in range(len(self.uniforms)):
a = self.uniforms[i]
ifdef = self.uniforms_ifdefs[i]
if ifdef != None:
s += '#ifdef {0}\n'.format(ifdef)
for a in self.uniforms:
s += 'uniform ' + a + ';\n'
if ifdef != None:
s += '#endif\n'
for f in self.functions:
s += self.functions[f]
s += 'void main() {\n'

View file

@ -1,4 +1,5 @@
from material.shader import Shader
import armutils
class ShaderData:
@ -8,7 +9,8 @@ class ShaderData:
self.sd = {}
self.data = {}
self.data['shader_datas'] = [self.sd]
self.sd['name'] = material.name + '_data'
self.matname = armutils.safe_source_name(material.name)
self.sd['name'] = self.matname + '_data'
self.sd['vertex_structure'] = []
self.sd['contexts'] = []
@ -57,6 +59,7 @@ class ShaderContext:
self.tesc = None
self.tese = None
self.material = material
self.matname = armutils.safe_source_name(material.name)
self.shader_data = shader_data
self.data = {}
self.data['name'] = props['name']
@ -113,30 +116,26 @@ class ShaderContext:
self.tunits.append(c)
def make_vert(self):
self.data['vertex_shader'] = self.material.name + '_' + self.data['name'] + '.vert'
self.data['vertex_shader'] = self.matname + '_' + self.data['name'] + '.vert'
self.vert = Shader(self, 'vert')
return self.vert
def make_frag(self, mrt=1):
self.data['fragment_shader'] = self.material.name + '_' + self.data['name'] + '.frag'
def make_frag(self):
self.data['fragment_shader'] = self.matname + '_' + self.data['name'] + '.frag'
self.frag = Shader(self, 'frag')
if mrt > 1:
self.frag.add_out('vec4[{0}] fragColor'.format(mrt))
else:
self.frag.add_out('vec4 fragColor')
return self.frag
def make_geom(self):
self.data['geometry_shader'] = self.material.name + '_' + self.data['name'] + '.geom'
self.data['geometry_shader'] = self.matname + '_' + self.data['name'] + '.geom'
self.geom = Shader(self, 'geom')
return self.geom
def make_tesc(self):
self.data['tesscontrol_shader'] = self.material.name + '_' + self.data['name'] + '.tesc'
self.data['tesscontrol_shader'] = self.matname + '_' + self.data['name'] + '.tesc'
self.tesc = Shader(self, 'tesc')
return self.tesc
def make_tese(self):
self.data['tesseval_shader'] = self.material.name + '_' + self.data['name'] + '.tese'
self.data['tesseval_shader'] = self.matname + '_' + self.data['name'] + '.tese'
self.tese = Shader(self, 'tese')
return self.tese

View file

@ -146,9 +146,8 @@ def init_properties():
bpy.types.Armature.actiontraitlist_index = bpy.props.IntProperty(name="Action index", default=0)
# For camera
bpy.types.Camera.frustum_culling = bpy.props.BoolProperty(name="Frustum Culling", description="Perform frustum culling for this camera", default=True)
bpy.types.Camera.renderpath_path = bpy.props.StringProperty(name="Render Path", description="Render path nodes used for this camera", default="deferred_path_low") # default="armory_default")
bpy.types.Camera.renderpath_id = bpy.props.StringProperty(name="Render Path ID", description="Asset ID", default="deferred")
# TODO: Specify multiple material ids, merge ids from multiple cameras
bpy.types.Camera.renderpath_path = bpy.props.StringProperty(name="Render Path", description="Render path nodes used for this camera", default="deferred_path_low", update=assets.invalidate_shader_cache) # default="armory_default")
bpy.types.Camera.renderpath_id = bpy.props.StringProperty(name="Render Path ID", description="Asset ID", default="deferred")
bpy.types.Camera.renderpath_passes = bpy.props.StringProperty(name="Render Path Passes", description="Referenced render passes", default="")
bpy.types.Camera.is_probe = bpy.props.BoolProperty(name="Probe", description="Render this camera as environment probe using Cycles", default=False)
bpy.types.Camera.probe_generate_radiance = bpy.props.BoolProperty(name="Generate Radiance", description="Generate radiance textures", default=False)
@ -208,7 +207,11 @@ def init_properties():
bpy.types.Camera.rp_ssao = bpy.props.BoolProperty(name="SSAO", description="Screen space ambient occlusion", default=True)
bpy.types.Camera.rp_ssr = bpy.props.BoolProperty(name="SSR", description="Screen space reflections", default=False)
bpy.types.Camera.rp_bloom = bpy.props.BoolProperty(name="Bloom", description="Bloom processing", default=False)
bpy.types.Camera.rp_motionblur = bpy.props.BoolProperty(name="Motion Blur", description="Motion blur processing", default=False)
bpy.types.Camera.rp_motionblur = EnumProperty(
items=[('None', 'None', 'None'),
('Basic', 'Basic', 'Basic'),
('Velocity', 'Velocity', 'Velocity')],
name="Motion Blur", description="Motion blur processing", default='None')
bpy.types.Camera.rp_translucency = bpy.props.BoolProperty(name="Translucency", description="Order independent translucency", default=False)
bpy.types.Camera.rp_decals = bpy.props.BoolProperty(name="Decals", description="Render decals", default=False)
bpy.types.Camera.rp_overlays = bpy.props.BoolProperty(name="Overlays", description="Render overlays", default=False)
@ -314,6 +317,7 @@ def init_properties():
bpy.types.World.voxelgi = bpy.props.BoolProperty(name="VGI", description="Voxel-based Global Illumination", default=False, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_dimensions = bpy.props.FloatVectorProperty(name="Dimensions", description="3D texture size", size=3, default=[128, 128, 128], update=assets.invalidate_shader_cache)
# For material
bpy.types.Material.is_cached = bpy.props.BoolProperty(name="Material Cached", description="No need to reexport material data", default=False)
bpy.types.Material.cast_shadow = bpy.props.BoolProperty(name="Cast Shadow", default=True)
bpy.types.Material.receive_shadow = bpy.props.BoolProperty(name="Receive Shadow", default=True)
bpy.types.Material.override_shader = bpy.props.BoolProperty(name="Override Shader", default=False)

View file

@ -28,7 +28,7 @@ def set_preset(preset):
cam.rp_ssao = False
cam.rp_ssr = False
cam.rp_bloom = False
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'Forward':
cam.rp_renderer = 'Forward'
cam.rp_shadowmap = '2048'
@ -48,7 +48,7 @@ def set_preset(preset):
cam.rp_ssao = False
cam.rp_ssr = False
cam.rp_bloom = False
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'Forward High':
cam.rp_renderer = 'Forward'
cam.rp_shadowmap = '4096'
@ -68,7 +68,7 @@ def set_preset(preset):
cam.rp_ssao = True
cam.rp_ssr = True
cam.rp_bloom = False
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'Deferred Low':
cam.rp_renderer = 'Deferred'
cam.rp_shadowmap = '2048'
@ -88,7 +88,7 @@ def set_preset(preset):
cam.rp_ssao = True
cam.rp_ssr = False
cam.rp_bloom = False
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'Deferred':
cam.rp_renderer = 'Deferred'
cam.rp_shadowmap = '2048'
@ -108,7 +108,7 @@ def set_preset(preset):
cam.rp_ssao = True
cam.rp_ssr = True
cam.rp_bloom = True
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'Deferred High':
cam.rp_renderer = 'Deferred'
cam.rp_shadowmap = '4096'
@ -128,7 +128,7 @@ def set_preset(preset):
cam.rp_ssao = True
cam.rp_ssr = True
cam.rp_bloom = True
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'VR Low':
cam.rp_renderer = 'Forward'
cam.rp_shadowmap = '1024'
@ -148,7 +148,7 @@ def set_preset(preset):
cam.rp_ssao = False
cam.rp_ssr = False
cam.rp_bloom = False
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
elif preset == 'Grease Pencil':
cam.rp_renderer = 'Forward'
cam.rp_shadowmap = 'None'
@ -168,7 +168,7 @@ def set_preset(preset):
cam.rp_ssao = False
cam.rp_ssr = False
cam.rp_bloom = False
cam.rp_motionblur = False
cam.rp_motionblur = 'None'
# Menu in camera data region
class GenRPDataPropsPanel(bpy.types.Panel):

View file

@ -230,6 +230,15 @@ class InvalidateCacheButton(bpy.types.Operator):
context.object.data.mesh_cached = False
return{'FINISHED'}
class InvalidateMaterialCacheButton(bpy.types.Operator):
'''Delete cached material data'''
bl_idname = "arm.invalidate_material_cache"
bl_label = "Invalidate Cache"
def execute(self, context):
context.object.material.is_cached = False
return{'FINISHED'}
class InvalidateGPCacheButton(bpy.types.Operator):
'''Delete cached grease pencil data'''
bl_idname = "arm.invalidate_gp_cache"
@ -286,6 +295,8 @@ class MaterialPropsPanel(bpy.types.Panel):
layout.prop(mat, 'height_tess_shadows_outer')
layout.prop(mat, 'transluc_shadows')
layout.operator("arm.invalidate_cache")
class WorldPropsPanel(bpy.types.Panel):
bl_label = "Armory Props"
bl_space_type = "PROPERTIES"