From b40aadf76c19ee9ce88e1827e0f6d55d762327a4 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:30:27 +0000 Subject: [PATCH 01/17] t3du - Add material texture filter node --- .../LN_set_object_material_filter_texture.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/material/LN_set_object_material_filter_texture.py diff --git a/leenkx/blender/lnx/logicnode/material/LN_set_object_material_filter_texture.py b/leenkx/blender/lnx/logicnode/material/LN_set_object_material_filter_texture.py new file mode 100644 index 0000000..74b93f9 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/material/LN_set_object_material_filter_texture.py @@ -0,0 +1,23 @@ +from lnx.logicnode.lnx_nodes import * + +class SetMaterialTextureFilterNode(LnxLogicTreeNode): + """Sets texture filter interpolation.""" + bl_idname = 'LNSetMaterialTextureFilterNode' + bl_label = 'Set Object Material Texture Filter' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxNodeSocketObject', 'Object') + self.add_input('LnxDynamicSocket', 'Material') + self.add_input('LnxIntSocket', 'Slot') + self.add_input('LnxStringSocket', 'Node') + self.add_input('LnxIntSocket', 'Texture Filter') + + self.add_output('LnxNodeSocketAction', 'Out') + + def draw_buttons(self, context, layout): + layout.label(text='Tex Filter 0: Linear') + layout.label(text='Tex Filter 1: Closest') + layout.label(text='Tex Filter 2: Cubic') + layout.label(text='Tex Filter 3: Smart') \ No newline at end of file From 4238f0b2a0cf2589b384e7dc48c3843e6fa051fd Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:32:15 +0000 Subject: [PATCH 02/17] t3du - Add material texture filter node --- .../logicnode/SetMaterialTextureFilterNode.hx | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/SetMaterialTextureFilterNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/SetMaterialTextureFilterNode.hx b/leenkx/Sources/leenkx/logicnode/SetMaterialTextureFilterNode.hx new file mode 100644 index 0000000..45ac61d --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/SetMaterialTextureFilterNode.hx @@ -0,0 +1,55 @@ +package leenkx.logicnode; + +import iron.object.MeshObject; +import iron.data.MaterialData; + +class SetMaterialTextureFilterNode extends LogicNode { + + public function new(tree: LogicTree) { + super(tree); + } + + override function run(from: Int) { + var object: MeshObject = inputs[1].get(); + var mat: MaterialData = inputs[2].get(); + var slot: Int = inputs[3].get(); + var name: String = inputs[4].get(); + var filter: Int = inputs[5].get(); + + if (object == null) return; + if (slot >= object.materials.length) return; + + var mo = cast(object, iron.object.MeshObject); + + for (i => node in mo.materials[slot].contexts[0].raw.bind_textures) + if (node.name == name){ + var moImgt = mo.materials[slot].contexts[0].raw.bind_textures[i]; + switch(filter){ + case 0: //Linear + moImgt.min_filter = null; + moImgt.mag_filter = null; + moImgt.mipmap_filter = null; + moImgt.generate_mipmaps = null; + case 1: //Closest + moImgt.min_filter = 'point'; + moImgt.mag_filter = 'point'; + moImgt.mipmap_filter = null; + moImgt.generate_mipmaps = null; + case 2: //Cubic + moImgt.min_filter = null; + moImgt.mag_filter = null; + moImgt.mipmap_filter = 'linear'; + moImgt.generate_mipmaps = true; + case 3: //Smart + moImgt.min_filter = 'anisotropic'; + moImgt.mag_filter = null; + moImgt.mipmap_filter = 'linear'; + moImgt.generate_mipmaps = true; + } + + break; + } + + runOutput(0); + } +} \ No newline at end of file From 1c472155e2979038149d6c668e2bfd887305bdb0 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:34:09 +0000 Subject: [PATCH 03/17] t3du - Add material texture filter node --- leenkx/blender/lnx/props_renderpath.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/props_renderpath.py b/leenkx/blender/lnx/props_renderpath.py index 2304642..29066a8 100644 --- a/leenkx/blender/lnx/props_renderpath.py +++ b/leenkx/blender/lnx/props_renderpath.py @@ -450,9 +450,10 @@ class LnxRPListItem(bpy.types.PropertyGroup): lnx_ssrs: BoolProperty(name="SSRS", description="Screen-space ray-traced shadows", default=False, update=assets.invalidate_shader_cache) lnx_micro_shadowing: BoolProperty(name="Micro Shadowing", description="Use the shaders' occlusion parameter to compute micro shadowing for the scene's sun lamp. This option is not available for render paths using mobile or solid material models", default=False, update=assets.invalidate_shader_cache) lnx_texture_filter: EnumProperty( - items=[('Anisotropic', 'Anisotropic', 'Anisotropic'), - ('Linear', 'Linear', 'Linear'), + items=[('Linear', 'Linear', 'Linear'), ('Point', 'Closest', 'Point'), + ('Cubic', 'Cubic', 'Cubic'), + ('Anisotropic', 'Smart', 'Anisotropic'), ('Manual', 'Manual', 'Manual')], name="Texture Filtering", description="Set Manual to honor interpolation setting on Image Texture node", default='Anisotropic') lnx_material_model: EnumProperty( From 65961b1593faaf4b03c6f89b3dcfbe31375efbe2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:38:25 +0000 Subject: [PATCH 04/17] t3du - Set / Get World Nodes --- .../logicnode/{GetWorldNode.hx => GetWorldOrientationNode.hx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename leenkx/Sources/leenkx/logicnode/{GetWorldNode.hx => GetWorldOrientationNode.hx} (100%) diff --git a/leenkx/Sources/leenkx/logicnode/GetWorldNode.hx b/leenkx/Sources/leenkx/logicnode/GetWorldOrientationNode.hx similarity index 100% rename from leenkx/Sources/leenkx/logicnode/GetWorldNode.hx rename to leenkx/Sources/leenkx/logicnode/GetWorldOrientationNode.hx From aeb353fb20dd3d7a269cf637fc7e476738a99aec Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:40:21 +0000 Subject: [PATCH 05/17] t3du - Set / Get World Nodes --- leenkx/Sources/leenkx/logicnode/GetWorldNode.hx | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/GetWorldNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/GetWorldNode.hx b/leenkx/Sources/leenkx/logicnode/GetWorldNode.hx new file mode 100644 index 0000000..d59234d --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/GetWorldNode.hx @@ -0,0 +1,13 @@ +package leenkx.logicnode; + +class GetWorldNode extends LogicNode { + + public function new(tree: LogicTree) { + super(tree); + } + + override function get(from: Int): Dynamic { + trace(iron.Scene.active.world); + return iron.Scene.active.raw.world_ref; + } +} \ No newline at end of file From 4b1da0881950efebf00b1228e7ca5886265c85ec Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:42:12 +0000 Subject: [PATCH 06/17] t3du - Set / Get World Nodes --- .../Sources/leenkx/logicnode/SetWorldNode.hx | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/SetWorldNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/SetWorldNode.hx b/leenkx/Sources/leenkx/logicnode/SetWorldNode.hx new file mode 100644 index 0000000..cd1acaa --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/SetWorldNode.hx @@ -0,0 +1,40 @@ +package leenkx.logicnode; + +class SetWorldNode extends LogicNode { + + public function new(tree: LogicTree) { + super(tree); + } + + override function run(from: Int) { + var world: String = inputs[1].get(); + + if (world != null){ + + //check if world shader data exists + var file: String = 'World_'+world+'_data'; + #if lnx_json + file += ".json"; + #elseif lnx_compress + file += ".lz4"; + #else + file += '.lnx'; + #end + + var exists: Bool = false; + + iron.data.Data.getBlob(file, function(b: kha.Blob) { + if (b != null) exists = true; + }); + + assert(Error, exists == true, "World must be either associated to a scene or have fake user"); + + iron.Scene.active.raw.world_ref = world; + var npath = leenkx.renderpath.RenderPathCreator.get(); + npath.loadShader("shader_datas/World_" + world + "/World_" + world); + iron.RenderPath.setActive(npath); + } + + runOutput(0); + } +} \ No newline at end of file From c45baaf396ca817952a2688a3e8b9482ba000921 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:44:30 +0000 Subject: [PATCH 07/17] t3du - Set / Get World Nodes --- .../lnx/logicnode/transform/LN_get_world_orientation.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/leenkx/blender/lnx/logicnode/transform/LN_get_world_orientation.py b/leenkx/blender/lnx/logicnode/transform/LN_get_world_orientation.py index 40006f3..b8f2dcd 100644 --- a/leenkx/blender/lnx/logicnode/transform/LN_get_world_orientation.py +++ b/leenkx/blender/lnx/logicnode/transform/LN_get_world_orientation.py @@ -1,8 +1,8 @@ from lnx.logicnode.lnx_nodes import * -class GetWorldNode(LnxLogicTreeNode): +class GetWorldOrientationNode(LnxLogicTreeNode): """Returns the world orientation of the given object.""" - bl_idname = 'LNGetWorldNode' + bl_idname = 'LNGetWorldOrientationNode' bl_label = 'Get World Orientation' lnx_section = 'rotation' lnx_version = 1 From 188af4a50f4737fc023ec37084f33669c06c22f7 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:47:00 +0000 Subject: [PATCH 08/17] t3du - Set / Get World Nodes --- leenkx/blender/lnx/logicnode/world/LN_get_world.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/world/LN_get_world.py diff --git a/leenkx/blender/lnx/logicnode/world/LN_get_world.py b/leenkx/blender/lnx/logicnode/world/LN_get_world.py new file mode 100644 index 0000000..74273ad --- /dev/null +++ b/leenkx/blender/lnx/logicnode/world/LN_get_world.py @@ -0,0 +1,10 @@ +from lnx.logicnode.lnx_nodes import * + +class GetWorldNode(LnxLogicTreeNode): + """Gets the World of the active scene.""" + bl_idname = 'LNGetWorldNode' + bl_label = 'Get World' + lnx_version = 1 + + def lnx_init(self, context): + self.add_output('LnxStringSocket', 'World') \ No newline at end of file From 1d3254a23731d5374135e943bddae9340976a5fd Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:52:26 +0000 Subject: [PATCH 09/17] t3du - Set / Get World Nodes --- leenkx/blender/lnx/logicnode/world/SetWorldNode.hx | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/world/SetWorldNode.hx diff --git a/leenkx/blender/lnx/logicnode/world/SetWorldNode.hx b/leenkx/blender/lnx/logicnode/world/SetWorldNode.hx new file mode 100644 index 0000000..0963735 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/world/SetWorldNode.hx @@ -0,0 +1,13 @@ +from lnx.logicnode.lnx_nodes import * + +class SetWorldNode(LnxLogicTreeNode): + """Sets the World of the active scene.""" + bl_idname = 'LNSetWorldNode' + bl_label = 'Set World' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxStringSocket', 'World') + + self.add_output('LnxNodeSocketAction', 'Out') \ No newline at end of file From ef8b3a99abb00222f301b385caa55774206e58c2 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:52:53 +0000 Subject: [PATCH 10/17] t3du - Set / Get World Nodes --- .../lnx/logicnode/world/{SetWorldNode.hx => LN_set_world.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename leenkx/blender/lnx/logicnode/world/{SetWorldNode.hx => LN_set_world.py} (100%) diff --git a/leenkx/blender/lnx/logicnode/world/SetWorldNode.hx b/leenkx/blender/lnx/logicnode/world/LN_set_world.py similarity index 100% rename from leenkx/blender/lnx/logicnode/world/SetWorldNode.hx rename to leenkx/blender/lnx/logicnode/world/LN_set_world.py From d04874e0b358f37c4d86e3a0e32faa8321fc2f8a Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 18:55:35 +0000 Subject: [PATCH 11/17] t3du - Set / Get World Nodes --- leenkx/blender/lnx/make_world.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/leenkx/blender/lnx/make_world.py b/leenkx/blender/lnx/make_world.py index 001624b..1ac33d4 100644 --- a/leenkx/blender/lnx/make_world.py +++ b/leenkx/blender/lnx/make_world.py @@ -47,11 +47,20 @@ def build(): with write_probes.setup_envmap_render(): - for scene in bpy.data.scenes: - world = scene.world + #for scene in bpy.data.scenes: + for world in bpy.data.worlds: + #world = scene.world - # Only export worlds from enabled scenes and only once per world - if scene.lnx_export and world is not None and world not in worlds: + assigned = False; + for scene in bpy.data.scenes: + if scene.lnx_export and scene.world is not None: + if scene.world.name == world.name: + assigned = True; + break; + + #if scene.lnx_export and world is not None and world not in worlds: + # Only export worlds from enabled scenes and with fake users + if (world.use_fake_user and world.name != 'Lnx') or assigned: worlds.append(world) world.lnx_envtex_name = '' From 5572226ac53ed364a7f9ed69493c59c3cdd05d3d Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 20:02:59 +0000 Subject: [PATCH 12/17] t3du - Resolution post process --- .../postprocess/LN_get_resolution_settings.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_get_resolution_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_get_resolution_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_get_resolution_settings.py new file mode 100644 index 0000000..bdc5ac8 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_get_resolution_settings.py @@ -0,0 +1,12 @@ +from lnx.logicnode.lnx_nodes import * + +class ResolutionGetNode(LnxLogicTreeNode): + """Returns the resolution parameters. + """ + bl_idname = 'LNResolutionGetNode' + bl_label = 'Get Resolution Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_output('LnxIntSocket', 'Size') + self.add_output('LnxIntSocket', 'Filter') \ No newline at end of file From 59f8dff22f7318515ccedf1923fb3de505688062 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 20:04:37 +0000 Subject: [PATCH 13/17] t3du - Resolution post process --- .../postprocess/LN_set_resolution_settings.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 leenkx/blender/lnx/logicnode/postprocess/LN_set_resolution_settings.py diff --git a/leenkx/blender/lnx/logicnode/postprocess/LN_set_resolution_settings.py b/leenkx/blender/lnx/logicnode/postprocess/LN_set_resolution_settings.py new file mode 100644 index 0000000..ca7e5a9 --- /dev/null +++ b/leenkx/blender/lnx/logicnode/postprocess/LN_set_resolution_settings.py @@ -0,0 +1,20 @@ +from lnx.logicnode.lnx_nodes import * + +class ResolutionSetNode(LnxLogicTreeNode): + """Set the resolution post-processing settings. + Filter 0: Lineal 1: Closest + """ + bl_idname = 'LNResolutionSetNode' + bl_label = 'Set Resolution Settings' + lnx_version = 1 + + def lnx_init(self, context): + self.add_input('LnxNodeSocketAction', 'In') + self.add_input('LnxIntSocket', 'Size', default_value=720) + self.add_input('LnxIntSocket', 'Filter', default_value=0) + + self.add_output('LnxNodeSocketAction', 'Out') + + def draw_buttons(self, context, layout): + layout.label(text="Type 0: Lineal") + layout.label(text="Type 1: Closest") \ No newline at end of file From ee4f62e881ab68db944685182b810884fbe599ef Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 20:06:49 +0000 Subject: [PATCH 14/17] t3du - Resolution post process --- .../leenkx/logicnode/ResolutionGetNode.hx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/ResolutionGetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/ResolutionGetNode.hx b/leenkx/Sources/leenkx/logicnode/ResolutionGetNode.hx new file mode 100644 index 0000000..781279d --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/ResolutionGetNode.hx @@ -0,0 +1,16 @@ +package leenkx.logicnode; + +class ResolutionGetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function get(from:Int):Dynamic { + return switch (from) { + case 0: leenkx.renderpath.Postprocess.resolution_uniforms[0]; + case 1: leenkx.renderpath.Postprocess.resolution_uniforms[1]; + default: 0; + } + } +} \ No newline at end of file From e05c83a8bb1172034ab43611e4d5af6aa84ed0f6 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 20:08:54 +0000 Subject: [PATCH 15/17] t3du - Resolution post process --- .../leenkx/logicnode/ResolutionSetNode.hx | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 leenkx/Sources/leenkx/logicnode/ResolutionSetNode.hx diff --git a/leenkx/Sources/leenkx/logicnode/ResolutionSetNode.hx b/leenkx/Sources/leenkx/logicnode/ResolutionSetNode.hx new file mode 100644 index 0000000..3a1fce9 --- /dev/null +++ b/leenkx/Sources/leenkx/logicnode/ResolutionSetNode.hx @@ -0,0 +1,33 @@ +package leenkx.logicnode; + +import kha.graphics4.TextureFilter; + +class ResolutionSetNode extends LogicNode { + + public function new(tree:LogicTree) { + super(tree); + } + + override function run(from:Int) { + + var size: Int = inputs[1].get(); + var filter: Int = inputs[2].get(); + + #if rp_resolution_filter + if (filter == 0) + iron.object.Uniforms.defaultFilter = TextureFilter.LinearFilter; + else + iron.object.Uniforms.defaultFilter = TextureFilter.PointFilter; + + leenkx.renderpath.Postprocess.resolution_uniforms[0] = size; + leenkx.renderpath.Postprocess.resolution_uniforms[1] = filter; + + var npath = leenkx.renderpath.RenderPathCreator.get(); + var world = iron.Scene.active.raw.world_ref; + npath.loadShader("shader_datas/World_" + world + "/World_" + world); + iron.RenderPath.setActive(npath); + #end + + runOutput(0); + } +} \ No newline at end of file From fb1a5c88bf37d8b5045f53c808afca086bd129d8 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 20:11:05 +0000 Subject: [PATCH 16/17] t3du - Resolution post process --- leenkx/Sources/leenkx/renderpath/Inc.hx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/leenkx/Sources/leenkx/renderpath/Inc.hx b/leenkx/Sources/leenkx/renderpath/Inc.hx index b27d4ad..4820d63 100644 --- a/leenkx/Sources/leenkx/renderpath/Inc.hx +++ b/leenkx/Sources/leenkx/renderpath/Inc.hx @@ -785,7 +785,11 @@ class Inc { public static inline function getDisplayp(): Null { #if rp_resolution_filter // Custom resolution set + #if rp_pp + return leenkx.renderpath.Postprocess.resolution_uniforms[0]; + #else return Main.resolutionSize; + #end #else return null; #end From 7fabd77ef8b9a5ff6f8e7fdb28bda3cc5cc228bc Mon Sep 17 00:00:00 2001 From: Onek8 Date: Tue, 10 Jun 2025 20:12:18 +0000 Subject: [PATCH 17/17] t3du - Resolution post process --- leenkx/Sources/leenkx/renderpath/Postprocess.hx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/leenkx/Sources/leenkx/renderpath/Postprocess.hx b/leenkx/Sources/leenkx/renderpath/Postprocess.hx index 95703d9..f7cf7c0 100644 --- a/leenkx/Sources/leenkx/renderpath/Postprocess.hx +++ b/leenkx/Sources/leenkx/renderpath/Postprocess.hx @@ -133,6 +133,11 @@ class Postprocess { [50.0] //2: Volumetric Fog Amount B ]; + public static var resolution_uniforms = [ + 720, //0: Size + 0 //1: Filter + ]; + public static function vec3Link(object: Object, mat: MaterialData, link: String): iron.math.Vec4 { var v:Vec4 = null;