Voxel tweaks

This commit is contained in:
Lubos Lenco 2017-05-20 19:07:15 +02:00
parent bed280752f
commit 0df4db841b
17 changed files with 207 additions and 37 deletions

View file

@ -72,22 +72,24 @@ void main() {
#endif
#ifdef _VoxelGI
vec4 indirectDiffuse = indirectDiffuseLight(n, p / voxelgiDimensions.x);
indirectDiffuse.a *= 0.26 * voxelgiOcc;
vec3 wpos = p / voxelgiDimensions.x;
vec4 indirectDiffuse = indirectDiffuseLight(n, wpos);
vec3 reflectWorld = reflect(-v, n);
vec3 indirectSpecular = traceSpecularVoxelCone(p / voxelgiDimensions.x, reflectWorld, n, metrough.y * 10.0);
vec3 indirectSpecular = traceSpecularVoxelCone(wpos, reflectWorld, n, metrough.y * 10.0);
indirectSpecular *= f0 * envBRDF.x + envBRDF.y;
fragColor.rgb = indirectDiffuse.rgb * voxelgiDiff * albedo + indirectSpecular * voxelgiSpec;
float occ = 1.0 - indirectDiffuse.a;
fragColor.rgb = indirectDiffuse.rgb * voxelgiDiff * g1.rgb + indirectSpecular * voxelgiSpec;
float occ = 1.0 - indirectDiffuse.a * 0.25 * voxelgiOcc;
fragColor.rgb *= occ;
#ifdef _SSAO
fragColor.rgb *= texture(ssaotex, texCoord).r * 0.5 + 0.5;
#endif
// if (opacity < 1.0) fragColor.rgb = mix(indirectRefractiveLight(-v), fragColor.rgb); // Transparency
// float opacity = g1.a;
// if (opacity < 1.0) fragColor.rgb = mix(indirectRefractiveLight(-v, n, vec3(1.0), opacity, wpos), fragColor.rgb, opacity);
// return;
#endif

View file

@ -8,6 +8,7 @@ uniform sampler3D voxels;
const float VOXEL_SIZE = 1.0 / voxelgiResolution.x;
const float MAX_MIPMAP = 5.4;
const float VOXEL_RATIO = 128.0 / voxelgiResolution.x;
vec3 orthogonal(const vec3 u) {
// Pass normalized u
@ -21,8 +22,8 @@ vec4 traceDiffuseVoxelCone(const vec3 from, vec3 direction) {
vec4 acc = vec4(0.0);
// Controls bleeding from close surfaces
// Low values look rather bad if using shadow cone tracing
float dist = 0.1953125 / 9.0;
const float SQRT2 = 1.414213;
float dist = 0.1953125 / (9.0 * VOXEL_RATIO * voxelgiStep);
const float SQRT2 = 1.414213 * voxelgiRange;
while (dist < SQRT2 && acc.a < 1.0) {
vec3 c = vec3(from + dist * direction) * 0.5 + vec3(0.5);
float l = (1.0 + CONE_SPREAD * dist / VOXEL_SIZE);
@ -107,12 +108,12 @@ vec3 traceSpecularVoxelCone(vec3 from, vec3 direction, const vec3 normal, const
return 1.0 * pow(specularDiffusion + 1, 0.8) * acc.rgb;
}
// vec3 indirectRefractiveLight(const vec3 v, const vec3 normal){
// float refractiveIndex = 1.2;
// const vec3 refraction = refract(v, normal, 1.0 / refractiveIndex);
// const vec3 cmix = mix(specularColor, 0.5 * (specularColor + vec3(1)), transparency);
// return cmix * traceSpecularVoxelCone(worldPositionFrag, refraction, 0.1);
// }
vec3 indirectRefractiveLight(const vec3 v, const vec3 normal, const vec3 specCol, const float opacity, const vec3 wpos) {
const float refractiveIndex = 1.2;
vec3 refraction = refract(v, normal, 1.0 / refractiveIndex);
vec3 cmix = mix(0.5 * (specCol + vec3(1.0)), specCol, opacity);
return cmix * traceSpecularVoxelCone(wpos, refraction, normal, 0.1);
}
float traceShadowCone(vec3 from, vec3 direction, float targetDistance, vec3 normal) {
from += normal * 0.0; // Removes artifacts but makes self shadowing for dense meshes meh

View file

@ -1189,6 +1189,31 @@ class ArmoryExporter:
return space.region_3d.perspective_matrix
return None
def make_fake_omni_lamps(self, o, bobject):
# Look down
o['transform']['values'] = [1.0, 0.0, 0.0, bobject.location.x, 0.0, 1.0, 0.0, bobject.location.y, 0.0, 0.0, 1.0, bobject.location.z, 0.0, 0.0, 0.0, 1.0]
if not hasattr(o, 'children'):
o['children'] = []
# Make child lamps
for i in range(0, 5):
child_lamp = {}
child_lamp['name'] = o['name'] + '__' + str(i)
child_lamp['data_ref'] = o['data_ref']
child_lamp['type'] = 'lamp_object'
if i == 0:
mat = [0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
elif i == 1:
mat = [0.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
elif i == 2:
mat = [0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
elif i == 3:
mat = [0.0, -1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
elif i == 4:
mat = [-1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0]
child_lamp['transform'] = {}
child_lamp['transform']['values'] = mat
o['children'].append(child_lamp)
def export_object(self, bobject, scene, poseBone = None, parento = None):
# This function exports a single object in the scene and includes its name,
# object reference, material references (for meshes), and transform.
@ -1331,6 +1356,10 @@ class ArmoryExporter:
# Export the transform. If object is animated, then animation tracks are exported here
self.export_object_transform(bobject, scene, o)
# 6 directional lamps if cubemap is disabled
if type == NodeTypeLamp and objref.type == 'POINT' and objref.lamp_omni_shadows and not objref.lamp_omni_shadows_cubemap:
self.make_fake_omni_lamps(o, bobject)
# Viewport Camera - overwrite active camera matrix with viewport matrix
if type == NodeTypeCamera and bpy.data.worlds['Arm'].arm_play_viewport_camera and self.scene.camera != None and bobject.name == self.scene.camera.name:
viewport_matrix = self.get_viewport_view_matrix()
@ -2053,8 +2082,9 @@ class ArmoryExporter:
o['lamp_size'] = lamp_size * 10 # Match to Cycles
if objtype == 'POINT' and objref.lamp_omni_shadows:
o['fov'] = 1.5708 # 90 deg
o['shadowmap_cube'] = True
o['shadows_bias'] *= 4.0
if objref.lamp_omni_shadows_cubemap:
o['shadowmap_cube'] = True
o['shadows_bias'] *= 4.0
# Parse nodes
# Emission only for now
@ -2078,6 +2108,10 @@ class ArmoryExporter:
o['color_texture'] = color_node.image.name
break
if objtype == 'POINT' and objref.lamp_omni_shadows and not objref.lamp_omni_shadows_cubemap:
# 6 separate maps
o['strength'] /= 6
self.output['lamp_datas'].append(o)
def export_camera(self, objectRef):

View file

@ -57,7 +57,7 @@ def write_data(res, defs, json_data, base_name):
'blend_source', 'blend_destination', 'blend_operation', \
'alpha_blend_source', 'alpha_blend_destination', 'alpha_blend_operation' \
'color_write_red', 'color_write_green', 'color_write_blue', \
'color_write_alpha']
'color_write_alpha', 'conservative_raster']
for p in params:
if p in c:

View file

@ -74,7 +74,8 @@ def make_forward(cam):
if not cam.rp_worldnodes:
relink('Draw World', 'Set Target Accum')
nodes['Clear Target Mesh'].inputs[1].default_value = True
if cam.rp_clearbackground:
nodes['Clear Target Mesh'].inputs[1].default_value = True
if not cam.rp_render_to_texture:
links.new(nodes['Framebuffer'].outputs[0], nodes['Set Target Mesh'].inputs[1])
@ -109,9 +110,11 @@ def make_deferred(cam):
nodes['Screen'].inputs[0].default_value = int(cam.rp_supersampling)
if cam.rp_voxelgi:
n = nodes['Image 3D Voxels']
# if cam.rp_voxelgi_hdr:
# n.inputs[4].default_value = 'RGBA64'
links.new(nodes['Begin'].outputs[0], nodes['Branch Function Voxelize'].inputs[0])
links.new(nodes['Merge Stages Voxelize'].outputs[0], nodes['Set Target Mesh'].inputs[0])
n = nodes['Image 3D Voxels']
n.inputs[1].default_value = cam.rp_voxelgi_resolution[0]
n.inputs[2].default_value = cam.rp_voxelgi_resolution[1]
n.inputs[3].default_value = cam.rp_voxelgi_resolution[2]
@ -143,6 +146,8 @@ def make_deferred(cam):
if not cam.rp_worldnodes:
relink('Draw World', 'Set Target Accum')
if cam.rp_clearbackground:
nodes['Clear Target Mesh'].inputs[1].default_value = True
if not cam.rp_translucency:
relink('Set Target Accum', 'Bloom')

View file

@ -864,6 +864,11 @@ def parse_render_target(node, node_group, render_targets, depth_buffers):
else: # ShadowMapNodeType
target = make_shadowmap_target(node, scale)
render_targets.append(target)
# Clamp non-cubemap omni-shadows
for lamp in bpy.data.lamps:
if lamp.type == 'POINT' and lamp.lamp_omni_shadows and not lamp.lamp_omni_shadows_cubemap:
bpy.data.worlds['Arm'].rp_defs += '_Clampstc'
elif node.bl_idname == 'ImageNodeType' or node.bl_idname == 'Image3DNodeType':
# Target already exists

View file

@ -267,7 +267,7 @@ def parse_shader(node, socket):
out_basecol = parse_vector_input(node.inputs[0])
parsing_basecolor(False)
strength = parse_value_input(node.inputs[1])
out_basecol = '({0} * {1} * 50.0)'.format(out_basecol, strength)
out_basecol = '({0} * ({1} * 10.0))'.format(out_basecol, strength)
elif node.type == 'BSDF_GLASS':
if parse_surface:

View file

@ -14,6 +14,7 @@ import arm.material.make_overlay as make_overlay
import arm.material.make_depth as make_depth
import arm.material.make_decal as make_decal
import arm.material.make_voxel as make_voxel
import arm.material.make_voxelbounce as make_voxelbounce
rpass_hook = None
@ -84,6 +85,9 @@ def build(material, mat_users, mat_armusers, rid):
elif rp == 'voxel':
con = make_voxel.make(rp)
elif rp == 'voxelbounce':
con = make_voxelbounce.make(rp)
elif rpass_hook != None:
con = rpass_hook(rp)

View file

@ -4,7 +4,7 @@ import arm.material.mat_state as mat_state
import arm.material.mat_utils as mat_utils
def make(context_id):
con_voxel = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'always', 'cull_mode': 'none', 'color_write_red': False, 'color_write_green': False, 'color_write_blue': False, 'color_write_alpha': False })
con_voxel = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'always', 'cull_mode': 'none', 'color_write_red': False, 'color_write_green': False, 'color_write_blue': False, 'color_write_alpha': False, 'conservative_raster': True })
wrd = bpy.data.worlds['Arm']
if '_NoShadows' in wrd.world_defs:
@ -72,27 +72,24 @@ def make(context_id):
geom.write('}')
geom.write('EndPrimitive();')
frag.write('float lp = lightPos - wposition * voxelgiDimensions.x')
frag.write('float l = normalize(lp)')
frag.write('vec3 lp = lightPos - wposition * voxelgiDimensions.x;')
frag.write('vec3 l = normalize(lp);')
frag.write('float visibility = 1.0;')
frag.add_include('../../Shaders/compiled.glsl')
if is_shadows:
frag.add_uniform('sampler2D shadowMap')
frag.add_uniform('samplerCube shadowMapCube')
#frag.add_uniform('bool receiveShadow')
frag.add_include('../../Shaders/std/shadows.glsl')
frag.add_uniform('sampler2D shadowMap', included=True)
frag.add_uniform('samplerCube shadowMapCube', included=True)
frag.add_uniform('int lightShadow', '_lampCastShadow')
frag.add_uniform('vec2 lightPlane', '_lampPlane')
frag.add_uniform('float shadowsBias', '_lampShadowsBias')
# frag.write('if (receiveShadow && lampPos.w > 0.0) {')
frag.write('if (lightShadow == 1 && lampPos.w > 0.0) {')
frag.write(' vec3 lpos = lampPos.xyz / lampPos.w;')
frag.write(' if (texture(shadowMap, lpos.xy).r < lpos.z - shadowsBias) visibility = 0.0;')
frag.write('}')
frag.write('else if (lightShadow == 2) visibility = float(texture(shadowMapCube, -l).r + shadowsBias > lpToDepth(lp, lightPlane));')
frag.add_include('../../Shaders/compiled.glsl')
frag.add_include('../../Shaders/std/math.glsl')
frag.add_include('../std/shadows.glsl')
frag.write_header('#extension GL_ARB_shader_image_load_store : enable')
frag.add_uniform('layout(RGBA8) image3D voxels')
@ -105,15 +102,17 @@ def make(context_id):
frag.write('float roughness;') #
frag.write('float metallic;') #
frag.write('float occlusion;') #
frag.write('float opacity;') #
# frag.write('float opacity;') #
frag.write_pre = True
frag.write('mat3 TBN;') # TODO: discard, parse basecolor only
frag.write_pre = False
frag.write('float dotNV = 0.0;')
frag.write('float dotNL = max(dot(wnormal, l), 0.0);')
cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_opacity=True, parse_displacement=False)
frag.write('vec3 color = basecol * visibility * lightColor * dotNL * attenuate(distance(wposition * voxelgiDimensions.x, lightPos));')
cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_opacity=False, parse_displacement=False)
frag.write('vec3 color;')
frag.write('if (lightShadow > 0) color = basecol * visibility * lightColor * dotNL * attenuate(distance(wposition * voxelgiDimensions.x, lightPos));')
frag.write('else color = (basecol - 1.0);') # Emission only when no lamp or shadowmap is present
frag.write('vec3 voxel = wposition * 0.5 + vec3(0.5);')
frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(color, opacity));')
frag.write('imageStore(voxels, ivec3(voxelgiResolution * voxel), vec4(color, 1.0));')
return con_voxel

