From 62dbc5f34a88a2b706f6d36a9cd13da259f23b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20Br=C3=BCckner?= Date: Sun, 13 Dec 2020 22:41:05 +0100 Subject: [PATCH] Add SetShaderUniform node --- .../armory/logicnode/SetShaderUniformNode.hx | 65 +++++++++++++++++++ Sources/armory/object/Uniforms.hx | 3 + .../renderpath/LN_set_shader_uniform.py | 46 +++++++++++++ 3 files changed, 114 insertions(+) create mode 100644 Sources/armory/logicnode/SetShaderUniformNode.hx create mode 100644 blender/arm/logicnode/renderpath/LN_set_shader_uniform.py diff --git a/Sources/armory/logicnode/SetShaderUniformNode.hx b/Sources/armory/logicnode/SetShaderUniformNode.hx new file mode 100644 index 00000000..3a3f382a --- /dev/null +++ b/Sources/armory/logicnode/SetShaderUniformNode.hx @@ -0,0 +1,65 @@ +package armory.logicnode; + +import iron.data.MaterialData; +import iron.object.Object; + +class SetShaderUniformNode extends LogicNode { + + static var registered = false; + static var intMap = new Map>(); + static var floatMap = new Map>(); + static var vec2Map = new Map(); + static var vec3Map = new Map(); + static var vec4Map = new Map(); + + /** Uniform type **/ + public var property0: String; + + public function new(tree: LogicTree) { + super(tree); + if (!registered) { + registered = true; + iron.object.Uniforms.externalIntLinks.push(intLink); + iron.object.Uniforms.externalFloatLinks.push(floatLink); + iron.object.Uniforms.externalVec2Links.push(vec2Link); + iron.object.Uniforms.externalVec3Links.push(vec3Link); + iron.object.Uniforms.externalVec4Links.push(vec4Link); + } + } + + override function run(from: Int) { + var uniformName: String = inputs[1].get(); + if (uniformName == null) return; + + switch (property0) { + case "int": intMap.set(uniformName, inputs[2].get()); + case "float": floatMap.set(uniformName, inputs[2].get()); + case "vec2": vec2Map.set(uniformName, inputs[2].get()); + case "vec3": vec3Map.set(uniformName, inputs[2].get()); + case "vec4": vec4Map.set(uniformName, inputs[2].get()); + default: + } + + runOutput(0); + } + + static function intLink(object: Object, mat: MaterialData, link: String): Null { + return intMap.get(link); + } + + static function floatLink(object: Object, mat: MaterialData, link: String): Null { + return floatMap.get(link); + } + + static function vec2Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 { + return vec2Map.get(link); + } + + static function vec3Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 { + return vec3Map.get(link); + } + + static function vec4Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 { + return vec4Map.get(link); + } +} diff --git a/Sources/armory/object/Uniforms.hx b/Sources/armory/object/Uniforms.hx index b8bd559c..91c55f30 100644 --- a/Sources/armory/object/Uniforms.hx +++ b/Sources/armory/object/Uniforms.hx @@ -11,8 +11,11 @@ class Uniforms { public static function register() { iron.object.Uniforms.externalTextureLinks = [textureLink]; + iron.object.Uniforms.externalVec2Links = []; iron.object.Uniforms.externalVec3Links = [vec3Link]; + iron.object.Uniforms.externalVec4Links = []; iron.object.Uniforms.externalFloatLinks = [floatLink]; + iron.object.Uniforms.externalIntLinks = []; } public static function textureLink(object: Object, mat: MaterialData, link: String): kha.Image { diff --git a/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py b/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py new file mode 100644 index 00000000..676e6994 --- /dev/null +++ b/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py @@ -0,0 +1,46 @@ +from bpy.props import EnumProperty + +from arm.logicnode.arm_nodes import * + + +class SetShaderUniformNode(ArmLogicTreeNode): + """Set a global shader uniform value.""" + bl_idname = 'LNSetShaderUniformNode' + bl_label = 'Set Shader Uniform' + bl_width_default = 200 + arm_section = 'shaders' + arm_version = 1 + + def on_update_uniform_type(self, _): + self.inputs.remove(self.inputs[2]) + + if self.property0 == 'int': + self.add_input('NodeSocketInt', 'Int') + elif self.property0 == 'float': + self.add_input('NodeSocketFloat', 'Float') + elif self.property0 in ('vec2', 'vec3', 'vec4'): + self.add_input('NodeSocketVector', 'Vector') + + property0: EnumProperty( + items = [('int', 'int', 'int'), + ('float', 'float', 'float'), + ('vec2', 'vec2', 'vec2'), + ('vec3', 'vec3', 'vec3'), + ('vec4', 'vec4', 'vec4')], + name='Uniform Type', + default='float', + description="The type of the uniform", + update=on_update_uniform_type) + + def init(self, context): + super().init(context) + self.add_input('ArmNodeSocketAction', 'In') + self.add_input('NodeSocketString', 'Uniform Name') + self.add_input('NodeSocketFloat', 'Float') + self.add_output('ArmNodeSocketAction', 'Out') + + def draw_buttons(self, context, layout): + split = layout.split(factor=0.5, align=True) + + split.label(text="Type") + split.prop(self, "property0", text="")