From 5ab704852d081c05acd812c5055593b7d9e1567d Mon Sep 17 00:00:00 2001 From: Lubos Lenco Date: Sat, 6 May 2017 00:22:15 +0200 Subject: [PATCH] Calibrate light --- Assets/console.ttf | Bin 0 -> 31264 bytes .../deferred_light/deferred_light.frag.glsl | 10 ++++++-- .../deferred_light_quad.frag.glsl | 2 +- .../armory/logicnode/GetNativePropertyNode.hx | 19 +++++++++++++++ Sources/armory/logicnode/GetPropertyNode.hx | 4 +++- Sources/armory/logicnode/LogicTree.hx | 1 + .../armory/logicnode/SetNativePropertyNode.hx | 22 ++++++++++++++++++ Sources/armory/logicnode/SetPropertyNode.hx | 4 ++-- .../internal/{Console.hx => DebugConsole.hx} | 12 +++++++++- blender/arm/exporter.py | 8 +++---- ...set_property.py => action_set_property.py} | 2 +- .../logicnode/native_get_native_property.py | 17 ++++++++++++++ .../logicnode/native_set_native_property.py | 19 +++++++++++++++ ..._get_property.py => value_get_property.py} | 2 +- blender/arm/make.py | 4 ++-- blender/arm/make_logic.py | 10 ++++---- blender/arm/make_world.py | 4 ++-- blender/arm/props.py | 8 +++---- blender/arm/props_renderer.py | 7 +++--- 19 files changed, 125 insertions(+), 30 deletions(-) create mode 100755 Assets/console.ttf create mode 100644 Sources/armory/logicnode/GetNativePropertyNode.hx create mode 100644 Sources/armory/logicnode/SetNativePropertyNode.hx rename Sources/armory/trait/internal/{Console.hx => DebugConsole.hx} (92%) rename blender/arm/logicnode/{native_set_property.py => action_set_property.py} (92%) create mode 100644 blender/arm/logicnode/native_get_native_property.py create mode 100644 blender/arm/logicnode/native_set_native_property.py rename blender/arm/logicnode/{native_get_property.py => value_get_property.py} (91%) diff --git a/Assets/console.ttf b/Assets/console.ttf new file mode 100755 index 0000000000000000000000000000000000000000..310b6f7a0474a1c67d0d0042bfdeed875d131f49 GIT binary patch literal 31264 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 literal 0 HcmV?d00001 diff --git a/Shaders/deferred_light/deferred_light.frag.glsl b/Shaders/deferred_light/deferred_light.frag.glsl index 210a7df3..b8f4c9cd 100644 --- a/Shaders/deferred_light/deferred_light.frag.glsl +++ b/Shaders/deferred_light/deferred_light.frag.glsl @@ -228,8 +228,14 @@ void main() { else { #endif -#ifdef _OrenNayar - fragColor.rgb = orenNayarDiffuseBRDF(albedo, metrough.y, dotNV, dotNL, dotVH) + specularBRDF(f0, metrough.y, dotNL, dotNH, dotNV, dotVH); +#ifdef _Cycles + // Diff/glossy + float facdif = min((1.0 - metrough.x) * 3.0, 1.0); + float facspec = min(metrough.x * 3.0, 1.0); + float rough = pow(metrough.y, 0.5); + fragColor.rgb = orenNayarDiffuseBRDF(albedo, rough, dotNV, dotNL, dotVH) * max(1.0 - metrough.y, 0.88) * facdif + specularBRDF(f0, rough, dotNL, dotNH, dotNV, dotVH) * 3.5 * facspec; + // Metallic + // fragColor.rgb = orenNayarDiffuseBRDF(albedo, metrough.y, dotNV, dotNL, dotVH) + specularBRDF(f0, metrough.y, dotNL, dotNH, dotNV, dotVH); #else fragColor.rgb = lambertDiffuseBRDF(albedo, dotNL) + specularBRDF(f0, metrough.y, dotNL, dotNH, dotNV, dotVH); #endif diff --git a/Shaders/deferred_light_quad/deferred_light_quad.frag.glsl b/Shaders/deferred_light_quad/deferred_light_quad.frag.glsl index bb6d6780..8435b7d9 100644 --- a/Shaders/deferred_light_quad/deferred_light_quad.frag.glsl +++ b/Shaders/deferred_light_quad/deferred_light_quad.frag.glsl @@ -165,7 +165,7 @@ void main() { // float dotLV = dot(l, v); // float dotLH = dot(l, h); -#ifdef _OrenNayar +#ifdef _Cycles fragColor.rgb = orenNayarDiffuseBRDF(albedo, metrough.y, dotNV, dotNL, dotVH) + specularBRDF(f0, metrough.y, dotNL, dotNH, dotNV, dotVH); #else fragColor.rgb = lambertDiffuseBRDF(albedo, dotNL) + specularBRDF(f0, metrough.y, dotNL, dotNH, dotNV, dotVH); diff --git a/Sources/armory/logicnode/GetNativePropertyNode.hx b/Sources/armory/logicnode/GetNativePropertyNode.hx new file mode 100644 index 00000000..e9741b85 --- /dev/null +++ b/Sources/armory/logicnode/GetNativePropertyNode.hx @@ -0,0 +1,19 @@ +package armory.logicnode; + +import armory.object.Object; + +class GetNativePropertyNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function get(from:Int):Dynamic { + var object:Object = inputs[0].get(); + var property:String = inputs[1].get(); + + if (object == null) object = tree.object; + + return Reflect.getProperty(object, property); + } +} diff --git a/Sources/armory/logicnode/GetPropertyNode.hx b/Sources/armory/logicnode/GetPropertyNode.hx index c8b85af7..fb6d0010 100644 --- a/Sources/armory/logicnode/GetPropertyNode.hx +++ b/Sources/armory/logicnode/GetPropertyNode.hx @@ -12,6 +12,8 @@ class GetPropertyNode extends LogicNode { var object:Object = inputs[0].get(); var property:String = inputs[1].get(); - return Reflect.getProperty(object, property); + if (object == null) object = tree.object; + if (object.properties == null) return null; + return object.properties.get(property); } } diff --git a/Sources/armory/logicnode/LogicTree.hx b/Sources/armory/logicnode/LogicTree.hx index 3558b13e..c0d8b6b4 100644 --- a/Sources/armory/logicnode/LogicTree.hx +++ b/Sources/armory/logicnode/LogicTree.hx @@ -158,6 +158,7 @@ class LogicTree extends armory.Trait { } } + // Merge with Cycles.hx static function getNode(id: Int): TNode { for (n in canvas.nodes) if (n.id == id) return n; return null; diff --git a/Sources/armory/logicnode/SetNativePropertyNode.hx b/Sources/armory/logicnode/SetNativePropertyNode.hx new file mode 100644 index 00000000..8174e135 --- /dev/null +++ b/Sources/armory/logicnode/SetNativePropertyNode.hx @@ -0,0 +1,22 @@ +package armory.logicnode; + +import armory.object.Object; + +class SetNativePropertyNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function run() { + var object:Object = inputs[1].get(); + var property:String = inputs[2].get(); + var value:Dynamic = inputs[3].get(); + + if (object == null) object = tree.object; + + Reflect.setProperty(object, property, value); + + super.run(); + } +} diff --git a/Sources/armory/logicnode/SetPropertyNode.hx b/Sources/armory/logicnode/SetPropertyNode.hx index 4d79bfbf..3dfdab7d 100644 --- a/Sources/armory/logicnode/SetPropertyNode.hx +++ b/Sources/armory/logicnode/SetPropertyNode.hx @@ -14,8 +14,8 @@ class SetPropertyNode extends LogicNode { var value:Dynamic = inputs[3].get(); if (object == null) object = tree.object; - - Reflect.setProperty(object, property, value); + if (object.properties == null) object.properties = new Map(); + object.properties.set(property, value); super.run(); } diff --git a/Sources/armory/trait/internal/Console.hx b/Sources/armory/trait/internal/DebugConsole.hx similarity index 92% rename from Sources/armory/trait/internal/Console.hx rename to Sources/armory/trait/internal/DebugConsole.hx index 77766973..642a97ad 100755 --- a/Sources/armory/trait/internal/Console.hx +++ b/Sources/armory/trait/internal/DebugConsole.hx @@ -11,7 +11,7 @@ import zui.Id; #end @:keep -class Console extends Trait { +class DebugConsole extends Trait { #if (!arm_profile) public function new() { super(); } @@ -43,9 +43,18 @@ class Console extends Trait { notifyOnInit(init); notifyOnRender2D(render2D); notifyOnUpdate(update); + haxeTrace = haxe.Log.trace; + haxe.Log.trace = consoleTrace; }); } + static var haxeTrace:Dynamic->haxe.PosInfos->Void; + static var lastTrace = ''; + static function consoleTrace(v:Dynamic, ?inf:haxe.PosInfos) { + lastTrace = Std.string(v); + haxeTrace(v, inf); + } + function init() { path = cast(object, CameraObject).renderPath; } @@ -55,6 +64,7 @@ class Console extends Trait { ui.begin(g); var hwin = Id.handle(); if (ui.window(hwin, 0, 0, 250, iron.App.h(), true)) { + ui.text(lastTrace); if (ui.panel(Id.handle({selected: true}), "Profile (ms)")) { var avg = Math.round(frameTimeAvg * 10000) / 10; var avgMin = Math.round(frameTimeAvgMin * 10000) / 10; diff --git a/blender/arm/exporter.py b/blender/arm/exporter.py index 7789fd2f..501bf259 100755 --- a/blender/arm/exporter.py +++ b/blender/arm/exporter.py @@ -2076,11 +2076,11 @@ class ArmoryExporter: o['strength'] = n.inputs[1].default_value # Normalize lamp strength if o['type'] == 'point' or o['type'] == 'spot': - o['strength'] *= 0.025 + o['strength'] *= 0.026 elif o['type'] == 'area': - o['strength'] *= 0.025 + o['strength'] *= 0.026 elif o['type'] == 'sun': - o['strength'] *= 0.4 + o['strength'] *= 0.325 # TODO: Lamp texture test.. if n.inputs[0].is_linked: color_node = n.inputs[0].links[0].from_node @@ -2882,7 +2882,7 @@ class ArmoryExporter: if bpy.data.worlds['Arm'].arm_play_console: console_trait = {} console_trait['type'] = 'Script' - console_trait['class_name'] = 'armory.trait.internal.Console' + console_trait['class_name'] = 'armory.trait.internal.DebugConsole' console_trait['parameters'] = [] o['traits'].append(console_trait) # Viewport camera enabled, attach navigation to active camera if enabled diff --git a/blender/arm/logicnode/native_set_property.py b/blender/arm/logicnode/action_set_property.py similarity index 92% rename from blender/arm/logicnode/native_set_property.py rename to blender/arm/logicnode/action_set_property.py index bd15514b..299c5bb7 100644 --- a/blender/arm/logicnode/native_set_property.py +++ b/blender/arm/logicnode/action_set_property.py @@ -16,4 +16,4 @@ class SetPropertyNode(Node, ArmLogicTreeNode): self.inputs.new('NodeSocketShader', 'Value') self.outputs.new('ArmNodeSocketAction', 'Out') -add_node(SetPropertyNode, category='Native') +add_node(SetPropertyNode, category='Action') diff --git a/blender/arm/logicnode/native_get_native_property.py b/blender/arm/logicnode/native_get_native_property.py new file mode 100644 index 00000000..3d3e66e0 --- /dev/null +++ b/blender/arm/logicnode/native_get_native_property.py @@ -0,0 +1,17 @@ +import bpy +from bpy.props import * +from bpy.types import Node, NodeSocket +from arm.logicnode.arm_nodes import * + +class GetNativePropertyNode(Node, ArmLogicTreeNode): + '''Get native property node''' + bl_idname = 'LNGetNativePropertyNode' + bl_label = 'Get Native Property' + bl_icon = 'GAME' + + def init(self, context): + self.inputs.new('ArmNodeSocketObject', 'Object') + self.inputs.new('NodeSocketString', 'Property') + self.outputs.new('NodeSocketShader', 'Value') + +add_node(GetNativePropertyNode, category='Native') diff --git a/blender/arm/logicnode/native_set_native_property.py b/blender/arm/logicnode/native_set_native_property.py new file mode 100644 index 00000000..2b111231 --- /dev/null +++ b/blender/arm/logicnode/native_set_native_property.py @@ -0,0 +1,19 @@ +import bpy +from bpy.props import * +from bpy.types import Node, NodeSocket +from arm.logicnode.arm_nodes import * + +class SetNativePropertyNode(Node, ArmLogicTreeNode): + '''Set native property node''' + bl_idname = 'LNSetNativePropertyNode' + bl_label = 'Set Native Property' + bl_icon = 'GAME' + + def init(self, context): + self.inputs.new('ArmNodeSocketAction', 'In') + self.inputs.new('ArmNodeSocketObject', 'Object') + self.inputs.new('NodeSocketString', 'Property') + self.inputs.new('NodeSocketShader', 'Value') + self.outputs.new('ArmNodeSocketAction', 'Out') + +add_node(SetNativePropertyNode, category='Native') diff --git a/blender/arm/logicnode/native_get_property.py b/blender/arm/logicnode/value_get_property.py similarity index 91% rename from blender/arm/logicnode/native_get_property.py rename to blender/arm/logicnode/value_get_property.py index f7d18f33..f6cd5268 100644 --- a/blender/arm/logicnode/native_get_property.py +++ b/blender/arm/logicnode/value_get_property.py @@ -14,4 +14,4 @@ class GetPropertyNode(Node, ArmLogicTreeNode): self.inputs.new('NodeSocketString', 'Property') self.outputs.new('NodeSocketShader', 'Value') -add_node(GetPropertyNode, category='Native') +add_node(GetPropertyNode, category='Value') diff --git a/blender/arm/make.py b/blender/arm/make.py index 4755d88c..c0159d8f 100755 --- a/blender/arm/make.py +++ b/blender/arm/make.py @@ -229,8 +229,8 @@ def build_project(is_play=False, is_publish=False, in_viewport=False, target=Non os.makedirs(sources_path) # Compile path tracer shaders - if len(bpy.data.cameras) > 0 and bpy.data.cameras[0].renderpath_path == 'pathtrace_path': - path_tracer.compile(raw_shaders_path + 'pt_trace_pass/pt_trace_pass.frag.glsl') + # if len(bpy.data.cameras) > 0 and bpy.data.cameras[0].renderpath_path == 'pathtrace_path': + # path_tracer.compile(raw_shaders_path + 'pt_trace_pass/pt_trace_pass.frag.glsl') # Save external scripts edited inside Blender write_texts = False diff --git a/blender/arm/make_logic.py b/blender/arm/make_logic.py index 5d34ca5c..cca1e8d5 100755 --- a/blender/arm/make_logic.py +++ b/blender/arm/make_logic.py @@ -38,16 +38,16 @@ def build_node_tree(node_group): f.write('\tpublic function new() { super(); notifyOnAdd(add); }\n\n') f.write('\tfunction add() {\n') for node in root_nodes: - build_node(node_group, node, f) + build_node(node, f) f.write('\t}\n') f.write('}\n') -def build_node(node_group, node, f): +def build_node(node, f): global parsed_nodes global parsed_labels if node.type == 'REROUTE': - return build_node(node_group, node.inputs[0].links[0].from_node, f) + return build_node(node.inputs[0].links[0].from_node, f) # Get node name name = '_' + arm.utils.safe_source_name(node.name) @@ -79,7 +79,7 @@ def build_node(node_group, node, f): if inp.is_linked: n = inp.links[0].from_node socket = inp.links[0].from_socket - inp_name = build_node(node_group, n, f) + inp_name = build_node(n, f) for i in range(0, len(n.outputs)): if n.outputs[i] == socket: inp_from = i @@ -98,7 +98,7 @@ def build_node(node_group, node, f): for l in out.links: n = l.to_node out_name += '[' if len(out_name) == 0 else ', ' - out_name += build_node(node_group, n, f) + out_name += build_node(n, f) out_name += ']' # Not linked - create node with default values else: diff --git a/blender/arm/make_world.py b/blender/arm/make_world.py index c97f064d..e021cb7c 100755 --- a/blender/arm/make_world.py +++ b/blender/arm/make_world.py @@ -72,8 +72,8 @@ def build_node_tree(world): wrd.world_defs += '_SSRS' # Alternative models - if wrd.diffuse_model == 'Oren Nayar': - wrd.world_defs += '_OrenNayar' + if wrd.lighting_model == 'Cycles': + wrd.world_defs += '_Cycles' # TODO: Lamp texture test.. if wrd.generate_lamp_texture != '': diff --git a/blender/arm/props.py b/blender/arm/props.py index ad5a637a..b4e944c6 100755 --- a/blender/arm/props.py +++ b/blender/arm/props.py @@ -469,10 +469,10 @@ def init_properties(): bpy.types.World.force_no_culling = bpy.props.BoolProperty(name="Force No Culling", default=False) bpy.types.World.tessellation_enabled = bpy.props.BoolProperty(name="Tessellation", description="Enable tessellation for height maps on supported targets", default=True, update=assets.invalidate_shader_cache) # Lighting flags - bpy.types.World.diffuse_model = EnumProperty( - items=[('Lambert', 'Lambert', 'Lambert'), - ('Oren Nayar', 'Oren Nayar', 'Oren Nayar')], - name="Diffuse", description="Diffuse model", default='Lambert', update=assets.invalidate_shader_cache) + bpy.types.World.lighting_model = EnumProperty( + items=[('PBR', 'PBR', 'PBR'), + ('Cycles', 'Cycles', 'Cycles')], + name="Lighting", description="Preferred lighting calibration", default='PBR', update=assets.invalidate_shader_cache) bpy.types.World.generate_voxelgi_dimensions = bpy.props.FloatVectorProperty(name="Dimensions", description="Voxelization bounds", size=3, default=[16, 16, 16], update=assets.invalidate_shader_cache) # For material bpy.types.NodeSocket.is_uniform = bpy.props.BoolProperty(name="Is Uniform", description="Mark node sockets to be processed as material uniforms", default=False) diff --git a/blender/arm/props_renderer.py b/blender/arm/props_renderer.py index 143e2fbf..8dca6fa4 100644 --- a/blender/arm/props_renderer.py +++ b/blender/arm/props_renderer.py @@ -219,12 +219,14 @@ class GenRPDataPropsPanel(bpy.types.Panel): return dat = obj.data + wrd = bpy.data.worlds['Arm'] if obj.type == 'CAMERA': layout.prop(dat, "rp_preset") layout.separator() layout.prop(dat, "rp_renderer") layout.prop(dat, "rp_materials") + layout.prop(wrd, 'lighting_model') layout.prop(dat, "rp_shadowmap") layout.prop(dat, "rp_meshes") layout.prop(dat, "rp_translucency_state") @@ -237,6 +239,7 @@ class GenRPDataPropsPanel(bpy.types.Panel): layout.prop(dat, 'rp_voxelgi') if dat.rp_voxelgi: layout.prop(dat, 'rp_voxelgi_resolution') + layout.prop(wrd, 'generate_voxelgi_dimensions') layout.separator() layout.prop(dat, "rp_render_to_texture") @@ -279,7 +282,6 @@ class PropsRPDataPropsPanel(bpy.types.Panel): if not wrd.generate_gpu_skin_max_bones_auto: layout.prop(wrd, 'generate_gpu_skin_max_bones') layout.prop(wrd, 'anisotropic_filtering_state') - layout.prop(wrd, 'diffuse_model') layout.prop(wrd, 'tessellation_enabled') layout.prop(wrd, 'force_no_culling') @@ -335,9 +337,6 @@ class PropsRPDataPropsPanel(bpy.types.Panel): layout.prop(wrd, 'generate_volumetric_light_air_turbidity') layout.prop(wrd, 'generate_volumetric_light_air_color') - layout.label('Voxel GI') - layout.prop(wrd, 'generate_voxelgi_dimensions') - def register(): bpy.utils.register_class(GenRPDataPropsPanel) bpy.utils.register_class(PropsRPDataPropsPanel)