Calibrate light

This commit is contained in:
Lubos Lenco 2017-05-06 00:22:15 +02:00
parent c8cdb4a77a
commit 5ab704852d
19 changed files with 125 additions and 30 deletions

BIN
Assets/console.ttf Executable file

Binary file not shown.

View file

@ -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

View file

@ -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);

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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;

View file

@ -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();
}
}

View file

@ -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();
}

View file

@ -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;

View file

@ -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

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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')

View file

@ -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

View file

@ -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:

View file

@ -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 != '':

View file

@ -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)

View file

@ -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)