View file

@ -0,0 +1,93 @@
import bpy
import arm.material.cycles as cycles
import arm.material.mat_state as mat_state
import arm.material.mat_utils as mat_utils
def make(context_id):
con_voxel = mat_state.data.add_context({ 'name': context_id, 'depth_write': False, 'compare_mode': 'always', 'cull_mode': 'none', 'color_write_red': False, 'color_write_green': False, 'color_write_blue': False, 'color_write_alpha': False, 'conservative_raster': True })
wrd = bpy.data.worlds['Arm']
vert = con_voxel.make_vert()
frag = con_voxel.make_frag()
geom = con_voxel.make_geom()
tesc = None
tese = None
geom.ins = vert.outs
frag.ins = geom.outs
vert.add_uniform('mat4 W', '_worldMatrix')
vert.add_uniform('mat3 N', '_normalMatrix')
vert.add_out('vec3 wpositionGeom')
vert.add_out('vec3 wnormalGeom')
vert.add_include('../../Shaders/compiled.glsl')
if mat_state.data.is_elem('tex'):
vert.add_out('vec2 texCoordGeom')
vert.write('texCoordGeom = tex;')
vert.write('wpositionGeom = vec3(W * vec4(pos, 1.0)) / voxelgiDimensions.x;')
vert.write('wnormalGeom = normalize(N * nor);')
vert.write('gl_Position = vec4(0.0, 0.0, 0.0, 1.0);')
geom.add_out('vec3 wposition')
geom.add_out('vec3 wnormal')
if mat_state.data.is_elem('tex'):
geom.add_out('vec2 texCoord')
geom.write('const vec3 p1 = wpositionGeom[1] - wpositionGeom[0];')
geom.write('const vec3 p2 = wpositionGeom[2] - wpositionGeom[0];')
geom.write('const vec3 p = abs(cross(p1, p2));')
geom.write('for (uint i = 0; i < 3; ++i) {')
geom.write(' wposition = wpositionGeom[i];')
geom.write(' wnormal = wnormalGeom[i];')
if mat_state.data.is_elem('tex'):
geom.write(' texCoord = texCoordGeom[i];')
geom.write(' if (p.z > p.x && p.z > p.y) {')
geom.write(' gl_Position = vec4(wposition.x, wposition.y, 0.0, 1.0);')
geom.write(' }')
geom.write(' else if (p.x > p.y && p.x > p.z) {')
geom.write(' gl_Position = vec4(wposition.y, wposition.z, 0.0, 1.0);')
geom.write(' }')
geom.write(' else {')
geom.write(' gl_Position = vec4(wposition.x, wposition.z, 0.0, 1.0);')
geom.write(' }')
geom.write(' EmitVertex();')
geom.write('}')
geom.write('EndPrimitive();')
frag.add_include('../../Shaders/compiled.glsl')
frag.add_include('../../Shaders/std/math.glsl')
frag.add_include('../../Shaders/std/conetrace.glsl')
frag.write_header('#extension GL_ARB_shader_image_load_store : enable')
frag.add_uniform('layout(RGBA8) image3D voxelsto')
frag.add_uniform('sampler3D voxels', included=True)
frag.write('if (!isInsideCube(wposition)) return;')
frag.write('vec3 voxel = wposition * 0.5 + vec3(0.5);')
frag.write('vec3 basecol;')
frag.write('float roughness;') #
frag.write('float metallic;') #
frag.write('float occlusion;') #
# frag.write('float opacity;') #
frag.write_pre = True
frag.write('mat3 TBN;') # TODO: discard, parse basecolor only
frag.write_pre = False
frag.write('float dotNV = 0.0;')
# frag.write('float dotNL = max(dot(wnormal, l), 0.0);')
cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, parse_opacity=False, parse_displacement=False)
# frag.write('vec3 color = texture(voxels, voxel).rgb / 2.0 + indirectDiffuseLight(wnormal, wposition / voxelgiDimensions.x).rgb * basecol;')
frag.write('vec3 color = texture(voxels, voxel).rgb * indirectDiffuseLight(wnormal, wposition / voxelgiDimensions.x).rgb * basecol;')
frag.write('imageStore(voxelsto, ivec3(voxelgiResolution * voxel), vec4(color / 1.0, 1.0));')
return con_voxel

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.worlds['Arm'].voxelgi_multibounce:
ar.append('voxelbounce')
if bpy.data.cameras[0].rp_renderer == 'Deferred Plus':
ar.append('rect')

