diff --git a/Assets/hosek/hosek_radiance.hdr b/Assets/hosek/hosek_radiance.hdr index c081a98f..f6a44407 100755 Binary files a/Assets/hosek/hosek_radiance.hdr and b/Assets/hosek/hosek_radiance.hdr differ diff --git a/Assets/hosek/hosek_radiance_0.hdr b/Assets/hosek/hosek_radiance_0.hdr index 3e65bd65..a9f3cb23 100755 Binary files a/Assets/hosek/hosek_radiance_0.hdr and b/Assets/hosek/hosek_radiance_0.hdr differ diff --git a/Assets/hosek/hosek_radiance_1.hdr b/Assets/hosek/hosek_radiance_1.hdr index 0444184b..44e1b7cb 100755 Binary files a/Assets/hosek/hosek_radiance_1.hdr and b/Assets/hosek/hosek_radiance_1.hdr differ diff --git a/Assets/hosek/hosek_radiance_2.hdr b/Assets/hosek/hosek_radiance_2.hdr index 44a1db4f..5c5b2a0d 100755 Binary files a/Assets/hosek/hosek_radiance_2.hdr and b/Assets/hosek/hosek_radiance_2.hdr differ diff --git a/Assets/hosek/hosek_radiance_3.hdr b/Assets/hosek/hosek_radiance_3.hdr index 15342d31..d57d6a32 100755 Binary files a/Assets/hosek/hosek_radiance_3.hdr and b/Assets/hosek/hosek_radiance_3.hdr differ diff --git a/Assets/hosek/hosek_radiance_4.hdr b/Assets/hosek/hosek_radiance_4.hdr index dfe501bc..2be14f17 100755 Binary files a/Assets/hosek/hosek_radiance_4.hdr and b/Assets/hosek/hosek_radiance_4.hdr differ diff --git a/Assets/hosek/hosek_radiance_5.hdr b/Assets/hosek/hosek_radiance_5.hdr index 5f4d7289..76d5ee0d 100755 Binary files a/Assets/hosek/hosek_radiance_5.hdr and b/Assets/hosek/hosek_radiance_5.hdr differ diff --git a/Assets/hosek/hosek_radiance_6.hdr b/Assets/hosek/hosek_radiance_6.hdr index 4b89193c..08794116 100755 Binary files a/Assets/hosek/hosek_radiance_6.hdr and b/Assets/hosek/hosek_radiance_6.hdr differ diff --git a/Assets/hosek/hosek_radiance_7.hdr b/Assets/hosek/hosek_radiance_7.hdr index 305e2267..3208cd77 100755 Binary files a/Assets/hosek/hosek_radiance_7.hdr and b/Assets/hosek/hosek_radiance_7.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance.hdr b/Assets/hosek_fake/hosek_radiance.hdr new file mode 100755 index 00000000..c081a98f Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_0.hdr b/Assets/hosek_fake/hosek_radiance_0.hdr new file mode 100755 index 00000000..3e65bd65 Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_0.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_1.hdr b/Assets/hosek_fake/hosek_radiance_1.hdr new file mode 100755 index 00000000..0444184b Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_1.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_2.hdr b/Assets/hosek_fake/hosek_radiance_2.hdr new file mode 100755 index 00000000..44a1db4f Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_2.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_3.hdr b/Assets/hosek_fake/hosek_radiance_3.hdr new file mode 100755 index 00000000..15342d31 Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_3.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_4.hdr b/Assets/hosek_fake/hosek_radiance_4.hdr new file mode 100755 index 00000000..dfe501bc Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_4.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_5.hdr b/Assets/hosek_fake/hosek_radiance_5.hdr new file mode 100755 index 00000000..5f4d7289 Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_5.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_6.hdr b/Assets/hosek_fake/hosek_radiance_6.hdr new file mode 100755 index 00000000..4b89193c Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_6.hdr differ diff --git a/Assets/hosek_fake/hosek_radiance_7.hdr b/Assets/hosek_fake/hosek_radiance_7.hdr new file mode 100755 index 00000000..305e2267 Binary files /dev/null and b/Assets/hosek_fake/hosek_radiance_7.hdr differ diff --git a/Assets/hosek_original/hosek_radiance.hdr b/Assets/hosek_original/hosek_radiance.hdr deleted file mode 100755 index f6a44407..00000000 Binary files a/Assets/hosek_original/hosek_radiance.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_0.hdr b/Assets/hosek_original/hosek_radiance_0.hdr deleted file mode 100755 index a9f3cb23..00000000 Binary files a/Assets/hosek_original/hosek_radiance_0.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_1.hdr b/Assets/hosek_original/hosek_radiance_1.hdr deleted file mode 100755 index 44e1b7cb..00000000 Binary files a/Assets/hosek_original/hosek_radiance_1.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_2.hdr b/Assets/hosek_original/hosek_radiance_2.hdr deleted file mode 100755 index 5c5b2a0d..00000000 Binary files a/Assets/hosek_original/hosek_radiance_2.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_3.hdr b/Assets/hosek_original/hosek_radiance_3.hdr deleted file mode 100755 index d57d6a32..00000000 Binary files a/Assets/hosek_original/hosek_radiance_3.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_4.hdr b/Assets/hosek_original/hosek_radiance_4.hdr deleted file mode 100755 index 2be14f17..00000000 Binary files a/Assets/hosek_original/hosek_radiance_4.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_5.hdr b/Assets/hosek_original/hosek_radiance_5.hdr deleted file mode 100755 index 76d5ee0d..00000000 Binary files a/Assets/hosek_original/hosek_radiance_5.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_6.hdr b/Assets/hosek_original/hosek_radiance_6.hdr deleted file mode 100755 index 08794116..00000000 Binary files a/Assets/hosek_original/hosek_radiance_6.hdr and /dev/null differ diff --git a/Assets/hosek_original/hosek_radiance_7.hdr b/Assets/hosek_original/hosek_radiance_7.hdr deleted file mode 100755 index 3208cd77..00000000 Binary files a/Assets/hosek_original/hosek_radiance_7.hdr and /dev/null differ diff --git a/Shaders/deferred_light/deferred_light.frag.glsl b/Shaders/deferred_light/deferred_light.frag.glsl index d78d6ac6..f61f9851 100644 --- a/Shaders/deferred_light/deferred_light.frag.glsl +++ b/Shaders/deferred_light/deferred_light.frag.glsl @@ -6,6 +6,7 @@ precision mediump float; #include "../compiled.glsl" #include "../std/brdf.glsl" +#include "../std/math.glsl" // ... #ifndef _NoShadows #ifdef _PCSS @@ -45,7 +46,6 @@ uniform vec3 lightPos; uniform vec3 lightDir; uniform int lightType; // uniform int lightIndex; -uniform vec3 lightColor; uniform float lightStrength; uniform float shadowsBias; uniform float spotlightCutoff; @@ -54,6 +54,12 @@ uniform vec3 eye; // uniform vec3 eyeLook; // uniform vec2 screenSize; +#ifdef _LampTex +uniform sampler2D texlampcolor; +#else +uniform vec3 lightColor; +#endif + // in vec2 texCoord; in vec4 wvpposition; // in vec3 viewRay; @@ -166,8 +172,14 @@ void main() { // 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); // #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 float mask = g0.a; diff --git a/Shaders/deferred_light/deferred_light.shader.json b/Shaders/deferred_light/deferred_light.shader.json index 64b2303e..1616f2ec 100755 --- a/Shaders/deferred_light/deferred_light.shader.json +++ b/Shaders/deferred_light/deferred_light.shader.json @@ -35,7 +35,13 @@ }, { "name": "lightColor", - "link": "_lampColor" + "link": "_lampColor", + "ifndef": ["_LampColTex"] + }, + { + "name": "texlampcolor", + "link": "_lampColorTexture", + "ifdef": ["_LampColTex"] }, { "name": "lightStrength", diff --git a/blender/exporter.py b/blender/exporter.py index 4182d19c..0a48eb25 100755 --- a/blender/exporter.py +++ b/blender/exporter.py @@ -1938,18 +1938,8 @@ class ArmoryExporter: if objref.shadow_soft_size != 0.1: o['lamp_size'] = objref.shadow_soft_size - # Parse nodes, only emission for now - # Merge with make_material - 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 - + # Parse nodes + make_material.parse_lamp(objref.node_tree, o) self.output['lamp_datas'].append(o) def export_camera(self, objectRef): diff --git a/blender/lib/make_datas.py b/blender/lib/make_datas.py index 10cb6c67..cce9174d 100644 --- a/blender/lib/make_datas.py +++ b/blender/lib/make_datas.py @@ -247,7 +247,7 @@ def parse_shader(sres, c, con, defs, lines, parse_attributes): if 'ifndef' in l: def_found = False for d in defs: - for link_def in l['ifdef']: + for link_def in l['ifndef']: if d == link_def: def_found = True break diff --git a/blender/log.py b/blender/log.py index 353e5825..f2a31f7b 100644 --- a/blender/log.py +++ b/blender/log.py @@ -32,3 +32,6 @@ def print_progress(value): def get_progress(self): global progress return progress + +def warn(text): + print('Armory Warning: ' + text) diff --git a/blender/make_material.py b/blender/make_material.py index e89856e6..c57cc0d5 100755 --- a/blender/make_material.py +++ b/blender/make_material.py @@ -4,6 +4,7 @@ import assets import armutils import os import nodes +import log def is_pow(num): return ((num & (num - 1)) == 0) and num != 0 @@ -41,6 +42,27 @@ def parse(self, material, c, defs): defs.append('_Tex') 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): const = {} parse.const_color = const @@ -102,6 +124,9 @@ def make_texture(self, id, image_node, material, image_format='RGBA32'): # Reference image name powimage = is_pow(image.size[0]) and is_pow(image.size[1]) 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']) if image_format != 'RGBA32': 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 = roughness_strength_input.default_value 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_input = node.inputs[5] parse_metalness_socket(self, metalness_input, material, c, defs, tree, node, factor) diff --git a/blender/make_world.py b/blender/make_world.py index ba9f04de..a81cc59b 100755 --- a/blender/make_world.py +++ b/blender/make_world.py @@ -129,6 +129,8 @@ def parse_surface(world, node, context): world.world_envtex_strength = envmap_strength_const['float'] def parse_color(world, node, context, envmap_strength_const): + wrd = bpy.data.worlds['Arm'] + # Env map included if node.type == 'TEX_ENVIRONMENT': 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']) # 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_irr_name = texture['file'].rsplit('.', 1)[0] 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) # 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' + 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() # 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): - 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_num_mips = 8 diff --git a/blender/props.py b/blender/props.py index 17f99976..c02d8763 100755 --- a/blender/props.py +++ b/blender/props.py @@ -150,6 +150,10 @@ def init_properties(): 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_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_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) @@ -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_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_treshold = bpy.props.FloatProperty(name="Treshold", default=6.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_radius = bpy.props.FloatProperty(name="Radius", default=1.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=0.5, 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_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) @@ -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_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_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: wrd = bpy.data.worlds.new('Arm') diff --git a/blender/props_ui.py b/blender/props_ui.py index 7d796601..8d81ddd6 100644 --- a/blender/props_ui.py +++ b/blender/props_ui.py @@ -318,6 +318,8 @@ class WorldPropsPanel(bpy.types.Panel): layout.prop(wrd, 'generate_radiance') if wrd.generate_radiance: layout.prop(wrd, 'generate_radiance_sky') + if wrd.generate_radiance_sky: + layout.prop(wrd, 'generate_radiance_sky_type') layout.prop(wrd, 'generate_clouds') if wrd.generate_clouds: layout.prop(wrd, 'generate_clouds_density')