Voxel tweaks
This commit is contained in:
parent
bed280752f
commit
0df4db841b
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
93
blender/arm/material/make_voxelbounce.py
Normal file
93
blender/arm/material/make_voxelbounce.py
Normal 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
|
|
@ -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')
|
||||
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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.
Loading…
Reference in a new issue