View file

@ -309,6 +309,7 @@ def init_properties():
bpy.types.Camera.rp_hdr = bpy.props.BoolProperty(name="HDR", description="Render in HDR Space", default=True, update=update_renderpath)
bpy.types.Camera.rp_render_to_texture = bpy.props.BoolProperty(name="Post Process", description="Render scene to texture for further processing", default=True, update=update_renderpath)
bpy.types.Camera.rp_worldnodes = bpy.props.BoolProperty(name="World Nodes", description="Draw world nodes", default=True, update=update_renderpath)
bpy.types.Camera.rp_clearbackground = bpy.props.BoolProperty(name="Clear Background", description="Clear background with solid color", default=False, update=update_renderpath)
bpy.types.Camera.rp_compositornodes = bpy.props.BoolProperty(name="Compositor Nodes", description="Draw compositor nodes", default=True, update=update_renderpath)
bpy.types.Camera.rp_shadowmap = EnumProperty(
items=[('None', 'None', 'None'),
@ -360,12 +361,15 @@ def init_properties():
bpy.types.Camera.rp_greasepencil = bpy.props.BoolProperty(name="Grease Pencil", description="Render Grease Pencil data", default=False, update=update_renderpath)
bpy.types.Camera.rp_voxelgi = bpy.props.BoolProperty(name="Voxel GI", description="Voxel-based Global Illumination", default=False, update=update_renderpath)
bpy.types.Camera.rp_voxelgi_resolution = bpy.props.FloatVectorProperty(name="Resolution", description="3D texture resolution", size=3, default=[128, 128, 128], update=update_renderpath)
bpy.types.Camera.rp_voxelgi_hdr = bpy.props.BoolProperty(name="HDR", description="Store voxels in RGBA64 instead of RGBA32", default=False, update=update_renderpath)
bpy.types.World.voxelgi_revoxelize = bpy.props.BoolProperty(name="Revoxelize", description="Revoxelize scene each frame", default=False, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_multibounce = bpy.props.BoolProperty(name="Multi-bounce", description="Accumulate multiple light bounces", default=False, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_diff = bpy.props.FloatProperty(name="Diffuse", description="", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_spec = bpy.props.FloatProperty(name="Specular", description="", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_occ = bpy.props.FloatProperty(name="Occlussion", description="", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_env = bpy.props.FloatProperty(name="Env Map", description="Contribute light from environment map", default=0.0, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_step = bpy.props.FloatProperty(name="Step", description="Step size", default=1.0, update=assets.invalidate_shader_cache)
bpy.types.World.voxelgi_range = bpy.props.FloatProperty(name="Range", description="Maximum range", default=1.0, update=assets.invalidate_shader_cache)
# For world
bpy.types.World.world_envtex_name = bpy.props.StringProperty(name="Environment Texture", default='')
@ -535,6 +539,7 @@ def init_properties():
bpy.types.Lamp.lamp_fov = bpy.props.FloatProperty(name="Field of View", default=0.84)
bpy.types.Lamp.lamp_shadows_bias = bpy.props.FloatProperty(name="Bias", description="Depth offset for shadow acne", default=0.0001)
bpy.types.Lamp.lamp_omni_shadows = bpy.props.BoolProperty(name="Omnidirectional Shadows", description="Draw shadows to all faces of the cube map", default=True)
bpy.types.Lamp.lamp_omni_shadows_cubemap = bpy.props.BoolProperty(name="Cubemap Capture", description="Store shadowmap in a single cubemap", default=True)
if not 'Arm' in bpy.data.worlds:
wrd = bpy.data.worlds.new('Arm')

View file

@ -28,6 +28,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Off'
cam.rp_hdr = False
cam.rp_worldnodes = False
cam.rp_clearbackground = True
cam.rp_stereo = False
cam.rp_greasepencil = False
cam.rp_voxelgi = False
@ -50,6 +51,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Auto'
cam.rp_hdr = True
cam.rp_worldnodes = True
cam.rp_clearbackground = False
cam.rp_stereo = False
cam.rp_greasepencil = False
cam.rp_voxelgi = False
@ -71,6 +73,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Auto'
cam.rp_hdr = True
cam.rp_worldnodes = True
cam.rp_clearbackground = False
cam.rp_stereo = False
cam.rp_greasepencil = False
cam.rp_voxelgi = False
@ -92,6 +95,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Auto'
cam.rp_hdr = True
cam.rp_worldnodes = True
cam.rp_clearbackground = False
cam.rp_stereo = False
cam.rp_greasepencil = False
cam.rp_voxelgi = False
@ -113,6 +117,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Auto'
cam.rp_hdr = True
cam.rp_worldnodes = True
cam.rp_clearbackground = False
cam.rp_stereo = False
cam.rp_greasepencil = False
cam.rp_voxelgi = True
@ -136,6 +141,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Auto'
cam.rp_hdr = True
cam.rp_worldnodes = True
cam.rp_clearbackground = False
cam.rp_stereo = False
cam.rp_greasepencil = False
cam.rp_voxelgi = False
@ -158,6 +164,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Off'
cam.rp_hdr = False
cam.rp_worldnodes = False
cam.rp_clearbackground = True
cam.rp_stereo = True
cam.rp_greasepencil = False
cam.rp_voxelgi = False
@ -180,6 +187,7 @@ def set_preset(self, context, preset):
cam.rp_decals_state = 'Off'
cam.rp_hdr = False
cam.rp_worldnodes = False
cam.rp_clearbackground = True
cam.rp_stereo = False
cam.rp_greasepencil = True
cam.rp_render_to_texture = False
@ -236,6 +244,8 @@ class GenRPDataPropsPanel(bpy.types.Panel):
layout.prop(dat, "rp_decals_state")
layout.prop(dat, "rp_hdr")
layout.prop(dat, "rp_worldnodes")
if not dat.rp_worldnodes:
layout.prop(dat, "rp_clearbackground")
layout.prop(dat, "rp_stereo")
layout.prop(dat, "rp_greasepencil")
layout.prop(dat, 'rp_voxelgi')
@ -243,14 +253,18 @@ class GenRPDataPropsPanel(bpy.types.Panel):
layout.prop(dat, 'rp_voxelgi_resolution')
layout.prop(wrd, 'generate_voxelgi_dimensions')
row = layout.row()
row.prop(wrd, 'voxelgi_revoxelize')
row.prop(wrd, 'voxelgi_multibounce')
row = layout.row()
row.prop(wrd, 'voxelgi_diff')
row.prop(wrd, 'voxelgi_spec')
row = layout.row()
row.prop(wrd, 'voxelgi_occ')
row.prop(wrd, 'voxelgi_env')
row = layout.row()
row.prop(wrd, 'voxelgi_step')
row.prop(wrd, 'voxelgi_range')
row = layout.row()
row.prop(wrd, 'voxelgi_revoxelize')
row.prop(wrd, 'voxelgi_multibounce')
row.prop(dat, 'rp_voxelgi_hdr')
layout.separator()
layout.prop(dat, "rp_render_to_texture")

View file

@ -187,6 +187,10 @@ class DataPropsPanel(bpy.types.Panel):
row.prop(obj.data, 'lamp_shadows_bias')
if obj.data.type == 'POINT':
layout.prop(obj.data, 'lamp_omni_shadows')
if obj.data.lamp_omni_shadows:
layout.prop(obj.data, 'lamp_omni_shadows_cubemap')
if not obj.data.lamp_omni_shadows_cubemap:
layout.label('Warning: Will result in performance loss')
elif obj.type == 'SPEAKER':
layout.prop(obj.data, 'loop')
layout.prop(obj.data, 'stream')

View file

@ -383,6 +383,8 @@ const float voxelgiDiff = """ + str(round(wrd.voxelgi_diff * 100) / 100) + """;
const float voxelgiSpec = """ + str(round(wrd.voxelgi_spec * 100) / 100) + """;
const float voxelgiOcc = """ + str(round(wrd.voxelgi_occ * 100) / 100) + """;
const float voxelgiEnv = """ + str(round(wrd.voxelgi_env * 100) / 100) + """;
const float voxelgiStep = """ + str(round(wrd.voxelgi_step * 100) / 100) + """;
const float voxelgiRange = """ + str(round(wrd.voxelgi_range * 100) / 100) + """;
""")
# Skinning

Binary file not shown.

Binary file not shown.