Calibrate light
This commit is contained in:
parent
c8cdb4a77a
commit
5ab704852d
BIN
Assets/console.ttf
Executable file
BIN
Assets/console.ttf
Executable file
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
19
Sources/armory/logicnode/GetNativePropertyNode.hx
Normal file
19
Sources/armory/logicnode/GetNativePropertyNode.hx
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
22
Sources/armory/logicnode/SetNativePropertyNode.hx
Normal file
22
Sources/armory/logicnode/SetNativePropertyNode.hx
Normal 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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
|
@ -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
|
||||
|
|
|
@ -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')
|
17
blender/arm/logicnode/native_get_native_property.py
Normal file
17
blender/arm/logicnode/native_get_native_property.py
Normal 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')
|
19
blender/arm/logicnode/native_set_native_property.py
Normal file
19
blender/arm/logicnode/native_set_native_property.py
Normal 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')
|
|
@ -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')
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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 != '':
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue