Textured lamp test, fixes.
This commit is contained in:
parent
16771d48a1
commit
bcc6dbdf91
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_0.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_0.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_1.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_1.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_2.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_2.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_3.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_3.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_4.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_4.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_5.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_5.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_6.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_6.hdr
Executable file
Binary file not shown.
BIN
Assets/hosek_fake/hosek_radiance_7.hdr
Executable file
BIN
Assets/hosek_fake/hosek_radiance_7.hdr
Executable file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -6,6 +6,7 @@ precision mediump float;
|
||||||
|
|
||||||
#include "../compiled.glsl"
|
#include "../compiled.glsl"
|
||||||
#include "../std/brdf.glsl"
|
#include "../std/brdf.glsl"
|
||||||
|
#include "../std/math.glsl"
|
||||||
// ...
|
// ...
|
||||||
#ifndef _NoShadows
|
#ifndef _NoShadows
|
||||||
#ifdef _PCSS
|
#ifdef _PCSS
|
||||||
|
@ -45,7 +46,6 @@ uniform vec3 lightPos;
|
||||||
uniform vec3 lightDir;
|
uniform vec3 lightDir;
|
||||||
uniform int lightType;
|
uniform int lightType;
|
||||||
// uniform int lightIndex;
|
// uniform int lightIndex;
|
||||||
uniform vec3 lightColor;
|
|
||||||
uniform float lightStrength;
|
uniform float lightStrength;
|
||||||
uniform float shadowsBias;
|
uniform float shadowsBias;
|
||||||
uniform float spotlightCutoff;
|
uniform float spotlightCutoff;
|
||||||
|
@ -54,6 +54,12 @@ uniform vec3 eye;
|
||||||
// uniform vec3 eyeLook;
|
// uniform vec3 eyeLook;
|
||||||
// uniform vec2 screenSize;
|
// uniform vec2 screenSize;
|
||||||
|
|
||||||
|
#ifdef _LampTex
|
||||||
|
uniform sampler2D texlampcolor;
|
||||||
|
#else
|
||||||
|
uniform vec3 lightColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
// in vec2 texCoord;
|
// in vec2 texCoord;
|
||||||
in vec4 wvpposition;
|
in vec4 wvpposition;
|
||||||
// in vec3 viewRay;
|
// in vec3 viewRay;
|
||||||
|
@ -166,8 +172,14 @@ void main() {
|
||||||
// vec3 fiberDirection = vec3(0.0, 1.0, 8.0);
|
// vec3 fiberDirection = vec3(0.0, 1.0, 8.0);
|
||||||
// vec3 direct = diffuseBRDF(albedo, metrough.y, dotNV, dotNL, dotVH, dotLV) + wardSpecular(n, h, dotNL, dotNV, dotNH, fiberDirection, shinyParallel, shinyPerpendicular);
|
// vec3 direct = diffuseBRDF(albedo, metrough.y, dotNV, dotNL, dotVH, dotLV) + wardSpecular(n, h, dotNL, dotNV, dotNH, fiberDirection, shinyParallel, shinyPerpendicular);
|
||||||
// #endif
|
// #endif
|
||||||
direct = direct * lightColor * lightStrength;
|
|
||||||
|
direct = direct * lightStrength;
|
||||||
|
#ifdef _LampTex
|
||||||
|
direct *= texture(texlampcolor, envMapEquirect(l)).rgb;
|
||||||
|
// direct *= texture(texlampcolor, l.xy).rgb;
|
||||||
|
#else
|
||||||
|
direct *= lightColor;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _SSS
|
#ifdef _SSS
|
||||||
float mask = g0.a;
|
float mask = g0.a;
|
||||||
|
|
|
@ -35,7 +35,13 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lightColor",
|
"name": "lightColor",
|
||||||
"link": "_lampColor"
|
"link": "_lampColor",
|
||||||
|
"ifndef": ["_LampColTex"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "texlampcolor",
|
||||||
|
"link": "_lampColorTexture",
|
||||||
|
"ifdef": ["_LampColTex"]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "lightStrength",
|
"name": "lightStrength",
|
||||||
|
|
|
@ -1938,18 +1938,8 @@ class ArmoryExporter:
|
||||||
if objref.shadow_soft_size != 0.1:
|
if objref.shadow_soft_size != 0.1:
|
||||||
o['lamp_size'] = objref.shadow_soft_size
|
o['lamp_size'] = objref.shadow_soft_size
|
||||||
|
|
||||||
# Parse nodes, only emission for now
|
# Parse nodes
|
||||||
# Merge with make_material
|
make_material.parse_lamp(objref.node_tree, o)
|
||||||
for n in objref.node_tree.nodes:
|
|
||||||
if n.type == 'EMISSION':
|
|
||||||
col = n.inputs[0].default_value
|
|
||||||
o['color'] = [col[0], col[1], col[2]]
|
|
||||||
o['strength'] = n.inputs[1].default_value
|
|
||||||
# Normalize point/spot strength
|
|
||||||
if o['type'] != 'sun':
|
|
||||||
o['strength'] /= 1000.0
|
|
||||||
break
|
|
||||||
|
|
||||||
self.output['lamp_datas'].append(o)
|
self.output['lamp_datas'].append(o)
|
||||||
|
|
||||||
def export_camera(self, objectRef):
|
def export_camera(self, objectRef):
|
||||||
|
|
|
@ -247,7 +247,7 @@ def parse_shader(sres, c, con, defs, lines, parse_attributes):
|
||||||
if 'ifndef' in l:
|
if 'ifndef' in l:
|
||||||
def_found = False
|
def_found = False
|
||||||
for d in defs:
|
for d in defs:
|
||||||
for link_def in l['ifdef']:
|
for link_def in l['ifndef']:
|
||||||
if d == link_def:
|
if d == link_def:
|
||||||
def_found = True
|
def_found = True
|
||||||
break
|
break
|
||||||
|
|
|
@ -32,3 +32,6 @@ def print_progress(value):
|
||||||
def get_progress(self):
|
def get_progress(self):
|
||||||
global progress
|
global progress
|
||||||
return progress
|
return progress
|
||||||
|
|
||||||
|
def warn(text):
|
||||||
|
print('Armory Warning: ' + text)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import assets
|
||||||
import armutils
|
import armutils
|
||||||
import os
|
import os
|
||||||
import nodes
|
import nodes
|
||||||
|
import log
|
||||||
|
|
||||||
def is_pow(num):
|
def is_pow(num):
|
||||||
return ((num & (num - 1)) == 0) and num != 0
|
return ((num & (num - 1)) == 0) and num != 0
|
||||||
|
@ -41,6 +42,27 @@ def parse(self, material, c, defs):
|
||||||
defs.append('_Tex')
|
defs.append('_Tex')
|
||||||
break
|
break
|
||||||
|
|
||||||
|
def parse_lamp(tree, o):
|
||||||
|
# Emission only for now
|
||||||
|
for n in tree.nodes:
|
||||||
|
if n.type == 'EMISSION':
|
||||||
|
col = n.inputs[0].default_value
|
||||||
|
o['color'] = [col[0], col[1], col[2]]
|
||||||
|
o['strength'] = n.inputs[1].default_value
|
||||||
|
# Normalize point/spot strength
|
||||||
|
if o['type'] != 'sun':
|
||||||
|
o['strength'] /= 1000.0
|
||||||
|
|
||||||
|
# Texture test..
|
||||||
|
if n.inputs[0].is_linked:
|
||||||
|
color_node = nodes.find_node_by_link(tree, n, n.inputs[0])
|
||||||
|
if color_node.type == 'TEX_IMAGE':
|
||||||
|
o['color_texture'] = color_node.image.name
|
||||||
|
make_texture(None, '', color_node, None)
|
||||||
|
# bpy.data.worlds['Arm'].world_defs += '_LampTex'
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
def make_albedo_const(col, c):
|
def make_albedo_const(col, c):
|
||||||
const = {}
|
const = {}
|
||||||
parse.const_color = const
|
parse.const_color = const
|
||||||
|
@ -102,6 +124,9 @@ def make_texture(self, id, image_node, material, image_format='RGBA32'):
|
||||||
# Reference image name
|
# Reference image name
|
||||||
powimage = is_pow(image.size[0]) and is_pow(image.size[1])
|
powimage = is_pow(image.size[0]) and is_pow(image.size[1])
|
||||||
tex['file'] = armutils.extract_filename(image.filepath)
|
tex['file'] = armutils.extract_filename(image.filepath)
|
||||||
|
ext = tex['file'][-3:].lower()
|
||||||
|
if ext != 'jpg' and ext != 'png' and ext != 'hdr':
|
||||||
|
log.warn(material.name + '/' + image.name + ' - image format is not supported yet. Use jpg, png, hdr.')
|
||||||
tex['file'] = armutils.safe_filename(tex['file'])
|
tex['file'] = armutils.safe_filename(tex['file'])
|
||||||
if image_format != 'RGBA32':
|
if image_format != 'RGBA32':
|
||||||
tex['format'] = image_format
|
tex['format'] = image_format
|
||||||
|
@ -460,7 +485,12 @@ def parse_pbr_group(self, material, c, defs, tree, node, factor):
|
||||||
roughness_strength_input = node.inputs[4]
|
roughness_strength_input = node.inputs[4]
|
||||||
roughness_strength = roughness_strength_input.default_value
|
roughness_strength = roughness_strength_input.default_value
|
||||||
if roughness_strength != 1.0:
|
if roughness_strength != 1.0:
|
||||||
add_roughness_strength(self, c, defs, roughness_strength)
|
if roughness_input.is_linked:
|
||||||
|
add_roughness_strength(self, c, defs, roughness_strength)
|
||||||
|
else:
|
||||||
|
# No texture, multiply roughness float instead
|
||||||
|
const = parse.const_roughness
|
||||||
|
const['float'] *= roughness_strength
|
||||||
# Metalness Map
|
# Metalness Map
|
||||||
metalness_input = node.inputs[5]
|
metalness_input = node.inputs[5]
|
||||||
parse_metalness_socket(self, metalness_input, material, c, defs, tree, node, factor)
|
parse_metalness_socket(self, metalness_input, material, c, defs, tree, node, factor)
|
||||||
|
|
|
@ -129,6 +129,8 @@ def parse_surface(world, node, context):
|
||||||
world.world_envtex_strength = envmap_strength_const['float']
|
world.world_envtex_strength = envmap_strength_const['float']
|
||||||
|
|
||||||
def parse_color(world, node, context, envmap_strength_const):
|
def parse_color(world, node, context, envmap_strength_const):
|
||||||
|
wrd = bpy.data.worlds['Arm']
|
||||||
|
|
||||||
# Env map included
|
# Env map included
|
||||||
if node.type == 'TEX_ENVIRONMENT':
|
if node.type == 'TEX_ENVIRONMENT':
|
||||||
envmap_strength_const['float'] *= 2.0 # Match to cycles
|
envmap_strength_const['float'] *= 2.0 # Match to cycles
|
||||||
|
@ -160,7 +162,7 @@ def parse_color(world, node, context, envmap_strength_const):
|
||||||
texture['file'] = armutils.safe_filename(texture['file'])
|
texture['file'] = armutils.safe_filename(texture['file'])
|
||||||
|
|
||||||
# Generate prefiltered envmaps
|
# Generate prefiltered envmaps
|
||||||
generate_radiance = bpy.data.worlds['Arm'].generate_radiance
|
generate_radiance = wrd.generate_radiance
|
||||||
world.world_envtex_name = texture['file']
|
world.world_envtex_name = texture['file']
|
||||||
world.world_envtex_irr_name = texture['file'].rsplit('.', 1)[0]
|
world.world_envtex_irr_name = texture['file'].rsplit('.', 1)[0]
|
||||||
disable_hdr = image.filepath.endswith('.jpg')
|
disable_hdr = image.filepath.endswith('.jpg')
|
||||||
|
@ -234,14 +236,19 @@ def parse_color(world, node, context, envmap_strength_const):
|
||||||
write_probes.write_sky_irradiance(world.name)
|
write_probes.write_sky_irradiance(world.name)
|
||||||
|
|
||||||
# Radiance
|
# Radiance
|
||||||
if bpy.data.worlds['Arm'].generate_radiance_sky and bpy.data.worlds['Arm'].generate_radiance:
|
if wrd.generate_radiance_sky and wrd.generate_radiance:
|
||||||
bpy.data.worlds['Arm'].world_defs += '_Rad'
|
bpy.data.worlds['Arm'].world_defs += '_Rad'
|
||||||
|
|
||||||
|
if wrd.generate_radiance_sky_type == 'Hosek':
|
||||||
|
hosek_path = 'armory/Assets/hosek/'
|
||||||
|
else:
|
||||||
|
hosek_path = 'armory/Assets/hosek_fake/'
|
||||||
|
|
||||||
sdk_path = armutils.get_sdk_path()
|
sdk_path = armutils.get_sdk_path()
|
||||||
# Use fake maps for now
|
# Use fake maps for now
|
||||||
assets.add(sdk_path + 'armory/Assets/hosek/hosek_radiance.hdr')
|
assets.add(sdk_path + hosek_path + 'hosek_radiance.hdr')
|
||||||
for i in range(0, 8):
|
for i in range(0, 8):
|
||||||
assets.add(sdk_path + 'armory/Assets/hosek/hosek_radiance_' + str(i) + '.hdr')
|
assets.add(sdk_path + hosek_path + 'hosek_radiance_' + str(i) + '.hdr')
|
||||||
|
|
||||||
world.world_envtex_name = 'hosek'
|
world.world_envtex_name = 'hosek'
|
||||||
world.world_envtex_num_mips = 8
|
world.world_envtex_num_mips = 8
|
||||||
|
|
|
@ -150,6 +150,10 @@ def init_properties():
|
||||||
bpy.types.World.world_defs = bpy.props.StringProperty(name="World Shader Defs", default='')
|
bpy.types.World.world_defs = bpy.props.StringProperty(name="World Shader Defs", default='')
|
||||||
bpy.types.World.generate_radiance = bpy.props.BoolProperty(name="Probe Radiance", default=True, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_radiance = bpy.props.BoolProperty(name="Probe Radiance", default=True, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_radiance_sky = bpy.props.BoolProperty(name="Sky Radiance", default=False, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_radiance_sky = bpy.props.BoolProperty(name="Sky Radiance", default=False, update=assets.invalidate_shader_cache)
|
||||||
|
bpy.types.World.generate_radiance_sky_type = EnumProperty(
|
||||||
|
items=[('Fake', 'Fake', 'Fake'),
|
||||||
|
('Hosek', 'Hosek', 'Hosek')],
|
||||||
|
name="Type", description="Prefiltered maps to be used for radiance.", default='Fake')
|
||||||
bpy.types.World.generate_clouds = bpy.props.BoolProperty(name="Clouds", default=False, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_clouds = bpy.props.BoolProperty(name="Clouds", default=False, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_clouds_density = bpy.props.FloatProperty(name="Density", default=0.5, min=0.0, max=10.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_clouds_density = bpy.props.FloatProperty(name="Density", default=0.5, min=0.0, max=10.0, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_clouds_size = bpy.props.FloatProperty(name="Size", default=1.0, min=0.0, max=10.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_clouds_size = bpy.props.FloatProperty(name="Size", default=1.0, min=0.0, max=10.0, update=assets.invalidate_shader_cache)
|
||||||
|
@ -178,9 +182,9 @@ def init_properties():
|
||||||
bpy.types.World.generate_ssao_texture_scale = bpy.props.FloatProperty(name="Texture Scale", default=1.0, min=0.0, max=1.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_ssao_texture_scale = bpy.props.FloatProperty(name="Texture Scale", default=1.0, min=0.0, max=1.0, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_shadows = bpy.props.BoolProperty(name="Shadows", default=True, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_shadows = bpy.props.BoolProperty(name="Shadows", default=True, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_bloom = bpy.props.BoolProperty(name="Bloom", default=True, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_bloom = bpy.props.BoolProperty(name="Bloom", default=True, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_bloom_treshold = bpy.props.FloatProperty(name="Treshold", default=6.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_bloom_treshold = bpy.props.FloatProperty(name="Treshold", default=20.0, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_bloom_strength = bpy.props.FloatProperty(name="Strength", default=1.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_bloom_strength = bpy.props.FloatProperty(name="Strength", default=0.5, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_bloom_radius = bpy.props.FloatProperty(name="Radius", default=1.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_bloom_radius = bpy.props.FloatProperty(name="Radius", default=0.5, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_motion_blur = bpy.props.BoolProperty(name="Motion Blur", default=True, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_motion_blur = bpy.props.BoolProperty(name="Motion Blur", default=True, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_motion_blur_intensity = bpy.props.FloatProperty(name="Intensity", default=1.0, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_motion_blur_intensity = bpy.props.FloatProperty(name="Intensity", default=1.0, update=assets.invalidate_shader_cache)
|
||||||
bpy.types.World.generate_ssr = bpy.props.BoolProperty(name="SSR", description="Screen-Space Reflections", default=True, update=assets.invalidate_shader_cache)
|
bpy.types.World.generate_ssr = bpy.props.BoolProperty(name="SSR", description="Screen-Space Reflections", default=True, update=assets.invalidate_shader_cache)
|
||||||
|
@ -255,7 +259,7 @@ def init_properties():
|
||||||
bpy.types.Lamp.lamp_clip_start = bpy.props.FloatProperty(name="Clip Start", default=0.1)
|
bpy.types.Lamp.lamp_clip_start = bpy.props.FloatProperty(name="Clip Start", default=0.1)
|
||||||
bpy.types.Lamp.lamp_clip_end = bpy.props.FloatProperty(name="Clip End", default=50.0)
|
bpy.types.Lamp.lamp_clip_end = bpy.props.FloatProperty(name="Clip End", default=50.0)
|
||||||
bpy.types.Lamp.lamp_fov = bpy.props.FloatProperty(name="Field of View", default=0.84)
|
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="Shadows Bias", description="Depth offset for shadow acne", default=0.00037)
|
bpy.types.Lamp.lamp_shadows_bias = bpy.props.FloatProperty(name="Shadows Bias", description="Depth offset for shadow acne", default=0.0002)
|
||||||
|
|
||||||
if not 'Arm' in bpy.data.worlds:
|
if not 'Arm' in bpy.data.worlds:
|
||||||
wrd = bpy.data.worlds.new('Arm')
|
wrd = bpy.data.worlds.new('Arm')
|
||||||
|
|
|
@ -318,6 +318,8 @@ class WorldPropsPanel(bpy.types.Panel):
|
||||||
layout.prop(wrd, 'generate_radiance')
|
layout.prop(wrd, 'generate_radiance')
|
||||||
if wrd.generate_radiance:
|
if wrd.generate_radiance:
|
||||||
layout.prop(wrd, 'generate_radiance_sky')
|
layout.prop(wrd, 'generate_radiance_sky')
|
||||||
|
if wrd.generate_radiance_sky:
|
||||||
|
layout.prop(wrd, 'generate_radiance_sky_type')
|
||||||
layout.prop(wrd, 'generate_clouds')
|
layout.prop(wrd, 'generate_clouds')
|
||||||
if wrd.generate_clouds:
|
if wrd.generate_clouds:
|
||||||
layout.prop(wrd, 'generate_clouds_density')
|
layout.prop(wrd, 'generate_clouds_density')
|
||||||
|
|
Loading…
Reference in a new issue