More VR, restricted materials gen
This commit is contained in:
parent
2099b1b80d
commit
56190c05f2
BIN
Assets/vr.png
Normal file
BIN
Assets/vr.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.2 KiB |
43
Sources/armory/trait/VRNavigation.hx
Executable file
43
Sources/armory/trait/VRNavigation.hx
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
package armory.trait;
|
||||||
|
|
||||||
|
import iron.Trait;
|
||||||
|
import iron.system.Input;
|
||||||
|
import iron.system.Time;
|
||||||
|
import iron.object.CameraObject;
|
||||||
|
import iron.math.Vec4;
|
||||||
|
|
||||||
|
@:keep
|
||||||
|
class VRNavigation extends Trait {
|
||||||
|
|
||||||
|
#if arm_vr
|
||||||
|
|
||||||
|
static inline var speed = 5.0;
|
||||||
|
|
||||||
|
var camera:CameraObject;
|
||||||
|
var mouse:Mouse;
|
||||||
|
|
||||||
|
public function new() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
notifyOnInit(init);
|
||||||
|
notifyOnUpdate(update);
|
||||||
|
}
|
||||||
|
|
||||||
|
function init() {
|
||||||
|
mouse = Input.getMouse();
|
||||||
|
camera = cast(object, CameraObject);
|
||||||
|
}
|
||||||
|
|
||||||
|
var look = new Vec4();
|
||||||
|
function update() {
|
||||||
|
// Testing..
|
||||||
|
if (mouse.down()) {
|
||||||
|
var vr = kha.vr.VrInterface.instance;
|
||||||
|
var V = (vr != null && vr.IsPresenting()) ? camera.leftV : camera.V;
|
||||||
|
look.set(-V._02, -V._12, -V._22);
|
||||||
|
camera.move(look, Time.delta * speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#end
|
||||||
|
}
|
|
@ -771,6 +771,8 @@ def traverse_renderpath(node, node_group, render_targets, depth_buffers):
|
||||||
elif node.bl_idname == 'DrawStereoNodeType':
|
elif node.bl_idname == 'DrawStereoNodeType':
|
||||||
assets.add_khafile_def('arm_vr')
|
assets.add_khafile_def('arm_vr')
|
||||||
bpy.data.worlds['Arm'].rp_defs += '_VR'
|
bpy.data.worlds['Arm'].rp_defs += '_VR'
|
||||||
|
assets.add(build_node_trees.assets_path + 'vr.png')
|
||||||
|
assets.add_embedded_data('vr.png')
|
||||||
|
|
||||||
elif node.bl_idname == 'CallFunctionNodeType':
|
elif node.bl_idname == 'CallFunctionNodeType':
|
||||||
global dynRes_added
|
global dynRes_added
|
||||||
|
|
|
@ -17,12 +17,12 @@
|
||||||
import arm.material.cycles_functions as c_functions
|
import arm.material.cycles_functions as c_functions
|
||||||
import arm.material.cycles_state as c_state
|
import arm.material.cycles_state as c_state
|
||||||
|
|
||||||
def parse(nodes, vert, frag, geom, tesc, tese, parse_surface=True, parse_opacity=True, parse_displacement=True):
|
def parse(nodes, vert, frag, geom, tesc, tese, parse_surface=True, parse_opacity=True, parse_displacement=True, basecol_only=False):
|
||||||
output_node = node_by_type(nodes, 'OUTPUT_MATERIAL')
|
output_node = node_by_type(nodes, 'OUTPUT_MATERIAL')
|
||||||
if output_node != None:
|
if output_node != None:
|
||||||
parse_output(output_node, vert, frag, geom, tesc, tese, parse_surface, parse_opacity, parse_displacement)
|
parse_output(output_node, vert, frag, geom, tesc, tese, parse_surface, parse_opacity, parse_displacement, basecol_only)
|
||||||
|
|
||||||
def parse_output(node, _vert, _frag, _geom, _tesc, _tese, _parse_surface, _parse_opacity, parse_displacement):
|
def parse_output(node, _vert, _frag, _geom, _tesc, _tese, _parse_surface, _parse_opacity, _parse_displacement, _basecol_only):
|
||||||
global parsed # Compute nodes only once
|
global parsed # Compute nodes only once
|
||||||
global parents
|
global parents
|
||||||
global normal_written # Normal socket is linked on shader node - overwrite fs normal
|
global normal_written # Normal socket is linked on shader node - overwrite fs normal
|
||||||
|
@ -36,6 +36,7 @@ def parse_output(node, _vert, _frag, _geom, _tesc, _tese, _parse_surface, _parse
|
||||||
global parse_opacity
|
global parse_opacity
|
||||||
global parsing_basecol
|
global parsing_basecol
|
||||||
global parse_teximage_vector
|
global parse_teximage_vector
|
||||||
|
global basecol_only
|
||||||
vert = _vert
|
vert = _vert
|
||||||
frag = _frag
|
frag = _frag
|
||||||
geom = _geom
|
geom = _geom
|
||||||
|
@ -45,6 +46,7 @@ def parse_output(node, _vert, _frag, _geom, _tesc, _tese, _parse_surface, _parse
|
||||||
parse_opacity = _parse_opacity
|
parse_opacity = _parse_opacity
|
||||||
parsing_basecol = False
|
parsing_basecol = False
|
||||||
parse_teximage_vector = True
|
parse_teximage_vector = True
|
||||||
|
basecol_only = _basecol_only
|
||||||
|
|
||||||
# Surface
|
# Surface
|
||||||
if parse_surface or parse_opacity:
|
if parse_surface or parse_opacity:
|
||||||
|
@ -52,13 +54,18 @@ def parse_output(node, _vert, _frag, _geom, _tesc, _tese, _parse_surface, _parse
|
||||||
parents = []
|
parents = []
|
||||||
normal_written = False
|
normal_written = False
|
||||||
curshader = frag
|
curshader = frag
|
||||||
|
|
||||||
|
if basecol_only:
|
||||||
|
frag.lock = True
|
||||||
|
|
||||||
out_basecol, out_roughness, out_metallic, out_occlusion, out_opacity = parse_shader_input(node.inputs[0])
|
out_basecol, out_roughness, out_metallic, out_occlusion, out_opacity = parse_shader_input(node.inputs[0])
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
|
frag.lock = False
|
||||||
frag.write('basecol = {0};'.format(out_basecol))
|
frag.write('basecol = {0};'.format(out_basecol))
|
||||||
frag.write('roughness = {0};'.format(out_roughness))
|
if not basecol_only:
|
||||||
frag.write('metallic = {0};'.format(out_metallic))
|
frag.write('roughness = {0};'.format(out_roughness))
|
||||||
frag.write('occlusion = {0};'.format(out_occlusion))
|
frag.write('metallic = {0};'.format(out_metallic))
|
||||||
|
frag.write('occlusion = {0};'.format(out_occlusion))
|
||||||
if parse_opacity:
|
if parse_opacity:
|
||||||
frag.write('opacity = {0};'.format(out_opacity))
|
frag.write('opacity = {0};'.format(out_opacity))
|
||||||
|
|
||||||
|
@ -66,7 +73,7 @@ def parse_output(node, _vert, _frag, _geom, _tesc, _tese, _parse_surface, _parse
|
||||||
# parse_volume_input(node.inputs[1])
|
# parse_volume_input(node.inputs[1])
|
||||||
|
|
||||||
# Displacement
|
# Displacement
|
||||||
if parse_displacement and c_state.tess_enabled() and node.inputs[2].is_linked and tese != None:
|
if _parse_displacement and c_state.tess_enabled() and node.inputs[2].is_linked and tese != None:
|
||||||
parsed = []
|
parsed = []
|
||||||
parents = []
|
parents = []
|
||||||
normal_written = False
|
normal_written = False
|
||||||
|
@ -129,6 +136,14 @@ def write_normal(inp):
|
||||||
curshader.write('n = {0};'.format(normal_res))
|
curshader.write('n = {0};'.format(normal_res))
|
||||||
normal_written = True
|
normal_written = True
|
||||||
|
|
||||||
|
def parsing_basecolor(b):
|
||||||
|
global parsing_basecol
|
||||||
|
global basecol_only
|
||||||
|
global curshader
|
||||||
|
parsing_basecol = b
|
||||||
|
if basecol_only:
|
||||||
|
curshader.lock = not b
|
||||||
|
|
||||||
def parse_shader(node, socket):
|
def parse_shader(node, socket):
|
||||||
global parsing_basecol
|
global parsing_basecol
|
||||||
out_basecol = 'vec3(0.8)'
|
out_basecol = 'vec3(0.8)'
|
||||||
|
@ -142,9 +157,9 @@ def parse_shader(node, socket):
|
||||||
|
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
# Base color
|
# Base color
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = parse_vector_input(node.inputs[0])
|
out_basecol = parse_vector_input(node.inputs[0])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
# Occlusion TODO: deprecated, occlussion is value instead of vector now
|
# Occlusion TODO: deprecated, occlussion is value instead of vector now
|
||||||
if node.inputs[1].type == 'RGBA':
|
if node.inputs[1].type == 'RGBA':
|
||||||
out_occlusion = '{0}.r'.format(parse_vector_input(node.inputs[1]))
|
out_occlusion = '{0}.r'.format(parse_vector_input(node.inputs[1]))
|
||||||
|
@ -164,9 +179,9 @@ def parse_shader(node, socket):
|
||||||
parse_normal_map_color_input(node.inputs[6], node.inputs[7])
|
parse_normal_map_color_input(node.inputs[6], node.inputs[7])
|
||||||
# Emission
|
# Emission
|
||||||
if node.inputs[8].is_linked:
|
if node.inputs[8].is_linked:
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_emission = parse_vector_input(node.inputs[8])
|
out_emission = parse_vector_input(node.inputs[8])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
if node.inputs[9].is_linked or node.inputs[9].default_value != 1.0:
|
if node.inputs[9].is_linked or node.inputs[9].default_value != 1.0:
|
||||||
out_emission = '({0} * {1})'.format(out_emission, parse_value_input(node.inputs[9]))
|
out_emission = '({0} * {1})'.format(out_emission, parse_value_input(node.inputs[9]))
|
||||||
out_basecol = '({0} + {1})'.format(out_basecol, out_emission)
|
out_basecol = '({0} + {1})'.format(out_basecol, out_emission)
|
||||||
|
@ -191,9 +206,9 @@ def parse_shader(node, socket):
|
||||||
bc1, rough1, met1, occ1, opac1 = parse_shader_input(node.inputs[1])
|
bc1, rough1, met1, occ1, opac1 = parse_shader_input(node.inputs[1])
|
||||||
bc2, rough2, met2, occ2, opac2 = parse_shader_input(node.inputs[2])
|
bc2, rough2, met2, occ2, opac2 = parse_shader_input(node.inputs[2])
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = '({0} * {3} + {1} * {2})'.format(bc1, bc2, fac_var, fac_inv_var)
|
out_basecol = '({0} * {3} + {1} * {2})'.format(bc1, bc2, fac_var, fac_inv_var)
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
out_roughness = '({0} * {3} + {1} * {2})'.format(rough1, rough2, fac_var, fac_inv_var)
|
out_roughness = '({0} * {3} + {1} * {2})'.format(rough1, rough2, fac_var, fac_inv_var)
|
||||||
out_metallic = '({0} * {3} + {1} * {2})'.format(met1, met2, fac_var, fac_inv_var)
|
out_metallic = '({0} * {3} + {1} * {2})'.format(met1, met2, fac_var, fac_inv_var)
|
||||||
out_occlusion = '({0} * {3} + {1} * {2})'.format(occ1, occ2, fac_var, fac_inv_var)
|
out_occlusion = '({0} * {3} + {1} * {2})'.format(occ1, occ2, fac_var, fac_inv_var)
|
||||||
|
@ -204,9 +219,9 @@ def parse_shader(node, socket):
|
||||||
bc1, rough1, met1, occ1, opac1 = parse_shader_input(node.inputs[0])
|
bc1, rough1, met1, occ1, opac1 = parse_shader_input(node.inputs[0])
|
||||||
bc2, rough2, met2, occ2, opac2 = parse_shader_input(node.inputs[1])
|
bc2, rough2, met2, occ2, opac2 = parse_shader_input(node.inputs[1])
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = '({0} + {1})'.format(bc1, bc2)
|
out_basecol = '({0} + {1})'.format(bc1, bc2)
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
out_roughness = '({0} * 0.5 + {1} * 0.5)'.format(rough1, rough2)
|
out_roughness = '({0} * 0.5 + {1} * 0.5)'.format(rough1, rough2)
|
||||||
out_metallic = '({0} * 0.5 + {1} * 0.5)'.format(met1, met2)
|
out_metallic = '({0} * 0.5 + {1} * 0.5)'.format(met1, met2)
|
||||||
out_occlusion = '({0} * 0.5 + {1} * 0.5)'.format(occ1, occ2)
|
out_occlusion = '({0} * 0.5 + {1} * 0.5)'.format(occ1, occ2)
|
||||||
|
@ -216,17 +231,17 @@ def parse_shader(node, socket):
|
||||||
elif node.type == 'BSDF_DIFFUSE':
|
elif node.type == 'BSDF_DIFFUSE':
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
write_normal(node.inputs[2])
|
write_normal(node.inputs[2])
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = parse_vector_input(node.inputs[0])
|
out_basecol = parse_vector_input(node.inputs[0])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
out_roughness = parse_value_input(node.inputs[1])
|
out_roughness = parse_value_input(node.inputs[1])
|
||||||
|
|
||||||
elif node.type == 'BSDF_GLOSSY':
|
elif node.type == 'BSDF_GLOSSY':
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
write_normal(node.inputs[2])
|
write_normal(node.inputs[2])
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = parse_vector_input(node.inputs[0])
|
out_basecol = parse_vector_input(node.inputs[0])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
out_roughness = parse_value_input(node.inputs[1])
|
out_roughness = parse_value_input(node.inputs[1])
|
||||||
out_metallic = '1.0'
|
out_metallic = '1.0'
|
||||||
|
|
||||||
|
@ -239,18 +254,18 @@ def parse_shader(node, socket):
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
write_normal(node.inputs[4])
|
write_normal(node.inputs[4])
|
||||||
# Revert to glossy
|
# Revert to glossy
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = parse_vector_input(node.inputs[0])
|
out_basecol = parse_vector_input(node.inputs[0])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
out_roughness = parse_value_input(node.inputs[1])
|
out_roughness = parse_value_input(node.inputs[1])
|
||||||
out_metallic = '1.0'
|
out_metallic = '1.0'
|
||||||
|
|
||||||
elif node.type == 'EMISSION':
|
elif node.type == 'EMISSION':
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
# Multiply basecol
|
# Multiply basecol
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = parse_vector_input(node.inputs[0])
|
out_basecol = parse_vector_input(node.inputs[0])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
strength = parse_value_input(node.inputs[1])
|
strength = parse_value_input(node.inputs[1])
|
||||||
out_basecol = '({0} * {1} * 50.0)'.format(out_basecol, strength)
|
out_basecol = '({0} * {1} * 50.0)'.format(out_basecol, strength)
|
||||||
|
|
||||||
|
@ -294,9 +309,9 @@ def parse_shader(node, socket):
|
||||||
elif node.type == 'BSDF_VELVET':
|
elif node.type == 'BSDF_VELVET':
|
||||||
if parse_surface:
|
if parse_surface:
|
||||||
write_normal(node.inputs[2])
|
write_normal(node.inputs[2])
|
||||||
parsing_basecol = True
|
parsing_basecolor(True)
|
||||||
out_basecol = parse_vector_input(node.inputs[0])
|
out_basecol = parse_vector_input(node.inputs[0])
|
||||||
parsing_basecol = False
|
parsing_basecolor(False)
|
||||||
out_roughness = '1.0'
|
out_roughness = '1.0'
|
||||||
out_metallic = '1.0'
|
out_metallic = '1.0'
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,10 @@ def make(context_id, rid):
|
||||||
con_mesh = mat_state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
|
con_mesh = mat_state.data.add_context({ 'name': context_id, 'depth_write': True, 'compare_mode': 'less', 'cull_mode': 'clockwise' })
|
||||||
|
|
||||||
if rid == 'forward':
|
if rid == 'forward':
|
||||||
make_forward(con_mesh)
|
if bpy.data.cameras[0].rp_materials == 'Full':
|
||||||
|
make_forward(con_mesh)
|
||||||
|
else:
|
||||||
|
make_forward_restricted(con_mesh)
|
||||||
elif rid == 'deferred':
|
elif rid == 'deferred':
|
||||||
make_deferred(con_mesh)
|
make_deferred(con_mesh)
|
||||||
elif rid == 'deferred_plus':
|
elif rid == 'deferred_plus':
|
||||||
|
@ -273,6 +276,80 @@ def make_deferred_plus(con_mesh):
|
||||||
frag.write('fragColor[2] = vec4(dFdx(texCoord), dFdy(texCoord));')
|
frag.write('fragColor[2] = vec4(dFdx(texCoord), dFdy(texCoord));')
|
||||||
# + tangent space
|
# + tangent space
|
||||||
|
|
||||||
|
def make_forward_restricted(con_mesh):
|
||||||
|
wrd = bpy.data.worlds['Arm']
|
||||||
|
vert = con_mesh.make_vert()
|
||||||
|
frag = con_mesh.make_frag()
|
||||||
|
geom = None
|
||||||
|
tesc = None
|
||||||
|
tese = None
|
||||||
|
|
||||||
|
vert.add_uniform('mat3 N', '_normalMatrix')
|
||||||
|
vert.write_main_header('vec4 spos = vec4(pos, 1.0);')
|
||||||
|
frag.ins = vert.outs
|
||||||
|
vert.add_uniform('mat4 WVP', '_worldViewProjectionMatrix')
|
||||||
|
vert.write('gl_Position = WVP * spos;')
|
||||||
|
|
||||||
|
frag.add_include('../../Shaders/compiled.glsl')
|
||||||
|
frag.write('vec3 basecol;')
|
||||||
|
cycles.parse(mat_state.nodes, vert, frag, geom, tesc, tese, basecol_only=True, parse_opacity=False, parse_displacement=False)
|
||||||
|
|
||||||
|
if mat_state.data.is_elem('tex'):
|
||||||
|
vert.add_out('vec2 texCoord')
|
||||||
|
vert.write('texCoord = tex;')
|
||||||
|
|
||||||
|
if mat_state.data.is_elem('col'):
|
||||||
|
vert.add_out('vec3 vcolor')
|
||||||
|
vert.write('vcolor = col;')
|
||||||
|
|
||||||
|
vert.add_out('vec3 wnormal')
|
||||||
|
write_norpos(vert)
|
||||||
|
frag.write_pre = True
|
||||||
|
frag.write_main_header('vec3 n = normalize(wnormal);')
|
||||||
|
frag.write_pre = False
|
||||||
|
|
||||||
|
frag.add_uniform('vec3 lightColor', '_lampColor')
|
||||||
|
frag.add_uniform('vec3 lightDir', '_lampDirection')
|
||||||
|
frag.add_uniform('float envmapStrength', link='_envmapStrength')
|
||||||
|
|
||||||
|
if '_NoShadows' in wrd.world_defs:
|
||||||
|
is_shadows = False
|
||||||
|
else:
|
||||||
|
is_shadows = True
|
||||||
|
|
||||||
|
frag.write('float visibility = 1.0;')
|
||||||
|
frag.write('float dotNL = dot(n, lightDir);')
|
||||||
|
|
||||||
|
if is_shadows:
|
||||||
|
vert.add_out('vec4 lampPos')
|
||||||
|
vert.add_uniform('mat4 LWVP', '_biasLampWorldViewProjectionMatrix')
|
||||||
|
vert.write('lampPos = LWVP * spos;')
|
||||||
|
frag.add_include('../../Shaders/std/shadows.glsl')
|
||||||
|
frag.add_uniform('sampler2D shadowMap', included=True)
|
||||||
|
frag.add_uniform('float shadowsBias', '_lampShadowsBias')
|
||||||
|
frag.write(' if (lampPos.w > 0.0) {')
|
||||||
|
frag.write(' vec3 lpos = lampPos.xyz / lampPos.w;')
|
||||||
|
# frag.write(' visibility *= PCF(lpos.xy, lpos.z - shadowsBias);')
|
||||||
|
frag.write(' const float texelSize = 1.0 / shadowmapSize.x;')
|
||||||
|
frag.write(' visibility = 0.0;')
|
||||||
|
frag.write(' visibility += float(texture(shadowMap, lpos.xy).r + shadowsBias > lpos.z);')
|
||||||
|
frag.write(' visibility += float(texture(shadowMap, lpos.xy + vec2(texelSize, 0.0)).r + shadowsBias > lpos.z) * 0.5;')
|
||||||
|
frag.write(' visibility += float(texture(shadowMap, lpos.xy + vec2(-texelSize, 0.0)).r + shadowsBias > lpos.z) * 0.25;')
|
||||||
|
frag.write(' visibility += float(texture(shadowMap, lpos.xy + vec2(0.0, texelSize)).r + shadowsBias > lpos.z) * 0.5;')
|
||||||
|
frag.write(' visibility += float(texture(shadowMap, lpos.xy + vec2(0.0, -texelSize)).r + shadowsBias > lpos.z) * 0.25;')
|
||||||
|
frag.write(' visibility /= 2.5;')
|
||||||
|
frag.write(' visibility = max(visibility, 0.5);')
|
||||||
|
# frag.write(' visibility = max(float(texture(shadowMap, lpos.xy).r + shadowsBias > lpos.z), 0.5);')
|
||||||
|
frag.write(' }')
|
||||||
|
|
||||||
|
frag.write('vec3 direct = basecol * max(dotNL, 0.1);')
|
||||||
|
|
||||||
|
frag.add_out('vec4 fragColor')
|
||||||
|
frag.write('fragColor = vec4(direct * lightColor * visibility, 1.0);')
|
||||||
|
|
||||||
|
if '_LDR' in bpy.data.worlds['Arm'].rp_defs:
|
||||||
|
frag.write('fragColor.rgb = pow(fragColor.rgb, vec3(1.0 / 2.2));')
|
||||||
|
|
||||||
def make_forward(con_mesh):
|
def make_forward(con_mesh):
|
||||||
make_forward_base(con_mesh)
|
make_forward_base(con_mesh)
|
||||||
|
|
||||||
|
|
|
@ -15,14 +15,16 @@ def make(context_id, rpasses):
|
||||||
tesc = None
|
tesc = None
|
||||||
tese = None
|
tese = None
|
||||||
|
|
||||||
if arm.utils.get_gapi() == 'direct3d9':
|
gapi = arm.utils.get_gapi()
|
||||||
|
if gapi == 'direct3d9':
|
||||||
frag.add_out('vec4 fragColor') # Definition requred for d3d9 - pixel shader must minimally write all four components of COLOR0
|
frag.add_out('vec4 fragColor') # Definition requred for d3d9 - pixel shader must minimally write all four components of COLOR0
|
||||||
vert.write_main_header('vec4 spos = vec4(pos, 1.0);')
|
vert.write_main_header('vec4 spos = vec4(pos, 1.0);')
|
||||||
|
|
||||||
# TODO: pass vbuf with proper struct
|
# TODO: pass vbuf with proper struct
|
||||||
vert.write('vec3 t1 = nor; // TODO: Temp for d3d')
|
if gapi.startswith('direct3d'):
|
||||||
if mat_state.data.is_elem('tex'):
|
vert.write('vec3 t1 = nor; // TODO: Temp for d3d')
|
||||||
vert.write('vec2 t2 = tex; // TODO: Temp for d3d')
|
if mat_state.data.is_elem('tex'):
|
||||||
|
vert.write('vec2 t2 = tex; // TODO: Temp for d3d')
|
||||||
|
|
||||||
parse_opacity = 'translucent' in rpasses
|
parse_opacity = 'translucent' in rpasses
|
||||||
if parse_opacity:
|
if parse_opacity:
|
||||||
|
|
|
@ -18,6 +18,7 @@ class Shader:
|
||||||
self.write_pre = False
|
self.write_pre = False
|
||||||
self.tab = 1
|
self.tab = 1
|
||||||
self.vertex_structure_as_vsinput = True
|
self.vertex_structure_as_vsinput = True
|
||||||
|
self.lock = False
|
||||||
|
|
||||||
def add_include(self, s):
|
def add_include(self, s):
|
||||||
self.includes.append(s)
|
self.includes.append(s)
|
||||||
|
@ -61,6 +62,8 @@ class Shader:
|
||||||
self.main_pre = s + '\n' + self.main_pre
|
self.main_pre = s + '\n' + self.main_pre
|
||||||
|
|
||||||
def write(self, s):
|
def write(self, s):
|
||||||
|
if self.lock:
|
||||||
|
return
|
||||||
if self.write_pre:
|
if self.write_pre:
|
||||||
self.main_pre += '\t' * 1 + s + '\n'
|
self.main_pre += '\t' * 1 + s + '\n'
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -18,7 +18,7 @@ except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# Armory version
|
# Armory version
|
||||||
arm_version = '17.04'
|
arm_version = '17.05'
|
||||||
|
|
||||||
def update_preset(self, context):
|
def update_preset(self, context):
|
||||||
props_renderer.set_preset(self, context, self.rp_preset)
|
props_renderer.set_preset(self, context, self.rp_preset)
|
||||||
|
@ -298,6 +298,11 @@ def init_properties():
|
||||||
#('Path-Trace', 'Path-Trace', 'Path-Trace')],
|
#('Path-Trace', 'Path-Trace', 'Path-Trace')],
|
||||||
],
|
],
|
||||||
name="Renderer", description="Renderer type", default='Deferred', update=update_renderpath)
|
name="Renderer", description="Renderer type", default='Deferred', update=update_renderpath)
|
||||||
|
bpy.types.Camera.rp_materials = EnumProperty(
|
||||||
|
items=[('Full', 'Full', 'Full'),
|
||||||
|
('Restricted', 'Restricted', 'Restricted'),
|
||||||
|
],
|
||||||
|
name="Materials", description="Material builder", default='Full', update=update_renderpath)
|
||||||
bpy.types.Camera.rp_depthprepass = bpy.props.BoolProperty(name="Depth Prepass", description="Depth Prepass for mesh context", default=False, update=update_renderpath)
|
bpy.types.Camera.rp_depthprepass = bpy.props.BoolProperty(name="Depth Prepass", description="Depth Prepass for mesh context", default=False, update=update_renderpath)
|
||||||
bpy.types.Camera.rp_meshes = bpy.props.BoolProperty(name="Meshes", description="Render mesh objects", default=True, update=update_renderpath)
|
bpy.types.Camera.rp_meshes = bpy.props.BoolProperty(name="Meshes", description="Render mesh objects", default=True, update=update_renderpath)
|
||||||
bpy.types.Camera.rp_hdr = bpy.props.BoolProperty(name="HDR", description="Render in HDR Space", default=True, update=update_renderpath)
|
bpy.types.Camera.rp_hdr = bpy.props.BoolProperty(name="HDR", description="Render in HDR Space", default=True, update=update_renderpath)
|
||||||
|
|
|
@ -18,6 +18,7 @@ def set_preset(self, context, preset):
|
||||||
|
|
||||||
if preset == 'Forward Low':
|
if preset == 'Forward Low':
|
||||||
cam.rp_renderer = 'Forward'
|
cam.rp_renderer = 'Forward'
|
||||||
|
cam.rp_materials = 'Full'
|
||||||
cam.rp_shadowmap = '1024'
|
cam.rp_shadowmap = '1024'
|
||||||
cam.rp_meshes = True
|
cam.rp_meshes = True
|
||||||
cam.rp_translucency_state = 'Off'
|
cam.rp_translucency_state = 'Off'
|
||||||
|
@ -27,6 +28,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_worldnodes = False
|
cam.rp_worldnodes = False
|
||||||
cam.rp_stereo = False
|
cam.rp_stereo = False
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = False
|
cam.rp_render_to_texture = False
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'None'
|
cam.rp_antialiasing = 'None'
|
||||||
|
@ -38,6 +40,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_motionblur = 'None'
|
cam.rp_motionblur = 'None'
|
||||||
elif preset == 'Forward':
|
elif preset == 'Forward':
|
||||||
cam.rp_renderer = 'Forward'
|
cam.rp_renderer = 'Forward'
|
||||||
|
cam.rp_materials = 'Full'
|
||||||
cam.rp_shadowmap = '2048'
|
cam.rp_shadowmap = '2048'
|
||||||
cam.rp_meshes = True
|
cam.rp_meshes = True
|
||||||
cam.rp_translucency_state = 'Auto'
|
cam.rp_translucency_state = 'Auto'
|
||||||
|
@ -47,6 +50,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_worldnodes = True
|
cam.rp_worldnodes = True
|
||||||
cam.rp_stereo = False
|
cam.rp_stereo = False
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = True
|
cam.rp_render_to_texture = True
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'FXAA'
|
cam.rp_antialiasing = 'FXAA'
|
||||||
|
@ -58,6 +62,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_motionblur = 'None'
|
cam.rp_motionblur = 'None'
|
||||||
elif preset == 'Forward High':
|
elif preset == 'Forward High':
|
||||||
cam.rp_renderer = 'Forward'
|
cam.rp_renderer = 'Forward'
|
||||||
|
cam.rp_materials = 'Full'
|
||||||
cam.rp_shadowmap = '4096'
|
cam.rp_shadowmap = '4096'
|
||||||
cam.rp_meshes = True
|
cam.rp_meshes = True
|
||||||
cam.rp_translucency_state = 'Auto'
|
cam.rp_translucency_state = 'Auto'
|
||||||
|
@ -67,6 +72,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_worldnodes = True
|
cam.rp_worldnodes = True
|
||||||
cam.rp_stereo = False
|
cam.rp_stereo = False
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = True
|
cam.rp_render_to_texture = True
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'SMAA'
|
cam.rp_antialiasing = 'SMAA'
|
||||||
|
@ -87,6 +93,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_worldnodes = True
|
cam.rp_worldnodes = True
|
||||||
cam.rp_stereo = False
|
cam.rp_stereo = False
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = True
|
cam.rp_render_to_texture = True
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'FXAA'
|
cam.rp_antialiasing = 'FXAA'
|
||||||
|
@ -107,6 +114,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_worldnodes = True
|
cam.rp_worldnodes = True
|
||||||
cam.rp_stereo = False
|
cam.rp_stereo = False
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = True
|
cam.rp_render_to_texture = True
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'SMAA'
|
cam.rp_antialiasing = 'SMAA'
|
||||||
|
@ -127,6 +135,7 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_worldnodes = True
|
cam.rp_worldnodes = True
|
||||||
cam.rp_stereo = False
|
cam.rp_stereo = False
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = True
|
cam.rp_render_to_texture = True
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'TAA'
|
cam.rp_antialiasing = 'TAA'
|
||||||
|
@ -140,15 +149,17 @@ def set_preset(self, context, preset):
|
||||||
pass
|
pass
|
||||||
elif preset == 'VR Low':
|
elif preset == 'VR Low':
|
||||||
cam.rp_renderer = 'Forward'
|
cam.rp_renderer = 'Forward'
|
||||||
|
cam.rp_materials = 'Restricted'
|
||||||
cam.rp_shadowmap = '1024'
|
cam.rp_shadowmap = '1024'
|
||||||
cam.rp_meshes = True
|
cam.rp_meshes = True
|
||||||
cam.rp_translucency_state = 'Off'
|
cam.rp_translucency_state = 'Off'
|
||||||
cam.rp_overlays_state = 'Off'
|
cam.rp_overlays_state = 'Off'
|
||||||
cam.rp_decals_state = 'Off'
|
cam.rp_decals_state = 'Off'
|
||||||
cam.rp_hdr = False
|
cam.rp_hdr = False
|
||||||
cam.rp_worldnodes = True
|
cam.rp_worldnodes = False
|
||||||
cam.rp_stereo = True
|
cam.rp_stereo = True
|
||||||
cam.rp_greasepencil = False
|
cam.rp_greasepencil = False
|
||||||
|
cam.rp_voxelgi = False
|
||||||
cam.rp_render_to_texture = False
|
cam.rp_render_to_texture = False
|
||||||
cam.rp_supersampling = '1'
|
cam.rp_supersampling = '1'
|
||||||
cam.rp_antialiasing = 'None'
|
cam.rp_antialiasing = 'None'
|
||||||
|
@ -159,7 +170,8 @@ def set_preset(self, context, preset):
|
||||||
cam.rp_bloom = False
|
cam.rp_bloom = False
|
||||||
cam.rp_motionblur = 'None'
|
cam.rp_motionblur = 'None'
|
||||||
elif preset == 'Grease Pencil':
|
elif preset == 'Grease Pencil':
|
||||||
cam.rp_renderer = 'Forward'
|
cam.rp_renderer = 'Restricted'
|
||||||
|
cam.rp_materials = 'Full'
|
||||||
cam.rp_shadowmap = 'None'
|
cam.rp_shadowmap = 'None'
|
||||||
cam.rp_meshes = False
|
cam.rp_meshes = False
|
||||||
cam.rp_translucency_state = 'Off'
|
cam.rp_translucency_state = 'Off'
|
||||||
|
@ -212,6 +224,7 @@ class GenRPDataPropsPanel(bpy.types.Panel):
|
||||||
layout.prop(dat, "rp_preset")
|
layout.prop(dat, "rp_preset")
|
||||||
layout.separator()
|
layout.separator()
|
||||||
layout.prop(dat, "rp_renderer")
|
layout.prop(dat, "rp_renderer")
|
||||||
|
layout.prop(dat, "rp_materials")
|
||||||
layout.prop(dat, "rp_shadowmap")
|
layout.prop(dat, "rp_shadowmap")
|
||||||
layout.prop(dat, "rp_meshes")
|
layout.prop(dat, "rp_meshes")
|
||||||
layout.prop(dat, "rp_translucency_state")
|
layout.prop(dat, "rp_translucency_state")
|
||||||
|
|
|
@ -233,18 +233,28 @@ def write_indexhtml(w, h):
|
||||||
"""<!DOCTYPE html>
|
"""<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8"/>
|
<meta charset="utf-8"/>""")
|
||||||
|
if bpy.data.cameras[0].rp_stereo:
|
||||||
|
f.write("""
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
""")
|
||||||
|
f.write("""
|
||||||
<title>Armory</title>
|
<title>Armory</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
""")
|
""")
|
||||||
if bpy.data.cameras[0].rp_stereo:
|
if bpy.data.cameras[0].rp_stereo:
|
||||||
f.write("""
|
f.write("""
|
||||||
<canvas style="outline: none; position: absolute; left: 0; top: 0;" id='khanvas' width='""" + str(w) + """' height='""" + str(h) + """'></canvas>
|
<canvas style="width: 100vw; height: 100vh; display: block;" id='khanvas'></canvas>
|
||||||
""")
|
""")
|
||||||
else:
|
else:
|
||||||
f.write("""
|
f.write("""
|
||||||
<p align="center"><canvas style="outline: none;" id='khanvas' width='""" + str(w) + """' height='""" + str(h) + """'></canvas></p>
|
<p align="center"><canvas align="center" style="outline: none;" id='khanvas' width='""" + str(w) + """' height='""" + str(h) + """'></canvas></p>
|
||||||
""")
|
""")
|
||||||
f.write("""
|
f.write("""
|
||||||
<script src='kha.js'></script>
|
<script src='kha.js'></script>
|
||||||
|
|
Loading…
Reference in a new issue